@crossbind/example-lib-prebuilt-matrix 2.0.0-beta.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +78 -0
- package/CHANGELOG.md +20 -0
- package/LICENSE +21 -0
- package/README.md +81 -0
- package/crossbind-example-lib-prebuilt-matrix.podspec +21 -0
- package/crossbind-example-lib-prebuilt-matrix.xcframework/Info.plist +47 -0
- package/crossbind-example-lib-prebuilt-matrix.xcframework/ios-arm64/Headers/Matrix.h +12 -0
- package/crossbind-example-lib-prebuilt-matrix.xcframework/ios-arm64/libcrossbind-example-lib-prebuilt-matrix.a +0 -0
- package/crossbind-example-lib-prebuilt-matrix.xcframework/ios-arm64-simulator/Headers/Matrix.h +12 -0
- package/crossbind-example-lib-prebuilt-matrix.xcframework/ios-arm64-simulator/libcrossbind-example-lib-prebuilt-matrix.a +0 -0
- package/crossbind.config.js +14 -0
- package/dist/crossbind-example-lib-prebuilt-matrix-wasi-wasm32-st-release.wasm +0 -0
- package/dist/crossbind-example-lib-prebuilt-matrix-wasm-wasm32-mt-release.browser.js +1363 -0
- package/dist/crossbind-example-lib-prebuilt-matrix-wasm-wasm32-mt-release.browser.wasm +0 -0
- package/dist/crossbind-example-lib-prebuilt-matrix-wasm-wasm32-mt-release.node.js +508 -0
- package/dist/crossbind-example-lib-prebuilt-matrix-wasm-wasm32-mt-release.node.wasm +0 -0
- package/dist/crossbind-example-lib-prebuilt-matrix-wasm-wasm32-st-release.browser.js +1363 -0
- package/dist/crossbind-example-lib-prebuilt-matrix-wasm-wasm32-st-release.browser.wasm +0 -0
- package/dist/crossbind-example-lib-prebuilt-matrix-wasm-wasm32-st-release.edge.js +478 -0
- package/dist/crossbind-example-lib-prebuilt-matrix-wasm-wasm32-st-release.edge.wasm +0 -0
- package/dist/crossbind-example-lib-prebuilt-matrix-wasm-wasm32-st-release.node.js +508 -0
- package/dist/crossbind-example-lib-prebuilt-matrix-wasm-wasm32-st-release.node.wasm +0 -0
- package/dist/prebuilt/CMakeLists.txt +57 -0
- package/dist/prebuilt/android-arm64-v8a-mt-release/crossbind-emccflags.fingerprint +1 -0
- package/dist/prebuilt/android-arm64-v8a-mt-release/include/Matrix.h +12 -0
- package/dist/prebuilt/android-arm64-v8a-mt-release/lib/libcrossbind-example-lib-prebuilt-matrix.so +0 -0
- package/dist/prebuilt/android-x86_64-mt-release/crossbind-emccflags.fingerprint +1 -0
- package/dist/prebuilt/android-x86_64-mt-release/include/Matrix.h +12 -0
- package/dist/prebuilt/android-x86_64-mt-release/lib/libcrossbind-example-lib-prebuilt-matrix.so +0 -0
- package/dist/prebuilt/ios-iphoneos-mt-release/crossbind-emccflags.fingerprint +1 -0
- package/dist/prebuilt/ios-iphoneos-mt-release/include/Matrix.h +12 -0
- package/dist/prebuilt/ios-iphoneos-mt-release/lib/libcrossbind-example-lib-prebuilt-matrix.a +0 -0
- package/dist/prebuilt/ios-iphonesimulator-mt-release/crossbind-emccflags.fingerprint +1 -0
- package/dist/prebuilt/ios-iphonesimulator-mt-release/include/Matrix.h +12 -0
- package/dist/prebuilt/ios-iphonesimulator-mt-release/lib/libcrossbind-example-lib-prebuilt-matrix.a +0 -0
- package/dist/prebuilt/wasi-wasm32-st-release/crossbind-emccflags.fingerprint +1 -0
- package/dist/prebuilt/wasi-wasm32-st-release/include/Matrix.h +12 -0
- package/dist/prebuilt/wasi-wasm32-st-release/lib/libcrossbind-example-lib-prebuilt-matrix.a +0 -0
- package/dist/prebuilt/wasm-wasm32-mt-release/crossbind-emccflags.fingerprint +1 -0
- package/dist/prebuilt/wasm-wasm32-mt-release/include/Matrix.h +12 -0
- package/dist/prebuilt/wasm-wasm32-mt-release/lib/libcrossbind-example-lib-prebuilt-matrix.a +0 -0
- package/dist/prebuilt/wasm-wasm32-st-release/crossbind-emccflags.fingerprint +1 -0
- package/dist/prebuilt/wasm-wasm32-st-release/include/Matrix.h +12 -0
- package/dist/prebuilt/wasm-wasm32-st-release/lib/libcrossbind-example-lib-prebuilt-matrix.a +0 -0
- package/dist/types/index.d.ts +9 -0
- package/package.json +38 -0
- package/playground/Matrix.js +19 -0
- package/playground/index.html +74 -0
- package/src/native/Matrix.cpp +17 -0
- package/src/native/Matrix.h +12 -0
|
@@ -0,0 +1,1363 @@
|
|
|
1
|
+
(function (global, factory) {
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.initNative = factory());
|
|
5
|
+
})(this, (function () { 'use strict';
|
|
6
|
+
|
|
7
|
+
function getDefaultExportFromCjs (x) {
|
|
8
|
+
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
var crossbindExampleLibPrebuiltMatrixWasmWasm32StRelease_browser = {exports: {}};
|
|
12
|
+
|
|
13
|
+
var hasRequiredCrossbindExampleLibPrebuiltMatrixWasmWasm32StRelease_browser;
|
|
14
|
+
|
|
15
|
+
function requireCrossbindExampleLibPrebuiltMatrixWasmWasm32StRelease_browser () {
|
|
16
|
+
if (hasRequiredCrossbindExampleLibPrebuiltMatrixWasmWasm32StRelease_browser) return crossbindExampleLibPrebuiltMatrixWasmWasm32StRelease_browser.exports;
|
|
17
|
+
hasRequiredCrossbindExampleLibPrebuiltMatrixWasmWasm32StRelease_browser = 1;
|
|
18
|
+
(function (module, exports) {
|
|
19
|
+
var Module2=(()=>{var _scriptName=globalThis.document?.currentScript?.src;return async function(moduleArg={}){var Module=moduleArg;var ENVIRONMENT_IS_WEB=!!globalThis.window;var ENVIRONMENT_IS_WORKER=!!globalThis.WorkerGlobalScope;globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href;}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href;}catch{}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)};}readAsync=async url=>{if(isFileURI(url)){return new Promise((resolve,reject)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response);return}reject(xhr.status);};xhr.onerror=reject;xhr.send(null);})}var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)};}}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var isFileURI=filename=>filename.startsWith("file://");var runtimeInitialized=false;function getMemoryBuffer(){return wasmMemory.buffer}function updateMemoryViews(){if(HEAP8?.buffer?.resizable)return;var b=getMemoryBuffer();HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b);}function preRun(){var preRun=Module["preRun"];if(preRun){if(typeof preRun=="function")preRun=[preRun];onPreRuns.push(...preRun);}callRuntimeCallbacks(onPreRuns);}function initRuntime(){runtimeInitialized=true;wasmExports["la"]();}function postRun(){var postRun=Module["postRun"];if(postRun){if(typeof postRun=="function")postRun=[postRun];onPostRuns.push(...postRun);}callRuntimeCallbacks(onPostRuns);}function abort(what){Module["onAbort"]?.(what);what=`Aborted(${what})`;err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";if(runtimeInitialized){___trap();}var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("crossbind-example-lib-prebuilt-matrix-wasm-wasm32-st-release.browser.wasm")}function getBinarySync(file){if(readBinary){return readBinary(file)}throw "both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){{try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason);}}async function instantiateAsync(binary,binaryFile,imports){if(!isFileURI(binaryFile)){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();return wasmExports}function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();var instantiateWasm=Module["instantiateWasm"];if(instantiateWasm){return new Promise(resolve=>{instantiateWasm(info,inst=>resolve(receiveInstance(inst)));})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}var HEAP16;var HEAP32;var HEAP64;var HEAP8;var HEAPF32;var HEAPF64;var HEAPU16;var HEAPU32;var HEAPU64;var HEAPU8;var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module);}};var onPostRuns=[];var onPreRuns=[];var __abort_js=()=>abort("");var AsciiToString=ptr=>{var str="";while(1){var ch=HEAPU8[ptr++];if(!ch)return str;str+=String.fromCharCode(ch);}};var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var BindingError=class BindingError extends Error{constructor(message){super(message);this.name="BindingError";}};var throwBindingError=message=>{throw new BindingError(message)};function sharedRegisterType(rawType,registeredInstance,options={}){var name=registeredInstance.name;if(!rawType){throwBindingError(`type "${name}" must have a positive integer typeid pointer`);}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else {throwBindingError(`Cannot register type '${name}' twice`);}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(cb=>cb());}}function registerType(rawType,registeredInstance,options={}){return sharedRegisterType(rawType,registeredInstance,options)}var integerReadValueFromPointer=(name,width,signed)=>{switch(width){case 1:return signed?pointer=>HEAP8[pointer]:pointer=>HEAPU8[pointer];case 2:return signed?pointer=>HEAP16[pointer>>1]:pointer=>HEAPU16[pointer>>1];case 4:return signed?pointer=>HEAP32[pointer>>2]:pointer=>HEAPU32[pointer>>2];case 8:return signed?pointer=>HEAP64[pointer>>3]:pointer=>HEAPU64[pointer>>3];default:throw new TypeError(`invalid integer width (${width}): ${name}`)}};var __embind_register_bigint=(primitiveType,name,size,minRange,maxRange)=>{name=AsciiToString(name);const isUnsignedType=minRange===0n;let fromWireType=value=>value;if(isUnsignedType){const bitSize=size*8;fromWireType=value=>BigInt.asUintN(bitSize,value);maxRange=fromWireType(maxRange);}registerType(primitiveType,{name,fromWireType,toWireType:(destructors,value)=>{if(typeof value=="number"){value=BigInt(value);}return value},readValueFromPointer:integerReadValueFromPointer(name,size,!isUnsignedType),destructorFunction:null});};var __embind_register_bool=(rawType,name,trueValue,falseValue)=>{name=AsciiToString(name);registerType(rawType,{name,fromWireType:function(wt){return !!wt},toWireType:function(destructors,o){return o?trueValue:falseValue},readValueFromPointer:function(pointer){return this.fromWireType(HEAPU8[pointer])},destructorFunction:null});};var shallowCopyInternalPointer=o=>({count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType});var throwInstanceAlreadyDeleted=obj=>{function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted");};var finalizationRegistry=false;var detachFinalizer=handle=>{};var runDestructor=$$=>{if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr);}else {$$.ptrType.registeredClass.rawDestructor($$.ptr);}};var releaseClassHandle=$$=>{$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$);}};var attachFinalizer=handle=>{if(!globalThis.FinalizationRegistry){attachFinalizer=handle=>handle;return handle}finalizationRegistry=new FinalizationRegistry(info=>{releaseClassHandle(info.$$);});attachFinalizer=handle=>{var $$=handle.$$;var hasSmartPtr=!!$$.smartPtr;if(hasSmartPtr){var info={$$};finalizationRegistry.register(handle,info,handle);}return handle};detachFinalizer=handle=>finalizationRegistry.unregister(handle);return attachFinalizer(handle)};var init_ClassHandle=()=>{let proto=ClassHandle.prototype;Object.assign(proto,{isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;other.$$=other.$$;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass;}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass;}return leftClass===rightClass&&left===right},clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this);}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else {var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}},delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this);}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion");}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined;}},isDeleted(){return !this.$$.ptr},deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this);}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion");}this.$$.deleteScheduled=true;return this}});const symbolDispose=Symbol.dispose;if(symbolDispose){proto[symbolDispose]=proto["delete"];}};function ClassHandle(){}var createNamedFunction=(name,func)=>Object.defineProperty(func,"name",{value:name});var registeredPointers={};var ensureOverloadTable=(proto,methodName,humanName)=>{if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(...args){if(!proto[methodName].overloadTable.hasOwnProperty(args.length)){throwBindingError(`Function '${humanName}' called with an invalid number of arguments (${args.length}) - expects one of (${proto[methodName].overloadTable})!`);}return proto[methodName].overloadTable[args.length].apply(this,args)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc;}};var getSignature=(args,keys)=>{var signature="";keys.some(key=>{if(key.length!==args.length){return false}var isKeyMatched=key.every((field,i)=>field==="emscripten::val"||typeof args[i]==="bigint"&&field==="number"||typeof args[i]==="object"&&undefined!==registeredTypes[field]&&args[i]instanceof registeredTypes[field].registeredClass.constructor||typeof args[i]===field);if(isKeyMatched){signature=key.join(", ");return true}return false});return signature};var ensureOverloadSignatureTable=(proto,methodName,humanName,numArguments)=>{ensureOverloadTable(proto,methodName,humanName);if(undefined!==proto[methodName].overloadTable&&undefined!==proto[methodName].overloadTable[numArguments]&&undefined===proto[methodName].overloadTable[numArguments].signatures){var prevFunc=proto[methodName].overloadTable[numArguments];proto[methodName].overloadTable[numArguments]=function(...args){var keys=proto[methodName].overloadTable[args.length].signaturesArray;var signature=getSignature(args,keys);if(!proto[methodName].overloadTable[args.length].signatures.hasOwnProperty(signature)){var signatures=proto[methodName].overloadTable[args.length].signaturesArray.map(sig=>"("+sig.map(s=>typeof s==="string"?s:registeredTypes[s].name)+")");var params=args.map(arg=>typeof arg==="object"&&arg.constructor&&arg.constructor.name?arg.constructor.name:typeof arg);throwBindingError(`Function '${humanName}' called with an invalid signature (${params}) - expects one of (${signatures})!`);}return proto[methodName].overloadTable[args.length].signatures[signature].apply(this,args)};proto[methodName].overloadTable[numArguments].signatures={};proto[methodName].overloadTable[numArguments].signatures[prevFunc.signature]=prevFunc;proto[methodName].overloadTable[numArguments].signaturesArray=[];}};var exposePublicSymbol=(name,value,numArguments,rawSignature)=>{if(Module.hasOwnProperty(name)){if(undefined===numArguments||Module[name].signature===rawSignature||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]&&Module[name].overloadTable[numArguments].signature===rawSignature||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]&&undefined!==Module[name].overloadTable[numArguments].signatures&&undefined!==Module[name].overloadTable[numArguments].signatures[rawSignature]){throwBindingError(`Cannot register public name '${name}' twice`);}if(undefined===Module[name].overloadTable&&Module[name].argCount===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){ensureOverloadSignatureTable(Module,name,name,numArguments);Module[name].overloadTable[numArguments].signatures[rawSignature]=value;}else {ensureOverloadTable(Module,name,name);Module[name].overloadTable[numArguments]=value;Module[name].overloadTable[numArguments].signature=rawSignature;}}else {Module[name]=value;if(undefined!==rawSignature){Module[name].argCount=numArguments;Module[name].signature=rawSignature;}}};var char_0=48;var char_9=57;var makeLegalFunctionName=name=>{name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return `_${name}`}return name};function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[];}var upcastPointer=(ptr,ptrClass,desiredClass)=>{while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError(`Expected null or instance of ${desiredClass.name}, got an instance of ${ptrClass.name}`);}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass;}return ptr};var embindRepr=v=>{if(v===null){return "null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else {return ""+v}};function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`);}return 0}if(!handle.$$){throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`);}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`);}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`);}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr);}return ptr}else {return 0}}if(!handle||!handle.$$){throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`);}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`);}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError(`Cannot convert argument of type ${handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name} to parameter type ${this.name}`);}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal");}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr;}else {throwBindingError(`Cannot convert argument of type ${handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name} to parameter type ${this.name}`);}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr;}else {var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,Emval.toHandle(()=>clonedHandle["delete"]()));if(destructors!==null){destructors.push(this.rawDestructor,ptr);}}break;default:throwBindingError("Unsupported sharing policy");}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError(`null is not a valid ${this.name}`);}return 0}if(!handle.$$){throwBindingError(`Cannot pass "${embindRepr(handle)}" as a ${this.name}`);}if(!handle.$$.ptr){throwBindingError(`Cannot pass deleted object as a pointer of type ${this.name}`);}if(handle.$$.ptrType.isConst){throwBindingError(`Cannot convert argument of type ${handle.$$.ptrType.name} to parameter type ${this.name}`);}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function readPointer(pointer){return this.fromWireType(HEAPU32[pointer>>2])}var downcastPointer=(ptr,ptrClass,desiredClass)=>{if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)};var registeredInstances={};var getBasestPointer=(class_,ptr)=>{if(ptr===undefined){throwBindingError("ptr should not be undefined");}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass;}return ptr};var getInheritedInstance=(class_,ptr)=>{ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]};var InternalError=class InternalError extends Error{constructor(message){super(message);this.name="InternalError";}};var throwInternalError=message=>{throw new InternalError(message)};var makeClassHandle=(prototype,record)=>{if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType");}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified");}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record,writable:true}}))};function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else {var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else {return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType;}else {toType=registeredPointerRecord.pointerType;}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else {return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}var init_RegisteredPointer=()=>{Object.assign(RegisteredPointer.prototype,{getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr);}return ptr},destructor(ptr){this.rawDestructor?.(ptr);},readValueFromPointer:readPointer,fromWireType:RegisteredPointer_fromWireType});};function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this.toWireType=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null;}else {this.toWireType=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null;}}else {this.toWireType=genericPointerToWireType;}}var replacePublicSymbol=(name,value,numArguments,signatureArray,rawSignature)=>{if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistent public symbol");}var signatureString=undefined!==signatureArray?signatureArray.join(", "):undefined;if(undefined!==Module[name].overloadTable&&undefined!==numArguments){if(undefined!==Module[name].overloadTable[numArguments]&&undefined!==Module[name].overloadTable[numArguments].signatures&&signatureString){if(undefined!==Module[name].overloadTable[numArguments].signatures[rawSignature]){delete Module[name].overloadTable[numArguments].signatures[rawSignature];}if(undefined!==Module[name].overloadTable[numArguments].signatures[signatureString]){throwBindingError(`Cannot register multiple overloads of a function with the same number of arguments (${numArguments})!`);}Module[name].overloadTable[numArguments].signatures[signatureString]=value;Module[name].overloadTable[numArguments].signaturesArray.push(signatureArray);}else {Module[name].overloadTable[numArguments]=value;}}else {Module[name]=value;Module[name].argCount=numArguments;Module[name].signature=signatureString;}};var wasmTableMirror=[];var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr);}return func};var embind__requireFunction=(signature,rawFunction,isAsync=false)=>{signature=AsciiToString(signature);function makeDynCaller(){var rtn=getWasmTableEntry(rawFunction);return rtn}var fp=makeDynCaller();if(typeof fp!="function"){throwBindingError(`unknown function pointer with signature ${signature}: ${rawFunction}`);}return fp};class UnboundTypeError extends Error{}var getTypeName=type=>{var ptr=___getTypeName(type);var rv=AsciiToString(ptr);_free(ptr);return rv};var throwUnboundTypeError=(message,types)=>{var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true;}types.forEach(visit);throw new UnboundTypeError(`${message}: `+unboundTypes.map(getTypeName).join([", "]))};var whenDependentTypesAreResolved=(myTypes,dependentTypes,getTypeConverters)=>{myTypes.forEach(type=>typeDependencies[type]=dependentTypes);function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count");}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i]);}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;for(let[i,dt]of dependentTypes.entries()){if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt];}else {unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[];}awaitingDependencies[dt].push(()=>{typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters);}});}}if(0===unregisteredTypes.length){onComplete(typeConverters);}};var __embind_register_class=(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor)=>{name=AsciiToString(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);upcast&&=embind__requireFunction(upcastSignature,upcast);downcast&&=embind__requireFunction(downcastSignature,downcast);rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError(`Cannot construct ${name} due to unbound types`,[baseClassRawType]);});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],base=>{base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype;}else {basePrototype=ClassHandle.prototype;}var constructor=createNamedFunction(name,function(...args){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError(`Use 'new' to construct ${name}`)}if(undefined===registeredClass.constructor_body){throw new BindingError(`${name} has no accessible constructor`)}var body=undefined;if(undefined!==registeredClass.constructor_body[args.length]){if(undefined!==registeredClass.constructor_body[args.length].func){body=registeredClass.constructor_body[args.length].func;}else {var keys=registeredClass.constructor_body[args.length].signaturesArray;var signature=getSignature(args,keys);body=registeredClass.constructor_body[args.length].signatures[signature];}}if(undefined===body){if(undefined===registeredClass.constructor_body[args.length]){throw new BindingError(`Tried to invoke ctor of ${name} with invalid number of parameters (${args.length}) - expected (${Object.keys(registeredClass.constructor_body).toString()}) parameters instead!`)}else {var signatures=registeredClass.constructor_body[args.length].signaturesArray.map(sig=>"("+sig.map(s=>typeof s==="string"?s:registeredTypes[s].name)+")");var params=args.map(arg=>typeof arg==="object"&&arg.constructor&&arg.constructor.name?arg.constructor.name:typeof arg);throw new BindingError(`Tried to invoke ctor of ${name} with invalid signature (${params}) - expected [${signatures}] parameters instead!`)}}return body.apply(this,args)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);if(registeredClass.baseClass){registeredClass.baseClass.__derivedClasses??=[];registeredClass.baseClass.__derivedClasses.push(registeredClass);}var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return [referenceConverter,pointerConverter,constPointerConverter]});};var heap32VectorToArray=(count,firstElement)=>{var array=[];for(var i=0;i<count;i++){array.push(HEAPU32[firstElement+i*4>>2]);}return array};var runDestructors=destructors=>{while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr);}};function usesDestructorStack(argTypes){for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){return true}}return false}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc,isAsync){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!");}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=usesDestructorStack(argTypes);var returns=!argTypes[0].isVoid;var expectedArgCount=argCount-2;var argsWired=new Array(expectedArgCount);var invokerFuncArgs=[];var destructors=[];var invokerFn=function(...args){destructors.length=0;var thisWired;invokerFuncArgs.length=isClassMethodFunc?2:1;invokerFuncArgs[0]=cppTargetFunc;if(isClassMethodFunc){thisWired=argTypes[1].toWireType(destructors,this);invokerFuncArgs[1]=thisWired;}for(var i=0;i<expectedArgCount;++i){argsWired[i]=argTypes[i+2].toWireType(destructors,args[i]);invokerFuncArgs.push(argsWired[i]);}var rv=cppInvokerFunc(...invokerFuncArgs);function onDone(rv){if(needsDestructorStack){runDestructors(destructors);}else {for(var i=isClassMethodFunc?1:2;i<argTypes.length;i++){var param=i===1?thisWired:argsWired[i-2];if(argTypes[i].destructorFunction!==null){argTypes[i].destructorFunction(param);}}}if(returns){return argTypes[0].fromWireType(rv)}}return onDone(rv)};return createNamedFunction(humanName,invokerFn)}var cppTypeToJsType=typeId=>{var type=registeredTypes[typeId];if(type.name==="std::string"||type.name==="std::wstring")return "string";else if(type.name==="bool")return "boolean";else if(["char","signed char","unsigned char","short","unsigned short","int","unsigned int","long","unsigned long","float","double","int64_t","uint64_t"].includes(type.name))return "number";return typeId};var __embind_register_class_constructor=(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor)=>{var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],classType=>{classType=classType[0];var humanName=`constructor ${classType.name}`;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[];}var rawSignatureArray=rawArgTypes.slice(1);var rawSignatureString=rawSignatureArray.join(", ");if(undefined!==classType.registeredClass.constructor_body[argCount-1]&&undefined!==classType.registeredClass.constructor_body[argCount-1].signatures[rawSignatureString]){throw new BindingError(`Cannot register multiple constructors with identical javascript types of parameters for class '${classType.name}'!`)}function unboundTypesHandler(){throwUnboundTypeError(`Cannot construct ${classType.name} due to unbound types`,rawArgTypes);}if(undefined===classType.registeredClass.constructor_body[argCount-1]){classType.registeredClass.constructor_body[argCount-1]={func:unboundTypesHandler,signatures:{},signaturesArray:[]};}else {delete classType.registeredClass.constructor_body[argCount-1].func;}classType.registeredClass.constructor_body[argCount-1].signatures[rawSignatureString]=unboundTypesHandler;whenDependentTypesAreResolved([],rawArgTypes,argTypes=>{argTypes.splice(1,0,null);delete classType.registeredClass.constructor_body[argCount-1].signatures[rawSignatureString];var func=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);var signatureArray=rawSignatureArray.map(a=>cppTypeToJsType(a));var signatureString=signatureArray.join(", ");if(undefined!==classType.registeredClass.constructor_body[argCount-1].func){classType.registeredClass.constructor_body[argCount-1].func=func;}classType.registeredClass.constructor_body[argCount-1].signatures[signatureString]=func;classType.registeredClass.constructor_body[argCount-1].signaturesArray.push(signatureArray);return []});return []});};var getFunctionName=signature=>{signature=signature.trim();const argsIndex=signature.indexOf("(");if(argsIndex===-1)return signature;return signature.slice(0,argsIndex)};var __embind_register_class_function=(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual,isAsync,isNonnullReturn)=>{var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=AsciiToString(methodName);methodName=getFunctionName(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker,isAsync);whenDependentTypesAreResolved([],[rawClassType],classType=>{classType=classType[0];var humanName=`${classType.name}.${methodName}`;if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)];}if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName);}function unboundTypesHandler(){throwUnboundTypeError(`Cannot call ${humanName} due to unbound types`,rawArgTypes);}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];var rawSignatureArray=rawArgTypes.slice(2);var rawSignatureString=rawSignatureArray.join(", ");if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.signature===rawSignatureString){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.signature=rawSignatureString;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler;}else if(undefined===proto[methodName].overloadTable&&proto[methodName].argCount!==argCount-2||undefined!==proto[methodName].overloadTable&&undefined===proto[methodName].overloadTable[argCount-2]){ensureOverloadTable(proto,methodName,humanName);unboundTypesHandler.signature=rawSignatureString;proto[methodName].overloadTable[argCount-2]=unboundTypesHandler;}else {ensureOverloadSignatureTable(proto,methodName,humanName,argCount-2);proto[methodName].overloadTable[argCount-2].signatures[rawSignatureString]=unboundTypesHandler;}whenDependentTypesAreResolved([],rawArgTypes,argTypes=>{var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context);var signatureArray=rawSignatureArray.map(a=>cppTypeToJsType(a));var signatureString=signatureArray.join(", ");if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;memberFunction.signature=signatureString;proto[methodName]=memberFunction;}else if(undefined===proto[methodName].overloadTable[argCount-2].signatures){memberFunction.signature=signatureString;proto[methodName].overloadTable[argCount-2]=memberFunction;}else {delete proto[methodName].overloadTable[argCount-2].signatures[rawSignatureString];proto[methodName].overloadTable[argCount-2].signatures[signatureString]=memberFunction;proto[methodName].overloadTable[argCount-2].signaturesArray.push(signatureArray);}return []});return []});};var emval_freelist=[];var emval_handles=[0,1,,1,null,1,true,1,false,1];var emval_exception_decrefs=[];var __emval_decref=handle=>{if(handle>9&&0===--emval_handles[handle+1]){var value=emval_handles[handle];emval_handles[handle]=undefined;var destructor=emval_exception_decrefs[handle];if(destructor){emval_exception_decrefs[handle]=undefined;destructor(value);}emval_freelist.push(handle);}};var Emval={toValue:handle=>{if(!handle){throwBindingError(`Cannot use deleted val. handle = ${handle}`);}return emval_handles[handle]},toHandle:value=>{switch(value){case undefined:return 2;case null:return 4;case true:return 6;case false:return 8;default:{const handle=emval_freelist.pop()||emval_handles.length;emval_handles[handle]=value;emval_handles[handle+1]=1;return handle}}}};var EmValType={name:"emscripten::val",fromWireType:handle=>{var rv=Emval.toValue(handle);__emval_decref(handle);return rv},toWireType:(destructors,value)=>Emval.toHandle(value),readValueFromPointer:readPointer,destructorFunction:null};var __embind_register_emval=rawType=>registerType(rawType,EmValType);var floatReadValueFromPointer=(name,width)=>{switch(width){case 4:return function(pointer){return this.fromWireType(HEAPF32[pointer>>2])};case 8:return function(pointer){return this.fromWireType(HEAPF64[pointer>>3])};default:throw new TypeError(`invalid float width (${width}): ${name}`)}};var __embind_register_float=(rawType,name,size)=>{name=AsciiToString(name);registerType(rawType,{name,fromWireType:value=>value,toWireType:(destructors,value)=>value,readValueFromPointer:floatReadValueFromPointer(name,size),destructorFunction:null});};var __embind_register_function=(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn,isAsync,isNonnullReturn)=>{var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=AsciiToString(name);name=getFunctionName(name);rawInvoker=embind__requireFunction(signature,rawInvoker,isAsync);var rawSignatureArray=argTypes.slice(1);var rawSignatureString=rawSignatureArray.join(", ");exposePublicSymbol(name,function(){throwUnboundTypeError(`Cannot call ${name} due to unbound types`,argTypes);},argCount-1,rawSignatureString);whenDependentTypesAreResolved([],argTypes,argTypes=>{var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));var signatureArray=rawSignatureArray.map(a=>cppTypeToJsType(a));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1,signatureArray,rawSignatureString);return []});};var __embind_register_integer=(primitiveType,name,size,minRange,maxRange)=>{name=AsciiToString(name);const isUnsignedType=minRange===0;let fromWireType=value=>value;if(isUnsignedType){var bitshift=32-8*size;fromWireType=value=>value<<bitshift>>>bitshift;maxRange=fromWireType(maxRange);}registerType(primitiveType,{name,fromWireType,toWireType:(destructors,value)=>value,readValueFromPointer:integerReadValueFromPointer(name,size,minRange!==0),destructorFunction:null});};var installIndexedIterator=(proto,sizeMethodName,getMethodName)=>{const makeIterator=(size,getValue)=>{let index=0;return {next(){if(index>=size){return {done:true}}const current=index;index++;const value=getValue(current);return {value,done:false}},[Symbol.iterator](){return this}}};if(!proto[Symbol.iterator]){proto[Symbol.iterator]=function(){const size=this[sizeMethodName]();return makeIterator(size,i=>this[getMethodName](i))};}};var __embind_register_iterable=(rawClassType,rawElementType,sizeMethodName,getMethodName)=>{sizeMethodName=AsciiToString(sizeMethodName);getMethodName=AsciiToString(getMethodName);whenDependentTypesAreResolved([],[rawClassType,rawElementType],types=>{const classType=types[0];installIndexedIterator(classType.registeredClass.instancePrototype,sizeMethodName,getMethodName);return []});};var __embind_register_memory_view=(rawType,dataTypeIndex,name)=>{var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){var size=HEAPU32[handle>>2];var data=HEAPU32[handle+4>>2];return new TA(HEAP8.buffer,data,size)}name=AsciiToString(name);registerType(rawType,{name,fromWireType:decodeMemoryView,readValueFromPointer:decodeMemoryView},{ignoreDuplicateRegistrations:true});};var EmValOptionalType=Object.assign({optional:true},EmValType);var __embind_register_optional=(rawOptionalType,rawType)=>{registerType(rawOptionalType,EmValOptionalType);};var __embind_register_smart_ptr=(rawType,rawPointeeType,name,sharingPolicy,getPointeeSignature,rawGetPointee,constructorSignature,rawConstructor,shareSignature,rawShare,destructorSignature,rawDestructor)=>{name=AsciiToString(name);rawGetPointee=embind__requireFunction(getPointeeSignature,rawGetPointee);rawConstructor=embind__requireFunction(constructorSignature,rawConstructor);rawShare=embind__requireFunction(shareSignature,rawShare);rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);whenDependentTypesAreResolved([rawType],[rawPointeeType],pointeeType=>{pointeeType=pointeeType[0];var registeredPointer=new RegisteredPointer(name,pointeeType.registeredClass,false,false,true,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor);return [registeredPointer]});};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.codePointAt(i);if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u;}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63;}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;}else {if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63;i++;}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++;}else if(c<=2047){len+=2;}else if(c>=55296&&c<=57343){len+=4;++i;}else {len+=3;}}return len};var UTF8Decoder=globalThis.TextDecoder&&new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2;}else {u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63;}if(u0<65536){str+=String.fromCharCode(u0);}else {var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023);}}return str};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):"";var __embind_register_std_string=(rawType,name)=>{name=AsciiToString(name);registerType(rawType,{name,fromWireType(value){var length=HEAPU32[value>>2];var payload=value+4;var str;{str=UTF8ToString(payload,length,true);}_free(value);return str},toWireType(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value);}var length;var valueIsOfTypeString=typeof value=="string";if(!(valueIsOfTypeString||ArrayBuffer.isView(value)&&value.BYTES_PER_ELEMENT==1)){throwBindingError("Cannot pass non-string to std::string");}if(valueIsOfTypeString){length=lengthBytesUTF8(value);}else {length=value.length;}var base=_malloc(4+length+1);var ptr=base+4;HEAPU32[base>>2]=length;if(valueIsOfTypeString){{stringToUTF8(value,ptr,length+1);}}else {HEAPU8.set(value,ptr);}if(destructors!==null){destructors.push(_free,base);}return base},readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr);}});};var UTF16Decoder=globalThis.TextDecoder?new TextDecoder("utf-16le"):undefined;var UTF16ToString=(ptr,maxBytesToRead,ignoreNul)=>{var idx=ptr>>1;var endIdx=findStringEnd(HEAPU16,idx,maxBytesToRead/2,ignoreNul);if(endIdx-idx>16&&UTF16Decoder)return UTF16Decoder.decode(HEAPU16.subarray(idx,endIdx));var str="";for(var i=idx;i<endIdx;++i){var codeUnit=HEAPU16[i];str+=String.fromCharCode(codeUnit);}return str};var stringToUTF16=(str,outPtr,maxBytesToWrite=2147483647)=>{if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2;}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var lengthBytesUTF16=str=>str.length*2;var UTF32ToString=(ptr,maxBytesToRead,ignoreNul)=>{var str="";var startIdx=ptr>>2;for(var i=0;!(i>=maxBytesToRead/4);i++){var utf32=HEAPU32[startIdx+i];if(!utf32&&!ignoreNul)break;str+=String.fromCodePoint(utf32);}return str};var stringToUTF32=(str,outPtr,maxBytesToWrite=2147483647)=>{if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i<str.length;++i){var codePoint=str.codePointAt(i);if(codePoint>65535){i++;}HEAP32[outPtr>>2]=codePoint;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var lengthBytesUTF32=str=>{var len=0;for(var i=0;i<str.length;++i){var codePoint=str.codePointAt(i);if(codePoint>65535){i++;}len+=4;}return len};var __embind_register_std_wstring=(rawType,charSize,name)=>{name=AsciiToString(name);var decodeString,encodeString,lengthBytesUTF;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;}else {decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;}registerType(rawType,{name,fromWireType:value=>{var length=HEAPU32[value>>2];var str=decodeString(value+4,length*charSize,true);_free(value);return str},toWireType:(destructors,value)=>{if(!(typeof value=="string")){throwBindingError(`Cannot pass non-string to C++ string type ${name}`);}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length/charSize;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr);}return ptr},readValueFromPointer:readPointer,destructorFunction(ptr){_free(ptr);}});};var __embind_register_void=(rawType,name)=>{name=AsciiToString(name);registerType(rawType,{isVoid:true,name,fromWireType:()=>undefined,toWireType:(destructors,o)=>undefined});};var emval_methodCallers=[];var emval_addMethodCaller=caller=>{var id=emval_methodCallers.length;emval_methodCallers.push(caller);return id};var requireRegisteredType=(rawType,humanName)=>{var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(`${humanName} has unknown type ${getTypeName(rawType)}`);}return impl};var emval_lookupTypes=(argCount,argTypes)=>{var a=new Array(argCount);for(var i=0;i<argCount;++i){a[i]=requireRegisteredType(HEAPU32[argTypes+i*4>>2],`parameter ${i}`);}return a};var emval_returnValue=(toReturnWire,destructorsRef,handle)=>{var destructors=[];var result=toReturnWire(destructors,handle);if(destructors.length){HEAPU32[destructorsRef>>2]=Emval.toHandle(destructors);}return result};var emval_symbols={};var getStringOrSymbol=address=>{var symbol=emval_symbols[address];if(symbol===undefined){return AsciiToString(address)}return symbol};var __emval_create_invoker=(argCount,argTypesPtr,kind)=>{var GenericWireTypeSize=8;var[retType,...argTypes]=emval_lookupTypes(argCount,argTypesPtr);var toReturnWire=retType.toWireType.bind(retType);var argFromPtr=argTypes.map(type=>type.readValueFromPointer.bind(type));argCount--;var argN=new Array(argCount);var invokerFunction=(handle,methodName,destructorsRef,args)=>{var offset=0;for(var i=0;i<argCount;++i){argN[i]=argFromPtr[i](args+offset);offset+=GenericWireTypeSize;}var rv;switch(kind){case 0:rv=Emval.toValue(handle).apply(null,argN);break;case 2:rv=Reflect.construct(Emval.toValue(handle),argN);break;case 3:rv=argN[0];break;case 1:rv=Emval.toValue(handle)[getStringOrSymbol(methodName)](...argN);break}return emval_returnValue(toReturnWire,destructorsRef,rv)};var functionName=`methodCaller<(${argTypes.map(t=>t.name)}) => ${retType.name}>`;return emval_addMethodCaller(createNamedFunction(functionName,invokerFunction))};var __emval_incref=handle=>{if(handle>9){emval_handles[handle+1]+=1;}};var __emval_invoke=(caller,handle,methodName,destructorsRef,args)=>emval_methodCallers[caller](handle,methodName,destructorsRef,args);var __emval_run_destructors=handle=>{var destructors=Emval.toValue(handle);runDestructors(destructors);__emval_decref(handle);};var __wasmfs_copy_preloaded_file_data=(index,buffer)=>HEAPU8.set(wasmFSPreloadedFiles[index].fileData,buffer);var wasmFSPreloadedDirs=[];var __wasmfs_get_num_preloaded_dirs=()=>wasmFSPreloadedDirs.length;var wasmFSPreloadedFiles=[];var wasmFSPreloadingFlushed=false;var __wasmfs_get_num_preloaded_files=()=>{wasmFSPreloadingFlushed=true;return wasmFSPreloadedFiles.length};var __wasmfs_get_preloaded_child_path=(index,childNameBuffer)=>{var s=wasmFSPreloadedDirs[index].childName;var len=lengthBytesUTF8(s)+1;stringToUTF8(s,childNameBuffer,len);};var __wasmfs_get_preloaded_file_mode=index=>wasmFSPreloadedFiles[index].mode;var __wasmfs_get_preloaded_file_size=index=>wasmFSPreloadedFiles[index].fileData.length;var __wasmfs_get_preloaded_parent_path=(index,parentPathBuffer)=>{var s=wasmFSPreloadedDirs[index].parentPath;var len=lengthBytesUTF8(s)+1;stringToUTF8(s,parentPathBuffer,len);};var __wasmfs_get_preloaded_path_name=(index,fileNameBuffer)=>{var s=wasmFSPreloadedFiles[index].pathName;var len=lengthBytesUTF8(s)+1;stringToUTF8(s,fileNameBuffer,len);};var __wasmfs_jsimpl_alloc_file=(backend,file)=>wasmFS$backends[backend].allocFile(file);var __wasmfs_jsimpl_free_file=(backend,file)=>wasmFS$backends[backend].freeFile(file);var __wasmfs_jsimpl_get_size=(backend,file)=>wasmFS$backends[backend].getSize(file);var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>num<INT53_MIN||num>INT53_MAX?NaN:Number(num);function __wasmfs_jsimpl_read(backend,file,buffer,length,offset){offset=bigintToI53Checked(offset);if(!wasmFS$backends[backend].read){return -28}return wasmFS$backends[backend].read(file,buffer,length,offset)}function __wasmfs_jsimpl_set_size(backend,file,size){size=bigintToI53Checked(size);return wasmFS$backends[backend].setSize(file,size)}function __wasmfs_jsimpl_write(backend,file,buffer,length,offset){offset=bigintToI53Checked(offset);if(!wasmFS$backends[backend].write){return -28}return wasmFS$backends[backend].write(file,buffer,length,offset)}class HandleAllocator{allocated=[undefined];freelist=[];get(id){return this.allocated[id]}has(id){return this.allocated[id]!==undefined}allocate(handle){var id=this.freelist.pop()??this.allocated.length;this.allocated[id]=handle;return id}free(id){this.allocated[id]=undefined;this.freelist.push(id);}}var wasmfsOPFSAccessHandles=new HandleAllocator;var __wasmfs_opfs_close_access=async(ctx,accessID,errPtr)=>{let accessHandle=wasmfsOPFSAccessHandles.get(accessID);try{await accessHandle.close();}catch{let err=-29;HEAP32[errPtr>>2]=err;}wasmfsOPFSAccessHandles.free(accessID);};var wasmfsOPFSBlobs=new HandleAllocator;var __wasmfs_opfs_close_blob=blobID=>{wasmfsOPFSBlobs.free(blobID);};var __wasmfs_opfs_flush_access=async(ctx,accessID,errPtr)=>{let accessHandle=wasmfsOPFSAccessHandles.get(accessID);try{await accessHandle.flush();}catch{let err=-29;HEAP32[errPtr>>2]=err;}};var wasmfsOPFSDirectoryHandles=new HandleAllocator;var __wasmfs_opfs_free_directory=dirID=>{wasmfsOPFSDirectoryHandles.free(dirID);};var wasmfsOPFSFileHandles=new HandleAllocator;var __wasmfs_opfs_free_file=fileID=>{wasmfsOPFSFileHandles.free(fileID);};var wasmfsOPFSGetOrCreateFile=async(parent,name,create)=>{let parentHandle=wasmfsOPFSDirectoryHandles.get(parent);let fileHandle;try{fileHandle=await parentHandle.getFileHandle(name,{create});}catch(e){if(e.name==="NotFoundError"){return -20}if(e.name==="TypeMismatchError"){return -31}return -29}return wasmfsOPFSFileHandles.allocate(fileHandle)};var wasmfsOPFSGetOrCreateDir=async(parent,name,create)=>{let parentHandle=wasmfsOPFSDirectoryHandles.get(parent);let childHandle;try{childHandle=await parentHandle.getDirectoryHandle(name,{create});}catch(e){if(e.name==="NotFoundError"){return -20}if(e.name==="TypeMismatchError"){return -54}return -29}return wasmfsOPFSDirectoryHandles.allocate(childHandle)};var __wasmfs_opfs_get_child=async(ctx,parent,namePtr,childTypePtr,childIDPtr)=>{let name=UTF8ToString(namePtr);let childType=1;let childID=await wasmfsOPFSGetOrCreateFile(parent,name,false);if(childID==-31){childType=2;childID=await wasmfsOPFSGetOrCreateDir(parent,name,false);}HEAP32[childTypePtr>>2]=childType;HEAP32[childIDPtr>>2]=childID;};var stackSave=()=>_emscripten_stack_get_current();var stackRestore=val=>__emscripten_stack_restore(val);var __wasmfs_opfs_get_entries=async(ctx,dirID,entriesPtr,errPtr)=>{let dirHandle=wasmfsOPFSDirectoryHandles.get(dirID);try{let iter=dirHandle.entries();for(let entry;entry=await iter.next(),!entry.done;){let[name,child]=entry.value;let sp=stackSave();let namePtr=stringToUTF8OnStack(name);let type=child.kind=="file"?1:2;__wasmfs_opfs_record_entry(entriesPtr,namePtr,type);stackRestore(sp);}}catch{let err=-29;HEAP32[errPtr>>2]=err;}};var __wasmfs_opfs_get_size_access=async(ctx,accessID,sizePtr)=>{let accessHandle=wasmfsOPFSAccessHandles.get(accessID);let size;try{size=await accessHandle.getSize();}catch{size=-29;}HEAP64[sizePtr>>3]=BigInt(size);};var __wasmfs_opfs_get_size_blob=function(blobID){var ret=(()=>wasmfsOPFSBlobs.get(blobID).size)();return BigInt(ret)};var __wasmfs_opfs_get_size_file=async(ctx,fileID,sizePtr)=>{let fileHandle=wasmfsOPFSFileHandles.get(fileID);let size;try{size=(await fileHandle.getFile()).size;}catch{size=-29;}HEAP64[sizePtr>>3]=BigInt(size);};var __wasmfs_opfs_init_root_directory=async ctx=>{if(wasmfsOPFSDirectoryHandles.allocated.length==1){let root=await navigator.storage.getDirectory();wasmfsOPFSDirectoryHandles.allocated.push(root);}};var __wasmfs_opfs_insert_directory=async(ctx,parent,namePtr,childIDPtr)=>{let name=UTF8ToString(namePtr);let childID=await wasmfsOPFSGetOrCreateDir(parent,name,true);HEAP32[childIDPtr>>2]=childID;};var __wasmfs_opfs_insert_file=async(ctx,parent,namePtr,childIDPtr)=>{let name=UTF8ToString(namePtr);let childID=await wasmfsOPFSGetOrCreateFile(parent,name,true);HEAP32[childIDPtr>>2]=childID;};var __wasmfs_opfs_move_file=async(ctx,fileID,newParentID,namePtr,errPtr)=>{let name=UTF8ToString(namePtr);let fileHandle=wasmfsOPFSFileHandles.get(fileID);let newDirHandle=wasmfsOPFSDirectoryHandles.get(newParentID);try{await fileHandle.move(newDirHandle,name);}catch{let err=-29;HEAP32[errPtr>>2]=err;}};class FileSystemAsyncAccessHandle{constructor(handle){this.handle=handle;}async close(){}async flush(){}async getSize(){let file=await this.handle.getFile();return file.size}async read(buffer,options={at:0}){let file=await this.handle.getFile();let slice=await file.slice(options.at,options.at+buffer.length);let fileBuffer=await slice.arrayBuffer();let array=new Uint8Array(fileBuffer);buffer.set(array);return array.length}async write(buffer,options={at:0}){let writable=await this.handle.createWritable({keepExistingData:true});await writable.write({type:"write",position:options.at,data:buffer});await writable.close();return buffer.length}async truncate(size){let writable=await this.handle.createWritable({keepExistingData:true});await writable.truncate(size);await writable.close();}}var wasmfsOPFSCreateAsyncAccessHandle=fileHandle=>new FileSystemAsyncAccessHandle(fileHandle);var __wasmfs_opfs_open_access=async(ctx,fileID,accessIDPtr)=>{let fileHandle=wasmfsOPFSFileHandles.get(fileID);let accessID;try{let accessHandle;accessHandle=await wasmfsOPFSCreateAsyncAccessHandle(fileHandle);accessID=wasmfsOPFSAccessHandles.allocate(accessHandle);}catch(e){if(e.name==="InvalidStateError"||e.name==="NoModificationAllowedError"){accessID=-2;}else {accessID=-29;}}HEAP32[accessIDPtr>>2]=accessID;};var __wasmfs_opfs_open_blob=async(ctx,fileID,blobIDPtr)=>{let fileHandle=wasmfsOPFSFileHandles.get(fileID);let blobID;try{let blob=await fileHandle.getFile();blobID=wasmfsOPFSBlobs.allocate(blob);}catch(e){if(e.name==="NotAllowedError"){blobID=-2;}else {blobID=-29;}}HEAP32[blobIDPtr>>2]=blobID;};async function __wasmfs_opfs_read_access(accessID,bufPtr,len,pos){pos=bigintToI53Checked(pos);let accessHandle=wasmfsOPFSAccessHandles.get(accessID);let data=HEAPU8.subarray(bufPtr,bufPtr+len);try{return await accessHandle.read(data,{at:pos})}catch(e){if(e.name=="TypeError"){return -28}return -29}}async function __wasmfs_opfs_read_blob(ctx,blobID,bufPtr,len,pos,nreadPtr){pos=bigintToI53Checked(pos);let blob=wasmfsOPFSBlobs.get(blobID);let slice=blob.slice(pos,pos+len);let nread=0;try{let buf=await slice.arrayBuffer();let data=new Uint8Array(buf);HEAPU8.set(data,bufPtr);nread+=data.length;}catch(e){if(e instanceof RangeError){nread=-21;}else {nread=-29;}}HEAP32[nreadPtr>>2]=nread;}var __wasmfs_opfs_remove_child=async(ctx,dirID,namePtr,errPtr)=>{let name=UTF8ToString(namePtr);let dirHandle=wasmfsOPFSDirectoryHandles.get(dirID);try{await dirHandle.removeEntry(name);}catch{let err=-29;HEAP32[errPtr>>2]=err;}};async function __wasmfs_opfs_set_size_access(ctx,accessID,size,errPtr){size=bigintToI53Checked(size);let accessHandle=wasmfsOPFSAccessHandles.get(accessID);try{await accessHandle.truncate(size);}catch{let err=-29;HEAP32[errPtr>>2]=err;}}async function __wasmfs_opfs_set_size_file(ctx,fileID,size,errPtr){size=bigintToI53Checked(size);let fileHandle=wasmfsOPFSFileHandles.get(fileID);try{let writable=await fileHandle.createWritable({keepExistingData:true});await writable.truncate(size);await writable.close();}catch{let err=-29;HEAP32[errPtr>>2]=err;}}async function __wasmfs_opfs_write_access(accessID,bufPtr,len,pos){pos=bigintToI53Checked(pos);let accessHandle=wasmfsOPFSAccessHandles.get(accessID);let data=HEAPU8.subarray(bufPtr,bufPtr+len);try{return await accessHandle.write(data,{at:pos})}catch(e){if(e.name=="TypeError"){return -28}return -29}}var FS_stdin_getChar_buffer=[];var intArrayFromString=(stringy,dontAddNull,length)=>{var len=lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(globalThis.window?.prompt){result=window.prompt("Input: ");if(result!==null){result+="\n";}}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result);}return FS_stdin_getChar_buffer.shift()};var __wasmfs_stdin_get_char=()=>{var c=FS_stdin_getChar();if(typeof c==="number"){return c}return -1};var _emscripten_date_now=()=>Date.now();var _emscripten_err=str=>err(UTF8ToString(str));var _emscripten_out=str=>out(UTF8ToString(str));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 initRandomFill=()=>view=>(crypto.getRandomValues(view),0);var randomFill=view=>(randomFill=initRandomFill())(view);var _random_get=(buffer,size)=>randomFill(HEAPU8.subarray(buffer,buffer+size));var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1);}else if(last===".."){parts.splice(i,1);up++;}else if(up){parts.splice(i,1);up--;}}if(allowAboveRoot){for(;up;up--){parts.unshift("..");}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path=".";}if(path&&trailingSlash){path+="/";}return (isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return "."}if(dir){dir=dir.slice(0,-1);}return root+dir},basename:path=>path&&path.match(/([^\/]+|\/)\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};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 withStackSave=f=>{var stack=stackSave();var ret=f();stackRestore(stack);return ret};var readI53FromI64=ptr=>HEAPU32[ptr>>2]+HEAP32[ptr+4>>2]*4294967296;var readI53FromU64=ptr=>HEAPU32[ptr>>2]+HEAPU32[ptr+4>>2]*4294967296;var FS_mknod=(path,mode,dev)=>FS.handleError(withStackSave(()=>{var pathBuffer=stringToUTF8OnStack(path);return __wasmfs_mknod(pathBuffer,mode,dev)}));var FS_create=(path,mode=438)=>{mode&=4095;mode|=32768;return FS_mknod(path,mode,0)};var FS_fileDataToTypedArray=data=>{if(typeof data=="string"){data=intArrayFromString(data);}if(!data.subarray){data=new Uint8Array(data);}return data};var FS_writeFile=(path,data)=>{var sp=stackSave();var pathBuffer=stringToUTF8OnStack(path);data=FS_fileDataToTypedArray(data);var len=data.length;var dataBuffer=_malloc(len);HEAPU8.set(data,dataBuffer);var ret=__wasmfs_write_file(pathBuffer,dataBuffer,len);_free(dataBuffer);stackRestore(sp);return ret};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{var pathName=name?parent+"/"+name:parent;var mode=FS_getMode(canRead,canWrite);if(!wasmFSPreloadingFlushed){wasmFSPreloadedFiles.push({pathName,fileData,mode});}else {FS_create(pathName,mode);FS_writeFile(pathName,fileData);}};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return ""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path);}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return (resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return [];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..");}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")}};var dependenciesPromise=null;var resolveRunDependencies=async()=>dependenciesPromise;var runDependencies=0;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(!runDependencies){dependenciesPromise.resolve();}};var addRunDependency=id=>{if(!runDependencies){var resolve;dependenciesPromise=new Promise(r=>resolve=r);dependenciesPromise.resolve=resolve;}runDependencies++;Module["monitorRunDependencies"]?.(runDependencies);};var preloadPlugins=[];var FS_handledByPreloadPlugin=async(byteArray,fullname)=>{if(typeof Browser!="undefined")Browser.init();for(var plugin of preloadPlugins){if(plugin["canHandle"](fullname)){return plugin["handle"](byteArray,fullname)}}return byteArray};var FS_preloadFile=async(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;addRunDependency();try{var byteArray=url;if(typeof url=="string"){byteArray=await asyncLoad(url);}byteArray=await FS_handledByPreloadPlugin(byteArray,fullname);preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn);}}finally{removeRunDependency();}};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{FS_preloadFile(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish).then(onload).catch(onerror);};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS_modeStringToFlags=str=>{if(typeof str!="string")return str;var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_mkdir=(path,mode=511)=>FS.handleError(withStackSave(()=>{var buffer=stringToUTF8OnStack(path);return __wasmfs_mkdir(buffer,mode)}));var FS_mkdirTree=(path,mode)=>{var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS_mkdir(d,mode);}catch(e){if(e.errno!=20)throw e}}};var FS_unlink=path=>withStackSave(()=>{var buffer=stringToUTF8OnStack(path);return __wasmfs_unlink(buffer)});var wasmFS$backends={};var wasmFSDevices={};var wasmFSDeviceStreams={};var FS={ErrnoError:class extends Error{name="ErrnoError";message="FS error";constructor(code){super();this.errno=code;}},handleError(returnValue){if(returnValue<0){throw new FS.ErrnoError(-returnValue)}return returnValue},createDataFile(parent,name,fileData,canRead,canWrite,canOwn){FS_createDataFile(parent,name,fileData,canRead,canWrite);},createPath(parent,path,canRead,canWrite){var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);if(!wasmFSPreloadingFlushed){wasmFSPreloadedDirs.push({parentPath:parent,childName:part});}else {try{FS.mkdir(current);}catch(e){if(e.errno!=20)throw e}}parent=current;}return current},createPreloadedFile(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){return FS_createPreloadedFile(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)},async preloadFile(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish){return FS_preloadFile(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish)},readFile(path,opts={}){opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var buf,length;withStackSave(()=>{var bufPtr=stackAlloc(4);var sizePtr=stackAlloc(4);FS.handleError(-__wasmfs_read_file(stringToUTF8OnStack(path),bufPtr,sizePtr));buf=HEAPU32[bufPtr>>2];length=readI53FromI64(sizePtr);});return opts.encoding==="utf8"?UTF8ToString(buf,length):HEAPU8.slice(buf,buf+length)},cwd:()=>UTF8ToString(__wasmfs_get_cwd()),analyzePath(path){var exists=!!FS.findObject(path);return {exists,object:{contents:exists?FS.readFile(path):null}}},mkdir:(path,mode)=>FS_mkdir(path,mode),mkdirTree:(path,mode)=>FS_mkdirTree(path,mode),rmdir:path=>FS.handleError(withStackSave(()=>__wasmfs_rmdir(stringToUTF8OnStack(path)))),open:(path,flags,mode=438)=>withStackSave(()=>{flags=FS_modeStringToFlags(flags);var buffer=stringToUTF8OnStack(path);var fd=FS.handleError(__wasmfs_open(buffer,flags,mode));return {fd}}),create:(path,mode)=>FS_create(path,mode),close:stream=>FS.handleError(-__wasmfs_close(stream.fd)),unlink:path=>FS_unlink(path),chdir:path=>withStackSave(()=>__wasmfs_chdir(stringToUTF8OnStack(path))),read(stream,buffer,offset,length,position){var seeking=typeof position!="undefined";var dataBuffer=_malloc(length);var bytesRead;if(seeking){bytesRead=__wasmfs_pread(stream.fd,dataBuffer,length,BigInt(position));}else {bytesRead=__wasmfs_read(stream.fd,dataBuffer,length);}if(bytesRead>0){buffer.set(HEAPU8.subarray(dataBuffer,dataBuffer+bytesRead),offset);}_free(dataBuffer);return FS.handleError(bytesRead)},write(stream,buffer,offset,length,position,canOwn){var seeking=typeof position!="undefined";var dataBuffer=_malloc(length);for(var i=0;i<length;i++){HEAP8[dataBuffer+i]=buffer[offset+i];}var bytesRead;if(seeking){bytesRead=__wasmfs_pwrite(stream.fd,dataBuffer,length,BigInt(position));}else {bytesRead=__wasmfs_write(stream.fd,dataBuffer,length);}_free(dataBuffer);return FS.handleError(bytesRead)},writeFile:(path,data)=>FS_writeFile(path,data),mmap:(stream,length,offset,prot,flags)=>{var buf=FS.handleError(__wasmfs_mmap(length,prot,flags,stream.fd,BigInt(offset)));return {ptr:buf,allocated:true}},msync:(stream,bufferPtr,offset,length,mmapFlags)=>FS.handleError(__wasmfs_msync(bufferPtr,length,mmapFlags)),munmap:(addr,length)=>FS.handleError(__wasmfs_munmap(addr,length)),symlink:(target,linkpath)=>withStackSave(()=>__wasmfs_symlink(stringToUTF8OnStack(target),stringToUTF8OnStack(linkpath))),readlink(path){return withStackSave(()=>{var bufPtr=stackAlloc(4);FS.handleError(__wasmfs_readlink(stringToUTF8OnStack(path),bufPtr));var readBuffer=HEAPU32[bufPtr>>2];return UTF8ToString(readBuffer)})},statBufToObject(statBuf){return {dev:HEAPU32[statBuf>>2],mode:HEAPU32[statBuf+4>>2],nlink:HEAPU32[statBuf+8>>2],uid:HEAPU32[statBuf+12>>2],gid:HEAPU32[statBuf+16>>2],rdev:HEAPU32[statBuf+20>>2],size:readI53FromI64(statBuf+24),blksize:HEAP32[statBuf+32>>2],blocks:HEAP32[statBuf+36>>2],atime:readI53FromI64(statBuf+40),mtime:readI53FromI64(statBuf+56),ctime:readI53FromI64(statBuf+72),ino:readI53FromU64(statBuf+88)}},stat(path){return withStackSave(()=>{var statBuf=stackAlloc(96);FS.handleError(__wasmfs_stat(stringToUTF8OnStack(path),statBuf));return FS.statBufToObject(statBuf)})},lstat(path){return withStackSave(()=>{var statBuf=stackAlloc(96);FS.handleError(__wasmfs_lstat(stringToUTF8OnStack(path),statBuf));return FS.statBufToObject(statBuf)})},chmod(path,mode){return FS.handleError(withStackSave(()=>{var buffer=stringToUTF8OnStack(path);return __wasmfs_chmod(buffer,mode)}))},lchmod(path,mode){return FS.handleError(withStackSave(()=>{var buffer=stringToUTF8OnStack(path);return __wasmfs_lchmod(buffer,mode)}))},fchmod(fd,mode){return FS.handleError(__wasmfs_fchmod(fd,mode))},utime:(path,atime,mtime)=>FS.handleError(withStackSave(()=>__wasmfs_utime(stringToUTF8OnStack(path),atime,mtime))),truncate(path,len){return FS.handleError(withStackSave(()=>__wasmfs_truncate(stringToUTF8OnStack(path),BigInt(len))))},ftruncate(fd,len){return FS.handleError(__wasmfs_ftruncate(fd,BigInt(len)))},findObject(path){var result=withStackSave(()=>__wasmfs_identify(stringToUTF8OnStack(path)));if(result==44){return null}return {isFolder:result==31,isDevice:false}},readdir:path=>withStackSave(()=>{var pathBuffer=stringToUTF8OnStack(path);var entries=[];var state=__wasmfs_readdir_start(pathBuffer);if(!state){throw new Error("No such directory")}var entry;while(entry=__wasmfs_readdir_get(state)){entries.push(UTF8ToString(entry));}__wasmfs_readdir_finish(state);return entries}),mount:(type,opts,mountpoint)=>{var backendPointer=type.createBackend(opts);return FS.handleError(withStackSave(()=>__wasmfs_mount(stringToUTF8OnStack(mountpoint),backendPointer)))},unmount:mountpoint=>FS.handleError(withStackSave(()=>_wasmfs_unmount(stringToUTF8OnStack(mountpoint)))),mknod:(path,mode,dev)=>FS_mknod(path,mode,dev),makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){var backendPointer=_wasmfs_create_jsimpl_backend();var definedOps={userRead:ops.read,userWrite:ops.write,allocFile:file=>{wasmFSDeviceStreams[file]={};},freeFile:file=>{wasmFSDeviceStreams[file]=undefined;},getSize:file=>{},setSize:(file,size)=>0,read:(file,buffer,length,offset)=>{var bufferArray=HEAP8.subarray(buffer,buffer+length);try{var bytesRead=definedOps.userRead(wasmFSDeviceStreams[file],bufferArray,0,length,offset);}catch(e){return -e.errno}HEAP8.set(bufferArray,buffer);return bytesRead},write:(file,buffer,length,offset)=>{var bufferArray=HEAP8.subarray(buffer,buffer+length);try{var bytesWritten=definedOps.userWrite(wasmFSDeviceStreams[file],bufferArray,0,length,offset);}catch(e){return -e.errno}HEAP8.set(bufferArray,buffer);return bytesWritten}};wasmFS$backends[backendPointer]=definedOps;wasmFSDevices[dev]=backendPointer;},createDevice(parent,name,input,output){if(typeof parent!="string"){throw new Error("Only string paths are accepted")}var path=PATH.join2(parent,name);var mode=FS_getMode(!!input,!!output);FS.createDevice.major??=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{read(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input();}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result;}return bytesRead},write(stream,buffer,offset,length,pos){for(var i=0;i<length;i++){try{output(buffer[offset+i]);}catch(e){throw new FS.ErrnoError(29)}}return i}});return FS.mkdev(path,mode,dev)},mkdev(path,mode,dev){if(typeof dev==="undefined"){dev=mode;mode=438;}var deviceBackend=wasmFSDevices[dev];if(!deviceBackend){throw new Error("Invalid device ID.")}return FS.handleError(withStackSave(()=>_wasmfs_create_file(stringToUTF8OnStack(path),mode,deviceBackend)))},rename(oldPath,newPath){return FS.handleError(withStackSave(()=>{var oldPathBuffer=stringToUTF8OnStack(oldPath);var newPathBuffer=stringToUTF8OnStack(newPath);return __wasmfs_rename(oldPathBuffer,newPathBuffer)}))},llseek(stream,offset,whence){return FS.handleError(__wasmfs_llseek(stream.fd,BigInt(offset),whence))}};var ENV={};var getCppExceptionTag=()=>___cpp_exception;var getCppExceptionThrownObjectFromWebAssemblyException=ex=>{var unwind_header=ex.getArg(getCppExceptionTag(),0);return ___thrown_object_from_unwind_exception(unwind_header)};var getExceptionMessageCommon=ptr=>{var sp=stackSave();var type_addr_addr=stackAlloc(4);var message_addr_addr=stackAlloc(4);___get_exception_message(ptr,type_addr_addr,message_addr_addr);var type_addr=HEAPU32[type_addr_addr>>2];var message_addr=HEAPU32[message_addr_addr>>2];var type=UTF8ToString(type_addr);_free(type_addr);var message;if(message_addr){message=UTF8ToString(message_addr);_free(message_addr);}stackRestore(sp);return [type,message]};var getExceptionMessage=ex=>{var ptr=getCppExceptionThrownObjectFromWebAssemblyException(ex);return getExceptionMessageCommon(ptr)};var FS_createPath=FS.createPath;init_ClassHandle();init_RegisteredPointer();{if(Module["noExitRuntime"])Module["noExitRuntime"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["arguments"])Module["arguments"];if(Module["thisProgram"])Module["thisProgram"];var preInit=Module["preInit"];if(preInit){if(typeof preInit=="function")Module["preInit"]=preInit=[preInit];while(preInit.length>0){preInit.shift()();}}}Module["ENV"]=ENV;Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["getExceptionMessage"]=getExceptionMessage;Module["FS_preloadFile"]=FS_preloadFile;Module["FS_unlink"]=FS_unlink;Module["FS_createPath"]=FS_createPath;Module["FS"]=FS;Module["FS_createDataFile"]=FS_createDataFile;var ___getTypeName,_malloc,_free,___trap,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,___thrown_object_from_unwind_exception,___get_exception_message,__wasmfs_read_file,__wasmfs_write_file,__wasmfs_mkdir,__wasmfs_rmdir,__wasmfs_open,__wasmfs_mknod,__wasmfs_unlink,__wasmfs_chdir,__wasmfs_symlink,__wasmfs_readlink,__wasmfs_write,__wasmfs_pwrite,__wasmfs_chmod,__wasmfs_fchmod,__wasmfs_lchmod,__wasmfs_llseek,__wasmfs_rename,__wasmfs_read,__wasmfs_pread,__wasmfs_truncate,__wasmfs_ftruncate,__wasmfs_close,__wasmfs_mmap,__wasmfs_msync,__wasmfs_munmap,__wasmfs_utime,__wasmfs_stat,__wasmfs_lstat,__wasmfs_mount,__wasmfs_identify,__wasmfs_readdir_start,__wasmfs_readdir_get,__wasmfs_readdir_finish,__wasmfs_get_cwd,_wasmfs_create_jsimpl_backend,__wasmfs_opfs_record_entry,_wasmfs_create_file,_wasmfs_unmount,___cpp_exception,wasmMemory,wasmTable;function assignWasmExports(wasmExports){___getTypeName=wasmExports["ma"];_malloc=wasmExports["oa"];_free=wasmExports["qa"];___trap=wasmExports["ra"];__emscripten_stack_restore=wasmExports["sa"];__emscripten_stack_alloc=wasmExports["ta"];_emscripten_stack_get_current=wasmExports["ua"];___thrown_object_from_unwind_exception=wasmExports["va"];___get_exception_message=wasmExports["wa"];__wasmfs_read_file=wasmExports["xa"];__wasmfs_write_file=wasmExports["ya"];__wasmfs_mkdir=wasmExports["za"];__wasmfs_rmdir=wasmExports["Aa"];__wasmfs_open=wasmExports["Ba"];__wasmfs_mknod=wasmExports["Ca"];__wasmfs_unlink=wasmExports["Da"];__wasmfs_chdir=wasmExports["Ea"];__wasmfs_symlink=wasmExports["Fa"];__wasmfs_readlink=wasmExports["Ga"];__wasmfs_write=wasmExports["Ha"];__wasmfs_pwrite=wasmExports["Ia"];__wasmfs_chmod=wasmExports["Ja"];__wasmfs_fchmod=wasmExports["Ka"];__wasmfs_lchmod=wasmExports["La"];__wasmfs_llseek=wasmExports["Ma"];__wasmfs_rename=wasmExports["Na"];__wasmfs_read=wasmExports["Oa"];__wasmfs_pread=wasmExports["Pa"];__wasmfs_truncate=wasmExports["Qa"];__wasmfs_ftruncate=wasmExports["Ra"];__wasmfs_close=wasmExports["Sa"];__wasmfs_mmap=wasmExports["Ta"];__wasmfs_msync=wasmExports["Ua"];__wasmfs_munmap=wasmExports["Va"];__wasmfs_utime=wasmExports["Wa"];__wasmfs_stat=wasmExports["Xa"];__wasmfs_lstat=wasmExports["Ya"];__wasmfs_mount=wasmExports["Za"];__wasmfs_identify=wasmExports["_a"];__wasmfs_readdir_start=wasmExports["$a"];__wasmfs_readdir_get=wasmExports["ab"];__wasmfs_readdir_finish=wasmExports["bb"];__wasmfs_get_cwd=wasmExports["cb"];_wasmfs_create_jsimpl_backend=wasmExports["db"];__wasmfs_opfs_record_entry=wasmExports["eb"];_wasmfs_create_file=wasmExports["fb"];_wasmfs_unmount=wasmExports["gb"];wasmMemory=wasmExports["ka"];wasmTable=wasmExports["na"];___cpp_exception=wasmExports["pa"];}var wasmImports={da:__abort_js,w:__embind_register_bigint,ia:__embind_register_bool,e:__embind_register_class,d:__embind_register_class_constructor,a:__embind_register_class_function,ga:__embind_register_emval,v:__embind_register_float,u:__embind_register_function,k:__embind_register_integer,j:__embind_register_iterable,c:__embind_register_memory_view,f:__embind_register_optional,fa:__embind_register_smart_ptr,ha:__embind_register_std_string,n:__embind_register_std_wstring,ja:__embind_register_void,i:__emval_create_invoker,l:__emval_decref,x:__emval_incref,h:__emval_invoke,g:__emval_run_destructors,J:__wasmfs_copy_preloaded_file_data,H:__wasmfs_get_num_preloaded_dirs,I:__wasmfs_get_num_preloaded_files,F:__wasmfs_get_preloaded_child_path,D:__wasmfs_get_preloaded_file_mode,K:__wasmfs_get_preloaded_file_size,G:__wasmfs_get_preloaded_parent_path,E:__wasmfs_get_preloaded_path_name,C:__wasmfs_jsimpl_alloc_file,o:__wasmfs_jsimpl_free_file,B:__wasmfs_jsimpl_get_size,A:__wasmfs_jsimpl_read,y:__wasmfs_jsimpl_set_size,z:__wasmfs_jsimpl_write,U:__wasmfs_opfs_close_access,q:__wasmfs_opfs_close_blob,O:__wasmfs_opfs_flush_access,s:__wasmfs_opfs_free_directory,p:__wasmfs_opfs_free_file,ba:__wasmfs_opfs_get_child,Z:__wasmfs_opfs_get_entries,Y:__wasmfs_opfs_get_size_access,X:__wasmfs_opfs_get_size_blob,W:__wasmfs_opfs_get_size_file,ca:__wasmfs_opfs_init_root_directory,$:__wasmfs_opfs_insert_directory,aa:__wasmfs_opfs_insert_file,t:__wasmfs_opfs_move_file,r:__wasmfs_opfs_open_access,V:__wasmfs_opfs_open_blob,S:__wasmfs_opfs_read_access,T:__wasmfs_opfs_read_blob,_:__wasmfs_opfs_remove_child,P:__wasmfs_opfs_set_size_access,Q:__wasmfs_opfs_set_size_file,R:__wasmfs_opfs_write_access,N:__wasmfs_stdin_get_char,b:_emscripten_date_now,m:_emscripten_err,M:_emscripten_out,ea:_emscripten_resize_heap,L:_random_get};async function run(){preRun();if(runDependencies){await resolveRunDependencies();}var setStatus=Module["setStatus"];if(setStatus){setStatus("Running...");await new Promise(resolve=>setTimeout(resolve,1));setTimeout(setStatus,1,"");}if(ABORT)return;initRuntime();Module["onRuntimeInitialized"]?.();postRun();}var wasmExports;wasmExports=await createWasm();await run();
|
|
20
|
+
return Module}})();{module.exports=Module2;module.exports.default=Module2;}
|
|
21
|
+
} (crossbindExampleLibPrebuiltMatrixWasmWasm32StRelease_browser));
|
|
22
|
+
return crossbindExampleLibPrebuiltMatrixWasmWasm32StRelease_browser.exports;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var crossbindExampleLibPrebuiltMatrixWasmWasm32StRelease_browserExports = requireCrossbindExampleLibPrebuiltMatrixWasmWasm32StRelease_browser();
|
|
26
|
+
var Module = /*@__PURE__*/getDefaultExportFromCjs(crossbindExampleLibPrebuiltMatrixWasmWasm32StRelease_browserExports);
|
|
27
|
+
|
|
28
|
+
var systemConfig = {
|
|
29
|
+
env: {},
|
|
30
|
+
useWorker: !!globalThis.Worker,
|
|
31
|
+
general: {
|
|
32
|
+
name: 'crossbind-example-lib-prebuilt-matrix',
|
|
33
|
+
},
|
|
34
|
+
fs: {
|
|
35
|
+
opfs: false,
|
|
36
|
+
},
|
|
37
|
+
paths: {
|
|
38
|
+
wasm: 'crossbind-example-lib-prebuilt-matrix-wasm-wasm32-st-release.browser.wasm',
|
|
39
|
+
data: 'crossbind-example-lib-prebuilt-matrix-wasm-wasm32-st-release.browser.data.txt',
|
|
40
|
+
worker: 'crossbind-example-lib-prebuilt-matrix-wasm-wasm32-st-release.browser.js',
|
|
41
|
+
js: 'crossbind-example-lib-prebuilt-matrix-wasm-wasm32-st-release.browser.js',
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// === wasm-EH exception decoding (shared by the worker and direct runtimes) ===
|
|
46
|
+
// Builds link with -fwasm-exceptions, so an uncaught C++ exception reaches JS as a raw
|
|
47
|
+
// WebAssembly.Exception with no .message. The glue exports getExceptionMessage (via
|
|
48
|
+
// -sEXPORT_EXCEPTION_HANDLING_HELPERS), which decodes it back into [type, what()]. This
|
|
49
|
+
// adapter turns such values into real JS Errors at the binding boundary; anything else
|
|
50
|
+
// passes through untouched, so it is safe to apply on every call path.
|
|
51
|
+
let decodeModule = null;
|
|
52
|
+
|
|
53
|
+
function setExceptionDecodeModule(m) {
|
|
54
|
+
decodeModule = m;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function decodeCppException(value) {
|
|
58
|
+
const m = decodeModule;
|
|
59
|
+
if (m == null
|
|
60
|
+
|| typeof m.getExceptionMessage !== 'function'
|
|
61
|
+
|| typeof WebAssembly === 'undefined'
|
|
62
|
+
|| typeof WebAssembly.Exception !== 'function'
|
|
63
|
+
|| !(value instanceof WebAssembly.Exception)) {
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const [type, message] = m.getExceptionMessage(value);
|
|
68
|
+
const error = new Error(message ? `${type}: ${message}` : `${type}`);
|
|
69
|
+
error.cppType = type;
|
|
70
|
+
error.cppMessage = message;
|
|
71
|
+
return error;
|
|
72
|
+
} catch (decodeFailure) {
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const STATIC_SKIP = new Set(['prototype', 'name', 'length', 'caller', 'arguments', 'argCount']);
|
|
78
|
+
|
|
79
|
+
function wrapOwnMethod(holder, name) {
|
|
80
|
+
const desc = Object.getOwnPropertyDescriptor(holder, name);
|
|
81
|
+
if (!desc || typeof desc.value !== 'function' || desc.writable === false) return;
|
|
82
|
+
const original = desc.value;
|
|
83
|
+
function decoded(...args) {
|
|
84
|
+
let result;
|
|
85
|
+
try {
|
|
86
|
+
result = original.apply(this, args);
|
|
87
|
+
} catch (e) {
|
|
88
|
+
throw decodeCppException(e);
|
|
89
|
+
}
|
|
90
|
+
if (result && typeof result.then === 'function') {
|
|
91
|
+
// Async (JSPI-style) binding: decode the rejection reason as well.
|
|
92
|
+
return result.then(undefined, (e) => { throw decodeCppException(e); });
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
// Overload dispatch reads properties (e.g. overloadTable) off the exposed function.
|
|
97
|
+
Object.assign(decoded, original);
|
|
98
|
+
Object.defineProperty(holder, name, { ...desc, value: decoded });
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Direct (non-worker) mode exposes embind class instances raw, so a thrown C++ exception in
|
|
102
|
+
// an instance or static method never crosses a wrapper. Patching each bound class's
|
|
103
|
+
// prototype and statics once at module-ready keeps object identity intact (embind checks
|
|
104
|
+
// prototypes, not method identity) while every call site gains the decode.
|
|
105
|
+
function patchModuleForExceptionDecode(m) {
|
|
106
|
+
setExceptionDecodeModule(m);
|
|
107
|
+
if (m == null || typeof m !== 'object') return m;
|
|
108
|
+
for (const key of Object.keys(m)) {
|
|
109
|
+
const Cls = m[key];
|
|
110
|
+
if (typeof Cls !== 'function') continue;
|
|
111
|
+
if (Cls.prototype) {
|
|
112
|
+
// Static-only classes are common (pure class_function surfaces), so statics are
|
|
113
|
+
// wrapped below regardless of whether the prototype carries any method.
|
|
114
|
+
Object.getOwnPropertyNames(Cls.prototype)
|
|
115
|
+
.filter((n) => n !== 'constructor')
|
|
116
|
+
.forEach((n) => wrapOwnMethod(Cls.prototype, n));
|
|
117
|
+
}
|
|
118
|
+
Object.getOwnPropertyNames(Cls)
|
|
119
|
+
.filter((n) => !STATIC_SKIP.has(n))
|
|
120
|
+
.forEach((n) => wrapOwnMethod(Cls, n));
|
|
121
|
+
}
|
|
122
|
+
return m;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// === Plain array -> embind vector coercion (shared by the worker and direct runtimes) ===
|
|
126
|
+
// Vectors RETURNED across the worker boundary arrive as plain arrays, so callers naturally
|
|
127
|
+
// try to pass plain arrays back as vector PARAMETERS - which embind rejects with
|
|
128
|
+
// 'Cannot pass "..." as a VectorX'. Coercion catches that error, converts the first
|
|
129
|
+
// remaining plain-array argument with Module.toVector, and retries, so mixed signatures
|
|
130
|
+
// (VectorDataset + VectorString, ...) resolve left to right, matching embind's argument
|
|
131
|
+
// order. embind passes std::vector parameters by value, so the temporaries are deleted
|
|
132
|
+
// after the call instead of leaking wasm memory.
|
|
133
|
+
//
|
|
134
|
+
// This is a REACTIVE strategy: embind does not expose parameter types to JS, so we can
|
|
135
|
+
// only learn that an argument should have been a vector from the failed call. See
|
|
136
|
+
// EXPECTED_VECTOR_RE below - the coercion silently disengages (rethrows) if embind ever
|
|
137
|
+
// changes that message, which the canary test in vectorCoercion.test.js guards against.
|
|
138
|
+
|
|
139
|
+
let coercionModule = null;
|
|
140
|
+
|
|
141
|
+
// Matches embind's "Cannot pass <value> as a VectorX" BindingError message.
|
|
142
|
+
const EXPECTED_VECTOR_RE = /as a (Vector\w+)\b/;
|
|
143
|
+
|
|
144
|
+
function setCoercionModule(m) {
|
|
145
|
+
coercionModule = m;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Proxies created by the coercion wrappers, mapped back to their raw targets. embind
|
|
149
|
+
// rejects a proxied `this` or argument (its class checks compare $$.ptrType.registeredClass
|
|
150
|
+
// by identity), so every invocation unwraps them back to the raw objects first.
|
|
151
|
+
const coercionProxies = new WeakMap();
|
|
152
|
+
|
|
153
|
+
function unwrapCoercionProxy(value) {
|
|
154
|
+
const raw = coercionProxies.get(value);
|
|
155
|
+
return raw === undefined ? value : raw;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// The retry-on-vector-error loop shared by call and construct. `invoke(args)` performs the
|
|
159
|
+
// actual apply/construct; on a 'Cannot pass ... as a VectorX' error that names a registered
|
|
160
|
+
// Vector class while a plain-array argument remains, the first remaining array is converted
|
|
161
|
+
// with Module.toVector and the invocation retried. Each retry converts exactly one array, so
|
|
162
|
+
// the array count strictly decreases and the loop always terminates.
|
|
163
|
+
function retryWithCoercion(invoke, args) {
|
|
164
|
+
const temp = [];
|
|
165
|
+
const cleanup = () => {
|
|
166
|
+
for (const v of temp) {
|
|
167
|
+
try {
|
|
168
|
+
v.delete();
|
|
169
|
+
} catch (e) { /* already deleted by the callee */ }
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
const current = args.slice();
|
|
173
|
+
for (;;) {
|
|
174
|
+
let result;
|
|
175
|
+
try {
|
|
176
|
+
result = invoke(current);
|
|
177
|
+
} catch (rawError) {
|
|
178
|
+
const e = decodeCppException(rawError);
|
|
179
|
+
const match = EXPECTED_VECTOR_RE.exec(String((e && e.message) || e));
|
|
180
|
+
const VectorClass = match && coercionModule ? coercionModule[match[1]] : undefined;
|
|
181
|
+
const index = current.findIndex((a) => Array.isArray(a));
|
|
182
|
+
if (typeof VectorClass !== 'function' || index < 0) {
|
|
183
|
+
cleanup();
|
|
184
|
+
throw e;
|
|
185
|
+
}
|
|
186
|
+
let vector;
|
|
187
|
+
try {
|
|
188
|
+
vector = coercionModule.toVector(VectorClass, current[index]);
|
|
189
|
+
} catch (convError) {
|
|
190
|
+
cleanup();
|
|
191
|
+
throw e;
|
|
192
|
+
}
|
|
193
|
+
temp.push(vector);
|
|
194
|
+
current[index] = vector;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (temp.length && result && typeof result.then === 'function') {
|
|
198
|
+
// Async (JSPI-style) binding: arguments were already converted synchronously,
|
|
199
|
+
// but hold the temporaries until it settles.
|
|
200
|
+
return result.then(
|
|
201
|
+
(value) => {
|
|
202
|
+
cleanup();
|
|
203
|
+
return value;
|
|
204
|
+
},
|
|
205
|
+
(err) => {
|
|
206
|
+
cleanup();
|
|
207
|
+
throw decodeCppException(err);
|
|
208
|
+
},
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
cleanup();
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function callWithVectorCoercion(fn, thisArg, args) {
|
|
217
|
+
return retryWithCoercion((current) => Reflect.apply(fn, thisArg, current), args);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function constructWithVectorCoercion(Class, args, newTarget) {
|
|
221
|
+
return retryWithCoercion((current) => Reflect.construct(Class, current, newTarget || Class), args);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Deep wrapper (WORKER mode): every method reached through the wrapped object - at any depth
|
|
225
|
+
// (Module.Gdal.openEx, dataset.translate, ...) - is invoked through callWithVectorCoercion,
|
|
226
|
+
// and every `new` through the construct trap below. Safe here because the worker world is
|
|
227
|
+
// entirely opaque Comlink proxies - nothing accesses raw memory or object identity through it.
|
|
228
|
+
function wrapWithVectorCoercion(value, thisArg) {
|
|
229
|
+
if (value == null || (typeof value !== 'object' && typeof value !== 'function')) {
|
|
230
|
+
return value;
|
|
231
|
+
}
|
|
232
|
+
const proxy = new Proxy(value, {
|
|
233
|
+
get(target, prop) {
|
|
234
|
+
const member = Reflect.get(target, prop);
|
|
235
|
+
// Comlink invokes exposed methods as rawValue.apply(parent, args) with parent
|
|
236
|
+
// being the WRAPPED object. Handle Function.prototype apply/call here so `this`
|
|
237
|
+
// and the argument list reach callWithVectorCoercion unwrapped and flat (retries
|
|
238
|
+
// depend on seeing the real argument positions).
|
|
239
|
+
if (typeof target === 'function' && member === Function.prototype.apply) {
|
|
240
|
+
return (applyThis, applyArgs) => callWithVectorCoercion(
|
|
241
|
+
target,
|
|
242
|
+
applyThis === undefined && thisArg !== undefined
|
|
243
|
+
? thisArg
|
|
244
|
+
: unwrapCoercionProxy(applyThis),
|
|
245
|
+
applyArgs ? Array.prototype.map.call(applyArgs, unwrapCoercionProxy) : [],
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
if (typeof target === 'function' && member === Function.prototype.call) {
|
|
249
|
+
return (callThis, ...callArgs) => callWithVectorCoercion(
|
|
250
|
+
target,
|
|
251
|
+
callThis === undefined && thisArg !== undefined
|
|
252
|
+
? thisArg
|
|
253
|
+
: unwrapCoercionProxy(callThis),
|
|
254
|
+
callArgs.map(unwrapCoercionProxy),
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
if (typeof member === 'function' || (member !== null && typeof member === 'object')) {
|
|
258
|
+
// Proxy invariant: non-configurable, non-writable data properties (a class's
|
|
259
|
+
// .prototype, notably) must be returned as-is, or the engine throws on access.
|
|
260
|
+
const desc = Reflect.getOwnPropertyDescriptor(target, prop);
|
|
261
|
+
if (desc && desc.configurable === false && desc.writable === false) {
|
|
262
|
+
return member;
|
|
263
|
+
}
|
|
264
|
+
return wrapWithVectorCoercion(member, target);
|
|
265
|
+
}
|
|
266
|
+
return member;
|
|
267
|
+
},
|
|
268
|
+
set(target, prop, value) {
|
|
269
|
+
// 3-arg Reflect.set keeps the RAW object as receiver: embind property setters
|
|
270
|
+
// identity-check `this`, and the default (proxy receiver) fails that check.
|
|
271
|
+
return Reflect.set(target, prop, unwrapCoercionProxy(value));
|
|
272
|
+
},
|
|
273
|
+
apply(target, applyThis, args) {
|
|
274
|
+
const boundThis = thisArg !== undefined ? thisArg : unwrapCoercionProxy(applyThis);
|
|
275
|
+
return callWithVectorCoercion(target, boundThis, args.map(unwrapCoercionProxy));
|
|
276
|
+
},
|
|
277
|
+
construct(target, args) {
|
|
278
|
+
// Comlink's CONSTRUCT handler does `new rawValue(...args)` on the wrapped
|
|
279
|
+
// class. Without this trap the construction falls through with the PROXY as
|
|
280
|
+
// newTarget, whose get trap hands out a wrapped .prototype (embind classes
|
|
281
|
+
// are plain functions, so their prototype is writable and the proxy
|
|
282
|
+
// invariant early-return does not apply) - and embind's prototype-identity
|
|
283
|
+
// check rejects the instance with "Use 'new' to construct X". Constructing
|
|
284
|
+
// against the raw class keeps the real prototype and adds the same
|
|
285
|
+
// plain-array vector coercion that method calls get.
|
|
286
|
+
return constructWithVectorCoercion(target, args.map(unwrapCoercionProxy));
|
|
287
|
+
},
|
|
288
|
+
});
|
|
289
|
+
coercionProxies.set(proxy, value);
|
|
290
|
+
return proxy;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Narrow wrapper (DIRECT / non-worker mode): only the module's own function calls and
|
|
294
|
+
// constructions are coerced. Data members (HEAP*, FS, typed arrays) and returned objects
|
|
295
|
+
// stay raw, because direct-mode code accesses those by index and by identity - a blanket
|
|
296
|
+
// proxy (like the worker wrapper above) would break them. Returned embind objects are
|
|
297
|
+
// already real vectors/objects in direct mode (they are not flattened to plain arrays the
|
|
298
|
+
// way the worker boundary does), so module-level coercion covers the plain-array-literal
|
|
299
|
+
// case without changing any object's identity.
|
|
300
|
+
function wrapModuleForCoercion(m) {
|
|
301
|
+
if (m == null || (typeof m !== 'object' && typeof m !== 'function')) {
|
|
302
|
+
return m;
|
|
303
|
+
}
|
|
304
|
+
const wrappedFns = new Map();
|
|
305
|
+
const moduleProxy = new Proxy(m, {
|
|
306
|
+
get(target, prop) {
|
|
307
|
+
const member = Reflect.get(target, prop);
|
|
308
|
+
if (typeof member !== 'function') {
|
|
309
|
+
return member; // HEAP*, FS, typed arrays and other data pass through raw
|
|
310
|
+
}
|
|
311
|
+
let wrapped = wrappedFns.get(prop);
|
|
312
|
+
if (!wrapped) {
|
|
313
|
+
wrapped = new Proxy(member, {
|
|
314
|
+
apply(fn, thisArg, args) {
|
|
315
|
+
return callWithVectorCoercion(
|
|
316
|
+
fn,
|
|
317
|
+
unwrapCoercionProxy(thisArg),
|
|
318
|
+
args.map(unwrapCoercionProxy),
|
|
319
|
+
);
|
|
320
|
+
},
|
|
321
|
+
construct(Class, args) {
|
|
322
|
+
return constructWithVectorCoercion(Class, args.map(unwrapCoercionProxy));
|
|
323
|
+
},
|
|
324
|
+
});
|
|
325
|
+
wrappedFns.set(prop, wrapped);
|
|
326
|
+
}
|
|
327
|
+
return wrapped;
|
|
328
|
+
},
|
|
329
|
+
});
|
|
330
|
+
coercionProxies.set(moduleProxy, m);
|
|
331
|
+
return moduleProxy;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
function isObject$1(item) {
|
|
335
|
+
return (item && typeof item === 'object' && !Array.isArray(item));
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
function mergeDeep(target, ...sources) {
|
|
339
|
+
if (!sources.length) return target;
|
|
340
|
+
const source = sources.shift();
|
|
341
|
+
|
|
342
|
+
if (isObject$1(target) && isObject$1(source)) {
|
|
343
|
+
for (const key in source) {
|
|
344
|
+
if (isObject$1(source[key])) {
|
|
345
|
+
if (!target[key]) Object.assign(target, { [key]: {} });
|
|
346
|
+
mergeDeep(target[key], source[key]);
|
|
347
|
+
} else {
|
|
348
|
+
Object.assign(target, { [key]: source[key] });
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
return mergeDeep(target, ...sources);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function composeAdapters(adapters) {
|
|
357
|
+
const composed = {};
|
|
358
|
+
const extendFns = [];
|
|
359
|
+
const readyFns = [];
|
|
360
|
+
for (const a of adapters) {
|
|
361
|
+
if (!a) continue;
|
|
362
|
+
if (a.getDefaultPathPrefix) composed.getDefaultPathPrefix = a.getDefaultPathPrefix;
|
|
363
|
+
if (a.getDataPath) composed.getDataPath = a.getDataPath;
|
|
364
|
+
if (a.finalizePath) composed.finalizePath = a.finalizePath;
|
|
365
|
+
if (a.extendModule) extendFns.push(a.extendModule);
|
|
366
|
+
if (a.onModuleReady) readyFns.push(a.onModuleReady);
|
|
367
|
+
}
|
|
368
|
+
if (extendFns.length) {
|
|
369
|
+
composed.extendModule = (m, config) => extendFns.forEach((fn) => fn(m, config));
|
|
370
|
+
}
|
|
371
|
+
if (readyFns.length) {
|
|
372
|
+
composed.onModuleReady = async (m, config) => {
|
|
373
|
+
for (const fn of readyFns) {
|
|
374
|
+
await fn(m, config);
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
return composed;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
function buildLocateFile(config, adapter) {
|
|
382
|
+
return function locateFile(fileName) {
|
|
383
|
+
let path = fileName;
|
|
384
|
+
if (config.paths && config.paths.wasm && fileName.endsWith('.wasm')) {
|
|
385
|
+
path = config.paths.wasm;
|
|
386
|
+
} else if (config.paths && config.paths.data && (fileName.endsWith('.data.txt') || fileName.endsWith('.data'))) {
|
|
387
|
+
path = config.paths.data;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
let prefix = '';
|
|
391
|
+
if (config.path) {
|
|
392
|
+
prefix = config.path;
|
|
393
|
+
if (prefix.slice(-1) !== '/') prefix += '/';
|
|
394
|
+
} else if (adapter.getDefaultPathPrefix) {
|
|
395
|
+
prefix = adapter.getDefaultPathPrefix();
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
let output = prefix + path;
|
|
399
|
+
if (output.endsWith('.data')) output += '.txt';
|
|
400
|
+
if (adapter.finalizePath) output = adapter.finalizePath(output);
|
|
401
|
+
|
|
402
|
+
return output;
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
function createBaseModule(Module, config, adapter) {
|
|
407
|
+
return new Promise((resolve, reject) => {
|
|
408
|
+
const locateFile = buildLocateFile(config, adapter);
|
|
409
|
+
const dataPath = adapter.getDataPath ? adapter.getDataPath() : '/crossbind';
|
|
410
|
+
|
|
411
|
+
const m = {
|
|
412
|
+
print(text) {
|
|
413
|
+
if (config.logHandler) {
|
|
414
|
+
config.logHandler(text, 'stdout');
|
|
415
|
+
} else {
|
|
416
|
+
console.debug(`wasm stdout: ${text}`);
|
|
417
|
+
}
|
|
418
|
+
},
|
|
419
|
+
printErr(text) {
|
|
420
|
+
if (config.errorHandler) {
|
|
421
|
+
config.errorHandler(text, 'stderr');
|
|
422
|
+
} else {
|
|
423
|
+
console.error(`wasm stderr: ${text}`);
|
|
424
|
+
}
|
|
425
|
+
},
|
|
426
|
+
locateFile,
|
|
427
|
+
preRun: [
|
|
428
|
+
({ ENV }) => {
|
|
429
|
+
if (ENV && config && config.env) {
|
|
430
|
+
Object.entries(config.env).forEach(([key, value]) => {
|
|
431
|
+
ENV[key] = value?.replace('_CROSSBIND_DATA_PATH_', dataPath);
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
},
|
|
435
|
+
],
|
|
436
|
+
unmount() {},
|
|
437
|
+
toArray(vector) {
|
|
438
|
+
if (Array.isArray(vector)) return vector;
|
|
439
|
+
const len = vector.size();
|
|
440
|
+
const output = new Array(len);
|
|
441
|
+
for (let i = 0; i < len; i += 1) {
|
|
442
|
+
output[i] = vector.get(i);
|
|
443
|
+
}
|
|
444
|
+
return output;
|
|
445
|
+
},
|
|
446
|
+
toVector(classOrName, array = []) {
|
|
447
|
+
const VectorClass = typeof classOrName === 'string' ? m[classOrName] : classOrName;
|
|
448
|
+
const vector = new VectorClass();
|
|
449
|
+
array.forEach((item) => {
|
|
450
|
+
vector.push_back(item);
|
|
451
|
+
});
|
|
452
|
+
return vector;
|
|
453
|
+
},
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
if (adapter.extendModule) adapter.extendModule(m, config);
|
|
457
|
+
|
|
458
|
+
if (config.getWasmFunction) {
|
|
459
|
+
m.instantiateWasm = function instantiateWasm(info, receive) {
|
|
460
|
+
const instance = new WebAssembly.Instance(config.getWasmFunction(), info);
|
|
461
|
+
receive(instance);
|
|
462
|
+
return instance.exports;
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// onModuleReady may need to await async setup (e.g. the OPFS preflight in
|
|
467
|
+
// fs-browser), which emscripten's onRuntimeInitialized callback cannot, so
|
|
468
|
+
// both hooks run after the factory settles - adapter first, then the user's.
|
|
469
|
+
Module(m).then(async (mod) => {
|
|
470
|
+
if (adapter.onModuleReady) await adapter.onModuleReady(mod, config);
|
|
471
|
+
if (config.onRuntimeInitialized) config.onRuntimeInitialized(mod);
|
|
472
|
+
return mod;
|
|
473
|
+
}).then(resolve).catch(reject);
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
function createInitCrossbind({
|
|
478
|
+
Module, systemConfig, adapter, worker,
|
|
479
|
+
}) {
|
|
480
|
+
let crossbindPromise;
|
|
481
|
+
|
|
482
|
+
function createModule(config) {
|
|
483
|
+
return createBaseModule(Module, config, adapter);
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
if (worker && worker.isWorkerScope) {
|
|
487
|
+
worker.exposeWorker(systemConfig, createModule);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
function initNative(userConfig = {}) {
|
|
491
|
+
if (crossbindPromise) return crossbindPromise;
|
|
492
|
+
|
|
493
|
+
const config = mergeDeep(systemConfig, userConfig);
|
|
494
|
+
|
|
495
|
+
if (worker && config.useWorker && !worker.isWorkerScope) {
|
|
496
|
+
crossbindPromise = worker.initWithWorker(config, userConfig);
|
|
497
|
+
} else {
|
|
498
|
+
// Direct (non-worker) mode: wrap the module so plain-array arguments coerce to
|
|
499
|
+
// embind vectors like they do in worker mode. Narrow wrapper — only the module's
|
|
500
|
+
// own calls, leaving HEAP*/FS/returned objects raw (see wrapModuleForCoercion).
|
|
501
|
+
crossbindPromise = createModule(config).then((m) => {
|
|
502
|
+
setCoercionModule(m);
|
|
503
|
+
// Instance/static methods stay raw in direct mode, so the decode has to
|
|
504
|
+
// land on the class prototypes themselves.
|
|
505
|
+
patchModuleForExceptionDecode(m);
|
|
506
|
+
return wrapModuleForCoercion(m);
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
return crossbindPromise;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
initNative.terminate = function terminate() {
|
|
514
|
+
if (worker && worker.terminate) worker.terminate();
|
|
515
|
+
crossbindPromise = null;
|
|
516
|
+
};
|
|
517
|
+
|
|
518
|
+
if (typeof globalThis === 'object') {
|
|
519
|
+
globalThis.Crossbind = { initNative };
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
return initNative;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
var urlPath = {
|
|
526
|
+
finalizePath(output) {
|
|
527
|
+
if (output.substring(0, 4) !== 'http' && output[0] !== '/') {
|
|
528
|
+
return `/${output}`;
|
|
529
|
+
}
|
|
530
|
+
return output;
|
|
531
|
+
},
|
|
532
|
+
};
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
* @license
|
|
536
|
+
* Copyright 2019 Google LLC
|
|
537
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
538
|
+
*/
|
|
539
|
+
const proxyMarker = Symbol("Comlink.proxy");
|
|
540
|
+
const createEndpoint = Symbol("Comlink.endpoint");
|
|
541
|
+
const releaseProxy = Symbol("Comlink.releaseProxy");
|
|
542
|
+
const finalizer = Symbol("Comlink.finalizer");
|
|
543
|
+
const throwMarker = Symbol("Comlink.thrown");
|
|
544
|
+
const isObject = (val) => (typeof val === "object" && val !== null) || typeof val === "function";
|
|
545
|
+
/**
|
|
546
|
+
* Internal transfer handle to handle objects marked to proxy.
|
|
547
|
+
*/
|
|
548
|
+
const proxyTransferHandler = {
|
|
549
|
+
canHandle: (val) => isObject(val) && val[proxyMarker],
|
|
550
|
+
serialize(obj) {
|
|
551
|
+
const { port1, port2 } = new MessageChannel();
|
|
552
|
+
expose(obj, port1);
|
|
553
|
+
return [port2, [port2]];
|
|
554
|
+
},
|
|
555
|
+
deserialize(port) {
|
|
556
|
+
port.start();
|
|
557
|
+
return wrap(port);
|
|
558
|
+
},
|
|
559
|
+
};
|
|
560
|
+
/**
|
|
561
|
+
* Internal transfer handler to handle thrown exceptions.
|
|
562
|
+
*/
|
|
563
|
+
const throwTransferHandler = {
|
|
564
|
+
canHandle: (value) => isObject(value) && throwMarker in value,
|
|
565
|
+
serialize({ value }) {
|
|
566
|
+
let serialized;
|
|
567
|
+
if (value instanceof Error) {
|
|
568
|
+
serialized = {
|
|
569
|
+
isError: true,
|
|
570
|
+
value: {
|
|
571
|
+
message: value.message,
|
|
572
|
+
name: value.name,
|
|
573
|
+
stack: value.stack,
|
|
574
|
+
},
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
serialized = { isError: false, value };
|
|
579
|
+
}
|
|
580
|
+
return [serialized, []];
|
|
581
|
+
},
|
|
582
|
+
deserialize(serialized) {
|
|
583
|
+
if (serialized.isError) {
|
|
584
|
+
throw Object.assign(new Error(serialized.value.message), serialized.value);
|
|
585
|
+
}
|
|
586
|
+
throw serialized.value;
|
|
587
|
+
},
|
|
588
|
+
};
|
|
589
|
+
/**
|
|
590
|
+
* Allows customizing the serialization of certain values.
|
|
591
|
+
*/
|
|
592
|
+
const transferHandlers = new Map([
|
|
593
|
+
["proxy", proxyTransferHandler],
|
|
594
|
+
["throw", throwTransferHandler],
|
|
595
|
+
]);
|
|
596
|
+
function isAllowedOrigin(allowedOrigins, origin) {
|
|
597
|
+
for (const allowedOrigin of allowedOrigins) {
|
|
598
|
+
if (origin === allowedOrigin || allowedOrigin === "*") {
|
|
599
|
+
return true;
|
|
600
|
+
}
|
|
601
|
+
if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {
|
|
602
|
+
return true;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
return false;
|
|
606
|
+
}
|
|
607
|
+
function expose(obj, ep = globalThis, allowedOrigins = ["*"]) {
|
|
608
|
+
ep.addEventListener("message", function callback(ev) {
|
|
609
|
+
if (!ev || !ev.data) {
|
|
610
|
+
return;
|
|
611
|
+
}
|
|
612
|
+
if (!isAllowedOrigin(allowedOrigins, ev.origin)) {
|
|
613
|
+
console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
const { id, type, path } = Object.assign({ path: [] }, ev.data);
|
|
617
|
+
const argumentList = (ev.data.argumentList || []).map(fromWireValue);
|
|
618
|
+
let returnValue;
|
|
619
|
+
try {
|
|
620
|
+
const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);
|
|
621
|
+
const rawValue = path.reduce((obj, prop) => obj[prop], obj);
|
|
622
|
+
switch (type) {
|
|
623
|
+
case "GET" /* MessageType.GET */:
|
|
624
|
+
{
|
|
625
|
+
returnValue = rawValue;
|
|
626
|
+
}
|
|
627
|
+
break;
|
|
628
|
+
case "SET" /* MessageType.SET */:
|
|
629
|
+
{
|
|
630
|
+
parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);
|
|
631
|
+
returnValue = true;
|
|
632
|
+
}
|
|
633
|
+
break;
|
|
634
|
+
case "APPLY" /* MessageType.APPLY */:
|
|
635
|
+
{
|
|
636
|
+
returnValue = rawValue.apply(parent, argumentList);
|
|
637
|
+
}
|
|
638
|
+
break;
|
|
639
|
+
case "CONSTRUCT" /* MessageType.CONSTRUCT */:
|
|
640
|
+
{
|
|
641
|
+
const value = new rawValue(...argumentList);
|
|
642
|
+
returnValue = proxy(value);
|
|
643
|
+
}
|
|
644
|
+
break;
|
|
645
|
+
case "ENDPOINT" /* MessageType.ENDPOINT */:
|
|
646
|
+
{
|
|
647
|
+
const { port1, port2 } = new MessageChannel();
|
|
648
|
+
expose(obj, port2);
|
|
649
|
+
returnValue = transfer(port1, [port1]);
|
|
650
|
+
}
|
|
651
|
+
break;
|
|
652
|
+
case "RELEASE" /* MessageType.RELEASE */:
|
|
653
|
+
{
|
|
654
|
+
returnValue = undefined;
|
|
655
|
+
}
|
|
656
|
+
break;
|
|
657
|
+
default:
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
catch (value) {
|
|
662
|
+
returnValue = { value, [throwMarker]: 0 };
|
|
663
|
+
}
|
|
664
|
+
Promise.resolve(returnValue)
|
|
665
|
+
.catch((value) => {
|
|
666
|
+
return { value, [throwMarker]: 0 };
|
|
667
|
+
})
|
|
668
|
+
.then((returnValue) => {
|
|
669
|
+
const [wireValue, transferables] = toWireValue(returnValue);
|
|
670
|
+
ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);
|
|
671
|
+
if (type === "RELEASE" /* MessageType.RELEASE */) {
|
|
672
|
+
// detach and deactive after sending release response above.
|
|
673
|
+
ep.removeEventListener("message", callback);
|
|
674
|
+
closeEndPoint(ep);
|
|
675
|
+
if (finalizer in obj && typeof obj[finalizer] === "function") {
|
|
676
|
+
obj[finalizer]();
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
})
|
|
680
|
+
.catch((error) => {
|
|
681
|
+
// Send Serialization Error To Caller
|
|
682
|
+
const [wireValue, transferables] = toWireValue({
|
|
683
|
+
value: new TypeError("Unserializable return value"),
|
|
684
|
+
[throwMarker]: 0,
|
|
685
|
+
});
|
|
686
|
+
ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);
|
|
687
|
+
});
|
|
688
|
+
});
|
|
689
|
+
if (ep.start) {
|
|
690
|
+
ep.start();
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
function isMessagePort(endpoint) {
|
|
694
|
+
return endpoint.constructor.name === "MessagePort";
|
|
695
|
+
}
|
|
696
|
+
function closeEndPoint(endpoint) {
|
|
697
|
+
if (isMessagePort(endpoint))
|
|
698
|
+
endpoint.close();
|
|
699
|
+
}
|
|
700
|
+
function wrap(ep, target) {
|
|
701
|
+
const pendingListeners = new Map();
|
|
702
|
+
ep.addEventListener("message", function handleMessage(ev) {
|
|
703
|
+
const { data } = ev;
|
|
704
|
+
if (!data || !data.id) {
|
|
705
|
+
return;
|
|
706
|
+
}
|
|
707
|
+
const resolver = pendingListeners.get(data.id);
|
|
708
|
+
if (!resolver) {
|
|
709
|
+
return;
|
|
710
|
+
}
|
|
711
|
+
try {
|
|
712
|
+
resolver(data);
|
|
713
|
+
}
|
|
714
|
+
finally {
|
|
715
|
+
pendingListeners.delete(data.id);
|
|
716
|
+
}
|
|
717
|
+
});
|
|
718
|
+
return createProxy(ep, pendingListeners, [], target);
|
|
719
|
+
}
|
|
720
|
+
function throwIfProxyReleased(isReleased) {
|
|
721
|
+
if (isReleased) {
|
|
722
|
+
throw new Error("Proxy has been released and is not useable");
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
function releaseEndpoint(ep) {
|
|
726
|
+
return requestResponseMessage(ep, new Map(), {
|
|
727
|
+
type: "RELEASE" /* MessageType.RELEASE */,
|
|
728
|
+
}).then(() => {
|
|
729
|
+
closeEndPoint(ep);
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
const proxyCounter = new WeakMap();
|
|
733
|
+
const proxyFinalizers = "FinalizationRegistry" in globalThis &&
|
|
734
|
+
new FinalizationRegistry((ep) => {
|
|
735
|
+
const newCount = (proxyCounter.get(ep) || 0) - 1;
|
|
736
|
+
proxyCounter.set(ep, newCount);
|
|
737
|
+
if (newCount === 0) {
|
|
738
|
+
releaseEndpoint(ep);
|
|
739
|
+
}
|
|
740
|
+
});
|
|
741
|
+
function registerProxy(proxy, ep) {
|
|
742
|
+
const newCount = (proxyCounter.get(ep) || 0) + 1;
|
|
743
|
+
proxyCounter.set(ep, newCount);
|
|
744
|
+
if (proxyFinalizers) {
|
|
745
|
+
proxyFinalizers.register(proxy, ep, proxy);
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
function unregisterProxy(proxy) {
|
|
749
|
+
if (proxyFinalizers) {
|
|
750
|
+
proxyFinalizers.unregister(proxy);
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
function createProxy(ep, pendingListeners, path = [], target = function () { }) {
|
|
754
|
+
let isProxyReleased = false;
|
|
755
|
+
const proxy = new Proxy(target, {
|
|
756
|
+
get(_target, prop) {
|
|
757
|
+
throwIfProxyReleased(isProxyReleased);
|
|
758
|
+
if (prop === releaseProxy) {
|
|
759
|
+
return () => {
|
|
760
|
+
unregisterProxy(proxy);
|
|
761
|
+
releaseEndpoint(ep);
|
|
762
|
+
pendingListeners.clear();
|
|
763
|
+
isProxyReleased = true;
|
|
764
|
+
};
|
|
765
|
+
}
|
|
766
|
+
if (prop === "then") {
|
|
767
|
+
if (path.length === 0) {
|
|
768
|
+
return { then: () => proxy };
|
|
769
|
+
}
|
|
770
|
+
const r = requestResponseMessage(ep, pendingListeners, {
|
|
771
|
+
type: "GET" /* MessageType.GET */,
|
|
772
|
+
path: path.map((p) => p.toString()),
|
|
773
|
+
}).then(fromWireValue);
|
|
774
|
+
return r.then.bind(r);
|
|
775
|
+
}
|
|
776
|
+
return createProxy(ep, pendingListeners, [...path, prop]);
|
|
777
|
+
},
|
|
778
|
+
set(_target, prop, rawValue) {
|
|
779
|
+
throwIfProxyReleased(isProxyReleased);
|
|
780
|
+
// FIXME: ES6 Proxy Handler `set` methods are supposed to return a
|
|
781
|
+
// boolean. To show good will, we return true asynchronously ¯\_(ツ)_/¯
|
|
782
|
+
const [value, transferables] = toWireValue(rawValue);
|
|
783
|
+
return requestResponseMessage(ep, pendingListeners, {
|
|
784
|
+
type: "SET" /* MessageType.SET */,
|
|
785
|
+
path: [...path, prop].map((p) => p.toString()),
|
|
786
|
+
value,
|
|
787
|
+
}, transferables).then(fromWireValue);
|
|
788
|
+
},
|
|
789
|
+
apply(_target, _thisArg, rawArgumentList) {
|
|
790
|
+
throwIfProxyReleased(isProxyReleased);
|
|
791
|
+
const last = path[path.length - 1];
|
|
792
|
+
if (last === createEndpoint) {
|
|
793
|
+
return requestResponseMessage(ep, pendingListeners, {
|
|
794
|
+
type: "ENDPOINT" /* MessageType.ENDPOINT */,
|
|
795
|
+
}).then(fromWireValue);
|
|
796
|
+
}
|
|
797
|
+
// We just pretend that `bind()` didn’t happen.
|
|
798
|
+
if (last === "bind") {
|
|
799
|
+
return createProxy(ep, pendingListeners, path.slice(0, -1));
|
|
800
|
+
}
|
|
801
|
+
const [argumentList, transferables] = processArguments(rawArgumentList);
|
|
802
|
+
return requestResponseMessage(ep, pendingListeners, {
|
|
803
|
+
type: "APPLY" /* MessageType.APPLY */,
|
|
804
|
+
path: path.map((p) => p.toString()),
|
|
805
|
+
argumentList,
|
|
806
|
+
}, transferables).then(fromWireValue);
|
|
807
|
+
},
|
|
808
|
+
construct(_target, rawArgumentList) {
|
|
809
|
+
throwIfProxyReleased(isProxyReleased);
|
|
810
|
+
const [argumentList, transferables] = processArguments(rawArgumentList);
|
|
811
|
+
return requestResponseMessage(ep, pendingListeners, {
|
|
812
|
+
type: "CONSTRUCT" /* MessageType.CONSTRUCT */,
|
|
813
|
+
path: path.map((p) => p.toString()),
|
|
814
|
+
argumentList,
|
|
815
|
+
}, transferables).then(fromWireValue);
|
|
816
|
+
},
|
|
817
|
+
});
|
|
818
|
+
registerProxy(proxy, ep);
|
|
819
|
+
return proxy;
|
|
820
|
+
}
|
|
821
|
+
function myFlat(arr) {
|
|
822
|
+
return Array.prototype.concat.apply([], arr);
|
|
823
|
+
}
|
|
824
|
+
function processArguments(argumentList) {
|
|
825
|
+
const processed = argumentList.map(toWireValue);
|
|
826
|
+
return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];
|
|
827
|
+
}
|
|
828
|
+
const transferCache = new WeakMap();
|
|
829
|
+
function transfer(obj, transfers) {
|
|
830
|
+
transferCache.set(obj, transfers);
|
|
831
|
+
return obj;
|
|
832
|
+
}
|
|
833
|
+
function proxy(obj) {
|
|
834
|
+
return Object.assign(obj, { [proxyMarker]: true });
|
|
835
|
+
}
|
|
836
|
+
function toWireValue(value) {
|
|
837
|
+
for (const [name, handler] of transferHandlers) {
|
|
838
|
+
if (handler.canHandle(value)) {
|
|
839
|
+
const [serializedValue, transferables] = handler.serialize(value);
|
|
840
|
+
return [
|
|
841
|
+
{
|
|
842
|
+
type: "HANDLER" /* WireValueType.HANDLER */,
|
|
843
|
+
name,
|
|
844
|
+
value: serializedValue,
|
|
845
|
+
},
|
|
846
|
+
transferables,
|
|
847
|
+
];
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
return [
|
|
851
|
+
{
|
|
852
|
+
type: "RAW" /* WireValueType.RAW */,
|
|
853
|
+
value,
|
|
854
|
+
},
|
|
855
|
+
transferCache.get(value) || [],
|
|
856
|
+
];
|
|
857
|
+
}
|
|
858
|
+
function fromWireValue(value) {
|
|
859
|
+
switch (value.type) {
|
|
860
|
+
case "HANDLER" /* WireValueType.HANDLER */:
|
|
861
|
+
return transferHandlers.get(value.name).deserialize(value.value);
|
|
862
|
+
case "RAW" /* WireValueType.RAW */:
|
|
863
|
+
return value.value;
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
function requestResponseMessage(ep, pendingListeners, msg, transfers) {
|
|
867
|
+
return new Promise((resolve) => {
|
|
868
|
+
const id = generateUUID();
|
|
869
|
+
pendingListeners.set(id, resolve);
|
|
870
|
+
if (ep.start) {
|
|
871
|
+
ep.start();
|
|
872
|
+
}
|
|
873
|
+
ep.postMessage(Object.assign({ id }, msg), transfers);
|
|
874
|
+
});
|
|
875
|
+
}
|
|
876
|
+
function generateUUID() {
|
|
877
|
+
return new Array(4)
|
|
878
|
+
.fill(0)
|
|
879
|
+
.map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))
|
|
880
|
+
.join("-");
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
/* global WorkerGlobalScope */
|
|
884
|
+
|
|
885
|
+
const STATIC_PATHS = {
|
|
886
|
+
opfs: '/opfs',
|
|
887
|
+
memfs: '/memfs',
|
|
888
|
+
};
|
|
889
|
+
|
|
890
|
+
const isWorkerScope$1 = typeof WorkerGlobalScope !== 'undefined'
|
|
891
|
+
&& typeof self !== 'undefined'
|
|
892
|
+
&& self instanceof WorkerGlobalScope;
|
|
893
|
+
|
|
894
|
+
const isBrowserSupportOPFS = typeof navigator !== 'undefined'
|
|
895
|
+
&& navigator.storage
|
|
896
|
+
&& navigator.storage.getDirectory;
|
|
897
|
+
|
|
898
|
+
// Presence of the API does not guarantee a working backend: Playwright's WebKit
|
|
899
|
+
// rejects getDirectory() with UnknownError, and storage-restricted contexts
|
|
900
|
+
// reject too. false only after the onModuleReady preflight actually failed.
|
|
901
|
+
let isOpfsFunctional = true;
|
|
902
|
+
|
|
903
|
+
var browserFs = {
|
|
904
|
+
extendModule(m, config) {
|
|
905
|
+
// Hand the pthread spawn script to the glue via a crossbind-specific key. Using emscripten's
|
|
906
|
+
// own mainScriptUrlOrBlob aborts emsdk 6 debug builds ("supplied but not included in
|
|
907
|
+
// INCOMING_MODULE_JS_API") on single-thread targets; a custom key is not validated, and
|
|
908
|
+
// buildWasm rewrites the pthread bootstrap to read it (falling back to _scriptName).
|
|
909
|
+
const pthreadScript = config.paths.worker || config.paths.js;
|
|
910
|
+
if (pthreadScript) {
|
|
911
|
+
m.crossbindMainScript = m.locateFile(pthreadScript);
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
m.getDefaultPath = () => STATIC_PATHS[(config.fs?.opfs !== false && isOpfsFunctional) ? 'opfs' : 'memfs'];
|
|
915
|
+
|
|
916
|
+
m.getFinalPath = function getFinalPath(path) {
|
|
917
|
+
let returnPath = path;
|
|
918
|
+
if (!path.startsWith('/')) {
|
|
919
|
+
throw new Error(`Path ${path} does not start with /`);
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
const opfsConfigured = config.fs?.opfs !== false;
|
|
923
|
+
|
|
924
|
+
let backend;
|
|
925
|
+
Object.entries(STATIC_PATHS).forEach(([key, value]) => {
|
|
926
|
+
if (path.startsWith(value)) {
|
|
927
|
+
backend = key;
|
|
928
|
+
}
|
|
929
|
+
});
|
|
930
|
+
if (!backend) {
|
|
931
|
+
throw new Error(`Path ${path} does not start with any of the static paths: ${Object.values(STATIC_PATHS).join(', ')}`);
|
|
932
|
+
}
|
|
933
|
+
if (backend === 'opfs' && !opfsConfigured) {
|
|
934
|
+
throw new Error(`Path ${path} starts with ${STATIC_PATHS.opfs} but OPFS is disabled. Enable fs.opfs in config to mount under ${STATIC_PATHS.opfs}/.`);
|
|
935
|
+
}
|
|
936
|
+
if (backend === 'opfs' && !isWorkerScope$1) {
|
|
937
|
+
throw new Error(`Path ${path} starts with ${STATIC_PATHS.opfs} but OPFS is only available inside a Worker scope. Enable useWorker or mount under ${STATIC_PATHS.memfs}/ instead. Falling back to ${STATIC_PATHS.memfs}/.`);
|
|
938
|
+
}
|
|
939
|
+
if (backend === 'opfs' && (!isBrowserSupportOPFS || !isOpfsFunctional)) {
|
|
940
|
+
console.error(`Path ${path} starts with ${STATIC_PATHS.opfs} but OPFS is not usable in this browser. Falling back to ${STATIC_PATHS.memfs}/.`);
|
|
941
|
+
returnPath = returnPath.replace(STATIC_PATHS.opfs, STATIC_PATHS.memfs);
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
return returnPath;
|
|
945
|
+
};
|
|
946
|
+
|
|
947
|
+
m.getRandomPath = function getRandomPath(startPath = m.getDefaultPath()) {
|
|
948
|
+
const appName = config.general?.name;
|
|
949
|
+
const rand = Math.floor(Math.random() * 1000000);
|
|
950
|
+
const path = m.getFinalPath(`${startPath}/${appName}/automounted/${rand}`);
|
|
951
|
+
m.FS.mkdirTree(path);
|
|
952
|
+
return path;
|
|
953
|
+
};
|
|
954
|
+
|
|
955
|
+
m.autoMountFiles = function autoMountFiles(files, parentPath = null) {
|
|
956
|
+
return new Promise((resolve, reject) => {
|
|
957
|
+
if (files.length === 0) {
|
|
958
|
+
resolve([]);
|
|
959
|
+
return;
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
const mountPath = parentPath ? m.getFinalPath(parentPath) : m.getRandomPath();
|
|
963
|
+
m.FS.mkdirTree(mountPath);
|
|
964
|
+
|
|
965
|
+
(async () => {
|
|
966
|
+
try {
|
|
967
|
+
const paths = [];
|
|
968
|
+
for (const f of files) {
|
|
969
|
+
const filePath = `${mountPath}/${f.name}`;
|
|
970
|
+
const stream = m.FS.open(filePath, 'w');
|
|
971
|
+
const reader = f.stream().getReader();
|
|
972
|
+
let offset = 0;
|
|
973
|
+
|
|
974
|
+
while (true) {
|
|
975
|
+
const { done, value } = await reader.read();
|
|
976
|
+
if (done) break;
|
|
977
|
+
m.FS.write(stream, value, 0, value.length, offset);
|
|
978
|
+
offset += value.length;
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
m.FS.close(stream);
|
|
982
|
+
paths.push(filePath);
|
|
983
|
+
}
|
|
984
|
+
resolve(paths);
|
|
985
|
+
} catch (e) {
|
|
986
|
+
reject(e);
|
|
987
|
+
}
|
|
988
|
+
})();
|
|
989
|
+
});
|
|
990
|
+
};
|
|
991
|
+
|
|
992
|
+
m.getFileBytes = function getFileBytes(path) {
|
|
993
|
+
if (!path) return new Uint8Array();
|
|
994
|
+
return m.FS.readFile(path, { encoding: 'binary' });
|
|
995
|
+
};
|
|
996
|
+
|
|
997
|
+
m.getFileList = function getFileList(path = m.getDefaultPath()) {
|
|
998
|
+
const fileList = [];
|
|
999
|
+
for (const name of m.FS.readdir(path)) {
|
|
1000
|
+
if (name === '.' || name === '..') continue;
|
|
1001
|
+
const fullPath = path === '/' ? `/${name}` : `${path}/${name}`;
|
|
1002
|
+
const stat = m.FS.stat(fullPath);
|
|
1003
|
+
const type = stat.mode & 0o170000;
|
|
1004
|
+
if (type === 0o040000) {
|
|
1005
|
+
fileList.push(...m.getFileList(fullPath));
|
|
1006
|
+
} else if (type === 0o100000) {
|
|
1007
|
+
fileList.push({ path: fullPath, size: stat.size });
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
return fileList;
|
|
1011
|
+
};
|
|
1012
|
+
|
|
1013
|
+
m._createVector = function _createVector(className, array = []) {
|
|
1014
|
+
const vector = m.toVector(className, array);
|
|
1015
|
+
return proxy(vector);
|
|
1016
|
+
};
|
|
1017
|
+
},
|
|
1018
|
+
|
|
1019
|
+
async onModuleReady(m, config) {
|
|
1020
|
+
const appName = config.general?.name;
|
|
1021
|
+
try {
|
|
1022
|
+
m.FS.mkdirTree(`${STATIC_PATHS.memfs}/${appName}/automounted`);
|
|
1023
|
+
} catch (e) {
|
|
1024
|
+
console.error(e);
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
if (!(isWorkerScope$1 && isBrowserSupportOPFS && config.fs?.opfs !== false && typeof m.crossbind_init_opfs === 'function')) {
|
|
1028
|
+
return;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
// crossbind_init_opfs() blocks until the OPFS root opens; if the backend is
|
|
1032
|
+
// broken, that rejection is swallowed inside the WASMFS proxy pthread and
|
|
1033
|
+
// init deadlocks with no signal. Probe the root here first instead.
|
|
1034
|
+
try {
|
|
1035
|
+
await navigator.storage.getDirectory();
|
|
1036
|
+
} catch (error) {
|
|
1037
|
+
isOpfsFunctional = false;
|
|
1038
|
+
console.error(`OPFS is present but not functional in this environment (${error}). Falling back to ${STATIC_PATHS.memfs}/.`);
|
|
1039
|
+
return;
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
m.crossbind_init_opfs();
|
|
1043
|
+
if (appName) {
|
|
1044
|
+
const appDir = `${STATIC_PATHS.opfs}/${appName}/automounted`;
|
|
1045
|
+
try {
|
|
1046
|
+
m.FS.mkdirTree(appDir);
|
|
1047
|
+
} catch (e) {
|
|
1048
|
+
console.error(e);
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
},
|
|
1052
|
+
};
|
|
1053
|
+
|
|
1054
|
+
/* global WorkerGlobalScope */
|
|
1055
|
+
|
|
1056
|
+
const isWorkerScope = typeof WorkerGlobalScope !== 'undefined'
|
|
1057
|
+
&& typeof self !== 'undefined'
|
|
1058
|
+
&& self instanceof WorkerGlobalScope;
|
|
1059
|
+
|
|
1060
|
+
// === Embind <-> Comlink Bridge ===
|
|
1061
|
+
// Worker-side registry: id -> original embind object
|
|
1062
|
+
// Main-thread registry: Comlink proxy -> id
|
|
1063
|
+
const embindRegistry = new Map();
|
|
1064
|
+
const embindProxyIds = new WeakMap();
|
|
1065
|
+
let nextEmbindId = 1;
|
|
1066
|
+
|
|
1067
|
+
function registerEmbindObject(obj) {
|
|
1068
|
+
const id = nextEmbindId++;
|
|
1069
|
+
embindRegistry.set(id, obj);
|
|
1070
|
+
return id;
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
// Reorder transfer handlers for correct priority
|
|
1074
|
+
const _proxyHandler = transferHandlers.get('proxy');
|
|
1075
|
+
const _throwHandler = transferHandlers.get('throw');
|
|
1076
|
+
transferHandlers.clear();
|
|
1077
|
+
|
|
1078
|
+
// 1. embindProxy: when a proxied embind object is sent back as an argument,
|
|
1079
|
+
// resolve it to the original object on the worker instead of creating a proxy-of-proxy
|
|
1080
|
+
transferHandlers.set('embindProxy', {
|
|
1081
|
+
canHandle(obj) {
|
|
1082
|
+
return embindProxyIds.has(obj);
|
|
1083
|
+
},
|
|
1084
|
+
serialize(obj) {
|
|
1085
|
+
return [embindProxyIds.get(obj), []];
|
|
1086
|
+
},
|
|
1087
|
+
deserialize(id) {
|
|
1088
|
+
return embindRegistry.get(id);
|
|
1089
|
+
},
|
|
1090
|
+
});
|
|
1091
|
+
|
|
1092
|
+
// 2. proxy (modified): also registers embind objects created via CONSTRUCT
|
|
1093
|
+
transferHandlers.set('proxy', {
|
|
1094
|
+
canHandle: _proxyHandler.canHandle,
|
|
1095
|
+
serialize(obj) {
|
|
1096
|
+
if (typeof obj.delete === 'function' && typeof obj.isDeleted === 'function') {
|
|
1097
|
+
// CONSTRUCT results (Comlink marks them with proxy()) are exposed through
|
|
1098
|
+
// the same coercion wrapper as method-returned objects (embindObject
|
|
1099
|
+
// handler), and the registry keeps the RAW object so arguments resolve
|
|
1100
|
+
// back to real embind identities.
|
|
1101
|
+
const raw = unwrapCoercionProxy(obj);
|
|
1102
|
+
const [port, transferables] = _proxyHandler.serialize(wrapWithVectorCoercion(raw));
|
|
1103
|
+
const id = registerEmbindObject(raw);
|
|
1104
|
+
return [{ __embindId: id, __port: port }, transferables];
|
|
1105
|
+
}
|
|
1106
|
+
return _proxyHandler.serialize(obj);
|
|
1107
|
+
},
|
|
1108
|
+
deserialize(data) {
|
|
1109
|
+
if (data != null && typeof data === 'object' && '__embindId' in data) {
|
|
1110
|
+
const proxy = _proxyHandler.deserialize(data.__port);
|
|
1111
|
+
embindProxyIds.set(proxy, data.__embindId);
|
|
1112
|
+
return proxy;
|
|
1113
|
+
}
|
|
1114
|
+
return _proxyHandler.deserialize(data);
|
|
1115
|
+
},
|
|
1116
|
+
});
|
|
1117
|
+
|
|
1118
|
+
// 3. throw (restored)
|
|
1119
|
+
transferHandlers.set('throw', _throwHandler);
|
|
1120
|
+
|
|
1121
|
+
// 4. embindVector: convert embind vectors to arrays across worker boundary
|
|
1122
|
+
transferHandlers.set('embindVector', {
|
|
1123
|
+
canHandle(obj) {
|
|
1124
|
+
return obj != null
|
|
1125
|
+
&& typeof obj === 'object'
|
|
1126
|
+
&& typeof obj.size === 'function'
|
|
1127
|
+
&& typeof obj.get === 'function'
|
|
1128
|
+
&& typeof obj.delete === 'function';
|
|
1129
|
+
},
|
|
1130
|
+
serialize(obj) {
|
|
1131
|
+
const len = obj.size();
|
|
1132
|
+
const elements = new Array(len);
|
|
1133
|
+
let hasObjects = false;
|
|
1134
|
+
for (let i = 0; i < len; i++) {
|
|
1135
|
+
const elem = obj.get(i);
|
|
1136
|
+
elements[i] = elem;
|
|
1137
|
+
if (!hasObjects && elem !== null && typeof elem === 'object') {
|
|
1138
|
+
hasObjects = true;
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
if (!hasObjects) {
|
|
1142
|
+
return [elements, []];
|
|
1143
|
+
}
|
|
1144
|
+
const transferables = [];
|
|
1145
|
+
for (let i = 0; i < len; i++) {
|
|
1146
|
+
const elem = elements[i];
|
|
1147
|
+
if (elem !== null && typeof elem === 'object') {
|
|
1148
|
+
const id = registerEmbindObject(elem);
|
|
1149
|
+
const { port1, port2 } = new MessageChannel();
|
|
1150
|
+
expose(wrapWithVectorCoercion(elem), port1);
|
|
1151
|
+
transferables.push(port2);
|
|
1152
|
+
elements[i] = { __comlinkProxy: true, __embindId: id, port: port2 };
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1155
|
+
return [elements, transferables];
|
|
1156
|
+
},
|
|
1157
|
+
deserialize(elements) {
|
|
1158
|
+
return elements.map((elem) => {
|
|
1159
|
+
if (elem && typeof elem === 'object' && elem.__comlinkProxy) {
|
|
1160
|
+
elem.port.start();
|
|
1161
|
+
const proxy = wrap(elem.port);
|
|
1162
|
+
embindProxyIds.set(proxy, elem.__embindId);
|
|
1163
|
+
return proxy;
|
|
1164
|
+
}
|
|
1165
|
+
return elem;
|
|
1166
|
+
});
|
|
1167
|
+
},
|
|
1168
|
+
});
|
|
1169
|
+
|
|
1170
|
+
// 4b. embindEnum: embind enum VALUES are class instances (not structured-cloneable) with
|
|
1171
|
+
// singleton identity per enumerator. Worker side registers each instance under an id; the
|
|
1172
|
+
// main thread gets a frozen, identity-stable token per id, and a token passed back as an
|
|
1173
|
+
// argument resolves to the original instance - so `===` survives both directions.
|
|
1174
|
+
const enumValueSet = new WeakSet();
|
|
1175
|
+
const enumInstanceIds = new WeakMap();
|
|
1176
|
+
const enumInstancesById = new Map();
|
|
1177
|
+
const enumTokensById = new Map();
|
|
1178
|
+
let nextEnumId = 1;
|
|
1179
|
+
|
|
1180
|
+
// Worker side, at module-ready: collect enum value instances. embind hangs enumerators off
|
|
1181
|
+
// the enum TYPE, which is a FUNCTION (plus a `values` meta map), so both function and
|
|
1182
|
+
// object holders are walked; a value qualifies when it is an instance (non-Object
|
|
1183
|
+
// constructor) carrying a numeric .value and no lifecycle methods - which excludes HEAP
|
|
1184
|
+
// views, FS, class statics and config bags.
|
|
1185
|
+
function registerModuleEnums(m) {
|
|
1186
|
+
for (const key of Object.keys(m)) {
|
|
1187
|
+
const holder = m[key];
|
|
1188
|
+
if (holder == null || (typeof holder !== 'object' && typeof holder !== 'function')
|
|
1189
|
+
|| ArrayBuffer.isView(holder)) continue;
|
|
1190
|
+
for (const v of Object.values(holder)) {
|
|
1191
|
+
if (v != null && typeof v === 'object'
|
|
1192
|
+
&& typeof v.value === 'number'
|
|
1193
|
+
&& typeof v.delete !== 'function'
|
|
1194
|
+
&& v.constructor && v.constructor !== Object) {
|
|
1195
|
+
enumValueSet.add(v);
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
|
|
1201
|
+
transferHandlers.set('embindEnum', {
|
|
1202
|
+
canHandle(obj) {
|
|
1203
|
+
if (obj == null || typeof obj !== 'object') return false;
|
|
1204
|
+
return enumValueSet.has(unwrapCoercionProxy(obj)) || '__embindEnumRef' in obj;
|
|
1205
|
+
},
|
|
1206
|
+
serialize(obj) {
|
|
1207
|
+
const raw = unwrapCoercionProxy(obj);
|
|
1208
|
+
if (enumValueSet.has(raw)) {
|
|
1209
|
+
let id = enumInstanceIds.get(raw);
|
|
1210
|
+
if (!id) {
|
|
1211
|
+
id = nextEnumId;
|
|
1212
|
+
nextEnumId += 1;
|
|
1213
|
+
enumInstanceIds.set(raw, id);
|
|
1214
|
+
enumInstancesById.set(id, raw);
|
|
1215
|
+
}
|
|
1216
|
+
return [{ __embindEnumRef: id, value: raw.value }, []];
|
|
1217
|
+
}
|
|
1218
|
+
return [{ __embindEnumRef: raw.__embindEnumRef, value: raw.value }, []];
|
|
1219
|
+
},
|
|
1220
|
+
deserialize(data) {
|
|
1221
|
+
const real = enumInstancesById.get(data.__embindEnumRef);
|
|
1222
|
+
if (real) return real;
|
|
1223
|
+
let token = enumTokensById.get(data.__embindEnumRef);
|
|
1224
|
+
if (!token) {
|
|
1225
|
+
token = Object.freeze({ __embindEnumRef: data.__embindEnumRef, value: data.value });
|
|
1226
|
+
enumTokensById.set(data.__embindEnumRef, token);
|
|
1227
|
+
}
|
|
1228
|
+
return token;
|
|
1229
|
+
},
|
|
1230
|
+
});
|
|
1231
|
+
|
|
1232
|
+
// 5. embindObject: proxy other embind objects (Dataset, etc.)
|
|
1233
|
+
transferHandlers.set('embindObject', {
|
|
1234
|
+
canHandle(obj) {
|
|
1235
|
+
return obj != null
|
|
1236
|
+
&& typeof obj === 'object'
|
|
1237
|
+
&& typeof obj.delete === 'function'
|
|
1238
|
+
&& typeof obj.isDeleted === 'function';
|
|
1239
|
+
},
|
|
1240
|
+
serialize(obj) {
|
|
1241
|
+
const id = registerEmbindObject(obj);
|
|
1242
|
+
const { port1, port2 } = new MessageChannel();
|
|
1243
|
+
expose(wrapWithVectorCoercion(obj), port1);
|
|
1244
|
+
return [{ __embindId: id, port: port2 }, [port2]];
|
|
1245
|
+
},
|
|
1246
|
+
deserialize(data) {
|
|
1247
|
+
data.port.start();
|
|
1248
|
+
const proxy = wrap(data.port);
|
|
1249
|
+
embindProxyIds.set(proxy, data.__embindId);
|
|
1250
|
+
return proxy;
|
|
1251
|
+
},
|
|
1252
|
+
});
|
|
1253
|
+
|
|
1254
|
+
// 6. embindProxyArray: a plain JS array that contains proxied embind objects
|
|
1255
|
+
// can't be structured-cloned across the
|
|
1256
|
+
// worker boundary, because the element proxies are functions. Resolve each
|
|
1257
|
+
// registered proxy element back to its worker-side original, the same way the
|
|
1258
|
+
// embindProxy handler does for a single argument.
|
|
1259
|
+
transferHandlers.set('embindProxyArray', {
|
|
1260
|
+
canHandle(obj) {
|
|
1261
|
+
return Array.isArray(obj) && obj.some((e) => embindProxyIds.has(e));
|
|
1262
|
+
},
|
|
1263
|
+
serialize(arr) {
|
|
1264
|
+
return [
|
|
1265
|
+
arr.map((e) => (embindProxyIds.has(e) ? { __embindRef: embindProxyIds.get(e) } : e)),
|
|
1266
|
+
[],
|
|
1267
|
+
];
|
|
1268
|
+
},
|
|
1269
|
+
deserialize(arr) {
|
|
1270
|
+
return arr.map((e) => (e != null && typeof e === 'object' && '__embindRef' in e
|
|
1271
|
+
? embindRegistry.get(e.__embindRef)
|
|
1272
|
+
: e));
|
|
1273
|
+
},
|
|
1274
|
+
});
|
|
1275
|
+
|
|
1276
|
+
let _worker = null;
|
|
1277
|
+
|
|
1278
|
+
function resolveScriptUrl(config) {
|
|
1279
|
+
const fileName = config.paths.js || config.paths.worker;
|
|
1280
|
+
let prefix = '';
|
|
1281
|
+
if (config.path) {
|
|
1282
|
+
prefix = config.path;
|
|
1283
|
+
if (prefix.slice(-1) !== '/') prefix += '/';
|
|
1284
|
+
}
|
|
1285
|
+
let output = prefix + fileName;
|
|
1286
|
+
if (output.substring(0, 4) !== 'http' && output[0] !== '/') output = `/${output}`;
|
|
1287
|
+
return output;
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
function exposeWorker(systemConfig, createModule) {
|
|
1291
|
+
const workerApi = {
|
|
1292
|
+
async init(userConfig = {}) {
|
|
1293
|
+
const config = mergeDeep(systemConfig, userConfig);
|
|
1294
|
+
const m = await createModule(config);
|
|
1295
|
+
setCoercionModule(m);
|
|
1296
|
+
// Decode on the worker side: a real Error (with the C++ message) survives the
|
|
1297
|
+
// comlink throw handler, a raw WebAssembly.Exception does not.
|
|
1298
|
+
patchModuleForExceptionDecode(m);
|
|
1299
|
+
registerModuleEnums(m);
|
|
1300
|
+
return proxy(wrapWithVectorCoercion(m));
|
|
1301
|
+
},
|
|
1302
|
+
};
|
|
1303
|
+
expose(workerApi);
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
async function initWithWorker(config, userConfig) {
|
|
1307
|
+
const scriptUrl = config.workerUrl || resolveScriptUrl(config);
|
|
1308
|
+
_worker = new Worker(scriptUrl);
|
|
1309
|
+
const workerApi = wrap(_worker);
|
|
1310
|
+
|
|
1311
|
+
const {
|
|
1312
|
+
logHandler, errorHandler, onRuntimeInitialized, getWasmFunction, useWorker, workerUrl,
|
|
1313
|
+
...serializableConfig
|
|
1314
|
+
} = userConfig;
|
|
1315
|
+
const module = await workerApi.init(serializableConfig);
|
|
1316
|
+
|
|
1317
|
+
return new Proxy(module, {
|
|
1318
|
+
get(target, prop) {
|
|
1319
|
+
if (prop === 'toArray') {
|
|
1320
|
+
return function toArray(vector) {
|
|
1321
|
+
if (Array.isArray(vector)) return vector;
|
|
1322
|
+
return target.toArray(vector);
|
|
1323
|
+
};
|
|
1324
|
+
}
|
|
1325
|
+
if (prop === 'toVector') {
|
|
1326
|
+
return function toVector(classOrName, array = []) {
|
|
1327
|
+
if (typeof classOrName === 'string') {
|
|
1328
|
+
return target._createVector(classOrName, array);
|
|
1329
|
+
}
|
|
1330
|
+
return target.toVector(classOrName, array);
|
|
1331
|
+
};
|
|
1332
|
+
}
|
|
1333
|
+
return target[prop];
|
|
1334
|
+
},
|
|
1335
|
+
});
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
function terminate() {
|
|
1339
|
+
if (_worker) {
|
|
1340
|
+
_worker.terminate();
|
|
1341
|
+
_worker = null;
|
|
1342
|
+
}
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
var workerComlink = {
|
|
1346
|
+
isWorkerScope,
|
|
1347
|
+
exposeWorker,
|
|
1348
|
+
initWithWorker,
|
|
1349
|
+
terminate,
|
|
1350
|
+
};
|
|
1351
|
+
|
|
1352
|
+
const adapter = composeAdapters([urlPath, browserFs]);
|
|
1353
|
+
|
|
1354
|
+
var browser = createInitCrossbind({
|
|
1355
|
+
Module,
|
|
1356
|
+
systemConfig,
|
|
1357
|
+
adapter,
|
|
1358
|
+
worker: workerComlink,
|
|
1359
|
+
});
|
|
1360
|
+
|
|
1361
|
+
return browser;
|
|
1362
|
+
|
|
1363
|
+
}));
|