From 59e222374e0a24cc145d036396234e0bce33e13c Mon Sep 17 00:00:00 2001 From: Yadu Date: Sat, 2 Aug 2025 07:39:27 +0530 Subject: [PATCH] final repository change --- README.md | 119 +++---- face-api.min.js | 1 + images/Certificate.png | Bin 0 -> 112801 bytes images/You_FaceToFruit_Certificate (1).png | Bin 0 -> 132106 bytes images/You_FaceToFruit_Certificate.png | Bin 0 -> 112801 bytes images/bg.jpg | Bin 0 -> 76576 bytes images/bittergourd.png | Bin 0 -> 315743 bytes images/carrot.png | Bin 0 -> 396993 bytes images/cucumber.png | Bin 0 -> 348752 bytes images/drumstick.png | Bin 0 -> 299174 bytes images/egg.png | Bin 0 -> 228961 bytes images/eggplant.png | Bin 0 -> 355035 bytes images/jackfruit.png | Bin 0 -> 310462 bytes images/onion.png | Bin 0 -> 274553 bytes images/pineapple.png | Bin 0 -> 434160 bytes images/potato.png | Bin 0 -> 381057 bytes images/pumpkin.png | Bin 0 -> 411650 bytes images/recording.mp4 | Bin 0 -> 44427613 bytes images/redchilli.png | Bin 0 -> 257932 bytes images/ss-output.png | Bin 0 -> 542222 bytes images/ss-pic-upload.png | Bin 0 -> 398400 bytes images/ss-upload.png | Bin 0 -> 389269 bytes images/tomato.png | Bin 0 -> 303487 bytes images/watermelon.png | Bin 0 -> 330114 bytes main.js | 335 ++++++++++++++++++ models/face_landmark_68_model-shard1.bin | Bin 0 -> 356840 bytes ...ce_landmark_68_model-weights_manifest.json | 1 + models/tiny_face_detector_model-shard1.bin | Bin 0 -> 193321 bytes ..._face_detector_model-weights_manifest.json | 1 + output.html | 115 ++++++ processing.html | 25 ++ script.js | 75 ++++ style.css | 162 +++++++++ upload.html | 43 +++ 34 files changed, 807 insertions(+), 70 deletions(-) create mode 100644 face-api.min.js create mode 100644 images/Certificate.png create mode 100644 images/You_FaceToFruit_Certificate (1).png create mode 100644 images/You_FaceToFruit_Certificate.png create mode 100644 images/bg.jpg create mode 100644 images/bittergourd.png create mode 100644 images/carrot.png create mode 100644 images/cucumber.png create mode 100644 images/drumstick.png create mode 100644 images/egg.png create mode 100644 images/eggplant.png create mode 100644 images/jackfruit.png create mode 100644 images/onion.png create mode 100644 images/pineapple.png create mode 100644 images/potato.png create mode 100644 images/pumpkin.png create mode 100644 images/recording.mp4 create mode 100644 images/redchilli.png create mode 100644 images/ss-output.png create mode 100644 images/ss-pic-upload.png create mode 100644 images/ss-upload.png create mode 100644 images/tomato.png create mode 100644 images/watermelon.png create mode 100644 main.js create mode 100644 models/face_landmark_68_model-shard1.bin create mode 100644 models/face_landmark_68_model-weights_manifest.json create mode 100644 models/tiny_face_detector_model-shard1.bin create mode 100644 models/tiny_face_detector_model-weights_manifest.json create mode 100644 output.html create mode 100644 processing.html create mode 100644 script.js create mode 100644 style.css create mode 100644 upload.html diff --git a/README.md b/README.md index 597b39b44..261fa801a 100644 --- a/README.md +++ b/README.md @@ -1,102 +1,81 @@ frame (3) - -# [Project Name] 🎯 - +# Roastberry-Pi 🎯 ## Basic Details -### Team Name: [Name] - +### Team Name: MAIN ### Team Members -- Team Lead: [Name] - [College] -- Member 2: [Name] - [College] -- Member 3: [Name] - [College] +- Team Lead: Yadu S Rajeev - TKM College of Engineering, Kollam +- Member 2: Vaishnav V Bishoy - TKM College of Engineering, Kollam ### Project Description -[2-3 lines about what your project does] +Face-to-Fruit is a comic-themed web app that hilariously matches your selfie to a fruit or veggie and roasts you with a savage, personalized caption. ### The Problem (that doesn't exist) -[What ridiculous problem are you solving?] +Not enough people know which vegetable or fruit they spiritually resemble. The world lacks official roast certificates from produce. ### The Solution (that nobody asked for) -[How are you solving it? Keep it fun!] +A face detection-powered web app that assigns you your "spirit produce" and roasts you based on your face's vibe. Download and share your Roast Certificate for ultimate bragging/shaming rights! ## Technical Details ### Technologies/Components Used For Software: -- [Languages used] -- [Frameworks used] -- [Libraries used] -- [Tools used] +- JavaScript, HTML +- None (vanilla) +- face-api.js, Canvas API +- VSCode Live Server For Hardware: -- [List main components] -- [List specifications] -- [List tools required] +- None required +- Any device with a browser & camera +- No additional tools needed -### Implementation -For Software: -# Installation -[commands] +## Important Note -# Run -[commands] +This app requires downloading the repository and running it locally in a browser using a local web server. +Due to use of AI models and browser file upload & security restrictions, this project will **NOT run properly if you simply open the HTML pages directly or via GitHub Pages**. -### Project Documentation +### Implementation For Software: -# Screenshots (Add at least 3) -![Screenshot1](Add screenshot 1 here with proper name) -*Add caption explaining what this shows* - -![Screenshot2](Add screenshot 2 here with proper name) -*Add caption explaining what this shows* - -![Screenshot3](Add screenshot 3 here with proper name) -*Add caption explaining what this shows* - -# Diagrams -![Workflow](Add your workflow/architecture diagram here) -*Add caption explaining your workflow* - -For Hardware: - -# Schematic & Circuit -![Circuit](Add your circuit diagram here) -*Add caption explaining connections* - -![Schematic](Add your schematic diagram here) -*Add caption explaining the schematic* - -# Build Photos -![Components](Add photo of your components here) -*List out all components shown* +# Installation +```bash +# 1. Clone repo and enter folder +git clone https://github.com/y-syntax/Roastberry-Pi.git +cd face-to-fruit -![Build](Add photos of build process here) -*Explain the build steps* +# 2. Download face-api.min.js from CDN or GitHub releases and place in folder -![Final](Add photo of final product here) -*Explain the final build* +# 3. Download face-api.js /models folder from official repo and place in folder -### Project Demo +# 4. Collect all images (potato.png, tomato.png, etc.) and put in /images/ +``` +# Run +```bash +# Serve locally! (choose one) +python -m http.server 8000 +# or use VSCode Live Server, or 'http-server' if you use node/npm +# Open http://localhost:8000/upload.html in your browser +``` +# Project Documentation +### Screenshots +![Snippet of Uploading page](images/ss-upload.png) +![Snippet after Uploading image](images/ss-pic-upload.png) +![Snippet of Output page](images/ss-output.png) +![Certificate generated](images/Certificate.png) + +# Project Demo # Video -[Add your demo video link here] -*Explain what the video demonstrates* - -# Additional Demos -[Add any extra demo materials/links] +[Drive link](https://drive.google.com/file/d/1sX8CidnZxZqFXOf_tAk_UBnlHtkjTS0t/view?usp=sharing) +Video shows: Upload process, comic analysis, result page, voice roast, certificate download and sharing. -## Team Contributions -- [Name 1]: [Specific contributions] -- [Name 2]: [Specific contributions] -- [Name 3]: [Specific contributions] +# Team Contributions +- Yadu S Rajeev: JavaScript AI logic, comic theming, CSS artwork, README, roast content, bug testing +- Vaishnav V Bishoy: UI/UX design, veggie array, certificate Canvas code, Image assets collection, roast content, bug testing ---- -Made with ❤️ at TinkerHub Useless Projects + --- + Made with ❤️ at TinkerHub Useless Projects ![Static Badge](https://img.shields.io/badge/TinkerHub-24?color=%23000000&link=https%3A%2F%2Fwww.tinkerhub.org%2F) ![Static Badge](https://img.shields.io/badge/UselessProjects--25-25?link=https%3A%2F%2Fwww.tinkerhub.org%2Fevents%2FQ2Q1TQKX6Q%2FUseless%2520Projects) - - - diff --git a/face-api.min.js b/face-api.min.js new file mode 100644 index 000000000..67489848a --- /dev/null +++ b/face-api.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).faceapi=t.faceapi||{})}(this,function(c){"use strict";var r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)};function t(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}function y(i,a,s,u){return new(s=s||Promise)(function(t,e){function n(t){try{o(u.next(t))}catch(t){e(t)}}function r(t){try{o(u.throw(t))}catch(t){e(t)}}function o(e){e.done?t(e.value):new s(function(t){t(e.value)}).then(n,r)}o((u=u.apply(i,a||[])).next())})}function R(n,r){var o,i,a,t,s={label:0,sent:function(){if(1&a[0])throw a[1];return a[1]},trys:[],ops:[]};return t={next:e(0),throw:e(1),return:e(2)},"function"==typeof Symbol&&(t[Symbol.iterator]=function(){return this}),t;function e(e){return function(t){return function(e){if(o)throw new TypeError("Generator is already executing.");for(;s;)try{if(o=1,i&&(a=2&e[0]?i.return:e[0]?i.throw||((a=i.return)&&a.call(i),0):i.next)&&!(a=a.call(i,e[1])).done)return a;switch(i=0,a&&(e=[2&e[0],a.value]),e[0]){case 0:case 1:a=e;break;case 4:return s.label++,{value:e[1],done:!1};case 5:s.label++,i=e[1],e=[0];continue;case 7:e=s.ops.pop(),s.trys.pop();continue;default:if(!(a=0<(a=s.trys).length&&a[a.length-1])&&(6===e[0]||2===e[0])){s=0;continue}if(3===e[0]&&(!a||e[1]>a[0]&&e[1]s)&&1===t[s]&&(n.push(t[s]),r.push(s)),i[a]<=s&&a++}1!==t[s]&&(n.push(t[s]),r.push(s))}return{newShape:n,keptDims:r}}function N(t,e){var n=null;if(null==t||"float32"===t)n=new Float32Array(e);else if("int32"===t)n=new Int32Array(e);else{if("bool"!==t)throw new Error("Unknown data type "+t);n=new Uint8Array(e)}return n}function F(t,e){var n=null;if(null==t||"float32"===t)n=new Float32Array(e);else if("int32"===t)n=new Int32Array(e);else if("bool"===t)n=new Uint8Array(e);else{if("string"!==t)throw new Error("Unknown data type "+t);n=new Array(e)}return n}function M(t,e){for(var n=0;n=this.shape[n]){var a="Requested out of range element at "+t+". Buffer shape="+this.shape;throw new Error(a)}n++}for(var s=t[t.length-1],u=0;u=n.length-2?E(n[e]):n[e]})).length&&(n=[2,n[0]])),2!==n.length){var o=T(n);n=o.newShape}var i=L(n);if(n.length<=1&&i<=r)return[1,i];if(2===n.length&&n[0]<=r&&n[1]<=r)return n;if(3===n.length&&n[0]*n[1]<=r&&n[2]<=r)return[n[0]*n[1],n[2]];if(3===n.length&&n[0]<=r&&n[1]*n[2]<=r)return[n[0],n[1]*n[2]];if(4===n.length&&n[0]*n[1]*n[2]<=r&&n[3]<=r)return[n[0]*n[1]*n[2],n[3]];if(4===n.length&&n[0]<=r&&n[1]*n[2]*n[3]<=r)return[n[0],n[1]*n[2]*n[3]];if(t){var a=Pe(n),s=2,u=2;return n.length&&(s=(e=Be(n))[0],u=e[1]),C(i=a*(s/2)*(u/2)).map(function(t){return 2*t})}return C(i)}function ze(t){return t%2==0}function Ue(t,e){if(D(t=t.slice(-2),e=e.slice(-2)))return!0;if(!t.length||!e.length)return!0;if(0===t[0]||0===t[1]||0===e[0]||0===e[1])return!0;if(t.length!==e.length){var n=t.slice(-1)[0],r=e.slice(-1)[0];if(n===r)return!0;if(ze(n)&&ze(r)&&(1===t[0]||1===e[0]))return!0}return t[1]===e[1]&&ze(t[0])&&ze(e[0])}function Ve(t){if(null==de){var e=re(t);de=e.getParameter(e.MAX_TEXTURE_SIZE)}return de}function Ge(t){if(null==ve){var e=re(t);ve=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,ve)}function He(t){if(0===t)return 0;var e=re(t);return qe(e,"EXT_disjoint_timer_query_webgl2")&&2===t?2:qe(e,"EXT_disjoint_timer_query")?1:0}function qe(t,e){return null!=t.getExtension(e)}function je(t){try{if(null!=re(t))return!0}catch(t){return!1}return!1}function Ke(t){if(0===t)return!1;var e=re(t);if(1===t){if(!qe(e,"OES_texture_float"))return!1}else if(!qe(e,"EXT_color_buffer_float"))return!1;return Ye(e)}function Xe(t){if(0===t)return!1;var e=re(t);if(1===t)return!!qe(e,"OES_texture_float")&&!!qe(e,"WEBGL_color_buffer_float")&&Ye(e);if(qe(e,"EXT_color_buffer_float"))return Ye(e);if(qe(e,"EXT_color_buffer_half_float")){var i=e.getExtension("EXT_color_buffer_half_float");return function(t){var e=se(t,i),n=t.createTexture();t.bindTexture(t.TEXTURE_2D,n),t.texImage2D(t.TEXTURE_2D,0,e.internalFormatHalfFloat,1,1,0,e.textureFormatFloat,e.textureTypeHalfFloat,null);var r=t.createFramebuffer();t.bindFramebuffer(t.FRAMEBUFFER,r),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,n,0);var o=t.checkFramebufferStatus(t.FRAMEBUFFER)===t.FRAMEBUFFER_COMPLETE;return t.bindTexture(t.TEXTURE_2D,null),t.bindFramebuffer(t.FRAMEBUFFER,null),t.deleteTexture(n),t.deleteFramebuffer(r),o}(e)}return!1}function Ye(t){var e=se(t),n=t.createTexture();t.bindTexture(t.TEXTURE_2D,n),t.texImage2D(t.TEXTURE_2D,0,e.internalFormatFloat,1,1,0,e.textureFormatFloat,e.textureTypeFloat,null);var r=t.createFramebuffer();t.bindFramebuffer(t.FRAMEBUFFER,r),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,n,0);var o=t.checkFramebufferStatus(t.FRAMEBUFFER)===t.FRAMEBUFFER_COMPLETE;return t.bindTexture(t.TEXTURE_2D,null),t.bindFramebuffer(t.FRAMEBUFFER,null),t.deleteTexture(n),t.deleteFramebuffer(r),o}function $e(t){return 2===t&&null!=re(t).fenceSync}var Je=Object.freeze({callAndCheck:ue,canBeRepresented:ce,getWebGLErrorMessage:le,getExtensionOrThrow:he,createVertexShader:pe,createFragmentShader:fe,createProgram:ge,linkProgram:ye,validateProgram:xe,createStaticVertexBuffer:be,createStaticIndexBuffer:we,getNumChannels:function(){return 2===_().getNumber("WEBGL_VERSION")?1:4},createTexture:Ce,validateTextureSize:Ee,createFramebuffer:_e,bindVertexBufferToProgramAttribute:Ie,bindTextureUnit:Re,unbindTextureUnit:function(t,e,n){Oe(t,n),ue(t,e,function(){return t.activeTexture(t.TEXTURE0+n)}),ue(t,e,function(){return t.bindTexture(t.TEXTURE_2D,null)})},getProgramUniformLocationOrThrow:ke,getProgramUniformLocation:Se,bindTextureToProgramUniformSampler:De,bindCanvasToFramebuffer:function(t,e){ue(t,e,function(){return t.bindFramebuffer(t.FRAMEBUFFER,null)}),ue(t,e,function(){return t.viewport(0,0,t.canvas.width,t.canvas.height)}),ue(t,e,function(){return t.scissor(0,0,t.canvas.width,t.canvas.height)})},bindColorTextureToFramebuffer:Ae,unbindColorTextureFromFramebuffer:Te,validateFramebuffer:Ne,getFramebufferErrorMessage:Fe,getBatchDim:Pe,getRowsCols:Be,getShapeAs3D:Le,getTextureShapeFromLogicalShape:We,isReshapeFree:Ue,getWebGLMaxTextureSize:Ve,resetMaxTextureSize:function(){de=null},resetMaxTexturesInShader:function(){ve=null},getMaxTexturesInShader:Ge,getWebGLDisjointQueryTimerVersion:He,hasExtension:qe,isWebGLVersionEnabled:je,isCapableOfRenderingToFloatTexture:Ke,isDownloadFloatTextureEnabled:Xe,isWebGLFenceEnabled:$e}),Qe=_();function Ze(t){_().getBool("DEPRECATION_WARNINGS_ENABLED")&&console.warn(t+" You can disable deprecation warnings with tf.disableDeprecationWarnings().")}function tn(t,e){return qt.tidy(t,e)}function en(t){Lt(t).forEach(function(t){return t.dispose()})}function nn(t){return qt.keep(t)}function rn(){for(var t=[],e=0;e>>0,r=(n*=r)>>>0,r+=4294967296*(n-=r)}return 2.3283064365386963e-10*(r>>>0)});e.next=function(){var t=2091639*e.s0+2.3283064365386963e-10*e.c;return e.s0=e.s1,e.s1=e.s2,e.s2=t-(e.c=0|t)},e.c=1,e.s0=n(" "),e.s1=n(" "),e.s2=n(" "),e.s0-=n(t),e.s0<0&&(e.s0+=1),e.s1-=n(t),e.s1<0&&(e.s1+=1),e.s2-=n(t),e.s2<0&&(e.s2+=1),n=null}function a(t,e){return e.c=t.c,e.s0=t.s0,e.s1=t.s1,e.s2=t.s2,e}function n(t,e){var n=new i(t),r=e&&e.state,o=n.next;return o.int32=function(){return 4294967296*n.next()|0},o.double=function(){return o()+11102230246251565e-32*(2097152*o()|0)},o.quick=o,r&&("object"==typeof r&&a(r,n),o.state=function(){return a(n,{})}),o}e&&e.exports?e.exports=n:this.alea=n}(0,t)}),Xn=jn(function(t){!function(t,e){function i(t){var e=this,n="";e.x=0,e.y=0,e.z=0,e.w=0,e.next=function(){var t=e.x^e.x<<11;return e.x=e.y,e.y=e.z,e.z=e.w,e.w^=e.w>>>19^t^t>>>8},t===(0|t)?e.x=t:n+=t;for(var r=0;r>>0)/4294967296}var r=new i(t),o=e&&e.state;return n.double=function(){do{var t=((r.next()>>>11)+(r.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},n.int32=r.next,n.quick=n,o&&("object"==typeof o&&a(o,r),n.state=function(){return a(r,{})}),n}e&&e.exports?e.exports=n:this.xor128=n}(0,t)}),Yn=jn(function(t){!function(t,e){function i(t){var e=this,n="";e.next=function(){var t=e.x^e.x>>>2;return e.x=e.y,e.y=e.z,e.z=e.w,e.w=e.v,(e.d=e.d+362437|0)+(e.v=e.v^e.v<<4^t^t<<1)|0},e.x=0,e.y=0,e.z=0,e.w=0,t===((e.v=0)|t)?e.x=t:n+=t;for(var r=0;r>>4),e.next()}function a(t,e){return e.x=t.x,e.y=t.y,e.z=t.z,e.w=t.w,e.v=t.v,e.d=t.d,e}function n(t,e){function n(){return(r.next()>>>0)/4294967296}var r=new i(t),o=e&&e.state;return n.double=function(){do{var t=((r.next()>>>11)+(r.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},n.int32=r.next,n.quick=n,o&&("object"==typeof o&&a(o,r),n.state=function(){return a(r,{})}),n}e&&e.exports?e.exports=n:this.xorwow=n}(0,t)}),$n=jn(function(t){!function(t,e){function i(t){var o=this;o.next=function(){var t,e,n=o.x,r=o.i;return t=n[r],e=(t^=t>>>7)^t<<24,e^=(t=n[r+1&7])^t>>>10,e^=(t=n[r+3&7])^t>>>3,e^=(t=n[r+4&7])^t<<7,t=n[r+7&7],e^=(t^=t<<13)^t<<9,n[r]=e,o.i=r+1&7,e},function(t,e){var n,r=[];if(e===(0|e))r[0]=e;else for(e=""+e,n=0;n>>0)/4294967296}var r=new i(t),o=e&&e.state;return n.double=function(){do{var t=((r.next()>>>11)+(r.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},n.int32=r.next,n.quick=n,o&&(o.x&&a(o,r),n.state=function(){return a(r,{})}),n}e&&e.exports?e.exports=n:this.xorshift7=n}(0,t)}),Jn=jn(function(t){!function(t,e){function i(t){var i=this;i.next=function(){var t,e,n=i.w,r=i.X,o=i.i;return i.w=n=n+1640531527|0,e=r[o+34&127],t=r[o=o+1&127],e^=e<<13,t^=t<<17,e^=e>>>15,t^=t>>>12,e=r[o]=e^t,i.i=o,e+(n^n>>>16)|0},function(t,e){var n,r,o,i,a,s=[],u=128;for(e===(0|e)?(r=e,e=null):(e+="\0",r=0,u=Math.max(u,e.length)),o=0,i=-32;i>>15,r^=r<<4,r^=r>>>13,0<=i&&(a=a+1640531527|0,o=0==(n=s[127&i]^=r+a)?o+1:0);for(128<=o&&(s[127&(e&&e.length||0)]=-1),o=127,i=512;0>>15,n^=n>>>12,s[o]=r^n;t.w=a,t.X=s,t.i=o}(i,t)}function a(t,e){return e.i=t.i,e.w=t.w,e.X=t.X.slice(),e}function n(t,e){null==t&&(t=+new Date);function n(){return(r.next()>>>0)/4294967296}var r=new i(t),o=e&&e.state;return n.double=function(){do{var t=((r.next()>>>11)+(r.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},n.int32=r.next,n.quick=n,o&&(o.X&&a(o,r),n.state=function(){return a(r,{})}),n}e&&e.exports?e.exports=n:this.xor4096=n}(0,t)}),Qn=jn(function(t){!function(t,e){function i(t){var o=this,e="";o.next=function(){var t=o.b,e=o.c,n=o.d,r=o.a;return t=t<<25^t>>>7^e,e=e-n|0,n=n<<24^n>>>8^r,r=r-t|0,o.b=t=t<<20^t>>>12^e,o.c=e=e-n|0,o.d=n<<16^e>>>16^r,o.a=r-t|0},o.a=0,o.b=0,o.c=-1640531527,o.d=1367130551,t===Math.floor(t)?(o.a=t/4294967296|0,o.b=0|t):e+=t;for(var n=0;n>>0)/4294967296}var r=new i(t),o=e&&e.state;return n.double=function(){do{var t=((r.next()>>>11)+(r.next()>>>0)/4294967296)/(1<<21)}while(0===t);return t},n.int32=r.next,n.quick=n,o&&("object"==typeof o&&a(o,r),n.state=function(){return a(r,{})}),n}e&&e.exports?e.exports=n:this.tychei=n}(0,t)}),Zn=jn(function(e){!function(s,u){var c,l=this,h=256,p=6,f="random",d=u.pow(h,p),v=u.pow(2,52),m=2*v,g=h-1;function t(t,e,n){function r(){for(var t=a.g(p),e=d,n=0;t>>=1;return(t+n)/e}var o=[],i=b(function t(e,n){var r,o=[],i=typeof e;if(n&&"object"==i)for(r in e)try{o.push(t(e[r],n-1))}catch(t){}return o.length?o:"string"==i?e:e+"\0"}((e=1==e?{entropy:!0}:e||{}).entropy?[t,w(s)]:null==t?function(){try{var t;return c&&(t=c.randomBytes)?t=t(h):(t=new Uint8Array(h),(l.crypto||l.msCrypto).getRandomValues(t)),w(t)}catch(t){var e=l.navigator,n=e&&e.plugins;return[+new Date,l,n,l.screen,w(s)]}}():t,3),o),a=new y(o);return r.int32=function(){return 0|a.g(4)},r.quick=function(){return a.g(4)/4294967296},r.double=r,b(w(a.S),s),(e.pass||n||function(t,e,n,r){return r&&(r.S&&x(r,a),t.state=function(){return x(a,{})}),n?(u[f]=t,e):t})(r,i,"global"in e?e.global:this==u,e.state)}function y(t){var e,n=t.length,a=this,r=0,o=a.i=a.j=0,i=a.S=[];for(n||(t=[n++]);r=this.lower},ar),nr=(ir.prototype.nextValue=function(){for(var t,e,n,r,o,i;;){for(;r=this.randn.nextValue(),(i=1+this.c*r)<=0;);if(i*=i*i,e=1-.331*(t=r*r)*t,n=.5*t+this.d*(1-i+Math.log(i)),(o=this.randu())=1+e.length,function(){return"input rank is "+r.rank+" but should be > than blockShape.length "+e.length}),P(n.length===e.length,function(){return"crops.length is "+n.length+" but should be equal to blockShape.length "+e.length}),P(r.shape[0]%o==0,function(){return"input tensor batch is "+r.shape[0]+" but is not divisible by the product of the elements of blockShape "+e.join(" * ")+" === "+o}),qt.runKernelFunc(function(t){return t.batchToSpaceND(r,e,n)},{$x:r},function(t){return{$x:function(){return t.spaceToBatchND(e,n)}}})}}),hr=xn({broadcastTo_:function(t,e){var n=sn(t,"broadcastTo","x"),r=n.shape;if(e.some(function(t){return!(0n.rank){for(var o=n.shape.slice();o.length=2, but it is "+e);var o=sn(t,"indices","oneHot","int32"),i=o.shape.concat([e]);return o=o.flatten(),qt.runKernelFunc(function(t){return t.oneHot(o,e,n,r)},{$indices:o},function(t){return{$indices:function(){return Mn(o.shape,"float32")}}}).reshape(i)}}),br=xn({pad_:function(t,n,e){void 0===e&&(e=0);var r=sn(t,"x","pad");if(0===r.rank)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");var o={paddings:n,constantValue:e};return qt.runKernelFunc(function(t){return t.pad(r,n,e)},{x:r},function(t){var e=n.map(function(t){return t[0]});return{x:function(){return t.slice(e,r.shape)}}},"PadV2",o)}}),wr=xn({pad1d_:function(t,e,n){return void 0===n&&(n=0),P(2===e.length,function(){return"Invalid number of paddings. Must be length of 2."}),br(t,[e],n)}}),Cr=xn({pad2d_:function(t,e,n){return void 0===n&&(n=0),P(2===e.length&&2===e[0].length&&2===e[1].length,function(){return"Invalid number of paddings. Must be length of 2 each."}),br(t,e,n)}}),Er=xn({pad3d_:function(t,e,n){return void 0===n&&(n=0),P(3===e.length&&2===e[0].length&&2===e[1].length&&2===e[2].length,function(){return"Invalid number of paddings. Must be length of 2 each."}),br(t,e,n)}}),_r=xn({pad4d_:function(t,e,n){return void 0===n&&(n=0),P(4===e.length&&2===e[0].length&&2===e[1].length&&2===e[2].length&&2===e[3].length,function(){return"Invalid number of paddings. Must be length of 2 each."}),br(t,e,n)}}),Ir=xn({rand_:function(t,e,n){var r=L(t),o=null;if(null==n||"float32"===n)o=new Float32Array(r);else if("int32"===n)o=new Int32Array(r);else{if("bool"!==n)throw new Error("Unknown data type "+n);o=new Uint8Array(r)}for(var i=0;i=1+r.length,function(){return"input rank "+e.rank+" should be > than [blockShape] "+r.length}),P(o.length===r.length,function(){return"paddings.shape[0] "+o.length+" must be equal to [blockShape] "+r.length}),P(e.shape.reduce(function(t,e,n){return 0=-n.shape.length&&et.rank)throw new Error("index innermost dimension length must be <= tensor rank; saw: "+e.shape[e.rank-1]+" vs. "+t.rank);if(0===t.size)throw new Error("Requested more than 0 entries, but input is empty. Input shape: "+t.shape+".");for(var n=e.shape,r=n[n.length-1],o=1,i=0;io}).sort(Wo),c=0o&&(void 0,w=function(t,e,n){for(var r=0,o=t.length,i=0,a=!1;r>>1)]);0":"<",u=n?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * "+r+";\n\n int bestIndex = inOffset;\n float bestValue = getA(batch, bestIndex);\n\n for (int i = 0; i < "+r+"; i++) {\n int inIdx = "+u+";\n float candidate = getA(batch, inIdx);\n if (candidate "+s+" bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n "}function Ko(e,t){return["x","y","z","w","u","v"].slice(0,t).map(function(t){return e+"."+t})}function Xo(t,e){return 1===e?[t]:Ko(t,e)}function Yo(){var t,e,n,r,o,i,a,s,u,c;return c=2===_().getNumber("WEBGL_VERSION")?(t="#version 300 es",n="out",r=e="in",o="texture",i="outputColor",a="out vec4 outputColor;",s="\n bool isnan_custom(float val) {\n return (val > 0.0 || val < 0.0) ? false : val != 0.0;\n }\n\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan_custom(val.x),\n isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w));\n }\n\n #define isnan(value) isnan_custom(value)\n ",u="","\n #define round(value) newRound(value)\n int newRound(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 newRound(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "):(e="attribute",r=n="varying",o="texture2D",i="gl_FragColor",a=t="",s="\n #define isnan(value) isnan_custom(value)\n bool isnan_custom(float val) {\n return (val > 0. || val < 1. || val == 0.) ? false : true;\n }\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w));\n }\n ",u="\n uniform float INFINITY;\n\n bool isinf(float val) {\n return abs(val) == INFINITY;\n }\n bvec4 isinf(vec4 val) {\n return equal(abs(val), vec4(INFINITY));\n }\n ","\n int round(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 round(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "),{version:t,attribute:e,varyingVs:n,varyingFs:r,texture2D:o,output:i,defineOutput:a,defineSpecialNaN:s,defineSpecialInf:u,defineRound:c}}function $o(n,t,r){void 0===r&&(r="index");var o=Y(t);return o.map(function(t,e){return"int "+n[e]+" = "+r+" / "+t+"; "+(e===o.length-1?"int "+n[e+1]+" = "+r+" - "+n[e]+" * "+t:"index -= "+n[e]+" * "+t)+";"}).join("")}function Jo(t){var e=Y(t).map(function(t){return t.toString()});return"\n int getFlatIndex(ivec3 coords) {\n return coords.x * "+e[0]+" + coords.y * "+e[1]+" + coords.z;\n }\n"}var Qo="\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n lowp vec4 encode_float(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";function Zo(t,e,n,r){var o=[];t.forEach(function(t){var e=L(t.shapeInfo.logicalShape);t.shapeInfo.isUniform?o.push("uniform float "+t.name+(1= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+u+";\n wC+= "+a+") {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n "}function si(t){this.variableNames=["dy"],this.outputShape=t.inShape;var e=t.filterDepth,n=t.filterHeight,r=t.filterWidth,o=t.strideDepth,i=t.strideHeight,a=t.strideWidth,s=t.dilationDepth,u=t.dilationHeight,c=t.dilationWidth,l=t.effectiveFilterDepth,h=t.effectiveFilterHeight,p=t.effectiveFilterWidth,f=l-1-t.padInfo.front,d=h-1-t.padInfo.top,v=p-1-t.padInfo.left,m=1/(e*n*r);this.userCode="\n const ivec3 pads = ivec3("+f+", "+d+", "+v+");\n const float avgMultiplier = float("+m+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < "+l+";\n wD += "+s+") {\n float dyD = float(dyDCorner + wD) / "+o+".0;\n\n if (dyD < 0.0 || dyD >= "+t.outDepth+".0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < "+h+";\n wR += "+u+") {\n float dyR = float(dyRCorner + wR) / "+i+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+p+";\n wC += "+c+") {\n float dyC = float(dyCCorner + wC) / "+a+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n }\n setOutput(dotProd);\n }\n "}function ui(t,e,n,r,o,i){this.outputShape=[],this.variableNames=["x","mean","variance"],vo(t,e),vo(t,n);var a="0.0";null!=r&&(vo(t,r),this.variableNames.push("offset"),a="getOffsetAtOutCoords()");var s="1.0";null!=o&&(vo(t,o),this.variableNames.push("scale"),s="getScaleAtOutCoords()"),this.outputShape=t,this.userCode="\n void main() {\n float x = getXAtOutCoords();\n float mean = getMeanAtOutCoords();\n float variance = getVarianceAtOutCoords();\n float offset = "+a+";\n float scale = "+s+";\n float inv = scale * inversesqrt(variance + float("+i+"));\n setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1)));\n }\n "}function ci(t,e,n,r,o,i){this.packedInputs=!0,this.packedOutput=!0,this.variableNames=["x","mean","variance"],vo(t,e),vo(t,n);var a="vec4(0.0)";null!=r&&(vo(t,r),this.variableNames.push("offset"),a="getOffsetAtOutCoords()");var s="vec4(1.0)";null!=o&&(vo(t,o),this.variableNames.push("scale"),s="getScaleAtOutCoords()"),this.outputShape=t,this.userCode="\n void main() {\n vec4 offset = "+a+";\n vec4 scale = "+s+";\n\n vec4 x = getXAtOutCoords();\n vec4 mean = getMeanAtOutCoords();\n vec4 variance = getVarianceAtOutCoords();\n\n vec4 inv = scale * inversesqrt(variance + vec4("+i+"));\n\n setOutput((x - mean) * inv + offset);\n }\n "}function li(t,e,n){this.variableNames=["AReal","AImag","BReal","BImag"],this.outputShape=vo(e,n),this.userCode="\n float binaryOpComplex(\n float areal, float aimag, float breal, float bimag) {\n "+t+"\n }\n\n void main() {\n float areal = getARealAtOutCoords();\n float aimag = getAImagAtOutCoords();\n float breal = getBRealAtOutCoords();\n float bimag = getBImagAtOutCoords();\n setOutput(binaryOpComplex(areal, aimag, breal, bimag));\n }\n "}function hi(t,e,n){this.variableNames=["A","B"],this.outputShape=vo(e,n),this.userCode="\n float binaryOperation(float a, float b) {\n "+t+"\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n "}function pi(t,e,n,r){void 0===r&&(r=!1),this.variableNames=["A","B"],this.supportsBroadcasting=!0,this.packedInputs=!0,this.packedOutput=!0,this.outputShape=vo(e,n);var o=this.outputShape.length,i="";if(r)if(0===o||1===L(this.outputShape))i="\n result.y = 0.;\n result.z = 0.;\n result.w = 0.;\n ";else if(i="\n "+ni(o)+" coords = getOutputCoords();\n ",1===o)i+="\n result.y = (coords + 1) >= "+this.outputShape[0]+" ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n ";else{var a=Xo("coords",o);i+="\n bool nextRowOutOfBounds =\n ("+a[o-2]+" + 1) >= "+this.outputShape[o-2]+";\n bool nextColOutOfBounds =\n ("+a[o-1]+" + 1) >= "+this.outputShape[o-1]+";\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n "}this.userCode="\n vec4 binaryOperation(vec4 a, vec4 b) {\n "+t+"\n }\n\n void main() {\n vec4 a = getAAtOutCoords();\n vec4 b = getBAtOutCoords();\n\n vec4 result = binaryOperation(a, b);\n "+i+"\n\n setOutput(result);\n }\n "}function fi(t){this.variableNames=["real","imag"],this.outputShape=t,this.userCode="\n void main() {\n float re = abs(getRealAtOutCoords());\n float im = abs(getImagAtOutCoords());\n float mx = max(re, im);\n\n // sadly the length function in glsl is not underflow-safe\n // (at least not on Intel GPUs). So the safe solution is\n // to ensure underflow-safety in all cases.\n setOutput(\n mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx))\n );\n }\n "}function di(t){this.outputShape=[],this.outputShape=yn(t,1),this.variableNames=t.map(function(t,e){return"T"+e});var e=new Array(t.length-1);e[0]=t[0][1];for(var n=1;n= "+s[u-1]+") {\n return getChannel(\n getT"+u+"("+Ii(a,c,f)+"),\n vec2("+Ii(l,c,f)+"));\n }"}var d=s.length,v=s[s.length-1];p+="\n return getChannel(\n getT"+d+"("+Ii(a,c,v)+"),\n vec2("+Ii(l,c,v)+"));",this.userCode="\n float getValue("+a.map(function(t){return"int "+t})+") {\n "+p+"\n }\n\n void main() {\n "+o+" coords = getOutputCoords();\n vec4 result = vec4(getValue("+i+"), 0., 0., 0.);\n\n "+i[r-1]+" = "+i[r-1]+" + 1;\n if ("+i[r-1]+" < "+n[r-1]+") {\n result.g = getValue("+i+");\n }\n\n "+i[r-2]+" = "+i[r-2]+" + 1;\n if ("+i[r-2]+" < "+n[r-2]+") {\n result.a = getValue("+i+");\n }\n\n "+i[r-1]+" = "+i[r-1]+" - 1;\n if ("+i[r-2]+" < "+n[r-2]+" &&\n "+i[r-1]+" < "+n[r-1]+") {\n result.b = getValue("+i+");\n }\n setOutput(result);\n }\n "}var mi="return a + b;",gi="return a - b;",yi="return a * b;",xi="return (a < 0.) ? b * a : a;",bi="\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n",wi=(_i.prototype.getCustomSetupFunc=function(n,r){var o=this;return function(t,e){null==o.minLoc&&(o.minLoc=t.getUniformLocationNoThrow(e,"minVal"),o.maxLoc=t.getUniformLocationNoThrow(e,"maxVal")),t.gl.uniform1f(o.minLoc,n),t.gl.uniform1f(o.maxLoc,r)}},_i),Ci=(Ei.prototype.getCustomSetupFunc=function(n,r){var o=this;return function(t,e){null==o.minLoc&&(o.minLoc=t.getUniformLocationNoThrow(e,"minVal"),o.maxLoc=t.getUniformLocationNoThrow(e,"maxVal")),t.gl.uniform1f(o.minLoc,n),t.gl.uniform1f(o.maxLoc,r)}},Ei);function Ei(t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t,this.userCode="\n uniform float minVal;\n uniform float maxVal;\n\n void main() {\n vec4 value = getAAtOutCoords();\n\n if (any(isnan(value))) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, vec4(minVal), vec4(maxVal)));\n }\n "}function _i(t){this.variableNames=["A"],this.outputShape=t,this.userCode="\n uniform float minVal;\n uniform float maxVal;\n\n void main() {\n float value = getAAtOutCoords();\n if (isnan(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, minVal, maxVal));\n }\n "}function Ii(t,e,n){var r=t.indexOf(e);return t.map(function(t,e){return e===r?t+" - "+n:t}).join()}function Ri(t){this.variableNames=["x","dy"],this.outputShape=t.filterShape;var e=t.strideHeight,n=t.strideWidth,r=t.padInfo.top,o=t.padInfo.left,i="channelsLast"===t.dataFormat;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < "+t.batchSize+"; b++) {\n for (int yR = 0; yR < "+t.outHeight+"; yR++) {\n int xR = wR + yR * "+e+" - "+r+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+t.outWidth+"; yC++) {\n int xC = wC + yC * "+n+" - "+o+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n if ("+i+") {\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n } else {\n float dyValue = getDy(b, d2, yR, yC);\n float xValue = getX(b, d1, xR, xC);\n dotProd += (xValue * dyValue);\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n "}function ki(t){this.variableNames=["dy","W"],this.outputShape=t.inShape;var e=t.filterHeight,n=t.filterWidth,r=t.strideHeight,o=t.strideWidth,i="channelsLast"===t.dataFormat,a=e-1-t.padInfo.top,s=n-1-t.padInfo.left,u=i?1:2,c=i?2:3,l=i?3:1;this.userCode="\n const ivec2 pads = ivec2("+a+", "+s+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords["+l+"];\n\n ivec2 dyCorner = ivec2(coords["+u+"], coords["+c+"]) - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\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 float dotProd = 0.0;\n for (int wR = 0; wR < "+e+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+e+" - 1 - wR;\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+n+" - 1 - wC;\n\n for (int d2 = 0; d2 < "+t.outChannels+"; d2++) {\n\n if ("+i+") {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n } else {\n float xValue = getDy(batch, d2, idyR, idyC);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Si(t){this.variableNames=["x","dy"],this.outputShape=t.filterShape;var e=t.strideDepth,n=t.strideHeight,r=t.strideWidth,o=t.padInfo.front,i=t.padInfo.top,a=t.padInfo.left;this.userCode="\n void main() {\n ivec5 coords = getOutputCoords();\n int wF = coords.x;\n int wR = coords.y;\n int wC = coords.z;\n int d1 = coords.w;\n int d2 = coords.u;\n\n float dotProd = 0.0;\n\n for (int b = 0; b < "+t.batchSize+"; b++) {\n for (int yF = 0; yF < "+t.outDepth+"; yF++) {\n int xF = wF + yF * "+e+" - "+o+";\n\n if (xF < 0 || xF >= "+t.inDepth+") {\n continue;\n }\n\n for (int yR = 0; yR < "+t.outHeight+"; yR++) {\n int xR = wR + yR * "+n+" - "+i+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+t.outWidth+"; yC++) {\n int xC = wC + yC * "+r+" - "+a+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float dyValue = getDy(b, yF, yR, yC, d2);\n float xValue = getX(b, xF, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Di(t){this.variableNames=["dy","W"],this.outputShape=t.inShape;var e=t.filterDepth,n=t.filterHeight,r=t.filterWidth,o=t.strideDepth,i=t.strideHeight,a=t.strideWidth,s=e-1-t.padInfo.front,u=n-1-t.padInfo.top,c=r-1-t.padInfo.left;this.userCode="\n const ivec3 pads = ivec3("+s+", "+u+", "+c+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.u;\n\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyFCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n float dotProd = 0.0;\n for (int wF = 0; wF < "+e+"; wF++) {\n float dyF = float(dyFCorner + wF) / "+o+".0;\n\n if (dyF < 0.0 || dyF >= "+t.outDepth+".0 || fract(dyF) > 0.0) {\n continue;\n }\n int idyF = int(dyF);\n\n int wFPerm = "+e+" - 1 - wF;\n\n for (int wR = 0; wR < "+n+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+i+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+n+" - 1 - wR;\n\n for (int wC = 0; wC < "+r+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+a+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+r+" - 1 - wC;\n\n for (int d2 = 0; d2 < "+t.outChannels+"; d2++) {\n float xValue = getDy(batch, idyF, idyR, idyC, d2);\n float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Ai(t){this.variableNames=["x","dy"],this.outputShape=t.filterShape;var e=t.strideHeight,n=t.strideWidth,r=t.padInfo.top,o=t.padInfo.left,i=t.outChannels/t.inChannels;this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int dm = coords.w;\n int d2 = d1 * "+i+" + dm;\n\n float dotProd = 0.0;\n\n // TO DO: Vec4 over the batch size\n for (int b = 0; b < "+t.batchSize+"; b++) {\n for (int yR = 0; yR < "+t.outHeight+"; yR++) {\n int xR = wR + yR * "+e+" - "+r+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int yC = 0; yC < "+t.outWidth+"; yC++) {\n int xC = wC + yC * "+n+" - "+o+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Ti(t){this.variableNames=["dy","W"],this.outputShape=t.inShape;var e=t.filterHeight,n=t.filterWidth,r=t.strideHeight,o=t.strideWidth,i=e-1-t.padInfo.top,a=n-1-t.padInfo.left,s=t.outChannels/t.inChannels;this.userCode="\n const ivec2 pads = ivec2("+i+", "+a+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < "+e+"; wR++) {\n float dyR = float(dyRCorner + wR) / "+r+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = "+e+" - 1 - wR;\n\n for (int wC = 0; wC < "+n+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+o+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = "+n+" - 1 - wC;\n\n // TO DO: Vec4 over the channelMul\n for (int dm = 0; dm < "+s+"; dm++) {\n int d2 = d1 * "+s+" + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Ni(t,e,n,r){void 0===e&&(e=!1),void 0===n&&(n=null),void 0===r&&(r=!1),this.variableNames=["x","W"],this.outputShape=t.outShape;var o=t.padInfo.top,i=t.padInfo.left,a=t.strideHeight,s=t.strideWidth,u=t.dilationHeight,c=t.dilationWidth,l=t.filterHeight,h=t.filterWidth,p=4*Math.floor(t.inChannels/4),f=t.inChannels%4,d="channelsLast"===t.dataFormat,v=d?1:2,m=d?2:3,g=d?3:1,y="",x="";n&&(y=r?"float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n "+n+"\n }":"\n float activation(float x) {\n "+n+"\n }\n ",x="result = activation(result);");var b=e?"result += getBiasAtOutCoords();":"";e&&this.variableNames.push("bias"),r&&this.variableNames.push("preluActivationWeights"),this.userCode="\n "+y+"\n\n const ivec2 strides = ivec2("+a+", "+s+");\n const ivec2 pads = ivec2("+o+", "+i+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords["+g+"];\n\n ivec2 xRCCorner =\n ivec2(coords["+v+"], coords["+m+"]) * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+l+"; wR++) {\n int xR = xRCorner + wR * "+u+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+h+"; wC++) {\n int xC = xCCorner + wC * "+c+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n for (int d1 = 0; d1 < "+p+"; d1 += 4) {\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n if ("+d+") {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec4 xValues = vec4(\n getX(batch, d1, xR, xC),\n getX(batch, d1 + 1, xR, xC),\n getX(batch, d1 + 2, xR, xC),\n getX(batch, d1 + 3, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n\n if ("+(1==f)+") {\n\n if ("+d+") {\n dotProd +=\n getX(batch, xR, xC, "+p+") *\n getW(wR, wC, "+p+", d2);\n } else {\n dotProd +=\n getX(batch, "+p+", xR, xC) *\n getW(wR, wC, "+p+", d2);\n }\n\n } else if ("+(2==f)+") {\n vec2 wValues = vec2(\n getW(wR, wC, "+p+", d2),\n getW(wR, wC, "+p+" + 1, d2)\n );\n\n if ("+d+") {\n vec2 xValues = vec2(\n getX(batch, xR, xC, "+p+"),\n getX(batch, xR, xC, "+p+" + 1)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec2 xValues = vec2(\n getX(batch, "+p+", xR, xC),\n getX(batch, "+p+" + 1, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n } else if ("+(3==f)+") {\n vec3 wValues = vec3(\n getW(wR, wC, "+p+", d2),\n getW(wR, wC, "+p+" + 1, d2),\n getW(wR, wC, "+p+" + 2, d2)\n );\n\n if ("+d+") {\n vec3 xValues = vec3(\n getX(batch, xR, xC, "+p+"),\n getX(batch, xR, xC, "+p+" + 1),\n getX(batch, xR, xC, "+p+" + 2)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec3 xValues = vec3(\n getX(batch, "+p+", xR, xC),\n getX(batch, "+p+" + 1, xR, xC),\n getX(batch, "+p+" + 2, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n }\n }\n }\n\n float result = dotProd;\n "+b+"\n "+x+"\n setOutput(result);\n }\n "}function Fi(t){this.variableNames=["x","W"],this.outputShape=t.outShape;var e=t.padInfo.front,n=t.padInfo.top,r=t.padInfo.left,o=t.strideDepth,i=t.strideHeight,a=t.strideWidth,s=t.dilationDepth,u=t.dilationHeight,c=t.dilationWidth,l=t.filterDepth,h=t.filterHeight,p=t.filterWidth,f=4*Math.floor(t.inChannels/4),d=t.inChannels%4;this.userCode="\n const ivec3 strides = ivec3("+o+", "+i+", "+a+");\n const ivec3 pads = ivec3("+e+", "+n+", "+r+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d2 = coords.u;\n\n ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xFCorner = xFRCCorner.x;\n int xRCorner = xFRCCorner.y;\n int xCCorner = xFRCCorner.z;\n\n // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get\n // y(yF, yR, yC, d2). ? = to be determined. : = across all\n // values in that axis.\n float dotProd = 0.0;\n for (int wF = 0; wF < "+l+"; wF++) {\n int xF = xFCorner + wF * "+s+";\n\n if (xF < 0 || xF >= "+t.inDepth+") {\n continue;\n }\n\n for (int wR = 0; wR < "+h+"; wR++) {\n int xR = xRCorner + wR * "+u+";\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+p+"; wC++) {\n int xC = xCCorner + wC * "+c+";\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n for (int d1 = 0; d1 < "+f+"; d1 += 4) {\n vec4 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 vec4 wValues = vec4(\n getW(wF, wR, wC, d1, d2),\n getW(wF, wR, wC, d1 + 1, d2),\n getW(wF, wR, wC, d1 + 2, d2),\n getW(wF, wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if ("+(1==d)+") {\n dotProd +=\n getX(batch, xF, xR, xC, "+f+") *\n getW(wF, wR, wC, "+f+", d2);\n } else if ("+(2==d)+") {\n vec2 xValues = vec2(\n getX(batch, xF, xR, xC, "+f+"),\n getX(batch, xF, xR, xC, "+f+" + 1)\n );\n vec2 wValues = vec2(\n getW(wF, wR, wC, "+f+", d2),\n getW(wF, wR, wC, "+f+" + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if ("+(3==d)+") {\n vec3 xValues = vec3(\n getX(batch, xF, xR, xC, "+f+"),\n getX(batch, xF, xR, xC, "+f+" + 1),\n getX(batch, xF, xR, xC, "+f+" + 2)\n );\n vec3 wValues = vec3(\n getW(wF, wR, wC, "+f+", d2),\n getW(wF, wR, wC, "+f+" + 1, d2),\n getW(wF, wR, wC, "+f+" + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Mi(t,e,n,r){void 0===e&&(e=!1),void 0===n&&(n=null),void 0===r&&(r=!1),this.variableNames=["x","W"],this.outputShape=t.outShape;var o=t.inHeight,i=t.inWidth,a=t.padInfo.top,s=t.padInfo.left,u=t.strideHeight,c=t.strideWidth,l=t.dilationHeight,h=t.dilationWidth,p=t.filterHeight,f=t.filterWidth,d=t.outChannels/t.inChannels,v="",m="";n&&(v=r?"float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n "+n+"\n }":"\n float activation(float x) {\n "+n+"\n }\n ",m="result = activation(result);");var g=e?"result += getBiasAtOutCoords();":"";e&&this.variableNames.push("bias"),r&&this.variableNames.push("preluActivationWeights"),this.userCode="\n "+v+"\n\n const ivec2 strides = ivec2("+u+", "+c+");\n const ivec2 pads = ivec2("+a+", "+s+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / "+d+";\n int q = d2 - d1 * "+d+";\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < "+p+"; wR++) {\n int xR = xRCorner + wR * "+l+";\n\n if (xR < 0 || xR >= "+o+") {\n continue;\n }\n\n for (int wC = 0; wC < "+f+"; wC++) {\n int xC = xCCorner + wC * "+h+";\n\n if (xC < 0 || xC >= "+i+") {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n\n float result = dotProd;\n "+g+"\n "+m+"\n setOutput(result);\n }\n "}function Oi(t,e,n,r){void 0===e&&(e=!1),void 0===n&&(n=null),void 0===r&&(r=!1),this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.outShape;for(var o=t.inHeight,i=t.inWidth,a=t.padInfo.top,s=t.padInfo.left,u=t.strideHeight,c=t.strideWidth,l=t.dilationHeight,h=t.dilationWidth,p=t.filterHeight,f=t.filterWidth,d=f,v="int xR; int xC; int xCOffset;",m=0;m= 0 && xR < "+o+" && xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+m+"C"+g+" = getX(batch, xR, xCOffset, d1);\n } else {\n xTexelR"+m+"C"+g+" = vec4(0.);\n }\n\n xCOffset = xC + 1 - 2;\n if(xR >= 0 && xR < "+o+" && xCOffset >= 0 && xCOffset < "+i+") {\n vec4 previous = getX(batch, xR, xCOffset, d1);\n xR"+m+"C"+g+" = vec4(previous.zw, xTexelR"+m+"C"+g+".xy);\n } else {\n xR"+m+"C"+g+" = vec4(0, 0, xTexelR"+m+"C"+g+".xy);\n }\n ":"\n if(xR >= 0 && xR < "+o+" && xC >= 0 && xC < "+i+") {\n xTexelR"+m+"C"+g+" = getX(batch, xR, xC, d1);\n } else {\n xTexelR"+m+"C"+g+" = vec4(0.);\n }\n\n xR"+m+"C"+g+" = xTexelR"+m+"C"+g+";\n ",g+1= 0 && xR < "+o+" &&\n xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+m+"C"+(g+2)+" = getX(batch, xR, xCOffset, d1);\n }\n ",1= 0 && xR < "+o+" &&\n xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+m+"C"+g+" = getX(batch, xR, xCOffset, d1);\n } else {\n xTexelR"+m+"C"+g+" = vec4(0.);\n }\n "),v+="\n xR"+m+"C"+(g+1)+" = vec4(\n xTexelR"+m+"C"+g+".zw, xTexelR"+m+"C"+(g+2)+".xy);\n "):v+="\n xCOffset = xC + "+x+";\n\n if(xR >= 0 && xR < "+o+" &&\n xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+m+"C"+(g+2)+" = getX(batch, xR, xCOffset, d1);\n }\n\n xR"+m+"C"+(g+1)+" = xTexelR"+m+"C"+(g+2)+";\n "}}else g= 0 && xR < "+o+") {\n ",s%2==1?(v+="\n xCOffset = xC + 1 - "+c+";\n if(xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+m+"C"+g+" = getX(batch, xR, xCOffset, d1);\n } else {\n xTexelR"+m+"C"+g+" = vec4(0.);\n }\n\n if(xC + 1 >= 0 && xC + 1 < "+i+") {\n xTexelR"+m+"C"+(g+2)+" = getX(batch, xR, xC + 1, d1);\n } else {\n xTexelR"+m+"C"+(g+2)+" = vec4(0.);\n }\n\n xR"+m+"C"+g+" = vec4(\n xTexelR"+m+"C"+g+".zw, xTexelR"+m+"C"+(g+2)+".zw);\n ",g+1= 0 && xCOffset < "+i+") {\n final = getX(batch, xR, xCOffset, d1);\n }\n xR"+m+"C"+(g+1)+" = vec4(xTexelR"+m+"C"+(g+2)+".xy, final.xy);\n ")):(v+="\n if(xC >= 0 && xC < "+i+") {\n xTexelR"+m+"C"+g+" = getX(batch, xR, xC, d1);\n } else {\n xTexelR"+m+"C"+g+" = vec4(0.);\n }\n\n xCOffset = xC + "+c+";\n if(xCOffset >= 0 && xCOffset < "+i+") {\n xTexelR"+m+"C"+(g+2)+" = getX(batch, xR, xCOffset, d1);\n } else {\n xTexelR"+m+"C"+(g+2)+" = vec4(0.);\n }\n\n xR"+m+"C"+g+" = vec4(\n xTexelR"+m+"C"+g+".xy, xTexelR"+m+"C"+(g+2)+".xy);\n ",g+1= "+i+") {\n return;\n }\n\n float height_scale = "+y+";\n float width_scale = "+C+";\n\n float in_y = "+x+";\n if( in_y < 0.0 || in_y > "+d+" ) {\n setOutput(float("+o+"));\n return;\n }\n float in_x = "+E+";\n if( in_x < 0.0 || in_x > "+v+" ) {\n setOutput(float("+o+"));\n return;\n }\n\n vec2 sourceFracIndexCR = vec2(in_x,in_y);\n if("+p+" == 1) {\n // Compute the four integer indices.\n ivec2 sourceFloorCR = ivec2(sourceFracIndexCR);\n ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR));\n\n float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d);\n float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d);\n float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d);\n float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d);\n\n vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\n\n float top = topLeft + (topRight - topLeft) * fracCR.x;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\n float newValue = top + (bottom - top) * fracCR.y;\n setOutput(newValue);\n } else {\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestCR = ivec2(floor(\n sourceFracIndexCR + vec2(0.5,0.5)));\n float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d);\n setOutput(newValue);\n }\n }\n "}function Bi(t,e,n){this.variableNames=["x"];var r=(this.outputShape=t).length,o=t[t.length-1],i=n?"<":">";this.userCode="\n int getIndex(int i) {\n "+(n?"return "+o+" -i - 1;":"return i;")+"\n }\n\n void main() {\n "+ni(r)+" coords = getOutputCoords();\n int end = "+Li(r,"coords")+";\n float val = 0.0;\n for (int i = "+o+" - 1; i >= 0; i -= 1) {\n int idx = getIndex(i);\n if (idx "+i+" end) {\n continue;\n }\n if (idx == end && "+e+") {\n continue;\n }\n "+Li(r,"coords")+" = idx;\n val += getX("+function(t,e){if(1===r)return e;if(2===r)return e+".x, "+e+".y";if(3===r)return"coords.x, coords.y, coords.z";if(4===r)return"coords.x, coords.y, coords.z, coords.w";throw Error("Cumulative sum for rank "+r+" is not yet supported")}(0,"coords")+");\n }\n setOutput(val);\n }\n "}function Li(t,e){if(1===t)return""+e;if(2===t)return e+".y";if(3===t)return e+".z";if(4===t)return e+".w";throw Error("Cumulative sum for rank "+t+" is not yet supported")}function Wi(t){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outPackingScheme=Xt.DENSE;var e=ie(t),n=Yo();this.outputShape=t,this.userCode="\n ivec3 outCoordsFromFlatIndex(int index) {\n "+$o(["r","c","d"],t)+"\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+e[0]+", "+e[1]+"));\n int index = 4 * (resTexRC.x * "+e[1]+" + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getA(rc.x, rc.y, rc.z);\n }\n\n "+n.output+" = result;\n }\n "}function zi(t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outPackingScheme=Xt.DENSE;var e=ie(t),n=Yo();this.outputShape=t,this.userCode="\n ivec3 outCoordsFromFlatIndex(int index) {\n "+$o(["r","c","d"],t)+"\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2("+e[0]+", "+e[1]+"));\n int index = 4 * (resTexRC.x * "+e[1]+" + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z));\n }\n\n "+n.output+" = result;\n }\n "}function Ui(t){this.variableNames=["X"],this.outputShape=[t,t],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0;\n setOutput(val);\n }\n "}function Vi(t){this.variableNames=["A"],this.outTexUsage=Yt.DOWNLOAD;var e=Yo();this.outputShape=t,this.userCode="\n "+Qo+"\n\n void main() {\n float x = getAAtOutCoords();\n "+e.output+" = encode_float(x);\n }\n "}function Gi(t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outTexUsage=Yt.DOWNLOAD;var e=Yo();this.outputShape=t,this.userCode="\n "+Qo+"\n\n void main() {\n ivec3 coords = getOutputCoords();\n float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z));\n "+e.output+" = encode_float(x);\n }\n "}function Hi(t,e,n){void 0===n&&(n=!1),this.variableNames=["A"];var r=Yo(),o=e[0],i=e[1];this.outputShape=t;var a="result";n&&(a="floor(result * 255. + 0.5)"),this.userCode="\n "+Jo(t)+"\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n int flatIndex = getFlatIndex(coords);\n int offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n \n int r = flatIndex / "+i+";\n int c = imod(flatIndex, "+i+");\n vec2 uv = (vec2(c, r) + halfCR) / vec2("+i+".0, "+o+".0);\n vec4 values = "+r.texture2D+"(A, uv);\n\n float result;\n\n if(offset == 0) {\n result = values[0];\n } else if(offset == 1) {\n result = values[1];\n } else if(offset == 2) {\n result = values[2];\n } else {\n result = values[3];\n }\n\n "+r.output+" = vec4("+a+", 0., 0., 0.);\n }\n "}function qi(t,e,n){void 0===n&&(n=!1),this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;var r=Yo(),o=e[0],i=e[1];this.outputShape=t;var a="",s="result";n&&(s="floor(result * 255. + 0.5)");for(var u=0;u<=1;u++)for(var c=0;c<=1;c++){var l=2*u+c;a+="\n localCoords = coords;\n if(localCoords[2] + "+c+" < "+t[2]+") {\n localCoords[2] += "+c+";\n if(localCoords[1] + "+u+" < "+t[1]+") {\n localCoords[1] += "+u+";\n\n flatIndex = getFlatIndex(localCoords);\n offset = imod(flatIndex, 4);\n\n flatIndex = idiv(flatIndex, 4, 1.);\n\n r = flatIndex / "+i+";\n c = imod(flatIndex, "+i+");\n uv = (vec2(c, r) + halfCR) / vec2("+i+".0, "+o+".0);\n values = "+r.texture2D+"(A, uv);\n\n if(offset == 0) {\n result["+l+"] = values[0];\n } else if(offset == 1) {\n result["+l+"] = values[1];\n } else if(offset == 2) {\n result["+l+"] = values[2];\n } else {\n result["+l+"] = values[3];\n }\n }\n }\n "}this.userCode="\n "+Jo(t)+"\n\n void main() {\n ivec3 coords = getOutputCoords();\n\n vec4 result = vec4(0.);\n int flatIndex, r, c, offset;\n ivec3 localCoords;\n vec2 uv;\n vec4 values;\n\n "+a+"\n\n "+r.output+" = "+s+";\n }\n "}function ji(t,e,n){this.variableNames=["real","imag"];var r=e[1];this.outputShape=e;var o=n?"2.0 * "+Math.PI:"-2.0 * "+Math.PI,i=n?r+".0":"1.0";this.userCode="\n const float exponentMultiplier = "+o+";\n\n float unaryOpComplex(float real, float expR, float imag, float expI) {\n "+t+"\n }\n\n float mulMatDFT(int batch, int index) {\n float indexRatio = float(index) / float("+r+");\n float exponentMultiplierTimesIndexRatio =\n exponentMultiplier * indexRatio;\n\n float result = 0.0;\n\n for (int i = 0; i < "+r+"; i++) {\n // x = (-2|2 * PI / N) * index * i;\n float x = exponentMultiplierTimesIndexRatio * float(i);\n float expR = cos(x);\n float expI = sin(x);\n float real = getReal(batch, i);\n float imag = getImag(batch, i);\n\n result +=\n unaryOpComplex(real, expR, imag, expI) / "+i+";\n }\n\n return result;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n setOutput(mulMatDFT(coords[0], coords[1]));\n }\n "}function Ki(t,e,n){this.variableNames=["A","indices"];var r=t.slice();r[n]=e,this.outputShape=r,this.rank=r.length;var o=ni(this.rank),i=function(t,e){var n=t.length;if(4= 0) {\n\n offsetX = int(mod(float(blockIndex), "+u+".) * "+i+". - "+p+".);\n d1 = offsetX + "+c+" * (int(mod(float(pos), "+d+".) / "+o+".));\n\n if(d1 < "+e[y]+" && d1 >= 0) {\n\n ch = int(mod(float(pos), "+o+".));\n\n if ("+m+") {\n innerDims = vec2(d1, ch);\n result["+(2*b+w)+"] = getChannel(\n getA(d0, int(innerDims.x),\n int(innerDims.y)), innerDims);\n } else {\n innerDims = vec2(d0, d1);\n result["+(2*b+w)+"] = getChannel(\n getA(ch, int(innerDims.x),\n int(innerDims.y)), innerDims);\n }\n }\n }\n }\n ";this.userCode="\n void main() {\n ivec2 rc = getOutputCoords();\n\n vec4 result = vec4(0);\n\n int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n vec2 innerDims;\n\n "+x+"\n\n "+v.output+" = result;\n }\n "}function wa(t,e,n,r,o){this.variableNames=["x"],this.outputShape=[];var i,a=e,s=t[3]-1;this.outputShape=t;var u="float("+n+") + float("+r+") * sum";i=.5===o?"inversesqrt("+u+")":1===o?"1.0/("+u+")":"exp(log("+u+") * float(-"+o+"));",this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -"+a+"; j <= "+a+"; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= "+s+") {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * "+i+";\n setOutput(val);\n }\n "}function Ca(t,e,n,r,o){this.variableNames=["inputImage","outputImage","dy"],this.outputShape=[],this.outputShape=t,this.depth=t[3],this.depthRadius=e,this.bias=n,this.alpha=r,this.beta=o,this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n\n float result = 0.0;\n for (int d = 0; d < "+this.depth+"; ++d) {\n int depthBegin = int(max(0.0, float(d - "+e+")));\n int depthEnd = int(min(float("+this.depth+"),\n float(d + "+e+" + 1)));\n\n const int MIN_DEPTH_BEGIN = 0;\n const int MAX_DEPTH_END = "+this.depth+";\n\n float norm = 0.0;\n for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd) {\n norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\n }\n else {\n break;\n }\n }\n\n norm = float("+r+") * norm + float("+n+");\n\n for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd){\n float dyi = -2.0 * float("+r+")\n * float("+o+")\n * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d)\n / norm;\n if (k == d) {\n dyi += pow(norm, -1.0 * "+o+");\n }\n if (k == coords[3]) {\n dyi *= getDy(b, r, c, d);\n result += dyi;\n }\n }\n else {\n break;\n }\n }\n }\n setOutput(result);\n }\n "}function Ea(t,e,n,r,o){this.variableNames=["x"],this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0;var i,a=e,s=t[3]-1;this.outputShape=t;var u="float("+n+") + float("+r+") * sum";i=.5===o?"inversesqrt("+u+")":1===o?"1.0/("+u+")":"exp(log("+u+") * float(-"+o+"));",this.userCode="\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords.x;\n int r = coords.y;\n int c = coords.z;\n int d = coords.w;\n\n bool hasNextCol = d < "+this.outputShape[3]+";\n bool hasNextRow = c < "+this.outputShape[2]+";\n\n vec4 sum = vec4(0.);\n vec4 xFragAtOutputCoords = getX(b, r, c, d);\n\n vec4 xAtOutputCoords = vec4(\n getChannel(xFragAtOutputCoords, vec2(c, d)),\n hasNextCol ?\n getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0,\n hasNextRow ?\n getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0,\n (hasNextRow && hasNextCol) ?\n getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0\n );\n\n int firstChannel = d - "+a+";\n vec2 cache = vec2(0.);\n if(firstChannel >= 0){\n vec4 firstChannelFrag = getX(b, r, c, firstChannel);\n cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel));\n if(hasNextRow){\n cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel));\n }\n }\n\n ivec2 depth = ivec2(d, d + 1);\n for (int j = - "+a+"; j <= "+a+"; j++) {\n ivec2 idx = depth + j;\n bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0));\n bvec2 belowUpperBound = lessThanEqual(idx, ivec2("+s+"));\n\n bool depthInRange = aboveLowerBound.x && belowUpperBound.x;\n bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y;\n\n if(depthInRange || depthPlusOneInRange){\n vec4 z = vec4(0.);\n vec4 xFragAtCurrentDepth;\n z.xz = cache.xy;\n if(depthPlusOneInRange && hasNextCol){\n xFragAtCurrentDepth = idx.y != d ?\n getX(b, r, c, idx.y) : xFragAtOutputCoords;\n z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y));\n if(hasNextRow){\n z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y));\n }\n }\n cache.xy = z.yw;\n sum += z * z;\n }\n }\n vec4 result = xAtOutputCoords * "+i+";\n setOutput(result);\n }\n "}function _a(t){this.variableNames=["dy","maxPos"],this.outputShape=t.inShape;var e=t.strideHeight,n=t.strideWidth,r=t.dilationHeight,o=t.effectiveFilterHeight,i=t.effectiveFilterWidth,a=o-1-t.padInfo.top,s=i-1-t.padInfo.left,u=o*i-1;this.userCode="\n const ivec2 pads = ivec2("+a+", "+s+");\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < "+o+";\n wR += "+r+") {\n float dyR = float(dyRCorner + wR) / "+e+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+i+"; wC++) {\n float dyC = float(dyCCorner + wC) / "+n+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = "+u+" - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * "+i+" + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n "}function Ia(t){this.variableNames=["dy","maxPos"],this.outputShape=t.inShape;var e=t.strideDepth,n=t.strideHeight,r=t.strideWidth,o=t.dilationDepth,i=t.dilationHeight,a=t.dilationWidth,s=t.effectiveFilterDepth,u=t.effectiveFilterHeight,c=t.effectiveFilterWidth,l=s-1-t.padInfo.front,h=u-1-t.padInfo.top,p=c-1-t.padInfo.left,f=s*u*c-1;this.userCode="\n const ivec3 pads = ivec3("+l+", "+h+", "+p+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < "+s+";\n wD += "+o+") {\n float dyD = float(dyDCorner + wD) / "+e+".0;\n\n if (dyD < 0.0 || dyD >= "+t.outDepth+".0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < "+u+";\n wR += "+i+") {\n float dyR = float(dyRCorner + wR) / "+n+".0;\n\n if (dyR < 0.0 || dyR >= "+t.outHeight+".0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < "+c+";\n wC += "+a+") {\n float dyC = float(dyCCorner + wC) / "+r+".0;\n\n if (dyC < 0.0 || dyC >= "+t.outWidth+".0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n int maxPosValue = "+f+" -\n int(getMaxPos(batch, idyD, idyR, idyC, ch));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue =\n wD * "+u+" * "+c+" +\n wR * "+c+" + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n }\n setOutput(dotProd);\n }\n "}function Ra(t,e,n,r,o,i,a){void 0===n&&(n=!1),void 0===r&&(r=!1),void 0===o&&(o=!1),void 0===i&&(i=null),void 0===a&&(a=!1),this.variableNames=["matrixA","matrixB"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e;var s=n?t[1]:t[2],u=Math.ceil(s/2),c=n?"i * 2, rc.y":"rc.y, i * 2",l=r?"rc.z, i * 2":"i * 2, rc.z",h=n?["a.xxyy","a.zzww"]:["a.xxzz","a.yyww"],p=r?["b.xzxz","b.ywyw"]:["b.xyxy","b.zwzw"],f="",d="";i&&(f=a?"vec4 activation(vec4 a) {\n vec4 b = getPreluActivationWeightsAtOutCoords();\n "+i+"\n }":"vec4 activation(vec4 x) {\n "+i+"\n }",d="result = activation(result);");var v=o?"result += getBiasAtOutCoords();":"";o&&this.variableNames.push("bias"),a&&this.variableNames.push("preluActivationWeights"),this.userCode="\n "+f+"\n\n const float sharedDimension = "+u+".0;\n\n vec4 dot2x2ARowBCol(ivec3 rc) {\n vec4 result = vec4(0);\n for (int i = 0; i < "+u+"; i++) {\n vec4 a = getMatrixA(rc.x, "+c+");\n vec4 b = getMatrixB(rc.x, "+l+");\n\n // These swizzled products need to be separately added.\n // See: https://github.com/tensorflow/tfjs/issues/1735\n result += ("+h[0]+" * "+p[0]+");\n result += ("+h[1]+" * "+p[1]+");\n }\n return result;\n }\n\n void main() {\n ivec3 rc = getOutputCoords();\n vec4 result = dot2x2ARowBCol(rc);\n\n "+v+"\n\n "+d+"\n\n setOutput(result);\n }\n "}function ka(t,e,n,r){this.variableNames=["indices"],this.outputShape=[t,e],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int index = round(getIndices(coords.x));\n setOutput(mix(float("+r+"), float("+n+"),\n float(index == coords.y)));\n }\n "}function Sa(t){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;var e,n,r,o,i=(this.outputShape=t).length;if(0===i)this.userCode="\n void main() {\n setOutput(vec4(getA(), 0., 0., 0.));\n }\n ";else{var a=Xo("rc",i),s=ni(i),u=function(t,e,n){if(1===t)return"rc > "+e[0];for(var r="",o=t-2;o= "+e[o],o= "+e+";\n bool rEdge = rp1 >= "+n+";\n "}(i,t[t.length-1],t[t.length-2]),l=(n=a,r=(e=t).length,o=function(t,e){for(var n=[],r=0;r<=1;r++)for(var o=0;o<=1;o++){for(var i=(0===r?"r":"rp1")+", "+(0===o?"c":"cp1"),a=2;a= "+e[0]+" ? 0. : getA(rc + 1),\n 0, 0":"getA("+o[0]+"),\n cEdge ? 0. : getA("+o[1]+"),\n rEdge ? 0. : getA("+o[2]+"),\n rEdge || cEdge ? 0. : getA("+o[3]+")");this.userCode="\n void main() {\n "+s+" rc = getOutputCoords();\n\n if("+u+") {\n setOutput(vec4(0));\n } else {\n "+c+"\n\n setOutput(vec4("+l+"));\n }\n }\n "}}var Da=(Aa.prototype.getCustomSetupFunc=function(n){var r=this;return function(t,e){null==r.seedLoc&&(r.seedLoc=t.getUniformLocation(e,"seed")),t.gl.uniform1f(r.seedLoc,n)}},Aa);function Aa(t,e,n){this.variableNames=["probs"],this.outputShape=[t,n],this.userCode="\n uniform float seed;\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n\n float r = random(seed);\n float cdf = 0.0;\n\n for (int i = 0; i < "+(e-1)+"; i++) {\n cdf += getProbs(batch, i);\n\n if (r < cdf) {\n setOutput(float(i));\n return;\n }\n }\n\n // If no other event happened, last event happened.\n setOutput(float("+(e-1)+"));\n }\n "}function Ta(n,t,e){this.variableNames=["x"],this.outputShape=t.map(function(t,e){return t[0]+n[e]+t[1]});var r=n.length,o=ni(r),i=t.map(function(t){return t[0]}).join(","),a=t.map(function(t,e){return t[0]+n[e]}).join(","),s=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,r);this.userCode=1!==r?"\n "+o+" start = "+o+"("+i+");\n "+o+" end = "+o+"("+a+");\n\n void main() {\n "+o+" outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(float("+e+"));\n } else {\n "+o+" coords = outC - start;\n setOutput(getX("+s+"));\n }\n }\n ":"\n int start = "+i+";\n int end = "+a+";\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(float("+e+"));\n } else {\n setOutput(getX(outC - start));\n }\n }\n "}function Na(n,t,e){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.map(function(t,e){return t[0]+n[e]+t[1]});for(var r=n.length,o=ni(r),i=t.map(function(t){return t[0]}).join(","),a=t.map(function(t,e){return t[0]+n[e]}).join(","),s=Xo("rc",r),u=Xo("source",r),c=s[r-1]+" < "+this.outputShape[r-1],l=1===r?"source":"vec2("+u.slice(-2).join()+")",h=[o+" rc = outputLoc;",s[r-1]+" += 1;\n if("+c+") {\n ",1===r?"":"}\n rc = outputLoc;\n "+s[r-2]+" += 1;\n if("+s[r-2]+" < "+this.outputShape[r-2]+") {",1===r?"":" "+s[r-1]+" += 1;\n if("+c+") {"],p=1===r?"rc < start || rc >= end":"any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))",f="",d=0,v=1===r?2:4;d= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+c+";\n wC += "+s+") {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value >= currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = wR * "+c+" + wC;\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n ";else{var d=e+"("+e+"("+e+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"avg"===e&&(d="avgValue / count");var v=4*Math.floor(r/4),m=r%4,g="\n if ("+p+") {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n ";this.userCode="\n const ivec2 strides = ivec2("+o+", "+i+");\n const ivec2 pads = ivec2("+l+", "+h+");\n const float initializationValue = "+f+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= "+t.inWidth+") {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4("+f+");\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < "+u+";\n wR += "+a+") {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+v+"; wC += 4) {\n int xC = xCCorner + wC * "+s+";\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + "+s+", d),\n getValue(batch, xR, xC + 2 * "+s+", d),\n getValue(batch, xR, xC + 3 * "+s+", d)\n );\n\n "+g+"\n }\n\n int xC = xCCorner + "+v+";\n if ("+(1==m)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+g+"\n } else if ("+(2==m)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + "+s+", d),\n initializationValue,\n initializationValue\n );\n\n "+g+"\n } else if ("+(3==m)+") {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + "+s+", d),\n getValue(batch, xR, xC + 2 * "+s+", d),\n initializationValue\n );\n\n "+g+"\n }\n }\n setOutput("+d+");\n }\n "}}function Ma(t,e,n){if(this.variableNames=["x"],"avg"===e&&n)throw new Error("Cannot compute positions for average pool.");var r=t.filterWidth,o=t.strideDepth,i=t.strideHeight,a=t.strideWidth,s=t.dilationDepth,u=t.dilationHeight,c=t.dilationWidth,l=t.effectiveFilterDepth,h=t.effectiveFilterHeight,p=t.effectiveFilterWidth,f=t.padInfo.front,d=t.padInfo.top,v=t.padInfo.left;this.outputShape=t.outShape;var m="avg"===e,g="0.0";if(m||(g="-1.0 / 1e-20"),n)this.userCode="\n const ivec3 strides =\n ivec3("+o+", "+i+", "+a+");\n const ivec3 pads = ivec3("+f+", "+d+", "+v+");\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n\n for (int wD = 0; wD < "+l+";\n wD += "+s+") {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= "+t.inDepth+") {\n continue;\n }\n\n for (int wR = 0; wR < "+h+";\n wR += "+u+") {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+p+";\n wC += "+c+") {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= "+t.inWidth+") {\n continue;\n }\n\n float value = getX(batch, xD, xR, xC, ch);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value >= currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition =\n wD * "+h+" * "+p+" +\n wR * "+p+" + wC;;\n }\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n ";else{var y=e+"("+e+"("+e+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"avg"===e&&(y="avgValue / count");var x=4*Math.floor(r/4),b=r%4,w="\n if ("+m+") {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n ";this.userCode="\n const ivec3 strides =\n ivec3("+o+", "+i+", "+a+");\n const ivec3 pads = ivec3("+f+", "+d+", "+v+");\n const float initializationValue = "+g+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xD, int xR, int xC, int ch) {\n if (xC < 0 || xC >= "+t.inWidth+") {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xD, xR, xC, ch);\n }\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch).\n // ? = to be determined\n vec4 minMaxValue = vec4("+g+");\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wD = 0; wD < "+l+";\n wD += "+s+") {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= "+t.inDepth+") {\n continue;\n }\n\n for (int wR = 0; wR < "+h+";\n wR += "+u+") {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= "+t.inHeight+") {\n continue;\n }\n\n for (int wC = 0; wC < "+x+"; wC += 4) {\n int xC = xCCorner + wC * "+c+";\n\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + "+c+", ch),\n getValue(batch, xD, xR, xC + 2 * "+c+", ch),\n getValue(batch, xD, xR, xC + 3 * "+c+", ch)\n );\n\n "+w+"\n }\n\n int xC = xCCorner + "+x+";\n if ("+(1==b)+") {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+w+"\n } else if ("+(2==b)+") {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + "+c+", ch),\n initializationValue,\n initializationValue\n );\n\n "+w+"\n } else if ("+(3==b)+") {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + "+c+", ch),\n getValue(batch, xD, xR, xC + 2 * "+c+", ch),\n initializationValue\n );\n\n "+w+"\n }\n }\n setOutput("+y+");\n }\n }\n "}}function Oa(t,e){this.variableNames=["x"];var n=t.windowSize,r=t.batchSize,o=t.inSize,i=Math.ceil(o/n);this.outputShape=[r,i];var a="0.0",s="";"prod"===e?a="1.0":"min"===e?(a="1.0 / 1e-20",s="min"):"max"===e&&(a="-1.0 / 1e-20",s="max");var u=e+"("+e+"("+e+"(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])";"sum"===e?u="sumValue":"prod"===e?u="prodValue":"all"===e?u="allValue":"any"===e&&(u="anyValue");var c=4*Math.floor(n/4),l=n%4,h="\n if ("+("sum"===e)+") {\n sumValue += dot(values, ones);\n } else if ("+("prod"===e)+") {\n vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\n prodValue *= tmp[0] * tmp[1];\n } else {\n minMaxValue = "+s+"(values, minMaxValue);\n }\n ",p="vec4";"all"===e?(a="1.0",h="\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n ",p="bvec4"):"any"===e&&(a="0.0",h="\n bool reducedAnyValue = any(values);\n float floatedReducedAnyValue = float(reducedAnyValue);\n anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\n ",p="bvec4");var f="";0= "+o+") {\n return initializationValue;\n }\n "),this.userCode="\n const float initializationValue = "+a+";\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n "+f+"\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * "+n+";\n\n vec4 minMaxValue = vec4("+a+");\n float prodValue = 1.0;\n float sumValue = 0.0;\n float allValue = 1.0;\n float anyValue = 0.0;\n\n for (int i = 0; i < "+c+"; i += 4) {\n int inIdx = inOffset + i;\n "+p+" values = "+p+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n "+h+"\n }\n\n int inIdx = inOffset + "+c+";\n if ("+(1==l)+") {\n "+p+" values = "+p+"(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n "+h+"\n } else if ("+(2==l)+") {\n "+p+" values = "+p+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n "+h+"\n } else if ("+(3==l)+") {\n "+p+" values = "+p+"(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n "+h+"\n }\n setOutput("+u+");\n }\n "}function Pa(t,e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t;for(var n="",r=0;r<4;r++){var o="thisRC = rc;";r%2==1&&(o+="thisRC.z += 1;"),1= "+s+") {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= "+u+") {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), "+(o-1)+".0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), "+(i-1)+".0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n "}function La(t,e,n,r){this.variableNames=["A"],this.outputShape=[];var o=t[0],i=t[1],a=t[2],s=t[3];this.outputShape=[o,e,n,s];var u=[r&&1= "+s+") {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= "+u+") {\n continue;\n }\n\n float sourceFracRow =\n float("+c[0]+") *\n (float(dyR) / float("+l[0]+"));\n\n float sourceFracCol =\n float("+c[1]+") *\n (float(dyC) / float("+l[1]+"));\n\n int sourceNearestRow = int(min(\n float(int("+o+") - 1),\n "+n+" ? float(round(sourceFracRow)) :\n float(floor(sourceFracRow))));\n\n int sourceNearestCol = int(min(\n float(int("+i+") - 1),\n "+n+" ? float(round(sourceFracCol)) :\n float(floor(sourceFracCol))));\n\n if (r == sourceNearestRow && c == sourceNearestCol) {\n accumulator += getDy(b, dyR, dyC, d);\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n "}function Ua(t,e,n,r){this.variableNames=["A"],this.outputShape=[];var o=t[0],i=t[1],a=t[2],s=t[3];this.outputShape=[o,e,n,s];var u=[r&&1= 1.0) {\n setOutput(getA("+o+"));\n } else {\n setOutput(getB("+o+"));\n }\n }\n "}var Ka=(Ya.prototype.getCustomSetupFunc=function(n){var r=this;if(n.length!==this.rank)throw Error("The rank ("+this.rank+") of the program must match the length of start ("+n.length+")");return function(t,e){null==r.startLoc&&(r.startLoc=t.getUniformLocationNoThrow(e,"start"),null==r.startLoc)||t.gl.uniform1iv(r.startLoc,n)}},Ya),Xa=["x","y","z","w","u","v"];function Ya(t){this.variableNames=["source"],this.outputShape=t,this.rank=t.length;var e,n=ni(this.rank),r="uniform int start["+this.rank+"];",o=function(t){if(1===t)return"sourceLoc";if(t<=6)return Xa.slice(0,t).map(function(t){return"sourceLoc."+t}).join(",");throw Error("Slicing for rank "+t+" is not yet supported")}(this.rank);e="\n "+n+" sourceLoc;\n "+n+" coords = getOutputCoords();\n "+t.map(function(t,e){return"sourceLoc."+Xa[e]+" = start["+e+"] + coords."+Xa[e]+";"}).join("\n")+"\n ",this.userCode="\n "+r+"\n void main() {\n "+e+"\n setOutput(getSource("+o+"));\n }\n "}function $a(t,e,n){this.variableNames=["x"];var r=(this.outputShape=n).length,o=ni(n.length),i=ni(n.length),a="";if(1===r)a="coords * strides + begin";else{var s=0;a=n.map(function(t,e){return s++,1===n.length?"coords * strides["+e+"] + begin["+e+"]":"coords["+(s-1)+"] * strides["+e+"] + begin["+e+"]"}).join(",")}this.userCode="\n "+o+" begin = "+o+"("+t+");\n "+o+" strides = "+o+"("+e+");\n\n void main() {\n "+i+" coords = getOutputCoords();\n setOutput(getX("+a+"));\n }\n "}var Ja=(ts.prototype.getCustomSetupFunc=function(n){var r=this;if(n.length!==this.rank)throw Error("The rank ("+this.rank+") of the program must match the length of start ("+n.length+")");return function(t,e){null==r.startLoc&&(r.startLoc=t.getUniformLocationNoThrow(e,"start"),null==r.startLoc)||t.gl.uniform1iv(r.startLoc,n)}},ts),Qa=(Za.prototype.acquireTexture=function(t,e,n){var r,o=es(e,n),i=ns(t,o,n);if(i in this.freeTextures||(this.freeTextures[i]=[]),i in this.usedTextures||(this.usedTextures[i]=[]),0_().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER")){var o=Math.floor(t.length/2),i=this.concat(t.slice(0,o),e),a=this.concat(t.slice(o),e);return this.concat([i,a],e)}if(_().getBool("WEBGL_PACK_ARRAY_OPERATIONS")&&1 4 with a WebGL backend not implemented yet"});var r=e.reduce(function(t,e){return t*e}),o=Pr(t.shape,e,r),i=Br(o.length,e.length),a=Lr(t.shape,e,r),s=Wr(n,e.length),u=zr(a,n,e.length);return t.reshape(o).transpose(i).reshape(a).slice(s,u)},Ds.prototype.spaceToBatchND=function(t,e,n){P(t.rank<=4,function(){return"spaceToBatchND for rank > 4 with a WebGL backend not implemented yet"});var r=e.reduce(function(t,e){return t*e}),o=[[0,0]];o.push.apply(o,n);for(var i=1+e.length;i b);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},Ds.prototype.greaterEqual=function(t,e){if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return vec4(greaterThanEqual(a, b));\n","bool");var n=new hi("return float(a >= b);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},Ds.prototype.logicalNot=function(t){var e=new as(t.shape,"return float(!(x >= 1.0));");return this.compileAndRun(e,[t])},Ds.prototype.logicalAnd=function(t,e){if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return vec4(\n vec4(greaterThanEqual(a, vec4(1.0))) *\n vec4(greaterThanEqual(b, vec4(1.0))));\n","bool");var n=new hi("return float(a >= 1.0 && b >= 1.0);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},Ds.prototype.logicalOr=function(t,e){if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n return min(\n vec4(greaterThanEqual(a, vec4(1.0))) +\n vec4(greaterThanEqual(b, vec4(1.0))),\n vec4(1.0));\n","bool");var n=new hi("return float(a >= 1.0 || b >= 1.0);",t.shape,e.shape);return this.compileAndRun(n,[t,e],"bool")},Ds.prototype.select=function(t,e,n){var r=new ja(t.rank,e.shape,e.rank);return this.compileAndRun(r,[t,e,n],Mt(e.dtype,n.dtype))},Ds.prototype.where=function(t){rn("tf.where() in webgl locks the UI thread. Call tf.whereAsync() instead");var e=t.dataSync();return Go(t.shape,e)},Ds.prototype.topk=function(t,e,n){return Vo(t.dataSync(),t.shape,t.dtype,e)},Ds.prototype.min=function(t,e){fn("min",e,t.rank);var n=hn(t.shape,e),r=n[0],o=L(n[1]),i=t.as2D(-1,o);return this.reduce(i,"min",i.dtype).reshape(r)},Ds.prototype.minimum=function(t,e){if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.minimum(t,e);var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("\n vec4 result = vec4(min(a, b));\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new hi("\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n\n return min(a, b);\n",t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.mod=function(t,e){var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("\n vec4 result = mod(a, b);\n vec4 isNaN = vec4(equal(b, vec4(0.0)));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new hi("if (b == 0.0) return NAN;\n return mod(a, b);",t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.max=function(t,e){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.max(t,e);fn("max",e,t.rank);var n=hn(t.shape,e),r=n[0],o=L(n[1]),i=t.as2D(-1,o);return this.reduce(i,"max",i.dtype).reshape(r)},Ds.prototype.maximum=function(t,e){if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.maximum(t,e);var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("\n vec4 result = vec4(max(a, b));\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new hi("\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n\n return max(a, b);\n",t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.all=function(t,e){fn("all",e,t.rank);var n=hn(t.shape,e),r=n[0],o=L(n[1]),i=t.as2D(-1,o);return this.reduce(i,"all",i.dtype).reshape(r)},Ds.prototype.any=function(t,e){fn("any",e,t.rank);var n=hn(t.shape,e),r=n[0],o=L(n[1]),i=t.as2D(-1,o);return this.reduce(i,"any",i.dtype).reshape(r)},Ds.prototype.squaredDifference=function(t,e){var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("return (a - b) * (a - b);",t.shape,e.shape):new hi("return (a - b) * (a - b);",t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.realDivide=function(t,e){if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n // vec4 one = vec4(equal(a, b));\n // return one + (vec4(1.0) - one) * a / b;\n vec4 result = a / b;\n if(a.x == b.x) {\n result.x = 1.;\n }\n if(a.y == b.y) {\n result.y = 1.;\n }\n if(a.z == b.z) {\n result.z = 1.;\n }\n if(a.w == b.w) {\n result.w = 1.;\n }\n\n return result;\n","float32",!0);var n=new hi("\nif (a == b) {\n return 1.0;\n};\nreturn a / b;",t.shape,e.shape);return this.compileAndRun(n,[t,e],"float32")},Ds.prototype.floorDiv=function(t,e){if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,"\n ivec4 ia = round(a);\n ivec4 ib = round(b);\n bvec4 cond = notEqual(ib, ivec4(0));\n ivec4 result = ivec4(0);\n vec4 s = sign(a) * sign(b);\n\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n if (cond[0]) {\n result[0] = idiv(ia[0], ib[0], s[0]);\n }\n if (cond[1]) {\n result[1] = idiv(ia[1], ib[1], s[1]);\n }\n if (cond[2]) {\n result[2] = idiv(ia[2], ib[2], s[2]);\n }\n if (cond[3]) {\n result[3] = idiv(ia[3], ib[3], s[3]);\n }\n return vec4(result);\n","int32");var n=new hi("\n float s = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n if (ib != 0) {\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n return float(idiv(ia, ib, s));\n } else {\n return NAN;\n }\n",t.shape,e.shape);return this.compileAndRun(n,[t,e],"int32")},Ds.prototype.add=function(t,e){if("complex64"===t.dtype&&"complex64"===e.dtype)return this.complexSeparableBinaryOp(t,e,mi);if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.add(t,e);var n=Mt(t.dtype,e.dtype);if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,mi,n);var r=new hi(mi,t.shape,e.shape);return this.compileAndRun(r,[t,e],n)},Ds.prototype.packedUnaryOp=function(t,e,n){var r=new ss(t.shape,e);return this.compileAndRun(r,[t],n)},Ds.prototype.packedBinaryOp=function(t,e,n,r,o){void 0===o&&(o=!1);var i=new pi(n,t.shape,e.shape,o);return this.compileAndRun(i,[t,e],r)},Ds.prototype.complexSeparableBinaryOp=function(a,s,u){var c=this,t=this.texData.get(a.dataId),e=this.texData.get(s.dataId),n=[[t.complexTensors.real,e.complexTensors.real],[t.complexTensors.imag,e.complexTensors.imag]].map(function(t){var e=t[0],n=t[1],r=c.makeComplexComponentTensorInfo(a,e),o=c.makeComplexComponentTensorInfo(s,n),i=new hi(u,a.shape,s.shape);return c.compileAndRun(i,[r,o],Mt(e.dtype,n.dtype))}),r=n[0],o=n[1],i=this.complex(r,o);return r.dispose(),o.dispose(),i},Ds.prototype.makeComplexComponentTensorInfo=function(t,e){return{dataId:e.dataId,dtype:e.dtype,shape:t.shape}},Ds.prototype.addN=function(t){if(1===t.length)return t[0];if(t.length>_().get("WEBGL_MAX_TEXTURES_IN_SHADER")){var e=Math.floor(t.length/2),n=this.addN(t.slice(0,e)),r=this.addN(t.slice(e));return this.addN([n,r])}var o=t.map(function(t){return t.dtype}).reduce(function(t,e){return Mt(t,e)}),i=t.map(function(t){return t.shape}),a=_().getBool("WEBGL_PACK")?new qo(t[0].shape,i):new Ho(t[0].shape,i);return this.compileAndRun(a,t,o)},Ds.prototype.subtract=function(t,e){if("complex64"===t.dtype&&"complex64"===e.dtype)return this.complexSeparableBinaryOp(t,e,gi);if(this.shouldExecuteOnCPU([t,e]))return this.cpuBackend.subtract(t,e);var n=Mt(t.dtype,e.dtype);if(_().getBool("WEBGL_PACK_BINARY_OPERATIONS"))return this.packedBinaryOp(t,e,gi,t.dtype);var r=new hi(gi,t.shape,e.shape);return this.compileAndRun(r,[t,e],n)},Ds.prototype.pow=function(t,e){var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("\n // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise.\n vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1)));\n vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\n vec4 result = multiplier * pow(abs(a), b);\n\n // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\n bvec4 isExpZero = equal(b, vec4(0.0));\n result.r = isExpZero.r ? 1.0 : result.r;\n result.g = isExpZero.g ? 1.0 : result.g;\n result.b = isExpZero.b ? 1.0 : result.b;\n result.a = isExpZero.a ? 1.0 : result.a;\n\n vec4 isNaN = vec4(lessThan(a, vec4(0.0))) * vec4(lessThan(floor(b), b));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new hi("\nif(a < 0.0 && floor(b) < b){\n return NAN;\n}\nif (b == 0.0) {\n return 1.0;\n}\nreturn (round(mod(b, 2.0)) != 1) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n",t.shape,e.shape),r=Mt(t.dtype,e.dtype);return this.compileAndRun(n,[t,e],r)},Ds.prototype.ceil=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.ceil(t);if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,gs,t.dtype);var e=new as(t.shape,gs);return this.compileAndRun(e,[t])},Ds.prototype.floor=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.floor(t);if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,ys,t.dtype);var e=new as(t.shape,ys);return this.compileAndRun(e,[t])},Ds.prototype.sign=function(t){var e=new as(t.shape,"\n if (isnan(x)) { return 0.0; }\n return sign(x);\n");return this.compileAndRun(e,[t])},Ds.prototype.isNaN=function(t){var e=new as(t.shape,"return float(isnan(x));");return this.compileAndRun(e,[t],"bool")},Ds.prototype.isInf=function(t){var e=new as(t.shape,"return float(isinf(x));");return this.compileAndRun(e,[t],"bool")},Ds.prototype.isFinite=function(t){var e=new as(t.shape,"return float(!isnan(x) && !isinf(x));");return this.compileAndRun(e,[t],"bool")},Ds.prototype.round=function(t){var e=new as(t.shape,"\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n");return this.compileAndRun(e,[t])},Ds.prototype.exp=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.exp(t);if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,xs,t.dtype);var e=new as(t.shape,xs);return this.compileAndRun(e,[t])},Ds.prototype.expm1=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.expm1(t);if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,bs,t.dtype);var e=new as(t.shape,bs);return this.compileAndRun(e,[t])},Ds.prototype.log=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.log(t);if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,"\n vec4 result = log(x);\n vec4 isNaN = vec4(lessThan(x, vec4(0.0)));\n result.r = isNaN.r == 1.0 ? NAN : result.r;\n result.g = isNaN.g == 1.0 ? NAN : result.g;\n result.b = isNaN.b == 1.0 ? NAN : result.b;\n result.a = isNaN.a == 1.0 ? NAN : result.a;\n\n return result;\n",t.dtype);var e=new as(t.shape,"if (x < 0.0) return NAN;\n return log(x);");return this.compileAndRun(e,[t])},Ds.prototype.log1p=function(t){var e=new as(t.shape,"return log(1.0 + x);");return this.compileAndRun(e,[t])},Ds.prototype.sqrt=function(t){var e=new as(t.shape,"return sqrt(x);");return this.compileAndRun(e,[t])},Ds.prototype.rsqrt=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.rsqrt(t);var e=new as(t.shape,"return inversesqrt(x);");return this.compileAndRun(e,[t])},Ds.prototype.reciprocal=function(t){var e=new as(t.shape,"return 1.0 / x;");return this.compileAndRun(e,[t])},Ds.prototype.relu=function(t){var e;return e=_().getBool("WEBGL_PACK")?new ss(t.shape,Cs):new as(t.shape,fs),this.compileAndRun(e,[t])},Ds.prototype.relu6=function(t){var e;return e=_().getBool("WEBGL_PACK")?new ss(t.shape,Es):new as(t.shape,ds),this.compileAndRun(e,[t])},Ds.prototype.prelu=function(t,e){var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi(bi,t.shape,e.shape):new hi(xi,t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.elu=function(t){if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,_s,t.dtype);var e=new as(t.shape,vs);return this.compileAndRun(e,[t])},Ds.prototype.eluDer=function(t,e){var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n",t.shape,e.shape):new hi("return (b >= 1.0) ? a : a * (b + 1.0);",t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.selu=function(t){var e=new as(t.shape,"\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n // see: https://arxiv.org/abs/1706.02515\n float scaleAlpha = 1.7580993408473768;\n float scale = 1.0507009873554805;\n return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n");return this.compileAndRun(e,[t])},Ds.prototype.int=function(t){var e=new as(t.shape,"return float(int(x));");return this.compileAndRun(e,[t],"int32")},Ds.prototype.clip=function(t,e,n){var r,o=(r=_().getBool("WEBGL_PACK_CLIP")?new Ci(t.shape):new wi(t.shape)).getCustomSetupFunc(e,n);return this.compileAndRun(r,[t],null,o)},Ds.prototype.abs=function(t){if(this.shouldExecuteOnCPU([t]))return this.cpuBackend.abs(t);if(_().getBool("WEBGL_PACK_UNARY_OPERATIONS"))return this.packedUnaryOp(t,ps,t.dtype);var e=new as(t.shape,ps);return this.compileAndRun(e,[t])},Ds.prototype.complexAbs=function(t){var e=this.texData.get(t.dataId),n=new fi(t.shape),r=[this.makeComplexComponentTensorInfo(t,e.complexTensors.real),this.makeComplexComponentTensorInfo(t,e.complexTensors.imag)];return this.compileAndRun(n,r)},Ds.prototype.sigmoid=function(t){var e=new as(t.shape,"return 1.0 / (1.0 + exp(-1.0 * x));");return this.compileAndRun(e,[t])},Ds.prototype.softplus=function(t){var e=new as(t.shape,"\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n");return this.compileAndRun(e,[t])},Ds.prototype.sin=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n return sin(x);\n");return this.compileAndRun(e,[t])},Ds.prototype.cos=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n return cos(x);\n");return this.compileAndRun(e,[t])},Ds.prototype.tan=function(t){var e=new as(t.shape,"return tan(x);");return this.compileAndRun(e,[t])},Ds.prototype.asin=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n if (abs(x) > 1.) {\n return NAN;\n }\n return asin(x);\n");return this.compileAndRun(e,[t])},Ds.prototype.acos=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n if (abs(x) > 1.) {\n return NAN;\n }\n return acos(x);\n");return this.compileAndRun(e,[t])},Ds.prototype.atan=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n return atan(x);\n");return this.compileAndRun(e,[t])},Ds.prototype.atan2=function(t,e){var n=_().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new pi("\n vec4 result = atan(a, b);\n vec4 isNaN = min(vec4(isnan(a)) + vec4(isnan(b)), vec4(1.0));\n \n result.r = isNaN.r > 0. ? NAN : result.r;\n result.g = isNaN.g > 0. ? NAN : result.g;\n result.b = isNaN.b > 0. ? NAN : result.b;\n result.a = isNaN.a > 0. ? NAN : result.a;\n\n return result;\n",t.shape,e.shape):new hi("\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n\n return atan(a, b);\n",t.shape,e.shape);return this.compileAndRun(n,[t,e])},Ds.prototype.sinh=function(t){var e=new as(t.shape,"\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n");return this.compileAndRun(e,[t])},Ds.prototype.cosh=function(t){var e=new as(t.shape,"\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n");return this.compileAndRun(e,[t])},Ds.prototype.tanh=function(t){var e=new as(t.shape,"\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n");return this.compileAndRun(e,[t])},Ds.prototype.asinh=function(t){var e=new as(t.shape,"if (isnan(x)) return x;return log(x + sqrt(x * x + 1.0));");return this.compileAndRun(e,[t])},Ds.prototype.acosh=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n if (x < 1.0) return NAN;\n return log(x + sqrt(x * x - 1.0));");return this.compileAndRun(e,[t])},Ds.prototype.atanh=function(t){var e=new as(t.shape,"if (isnan(x)) return x;\n if ((x < -1.0) || (x > 1.0)) return NAN;\n return (log(1.0 + x) - log(1.0 - x)) / 2.0;");return this.compileAndRun(e,[t])},Ds.prototype.erf=function(t){var e=new as(t.shape,'\n // Error function is calculated approximately with elementary function.\n // See "Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables", Abramowitz and Stegun.\n float p = 0.3275911;\n float a1 = 0.254829592;\n float a2 = -0.284496736;\n float a3 = 1.421413741;\n float a4 = -1.453152027;\n float a5 = 1.061405429;\n\n float sign = sign(x);\n x = abs(x);\n float t = 1.0 / (1.0 + p * x);\n return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x));\n');return this.compileAndRun(e,[t])},Ds.prototype.step=function(t,e){var n,r=new as(t.shape,(void 0===(n=e)&&(n=0),hs+"\n return x > 0.0 ? 1.0 : float("+n+");\n "));return this.compileAndRun(r,[t])},Ds.prototype.conv2dByMatMul=function(t,e,n,r,o,i){var a=t.shape,s=this.texData.get(t.dataId),u=n.inChannels,c=a[0]*a[1]*a[2],l=n.outChannels,h="channelsLast"===n.dataFormat,p=(1==c||1===l)&&1e3 1 for depthToSpace, but was: "+e});var r=t.shape[0],o="NHWC"===n?t.shape[1]:t.shape[2],i="NHWC"===n?t.shape[2]:t.shape[3],a="NHWC"===n?t.shape[3]:t.shape[1],s=o*e,u=i*e,c=a/(e*e),l=new Xi("NHWC"===n?[r,s,u,c]:[r,c,s,u],e,n);return this.compileAndRun(l,[t])},Ds.prototype.split=function(t,e,n){return zo(t,e,n)},Ds.prototype.scatterND=function(t,e,n){var r=jr(0,t,n),o=r.sliceRank,i=r.numUpdates,a=r.sliceSize,s=r.strides,u=r.outputSize,c=[u/a,a],l=t.reshape([i,o]),h=e.reshape([i,a]);if(0===u)return Do(En([]),n);var p=In(0),f=new Ha(i,o,l.rank,h.rank,s,c);return this.compileAndRun(f,[h,l,p]).reshape(n)},Ds.prototype.sparseToDense=function(t,e,n,r){var o=jr(0,t,n),i=o.sliceRank,a=o.numUpdates,s=o.strides,u=o.outputSize,c=new Ha(a,i,t.rank,e.rank,s,[u,1],!1);return this.compileAndRun(c,[e,t,r]).reshape(n)},Ds.prototype.fft=function(t){return this.fftImpl(t,!1)},Ds.prototype.ifft=function(t){return this.fftImpl(t,!0)},Ds.prototype.fftImpl=function(t,e){var n=this.texData.get(t.dataId),r=new ji("return real * expR - imag * expI;",t.shape,e),o=new ji("return real * expI + imag * expR;",t.shape,e),i=[this.makeComplexComponentTensorInfo(t,n.complexTensors.real),this.makeComplexComponentTensorInfo(t,n.complexTensors.imag)],a=this.compileAndRun(r,i),s=this.compileAndRun(o,i),u=this.complex(a,s).as2D(t.shape[0],t.shape[1]);return a.dispose(),s.dispose(),u},Ds.prototype.gatherND=function(t,e){var n=e.shape,r=n[n.length-1],o=Ur(t,e),i=o[0],a=o[1],s=o[2],u=o[3],c=e.reshape([a,r]),l=t.reshape([t.size/s,s]),h=new Qi(r,u,[a,s]);return this.compileAndRun(h,[l,c]).reshape(i)},Ds.prototype.fill=function(t,e,n){if("string"===(n=n||j(e))){var r=F(n,L(t));return r.fill(e),qt.makeTensor(r,t,n,this)}var o=new Yi(t,e),i=o.getCustomSetupFunc(e);return this.compileAndRun(o,[],n,i)},Ds.prototype.onesLike=function(t){if("string"===t.dtype)throw new Error("onesLike is not supported under string dtype");return this.fill(t.shape,1,t.dtype)},Ds.prototype.zerosLike=function(t){return this.fill(t.shape,"string"===t.dtype?"":0,t.dtype)},Ds.prototype.linspace=function(t,e,n){return Ao(t,e,n)},Ds.prototype.makeTensorInfo=function(t,e){var n=this.write(null,t,e);return this.texData.get(n).usage=null,{dataId:n,shape:t,dtype:e}},Ds.prototype.makeOutput=function(t,e){var n=this.makeTensorInfo(t,e).dataId;return qt.makeTensorFromDataId(n,t,e,this)},Ds.prototype.unpackTensor=function(t){var e=new us(t.shape);return this.runWebGLProgram(e,[t],t.dtype)},Ds.prototype.packTensor=function(t){var e=new Sa(t.shape);return this.runWebGLProgram(e,[t],t.dtype,null,!0)},Ds.prototype.packedReshape=function(t,e){var n=[Pe(t.shape)].concat(Be(t.shape)),r={dtype:t.dtype,shape:n,dataId:t.dataId},o=[Pe(e)].concat(Be(e)),i=new Pa(o,n),a=this.runWebGLProgram(i,[r],t.dtype,null,!0);return{dataId:a.dataId,shape:e,dtype:a.dtype}},Ds.prototype.decode=function(t){var e,n=this.texData.get(t),r=n.isPacked,o=n.shape,i=n.dtype,a=Le(o);return e=r?new zi(a):new Wi(a),{dtype:i,shape:o,dataId:this.runWebGLProgram(e,[{shape:a,dtype:i,dataId:t}],i,null,!0).dataId}},Ds.prototype.runWebGLProgram=function(o,t,e,n,r){var i=this;void 0===r&&(r=!1);var a=this.makeTensorInfo(o.outputShape,e),s=this.texData.get(a.dataId);if(o.packedOutput&&(s.isPacked=!0),o.outPackingScheme===Xt.DENSE){var u=ie(o.outputShape);s.texShape=u.map(function(t){return 2*t})}if(null!=o.outTexUsage&&(s.usage=o.outTexUsage),0===L(a.shape))return s.values=N(a.dtype,0),a;var c=[],l=t.map(function(t){if("complex64"===t.dtype)throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");var e=i.texData.get(t.dataId);if(null==e.texture){if(!o.packedInputs&&L(t.shape)<=_().getNumber("WEBGL_SIZE_UPLOAD_UNIFORM"))return{shape:t.shape,texData:null,isUniform:!0,uniformValues:e.values};o.packedInputs&&(e.isPacked=!0,e.shape=t.shape)}else if(!!e.isPacked!=!!o.packedInputs)t=e.isPacked?i.unpackTensor(t):i.packTensor(t),c.push(t),e=i.texData.get(t.dataId);else if(e.isPacked&&!Ue(e.shape,t.shape)){var n=t,r=t.shape;t.shape=e.shape,t=i.packedReshape(t,r),c.push(t),e=i.texData.get(t.dataId),n.shape=r}return i.uploadToGPU(t.dataId),{shape:t.shape,texData:e,isUniform:!1}});this.uploadToGPU(a.dataId);var h,p={shape:a.shape,texData:s,isUniform:!1},f=function(t,e,n){var r="";l.concat(n).forEach(function(t){var e=null!=t.texData&&null!=t.texData.slice&&01024*this.numMBBeforeWarning*1024){var o=(this.numBytesInGPU/1024/1024).toFixed(2);this.warnedAboutMemory=!0,console.warn("High memory usage in GPU: "+o+" MB, most likely due to a memory leak")}return this.textureManager.acquireTexture(t,e,r)},Ds.prototype.computeBytes=function(t,e){return t[0]*t[1]*U(e)},Ds);function Ds(t){var e,n=ks.call(this)||this;if(n.pendingRead=new WeakMap,n.pendingDisposal=new WeakSet,n.dataRefCount=new WeakMap,n.numBytesInGPU=0,n.uploadWaitMs=0,n.downloadWaitMs=0,n.warnedAboutMemory=!1,n.pendingDeletes=0,n.disposed=!1,!_().getBool("HAS_WEBGL"))throw new Error("WebGL is not supported on this device");if(null==t){var r=re(_().getNumber("WEBGL_VERSION"));n.binaryCache=((e=_().getNumber("WEBGL_VERSION"))in Is||(Is[e]={}),Is[e]),n.gpgpu=new ga(r),n.canvas=r.canvas,n.gpgpuCreatedLocally=!0}else n.gpgpu=t,n.binaryCache={},n.gpgpuCreatedLocally=!1,n.canvas=t.gl.canvas;return n.textureManager=new Qa(n.gpgpu),n.numMBBeforeWarning=null==_().global.screen?1024:_().global.screen.height*_().global.screen.width*window.devicePixelRatio*600/1024/1024,n.texData=new so(n,qt),n}jt()&&qt.registerBackend("webgl",function(){return new Ss},2),h({kernelName:"Square",gradFunc:function(t,e){var n=e[0];return{x:function(){return t.mul(n.toFloat().mul(2))}}}});var As=xn({square_:function(t){var n=sn(t,"x","square"),e=[n];return qt.runKernelFunc(function(t,e){return e([n]),t.square(n)},{x:n},null,"Square",{},e,[])}}),Ts=xn({abs_:function(t){var r=sn(t,"x","abs");return"complex64"===r.dtype?qt.runKernelFunc(function(t){return t.complexAbs(r)},{$x:r}):qt.runKernelFunc(function(t,e){var n=t.abs(r);return e([r]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return t.mul(n.toFloat().step(-1))}}},"Abs")}}),Ns=xn({acos_:function(t){var r=sn(t,"x","acos");return qt.runKernelFunc(function(t,e){var n=t.acos(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.divStrict(In(1).sub(n.toFloat().square()).sqrt()).neg()}}})}}),Fs=xn({acosh_:function(t){var r=sn(t,"x","acosh");return qt.runKernelFunc(function(t,e){var n=t.acosh(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.divStrict(n.toFloat().square().sub(1).sqrt())}}})}}),Ms=xn({asin_:function(t){var r=sn(t,"x","asin");return qt.runKernelFunc(function(t,e){var n=t.asin(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.divStrict(In(1).sub(n.toFloat().square()).sqrt())}}})}}),Os=xn({asinh_:function(t){var r=sn(t,"x","asinh");return qt.runKernelFunc(function(t,e){var n=t.asinh(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.divStrict(In(1).add(n.toFloat().square()).sqrt())}}})}}),Ps=xn({atan_:function(t){var r=sn(t,"x","atan");return qt.runKernelFunc(function(t,e){var n=t.atan(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.div(n.toFloat().square().add(1))}}})}}),Bs=xn({atanh_:function(t){var r=sn(t,"x","atanh");return qt.runKernelFunc(function(t,e){var n=t.atanh(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.div(In(1).sub(n.toFloat().square()))}}})}}),Ls=xn({ceil_:function(t){var e=sn(t,"x","ceil");return qt.runKernelFunc(function(t){return t.ceil(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),Ws=xn({clipByValue_:function(t,r,o){var i=sn(t,"x","clipByValue");P(r<=o,function(){return"Error in clip: min ("+r+") must be less than or equal to max ("+o+")."});var e=[i],n={min:r,max:o};return qt.runKernelFunc(function(t,e){var n=t.clip(i,r,o);return e([i]),n},{x:i},function(t,e){var n=e[0];return{x:function(){return t.where(n.greaterEqual(r).logicalAnd(n.lessEqual(o)),Wn(t))}}},"ClipByValue",n,e)}}),zs=xn({cos_:function(t){var r=sn(t,"x","cos"),e=[r];return qt.runKernelFunc(function(t,e){var n=t.cos(r);return e([r]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return n.toFloat().sin().neg().mul(t)}}},"Cos",{},e)}}),Us=xn({cosh_:function(t){var r=sn(t,"x","cosh");return qt.runKernelFunc(function(t,e){var n=t.cosh(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return n.toFloat().sinh().mulStrict(t)}}})}}),Vs=xn({erf_:function(t){var r=sn(t,"x","erf");return P("int32"===r.dtype||"float32"===r.dtype,function(){return"Input dtype must be `int32` or `float32`."}),"int32"===r.dtype&&(r=r.toFloat()),qt.runKernelFunc(function(t,e){var n=t.erf(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.mul(n.square().neg().exp().mul(2/Math.sqrt(Math.PI)))}}})}}),Gs=xn({exp_:function(t){var r=sn(t,"x","exp");return qt.runKernelFunc(function(t,e){var n=t.exp(r);return e([n]),n},{x:r},function(t,e){return{x:function(){return t.mulStrict(e[0])}}},"Exp",{},[],[!0])}}),Hs=xn({expm1_:function(t){var r=sn(t,"x","expm1");return qt.runKernelFunc(function(t,e){var n=t.expm1(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.mul(n.exp())}}})}}),qs=xn({floor_:function(t){var e=sn(t,"x","floor");return qt.runKernelFunc(function(t){return t.floor(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),js=xn({log_:function(t){var r=sn(t,"x","log"),e=[r];return qt.runKernelFunc(function(t,e){var n=t.log(r);return e([r]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return t.div(n.toFloat())}}},"Log",{},e)}}),Ks=xn({log1p_:function(t){var r=sn(t,"x","log1p");return qt.runKernelFunc(function(t,e){var n=t.log1p(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.div(n.add(1))}}})}}),Xs=xn({logSigmoid_:function(t){var r=sn(t,"x","logSigmoid");return qt.runKernelFunc(function(t,e){var n=t.softplus(r.neg()).neg();return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.mul(n.neg().sigmoid())}}})}}),Ys=xn({neg_:function(t){var e=sn(t,"x","neg");return qt.runKernelFunc(function(t){return t.neg(e)},{$x:e},function(t){return{$x:function(){return t.neg()}}})}}),$s=xn({reciprocal_:function(t){var r=sn(t,"x","reciprocal");return qt.runKernelFunc(function(t,e){var n=t.reciprocal(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.div(n.square().neg())}}})}}),Js=xn({round_:function(t){var e=sn(t,"x","round");return qt.runKernelFunc(function(t){return t.round(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),Qs=xn({rsqrt_:function(t){var r=sn(t,"x","rsqrt"),e=[r];return qt.runKernelFunc(function(t,e){var n=t.rsqrt(r);return e([r]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return t.div(n.pow(1.5).mul(2)).neg()}}},"Rsqrt",{},e)}}),Zs=xn({sigmoid_:function(t){var r=sn(t,"x","sigmoid");return qt.runKernelFunc(function(t,e){var n=t.sigmoid(r);return e([n]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return t.mul(n.mul(In(1).sub(n)))}}},"Sigmoid")}}),tu=xn({sign_:function(t){var e=sn(t,"x","sign");return qt.runKernelFunc(function(t){return t.sign(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),eu=xn({isNaN_:function(t){var e=sn(t,"x","isNaN");return qt.runKernelFunc(function(t){return t.isNaN(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),nu=xn({isInf_:function(t){var e=sn(t,"x","isInf");return qt.runKernelFunc(function(t){return t.isInf(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),ru=xn({isFinite_:function(t){var e=sn(t,"x","isFinite");return qt.runKernelFunc(function(t){return t.isFinite(e)},{$x:e},function(t){return{$x:function(){return Wn(t)}}})}}),ou=xn({sin_:function(t){var r=sn(t,"x","sin"),e=[r];return qt.runKernelFunc(function(t,e){var n=t.sin(r);return e([r]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return n.toFloat().cos().mul(t)}}},"Sin",{},e)}}),iu=xn({sinh_:function(t){var r=sn(t,"x","sinh");return qt.runKernelFunc(function(t,e){var n=t.sinh(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return n.toFloat().cosh().mulStrict(t)}}})}}),au=xn({softplus_:function(t){var r=sn(t,"x","softplus");return qt.runKernelFunc(function(t,e){var n=t.softplus(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.mul(n.sigmoid())}}})}}),su=xn({sqrt_:function(t){var r=sn(t,"x","sqrt");return qt.runKernelFunc(function(t,e){var n=t.sqrt(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.div(n.toFloat().sqrt().mul(2))}}})}}),uu=xn({step_:function(t,e){void 0===e&&(e=0);var n=sn(t,"x","step");return qt.runKernelFunc(function(t){return t.step(n,e)},{$x:n},function(t){return{$x:function(){return Wn(t)}}})}}),cu=xn({tan_:function(t){var r=sn(t,"x","tan");return qt.runKernelFunc(function(t,e){var n=t.tan(r);return e([r]),n},{$x:r},function(t,e){var n=e[0];return{$x:function(){return t.div(n.cos().square())}}})}}),lu=xn({tanh_:function(t){var r=sn(t,"x","tanh");return qt.runKernelFunc(function(t,e){var n=t.tanh(r);return e([n]),n},{x:r},function(t,e){var n=e[0];return{x:function(){return In(1).sub(n.square()).mulStrict(t)}}},"Tanh",{},null,[!0])}});function hu(t,e,n,r,o,i){var a,s,u=sn(t,"x","batchNorm"),c=sn(e,"mean","batchNorm"),l=sn(n,"variance","batchNorm");return null!=o&&(a=sn(o,"scale","batchNorm")),null!=r&&(s=sn(r,"offset","batchNorm")),P(2===u.rank,function(){return"Error in batchNorm3D: x must be rank 3 but got rank "+u.rank+"."}),P(2===c.rank||1===c.rank,function(){return"Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank "+c.rank+"."}),P(2===l.rank||1===l.rank,function(){return"Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank "+l.rank+"."}),null!=a&&P(2===a.rank||1===a.rank,function(){return"Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank "+a.rank+"."}),null!=s&&P(2===s.rank||1===s.rank,function(){return"Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank "+s.rank+"."}),du(u,c,l,s,a,i)}function pu(t,e,n,r,o,i){var a,s,u=sn(t,"x","batchNorm"),c=sn(e,"mean","batchNorm"),l=sn(n,"variance","batchNorm");return null!=o&&(a=sn(o,"scale","batchNorm")),null!=r&&(s=sn(r,"offset","batchNorm")),P(3===u.rank,function(){return"Error in batchNorm3D: x must be rank 3 but got rank "+u.rank+"."}),P(3===c.rank||1===c.rank,function(){return"Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank "+c.rank+"."}),P(3===l.rank||1===l.rank,function(){return"Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank "+l.rank+"."}),null!=a&&P(3===a.rank||1===a.rank,function(){return"Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank "+a.rank+"."}),null!=s&&P(3===s.rank||1===s.rank,function(){return"Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank "+s.rank+"."}),du(u,c,l,s,a,i)}function fu(t,e,n,r,o,i){var a,s,u=sn(t,"x","batchNorm"),c=sn(e,"mean","batchNorm"),l=sn(n,"variance","batchNorm");return null!=o&&(a=sn(o,"scale","batchNorm")),null!=r&&(s=sn(r,"offset","batchNorm")),P(4===u.rank,function(){return"Error in batchNorm4D: x must be rank 4 but got rank "+u.rank+"."}),P(4===c.rank||1===c.rank,function(){return"Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank "+c.rank+"."}),P(4===l.rank||1===l.rank,function(){return"Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank "+l.rank+"."}),null!=a&&P(4===a.rank||1===a.rank,function(){return"Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank "+a.rank+"."}),null!=s&&P(4===s.rank||1===s.rank,function(){return"Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank "+s.rank+"."}),du(u,c,l,s,a,i)}function du(t,e,n,r,o,v){null==v&&(v=.001);var i,a,m,s=sn(t,"x","batchNorm"),u=sn(e,"mean","batchNorm"),c=sn(n,"variance","batchNorm");null!=o&&(i=sn(o,"scale","batchNorm")),null!=r&&(a=sn(r,"offset","batchNorm")),P(u.rank===c.rank,function(){return"Batch normalization gradient requires mean and variance to have equal ranks."}),P(null==a||u.rank===a.rank,function(){return"Batch normalization gradient requires mean and offset to have equal ranks."}),P(null==i||u.rank===i.rank,function(){return"Batch normalization gradient requires mean and scale to have equal ranks."}),m=0===s.rank||1===s.rank?s.as4D(1,1,1,s.size):2===s.rank?s.as4D(1,1,s.shape[0],s.shape[1]):3===s.rank?s.as4D(1,s.shape[0],s.shape[1],s.shape[2]):s;var l=[s,u,c,i];return qt.runKernelFunc(function(t,e){var n=t.batchNormalization(m,vu(u),vu(c),v,vu(i),vu(a));return e([s,u,c,i]),n},{x:s,mean:u,variance:c,scale:i,offset:a},function(n,t){var e=t,r=e[0],o=e[1],i=e[2],a=e[3],s=null==a?In(1):a,u=fo(o.shape,m.shape),c=[];if(1===o.rank){for(var l=0;l 0 && <= the predictions last dimension ("+r+"), but got "+g}),[4,e.data()];case 1:return o=t.sent(),[4,n.data()];case 2:for(i=t.sent(),a=[o.length/r,r],u=a[1],c=N("bool",s=a[0]),l=0;l= 2, but got rank "+t.rank);if(2===t.rank)return Jl(t,o);var e=t.shape.slice(0,t.shape.length-2).reduce(function(t,e){return t*e}),n=Or(t.reshape([e,t.shape[t.shape.length-2],t.shape[t.shape.length-1]]),0),i=[],a=[];return n.forEach(function(t){var e=Jl(t,o),n=e[0],r=e[1];i.push(n),a.push(r)}),[Nr(i,0).reshape(t.shape),Nr(a,0).reshape(t.shape)]}}),eh=Object.freeze({bandPart:Ql,gramSchmidt:Zl,qr:th});function nh(t,e,n,r,o,i){null==r&&(r=.5),null==o&&(o=Number.NEGATIVE_INFINITY),null==i&&(i=0);var a=t.shape[0];return n=Math.min(n,a),P(0<=r&&r<=1,function(){return"iouThreshold must be in [0, 1], but was '"+r+"'"}),P(2===t.rank,function(){return"boxes must be a 2D tensor, but was of rank '"+t.rank+"'"}),P(4===t.shape[1],function(){return"boxes must have 4 columns, but 2nd dimension was "+t.shape[1]}),P(1===e.rank,function(){return"scores must be a 1D tensor"}),P(e.shape[0]===a,function(){return"scores has incompatible shape with boxes. Expected "+a+", but was "+e.shape[0]}),P(0<=i&&i<=1,function(){return"softNmsSigma must be in [0, 1], but was '"+i+"'"}),{maxOutputSize:n,iouThreshold:r,scoreThreshold:o,softNmsSigma:i}}function rh(t,e){return!(0-e,s=r[o]=n.inHeight))for(var A=S*e.strides[0],T=E+D*p,N=0;N=n.inWidth))for(var B=T+P*f,L=A+O*e.strides[1],W=0;W=n.inDepth))for(var _=C*e.strides[0],I=g+E*t.strides[1],R=0;R=n.inHeight))for(var T=_+D*e.strides[1],N=I+A*t.strides[2],F=0;F=n.inWidth))for(var L=T+P*e.strides[2],W=N+B*n.inChannels,z=L,U=0;U=n.inHeight))for(var C=b*e.strides[0],E=v+w*t.strides[1],_=0;_=n.inWidth))for(var D=C+k*e.strides[1],A=E+S*n.inChannels,T=I,N=D,F=0;F=r.outHeight||Math.floor(_)!==_))for(var I=0;I=r.outWidth||Math.floor(R)!==R)){var k=c*l-1-d.get(m,_,R,g)===E*l+I?1:0;0!=k&&(C+=v.get(m,_,R,g)*k)}}}f.set(C,m,y,x,g)}return f.toTensor()},Ch.prototype.avgPoolBackprop=function(t,e,n){yh([t,e],"avgPoolBackprop");for(var r=n.strideHeight,o=n.strideWidth,i=n.filterHeight,a=n.filterWidth,s=n.dilationHeight,u=n.dilationWidth,c=n.effectiveFilterHeight,l=n.effectiveFilterWidth,h=l-1-n.padInfo.left,p=c-1-n.padInfo.top,f=sr(e.shape,"float32"),d=1/(i*a),v=this.bufferSync(t),m=0;m=n.outHeight||Math.floor(_)!==_))for(var I=0;I=n.outWidth||Math.floor(R)!==R||(C+=v.get(m,_,R,g))}}f.set(C*d,m,y,x,g)}return f.toTensor()},Ch.prototype.pool3d=function(t,e,n){yh(t,"pool3d");for(var r=e.strideDepth,o=e.strideHeight,i=e.strideWidth,a=e.dilationDepth,s=e.dilationHeight,u=e.dilationWidth,c=e.effectiveFilterDepth,l=e.effectiveFilterHeight,h=e.effectiveFilterWidth,p=e.padInfo.front,f=e.padInfo.top,d=e.padInfo.left,v="max"===n?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,m=this.readSync(t.dataId),g=sr(e.outShape,t.dtype),y=g.values,x=e.outShape[1]*e.outShape[2]*e.outShape[3]*e.outShape[4],b=e.outShape[2]*e.outShape[3]*e.outShape[4],w=e.outShape[3]*e.outShape[4],C=e.outShape[4],E=0;E=n.outDepth||Math.floor(T)!==T))for(var N=0;N=n.outHeight||Math.floor(F)!==F))for(var M=0;M=n.outWidth||Math.floor(O)!==O||(D+=b.get(w,T,F,O,C))}}}y.set(D*x,w,E,_,I,C)}return y.toTensor()},Ch.prototype.maxPool3d=function(t,e){return yh(t,"maxPool3d"),this.pool3d(t,e,"max").toFloat()},Ch.prototype.maxPool3dPositions=function(t,e){for(var n=sr(e.outShape,"int32"),r=e.strideDepth,o=e.strideHeight,i=e.strideWidth,a=e.dilationDepth,s=e.dilationHeight,u=e.dilationWidth,c=e.effectiveFilterDepth,l=e.effectiveFilterHeight,h=e.effectiveFilterWidth,p=e.padInfo.front,f=e.padInfo.top,d=e.padInfo.left,v=this.bufferSync(t),m=0;m=r.outDepth||Math.floor(A)!==A))for(var T=0;T=r.outHeight||Math.floor(N)!==N))for(var F=0;F=r.outWidth||Math.floor(M)!==M)){var O=h*p*f-1-y.get(b,A,N,M,w)===D*p*f+T*f+F?1:0;0!=O&&(S+=x.get(b,A,N,M,w)*O)}}}}g.set(S,b,C,E,_,w)}return g.toTensor()},Ch.prototype.cast=function(t,e){return So(t,e,this)},Ch.prototype.reshape=function(t,e){return Do(t,e)},Ch.prototype.avgPool=function(t,e){return yh(t,"avgPool"),this.pool(t,e,"avg").toFloat()},Ch.prototype.resizeBilinear=function(t,e,n,r){yh(t,"resizeBilinear");for(var o=t.shape,i=o[0],a=o[1],s=o[2],u=o[3],c=this.readSync(t.dataId),l=new Float32Array(L([i,e,n,u])),h=[r&&1 1 for depthToSpace, but was: "+e});for(var r=t.shape[0],o=t.shape[1],i=t.shape[2],a=t.shape[3],s=o*e,u=i*e,c=a/(e*e),l=this.readSync(t.dataId),h=new Float32Array(r*s*u*c),p=0,f=0;f=t.size/s)throw new Error("Invalid indices: "+f+" does not index into "+t.shape);for(var g=0;g element.");if(null!=g("FromPixels",qt.backendName))return qt.runKernel("FromPixels",{pixels:t},{numChannels:e});var s,u,c=o?[t.videoWidth,t.videoHeight]:[t.width,t.height],l=c[0],h=c[1];if(a?s=t.getContext("2d").getImageData(0,0,l,h).data:r||n?s=t.data:(i||o)&&(null==Np&&(Np=document.createElement("canvas").getContext("2d")),Np.canvas.width=l,Np.canvas.height=h,Np.drawImage(t,0,0,l,h),s=Np.getImageData(0,0,l,h).data),4===e)u=new Int32Array(s);else{var p=l*h;u=new Int32Array(p*e);for(var f=0;fn)}var Kp,Xp=Object.freeze({TEST_EPSILON_FLOAT16:.1,expectArraysClose:function(t,e,n){return null==n&&(n=Hp()),qp(t,e,function(t,e){return jp(t,e,n)})},testEpsilon:Hp,expectPromiseToFail:function(t,e){t().then(function(){return e.fail()},function(){return e()})},expectArraysEqual:function(t,e){var n="string"==typeof e||"number"==typeof e||"boolean"==typeof e?[e]:e;return G(t)||G(t[0])||G(e)||G(e[0])?qp(t,n,function(t,e){return t==e}):qp(t,e,function(t,e){return jp(t,e,0)})},expectNumbersClose:function(t,e,n){if(null==n&&(n=Hp()),!jp(t,e,n))throw new Error("Numbers differ: actual === "+t+", expected === "+e)},expectValuesInRange:function(t,e,n){for(var r=0;rn)throw new Error("Value out of range:"+t[r]+" low: "+e+", high: "+n)},expectArrayBuffersEqual:function(t,e){expect(new Float32Array(t)).toEqual(new Float32Array(e))}}),Yp=Object.freeze({gpgpu_util:ma,webgl_util:Je,forceHalfFloat:function(){_().set("WEBGL_FORCE_F16_TEXTURES",!0)},MathBackendWebGL:Ss,setWebGLContext:ne,GPGPUContext:ga}),$p=(t(Jp,Kp=Lp),Jp.prototype.minimize=function(t,e,n){void 0===e&&(e=!1);var r=this.computeGradients(t,n),o=r.value,i=r.grads;if(null!=n){var a=n.map(function(t){return{name:t.name,tensor:i[t.name]}});this.applyGradients(a)}else this.applyGradients(i);return en(i),e?o:(o.dispose(),null)},Object.defineProperty(Jp.prototype,"iterations",{get:function(){return null==this.iterations_&&(this.iterations_=0),this.iterations_},enumerable:!0,configurable:!0}),Jp.prototype.incrementIterations=function(){this.iterations_=this.iterations+1},Jp.prototype.computeGradients=function(t,e){return no(t,e)},Jp.prototype.dispose=function(){null!=this.iterations_&&en(this.iterations_)},Jp.prototype.saveIterations=function(){return y(this,void 0,void 0,function(){return R(this,function(t){return null==this.iterations_&&(this.iterations_=0),[2,{name:"iter",tensor:In(this.iterations_,"int32")}]})})},Jp.prototype.getWeights=function(){return y(this,void 0,void 0,function(){return R(this,function(t){throw new Error("getWeights() is not implemented for this optimizer yet.")})})},Jp.prototype.setWeights=function(t){return y(this,void 0,void 0,function(){return R(this,function(t){throw new Error("setWeights() is not implemented for this optimizer class "+this.getClassName())})})},Jp.prototype.extractIterations=function(n){return y(this,void 0,void 0,function(){var e;return R(this,function(t){switch(t.label){case 0:return e=this,[4,n[0].tensor.data()];case 1:return e.iterations_=t.sent()[0],[2,n.slice(1)]}})})},Jp);function Jp(){return null!==Kp&&Kp.apply(this,arguments)||this}Object.defineProperty($p,Symbol.hasInstance,{value:function(t){return null!=t.minimize&&null!=t.computeGradients&&null!=t.applyGradients}});var Qp,Zp=(t(tf,Qp=$p),tf.prototype.applyGradients=function(n){var u=this;(Array.isArray(n)?n.map(function(t){return t.name}):Object.keys(n)).forEach(function(t,e){var o=qt.registeredVariables[t];null==u.accumulatedGrads[e]&&(u.accumulatedGrads[e]={originalName:t+"/accum_grad",variable:tn(function(){return Wn(o).variable(!1)})}),null==u.accumulatedUpdates[e]&&(u.accumulatedUpdates[e]={originalName:t+"/accum_var",variable:tn(function(){return Wn(o).variable(!1)})});var i=Array.isArray(n)?n[e].tensor:n[t];if(null!=i){var a=u.accumulatedGrads[e].variable,s=u.accumulatedUpdates[e].variable;tn(function(){var t=a.mul(u.rho).add(i.square().mul(1-u.rho)),e=s.add(u.epsilon).sqrt().div(a.add(u.epsilon).sqrt()).mul(i),n=s.mul(u.rho).add(e.square().mul(1-u.rho));a.assign(t),s.assign(n);var r=e.mul(-u.learningRate).add(o);o.assign(r)})}}),this.incrementIterations()},tf.prototype.dispose=function(){null!=this.accumulatedUpdates&&(en(this.accumulatedGrads.map(function(t){return t.variable})),en(this.accumulatedUpdates.map(function(t){return t.variable})))},tf.prototype.getWeights=function(){return y(this,void 0,void 0,function(){var e;return R(this,function(t){switch(t.label){case 0:return e=this.accumulatedGrads.concat(this.accumulatedUpdates),[4,this.saveIterations()];case 1:return[2,[t.sent()].concat(e.map(function(t){return{name:t.originalName,tensor:t.variable}}))]}})})},tf.prototype.setWeights=function(n){return y(this,void 0,void 0,function(){var e;return R(this,function(t){switch(t.label){case 0:return[4,this.extractIterations(n)];case 1:return n=t.sent(),e=n.length/2,this.accumulatedGrads=n.slice(0,e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),this.accumulatedUpdates=n.slice(e,2*e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),[2]}})})},tf.prototype.getConfig=function(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}},tf.fromConfig=function(t,e){return new t(e.learningRate,e.rho,e.epsilon)},tf.className="Adadelta",tf);function tf(t,e,n){void 0===n&&(n=null);var r=Qp.call(this)||this;return r.learningRate=t,r.rho=e,r.epsilon=n,r.accumulatedGrads=[],r.accumulatedUpdates=[],null==n&&(r.epsilon=qt.backend.epsilon()),r}Vp(Zp);var ef,nf=(t(rf,ef=$p),rf.prototype.applyGradients=function(i){var a=this;(Array.isArray(i)?i.map(function(t){return t.name}):Object.keys(i)).forEach(function(t,e){var n=qt.registeredVariables[t];null==a.accumulatedGrads[e]&&(a.accumulatedGrads[e]={originalName:t+"/accumulator",variable:tn(function(){return On(n.shape,a.initialAccumulatorValue).variable(!1)})});var r=Array.isArray(i)?i[e].tensor:i[t];if(null!=r){var o=a.accumulatedGrads[e].variable;tn(function(){var t=o.add(r.square());o.assign(t);var e=r.div(t.add(qt.backend.epsilon()).sqrt()).mul(-a.learningRate).add(n);n.assign(e)})}}),this.incrementIterations()},rf.prototype.dispose=function(){null!=this.accumulatedGrads&&en(this.accumulatedGrads.map(function(t){return t.variable}))},rf.prototype.getWeights=function(){return y(this,void 0,void 0,function(){return R(this,function(t){switch(t.label){case 0:return[4,this.saveIterations()];case 1:return[2,[t.sent()].concat(this.accumulatedGrads.map(function(t){return{name:t.originalName,tensor:t.variable}}))]}})})},rf.prototype.setWeights=function(e){return y(this,void 0,void 0,function(){return R(this,function(t){switch(t.label){case 0:return[4,this.extractIterations(e)];case 1:return e=t.sent(),this.accumulatedGrads=e.map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),[2]}})})},rf.prototype.getConfig=function(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}},rf.fromConfig=function(t,e){return new t(e.learningRate,e.initialAccumulatorValue)},rf.className="Adagrad",rf);function rf(t,e){void 0===e&&(e=.1);var n=ef.call(this)||this;return n.learningRate=t,n.initialAccumulatorValue=e,n.accumulatedGrads=[],n}Vp(nf);var of,af=(t(sf,of=$p),sf.prototype.applyGradients=function(f){var d=this,t=Array.isArray(f)?f.map(function(t){return t.name}):Object.keys(f);tn(function(){var h=Ju(1,d.accBeta1),p=Ju(1,d.accBeta2);t.forEach(function(t,e){var n=qt.registeredVariables[t];null==d.accumulatedFirstMoment[e]&&(d.accumulatedFirstMoment[e]={originalName:t+"/m",variable:tn(function(){return Wn(n).variable(!1)})}),null==d.accumulatedSecondMoment[e]&&(d.accumulatedSecondMoment[e]={originalName:t+"/v",variable:tn(function(){return Wn(n).variable(!1)})});var r=Array.isArray(f)?f[e].tensor:f[t];if(null!=r){var o=d.accumulatedFirstMoment[e].variable,i=d.accumulatedSecondMoment[e].variable,a=o.mul(d.beta1).add(r.mul(1-d.beta1)),s=i.mul(d.beta2).add(r.square().mul(1-d.beta2)),u=a.div(h),c=s.div(p);o.assign(a),i.assign(s);var l=u.div(c.sqrt().add(d.epsilon)).mul(-d.learningRate).add(n);n.assign(l)}}),d.accBeta1.assign(d.accBeta1.mul(d.beta1)),d.accBeta2.assign(d.accBeta2.mul(d.beta2))}),this.incrementIterations()},sf.prototype.dispose=function(){this.accBeta1.dispose(),this.accBeta2.dispose(),null!=this.accumulatedFirstMoment&&en(this.accumulatedFirstMoment.map(function(t){return t.variable})),null!=this.accumulatedSecondMoment&&en(this.accumulatedSecondMoment.map(function(t){return t.variable}))},sf.prototype.getWeights=function(){return y(this,void 0,void 0,function(){var e;return R(this,function(t){switch(t.label){case 0:return e=this.accumulatedFirstMoment.concat(this.accumulatedSecondMoment),[4,this.saveIterations()];case 1:return[2,[t.sent()].concat(e.map(function(t){return{name:t.originalName,tensor:t.variable}}))]}})})},sf.prototype.setWeights=function(r){return y(this,void 0,void 0,function(){var e,n=this;return R(this,function(t){switch(t.label){case 0:return[4,this.extractIterations(r)];case 1:return r=t.sent(),tn(function(){n.accBeta1.assign(Ku(n.beta1,n.iterations_+1)),n.accBeta2.assign(Ku(n.beta2,n.iterations_+1))}),e=r.length/2,this.accumulatedFirstMoment=r.slice(0,e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),this.accumulatedSecondMoment=r.slice(e,2*e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),[2]}})})},sf.prototype.getConfig=function(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}},sf.fromConfig=function(t,e){return new t(e.learningRate,e.beta1,e.beta2,e.epsilon)},sf.className="Adam",sf);function sf(t,e,n,r){void 0===r&&(r=null);var o=of.call(this)||this;return o.learningRate=t,o.beta1=e,o.beta2=n,o.epsilon=r,o.accumulatedFirstMoment=[],o.accumulatedSecondMoment=[],tn(function(){o.accBeta1=In(e).variable(),o.accBeta2=In(n).variable()}),null==r&&(o.epsilon=qt.backend.epsilon()),o}Vp(af);var uf,cf=(t(lf,uf=$p),lf.prototype.applyGradients=function(f){var d=this,t=Array.isArray(f)?f.map(function(t){return t.name}):Object.keys(f);tn(function(){var h=Ju(1,d.accBeta1),p=Ou(-d.learningRate,d.iteration.mul(d.decay).add(1));t.forEach(function(t,e){var n=qt.registeredVariables[t];null==d.accumulatedFirstMoment[e]&&(d.accumulatedFirstMoment[e]={originalName:t+"/m",variable:Wn(n).variable(!1)}),null==d.accumulatedWeightedInfNorm[e]&&(d.accumulatedWeightedInfNorm[e]={originalName:t+"/v",variable:Wn(n).variable(!1)});var r=Array.isArray(f)?f[e].tensor:f[t];if(null!=r){var o=d.accumulatedFirstMoment[e].variable,i=d.accumulatedWeightedInfNorm[e].variable,a=o.mul(d.beta1).add(r.mul(1-d.beta1)),s=i.mul(d.beta2),u=r.abs(),c=s.maximum(u);o.assign(a),i.assign(c);var l=p.div(h).mul(a.div(c.add(d.epsilon))).add(n);n.assign(l)}}),d.iteration.assign(d.iteration.add(1)),d.accBeta1.assign(d.accBeta1.mul(d.beta1))}),this.incrementIterations()},lf.prototype.dispose=function(){this.accBeta1.dispose(),this.iteration.dispose(),null!=this.accumulatedFirstMoment&&en(this.accumulatedFirstMoment.map(function(t){return t.variable})),null!=this.accumulatedWeightedInfNorm&&en(this.accumulatedWeightedInfNorm.map(function(t){return t.variable}))},lf.prototype.getWeights=function(){return y(this,void 0,void 0,function(){return R(this,function(t){throw new Error("getWeights() is not implemented for Adamax yet.")})})},lf.prototype.setWeights=function(t){return y(this,void 0,void 0,function(){return R(this,function(t){throw new Error("setWeights() is not implemented for Adamax yet.")})})},lf.prototype.getConfig=function(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}},lf.fromConfig=function(t,e){return new t(e.learningRate,e.beta1,e.beta2,e.epsilon,e.decay)},lf.className="Adamax",lf);function lf(t,e,n,r,o){void 0===r&&(r=null),void 0===o&&(o=0);var i=uf.call(this)||this;return i.learningRate=t,i.beta1=e,i.beta2=n,i.epsilon=r,i.decay=o,i.accumulatedFirstMoment=[],i.accumulatedWeightedInfNorm=[],tn(function(){i.iteration=In(0).variable(),i.accBeta1=In(e).variable()}),null==r&&(i.epsilon=qt.backend.epsilon()),i}Vp(cf);var hf,pf=(t(ff,hf=$p),ff.prototype.applyGradients=function(o){var i=this;(Array.isArray(o)?o.map(function(t){return t.name}):Object.keys(o)).forEach(function(t,e){var n=Array.isArray(o)?o[e].tensor:o[t];if(null!=n){var r=qt.registeredVariables[t];tn(function(){var t=i.c.mul(n).add(r);r.assign(t)})}}),this.incrementIterations()},ff.prototype.setLearningRate=function(t){this.learningRate=t,null!=this.c&&this.c.dispose(),this.c=nn(In(-t))},ff.prototype.dispose=function(){this.c.dispose()},ff.prototype.getWeights=function(){return y(this,void 0,void 0,function(){return R(this,function(t){switch(t.label){case 0:return[4,this.saveIterations()];case 1:return[2,[t.sent()]]}})})},ff.prototype.setWeights=function(e){return y(this,void 0,void 0,function(){return R(this,function(t){switch(t.label){case 0:return[4,this.extractIterations(e)];case 1:if(0!==(e=t.sent()).length)throw new Error("SGD optimizer does not have settable weights.");return[2]}})})},ff.prototype.getConfig=function(){return{learningRate:this.learningRate}},ff.fromConfig=function(t,e){return new t(e.learningRate)},ff.className="SGD",ff);function ff(t){var e=hf.call(this)||this;return e.learningRate=t,e.setLearningRate(t),e}Vp(pf);var df,vf=(t(mf,df=pf),mf.prototype.applyGradients=function(i){var a=this;(Array.isArray(i)?i.map(function(t){return t.name}):Object.keys(i)).forEach(function(t,e){var n=qt.registeredVariables[t];null==a.accumulations[e]&&(a.accumulations[e]={originalName:t+"/momentum",variable:tn(function(){return Wn(n).variable(!1)})});var r=a.accumulations[e].variable,o=Array.isArray(i)?i[e].tensor:i[t];null!=o&&tn(function(){var t,e=a.m.mul(r).add(o);t=a.useNesterov?a.c.mul(o.add(e.mul(a.m))).add(n):a.c.mul(e).add(n),r.assign(e),n.assign(t)})}),this.incrementIterations()},mf.prototype.dispose=function(){this.m.dispose(),null!=this.accumulations&&en(this.accumulations.map(function(t){return t.variable}))},mf.prototype.setMomentum=function(t){this.momentum=t},mf.prototype.getWeights=function(){return y(this,void 0,void 0,function(){return R(this,function(t){switch(t.label){case 0:return[4,this.saveIterations()];case 1:return[2,[t.sent()].concat(this.accumulations.map(function(t){return{name:t.originalName,tensor:t.variable}}))]}})})},mf.prototype.setWeights=function(e){return y(this,void 0,void 0,function(){return R(this,function(t){switch(t.label){case 0:return[4,this.extractIterations(e)];case 1:return e=t.sent(),this.accumulations=e.map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),[2]}})})},mf.prototype.getConfig=function(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}},mf.fromConfig=function(t,e){return new t(e.learningRate,e.momentum,e.useNesterov)},mf.className="Momentum",mf);function mf(t,e,n){void 0===n&&(n=!1);var r=df.call(this,t)||this;return r.learningRate=t,r.momentum=e,r.useNesterov=n,r.accumulations=[],r.m=In(r.momentum),r}Vp(vf);var gf,yf=(t(xf,gf=$p),xf.prototype.applyGradients=function(e){var h=this;(Array.isArray(e)?e.map(function(t){return t.name}):Object.keys(e)).forEach(function(t,a){var s=qt.registeredVariables[t];null==h.accumulatedMeanSquares[a]&&(h.accumulatedMeanSquares[a]={originalName:t+"/rms",variable:tn(function(){return Wn(s).variable(!1)})}),null==h.accumulatedMoments[a]&&(h.accumulatedMoments[a]={originalName:t+"/momentum",variable:tn(function(){return Wn(s).variable(!1)})}),null==h.accumulatedMeanGrads[a]&&h.centered&&(h.accumulatedMeanGrads[a]={originalName:t+"/mg",variable:tn(function(){return Wn(s).variable(!1)})});var u=Array.isArray(e)?e[a].tensor:e[t];if(null!=u){var c=h.accumulatedMeanSquares[a].variable,l=h.accumulatedMoments[a].variable;tn(function(){var t=c.mul(h.decay).add(u.square().mul(1-h.decay));if(h.centered){var e=h.accumulatedMeanGrads[a].variable,n=e.mul(h.decay).add(u.mul(1-h.decay)),r=l.mul(h.momentum).add(u.mul(h.learningRate).div(t.sub(n.square().add(h.epsilon)).sqrt()));c.assign(t),e.assign(n),l.assign(r);var o=s.sub(r);s.assign(o)}else{var i=c.mul(h.decay).add(u.square().mul(1-h.decay));r=l.mul(h.momentum).add(u.mul(h.learningRate).div(i.add(h.epsilon).sqrt())),c.assign(i),l.assign(r),o=s.sub(r),s.assign(o)}})}}),this.incrementIterations()},xf.prototype.dispose=function(){null!=this.accumulatedMeanSquares&&en(this.accumulatedMeanSquares.map(function(t){return t.variable})),null!=this.accumulatedMeanGrads&&this.centered&&en(this.accumulatedMeanGrads.map(function(t){return t.variable})),null!=this.accumulatedMoments&&en(this.accumulatedMoments.map(function(t){return t.variable}))},xf.prototype.getWeights=function(){return y(this,void 0,void 0,function(){var e;return R(this,function(t){switch(t.label){case 0:return e=this.accumulatedMeanSquares.concat(this.accumulatedMoments),this.centered&&e.push.apply(e,this.accumulatedMeanGrads),[4,this.saveIterations()];case 1:return[2,[t.sent()].concat(e.map(function(t){return{name:t.originalName,tensor:t.variable}}))]}})})},xf.prototype.setWeights=function(n){return y(this,void 0,void 0,function(){var e;return R(this,function(t){switch(t.label){case 0:return[4,this.extractIterations(n)];case 1:return n=t.sent(),e=this.centered?n.length/3:n.length/2,this.accumulatedMeanSquares=n.slice(0,e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),this.accumulatedMoments=n.slice(e,2*e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}}),this.centered&&(this.accumulatedMeanGrads=n.slice(2*e,3*e).map(function(t){return{originalName:t.name,variable:t.tensor.variable(!1)}})),[2]}})})},xf.prototype.getConfig=function(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}},xf.fromConfig=function(t,e){return new t(e.learningRate,e.decay,e.momentum,e.epsilon,e.centered)},xf.className="RMSProp",xf);function xf(t,e,n,r,o){void 0===e&&(e=.9),void 0===n&&(n=0),void 0===r&&(r=null),void 0===o&&(o=!1);var i=gf.call(this)||this;if(i.learningRate=t,i.decay=e,i.momentum=n,i.epsilon=r,i.accumulatedMeanSquares=[],i.accumulatedMoments=[],i.accumulatedMeanGrads=[],i.centered=o,null==r&&(i.epsilon=qt.backend.epsilon()),null==t)throw new Error("learningRate for RMSPropOptimizer must be defined.");return i}Vp(yf);var bf=(Ef.sgd=function(t){return new pf(t)},Ef.momentum=function(t,e,n){return void 0===n&&(n=!1),new vf(t,e,n)},Ef.rmsprop=function(t,e,n,r,o){return void 0===e&&(e=.9),void 0===n&&(n=0),void 0===r&&(r=null),void 0===o&&(o=!1),new yf(t,e,n,r,o)},Ef.adam=function(t,e,n,r){return void 0===t&&(t=.001),void 0===e&&(e=.9),void 0===n&&(n=.999),void 0===r&&(r=null),new af(t,e,n,r)},Ef.adadelta=function(t,e,n){return void 0===t&&(t=.001),void 0===e&&(e=.95),void 0===n&&(n=null),new Zp(t,e,n)},Ef.adamax=function(t,e,n,r,o){return void 0===t&&(t=.002),void 0===e&&(e=.9),void 0===n&&(n=.999),void 0===r&&(r=null),void 0===o&&(o=0),new cf(t,e,n,r,o)},Ef.adagrad=function(t,e){return void 0===e&&(e=.1),new nf(t,e)},Ef),wf={sgd:bf.sgd,momentum:bf.momentum,adadelta:bf.adadelta,adagrad:bf.adagrad,rmsprop:bf.rmsprop,adamax:bf.adamax,adam:bf.adam},Cf="undefined"!=typeof requestAnimationFrame?requestAnimationFrame:"undefined"!=typeof setImmediate?setImmediate:function(t){return t()};function Ef(){}vt=gh;var _f=Object.freeze({__proto__:null,AdadeltaOptimizer:Zp,AdagradOptimizer:nf,AdamOptimizer:af,AdamaxOptimizer:cf,DataStorage:so,get ENV(){return i},Environment:o,KernelBackend:uo,MomentumOptimizer:vf,Optimizer:$p,RMSPropOptimizer:yf,get Rank(){return bt},get Reduction(){return Ml},SGDOptimizer:pf,Tensor:yt,TensorBuffer:ft,Variable:Tt,abs:Ts,acos:Ns,acosh:Fs,add:Tu,addN:Nu,addStrict:Fu,all:Jc,any:Qc,argMax:Zc,argMin:tl,asin:Ms,asinh:Os,atan:Ps,atan2:Mu,atanh:Bs,avgPool:Uc,avgPool3d:Hc,backend:function(){return qt.backend},backend_util:To,basicLSTMCell:gl,batchNorm:Cu,batchNorm2d:Eu,batchNorm3d:_u,batchNorm4d:Iu,batchNormalization:wu,batchNormalization2d:yu,batchNormalization3d:xu,batchNormalization4d:bu,batchToSpaceND:lr,booleanMaskAsync:fc,broadcastTo:hr,browser:Bp,buffer:sr,cast:pr,ceil:Ls,clipByValue:Ws,clone:fr,complex:bn,concat:zn,concat1d:Un,concat2d:Vn,concat3d:Gn,concat4d:Hn,conv1d:xc,conv2d:bc,conv2dTranspose:Sc,conv3d:wc,conv3dTranspose:Dc,cos:zs,cosh:Us,cumsum:dr,customGrad:ro,deprecationWarn:Ze,depthToSpace:vr,depthwiseConv2d:_c,diag:Al,disableDeprecationWarnings:function(){_().set("DEPRECATION_WARNINGS_ENABLED",!1),console.warn("TensorFlow.js deprecation warnings have been disabled.")},dispose:en,disposeVariables:function(){qt.disposeVariables()},div:Ou,divNoNan:Pu,divStrict:Bu,dot:Tc,dropout:Tl,elu:ul,enableDebugMode:function(){_().set("DEBUG",!0)},enableProdMode:function(){_().set("PROD",!0)},engine:function(){return qt},env:_,equal:Zu,equalStrict:tc,erf:Vs,exp:Gs,expandDims:mr,expm1:Hs,eye:gr,fft:El,fill:On,findBackend:function(t){return qt.findBackend(t)},findBackendFactory:function(t){return qt.findBackendFactory(t)},floor:qs,floorDiv:Lu,frame:Ll,fused:mh,gather:dc,gatherND:Dl,gather_util:Vr,getBackend:function(){return qt.backendName},getGradient:l,getKernel:g,getKernelsForBackend:a,grad:function(i){return P(K(i),function(){return"The f passed in grad(f) must be a function"}),function(t,e){var r=sn(t,"x","tf.grad",null),o=null!=e?sn(e,"dy","tf.grad"):null;return qt.tidy(function(){var t=qt.gradients(function(){return i(r)},[r],o),e=t.value,n=t.grads;return null!=o&&x(e.shape,o.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),oo(n),n[0]})}},grads:function(i){return P(K(i),function(){return"The f passed in grads(f) must be a function"}),function(t,e){P(Array.isArray(t),function(){return"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s"});var r=un(t,"args","tf.grads",null),o=null!=e?sn(e,"dy","tf.grads"):null;return qt.tidy(function(){var t=qt.gradients(function(){return i.apply(void 0,r)},r,o),e=t.value,n=t.grads;return null!=o&&x(e.shape,o.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),oo(n),n})}},greater:ec,greaterEqual:nc,greaterEqualStrict:rc,greaterStrict:oc,hammingWindow:Bl,hannWindow:Pl,ifft:_l,imag:Cn,image:ph,inTopKAsync:Fl,io:Fp,irfft:Rl,isFinite:ru,isInf:nu,isNaN:eu,keep:nn,leakyRelu:cl,less:ic,lessEqual:ac,lessEqualStrict:sc,lessStrict:uc,linalg:eh,linspace:Pn,localResponseNormalization:vl,log:js,log1p:Ks,logSigmoid:Xs,logSoftmax:ao,logSumExp:el,logicalAnd:Ru,logicalNot:ku,logicalOr:Su,logicalXor:Du,losses:$l,matMul:Ac,math:Op,max:nl,maxPool:zc,maxPool3d:Gc,maximum:Wu,maximumStrict:zu,mean:rl,memory:function(){return qt.memory()},min:ol,minimum:Uu,minimumStrict:Vu,mod:Gu,modStrict:Hu,moments:il,movingAverage:xl,mul:qu,mulStrict:ju,multiRNNCell:yl,multinomial:yr,neg:Ys,nextFrame:function(){return new Promise(function(t){return Cf(function(){return t()})})},norm:ml,notEqual:cc,notEqualStrict:lc,oneHot:xr,ones:Fn,onesLike:Ln,op:xn,outerProduct:Nc,pad:br,pad1d:wr,pad2d:Cr,pad3d:Er,pad4d:_r,pool:Vc,pow:Ku,powStrict:Xu,prelu:ll,print:ur,prod:sl,profile:function(t){return qt.profile(t)},rand:Ir,randomGamma:kr,randomNormal:Rr,randomUniform:Sr,range:Bn,ready:function(){return qt.ready()},real:wn,reciprocal:$s,registerBackend:function(t,e,n){return void 0===n&&(n=1),qt.registerBackend(t,e,n)},registerGradient:h,registerKernel:s,relu:hl,relu6:pl,removeBackend:function(t){qt.removeBackend(t)},reshape:Dr,reverse:Fc,reverse1d:Mc,reverse2d:Oc,reverse3d:Pc,reverse4d:Bc,rfft:Il,round:Js,rsqrt:Qs,scalar:In,scatterND:Cl,scatter_util:Kr,selu:fl,separableConv2d:kc,serialization:Gp,setBackend:function(t){return qt.setBackend(t)},setPlatform:function(t,e){_().setPlatform(t,e)},setdiff1dAsync:cr,sigmoid:Zs,sign:tu,signal:zl,sin:ou,sinh:iu,slice:qc,slice1d:jc,slice2d:Kc,slice3d:Xc,slice4d:Yc,slice_util:eo,softmax:io,softplus:au,spaceToBatchND:Ar,sparseToDense:Sl,spectral:kl,split:qn,sqrt:su,square:As,squaredDifference:Yu,squaredDifferenceStrict:$u,squeeze:Tr,stack:Nr,step:uu,stft:Wl,stridedSlice:bl,sub:Ju,subStrict:Qu,sum:al,sumOutType:Ot,tan:cu,tanh:lu,tensor:En,tensor1d:Rn,tensor2d:kn,tensor3d:Sn,tensor4d:Dn,tensor5d:An,tensor6d:Tn,tensor_util:zt,test_util:Xp,tidy:tn,tile:Fr,time:function(t){return qt.time(t)},topk:wl,train:wf,transpose:dl,truncatedNormal:Mr,unregisterGradient:function(t){if(!n.has(t))throw new Error("The gradient '"+t+"' for backend is not registered");n.delete(t)},unregisterKernel:function(t,e){var n=p(t,e);if(!u.has(n))throw new Error("The kernel '"+t+"' for backend '"+e+"' is not registered");u.delete(n)},unsortedSegmentSum:vc,unstack:Or,util:ot,valueAndGrad:function(i){return P(K(i),function(){return"The f passed in valueAndGrad(f) must be a function"}),function(t,e){P(t instanceof yt,function(){return"The x passed in valueAndGrad(f)(x) must be a tensor"}),P(null==e||e instanceof yt,function(){return"The dy passed in valueAndGrad(f)(x, dy) must be a tensor"});var n=qt.gradients(function(){return i(t)},[t],e),r=n.grads,o=n.value;return oo(r),{grad:r[0],value:o}}},valueAndGrads:function(r){return P(K(r),function(){return"The f passed in valueAndGrads(f) must be a function"}),function(t,e){P(Array.isArray(t)&&t.every(function(t){return t instanceof yt}),function(){return"The args passed in valueAndGrads(f)(args) must be array of tensors"}),P(null==e||e instanceof yt,function(){return"The dy passed in valueAndGrads(f)(args, dy) must be a tensor"});var n=qt.gradients(function(){return r.apply(void 0,t)},t,e);return null!=e&&x(n.value.shape,e.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),oo(n.grads),n}},variable:Nn,variableGrads:no,version_core:"1.5.2",webgl:Yp,where:Au,whereAsync:gu,zeros:Mn,zerosLike:Wn});function If(i,a,t){if(void 0===t&&(t=!1),i.beginPath(),a.slice(1).forEach(function(t,e){var n=t.x,r=t.y,o=a[e];i.moveTo(o.x,o.y),i.lineTo(n,r)}),t){var e=a[a.length-1],n=a[0];if(!e||!n)return;i.moveTo(e.x,e.y),i.lineTo(n.x,n.y)}i.stroke()}var Rf=function(t,e){return(Rf=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)};function kf(t,e){function n(){this.constructor=t}Rf(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}var Sf=function(){return(Sf=Object.assign||function(t){for(var e,n=1,r=arguments.length;na[0]&&e[1] 1 not supported");return(o=r.getInput(0))instanceof e?(i=o,[3,4]):[3,2];case 2:return[4,av(o)];case 3:i=t.sent(),t.label=4;case 4:n=i,t.label=5;case 5:return a=Kd(n),[2,u.map(function(t){return t instanceof od?t.forSize(n.width,n.height).box.floor():t}).map(function(t){return t.clipAtImageBorders(n.width,n.height)}).map(function(t){var e=t.x,n=t.y,r=t.width,o=t.height,i=ov({width:r,height:o});return Kd(i).putImageData(a.getImageData(e,n,r,o),0,0),i})]}})})}function fv(u,e){return Df(this,void 0,void 0,function(){return Af(this,function(t){if(!Pf(u)&&!Bf(u))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(Bf(u)&&1 1 not supported");return[2,tn(function(){var t=u.shape.slice(Bf(u)?1:0),i=t[0],a=t[1],s=t[2];return e.map(function(t){return t instanceof od?t.forSize(a,i).box:t}).map(function(t){return t.clipAtImageBorders(a,i)}).map(function(t){var e=t.x,n=t.y,r=t.width,o=t.height;return Xc(u.as3D(i,a,s),[n,e,0],[o,r,s])})})]})})}function dv(n,r){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return[4,(0,qd.getEnv().fetch)(n,r)];case 1:if(!((e=t.sent()).status<400))throw new Error("failed to fetch: ("+e.status+") "+e.statusText+", from url: "+e.url);return[2,e]}})})}function vv(e){return Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return[4,dv(e)];case 1:return[2,t.sent().json()]}})})}function mv(t,e){var n=e+"-weights_manifest.json";if(!t)return{modelBaseUri:"",manifestUri:n};if("/"===t)return{modelBaseUri:"/",manifestUri:"/"+n};var r=t.startsWith("http://")?"http://":t.startsWith("https://")?"https://":"",o=(t=t.replace(r,"")).split("/").filter(function(t){return t}),i=t.endsWith(".json")?o[o.length-1]:n,a=r+(t.endsWith(".json")?o.slice(0,o.length-1):o).join("/");return{modelBaseUri:a=t.startsWith("/")?"/"+a:a,manifestUri:"/"===a?"/"+i:a+"/"+i}}function gv(i,a){return Df(this,void 0,void 0,function(){var e,n,r,o;return Af(this,function(t){switch(t.label){case 0:return e=mv(i,a),n=e.manifestUri,r=e.modelBaseUri,[4,vv(n)];case 1:return o=t.sent(),[2,Fp.loadWeights(o,r)]}})})}var yv=(Object.defineProperty(xv.prototype,"params",{get:function(){return this._params},enumerable:!0,configurable:!0}),Object.defineProperty(xv.prototype,"paramMappings",{get:function(){return this._paramMappings},enumerable:!0,configurable:!0}),Object.defineProperty(xv.prototype,"isLoaded",{get:function(){return!!this.params},enumerable:!0,configurable:!0}),xv.prototype.getParamFromPath=function(t){var e=this.traversePropertyPath(t);return e.obj[e.objProp]},xv.prototype.reassignParamFromPath=function(t,e){var n=this.traversePropertyPath(t),r=n.obj,o=n.objProp;r[o].dispose(),r[o]=e},xv.prototype.getParamList=function(){var n=this;return this._paramMappings.map(function(t){var e=t.paramPath;return{path:e,tensor:n.getParamFromPath(e)}})},xv.prototype.getTrainableParams=function(){return this.getParamList().filter(function(t){return t.tensor instanceof Tt})},xv.prototype.getFrozenParams=function(){return this.getParamList().filter(function(t){return!(t.tensor instanceof Tt)})},xv.prototype.variable=function(){var r=this;this.getFrozenParams().forEach(function(t){var e=t.path,n=t.tensor;r.reassignParamFromPath(e,n.variable())})},xv.prototype.freeze=function(){var o=this;this.getTrainableParams().forEach(function(t){var e=t.path,n=t.tensor,r=En(n.dataSync());n.dispose(),o.reassignParamFromPath(e,r)})},xv.prototype.dispose=function(e){void 0===e&&(e=!0),this.getParamList().forEach(function(t){if(e&&t.tensor.isDisposed)throw new Error("param tensor has already been disposed for path "+t.path);t.tensor.dispose()}),this._params=void 0},xv.prototype.serializeParams=function(){return new Float32Array(this.getParamList().map(function(t){var e=t.tensor;return Array.from(e.dataSync())}).reduce(function(t,e){return t.concat(e)}))},xv.prototype.load=function(e){return Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return e instanceof Float32Array?(this.extractWeights(e),[2]):[4,this.loadFromUri(e)];case 1:return t.sent(),[2]}})})},xv.prototype.loadFromUri=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:if(n&&"string"!=typeof n)throw new Error(this._name+".loadFromUri - expected model uri");return[4,gv(n,this.getDefaultModelName())];case 1:return e=t.sent(),this.loadFromWeightMap(e),[2]}})})},xv.prototype.loadFromDisk=function(h){return Df(this,void 0,void 0,function(){var e,n,r,o,i,a,s,u,c,l;return Af(this,function(t){switch(t.label){case 0:if(h&&"string"!=typeof h)throw new Error(this._name+".loadFromDisk - expected model file path");return e=qd.getEnv().readFile,n=mv(h,this.getDefaultModelName()),r=n.manifestUri,o=n.modelBaseUri,i=function(t){return Promise.all(t.map(function(t){return e(t).then(function(t){return t.buffer})}))},a=Fp.weightsLoaderFactory(i),c=(u=JSON).parse,[4,e(r)];case 1:return s=c.apply(u,[t.sent().toString()]),[4,a(s,o)];case 2:return l=t.sent(),this.loadFromWeightMap(l),[2]}})})},xv.prototype.loadFromWeightMap=function(t){var e=this.extractParamsFromWeigthMap(t),n=e.paramMappings,r=e.params;this._paramMappings=n,this._params=r},xv.prototype.extractWeights=function(t){var e=this.extractParams(t),n=e.paramMappings,r=e.params;this._paramMappings=n,this._params=r},xv.prototype.traversePropertyPath=function(n){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");var t=n.split("/").reduce(function(t,e){if(!t.nextObj.hasOwnProperty(e))throw new Error("traversePropertyPath - object does not have property "+e+", for path "+n);return{obj:t.nextObj,objProp:e,nextObj:t.nextObj[e]}},{nextObj:this.params}),e=t.obj,r=t.objProp;if(!(e&&r&&e[r]instanceof yt))throw new Error("traversePropertyPath - parameter is not a tensor, for path "+n);return{obj:e,objProp:r}},xv);function xv(t){this._name=t,this._params=void 0,this._paramMappings=[]}function bv(e,n,r){return tn(function(){var t=kc(e,n.depthwise_filter,n.pointwise_filter,r,"same");return t=Tu(t,n.bias)})}function wv(r,o,i){return void 0===i&&(i=!1),tn(function(){var t=hl(i?Tu(bc(r,o.conv0.filters,[2,2],"same"),o.conv0.bias):bv(r,o.conv0,[2,2])),e=bv(t,o.conv1,[1,1]),n=bv(hl(Tu(t,e)),o.conv2,[1,1]);return hl(Tu(t,Tu(e,n)))})}function Cv(o,i,a,s){return void 0===a&&(a=!1),void 0===s&&(s=!0),tn(function(){var t=hl(a?Tu(bc(o,i.conv0.filters,s?[2,2]:[1,1],"same"),i.conv0.bias):bv(o,i.conv0,s?[2,2]:[1,1])),e=bv(t,i.conv1,[1,1]),n=bv(hl(Tu(t,e)),i.conv2,[1,1]),r=bv(hl(Tu(t,Tu(e,n))),i.conv3,[1,1]);return hl(Tu(t,Tu(e,Tu(n,r))))})}function Ev(e,n,r,o){return void 0===r&&(r="same"),void 0===o&&(o=!1),tn(function(){var t=Tu(bc(e,n.filters,[1,1],r),n.bias);return o?hl(t):t})}function _v(t,n){Object.keys(t).forEach(function(e){n.some(function(t){return t.originalPath===e})||t[e].dispose()})}function Iv(a,s){return function(t,e,n,r){var o=Dn(a(t*e*n*n),[n,n,t,e]),i=Rn(a(e));return s.push({paramPath:r+"/filters"},{paramPath:r+"/bias"}),{filters:o,bias:i}}}function Rv(i,a){return function(t,e,n){var r=kn(i(t*e),[t,e]),o=Rn(i(e));return a.push({paramPath:n+"/weights"},{paramPath:n+"/bias"}),{weights:r,bias:o}}}var kv=function(t,e,n){this.depthwise_filter=t,this.pointwise_filter=e,this.bias=n};function Sv(a,s){return function(t,e,n){var r=Dn(a(9*t),[3,3,t,1]),o=Dn(a(t*e),[1,1,t,e]),i=Rn(a(e));return s.push({paramPath:n+"/depthwise_filter"},{paramPath:n+"/pointwise_filter"},{paramPath:n+"/bias"}),new kv(r,o,i)}}function Dv(o){return function(t){var e=o(t+"/depthwise_filter",4),n=o(t+"/pointwise_filter",4),r=o(t+"/bias",1);return new kv(e,n,r)}}function Av(o,i){return function(t,e,n){var r=o[t];if(!Mf(r,e))throw new Error("expected weightMap["+t+"] to be a Tensor"+e+"D, instead have "+r);return i.push({originalPath:t,paramPath:n||t}),r}}function Tv(t){var n=t;return{extractWeights:function(t){var e=n.slice(0,t);return n=n.slice(t),e},getRemainingWeights:function(){return n}}}function Nv(t,e){var o=Iv(t,e),i=Sv(t,e);function a(t,e,n,r){return void 0===r&&(r=!1),{conv0:r?o(t,e,3,n+"/conv0"):i(t,e,n+"/conv0"),conv1:i(e,e,n+"/conv1"),conv2:i(e,e,n+"/conv2")}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:function(t,e,n,r){void 0===r&&(r=!1);var o=a(t,e,n,r);return{conv0:o.conv0,conv1:o.conv1,conv2:o.conv2,conv3:i(e,e,n+"/conv3")}}}}function Fv(e){return function(t){return{filters:e(t+"/filters",4),bias:e(t+"/bias",1)}}}function Mv(t,e){var n=Av(t,e),r=Fv(n),o=Dv(n);return{extractDenseBlock3Params:function(t,e){return void 0===e&&(e=!1),{conv0:e?r(t+"/conv0"):o(t+"/conv0"),conv1:o(t+"/conv1"),conv2:o(t+"/conv2")}},extractDenseBlock4Params:function(t,e){return void 0===e&&(e=!1),{conv0:e?r(t+"/conv0"):o(t+"/conv0"),conv1:o(t+"/conv1"),conv2:o(t+"/conv2"),conv3:o(t+"/conv3")}}}}var Ov,Pv=(kf(Bv,Ov=yv),Bv.prototype.forwardInput=function(e){var n=this.params;if(!n)throw new Error("FaceFeatureExtractor - load model before inference");return tn(function(){var t=Cv(cd(e.toBatchTensor(112,!0),[122.782,117.001,104.298]).div(In(255)),n.dense0,!0);return t=Cv(t=Cv(t=Cv(t,n.dense1),n.dense2),n.dense3),t=Uc(t,[7,7],[2,2],"valid")})},Bv.prototype.forward=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[2,e.apply(this,[t.sent()])]}})})},Bv.prototype.getDefaultModelName=function(){return"face_feature_extractor_model"},Bv.prototype.extractParamsFromWeigthMap=function(t){return function(t){var e=[],n=Mv(t,e).extractDenseBlock4Params,r={dense0:n("dense0",!0),dense1:n("dense1"),dense2:n("dense2"),dense3:n("dense3")};return _v(t,e),{params:r,paramMappings:e}}(t)},Bv.prototype.extractParams=function(t){return function(t){var e=[],n=Tv(t),r=n.extractWeights,o=n.getRemainingWeights,i=Nv(r,e).extractDenseBlock4Params,a=i(3,32,"dense0",!0),s=i(32,64,"dense1"),u=i(64,128,"dense2"),c=i(128,256,"dense3");if(0!==o().length)throw new Error("weights remaing after extract: "+o().length);return{paramMappings:e,params:{dense0:a,dense1:s,dense2:u,dense3:c}}}(t)},Bv);function Bv(){return Ov.call(this,"FaceFeatureExtractor")||this}function Lv(t,e){return tn(function(){return Tu(Ac(t,e.weights),e.bias)})}function Wv(e){var n={},r={};return Object.keys(e).forEach(function(t){(t.startsWith("fc")?r:n)[t]=e[t]}),{featureExtractorMap:n,classifierMap:r}}var zv,Uv=(kf(Vv,zv=yv),Object.defineProperty(Vv.prototype,"faceFeatureExtractor",{get:function(){return this._faceFeatureExtractor},enumerable:!0,configurable:!0}),Vv.prototype.runNet=function(e){var n=this,r=this.params;if(!r)throw new Error(this._name+" - load model before inference");return tn(function(){var t=e instanceof cv?n.faceFeatureExtractor.forwardInput(e):e;return Lv(t.as2D(t.shape[0],-1),r.fc)})},Vv.prototype.dispose=function(t){void 0===t&&(t=!0),this.faceFeatureExtractor.dispose(t),zv.prototype.dispose.call(this,t)},Vv.prototype.loadClassifierParams=function(t){var e=this.extractClassifierParams(t),n=e.params,r=e.paramMappings;this._params=n,this._paramMappings=r},Vv.prototype.extractClassifierParams=function(t){return function(t,e,n){var r=[],o=Tv(t),i=o.extractWeights,a=o.getRemainingWeights,s=Rv(i,r)(e,n,"fc");if(0!==a().length)throw new Error("weights remaing after extract: "+a().length);return{paramMappings:r,params:{fc:s}}}(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())},Vv.prototype.extractParamsFromWeigthMap=function(t){var e=Wv(t),n=e.featureExtractorMap,r=e.classifierMap;return this.faceFeatureExtractor.loadFromWeightMap(n),function(t){var e,n=[],r=Av(t,n),o={fc:(e="fc",{weights:r(e+"/weights",2),bias:r(e+"/bias",1)})};return _v(t,n),{params:o,paramMappings:n}}(r)},Vv.prototype.extractParams=function(t){var e=this.getClassifierChannelsIn(),n=this.getClassifierChannelsOut(),r=n*e+n,o=t.slice(0,t.length-r),i=t.slice(t.length-r);return this.faceFeatureExtractor.extractWeights(o),this.extractClassifierParams(i)},Vv);function Vv(t,e){var n=zv.call(this,t)||this;return n._faceFeatureExtractor=e,n}var Gv=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Hv=(qv.prototype.asSortedArray=function(){var e=this;return Gv.map(function(t){return{expression:t,probability:e[t]}}).sort(function(t,e){return e.probability-t.probability})},qv);function qv(n){var r=this;if(7!==n.length)throw new Error("FaceExpressions.constructor - expected probabilities.length to be 7, have: "+n.length);Gv.forEach(function(t,e){r[t]=n[e]})}var jv,Kv=(kf(Xv,jv=Uv),Xv.prototype.forwardInput=function(t){var e=this;return tn(function(){return io(e.runNet(t))})},Xv.prototype.forward=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[2,e.apply(this,[t.sent()])]}})})},Xv.prototype.predictExpressions=function(a){return Df(this,void 0,void 0,function(){var e,n,r,o,i=this;return Af(this,function(t){switch(t.label){case 0:return[4,hv(a)];case 1:return e=t.sent(),[4,this.forwardInput(e)];case 2:return n=t.sent(),[4,Promise.all(Or(n).map(function(n){return Df(i,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return[4,n.data()];case 1:return e=t.sent(),n.dispose(),[2,e]}})})}))];case 3:return r=t.sent(),n.dispose(),o=r.map(function(t){return new Hv(t)}),[2,e.isBatchInput?o:o[0]]}})})},Xv.prototype.getDefaultModelName=function(){return"face_expression_model"},Xv.prototype.getClassifierChannelsIn=function(){return 256},Xv.prototype.getClassifierChannelsOut=function(){return 7},Xv);function Xv(t){return void 0===t&&(t=new Pv),jv.call(this,"FaceExpressionNet",t)||this}function Yv(t){return t.expressions instanceof Hv}function $v(t,e){var n={expressions:e};return Object.assign({},t,n)}function Jv(t){return Md(t)&&t.landmarks instanceof vd&&t.unshiftedLandmarks instanceof vd&&t.alignedRect instanceof od}function Qv(t,e){var n=t.detection.box,r=e.shiftBy(n.x,n.y),o=r.align(),i=t.detection.imageDims,a={landmarks:r,unshiftedLandmarks:e,alignedRect:new od(t.detection.score,o.rescale(i.reverse()),i)};return Object.assign({},t,a)}var Zv=function(t){void 0===t&&(t={});var e=t.drawLines,n=void 0===e||e,r=t.drawPoints,o=void 0===r||r,i=t.lineWidth,a=t.lineColor,s=t.pointSize,u=t.pointColor;this.drawLines=n,this.drawPoints=o,this.lineWidth=i||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=u||"rgba(255, 0, 255, 1)"},tm=(em.prototype.draw=function(t){var e=Kd(t),n=this.options,r=n.drawLines,o=n.drawPoints,i=n.lineWidth,a=n.lineColor,s=n.pointSize,u=n.pointColor;r&&this.faceLandmarks instanceof wd&&(e.strokeStyle=a,e.lineWidth=i,If(e,this.faceLandmarks.getJawOutline()),If(e,this.faceLandmarks.getLeftEyeBrow()),If(e,this.faceLandmarks.getRightEyeBrow()),If(e,this.faceLandmarks.getNose()),If(e,this.faceLandmarks.getLeftEye(),!0),If(e,this.faceLandmarks.getRightEye(),!0),If(e,this.faceLandmarks.getMouth(),!0)),o&&(e.strokeStyle=u,e.fillStyle=u,this.faceLandmarks.positions.forEach(function(t){e.beginPath(),e.arc(t.x,t.y,s,0,2*Math.PI),e.fill()}))},em);function em(t,e){void 0===e&&(e={}),this.faceLandmarks=t,this.options=new Zv(e)}var nm=Object.freeze({__proto__:null,drawContour:If,drawDetections:function(o,t){(Array.isArray(t)?t:[t]).forEach(function(t){var e=t instanceof od?t.score:Md(t)?t.detection.score:void 0,n=t instanceof od?t.box:Md(t)?t.detection.box:new $f(t),r=e?""+zf(e):void 0;new Qd(n,{label:r}).draw(o)})},drawFaceExpressions:function(o,t,i,a){void 0===i&&(i=.1),(Array.isArray(t)?t:[t]).forEach(function(t){var e=t instanceof Hv?t:Yv(t)?t.expressions:void 0;if(!e)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");var n=e.asSortedArray().filter(function(t){return t.probability>i}),r=Md(t)?t.detection.box.bottomLeft:a||new Xf(0,0);new Yd(n.map(function(t){return t.expression+" ("+zf(t.probability)+")"}),r).draw(o)})},DrawBoxOptions:Jd,DrawBox:Qd,DrawFaceLandmarksOptions:Zv,DrawFaceLandmarks:tm,drawFaceLandmarks:function(n,t){(Array.isArray(t)?t:[t]).forEach(function(t){var e=t instanceof vd?t:Jv(t)?t.landmarks:void 0;if(!e)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new tm(e).draw(n)})},get AnchorPosition(){return Gd},DrawTextFieldOptions:Xd,DrawTextField:Yd});function rm(t,e){var n=[],r=Tv(t),o=r.extractWeights,i=r.getRemainingWeights,a=function(t,e){var r=Iv(t,e),o=Sv(t,e);return{extractConvParams:r,extractSeparableConvParams:o,extractReductionBlockParams:function(t,e,n){return{separable_conv0:o(t,e,n+"/separable_conv0"),separable_conv1:o(e,e,n+"/separable_conv1"),expansion_conv:r(t,e,1,n+"/expansion_conv")}},extractMainBlockParams:function(t,e){return{separable_conv0:o(t,t,e+"/separable_conv0"),separable_conv1:o(t,t,e+"/separable_conv1"),separable_conv2:o(t,t,e+"/separable_conv2")}}}}(o,n),s=a.extractConvParams,u=a.extractSeparableConvParams,c=a.extractReductionBlockParams,l=a.extractMainBlockParams,h={conv_in:s(3,32,3,"entry_flow/conv_in"),reduction_block_0:c(32,64,"entry_flow/reduction_block_0"),reduction_block_1:c(64,128,"entry_flow/reduction_block_1")},p={};Hf(e,0,1).forEach(function(t){p["main_block_"+t]=l(128,"middle_flow/main_block_"+t)});var f={reduction_block:c(128,256,"exit_flow/reduction_block"),separable_conv:u(256,512,"exit_flow/separable_conv")};if(0!==i().length)throw new Error("weights remaing after extract: "+i().length);return{paramMappings:n,params:{entry_flow:h,middle_flow:p,exit_flow:f}}}function om(t,e){var n=[],r=function(t,e){var n=Av(t,e),r=Fv(n),o=Dv(n);return{extractConvParams:r,extractSeparableConvParams:o,extractReductionBlockParams:function(t){return{separable_conv0:o(t+"/separable_conv0"),separable_conv1:o(t+"/separable_conv1"),expansion_conv:r(t+"/expansion_conv")}},extractMainBlockParams:function(t){return{separable_conv0:o(t+"/separable_conv0"),separable_conv1:o(t+"/separable_conv1"),separable_conv2:o(t+"/separable_conv2")}}}}(t,n),o=r.extractConvParams,i=r.extractSeparableConvParams,a=r.extractReductionBlockParams,s=r.extractMainBlockParams,u={conv_in:o("entry_flow/conv_in"),reduction_block_0:a("entry_flow/reduction_block_0"),reduction_block_1:a("entry_flow/reduction_block_1")},c={};Hf(e,0,1).forEach(function(t){c["main_block_"+t]=s("middle_flow/main_block_"+t)});var l={reduction_block:a("exit_flow/reduction_block"),separable_conv:i("exit_flow/separable_conv")};return _v(t,n),{params:{entry_flow:u,middle_flow:c,exit_flow:l},paramMappings:n}}function im(t,e,n){return Tu(bc(t,e.filters,n,"same"),e.bias)}function am(t,e,n){void 0===n&&(n=!0);var r=n?hl(t):t;return r=bv(r,e.separable_conv0,[1,1]),r=bv(hl(r),e.separable_conv1,[1,1]),r=zc(r,[3,3],[2,2],"same"),r=Tu(r,im(t,e.expansion_conv,[2,2]))}var sm,um,cm=(kf(lm,sm=yv),lm.prototype.forwardInput=function(n){var r=this,o=this.params;if(!o)throw new Error("TinyXception - load model before inference");return tn(function(){var t=cd(n.toBatchTensor(112,!0),[122.782,117.001,104.298]).div(In(256)),e=hl(im(t,o.entry_flow.conv_in,[2,2]));return e=am(e=am(e,o.entry_flow.reduction_block_0,!1),o.entry_flow.reduction_block_1),Hf(r._numMainBlocks,0,1).forEach(function(t){e=function(t,e){var n=bv(hl(t),e.separable_conv0,[1,1]);return n=bv(hl(n),e.separable_conv1,[1,1]),n=bv(hl(n),e.separable_conv2,[1,1]),n=Tu(n,t)}(e,o.middle_flow["main_block_"+t])}),e=am(e,o.exit_flow.reduction_block),e=hl(bv(e,o.exit_flow.separable_conv,[1,1]))})},lm.prototype.forward=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[2,e.apply(this,[t.sent()])]}})})},lm.prototype.getDefaultModelName=function(){return"tiny_xception_model"},lm.prototype.extractParamsFromWeigthMap=function(t){return om(t,this._numMainBlocks)},lm.prototype.extractParams=function(t){return rm(t,this._numMainBlocks)},lm);function lm(t){var e=sm.call(this,"TinyXception")||this;return e._numMainBlocks=t,e}(um=c.Gender||(c.Gender={})).FEMALE="female",um.MALE="male";var hm,pm=(kf(fm,hm=yv),Object.defineProperty(fm.prototype,"faceFeatureExtractor",{get:function(){return this._faceFeatureExtractor},enumerable:!0,configurable:!0}),fm.prototype.runNet=function(n){var r=this,o=this.params;if(!o)throw new Error(this._name+" - load model before inference");return tn(function(){var t=n instanceof cv?r.faceFeatureExtractor.forwardInput(n):n,e=Uc(t,[7,7],[2,2],"valid").as2D(t.shape[0],-1);return{age:Lv(e,o.fc.age).as1D(),gender:Lv(e,o.fc.gender)}})},fm.prototype.forwardInput=function(r){var o=this;return tn(function(){var t=o.runNet(r),e=t.age,n=t.gender;return{age:e,gender:io(n)}})},fm.prototype.forward=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[2,e.apply(this,[t.sent()])]}})})},fm.prototype.predictAgeAndGender=function(s){return Df(this,void 0,void 0,function(){var e,n,r,o,i,a,u=this;return Af(this,function(t){switch(t.label){case 0:return[4,hv(s)];case 1:return e=t.sent(),[4,this.forwardInput(e)];case 2:return n=t.sent(),r=Or(n.age),o=Or(n.gender),i=r.map(function(t,e){return{ageTensor:t,genderTensor:o[e]}}),[4,Promise.all(i.map(function(t){var a=t.ageTensor,s=t.genderTensor;return Df(u,void 0,void 0,function(){var e,n,r,o,i;return Af(this,function(t){switch(t.label){case 0:return[4,a.data()];case 1:return e=t.sent()[0],[4,s.data()];case 2:return n=t.sent()[0],o=(r=.5 0");if("number"!=typeof this._scaleFactor||this._scaleFactor<=0||1<=this._scaleFactor)throw new Error(this._name+" - expected scaleFactor to be a number between 0 and 1");if("number"!=typeof this._maxNumScales||this._maxNumScales<0)throw new Error(this._name+" - expected maxNumScales to be a number > 0");if(!Array.isArray(this._scoreThresholds)||3!==this._scoreThresholds.length||this._scoreThresholds.some(function(t){return"number"!=typeof t}))throw new Error(this._name+" - expected scoreThresholds to be an array of numbers of length 3");if(this._scaleSteps&&(!Array.isArray(this._scaleSteps)||this._scaleSteps.some(function(t){return"number"!=typeof t})))throw new Error(this._name+" - expected scaleSteps to be an array of numbers")}function Hm(s,u){function i(t,e,n,r,o){var i=Dn(s(t*e*n*n),[n,n,t,e]),a=Rn(s(e));return u.push({paramPath:r+"/filters"},{paramPath:r+"/"+(o?"batch_norm_offset":"bias")}),{filters:i,bias:a}}function r(t,e,n,r){var o=i(t,e,n,r,!0);return{filters:o.filters,batch_norm_offset:o.bias}}function t(t,e,n){return{depthwise_conv:function(t,e){var n=Dn(s(9*t),[3,3,t,1]),r=Rn(s(t)),o=Rn(s(t)),i=Rn(s(t)),a=Rn(s(t));return u.push({paramPath:e+"/filters"},{paramPath:e+"/batch_norm_scale"},{paramPath:e+"/batch_norm_offset"},{paramPath:e+"/batch_norm_mean"},{paramPath:e+"/batch_norm_variance"}),{filters:n,batch_norm_scale:r,batch_norm_offset:o,batch_norm_mean:i,batch_norm_variance:a}}(t,n+"/depthwise_conv"),pointwise_conv:r(t,e,1,n+"/pointwise_conv")}}return{extractMobilenetV1Params:function(){return{conv_0:r(3,32,3,"mobilenetv1/conv_0"),conv_1:t(32,64,"mobilenetv1/conv_1"),conv_2:t(64,128,"mobilenetv1/conv_2"),conv_3:t(128,128,"mobilenetv1/conv_3"),conv_4:t(128,256,"mobilenetv1/conv_4"),conv_5:t(256,256,"mobilenetv1/conv_5"),conv_6:t(256,512,"mobilenetv1/conv_6"),conv_7:t(512,512,"mobilenetv1/conv_7"),conv_8:t(512,512,"mobilenetv1/conv_8"),conv_9:t(512,512,"mobilenetv1/conv_9"),conv_10:t(512,512,"mobilenetv1/conv_10"),conv_11:t(512,512,"mobilenetv1/conv_11"),conv_12:t(512,1024,"mobilenetv1/conv_12"),conv_13:t(1024,1024,"mobilenetv1/conv_13")}},extractPredictionLayerParams:function(){return{conv_0:r(1024,256,1,"prediction_layer/conv_0"),conv_1:r(256,512,3,"prediction_layer/conv_1"),conv_2:r(512,128,1,"prediction_layer/conv_2"),conv_3:r(128,256,3,"prediction_layer/conv_3"),conv_4:r(256,128,1,"prediction_layer/conv_4"),conv_5:r(128,256,3,"prediction_layer/conv_5"),conv_6:r(256,64,1,"prediction_layer/conv_6"),conv_7:r(64,128,3,"prediction_layer/conv_7"),box_predictor_0:{box_encoding_predictor:i(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor:i(512,9,1,"prediction_layer/box_predictor_0/class_predictor")},box_predictor_1:{box_encoding_predictor:i(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor:i(1024,18,1,"prediction_layer/box_predictor_1/class_predictor")},box_predictor_2:{box_encoding_predictor:i(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor:i(512,18,1,"prediction_layer/box_predictor_2/class_predictor")},box_predictor_3:{box_encoding_predictor:i(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor:i(256,18,1,"prediction_layer/box_predictor_3/class_predictor")},box_predictor_4:{box_encoding_predictor:i(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor:i(256,18,1,"prediction_layer/box_predictor_4/class_predictor")},box_predictor_5:{box_encoding_predictor:i(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor:i(128,18,1,"prediction_layer/box_predictor_5/class_predictor")}}}}}function qm(t){var e=[],n=function(t,e){var i=Av(t,e);function a(t,e,n){return{filters:i(t+"/Conv2d_"+e+"_pointwise/weights",4,n+"/filters"),batch_norm_offset:i(t+"/Conv2d_"+e+"_pointwise/convolution_bn_offset",1,n+"/batch_norm_offset")}}function n(t){var e="mobilenetv1/conv_"+t,n="MobilenetV1/Conv2d_"+t+"_depthwise",r=e+"/depthwise_conv",o=e+"/pointwise_conv";return{depthwise_conv:{filters:i(n+"/depthwise_weights",4,r+"/filters"),batch_norm_scale:i(n+"/BatchNorm/gamma",1,r+"/batch_norm_scale"),batch_norm_offset:i(n+"/BatchNorm/beta",1,r+"/batch_norm_offset"),batch_norm_mean:i(n+"/BatchNorm/moving_mean",1,r+"/batch_norm_mean"),batch_norm_variance:i(n+"/BatchNorm/moving_variance",1,r+"/batch_norm_variance")},pointwise_conv:a("MobilenetV1",t,o)}}function r(t,e){return{filters:i(t+"/weights",4,e+"/filters"),bias:i(t+"/biases",1,e+"/bias")}}function o(t){return{box_encoding_predictor:r("Prediction/BoxPredictor_"+t+"/BoxEncodingPredictor","prediction_layer/box_predictor_"+t+"/box_encoding_predictor"),class_predictor:r("Prediction/BoxPredictor_"+t+"/ClassPredictor","prediction_layer/box_predictor_"+t+"/class_predictor")}}return{extractMobilenetV1Params:function(){return{conv_0:a("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}},extractPredictionLayerParams:function(){return{conv_0:a("Prediction",0,"prediction_layer/conv_0"),conv_1:a("Prediction",1,"prediction_layer/conv_1"),conv_2:a("Prediction",2,"prediction_layer/conv_2"),conv_3:a("Prediction",3,"prediction_layer/conv_3"),conv_4:a("Prediction",4,"prediction_layer/conv_4"),conv_5:a("Prediction",5,"prediction_layer/conv_5"),conv_6:a("Prediction",6,"prediction_layer/conv_6"),conv_7:a("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:o(0),box_predictor_1:o(1),box_predictor_2:o(2),box_predictor_3:o(3),box_predictor_4:o(4),box_predictor_5:o(5)}}}}(t,e),r=n.extractMobilenetV1Params,o=n.extractPredictionLayerParams,i=t["Output/extra_dim"];if(e.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!Pf(i))throw new Error("expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have "+i);var a={mobilenetv1:r(),prediction_layer:o(),output_layer:{extra_dim:i}};return _v(t,e),{params:a,paramMappings:e}}function jm(e,n,r){return tn(function(){var t=bc(e,n.filters,r,"same");return t=Tu(t,n.batch_norm_offset),Ws(t,0,6)})}var Km=.0010000000474974513;function Xm(t,e){return tn(function(){var o=null,i=jm(t,e.conv_0,[2,2]);if([e.conv_1,e.conv_2,e.conv_3,e.conv_4,e.conv_5,e.conv_6,e.conv_7,e.conv_8,e.conv_9,e.conv_10,e.conv_11,e.conv_12,e.conv_13].forEach(function(t,e){var n=e+1,r=function(e){return[2,4,6,12].some(function(t){return t===e})?[2,2]:[1,1]}(n);i=jm(i=function(e,n,r){return tn(function(){var t=_c(e,n.filters,r,"same");return t=Cu(t,n.batch_norm_mean,n.batch_norm_variance,n.batch_norm_offset,n.batch_norm_scale,Km),Ws(t,0,6)})}(i,t.depthwise_conv,r),t.pointwise_conv,[1,1]),11===n&&(o=i)}),null===o)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:i,conv11:o}})}function Ym(t,e,n){var r=t.arraySync(),o=Math.min(r[e][0],r[e][2]),i=Math.min(r[e][1],r[e][3]),a=Math.max(r[e][0],r[e][2]),s=Math.max(r[e][1],r[e][3]),u=Math.min(r[n][0],r[n][2]),c=Math.min(r[n][1],r[n][3]),l=Math.max(r[n][0],r[n][2]),h=Math.max(r[n][1],r[n][3]),p=(a-o)*(s-i),f=(l-u)*(h-c);if(p<=0||f<=0)return 0;var d=Math.max(o,u),v=Math.max(i,c),m=Math.min(a,l),g=Math.min(s,h),y=Math.max(m-d,0)*Math.max(g-v,0);return y/(p+f-y)}function $m(t,e){var n=function(t){var e=Or(dl(t,[1,0])),n=[Ju(e[2],e[0]),Ju(e[3],e[1])];return{sizes:n,centers:[Tu(e[0],Ou(n[0],In(2))),Tu(e[1],Ou(n[1],In(2)))]}}(t),r=n.sizes,o=n.centers,i=Or(dl(e,[1,0])),a=Ou(qu(Gs(Ou(i[2],In(5))),r[0]),In(2)),s=Tu(qu(Ou(i[0],In(10)),r[0]),o[0]),u=Ou(qu(Gs(Ou(i[3],In(5))),r[1]),In(2)),c=Tu(qu(Ou(i[1],In(10)),r[1]),o[1]);return dl(Nr([Ju(s,a),Ju(c,u),Tu(s,a),Tu(c,u)]),[1,0])}function Jm(e,n){return tn(function(){var t=e.shape[0];return{boxPredictionEncoding:Dr(Ev(e,n.box_encoding_predictor),[t,-1,1,4]),classPrediction:Dr(Ev(e,n.class_predictor),[t,-1,3])}})}var Qm=(Object.defineProperty(Zm.prototype,"minConfidence",{get:function(){return this._minConfidence},enumerable:!0,configurable:!0}),Object.defineProperty(Zm.prototype,"maxResults",{get:function(){return this._maxResults},enumerable:!0,configurable:!0}),Zm);function Zm(t){var e=void 0===t?{}:t,n=e.minConfidence,r=e.maxResults;if(this._name="SsdMobilenetv1Options",this._minConfidence=n||.5,this._maxResults=r||100,"number"!=typeof this._minConfidence||this._minConfidence<=0||1<=this._minConfidence)throw new Error(this._name+" - expected minConfidence to be a number between 0 and 1");if("number"!=typeof this._maxResults)throw new Error(this._name+" - expected maxResults to be a number")}var tg,eg=(kf(ng,tg=yv),ng.prototype.forwardInput=function(r){var o=this.params;if(!o)throw new Error("SsdMobilenetv1 - load model before inference");return tn(function(){var t=r.toBatchTensor(512,!1).toFloat(),e=Xm(Ju(qu(t,In(.007843137718737125)),In(1)),o.mobilenetv1),n=function(l,h,p){return tn(function(){var t=jm(jm(l,p.conv_0,[1,1]),p.conv_1,[2,2]),e=jm(jm(t,p.conv_2,[1,1]),p.conv_3,[2,2]),n=jm(jm(e,p.conv_4,[1,1]),p.conv_5,[2,2]),r=jm(jm(n,p.conv_6,[1,1]),p.conv_7,[2,2]),o=Jm(h,p.box_predictor_0),i=Jm(l,p.box_predictor_1),a=Jm(t,p.box_predictor_2),s=Jm(e,p.box_predictor_3),u=Jm(n,p.box_predictor_4),c=Jm(r,p.box_predictor_5);return{boxPredictions:zn([o.boxPredictionEncoding,i.boxPredictionEncoding,a.boxPredictionEncoding,s.boxPredictionEncoding,u.boxPredictionEncoding,c.boxPredictionEncoding],1),classPredictions:zn([o.classPrediction,i.classPrediction,a.classPrediction,s.classPrediction,u.classPrediction,c.classPrediction],1)}})}(e.out,e.conv11,o.prediction_layer);return function(o,i,a){return tn(function(){var t=o.shape[0],e=$m(Dr(Fr(a.extra_dim,[t,1,1]),[-1,4]),Dr(o,[-1,4]));e=Dr(e,[t,e.shape[0]/t,4]);var n=Zs(qc(i,[0,0,1],[-1,-1,-1])),r=qc(n,[0,0,0],[-1,-1,1]);return r=Dr(r,[t,r.shape[1]]),{boxes:Or(e),scores:Or(r)}})}(n.boxPredictions,n.classPredictions,o.output_layer)})},ng.prototype.forward=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[2,e.apply(this,[t.sent()])]}})})},ng.prototype.locateFaces=function(w,C){return void 0===C&&(C={}),Df(this,void 0,void 0,function(){var e,n,r,s,o,i,a,u,c,l,h,p,f,d,v,m,g,y,x,b;return Af(this,function(t){switch(t.label){case 0:return e=new Qm(C),n=e.maxResults,r=e.minConfidence,[4,hv(w)];case 1:for(s=t.sent(),o=this.forwardInput(s),i=o.boxes,a=o.scores,u=i[0],c=a[0],l=1;la}).sort(function(t,e){return e.score-t.score}),u=[];return r.forEach(function(t){if(!(u.length>=s)){for(var e=t.score,n=u.length-1;0<=n;--n){var r=Ym(o,t.boxIndex,u[n]);if(0!==r&&(t.score*=r<=i?1:0,t.score<=a))break}e===t.score&&u.push(t.boxIndex)}}),u}(u,h,n,.5,r),v=s.getReshapedInputDimensions(0),m=s.inputSize,g=m/v.width,y=m/v.height,x=u.arraySync(),b=d.map(function(t){var e=[Math.max(0,x[t][0]),Math.min(1,x[t][2])].map(function(t){return t*y}),n=e[0],r=e[1],o=[Math.max(0,x[t][1]),Math.min(1,x[t][3])].map(function(t){return t*g}),i=o[0],a=o[1];return new od(h[t],new fd(i,n,a-i,r-n),{height:s.getInputHeight(0),width:s.getInputWidth(0)})}),u.dispose(),c.dispose(),[2,b]}})})},ng.prototype.getDefaultModelName=function(){return"ssd_mobilenetv1_model"},ng.prototype.extractParamsFromWeigthMap=function(t){return qm(t)},ng.prototype.extractParams=function(t){return function(t){var e=[],n=Tv(t),r=n.extractWeights,o=n.getRemainingWeights,i=Hm(r,e),a=i.extractMobilenetV1Params,s=i.extractPredictionLayerParams,u=a(),c=s(),l={extra_dim:Sn(r(20472),[1,5118,4])};if(e.push({paramPath:"output_layer/extra_dim"}),0!==o().length)throw new Error("weights remaing after extract: "+o().length);return{params:{mobilenetv1:u,prediction_layer:c,output_layer:l},paramMappings:e}}(t)},ng);function ng(){return tg.call(this,"SsdMobilenetv1")||this}function rg(t){var e=new eg;return e.extractWeights(t),e}var og,ig=(kf(ag,og=eg),ag);function ag(){return null!==og&&og.apply(this,arguments)||this}var sg,ug=[new Xf(.738768,.874946),new Xf(2.42204,2.65704),new Xf(4.30971,7.04493),new Xf(10.246,4.59428),new Xf(12.6868,11.8741)],cg=[new Xf(1.603231,2.094468),new Xf(6.041143,7.080126),new Xf(2.882459,3.518061),new Xf(4.266906,5.178857),new Xf(9.041765,10.66308)],lg=[117.001,114.697,97.404],hg=function(t){return"number"==typeof t};function pg(t){if(!t)throw new Error("invalid config: "+t);if("boolean"!=typeof t.withSeparableConvs)throw new Error("config.withSeparableConvs has to be a boolean, have: "+t.withSeparableConvs);if(!hg(t.iouThreshold)||t.iouThreshold<0||1e.classScore?t:e})]}})})},Cg.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024],Cg);function Cg(t){var e=bg.call(this,"TinyYolov2")||this;return pg(t),e._config=t,e}var Eg,_g=(kf(Ig,Eg=wg),Object.defineProperty(Ig.prototype,"withSeparableConvs",{get:function(){return this.config.withSeparableConvs},enumerable:!0,configurable:!0}),Object.defineProperty(Ig.prototype,"anchors",{get:function(){return this.config.anchors},enumerable:!0,configurable:!0}),Ig.prototype.locateFaces=function(e,n){return Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return[4,this.detect(e,n)];case 1:return[2,t.sent().map(function(t){return new od(t.score,t.relativeBox,{width:t.imageWidth,height:t.imageHeight})})]}})})},Ig.prototype.getDefaultModelName=function(){return this.withSeparableConvs?"tiny_yolov2_separable_conv_model":"tiny_yolov2_model"},Ig.prototype.extractParamsFromWeigthMap=function(t){return Eg.prototype.extractParamsFromWeigthMap.call(this,t)},Ig);function Ig(t){void 0===t&&(t=!0);var e=Object.assign({},{withSeparableConvs:t,iouThreshold:.4,classes:["face"]},t?{anchors:cg,meanRgb:lg}:{anchors:ug,withClassScores:!0});return Eg.call(this,e)||this}var Rg,kg=(kf(Sg,Rg=yg),Sg);function Sg(){var t=null!==Rg&&Rg.apply(this,arguments)||this;return t._name="TinyFaceDetectorOptions",t}var Dg=(Ag.prototype.then=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=n,[4,this.run()];case 1:return[2,e.apply(void 0,[t.sent()])]}})})},Ag.prototype.run=function(){return Df(this,void 0,void 0,function(){return Af(this,function(t){throw new Error("ComposableTask - run is not implemented")})})},Ag);function Ag(){}function Tg(a,s,u,c,l){return void 0===l&&(l=function(t){return t.alignedRect}),Df(this,void 0,void 0,function(){var e,n,r,o,i;return Af(this,function(t){switch(t.label){case 0:return e=a.map(function(t){return Jv(t)?l(t):t.detection}),(r=c)?[3,5]:s instanceof yt?[4,fv(s,e)]:[3,2];case 1:return o=t.sent(),[3,4];case 2:return[4,pv(s,e)];case 3:o=t.sent(),t.label=4;case 4:r=o,t.label=5;case 5:return[4,u(n=r)];case 6:return i=t.sent(),n.forEach(function(t){return t instanceof yt&&t.dispose()}),[2,i]}})})}function Ng(e,r,o,i,a){return Df(this,void 0,void 0,function(){var n=this;return Af(this,function(t){return[2,Tg([e],r,function(e){return Df(n,void 0,void 0,function(){return Af(this,function(t){return[2,o(e[0])]})})},i,a)]})})}var Fg=2,Mg=12;function Og(t){var e=Tv(t),n=e.extractWeights,r=e.getRemainingWeights,o=[],i=function(r,o){var u=Iv(r,o),c=Rv(r,o);function l(t,e){var n=Rn(r(t));return o.push({paramPath:e}),n}function h(t,e,n){return void 0===n&&(n=!1),{conv1:u(t[0],t[1],3,e+"/conv1"),prelu1_alpha:l(t[1],e+"/prelu1_alpha"),conv2:u(t[1],t[2],3,e+"/conv2"),prelu2_alpha:l(t[2],e+"/prelu2_alpha"),conv3:u(t[2],t[3],n?2:3,e+"/conv3"),prelu3_alpha:l(t[3],e+"/prelu3_alpha")}}return{extractPNetParams:function(){var t=h([3,10,16,32],"pnet"),e=u(32,2,1,"pnet/conv4_1"),n=u(32,4,1,"pnet/conv4_2");return Sf(Sf({},t),{conv4_1:e,conv4_2:n})},extractRNetParams:function(){var t=h([3,28,48,64],"rnet",!0),e=c(576,128,"rnet/fc1"),n=l(128,"rnet/prelu4_alpha"),r=c(128,2,"rnet/fc2_1"),o=c(128,4,"rnet/fc2_2");return Sf(Sf({},t),{fc1:e,prelu4_alpha:n,fc2_1:r,fc2_2:o})},extractONetParams:function(){var t=h([3,32,64,64],"onet"),e=u(64,128,2,"onet/conv4"),n=l(128,"onet/prelu4_alpha"),r=c(1152,256,"onet/fc1"),o=l(256,"onet/prelu5_alpha"),i=c(256,2,"onet/fc2_1"),a=c(256,4,"onet/fc2_2"),s=c(256,10,"onet/fc2_3");return Sf(Sf({},t),{conv4:e,prelu4_alpha:n,fc1:r,prelu5_alpha:o,fc2_1:i,fc2_2:a,fc2_3:s})}}}(n,o),a=i.extractPNetParams,s=i.extractRNetParams,u=i.extractONetParams,c=a(),l=s(),h=u();if(0!==r().length)throw new Error("weights remaing after extract: "+r().length);return{params:{pnet:c,rnet:l,onet:h},paramMappings:o}}function Pg(t){var e=[],n=function(t,e){var n=Av(t,e);function u(t){return{filters:n(t+"/weights",4,t+"/filters"),bias:n(t+"/bias",1)}}function c(t){return{weights:n(t+"/weights",2),bias:n(t+"/bias",1)}}function l(t){return n(t,1)}function h(t){return{conv1:u(t+"/conv1"),prelu1_alpha:l(t+"/prelu1_alpha"),conv2:u(t+"/conv2"),prelu2_alpha:l(t+"/prelu2_alpha"),conv3:u(t+"/conv3"),prelu3_alpha:l(t+"/prelu3_alpha")}}return{extractPNetParams:function(){var t=h("pnet"),e=u("pnet/conv4_1"),n=u("pnet/conv4_2");return Sf(Sf({},t),{conv4_1:e,conv4_2:n})},extractRNetParams:function(){var t=h("rnet"),e=c("rnet/fc1"),n=l("rnet/prelu4_alpha"),r=c("rnet/fc2_1"),o=c("rnet/fc2_2");return Sf(Sf({},t),{fc1:e,prelu4_alpha:n,fc2_1:r,fc2_2:o})},extractONetParams:function(){var t=h("onet"),e=u("onet/conv4"),n=l("onet/prelu4_alpha"),r=c("onet/fc1"),o=l("onet/prelu5_alpha"),i=c("onet/fc2_1"),a=c("onet/fc2_2"),s=c("onet/fc2_3");return Sf(Sf({},t),{conv4:e,prelu4_alpha:n,fc1:r,prelu5_alpha:o,fc2_1:i,fc2_2:a,fc2_3:s})}}}(t,e),r=n.extractPNetParams,o=n.extractRNetParams,i=n.extractONetParams,a=r(),s=o(),u=i();return _v(t,e),{params:{pnet:a,rnet:s,onet:u},paramMappings:e}}function Bg(t,e){var n=e[0],r=e[1];return{height:Math.floor(n*t),width:Math.floor(r*t)}}var Lg,Wg=(kf(zg,Lg=$f),zg);function zg(t,e,n,r){return Lg.call(this,{left:t,top:e,right:n,bottom:r},!0)||this}function Ug(t){return tn(function(){return qu(Ju(t,In(127.5)),In(.0078125))})}function Vg(t,e){return tn(function(){return Tu(hl(t),qu(e,Ys(hl(Ys(t)))))})}function Gg(e,n,r){return void 0===r&&(r=!1),tn(function(){var t=Ev(e,n.conv1,"valid");return t=Vg(t,n.prelu1_alpha),t=Vg(t=Ev(t=zc(t,r?[2,2]:[3,3],[2,2],"same"),n.conv2,"valid"),n.prelu2_alpha),t=Vg(t=Ev(t=r?t:zc(t,[3,3],[2,2],"valid"),n.conv3,"valid"),n.prelu3_alpha)})}function Hg(s,t,u,c,l){l.stage1=[];var e=t.map(function(a){return tn(function(){var t={scale:a},e=function(o,i){return tn(function(){var t=Bg(i,o.shape.slice(1)),e=t.height,n=t.width,r=Ug(ph.resizeBilinear(o,[e,n]));return dl(r,[0,2,1,3])})}(s,a),n=Date.now(),r=function(r,o){return tn(function(){var t=Gg(r,o,!0),e=Ev(t,o.conv4_1,"valid"),n=mr(nl(e,3),3);return{prob:io(Ju(e,n),3),regions:Ev(t,o.conv4_2,"valid")}})}(e,c),o=r.prob,i=r.regions;return t.pnet=Date.now()-n,{scoresTensor:Or(Or(o,3)[1])[0],regionsTensor:Or(i)[0],scale:a,statsForScale:t}})}).map(function(t){var e=t.scoresTensor,n=t.regionsTensor,r=t.scale,o=t.statsForScale,i=function(t,o,i,e){for(var n=[],a=t.arraySync(),r=0;r=e&&n.push(new Xf(s,r));return n.map(function(t){var e=new Zf(Math.round((t.y*Fg+1)/i),Math.round((t.x*Fg+1)/i),Math.round((t.y*Fg+Mg)/i),Math.round((t.x*Fg+Mg)/i)),n=a[t.y][t.x],r=o.arraySync();return{cell:e,score:n,region:new Wg(r[t.y][t.x][0],r[t.y][t.x][1],r[t.y][t.x][2],r[t.y][t.x][3])}})}(e,n,r,u);if(e.dispose(),n.dispose(),!i.length)return l.stage1.push(o),[];var a=Date.now(),s=ud(i.map(function(t){return t.cell}),i.map(function(t){return t.score}),.5);return o.nms=Date.now()-a,o.numBoxes=s.length,l.stage1.push(o),s.map(function(t){return i[t]})}).reduce(function(t,e){return t.concat(e)},[]),n=[],r=[];if(0g}).map(function(t){return t.idx}),c=u.map(function(t){return m[t]}),l=u.map(function(t){return i[t]}),h=[],p=[],0y}).map(function(t){return t.idx}),c=u.map(function(t){var e=i[t].regions.arraySync();return new Wg(e[0][0],e[0][1],e[0][2],e[0][3])}),l=u.map(function(t,e){return g[t].calibrate(c[e])}),h=u.map(function(t){return o[t]}),p=[],f=[],d=[],0Mg}).slice(0,f),r.scales=m,r.pyramid=m.map(function(t){return Bg(t,[u,c])}),g=Date.now(),[4,Hg(i,m,d[0],e.pnet,r)];case 1:return y=t.sent(),r.total_stage1=Date.now()-g,y.boxes.length?(r.stage2_numInputBoxes=y.boxes.length,g=Date.now(),[4,jg(n,y.boxes,d[1],e.rnet,r)]):[2,a({results:[],stats:r})];case 2:return x=t.sent(),r.total_stage2=Date.now()-g,x.boxes.length?(r.stage3_numInputBoxes=x.boxes.length,g=Date.now(),[4,Kg(n,x.boxes,d[2],e.onet,r)]):[2,a({results:[],stats:r})];case 3:return b=t.sent(),r.total_stage3=Date.now()-g,w=b.boxes.map(function(e,t){return Qv(Od({},new od(b.scores[t],new fd(e.left/c,e.top/u,e.width/c,e.height/u),{height:u,width:c})),new yd(b.points[t].map(function(t){return t.sub(new Xf(e.left,e.top)).div(new Xf(e.width,e.height))}),{width:e.width,height:e.height}))}),[2,a({results:w,stats:r})]}})})},$g.prototype.forward=function(n,r){return void 0===r&&(r={}),Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[4,e.apply(this,[t.sent(),r])];case 2:return[2,t.sent().results]}})})},$g.prototype.forwardWithStats=function(n,r){return void 0===r&&(r={}),Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=this.forwardInput,[4,hv(n)];case 1:return[2,e.apply(this,[t.sent(),r])]}})})},$g.prototype.getDefaultModelName=function(){return"mtcnn_model"},$g.prototype.extractParamsFromWeigthMap=function(t){return Pg(t)},$g.prototype.extractParams=function(t){return Og(t)},$g);function $g(){return Xg.call(this,"Mtcnn")||this}var Jg,Qg=[new Xf(1.603231,2.094468),new Xf(6.041143,7.080126),new Xf(2.882459,3.518061),new Xf(4.266906,5.178857),new Xf(9.041765,10.66308)],Zg=[117.001,114.697,97.404],ty=(kf(ey,Jg=wg),Object.defineProperty(ey.prototype,"anchors",{get:function(){return this.config.anchors},enumerable:!0,configurable:!0}),ey.prototype.locateFaces=function(e,n){return Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return[4,this.detect(e,n)];case 1:return[2,t.sent().map(function(t){return new od(t.score,t.relativeBox,{width:t.imageWidth,height:t.imageHeight})})]}})})},ey.prototype.getDefaultModelName=function(){return"tiny_face_detector_model"},ey.prototype.extractParamsFromWeigthMap=function(t){return Jg.prototype.extractParamsFromWeigthMap.call(this,t)},ey);function ey(){var t={withSeparableConvs:!0,iouThreshold:.4,classes:["face"],anchors:Qg,meanRgb:Zg,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};return Jg.call(this,t)||this}function ny(t,e){return ay.ssdMobilenetv1.locateFaces(t,e)}function ry(t){return ay.faceLandmark68Net.detectLandmarks(t)}function oy(t){return ay.ssdMobilenetv1.load(t)}var iy,ay={ssdMobilenetv1:new eg,tinyFaceDetector:new ty,tinyYolov2:new _g,mtcnn:new Yg,faceLandmark68Net:new ym,faceLandmark68TinyNet:new _m,faceRecognitionNet:new Bm,faceExpressionNet:new Kv,ageGenderNet:new pm},sy=oy,uy=ny,cy=ry,ly=(kf(hy,iy=Dg),hy);function hy(t,e,n){var r=iy.call(this)||this;return r.parentTask=t,r.input=e,r.extractedFaces=n,r}var py,fy=(kf(dy,py=ly),dy.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n,r=this;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return[4,Tg(e=t.sent(),this.input,function(e){return Df(r,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return[4,Promise.all(e.map(function(t){return ay.faceExpressionNet.predictExpressions(t)}))];case 1:return[2,t.sent()]}})})},this.extractedFaces)];case 2:return n=t.sent(),[2,e.map(function(t,e){return $v(t,n[e])})]}})})},dy.prototype.withAgeAndGender=function(){return new Sy(this,this.input)},dy);function dy(){return null!==py&&py.apply(this,arguments)||this}var vy,my=(kf(gy,vy=ly),gy.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return(e=t.sent())?[4,Ng(e,this.input,function(t){return ay.faceExpressionNet.predictExpressions(t)},this.extractedFaces)]:[2];case 2:return n=t.sent(),[2,$v(e,n)]}})})},gy.prototype.withAgeAndGender=function(){return new Ty(this,this.input)},gy);function gy(){return null!==vy&&vy.apply(this,arguments)||this}var yy,xy=(kf(by,yy=fy),by.prototype.withAgeAndGender=function(){return new My(this,this.input)},by.prototype.withFaceDescriptors=function(){return new Gy(this,this.input)},by);function by(){return null!==yy&&yy.apply(this,arguments)||this}var wy,Cy=(kf(Ey,wy=my),Ey.prototype.withAgeAndGender=function(){return new By(this,this.input)},Ey.prototype.withFaceDescriptor=function(){return new jy(this,this.input)},Ey);function Ey(){return null!==wy&&wy.apply(this,arguments)||this}var _y,Iy=(kf(Ry,_y=Dg),Ry);function Ry(t,e,n){var r=_y.call(this)||this;return r.parentTask=t,r.input=e,r.extractedFaces=n,r}var ky,Sy=(kf(Dy,ky=Iy),Dy.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,o,n=this;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return[4,Tg(e=t.sent(),this.input,function(e){return Df(n,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return[4,Promise.all(e.map(function(t){return ay.ageGenderNet.predictAgeAndGender(t)}))];case 1:return[2,t.sent()]}})})},this.extractedFaces)];case 2:return o=t.sent(),[2,e.map(function(t,e){var n=o[e],r=n.age;return zm(Um(t,n.gender,n.genderProbability),r)})]}})})},Dy.prototype.withFaceExpressions=function(){return new fy(this,this.input)},Dy);function Dy(){return null!==ky&&ky.apply(this,arguments)||this}var Ay,Ty=(kf(Ny,Ay=Iy),Ny.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n,r,o,i;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return(e=t.sent())?[4,Ng(e,this.input,function(t){return ay.ageGenderNet.predictAgeAndGender(t)},this.extractedFaces)]:[2];case 2:return n=t.sent(),r=n.age,o=n.gender,i=n.genderProbability,[2,zm(Um(e,o,i),r)]}})})},Ny.prototype.withFaceExpressions=function(){return new my(this,this.input)},Ny);function Ny(){return null!==Ay&&Ay.apply(this,arguments)||this}var Fy,My=(kf(Oy,Fy=Sy),Oy.prototype.withFaceExpressions=function(){return new xy(this,this.input)},Oy.prototype.withFaceDescriptors=function(){return new Gy(this,this.input)},Oy);function Oy(){return null!==Fy&&Fy.apply(this,arguments)||this}var Py,By=(kf(Ly,Py=Ty),Ly.prototype.withFaceExpressions=function(){return new Cy(this,this.input)},Ly.prototype.withFaceDescriptor=function(){return new jy(this,this.input)},Ly);function Ly(){return null!==Py&&Py.apply(this,arguments)||this}var Wy,zy=(kf(Uy,Wy=Dg),Uy);function Uy(t,e){var n=Wy.call(this)||this;return n.parentTask=t,n.input=e,n}var Vy,Gy=(kf(Hy,Vy=zy),Hy.prototype.run=function(){return Df(this,void 0,void 0,function(){var n;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return[4,Tg(n=t.sent(),this.input,function(t){return Promise.all(t.map(function(t){return ay.faceRecognitionNet.computeFaceDescriptor(t)}))},null,function(t){return t.landmarks.align(null,{useDlibAlignment:!0})})];case 2:return[2,t.sent().map(function(t,e){return Wm(n[e],t)})]}})})},Hy.prototype.withFaceExpressions=function(){return new xy(this,this.input)},Hy.prototype.withAgeAndGender=function(){return new My(this,this.input)},Hy);function Hy(){return null!==Vy&&Vy.apply(this,arguments)||this}var qy,jy=(kf(Ky,qy=zy),Ky.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return(e=t.sent())?[4,Ng(e,this.input,function(t){return ay.faceRecognitionNet.computeFaceDescriptor(t)},null,function(t){return t.landmarks.align(null,{useDlibAlignment:!0})})]:[2];case 2:return n=t.sent(),[2,Wm(e,n)]}})})},Ky.prototype.withFaceExpressions=function(){return new Cy(this,this.input)},Ky.prototype.withAgeAndGender=function(){return new By(this,this.input)},Ky);function Ky(){return null!==qy&&qy.apply(this,arguments)||this}var Xy,Yy=(kf($y,Xy=Dg),Object.defineProperty($y.prototype,"landmarkNet",{get:function(){return this.useTinyLandmarkNet?ay.faceLandmark68TinyNet:ay.faceLandmark68Net},enumerable:!0,configurable:!0}),$y);function $y(t,e,n){var r=Xy.call(this)||this;return r.parentTask=t,r.input=e,r.useTinyLandmarkNet=n,r}var Jy,Qy=(kf(Zy,Jy=Yy),Zy.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n,r,o,i,a=this;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return e=t.sent(),n=e.map(function(t){return t.detection}),this.input instanceof yt?[4,fv(this.input,n)]:[3,3];case 2:return o=t.sent(),[3,5];case 3:return[4,pv(this.input,n)];case 4:o=t.sent(),t.label=5;case 5:return r=o,[4,Promise.all(r.map(function(t){return a.landmarkNet.detectLandmarks(t)}))];case 6:return i=t.sent(),r.forEach(function(t){return t instanceof yt&&t.dispose()}),[2,e.map(function(t,e){return Qv(t,i[e])})]}})})},Zy.prototype.withFaceExpressions=function(){return new xy(this,this.input)},Zy.prototype.withAgeAndGender=function(){return new My(this,this.input)},Zy.prototype.withFaceDescriptors=function(){return new Gy(this,this.input)},Zy);function Zy(){return null!==Jy&&Jy.apply(this,arguments)||this}var tx,ex=(kf(nx,tx=Yy),nx.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n,r,o,i;return Af(this,function(t){switch(t.label){case 0:return[4,this.parentTask];case 1:return(e=t.sent())?(n=e.detection,this.input instanceof yt?[4,fv(this.input,[n])]:[3,3]):[2];case 2:return o=t.sent(),[3,5];case 3:return[4,pv(this.input,[n])];case 4:o=t.sent(),t.label=5;case 5:return r=o,[4,this.landmarkNet.detectLandmarks(r[0])];case 6:return i=t.sent(),r.forEach(function(t){return t instanceof yt&&t.dispose()}),[2,Qv(e,i)]}})})},nx.prototype.withFaceExpressions=function(){return new Cy(this,this.input)},nx.prototype.withAgeAndGender=function(){return new By(this,this.input)},nx.prototype.withFaceDescriptor=function(){return new jy(this,this.input)},nx);function nx(){return null!==tx&&tx.apply(this,arguments)||this}var rx,ox=(kf(ix,rx=Dg),ix);function ix(t,e){void 0===e&&(e=new Qm);var n=rx.call(this)||this;return n.input=t,n.options=e,n}var ax,sx=(kf(ux,ax=ox),ux.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n,r,o;return Af(this,function(t){switch(t.label){case 0:return n=(e=this).input,(r=e.options)instanceof Vm?[4,ay.mtcnn.forward(n,r)]:[3,2];case 1:return[2,t.sent().map(function(t){return t.detection})];case 2:if(!(o=r instanceof kg?function(t){return ay.tinyFaceDetector.locateFaces(t,r)}:r instanceof Qm?function(t){return ay.ssdMobilenetv1.locateFaces(t,r)}:r instanceof yg?function(t){return ay.tinyYolov2.locateFaces(t,r)}:null))throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return[2,o(n)]}})})},ux.prototype.runAndExtendWithFaceDetections=function(){var t=this;return new Promise(function(n){return Df(t,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return[4,this.run()];case 1:return e=t.sent(),[2,n(e.map(function(t){return Od({},t)}))]}})})})},ux.prototype.withFaceLandmarks=function(t){return void 0===t&&(t=!1),new Qy(this.runAndExtendWithFaceDetections(),this.input,t)},ux.prototype.withFaceExpressions=function(){return new fy(this.runAndExtendWithFaceDetections(),this.input)},ux.prototype.withAgeAndGender=function(){return new Sy(this.runAndExtendWithFaceDetections(),this.input)},ux);function ux(){return null!==ax&&ax.apply(this,arguments)||this}var cx,lx=(kf(hx,cx=ox),hx.prototype.run=function(){return Df(this,void 0,void 0,function(){var e,n;return Af(this,function(t){switch(t.label){case 0:return[4,new sx(this.input,this.options)];case 1:return e=t.sent(),n=e[0],e.forEach(function(t){t.score>n.score&&(n=t)}),[2,n]}})})},hx.prototype.runAndExtendWithFaceDetection=function(){var t=this;return new Promise(function(n){return Df(t,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return[4,this.run()];case 1:return e=t.sent(),[2,n(e?Od({},e):void 0)]}})})})},hx.prototype.withFaceLandmarks=function(t){return void 0===t&&(t=!1),new ex(this.runAndExtendWithFaceDetection(),this.input,t)},hx.prototype.withFaceExpressions=function(){return new my(this.runAndExtendWithFaceDetection(),this.input)},hx.prototype.withAgeAndGender=function(){return new Ty(this.runAndExtendWithFaceDetection(),this.input)},hx);function hx(){return null!==cx&&cx.apply(this,arguments)||this}function px(t,e){return void 0===e&&(e=new Qm),new sx(t,e)}function fx(e,n){return Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),[4,px(e,new Qm(n?{minConfidence:n}:{})).withFaceLandmarks().withFaceDescriptors()];case 1:return[2,t.sent()]}})})}var dx=fx;function vx(t,e){if(t.length!==e.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");var n=Array.from(t),r=Array.from(e);return Math.sqrt(n.map(function(t,e){return t-r[e]}).reduce(function(t,e){return t+Math.pow(e,2)},0))}var mx=(Object.defineProperty(gx.prototype,"labeledDescriptors",{get:function(){return this._labeledDescriptors},enumerable:!0,configurable:!0}),Object.defineProperty(gx.prototype,"distanceThreshold",{get:function(){return this._distanceThreshold},enumerable:!0,configurable:!0}),gx.prototype.computeMeanDistance=function(e,t){return t.map(function(t){return vx(t,e)}).reduce(function(t,e){return t+e},0)/(t.length||1)},gx.prototype.matchDescriptor=function(r){var o=this;return this.labeledDescriptors.map(function(t){var e=t.descriptors,n=t.label;return new Ed(n,o.computeMeanDistance(r,e))}).reduce(function(t,e){return t.distance | Float32Array | Array | Float32Array>")})}c.AgeGenderNet=pm,c.BoundingBox=Zf,c.Box=$f,c.ComposableTask=Dg,c.ComputeAllFaceDescriptorsTask=Gy,c.ComputeFaceDescriptorsTaskBase=zy,c.ComputeSingleFaceDescriptorTask=jy,c.DetectAllFaceLandmarksTask=Qy,c.DetectAllFacesTask=sx,c.DetectFaceLandmarksTaskBase=Yy,c.DetectFacesTaskBase=ox,c.DetectSingleFaceLandmarksTask=ex,c.DetectSingleFaceTask=lx,c.Dimensions=Nf,c.FACE_EXPRESSION_LABELS=Gv,c.FaceDetection=od,c.FaceDetectionNet=ig,c.FaceExpressionNet=Kv,c.FaceExpressions=Hv,c.FaceLandmark68Net=ym,c.FaceLandmark68TinyNet=_m,c.FaceLandmarkNet=km,c.FaceLandmarks=vd,c.FaceLandmarks5=yd,c.FaceLandmarks68=wd,c.FaceMatch=Ed,c.FaceMatcher=mx,c.FaceRecognitionNet=Bm,c.LabeledBox=Rd,c.LabeledFaceDescriptors=Sd,c.Mtcnn=Yg,c.MtcnnOptions=Vm,c.NetInput=cv,c.NeuralNetwork=yv,c.ObjectDetection=ed,c.Point=Xf,c.PredictedBox=Nd,c.Rect=fd,c.SsdMobilenetv1=eg,c.SsdMobilenetv1Options=Qm,c.TinyFaceDetector=ty,c.TinyFaceDetectorOptions=kg,c.TinyYolov2=_g,c.TinyYolov2Options=yg,c.allFaces=dx,c.allFacesMtcnn=function(e,n){return void 0===n&&(n={}),Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return console.warn("allFacesMtcnn is deprecated and will be removed soon, use the high level api instead"),[4,px(e,new Vm(n)).withFaceLandmarks().withFaceDescriptors()];case 1:return[2,t.sent()]}})})},c.allFacesSsdMobilenetv1=fx,c.allFacesTinyYolov2=function(e,n){return void 0===n&&(n={}),Df(this,void 0,void 0,function(){return Af(this,function(t){switch(t.label){case 0:return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),[4,px(e,new yg(n)).withFaceLandmarks().withFaceDescriptors()];case 1:return[2,t.sent()]}})})},c.awaitMediaLoaded=ev,c.bufferToImage=nv,c.computeFaceDescriptor=function(t){return ay.faceRecognitionNet.computeFaceDescriptor(t)},c.createCanvas=ov,c.createCanvasFromMedia=iv,c.createFaceDetectionNet=function(t){return rg(t)},c.createFaceRecognitionNet=function(t){var e=new Bm;return e.extractWeights(t),e},c.createMtcnn=function(t){var e=new Yg;return e.extractWeights(t),e},c.createSsdMobilenetv1=rg,c.createTinyFaceDetector=function(t){var e=new ty;return e.extractWeights(t),e},c.createTinyYolov2=function(t,e){void 0===e&&(e=!0);var n=new _g(e);return n.extractWeights(t),n},c.detectAllFaces=px,c.detectFaceLandmarks=ry,c.detectFaceLandmarksTiny=function(t){return ay.faceLandmark68TinyNet.detectLandmarks(t)},c.detectLandmarks=cy,c.detectSingleFace=function(t,e){return void 0===e&&(e=new Qm),new lx(t,e)},c.draw=nm,c.env=qd,c.euclideanDistance=vx,c.extendWithAge=zm,c.extendWithFaceDescriptor=Wm,c.extendWithFaceDetection=Od,c.extendWithFaceExpressions=$v,c.extendWithFaceLandmarks=Qv,c.extendWithGender=Um,c.extractFaceTensors=fv,c.extractFaces=pv,c.fetchImage=function(r){return Df(this,void 0,void 0,function(){var e,n;return Af(this,function(t){switch(t.label){case 0:return[4,dv(r)];case 1:return[4,(e=t.sent()).blob()];case 2:if(!(n=t.sent()).type.startsWith("image/"))throw new Error("fetchImage - expected blob type to be of type image/*, instead have: "+n.type+", for url: "+e.url);return[2,nv(n)]}})})},c.fetchJson=vv,c.fetchNetWeights=function(n){return Df(this,void 0,void 0,function(){var e;return Af(this,function(t){switch(t.label){case 0:return e=Float32Array.bind,[4,dv(n)];case 1:return[4,t.sent().arrayBuffer()];case 2:return[2,new(e.apply(Float32Array,[void 0,t.sent()]))]}})})},c.fetchOrThrow=dv,c.getContext2dOrThrow=Kd,c.getMediaDimensions=rv,c.imageTensorToCanvas=av,c.imageToSquare=uv,c.inverseSigmoid=function(t){return Math.log(t/(1-t))},c.iou=ad,c.isMediaElement=sv,c.isMediaLoaded=tv,c.isWithAge=function(t){return"number"==typeof t.age},c.isWithFaceDetection=Md,c.isWithFaceExpressions=Yv,c.isWithFaceLandmarks=Jv,c.isWithGender=function(t){return(t.gender===c.Gender.MALE||t.gender===c.Gender.FEMALE)&&jf(t.genderProbability)},c.loadAgeGenderModel=function(t){return ay.ageGenderNet.load(t)},c.loadFaceDetectionModel=sy,c.loadFaceExpressionModel=function(t){return ay.faceExpressionNet.load(t)},c.loadFaceLandmarkModel=function(t){return ay.faceLandmark68Net.load(t)},c.loadFaceLandmarkTinyModel=function(t){return ay.faceLandmark68TinyNet.load(t)},c.loadFaceRecognitionModel=function(t){return ay.faceRecognitionNet.load(t)},c.loadMtcnnModel=function(t){return ay.mtcnn.load(t)},c.loadSsdMobilenetv1Model=oy,c.loadTinyFaceDetectorModel=function(t){return ay.tinyFaceDetector.load(t)},c.loadTinyYolov2Model=function(t){return ay.tinyYolov2.load(t)},c.loadWeightMap=gv,c.locateFaces=uy,c.matchDimensions=function(t,e,n){void 0===n&&(n=!1);var r=n?rv(e):e,o=r.width,i=r.height;return{width:t.width=o,height:t.height=i}},c.minBbox=sd,c.mtcnn=function(t,e){return ay.mtcnn.forward(t,e)},c.nets=ay,c.nonMaxSuppression=ud,c.normalize=cd,c.padToSquare=ld,c.predictAgeAndGender=function(t){return ay.ageGenderNet.predictAgeAndGender(t)},c.recognizeFaceExpressions=function(t){return ay.faceExpressionNet.predictExpressions(t)},c.resizeResults=function e(t,n){var r=new Nf(n.width,n.height),o=r.width,i=r.height;if(o<=0||i<=0)throw new Error("resizeResults - invalid dimensions: "+JSON.stringify({width:o,height:i}));if(Array.isArray(t))return t.map(function(t){return e(t,{width:o,height:i})});if(Jv(t)){var a=t.detection.forSize(o,i),s=t.unshiftedLandmarks.forSize(a.box.width,a.box.height);return Qv(Od(t,a),s)}return Md(t)?Od(t,t.detection.forSize(o,i)):t instanceof vd||t instanceof od?t.forSize(o,i):t},c.resolveInput=jd,c.shuffleArray=function(t){for(var e=t.slice(),n=e.length-1;0htSTOo`ELJp60!M_b@ zXb4WQkhk`J!2YyOvbu`JApWNz*lobT2%2|DF;LL^cL8}|r>}I-p;N?F48eap&=AN_ zBSWB*{Yn=k7#Khx026}%!jPk;Zon%BqbDHvZ_SF12E#hNGu-}va=Z#;f-r#8F9XVe z;Qv;@G_h|1L9jy1@4IjRyX7}Vsau3srv{yooGsyh&-wpda1$J`c*XH??KM(72<4`j z$16xqe2moJ0W&pThb)L}=tX0w03nOW|@dUs| z^E}H$vtaSt%S0TcvtIAIlaxKNL&yFn04KOJ874RSZV=qI%krN{i}W-NqDYlEKzu5o zjOP*Q1r+}_5?xhld!sOzEb%f{5-)TsGj@Rrg`FR$N3{+Mwxs*-K2GU?(NxotUxbh( zRM`<9h7h#>qqqO527p}sDk1g*gu#hLNu}4G=s$h^AEhAl4M0}LV2M-v9JJr-ghBcL zuK(}eAXtRRznA={_W!F#H4G0iXfLV1Qbh@e)PE}YKmUTOq&kU%SSoM4FR2Lnu>ZeX zXb1+Ffj*4I+yVcy=qfg#71wFO|C@&V?dmOh;P6yCPG+U59GB!4YU39GOYqQegRJGJ z8AeL)@4JZ$Sx6qni9eI8j+lc(<^#kj!yrzB03udGj^HDSNr009Euz%S(vaRi;~>Q&fo z*$5W}c%)xVI#Cm;aUQ@^WC%>~0i z^fY`1m?Z~l(gejhtN{-wuj?=K;wXaTHo}y>2l2UVU5Ty{~D1Lvq7F97@3+3a|g|G*o^O zv+C*XfgCwTi*U9JaUddNghjqDd`GbBfWf3|fzsM_TBm&~xr#dZy5YJshazYQ{TS== zVVu4h9x%m@;n^k=z*+%Nw z${b5Xrh@!4P#WG?@a)$dQ~)3l129oo05xa>*mmn3QV%#)bxYa%BdZRNMB8l#Qg#hJ zZ8x@Q;Vu!V^IpBIW}aglN9?{Q0Y7U&HcL$?)V2|S8K&%q2L)(TsNuXph}|enqxQt) zI@M~bk%ZrkKJ}RUl?o83Cjow1rH<|J#$=*`5l_|3bpVvf$Yk~Lo1SpAmZnPoN)NQq z6%+3S9SV+4eQ&i?;3vvb3L!N_GT>N}oh+}*d6d8B_c@ykh|f;?&`X1`CfEy+a?`2o zb5p>uXWB8H$WCI${_T;nek+NjnA8c@YUsW{Re4MyoK`9I$=0d5w= zh&{dgU`9+`)1ahY)-O0cNsPOdtV>f5+VQY_(F_nC7EnRx$#vgsHSb3TUgQb=>r8n9 z>nW~38TYgCS8RudQLsOLI0NjLpSk}_yaObNn!qIqy&%K5-~uLE{0UX>5Hy>1*&2QO z9Y~_J^M+1!M<_PqX?K=a(~-`jMyLU)e@KzMnXWiY4@K10sZhLmU-^bG+CHCAk0Jgr z?@{iamt~EZ8V!qOQ9-)agHAi=}8u^E!Ql5>LCtBTQKrVLtv=-1AR%T=LuhE^+m z82idpf9qc{KXl9Nl45L<14QJYbKhiP)~f%CXyEdffU`aa+KR`4MN6#wdC&K=jf+_M z@f3b|%nudx)eKEUYY}0H5H5{l4f0wPS!EDMgn%agn$%4bVf}tDRn=R``@}1o*5ZD4 zAU>`W7wNbrB1I2y0@{hyOWXt!ci3ww!yi=l=0RG3lKg3J+6ED0 z8~3_Eol_c``;_~78+{ZVL*3BmtqiEoEFRP28l6mpnQ>z3;hKOlQdjIolj(e{BmKj7 zEOvfC`3;#;#{G2k74zW?5Fr`hBt9qW+n|o%*xiv_U3(kgRtOJbIUfyWX~phb*Jqi3 z@%%OU*$=&-^d-Zjo5b?Zr$bp~Frgd}Kt=N}cUTn)e`LrJqlpd17@&TnIBQUMSTgtu zvzDkYLMdq$4V&<2YU_%7VLeD4u$mRU&|)=vvG`nl`q1Aw-&12Rxlm{Ht2GHD(M`K7 zo-{<+b9uz^Rl}6y!QEmFm8KW2hk=`~X+l)qqwGDmHayKeC?(2KnCwTWzRf|6+fm!D zo+hzPZX%iSz@anLXY4Bag1F0UB-2Y*8*rI&Msnz18g)49ctmgMS&?BhjEaoY=tVxX zbIcHd%P;nkd%xmeKclOqG|NV?YXuZcC-86*9h>_*OVoT;ROUZaFi+ntkXXTmEP)Xi zMcBIQQr#_(l|jC|_>G5gG3t*4U%@Vw%Y~pib>iK1Naz<*j8U&y=a%23Zek@2i{CSk z#41D5&91+aEC^*>KF-DMbCvyR#BKFaH^2EDt*9j$cGm)u8CR=Yd5P06GXK3TVTLxVx8vj@Iu5>|5gBzFb>{E8zWy*}0Fm_u{yohDvphk**(wY>?r1 zKS_j!7^jS9ziT94ou0)(Ef&{o@zQ>-zg|mn$h$3R89!5E7Stl6X=Ol~W}vMS#A%X{ zw9J+Y!LtUB=bOtQ;~DT1m+!VJNdGAY9m>yVOXX5IvwCc$e!G|)+-aVq0v`yi6cG)m zB)z=-D}aH+B70kI&Fz{fA+Db4sp;Qu4L2=8ao#3bA6-fV8Z^i`SYZe71-I+`Xwc| zTMpGn@O%9Oj(v{5PilmM#;vz0{tNyz^~-yf?<#Rn@|-fMBBwC-$A~rajE~u-fv#hJ zpfQbICS^oZpOf;orW~qom8;0JF352!6N`&e+fb8I^f5||`3w(#s4CsZT@|DiPul-k zT>7;R(#-9rpt#S7+G2U*Z@(0Gdui2O`7 zUiFIv#}KI#_O5teWzrNkHE2rZS28MT=GRB&w63-55M(%gn4QhzHu@n8EjYQ3rFiey z3bWp#1E0O$We}{6!?(7yr4P-%LP-ShbhQ^&4Oe?X*2A;2Z4~+59%ZJ_OS4<$2h!Xt$RsYPd@g{CZn3f{1oDbL>OwOr^z?{PX-N)IJhr>JlE47v@lp`^I9*ZWy%&A9E<$M)!?>7>Lbg|3CNlUmMYqFxU0zi z0|ApvPqswxpA2R7YV9X|Qqni6Jh?_$kQwU8iMbXtp46}_+Cynpm6%p!A6R=~8UftW zpHbyO_;>ZGMNHl)$nZ_76o?y5&zoD$LJ4TICvo7tlIJ+HhVg9-8}pa+>14Q-Wgl=8 zmvz|E&a3$cO|eKDpv}bRe{Muc(e+0T0zD)cdfI7{fEI*mK(j>qc`)|7R@f%tP%#6kNmBZDg*hu^)`e3Z-H3jwE6%o!Kf?!t_ zmlt-t=D;asf7NBeX(f`x2(eLRqh0kN9#`;t){uOeR~v1&)xA3dr zm+cI~aNee1L}hRK@j}2Zdviu8jWRjA6+K^7)$i#zMzi^Q;@11$ zJIE0?1(g& zOH#12hY}`Hk8*~b2oYl3idY?9o096Yp%(7fNpz%kWsx;o9l>L@binDHfC&!`J#Sjx zr5f!Oiq}vZay8DxF(K&^IUF%^pN$%(dHF45u?k)*|Qxj zHKig}e>Ws7x5M}3U;!xh^}Oc&rz3L^1N-Z^`a-e}NKa7j?#;?w$gK)X*=i%CnBSK@ z@pT6_lTAPxLCxWfF&jCVZw{)v>mxMdU#^4Zg#r7mXagJmdzcdI}D+>9}p(5>{w z#l;4>B+{`qJ|aN_#Kz&{q0M{p^;hgwxkp#me-Aa@B)+aEM$>byvtS=^(PR7V#5tkI z6lQW5Rpriz)zF!#6joNnk7IUz#VO*NoYH~hc{)<*MonGEMebP04s_iZ&61IwP6EEf2}&MW#}GxKc$jU8Q)o-d#>?D*g-e zbmh&y-oh_p6&@;Ya2|Sf)U#`3h4g(zw0eV)VzIcSw)0ijUuzd3L`fhdlN)%{o2`_K+xP zqA@%hae7nb9hR%Aq(u=^KWv+WBrnHtWghjZEkV5SP&l{w;KszgODA;4!TjZqXJv@9MX&4s&~I z9IFvM@4_1orATmVqyL=&!dl(&cF`eb6`3DF$H;Z9TcVPLnSbXbYXt}SEbGY4yC~Pv z&29O2KGn5f2bW3at0BwH>sQ-Yt5>l~BDK;LOOaZCpI7B{2B0l@yiS||^t>O6Oc9%Z zNK$jvX$kGT{dj*4FFsIEhDKqqY{@8!GQXv`=6@Bh|pM6O8d(`>fEq*KN` zCThG2I4z05v-Gh)qxf-w;^!|q1N^ve$Q=Siq&r6$XFV$3ZpKx4rSf=EQ=|CbGBt^F^!&HQS2M$3 zF??rwFKQ%&({!I7;vS*}tatXro&MvEq`#tDWGw$vO=zm)S$z{%`JrpwR5Vv{lx8ds zsF9zxpC+knp$@`enH#@&(3*ApLvPgv48Ku9Letk^h*Y^F<2#=wG6V7Be^I-z<|5A# zI?t&asFU*R!~Jyced@8Hp;< zf1oKg553e1l6#tzkVrSY=_N@vZMd~8EY3Mavoy#FS}e5;?dooBP9$t`@v zEZ9N6QZK=rR>KwgV8fd){7U!vmY3J?-bpSaNJPqLb!xKidzj0RxR#S^LtEG#Ds_G% zNg|aHVX#AHl1czT->%;GCOFxv@bUa|_HML+NLEsXK%+zWrRTyfv$ag(P^_k4++X^V z`|FnC+n&ghH;_0e$ETM=+egR+%^3U1n(&qDxX)wX=&ULUwq*U1YCfzyvgRjM2`wK; zsqDiAD1b>pxd4u&WEwj(KwM0e!ZoCy3@}^t6jf9Bf6njFIle3Ah)DNc@=)%E)`|y2hf_! z!Upb@3lHXbcioX45d*BZcEPQ*1vQ{KgVP2#<4FeP+`|N(fT23L{^`^4{JFLYP~eC+ zXjxv|UV!j+1KsMFIIok1K80{{hkVQ@XjplH>q>9(zRq{AInf>5W#9ARA?~*3;5L~r z*<{J;+6EmX@hW2ZljMEWG|I|L>4SA@761Nw%V!_EAx-)B{c`qzL-~upSZtdV_rG>9 zeVP2wtI3~-2PDg5o~bNuLFO2ROEix z`H?7~sqaKk>hD`z;hmabAzgP$_V3)mQgNJ)n_8r`l$bQ1kq$FLm->=@qy1uWS` zlk$$H8)|Mxt1Q{MMi>v$^B`JtB-KXS*%q!5mWd%EI_=et6Ee!lY?(}cKbkD>?fS#W zO(*#wukM`M!sK#=6$i8Qjk7vsBjyzPbO466`mAV5kez$#6^Lsv*jgI8f&5vVH}CQL zRgF(&l+*Zx^W%l8ZSyYXVN+p1b*bU&e8RIEu*{w9`Ek}v1R(Wx%f_C9ul>_YBfd>T z#$0YEI*J%cL6wKlV^_)UfM+39?84y0%{O*V#@PzrDeWA`i>3cNTL>46)K+HUr~jF9 zswGU*#QNYDqizI{EjOQCp0E#@+uWuRiP5S;P zhgO9c(WtnL8kBmSxkAhzibFKE3zF;W>9&Vdf-YiK0B4=r*;;lNhoe*ZP9Msogev zGLo16;$#k5fX_#NgX-L{^V7YIoKf2jf?v1<7jjF1EHx=>7wENhx{=0Zm|NCIRP<$=G%AzE8U%j6!m>Nk|wwvmRX= z%rh!xMGD=k9h45?lm!~v-V@!xXB|2zak4BT`CC)hZZZvf&4~$2szEgJsGa=EhB-{d zUTtraRq7&}9{#A0(J|^V^C^l!a=$EReT(+@BAb)N>|1|3Qr?R|M6y23QWIBwisEYp zw!JR*#4|eMVbsd<$Pq4~&lXsy&1!9~C$)+0z@{{G_~xp?63MY1&IRR=n^4*tsih2Y zv;6hdlNBPtqn%6oyZovmLA9vKDJcEO`EYmZ7#6pnX4wEt;&C@#V#Xf7^D_=$xoy<^ zZgbWnXxu>PNzLKFr%qijl7Gwx*4cSKJA{KLT2Aiso8aUyG$_U;`F;ku?y))i7^tCl zdL8w+#R}PaojJ^xcT|Z#_R!}PGBYEDmn-wu!CcFDFH295L0?Hrz`wuiWzB98j9oh( zanwbGZ2QlKk?`AM@{!(m8;D#($#HR%P-nWNRI_gtl& z_vKRzHO*ELQEP}ud!${b{`N@c{} zQJHAGTe*oP7urGlt4%+>9C$h|aCyH!R_6g2&Aq(hVJ~psOI%V-G0pYm8-+}!{FFYt zXD3eqA{k{jB4`mnQQ zZge>zJVLk;9T9G*1>yKC8a3n|k2T3N>rxv~O{9u$xi{;Hs>jgMjAEI6G{+{A*ocIqG663ppaMuKS8eLrsu3%)%-j4cQ!?v(36!;sM24o89GX7uulhNQjy@5#!5dr>`fg%F@!hW}yr_q!)=& zS4VX1=Es+3T-Qnh9=I}` zdp~j(j5tute?;XHU@(>P;-R}A*sJ;O#XPz58aKv2v=gREqDYwlJsTYuTz=;`$WR_S zQZS89xVt+kC21K+98;8>>y8MnY+)`ws)g(o4!Q>IT^HQ{UoL>P>z#h9 z1##%o4Lx8=pZPo&u9|4f!eU2V)qTfBJ#Ag9b`p`lTjKv)RlCWpO-1O^7e1{YKZOa= zz<(0CIcdYmZa_r2hDA9VyRhJvfV%{=geU`2NO(3y=`;L}&AlWI`eapKB0iiC_7-9> z*CxyD`Z9R8XuLa(p47+XRi!36ePhcqkpcpHdSZ@E9QBsXf+%}Yp)sjI(a*ZieY+^> zsE|XH$kZt28wfP&fxY6P@SB0PltkQFX(i~g9p0L$KC;)YMjY=WT@yK~D>rzJzT)vc znJGglP_Sbugr|Qc>LmGB$X4Q!`D~_h9dKGo%=07P^Q}e&CpN>GJH3SJ*3Y90X}woT zVjuU0%?_Eb8DjfxFkJIanX><;YhPPp_H2A{`h}z=xBy*XuaM%t~=k7SaTS5ig54_KSia^EZ;O!NhGKX zPX3jM&RXe0G+a6KZX7Nja$fgF#q3K8GMR)t>;c9^Bglk;hTMelY$pT?9aEdD_y-== zWMko5C@Q{v4MtlH1+%+}u)=e_2LI+42TD!K-j%@%_??{~#h6EazVwu-n6pY(-1!k? z!Uc~H-q|xtSMRO;?!|_LEPv&4L9`{m{ra2OVR{F|X;V($*|WF+2m``YFU+8 zNR{vrryIM?S2B#I*w>7~H!F-Cco{Eg>0u-rv=tiOA|O4S!CL2{JosjOw?Nh~l;V#c zaD?4AGYE?zzfewgtLUhtiC`?U?X+feym9yZ7Z!U&$eG&JuTBtEp1#(^a2*25P`zL_ z`@#hBrcP8bE46;q$+EM8Ogb9|8g#GCC)W*sf13cm=?bs@Sw$Yh!#G2)m+&z*AQv9? zbT3iig`=@<{pdlu%b?U`#C*M$+|g>Ds-7Xrp4KKbw4)?u^f65n2K%(uUotC!^V#=K zk}*j+8>NKylsp!mMg(t(k+!_cuXAr0kD=*V45zFTw|cVa=FhYV{wU)AZg*u+?7+b3 zuLQ|aOGW61DN(-C-^7P0%#g!b^#E#z6{@wqU%Mv5^=^?m?`i}zUU410F28kIV}5Ok7O|K3n_wGqc+s#0Ha#b5&l z$(6_vUQ#>tK$sk!=V=aiF6>F zS3qI{L|1i8vo3>R_`kQT)X;T&=ZH=<=P(P~r&2{@1dw+}#K4Nk8M)#Oj*Z1xK5|KJ!=aHLn%7v7dhr zO(RmDrZu?~F&V4vUeaknRbu`4d5|4?UCbBAfO-EbzcxmVVvB~u_Rmn_uX{~k{qBxd z0RFViur4Mlup;9*z|N~>g4k_*e@c27&07lU@AuY&<3kJ5+`$DfY2N%nub&Xwd}YYz zPCH;m4~dtPRBPJm3rn^H{fa{L=;^n0j0ZBzDa}8rY<89-|Crs$vPtgZgM3~Bz96?S z{5c%m8+vBE50`n)*B}D&G&I=#`M84)8M*l)$LO@Fdw25+W;0`&laS(CBogbCX@_k+ zacNp761VJHwCtdlu`E^M25{-u3yF5oe8FpwNh)jSQ~&zl{nCq8){@_b@gjp;v|MS} zO}sezj`3EoSjzSxf5gn${IeJrSCAlL@(A^~JOp!ybZ@4@R8KS?QDfo9#DDj7sDJJM zXb|teUb^gJ+bNQXHPtSopkha8a$>5n?zIi|>d z=gihR8bx>qQ|NCN32m^MCnG(AuLq3z>L0wz*Q_I<5+$K!R06r{)k9Gv&P zvAPz4mC2K&T=8@iB=Ug(>=a%qW75=t{q#=0&( z76#0+2RSmu!WN}h!C#dgH+r#yhSEaj`OrU24)?s98J0EU;JUGV3PIr?JNtymYrqAd zWTlKh|EgM1dC!gy>D9h}16-Eqf73BhSk&=ryDW=K#8dvKa(p0iSe5i8B%|5ah&~Fz zZ(ATSQ!jKrw7TwB+WE~v?y`haVJ;HR2)wM-v;$tmvG=?T&PNT}XiTh(-yM#5KR`tlpVV(xyJz-Nm-%pq`j zN+Hu5MpF{UKn$#RKU|{vG0h%S+6G|N*h zN@L4S#@N=+w=dGO^{pcmE&Kiy3;UOD_iTR|khc$exJ>w2!tQj#y z0Oyal7!Lz$)!qt~9w-$hkBs_#nb%!`>_m`@PbiL>?a}tW* z!vp92Tf;-|MT6#JKk9#*ZrbfUEQH{9>)(KyTB~In?uI1*Rs3&IO*y&a%>1b$Y53d%5rO*lKHbJc|V-f z*Y>GL9@Fb@1ga%SGwYt(y2@YiTtM*!)^h3HR1TAX`Oa)$;6;xV({)>6+su9bnC!k) zSj2(fQ02pKB50{9{b#36=6^hQZrI7I^vyGCHkqA?!;8);^=;};RZV;C%o^-<%246uxh-=(r>vc^ieJ) zk%Vvlg|n&t2R!sAn?A6-K|*fZ7_Kh2^sQpM`6v%Y1h>MrCG0aY+|hj;o&DN!wVl4A zAAghHXJS%^0x{+c3eR2d)nTsZ_D}d;R0?#pK{{lWqW|q*ipz>hvKd49we#fcTb7y^ zRee+SQ57*A)Cs1x!id1cxy!-EEq_olW_{I+T3}MR@hiks!jtBs?^&BB#-6#^S`-Bf zglA-LQ!~FMwMq>NWM=MG>ow$G7yo?f4Q~=FV2gqtc?w)l%9vrH-RA!R<*uMB-6}yP zso)CkrMv6|G7_E9`GQ@MNh`RO`FDqcdj}d6w+ltI{)swWgHV4J(r%FFSXqwZC6i(b zN@lihbPrZEGP@GUaagX24Z=nhaDsV#A1uDJGq&wO-)brPam}{HJj+MvKKLqJZ7rBl zOyt3 z)7^6C3H*rdGw!}MHoEOpt9 zyt(t@x>>j=t$T6hJpWGVAH%dzR~^-q`5EJ79!tW{ZYTXDS7<4p7^|lWlHR>xVZn9oWe>dg0rl#)T7!P0;R$2A%!Upzrs-ChZ7O`jm33y#OR13c)Zw z+SSd-F>BFsM=B4MPzb{-q_OlQVKsWE-oLPakw)@V zbj7+zU3Hb9vR9?`7zCRKQRjXE)9esB-hHv;C4A9LBK%xUl~MFCClZ??x^L<8ADs{X zGn_Y5O7-43R@c7f?+~^{FzJZ0bekEqZjj*T_e^q2HaWKwtra0VifF8t&x!F@$cN}f zVj-Ddy(_;?TEq>JVn3@LXe4OPfVEGYD&N_~%;#i%2Hp((E}OsHeWQoBoCi!AO$7={ zlKvx~nnnjqvP-GO>)bJ(v@UV+y`jV{mse(l8&l^Dm-UNfx;YEx@gEQypcJgVqp0P@ zEQde+8lMYTs<6fUKm5iDorSA;pB|g?o!8C4ch8Qx`mcB_=W>rx%)g&=Yx7YHknRUQ zr;NuMxVfF_iP zm#Iut>AT9@{zF(_B3oFns;sJHNo{ROh<_|Kz9zj-O06jCCvJAAJz{^;h&M-x{yosM|BMI9!48o1n9|tvl zHgj5m50nm$)#1MEsMM3r_ROblh3CI95#~zLr1Hg{;KO^2&9qN9SdNaN#&rF8-G1DJ z6^S5TG;?;p4+NuOuoeF9Wb?QF%)3tP2oifty!lxBM~GqiD$u2!-{ejGDpU1(?&I7htuN=QN z{K4T*#4h7rlg&azr7XOUD`3Bpylp>Tx$9R5n@pF{b({)pHXJ&rKIkpzO^sY-Be|Va zHd$vCxm_~-M|9Me&rzU>4FWeC!t%e8WdSr@ncXIamzZYk~Ftvf9lWWx+A5K zv(7V>dm*cRn+%04wl#n2Htr!sWk{*bnd_rhnUjGE;Bwu>yX>~|?+f4*sa|dk7dd^FX<>&eIv~K=z7-(0l3+sQZv7^`3ZLGO)GxZ#Wu)%9ezfxxB+HEvNAr zIyb;8`cDeKM$TU`(gz9$hZ3{1Rz_-zNg&tU89T)DnaSmEveW6`tIE$E_dUfsl}cll z%5a%=5K3YP29RNxo_*QpgM7%yK7*&llF!U3Wd{{7Sq|C6HH!u=T2j8u*A(5eGHqdi zu$6;7rhBrK61Jt!xk=( zK4hPHK%}f=)NwJIF-8KJ`$!Fz>HR8avxV|?nhGD3p_ZA2XxW*zr^ILV9NSFDj(#Dp zrB&0J+t2!OD-_nCpx3&V5bRh{Cm{lq&RZfFNsT?BwO`mG!+f}Ymuvkh*0vFa?8rIbnhOB97SiPiQkF(NCbxn ziHoeGIiS(iZmouVy#GXW5*^S_p?n~Ba3E34kDTEWolw|bFMB-~&iD0;A8M9=wFB>! zS8t|1#=~Bm0Vv8=fyQU+HBD+tRF0P|4r0!TXx+wWr05XeZ`dyNc0Rrgbm_1x86si5 zWVT*570Dl20eg;%g2Q4&N%rA}UhSoBqUrCRF-~IJe3fv2yeX!?3iKLt$Ske3n;{nc zc`7yDJaIRV$xe;x+GpoB;`1oHWbroed$Iw37T>s*kavrd)fO6}f1F+@iX*+Bn#4n; zKD3jHDSvrnOn?w(3MmNI{E>NFoo1C5u;;f{`_R)Vp5kR0-p1m2$`+fVI}^^x=JKdG zvzjG0XGlAS+rc6mAOlbwO4HWt=S0BPnC^LG`qx~#fNB?*zg zf+w_3rq+&}e$AtD>U{XN_*BiWNz`XnB!iGXvfFx}1`+?vs?UPLGlu7YjOL_23G z10mu_3`n+m=sx$L)s5>+h@ibRtX$P$VIJpU^zDj01iAVc(#dNQ5EvZz2hZsI?P`Bg zXa6za@UZhw3qTT&%et856Y zcC$#`0+;^dFqazXLR#Py>7zdoG)J<>ubVKn|>J^z2X_9+As^*)}c6#Gf`>>|f&v zVDazDz*>o7daQm%9^so-lPu*Xw>UN0SRSYbX}HPcbR*D;2|}_DenFEU_KeQRsx9CSHx z#2N*rfc&7GyP|Rw>q*sR?=-=EY;OD%1qQoDZbolXGEh~52E_uJ40+W>Fv=6QYPhro%G8$BLq%>s7{62R@)T<8-MbTE4dF=Q z<}A>GvC%F@fRbK)7Xz#Wx$zlqwTzu;;dz~}(=AT5`%*Vh5+5bo2i8E#7c6^^go3v3 zYxVbr^$D{Dxkb8G0d5O4@F~@GzleCQb8c3KCM^8YCGzj3_77@y5;%#@x(w0^>BI*S zAUe|6mL(>SM$Gb4Y+U6gQ^o<*9@mj_O6v_(HTM9$Mcp9S_IfEs1`wbvMN`3UT7p!5 zQAI=DV*9o3PK3$9z(geR4XsaiFj(c+%5RjOH?Am~cejPRqm%;1Qa z+5UvjmZIG3TsZ)s-;Kh=-MHX9=7KBL?5`|Z4=WMu&&0+#@?9c#UB+Q*mHt^W(2N{= zMLll;Zak+oUawdBRMS;mDZUGeELK4hB-G79NeV}G*p3rvcbA~SLflR}K7hnSuG24^ zRVKP-Pq04Q*fJWil-(@{u0Hy0R*^TA3!60XT7MJYCA1w2U-Bs$HXcdrVDJQG@r*NN5yoVd*=x(4<(; z|HT{EsLwO2l~DOgd1*U2YWX0qU%0EmoXWQn=djyU%z~r|)dr} zQhbnnPF_@77d*zBXTZ=%LY|M`jJ%g+4%Pdaapgd?tbt$uBtFo)0C}JLFvZ!JeuvWK zrz)}_MgY(1HT?Ge-&cqew?W&UEdfbS46Ns|`;#k;Xib1<^X}&>1fzcuL&&~A?>&Cuw{QT4o3{f-SOsQD|xPy0g=ukYVy(O z2XOdHRWNbfScBmt3QUFx>$$NB{E3hN_uIVcBqaywC4=wXxc!nebrrhIc({%2=O(|i z=FcK0b75WqB)5rgBmWK84K7_feV@^ieJdI`gdhbAxht7OlevjUL;{iw?%|r%p~|$R zIE28d{U!pdLZ_1oS_LAEk2JB zE~?+5*F0G@tsdJ7$j>&w+>`43jjpjk?5PoZhW_>jCgU-t$_#K$MIKB zdHDs*f|QoWf3j0KE&VY6K`AZGhpn%Mrn6K3L?u1E5Ke9KFJ^#r1?6={u)A@{J=?DHMi{oA z>8uWH1oT9YD?|4-&ra_HdmSiHWFWH6+Xu+_l{ zbCbwmQKYcUCkTPQ9-0Z!OA?NOdC;dykR@_BEmG)g5oeLI3XN+n)LJ@cB9N|$QZnB4 zX^>liRNo63u;=sn-c{r~PD<-v?Ez|?B1rD{9D@S0+|#X4LogPFmgu@KK0U0uDO{mL!tR=?HIan69W^<(p<>s1 zLQkpuGJA9kzVthL%-MRG4owZW3gXFC^r7XU2 zp3(QbgqL zjlV9RD<7kt5?HTykvh<9p8I3#viPH z0{qa96S_6oecH^WaufU?=L6orvJ+Ycmej5->XY_ zBgdUUe7=CJWSZcT@Vx&%;ezR2D{JZp`mf<-^xZDqTU0NzlFfkfcf{(V)j0dNT-;79 zVQybhWdh5L*j57TD<;ZkN@WQ@h1Iy_Qhgk1*c=ja7I-kwL3$$N#sX_aJw9ek=8{aM0 zW5~!QSrf@vZf8?%aJD%_rvo@-^K2o2mf=G+>k$L+69k1#xHNtE6o($DkxB^K;YcNd z?|+6CEp6(>$;yvBDQ$4Z{14rD6+>7RFda5MD0eeZ0>!U0kXDWw3i&SA8z=KPXpjMC zyi7xtm6gMA+LMq$UK-^}Z&7RCc_pIa?}Wwdg|AjJ&I8)#SIPIi>^!n@FJ-zs0jx$c zfPG9skC_AJ&T4e+iFMhkP~4aK&m!rKp#26p!Uygbk~eCO@UbB1NuM(zmLD-Z*Bw{A{E$zdEk}hkhD^=-QV)OeS?;epCmrbl*of>@Q4Y5 zn*MvIo#kVFcpx@+RiO(3{l_Mqe8#g*C+Z`osL9JT z>tiY8x-k7VpxEDi5^sasy&Ub!m66~jSAZ*&wx@TCv}vjK+^{J>^K~LtQT&vjlcM9>$NKQh$C%B}+sM52b%9L_D4+z?Nt!C$Mp8@z5%g{?;jD&6pf!NZMUZ9jr{Zb_J_mIt+P6eUWHoKk<; ztFHOQ6~C{Kr*q{L;ItuJjT*HIDi3H!rQ|JY_0?{4wNHeS$Yi{bPieP9K%z}{?g5$| zCPqa0uKuwU=N6!k5rm3C!CDMaYEU5efm2o11^J5yATN!}o9BFqZCkRj)ATZ(N~FA> zZIA3XaQg+%g9m_>T;Z#s@@ESnFE#cJrGa_bHc)3KRg6i~BB^Z=6N!@#MW zZ7&ykZ^@tOe#~r_Q^9sQIp=01t=s_RzSoTHqLfl)k@RN`Tf6gw`ZbGfMgxN)b?nJa zYwaq%LR5~3dfK7jqwQ1MkvjzfMc|!VV<)RQG6h>RdX%7wG*du3&&S%%!PrE^G=WBT zU#Z7#(zS0}gEh4{8I3mAn^;g@109LJsJ45_v;q064hn3>h~OqILqKmAseU!&FCT>T zV_XEMN0Xu}X(Fk7c%-JYM|!-T9 zjMd~H0yUJ`DW@qx^`P`8*-iEv38j{z6jPo^bB(?pn(wxWPyicU?dKchn)JkoL?v$b zY_vBkoC{tw&j*XLr;^@N+WV@0wLWO^0ECZQn3y&xd*)b=)Y*l=pOS*1a>ceBvm<=v z93U81P$0+b^THfKP`yAg4IOl1x~6LgHmjA|HM(|%9;Zh;J57$tr$5DC!o{;sM$V~; zN1fWoaes^2g)5?XS8kA&8N*27BF1Fiz!#yfvktFh81r^Oe77i56B zM|h^IhTcos`)O^WOA4EE5$LuiS4Fw=MM&!suc~v^)}FG9537cHmN#xoJv9d>) zgj34@i*7#UoLU>}J5m%n{l`yxO`Qlw~x8=IGp0^9Rk z@WGk+HD+jrX?M3@{A%b5ApZcr%z^UCuOMyw(p0}!q)2K0E70+};W%pLbFs=e=}gp& zpl0l&-0?azyA6aF&IBtuFCBAJ`VjuK4pzd(O#|EOB2UJ%Q{r}y>aV>5s8ks$IK@tV zZhqd;q`M-0`*ezZ+@ov|eokC|<8#Pw>rv=Jj1ge_PXIeOH@_FWTr)vXy+qSO7hSHe z?;40TT|*J(M%7@VG)UP#;nA;*1>1Qx*zWT^*XxBs zcLYEJE4=|cZznH?P9;a1mO^>i{ED3q+zINDH)cGx-0>=;W@A09^d|7UacPfXN>C5K zE~6hRWG~rmBw9+az|Lvg9N&@frwDN~;Uz=0g#6j?vv#*Pb&I(&3_Nr>cwl=^@W{3j zdjHUS2%X0HF4cps1|N~z#9LZj17*R>*@muHji;V*1o%k3YE)kqK~S@>x)hDSqH`45 zm|o>UdlANRm+D#cwMq|KHYek&^(cwduKwc)r=}+oVNd<#Xkvceefr7tto$+QK0%G> z(tJ~O|JG=de)^xpdv#vxB(GJ(O+jb4pi|PQn?P*5ZiVs6Q7E@#yWlEN^nY&`sdh!= zT5YkXQ=yX&%{O(xcu)0uq0AK#PzHdN{uPvl$`6s>|2yOr=3j2=!N1SkzgMk+Qh%DE z`MmgIu!8ij-b@MVF}H$Oj!7Fb&0aOtN0$g0E5AE!z409hcf#LFJi*_AwXXJL^qriy z3mBc8$~I|+9E_jsCeqr)5qF~%rbF`)dqX`a^I{U&n45CbQ;_O<|M!6(Sn-Mys23mW zhw7ZuDF~{MOVYuD_@QeAYRS(uQjy7Qxa2fWTI4+AkYq_Gt&(2%NxOoNzxqX{=PgQ|BJ0F#@e|-iWho#0uSB`&2{Kfvwm!Z>?6f zs<(@@>K(|RKLDvgujb*EFb{%dys{-;j~hb313PFZse1lHkELZZ0#8zaj&aclK4f>O zhy5wzLFKx0A+bo(@HlNO{}}Mlg=y4L-XI8yqJ2d%VlP`8} z5OK|KzDoV&dY=#w1l6afwUL!zdFN;lN!7V&BC*uKkDPpVpN{IpQVW`*qtFNwjh?nj zkyFu_GeCs%X~b32$6}fH;}1>gR8&7*C9p52yzLvAERF8VGdXz_?i|FAcp&|g*{Dv!n{YQ1@~76W_I(ytdoW@PFFX;f=nS7N z^H{ywsl8X|{o+Kl6n0axt9=kTumPRPIq&{DE{rbb_>V-4Gt1~MI(pzxqQG(hR z(@fE2`I^olSQ8!`Inhjwtk+#ehWjY~VFX^e9lNZh5!txh9oe!IIHrS5-MaHLNtQ&&B3ub~9dlQ_KY^(Cr zPa!p~HJk$Z;E^w0M$-8Kl&0UOs?ZYNr|*YsNKga$2opg~Q#3m}KS=4#l`&xDx2CDJ zyBpz5cw32j*mdAT{0-`Gv-hI5^5XNr3Op)>n=z8k6wrG_3(9Ousuge6T~_q8Qdz9l zU*dNk;RYlXSDZ5w`yMb8N1oLEWfY$g zAeJsmqLWvhR!2wD+z7M-*r=~+YC(bId6g@T+G%QEi1gQp_vWwk>$nY{dA95L@X274 z&IK8v^V)16aWid z0Uq2pZT<1z_sT{u z_4rOu?egsC+m(onN@ue|_`^O%|?+Bb_~cT-}tTep1<(`3Cy;}FRt zP2r9X+;G|HIQYD3U)+;|zJuGEP2Owwr?5mX9}QjbaRq?7C;JB@^bqbNu!6Cr#FXEWi|J3yW0 zUx{GtJ>)VcF9qoF(#ye>9Wt4E*80+WLVI7VG)`@1X$bwep^~POoHcvB97uWizmS$0 z--LKMPH)h~#|?)%_n_Wjs%JL(PEf4|=qm)3qV&J%*iKI$6_-puO3Y}rqPaz*BrfXr z8DV-cZfO-SpM3h6ybGefo$2n5?o?FWC!dXVwYdMLD{#cQC0M?`7CQtl#FzT9J$JK zLmXJ?_279EJwifPBW+m*<%Nq)b*jhQ0$#aY+GCo{k4`1&bTS<=B&dUT1^LaUBXZjV z8i7lBR|IwjrI*T72w%e4Ow^0wGsugo(?U zo#-V`TK?!?kiUJ#5DPx~P^eRXnKn*R*Z&|l8uSlNhFWq>T6zr$Y6hphWFOg?@|=0# zdr7zwzGmWg#tFxJEBamz9spKyd6NHsTFc~nCogVUysVz)`-Ck9ke^!&dC7M@X+n>W z%_eORc1&*Puk`~YK~OV5l@jm&&^0oWLMj$gpU5*K#7{f@B;U-)c*%L`b)VBnP*IZK zXuOHtSMjV{Z!G$OF*bfC+)w5~ei4)F4kX}<-Ot;YjANp}XN zLyZV3l{jTn(nwv!TcO!!AX;ftxial}6P_Bb9gW81fAB=8hhLw*ew&_7_f%93D?A>& z=xpEY@k+5&6Y*2un7N;NZ%E4T2)DKl1a5f-XlZxUyw5c%EL_dC-S#$qn~ZkICKdQgj-usvu-usd+kZAUh^&vJ9!+`P&3*(JJHn@Mj$Aoek;f8 zf2+km9(^g{1VW!0l^M`;w8l$nl)ipatLJmo=ygO_Bz;vZwU(X^i%C3|7Au~EQ}wBl zeI>#_X&L2ZFF^j%MTD-^{w=D4I_VtnQTwO4%f0L7lu+>C6tI#EBkYqg{dy7PC3hH3 zCeyN;a?>9mb-tgXJ6!%CB&EtVfQAHh;#|;aq+21o$i8IZd6U6P(>vjf>LNVluNRq` zq)z{rZ)wn+?xh$xEjk;#Ft@T@qyR^mKE8Ya^!$4vo@A=4tRsT?iIq?0rHPvk0F z_s!IaA_tW~?barPVcoK?v0>dB>@;Z#f<+-fi6%EUI&FV|?H1hk zk89DvS77$VdtuF{RbcsHQ01v`hm1|@TCmNy0x&M)$8R{Mj=mJz?nJ3#qJ*3(M$z25 zd8YNg)ZGGN846-krHKA$sx7TFR!k)k)%cWEQT@a7Heyt;k2=r0%yDSp1lB4-S>twQ;)wFJd|E!tXYmxR&ot^Q1{h#BZdTZ(m7x| z8fOf!(rucnHFODB{^4%SN@zaj~}^`ds9+=ryH?9 zUiJ6atNrMn5Cqlf(-CR6zH1OxhKK73>?41RP{o+nWi(@Iea zsw*V|`{66kf>*zdyRLo}2c0nqZ{GVEj-K&T95?^mNMe4Xuq-a4YTQX~QWAmqtgEb} z6@U2o={WGD0g$We5e7q^S^_48kyj|;yZ2i#V7mYc%jv|EBdiAS%FU~A?M*Ktub?P0 zo^H1sced*i%Eac98Y?nD5vMVF9moFlOjVKM0gx~{xEe$AHf1zyE_ZfQCB|+Zykv-; z+<*99c1?Z#+$q6eMf1Q5=Xz#~wB`dS|24>4O2K^NkJSl$8X~EyAlIi>M@lz^lMz8x zr(Onf*>Edl7ulEeph2x%1W1K$)y3Kqj)bR?@L`jo9+KJVteIg>_m0+|O6nG04xX2O zDzUTya@f(gYIEbJfr6v@q9}L12x(p4bMZ2Mma3tim44aezOep1N>F=S6#wRMC6;xL zPB<~uZqwFQe}p!EN=fPM16*vBV77jgUINrEx z9j2Z>6irQ?Sp8iy>XykERyql1{^~afGwM$#kjeh2x>G>6&#DB*I9`2hAzHiM!;sxO z(G_Ti%4DeR3TnQUQMb7c!^RB6;O+AuWX`%V#ORJ}t zid7P@eHIek6bzbcSVZmB@k>d4rImao17z(pI%nO!;71HpYHi2w%?+eAi?!=Nsn)#C zw$u61NgSKxf4NC3dz=yt7P=HX-@9Nh<*jQWtunqQ49|K9C``{MQ>mK=u*4rqJh(qt ziTgBGh6MGHYe2-$mGBxUTTe^r!h`#Pm0aaYReWQ@k8m^;IZvw=YkVTzCUVl0o3_N^qY!Nrawxb zSprH`Y9vl>;H9pbmnO_!2k!sJb*LWq9lDe@RE*$|6ms+o;=!xF#9q_JqHK_il0k(CQNb6fktD z61HwuvHXL2R7rc{%wPT%av-mp%f%{FNsuLucV2iBb$A8^)m_-Ux*dbI4`B7@ZRl)~ zFlzUF6qHj$zXBqjvLZv46x3|#!m1@5*mH-ou-CyyM%XqT6-!zbEbW97oGPA1kcs4b zO{yXlH7b^8H7;Sl5&UK)P|cP~kyPxQzZ@k>i-XndwGW=+4KTqNQ5vvjT-oQ&Gi^Qz@M z?(pY_G@EiU*x3Ga9V{(d1Lfg2GhLRP?61x}5PV#EmFRMELKzq(2&xTuVdPHFGlUg7E}!zj9@_!VYL+v z?Q2mrQo)#A%TQ1RbcKO+-!n8Ut-x8o{0j<0r5bVWroj?qwF3+8JRRE~#PIn`%@{hm z1mAqH1*0dGVEE2?k*j*@Ljg|`IFqnpV;i=7&k$;wgwuW=`Qp(gOMzk0>-{*l(WGFp zSk|l4#C?)B)o& z(vxmyC#PdPFdD4%uYgpX?l9f`!tDqwnh&(srRYkxBqV3G2-KaNs;}%uEit?sF(Rnp zIZwDI&SVeS6)zMR#Y304F{it2d!3G3*dWzUehA@XZu7iAgp<7yd%gHnGB-W2x_i;{ zsXeD#mS?Ier9ZD43%292;M;m%h0SwgeNd>8)JNXxJ143C&)#*w$yJr#bKje?GuyMN zB!Q4X2nihm0V&b~ilIjVK|rJnC>=#a1f>2|6a+=7p*N9^(vi>!=?Uq*?Plw=_wN1s z-Fx4gH+^PHHf63q%Yo!cO^WHcNYkWH)jyg#gwJs7x zTU@yZ9UfEe3G%yTQ=Sx51z%OwzMGq>=X7!`v&xLh#8#aq04BYZ^oIZw_+s*Z@!E3_ zqHg#q>~u&i;x@2!j)mou{W#~cJ5k?P(O(fa0L}YD|2IxiUj)i7b5`f^EQ&^l;6 z>5ZtRh+?WUjqF8s%hv2~UDoZw5Jg=RdNDmEmD?FRImgibDDTUK?{;OFtjCH0JIOG< z*rxNT8r{CAUK&t_`=5D#)6YqzoYNBzD2MgauA^QBsKq3?_R@7Pr)@R2L5nfeC9@~M z*Ak0keT?8LT+o=lMwzKeVQemB-lo#DS75U^)u$vpv$YpihTfR~=Tx^3m<(96WFh|k z=PR-2i2;}u3@aCMEdRuhi?6u{!Kx|=EL)ly@zi5yVZ?zUyzskO_}0YX7`AIAqVb4a z7lrao#$fRvRxWQwtj)yo&tuqQ^h6wf(y20(pX70MFt(R1KI%qv9tqbA-WGAv$wk8E3 z_P?T}^%d$|%(WoLAoa1TYr0(`x6u0Xe$Epr1!wA$T^c57lZqPANQ>-z91^wHCSh;_P_uDAOJ~3K~x5)Iqu9DtHnCsPMXj@3CPGB z+7wNoncSAJrB^XUCDf@tm(}%J?o$_3dA+U4X;nyH68mdndJ3XjiJ0UmUAue{K79LC zL_6AGng;sx-3sFlJ`#QUZ-r289pZ@ut~vb#9DIHl)%|@~HlJhVJcY&Qkb3xwJEv~h%Rb=0DNlc;h zttWXb^Ikhe#LJHI)7BwPMD%ztOenG83;I&o6T(glKi6Vd|$<{Vj znkk$4vBum3^sj1K`G|5*$%{z@`Yj!>L6xE;0xA$N7-F2m(xm(vaw<=%uHq-w(DXtf z`kgZ_WkzkA!)|NEUvIwwtJi#iA73#ZmHlH7EP<#ML!`|{xFUe+K!3dT++2L}@0IxN z-yVa%q6*iZbu5m&qEf=hIbX!UmW;tUzxXZw_{(!K?dy+l^i{i}HPVh~%my<}FyRAi zKNf$o4m00gf|Gx85hk4e6Bvf6XtU(L)&J8L7=cdZ8qQEAV6=Xj`JjNjQqgi0wUX%& z-joLCddTHbmY!$sqWp}@M+pw-rN}&0vaJ$4*wXS*(~ZMcO;zE=6<-y)|8ss$v_{gK zTC-sRKrsMCRQ(J*cx0#d<{W5#a2weCv_c|!6&rg#_>QGkLdRjQqhmZdEzAeI&r2n( zGXtOw*a`L#B>!4$6M7x-lmkdYR`_-*b`ZB8*@x_utx-`_cZQjZIrs9Omuh3zbgv|C z$(BhTK=+xv-&RfS!YG-Ck^-Crru{~D>$scqU{Z1F_0Kl`kUxd=kJxLARfsC~8tid^ zy6MqOF|76N1oEJI9zjX@Q4Kf~5Lnt8g&_onR)uA5sLc~-irHw26X;BSRgq+=NlHl) z_>p&!aySW8+3+y~?du!y!0&HIWAh9gf6lI`=o3L}v<)rMR@gMIO~-QZxF3tZj$+6C zDv_`fvRD7vsiXo``*Z)Wm z3FJzHI>6FJ!OG0ZtN;z_lip|NJ3r}Rb&9og5n7h3ojj=INzFjh#oig4K|f>On_yEO z1#9c1n1SJ!1yp>8?`=?P6a!Scl27SuhP5t-`TUPF_9m(Z!9M+$7hAEW=!Fox_H#^CJ(Qnksbuw`y&EEWf63??Zx`Ait( z@gxw)O(bGA*31@YUfYaO2iAg{F+`exFQ2Huk1n_pufBIRhVNg2HOmA(esnc<7;yk5 z{^VSkfeM5xt6>BJib_gv$;pqE-cLnjnv$|0B}l#O1!>~0P8tJwSd|5|*VXGt($b}x zcdAb5U_xL9=Tb)y9-ZU`)vj>GORr0pGqf+8!hF1X#y|DO=@L zmqP>(D|-9s0F`fl1o*x`FZy_zpVr}RB772f=!~Mra5|D*$Uf;!RBr|Qn0o=Ed!%y< zo@>2;?p7Bo*&v<+=zfyne2VgPQzJ=YK_1iE?x9rcre$ri!?4AxVSG3pZ1%<>i7j>* z0{*Qr5L>Gv=5i}+figh#*hnw~t9^UIf_}46BJgg=+R39#2Srr46p$WK%1Q<1wRFH| z7}%<+0;bH_RKf4|)@Dq4@P2$Y^IzEil)6`v^;rZ1 zqKDwbb1s%>o0tHS*`aBmJMCI2lrNfoX~`XWz@pBEaJwb*bR7aL=cAMgyomSrjonI)uMlx+f4u!)XpME5B>6`HpYa1rL# z5~PCF6dEe`=M>#|{!Fm8l_`Bh?KZHFxv!*gnKcVWb81l(uQ(o}@|>c_$pENhCW7yI zR?)}P{Im{l<+|^TZ8YtL%Bk~69y~; zRFBbG%&pOC(Az74EeAL`boeY+y2X zH5OrLZt`Kuzm{X`zWZX;^5v)*z8Je6Rgaa+ZA|-DJ8ro1RkspfdU-Y2OLsmxd7Y(R zN5xd?JHAy1AUos$%FHVM@8rEQNoSS4Wuu?UCjhW@U1}A5)?QsM?=>Js)i9La?Tu5lnEFBc&JfMPAd@zP%u%ht2_(T&u36d*D>%y{;Nc>P5NX|8$9| zq{$V)Qr^}%GiTy~2mTLspZOTJdkq9Ege(0pD|FaMFxZ?yBuuQFmB4`EeuQe3Y-&eT zV9lx+md}c!V$D#Tb^f)e?6(z&mg=u}{v6vKwHgV_mIYHg*PMhSzJIbzJD~ZAeu{Eh zRi3HZhV(L$2QwpT?nw^KhZ?m~R<14%?UoGVYl}(HO6dj?;5(L4cFpGLEp(k{TPf{p z&(Kr^jntx%LSt?2pBr;tg7MX(Ky-cSTMaizklLLEGF<_wJa{-n)n%pc!*hiB#?@de zQ}ahf!}hR`%EFhLXC|}lCLs2HvInby-RG&I*OmcL_x(92%wJTCy$?CRr-|^H;GrKB zb-2@s>_GNNZzPdxAAN60W957v6vNoy8xB!2$H(g?7fT|7IXpTn2=u3&7`Y)RH zN&lvK^3`uTU6Tr-3|ZZ-0j!r^DTP)k>G$(`09DGTz^ob5aL=D_L85*+w%@x3wS5iv z0u=7%uo42R7AMeu+W>@3vZ4lB+kn-JqG+539J<$un0We+B`+#f;J3%(cs{~&}>T=+H}pi+U97`k6k`=WVies81VC@PXF zrI8)T9_h_K{1%8oU8g!KbS~w*B+O8Cb@!-;m9lwHU%D@3esUtx$q_t(Xrl!5e=bvo`vxT z9FHHJeI62Y^Jp-s044CvoSC@y>2tBeA=OC4O{|!2U}XGYJpRlh2oDB^?baW`YEy~` z5a1;+x@LYGzL~rPM~puW2Oo0^8U_xM)KU_RYd}uk&RosGm$HXS)=lQG$zjz0IK2S4 zX7cqNzAu^LcoSs{uH93^Na(=ZxME^0ckIW4J=e!T>WiZyK=8W3a z*8zdzKxPI&J>m|Ka!@gi=4Ey=orP$nWR7kLjrLD=NN;@SlfZW`z0fLsoI>YNK0dlp zkfDUFyItu%koQB=g3cVCdi_)nf^a;hT^_AGK-mIYmIcZH6+ojo1`(sd5eIdtkQg&H zx26Nk6j^;%>LOhgUXUum3;JhuC8RUkOEmGC+c`)8RF3ny!8BYm@|6@67d)+ zE2}YX{{t}gTL;RjeyYMJP^d&j6##Z$&=Zs*0BygDh#qy(?RS*ep3wn3AJ9Bud&1$!i75RK*X-p7Zp13?f*#eu91-5vAnqXB}?c2jW zr3(BIkEwtm%rr3OgrpT9l*Ie`NJ$b;o;!)j$ZM*&P-RuRR$$^z*xY*ok#|+|qf({5 z)5mc_D(|SFaj`@HpB#Yt5xk>y>x=z>Nw2C-c=dRZUGjd%j@iCAH2J?0dDW>08q|}`6);zTUE0BQ^wQ21c&0vM z!_z^P{pFV50>+Hz6unT1p-swBl;r;15C-lvNM#k^HMfJ5hC0)XX-~rVB9#MG4BQ>| z_}>*h9BaP|M)Z|r|G<8bUeqF5IzW{&r$rRe(0nwnx7qcN0Y;x9W>sBi-?abqM&MNR z9aZ!=**X>lPP<8fq2z_iRF_9U*L_!;=sQwzn3h;v*VTE;$CoXzIa*+g2dGWvj_5G@ zx#u=DTh#fpmy$_2A5&?V+`4!L%Cr~J>uXiy_vyt}$xDg=paQe$Epn-u^3W9>=$SP!AS}NjN79kStoX=>km}BN7D`Eo?&~=Es+}eU00~TOlM9 zP#NM(;6r9%)r1N7;ibQj;M57zC-c?0=QK-R=qp=bJbm z;E}}iHFrp@_Rci(#dE;cr&7|`<8LWmYBKgN%(f(;6~+MY`iF{IN(MkZ^<{w6-3l~0 zU+mrFbId;$BxX=-qy5sp(;MIYbnu-|E_Rr#{R)Cp;zl4~M7ze9 zOsOD}E^3fno~n-m#I!%n zrjSBarOt+#lHX$2e1AmL}34nYp1k*&?a^Tj(qKk~ic^~gOm4j0QzVqh$K*LwjiWq-nI1)_qoP>SGNI{LnZ{I#B|ztQ zrokb~cTFUsxb%V_V(bqMRMq=n+cr94ZIsNaiiLE667L9O)-_WxMEKEKX=0^mgH`(x z_t`RRpJ=lXS=5Tl%^HM>JX#RXDkvEMQ<#m&g%@D_i9ggNSq?RoimR)x~fE)c+>rOT;i7MBm##UUeL`_ABvpVNh16KEoF+%}MeKOd;8Y2Qr z3f$8o6_DBsbM_Y%M@XRB8{VG{`CwuT-jQL@QVGiWZl{Cq(lrlUzJ2Beslh{FS6$gD zGnsGw8f@vuDaTT=6nV;uX-3N>V2RmoS6+Jygs*S~yceK~>OruND=fK6^U!?B#$fk( z4q%~TmMZs2`%Q25gnJ{a8GTUtD@N_WhxW!Gjyn5$nL(=0?n)wH^b8tK3s& z2sAG>u;j+sIG2Yp$n+s1INF$r1T$b*7JLRnkbZ`Z3d6u!o6A1rrIdNJjNyS;8-DWo z+Xz(GYMw2pSU(fkr>-@qhQK&cDLlPVB247ol9NChGZOTyA5 zQ>yb4;YhXS_f(tA#<)Z>rG;B6t8q-~dqd^yb=(sgJ9W zC{MFro(+qEyQtjME`XhU_RJgZ4}BjzoLW3o%(-D}=fHgB;?&2%HV1%cr;2Gt#{*!I zWIm?|p93B`zTlxL0JZN9u)mvGQJ?WdiaZIL&uMfGl83+8M*F1wdK=&K9PlxP*PCmO zLSg;x;I1upf9io_tCW?gkC${%EnOksOs{XC;x!EDO z5CeScRLDN@1wf!QkC(L6XM`{Y11?xCO=7atxq794+iLY?Kkto_rssQ|13tR*peNsC zc|mHa)$DpA2>c5*x~`0tU%1^w;85`DD+(Qk6o5K-EbK!I=aJGp z@;cT{rJod+3rYKc+=XSDt%Igy$R1ztrH0Y%=qYCd_Ct+7`ES2_zI(tp#f9icWX%sqzK@F`a zwkl1AKH&?kZzt+w7 zb^N%=P=6}p0-ebO_KWR`fLK$+HPC%sWavM5062NKN}&Jgz7_P$NX9p>D-TtBk@htF z;Cr73KJut;UrufrEf7yW`|Lh10nC?o&t8Da zM;`~iR{`Do_-Byw=thN6R3KGMqkYl-yp4~$sMF^qFE}Ooud1s%&rw^$+QTeE{1`Wk*PnJcIioQRZP<#wtR0s@4JqDo-BX=0(UunQGsQ9mZI zPH-%TN`oi8}Fj3p`S~F?+65V7w?$K@q*H4-hPU&l%qc2M_onG1*YjX zl4GW)5>TG1;8@WSLkD?obyMO9UOQ%jRA>C{tZOmUy073B&{G{`QI!K$i!5g8skL;= zxZKh?eoquV98vPv1i&i$7JW=H9diLCk{gxEN+fAqLNi~!2yES4_Xs}nyWrze^HZ}8 zXGEU?Yrj8vT&&bfV2LRpso`=fTcEow&{h1% z602X!jjRY;y!aW&i<+(VR*}>y{~k!NN(HbyMM{!rUwZnIWlGXRr*|m*drp5tg~F2z zM&1g44?C5^nVO=0q!pl~7g5c%xFwRTQm1&gren$$s-y7wqPf$t;>;i6EMHg_LOmHY zamBpZh}t&B*VN;|z5`)!mEY<#0&fIYNf1Ezl+>xuB2Z`PJXn?6>PV4B!7w{vgKJ7H z@~Spgm{@$tB^dXeqm>GkyKN=uDl7Umpmag1!-MLQ=qupg5DK8ipY$lnp>#Td;+mCz z&@Ty@msx8(jy2JQK0ge8CeXh!1k)5SII$2ISQm+)gIJ{u0j_J_2&7i>X&4*(c6Z-T zofwa~Ky`DVtzs=pb(M6IlQXYTf>jcviV=r*!gje2$q7<@V-!bf9@*Xu@U>(z%(qi1 zrl`7}s_gSMX3d4soCJZq@)9ZInXjb))NwxrADLgemBy!eWHb6elJghQXg_SpMLS)10)$u7oXkSF=nkE%p%4-m4`jr5sZPs!Bh83p#>Xivep2 zSmG2m>zykI`$kWmhA74>1&F5N9V}}xK2=Cc{LUBQYIKp9oOOYB+uuEk3E3XCOwK! z)Iwz3E*Sab)7ZPZ1~>K_h;40wfW~?q92po3yk5FAxjh7#K97ir& zivy_eiV@&+l0yNT0rM=5c1?99iTIg`$9EWxAK(2C#aHTS(n^|Y%C)E?eX9T9cvR~{ zKGXyPj!3Ew?kfc8s!MrD{T&He*TPh|#W@m!BbwldSr+?)h2vsnRoFo1|LGH$Exv*kjKFg4Nx& zjGQ1fco2BiH6=it;qCwcAOJ~3K~&9SzIzkcqW9fn2+U9}ZJ}m1o(za4*-cbT0I$3- z?;&1*Y9IIuP}O+OCYm6}*NtRNN#3+jqkYhRyp8f|DZjSV)>AZJ#jb;{FL|9U`?T0Y zlKsLB5|m1hsYy@Fa?7v)Z;~ETSOiF?fbkV>7vbL-yoRo$vhB)OPS04NR{?5ocu-ec zeK9*eEUPsoz!I99lquLKA($>qasZ?g+;>2wggp*lsro8%eTJI3UIz2M;pb#1Tf1>J zZ>JpFOFiZ0R;pqpM+D&Mi++OZXMY33=fmZ7LBuVAJICz@^R4$FC8D^asHAd337jtX znRxT)gK^=t=cBT!Qm!c;YsZrhJcZde{|y(1s*>PP=g2lfV6m;Vp=7cEWB6NZBTjqm zKd5Qw?}BOGG@J~Lawov z!d415NRZl{YCO3B6j44A^;5Aeo6?ds@i8EjKNM`V-2xUVSAL4W*&$k$LEclMclzi;w ze}I+xJhW2j$6Oowc2wY$g*Shbly}%`7U)%g+8Z9!Iq_|=%E}C5DVfovbf=TbNI9BH z)hG!%9S%+hn3AWF=#WUxluGTLzUr*HNvlcV=J5f#*DPyQ1=Q;Cu~*cXxN!!9$SX5Q4jFaF^f&=WyN6 zde=HXpg-;2($!VFgj97{!X7PU&}&qiX%hKz5St9$uu!vc0jGS zQ4jKMabKFhJUEAHr4{h$eos~VUJ&;rr>4B$9)~xb)G+-yu0%-^13PsCs!+8?s_Xpj z@`_TKDj_Jss%z=5a^r5fqHfxevQhEZT9>Na^bMI39|3k=QJV*%Nb;XDc`gpVSLk?i z`Lcjttefzg?7~B!m~Oa|SM(^Y)J3Id zN8L*3#hHKUXKjBGb?Sp-mOcjKWM;vrcoTFLuBtz9Cbu8NwnL>KwARxTMJ^^>nZ6qk zT(^u*@8CpSes5A`?yqRsC5wna91JLtI6#NvR;5zO})-2FBO?8>l;?f@yoLbJw z%7VA5nDwA&I%)2WAn>dygo-C^X)cE-Q65_vMNZaF2JH|r#7C*jq*m3oBp@>U)?tV! zh+mhY0p`OF$eA$r`xxE`i)IWWa@iKvz%7g zYqLDI#$X?vVW>c4rN?n+9~b3@k1+DF(4PJw6@eGjuF&Tt@NicT;vFE zX`FViw7U6Dp-=rH&nfF3aaM3K0cqoHjTssK5pFl1a@g#!ZL=%(s4{%jr$NQu^xAzJ z`k2WdFw>0mj~0w(s7w_lRbSyG$P5 z73$Ck0MzftRx$?5uJ%jl|Mv_2^89gZaVmxUv-)Rn)es-E8ervzI$!-x4RbxA*DJ>a z{WZdZ!YwhR>NvMwwYbXQ>Im zkn5J&dPUlG=>FA`QygbrEYSNo)?t1;;Q=%3O%?*N8!cuyIyZxUq~Yr}9LIdb%RpYoAJxPT{^t3-TTUVDln~X@rIT(tfAj6a8cixeQ*_a z7SVtW|I%P2h;tMS5^c0Y5SXn;I~2TQ*4EpaK zpF#@XuQ^K|iH3JDfBh`wCmlwORD(L9dx!PyJDZ}nWwp{7!o-%xGnMaVQ5_xfCrXU% zxQrB_;(`^*YNWR6_hInf0QAN#v_B%62WuFPk0b?vM2qiDsJ|pEayd^||F#@im(Icw zF?6(#QnRtr`O2$MrRsrjz!_3i^LZ9;!KsdKL(THbb+Kw&?Ma0h65w@zK-Zxce9?(Y z0j(bJ&uG2F>PvjrjqJCMJ7w)kSYwJ+l0GHHc7#?&od~Rq@%{(}HJ0P645ul-6lJh> z5Vv6ttRu*&f~66i-cn&m&GHS2rq*^L3K1!_1)usr*Cu0@eOz8(v73aZ=aEE=)6K?i z)zo^K%bj!;9mh+bS9-p&kMkk^W9AeJuE;JU8^|7oioZ`C%v=1%m&`kiyYMBd|y?NNO3)e2Ya|(0Me(kodzQ z`B%8|wEa*UI(-Gb^S~Vg70f!}d(PIdFbCGG@~2_8$tNc)d9`mi>M`>md4iVUIaX09 zm;zRIlQ94)c?sgAcSreufBd^w_)o3`+__G-=Sh*+d~i?XWJ`v}VwL?AMsD?ic6O3r zo8eo^IE_BjVUm#h#K$s|VW9!n&6lU?kU27VpUgEW|s(F#}=)KM&UjoP$N+$mDfAM4Ox0Kz=sh{z- z{-gKV75Nq<@@HC7)lfpZBrk&PD7Ujo>LjZEMg=?G z^__CeZ#`F4mwpHfc6vZ1n+7a2?PfstnkcGDHAex=gtg`SeG%d*D&!;oetyx>9-X!T)3~41E6x@8D?AubEB#oELR5_NzTJ)>Orxl*R zp)Qvvw(sF~E&@WwBrirg9%c_YZ@R30Ap6c+cfAfzMtRiUGCI8e8c(A1sl!Hunw!VV z3&hR7tPH*QK*Z8%Dt!?{5Ak{KafB(Sxl=gxe_6z5M;eTo72X_n$%QN*gO(2BP&9%Km8(W)9pVKH+Lv|9jzSx7VWQZ8~)k zSQKBUU2Hs$;qHfrlzPW?rwWt(X#7gZbr22t!_J=sr^A({ohif4pa>FgOijH43tB7_L7bI{r@AsBDTNS#|AWaUa1c zwkBqDx6aDrN67W5e67N4Fl%N5D{Ya0ir@;KAtiDhWm?*}A!99|ZOnE}!m4`trB%J# z*!C@$qx<=Ii{C?`i<G>V zN4=a#GXL{(cXyb{tIs;Rb@mH|0+I{_zVkCxv2rsSHGf+?uSk8U>}*VS7?Ml~SjN7d zSJ6d3=>r+bx}k%8dtOiB*}p(9UX|VIi;~_Mk5TH+%tP;McZ>7f+wO3@M(-AfRBG|s zG6@NsX5cwZDc}iu>z=)zladj{?ZiwOhHX~#@3;f#yYqtsay_sn?azAo=0u2Vv#U)i zz+y&esb#Zptf-w0=NdnsjxDLwr~b@aw(2{g)jc0!$(wMY`P?whbKa&LqsBiDBQqXX zQ9cU4o-Wfv}Xt4f+^|W_C-cG(dFgCSMt7mCnuq2U}e;n$;s6D z{prt=r1u&CUSv7|h-BODusAD4&YXR9SHc7}?%ss=vznn0^R8cxaD9%S{%frOa;J$& zAFH`P<^J@npaCbs{T2G2z+j{R%3_gv{@KYUAn3dHb32sVau8YZ+qbyEqN}~mw8IdD zCl}5Og8lV~O;uMWhsol`(drmWAzCxZWXHGcv&7$(6!`OUe zd#2-XoX?28an2LS?>K1yQ@YvtHU+F@|y6L=FfsC)^SU5)rvb z%d*n%LOR7^9Nbf@`_+dNwohkP-&-^Rq|M|pWLJ~v)*8H&73Zvb_!nR#)7k*=y`|VM z;=50Qeb)eF{1ry~C%J>Sxe@EL=?x#!x}p&cU)kl^mCuG&Rehck`qHM93)+(%*>=;1 zKn^K=@|mZXo(M$0cmK23IVPTItKR$a9a*#0W66ZuVik1#G~#&C$$ev=ap8sbkh#lm zm;6m6R#PAGlR)WK<}Ck8Rb~Fe&zL@Gf9_LOhAYn4bozz6d>YGn=t@eb(V{zuf9d9RZ%t%!oQ}$J1;?+^-=uLH3N7&QYi|PmX`_rUFY}f8v z!JOZPbJ8fSTxmwSRc~F}r^|~Oxtoj%MqLqYqZsH)`WpWS>h8G1PMX~Zq#LiUKy4&v zqI9Z16L(g8B5H4fyx~t^%K|=?{ibR~@pg_+3-S)7Y8<6xwTm4YKM-H;Q+Kb1PpH=k z9fp7@hQBNe0-}8WdO;;9v?IH5a&B=AjatvKT%=Zirz9Cj?D-QP(%pp%s}?Q8M!eYa z-TPi(-F3|G;VPiQq#72Uwqjn|-b5TAlY^frV{*^Op@>;EC6VoP-eld_K#91cW?lRe z-uv3q2}jfU0)o@QSGQ{$V+KPMbvHpTwS7%5gM?NS zdPiqZb_Z*kX~QFn3)3ml$ZCuusTni>Eb57tZonDID6`z!*`Tbh&qBS zo@HbcXjW;<@KwxL9=4aoD7)NeEzel)q^Ttgv}qa;17V=panoff*lTL8Z&d$#B1~R1bULkDUIhF8u#S{MYQd!)L zPc77Fr=IQK*>AdhzqGWwWtyOwIFEW^*&1mQtZCjR--9Wj*hYPd&>w9%Q4B**LLW-W*T&|@T2S(X)Al$SWT<=2ECCU4n^TfQtHTYuW7d0SnkM-7s z><%7PJxVOfh?1&Y^{$;F2L$hqC*M^#3Za~}h8kss=z;>%NF-&Fm4|@sg96Fy~2t6+|xJ#V%*)80fw)eVU8%S@A1C4h!B>3U-oB;QD zt^D%Wv5GlyN^h5eu<^Kyx6oHaFPt0k6*;<&D_ecbYeq+;hnXZlFqTd~%mWwZKfKdP z?}Z;&5}ec{^IhWM9oi6mgdb7d(H^ecb&;PmHH@8gkrk1^MFn=dpsU}w|gD=jtHoA z^p1glibBt+4DIcwGjePWUi1F2uvu-RgMx6`{Z{b4ivfezBLArvtR9#KeW(Np8^7Av zxcYFcaM}-ewWxjFP*qh{CE+7(ShAu;BxB!BqPUkC@=2h=JK4)BpE~q}-p|m<7ikf< zO)D*NmQuxt*La?(W+wB#iQ{3!8+@lKUOu1w(QsBL?R3XFL?-l)(AD>v7qf_LF{c-b ziSk^H0k8KneLO-dE021dv<73pd0KO&N$=dR!59!0E=)zTP$@o_)$C?|!AlH8H$lNbgBOaE7WMI<0{IY33jr zh+!2b`GPDs&qclpYVrSmJNP~9!hG{vgKV&R)h$!=2Z5`X=knzA25lE?JxWD7TJy+~ z&78P~GR*A$K^Hl@kbc1A5w7Bf zVrtI2tTe4!B?*5&V^sOAe7%NhBttq&x~j65>)t|B9~yQ{wSn;2Yjt*U>4Tap9{$i1 zeHN)fGAT!^AQJiZ19D=Z8A%VHdtcuElIxn~DL$@9QYwq!n3`s`yoUIANT9gDv{)*U06yVGu(^}L)!VkFt~XK{|yF9={Mi>HhQ6h4?LQjNceP{ z=yfSv=9EY;M^w0om)U+}+a5Djp&U`^zajoh9Uu4>*4J73_2FI5%9eTt-)!@>NY%^) zI-|~5#2SJ3Z@Jeg1yJj$ksDKi)`q^}8B=`7cf=~WD!MUB{5sz|@L>_FM=7ED8WgoI zA3JK1+3Cr^88}m(A~GK_Tg zmd_hXZ?ue%;`1>7k4a0eJfzEJ3@~mmJdN3{6ZDD4JHiZiZDmS*n1F$7`I~C+e5@3J zpegYFDL9x7Fh#z3yaq<+)fdb|;LS847lI&r6=1lA6n^SCZ)|dUjB= z`o&Ffi5kHY0n_~nqkA3rJLi}GsO`GIfBY~vac^ben6uExVdC->mgyotXZ5IA+Hy9g zAdY&y7LXIXrK*&O#iN?)zpoV;RdlyMZxfba=&xvB{%~TPL|*!0h4>rg%MYBK%--!cGT&gNT371eFTG#4>9+bMCCTGbQnKmv0Ypaod z^fs4{&pLY3EKqk&$afY{a99mtjO>1NKhE>o3FJL@?K1uMBhq6lNJ93RGh~I?(Q0vn zyt4ZO6~YYGrGi}^*-;g3w4n>4SZwf5@*y*%zI z(p|-g1=+V9-uyDVabwk$9sf34&EYW13P zxy$7oqj0c7{>BP*Hy5AxNm5yqJ_C+!ZrvckvfDrU(}vSIKJSog)gv~!{A?sBvO+zZ z(l7PKt)%aJirJPjtJl&w(01ltgTwC~FE)WPd0tW8sB0=hX2!j<#h%d@gQuZLSP_Cy zViPR(i z1eNp^_DA_tZ>HbB{v*MARU{1#X`L}Qrql;fzM!7;OyD%0Od+pv+lNcI1Nf~FY3i5M zXVZScys@?-hx2bYD}2O8(J#rspe1|zE?He{TQx}@cEjOz`r^Q1au8lnu}9vgzxC}O z%2UtD-3i<&7~LKWlj*+==*>V`g{0H<2DlH;Py8q4pq|)xj=?sF?K* z`GDqqkWYT@WI>%MqRIlHa zyE>^m*<$xCHGpkEbVgP?ISVQhIq3BlHqV-25U@oA>k+)qhuQ?^`?Gm4!BotcsMD1* z978`1!?S>Oe8r7J@nL|O)fr{x7C~#hXlRE`Uj$!fPS3g_^W@X$frH{I%jQ@JpQcTB z=EV0J#*?-Lgidb<`k+E%Q$5ccgsY6(UX0T;`_@|oKcIz&gJ)yw2N=@c2I}lIa}MW~ zxYLM^uR`X#?L4rEBqB=sb_LI}*`_in2bC6RBfD#B#FaRv6t>rZ4jN!b?-hOgS31wX$B80k9 zQ7YHO%{S+lSZuqgX3dtjkxK{U3T>+elqy!{hw%%VJoYvMxupJwN+$AFlDeOXuB2;E z1?BwB!kN_^;2Q1EdhY$)S=sJ2sA5`i2=F8;SEP45dP5{q^xrWi`Zrx-g@Z#-;Eh(a z`t&(44c0l7CrDV||BL^J(MhB;p<3^Ehf2)XZ^%+&pPrvl(ntx+QO1BnwtH^Gf&g98 zZe~UP8}(&@(1Hs;46R&Ka{+SkGrt$n%v-84*e5)cR`o@bPnuB8>Cgo$h}uTY1)C8? z;}KlCMna~Z<3p_X(bbN>qp-HQ6|DJ3nyZM1y z-`6`G?I$Uq5n_-zBk`zst>EE@Ui22>zW&A8v{RV-C_A%D;>267VRZsX(j}@pfYZg? zKe2-3+FmL>Wz%c>cNibUx!G+HY|83NbQZ!MQ$2og18ocK`NxoQ_>v1zS^TbnS}5Q9 zZ!Iu!2;c8BZ@^RD4>L9^0~_CUNiRr?>}36f6ZWVWXX8cjKNpy}qTSRX*DZU(TOB5A zHl?DX&bMQsWvy(Lym72DTS=d<-0AyiOaJB22Y3G?hng;mkW4B4)r-$To%uitnH3dj zYIbC(1tV!=r8t&-X2p++2nniU_;y`M%xj>*E#AA&Q|8Edx$PJ5Yeh*QtSxkA!yEl~ zPQmRcABhNgv*vO}@O1$Hvow##HYUpbCTt#rMA43w_DT*#^VYQd!Na!Kqj+3?Yn)zp<<-Jsp=CR@xLI+ z{0MzFUJQA2e6m1U%>4VA==f3V`GR-~ZM9@>1qTjN+guv)!{6kI)oIz9Ic`KG8TXVO z2R2P;i1N=Bf4e#+tuuyJ3f1i->lX3I`YJC^F9r5v2q0d=lJV+)HClQtjQ`&}?>zJY z8AGj4z$k=!n-6p!Ua0D%(r>7s%TK(JC(Ei}e)6hJI`TNwLW-DEuF4j^Bb1(~j}9V2 zD8ravBJ~R_(lm%Z&qAMiKQke6T$eb01#2nv3n6+oyQGUfheuVs`NBVST_X*)wweZF z90_0f{Jh9{%zW9ds4QS1`M2&tk79_C^cA2a_$r|IJ`-g$US6sc`{xt^#jqVPx2p49 zh#-Z`ZA!>*tAa>r`Daf#db$=M4uEIG@*BUOpsyj(sdKIeIzrzACj6qa`Z`rM9Lloa z#sOq3BIedQEDQh8tUVi8bwi$X$90o>XFGj7u>eLvRxi7_9JE2x;niSs6QKe@`D@{6 zwgJN*;+K*S-7Ds&ECk@Q z(fdGJSbxVx-gRt*>{{YvkgDrx_CL#!=`a^Z7n4`UK}Jr&2Cas4=`pBe?nw^szlhSu zaqp}}Ms2vLQ__}HTSV%03x}Yqu68U{l{j_R62H9tkDQ>MlzQzAGTVic#(!IwSIHh4 z$vHWuYt=NOCv;2`xb!YDNcLjpaic44>IVb(;3!vhW*U82%X^+Mv#A9`$Er@1?VNl` z>Uwuh9eRiT(8jZ~>whik&6yx}KGz@4c#p+p(#pr;wbG0yt!>>}8vfE8%P<}M!27FI zc`eX|ZUqzt?a0%aw1Z{Pg~Nn5JmK#v>)?a1aGMWEA``n?z z;lqi-Xd&ucTzJ~7sRP_1g;w15%9yqO>C4E}`af#v{}08VD(3(4(cmdC_P=J1R{1%% zc%AJzr^q@KYWO$@R^U*`M&VSfEbGGVi_r@P;V^(jVxZH_cZJb669#?WLgxqxSU~nN z2#fXvkxzb=t-MUSJvi)yPdnUGUD45GPHp9*zOqo%eJz1`4VSB;yN;3#aPH#RVwP zmHI3^tYiu^&{a|ISUXSiWG~~u++f&=IkYlbSRJlX-%E?lr>Jzp=~^=^($)JX>PII# zc-IYwXs?Z?y17fa$%HBb(dqqF9oQ|p5O!01$fStio^>-S{1=^pnav391@kPtUdoU6 z(t#JxF0I0H@?kU1K#2#+%V~VbuCFt?RsJ^@9%8j#hy#!3{(__$YLZ`R-oZQn>0_$# zi^`ChvWeT%p2xLF`$n#90@6F4;qpjQyCYtg884Z-D!HK|y%H;CX>+IH2}rHD$8bZvTwk6aVHpcu$p9n}miikI24bBK(zHnCcCYw#b#cNsB3q zgxXK_?uw}~#f%-M*t$a(!-M&=ODRIk{>gXh$9j*7@X3_zMf$?pUv{%|qUi_9V;hB^ z+|_uZNIYe!u-cG|ZjM}P06N_;3%x0;$!=}M(~{hsUg;!`D&|?a0kK9CaSvfDzkLm9q)4QpM_fFWobBE4^65Of& zEh7=kd8~jgGiRzoyKK)6CseczTMr^O3+Z{Vrs+&}^MmgqQS9*=I!yw89JDw*6tplS zf&#IM-s|$*vbR2=``hUzi)%#Q=aNde^9{0g?gi1HuRu&<71*J{_%GOU)#P*6^(#sv*nb`XnJe#T@jgzMU+7EFnB62SC1iS>MMW#aaIKf9S_S;bdfdFQ1~rGcRpPqhKY( z1IOst)y;)Ma4XVG;7@uw{8pg;Q!aA62dN)|w9pf6zFsS4e>Erxs(+?MBmmr)z{B1U z`N%RBUDSVTD!n!sKc2val{tl}MSy0k!V|i%%@S(-%aRJ?B+{hsr1>Gq+Q^|_Vm}GK zzYeA7{LbS_e$2abb}<;PpC*r7y|XzS`K)a!|L0{xh%#wiU?lZt)4MLuP`uGOV-}^}ST5wl7bw7QZH>L5 zwhOFUnPr|I3)yKN^)DxW$a!h%sYfgczG=Ob?t@$J)cZ?JDg*49g;3=wTKtRusqk*~ce*y3=y7~?4se-=kRC~MIl<0U%rd=l=;FTr%wWa;1PpQ}XZ_;v`agF6e&}RMPD}HA$OewjQsIL98!F(`x+v*-#>&b5)mjhj1ghRX+@AZ z;#`Ebg2IPfj2I1{6=mAFLO}!2lf_0T{Iqb9nxUm8#w(@xJ+jXKI+N)Xc;Tscqsw-q z3=U5lpSS}Bm)$SAqUH;u-PaFB_DcQsTc%G4-pEM>)u=_z$W=8c&T2&UzR@wD=KV>k zQKwl^ueDSvj7<=1rL|WvwnyzaKx3iMPMXNh=zTd{!Q4_g37m`7D7*b#odQ&WRfdSj zqJRy+IPc7rq}b9U4UP63BtKD~k9^ogOp$mdlDrd5a=xY{(}#&edcZmM(fi^W!ud}Mz?vQUk4DTW z5h(Y9ZahJE()p!@?VMw^?@OW)g>6oZLSBcA9170_i)XwI7E`|*12EPeLMmD0DZlc{ zK-s}vYLCgT>j*CGIwc@@6mpm@CI*IOrV10#-`}A=ycOi!Qbb|F#9PwW{&_Z7k zviCK&PbG)snyBW00#32$(J@w`bNv3uIm_+Mb|(41a&?I}LiA5H?) zhm235z??Du`^x6;Y{)!ovMuOLgJhf8BwaJ3A-J~CMXr<0T2Mb^hf)73u7c>P``6>^ zx_r?vhG?P39q;wT;qg@61Rx4tIam83EagJbwmYWw8|9z;J~2EIowdXNslzNJaf&F- zPS$jM7BpJ)m0{lJAcz>Gpqq1*WWdc$=FYfQm{UcYodTRE+#}K-_*0&=B!wyM<((f( z9cq>ZSou9;lIsoBO%%B%Ul$N07Rw*2*F28Cj^Z3~{vU+#BP^f@4OAggsFoD?T$ubGwgMH55Q-r(r zQtF-F92_!ixlvZXR|$+A0Mke;BTnciZf*WOnTx1k@q9BHVV-Kb4B+CVyEqN)fTQ8o zO4t*$&xq!&WY_gMr)E&fT?2?UeXY-yhbKdm^U-!XV0)tE)tK`Xk0BJfGdabrYT%ZM zR7KX1NtE?1SjmRL@Va!2tQt$!|AyRsI0Z%OkMKYutYNAfW6V)d0(#^$N`_icQ%H~^Tr*g66#tRZl8ez*aJ_sv4u=ZflDji7*sqO#1&(r(wc zJ+IOm`~m=9&!0stTIp`9^51T)6WSz|--15UXZ(NZQwq;X9sE#gO0z^k+e4OH<@Yo| z_;^<+8-+|kC5ccGA5h4JU{eFL8@dMN{cZFq8oO?EQ0sZ{^C7$MYNGl4E zevm_{!}hlI23SrG6c~B};m=yICYJ+9)iu2D@`wd1D2=FkeUEkD2Sz+zBpU%dP#l8W zeZcbg2ue**LsQpkb#UJbujK-F=VABd=O#!`RWW0BJW^e!(3NYzgU~hvp;0}ph@@k8 z6vkr&5X-z246Oz=`eBj^96Ci?1wpu#8uR013q@x6&fV-cM!iV*@X3AKJA_RCp0Wsa z>w2lUB_++c!g(%CLG>g9r~*OeisE-hzEnppbapnCHeS0WoAerihygMytxG;~`DzZ) zL9GGT4-ctr0b7h5T0ONEkVe&|&o1@Ct)(_3lxeZ-;GUrPw5VZf- zXnGG!f*9cnF~_rrR)}#_2+VB>I6#el5k9gdv_lX`^gzmbB_@#tc`YS=7tAt|3|RlT z4iwbnGp*Z__OaI`{isUMtG7V2Or}czlT5cg2S?b2Vb3|W-t80Nr6%krp_esPv8LDk zccU<9y>1KO)ANfKF50#d4M~Wj0=5R#j;G%scckJQAR-6blWHSKFo6#*;*0|cI)KbP z1GC{Y+V2|bedl~6({o7hFG1-mhvBz&2-W3ydCh(|%k;8r-*gBDr2?}kk_!S7%FEhuB+@UgvtVDmZGAw=ERNB;}m3v4H1_) zDf8?=xm)we%V-TYP=Ea_@F3_RdO)Ztg0hV5s|m(4Z+a(TX@N#3W)8@Jx|`2{?uU)( zM#FiB>Xd?jzo)5*4z2Av09B0JrXu5|jU`AV!~MXLE5G z$R079^Ilnh_P>YmQpz|xpk+wPk29$8xvezpLw}5C!ygg|D0Mz`Ly4h6@lf{p`1KuX zO=H=SfN~C+yqVf%nn`6C$~K9>(bq;tg$2RKQSEN-t5gR2PCVUWke5) z*cH_HRBVDXF1zKA=kZO`6Xgy*A3}_YgV!%`dSxZHw*4CFuiH4vjScYCK zU?^_YEqN#=B2_As44Gi5LiyBs+kWoryX}RVgJ7$|NN%mT#lhe9NnVfcj>Xn)w`FKN zZvRe1WqcGdKgy5=(xI3O``&6F(nt!W$I^2JcOO5-*!;ie@)?n;Mh3v$G|g2&nIe&) zv7R|zf>ae)dlVQg=&X)kxOp86vnx)lY7)&>`xyNWTx*!;f@FF^DbK-vvIf`?1bxMl zP{6`)>y}9M7rx9+?0>Jdgi<71#SY*!w`n-BZqKh{OeNQqEON(Z+H52$c51}@SKys_ zXoM+pzX>ckCWuU|Qkp7w$DZcE9uz8oli>F}L^tNBPV933*EX%xBjdMuuYJTAkd&SC z@<+OFQ2^o9wCDR_YyXqAflf8dx!m7+w`M^39ImXBAFI8n_MoMibVuE*?KO%d_adw@ z%#8M|xU4WdV}poMP%q%#XW5TAh{desfF>e}%0nPGMuGN_0T){HTJ`*E+(6au*cvsR zCbf=n2r~JIi&n|_TsaJbL*?cle!(4LYGi7c-UAFV=aw#Bw>gCmf;b~J>#r9*PxGM^s_?Ne7EF(nXcKfeNc9CpXbXU>q?F7>Vvn>Q*W42d*5y9f*)Ulq1+CVGii{}rkZQM(ss zNTDXCFE%Ee$2C`QKt3_$Xd7ubyDC80y2RVrg!gu4D`YlZbK@_BMz>%5 zq!z7)t%fzAN(2X{L)9HxdI%HXHbMV@qN3`%y_G40nn^J~-!ZTLx|`bLU;UD3IxbA% zbFI2VM<)#20Nnl+IqGwuV+KJlPS*EXJ)!oBO_RJ(-=@?7<+_k@I$)%B6U>~=tVVdJ z6P~{OUiLciTL5&U;;wCIKP%)3eVg%L6s*lJSs9{BIK~4e#@H7R6)7ja4#!J!B)giZ z+eMAmsCwoHLaMzrKB)oqVUS^Q@I-NFafQ=?%J6J5(RC2{)adgZFE4#hRcLkeRhQ)C zYY``UhCHFRUqyOpcnC{Da{XM_;Lu5W<|kmBLB0g8Zvy8~A|zHY@^FL({x& z^|ak&h3}D$-KdOc$dUUr*U68e2K@`b7u2wdSV|-Eeq;3XhSO@!eyi}D#Uznl6<)G6 zPhGKQ=;pY|FFMB_nGhO2xio0hoT8_XO4s@t93KP(AoJkhsRy16N$MWQGz+vaKS{2V zdd28w*|8EbfE3NTExKxYlR~%|r^`e4=$1C9XdRxwwMcSp2md^Eet6>k*{!^oeSgKm zc|F&dcZ|=*N)Szj{_{^5$zJR6O{8P+d;YPixLYjKbTP7oyniJSr4@P0@5}Tge)|2L z2;o8~SWutm!FKZ(qGeufXT3(g00ngrfAhxX!p%dD;3(XIo(95Z?j-T8N4F*m_{r#; zl3|V6{>JnVf7S7yPzn;E;Z5oYS!O`xEOK?At%zvld{`9!36$zAsJ1cFaHXnSgUY+- z;1eP(`$O^I^E6>M4R&m&I?q6SqJ`GmM zH%D2K);E*=IL;h(gu)$wUoGg$`a;RGN&~wwS)d-glt2Gz>!{d**jAR${8|!5rb4U* z%>bPNL#wv{2!~yW)&!p>-^j;`wWd~wqD=3zd4A{`2Kgg0$7M||ID4mR5v9P^O^* zGuI3nKqn`e{}n042VF||o;`e_eb$PKMfUxTX(R69#U&7TN!V%xM<}eu9(+=l>j{ARl&N;CsH^0kX%bD}e>QKp~wc_*7O)h2s z;NLY>e^lCuoXx1|{QQ*%FCnOvzA$<8KK16fF zbzr4SK--ooOeL?YDcBf!Ml}l%%^J7;7AC#rl3@S|tUabL|D>1CtF%Dd=9JR1^-=x| zQhQU2%&O!s8hIu1lo9sJ?h=C`i9v`eVb{vK3bRo1d0L#YAJqhlC$C8~Ogtog000f_ zW0keZ(`M+cK~C^@6SnyQ_7rk1t@sS_d+&O#-22e@2pu5Kgm8+@`vX?7gv0&Ml=?dS zp-PTH_)oY#SW_IpGb5usLaO?-UI_5p{(2YxUZ?Ne4a-3ubq|Bx!r4FPp7Spn=H^T0 z=Tgav$;>vRyfPxAA6Ibe^~--PFQ~OQ5~dOjeF0ih@yOtHa#pM?fL8`DySll!{*RIE#S5Y-1HRus+N!A8!2No;AKd2N;5vXuUI3bZrv>rt zffNVv4-CI|fBd3<9PU!I<%+cZF$`hphK3Qm&!nZ3 z7QtS`;fxV!V|q4I(ezc_8P&8g%SC?P6Lu8HQQq}1wY6~BFRCsovXPBjete{h9cYff z#o>#}9p-w4-8ycfDMEvLlO2|^lNjPH6jwmTmEWF-9q1gYj#05=Up?La9~Ynq-$?&s zrvjrcHkbaKl(_zVyBlxSc&+Dv6>AW4$`5Wb}c0ug|{suJa@fP=fEifNk~J^y=$T9$vBqR9_$H&T4uoM&oa&1WY!Y!M28e z(l))`2+;WecmvxqpR99o-~sFgEPM53;6ADb*@o`S7!=J4wCb0{4UKAyV8j}Q_V9CS z_qN=$8}-6&Qz|r{7mEHPl|ONuU3u0X;jc@Xw9`XPiMaYKbC{6p~7_2@Otv%99EURrHL!5UfaQKvfx#aJm-srw#aDrO?Aied!s!nt$L! zWXr3C;ipCn<&OrOp5T5fNte(`4OPYkd9NoGpU7i4ey zdaVKG*n|~F`lK?vi7bJdQVkLNlTP0l3hU{jh7$;GxNNq34?7@zg(5`_V?Ft8nrL$& z^0HYE`bonn0^acRR@;}r-ct-T1+!6AE6n6_98^u({XBvk&MdR79?XMitw+x)s3g6T z`voZ2mNX>b(}L=GijmAMdYy22nnk0*d^!p!XP+R^# zny$hj$}iZ$(x7yQfRrrV-Mw^ocO%^?Afa@3!_qC?BHf+R-JNg!z4!iu`^|Un#5pr( z4C3M7gM!I8N-X zrMl4v7J_XZL8c-HsD`tE!k|J`nPv&*FaP{jo@I~-Txkf-R>{bPw=a|H(GOHaXRigy z1J~n33-UajXlaz$RyrbWVl|{(`Z!NEI{hFXT1yAEps}p>y*z|e-m*wF zV->m+x)Z(r41qNA?q3e>!8rlGuTyLzN~-0; ze%`V!cFRnBLvnkqEhaD4Si@+D+Jg9=t!XaW>g|-o7CTwvuJx@w5A7)-C$Hf44A=y3 zhRyI`rE=)J`<|zDINJbCu-ZYpqipEJ0zgPHEa9}=M)nF3fx>3lBad50((-xJ zbUG;+*PxMc>DU95;F7ufq_8!g%QV&*HUX~EqIE6do6S<%a`=<80*k(tS8NK>wtQN@ z;AM~5JNe^t5rTyVjZ(-NbZEPa*ZS1$-kzU5kt{%dbO)=F5R{6Vd;oZA3lhiE3cy46 z=+w&e#!M&~xH3B|C5X0aiRhUtW2@%#I|QN-!uihu%^GNSiX&X@G zVu3$}i%v`QJ#yB^=*fc27fReSz-UCFCi@iPKcdM%JoZ3pVi(9sDr z6c1{6IUMdgFpt<~AZKS?MRz{`q;@R3fxyvUXxq-!KP@JxljJ712{(>iDwyE97pqwd zb9F-_-INzz(f1f_S;Pm#$-b5JosD+trlFhToHdL@07U{u_~=3=885w2;6ODg3C(4c zHPSfjA2wg_*CqG84EwEhV7=KtP{y-b4`Wn$SRrW4(aH!L>5X6dv;Ite;$0;=9=OVO zkgKroPe=1ZH+(+in3TRxL`K(|%jf?xhcrWXUe*Vr-s6_>uql%Uy5CC2e2c_34pv^y z$OtwHQfR?@6uSQ0!unno(+UI|1>d$91vjC%*v@M{CnN8XlHPa@3Vw}$u6-z@^E3;-*ufZ9Rv+O&@5Qt>{unTd^hw$3S2feEm=!uV&>BMQRZ_wt_=F32$Zd$dkLt`e%taxC zXFf>Sp%e2j;+rUd**xN{X4F>=U&WK@p{zW;BvvQ6FY#>XN>r4z=9xRk$l?U7C>s?{ zX5rau7VP`1BA5wDF>=A>NV(G@6}x)s4S*Ebz}6Hmce z+~y)ePYc7dcyi(B;?Nhticd@V1ckN=+L;D$U#v5$plXJm-Dr$x`R!D2%(OO)q1c=~ zGTfcN;MpkHm^LVk#&i<#KLx>E=?eExKjho?#M?qoh6_TrLUdXzW<&iAK5-#Lx@bOw z4tV~A@8d`O52o?tbY~)KB|pM#8BSY=ZSo?HZYc>IJPTap#kEQYOwA%^>oAD`Z4D7R zU%bCxUK^jhdp+hYIY?%}Xs9}Z4a4z-wQ_md&oA1ppy7=F7}S$x3YjsDIW*Q{oQo8d zFWIwiHokcs_3H3&QU@pxk?>T2aFUw?i?>X5e5LNQj1Mz;v-vf76zUtwhL=+U>ZW@a zQ4t$E5>?DLV296aplrCS-WI1GOfkP>a?O}E0b{Cz^KNv@%a)-UNTIXXD&&t2EQ!C4 zqg%pPoiBz?NfAecXtqa~riERSf1HTh*~)S3`BgTPWugq*5GpJ_W5%ehM-$+9#|j0~ z7*T^_4r*-panlbb(b=PU2F4yG@~OvphZljF+jp^wTZTsL04^DLf1M~$EA&GpKbi5J zYn&VGe)_#w^pI~s-I3LuXum!whjntw)ORE-e>S%*uz9{p(e(lRCXPgLyKNq@evgMJ zPRUJGU5ej`z?^+HgTApMP46#cuLrKNW)dd|A(iNtTw=?!;veL}@AtO)zkruBtmN?~4w%Q+Dz8 zV2l7w#~>lhryBqh+*Rd#;^FT54B~_18>c{Xo;GvBV@7y@H znEI_|0}`6LIC*3k<-+E~_F|J410b=`*MPQ?c^8fkg4)5VhadGH(GH~iNh|g> z(LcV!y-ok9d!apk6%c<->CqH|#{efKLIIkD`{BzfZb=U1LvcA4hR(>%3khS{t)ZT9 zEf;+CmLGrr>|YVh;>jg@XuT8R-bhIcR={Zxo`bgOM1NP>%++a%Cc)qRet6$8mxVDb0F;@EbYD-HS<*0XN}DR<(0nD zUxoF)8IiYka6ZolND9ha8etnhcxbq{f4Ez9L>XH>gPcI}J~z+IsPFKQS7f!8BI?)< zSgv0X7J>+jUWOajun6xcS;>xv`u~=$-3J`{(#A5H6e)TE7k-o5yJ3&ffDRI_B>)$5`nP=GC`3 zl-i@L{jWnT<;+!S+shDH$AB|@{>vMUOdhGeim4Am{_UhWFQ=xPait}*WyqH$QO;>p z1#+s35o*>yO$Xl9$5h0Xl+;Lur$KW=@P#!-VechUO(xzCuR-lUf*aw70r|3*5)l+2 zX9ZTZuJQMy_yTK-mGJv(q48EUKF(m}F9Ek9S6sh4bK=(JtQ3$`l67F#>+vObtcWr( zbHBv}e(lEV!IbTZK4rEU|900;H5t&EvD#;T9!TR zdN#)2u&X5SjkmH|?|@xN?<}DirFyhwP>6w7KbsHWT_rh^@ZDK99WjEK-VSl2b9mSK z)EoKZH8Y**s}3VfV`{=&2=gD_Qa*E=C?E%T>lt1BqF#MJz}52;Wk^*ZjQ9|sRb`q( zDirv%H+6L~EOtccZ!WC1Kv1-hf{k6rLPYtCL$+UMVbGW%)n9d_0EoWJLag`Pl!nY1 z>!DJkQN$n|uh6>{Rh-!Q1-i{7eYA=OEiY?#U1`**jcKJ(5+HTAzJ29kvZo9j%`Sfb zgE@lDUCA>8UxJ;!ko`uWV!2A6km-4!gx+W=Bd>be<0vY0s3Tn1-PQ?bI(xqJlE)_$ zJ}c9u%&&3v+g%?PgJ&5=rHoV=7Q5OleR*QEz&CS(N>`$N&W@O7ep89$kH5AWvM)Wh zEA1R0L|6opn-m#T80k?lC^7oeqvWC%p?8_94etfC3F$+vh{`HJY4cK!#Wt3xmEOWL z1to(&I)+Tp8>#L}wq@Vm z)*I=8wb)7(6otlt4p1*5N2Bd4iW$7T+;~ONDg1qB2g!{(3<=4*Dl+}&JmbdXNYTYE;*oJ~#ub(I9Q(m{tN|Uz2^qUF6-A$D>%~;>A5q5@Q zqaGT%a{+2Xyc&WN%2N)oN<}A$<+R^z_WCmb&sQ-L$w~Hy{#daV!;EEdxHal?YBR#% zqK`+#(1<}En(fh2jNEt&oIiu8d#vvSO1sR!$QoQ&i?OqLE?4=il)t+5y@|IwouL)D zpNVJMj`cTa1ArInb^A3}2zbV4`<6yIw8RJ#3Y+`y2ZIMXLEBO#%(T-;S>cH%8sE3$ zldhe9n{%bEo62kdQ5Q{iYU2{4pV7D37jLN!dQmc>B`p+jE-TIzW_=C#aNHlfOvVDv zN0Tg~VWY}oeattIq1hOzi`B{YJxnd zNR|384c9vfy^a`;SW?Q|)?~VjWD^-Qme%zXUFyZW`r=|-@8$K=*FFjX?$bV>zmHOy zTQ6u%R)t!^o^dP(ak#63cU{cye@x|SN)J9LaL^{u*;2`Bug>Th2}Xf~D?U@PR93id zmgz}o{H()N{dk;nBV@EFmWfJA1d}!HZKQRyJ;`QX<0x*Z-n0?fZN#~`Tz_b%=|srG?`DW zw`PT%7d74tO|ZwsV@P-r2}x z;EmFE@7lzq2D3-*`Z(YmA`QmKMd0yI_BIJQ>e&M1$z2K+>tf*TlRL zmzFTcjIp31i?#eW115GqE2Zl)XT5oe+!_4E<~;#++qE7FL1|nv8Jevq6+i;G{l-9Y z-m^@%fZknw-6cRc8G}UqNR4Mu8PO0hLqc~dXtMkls3+*{KL1tJRpi*(@k&t#+564kb7Qo${o}yRYW= z0A=4j#C#6n!kb87S` zg?ak-PwG-vXbQNi_Rm+Cbs*jnxSLtg^%L*F{cFzT{4 zU-JjKxTrqvv)sxryCk~)YHuJKc=M+E&^|ffhM-t#1Ht?Z!5)ep5_O9+6EIs0OA51) zLA;L}M5gkQQa0-1)1$08ZzUIN36*}L&@=kBCoK71VIN|m1b&VRpiw#A(!rILy3zdbGZ^MS&3xZ{PU+Lgd z4OTMAlJ*Rrx!I@Xf0UcxxPJ1g+9T*ZO;~5iu~V;-3FRE9>XukYs&f24#}hjSP)8{3 z%bT?x=Tc>^h#nIunJNTh%NSY7;HL>?aPTBeOogQ$#VB~=ubgr;SiuzMb`5$QA)g94 z&D=iBk~Euw6#^H8htcZ}KJSiv%8&N*=-E_ION1F;e z^lSIN@u(2n`*6hWq&F^1J{KK#Q6bgokgPGW=TE7(2oD3wMh%Hq%{iZeJFYwd=QtRp zq2uMRsN!P;%rnpxwNusZ?DwUK>kNsmps@Yh1SFVaE zLmIojF(1e3TgoXPlfsn^2l&WRdH*9@tb)KWv(9+Nt zLT>u5@tSa$6{^OOP9oJ;qcvUV^9D?`=+3#zFlu?fsn1kdkxOBSW1J(7pU66j)L5*^ z2m_uCn6FarJO$2vuO=iO_}R;@+sEb#9zXs#Nyx5b3Miw=UGos^<~YcCC=kH=%Ih^4 z&~4R@{n`1OclhEBe?tl5J(SwIUrT!1rHW65oWJ+;C!QSLc?e3#%M@?0+D?}AP*MJl z)cFG6BD7?qtM)ahg+{&mM9{3 zea!pDyM4VYrGj<$CFv{X6hlnmc2uDO@`qLdK+{9lOH|=+%eYFe*Nm#AZ-KuF;%fz6 zJ=}Avn;~!s?Cp;qS5cv&lc6TVnAPl~Ja3PUOxr%^4*hg~YrkBlt@OUGbi@-1w~yVJ zF^-&PRL0|El%Tk=8XrBmJq2 zoUQ8~VcQgb{7d3rgCleBF{WRn>mGDkCmL{MGlhi}J-$nBtO*8& z4=^#*v@vVY^B!0?Q|}1ONp=GZ{D8OKY5_>jykFaw?^T70BZ_!V^Rtz*N`P<0M+ zbRdr%Zfy$0T0>$S{{LP8F1PEbJ8V}6uQwS49R99qR6+A{XTfLR=*lh|>CQ_}!x8wb z|F~)adI$%>n<@5kCfiOo7wv&rk8?kxf4_Fyu`R*@_oQDWu!|p|iNktJNtKp8D)-Cg zOn6V1=S=?oz%KZXQn&G>YUN^x=pB(Ft-Dfg5W0Cis5aqV$@q;O-I^B3tUOSn`fv!= z|Mk)I>t(*c#a7hHWs#q$g+*%jPcxFY=O5Y+S6f7s1LU&P9oK_%r)gt*4DQA&uJSMw z6B?{ZLzh{kerN?^S#5(@+LfxYg{m5z2T)%~YIxbAZJlKr59fHz&%7WInA+`OmXF=1 z;yG=0g?M8JmV`taWUh4|2Ca9oI#Wg`AlpGsi;7L0irW{DZ4$iTOTq*Bu7-dy&2^-= ztDFufjz@magLMu3H*@PkLmjo(XL#R=FojKwm)AIw)%MM6JC<0k&0X^-_`|Jou`!_vNU3T z03JjFxZbX-+IlD&OUrDHh zN#M1uNTvQcUFzGtdfHu`&5U5@Z?z)T3i-%mStFa!hSTtP+QXt(yhmM~8(^okNy|wN zN~X%5@4?%3QMiWCA#aS5pr7<+7M|#A*2jXo>$_H11*Ae9R@EzkzD4+T|DPvPuc!7I zNa}^i!q+8ST({k5(&nefiND^P7Wh?%Y(y!`k~F0Ib84OMfeKB)d;Y7=cr~b}&4R)< z2x|uM6KAGDP`S8X3|urcCi=dSpuo=;=H`iQdil7q&M<0eH#rBE3Va3OGr9-}2NKAE%gnsB+(pM3mp<0$|33ink5TMwnuxW>q^tzLDo2&0eZ zVC+YRHEoF~r-lv-DK2A>r&OG#6W4L}^1+3KJQ}SG{zq3V->?LGQbDNbIn*0m{^Q!S zO4iGW-p8f%RJTlIOD?&aM#bc1#Pv4(T(HJtH!T&Hz>vAF2lZ(|_RunoUEo7ToD zb9&WfAQ1UnHFe{olJy7ktEfrWrH!={4%BCx`Cw=VG1e9LNf z-VYhTLXB+@0S2iKTX;Z=Qay-oJ@w}oj=DAy#2438^_9Z6pU!R?`H$vThHen4dD zL10Z_@?(&dJoc2dcy^Y;ro-@GlWF4VLv&1WADD;3Spb}w`oI@z>Fp$B3T`S>nR7QC zPXr4|gn2rx-b$4oavAlj1a^s{&I4X0NrA$!J~H;LAL)UCzX~VA;Dus$((yyDG=);< zzL>lKa5}T4^WWYG%?Ga?hG#X+U0l2s7~~D-G=R-ZmQejIttf*GhJ9V zV0y>d;mFd%MKLiLa%mDdI%kd@X}}D*F#bL1iR}gi!Lc&@>t`rU=Dl?(sE}3YOWuKH zb3cz(x++99Npjn!GLc1b&^1cjOs8i!2N=OlO!H^hz;XQ1e^s0Ng{M;g)|_Gx-EwRD z^~T>A-QCwb=_ie$R!n)PAZdZE&!pZ$)NM7v!#)bYTa3aY+vVeL`3$&X?B_9{+A!9! zV2HPJl6+%-gPP;M8ge4o&l093QX$v*j3Le+Fnd-ntwnb$KSw^t&z`fppf2p`Y(-=t zHC!#av(JkLA_a(IBXbU%mD3!mjUImKOYbeaLC6{Yj#~M_7GTFp7jU}0gr?3V8G0Qx zs#XI2hep~!u5sv%*nNP6v)&J}&P?UT2&mM=lt^OKf=kv3K^c?C!eYoG_l+M$wN!ON zKU}y@59x}`5-S`agW2`jx>w5bpkTvT5Z0xpBYeR2T{KToFLdbZF*svU0}M&0`E=H+ zuR5uU5TBe_nL!u>{Kg_1|18}8uaF_|=ue)7t&o>f4;+EbM7HpT2FE+AkTG}2FiXEF zA}Q6!s?B(oWeZwhYG`5odYzuw^r1QL|Mpu@SQRJ3YTc7HTFMaZZzY52*D33^ZW&p( zN?~x+_Hc9Y_BYwL(%|dq`m)V}dgW{Oq^KIH0rlhYRc1PsVn;5?l^b-N5S#~ zA3o)Fs-4P29y@BKyGWSkD3x2did9Q7`=;@f~qL1f|3U1TT3AL5Nj;$)giP?eQ^U5+9|NY z0sq(Ie#$l%jX>01Yic3Jmu`9^eAa2E_j+SZ5(_!9#sHY1O2CsOjG}#+#8p&)SZUMz zjhYTrf=mqk{)bE#tIQE}p;x>^kC6>SCDTj%l6w#<9)q^lYQ3KHCkLy{W{Kc|cRY z6HcmXJ?eHt(7vX|(Ocr?OvSIlH!5ZwbD5IQoJrSzQ%cYQNeY>0K)b1J^w&c{cW4OKz*@8aRw zZ^XkV(&{F;$j@)CUdMOwRu-PZ{a1IFR{V!O?W1=+vqCz&Jj(-6Ri+)w^df;~)tJ8Y zv4>M49M9U(>K=EU=_`Od)bz&TnGzM+{%xfG1f-i=8m9s6L6gUKIblEc;#t5qXyep8 zSILJ&F{gY&t7$d@L%JG&ee5oM+`ecggNQIBRXKT$#tNKZkDRzWnp#Fn#86ShP)Luz zvA8Jtw?1<5-kUb`{HgB(>k2!pStZDCtpue6()uJTCyu8S{jMh@es~29c`$odf?@fJ z!HQea%T&S$F!u0rjB$MI2MbaAH-7B91U*D>xz&N z9&iCAg|y(cfFMZI8fN~Jlz(O|7qa$sl`NDXs`rQ?n*rLIH>=S>+9$QE(KFsqn}M>g zzL}QvD^I|N!NgC%%8YW#@|`L7*U3-1^wLxvYH5cXum03ZS?<5;?o)ZxTaUDhD+3|k zVGP+mzS#-Z_R}vHI6628$OmB>j-WVlP>;?wMH=asEN6|)eQ~!WXFnw9DvjbaO-P$+ zV$jhFB`N$)#NsQG_VIb1T%Y^#^AkwrGlwciH9GI7&a3i8OBG}UMysB0dj`?vF~%01h2!i(kWPa;JhrcGN-&Cdj+h>T8}5r40jB)Kz!FT^+5 z8-IT?M9fr?0-D<(tsj>dzn~)@0vWlF%cUK? z>=7VjLGG~n5qhz}6|{`zi|HbGL9YHfv>H;ZS8Czj3HY(P6`^AXm!hc!Q0r4;V}@o7 zQi3dvzL}Ltm}CV{#Z|LDmdqdG$R$;%ve|BkUVbnYJ59yXM*H#c;{-)0$iB05w9pWR z1u>l=ahLiB@E4>ytq=BGpN z$z8>_)}$>uywy!sv7m|Lu%bzWcF3R#-Pa)wijQEsqxGCGdz_V88~@C`9(zr$D4^N5 zFJ>?hO)Q74WfVw{4mAtJ_qMg+pQkDo0Jr6ikDT-TFvsQ%;j-n1{7f!P&a{|gT- z9TJGbm{zh#32wgg5@_(Yu)X+rcFb+1z?LozH_SYV#a7e85OH?kIVyC5NbEftA^e@c z13>#3+?xI^++s`P>D+#~jBjbAFdzJf-%BbasL-V?sCoFKFabh?T`hQzR6>y+ z`|asyiuhb)TzO~6OA4qa-e-(7eldhlSYKbP7MSvR}-+tZRIMPgWCUl~4& z&$}IX|2by8g$cRSQ&VdKF3_&B6M)*c#B!+FtnetcxNC&ta7%fG*YrVIxYnAk$G2KZ zt5~nzfA$iVKR-1zt&={)PB@rw(Oj+W@NX69R#3t28HeA zvE@I?UwX0_@VDBQ^!zC-5wGuR|0$z};1PqLChUE?Z zrs*Mls&iJg@}%*UF8cyObL_@!zog~XLz#?AA+sXO&0SJO`;itSJJkj@+`@RoAgYl>5!@3n?Z(^r7i92 zid$f8e`ZCSXrhd@IqYQY5-jkoXyn!>^~wTCtI-|z7JsBhWiEq?C4};-E1wsg86DOD zTXicbuvesi432<7QTy|+Al_wE%5y;-W|zU}J$jI9IF^sKzGQvY@8wthzAks`0nJ5K zyW>g7(0%YlfX6AWH~~pHF_tQ@u!+P%NeZ1W_HP69Zi z{lugnU$655PBfS9DNKOvii*Cc1k6XQx1b@EGJ$eIbaR+e z*wO}0Dp`qb>ukFp-<}zOu&3d7N%hLCS_>WmzAGvsz{4((qm4mXb^VT8h(_kD<`N!{ zDZm(JE^=67ck#d})~3AuM+gDLfWHB|TT;oZmrl5Dik2=E5h3Zv@va9yJegV$o^ExL z(9Jnz6SI-!v_oEcpMDRkgLYMpvXCrjiX6jD3 zd1H5GDdta73%-a%rcXU!eV4ZQlhNhYJWEuRjFUUfHgieE>{m~$cx`6ukShyW z2D@wjglk19w7a#I{6WP!hO$v&RgEIePg|Sb7~_B!H9~`737i?OI>1P*@GuE z_T)$mBa7b|s5(zSJ|imCHz-s_Dr>*b(t270jLN+e+dyiqWI=jjcQi3oSL4ed7;3d5 zuakTz0PCZ5%*Asm_VQoEYqa_8G*1kj`=XG>Ru6r_Phm+ca>l)Dm2##P@)~|yjvEX` zX~-Pf7B24+=va5OvyGd_ql?AE$;ItO{I9{PI)U9~>d0!N{P0h`=ev3-g+*rSlv_DJ z$sO&frIM+WS_{lozoeSL^jJl=fCdSvhq}nw7okE17#d! zc)$!tqf3PPQeFa4U$}HHdXrc3BJ0#!nC9`ZDn60rcwFQuGyc+3h2MtUso{T*G6-SL zr)*0S_BdX3DxI*>;175+@ytg}zfwH^1XT3XzqBzwxNu%?{2o~^y?yS32rY_6>te}W zvw~zI7$RDz!*S`(Z@Oi7n_*8X<1}~x+<40t&RsBl#8%?^cy^)k& zZ!*XTT_}I!+sAIb+_Z<@hfM9r_t$auq`ac~HUg1jXF>?uU@Fe3Zv`h^8#9@7DUiN& zp71tWY*S9YAvfB|nCu3s>BLm)0p6~Dc%>8{1FIeT`bBk#Cl|^Yb(6N)Z&p`SG~&B- z_;UAAaZ%`*Xa5CMk=D;0k|dneG{%~dbrsi^PkcHB#g1yND%b3xxb}YP90qSg&JkMX zXfr-gMFU?hz8mpK6xy{0W&mQF7|wkGrd|le5>5I3r3dNM8-eq;6i}f8UPFW)a{_st21dqphP&g3Aq*eVh&Y0NsuFZ11%PD2O zs87S*pJaLsMhLiO+mo_kL=$hm#+1ZaTqAU;8g7(OryfxxY(k6p3)L*)9EH5RPWN#t zBxu#A1~Qlc(t_m4ZiR@qDc&qk64)77ShW-!xYRT3`)W(C;HKe@BnQW%R28Kz&zRiA zKU}v8heXu%7wQiN&dU1Hrp^B4+huM|jzgyjALbvN=!(Od^1=pWIn)ORSzbvl#z~>` zpCX}y6;oc=u42i2H@{!}tZDL4pDSsMdG2&KnP&mMtZ*;gr;3tj+aY-x7IRhOJArIt z3lr5-vfKTq`O*-Cug9Z=RitKbiVXpO;k28<0^Tg8uC|bMwF^4tao3Q{Tkhl*bPevcA8C<7tK2vYNzox>D1wojMWT7Ytzd77 z=5=Y$Y7ku5w|{x;h`y1umNgWo2*JBgWsov*}YCHTP-7_#D-G=@116 zWsK|2#fWrFLfsWZHDtxC>hG2h_X>iGiXIz&S{pw$Ye#vn27+g9ylWmcKve&h%5=f#RSs#b1N+h2P zU!SaX?iJbM2O(5{M7=DM8m^1xDPW51(Shs?4^woy7frBJy%&vK@heHT#q6#2^h0u95_k7Zp1hrq zk23;J=v>~F!x#@^!9s+e*{@h#hfuzh3)(v$E#fuU%cDfYe5rrl3D%D~625mlH&L<@ z>cBx!D2t{|VrwL%x<43X8gC;x+lr3-6K=!~zVL0red?Nk>4?P3VC!d+&E`eYWG5ZV z!0Kv$M7z*@GwG6hzD-ILM@C3o%1IX2K#B!r$n0P2EeoxoxfCBZFE9s)FT@Bht?qJSq+8B6 zl?Z)!){JJ-KI??{=1*Eq1U%~+(%M*?_M}Dj5rAoJ^m@i6={)b%a|=svH0ZgDp01ZW z_Cwsd&I3EJ0+3h)eSWPU_46^p&LnBhmUf}%?``umlRQ1s1SaNp?!c5LQc85E5ROS* z@7Z|+^4bI~Q4VJOZ?Rlv0IS#1MIlw^7L*C<$c30GnifwU6%zrpVjNd*xzA==4bUl- z!{#^^QjW9XyIy_0zCF}1D22KZ1K4be+y;nY!UYNg{ThkJ4!C-&fQoPXmv^JoxVw&3 zgxURH)CrZMkW!WdiB82hMGv=$RVVj{-rj|gLiWZ-;F}tD&_O(aYL^~QdigO!=*X;W4&HO!9rL+jR1!WoJ|z0s!GDoaBwo$!ObAr<87S-n#t@Jc zcnak!OyDa$FV&$Pn-)a|H2545n15xz5N!C?YJSj}jFx3aV~ES?K2#$Zdhf@@IgCBe z$!6U+Om+6K-iLl79efdQy4>1Yx)zbV#A-)Z>{nCz)t|4v-(|B956DUvmjqB)+ZEgW zhHYqgqMlg;7yL6(K9S-3)-W+Puj|DO$0)z^92-t1*23JL+@oXA7A2S{Ra8bFL)P8?@q#}5Ve%7KF5)wKqZI< z7&|iZ<8u;u!LziASg)IZ42#(lr2q7?$mn-BB&CL}xDljjxjqW{r8;WXpkMB87%;l8Jf)+Y-@;l3qjS!IkA>VzVo8v8CKeYI@g1XV?Wwjfv zE*Q@Z!)_B)M3)#kq)be7-#fzCl0}<*FSLV_J+v}a!}!miy=cn`KH`aq3&mf5Nz{^L zRrQAkp1=GYt1NRh<_hYY=kyZ%WFspr(}??B%Ot``e)Q=P1rHG=Xb{ zTc2q11xF)Yd zTmKDV2<$Byc4Pr+^xT_`dBW(w z35Amv?tR%AYfKk>;tbsF9F&fX`u5}pGrPVKa=TI8T95nZ5rzFQ%T@h6-(}J((i;0{ zqWHU#bu1{`7EpGEhVXbNbDz>aQB15e`ZY{%L*$>|z*x_3$dGq~>bX_|g=MOTeEjI~ zFGEjm>vrODs(J6J3ykG0p}&nx+*Zb1V$^Wd#|ap|1BCDon#rhw_XQAm4v)+)hI!U{E7xoeE? zCn!^;OtlLt=~f7K-KTObXRpNVisQ-`(zbbgD7v5L^5{UhGA9v=z>2j6L{&lZ>AJ^n zNO8E(3vU;8+fzR3v?V-45(YIzs@{ShR5W*mHZ;LUBr+nRU>J0#v4R2J+aItfCwKov z$)XU#KXRvc_Y1isv4ak(dEm(xk(It0onO^sH>vBVlylfFP@h!D7yN`&M@!?MFjG=* z>BqIb>(nM_?InGlKm<1KT(3JDqR~TWfHEPk9_jK~8_BUW^jpJWG$q5XkC0yWH)tCh z4$pnAlQ(vuO4ZV$a*Ro@13d|j`1AZDEp5tWFtp0l3Q)x6>Gn^vW$Qa-(YJGWwJaL; zqMrZn1t6!;O~{nF|GP`y9$xjrautn&dTODLm*6eDajSyYfRXHD{N}7Df-(&dxchVMdNCU|pUVO)h%$ZsIAos6Phfz%5 z?0-%g_no8IET^lS2XZu)es2;1y*hYnEkSJ(nDu? zb9tQ~i7ss-3~ifBy*j_=T=Vo5W@_H!XycXRN*5hd47@heGr7t=yR|ayzVdt(+As|h z8-xT-6XoyB(9hNy9*Sh58xMrQ(V{%i)+He${>3v_W zNB+405lYfJ2Dare1rq84;{EFgE5(i zds3tHhqUHns07nMXf^3I*7q{fi)MWc)xUm9a9nfI#kSAJ3>BbZig6RfsOrzp#OT^}&T zKA@KNr&9jdGCOa5FuC$5fbw30Dn-ppItgJN%*H*dhk)ab+#AHK z5Nuo<E& z7crr|IKM9}k(h-iza>RT{lcp+^HwHcF$LTWg`jZqQFJnz^ON)@EQdg+Wh1PDHIrV4 zt3~XU$Im>wo#2luOXJOu;ty*6NkLh+B z#hoAa-YD_!X`6sX72a)$ zK!!m_B=w~(E!}Zmw0lt;*pg{Y+ddX3MA`1m_CVB(*W{&x*4jlS)JR<_W!P{T3>^dq zw)>}o5QNY;tjU$?->(%2JeQ8KK0d0OsIbWj_=LESETCD7b@9+=B=A2pU2}ZgPqYmi zH)zywV>dQ8HaBe4*l27Ujcwa*)W%8UjoH{X-}d+3`+q;5+3(EUJLjG`_e{?Sf7NO* zZAO-W9fW%t)f!sdXT(Q%+;$rMB}rJs(^DDoWZzrHTYfQZe2TbsxGVkyU#4@vE3)O` zg{Jdk{&uBF$`7jLR9(r9k2||3NpiWV^Y|z4ZqEmpqK0Y)Z0=@bA4e&~h0*8iv*-WT zl*ReK^hqg$mK{ZWVshUIW$+pYW;M+w92Lq+a}7rJYWYL&RijD`!9RfmcGY}5#qfw( zX2BuHgOD7g;E#LR^=h+pA~|LNc-RSaGMS~mMN#%R(Wny|(r6;7K5nfae-FLe@$>p= zjp_2%!RlLjd6P)cyw=WOhXyBIjHWW2+jD9$_9Te9c7OGj>l(a42JHEF2VU`?no$Iy zIZ~53&9h&}zsHApk^kNu%SM(n)FQq7DE<60U$vChizxZLh%M()hf1Int9J(xfiTSP z6NJyhalzHrrn@Z>l(bMYp4r zx9M{$Fo9_mdjlRBhn2NUU7QE zLR8%JO(H~V0y-_Qkd}k*|A5>sw|kR$6fdcu@D;Ds)#NRc*;}6dzg-v$593d;iUy&0 z!r`^{CDY?4HHEd>i5)*0_eikZUCWZG+XZZy8P%`!KC?AT&6<}}@`S|uyPiL4e=;lT z#JEI_viYaP%GGq6Eqg^3&rZe5u-Eyg$LcZhC-5Wc92(0khTQ25a6tNLFYwqHRAhYF zMq-ku%Qj&Gz}^`xuxJpRR?%5bn9KBNaw9P91V15{LxGR~&+5b%1rCa{O$@Tc4e*OK zZpopCUhT)@sSOgwcT!}uj7u!}Nq=!j`ygFOBz}3DojCBNNzL!)#|_k@;e#VnO83m; zJL^1DQpG5eY%DYq$AH}HYE#XzLC=ye<|z)q?j0j z*YRb9f51No)WNJF2w;ExMk&WfBB*)eJ?(_s^e>mt+e0LG8tWy$q66T)wf#@M<ZeEB1go-0^(DBlf7&R2_Xqk`0yX8Icf`xwv^olGlcC2uHtG_iIAOp1#%r)J5g zhE~6V1f3Gn$ji%Bq3L60mldJKM>*ly@BbQ%C4U&B?A-MmZWF?uq2^CsdBHZsNBt*g zrFDE~dQ_*p%FfMUf9zCPY}I9lhw#^MxDGv;Yxh{R(?Vab)eh)3^FFky83vFui4;>) zv8;jc>u@+-UbS#0a-ED+`YM*vKY#7*pi|q(q|3QQD|N*bUn>~3rCE=edfhi4UoSDi zdu@}Cpc0O{{&&ZN7|o|3{xM|QJtX(9E9q%Bb5Q@&7<5_ZHK8G${VmHf!fELuZpZOS zRSP-4IyvvK5?SaksB)~lo@Th0V!|lS^ip9#H?|W4;g%|oz+eA7v}jS_NWhzlh>R>E zxQ3YqpkC)=1{{Ow#d}6|wX84(A-D2R4gY_Y{ELqMlo#?c0KcH-e9K$C0Wdn#z`QWH$_N^ z`=bj%?)4t%q+JL#C{e;l>rTzJ@RiVtrY(0)OUW?N?KFKntGQ{uPte~l>0(rR!Vt&r zT=Xl|4(1b~#qOi&aPu18o_oFChfq?)8iCJr9fwGeRu$cORJR7arD`mNSe@A#f+5jgDy}y_fsUs!AJ3)F<;vrJ5qwvm?U-<~XVQkhCH|^J8TgC_j ztNWLYPINyjVymH7_B-Qb2iKhER`R9j~c8F**br12w0iIGeFL+12`z@5G+zTP_#u;C)P+GH^{>l@;pM z%UyP{{?Q0q>gW@?>L?d; z=mE@QNvGw*1=Er^qFMJ5k@A{{GVbT3y-!^)e{`)u@L8%B?}rSgw|O?>JP&d#xJeqz z>WBf#&!7Dv9+j~quwD6W;^gyPILmAMW;XR&{<2=v%Zig}QfD+efqP8Q=2rz~bf`dA zif8o#6&%)ei7T~76i!rX>0+m=e@eMN1{#gg$3u@~>?{joy1pRR0C>qFNZR8gXZCV9 zu+sAX{qQpINB%&z+VqdGUML!-4({rDqNo3eq zR_%Mn4093TTTj3Jk(nr}lt4FgYK@3c`@V1z18`@R3r-UP+vp(OFvGuBB(1PTwd!oK|v67I*${Xxm@49sekPn&M~~7nzQ}C zKzR`cT7=1_@SmLeH}1hd(^%x~J&)?t!=ol){UW|M&wt@rjrYh69Ps}})0C6I!98k_(o6h@V04{u>T0#Lj}^;9wW;5S&?w1G7X&^5Z)g*-{0@e$I*h%t-zlw&4#{(pe3gOXbVbnGQ26XL-EHAl%yET3s`^u#U@87YyL_*;W6>}W z46?>1zE=wAj-u#aFuWgMMl=C+c%6NM6nL>C_TC_=l|6D@D2?w(_U2h%OUr~?sc z0CpsRQq<5Bdz%%3l;GXbzzJuL?yU*=xHOGg5HEqaE#yoVTQjJ|0ZXs68FSIT3f{Hs39`qjL<8)sK48K zj-%vLtPMPH0^CfuS3K3@3~&ks?2r2bEO;jJ`|%MbQ}?6*=KX(@|Z zKVrQ~MJd(S9Q9L0$A;bmEfnnXpU-gi3%x?LLlcoWNG?&2KIW?ZY3P1V@GW-jY27LH zs$+de#Scr`S13`q+?5RHAoj&lkh+Ojl54Gf-8P=vSo_ALnHrIoO z7@fOZnVz^$5DJ-hyt#~EbkvYJy<7_3#Q5{)_~)8$^i-PG+2n3%{P}7~jl1jSxkWgQ z2wY!Xa8>z<;Dau9@CU!VFo@Q^eiU3$lJt63zgr?8umg@+3{)#nnSXnZ^)ft=RUsqt zMcAgvLYi2a-sr)ouJ#LMIm)glT@Dy5Y<=dmo?@=+wX=mx`PqCbH;-;JlgL~iVqVHh ze?P1`kKYT-hFaG~Gm=|P*T>r!J}Uw=aqGfxh`T&BAIWVzQdxO5tSV8xJ57fdH^nry z!*c&tm(LF1w9}scY2BeH{b+wZB*nNJzD~X_akUw$8hsVHOX-qLY*5VVS`5ra+I5KW|!SinL^-J`^oZ(edWP z>bdbo6r9r&%@Boe@p9n`_RGWBNoK^$n|bpxAc{Jpp#~m6&B77E3`n)TCz z1DgTuZMm_N5*9j-_!~v_^2iV)e5aRG74}z|^KSUQ8Yz2mn^Tzz1D=Sz*$t`j)tB$0 z5~S-y%F>`Uo|8(5HLK3i&3B^n9=s}Ux$LJ4A(jkZm6_FLc464Bxhad{B(2Qum7+Kq zose?ARz_Uv+A>p_z4hnR%~Z}S{NnOZ;~mA%1fN$9KPZSmqzzI4%njWv@-zuvN%gnl zs&pqKfk``16iC;QyQ&4yD_n%GiXyu)wDd-=zcIYp_(E4?X|fy)njm5Zme|4?JKi2^ z4^`ZUd!DHyL5Apu3NN%J@xS>RWjk!uo#Kz8>EnZR6`n)TAEOaMz-P@ZzlVug7ZVp1MfEhkuqgVli$eE zg1hXSmlUO?e; z4ndtR8aNVGk#(NkIWKnO=K?#-aLvrh2<$|t;1Kp?;wCBP4=Yau&c*^9ws=4_UWIlj z&eaA2m+N;sdzp(qjExSA2p2TKm*TnKYDW04?JhHSy!W}ABFCP=q>~Ci0M7~8vxEV> ze67hB+mJmb&>(J?I+ILgPZuz|7`iPW7o5RWV0XTv+^7jxu!nt9Ybm<%ZhX$SnMK?E z?&g+woXziv@b^HX1ChRfqyAW_P7|BZ=v)sI<*ufTmRw5&4i27fhF>~y{jcZvZo=B@ z`-Tly>W(T`yY5-9hxfy(-j(a#xEuA-dAG;;_#kL12;1Xj03V(%l}OzAxWJzTlsq^R z?qz|)Qz5Pl>-|viMEvcbaXgs^rWqSrQQ7*i-=Wcp7p9^hIhh_wD4$GsJ)Trkap>}d zQ5wq@9fmw4HDfHm;1Qm{^>3A=s_yc`y2QDHMzql~3sx8jQ~bH!Nc z1O^AtV9YK0Jf{yp`L1EzF*1En{z1mU+%a@ol-s$Qs-o*1WR_tFTz-_poLlinkcA&b zA1E}D_%Mn-6!0_~a>7P+3N)JJ##p%0Y>oTy^O4v@iTKP6FaC1N)J3I*0n@4-Zc}QB?;$Y8vI+H&f?*;+b38kbQo-bI=Y1x4ssDnN z;pA5UVwM_+r9kR#MXA5x)CNuN^IloCw4yH(>-5+fi!$MDu)qPlBr?-VqDoU6$&N00 z1i@$O0{j&w1l0oKkZXp$-(OKHj%oCT>03?qlZW4rUCJWwlqthqDV?8SMtlrl;9|i1 zpGvWzCB}|^H?ZQ+rILt(J~4e+Si$wXswW z%Hjy;K7)Xz#Ju3`QLbq~BTJT;7k(vRH40pG_aW$NM z3>gn(&i2t|U)E&wO+oxuZOq#GJ%@~JL0mZUcN~ib7)(&ddd?ktBe$EClh!>b%Vfuj zP>=_E!VYyTmQt99HeBg}q`X{-ueCt?`87xUZBNCQm9n5B$udV)N!Pn3Bq2AB{S-#) zhelG<70&YsWjQvawwk2E{F9i6OdWFA=9#2t8<$`!{nJxe-i3jrDv+$q(R>fETg8d7 z;0xzr5IadpR|u!x8q>|acrO)t$#W}m9M&_5SvHR75U7)B9=4*vkD1rF?$-^i9GzUA zAMM?uz91PjhFZFVZDu@x!X9_iil*9*L|q9rLJjmsg2B{Gq9|>~xza|$e|xyy31VCA zT3D1*7g_%;L%XEzs7o6k`tT)}Y`?WOJ3=Mr>u?fuHh(kx4*A9o*fI@jNpj$F8i*J{hfLtOt)Z(N^+mVXXhOwxqEm1B&N7ULB`Zv2ITgqr zCk42`Y3Rl3LF+*k$l>bShF`G0eMttCPsf327Y!xabwZ2IZl~OjLPCFH%JujgKK`og z?yCFTV5S(RTa}Df5KKq+#&ZJC)YLPMd<}CHp|XA?o!~}qy7MjV_$xj%lMaY9MZr>$ z9C9FoEAJX@{geW&Vwa*i4k=(UK+Inkg(Q{g3p{2s#N=D*PwcOZ63VC$R5(gO6x*>( z#|Iy*<9w&pMP``lDpNhE%97|vHw5uii5cWAHKsOdTsY`#0KAtHl+?Z_lpYciZh3i| ztSO9QSPOLMBNXTe-Z?Cy%H_BfHXVfR8%_SF?p2|IP(`Txzh#w@Ph~~lloWm$nb8Fo z*nOUvXYqqxs}s@pHA>ycn3{p=z|L2p&Kpp#R7iX7+u#u`d-E45o}BSrMe zw+EQQ6)yLP9oIGIXZzAkWaJz$>2eZNRADkw zg&dR2g72DO*&tE{v$FV@39WWi9Ot$9B1)4-($)|1?HM^TE)T5l9+k3i$wqu?wLF_C zH@m!VX&TzYwC8*J1#&oA3i44BUf}?n8M{RkweRg4yzHXNrd|lxRZq|$#toTXBRU~> zVK0&4%yn#2eokg8(}z+$A1Iaa)#Hj3(r~G>R+4j8yutHD<$Ye>P{oQciTHm4>#!iL2CE@JTTVM+e5}5(WZ^geIo7O9D0P-~ zD*P-E)*sA4nW2WE2O#U1f=iSq0c+6!75th$ZP{C$lUh)r8(mgn*kr;eBAOnm{Z6{o zV&>M9tdcx+^2|9(kSyjk(H^qyaNY^<;c>y zh-Ej|3mIf?Da%fv51#}X9mmvHrOTqi(w%=xC@WaPm#sW}kbbmQrb4ek=)Ljj>vlV8 z`uMQ4i%b-tw(q;Q{Qp`2cu2}oN>1N$o#%n^jk=Pe5;+tgkbRb;urhyJJ=J>Oa;6+8 zr2tBs>?BFkdng_DvHvS zq~KqvD`zhcKV}FxWZX~C0GXcg2WX@$O5Dd(?^!XPBk*_Lz)6s8hecj?sHqSPHgTp3 zl%=sL-l$8pJ^dNE{{VZ78T|@e0OI(k%}YqP>t0`ZhAQFL$2c1qrH~b#%?Q{LsKQhqDf%kDp6?9Yx)Rk_`oXNIEcXG}IGcsvMkGYA4 zi1enlYJWX{8%!o&6A9a1N^v%T?(&YLzkVm%IRk>g)RZ(mXJ^0=wDM{i@+Ut$bseF6 zcja;+%Za3vI^yc^Oof9kT)MR{Tnz&0ALBupySQRf*^&u)ssjiv@2)$44xqnk%f)hy(Uf6ArMo#EQHaQ>BoXb>TW#yd+BS1>vh~g= zNY$UM+hdR>Mr*N>s7PQv+qa~D28Ph*6BUOOXGJ!-OeNmvMD@bEjy~28-8pjwP|rB@c2|!mgtLTWXzzbM{mzVu(YBdsC&S3I0^t3 z_osRD(SvJ}MP?Eci(XXx6TX(WFkI*9_YkUvYB0|=3so`)p7FjN+=vZ_6CY?)$mIId z;~gojgtfUE@a{L-oIA9BO6#ODXdlSS08#!B2wuGF{uHmPq;wq(jETt%YKrI2Ya%&m z3K($nUHHwUGCGVa%qh}riGnxpHaLM5ph&`jf;4`9*I~x=99rN$ODs(&5K46xzc_j( zHQ(eoai#A`tfztdM}k~InV~w@0TVQo2IjLR`YU<%jR)wr_y|uFKp+aqeFQK$ZeGY_ zd9*s(bW$q5oW*o2l4_agRntJ5&re7uh~cRES8 z^Cb>Cf&FAykLsdt&qge6wHy>4p&j!5tNBjF#&3wR`$d-udWESN!PP#;cPzl@meR>H zVgK(^ErVT}pX6S5t;$ugsCSFrMH}u3w%cI>zCa0^Kcs(rWk$_jr`k_KLhgGLSVGmA zFBq}UtrO^}WH^^XZ!mFol)qSpR~eM_=`Ut+0$t1!LrFz-_r1*%Q*1}7gsO7}l*IWD z1GmFZ)BL8$P-S1x!%MStF6K9_;&mAs~YDO;*UCPt4x%FVx*j z3eV%104=WV>zq!Y)u>okbbK=MEy64GZJU30>EgY*>}&%nAQi)rA?M7N!4W*b>g7;z37+j8yyZG>gWC8QFIqwL^`|AC+)V%9nVH(EyzYpgSZs0gM~m$ z(8jhVATlJF62v*8Z4^1|b+n6snoYYaqgeaw*(bM>ge+ReN zw(|(RF>A>&VPHcSDENcE^n$2GLE{*hyJdblAM4}&JN!I}KIY+yG8V|c-U2gEWfc#% zAZhVXtxMqw+@3=V8bKt-)w|Y;_r2`(miFt(FUP z#G0ZXj_q+=lx8!Wf;yj#uNis+(QGLwFFl}TQA&6wnNBFOeFtyeaH}LES~YGD?eCibqVs8E7ok3MDCMo(xa zgBF^XAcS)|nY|tzKj%+Q8$S6$Lid_$QtE3-0#*ykQ%%S&w}399Vn!e`D?^suc+Ssa zr38;Xx)23~ll3B5_2=yoXGbE2Gi-z`ZxNN<^3An9N+?xH{5la-CLZEp3$(&pj8G}C zGAfl)fe4IkL>eMHu9^MgbpJA8?)YFt>IVQwQ9T)Rb~vyDN5dr}kR(tDcqS_r(8#uo zE6jm2k3(9HzEhTZJ+aWEdSi^~${=TyNaP`rlw-c3&C^b|KDcBwagobW=Oo73W8WDy z5E<5_H{o{`c5M4%wYKm)4U;1TxvAUBRK>NhnM5D$bTZBS#QLqL6^spt44|oAZIm7p zyazvwuhX7|k9l%p&=bZa#ebiDp-AM6dfC;40ZUCEe?W=NT#51=p~YRxb(l$*(qLUc zkjmzAxSt8YCU(-b5p|qyre*9zX_%Rk0nxEWO|>5`fUW-bVF(9H!g*e6q9;KC&lOVIk>ktUrFhuAa&LsV5Z^>6?p z!B7#lhfyr`9i>LI7AAj4cjkKxzxD}~D#I?s-EgcD@}doGhHsV^Q>U;_7^&z@D5bu6 zV*dVRD)f`=JIw+w;b{B4sH{V+xi-!Uc>5fd>Rlw9J`~$+rmMWHChn6#wd^%Py%Q)% zIoW-+z?^;(FUrwx-R8x}TF& z<4A%u6`&JvsShi|R{(0yB@*vJ6lKUKadbdakQ1fQ-1NA}G#|QXeG4&R z6$p>_);z4uiK|~dfB|K=j~b}3AQ1Qsa}I{?o(<1??W_8>oj;bBLh{e=_W~W@c zKutP&80K$!1l;NA_*_SiF`_p5X04B&{Hg{hNyBuq6QmRXe-zE|f(h2*gAX*7mF@+@ z@!}x=5Xs>DpxorN=@T(?M^4){6w2|%054+x5hHTrX3hNStFnSld1XcT;WLAPC?35I z3JS1UK0x`%XJW*c>an^a?cBBcVbVGLSm<6@vuh}Dud+jeF%v1js6lGMpeL(H!HeA+?0gY zfmsRpGr3AYo`%7m@jb0Y=4{k{i~XT6xw0ng5K(s=GU)Hi(G_mR!z>D)&l z!v|?*6@7rmgRGf2+`sb{hW$L40^>6r+%phSTyeLH%tcFW2Q<8ba=7plX1S`QCD?l! z0s1yj9kEHUs(%BG(@eZ>Tw@0B3SBf~H?u4xBrk!6?_5^o@@%fiamxKS_3i+R0xA6P zu5V_MN8w{saCpcMkvb1y#d*#5tRhJxGj~!V=xxYuu_9uq8Nn=@LsYg^V^YhF>_K4W zlu#T|wS4Qth_(M{(d2zLtDJd*QifL*sC5B=d)CNJrK8IgP4*5`!#`ExsmGZ)M}GpL z69Sn$v1vCBnn?)|Vra6+Yu>T8<}Lqk^l(}a3>4B}04Y)hzoKeTU=)KBTm=r~yDM?@ z*LkD>Y>0^S@EB3V5~pGZ4b&s$Z65UfF*y4}&uj*^p13qq#pV^-G_spjae>5f=_VU)RpcMGP>1jx-pxHsKtX%>D){#Km zYoDQ;8Fvfazu5T?JVm*7sEd^26yxSa;9CG5XI^Aq0$JQBHk%ZJ@t5-gT&&H~TJvU=kbZV4~_aclJ21@FR&m27lu|Qh@yv@7))w0 zWgUl*u=?LLxd@qSP8;Q`P#&0gpuZ8dc1ic^MjU^Y<#&3b6-3Klg`p>!PpfFf3UllS zT`trqilK&=V&Ffv0Gcl2VMPkrrY@zGmv}&#(XTFylb_yq1B0e^#{D*Zd;t~M2WZpY zGo6yE!CTw_9Xz--Dw=Yj*dX&JV(`DRzYm7O{(s|Y#VkAoU9-F~gSym2ARCuz=Nz5q zBWEG;PX1s1$KggX+1RVp!|FkOc&f8Ke^&zaynmKhk#Inq$c;dVtx2e*E=RXRRMUwI zqSrg(BI7v2xILu=qc;)glw9jCC8t(@n~+rA5hS2=Tu?nwAn*kM(83cfBHvMuTNY6q zXeJd~y=%-@8Q$-KYyO)K*;DET4XPmh(Og;?W*}!+tsgzBL~#i@P;2EQNDBA^WN!80E&s9y$eW&5GED}p_E@bO`4LAHlZw{;xhW(E*04vtbcLR97Klqc zSrQ6h!Kv5Tnl_90M8Wae;sS#0y*&+P5>m-d46rb;G7K{Ir6U37vn2B1guI`-l$;jB z50F|e4zjB_O%5JHAj6XZ_I?Ba5Z1BoO;v0GrOq>P9LFCKC5BL;X$-D-!9|jx&SEM? zQknGaLd?}4(JA=%zzKMmfyn<3Kh>V8;1#hdH|nexgqhAu=+cnA)IHuA^2K=(M%3z( zFEr)xIZW#te*bdDdnNnikk1hyZx1+n>*MQ{7XU{7jx3`4__1FPnyr&KNQLi5;LPol zh#1PF4+UH?pAm&u=I0Xha#L10Yw2dILLb>)t{C?1zkpp(E~*^ z{Tz4_mU*I^5qk$Jrv5 zvH7gD<}qP2R&``+Q%NA{_SAruULRRbFjDc<2MA<*$sn=|l%;AaOG*)rSL;FOKPs1@ zXL2X{UEiyH&9T98&Pir8vVt+X7YgR2DJT0i$h?J!52?sOVl0jjVse}eL-xh8nyfU* zsL6&rxXX_KM%i`>=W0_E?J%^0GKo1vYe(3tQ%6x}bREeu_MJklPf;1IUnlgsh;fn^ z^J8^j)3BB*(K!FOpF+6S4R-JqCz;E*jFoiVWfTt#^uO%_5Z4W$P!2*2#_-e094@aj zhc4>bU_s6E{wodv_@C#|CE|za;z53@#O8A-Qu88DvwlX3ZAkPz{T1*u=0ImQWA2}B`Bowj151d5M?~uS4)kKua!==Emd9k!5FQpv` zJzQWF@u(*YPG%1kIrQowTZ>E9GJ7@!^^Xc$%DrM$ECP1yI`yRWO|Gb)6YD;Kt_%?> zGyq)w2~Vb4Lr2SL4u*6^1A|A|GcU7zWk{GO2+a+;R^O!8oDvAIY+lG?{gog9VmB%X z!kuFxQol86#H*1@`gI}x-DER9h%`I(zI$*sej>B_KS<@*T#mG}qa=3n>)zCv2bx$F z!!nQ_R|x4>%e;M$O=k)9H`2!SJdS;R#HH>ZdM>U+xi!_W)4H}T57udl=>@YTqBx4G zViK_iLzrdJkYmML-2u*u6-IJf$(oQC$89{c4Prz&OuuFqICE&#_moesdMZcHx~l|E z!&Kga%?-w`Lfaaw1=!^fcm(P^QNfLI^t{fvTdvMgNp=o-ZZv(g5CkXvcQVI>6}vBw z$XF?i6P@2Xi$MsSSzF0RcSTY-)WO_&uJ82NBmo@OsCkR1;~^O{*jK|!sD~OdG9z;> zKVicY9w@j zZ~9^dIXUhDI-UHM$iC7(#w%6;e-E}>*98h+Q$>{d8DB1$QT_78 z)Ui_@Exo><1<#gI=TLL}x*RF9(Sm^EPV)WHCZ!|Klk}_ z_A=NF3p~R{NRstHID0Ln9CM_OkmpRX=0uC2$4*GT%-HVom-(%U3j&VpnTrh0uTW-F zpO?2*UaKz^?{_V7vk*KM`ITo^g5j#iYc@AvwZkL03Qe~;dTbG|FkMf~0V+nd0R(Ph zfabXMRI?u;aX)DQK%cW9;X1h2GQ?qC}?;Y4FTP!;m|}YkP~-SstU>5G*&_;RUI!-vie7 zepukoB{j+PU!6$j@h3L;XR%+qP(&qTAgugQ{VPr%bHfecgcO+273)y7MwWnT+MyuA1j^lMT zZGX4Ud{;34!NU(fL95EI?Cfhaw&wF@-rE;|Rv%lLl?6GWfo2lb-Nr z1<4_}{eE4z3j)ANsfHxn15zLg_}C+4t~V%EoIqKHOtWY%-wLf-{(KXCqTwRh^RORz zFp{KpFQ2tnWaw$ifXuAEK)8RP3I=ffr6SbdS4>_hCTxznu&k{rLFxu{oA*Rs*1e@< z&A?lH;ykK~PN|4)b&h7?G`k|=Y?LSG-A#%O94AEq-ko>B6#y2}aT){zzHs=su^P4# zkeB74Gf7Zs2;2ZP&aEPfeApQ5A;wh8>i%iKn!*DGJ4TvXqFbOw)w-* ze_^%~ofEoEMt;@Xzi~0l1RI}d5UFHdHTV_%hsaM2m+V3`JYbhONVxNHob6=Q3yV(1 zvF$md8-KO7Idka9-4$~^y@6%{!E)m|MPeM6wvHq&FEBq)u`{L|Z#Q^Ej*t2~}+ zT-ltcd`B^Dw4O=^D zn~Lzy2wx440_J%vV&k-?+oe^ zGBTt-d&<3ABENhQnj$s(!dKe0a)vT~j6%xXzn499`AaReuKASiY2W7e+HIZ9twCCS z75v1hH}<4n53V?9zuG$b-rPmpPK6_3d+f5u$#px!=?<{WXx)O{zj-GE%hGTT?QF9` zT~(?^5spg5W0eoz8EJkC52mHWl$xWw@lTfk`_&}19`*Gv+id&^s{NdwKT?@euO zzwl<$WUY-i86!xVK)X3!n^HgdRn~~{x%+6NtGyBZ^*P+=qV-hhuz$|!>=q@kem@e0 zf4lexUIXXRV;Awkb??TzJ%l4U^7DFAikN2N6y+&ggx4X0NQ9f>Ql4l1Of{jA#b6Z;9^S`Pk<(z0cu z$Vx592UDG4k;6o;dGlUnH*Uz4S!dMe%cyn9yi!2ywx%7ugYhea)eq%5a@zHa?dAOm zI5-|<@M8waT-8(oBz`<#B#F}J_x7}BTYU95JK0U6>_YV!Q*-V@);-jRzN6lrTZ*5)ku^1_=EcjI~MePecd?MCa z=(~WnP2bPD3HKLpyEnAiaDsV15gM77=&>7T>18#?j*?v;T%ci=X#7AI9gMg87Gl4T z^VYP(m;U9~0Bi(*|NQLAj~H=cHP%I3KPV&!+pUoM+VlbMMi91( zk9%OkNBd!S(vPLckB}zT^=BaDpZvm7hPk%FY2wsqv*ydF--v*hGnXO=$dHG)kP=`7?P%>E3@B`fuHK+MuhfLQ z+j`;s5n9IH2lIzQe;&H9cVzSB1H+`tc(_-O(f8|J;ez?9KLfM*%qcQBq`w7wIP|dB zdCmeMdSx#K1IdXlOi*@ja`Fo6VSH3v62|z=6*5!X^RBkV5^W5o7(p&~V1?hrR>60c zqGvmf@*#*_^yI#KRtK zNdu|Bnwz^?1i!o+$aV2?O3I3&5*qY%M7Ur7#gvX-u;B=-6zX0TMfsBuj55g=q{nZ1 z_kqJcX%NxsTC)7)=hm_IG1(aMx{o&{!MuWzCm&EjE>LlZf90ZA&1J65|7!u9d}U+O!bgnl$Bnt4@Xp(z zc3smwCTUssk{xjjGX4U}R_@K(<2lJ?lzR9{Cu51DuRU9h+Ef@%sw7s{q>rZ)L)!Lt zwGUQ`=}0;){gn!&ToV_LW5U8HgfvzpZ;zO+!-a2~t7|tv9cEm;4EN~YxH$y-GQuO) z(O=(I!~Be1TPW;Y)dJ_cm?uTOtCmhf5BQ+S1@D#8#_bqAUEn-(2Z7uMmVG8WRhbbh z8t5$Y%ED{2A6xa;qo`gnJ{R-)?%eY7I2ZJK%obH3%PpKcUAMX0VG^uu;a%JPG9UyA z@V3+B^!PG;aN*ygEc@Xzjk2a=%3gqL;D;rBKh*&P8UcyiBdYktg2Gb3{? zwq7N3U7+lV;5sbe7?z6IZ>+QIJ1^Jn!mn4tr>);lVVBZ-lKU->VA$%5vzl1{5 zs*W6kesRIoKb1BwzfKOoe-wRu11G0-x${#CvITmm#B5beM(n%c`^4^jS&8`iirsN-_)PH!-I|5(n=!+68CON>pA&QhV6m%i+b=aD&iVpNG` z&Z;S#gDk*T@^cvPR;FTAKaSGe_qJt^*(@%%PwTlIfm9-E?jz|F)n69|tb+4YwIR+o z>#hKtdmk`*;lx@@=9k4oNo9j}56+20vyiN->V>dS)8qT?OPOnjA@wd+Pw`gSTs#A+ z7~O@P#?)f=DwqfwVDaf<)(h61GKb3qb=F$f=bVmf@2X|*xTTxlU1!=0Io4Y%ON1AP zKdf24tt#JGKMESYCZ^ZzYhj)FzBArfB@VPyxCB0}70kOI|0T0n(7Eo7cb|x9y|sgb zT|gkR($syY>aU)?7=L5GxXf{N?;4}OkrDoT;-=(?HCV%s(lyhdbr3Fafh50^}(- zTfAQ1^FoS?D^7<|fXG+*bNR$~&7{!%c=B zr05{CKVF;qZB1Cpu+h5Sg7Ws55@MIyi3Lu$Crf#a6hTsvM5<8S8SXol!4lXe=!%K5 z>u2`sKnxksXsPz}?O}H~4X-KdaTW-Ec?Ckk%$Q^lEPSsC0q@57wogd8%!3KdUcef< zD{4JA6>eP8id5|@3FVPSUZ-iUmRF^G?3(Y-b*Jk{R+FxApGb@^th;3Vs;V!OoJyBi*L0+a!tP(HUH5>daJK;|7OA|eOHKQ$?i6B@EEl?7bvwT}jIndpy{S{o7o1W^ zX8Gqyy^jX8E;R0O!WFE8nH{8t;gaXiUqAUutTn;4uB8AePi(dJ1b1UQ{^;jb3zS|lQd)D&nPd_y%uz7#%rThYLsC?T=$keEKt{d16G{;uz7uS* zgPZcVThr{XxGU?I&)|T8py`y8%*52K4cH}UB>I8e8I?>c|K*5y@-hx-*`}qsSHu;P z7wd5$aXB{q<0jNKwMMj0pyIydhbxCxS-3t@B%U0#=wj>pZ%;2wfEhpETn+b=yK60h zEat$c?H49@uh9*jLXQu20`{!SoV@*8Um`G~h0YCX;am)RtnG)(raXzzTZD}`zMXr{YsSzY&UZk zA+VC2BkHPX7u|I_l1M#_MT-eV(d$A>WJ==&U44+%dHpx zfnT@ndXNA`ZX3{CI`J9LNeZj8gVDx5e8q?n_Aj{r?kp7|IGrsJf9kU5?ac0gu}ME| z?KiS}hcp#-;BuZvYusA!JR8@ocx#2gbD9Wq@-f!lh=fKd#5oLmrJ$zUDau<`YM>sC z*x4M~Xv^V48^hk84}a_u@QQ!qpgA!mk#O|waw(5`IEpo!`cLE>5(S)Uj3m0&SU~QH z0=hhz&Y-_Nj`-I??ypT&W||IBCK<)|2RG7NCEvC$F%wV?c{z3Nc*S&?-7AZ&^_Xuz zU*BFkqqJWQ%TKaWDm34g2Z-=QB|m@rX@|pZB|xN5ICOa5JN^5*x#qAVz5V`W>dx(S zsxLj@;_M7@B{69xhw$Qt9;`4=bY*0Ml!hms4{~~a*=VNc8|&BQOc5U#|0)6A;NRzI zr36!$HnI|kPdf_mY-uzpaf$M#<$~cw&r?HrJx&;#```HF{Rk;i!&?DeD^OmFq%Zv( z0Krd^_!9$C>Qd5TeY7f)>E%uBqa_(mx$%FJFU_6wP{i=gh;^dYc$kFA zT=9ggr-x<6uP#8rRlm*2QA()MO$aU^;wv6NTp6O=@mcMw^M?}rE_c5Ld-2c(D)PY} z_Z~F8YLo!mHKxVREw1+VDl$$-zgGqV>)VatrP{#7e?3~d)AKj_5bJ*lDg(bDD$)|?$$2v4 zJBfRGDQBBRI8b9I$6vA)NGJ3DDVj(wx! zRvWgN;nG7N?`?V0chGhr*${Zsgk&W9r!(0(x{9`zy+;Ls)QA+-b1ixX);x zy>=yPUCA<7-TOJ#t_|5hU=1TLmXcMyJBDI`S{Rb+-9Nu;U7(i!_xf&V#`99O(p!9! zQGgMhZpvY5)cdLFGn2rnSoBKGQJfvu!C+*crPEV<(Z{eBdo7gWG6o@4W|*qx^r!&C z&=27<4nt`I=i|TCYWeesX@;~@o5(hl@?BVpbuL~M>`Tk97>MePY#CVJ%YS_2+Iao; zx8xv`G(+<9L?!0!<9?&PiME2DDX82ii)C~Wv=jGJ>$}C}-|F$bG&1bk?E0E`vS2L5 zuHGECdhVxBs_x1o<~(T)R>v&xW!7;HF27iRe+yWSZmMJn$(KMRpu{1zvR5wn`PRq1b`)hH7Kk-FK#-x{PV z_*vo&b32a=4nILuziIF;JASyYNoZY#u|>FJeMQgu&!o#Or$xaZ)4{+`(!+0zl-4T) z-pRF#sxwFAJ^K}hn9I|uR~NCdB!tjI4QDL4zqqVL(iAZ9O{>qZG?hO~kjQyp;%^r% zYJ&k<-_q25J|n3@X7T+h^+io71(7;L_2L&W!V7c)0N|H3rwq%x!H~*d{%aypE$6`+ zlf75P^`0xZYWF@QSd2?&*@h8I7!Cs?OixiiQlD=2b7j=F<|i{-ECx2U z_&KA9UEUjOP3Q&KSfa>kjWDuSKP?lh);c7lv#9rb9lhKKj{@%S&I`w1e2FW{ln4ob zGiMIEFtl{QJl{gR`u`xWn&n3BH+u}l2NTd|JG@)77bG1_{{=fX;rUZtJ$zI?V14j$ zZrh2pyXmrA=x01OtQM-=zqyTkyOq)Sq1ChNq5yHK_ZCVy!4(%39jL25r07I43={|P zUD=F(Oh>LT`FzDn)#ZaYe=^z46(DG%EbXDoUWofTx|WP$Y!jnau@}3K$Hp{O?Azuq7_E^2O{FmgSd@L2OJVg0| zBiY1J)pOdiC@iD~cFHyO9b~o4til)}$?hdEAgYX$^+={j}qTIgavrX~u zMF&*~w&U@boilctHRKZ>aMjAwEE&g}V`6Vzr;Fm)L8#9~r2T!Jv6ka~=HY|j{P*!g zAm^=b-)ph6$br8r zT@c3Ln^M?*q4Sj8q{vH#duBc=8f1d^?h1j9)l=;+D9=m&y;Yf>aq&xrsB?TAAf9*H zMp(hCW@GUQ#YzKQi1Q5Lt*LXMH=)tA=i!{_I?CB@RH61&?P-!U*g%iyPexdEf4yr= zgewb2yW{qJ zUKl}|u3%{7>U8<7W%bGN&AZtGGVC*ixdlSX!B5$VTn~7_U?*$`ZU>Tic+odkF2u#3 z;?MH@Uct$HJc)*B8yTQZG?|&Yz+-@@v|haQcpD41v_txkGmRfD10Y;=(dp=WuzjJ2 z{2|+iJGWg&{oYts>fb2NNGop^_EDXYAXNVd6)MYhL`7<5B<8#QEbQm*F}SHPuijXs zYo`+`jzRtOq%h40hd7a+5*i}^14{8ht4Mu0#=ccM^7scJ|Gq4i(pf`FyU#eUMj|+F zF)(nsD8Q4BYaVLD)hF9m21t7hrwJqcKNzG7 zl7>1`{~880Cw6>6_`w=Fii`!^0kgMz%U?p@fdyNgNpu`miGDkm8r^&Iyc`8b7ci)T zKCJ*oVmI^!2j-t_Tdvy!W|%udH)U?+bc*GtWP}=c!JKhEe*!X_NxGgJLnyXYTzZ}@ zEJAn#;eZaD1q_C7S78WjPN{Ux_tex!CaAVccG8&4(A(|;k+agu9hp%wt4b0YEZ1et zLHCM6c_v2nu0bsfTpBPO$f~H27 zn-Iba3sUG)3=N0(z~4;Rn>A`|foi7~bHr$iB{ftAD$;2r92mCi)*Sr#1q?e>p?rs) zvK;X21^pi|6zAPfBBA~Cc8QXc!M0}`C%y_BB5df?aMI!oe@PiOd{_2O!fiyc7Z*%~ z6pA=T%>kNmUOAr@EU9ibBQUAH&7vR(Bu+0!lsiRgGCw&j^V2*lGi)cA+g($A$~49 z&A}c;NDq{e$d;Jf)J$S;gzJkEIwmN7aaR9?+Mbv_bRDM3TRg0a+QeT2AE3BOqnwx#aF{&bltc@jc|0~ z3i?gbQ5?>W;o|&glFb&Kw2=gEOTfL{rsdHs+C2vRTXsJO(B0 z!c^QS0_iZr10k&WNWD*AaUGM0To#PsNHbQekzqmu=g`*FW*j(kW=Y)`#DZNc9f4H^#XF4Q(XG zu#EqUiR*tN$K+q+cWUvws$S^cwuIzq|9+!|TBY(?cQ!9w2d~$ifbcTDlv; z3?FftHNxPm84Y=s4j{Nmq6k0E%njW(J$;Ee;ga`=dhvm`WCFQVsz zn%W&G;6XYbTY>V_W!=F{j1#geL?rLL{9g+0@zAlPvp;&P8vpTNN*zCtj2g+W3wFTl zmqFw=yiyo9p<(JEh2F+72V8HH`iZ+ya8j(IZC8tq9plZVZU*ADFiV(x4lSr&_Cv+* zG7gS#Bn@28%X!B$)uwR=RFc=UyjT}`_hL&0RjvEg(Uw8O(79S6(KoTm4}La%aYgf_ z8t+lP!IsY3SuCi&DplKL+)6*CCO5PNa~S3~XxJI{3fRO4*)MsJV|VbNc+BDboy4b0 zO2*Nhlihi8`yYr9su=PHjm6s{7`KNRmmfl`wr_lsDoxE+gXAS~^IoK}JOR!uNHVvD z6&59eI+u<~8#Ty=`!>)Zc?ViVs_Vg8*6gz1?hUpbL-8KEYIDvn@?U=Cu>@>4vH4m; zYdHyzGl=^xp9sSr+!(-1cO{Ger2$&KM~G_HBAC{nDY(|WXx?0ZF>g6miB`cXZl76n zV@JCQSj6TaBiKsIF`(mIK510%jr)tC@a^FjHcr<4f9-Xu@e+_nQ~_^cHbsjDYn85H zO;RE-|NRj4HQbj(#J4Vz-{xz=+Oil=dPjL0LWiUMFVr+zo)XpbB3sWC%Ec|fw&WXmCsaW`i zWRP_hK4JUe1v^yHJfPzHj$-4eD~Deym$#y^zL(RZc6`R#N-vj?W%<%E+lm>nc#N*b zIAf>V7*`PP#u0%iy8cFy`W?KjFyC+lw3;e0_zMf&<%cASjDRa7o-}S`h-ZO|?0K;| zebt}m&P3Y=d~oz@%wOk%@2|VTtfseLY35(tkpB6Mq%c*_1IGvUmUB znR`#$XcTycem`fHVl^<)nIT~s>hPek)iI>l%gHv$@w~a;(DzSV`&H-1=a3kT;wVNY zzAWfU_HuSa+y354INf1!%JeibHAHd6L9QZHW|&Sg2u>M&KCFpp+MG~S_;i12#O-^A zRVw-)SJ;fI-)G6QcuKCNmTwohK35t1ZdJnel}PjOfZKvWVinhZ^MF^3;r21l*i7d~ zN+`JgJAEs$bD3NU3e$7Aj|ZOfKv>?{><~thk=E#6r+MbI4#o3(*}l9L@VZ!Lr>XDm zw&Y)hvaVW|8m!LcjWsr&T zfxSqit((ARzBp6XTCwQmkwD7@&|%`S(VFWU$V-BT z%Cd|4>O*(P6F?ur1Sv`5CmjyzbIxv~ z+&&3J-EK^CDrv;_#3CEj{U2Mo2!?@~RxpeC^nIa`>~B9xL>(C$uDQ=dHFGAnBeQDm z%oTign6cb$1*L{l}QPg-a{?;ha#6F^tKt zucUsO2Sfe?=7;7e->Zu^Pb1XRZ}!$tO8qk>x0NIytkV8_9UC(eJSd*>{k!Vd=5X7h zlnNNN3E$NvjmM=WZ$%a0nJ>2=3c=Z=VA-Mbf8fx^N9!pK^>^jak!g~NS@UG1|DW&P zg;M(1`uhK4JijBM<7G?dlAcUz_QQh~3z0pLk}Tc4Iw(soRNSZJE?YIRHDp0Mg$vy@ zqBTevm?x2pSIK89$$5({+sp?G%Fc9PIGpnONwUJ|edYvXJ>4}cU?@nuR!^_`C1bt@!Ev8nO*kE_$7lYDBSri@5;k@g}(I|L-! z()f)(C;N{%9Vd%FE~zVG-~0M#{ZxcGSp629m~=SYE*G7&{5lhNGUBzr{n-)DM!4c$ z)QaD1=6~oqMqLLT(Rzk3eD6nVts5N5KHKY~Tb$qm1gjitTf^_9L&+2LryZ#$azODO z3%`^^EK+oL^U;gI9`B#XxOTp_sauv_FNm)?6n5&C(;2~7?%Aw+x{c7Q6yJYmUm|oi z;L&2|5O8_CfQh~C9)Gb6hn}oWt0SB!hn0lm(uU>X4rgM-R8F&m@du4oJGNvswzv2I z;obLAz@xMRJeqc!RMGP5-8ziH5S0tDYLZCMscQBL@pehXVS$!<;3&))cF!;tE=Jw%5D|5Uk zhfp+4f?I73U16&wqGyBujL=G>w(!?oKO5yB3|C-5tGQfGS?tZb@i@OZuuQ9Wi)-5MDb32cF!8)|LJn(H^3~1;m!>^Rm#;e>lWGP}g5z6q^ zqsrmKo{FOw7lU-(U(g%1?x#h@yBQfZ6+Rx0@tkaoeIG0pF}op($8jc0S78Z58&kev zDw18(#KeVqa#(&Z_S3cndH6<+dxtxP#uRieTk%hp`$Cs)=8Swkxq(O}jvJ9kC|4eP zZ~#;6AWhc>`zMf?ge|3M%YyjIhTEjujp^g|! zm+~Gb|G8!G=So5Ici%581d288-|?YLj$YV;e_>A4!KBr~7yJMED(+YRzdA3N{}S;@ zC2EUL5enW9S0qyHPO_A2HT} z2%mJ?sPUc-S|%d> zM1=~x^|B;`Rjz*ys-cA7F6^R08R3~7KQ9^Q4%CBf<0r-G-%Q@EKZ`$XkYJk(gcPA^ z-fAA_qwS?~DzEkC-KE`=&x{r_0moj9v8u@#4O?Cg3#P@XmZ*418na0aUGiwGD|<`{ z5Tt>#wr5IRYoGYz0F=!uWx&h!%JVlt_48=QMep%H+Hr7Dl&#^{NrugLvkdE&op#T! ze_ysW^U2?%4lwAeJzDUrWao?6;Ik!GJKc~nfLl$0D&*fN-=p%(Fkb(n|LhQA*o-*N zh&F;YbF>L&MdCO9@NK~d;fHGiidypM5%(LQ`!4&*TvovWeSFhe2jQirN~F2zb1vQK zW<1*NAR6#eiW!Yij~rge$*1xl>d3;F7mOHlS0dz~vP_3vNs0c8M55mRR9Wn9(y#sN zDY88~)Fx`+Aqb(fbJns@O^G1-Z1r%ic1uaE3T~F|$KnI%1Rbm0AaE4|(nWG9t(Fy$ zTJ4ssjf~(er)-u)viUh+>>6E@^+`hxP;wLHE&}46vK?q7bO9SyLYSDK!{uY19euu# zBo$f+9+EN=(n3BSbrxR@o9_lvnpmaWmp@J_4X$5}^NQ1OEhgFwSro1$RRC22Bnch- z*jD;v-#QQdn*5hLtxRkLI!^pA8wXzYA>x^r!>FFwx_V;ZhRJWDyb<$7g2^ zdhFk(fsJr48Z@w|?Jw<8jyapM=qVYc9SljqB*k!8IEd0+mtfSR0dMyHFzLuo^7qq_ z3SMqnQ4G|A|2@^zA2qG3sz=e9lZmZlf9315kMAzd9pUGiom1yZg>&Zi&%0;Z1C1Vi z7JK3{u0PeyJd0H|gtI)SK#19mJBY^wDV!zV>hBJ!nyLgCJ^Hutxq%!J^k9D*iXfDL zA~$#k>FK}fx&}zYeRi|=yK%Y63n`ZrSvNa8R&vlftC~fJBPRu8D^Y?rlZvq+rHYWs zSgZquz}^I- zOFEEL(fLz)w>xFWvv(kI`}-jcZo0dD6yS}bG$H{e6RiD?x_qvG2%X~9y>~6iIU1K= znd$JS%N=L2=Be>)8*h3r5>y?Ejzi%Fel>vemX=ybX{jtx)(5NVUmxe)TzWp*2uadd z?Rv^((cAb>LvR2&VF-jt*{Yb~)7I_x$#M5+F3#pL>I7P4&ui;g?`Q07B*MVlOMy?- z%&$voNX}dH7upEnm$URoN33VY9IaZE*+9u&Uz92?9P)gJpVApmM#vG=a8m`MUoomG z%k|JJ-?2RqIR*pWC*d1IkLx>+GCa7}59H^giIfn()_&m4yvGL<4Rtc={^kh08CFn}i`c>~(Yhp$*l<5muhl-`*G$X{nO90&L z!^%>JE4~DOD$U1}3c$zZx24om0DNSx_|;NsahUJ@@s9^rqrPSdvYDRIRgSfxEBT7G z`vh-k(-p7onTxhzROy$L`f=!cFU($HaU))QcV3_0UtfQt@|9TGqpz8~cTmiVm^YvR ztbs&U9j@qkn3? zZsGq{j{&^dqZ9VjZ}s)^qFN|5Es(g{3{mCi?z5w4<%1xi)h-_68dbvh^@(ERfzUl2 zScIemPbt-YzFnKunsYUL<7GXpa@C@Fr|5thoT~S{iCy9RrvU5AJU1bu@@IZ)|2+EL zKOJ-rU0IFrbi9SshHt8yFhul+ha$-%;4o#BMSHNlNuadQt^R3JvWhdPX_Fy2Te8_q)pYqn{PIc-DsonkqCxS($C((u3Jk99iGg3m>E#OBd7=_>q@7? zv4yW89`a&|3#m$_cER`#yKO#-$Gh2Osi>?;dgsB(#EtDprR}nbDjHHhb^w>Z735fM zp=?IiUuVYt2p9&NhoH??fxv)Uz+uLdopOkLP(UKPI5@0r=^EqMDE&~X4Cn(HWbq!;Y(u5AdCVv6jAlN zy+D8Rjo&9=u(3^gy3z+kS`H8z+=K}C_2hVObzA7nn$8sg_`I{~GZR!n#HeLbxPUWh zpS5{qUfX)Vd;HHY;!l7(QI7rEq9aiP^=!PCCQ&R7bGpXN0|~%Tf`%}sdSE})6l+)@ z)Agn|wTr5-ad?xkin;UDJq6fP2|q1(E1Bm32r(vJzHY0)PD{?YR4`VCT({!oq57)0 zEzTJt#AYhk%E8DnwNPKhSe6JG(3Z)WQmg}pG&}lX0WM?tV)OtrXqCp7#EStKKT>aa zi64PZ=M9G+%#Sg(I0N|B_4_ZJ;;d$pldeHD){lmrq&hS8hI+V?GA($WFb1DUgaO&E zyJ_bd#TR{pjdl~bQBkl5cNAb|?JO&^UQi}jN-lYSs#tMs!KeW9rLQ;1xVNwQMi;R4eX$hc3X zWX;tU8-8jlXF+!aQslJG_|Lr+#kqCDhpO-tU`>@%+OUeEvO4^EuUW331TR7%Rw}?o zSEln!Be#1L`i0|?y41(GJS5iVTG6gMuEYmZhQC(Fcw5uM;|89%auNT443(oJr2eK) zU9iOvE~cD!Dtc-mX3qkC(QF{Q2OJ!1Bh^;Fw)9Ds=7 zPW-5_cZ{w+D})`>9saT!8WpcC*Xb1tn&|#+Fo0hVvy4r8^=F{VX_ea(c&lXXL(v;o z(LcoCcv!Hhg()_8dy1+!m<7BOvR z;+OI6h?jDw4F!KeWu%2@V@*NO;0Z$t$<|Aw7p1c+bob?D+?RDR4A;Fm-SwaxtXfT$Tla7J-(QwV+^Dltv1bBZxlHRGDkRcd1kK;ze>JYiVU| zrDJ8xgwxA+>aR$(y8qPCo}1>KSZ^WlR}{4K*@AL-p9#4$bk)y@4?!5?d*#bD8ap6D zq5HVA5gXzp3v-2~t~1q~0~CoMVrRGczX zW)MX1s!yj2B|V!X@k`#~-KU>{2N+bEjd=(RPsAObkCRxb zYJC7ReDKy9O#_DO#c?3src|LB`x(PzJNIkGZX}=V?rwZ=6j0-;t~hD%9%n{}0|<#! zVCMRD)1%W#M5MA17FIs$tnSN+;Ep2zJ_3|IjQR>4CE38&NI z!=FZmu+KgNGJwdTh=G*yupuz%pXZ=OA&-71Ix1=w1lKVqnmdCgG-yM0E*ZjK2!5c6LlS%ZA4OdG*y4#uX_S4Zu61r z!46aiSEz5Jt!325f6on1JsMtrGY;wbbf2CtR#vd^=A>oTQE~f6aU=@1U=&Tkx1R> zT;LzSnlItWhgjYEjhrGST-RlS`ca~D^8{&t2EJu7)*$Twyk;?-g29vewLKmge%>o8 zIxYFKt`P*Yp0~`x13nk2CaMp*^l9=yJi!QqKO6`;Ue3G zN>m1_sZHQrI1X=g^=~uO#TATG*;ky;U<9+p5hRN1`H=c%VD>D3{}6Yk68HNc!=mkp z0qwc>59(elktd)xnN_A(C!)*VQS~k+(!MfFQc*|Lm*f1@H!#p#uw;2EJo$Q?a?x_? zw6F-?ubf)Qm?c=QV=vO^C(usy2cAelF8EmB4*EvV&5Z=K*G=W2Q7OI{QDFtEhoQf@ z1hbS}dbk)q5LW8tESFr$w*wLifHSi~aau`UtVe_Szpp(EsywHc^0mN&38mDP?0A71L4Wj3>Lt_Xh`rP;amvT_Si=YQ_u!P zSSwo9{UHKC#pET*?;`=MxCPqf+QH3CRA%eM_>qj%$O|%#t%To?h+ngGOl>JcxnWL7 z5S((yVL%G$VrZwK#*7WsD+wNWtcfrr-Xri!ua$oZrA>ke%0$hSfVc>#V7We@s+S0v zs;IP`ND0MZbYNw9wS-h=b)8B^0!ZBqG*aVbQHizW;bKtghYvhw5JXfhk>@tRB-1Wu{NW|aig5d$O%|{{ZPyu=l{*J5JG{b zSLC9S;5Qgk>=R=xJHi?M*(+KJqI5+j0QmfyO5kGO2m1PM(v^VA&{Yx>=DnmX7P5m) zvBC{|L4sTl{XDv(A{de%F%zm8LCSoE|2woh5C=@#Okv~&jO8N4)tyj?MuI?%5g&py zX_A~V6_xSjH7pCiyUf9l2l5;rWhL-jB;;H>N#gPA7elPs+6S0qCdTJ|7OWFsRMNA*K&WAKQWF^iQMbN9%Vj; zW@kTNccEO1QvoH)pu06*e-syT6+S2rtV28v8)~9-w?nt(bXUYZ^CAHsi6qL`lXYK3 z7cA#)x=Y5%F<1u7u*eO_cQmGE%5e4gGqr(3fPV`s8b zA@_Jr!qjEgdVp5#rkEqB{bI&b@(x;-@KLe#udAz|k83B#zGNP#BEX1I&F2gVnJJUQ9*-LOS~=Gv(cr70GyEb6 z&4R(N-_T`25J?#3U0k*QOqC`AY(Mz6a0>9WKKrL3M0nEa$ zfc!|?ScB?vAU(Vtd_2vXnKQNp%{#a%4OdbxAGSRjpien*iYZm#S0CXG&XV0E6F^~9 zB&8?wxLRohNP1lBDt2wgso<9?t^W`_=>8fZ99wY|FI58G=!sTnzwXh`<+enM&zX0l z6G~{1DhX%t=vR)AJ{q>~MYtMv-tFLh&6r3Ylu8H&_`+uyOytHvaP3C9(bsRIjlQ3_ z%;v0Ftlr(>cf}W$X=gn?r_XC%I=j>B;KPc5jo`~oj%;LxW;r>{a@%Oya>!C4zgm=g zKrS=uLLuXgiuz0=f&75oSo7A1L8qK$J=wPExl2!Z$=BamgxW06*>8xee{K`1kr==W zMY$VhzA1S=eb^sbY;8kt;IjN~%D{@-vbQo6BzNehD)4JbaG`JaEXMsxk9cyB#EgvC z5r~dN*#5ZAD0VZc09a`IRr`_K$rG)*<=2O!MFTe4s3Z)2Iq|P!7HZ^q8=SMZo7v*G z6LhCrt*V;+3&d(zPV=h=eN!j?h@KTB0WEjz+ND|_SArw*KSpUT*w!C2#c_6X7>vu0 z)E!&hU(w^n2C)#Q|*lrYmuRm}AtrGLCF-0poSZ~)!B9Qp{J zfcwor{**s>DbQ*%NM|BFtW4~n!p2u|OPk3tpC=#wEX;4k?HZj8!H*|ls0waQBs9^{ zO)yqFO+qbPG@qXaMQ&dLSb7#T^J6QxauH*)c-jA(*abrIz;%sfJTtm81oF6me6r{v zOo+J0kqOq)LZ!TBiu!R`u@Jv0mI+RIQaNY_mX9_C_AVsS^Au`ymxLdC0!0^rA3^vL z-KwXKcoyylx3szZUSe4K{F}Qs0!6T6#bWAcCavbv^1-;9uDI1oK0n_X0AJ(Rv);BG z=h35?+f70KI{de+w|%-)mP`9>F6-qb?<85VD+DRK+wzb5HMvA2Rzt7G$qxVatJ-nj zWNHhYWhQ-bJVW0Uvy{Q*6!(22a8lVD1AqI>5?dFKYVoa&IteFG+mbGh-Z|j1%|Ki1 zGxy0)ka>$KEb?uB0Fb5nd5;_bYuvi`-H_uh{YV)f9dH zBH-Ay2Y7TE2@hR(*p5jUBF@1!U%N)9q3vq?LduxFV|mabLvxZM?t}+^@%I%E$0mv0 z3YHe~Jm-dgNdYSOlgDjV>+EhkWe@|zws726WiU0=i$8dF82WGCp++q(mU18#XE0*v zB2HF1ooismCP={8%ciK+cbF|IOEP&#T~4rMf;rh2w?4RgeU>dz)VZ=QcZQgq9uOC4 zT@1>47TcOU5s3m~^ok$DjtLaC+kD-0tbKtZt=A_DVYNQL((8Nk?(77pdbz0lP%^%~ ze@|W)!=&}{cW3BBrw=ye{qE8`-O8w+gooGL2H0IO`DWffa74+vApP*(4P)aH(nsYm zRBBj1TjV`rsTj(45=ZgOArXApbO6jZ$iXsnph@d*-X4PGSe`!w0p-{h99jB`x;}N*95-cs&O3DJOxni%7;uofwT(w3R!nvtFRiwxnCspuac|$3H09G zx+w@=tf@tMeLzBf;U!Y7M&d;!neMc5*Z+D_xbSFm80n3u|!cGB~{;Ox(bIzlccr?)g zSHo>!JNM0mX7=zUc8nw?D>Q}H{HFKSF`e;`-a8Iu;Ju=kC$&^=W6(N}%r8aGaON`R zAKDgD3lF0YIbokTN2k;de74a530#Sn-b47KBdaR}KK*w(|FWkyL8MnCwpTL)$6jJ z3n*w>#nMzx69{@pLC%!4anC?veWFoDaNdrO1~Zq?_{9BYlPAmYYo+7-IV_^1V)SyK zbR)-6F;EF}H+6aDp^bCoyY!GRAhms7(v8^O8`DIPS71?T`DM2)=fEtVQ2sU$MCtS$ z)s8l3dFy<0J-{zCp=*)O)CtfeWrfN#`HrQqL!pYzdvN`3Zf+AhJT!AktvTjYnViY3 z;|vLCFqwl4jPCe!=b9#F|~y4+RJQUd0wvn1M1UU__S@#&=LjT?;4*D&js4 zqe5KXzfl89UjI2{ht=>aMm4&-sBExZtF*cnGTLbT%ufpoXl#ZjN_-7xXpX9BO$UFg&Zf&RG@-mO4 zxSN$d8jpJsWzoDL!(npg1@1;UEAqK3^6F~&esu=Wwd85>>;=V_2jO+2 zyEL3rK#@ub!G`F|BDl0_vRV+Hgp7LEONrmt@JJvsPUoW)hfBpRke7sp3K8lS4eLky zX|e<#cu7|;k3Fb=3x(3+OQ@e^6pc{MGuJE&YF308X(tK}Qx~Mijuo zR`aqP1!O>hNm6YC!+GFyN=?q{Z8Pv^y6a>!|jRi`?lPzg=aXqP(Njs zZx*K&seq4Yi&cSBVKYg=)lU&s9MIlC>h)qzqme7j`^T*q@W4gshk`On){DDbjS3K% z7G>+~Mbz}CmHYE!%FF!l+kx|Ta?)s7B)tc0AIp=`-?5HOC#$>TsEVkPXsNkkX* zlZEPjz(ayY*bo^G!)xpf9}O9=z^@BrngyP_?H>y$uQ_%xvtHpVWigi53U@)W&UM`o zy}upI>(Fc2x)PM!=+$5}`LlfjR?R+YTQVsO_h=N9m@EJxe`3WVj6O%tD2A zBO=D@Xg_>~#l*4J>sV+N;#8)nZ43w~}I8PBy!c?KwE zX!xHHSO}#ty-vygJW-e2JoUZ+u3B-=8xT(32zhbFZTn^yxS53lV^K;17QU&_X$1St zhXiuGhu0yc%tN~^dcs=iVyCYa);KQ*7u1Sd`>Ve&;mTnWF{!c=AS=XerG_;*yc}V{fpXksh||Tc7N;PTZo1;S?A@m>~2-J58U2rLBFvULd$|5 zp6_teL9KLtvEd4Wrlw8E@0o};OUL#LJC{PpPJHnNDoAYdd2#<}65!m zo85!vUM^l#NC{}uMgIsbF!4JN4aLuR+Z>qCwTkgE`R~IaG5XmTc0&G%mgml9t%YA$ zMxPuOO|kH7puglN^y)C8Cd?#S2zL1=dbtDyMJf6>VOB<3i8=8RAa5+!H^TkaJFb66 zGJJ8-%Uhf`p|y);_luvay%vH*jJ>AF-kIcv$TP*`Ki3lH>PPE0bCq967ze3r-OWpK z4A_uied;;0EcA0i8MOQBg@Sh+w`c$<>`i+$EWEs2chEDDa ztGs5tLa+N~y_BIT)UC!5^m^2{S^h<>%kf;iEU6|{9FqkP0o|V?ygM2-egNrK1`pyd z&=RxPD}0Z%6EFPcBl1A)a$^AfHirsxDB?qtS~Ykq62k^b9^CIWita_ zqGsnkvZ;?(edMKf(UjHxWPi=eBjsea==VOj8vf8stdHTMutJLQRCf{LG(PA>q)D9Q z-3Na8$v`#(Js{k=D$b${Lklo>3}1}RE_!~RCGL%nLc)``ApXXOWnjw9w#uM6p?o8G zSND5baO4Lw9ktsdEC-8$98HDx=442+`)?t;c8toKyCe*fb;TOm^svPIlpqYv z{NM`>HcUlP%lt^$H1*s43bS7+T-Q;D0^#V7zj~K?@#jAbyB;=0WJLG8s^fe!V$9Vc z2v2#4%n5hT?s*&m5}>CL?{_?Ws&C)@K5EA{D44x_*+0hox)r9^a-EFdPlfa^W9R;h zdijD1ESBOgmHKm4w&PElwO;myPA%V=09RNd91Da?Gra`@;)g*nH(fJz6!3*^sz?4Z59J5~3-+vmId)b)Lc> zYg>Ki!B@SlM43WbKOBERZ14@wYTJW8VdUXI3hE_65ELIwAdiVeJ%0Bj0R~|caNXrM z^%{5J&qsS~?t!u99%Q6RG9PNB(z-mwi-i~Z{Y}MGofN5fo&X&7Uuam zF8i&UIa+WsCX7QuDB60f#haL#gTtiq(6iCvB11JX zltuT#C|tmPVVdqj2J&8&nY)3A*&hsgX8p7(BneF1W(zo#=_DV@T# zUyj7>!;s^Es71qN_Gz@BCo9aaw@Yb-x*K5Wk~iOV_hNf?_b2TQPKC7sC0-^K+RrvU zjeREHPRnsv0uH5qf;u(e%AHP#)B!3~?y8JH`f6GcgS;(6`kG|#F`FVyKL8Q~p!>X> zkX;n3TehqX1QudLs0RLSbKiz> zw6WIzDr&LgXe%c>AOSu87y}Fun-S)s0?KeH1uLjAd4>n&3RHCV#H<}W~DUv74vnhOt9nfG$p>JnMT+L|> z4S&I-*j|jPWz!XF2pzpJphuSPEp*+*6hW{sx2oP!HF0sMQXH!*v(!&Y{7~`s)g`aD zDjuND#$T_#ts4?QV%OVY@vQ2q(Z*Lnk<_{$5E?-gb=VgIqm^dCvFJ6&>S9g9&jlZ! z+}#QSim)^sbgmQt=h_I)+0XAhkSvw6}jEHlU3qH^{v@%Ht47`8CS@M9({&D_i zK*yy9OX(0=s@7dnGiZH4b$ajnuMDvU#+OV6gB^K)3MYRAv+AJ1coMb4 z^YDdXxqIHH(-KT3nf=~O`mD4@W-p8LYy_TQPA)yu#Ac2bRdN}ZpCQ`;xeGq|HWjlR z$rm>+_Z2x-pAS2UQZlm!(KmrhE?uaI_L#lJQ{4S<$F`)yG{Wkw4~~grwSfB99MNsZ z!aAixfOhwKN!!y!mmth#z-afPN8C@D2y#!xn*P>Bn%1woMV++4j{C>rhruk?^$t>Z z<`n(Nx8J(-uFA3K*&1Ng#w<(EfHz2%m5RtEep;~dg1uh*V1MnSi_rkmBXN(=k)qkZ z<9kevD3Bx33SB(+b3PwQnxLzh{-wqqh!kLE;K5?8&59ZH^=D|pst5Rz1Wh6$JM z;94q$iK>l20S`@syH#kj10UX|%pHlbW)ml!;pU6k_AW|MSomd8v&~i+aG?`>-q|kh z{X?!MdTOgH{OW?)q1iG>G{57?`c}r1-tS%8K&oBa)2kbuuf1;coK%TuSg&dKvw#4m z@Vkgx)>r2VsurjDkv}HC<;0Ha?x;RY=ZpR5>GJ+{-{Bey$4RZd?7y;kZJ8we*at9z3W*#HWXn!Y2c!NKw*!kmkr@Y6c$wOph3X8{+Hxd7 z-=tQrXT6|FFKt~WD3`h#Tc}b5K@Y>J75pfC5=c087Av~mcgOHpP1oHGBxmG|@yG!AU&EQsn&0ho$q(I00( zvpr%0?-`#(u)|^txs-)mlUY_+Vl2Nex_WKn{yGG zABYt5JHErhc98t}`BuHAjQ1o-9_(DkeYqxm;n54k&g!Om?dl53O@&fB!z^^BC8g8`28rLl(PLSE71rw~<4PggPZKlfpvE=IjMM z;{FLxn2-1&)5jd!@%kJt`psDU!*;S%@+?>o7HIt8!w&<^DGvKmpwn~ zZI#+sJYaVdLwGh|YINYUyRDySM+_3-Jb7dp0gR~%nz0Eh6gYAEa7E=*-r4WK&*e33 zA~RNmhC4b6R=anf_p{R}`TI*%8dpeRUS3FFj(ZjtC7Sz>nG;9_jRTOW3zV8*^QA9` zH+kAC+=B$+FZaMt?}sp3i0UMLX&5Xo_&|k}wZ<}S*VSh#`NL2 zfu^D&A7tuJ7Uqy+r(UdI2Gic;@_gY3HYj)6SLF(?R0SxuVyO5E3b_~MCgX* z<8<|BrOA=SjuJ2H!bRR-aJo`=HGYQwhn*yPYZzeXz1G2v>1MX`xBihA!o>Lajc(Di zFj$thBI$S#`t$p{L;q|%Zl;nB3A|@#0(#+339lmLyep9{yBJP)z)yt~SE<7d%Ix<_ zZP6_EOobl9rFBU0ae+^?gQwEunV8D1NJ3)xy9>RV_`Ua$H|y%#m_-1xVDwu1h~Oiu z$r7)wq;yWHf>hsA*dl=M+}8D!&Y`h;c1v){r8hHRp1`M*@ms2%=0c>l{g+nei6J!6 z0#>5`q`ZK9{UAM}+mW)nITJj z$F^b~Wy(tMt*-;sL?vua=iiJZ+kHiDvE5=OHB??JIgXIsZ=bCu*}2#g)XQ`i3^$O+ ze_m8-<#q{%ge&Q~A1ZHNP9-b}&V@o2ucX5b6ts!VZ=F;L&4sPAHjdO zY~U|N@aPezhy<-vGh6M9aA6r-pY?|O05#k{!RB|*!S4{p>Q72ZT795uB0rfBway!K z=KW4NdVkkCrkpW|c}=ba8I5EIU1(}c;HxU7NQXxMphB4iYl&KfW{*C{Xd=E76EEH# z>*mrOca<8qnv)Gs?IBFCUO&DHrgo?Ao|_HL3~8=*M3*t%M$^UK%mLo$m@FlzJn0kZ z2l_CCz2uV-uC*^Lq&THk^c5H6wQNVj$nyL=M=5XS#8ezn3Epoc?`&l+QaFC5*S4ul zHXuTGE-=@KEqhtVs2-w++?^HQo4pH>c@lhLA;3sCrN(t@VZ~kA_DZ)s81ouN6TUps zJRt1@$Hkyov#_VlOfL;2zG**-gcA5@@NKTGRTtm3Zn$k-Yl3B}yH&xetbgXeAN`MN zFhKNWM<4@|=gTTL0&bspXS1G?CerTIZWOJ#=D71dCQ;&;Q0wDOGEHh(Z!H{uQK^2PF!fA9v@dha>_V=Z|pqI7EoMUkjJUC z3xs4VJ^_Sb@+@*IXNOIQQ~g_FxakkNE9;iP=d{<* zp3z3Z^V2C3jcPLWf|D<^oN(&J? zGD)g^I}2J~b$@Gh9P?In=ImA`VVX_X@eNf^>zWe_RSRx0OJm#mWt_wMuqka{-!yW<_uMf@6RD zGNW+U)eml;FX&NTuT-}h43~uFIPideGOytN9G!?s1tj$+F5N_+WCbaFuU?HXH9zx} zTY@}oX`P;yCm~No2tGovEo&Df{;!i=<-`HgQ{9qw3zXkn`|IxANzu?Dq%ldpm17Az|K(%; zPsTpYXdz|A^@@S6`Ct0=Y10=6hm4agB#mo)Ci=-*8)GV8PN_kb6IPc|SVk|T3HDhH`_zo-_4wmh6Ls*Q8u@|+R4PGOEjL8(4T{(!?A837 zTTeEfox@6Oa9N|xBddh@iA4aNkVjVU@xAz10XiPpuS@TYvrUIjS_oN-Ua=mX=_6f; zJAJ*)_3g!$`kL;tEBCg&6<_}GfK7oNpvxX;J8xTv9nFg6IYp3oI@l-f5^w!}r#JlP zj>^&ND=V#1(@53Yr^%oF=|cGPsJ#|tb1yhk#YyK%Hr{w%GK4W@D#caGU_l6rwbBR1+jn>dt zHMj(e>*jL#+W9V;G*YHjSZZvb0=k55iyc0y3eyZr?tgW2F=4iq1=4(IE4gz*#CNwu z%aPJEQ>`hxF!Jy>qdCBm2IK~D0yrM}yoZhD`2cUyG%kPri%v34r+ ztk-9p%Z~VZzmNiTgn(u5YP`3H=BNU(G>=REFN%C2UikyQ;BnG>( z6`}dews(OOhKEQET1Isb5xx#OnC4ttrBtPk2LwR`v&BhuVNeJ9n`#KW!fH$6SMdas zqiB;k!GrW7!H8Rq78l`zbmn@8OS;)!J^%XD{3~iL;vi-+yx}kF8m6Y876e7Fp(0@B zHa;;+y1%Pt3;hCd`v~YzQ%OIpxM4fJ*9l$vpd49^K4~ zu2psipUq2UmHN#|FO^sdD=B;O=?pbf!|44i$36MX#s}hdTit~Ok6qNiC#q+7e~@=8 zeH1-$>~cZ}FuWhTcWO+Qx#y9=Fwf#8{kj+7)b!QFPF8<6P5AwE#?#h|5ArKsHPmp6 zIns0C!8s!>Rrx!apHfHc@KDA9IyfLPdpex%1Y%7vug=a`#0=N_a%%}*9h}g~xaoi^ zAN@V1Ys_VZGtV=;gO3m>?)ZMRv{Zn=`_v7-H*Re8^H+PQ<4;YkEHBd1 z9FMeW=R%F5v?{rHRo5?JdRfBjq9w5^be~N^3$^(QIu2sY*-_dCi1M|hr>~<0u7)NU$7^X7 zW{B@TJbx;$ZWXt8H1BK7B_%z2n&dN%FpQ({r#72lDY?LhVM1rTnIEBgBThmfof)hd zvM68hhpSW)vwCK1dZfHp(KEwqh;YUmxY}Z zrv`eh2W{_~$-T{M4ttuZX3v;OHWeVjN=d_7LzDea{e}p5$f=op5Y9LtVd&va|DD|` z<-wcbm=qg40#Tzp!BWga%XIigY3uW^?m0}$(4RCFyL zYFcY46qw%a>6>o-!5iB@q?B2Sl}n%DDMEXg?m!<|%HhfpiknWH;Wks$&s1ot;ZY}< zwx#rau{~Zmg`xhNwfAOyhWBT~u5w?Ro*Q05>p~PAUlEQJcs`?fq=+?DOk8@l+-3>JOH`g0$*q^cwqe z@qx~XyUKuaKa?`aR4qCW0S?2((gZhqb3gODzQ2LG`Ie;Pfr^1m;q<9fA2VdonBpD< zy)1CaM zwqS!^YltFlEq4&1V8ZRK9P>WS>lan3NM|)JH zcU!d46h%DX4$)!7y&-V_cZ#_Ci!W6&#(REg<2af;wKj9(*ZFB#97jz~Q1kpSLZNu)19zs7oG{WNH7y``|J1TeaeHRm@0Ov{qcy+5;DKF506Fw! zH#MWU=Gzz1W1XT|cnNNVia8oPmL|6thBmJ64=bEjwfq25cmNgv;NfP?$TuXz^zaS- z_(=Q19vYKYOKY`G4jFxtrDK)7`riru^nDMo5x$NVb{y!H(?L<=!4p0CtKQvrBNICp z4ClGc)IA|0Tww;fV2FAg|MSQ@BDIl)$?WUHAM-S#wsDp`>a9Lr`G-`ZtD;8oasz|+ zOF6RnEh0E27z!F~804B2l$Wci`xU@1m_g6%`8^yP9?ia zWFq>J5az@k0~84!Acx8aJbIRJ?Ioa5O6?5Dv@{Pl-EMJ**?XK|bv%#5C(lsE)|=J$ zieY%5)v%Svoa3`t8%MmmgaEt`)0U8tP2z%E?(}>C#|ez7<^tPWmuxK62hxx7Il6^~ zGlVhGsl@lEbOv{*Z+G{qkbBo0&un1uTV!n5RRnRF1^sI_`RWUHv8s1>Kb4h*eLBf% zA^Ea=@b(@S7DKzXnlfAgz(@N&A1k`QR9_A^{rOv*m#VUUx#Row;M{Z1vJJLVz#Xj} zP5s2^N<|AipmX&k>w_W+e_1%h2j!FhBxF3P-PsrK`e31BmD=f%K}tlR`Zy$_!FE8L zba_~IkCJUVjyz8;9^H$xu^sUV!=o!2!=|BDhn^V^jMQ$IE!5$u zYUtCvt$JNbGk3Q&VcAwE2_{MNIkpp$i}Ft(wZuH6K6OyE>&~eh-RCRuOw>_l{V}Nt zrEehX&V3AEWf6=r8&@JyA%lUFm@|={sh@Vgw>(ZXXdxa&!e|tww#`CwTe0k4$qghJ z|6KD+TAGqQUb9jCeD9fN&KEudXHRiuol=c*qAOUMQ)z6SLfLV`zTc1T>$^Ze-3^*s)oS6kuZ_BNb<4LYD zsK5eho+`KqY0vkc(_}n*6(P1({42SMTfs|0P~k+V7!&{))On?VPZB6u5vv@(`q_K7 zVA7&WWcJHhWOoKzqG1d6Xza(88|Ke1Wx*dOc|7iGdX_vJ8Eg0e*^&o8IC1CalqrT+ zD3%aI;Ssvr264pDdjZ~du1q^Q|7LcT6nTfM@KJ?GH=h<6xG`>z0)5GtAz9WpA2}D_ znkT>`XJ2+E3R1c}!W-?eKz={Al=zn{+m%(Au!-e{97D)Yiv&#C%|RNiZK7E(S-3rH z0C&A2d(~{*0YADOP9eqp(S?Q_M#o!%>1F+%LeI8^-~ea(6Msu_A^7A>4jpKIt1_QF zjch;8ZN&7MKJLw04@Ym;Ji_`coWZ)5xM?tWHSQE0rBr0L(klx1|%+A9Ag@d*pzTT`_%yZ8g z>wTH8&-fX~ZzK@KuMYX(f+~GYO(^t*QQ`r1ba1FcC3 z@4fsAuGwj3 zNSbS+^_1Xxnp-oK zvsa$u!oO+m-wlI(cu<3U#GN!7cR~B@R#c*H8y}SVK$ZNY;Oq-n&IN-BSbbio9)VzQ z)A+#ME0P9u6YoYKO_CF8h{AaE(Fp9-C7c0SOV*=NUxs<7=2*sRx!8{~%6YTsqB8V} zMTp_Gf9as+!&J(Q5(*KYB!hIi#;D45ItYP`f$PUAoJs4yR9?^H`kXS$M`NfD>IsGG z6z4VNm#OsS7F1)#)p%Yt;U?e{ExWy#DNEF{bws zfJ}nGX>yhY1l7T~3IeG=j-ONQzq699Bl+>;mPj;86Fdh+Q>%cEa?9X6_1upUYKC*` zhTY|U(fI>^8|x!ngw%7+dGz9X1>$o{du0hM@vp7r{-3^m7dj*2C_2TGGoZIl5?trF z0@DO_TIH^QcRjtoI>#Y~AQYDgCewth`OuV&iJ_Ge{l7)_zk{SR5O);-nq&)9qK?SY+=sE?j?c)kBJO$J16Ym$O zgdiCwN)lAb#^Cu#I89k6mQproQyL&0M+yjnl<-5i zG6k7SwJM{-fv+4${3$nm6hb#0qhSfNMoF^<^+yF|1>7vauaZS*gQEB4_q|Zl1fAwj zNUV4t>y%!cy%$JfDin`)D(OE?y>mQsTt_({fB_@_R_FY(e$#d+ijbUxo;o8ivSn^NUpp~eAPk4_L04WehEi$J`iC17q6dM=KM{nUr%sj~v_;7o zf?)pfxkp>lI0~|V=a2fsLW&kl3Q7IpA-IlV5k)_3XD2!-I4OU#h&!@&l-hLk!8p1F`oPp`YW;4bI7+k? zd$;i#!>-2QLCy0u)F4GHrF8oF&;d;6cUcphd%lW5PHgJEq`rp$^efS@XAvZBZgEZ@ zZb4P5BDa1u)?=5NlX^cuFtczUL;V6HEM22-na?&I0ZT;j1j~-jS7LI9{@#$5{J+^{ z#>LDU7YC+#8HL;a?Zyd$P_#GC#LuwX2s*?Z5qyxleo#c|mw`SNuf700!43|J_eg3N_JR;-7sf78jj~ zSX3)p!H{!^{Z+G>jiK~e>9Y(Yu$YIyG~~9V%E?hqU*6E4&iX%gfYBWRrqea9uy?#D z`nCVaJUgCNesYqcpOhM6e%n3)E^osu^^0<6F|yK=Lxy`pApzd7IE;Gis2A5a9GSUJ z0xDEUbvh}6qQj>gKCe~}0f}MJ8Nqlcr*OUbGn-W4RL)Tk!<{_Z>+^Z3_M3ibl0;&3 ztWnYnY~`D<&yA)l$F7P*4tNk+RhSV1=^|Z!h;DnUq1ub=QG229N&341l}Vjr6zUE# z_n0}A=KSf0LM=h2OF|jgyk#cE`@EzjM|1DXN5~!&A2x2+DYjmm-n({b2l_a;y7``v zV!>V$IJN%aKg?L;U)m)H{xUtHHs#C2#=SfhQk}EPYM}kbNDL8KA8Tu%X@yaP(C^!n zv&EsAEBqi;U?20gq`}b4bZ)2Ox~FY`TJ@OhTA8gZQG|lfwZ)@zIsyU6%v?C9x*F7o zmq!@cB?ZTB*E)ukDKec`U{?uXSEp9RWyk<##3rO{j7X8pg12rR<`tW4CGiVEQyUmc zm(5_dPs=%>yu^~6f?!D)Z6O^9FaoPcpDY^+kE1)yjvn{Vjz?FoZY9Mm=Ug8ED;(U= z-%Mpl7la`OasE`%<2YpW^voVkQ_cgf=Mz*EKJ>9FpP|XwPte)hfEekQuUlMFuSg2! z1iWiRPnSt9td1Tfjjh_3-@NBR3e;I6+}EM*zeyboFa9OsX_0Lf+6UB2N4of_W`}cE z_c}0nyu$s~^Zvyjw&9D4gv!{7?-HwU$Kd#C3++cqEh8e!AV*Z3Ka!dJnAEAg2Zt3JSD&|R|SvBAjSe* zz7Wn#jY?Syx^$;5z)SeQ&*@+{9oa$G6=p32d%sEwv)1PcHIU&ECa8%ut1%SQfp{UP z=b0oyhz6ySUjEhvxL)`zt}-6DX}0GU-`?!sWhjl}$pmL=6+;=5Ly?fX%)IarmFnm< zm~EJzDS z7)&cqnWGK^eyCzhRS2o);%E#S#8 zIdC;hZRBp)x`hX)@MqX4SN5%m2($dmE$}A;cL6KQv--!ebmp1>&k0-?byc+&fVB)Zy;g%f^K|2FoO0fosRC7ubA~;!Qw9 zG|@mH2*p4{XWCcZsc>RtK3yQBU8l?F+|03q>#>fR(fJJyh)xsyT<>i7#EddOI<