"use strict";const version=2,canvas=document.querySelector("#glcanvas");var gl,wasm_memory,animation_frame_timeout,clipboard=null,plugins=[],high_dpi=!1,blocking_event_loop=!1;function init_webgl(e){if(1==e){function r(e){var r=e.getExtension("OES_vertex_array_object");r?(e.createVertexArray=function(){return r.createVertexArrayOES()},e.deleteVertexArray=function(e){r.deleteVertexArrayOES(e)},e.bindVertexArray=function(e){r.bindVertexArrayOES(e)},e.isVertexArray=function(e){return r.isVertexArrayOES(e)}):alert("Unable to get OES_vertex_array_object extension")}function t(e){var r=e.getExtension("ANGLE_instanced_arrays");r&&(e.vertexAttribDivisor=function(e,t){r.vertexAttribDivisorANGLE(e,t)},e.drawArraysInstanced=function(e,t,n,a){r.drawArraysInstancedANGLE(e,t,n,a)},e.drawElementsInstanced=function(e,t,n,a,o){r.drawElementsInstancedANGLE(e,t,n,a,o)})}function n(e){var r=e.getExtension("EXT_disjoint_timer_query");r&&(e.createQuery=function(){return r.createQueryEXT()},e.beginQuery=function(e,t){return r.beginQueryEXT(e,t)},e.endQuery=function(e){return r.endQueryEXT(e)},e.deleteQuery=function(e){r.deleteQueryEXT(e)},e.getQueryObject=function(e,t){return r.getQueryObjectEXT(e,t)})}function a(e){var r=e.getExtension("WEBGL_draw_buffers");r&&(e.drawBuffers=function(e){return r.drawBuffersWEBGL(e)})}gl=canvas.getContext("webgl");try{gl.getExtension("EXT_shader_texture_lod"),gl.getExtension("OES_standard_derivatives")}catch(o){console.warn(o)}r(gl),t(gl),n(gl),a(gl),null==gl.getExtension("WEBGL_depth_texture")&&alert("Cant initialize WEBGL_depth_texture extension")}else gl=canvas.getContext("webgl2");null===gl&&alert("Unable to initialize WebGL. Your browser or machine may not support it.")}function assert(e,r){0==e&&alert(r)}function getArray(e,r,t){return new r(wasm_memory.buffer,e,t)}function UTF8ToString(e,r){let t=new Uint8Array(wasm_memory.buffer,e);for(var n=0,a=n+r,o="";!(n>=a);){var i=t[n++];if(!i)return o;if(128&i){var s=63&t[n++];if(192!=(224&i)){var u=63&t[n++];if(224==(240&i)?i=(15&i)<<12|s<<6|u:(240!=(248&i)&&console.warn("Invalid UTF-8 leading byte 0x"+i.toString(16)+" encountered when deserializing a UTF-8 string on the asm.js/wasm heap to a JS string!"),i=(7&i)<<18|s<<12|u<<6|63&t[n++]),i<65536)o+=String.fromCharCode(i);else{var c=i-65536;o+=String.fromCharCode(55296|c>>10,56320|1023&c)}}else o+=String.fromCharCode((31&i)<<6|s)}else o+=String.fromCharCode(i)}return o}function stringToUTF8(e,r,t,n){for(var a=t,o=t+n,i=0;i<e.length;++i){var s=e.charCodeAt(i);if(s>=55296&&s<=57343)s=65536+((1023&s)<<10)|1023&e.charCodeAt(++i);if(s<=127){if(t>=o)break;r[t++]=s}else if(s<=2047){if(t+1>=o)break;r[t++]=192|s>>6,r[t++]=128|63&s}else if(s<=65535){if(t+2>=o)break;r[t++]=224|s>>12,r[t++]=128|s>>6&63,r[t++]=128|63&s}else{if(t+3>=o)break;s>=2097152&&console.warn("Invalid Unicode code point 0x"+s.toString(16)+" encountered when serializing a JS string to an UTF-8 string on the asm.js/wasm heap! (Valid unicode code points should be in range 0-0x1FFFFF)."),r[t++]=240|s>>18,r[t++]=128|s>>12&63,r[t++]=128|s>>6&63,r[t++]=128|63&s}}return t-a}canvas.focus(),canvas.requestPointerLock=canvas.requestPointerLock||canvas.mozRequestPointerLock||function(){},document.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||function(){};var Module,wasm_exports,FS={loaded_files:[],unique_id:0},GL={counter:1,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],timerQueries:[],contexts:{},programInfos:{},getNewId:function(e){for(var r=GL.counter++,t=e.length;t<r;t++)e[t]=null;return r},validateGLObjectID:function(e,r,t,n){0!=r&&(null===e[r]?console.error(t+" called with an already deleted "+n+" ID "+r+"!"):e[r]||console.error(t+" called with an invalid "+n+" ID "+r+"!"))},getSource:function(e,r,t,n){for(var a="",o=0;o<r;++o){var i=0==n?void 0:getArray(n+4*o,Uint32Array,1)[0];a+=UTF8ToString(getArray(t+4*o,Uint32Array,1)[0],i)}return a},populateUniformTable:function(e){GL.validateGLObjectID(GL.programs,e,"populateUniformTable","program");for(var r=GL.programs[e],t=GL.programInfos[e]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1},n=t.uniforms,a=gl.getProgramParameter(r,35718),o=0;o<a;++o){var i=gl.getActiveUniform(r,o),s=i.name;t.maxUniformLength=Math.max(t.maxUniformLength,s.length+1),"]"==s.slice(-1)&&(s=s.slice(0,s.lastIndexOf("[")));var u=gl.getUniformLocation(r,s);if(u){var c=GL.getNewId(GL.uniforms);n[s]=[i.size,c],GL.uniforms[c]=u;for(var l=1;l<i.size;++l){var f=s+"["+l+"]";u=gl.getUniformLocation(r,f),c=GL.getNewId(GL.uniforms),GL.uniforms[c]=u}}}}};function _glGenObject(e,r,t,n,a){for(var o=0;o<e;o++){var i=gl[t](),s=i&&GL.getNewId(n);i?(i.name=s,n[s]=i):(console.error("GL_INVALID_OPERATION"),GL.recordError(1282),alert("GL_INVALID_OPERATION in "+a+": GLctx."+t+" returned null - most likely GL context is lost!")),getArray(r+4*o,Int32Array,1)[0]=s}}function _webglGet(e,r,t){if(!r)return console.error("GL_INVALID_VALUE in glGet"+t+"v(name="+e+": Function called with null out pointer!"),void GL.recordError(1281);var n=void 0;switch(e){case 36346:n=1;break;case 36344:return void("EM_FUNC_SIG_PARAM_I"!=t&&"EM_FUNC_SIG_PARAM_I64"!=t&&(GL.recordError(1280),err("GL_INVALID_ENUM in glGet"+t+"v(GL_SHADER_BINARY_FORMATS): Invalid parameter type!")));case 34814:case 36345:n=0;break;case 34466:var a=gl.getParameter(34467);n=a?a.length:0;break;case 33309:case 33307:case 33308:assert(!1,"unimplemented")}if(void 0===n){var o=gl.getParameter(e);switch(typeof o){case"number":n=o;break;case"boolean":n=o?1:0;break;case"string":return GL.recordError(1280),void console.error("GL_INVALID_ENUM in glGet"+t+"v("+e+") on a name which returns a string!");case"object":if(null===o)switch(e){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 35097:case 36389:case 34068:n=0;break;default:return GL.recordError(1280),void console.error("GL_INVALID_ENUM in glGet"+t+"v("+e+") and it returns null!")}else{if(o instanceof Float32Array||o instanceof Uint32Array||o instanceof Int32Array||o instanceof Array){for(var i=0;i<o.length;++i)assert(!1,"unimplemented");return}try{n=0|o.name}catch(r){return GL.recordError(1280),void console.error("GL_INVALID_ENUM in glGet"+t+"v: Unknown object returned from WebGL getParameter("+e+")! (error: "+r+")")}}break;default:return GL.recordError(1280),void console.error("GL_INVALID_ENUM in glGet"+t+"v: Native code calling glGet"+t+"v("+e+") and it returns "+o+" of type "+typeof o+"!")}}switch(t){case"EM_FUNC_SIG_PARAM_I64":getArray(r,Int32Array,1)[0]=n;case"EM_FUNC_SIG_PARAM_I":getArray(r,Int32Array,1)[0]=n;break;case"EM_FUNC_SIG_PARAM_F":getArray(r,Float32Array,1)[0]=n;break;case"EM_FUNC_SIG_PARAM_B":getArray(r,Int8Array,1)[0]=n?1:0;break;default:throw"internal glGet error, bad type: "+t}}function resize(e,r){var t=dpi_scale(),n=e.clientWidth*t,a=e.clientHeight*t;e.width==n&&e.height==a||(e.width=n,e.height=a,null!=r&&r(Math.floor(n),Math.floor(a)))}function animation(){wasm_exports.frame(),window.blocking_event_loop||(animation_frame_timeout&&window.cancelAnimationFrame(animation_frame_timeout),animation_frame_timeout=window.requestAnimationFrame(animation))}const SAPP_EVENTTYPE_TOUCHES_BEGAN=10,SAPP_EVENTTYPE_TOUCHES_MOVED=11,SAPP_EVENTTYPE_TOUCHES_ENDED=12,SAPP_EVENTTYPE_TOUCHES_CANCELED=13,SAPP_MODIFIER_SHIFT=1,SAPP_MODIFIER_CTRL=2,SAPP_MODIFIER_ALT=4,SAPP_MODIFIER_SUPER=8;function into_sapp_mousebutton(e){switch(e){case 0:return 0;case 1:return 2;case 2:return 1;default:return e}}function into_sapp_keycode(e){switch(e){case"Space":return 32;case"Quote":return 222;case"Comma":return 44;case"Minus":return 45;case"Period":return 46;case"Slash":return 189;case"Digit0":return 48;case"Digit1":return 49;case"Digit2":return 50;case"Digit3":return 51;case"Digit4":return 52;case"Digit5":return 53;case"Digit6":return 54;case"Digit7":return 55;case"Digit8":return 56;case"Digit9":return 57;case"Semicolon":return 59;case"Equal":return 61;case"KeyA":return 65;case"KeyB":return 66;case"KeyC":return 67;case"KeyD":return 68;case"KeyE":return 69;case"KeyF":return 70;case"KeyG":return 71;case"KeyH":return 72;case"KeyI":return 73;case"KeyJ":return 74;case"KeyK":return 75;case"KeyL":return 76;case"KeyM":return 77;case"KeyN":return 78;case"KeyO":return 79;case"KeyP":return 80;case"KeyQ":return 81;case"KeyR":return 82;case"KeyS":return 83;case"KeyT":return 84;case"KeyU":return 85;case"KeyV":return 86;case"KeyW":return 87;case"KeyX":return 88;case"KeyY":return 89;case"KeyZ":return 90;case"BracketLeft":return 91;case"Backslash":return 92;case"BracketRight":return 93;case"Backquote":return 96;case"Escape":return 256;case"Enter":return 257;case"Tab":return 258;case"Backspace":return 259;case"Insert":return 260;case"Delete":return 261;case"ArrowRight":return 262;case"ArrowLeft":return 263;case"ArrowDown":return 264;case"ArrowUp":return 265;case"PageUp":return 266;case"PageDown":return 267;case"Home":return 268;case"End":return 269;case"CapsLock":return 280;case"ScrollLock":return 281;case"NumLock":return 282;case"PrintScreen":return 283;case"Pause":return 284;case"F1":return 290;case"F2":return 291;case"F3":return 292;case"F4":return 293;case"F5":return 294;case"F6":return 295;case"F7":return 296;case"F8":return 297;case"F9":return 298;case"F10":return 299;case"F11":return 300;case"F12":return 301;case"F13":return 302;case"F14":return 303;case"F15":return 304;case"F16":return 305;case"F17":return 306;case"F18":return 307;case"F19":return 308;case"F20":return 309;case"F21":return 310;case"F22":return 311;case"F23":return 312;case"F24":return 313;case"Numpad0":return 320;case"Numpad1":return 321;case"Numpad2":return 322;case"Numpad3":return 323;case"Numpad4":return 324;case"Numpad5":return 325;case"Numpad6":return 326;case"Numpad7":return 327;case"Numpad8":return 328;case"Numpad9":return 329;case"NumpadDecimal":return 330;case"NumpadDivide":return 331;case"NumpadMultiply":return 332;case"NumpadSubtract":return 333;case"NumpadAdd":return 334;case"NumpadEnter":return 335;case"NumpadEqual":return 336;case"ShiftLeft":return 340;case"ControlLeft":return 341;case"AltLeft":return 342;case"OSLeft":return 343;case"ShiftRight":return 344;case"ControlRight":return 345;case"AltRight":return 346;case"OSRight":return 347;case"ContextMenu":return 348}console.log("Unsupported keyboard key: ",e)}function dpi_scale(){return high_dpi&&window.devicePixelRatio||1}function texture_size(e,r,t){return e==gl.ALPHA?r*t:e==gl.RGB?r*t*3:e==gl.RGBA?r*t*4:r*t*3}function mouse_relative_position(e,r){var t=canvas.getBoundingClientRect();return{x:(e-t.left)*dpi_scale(),y:(r-t.top)*dpi_scale()}}var emscripten_shaders_hack=!1,importObject={env:{console_debug:function(e){console.debug(UTF8ToString(e))},console_log:function(e){console.log(UTF8ToString(e))},console_info:function(e){console.info(UTF8ToString(e))},console_warn:function(e){console.warn(UTF8ToString(e))},console_error:function(e){console.error(UTF8ToString(e))},set_emscripten_shader_hack:function(e){emscripten_shaders_hack=e},sapp_set_clipboard:function(e,r){clipboard=UTF8ToString(e,r)},dpi_scale:dpi_scale,rand:function(){return Math.floor(2147483647*Math.random())},now:function(){return Date.now()/1e3},canvas_width:function(){return Math.floor(canvas.width)},canvas_height:function(){return Math.floor(canvas.height)},glClearDepthf:function(e){gl.clearDepth(e)},glClearColor:function(e,r,t,n){gl.clearColor(e,r,t,n)},glClearStencil:function(e){gl.clearStencil(e)},glColorMask:function(e,r,t,n){gl.colorMask(e,r,t,n)},glScissor:function(e,r,t,n){gl.scissor(e,r,t,n)},glClear:function(e){gl.clear(e)},glGenTextures:function(e,r){_glGenObject(e,r,"createTexture",GL.textures,"glGenTextures")},glActiveTexture:function(e){gl.activeTexture(e)},glBindTexture:function(e,r){GL.validateGLObjectID(GL.textures,r,"glBindTexture","texture"),gl.bindTexture(e,GL.textures[r])},glTexImage2D:function(e,r,t,n,a,o,i,s,u){gl.texImage2D(e,r,t,n,a,o,i,s,u?getArray(u,Uint8Array,texture_size(t,n,a)):null)},glTexSubImage2D:function(e,r,t,n,a,o,i,s,u){gl.texSubImage2D(e,r,t,n,a,o,i,s,u?getArray(u,Uint8Array,texture_size(i,a,o)):null)},glReadPixels:function(e,r,t,n,a,o,i){var s=getArray(i,Uint8Array,texture_size(a,t,n));gl.readPixels(e,r,t,n,a,o,s)},glTexParameteri:function(e,r,t){gl.texParameteri(e,r,t)},glUniform1fv:function(e,r,t){GL.validateGLObjectID(GL.uniforms,e,"glUniform1fv","location"),assert(!(3&t),"Pointer to float data passed to glUniform1fv must be aligned to four bytes!");var n=getArray(t,Float32Array,1*r);gl.uniform1fv(GL.uniforms[e],n)},glUniform2fv:function(e,r,t){GL.validateGLObjectID(GL.uniforms,e,"glUniform2fv","location"),assert(!(3&t),"Pointer to float data passed to glUniform2fv must be aligned to four bytes!");var n=getArray(t,Float32Array,2*r);gl.uniform2fv(GL.uniforms[e],n)},glUniform3fv:function(e,r,t){GL.validateGLObjectID(GL.uniforms,e,"glUniform3fv","location"),assert(!(3&t),"Pointer to float data passed to glUniform3fv must be aligned to four bytes!");var n=getArray(t,Float32Array,3*r);gl.uniform3fv(GL.uniforms[e],n)},glUniform4fv:function(e,r,t){GL.validateGLObjectID(GL.uniforms,e,"glUniform4fv","location"),assert(!(3&t),"Pointer to float data passed to glUniform4fv must be aligned to four bytes!");var n=getArray(t,Float32Array,4*r);gl.uniform4fv(GL.uniforms[e],n)},glUniform1iv:function(e,r,t){GL.validateGLObjectID(GL.uniforms,e,"glUniform1fv","location"),assert(!(3&t),"Pointer to i32 data passed to glUniform1iv must be aligned to four bytes!");var n=getArray(t,Int32Array,1*r);gl.uniform1iv(GL.uniforms[e],n)},glUniform2iv:function(e,r,t){GL.validateGLObjectID(GL.uniforms,e,"glUniform2fv","location"),assert(!(3&t),"Pointer to i32 data passed to glUniform2iv must be aligned to four bytes!");var n=getArray(t,Int32Array,2*r);gl.uniform2iv(GL.uniforms[e],n)},glUniform3iv:function(e,r,t){GL.validateGLObjectID(GL.uniforms,e,"glUniform3fv","location"),assert(!(3&t),"Pointer to i32 data passed to glUniform3iv must be aligned to four bytes!");var n=getArray(t,Int32Array,3*r);gl.uniform3iv(GL.uniforms[e],n)},glUniform4iv:function(e,r,t){GL.validateGLObjectID(GL.uniforms,e,"glUniform4fv","location"),assert(!(3&t),"Pointer to i32 data passed to glUniform4iv must be aligned to four bytes!");var n=getArray(t,Int32Array,4*r);gl.uniform4iv(GL.uniforms[e],n)},glBlendFunc:function(e,r){gl.blendFunc(e,r)},glBlendEquationSeparate:function(e,r){gl.blendEquationSeparate(e,r)},glDisable:function(e){gl.disable(e)},glDrawElements:function(e,r,t,n){gl.drawElements(e,r,t,n)},glGetIntegerv:function(e,r){_webglGet(e,r,"EM_FUNC_SIG_PARAM_I")},glUniform1f:function(e,r){GL.validateGLObjectID(GL.uniforms,e,"glUniform1f","location"),gl.uniform1f(GL.uniforms[e],r)},glUniform1i:function(e,r){GL.validateGLObjectID(GL.uniforms,e,"glUniform1i","location"),gl.uniform1i(GL.uniforms[e],r)},glGetAttribLocation:function(e,r){return gl.getAttribLocation(GL.programs[e],UTF8ToString(r))},glEnableVertexAttribArray:function(e){gl.enableVertexAttribArray(e)},glDisableVertexAttribArray:function(e){gl.disableVertexAttribArray(e)},glVertexAttribPointer:function(e,r,t,n,a,o){gl.vertexAttribPointer(e,r,t,!!n,a,o)},glVertexAttribIPointer:function(e,r,t,n,a){gl.vertexAttribIPointer(e,r,t,n,a)},glGetUniformLocation:function(e,r){GL.validateGLObjectID(GL.programs,e,"glGetUniformLocation","program");var t=0;if("]"==(r=UTF8ToString(r))[r.length-1]){var n=r.lastIndexOf("[");t="]"!=r[n+1]?parseInt(r.slice(n+1)):0,r=r.slice(0,n)}var a=GL.programInfos[e]&&GL.programInfos[e].uniforms[r];return a&&t>=0&&t<a[0]?a[1]+t:-1},glUniformMatrix4fv:function(e,r,t,n){GL.validateGLObjectID(GL.uniforms,e,"glUniformMatrix4fv","location"),assert(!(3&n),"Pointer to float data passed to glUniformMatrix4fv must be aligned to four bytes!");var a=getArray(n,Float32Array,16);gl.uniformMatrix4fv(GL.uniforms[e],!!t,a)},glUseProgram:function(e){GL.validateGLObjectID(GL.programs,e,"glUseProgram","program"),gl.useProgram(GL.programs[e])},glGenVertexArrays:function(e,r){_glGenObject(e,r,"createVertexArray",GL.vaos,"glGenVertexArrays")},glGenFramebuffers:function(e,r){_glGenObject(e,r,"createFramebuffer",GL.framebuffers,"glGenFramebuffers")},glGenRenderbuffers:function(e,r){_glGenObject(e,r,"createRenderbuffer",GL.renderbuffers,"glGenRenderbuffers")},glBindVertexArray:function(e){gl.bindVertexArray(GL.vaos[e])},glBindFramebuffer:function(e,r){GL.validateGLObjectID(GL.framebuffers,r,"glBindFramebuffer","framebuffer"),gl.bindFramebuffer(e,GL.framebuffers[r])},glBindRenderbuffer:function(e,r){GL.validateGLObjectID(GL.renderbuffers,r,"glBindRenderbuffer","renderbuffer"),gl.bindRenderbuffer(e,GL.renderbuffers[r])},glGenBuffers:function(e,r){_glGenObject(e,r,"createBuffer",GL.buffers,"glGenBuffers")},glBindBuffer:function(e,r){GL.validateGLObjectID(GL.buffers,r,"glBindBuffer","buffer"),gl.bindBuffer(e,GL.buffers[r])},glBufferData:function(e,r,t,n){gl.bufferData(e,t?getArray(t,Uint8Array,r):r,n)},glBufferSubData:function(e,r,t,n){gl.bufferSubData(e,r,n?getArray(n,Uint8Array,t):t)},glEnable:function(e){gl.enable(e)},glFlush:function(){gl.flush()},glFinish:function(){gl.finish()},glDepthFunc:function(e){gl.depthFunc(e)},glBlendFuncSeparate:function(e,r,t,n){gl.blendFuncSeparate(e,r,t,n)},glViewport:function(e,r,t,n){gl.viewport(e,r,t,n)},glDrawArrays:function(e,r,t){gl.drawArrays(e,r,t)},glDrawBuffers:function(e,r){gl.drawBuffers(getArray(r,Int32Array,e))},glCreateProgram:function(){var e=GL.getNewId(GL.programs),r=gl.createProgram();return r.name=e,GL.programs[e]=r,e},glAttachShader:function(e,r){GL.validateGLObjectID(GL.programs,e,"glAttachShader","program"),GL.validateGLObjectID(GL.shaders,r,"glAttachShader","shader"),gl.attachShader(GL.programs[e],GL.shaders[r])},glDetachShader:function(e,r){GL.validateGLObjectID(GL.programs,e,"glDetachShader","program"),GL.validateGLObjectID(GL.shaders,r,"glDetachShader","shader"),gl.detachShader(GL.programs[e],GL.shaders[r])},glLinkProgram:function(e){GL.validateGLObjectID(GL.programs,e,"glLinkProgram","program"),gl.linkProgram(GL.programs[e]),GL.populateUniformTable(e)},glPixelStorei:function(e,r){gl.pixelStorei(e,r)},glFramebufferTexture2D:function(e,r,t,n,a){GL.validateGLObjectID(GL.textures,n,"glFramebufferTexture2D","texture"),gl.framebufferTexture2D(e,r,t,GL.textures[n],a)},glGetProgramiv:function(e,r,t){if(assert(t),GL.validateGLObjectID(GL.programs,e,"glGetProgramiv","program"),e>=GL.counter)console.error("GL_INVALID_VALUE in glGetProgramiv");else if(GL.programInfos[e])if(35716==r){var n=gl.getProgramInfoLog(GL.programs[e]);assert(null!==n),getArray(t,Int32Array,1)[0]=n.length+1}else{if(35719==r)return void console.error("unsupported operation");if(35722==r)return void console.error("unsupported operation");if(35381==r)return void console.error("unsupported operation");getArray(t,Int32Array,1)[0]=gl.getProgramParameter(GL.programs[e],r)}else console.error("GL_INVALID_OPERATION in glGetProgramiv(program="+e+", pname="+r+", p=0x"+t.toString(16)+"): The specified GL object name does not refer to a program object!")},glCreateShader:function(e){var r=GL.getNewId(GL.shaders);return GL.shaders[r]=gl.createShader(e),r},glStencilFuncSeparate:function(e,r,t,n){gl.stencilFuncSeparate(e,r,t,n)},glStencilMaskSeparate:function(e,r){gl.stencilMaskSeparate(e,r)},glStencilOpSeparate:function(e,r,t,n){gl.stencilOpSeparate(e,r,t,n)},glFrontFace:function(e){gl.frontFace(e)},glCullFace:function(e){gl.cullFace(e)},glCopyTexImage2D:function(e,r,t,n,a,o,i,s){gl.copyTexImage2D(e,r,t,n,a,o,i,s)},glShaderSource:function(e,r,t,n){GL.validateGLObjectID(GL.shaders,e,"glShaderSource","shader");var a=GL.getSource(e,r,t,n);if(emscripten_shaders_hack){var o="";-1!=(a=(a=a.replace(/#extension GL_OES_standard_derivatives : enable/g,"")).replace(/#extension GL_EXT_shader_texture_lod : enable/g,"")).indexOf("gl_FragColor")&&(o+="out mediump vec4 GL_FragColor;\n",a=a.replace(/gl_FragColor/g,"GL_FragColor")),a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=(a=-1!=a.indexOf("attribute")?(a=a.replace(/attribute/g,"in")).replace(/varying/g,"out"):a.replace(/varying/g,"in")).replace(/textureCubeLodEXT/g,"textureCubeLod")).replace(/texture2DLodEXT/g,"texture2DLod")).replace(/texture2DProjLodEXT/g,"texture2DProjLod")).replace(/texture2DGradEXT/g,"texture2DGrad")).replace(/texture2DProjGradEXT/g,"texture2DProjGrad")).replace(/textureCubeGradEXT/g,"textureCubeGrad")).replace(/textureCube/g,"texture")).replace(/texture1D/g,"texture")).replace(/texture2D/g,"texture")).replace(/texture3D/g,"texture")).replace(/#version 100/g,"#version 300 es\n"+o)}gl.shaderSource(GL.shaders[e],a)},glGetProgramInfoLog:function(e,r,t,n){GL.validateGLObjectID(GL.programs,e,"glGetProgramInfoLog","program");var a=gl.getProgramInfoLog(GL.programs[e]);assert(null!==a);let o=getArray(n,Uint8Array,r);for(var i=0;i<r;i++)o[i]=a.charCodeAt(i)},glGetString:function(e){var r=gl.getParameter(e).toString(),t=r.length+1,n=wasm_exports.allocate_vec_u8(t),a=new Uint8Array(wasm_memory.buffer,n,t);return a[r.length]=0,stringToUTF8(r,a,0,t),n},glCompileShader:function(e,r,t,n){GL.validateGLObjectID(GL.shaders,e,"glCompileShader","shader"),gl.compileShader(GL.shaders[e])},glGetShaderiv:function(e,r,t){if(assert(t),GL.validateGLObjectID(GL.shaders,e,"glGetShaderiv","shader"),35716==r){var n=gl.getShaderInfoLog(GL.shaders[e]);assert(null!==n),getArray(t,Int32Array,1)[0]=n.length+1}else if(35720==r){var a=gl.getShaderSource(GL.shaders[e]),o=null===a||0==a.length?0:a.length+1;getArray(t,Int32Array,1)[0]=o}else getArray(t,Int32Array,1)[0]=gl.getShaderParameter(GL.shaders[e],r)},glGetShaderInfoLog:function(e,r,t,n){GL.validateGLObjectID(GL.shaders,e,"glGetShaderInfoLog","shader");var a=gl.getShaderInfoLog(GL.shaders[e]);assert(null!==a);let o=getArray(n,Uint8Array,r);for(var i=0;i<r;i++)o[i]=a.charCodeAt(i)},glVertexAttribDivisor:function(e,r){gl.vertexAttribDivisor(e,r)},glDrawArraysInstanced:function(e,r,t,n){gl.drawArraysInstanced(e,r,t,n)},glDrawElementsInstanced:function(e,r,t,n,a){gl.drawElementsInstanced(e,r,t,n,a)},glDeleteShader:function(e){var r=GL.shaders[e];null!=r&&(gl.deleteShader(r),GL.shaders[e]=null)},glDeleteProgram:function(e){var r=GL.programs[e];null!=r&&(gl.deleteProgram(r),GL.programs[e]=null)},glDeleteBuffers:function(e,r){for(var t=0;t<e;t++){var n=getArray(r+4*t,Uint32Array,1)[0],a=GL.buffers[n];a&&(gl.deleteBuffer(a),a.name=0,GL.buffers[n]=null)}},glDeleteFramebuffers:function(e,r){for(var t=0;t<e;t++){var n=getArray(r+4*t,Uint32Array,1)[0],a=GL.framebuffers[n];a&&(gl.deleteFramebuffer(a),a.name=0,GL.framebuffers[n]=null)}},glDeleteRenderbuffers:function(e,r){for(var t=0;t<e;t++){var n=getArray(r+4*t,Uint32Array,1)[0],a=GL.renderbuffers[n];a&&(gl.deleteRenderbuffer(a),a.name=0,GL.renderbuffers[n]=null)}},glDeleteTextures:function(e,r){for(var t=0;t<e;t++){var n=getArray(r+4*t,Uint32Array,1)[0],a=GL.textures[n];a&&(gl.deleteTexture(a),a.name=0,GL.textures[n]=null)}},glGenQueries:function(e,r){_glGenObject(e,r,"createQuery",GL.timerQueries,"glGenQueries")},glDeleteQueries:function(e,r){for(var t=0;t<e;t++){var n=getArray(textures+4*t,Uint32Array,1)[0],a=GL.timerQueries[n];a&&(gl.deleteQuery(a),a.name=0,GL.timerQueries[n]=null)}},glBeginQuery:function(e,r){GL.validateGLObjectID(GL.timerQueries,r,"glBeginQuery","id"),gl.beginQuery(e,GL.timerQueries[r])},glEndQuery:function(e){gl.endQuery(e)},glGetQueryObjectiv:function(e,r,t){GL.validateGLObjectID(GL.timerQueries,e,"glGetQueryObjectiv","id");let n=gl.getQueryObject(GL.timerQueries[e],r);getArray(t,Uint32Array,1)[0]=n},glGetQueryObjectui64v:function(e,r,t){GL.validateGLObjectID(GL.timerQueries,e,"glGetQueryObjectui64v","id");let n=gl.getQueryObject(GL.timerQueries[e],r),a=getArray(t,Uint32Array,2);a[0]=n,a[1]=(n-a[0])/4294967296},glGenerateMipmap:function(e){gl.generateMipmap(e)},glRenderbufferStorageMultisample:function(e,r,t,n,a){gl.renderbufferStorageMultisample(e,r,t,n,a)},glFramebufferRenderbuffer:function(e,r,t,n){GL.validateGLObjectID(GL.renderbuffers,n,"glFramebufferRenderbuffer","renderbuffer"),gl.framebufferRenderbuffer(e,r,t,GL.renderbuffers[n])},glCheckFramebufferStatus:function(e){return gl.checkFramebufferStatus(e)},glReadBuffer:function(e){gl.readBuffer(e)},glBlitFramebuffer:function(e,r,t,n,a,o,i,s,u,c){gl.blitFramebuffer(e,r,t,n,a,o,i,s,u,c)},setup_canvas_size:function(e){window.high_dpi=e,resize(canvas)},run_animation_loop:function(e){canvas.onmousemove=function(e){var r=mouse_relative_position(e.clientX,e.clientY),t=r.x,n=r.y;wasm_exports.mouse_move(Math.floor(t),Math.floor(n)),0==e.movementX&&0==e.movementY||wasm_exports.raw_mouse_move(Math.floor(e.movementX),Math.floor(e.movementY))},canvas.onmousedown=function(e){var r=mouse_relative_position(e.clientX,e.clientY),t=r.x,n=r.y,a=into_sapp_mousebutton(e.button);wasm_exports.mouse_down(t,n,a)},canvas.addEventListener("wheel",function(e){e.preventDefault(),wasm_exports.mouse_wheel(-e.deltaX,-e.deltaY)}),window.addEventListener("mouseup",function(e){var r=mouse_relative_position(e.clientX,e.clientY),t=r.x,n=r.y,a=into_sapp_mousebutton(e.button);wasm_exports.mouse_up(t,n,a)}),canvas.onkeydown=function(e){var r=into_sapp_keycode(e.code);switch(r){case 32:case 262:case 263:case 264:case 265:case 290:case 291:case 292:case 293:case 294:case 295:case 296:case 297:case 298:case 299:case 259:case 258:case 39:case 47:e.preventDefault()}var t=0;e.ctrlKey&&(t|=2),e.shiftKey&&(t|=1),e.altKey&&(t|=4),wasm_exports.key_down(r,t,e.repeat),32!=r&&39!=r&&47!=r||wasm_exports.key_press(r)},canvas.onkeyup=function(e){var r=into_sapp_keycode(e.code),t=0;e.ctrlKey&&(t|=2),e.shiftKey&&(t|=1),e.altKey&&(t|=4),wasm_exports.key_up(r,t)},canvas.onkeypress=function(e){0==(261==into_sapp_keycode(e.code)||e.ctrlKey)&&wasm_exports.key_press(e.charCode)},canvas.addEventListener("touchstart",function(e){e.preventDefault();for(const r of e.changedTouches){let e=mouse_relative_position(r.clientX,r.clientY);wasm_exports.touch(10,r.identifier,e.x,e.y)}}),canvas.addEventListener("touchend",function(e){e.preventDefault();for(const r of e.changedTouches){let e=mouse_relative_position(r.clientX,r.clientY);wasm_exports.touch(12,r.identifier,e.x,e.y)}}),canvas.addEventListener("touchcancel",function(e){e.preventDefault();for(const r of e.changedTouches){let e=mouse_relative_position(r.clientX,r.clientY);wasm_exports.touch(13,r.identifier,e.x,e.y)}}),canvas.addEventListener("touchmove",function(e){e.preventDefault();for(const r of e.changedTouches){let e=mouse_relative_position(r.clientX,r.clientY);wasm_exports.touch(11,r.identifier,e.x,e.y)}}),window.onresize=function(){resize(canvas,wasm_exports.resize)},window.addEventListener("copy",function(e){null!=clipboard&&(event.clipboardData.setData("text/plain",clipboard),event.preventDefault())}),window.addEventListener("cut",function(e){null!=clipboard&&(event.clipboardData.setData("text/plain",clipboard),event.preventDefault())}),window.addEventListener("paste",function(e){e.stopPropagation(),e.preventDefault();var r=(e.clipboardData||window.clipboardData).getData("Text");if(null!=r&&null!=r&&0!=r.length){var t=(new TextEncoder).encode(r).length,n=wasm_exports.allocate_vec_u8(t);stringToUTF8(r,new Uint8Array(wasm_memory.buffer,n,t),0,t),wasm_exports.on_clipboard_paste(n,t)}}),window.ondragover=function(e){e.preventDefault()},window.ondrop=async function(e){e.preventDefault(),wasm_exports.on_files_dropped_start();for(let r of e.dataTransfer.files){const e=r.name.length,t=wasm_exports.allocate_vec_u8(e),n=new Uint8Array(wasm_memory.buffer,t,e);stringToUTF8(r.name,n,0,e);const a=await r.arrayBuffer(),o=a.byteLength,i=wasm_exports.allocate_vec_u8(o);new Uint8Array(wasm_memory.buffer,i,o).set(new Uint8Array(a),0),wasm_exports.on_file_dropped(t,e,i,o)}wasm_exports.on_files_dropped_finish()};let r=document.hasFocus();var t=function(){let e=document.hasFocus()&&"visible"==document.visibilityState;r!=e&&(wasm_exports.focus(e),r=e)};document.addEventListener("visibilitychange",t),window.addEventListener("focus",t),window.addEventListener("blur",t),window.blocking_event_loop=e,window.requestAnimationFrame(animation)},fs_load_file:function(e,r){var t=UTF8ToString(e,r),n=FS.unique_id;FS.unique_id+=1;var a=new XMLHttpRequest;return a.open("GET",t,!0),a.responseType="arraybuffer",a.onreadystatechange=function(){if(4===this.readyState)if(200===this.status){var e=new Uint8Array(this.response);FS.loaded_files[n]=e,wasm_exports.file_loaded(n)}else FS.loaded_files[n]=null,wasm_exports.file_loaded(n)},a.send(),n},fs_get_buffer_size:function(e){return null==FS.loaded_files[e]?-1:FS.loaded_files[e].length},fs_take_buffer:function(e,r,t){var n=FS.loaded_files[e];console.assert(n.length<=t);for(var a=new Uint8Array(wasm_memory.buffer,r,t),o=0;o<n.length;o++)a[o]=n[o];delete FS.loaded_files[e]},sapp_set_cursor_grab:function(e){e?canvas.requestPointerLock():document.exitPointerLock()},sapp_set_cursor:function(e,r){canvas.style.cursor=UTF8ToString(e,r)},sapp_is_fullscreen:function(){let e=document.fullscreenElement;return null!=e&&e.id==canvas.id},sapp_set_fullscreen:function(e){e?canvas.requestFullscreen():document.exitFullscreen()},sapp_set_window_size:function(e,r){canvas.width=e,canvas.height=r,resize(canvas,wasm_exports.resize)},sapp_schedule_update:function(){animation_frame_timeout&&window.cancelAnimationFrame(animation_frame_timeout),animation_frame_timeout=window.requestAnimationFrame(animation)},init_webgl:init_webgl}};function register_plugins(e){if(null!=e)for(var r=0;r<e.length;r++)null!=e[r].register_plugin&&null!=e[r].register_plugin&&e[r].register_plugin(importObject)}function init_plugins(e){if(null!=e)for(var r=0;r<e.length;r++)if(null!=e[r].on_init&&null!=e[r].on_init&&e[r].on_init(),null==e[r].name||null==e[r].name||null==e[r].version||null==e[r].version)console.warn("Some of the registred plugins do not have name or version"),console.warn("Probably old version of the plugin used");else{var t=e[r].name+"_crate_version";if(null==wasm_exports[t])console.log("Plugin "+e[r].name+" is present in JS bundle, but is not used in the rust code.");else{var n=wasm_exports[t]();e[r].version!=n&&console.error("Plugin "+e[r].name+" version mismatchjs version: "+e[r].version+", crate version: "+n)}}}function miniquad_add_plugin(e){plugins.push(e)}function add_missing_functions_stabs(e){var r=WebAssembly.Module.imports(e);for(const e in r)null==importObject.env[r[e].name]&&(console.warn("No "+r[e].name+" function in gl.js"),importObject.env[r[e].name]=function(){console.warn("Missed function: "+r[e].name)})}function load(e){var r=fetch(e);register_plugins(plugins),"function"==typeof WebAssembly.compileStreaming?WebAssembly.compileStreaming(r).then(e=>(add_missing_functions_stabs(e),WebAssembly.instantiate(e,importObject))).then(e=>{wasm_memory=e.exports.memory;var r=(wasm_exports=e.exports).crate_version();2!=r&&console.error("Version mismatch: gl.js version is: 2, miniquad crate version is: "+r),init_plugins(plugins),e.exports.main()}).catch(e=>{console.error(e)}):r.then(function(e){return e.arrayBuffer()}).then(function(e){return WebAssembly.compile(e)}).then(function(e){return add_missing_functions_stabs(e),WebAssembly.instantiate(e,importObject)}).then(function(e){wasm_memory=e.exports.memory;var r=(wasm_exports=e.exports).crate_version();2!=r&&console.error("Version mismatch: gl.js version is: 2, rust sapp-wasm crate version is: "+r),init_plugins(plugins),e.exports.main()}).catch(e=>{console.error("WASM failed to load, probably incompatible gl.js version"),console.error(e)})}!function(){const e=window.AudioContext||window.webkitAudioContext;let r,t=new Map,n=[],a=1,o=1;function i(){if(null==r){r=new e;r.listener;{let e=new(window.AudioContext||window.webkitAudioContext);var t=function(n){console.log("fix"),r.resume();var a=e.createBuffer(1,1,22050),o=e.createBufferSource();o.buffer=a,o.connect(e.destination),o.start?o.start(0):o.play?o.play(0):o.noteOn&&o.noteOn(0),document.removeEventListener("touchstart",t),document.removeEventListener("touchend",t),document.removeEventListener("mousedown",t),document.removeEventListener("keydown",t)};document.addEventListener("touchstart",t),document.addEventListener("touchend",t),document.addEventListener("mousedown",t),document.addEventListener("keydown",t)}}}function s(e,n){let o=wasm_memory.buffer.slice(e,e+n),i=a;return a+=1,r.decodeAudioData(o,function(e){t.set(i,e)},function(e){console.error("Failed to decode audio buffer",e)}),i}function u(e){return t.has(e)&&null!=t.get(e)}function c(e){try{e.source.removeEventListener("ended",e.ended),e.source.disconnect(),e.gain_node.disconnect(),e.sound_key=0,e.playback_key=0}catch(e){console.error("Error stopping sound",e)}}function l(e,a,i){let s=o++,u=function(){let e=n.find(e=>0===e.sound_key);return null!=e?e.source=r.createBufferSource():(e={sound_key:0,playback_key:0,source:r.createBufferSource(),gain_node:r.createGain(),ended:null},n.push(e)),e}();u.sound_key=e,u.playback_key=s,u.source.connect(u.gain_node),u.gain_node.connect(r.destination),u.gain_node.gain.value=a,u.source.loop=i,u.ended=function(){c(u)},u.source.addEventListener("ended",u.ended);try{u.source.buffer=t.get(e),u.source.start(0)}catch(e){console.error("Error starting sound",e)}return s}function f(e,r){n.forEach(t=>{t.sound_key===e&&(t.gain_node.gain.value=r)})}function d(e){n.forEach(r=>{r.sound_key===e&&c(r)})}function g(e){d(e),t.delete(e)}function m(e){let r=n.find(r=>r.playback_key===e);null!=r&&c(r)}function _(e,r){let t=n.find(r=>r.playback_key===e);null!=t&&(t.gain_node.gain.value=r)}miniquad_add_plugin({register_plugin:function(e){e.env.audio_init=i,e.env.audio_add_buffer=s,e.env.audio_play_buffer=l,e.env.audio_source_is_loaded=u,e.env.audio_source_set_volume=f,e.env.audio_source_stop=d,e.env.audio_source_delete=g,e.env.audio_playback_stop=m,e.env.audio_playback_set_volume=_},version:1,name:"macroquad_audio"})}();var ctx=null,js_objects={"-1":null,"-2":void 0},unique_js_id=0;function register_plugin(e){e.env.js_create_string=function(e,r){return js_object(UTF8ToString(e,r))},e.env.js_create_buffer=function(e,r){var t=new Uint8Array(wasm_memory.buffer,e,r),n=new Uint8Array(new ArrayBuffer(t.byteLength));return n.set(new Uint8Array(t)),js_object(n)},e.env.js_create_object=function(){return js_object({})},e.env.js_set_field_f32=function(e,r,t,n){var a=UTF8ToString(r,t);js_objects[e][a]=n},e.env.js_set_field_u32=function(e,r,t,n){var a=UTF8ToString(r,t);js_objects[e][a]=n},e.env.js_set_field_string=function(e,r,t,n,a){var o=UTF8ToString(r,t),i=UTF8ToString(n,a);js_objects[e][o]=i},e.env.js_unwrap_to_str=function(e,r,t){for(var n=toUTF8Array(js_objects[e]),a=n.length,o=new Uint8Array(wasm_memory.buffer,r,t),i=0;i<a;i++)o[i]=n[i]},e.env.js_unwrap_to_buf=function(e,r,t){for(var n=js_objects[e],a=n.length,o=new Uint8Array(wasm_memory.buffer,r,t),i=0;i<a;i++)o[i]=n[i]},e.env.js_string_length=function(e){return toUTF8Array(js_objects[e]).length},e.env.js_buf_length=function(e){return js_objects[e].length},e.env.js_free_object=function(e){delete js_objects[e]},e.env.js_have_field=function(e,r,t){var n=UTF8ToString(r,t);return void 0!==js_objects[e][n]},e.env.js_field_f32=function(e,r,t){var n=UTF8ToString(r,t);return js_objects[e][n]},e.env.js_field_u32=function(e,r,t){var n=UTF8ToString(r,t);return js_objects[e][n]},e.env.js_field=function(e,r,t){var n=UTF8ToString(r,t);return js_object(js_objects[e][n])},e.env.js_field_num=function(e,r,t){var n=UTF8ToString(r,t);return js_objects[e][n]}}function toUTF8Array(e){for(var r=[],t=0;t<e.length;t++){var n=e.charCodeAt(t);n<128?r.push(n):n<2048?r.push(192|n>>6,128|63&n):n<55296||n>=57344?r.push(224|n>>12,128|n>>6&63,128|63&n):(t++,n=65536+((1023&n)<<10|1023&e.charCodeAt(t)),r.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n))}return r}function js_object(e){if(null==e)return-2;if(null===e)return-1;var r=unique_js_id;return js_objects[r]=e,unique_js_id+=1,r}function consume_js_object(e){var r=js_objects[e];return delete js_objects[e],r}function get_js_object(e){return js_objects[e]}miniquad_add_plugin({register_plugin:register_plugin,version:1,name:"sapp_jsutils"}),function(){var e=0,r={};function t(t,n,a,o){var i,s=e;e+=1,0===t?i="GET":1===t?i="POST":2===t?i="PUT":3===t&&(i="DELETE");var u=consume_js_object(n),c=consume_js_object(a),l=consume_js_object(o),f=new XMLHttpRequest;for(var d in f.open(i,u,!0),f.responseType="arraybuffer",l)l.hasOwnProperty(d)&&f.setRequestHeader(d,l[d]);return f.onload=function(){r[s]={status:this.status,body:new Uint8Array(this.response)}},f.onerror=function(){r[s]={status:0,error:"Network error"}},f.ontimeout=function(){r[s]={status:0,error:"Request timed out"}},f.send(c.length>0?c:null),s}function n(e){if(void 0!==r[e]&&null!==r[e]){var t=r[e];return r[e]=null,js_object(t)}return-1}var a={};function o(e,r){var t=consume_js_object(r),n=[],o=new WebSocket(t);o.binaryType="arraybuffer",o.onopen=function(){n.push({type:0})},o.onmessage=function(e){"string"==typeof e.data?n.push({type:2,data:e.data}):n.push({type:1,data:new Uint8Array(e.data)})},o.onerror=function(e){n.push({type:3,data:JSON.stringify(e.message||"WebSocket error")})},o.onclose=function(){n.push({type:4})},a[e]={ws:o,recv_buffer:n}}function i(e,r){var t=a[e];if(t)try{var n=consume_js_object(r);void 0!==n.buffer?t.ws.send(n.buffer):t.ws.send(n)}catch(e){t.recv_buffer.push({type:3,data:JSON.stringify(e.message||"Send error")})}}function s(e,r){var t=a[e];if(t)try{var n=consume_js_object(r);t.ws.send(n)}catch(e){t.recv_buffer.push({type:3,data:JSON.stringify(e.message||"Send error")})}}function u(e){var r=a[e];r&&(r.ws.close(),delete a[e])}function c(e){var r=a[e];return r&&0!==r.recv_buffer.length?js_object(r.recv_buffer.shift()):-1}miniquad_add_plugin({register_plugin:function(e){e.env.ply_net_http_make_request=t,e.env.ply_net_http_try_recv=n,e.env.ply_net_ws_connect=o,e.env.ply_net_ws_send_binary=i,e.env.ply_net_ws_send_text=s,e.env.ply_net_ws_close=u,e.env.ply_net_ws_try_recv=c},on_init:function(){},version:1,name:"ply_net"})}(),function(){var e=1,r=1,t={},n={};function a(){var r=e;return e+=1,r}function o(e,r){var n=r||{};n.status=1,t[e]=n}function i(e,r){var n="Storage operation failed";null!=r&&(n=void 0!==r.message&&null!==r.message?String(r.message):String(r)),t[e]={status:0,error:n}}async function s(e,r,t){for(var n=function(e){var r=e.split("/").filter(function(e){return e.length>0});if(0===r.length)throw new Error("Invalid storage path");return r}(r),a=e,o=0;o<n.length-1;o+=1)a=await a.getDirectoryHandle(n[o],{create:t});return{dir:a,file_name:n[n.length-1]}}function u(e){var r=n[e];if(!r)throw new Error("Invalid storage handle");return r}function c(e){var t=a(),s=consume_js_object(e);return async function(){try{var e=await async function(e){if(!navigator.storage||!navigator.storage.getDirectory)throw new Error("OPFS is not available in this browser");for(var r=await navigator.storage.getDirectory(),t=e.split("/").filter(function(e){return e.length>0}),n=0;n<t.length;n+=1)r=await r.getDirectoryHandle(t[n],{create:!0});return r}(s),a=r;r+=1,n[a]=e,o(t,{storage_id:a})}catch(e){i(t,e)}}(),t}function l(e,r,t){var n=a(),c=consume_js_object(r),l=consume_js_object(t);return async function(){try{var r=u(e),t=await s(r,c,!0),a=await t.dir.getFileHandle(t.file_name,{create:!0}),f=await a.createWritable();await f.write(l),await f.close(),o(n)}catch(e){i(n,e)}}(),n}function f(e,r){var t=a(),n=consume_js_object(r);return async function(){try{var r=u(e),a=await s(r,n,!1),c=await a.dir.getFileHandle(a.file_name,{create:!1}),l=await c.getFile(),f=await l.arrayBuffer();o(t,{exists:1,data:new Uint8Array(f)})}catch(e){if(e&&"NotFoundError"===e.name)return void o(t,{exists:0});i(t,e)}}(),t}function d(e,r){var t=a(),n=consume_js_object(r);return async function(){try{var r=u(e),a=await s(r,n,!1);await a.dir.removeEntry(a.file_name),o(t)}catch(e){i(t,e)}}(),t}function g(e,r){var t=a(),n=consume_js_object(r);return async function(){try{var r=u(e),a=await s(r,n,!1),c=await a.dir.getFileHandle(a.file_name,{create:!1}),l=await c.getFile(),f=await l.arrayBuffer(),d=new Blob([f]),g=URL.createObjectURL(d),m=document.createElement("a");m.href=g,m.download=a.file_name,m.style.display="none",document.body.appendChild(m),m.click(),m.remove(),setTimeout(function(){URL.revokeObjectURL(g)},0),o(t)}catch(e){i(t,e)}}(),t}function m(e){if(Object.prototype.hasOwnProperty.call(t,e)){var r=t[e];return delete t[e],js_object(r)}return-1}miniquad_add_plugin({register_plugin:function(e){e.env.ply_storage_new=c,e.env.ply_storage_save_bytes=l,e.env.ply_storage_load_bytes=f,e.env.ply_storage_remove=d,e.env.ply_storage_export=g,e.env.ply_storage_try_recv=m},on_init:function(){},version:1,name:"ply_storage"})}(),miniquad_add_plugin({register_plugin:function(e){function r(e){if((e.ctrlKey||e.metaKey)&&e.key&&1===e.key.length){var r=e.key.toUpperCase();r>="A"&&r<="Z"&&Object.defineProperty(e,"code",{value:"Key"+r})}}canvas.addEventListener("keydown",r,!0),canvas.addEventListener("keyup",r,!0)},on_init:function(){},version:1,name:"ply_fixes"}),function(){var e=null,r={},t=1,n=1;miniquad_add_plugin({register_plugin:function(a){a.env.ply_a11y_init=function(){e||(canvas.setAttribute("tabindex","0"),canvas.setAttribute("role","application"),canvas.setAttribute("aria-label","Application"),(e=document.createElement("div")).id="ply-a11y-root",e.style.cssText="position:fixed;left:0;top:0;width:0;height:0;overflow:visible;pointer-events:none;z-index:2147483647;",document.body.appendChild(e),canvas.setAttribute("aria-owns","ply-a11y-root"))},a.env.ply_a11y_upsert_node=function(t,n,a,o,i,s){var u=UTF8ToString(n,a),c=UTF8ToString(o,i),l=r[t];l||((l=document.createElement("div")).id="ply-a11y-"+t,function(e){e.style.cssText="position:fixed;pointer-events:none;overflow:hidden;margin:0;padding:0;border:0;background:transparent;color:transparent;opacity:0.001;box-sizing:border-box;white-space:nowrap;"}(l),e.appendChild(l),r[t]=l),u&&"none"!==u?l.setAttribute("role",u):l.removeAttribute("role"),c?!function(e){return"none"===e||"heading"===e||"note"===e||"button"===e||"link"===e||"menuitem"===e||"tab"===e||"listitem"===e}(u)?(l.setAttribute("aria-label",c),""!==l.textContent&&(l.textContent="")):(l.removeAttribute("aria-label"),l.textContent!==c&&(l.textContent=c)):(l.removeAttribute("aria-label"),""!==l.textContent&&(l.textContent=""))},a.env.ply_a11y_set_heading_level=function(e,t){var n=r[e];n&&t>=1&&t<=6&&n.setAttribute("aria-level",t)},a.env.ply_a11y_set_checked=function(e,t){var n=r[e];n&&n.setAttribute("aria-checked",t?"true":"false")},a.env.ply_a11y_set_value=function(e,t,n,a,o){var i=r[e];if(i){var s=UTF8ToString(t,n);s&&i.setAttribute("aria-valuenow",s),a==a&&i.setAttribute("aria-valuemin",a),o==o&&i.setAttribute("aria-valuemax",o)}},a.env.ply_a11y_set_live=function(e,t){var n=r[e];n&&(1===t?n.setAttribute("aria-live","polite"):2===t?n.setAttribute("aria-live","assertive"):n.removeAttribute("aria-live"))},a.env.ply_a11y_remove_node=function(e){var t=r[e];t&&(t.remove(),delete r[e])},a.env.ply_a11y_set_focus=function(e){0===e?canvas.removeAttribute("aria-activedescendant"):canvas.setAttribute("aria-activedescendant","ply-a11y-"+e)},a.env.ply_a11y_clear=function(){e&&(e.innerHTML=""),r={},canvas.removeAttribute("aria-activedescendant")},a.env.ply_a11y_announce=function(e,t,n){var a=r[e];a&&(a.textContent=UTF8ToString(t,n))},a.env.ply_a11y_set_description=function(e,t,n){var a=r[e];if(a){var o=UTF8ToString(t,n);o?a.setAttribute("aria-description",o):a.removeAttribute("aria-description")}},a.env.ply_a11y_reorder=function(t,n){if(e&&0!==n)for(var a=new Int32Array(wasm_memory.buffer,t,n),o=0;o<n;o++){var i=r[a[o]];i&&e.appendChild(i)}},a.env.ply_a11y_set_bounds=function(e,a,o,i,s){var u=r[e];u&&function(e,r,a,o,i){var s=canvas.getBoundingClientRect(),u=t>0?s.width/t:1,c=n>0?s.height/n:1,l=s.left+r*u,f=s.top+a*c,d=Math.max(1,o*u),g=Math.max(1,i*c);e.style.left=l+"px",e.style.top=f+"px",e.style.width=d+"px",e.style.height=g+"px"}(u,a,o,i,s)},a.env.ply_a11y_set_viewport=function(e,r){t=e>0?e:1,n=r>0?r:1};var o=null;a.env.ply_show_virtual_keyboard=function(e){e?(o||((o=document.createElement("textarea")).id="ply-virtual-keyboard",o.autocapitalize="off",o.autocomplete="off",o.spellcheck=!1,o.style.cssText="position:fixed;left:0;top:0;width:1px;height:1px;opacity:0;z-index:-1;pointer-events:none;",document.body.appendChild(o),o.addEventListener("input",function(){var e=o.value;o.value="";for(var r=0;r<e.length;r++){var t=e.charCodeAt(r);t>=32&&canvas.dispatchEvent(new KeyboardEvent("keypress",{charCode:t,keyCode:t,bubbles:!0}))}}),o.addEventListener("keydown",function(e){if(-1!==["Backspace","Delete","Enter","Tab","Escape","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Home","End"].indexOf(e.key)||e.ctrlKey||e.metaKey){if(!e.repeat){var r=e.code;if((e.ctrlKey||e.metaKey)&&e.key&&1===e.key.length){var t=e.key.toUpperCase();t>="A"&&t<="Z"&&(r="Key"+t)}canvas.dispatchEvent(new KeyboardEvent("keydown",{key:e.key,code:r,keyCode:e.keyCode,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,bubbles:!0}))}e.preventDefault()}}),o.addEventListener("keyup",function(e){var r=e.code;if((e.ctrlKey||e.metaKey)&&e.key&&1===e.key.length){var t=e.key.toUpperCase();t>="A"&&t<="Z"&&(r="Key"+t)}canvas.dispatchEvent(new KeyboardEvent("keyup",{key:e.key,code:r,keyCode:e.keyCode,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,bubbles:!0}))})),o.focus({preventScroll:!0})):(o&&o.blur(),canvas.focus())}},on_init:function(){},version:1,name:"ply_accessibility"})}();