UNPKG

mosfez-synth

Version:

A microtonal-aware synth engine library for web.

1 lines 838 kB
{"version":3,"file":"offline-render-synth-inner.stringify.mjs","sources":["../src/internal/param-utils.ts","../src/dsp-node.ts","../bundled-deps/mosfez-faust/faust.js","../src/internal/voice-allocator.ts","../src/internal/voice-controller.ts","../src/internal/deserialize-in-iframe.ts","../src/internal/faust-dsp-utils.ts","../src/internal/construct-node-faust.ts","../src/internal/construct-node-poly.ts","../src/internal/construct-node.ts","../src/synth.ts","../src/offline-render-synth-inner.stringify.ts"],"sourcesContent":["import { ParamValueObject } from \"../params\";\nimport { ParamDefinitionObject, ParamDefinition } from \"../dsp-node\";\n\nexport function validateParamDefinition(\n name: string,\n paramDef: ParamDefinition\n): ParamDefinition {\n if (!isConstant(paramDef) && !isVariable(paramDef)) {\n throw new Error(\n `param \"${name}\" must be a constant number or a string referring to a param name, but got ${paramDef}`\n );\n }\n return paramDef;\n}\n\nexport function validateParamDefinitionObject(\n paramDefs: ParamDefinitionObject\n): ParamDefinitionObject {\n for (const name in paramDefs) {\n validateParamDefinition(name, paramDefs[name] as ParamDefinition);\n }\n return paramDefs;\n}\n\nexport function isConstant(paramDef: ParamDefinition): paramDef is number {\n return typeof paramDef === \"number\";\n}\n\nexport function isVariable(paramDef: ParamDefinition): paramDef is string {\n return typeof paramDef === \"string\";\n}\n\nexport function resolveParam(\n params: Partial<ParamValueObject>,\n paramDef: ParamDefinition\n): number | undefined {\n if (isConstant(paramDef)) {\n return paramDef;\n } else if (isVariable(paramDef)) {\n return params[paramDef] as number;\n }\n return undefined;\n}\n","import type { compile } from \"mosfez-faust/faust\";\nimport type { VoiceController } from \"./internal/voice-controller\";\nimport {\n validateParamDefinitionObject,\n validateParamDefinition,\n} from \"./internal/param-utils\";\n\nexport type ParamDefinition = number | string;\n\nexport type ParamDefinitionObject = Record<string, ParamDefinition>;\n\nexport type DspNodeType = \"faust\" | \"poly\";\n\nexport type DspNodeSerialized = DspNodeFaustSerialized | DspNodePolySerialized;\n\nexport type DspNodeConfig = {\n type: DspNodeType;\n};\n\nexport class DspNode {\n type: DspNodeType;\n\n constructor(config: DspNodeConfig) {\n this.type = config.type;\n }\n\n static isFaustDspNode(DspNode: DspNode): DspNode is DspNodeFaust {\n return DspNode.type === \"faust\";\n }\n\n static isPolyDspNode(DspNode: DspNode): DspNode is DspNodePoly {\n return DspNode.type === \"poly\";\n }\n\n static isFaustDspNodeSerialized(\n serialized: DspNodeSerialized\n ): serialized is DspNodeFaustSerialized {\n return serialized.type === \"faust\";\n }\n\n static isPolyDspNodeSerialized(\n serialized: DspNodeSerialized\n ): serialized is DspNodePolySerialized {\n return serialized.type === \"poly\";\n }\n\n serialize(): DspNodeSerialized {\n throw new Error(\".serialize() can only be called on subclasses\");\n }\n}\n\n//\n// faust\n//\n\nexport type DspNodeFaustDependencies = {\n compile: typeof compile;\n};\n\nexport type DspNodeFaustConfig = {\n dsp: string;\n inputs?: DspNode[];\n paramDefs: ParamDefinitionObject;\n dependencies: DspNodeFaustDependencies;\n};\n\nexport type DspNodeFaustSerialized = {\n type: \"faust\";\n dsp: string;\n inputs: DspNodeSerialized[];\n paramDefs: ParamDefinitionObject;\n};\n\nexport class DspNodeFaust extends DspNode {\n dsp: string;\n inputs: DspNode[];\n paramDefs: ParamDefinitionObject;\n dependencies: DspNodeFaustDependencies;\n\n constructor(config: DspNodeFaustConfig) {\n super({\n type: \"faust\",\n });\n\n this.dsp = config.dsp;\n this.inputs = config.inputs ?? [];\n this.paramDefs = validateParamDefinitionObject(config.paramDefs);\n this.dependencies = config.dependencies;\n }\n\n serialize(): DspNodeFaustSerialized {\n const { dsp, paramDefs } = this;\n const inputs = this.inputs.map((input) => input.serialize());\n\n return {\n type: \"faust\",\n dsp,\n inputs,\n paramDefs,\n };\n }\n}\n\n//\n// poly\n//\n\nexport type DspNodePolyDependencies = {\n VoiceController: typeof VoiceController;\n};\n\nexport type DspNodePolyConfig = {\n input: DspNode;\n polyphony: number;\n paramCacheSize?: number;\n release: ParamDefinition;\n gate: ParamDefinition;\n dependencies: DspNodePolyDependencies;\n};\n\nexport type DspNodePolySerialized = {\n type: \"poly\";\n input: DspNodeSerialized;\n polyphony: number;\n paramCacheSize?: number;\n release: ParamDefinition;\n gate: ParamDefinition;\n};\n\nexport class DspNodePoly extends DspNode {\n input: DspNode;\n polyphony: number;\n paramCacheSize?: number;\n release: ParamDefinition;\n gate: ParamDefinition;\n dependencies: DspNodePolyDependencies;\n\n constructor(config: DspNodePolyConfig) {\n super({\n type: \"poly\",\n });\n\n this.input = config.input;\n this.polyphony = config.polyphony;\n this.paramCacheSize = config.paramCacheSize;\n this.release = validateParamDefinition(\"release\", config.release);\n this.gate = validateParamDefinition(\"gate\", config.gate);\n this.dependencies = config.dependencies;\n }\n\n serialize(): DspNodePolySerialized {\n const { polyphony, paramCacheSize, release, gate } = this;\n const input = this.input.serialize();\n\n return {\n type: \"poly\",\n input,\n polyphony,\n paramCacheSize,\n release,\n gate,\n };\n }\n}\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar FaustModule = function() {\n var _scriptDir = typeof document !== \"undefined\" && document.currentScript ? document.currentScript.src : void 0;\n if (typeof __filename !== \"undefined\")\n _scriptDir = _scriptDir || __filename;\n return function(FaustModule2) {\n FaustModule2 = FaustModule2 || {};\n var Module = typeof FaustModule2 !== \"undefined\" ? FaustModule2 : {};\n if (!Module.expectedDataFileDownloads) {\n Module.expectedDataFileDownloads = 0;\n Module.finishedDataFileDownloads = 0;\n }\n Module.expectedDataFileDownloads++;\n (function() {\n var loadPackage = function(metadata) {\n if (typeof window === \"object\") {\n window[\"encodeURIComponent\"](window.location.pathname.toString().substring(0, window.location.pathname.toString().lastIndexOf(\"/\")) + \"/\");\n } else if (typeof location !== \"undefined\") {\n encodeURIComponent(location.pathname.toString().substring(0, location.pathname.toString().lastIndexOf(\"/\")) + \"/\");\n } else {\n throw \"using preloaded data can only be done on a web page or in a web worker\";\n }\n var PACKAGE_NAME = \"../../lib/libfaust-wasm.data\";\n var REMOTE_PACKAGE_BASE = \"libfaust-wasm.data\";\n if (typeof Module[\"locateFilePackage\"] === \"function\" && !Module[\"locateFile\"]) {\n Module[\"locateFile\"] = Module[\"locateFilePackage\"];\n err(\"warning: you defined Module.locateFilePackage, that has been renamed to Module.locateFile (using your locateFilePackage for now)\");\n }\n var REMOTE_PACKAGE_NAME = Module[\"locateFile\"] ? Module[\"locateFile\"](REMOTE_PACKAGE_BASE, \"\") : REMOTE_PACKAGE_BASE;\n var REMOTE_PACKAGE_SIZE = metadata[\"remote_package_size\"];\n metadata[\"package_uuid\"];\n function fetchRemotePackage(packageName, packageSize, callback, errback) {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", packageName, true);\n xhr.responseType = \"arraybuffer\";\n xhr.onprogress = function(event) {\n var url = packageName;\n var size = packageSize;\n if (event.total)\n size = event.total;\n if (event.loaded) {\n if (!xhr.addedTotal) {\n xhr.addedTotal = true;\n if (!Module.dataFileDownloads)\n Module.dataFileDownloads = {};\n Module.dataFileDownloads[url] = {\n loaded: event.loaded,\n total: size\n };\n } else {\n Module.dataFileDownloads[url].loaded = event.loaded;\n }\n var total = 0;\n var loaded = 0;\n var num = 0;\n for (var download in Module.dataFileDownloads) {\n var data = Module.dataFileDownloads[download];\n total += data.total;\n loaded += data.loaded;\n num++;\n }\n total = Math.ceil(total * Module.expectedDataFileDownloads / num);\n if (Module[\"setStatus\"])\n Module[\"setStatus\"](\"Downloading data... (\" + loaded + \"/\" + total + \")\");\n } else if (!Module.dataFileDownloads) {\n if (Module[\"setStatus\"])\n Module[\"setStatus\"](\"Downloading data...\");\n }\n };\n xhr.onerror = function(event) {\n throw new Error(\"NetworkError for: \" + packageName);\n };\n xhr.onload = function(event) {\n if (xhr.status == 200 || xhr.status == 304 || xhr.status == 206 || xhr.status == 0 && xhr.response) {\n var packageData = xhr.response;\n callback(packageData);\n } else {\n throw new Error(xhr.statusText + \" : \" + xhr.responseURL);\n }\n };\n xhr.send(null);\n }\n var fetchedCallback = null;\n var fetched = Module[\"getPreloadedPackage\"] ? Module[\"getPreloadedPackage\"](REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE) : null;\n if (!fetched)\n fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE, function(data) {\n if (fetchedCallback) {\n fetchedCallback(data);\n fetchedCallback = null;\n } else {\n fetched = data;\n }\n });\n function runWithFS() {\n function assert2(check, msg) {\n if (!check)\n throw msg + new Error().stack;\n }\n Module[\"FS_createPath\"](\"/\", \"libraries\", true, true);\n function DataRequest(start, end, audio) {\n this.start = start;\n this.end = end;\n this.audio = audio;\n }\n DataRequest.prototype = {\n requests: {},\n open: function(mode, name) {\n this.name = name;\n this.requests[name] = this;\n Module[\"addRunDependency\"](\"fp \" + this.name);\n },\n send: function() {\n },\n onload: function() {\n var byteArray = this.byteArray.subarray(this.start, this.end);\n this.finish(byteArray);\n },\n finish: function(byteArray) {\n var that = this;\n Module[\"FS_createDataFile\"](this.name, null, byteArray, true, true, true);\n Module[\"removeRunDependency\"](\"fp \" + that.name);\n this.requests[this.name] = null;\n }\n };\n var files = metadata[\"files\"];\n for (var i = 0; i < files.length; ++i) {\n new DataRequest(files[i][\"start\"], files[i][\"end\"], files[i][\"audio\"]).open(\"GET\", files[i][\"filename\"]);\n }\n function processPackageData(arrayBuffer) {\n Module.finishedDataFileDownloads++;\n assert2(arrayBuffer, \"Loading data file failed.\");\n assert2(arrayBuffer instanceof ArrayBuffer, \"bad input to processPackageData\");\n var byteArray = new Uint8Array(arrayBuffer);\n DataRequest.prototype.byteArray = byteArray;\n var files2 = metadata[\"files\"];\n for (var i2 = 0; i2 < files2.length; ++i2) {\n DataRequest.prototype.requests[files2[i2].filename].onload();\n }\n Module[\"removeRunDependency\"](\"datafile_../../lib/libfaust-wasm.data\");\n }\n Module[\"addRunDependency\"](\"datafile_../../lib/libfaust-wasm.data\");\n if (!Module.preloadResults)\n Module.preloadResults = {};\n Module.preloadResults[PACKAGE_NAME] = { fromCache: false };\n if (fetched) {\n processPackageData(fetched);\n fetched = null;\n } else {\n fetchedCallback = processPackageData;\n }\n }\n if (Module[\"calledRun\"]) {\n runWithFS();\n } else {\n if (!Module[\"preRun\"])\n Module[\"preRun\"] = [];\n Module[\"preRun\"].push(runWithFS);\n }\n };\n loadPackage({\n files: [\n { filename: \"/libraries/hoa.lib\", start: 0, end: 13105, audio: 0 },\n {\n filename: \"/libraries/compressors.lib\",\n start: 13105,\n end: 58859,\n audio: 0\n },\n {\n filename: \"/libraries/basics.lib\",\n start: 58859,\n end: 110385,\n audio: 0\n },\n {\n filename: \"/libraries/dx7.lib\",\n start: 110385,\n end: 179488,\n audio: 0\n },\n {\n filename: \"/libraries/analyzers.lib\",\n start: 179488,\n end: 212357,\n audio: 0\n },\n {\n filename: \"/libraries/spats.lib\",\n start: 212357,\n end: 217531,\n audio: 0\n },\n {\n filename: \"/libraries/envelopes.lib\",\n start: 217531,\n end: 228127,\n audio: 0\n },\n {\n filename: \"/libraries/oscillators.lib\",\n start: 228127,\n end: 275738,\n audio: 0\n },\n {\n filename: \"/libraries/mi.lib\",\n start: 275738,\n end: 293026,\n audio: 0\n },\n {\n filename: \"/libraries/misceffects.lib\",\n start: 293026,\n end: 314755,\n audio: 0\n },\n {\n filename: \"/libraries/version.lib\",\n start: 314755,\n end: 315662,\n audio: 0\n },\n {\n filename: \"/libraries/webaudio.lib\",\n start: 315662,\n end: 327785,\n audio: 0\n },\n {\n filename: \"/libraries/math.lib\",\n start: 327785,\n end: 349263,\n audio: 0\n },\n {\n filename: \"/libraries/stdfaust.lib\",\n start: 349263,\n end: 350533,\n audio: 0\n },\n {\n filename: \"/libraries/filter.lib\",\n start: 350533,\n end: 415919,\n audio: 0\n },\n {\n filename: \"/libraries/delays.lib\",\n start: 415919,\n end: 430403,\n audio: 0\n },\n {\n filename: \"/libraries/routes.lib\",\n start: 430403,\n end: 437029,\n audio: 0\n },\n {\n filename: \"/libraries/soundfiles.lib\",\n start: 437029,\n end: 446390,\n audio: 0\n },\n {\n filename: \"/libraries/tonestacks.lib\",\n start: 446390,\n end: 458744,\n audio: 0\n },\n {\n filename: \"/libraries/aanl.lib\",\n start: 458744,\n end: 484841,\n audio: 0\n },\n {\n filename: \"/libraries/wdmodels.lib\",\n start: 484841,\n end: 574662,\n audio: 0\n },\n {\n filename: \"/libraries/all.lib\",\n start: 574662,\n end: 575678,\n audio: 0\n },\n {\n filename: \"/libraries/music.lib\",\n start: 575678,\n end: 594112,\n audio: 0\n },\n {\n filename: \"/libraries/tubes.lib\",\n start: 594112,\n end: 943901,\n audio: 0\n },\n {\n filename: \"/libraries/effect.lib\",\n start: 943901,\n end: 1012931,\n audio: 0\n },\n {\n filename: \"/libraries/vaeffects.lib\",\n start: 1012931,\n end: 1048800,\n audio: 0\n },\n {\n filename: \"/libraries/maxmsp.lib\",\n start: 1048800,\n end: 1056659,\n audio: 0\n },\n {\n filename: \"/libraries/platform.lib\",\n start: 1056659,\n end: 1059739,\n audio: 0\n },\n {\n filename: \"/libraries/synths.lib\",\n start: 1059739,\n end: 1070990,\n audio: 0\n },\n {\n filename: \"/libraries/sf.lib\",\n start: 1070990,\n end: 1072056,\n audio: 0\n },\n {\n filename: \"/libraries/fds.lib\",\n start: 1072056,\n end: 1092602,\n audio: 0\n },\n {\n filename: \"/libraries/reducemaps.lib\",\n start: 1092602,\n end: 1097438,\n audio: 0\n },\n {\n filename: \"/libraries/phaflangers.lib\",\n start: 1097438,\n end: 1107359,\n audio: 0\n },\n {\n filename: \"/libraries/filters.lib\",\n start: 1107359,\n end: 1212987,\n audio: 0\n },\n {\n filename: \"/libraries/signals.lib\",\n start: 1212987,\n end: 1224932,\n audio: 0\n },\n {\n filename: \"/libraries/instruments.lib\",\n start: 1224932,\n end: 1234327,\n audio: 0\n },\n {\n filename: \"/libraries/quantizers.lib\",\n start: 1234327,\n end: 1244180,\n audio: 0\n },\n {\n filename: \"/libraries/noises.lib\",\n start: 1244180,\n end: 1258842,\n audio: 0\n },\n {\n filename: \"/libraries/oscillator.lib\",\n start: 1258842,\n end: 1278693,\n audio: 0\n },\n {\n filename: \"/libraries/interpolators.lib\",\n start: 1278693,\n end: 1301737,\n audio: 0\n },\n {\n filename: \"/libraries/demos.lib\",\n start: 1301737,\n end: 1364872,\n audio: 0\n },\n {\n filename: \"/libraries/reverbs.lib\",\n start: 1364872,\n end: 1402697,\n audio: 0\n },\n {\n filename: \"/libraries/physmodels.lib\",\n start: 1402697,\n end: 1573680,\n audio: 0\n },\n {\n filename: \"/libraries/maths.lib\",\n start: 1573680,\n end: 1595081,\n audio: 0\n }\n ],\n remote_package_size: 1595081,\n package_uuid: \"04ea3dc2-3649-4af3-b126-173b06afc41a\"\n });\n })();\n var moduleOverrides = {};\n var key;\n for (key in Module) {\n if (Module.hasOwnProperty(key)) {\n moduleOverrides[key] = Module[key];\n }\n }\n var thisProgram = \"./this.program\";\n var ENVIRONMENT_IS_WEB = false;\n var ENVIRONMENT_IS_WORKER = false;\n var ENVIRONMENT_IS_NODE = false;\n var ENVIRONMENT_IS_SHELL = false;\n ENVIRONMENT_IS_WEB = typeof window === \"object\";\n ENVIRONMENT_IS_WORKER = typeof importScripts === \"function\";\n ENVIRONMENT_IS_NODE = typeof process === \"object\" && typeof process.versions === \"object\" && typeof process.versions.node === \"string\";\n ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\n if (Module[\"ENVIRONMENT\"]) {\n throw new Error(\"Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)\");\n }\n var scriptDirectory = \"\";\n function locateFile(path) {\n if (Module[\"locateFile\"]) {\n return Module[\"locateFile\"](path, scriptDirectory);\n }\n return scriptDirectory + path;\n }\n var read_, readBinary;\n var nodeFS;\n var nodePath;\n if (ENVIRONMENT_IS_NODE) {\n if (ENVIRONMENT_IS_WORKER) {\n scriptDirectory = require(\"path\").dirname(scriptDirectory) + \"/\";\n } else {\n scriptDirectory = __dirname + \"/\";\n }\n read_ = function shell_read(filename, binary) {\n if (!nodeFS)\n nodeFS = require(\"fs\");\n if (!nodePath)\n nodePath = require(\"path\");\n filename = nodePath[\"normalize\"](filename);\n return nodeFS[\"readFileSync\"](filename, binary ? null : \"utf8\");\n };\n readBinary = function readBinary2(filename) {\n var ret = read_(filename, true);\n if (!ret.buffer) {\n ret = new Uint8Array(ret);\n }\n assert(ret.buffer);\n return ret;\n };\n if (process[\"argv\"].length > 1) {\n thisProgram = process[\"argv\"][1].replace(/\\\\/g, \"/\");\n }\n process[\"argv\"].slice(2);\n process[\"on\"](\"uncaughtException\", function(ex) {\n if (!(ex instanceof ExitStatus)) {\n throw ex;\n }\n });\n process[\"on\"](\"unhandledRejection\", abort);\n Module[\"inspect\"] = function() {\n return \"[Emscripten Module object]\";\n };\n } else if (ENVIRONMENT_IS_SHELL) {\n if (typeof read != \"undefined\") {\n read_ = function shell_read(f) {\n return read(f);\n };\n }\n readBinary = function readBinary2(f) {\n var data;\n if (typeof readbuffer === \"function\") {\n return new Uint8Array(readbuffer(f));\n }\n data = read(f, \"binary\");\n assert(typeof data === \"object\");\n return data;\n };\n if (typeof scriptArgs != \"undefined\") {\n scriptArgs;\n }\n if (typeof print !== \"undefined\") {\n if (typeof console === \"undefined\")\n console = {};\n console.log = print;\n console.warn = console.error = typeof printErr !== \"undefined\" ? printErr : print;\n }\n } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n if (ENVIRONMENT_IS_WORKER) {\n scriptDirectory = self.location.href;\n } else if (document.currentScript) {\n scriptDirectory = document.currentScript.src;\n }\n if (_scriptDir) {\n scriptDirectory = _scriptDir;\n }\n if (scriptDirectory.indexOf(\"blob:\") !== 0) {\n scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf(\"/\") + 1);\n } else {\n scriptDirectory = \"\";\n }\n {\n read_ = function shell_read(url) {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", url, false);\n xhr.send(null);\n return xhr.responseText;\n };\n if (ENVIRONMENT_IS_WORKER) {\n readBinary = function readBinary2(url) {\n var xhr = new XMLHttpRequest();\n xhr.open(\"GET\", url, false);\n xhr.responseType = \"arraybuffer\";\n xhr.send(null);\n return new Uint8Array(xhr.response);\n };\n }\n }\n } else {\n throw new Error(\"environment detection error\");\n }\n var out = Module[\"print\"] || console.log.bind(console);\n var err = Module[\"printErr\"] || console.warn.bind(console);\n for (key in moduleOverrides) {\n if (moduleOverrides.hasOwnProperty(key)) {\n Module[key] = moduleOverrides[key];\n }\n }\n moduleOverrides = null;\n if (Module[\"arguments\"])\n Module[\"arguments\"];\n if (!Object.getOwnPropertyDescriptor(Module, \"arguments\"))\n Object.defineProperty(Module, \"arguments\", {\n configurable: true,\n get: function() {\n abort(\"Module.arguments has been replaced with plain arguments_\");\n }\n });\n if (Module[\"thisProgram\"])\n thisProgram = Module[\"thisProgram\"];\n if (!Object.getOwnPropertyDescriptor(Module, \"thisProgram\"))\n Object.defineProperty(Module, \"thisProgram\", {\n configurable: true,\n get: function() {\n abort(\"Module.thisProgram has been replaced with plain thisProgram\");\n }\n });\n if (Module[\"quit\"])\n Module[\"quit\"];\n if (!Object.getOwnPropertyDescriptor(Module, \"quit\"))\n Object.defineProperty(Module, \"quit\", {\n configurable: true,\n get: function() {\n abort(\"Module.quit has been replaced with plain quit_\");\n }\n });\n assert(typeof Module[\"memoryInitializerPrefixURL\"] === \"undefined\", \"Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead\");\n assert(typeof Module[\"pthreadMainPrefixURL\"] === \"undefined\", \"Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead\");\n assert(typeof Module[\"cdInitializerPrefixURL\"] === \"undefined\", \"Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead\");\n assert(typeof Module[\"filePackagePrefixURL\"] === \"undefined\", \"Module.filePackagePrefixURL option was removed, use Module.locateFile instead\");\n assert(typeof Module[\"read\"] === \"undefined\", \"Module.read option was removed (modify read_ in JS)\");\n assert(typeof Module[\"readAsync\"] === \"undefined\", \"Module.readAsync option was removed (modify readAsync in JS)\");\n assert(typeof Module[\"readBinary\"] === \"undefined\", \"Module.readBinary option was removed (modify readBinary in JS)\");\n assert(typeof Module[\"setWindowTitle\"] === \"undefined\", \"Module.setWindowTitle option was removed (modify setWindowTitle in JS)\");\n assert(typeof Module[\"TOTAL_MEMORY\"] === \"undefined\", \"Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY\");\n if (!Object.getOwnPropertyDescriptor(Module, \"read\"))\n Object.defineProperty(Module, \"read\", {\n configurable: true,\n get: function() {\n abort(\"Module.read has been replaced with plain read_\");\n }\n });\n if (!Object.getOwnPropertyDescriptor(Module, \"readAsync\"))\n Object.defineProperty(Module, \"readAsync\", {\n configurable: true,\n get: function() {\n abort(\"Module.readAsync has been replaced with plain readAsync\");\n }\n });\n if (!Object.getOwnPropertyDescriptor(Module, \"readBinary\"))\n Object.defineProperty(Module, \"readBinary\", {\n configurable: true,\n get: function() {\n abort(\"Module.readBinary has been replaced with plain readBinary\");\n }\n });\n var stackSave;\n var stackRestore;\n var stackAlloc;\n stackSave = stackRestore = stackAlloc = function() {\n abort(\"cannot use the stack before compiled code is ready to run, and has provided stack access\");\n };\n function dynamicAlloc(size) {\n assert(DYNAMICTOP_PTR);\n var ret = HEAP32[DYNAMICTOP_PTR >> 2];\n var end = ret + size + 15 & -16;\n assert(end <= HEAP8.length, \"failure to dynamicAlloc - memory growth etc. is not supported there, call malloc/sbrk directly\");\n HEAP32[DYNAMICTOP_PTR >> 2] = end;\n return ret;\n }\n function getNativeTypeSize(type) {\n switch (type) {\n case \"i1\":\n case \"i8\":\n return 1;\n case \"i16\":\n return 2;\n case \"i32\":\n return 4;\n case \"i64\":\n return 8;\n case \"float\":\n return 4;\n case \"double\":\n return 8;\n default: {\n if (type[type.length - 1] === \"*\") {\n return 4;\n } else if (type[0] === \"i\") {\n var bits = Number(type.substr(1));\n assert(bits % 8 === 0, \"getNativeTypeSize invalid bits \" + bits + \", type \" + type);\n return bits / 8;\n } else {\n return 0;\n }\n }\n }\n }\n function warnOnce(text) {\n if (!warnOnce.shown)\n warnOnce.shown = {};\n if (!warnOnce.shown[text]) {\n warnOnce.shown[text] = 1;\n err(text);\n }\n }\n var wasmBinary;\n if (Module[\"wasmBinary\"])\n wasmBinary = Module[\"wasmBinary\"];\n if (!Object.getOwnPropertyDescriptor(Module, \"wasmBinary\"))\n Object.defineProperty(Module, \"wasmBinary\", {\n configurable: true,\n get: function() {\n abort(\"Module.wasmBinary has been replaced with plain wasmBinary\");\n }\n });\n if (Module[\"noExitRuntime\"])\n Module[\"noExitRuntime\"];\n if (!Object.getOwnPropertyDescriptor(Module, \"noExitRuntime\"))\n Object.defineProperty(Module, \"noExitRuntime\", {\n configurable: true,\n get: function() {\n abort(\"Module.noExitRuntime has been replaced with plain noExitRuntime\");\n }\n });\n if (typeof WebAssembly !== \"object\") {\n abort(\"No WebAssembly support found. Build with -s WASM=0 to target JavaScript instead.\");\n }\n function setValue(ptr, value, type, noSafe) {\n type = type || \"i8\";\n if (type.charAt(type.length - 1) === \"*\")\n type = \"i32\";\n switch (type) {\n case \"i1\":\n HEAP8[ptr >> 0] = value;\n break;\n case \"i8\":\n HEAP8[ptr >> 0] = value;\n break;\n case \"i16\":\n HEAP16[ptr >> 1] = value;\n break;\n case \"i32\":\n HEAP32[ptr >> 2] = value;\n break;\n case \"i64\":\n tempI64 = [\n value >>> 0,\n (tempDouble = value, +Math_abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math_min(+Math_floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)\n ], HEAP32[ptr >> 2] = tempI64[0], HEAP32[ptr + 4 >> 2] = tempI64[1];\n break;\n case \"float\":\n HEAPF32[ptr >> 2] = value;\n break;\n case \"double\":\n HEAPF64[ptr >> 3] = value;\n break;\n default:\n abort(\"invalid type for setValue: \" + type);\n }\n }\n var wasmMemory;\n var wasmTable = new WebAssembly.Table({\n initial: 2176,\n maximum: 2176 + 0,\n element: \"anyfunc\"\n });\n var ABORT = false;\n function assert(condition, text) {\n if (!condition) {\n abort(\"Assertion failed: \" + text);\n }\n }\n function getCFunc(ident) {\n var func = Module[\"_\" + ident];\n assert(func, \"Cannot call unknown function \" + ident + \", make sure it is exported\");\n return func;\n }\n function ccall(ident, returnType, argTypes, args, opts) {\n var toC = {\n string: function(str) {\n var ret2 = 0;\n if (str !== null && str !== void 0 && str !== 0) {\n var len = (str.length << 2) + 1;\n ret2 = stackAlloc(len);\n stringToUTF8(str, ret2, len);\n }\n return ret2;\n },\n array: function(arr) {\n var ret2 = stackAlloc(arr.length);\n writeArrayToMemory(arr, ret2);\n return ret2;\n }\n };\n function convertReturnValue(ret2) {\n if (returnType === \"string\")\n return UTF8ToString(ret2);\n if (returnType === \"boolean\")\n return Boolean(ret2);\n return ret2;\n }\n var func = getCFunc(ident);\n var cArgs = [];\n var stack = 0;\n assert(returnType !== \"array\", 'Return type should not be \"array\".');\n if (args) {\n for (var i = 0; i < args.length; i++) {\n var converter = toC[argTypes[i]];\n if (converter) {\n if (stack === 0)\n stack = stackSave();\n cArgs[i] = converter(args[i]);\n } else {\n cArgs[i] = args[i];\n }\n }\n }\n var ret = func.apply(null, cArgs);\n ret = convertReturnValue(ret);\n if (stack !== 0)\n stackRestore(stack);\n return ret;\n }\n function cwrap(ident, returnType, argTypes, opts) {\n return function() {\n return ccall(ident, returnType, argTypes, arguments);\n };\n }\n var ALLOC_STACK = 1;\n var ALLOC_NONE = 3;\n function allocate(slab, types, allocator, ptr) {\n var zeroinit, size;\n if (typeof slab === \"number\") {\n zeroinit = true;\n size = slab;\n } else {\n zeroinit = false;\n size = slab.length;\n }\n var singleType = typeof types === \"string\" ? types : null;\n var ret;\n if (allocator == ALLOC_NONE) {\n ret = ptr;\n } else {\n ret = [_malloc, stackAlloc, dynamicAlloc][allocator](Math.max(size, singleType ? 1 : types.length));\n }\n if (zeroinit) {\n var stop;\n ptr = ret;\n assert((ret & 3) == 0);\n stop = ret + (size & ~3);\n for (; ptr < stop; ptr += 4) {\n HEAP32[ptr >> 2] = 0;\n }\n stop = ret + size;\n while (ptr < stop) {\n HEAP8[ptr++ >> 0] = 0;\n }\n return ret;\n }\n if (singleType === \"i8\") {\n if (slab.subarray || slab.slice) {\n HEAPU8.set(slab, ret);\n } else {\n HEAPU8.set(new Uint8Array(slab), ret);\n }\n return ret;\n }\n var i = 0, type, typeSize, previousType;\n while (i < size) {\n var curr = slab[i];\n type = singleType || types[i];\n if (type === 0) {\n i++;\n continue;\n }\n assert(type, \"Must know what type to store in allocate!\");\n if (type == \"i64\")\n type = \"i32\";\n setValue(ret + i, curr, type);\n if (previousType !== type) {\n typeSize = getNativeTypeSize(type);\n previousType = type;\n }\n i += typeSize;\n }\n return ret;\n }\n function getMemory(size) {\n if (!runtimeInitialized)\n return dynamicAlloc(size);\n return _malloc(size);\n }\n var UTF8Decoder = typeof TextDecoder !== \"undefined\" ? new TextDecoder(\"utf8\") : void 0;\n function UTF8ArrayToString(u8Array, idx, maxBytesToRead) {\n var endIdx = idx + maxBytesToRead;\n var endPtr = idx;\n while (u8Array[endPtr] && !(endPtr >= endIdx))\n ++endPtr;\n if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) {\n return UTF8Decoder.decode(u8Array.subarray(idx, endPtr));\n } else {\n var str = \"\";\n while (idx < endPtr) {\n var u0 = u8Array[idx++];\n if (!(u0 & 128)) {\n str += String.fromCharCode(u0);\n continue;\n }\n var u1 = u8Array[idx++] & 63;\n if ((u0 & 224) == 192) {\n str += String.fromCharCode((u0 & 31) << 6 | u1);\n continue;\n }\n var u2 = u8Array[idx++] & 63;\n if ((u0 & 240) == 224) {\n u0 = (u0 & 15) << 12 | u1 << 6 | u2;\n } else {\n if ((u0 & 248) != 240)\n warnOnce(\"Invalid UTF-8 leading byte 0x\" + u0.toString(16) + \" encountered when deserializing a UTF-8 string on the asm.js/wasm heap to a JS string!\");\n u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | u8Array[idx++] & 63;\n }\n if (u0 < 65536) {\n str += String.fromCharCode(u0);\n } else {\n var ch = u0 - 65536;\n str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);\n }\n }\n }\n return str;\n }\n function UTF8ToString(ptr, maxBytesToRead) {\n return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : \"\";\n }\n function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) {\n if (!(maxBytesToWrite > 0))\n return 0;\n var startIdx = outIdx;\n var endIdx = outIdx + maxBytesToWrite - 1;\n for (var i = 0; i < str.length; ++i) {\n var u = str.charCodeAt(i);\n if (u >= 55296 && u <= 57343) {\n var u1 = str.charCodeAt(++i);\n u = 65536 + ((u & 1023) << 10) | u1 & 1023;\n }\n if (u <= 127) {\n if (outIdx >= endIdx)\n break;\n outU8Array[outIdx++] = u;\n } else if (u <= 2047) {\n if (outIdx + 1 >= endIdx)\n break;\n outU8Array[outIdx++] = 192 | u >> 6;\n outU8Array[outIdx++] = 128 | u & 63;\n } else if (u <= 65535) {\n if (outIdx + 2 >= endIdx)\n break;\n outU8Array[outIdx++] = 224 | u >> 12;\n outU8Array[outIdx++] = 128 | u >> 6 & 63;\n outU8Array[outIdx++] = 128 | u & 63;\n } else {\n if (outIdx + 3 >= endIdx)\n break;\n if (u >= 2097152)\n warnOnce(\"Invalid Unicode code point 0x\" + u.toString(16) + \" encountered when serializing a JS string to an UTF-8 string on the asm.js/wasm heap! (Valid unicode code points should be in range 0-0x1FFFFF).\");\n outU8Array[outIdx++] = 240 | u >> 18;\n outU8Array[outIdx++] = 128 | u >> 12 & 63;\n outU8Array[outIdx++] = 128 | u >> 6 & 63;\n outU8Array[outIdx++] = 128 | u & 63;\n }\n }\n outU8Array[outIdx] = 0;\n return outIdx - startIdx;\n }\n function stringToUTF8(str, outPtr, maxBytesToWrite) {\n assert(typeof maxBytesToWrite == \"number\", \"stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!\");\n return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);\n }\n function lengthBytesUTF8(str) {\n var len = 0;\n for (var i = 0; i < str.length; ++i) {\n var u = str.charCodeAt(i);\n if (u >= 55296 && u <= 57343)\n u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;\n if (u <= 127)\n ++len;\n else if (u <= 2047)\n len += 2;\n else if (u <= 65535)\n len += 3;\n else\n len += 4;\n }\n return len;\n }\n var UTF16Decoder = typeof TextDecoder !== \"undefined\" ? new TextDecoder(\"utf-16le\") : void 0;\n function UTF16ToString(ptr) {\n assert(ptr % 2 == 0, \"Pointer passed to UTF16ToString must be aligned to two bytes!\");\n var endPtr = ptr;\n var idx = endPtr >> 1;\n while (HEAP16[idx])\n ++idx;\n endPtr = idx << 1;\n if (endPtr - ptr > 32 && UTF16Decoder) {\n return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr));\n } else {\n var i = 0;\n var str = \"\";\n while (1) {\n var codeUnit = HEAP16[ptr + i * 2 >> 1];\n if (codeUnit == 0)\n return str;\n ++i;\n str += String.fromCharCode(codeUnit);\n }\n }\n }\n function stringToUTF16(str, outPtr, maxBytesToWrite) {\n assert(outPtr % 2 == 0, \"Pointer passed to stringToUTF16 must be aligned to two bytes!\");\n assert(typeof maxBytesToWrite == \"number\", \"stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!\");\n if (maxBytesToWrite === void 0) {\n maxBytesToWrite = 2147483647;\n }\n if (maxBytesToWrite < 2)\n return 0;\n maxBytesToWrite -= 2;\n var startPtr = outPtr;\n var numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length;\n for (var i = 0; i < numCharsToWrite; ++i) {\n var codeUnit = str.charCodeAt(i);\n HEAP16[outPtr >> 1] = codeUnit;\n outPtr += 2;\n }\n HEAP16[outPtr >> 1] = 0;\n return outPtr - startPtr;\n }\n function lengthBytesUTF16(str) {\n return str.length * 2;\n }\n function UTF32ToString(ptr) {\n assert(ptr % 4 == 0, \"Pointer passed to UTF32ToString must be aligned to four bytes!\");\n var i = 0;\n var str = \"\";\n while (1) {\n var utf32 = HEAP32[ptr + i * 4 >> 2];\n if (utf32 == 0)\n return str;\n ++i;\n if (utf32 >= 65536) {\n var ch = utf32 - 65536;\n str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);\n } else {\n str += String.fromCharCode(utf32);\n }\n }\n }\n function stringToUTF32(str, outPtr, maxBytesToWrite) {\n assert(outPtr % 4 == 0, \"Pointer passed to stringToUTF32 must be aligned to four bytes!\");\n assert(typeof maxBytesToWrite == \"number\", \"stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!\");\n if (maxBytesToWrite === void 0) {\n maxBytesToWrite = 2147483647;\n }\n if (maxBytesToWrite < 4)\n return 0;\n var startPtr = outPtr;\n var endPtr = startPtr + maxBytesToWrite - 4;\n for (var i = 0; i < str.length; ++i) {\n var codeUnit = str.charCodeAt(i);\n if (codeUnit >= 55296 && codeUnit <= 57343) {\n var trailSurrogate = str.charCodeAt(++i);\n codeUnit = 65536 + ((codeUnit & 1023) << 10) | trailSurrogate & 1023;\n }\n HEAP32[outPtr >> 2] = codeUnit;\n outPtr += 4;\n if (outPtr + 4 > endPtr)\n break;\n }\n HEAP32[outPtr >> 2] = 0;\n return outPtr - startPtr;\n }\n function lengthBytesUTF32(str) {\n var len = 0;\n for (var i = 0; i < str.length; ++i) {\n var codeUnit = str.charCodeAt(i);\n if (codeUnit >= 55296 && codeUnit <= 57343)\n ++i;\n len += 4;\n }\n return len;\n }\n function allocateUTF8(str) {\n var size = lengthBytesUTF8(str) + 1;\n var ret = _malloc(size);\n if (ret)\n stringToUTF8Array(str, HEAP8, ret, size);\n return ret;\n }\n function writeArrayToMemory(array, buffer2) {\n assert(array.length >= 0, \"writeArrayToMemory array must have a length (should be an array or typed array)\");\n HEAP8.set(array, buffer2);\n }\n function writeAsciiToMemory(str, buffer2, dontAddNull) {\n for (var i = 0; i < str.length; ++i) {\n assert(str.charCodeAt(i) === str.charCodeAt(i) & 255);\n HEAP8[buffer2++ >> 0] = str.charCodeAt(i);\n }\n if (!dontAddNull)\n HEAP8[buffer2 >> 0] = 0;\n }\n var WASM_PAGE_SIZE = 65536;\n function alignUp(x, multiple) {\n if (x % multiple > 0) {\n x += multiple - x % multiple;\n }\n return x;\n }\n var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;\n function updateGlobalBufferAndViews(buf) {\n buffer = buf;\n Module[\"HEAP8\"] = HEAP8 = new Int8Array(buf);\n Module[\"HEAP16\"] = HEAP16 = new Int16Array(buf);\n Module[\"HEAP32\"] = HEAP32 = new Int32Array(buf);\n Module[\"HEAPU8\"] = HEAPU8 = new Uint8Array(buf);\n Module[\"HEAPU16\"] = HEAPU16 = new Uint16Array(buf);\n Module[\"HEAPU32\"] = HEAPU32 = new Uint32Array(buf);\n Module[\"HEAPF32\"] = HEAPF32 = new Float32Array(buf);\n Module[\"HEAPF64\"] = HEAPF64 = new Float64Array(buf);\n }\n var STACK_BASE = 7643408, STACK_MAX = 2400528, DYNAMIC_BASE = 7643408, DYNAMICTOP_PTR = 2400368;\n assert(STACK_BASE % 16 === 0, \"stack must start aligned\");\n assert(DYNAMIC_BASE % 16 === 0, \"heap must start aligned\");\n var TOTAL_STACK = 5242880;\n if (Module[\"TOTAL_STACK\"])\n assert(TOTAL_STACK === Module[\"TOTAL_STACK\"], \"the stack size can no longer be determined at runtime\");\n var INITIAL_INITIAL_MEMORY = Module[\"INITIAL_MEMORY\"] || 16777216;\n if (!Object.getOwnPropertyDescriptor(Module, \"INITIAL_MEMORY\"))\n Object.defineProperty(Module, \"INITIAL_MEMORY\", {\n configurable: true,\n get: function() {\n abort(\"Module.INITIAL_MEMORY has been replaced with plain INITIAL_INITIAL_MEMORY\");\n }\n });\n assert(INITIAL_INITIAL_MEMORY >= TOTAL_STACK, \"INITIAL_MEMORY should be larger than TOTAL_STACK, was \" + INITIAL_INITIAL_MEMORY + \"! (TOTAL_STACK=\" + TOTAL_STACK + \")\");\n assert(typeof Int32Array !== \"undefined\" && typeof Float64Array !== \"undefined\" && Int32Array.prototype.subarray !== void 0 && Int32Array.prototype.set !== void 0, \"JS engine does not provide full typed array support\");\n if (Module[\"wasmMemory\"]) {\n wasmMemory = Module[\"wasmMemory\"];\n } else {\n wasmMemory = new WebAssembly.Memory({\n initial: INITIAL_INITIAL_MEMORY / WASM_PAGE_SIZE\n });\n }\n if (wasmMemory) {\n buffer = wasmMemory.buffer;\n }\n INITIAL_INITIAL_MEMORY = buffer.byteLength;\n assert(INITIAL_INITIAL_MEMORY % WASM_PAGE_SIZE === 0);\n updateGlobalBufferAndViews(buffer);\n HEAP32[DYNAMICTOP_PTR >> 2] = DYNAMIC_BASE;\n function writeStackCookie() {\n assert((STACK_MAX & 3) == 0);\n HEAPU32[(STACK_MAX >> 2) + 1] = 34821223;\n HEAPU32[(STACK_MAX >> 2) + 2] = 2310721022;\n HEAP32[0] = 1668509029;\n }\n function checkStackCookie() {\n var cookie1 = HEAPU32[(STACK_MAX >> 2) + 1];\n var cookie2 = HEAPU32[(STACK_MAX >> 2) + 2];\n if (cookie1 != 34821223 || cookie2 != 2310721022) {\n abort(\"Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x\" + cookie2.toString(16) + \" \" + cookie1.toString(16));\n }\n if (HEAP32[0] !== 1668509029)\n abort(\"Runtime error: The application has corrupted its heap memory area (address zero)!\");\n }\n function abortStackOverflow(allocSize) {\n abort(\"Stack overflow! Attempted to allocate \" + allocSize + \" bytes on the stack, but stack has only \" + (STACK_MAX - stackSave() + allocSize) + \" bytes available!\");\n }\n (function() {\n var h16 = new Int16Array(1);\n var h8 = new Int8Array(h16.buffer);\n h16[0] = 25459;\n if (h8[0] !== 115 || h8[1] !== 99)\n throw \"Runtime error: expected the system to be little-endian!\";\n })();\n function callRuntimeCallbacks(callbacks) {\n while (callbacks.length > 0) {\n var callback = callbacks.shift();\n if (typeof callback == \"function\") {\n callback();\n continue;\n }\n var func = callback.func;\n if (typeof func === \"number\") {\n if (callback.arg === void 0) {\n Module[\"dynCall_v\"](func);\n } else {\n Module[\"dynCall_vi\"](func, callback.arg);\n }\n } else {\n func(callback.arg === void 0 ? null : callback.arg);\n }\n }\n }\n var __ATPRERUN__ = [];\n var __ATINIT__ = [];\n var __ATMAIN__ = [];\n var __ATPOSTRUN__ = [];\n var runtimeInitialized = false;\n var runtimeExited = false;\n function preRun() {\n if (Module[\"preRun\"]) {\n if (typeof Module[\"preRun\"] == \"function\")\n Module[\"preRun\"] = [Module[\"preRun\"]];\n while (Module[\"preRun\"].length) {\n addOnPreRun(Module[\"preRun\"].shift());\n }\n }\n callRuntimeCallbacks(__ATPRERUN__);\n }\n function initRuntime() {\n checkStackCookie();\n assert(!runtimeInitialized);\n runtimeInitialized = true;\n SOCKFS.root = FS.mount(SOCKFS, {}, null);\n if (!Module[\"noFSInit\"] && !FS.init.initialized)\n FS.init();\n callRuntimeCallbacks(__ATINIT__);\n }\n function preMain() {\n checkStackCookie();\n FS.ignorePermissions = false;\n callRuntimeCallbacks(__ATMAIN__);\n }\n function postRun() {\n checkStackCookie();\n if (Module[\"postRun\"]) {\n if (typeof Module[\"postRun\"] == \"function\")\n Module[\"postRun\"] = [Module[\"postRun\"]];\n while (Module[\"postRun\"].length) {\n addOnPostRun(Module[\"postRun\"].shift());\n }\n }\n callRuntimeCallbacks(__ATPOSTRUN__);\n }\n function addOnPreRun(cb) {\n __ATPRERUN__.unshift(cb);\n }\n function addOnPostRun(cb) {\n __ATPOSTRUN__.unshift(cb);\n }\n assert(Math.imul, \"This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill\");\n assert(Math.fround, \"This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill\");\n assert(Math.clz32, \"This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill\");\n assert(Math.trunc, \"This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a pol