var Browser = { useWebGL: false, isFullscreen: false, pointerLock: false, moduleContextCreatedCallbacks: [], workers: [], preloadedImages: {}, preloadedAudios: {}, getCanvas: () => Module["canvas"], init() { if (Browser.initted) return; Browser.initted = true; var imagePlugin = {}; imagePlugin["canHandle"] = function imagePlugin_canHandle(name) { return !Module["noImageDecoding"] && /\.(jpg|jpeg|png|bmp|webp)$/i.test(name) }; imagePlugin["handle"] = async function imagePlugin_handle(byteArray, name) { var b = new Blob([byteArray], { type: Browser.getMimetype(name) }); if (b.size !== byteArray.length) { b = new Blob([new Uint8Array(byteArray).buffer], { type: Browser.getMimetype(name) }) } var url = URL.createObjectURL(b); return new Promise((resolve, reject) => { var img = new Image; img.onload = () => { var canvas = document.createElement("canvas"); canvas.width = img.width; canvas.height = img.height; var ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0); Browser.preloadedImages[name] = canvas; URL.revokeObjectURL(url); resolve(byteArray) }; img.onerror = event => { err(`Image ${url} could not be decoded`); reject() }; img.src = url }) }; preloadPlugins.push(imagePlugin); var audioPlugin = {}; audioPlugin["canHandle"] = function audioPlugin_canHandle(name) { return !Module["noAudioDecoding"] && name.slice(-4) in { ".ogg": 1, ".wav": 1, ".mp3": 1 } }; audioPlugin["handle"] = async function audioPlugin_handle(byteArray, name) { return new Promise((resolve, reject) => { var done = false; function finish(audio) { if (done) return; done = true; Browser.preloadedAudios[name] = audio; resolve(byteArray) } var b = new Blob([byteArray], { type: Browser.getMimetype(name) }); var url = URL.createObjectURL(b); var audio = new Audio; audio.addEventListener("canplaythrough", () => finish(audio), false); audio.onerror = function audio_onerror(event) { if (done) return; err(`warning: browser could not fully decode audio ${name}, trying slower base64 approach`); function encode64(data) { var BASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var PAD = "="; var ret = ""; var leftchar = 0; var leftbits = 0; for (var i = 0; i < data.length; i++) { leftchar = leftchar << 8 | data[i]; leftbits += 8; while (leftbits >= 6) { var curr = leftchar >> leftbits - 6 & 63; leftbits -= 6; ret += BASE[curr] } } if (leftbits == 2) { ret += BASE[(leftchar & 3) << 4]; ret += PAD + PAD } else if (leftbits == 4) { ret += BASE[(leftchar & 15) << 2]; ret += PAD } return ret } audio.src = "data:audio/x-" + name.slice(-3) + ";base64," + encode64(byteArray); finish(audio) }; audio.src = url; safeSetTimeout(() => { finish(audio) }, 1e4) }) }; preloadPlugins.push(audioPlugin); function pointerLockChange() { var canvas = Browser.getCanvas(); Browser.pointerLock = document.pointerLockElement === canvas } var canvas = Browser.getCanvas(); if (canvas) { document.addEventListener("pointerlockchange", pointerLockChange, false); if (Module["elementPointerLock"]) { canvas.addEventListener("click", ev => { if (!Browser.pointerLock && Browser.getCanvas().requestPointerLock) { Browser.getCanvas().requestPointerLock(); ev.preventDefault() } }, false) } } }, createContext(canvas, useWebGL, setInModule, webGLContextAttributes) { if (useWebGL && Module["ctx"] && canvas == Browser.getCanvas()) return Module["ctx"]; var ctx; var contextHandle; if (useWebGL) { var contextAttributes = { antialias: false, alpha: false, majorVersion: typeof WebGL2RenderingContext != "undefined" ? 2 : 1 }; if (webGLContextAttributes) { for (var attribute in webGLContextAttributes) { contextAttributes[attribute] = webGLContextAttributes[attribute] } } if (typeof GL != "undefined") { contextHandle = GL.createContext(canvas, contextAttributes); if (contextHandle) { ctx = GL.getContext(contextHandle).GLctx } } } else { ctx = canvas.getContext("2d") } if (!ctx) return null; if (setInModule) { Module["ctx"] = ctx; if (useWebGL) GL.makeContextCurrent(contextHandle); Browser.useWebGL = useWebGL; Browser.moduleContextCreatedCallbacks.forEach(callback => callback()); Browser.init() } return ctx }, fullscreenHandlersInstalled: false, lockPointer: undefined, resizeCanvas: undefined, requestFullscreen(lockPointer, resizeCanvas) { Browser.lockPointer = lockPointer; Browser.resizeCanvas = resizeCanvas; if (typeof Browser.lockPointer == "undefined") Browser.lockPointer = true; if (typeof Browser.resizeCanvas == "undefined") Browser.resizeCanvas = false; var canvas = Browser.getCanvas(); function fullscreenChange() { Browser.isFullscreen = false; var canvasContainer = canvas.parentNode; if (getFullscreenElement() === canvasContainer) { canvas.exitFullscreen = Browser.exitFullscreen; if (Browser.lockPointer) canvas.requestPointerLock(); Browser.isFullscreen = true; if (Browser.resizeCanvas) { Browser.setFullscreenCanvasSize() } else { Browser.updateCanvasDimensions(canvas) } } else { canvasContainer.parentNode.insertBefore(canvas, canvasContainer); canvasContainer.parentNode.removeChild(canvasContainer); if (Browser.resizeCanvas) { Browser.setWindowedCanvasSize() } else { Browser.updateCanvasDimensions(canvas) } } Module["onFullScreen"]?.(Browser.isFullscreen); Module["onFullscreen"]?.(Browser.isFullscreen) } if (!Browser.fullscreenHandlersInstalled) { Browser.fullscreenHandlersInstalled = true; document.addEventListener("fullscreenchange", fullscreenChange, false); document.addEventListener("mozfullscreenchange", fullscreenChange, false); document.addEventListener("webkitfullscreenchange", fullscreenChange, false); document.addEventListener("MSFullscreenChange", fullscreenChange, false) } var canvasContainer = document.createElement("div"); canvas.parentNode.insertBefore(canvasContainer, canvas); canvasContainer.appendChild(canvas); canvasContainer.requestFullscreen = canvasContainer["requestFullscreen"] || canvasContainer["mozRequestFullScreen"] || canvasContainer["msRequestFullscreen"] || (canvasContainer["webkitRequestFullscreen"] ? () => canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"]) : null) || (canvasContainer["webkitRequestFullScreen"] ? () => canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]) : null); canvasContainer.requestFullscreen() }, exitFullscreen() { if (!Browser.isFullscreen) { return false } var CFS = document["exitFullscreen"] || document["cancelFullScreen"] || document["mozCancelFullScreen"] || document["msExitFullscreen"] || document["webkitCancelFullScreen"] || (() => {}); CFS.apply(document, []); return true }, safeSetTimeout(func, timeout) { return safeSetTimeout(func, timeout) }, getMimetype(name) { return { jpg: "image/jpeg", jpeg: "image/jpeg", png: "image/png", bmp: "image/bmp", ogg: "audio/ogg", wav: "audio/wav", mp3: "audio/mpeg" } [name.slice(name.lastIndexOf(".") + 1)] }, getUserMedia(func) { window.getUserMedia ||= navigator["getUserMedia"] || navigator["mozGetUserMedia"]; window.getUserMedia(func) }, getMovementX(event) { return event["movementX"] || event["mozMovementX"] || event["webkitMovementX"] || 0 }, getMovementY(event) { return event["movementY"] || event["mozMovementY"] || event["webkitMovementY"] || 0 }, getMouseWheelDelta(event) { var delta = 0; switch (event.type) { case "DOMMouseScroll": delta = event.detail / 3; break; case "mousewheel": delta = event.wheelDelta / 120; break; case "wheel": delta = event.deltaY; switch (event.deltaMode) { case 0: delta /= 100; break; case 1: delta /= 3; break; case 2: delta *= 80; break; default: abort("unrecognized mouse wheel delta mode: " + event.deltaMode) } break; default: abort("unrecognized mouse wheel event: " + event.type) } return delta }, mouseX: 0, mouseY: 0, mouseMovementX: 0, mouseMovementY: 0, touches: {}, lastTouches: {}, calculateMouseCoords(pageX, pageY) { var canvas = Browser.getCanvas(); var rect = canvas.getBoundingClientRect(); var scrollX = typeof window.scrollX != "undefined" ? window.scrollX : window.pageXOffset; var scrollY = typeof window.scrollY != "undefined" ? window.scrollY : window.pageYOffset; var adjustedX = pageX - (scrollX + rect.left); var adjustedY = pageY - (scrollY + rect.top); adjustedX = adjustedX * (canvas.width / rect.width); adjustedY = adjustedY * (canvas.height / rect.height); return { x: adjustedX, y: adjustedY } }, setMouseCoords(pageX, pageY) { const { x, y } = Browser.calculateMouseCoords(pageX, pageY); Browser.mouseMovementX = x - Browser.mouseX; Browser.mouseMovementY = y - Browser.mouseY; Browser.mouseX = x; Browser.mouseY = y }, calculateMouseEvent(event) { if (Browser.pointerLock) { if (event.type != "mousemove" && "mozMovementX" in event) { Browser.mouseMovementX = Browser.mouseMovementY = 0 } else { Browser.mouseMovementX = Browser.getMovementX(event); Browser.mouseMovementY = Browser.getMovementY(event) } Browser.mouseX += Browser.mouseMovementX; Browser.mouseY += Browser.mouseMovementY } else { if (event.type === "touchstart" || event.type === "touchend" || event.type === "touchmove") { var touch = event.touch; if (touch === undefined) { return } var coords = Browser.calculateMouseCoords(touch.pageX, touch.pageY); if (event.type === "touchstart") { Browser.lastTouches[touch.identifier] = coords; Browser.touches[touch.identifier] = coords } else if (event.type === "touchend" || event.type === "touchmove") { var last = Browser.touches[touch.identifier]; last ||= coords; Browser.lastTouches[touch.identifier] = last; Browser.touches[touch.identifier] = coords } return } Browser.setMouseCoords(event.pageX, event.pageY) } }, resizeListeners: [], updateResizeListeners() { var canvas = Browser.getCanvas(); Browser.resizeListeners.forEach(listener => listener(canvas.width, canvas.height)) }, setCanvasSize(width, height, noUpdates) { var canvas = Browser.getCanvas(); Browser.updateCanvasDimensions(canvas, width, height); if (!noUpdates) Browser.updateResizeListeners() }, windowedWidth: 0, windowedHeight: 0, setFullscreenCanvasSize() { if (typeof SDL != "undefined") { var flags = HEAPU32[SDL.screen >> 2]; flags = flags | 8388608; HEAP32[SDL.screen >> 2] = flags } Browser.updateCanvasDimensions(Browser.getCanvas()); Browser.updateResizeListeners() }, setWindowedCanvasSize() { if (typeof SDL != "undefined") { var flags = HEAPU32[SDL.screen >> 2]; flags = flags & ~8388608; HEAP32[SDL.screen >> 2] = flags } Browser.updateCanvasDimensions(Browser.getCanvas()); Browser.updateResizeListeners() }, updateCanvasDimensions(canvas, wNative, hNative) { if (wNative && hNative) { canvas.widthNative = wNative; canvas.heightNative = hNative } else { wNative = canvas.widthNative; hNative = canvas.heightNative } var w = wNative; var h = hNative; if (Module["forcedAspectRatio"] > 0) { if (w / h < Module["forcedAspectRatio"]) { w = Math.round(h * Module["forcedAspectRatio"]) } else { h = Math.round(w / Module["forcedAspectRatio"]) } } if (getFullscreenElement() === canvas.parentNode && typeof screen != "undefined") { var factor = Math.min(screen.width / w, screen.height / h); w = Math.round(w * factor); h = Math.round(h * factor) } if (Browser.resizeCanvas) { if (canvas.width != w) canvas.width = w; if (canvas.height != h) canvas.height = h; if (typeof canvas.style != "undefined") { canvas.style.removeProperty("width"); canvas.style.removeProperty("height") } } else { if (canvas.width != wNative) canvas.width = wNative; if (canvas.height != hNative) canvas.height = hNative; if (typeof canvas.style != "undefined") { if (w != wNative || h != hNative) { canvas.style.setProperty("width", w + "px", "important"); canvas.style.setProperty("height", h + "px", "important") } else { canvas.style.removeProperty("width"); canvas.style.removeProperty("height") } } } } }; var JSEvents = { removeAllEventListeners() { while (JSEvents.eventHandlers.length) { JSEvents._removeHandler(JSEvents.eventHandlers.length - 1) } JSEvents.deferredCalls = [] }, inEventHandler: 0, deferredCalls: [], deferCall(targetFunction, precedence, argsList) { function arraysHaveEqualContent(arrA, arrB) { if (arrA.length != arrB.length) return false; for (var i in arrA) { if (arrA[i] != arrB[i]) return false } return true } for (var call of JSEvents.deferredCalls) { if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { return } } JSEvents.deferredCalls.push({ targetFunction, precedence, argsList }); JSEvents.deferredCalls.sort((x, y) => x.precedence < y.precedence) }, removeDeferredCalls(targetFunction) { JSEvents.deferredCalls = JSEvents.deferredCalls.filter(call => call.targetFunction != targetFunction) }, canPerformEventHandlerRequests() { if (navigator.userActivation) { return navigator.userActivation.isActive } return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls }, runDeferredCalls() { if (!JSEvents.canPerformEventHandlerRequests()) { return } var deferredCalls = JSEvents.deferredCalls; JSEvents.deferredCalls = []; for (var call of deferredCalls) { call.targetFunction(...call.argsList) } }, eventHandlers: [], removeAllHandlersOnTarget: (target, eventTypeString) => { for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { JSEvents._removeHandler(i--) } } }, _removeHandler(i) { var h = JSEvents.eventHandlers[i]; h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); JSEvents.eventHandlers.splice(i, 1) }, registerOrRemoveHandler(eventHandler) { if (!eventHandler.target) { return -4 } if (eventHandler.callbackfunc) { eventHandler.eventListenerFunc = function(event) { ++JSEvents.inEventHandler; JSEvents.currentEventHandler = eventHandler; JSEvents.runDeferredCalls(); eventHandler.handlerFunc(event); JSEvents.runDeferredCalls(); --JSEvents.inEventHandler }; eventHandler.target.addEventListener(eventHandler.eventTypeString, eventHandler.eventListenerFunc, eventHandler.useCapture); JSEvents.eventHandlers.push(eventHandler) } else { for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { JSEvents._removeHandler(i--) } } } return 0 }, removeSingleHandler(eventHandler) { let success = false; for (let i = 0; i < JSEvents.eventHandlers.length; ++i) { const handler = JSEvents.eventHandlers[i]; if (handler.target === eventHandler.target && handler.eventTypeId === eventHandler.eventTypeId && handler.callbackfunc === eventHandler.callbackfunc && handler.userData === eventHandler.userData) { JSEvents._removeHandler(i--); success = true } } return success ? 0 : -5 }, getNodeNameForTarget(target) { if (!target) return ""; if (target == window) return "#window"; if (target == screen) return "#screen"; return target?.nodeName || "" }, fullscreenEnabled() { return document.fullscreenEnabled || document.webkitFullscreenEnabled } }; var specialHTMLTargets = [0, globalThis.document ?? 0, globalThis.window ?? 0]; var maybeCStringToJsString = cString => cString > 2 ? UTF8ToString(cString) : cString; var findEventTarget = target => { target = maybeCStringToJsString(target); var domElement = specialHTMLTargets[target] || globalThis.document?.querySelector(target); return domElement }; var findCanvasEventTarget = findEventTarget; var _emscripten_get_canvas_element_size = (target, width, height) => { var canvas = findCanvasEventTarget(target); if (!canvas) return -4; HEAP32[width >> 2] = canvas.width; HEAP32[height >> 2] = canvas.height }; var stackAlloc = sz => __emscripten_stack_alloc(sz); var stringToUTF8OnStack = str => { var size = lengthBytesUTF8(str) + 1; var ret = stackAlloc(size); stringToUTF8(str, ret, size); return ret }; var getCanvasElementSize = target => { var sp = stackSave(); var w = stackAlloc(8); var h = w + 4; var targetInt = stringToUTF8OnStack(target.id); var ret = _emscripten_get_canvas_element_size(targetInt, w, h); var size = [HEAP32[w >> 2], HEAP32[h >> 2]]; stackRestore(sp); return size }; var _emscripten_set_canvas_element_size = (target, width, height) => { var canvas = findCanvasEventTarget(target); if (!canvas) return -4; canvas.width = width; canvas.height = height; return 0 }; var setCanvasElementSize = (target, width, height) => { if (!target.controlTransferredOffscreen) { target.width = width; target.height = height } else { var sp = stackSave(); var targetInt = stringToUTF8OnStack(target.id); _emscripten_set_canvas_element_size(targetInt, width, height); stackRestore(sp) } }; var currentFullscreenStrategy = {}; // getWasmTableEntry moved to runtime.js var registerRestoreOldStyle = canvas => { var canvasSize = getCanvasElementSize(canvas); var oldWidth = canvasSize[0]; var oldHeight = canvasSize[1]; var oldCssWidth = canvas.style.width; var oldCssHeight = canvas.style.height; var oldBackgroundColor = canvas.style.backgroundColor; var oldDocumentBackgroundColor = document.body.style.backgroundColor; var oldPaddingLeft = canvas.style.paddingLeft; var oldPaddingRight = canvas.style.paddingRight; var oldPaddingTop = canvas.style.paddingTop; var oldPaddingBottom = canvas.style.paddingBottom; var oldMarginLeft = canvas.style.marginLeft; var oldMarginRight = canvas.style.marginRight; var oldMarginTop = canvas.style.marginTop; var oldMarginBottom = canvas.style.marginBottom; var oldDocumentBodyMargin = document.body.style.margin; var oldDocumentOverflow = document.documentElement.style.overflow; var oldDocumentScroll = document.body.scroll; var oldImageRendering = canvas.style.imageRendering; function restoreOldStyle() { if (!getFullscreenElement()) { document.removeEventListener("fullscreenchange", restoreOldStyle); document.removeEventListener("webkitfullscreenchange", restoreOldStyle); setCanvasElementSize(canvas, oldWidth, oldHeight); canvas.style.width = oldCssWidth; canvas.style.height = oldCssHeight; canvas.style.backgroundColor = oldBackgroundColor; if (!oldDocumentBackgroundColor) document.body.style.backgroundColor = "white"; document.body.style.backgroundColor = oldDocumentBackgroundColor; canvas.style.paddingLeft = oldPaddingLeft; canvas.style.paddingRight = oldPaddingRight; canvas.style.paddingTop = oldPaddingTop; canvas.style.paddingBottom = oldPaddingBottom; canvas.style.marginLeft = oldMarginLeft; canvas.style.marginRight = oldMarginRight; canvas.style.marginTop = oldMarginTop; canvas.style.marginBottom = oldMarginBottom; document.body.style.margin = oldDocumentBodyMargin; document.documentElement.style.overflow = oldDocumentOverflow; document.body.scroll = oldDocumentScroll; canvas.style.imageRendering = oldImageRendering; if (canvas.GLctxObject) canvas.GLctxObject.GLctx.viewport(0, 0, oldWidth, oldHeight); if (currentFullscreenStrategy.canvasResizedCallback) { getWasmTableEntry(currentFullscreenStrategy.canvasResizedCallback)(37, 0, currentFullscreenStrategy.canvasResizedCallbackUserData) } } } document.addEventListener("fullscreenchange", restoreOldStyle); document.addEventListener("webkitfullscreenchange", restoreOldStyle); return restoreOldStyle }; var setLetterbox = (element, topBottom, leftRight) => { element.style.paddingLeft = element.style.paddingRight = leftRight + "px"; element.style.paddingTop = element.style.paddingBottom = topBottom + "px" }; var getBoundingClientRect = e => specialHTMLTargets.indexOf(e) < 0 ? e.getBoundingClientRect() : { left: 0, top: 0 }; var JSEvents_resizeCanvasForFullscreen = (target, strategy) => { var restoreOldStyle = registerRestoreOldStyle(target); var cssWidth = strategy.softFullscreen ? innerWidth : screen.width; var cssHeight = strategy.softFullscreen ? innerHeight : screen.height; var rect = getBoundingClientRect(target); var windowedCssWidth = rect.width; var windowedCssHeight = rect.height; var canvasSize = getCanvasElementSize(target); var windowedRttWidth = canvasSize[0]; var windowedRttHeight = canvasSize[1]; if (strategy.scaleMode == 3) { setLetterbox(target, (cssHeight - windowedCssHeight) / 2, (cssWidth - windowedCssWidth) / 2); cssWidth = windowedCssWidth; cssHeight = windowedCssHeight } else if (strategy.scaleMode == 2) { if (cssWidth * windowedRttHeight < windowedRttWidth * cssHeight) { var desiredCssHeight = windowedRttHeight * cssWidth / windowedRttWidth; setLetterbox(target, (cssHeight - desiredCssHeight) / 2, 0); cssHeight = desiredCssHeight } else { var desiredCssWidth = windowedRttWidth * cssHeight / windowedRttHeight; setLetterbox(target, 0, (cssWidth - desiredCssWidth) / 2); cssWidth = desiredCssWidth } } target.style.backgroundColor ||= "black"; document.body.style.backgroundColor ||= "black"; target.style.width = cssWidth + "px"; target.style.height = cssHeight + "px"; if (strategy.filteringMode == 1) { target.style.imageRendering = "optimizeSpeed"; target.style.imageRendering = "-moz-crisp-edges"; target.style.imageRendering = "-o-crisp-edges"; target.style.imageRendering = "-webkit-optimize-contrast"; target.style.imageRendering = "optimize-contrast"; target.style.imageRendering = "crisp-edges"; target.style.imageRendering = "pixelated" } var dpiScale = strategy.canvasResolutionScaleMode == 2 ? devicePixelRatio : 1; if (strategy.canvasResolutionScaleMode != 0) { var newWidth = cssWidth * dpiScale | 0; var newHeight = cssHeight * dpiScale | 0; setCanvasElementSize(target, newWidth, newHeight); if (target.GLctxObject) target.GLctxObject.GLctx.viewport(0, 0, newWidth, newHeight) } return restoreOldStyle }; var JSEvents_requestFullscreen = (target, strategy) => { if (strategy.scaleMode != 0 || strategy.canvasResolutionScaleMode != 0) { JSEvents_resizeCanvasForFullscreen(target, strategy) } if (target.requestFullscreen) { target.requestFullscreen() } else if (target.webkitRequestFullscreen) { target.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT) } else { return JSEvents.fullscreenEnabled() ? -3 : -1 } currentFullscreenStrategy = strategy; if (strategy.canvasResizedCallback) { getWasmTableEntry(strategy.canvasResizedCallback)(37, 0, strategy.canvasResizedCallbackUserData) } return 0 }; var _emscripten_exit_fullscreen = () => { if (!JSEvents.fullscreenEnabled()) return -1; JSEvents.removeDeferredCalls(JSEvents_requestFullscreen); var d = specialHTMLTargets[1]; if (d.exitFullscreen) { d.fullscreenElement && d.exitFullscreen() } else if (d.webkitExitFullscreen) { d.webkitFullscreenElement && d.webkitExitFullscreen() } else { return -1 } return 0 }; var requestPointerLock = target => { if (target.requestPointerLock) { target.requestPointerLock() } else { if (document.body.requestPointerLock) { return -3 } return -1 } return 0 }; var _emscripten_exit_pointerlock = () => { JSEvents.removeDeferredCalls(requestPointerLock); if (!document.exitPointerLock) return -1; document.exitPointerLock(); return 0 }; function _emscripten_fetch_free(id) { if (Fetch.xhrs.has(id)) { var xhr = Fetch.xhrs.get(id); Fetch.xhrs.free(id); if (xhr.readyState > 0 && xhr.readyState < 4) { xhr.abort() } } } var _emscripten_get_device_pixel_ratio = () => globalThis.devicePixelRatio ?? 1; var _emscripten_get_element_css_size = (target, width, height) => { target = findEventTarget(target); if (!target) return -4; var rect = getBoundingClientRect(target); HEAPF64[width >> 3] = rect.width; HEAPF64[height >> 3] = rect.height; return 0 }; var fillGamepadEventData = (eventStruct, e) => { HEAPF64[eventStruct >> 3] = e.timestamp; for (var i = 0; i < e.axes.length; ++i) { HEAPF64[eventStruct + i * 8 + 16 >> 3] = e.axes[i] } for (var i = 0; i < e.buttons.length; ++i) { if (typeof e.buttons[i] == "object") { HEAPF64[eventStruct + i * 8 + 528 >> 3] = e.buttons[i].value } else { HEAPF64[eventStruct + i * 8 + 528 >> 3] = e.buttons[i] } } for (var i = 0; i < e.buttons.length; ++i) { if (typeof e.buttons[i] == "object") { HEAP8[eventStruct + i + 1040] = e.buttons[i].pressed } else { HEAP8[eventStruct + i + 1040] = e.buttons[i] == 1 } } HEAP8[eventStruct + 1104] = e.connected; HEAP32[eventStruct + 1108 >> 2] = e.index; HEAP32[eventStruct + 8 >> 2] = e.axes.length; HEAP32[eventStruct + 12 >> 2] = e.buttons.length; stringToUTF8(e.id, eventStruct + 1112, 64); stringToUTF8(e.mapping, eventStruct + 1176, 64) }; var _emscripten_get_gamepad_status = (index, gamepadState) => { if (index < 0 || index >= JSEvents.lastGamepadState.length) return -5; if (!JSEvents.lastGamepadState[index]) return -7; fillGamepadEventData(gamepadState, JSEvents.lastGamepadState[index]); return 0 }; var _emscripten_get_num_gamepads = () => JSEvents.lastGamepadState.length; var _emscripten_get_screen_size = (width, height) => { HEAP32[width >> 2] = screen.width; HEAP32[height >> 2] = screen.height }; var _emscripten_has_asyncify = () => 0; var _emscripten_is_main_browser_thread = () => !ENVIRONMENT_IS_WORKER; var doRequestFullscreen = (target, strategy) => { if (!JSEvents.fullscreenEnabled()) return -1; target = findEventTarget(target); if (!target) return -4; if (!target.requestFullscreen && !target.webkitRequestFullscreen) { return -3 } if (!JSEvents.canPerformEventHandlerRequests()) { if (strategy.deferUntilInEventHandler) { JSEvents.deferCall(JSEvents_requestFullscreen, 1, [target, strategy]); return 1 } return -2 } return JSEvents_requestFullscreen(target, strategy) }; var _emscripten_request_fullscreen_strategy = (target, deferUntilInEventHandler, fullscreenStrategy) => { var strategy = { scaleMode: HEAP32[fullscreenStrategy >> 2], canvasResolutionScaleMode: HEAP32[fullscreenStrategy + 4 >> 2], filteringMode: HEAP32[fullscreenStrategy + 8 >> 2], deferUntilInEventHandler, canvasResizedCallback: HEAP32[fullscreenStrategy + 12 >> 2], canvasResizedCallbackUserData: HEAP32[fullscreenStrategy + 16 >> 2] }; return doRequestFullscreen(target, strategy) }; var _emscripten_request_pointerlock = (target, deferUntilInEventHandler) => { target = findEventTarget(target); if (!target) return -4; if (!target.requestPointerLock) { return -1 } if (!JSEvents.canPerformEventHandlerRequests()) { if (deferUntilInEventHandler) { JSEvents.deferCall(requestPointerLock, 2, [target]); return 1 } return -2 } return requestPointerLock(target) }; var getHeapMax = () => 2147483648; var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment; var growMemory = size => { var oldHeapSize = wasmMemory.buffer.byteLength; var pages = (size - oldHeapSize + 65535) / 65536 | 0; try { wasmMemory.grow(pages); updateMemoryViews(); return 1 } catch (e) {} }; var _emscripten_resize_heap = requestedSize => { var oldSize = HEAPU8.length; requestedSize >>>= 0; var maxHeapSize = getHeapMax(); if (requestedSize > maxHeapSize) { return false } for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { var overGrownHeapSize = oldSize * (1 + .2 / cutDown); overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); var replacement = growMemory(newSize); if (replacement) { return true } } return false }; var _emscripten_run_script_int = ptr => eval(UTF8ToString(ptr)) | 0; var _emscripten_sample_gamepad_data = () => { try { if (navigator.getGamepads) return (JSEvents.lastGamepadState = navigator.getGamepads()) ? 0 : -1 } catch (e) { navigator.getGamepads = null } return -1 }; var registerBeforeUnloadEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) => { var beforeUnloadEventHandlerFunc = e => { var confirmationMessage = getWasmTableEntry(callbackfunc)(eventTypeId, 0, userData); if (confirmationMessage) { confirmationMessage = UTF8ToString(confirmationMessage) } if (confirmationMessage) { e.preventDefault(); e.returnValue = confirmationMessage; return confirmationMessage } }; var eventHandler = { target: findEventTarget(target), eventTypeString, eventTypeId, userData, callbackfunc, handlerFunc: beforeUnloadEventHandlerFunc, useCapture }; return JSEvents.registerOrRemoveHandler(eventHandler) }; var _emscripten_set_beforeunload_callback_on_thread = (userData, callbackfunc, targetThread) => { if (typeof onbeforeunload == "undefined") return -1; if (targetThread !== 1) return -5; return registerBeforeUnloadEventCallback(2, userData, true, callbackfunc, 28, "beforeunload") }; var registerFocusEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { var eventSize = 256; JSEvents.focusEvent ||= _malloc(eventSize); var focusEventHandlerFunc = e => { var nodeName = JSEvents.getNodeNameForTarget(e.target); var id = e.target.id ? e.target.id : ""; var focusEvent = JSEvents.focusEvent; stringToUTF8(nodeName, focusEvent + 0, 128); stringToUTF8(id, focusEvent + 128, 128); if (getWasmTableEntry(callbackfunc)(eventTypeId, focusEvent, userData)) e.preventDefault() }; var eventHandler = { target: findEventTarget(target), eventTypeString, eventTypeId, userData, callbackfunc, handlerFunc: focusEventHandlerFunc, useCapture }; return JSEvents.registerOrRemoveHandler(eventHandler) }; var _emscripten_set_blur_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerFocusEventCallback(target, userData, useCapture, callbackfunc, 12, "blur", targetThread); var _emscripten_set_element_css_size = (target, width, height) => { target = findEventTarget(target); if (!target) return -4; target.style.width = width + "px"; target.style.height = height + "px"; return 0 }; var _emscripten_set_focus_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerFocusEventCallback(target, userData, useCapture, callbackfunc, 13, "focus", targetThread); var fillFullscreenChangeEventData = eventStruct => { var fullscreenElement = getFullscreenElement(); var isFullscreen = !!fullscreenElement; HEAP8[eventStruct] = isFullscreen; HEAP8[eventStruct + 1] = JSEvents.fullscreenEnabled(); var reportedElement = isFullscreen ? fullscreenElement : JSEvents.previousFullscreenElement; var nodeName = JSEvents.getNodeNameForTarget(reportedElement); var id = reportedElement?.id || ""; stringToUTF8(nodeName, eventStruct + 2, 128); stringToUTF8(id, eventStruct + 130, 128); HEAP32[eventStruct + 260 >> 2] = reportedElement ? reportedElement.clientWidth : 0; HEAP32[eventStruct + 264 >> 2] = reportedElement ? reportedElement.clientHeight : 0; HEAP32[eventStruct + 268 >> 2] = screen.width; HEAP32[eventStruct + 272 >> 2] = screen.height; if (isFullscreen) { JSEvents.previousFullscreenElement = fullscreenElement } }; var registerFullscreenChangeEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { var eventSize = 276; JSEvents.fullscreenChangeEvent ||= _malloc(eventSize); var fullscreenChangeEventhandlerFunc = e => { var fullscreenChangeEvent = JSEvents.fullscreenChangeEvent; fillFullscreenChangeEventData(fullscreenChangeEvent); if (getWasmTableEntry(callbackfunc)(eventTypeId, fullscreenChangeEvent, userData)) e.preventDefault() }; var eventHandler = { target, eventTypeString, eventTypeId, userData, callbackfunc, handlerFunc: fullscreenChangeEventhandlerFunc, useCapture }; return JSEvents.registerOrRemoveHandler(eventHandler) }; var _emscripten_set_fullscreenchange_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => { if (!JSEvents.fullscreenEnabled()) return -1; target = findEventTarget(target); if (!target) return -4; registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "webkitfullscreenchange", targetThread); return registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "fullscreenchange", targetThread) }; var registerGamepadEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { var eventSize = 1240; JSEvents.gamepadEvent ||= _malloc(eventSize); var gamepadEventHandlerFunc = e => { var gamepadEvent = JSEvents.gamepadEvent; fillGamepadEventData(gamepadEvent, e["gamepad"]); if (getWasmTableEntry(callbackfunc)(eventTypeId, gamepadEvent, userData)) e.preventDefault() }; var eventHandler = { target: findEventTarget(target), allowsDeferredCalls: true, eventTypeString, eventTypeId, userData, callbackfunc, handlerFunc: gamepadEventHandlerFunc, useCapture }; return JSEvents.registerOrRemoveHandler(eventHandler) }; var _emscripten_set_gamepadconnected_callback_on_thread = (userData, useCapture, callbackfunc, targetThread) => { if (_emscripten_sample_gamepad_data()) return -1; return registerGamepadEventCallback(2, userData, useCapture, callbackfunc, 26, "gamepadconnected", targetThread) }; var _emscripten_set_gamepaddisconnected_callback_on_thread = (userData, useCapture, callbackfunc, targetThread) => { if (_emscripten_sample_gamepad_data()) return -1; return registerGamepadEventCallback(2, userData, useCapture, callbackfunc, 27, "gamepaddisconnected", targetThread) }; var registerKeyEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { var eventSize = 160; JSEvents.keyEvent ||= _malloc(eventSize); var keyEventHandlerFunc = e => { var keyEventData = JSEvents.keyEvent; HEAPF64[keyEventData >> 3] = e.timeStamp; var idx = keyEventData >> 2; HEAP32[idx + 2] = e.location; HEAP8[keyEventData + 12] = e.ctrlKey; HEAP8[keyEventData + 13] = e.shiftKey; HEAP8[keyEventData + 14] = e.altKey; HEAP8[keyEventData + 15] = e.metaKey; HEAP8[keyEventData + 16] = e.repeat; HEAP32[idx + 5] = e.charCode; HEAP32[idx + 6] = e.keyCode; HEAP32[idx + 7] = e.which; stringToUTF8(e.key || "", keyEventData + 32, 32); stringToUTF8(e.code || "", keyEventData + 64, 32); stringToUTF8(e.char || "", keyEventData + 96, 32); stringToUTF8(e.locale || "", keyEventData + 128, 32); if (getWasmTableEntry(callbackfunc)(eventTypeId, keyEventData, userData)) e.preventDefault() }; var eventHandler = { target: findEventTarget(target), eventTypeString, eventTypeId, userData, callbackfunc, handlerFunc: keyEventHandlerFunc, useCapture }; return JSEvents.registerOrRemoveHandler(eventHandler) }; var _emscripten_set_keydown_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerKeyEventCallback(target, userData, useCapture, callbackfunc, 2, "keydown", targetThread); var _emscripten_set_keypress_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerKeyEventCallback(target, userData, useCapture, callbackfunc, 1, "keypress", targetThread); var _emscripten_set_keyup_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerKeyEventCallback(target, userData, useCapture, callbackfunc, 3, "keyup", targetThread); var _emscripten_set_main_loop = (func, fps, simulateInfiniteLoop) => { var iterFunc = getWasmTableEntry(func); setMainLoop(iterFunc, fps, simulateInfiniteLoop) }; var fillMouseEventData = (eventStruct, e, target) => { HEAPF64[eventStruct >> 3] = e.timeStamp; var idx = eventStruct >> 2; HEAP32[idx + 2] = e.screenX; HEAP32[idx + 3] = e.screenY; HEAP32[idx + 4] = e.clientX; HEAP32[idx + 5] = e.clientY; HEAP8[eventStruct + 24] = e.ctrlKey; HEAP8[eventStruct + 25] = e.shiftKey; HEAP8[eventStruct + 26] = e.altKey; HEAP8[eventStruct + 27] = e.metaKey; HEAP16[idx * 2 + 14] = e.button; HEAP16[idx * 2 + 15] = e.buttons; HEAP32[idx + 8] = e["movementX"]; HEAP32[idx + 9] = e["movementY"]; var rect = getBoundingClientRect(target); HEAP32[idx + 10] = e.clientX - (rect.left | 0); HEAP32[idx + 11] = e.clientY - (rect.top | 0) }; var registerMouseEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { var eventSize = 64; JSEvents.mouseEvent ||= _malloc(eventSize); target = findEventTarget(target); var mouseEventHandlerFunc = e => { fillMouseEventData(JSEvents.mouseEvent, e, target); if (getWasmTableEntry(callbackfunc)(eventTypeId, JSEvents.mouseEvent, userData)) e.preventDefault() }; var eventHandler = { target, allowsDeferredCalls: eventTypeString != "mousemove" && eventTypeString != "mouseenter" && eventTypeString != "mouseleave", eventTypeString, eventTypeId, userData, callbackfunc, handlerFunc: mouseEventHandlerFunc, useCapture }; return JSEvents.registerOrRemoveHandler(eventHandler) }; var _emscripten_set_mousedown_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerMouseEventCallback(target, userData, useCapture, callbackfunc, 5, "mousedown", targetThread); var _emscripten_set_mouseenter_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerMouseEventCallback(target, userData, useCapture, callbackfunc, 33, "mouseenter", targetThread); var _emscripten_set_mouseleave_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerMouseEventCallback(target, userData, useCapture, callbackfunc, 34, "mouseleave", targetThread); var _emscripten_set_mousemove_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerMouseEventCallback(target, userData, useCapture, callbackfunc, 8, "mousemove", targetThread); var _emscripten_set_mouseup_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerMouseEventCallback(target, userData, useCapture, callbackfunc, 6, "mouseup", targetThread); var fillPointerlockChangeEventData = eventStruct => { var pointerLockElement = document.pointerLockElement; var isPointerlocked = !!pointerLockElement; HEAP8[eventStruct] = isPointerlocked; var nodeName = JSEvents.getNodeNameForTarget(pointerLockElement); var id = pointerLockElement?.id || ""; stringToUTF8(nodeName, eventStruct + 1, 128); stringToUTF8(id, eventStruct + 129, 128) }; var registerPointerlockChangeEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { var eventSize = 257; JSEvents.pointerlockChangeEvent ||= _malloc(eventSize); var pointerlockChangeEventHandlerFunc = e => { var pointerlockChangeEvent = JSEvents.pointerlockChangeEvent; fillPointerlockChangeEventData(pointerlockChangeEvent); if (getWasmTableEntry(callbackfunc)(eventTypeId, pointerlockChangeEvent, userData)) e.preventDefault() }; var eventHandler = { target, eventTypeString, eventTypeId, userData, callbackfunc, handlerFunc: pointerlockChangeEventHandlerFunc, useCapture }; return JSEvents.registerOrRemoveHandler(eventHandler) }; var _emscripten_set_pointerlockchange_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => { if (!document.body?.requestPointerLock) { return -1 } target = findEventTarget(target); if (!target) return -4; return registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "pointerlockchange", targetThread) }; var registerUiEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { var eventSize = 36; JSEvents.uiEvent ||= _malloc(eventSize); target = findEventTarget(target); var uiEventHandlerFunc = e => { if (e.target != target) { return } var b = document.body; if (!b) { return } var uiEvent = JSEvents.uiEvent; HEAP32[uiEvent >> 2] = 0; HEAP32[uiEvent + 4 >> 2] = b.clientWidth; HEAP32[uiEvent + 8 >> 2] = b.clientHeight; HEAP32[uiEvent + 12 >> 2] = innerWidth; HEAP32[uiEvent + 16 >> 2] = innerHeight; HEAP32[uiEvent + 20 >> 2] = outerWidth; HEAP32[uiEvent + 24 >> 2] = outerHeight; HEAP32[uiEvent + 28 >> 2] = pageXOffset | 0; HEAP32[uiEvent + 32 >> 2] = pageYOffset | 0; if (getWasmTableEntry(callbackfunc)(eventTypeId, uiEvent, userData)) e.preventDefault() }; var eventHandler = { target, eventTypeString, eventTypeId, userData, callbackfunc, handlerFunc: uiEventHandlerFunc, useCapture }; return JSEvents.registerOrRemoveHandler(eventHandler) }; var _emscripten_set_resize_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerUiEventCallback(target, userData, useCapture, callbackfunc, 10, "resize", targetThread); var registerTouchEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { var eventSize = 1552; JSEvents.touchEvent ||= _malloc(eventSize); target = findEventTarget(target); var touchEventHandlerFunc = e => { var t, touches = {}, et = e.touches; for (let t of et) { t.isChanged = t.onTarget = 0; touches[t.identifier] = t } for (let t of e.changedTouches) { t.isChanged = 1; touches[t.identifier] = t } for (let t of e.targetTouches) { touches[t.identifier].onTarget = 1 } var touchEvent = JSEvents.touchEvent; HEAPF64[touchEvent >> 3] = e.timeStamp; HEAP8[touchEvent + 12] = e.ctrlKey; HEAP8[touchEvent + 13] = e.shiftKey; HEAP8[touchEvent + 14] = e.altKey; HEAP8[touchEvent + 15] = e.metaKey; var idx = touchEvent + 16; var targetRect = getBoundingClientRect(target); var numTouches = 0; for (let t of Object.values(touches)) { var idx32 = idx >> 2; HEAP32[idx32 + 0] = t.identifier; HEAP32[idx32 + 1] = t.screenX; HEAP32[idx32 + 2] = t.screenY; HEAP32[idx32 + 3] = t.clientX; HEAP32[idx32 + 4] = t.clientY; HEAP32[idx32 + 5] = t.pageX; HEAP32[idx32 + 6] = t.pageY; HEAP8[idx + 28] = t.isChanged; HEAP8[idx + 29] = t.onTarget; HEAP32[idx32 + 8] = t.clientX - (targetRect.left | 0); HEAP32[idx32 + 9] = t.clientY - (targetRect.top | 0); idx += 48; if (++numTouches > 31) { break } } HEAP32[touchEvent + 8 >> 2] = numTouches; if (getWasmTableEntry(callbackfunc)(eventTypeId, touchEvent, userData)) e.preventDefault() }; var eventHandler = { target, allowsDeferredCalls: eventTypeString == "touchstart" || eventTypeString == "touchend", eventTypeString, eventTypeId, userData, callbackfunc, handlerFunc: touchEventHandlerFunc, useCapture }; return JSEvents.registerOrRemoveHandler(eventHandler) }; var _emscripten_set_touchcancel_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerTouchEventCallback(target, userData, useCapture, callbackfunc, 25, "touchcancel", targetThread); var _emscripten_set_touchend_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerTouchEventCallback(target, userData, useCapture, callbackfunc, 23, "touchend", targetThread); var _emscripten_set_touchmove_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerTouchEventCallback(target, userData, useCapture, callbackfunc, 24, "touchmove", targetThread); var _emscripten_set_touchstart_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => registerTouchEventCallback(target, userData, useCapture, callbackfunc, 22, "touchstart", targetThread); var fillVisibilityChangeEventData = eventStruct => { var visibilityStates = ["hidden", "visible", "prerender", "unloaded"]; var visibilityState = visibilityStates.indexOf(document.visibilityState); HEAP8[eventStruct] = document.hidden; HEAP32[eventStruct + 4 >> 2] = visibilityState }; var registerVisibilityChangeEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { var eventSize = 8; JSEvents.visibilityChangeEvent ||= _malloc(eventSize); var visibilityChangeEventHandlerFunc = e => { var visibilityChangeEvent = JSEvents.visibilityChangeEvent; fillVisibilityChangeEventData(visibilityChangeEvent); if (getWasmTableEntry(callbackfunc)(eventTypeId, visibilityChangeEvent, userData)) e.preventDefault() }; var eventHandler = { target, eventTypeString, eventTypeId, userData, callbackfunc, handlerFunc: visibilityChangeEventHandlerFunc, useCapture }; return JSEvents.registerOrRemoveHandler(eventHandler) }; var _emscripten_set_visibilitychange_callback_on_thread = (userData, useCapture, callbackfunc, targetThread) => { if (!specialHTMLTargets[1]) { return -4 } return registerVisibilityChangeEventCallback(specialHTMLTargets[1], userData, useCapture, callbackfunc, 21, "visibilitychange", targetThread) }; var registerWheelEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { var eventSize = 96; JSEvents.wheelEvent ||= _malloc(eventSize); var wheelHandlerFunc = e => { var wheelEvent = JSEvents.wheelEvent; fillMouseEventData(wheelEvent, e, target); HEAPF64[wheelEvent + 64 >> 3] = e["deltaX"]; HEAPF64[wheelEvent + 72 >> 3] = e["deltaY"]; HEAPF64[wheelEvent + 80 >> 3] = e["deltaZ"]; HEAP32[wheelEvent + 88 >> 2] = e["deltaMode"]; if (getWasmTableEntry(callbackfunc)(eventTypeId, wheelEvent, userData)) e.preventDefault() }; var eventHandler = { target, allowsDeferredCalls: true, eventTypeString, eventTypeId, userData, callbackfunc, handlerFunc: wheelHandlerFunc, useCapture }; return JSEvents.registerOrRemoveHandler(eventHandler) }; var _emscripten_set_wheel_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => { target = findEventTarget(target); if (!target) return -4; if (typeof target.onwheel != "undefined") { return registerWheelEventCallback(target, userData, useCapture, callbackfunc, 9, "wheel", targetThread) } else { return -1 } };