taler-xotp

xOTP generator
Log | Files | Refs | Submodules | README

commit 92677c0867f3501f5a165566f23c2de3193adf9b
parent 4e38871639d2ba74786f8d3d1dc1a9019fb07fc7
Author: Adrian STEINER <adrian.steiner@bfh.ch>
Date:   Wed, 14 Jan 2026 17:12:17 +0100

Add basex converter, add conf file from old documentation

Diffstat:
Afigures/xOTP_generator_logo.svg | 141+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/_static/baseX_converter/Makefile | 13+++++++++++++
Asource/_static/baseX_converter/base32.js | 2431+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/_static/baseX_converter/base32.wasm | 0
Asource/_static/baseX_converter/base8.js | 2440++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/_static/baseX_converter/base8.wasm | 0
Asource/_static/baseX_converter/baseX_converter.html | 48++++++++++++++++++++++++++++++++++++++++++++++++
Asource/_static/baseX_converter/baseX_converter_styles.css | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/_static/baseX_converter/parserScript.js | 214+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/_templates/.icons/bfh/dark.svg | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/_templates/.icons/bfh/light.svg | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/_templates/.icons/bfh/logo.svg | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/_templates/.icons/mseLogo.svg | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/_templates/.icons/talerLogo.svg | 2++
Asource/_templates/breadcrumbs.html | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/_templates/layout.html | 252+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/_templates/nav.html | 31+++++++++++++++++++++++++++++++
Asource/_templates/versions.html | 19+++++++++++++++++++
Asource/baseXParser/index.rst | 16++++++++++++++++
Msource/conf.py | 222++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
20 files changed, 6259 insertions(+), 7 deletions(-)

diff --git a/figures/xOTP_generator_logo.svg b/figures/xOTP_generator_logo.svg @@ -0,0 +1,141 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="185.95349" + height="191.3277" + version="1.1" + id="svg6" + sodipodi:docname="xTOTP_Generator_logo.svg" + inkscape:version="1.4.2 (1:1.4.2+202505120737+ebf0e940d0)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs6" /> + <sodipodi:namedview + id="namedview6" + pagecolor="#505050" + bordercolor="#ffffff" + borderopacity="1" + inkscape:showpageshadow="0" + inkscape:pageopacity="0" + inkscape:pagecheckerboard="1" + inkscape:deskcolor="#d1d1d1" + inkscape:zoom="3.2922607" + inkscape:cx="83.984844" + inkscape:cy="73.961337" + inkscape:window-width="1720" + inkscape:window-height="1403" + inkscape:window-x="20" + inkscape:window-y="20" + inkscape:window-maximized="0" + inkscape:current-layer="svg6" /> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:20;stroke-linecap:square;stroke-opacity:1;paint-order:markers stroke fill" + id="rect6" + width="125" + height="95" + x="41.973377" + y="48.699699" + rx="10" + ry="10" /> + <g + id="g6" + transform="matrix(0.29714602,0,0,0.29714602,16.640177,172.31036)" + style="stroke-width:3.36535"> + <path + d="m 229.66666,-227 c 52,0 96.66667,31.33333 120,77.33333 H 330 A 117,117 0 0 0 229.66666,-209 C 164,-209 110.66667,-152 110.66667,-81.666671 c 0,34.666666 12.66666,65.666666 33.33333,88.6666653 A 104.66667,104.66667 0 0 1 130,16.999994 150.66667,150.66667 0 0 1 93.999999,-81.666671 C 93.999999,-161.66667 154.66666,-227 229.66666,-227 Z M 349,-12.666672 A 134.66667,134.66667 0 0 1 219,63.333327 c 10,-5 20,-11.666666 28.66666,-19 a 118.66667,118.66667 0 0 0 82,-56.999999 z" + id="path1" + style="fill:#0042b3;fill-opacity:1;stroke-width:11.2178" /> + <path + d="M 154.66666,-227 165,-226.66667 c -10,5.33333 -19.66667,11.66667 -28.33333,19.33333 A 125,125 0 0 0 35.999999,-81.666671 c 0,47.666666 24.333333,88.9999986 60,110.999998 A 98.666666,98.666666 0 0 1 67.666666,29.999994 C 37.666666,3.3333277 19,-36.666672 19,-81.666671 19,-161.66667 79.666666,-227 154.66666,-227 Z m 18,271.333327 a 118.66667,118.66667 0 0 0 82,-56.999999 h 19.66667 a 134.66667,134.66667 0 0 1 -130,75.999999 c 10,-5 19.66667,-11.666666 28.33333,-19 z m 82.66667,-193.999997 a 123.33333,123.33333 0 0 0 -42,-42.66667 A 98.666666,98.666666 0 0 1 241.66666,-193 c 13.33334,12 24.66667,26.66666 33,43.33333 z" + id="path2-5" + style="fill:#0042b3;fill-opacity:1;stroke-width:11.2178" /> + <path + d="m 79.999999,-227 c 3.333333,0 6.666667,0 10.333333,0.66666 -10,5 -19.666666,11.33334 -28.333333,18.66667 A 125,125 0 0 0 -39,-81.666671 C -39,-11.333339 14.333333,45.999994 79.999999,45.999994 122,45.999994 158.66666,22.666661 180,-12.666672 h 19.33333 A 134.66667,134.66667 0 0 1 79.999999,63.999994 C 4.9999997,63.999994 -56,-1.333339 -56,-81.666671 -56,-161.66667 4.6666664,-227 79.666666,-227 Z m 100.333331,77.33333 a 127,127 0 0 0 -15,-20.33333 c 4.33333,-4 9,-7.33334 14.33333,-10 7.66667,9 14.66667,19.33333 20,30.33333 z" + id="path3-6" + style="font-variation-settings:normal;vector-effect:none;fill:#0042b3;fill-opacity:1;stroke-width:3.36535;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000" /> + </g> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:10;stroke-linecap:square;stroke-opacity:1;paint-order:markers stroke fill" + id="rect7" + width="35" + height="20" + x="145.95349" + y="86.199699" + rx="10" + ry="10" /> + <circle + cx="154.63422" + cy="96.199699" + fill="#000000" + id="circle6" + style="stroke-width:1" + r="5" /> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:20;stroke-linecap:square;stroke-opacity:1;paint-order:markers stroke fill" + id="rect8" + width="125" + height="20" + x="41.973377" + y="48.699699" + rx="10" + ry="10" /> + <g + id="g9" + transform="matrix(0.97253669,0,0,0.962765,-37.002123,-48.189274)" + style="stroke-width:1.03345"> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:10.3345;stroke-linecap:square;stroke-opacity:1;paint-order:markers stroke fill" + id="rect9" + width="92.540253" + height="19.907574" + x="99.200478" + y="193.91968" + rx="5.1411943" + ry="5.1933756" /> + <text + x="106.10256" + y="212.44337" + font-size="24px" + font-family="Arial" + fill="#000000" + id="text3" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:1.03345">975421</text> + </g> + <g + id="g13"> + <rect + style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:10;stroke-linecap:square;stroke-opacity:1;paint-order:markers stroke fill" + id="rect10" + width="50" + height="45" + x="130.95349" + y="28.765282" + rx="5" + ry="5" /> + <rect + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:square;stroke-opacity:1;paint-order:markers stroke fill" + id="rect11" + width="30" + height="60" + x="140.95349" + y="2.5" + rx="15" + ry="15" /> + <circle + cx="155.95349" + cy="42.34391" + r="5" + fill="#000000" + id="circle6-9" + style="fill:#ffffff;fill-opacity:1;stroke-width:1" /> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:5;stroke-linecap:square;stroke-opacity:1;paint-order:markers stroke fill" + id="rect12" + width="5" + height="15" + x="153.45349" + y="41.533638" /> + </g> +</svg> diff --git a/source/_static/baseX_converter/Makefile b/source/_static/baseX_converter/Makefile @@ -0,0 +1,13 @@ +# Generation base8 and base32 js from C code + +.PHONY: build + +build: + emcc baseX-Converter/lib/base8_converter.c -o base8.js \ + -s EXPORTED_FUNCTIONS="['_base8_encodeBytes', '_base8_stringToNum', '_base8_decodeNum', '_malloc', '_free']" \ + -s EXPORTED_RUNTIME_METHODS="['cwrap', 'allocate', 'allocateUTF8', 'intArrayFromString', 'UTF8ToString']" \ + -s MODULARIZE=1 -s ALLOW_MEMORY_GROWTH=1 -s EXPORT_NAME="Base8Module" + emcc baseX-Converter/lib/base32_converter.c -o base32.js \ + -s EXPORTED_FUNCTIONS="['_base32_decodeString', '_base32_encodeBytes', '_malloc', '_free']" \ + -s EXPORTED_RUNTIME_METHODS="['cwrap', 'allocate', 'allocateUTF8', 'intArrayFromString', 'UTF8ToString']" \ + -s MODULARIZE=1 -s ALLOW_MEMORY_GROWTH=1 -s EXPORT_NAME="Base32Module" diff --git a/source/_static/baseX_converter/base32.js b/source/_static/baseX_converter/base32.js @@ -0,0 +1,2431 @@ + +var Base32Module = (() => { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; + return ( +function(Base32Module) { + Base32Module = Base32Module || {}; + + + +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Base32Module != 'undefined' ? Base32Module : {}; + +// See https://caniuse.com/mdn-javascript_builtins_object_assign + +// Set up the promise that indicates the Module is initialized +var readyPromiseResolve, readyPromiseReject; +Module['ready'] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; +}); + + if (!Object.getOwnPropertyDescriptor(Module['ready'], '_base32_decodeString')) { + Object.defineProperty(Module['ready'], '_base32_decodeString', { configurable: true, get: function() { abort('You are getting _base32_decodeString on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + Object.defineProperty(Module['ready'], '_base32_decodeString', { configurable: true, set: function() { abort('You are setting _base32_decodeString on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + } + + + if (!Object.getOwnPropertyDescriptor(Module['ready'], '_base32_encodeBytes')) { + Object.defineProperty(Module['ready'], '_base32_encodeBytes', { configurable: true, get: function() { abort('You are getting _base32_encodeBytes on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + Object.defineProperty(Module['ready'], '_base32_encodeBytes', { configurable: true, set: function() { abort('You are setting _base32_encodeBytes on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + } + + + if (!Object.getOwnPropertyDescriptor(Module['ready'], '_malloc')) { + Object.defineProperty(Module['ready'], '_malloc', { configurable: true, get: function() { abort('You are getting _malloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + Object.defineProperty(Module['ready'], '_malloc', { configurable: true, set: function() { abort('You are setting _malloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + } + + + if (!Object.getOwnPropertyDescriptor(Module['ready'], '_free')) { + Object.defineProperty(Module['ready'], '_free', { configurable: true, get: function() { abort('You are getting _free on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + Object.defineProperty(Module['ready'], '_free', { configurable: true, set: function() { abort('You are setting _free on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + } + + + if (!Object.getOwnPropertyDescriptor(Module['ready'], '___stdio_exit')) { + Object.defineProperty(Module['ready'], '___stdio_exit', { configurable: true, get: function() { abort('You are getting ___stdio_exit on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + Object.defineProperty(Module['ready'], '___stdio_exit', { configurable: true, set: function() { abort('You are setting ___stdio_exit on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + } + + + if (!Object.getOwnPropertyDescriptor(Module['ready'], 'onRuntimeInitialized')) { + Object.defineProperty(Module['ready'], 'onRuntimeInitialized', { configurable: true, get: function() { abort('You are getting onRuntimeInitialized on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + Object.defineProperty(Module['ready'], 'onRuntimeInitialized', { configurable: true, set: function() { abort('You are setting onRuntimeInitialized on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + } + + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) +// {{PRE_JSES}} + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = Object.assign({}, Module); + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = (status, toThrow) => { + throw toThrow; +}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +// Attempt to auto-detect the environment +var ENVIRONMENT_IS_WEB = typeof window == 'object'; +var ENVIRONMENT_IS_WORKER = typeof importScripts == 'function'; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string'; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (Module['ENVIRONMENT']) { + 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)'); +} + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var read_, + readAsync, + readBinary, + setWindowTitle; + +// Normally we don't log exceptions but instead let them bubble out the top +// level where the embedding environment (e.g. the browser) can handle +// them. +// However under v8 and node we sometimes exit the process direcly in which case +// its up to use us to log the exception before exiting. +// If we fix https://github.com/emscripten-core/emscripten/issues/15080 +// this may no longer be needed under node. +function logExceptionOnExit(e) { + if (e instanceof ExitStatus) return; + let toLog = e; + if (e && typeof e == 'object' && e.stack) { + toLog = [e, e.stack]; + } + err('exiting due to exception: ' + toLog); +} + +var fs; +var nodePath; +var requireNodeFS; + +if (ENVIRONMENT_IS_NODE) { + if (!(typeof process == 'object' && typeof require == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require('path').dirname(scriptDirectory) + '/'; + } else { + scriptDirectory = __dirname + '/'; + } + +// include: node_shell_read.js + + +requireNodeFS = () => { + // Use nodePath as the indicator for these not being initialized, + // since in some environments a global fs may have already been + // created. + if (!nodePath) { + fs = require('fs'); + nodePath = require('path'); + } +}; + +read_ = function shell_read(filename, binary) { + requireNodeFS(); + filename = nodePath['normalize'](filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); +}; + +readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; +}; + +readAsync = (filename, onload, onerror) => { + requireNodeFS(); + filename = nodePath['normalize'](filename); + fs.readFile(filename, function(err, data) { + if (err) onerror(err); + else onload(data.buffer); + }); +}; + +// end include: node_shell_read.js + if (process['argv'].length > 1) { + thisProgram = process['argv'][1].replace(/\\/g, '/'); + } + + arguments_ = process['argv'].slice(2); + + // MODULARIZE will export the module in the proper place outside, we don't need to export here + + process['on']('uncaughtException', function(ex) { + // suppress ExitStatus exceptions from showing an error + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + + // Without this older versions of node (< v15) will log unhandled rejections + // but return 0, which is not normally the desired behaviour. This is + // not be needed with node v15 and about because it is now the default + // behaviour: + // See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode + process['on']('unhandledRejection', function(reason) { throw reason; }); + + quit_ = (status, toThrow) => { + if (keepRuntimeAlive()) { + process['exitCode'] = status; + throw toThrow; + } + logExceptionOnExit(toThrow); + process['exit'](status); + }; + + Module['inspect'] = function () { return '[Emscripten Module object]'; }; + +} else +if (ENVIRONMENT_IS_SHELL) { + + if ((typeof process == 'object' && typeof require === 'function') || typeof window == 'object' || typeof importScripts == 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + if (typeof read != 'undefined') { + read_ = function shell_read(f) { + return read(f); + }; + } + + readBinary = function readBinary(f) { + let data; + if (typeof readbuffer == 'function') { + return new Uint8Array(readbuffer(f)); + } + data = read(f, 'binary'); + assert(typeof data == 'object'); + return data; + }; + + readAsync = function readAsync(f, onload, onerror) { + setTimeout(() => onload(readBinary(f)), 0); + }; + + if (typeof scriptArgs != 'undefined') { + arguments_ = scriptArgs; + } else if (typeof arguments != 'undefined') { + arguments_ = arguments; + } + + if (typeof quit == 'function') { + quit_ = (status, toThrow) => { + // Unlike node which has process.exitCode, d8 has no such mechanism. So we + // have no way to set the exit code and then let the program exit with + // that code when it naturally stops running (say, when all setTimeouts + // have completed). For that reason we must call `quit` - the only way to + // set the exit code - but quit also halts immediately, so we need to be + // careful of whether the runtime is alive or not, which is why this code + // path looks different than node. It also has the downside that it will + // halt the entire program when no code remains to run, which means this + // is not friendly for bundling this code into a larger codebase, and for + // that reason the "shell" environment is mainly useful for testing whole + // programs by themselves, basically. + if (runtimeKeepaliveCounter) { + throw toThrow; + } + logExceptionOnExit(toThrow); + quit(status); + }; + } + + if (typeof print != 'undefined') { + // Prefer to use print/printErr where they exist, as they usually work better. + if (typeof console == 'undefined') console = /** @type{!Console} */({}); + console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); + console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr != 'undefined' ? printErr : print); + } + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (typeof document != 'undefined' && document.currentScript) { // web + scriptDirectory = document.currentScript.src; + } + // When MODULARIZE, this JS may be executed later, after document.currentScript + // is gone, so we saved it, and we use it here instead of any other info. + if (_scriptDir) { + scriptDirectory = _scriptDir; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), + // they are removed because they could contain a slash. + if (scriptDirectory.indexOf('blob:') !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1); + } else { + scriptDirectory = ''; + } + + if (!(typeof window == 'object' || typeof importScripts == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + // Differentiate the Web Worker from the Node Worker case, as reading must + // be done differently. + { +// include: web_or_worker_shell_read.js + + + read_ = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + } + + if (ENVIRONMENT_IS_WORKER) { + readBinary = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = (url, onload, onerror) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = () => { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + } + +// end include: web_or_worker_shell_read.js + } + + setWindowTitle = (title) => document.title = title; +} else +{ + throw new Error('environment detection error'); +} + +var out = Module['print'] || console.log.bind(console); +var err = Module['printErr'] || console.warn.bind(console); + +// Merge back in the overrides +Object.assign(Module, moduleOverrides); +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. +moduleOverrides = null; +checkIncomingModuleAPI(); + +// Emit code to handle expected values on the Module object. This applies Module.x +// to the proper local x. This has two benefits: first, we only emit it if it is +// expected to arrive, and second, by using a local everywhere else that can be +// minified. + +if (Module['arguments']) arguments_ = Module['arguments'];legacyModuleProp('arguments', 'arguments_'); + +if (Module['thisProgram']) thisProgram = Module['thisProgram'];legacyModuleProp('thisProgram', 'thisProgram'); + +if (Module['quit']) quit_ = Module['quit'];legacyModuleProp('quit', 'quit_'); + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message +// Assertions on removed incoming Module JS APIs. +assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['read'] == 'undefined', 'Module.read option was removed (modify read_ in JS)'); +assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); +assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); +assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)'); +assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); +legacyModuleProp('read', 'read_'); +legacyModuleProp('readAsync', 'readAsync'); +legacyModuleProp('readBinary', 'readBinary'); +legacyModuleProp('setWindowTitle', 'setWindowTitle'); +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; +function alignMemory() { abort('`alignMemory` is now a library function and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line'); } + +assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-s ENVIRONMENT` to enable."); + + + + +var STACK_ALIGN = 16; +var POINTER_SIZE = 4; + +function getNativeTypeSize(type) { + switch (type) { + case 'i1': case 'i8': return 1; + case 'i16': return 2; + case 'i32': return 4; + case 'i64': return 8; + case 'float': return 4; + case 'double': return 8; + default: { + if (type[type.length - 1] === '*') { + return POINTER_SIZE; + } else if (type[0] === 'i') { + const bits = Number(type.substr(1)); + assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); + return bits / 8; + } else { + return 0; + } + } + } +} + +function warnOnce(text) { + if (!warnOnce.shown) warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + err(text); + } +} + +// include: runtime_functions.js + + +// Wraps a JS function as a wasm function with a given signature. +function convertJsFunctionToWasm(func, sig) { + + // If the type reflection proposal is available, use the new + // "WebAssembly.Function" constructor. + // Otherwise, construct a minimal wasm module importing the JS function and + // re-exporting it. + if (typeof WebAssembly.Function == "function") { + var typeNames = { + 'i': 'i32', + 'j': 'i64', + 'f': 'f32', + 'd': 'f64' + }; + var type = { + parameters: [], + results: sig[0] == 'v' ? [] : [typeNames[sig[0]]] + }; + for (var i = 1; i < sig.length; ++i) { + type.parameters.push(typeNames[sig[i]]); + } + return new WebAssembly.Function(type, func); + } + + // The module is static, with the exception of the type section, which is + // generated based on the signature passed in. + var typeSection = [ + 0x01, // id: section, + 0x00, // length: 0 (placeholder) + 0x01, // count: 1 + 0x60, // form: func + ]; + var sigRet = sig.slice(0, 1); + var sigParam = sig.slice(1); + var typeCodes = { + 'i': 0x7f, // i32 + 'j': 0x7e, // i64 + 'f': 0x7d, // f32 + 'd': 0x7c, // f64 + }; + + // Parameters, length + signatures + typeSection.push(sigParam.length); + for (var i = 0; i < sigParam.length; ++i) { + typeSection.push(typeCodes[sigParam[i]]); + } + + // Return values, length + signatures + // With no multi-return in MVP, either 0 (void) or 1 (anything else) + if (sigRet == 'v') { + typeSection.push(0x00); + } else { + typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); + } + + // Write the overall length of the type section back into the section header + // (excepting the 2 bytes for the section id and length) + typeSection[1] = typeSection.length - 2; + + // Rest of the module is static + var bytes = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") + 0x01, 0x00, 0x00, 0x00, // version: 1 + ].concat(typeSection, [ + 0x02, 0x07, // import section + // (import "e" "f" (func 0 (type 0))) + 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, + 0x07, 0x05, // export section + // (export "f" (func 0 (type 0))) + 0x01, 0x01, 0x66, 0x00, 0x00, + ])); + + // We can compile this wasm module synchronously because it is very small. + // This accepts an import (at "e.f"), that it reroutes to an export (at "f") + var module = new WebAssembly.Module(bytes); + var instance = new WebAssembly.Instance(module, { + 'e': { + 'f': func + } + }); + var wrappedFunc = instance.exports['f']; + return wrappedFunc; +} + +var freeTableIndexes = []; + +// Weak map of functions in the table to their indexes, created on first use. +var functionsInTableMap; + +function getEmptyTableSlot() { + // Reuse a free index if there is one, otherwise grow. + if (freeTableIndexes.length) { + return freeTableIndexes.pop(); + } + // Grow the table + try { + wasmTable.grow(1); + } catch (err) { + if (!(err instanceof RangeError)) { + throw err; + } + throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.'; + } + return wasmTable.length - 1; +} + +function updateTableMap(offset, count) { + for (var i = offset; i < offset + count; i++) { + var item = getWasmTableEntry(i); + // Ignore null values. + if (item) { + functionsInTableMap.set(item, i); + } + } +} + +/** + * Add a function to the table. + * 'sig' parameter is required if the function being added is a JS function. + * @param {string=} sig + */ +function addFunction(func, sig) { + assert(typeof func != 'undefined'); + + // Check if the function is already in the table, to ensure each function + // gets a unique index. First, create the map if this is the first use. + if (!functionsInTableMap) { + functionsInTableMap = new WeakMap(); + updateTableMap(0, wasmTable.length); + } + if (functionsInTableMap.has(func)) { + return functionsInTableMap.get(func); + } + + // It's not in the table, add it now. + + var ret = getEmptyTableSlot(); + + // Set the new value. + try { + // Attempting to call this with JS function will cause of table.set() to fail + setWasmTableEntry(ret, func); + } catch (err) { + if (!(err instanceof TypeError)) { + throw err; + } + assert(typeof sig != 'undefined', 'Missing signature argument to addFunction: ' + func); + var wrapped = convertJsFunctionToWasm(func, sig); + setWasmTableEntry(ret, wrapped); + } + + functionsInTableMap.set(func, ret); + + return ret; +} + +function removeFunction(index) { + functionsInTableMap.delete(getWasmTableEntry(index)); + freeTableIndexes.push(index); +} + +// end include: runtime_functions.js +// include: runtime_debug.js + + +function legacyModuleProp(prop, newName) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + get: function() { + abort('Module.' + prop + ' has been replaced with plain ' + newName + ' (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); + } + }); + } +} + +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort('`Module.' + prop + '` was supplied but `' + prop + '` not included in INCOMING_MODULE_JS_API'); + } +} + +function unexportedMessage(sym, isFSSybol) { + var msg = "'" + sym + "' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"; + if (isFSSybol) { + msg += '. Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you'; + } + return msg; +} + +function unexportedRuntimeSymbol(sym, isFSSybol) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get: function() { + abort(unexportedMessage(sym, isFSSybol)); + } + }); + } +} + +function unexportedRuntimeFunction(sym, isFSSybol) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Module[sym] = () => abort(unexportedMessage(sym, isFSSybol)); + } +} + +// end include: runtime_debug.js +var tempRet0 = 0; +var setTempRet0 = (value) => { tempRet0 = value; }; +var getTempRet0 = () => tempRet0; + + + +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary; +if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];legacyModuleProp('wasmBinary', 'wasmBinary'); +var noExitRuntime = Module['noExitRuntime'] || true;legacyModuleProp('noExitRuntime', 'noExitRuntime'); + +if (typeof WebAssembly != 'object') { + abort('no native wasm support detected'); +} + +// include: runtime_safe_heap.js + + +// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking. +// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties) + +/** @param {number} ptr + @param {number} value + @param {string} type + @param {number|boolean=} noSafe */ +function setValue(ptr, value, type = 'i8', noSafe) { + if (type.charAt(type.length-1) === '*') type = 'i32'; + switch (type) { + case 'i1': HEAP8[((ptr)>>0)] = value; break; + case 'i8': HEAP8[((ptr)>>0)] = value; break; + case 'i16': HEAP16[((ptr)>>1)] = value; break; + case 'i32': HEAP32[((ptr)>>2)] = value; break; + case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break; + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + default: abort('invalid type for setValue: ' + type); + } +} + +/** @param {number} ptr + @param {string} type + @param {number|boolean=} noSafe */ +function getValue(ptr, type = 'i8', noSafe) { + if (type.charAt(type.length-1) === '*') type = 'i32'; + switch (type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': return HEAP32[((ptr)>>2)]; + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return Number(HEAPF64[((ptr)>>3)]); + default: abort('invalid type for getValue: ' + type); + } + return null; +} + +// end include: runtime_safe_heap.js +// Wasm globals + +var wasmMemory; + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS; + +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed' + (text ? ': ' + text : '')); + } +} + +// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) +function getCFunc(ident) { + var func = Module['_' + ident]; // closure exported function + assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); + return func; +} + +// C calling interface. +/** @param {string|null=} returnType + @param {Array=} argTypes + @param {Arguments|Array=} args + @param {Object=} opts */ +function ccall(ident, returnType, argTypes, args, opts) { + // For fast lookup of conversion functions + var toC = { + 'string': function(str) { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { // null string + // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' + var len = (str.length << 2) + 1; + ret = stackAlloc(len); + stringToUTF8(str, ret, len); + } + return ret; + }, + 'array': function(arr) { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + } + }; + + function convertReturnValue(ret) { + if (returnType === 'string') return UTF8ToString(ret); + if (returnType === 'boolean') return Boolean(ret); + return ret; + } + + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + assert(returnType !== 'array', 'Return type should not be "array".'); + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func.apply(null, cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + + ret = onDone(ret); + return ret; +} + +/** @param {string=} returnType + @param {Array=} argTypes + @param {Object=} opts */ +function cwrap(ident, returnType, argTypes, opts) { + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + } +} + +// We used to include malloc/free by default in the past. Show a helpful error in +// builds with assertions. + +// include: runtime_legacy.js + + +var ALLOC_NORMAL = 0; // Tries to use _malloc() +var ALLOC_STACK = 1; // Lives for the duration of the current function call + +/** + * allocate(): This function is no longer used by emscripten but is kept around to avoid + * breaking external users. + * You should normally not use allocate(), and instead allocate + * memory using _malloc()/stackAlloc(), initialize it with + * setValue(), and so forth. + * @param {(Uint8Array|Array<number>)} slab: An array of data. + * @param {number=} allocator : How to allocate memory, see ALLOC_* + */ +function allocate(slab, allocator) { + var ret; + assert(typeof allocator == 'number', 'allocate no longer takes a type argument') + assert(typeof slab != 'number', 'allocate no longer takes a number as arg0') + + if (allocator == ALLOC_STACK) { + ret = stackAlloc(slab.length); + } else { + ret = _malloc(slab.length); + } + + if (!slab.subarray && !slab.slice) { + slab = new Uint8Array(slab); + } + HEAPU8.set(slab, ret); + return ret; +} + +// end include: runtime_legacy.js +// include: runtime_strings.js + + +// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime. + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns +// a copy of that string as a Javascript String object. + +var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + +/** + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) + while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ''; + // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heap[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heap[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heap[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + } + return str; +} + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a +// copy of that string as a Javascript String object. +// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit +// this parameter to scan the string until the first \0 byte. If maxBytesToRead is +// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the +// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will +// not produce a string of exact length [ptr, ptr+maxBytesToRead[) +// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may +// throw JS JIT optimizations off, so it is worth to consider consistently using one +// style or the other. +/** + * @param {number} ptr + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ToString(ptr, maxBytesToRead) { + ; + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; +} + +// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', +// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// heap: the array to copy to. Each index in this array is assumed to be one 8-byte element. +// outIdx: The starting offset in the array to begin the copying. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. +// This count should include the null terminator, +// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. +// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u > 0x10FFFF) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).'); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8(str, outPtr, maxBytesToWrite) { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. +function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); + if (u <= 0x7F) ++len; + else if (u <= 0x7FF) len += 2; + else if (u <= 0xFFFF) len += 3; + else len += 4; + } + return len; +} + +// end include: runtime_strings.js +// include: runtime_strings_extra.js + + +// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime. + +// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +function AsciiToString(ptr) { + var str = ''; + while (1) { + var ch = HEAPU8[((ptr++)>>0)]; + if (!ch) return str; + str += String.fromCharCode(ch); + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. + +function stringToAscii(str, outPtr) { + return writeAsciiToMemory(str, outPtr, false); +} + +// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +var UTF16Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf-16le') : undefined; + +function UTF16ToString(ptr, maxBytesToRead) { + assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); + var endPtr = ptr; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + var idx = endPtr >> 1; + var maxIdx = idx + maxBytesToRead / 2; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; + endPtr = idx << 1; + + if (endPtr - ptr > 32 && UTF16Decoder) { + return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); + } else { + var str = ''; + + // If maxBytesToRead is not passed explicitly, it will be undefined, and the for-loop's condition + // will always evaluate to true. The loop is then terminated on the first null char. + for (var i = 0; !(i >= maxBytesToRead / 2); ++i) { + var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; + if (codeUnit == 0) break; + // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. + str += String.fromCharCode(codeUnit); + } + + return str; + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. +// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. +// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF16(str, outPtr, maxBytesToWrite) { + assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; // Null terminator. + var startPtr = outPtr; + var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + HEAP16[((outPtr)>>1)] = codeUnit; + outPtr += 2; + } + // Null-terminate the pointer to the HEAP. + HEAP16[((outPtr)>>1)] = 0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF16(str) { + return str.length*2; +} + +function UTF32ToString(ptr, maxBytesToRead) { + assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); + var i = 0; + + var str = ''; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(i >= maxBytesToRead / 4)) { + var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; + if (utf32 == 0) break; + ++i; + // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + if (utf32 >= 0x10000) { + var ch = utf32 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } else { + str += String.fromCharCode(utf32); + } + } + return str; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. +// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. +// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF32(str, outPtr, maxBytesToWrite) { + assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 4) return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { + var trailSurrogate = str.charCodeAt(++i); + codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); + } + HEAP32[((outPtr)>>2)] = codeUnit; + outPtr += 4; + if (outPtr + 4 > endPtr) break; + } + // Null-terminate the pointer to the HEAP. + HEAP32[((outPtr)>>2)] = 0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF32(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. + len += 4; + } + + return len; +} + +// Allocate heap space for a JS string, and write it there. +// It is the responsibility of the caller to free() that memory. +function allocateUTF8(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Allocate stack space for a JS string, and write it there. +function allocateUTF8OnStack(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Deprecated: This function should not be called because it is unsafe and does not provide +// a maximum length limit of how many bytes it is allowed to write. Prefer calling the +// function stringToUTF8Array() instead, which takes in a maximum length that can be used +// to be secure from out of bounds writes. +/** @deprecated + @param {boolean=} dontAddNull */ +function writeStringToMemory(string, buffer, dontAddNull) { + warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); + + var /** @type {number} */ lastChar, /** @type {number} */ end; + if (dontAddNull) { + // stringToUTF8Array always appends null. If we don't want to do that, remember the + // character that existed at the location where the null will be placed, and restore + // that after the write (below). + end = buffer + lengthBytesUTF8(string); + lastChar = HEAP8[end]; + } + stringToUTF8(string, buffer, Infinity); + if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. +} + +function writeArrayToMemory(array, buffer) { + assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') + HEAP8.set(array, buffer); +} + +/** @param {boolean=} dontAddNull */ +function writeAsciiToMemory(str, buffer, dontAddNull) { + for (var i = 0; i < str.length; ++i) { + assert(str.charCodeAt(i) === (str.charCodeAt(i) & 0xff)); + HEAP8[((buffer++)>>0)] = str.charCodeAt(i); + } + // Null-terminate the pointer to the HEAP. + if (!dontAddNull) HEAP8[((buffer)>>0)] = 0; +} + +// end include: runtime_strings_extra.js +// Memory management + +var HEAP, +/** @type {!ArrayBuffer} */ + buffer, +/** @type {!Int8Array} */ + HEAP8, +/** @type {!Uint8Array} */ + HEAPU8, +/** @type {!Int16Array} */ + HEAP16, +/** @type {!Uint16Array} */ + HEAPU16, +/** @type {!Int32Array} */ + HEAP32, +/** @type {!Uint32Array} */ + HEAPU32, +/** @type {!Float32Array} */ + HEAPF32, +/** @type {!Float64Array} */ + HEAPF64; + +function updateGlobalBufferAndViews(buf) { + buffer = buf; + Module['HEAP8'] = HEAP8 = new Int8Array(buf); + Module['HEAP16'] = HEAP16 = new Int16Array(buf); + Module['HEAP32'] = HEAP32 = new Int32Array(buf); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); + Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); + Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); +} + +var TOTAL_STACK = 5242880; +if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime') + +var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;legacyModuleProp('INITIAL_MEMORY', 'INITIAL_MEMORY'); + +assert(INITIAL_MEMORY >= TOTAL_STACK, 'INITIAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); + +// check for full engine support (use string 'subarray' to avoid closure compiler confusion) +assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined, + 'JS engine does not provide full typed array support'); + +// If memory is defined in wasm, the user can't provide it. +assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -s IMPORTED_MEMORY to define wasmMemory externally'); +assert(INITIAL_MEMORY == 16777216, 'Detected runtime INITIAL_MEMORY setting. Use -s IMPORTED_MEMORY to define wasmMemory dynamically'); + +// include: runtime_init_table.js +// In regular non-RELOCATABLE mode the table is exported +// from the wasm module and this will be assigned once +// the exports are available. +var wasmTable; + +// end include: runtime_init_table.js +// include: runtime_stack_check.js + + +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + var max = _emscripten_stack_get_end(); + assert((max & 3) == 0); + // The stack grows downwards + HEAP32[((max + 4)>>2)] = 0x2135467; + HEAP32[((max + 8)>>2)] = 0x89BACDFE; + // Also test the global address 0 for integrity. + HEAP32[0] = 0x63736d65; /* 'emsc' */ +} + +function checkStackCookie() { + if (ABORT) return; + var max = _emscripten_stack_get_end(); + var cookie1 = HEAPU32[((max + 4)>>2)]; + var cookie2 = HEAPU32[((max + 8)>>2)]; + if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) { + abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x' + cookie2.toString(16) + ' 0x' + cookie1.toString(16)); + } + // Also test the global address 0 for integrity. + if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); +} + +// end include: runtime_stack_check.js +// include: runtime_assertions.js + + +// Endianness check +(function() { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -s SUPPORT_BIG_ENDIAN=1 to bypass)'; +})(); + +// end include: runtime_assertions.js +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called + +var runtimeInitialized = false; +var runtimeExited = false; +var runtimeKeepaliveCounter = 0; + +function keepRuntimeAlive() { + return noExitRuntime || runtimeKeepaliveCounter > 0; +} + +function preRun() { + + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPRERUN__); +} + +function initRuntime() { + checkStackCookie(); + assert(!runtimeInitialized); + runtimeInitialized = true; + + + callRuntimeCallbacks(__ATINIT__); +} + +function exitRuntime() { + checkStackCookie(); + runtimeExited = true; +} + +function postRun() { + checkStackCookie(); + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnExit(cb) { +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +// include: runtime_math.js + + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc + +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'); +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'); +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'); +assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); + +// end include: runtime_math.js +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; + +function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } +} + +function addRunDependency(id) { + runDependencies++; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval != 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(function() { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err('dependency: ' + dep); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + } + } else { + err('warning: run dependency added without ID'); + } +} + +function removeRunDependency(id) { + runDependencies--; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +Module["preloadedImages"] = {}; // maps url to image data +Module["preloadedAudios"] = {}; // maps url to audio data + +/** @param {string|number=} what */ +function abort(what) { + { + if (Module['onAbort']) { + Module['onAbort'](what); + } + } + + what = 'Aborted(' + what + ')'; + // TODO(sbc): Should we remove printing and leave it up to whoever + // catches the exception? + err(what); + + ABORT = true; + EXITSTATUS = 1; + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + + // Suppress closure compiler warning here. Closure compiler's builtin extern + // defintion for WebAssembly.RuntimeError claims it takes no arguments even + // though it can. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. + + /** @suppress {checkTypes} */ + var e = new WebAssembly.RuntimeError(what); + + readyPromiseReject(e); + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +// {{MEM_INITIALIZER}} + +// include: memoryprofiler.js + + +// end include: memoryprofiler.js +// show errors on likely calls to FS when it was not included +var FS = { + error: function() { + abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -s FORCE_FILESYSTEM=1'); + }, + init: function() { FS.error() }, + createDataFile: function() { FS.error() }, + createPreloadedFile: function() { FS.error() }, + createLazyFile: function() { FS.error() }, + open: function() { FS.error() }, + mkdev: function() { FS.error() }, + registerDevice: function() { FS.error() }, + analyzePath: function() { FS.error() }, + loadFilesFromDB: function() { FS.error() }, + + ErrnoError: function ErrnoError() { FS.error() }, +}; +Module['FS_createDataFile'] = FS.createDataFile; +Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + +// include: URIUtils.js + + +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = 'data:application/octet-stream;base64,'; + +// Indicates whether filename is a base64 data URI. +function isDataURI(filename) { + // Prefix of data URIs emitted by SINGLE_FILE and related options. + return filename.startsWith(dataURIPrefix); +} + +// Indicates whether filename is delivered via file protocol (as opposed to http/https) +function isFileURI(filename) { + return filename.startsWith('file://'); +} + +// end include: URIUtils.js +/** @param {boolean=} fixedasm */ +function createExportWrapper(name, fixedasm) { + return function() { + var displayName = name; + var asm = fixedasm; + if (!fixedasm) { + asm = Module['asm']; + } + assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization'); + assert(!runtimeExited, 'native function `' + displayName + '` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + if (!asm[name]) { + assert(asm[name], 'exported native function `' + displayName + '` not found'); + } + return asm[name].apply(null, arguments); + }; +} + +var wasmBinaryFile; + wasmBinaryFile = 'base32.wasm'; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + +function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } + catch (err) { + abort(err); + } +} + +function getBinaryPromise() { + // If we don't have the binary yet, try to to load it asynchronously. + // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. + // See https://github.com/github/fetch/pull/92#issuecomment-140665932 + // Cordova or Electron apps are typically loaded from a file:// url. + // So use fetch if it is available and the url is not a file, otherwise fall back to XHR. + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch == 'function' + && !isFileURI(wasmBinaryFile) + ) { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + if (!response['ok']) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response['arrayBuffer'](); + }).catch(function () { + return getBinary(wasmBinaryFile); + }); + } + else { + if (readAsync) { + // fetch is not available or url is file => try XHR (readAsync uses XHR internally) + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))) }, reject) + }); + } + } + } + + // Otherwise, getBinary should be able to get it synchronously + return Promise.resolve().then(function() { return getBinary(wasmBinaryFile); }); +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + // prepare imports + var info = { + 'env': asmLibraryArg, + 'wasi_snapshot_preview1': asmLibraryArg, + }; + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + var exports = instance.exports; + + Module['asm'] = exports; + + wasmMemory = Module['asm']['memory']; + assert(wasmMemory, "memory not found in wasm exports"); + // This assertion doesn't hold when emscripten is run in --post-link + // mode. + // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode. + //assert(wasmMemory.buffer.byteLength === 16777216); + updateGlobalBufferAndViews(wasmMemory.buffer); + + wasmTable = Module['asm']['__indirect_function_table']; + assert(wasmTable, "table not found in wasm exports"); + + addOnInit(Module['asm']['__wasm_call_ctors']); + + removeRunDependency('wasm-instantiate'); + } + // we can't run yet (except in a pthread, where we have a custom sync instantiator) + addRunDependency('wasm-instantiate'); + + // Prefer streaming instantiation if available. + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiationResult(result) { + // 'result' is a ResultObject object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. + receiveInstance(result['instance']); + } + + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info); + }).then(function (instance) { + return instance; + }).then(receiver, function(reason) { + err('failed to asynchronously prepare wasm: ' + reason); + + // Warn on some common problems. + if (isFileURI(wasmBinaryFile)) { + err('warning: Loading from a file URI (' + wasmBinaryFile + ') is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing'); + } + abort(reason); + }); + } + + function instantiateAsync() { + if (!wasmBinary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(wasmBinaryFile) && + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + !isFileURI(wasmBinaryFile) && + typeof fetch == 'function') { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + // Suppress closure warning here since the upstream definition for + // instantiateStreaming only allows Promise<Repsponse> rather than + // an actual Response. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed. + /** @suppress {checkTypes} */ + var result = WebAssembly.instantiateStreaming(response, info); + + return result.then( + receiveInstantiationResult, + function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err('wasm streaming compile failed: ' + reason); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer(receiveInstantiationResult); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiationResult); + } + } + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel + // to any other async startup actions they are performing. + if (Module['instantiateWasm']) { + try { + var exports = Module['instantiateWasm'](info, receiveInstance); + return exports; + } catch(e) { + err('Module.instantiateWasm callback failed with error: ' + e); + return false; + } + } + + // If instantiation fails, reject the module ready promise. + instantiateAsync().catch(readyPromiseReject); + return {}; // no exports yet; we'll fill them in later +} + +// Globals used by JS i64 conversions (see makeSetValue) +var tempDouble; +var tempI64; + +// === Body === + +var ASM_CONSTS = { + +}; + + + + + + + function callRuntimeCallbacks(callbacks) { + while (callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == 'function') { + callback(Module); // Pass the module as the first argument. + continue; + } + var func = callback.func; + if (typeof func == 'number') { + if (callback.arg === undefined) { + getWasmTableEntry(func)(); + } else { + getWasmTableEntry(func)(callback.arg); + } + } else { + func(callback.arg === undefined ? null : callback.arg); + } + } + } + + function withStackSave(f) { + var stack = stackSave(); + var ret = f(); + stackRestore(stack); + return ret; + } + function demangle(func) { + warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); + return func; + } + + function demangleAll(text) { + var regex = + /\b_Z[\w\d_]+/g; + return text.replace(regex, + function(x) { + var y = demangle(x); + return x === y ? x : (y + ' [' + x + ']'); + }); + } + + var wasmTableMirror = []; + function getWasmTableEntry(funcPtr) { + var func = wasmTableMirror[funcPtr]; + if (!func) { + if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; + wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); + } + assert(wasmTable.get(funcPtr) == func, "JavaScript-side Wasm function table mirror is out of date!"); + return func; + } + + function handleException(e) { + // Certain exception types we do not treat as errors since they are used for + // internal control flow. + // 1. ExitStatus, which is thrown by exit() + // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others + // that wish to return to JS event loop. + if (e instanceof ExitStatus || e == 'unwind') { + return EXITSTATUS; + } + quit_(1, e); + } + + function jsStackTrace() { + var error = new Error(); + if (!error.stack) { + // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, + // so try that as a special-case. + try { + throw new Error(); + } catch(e) { + error = e; + } + if (!error.stack) { + return '(no stack trace available)'; + } + } + return error.stack.toString(); + } + + function setWasmTableEntry(idx, func) { + wasmTable.set(idx, func); + wasmTableMirror[idx] = func; + } + + function stackTrace() { + var js = jsStackTrace(); + if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); + return demangleAll(js); + } + + function _emscripten_get_heap_max() { + // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate + // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side + // for any code that deals with heap sizes, which would require special + // casing all heap size related code to treat 0 specially. + return 2147483648; + } + + function emscripten_realloc_buffer(size) { + try { + // round size grow request up to wasm page size (fixed 64KB per spec) + wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16); // .grow() takes a delta compared to the previous size + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1 /*success*/; + } catch(e) { + err('emscripten_realloc_buffer: Attempted to grow heap from ' + buffer.byteLength + ' bytes to ' + size + ' bytes, but got error: ' + e); + } + // implicit 0 return to save code size (caller will cast "undefined" into 0 + // anyhow) + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = HEAPU8.length; + requestedSize = requestedSize >>> 0; + // With pthreads, races can happen (another thread might increase the size + // in between), so return a failure, and let the caller retry. + assert(requestedSize > oldSize); + + // Memory resize rules: + // 1. Always increase heap size to at least the requested size, rounded up + // to next page multiple. + // 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap + // geometrically: increase the heap size according to + // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most + // overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB). + // 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap + // linearly: increase the heap size by at least + // MEMORY_GROWTH_LINEAR_STEP bytes. + // 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by + // MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest + // 4. If we were unable to allocate as much memory, it may be due to + // over-eager decision to excessively reserve due to (3) above. + // Hence if an allocation fails, cut down on the amount of excess + // growth, in an attempt to succeed to perform a smaller allocation. + + // A limit is set for how much we can grow. We should not exceed that + // (the wasm binary specifies it, so if we tried, we'd fail anyhow). + var maxHeapSize = _emscripten_get_heap_max(); + if (requestedSize > maxHeapSize) { + err('Cannot enlarge memory, asked to go up to ' + requestedSize + ' bytes, but the limit is ' + maxHeapSize + ' bytes!'); + return false; + } + + let alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; + + // Loop through potential heap size increases. If we attempt a too eager + // reservation that fails, cut down on the attempted size and reserve a + // smaller bump instead. (max 3 times, chosen somewhat arbitrarily) + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth + // but limit overreserving (default to capping at +96MB overgrowth at most) + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 ); + + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + + return true; + } + } + err('Failed to grow the heap from ' + oldSize + ' bytes to ' + newSize + ' bytes, not enough memory!'); + return false; + } +var ASSERTIONS = true; + + + +/** @type {function(string, boolean=, number=)} */ +function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; +} + +function intArrayToString(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + var chr = array[i]; + if (chr > 0xFF) { + if (ASSERTIONS) { + assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); + } + chr &= 0xFF; + } + ret.push(String.fromCharCode(chr)); + } + return ret.join(''); +} + + +function checkIncomingModuleAPI() { + ignoredModuleProp('fetchSettings'); +} +var asmLibraryArg = { + "emscripten_resize_heap": _emscripten_resize_heap +}; +var asm = createWasm(); +/** @type {function(...*):?} */ +var ___wasm_call_ctors = Module["___wasm_call_ctors"] = createExportWrapper("__wasm_call_ctors"); + +/** @type {function(...*):?} */ +var _base32_decodeString = Module["_base32_decodeString"] = createExportWrapper("base32_decodeString"); + +/** @type {function(...*):?} */ +var _base32_encodeBytes = Module["_base32_encodeBytes"] = createExportWrapper("base32_encodeBytes"); + +/** @type {function(...*):?} */ +var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location"); + +/** @type {function(...*):?} */ +var ___stdio_exit = Module["___stdio_exit"] = createExportWrapper("__stdio_exit"); + +/** @type {function(...*):?} */ +var _malloc = Module["_malloc"] = createExportWrapper("malloc"); + +/** @type {function(...*):?} */ +var _free = Module["_free"] = createExportWrapper("free"); + +/** @type {function(...*):?} */ +var _emscripten_stack_init = Module["_emscripten_stack_init"] = function() { + return (_emscripten_stack_init = Module["_emscripten_stack_init"] = Module["asm"]["emscripten_stack_init"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = function() { + return (_emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = Module["asm"]["emscripten_stack_get_free"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_base = Module["_emscripten_stack_get_base"] = function() { + return (_emscripten_stack_get_base = Module["_emscripten_stack_get_base"] = Module["asm"]["emscripten_stack_get_base"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = function() { + return (_emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = Module["asm"]["emscripten_stack_get_end"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var stackSave = Module["stackSave"] = createExportWrapper("stackSave"); + +/** @type {function(...*):?} */ +var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore"); + +/** @type {function(...*):?} */ +var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc"); + + + + + +// === Auto-generated postamble setup entry stuff === + +Module["intArrayFromString"] = intArrayFromString; +unexportedRuntimeFunction('intArrayToString', false); +unexportedRuntimeFunction('ccall', false); +Module["cwrap"] = cwrap; +unexportedRuntimeFunction('setValue', false); +unexportedRuntimeFunction('getValue', false); +Module["allocate"] = allocate; +unexportedRuntimeFunction('UTF8ArrayToString', false); +Module["UTF8ToString"] = UTF8ToString; +unexportedRuntimeFunction('stringToUTF8Array', false); +unexportedRuntimeFunction('stringToUTF8', false); +unexportedRuntimeFunction('lengthBytesUTF8', false); +unexportedRuntimeFunction('stackTrace', false); +unexportedRuntimeFunction('addOnPreRun', false); +unexportedRuntimeFunction('addOnInit', false); +unexportedRuntimeFunction('addOnPreMain', false); +unexportedRuntimeFunction('addOnExit', false); +unexportedRuntimeFunction('addOnPostRun', false); +unexportedRuntimeFunction('writeStringToMemory', false); +unexportedRuntimeFunction('writeArrayToMemory', false); +unexportedRuntimeFunction('writeAsciiToMemory', false); +unexportedRuntimeFunction('addRunDependency', true); +unexportedRuntimeFunction('removeRunDependency', true); +unexportedRuntimeFunction('FS_createFolder', false); +unexportedRuntimeFunction('FS_createPath', true); +unexportedRuntimeFunction('FS_createDataFile', true); +unexportedRuntimeFunction('FS_createPreloadedFile', true); +unexportedRuntimeFunction('FS_createLazyFile', true); +unexportedRuntimeFunction('FS_createLink', false); +unexportedRuntimeFunction('FS_createDevice', true); +unexportedRuntimeFunction('FS_unlink', true); +unexportedRuntimeFunction('getLEB', false); +unexportedRuntimeFunction('getFunctionTables', false); +unexportedRuntimeFunction('alignFunctionTables', false); +unexportedRuntimeFunction('registerFunctions', false); +unexportedRuntimeFunction('addFunction', false); +unexportedRuntimeFunction('removeFunction', false); +unexportedRuntimeFunction('getFuncWrapper', false); +unexportedRuntimeFunction('prettyPrint', false); +unexportedRuntimeFunction('dynCall', false); +unexportedRuntimeFunction('getCompilerSetting', false); +unexportedRuntimeFunction('print', false); +unexportedRuntimeFunction('printErr', false); +unexportedRuntimeFunction('getTempRet0', false); +unexportedRuntimeFunction('setTempRet0', false); +unexportedRuntimeFunction('callMain', false); +unexportedRuntimeFunction('abort', false); +unexportedRuntimeFunction('keepRuntimeAlive', false); +unexportedRuntimeFunction('zeroMemory', false); +unexportedRuntimeFunction('stringToNewUTF8', false); +unexportedRuntimeFunction('emscripten_realloc_buffer', false); +unexportedRuntimeFunction('ENV', false); +unexportedRuntimeFunction('withStackSave', false); +unexportedRuntimeFunction('ERRNO_CODES', false); +unexportedRuntimeFunction('ERRNO_MESSAGES', false); +unexportedRuntimeFunction('setErrNo', false); +unexportedRuntimeFunction('inetPton4', false); +unexportedRuntimeFunction('inetNtop4', false); +unexportedRuntimeFunction('inetPton6', false); +unexportedRuntimeFunction('inetNtop6', false); +unexportedRuntimeFunction('readSockaddr', false); +unexportedRuntimeFunction('writeSockaddr', false); +unexportedRuntimeFunction('DNS', false); +unexportedRuntimeFunction('getHostByName', false); +unexportedRuntimeFunction('Protocols', false); +unexportedRuntimeFunction('Sockets', false); +unexportedRuntimeFunction('getRandomDevice', false); +unexportedRuntimeFunction('traverseStack', false); +unexportedRuntimeFunction('convertFrameToPC', false); +unexportedRuntimeFunction('UNWIND_CACHE', false); +unexportedRuntimeFunction('saveInUnwindCache', false); +unexportedRuntimeFunction('convertPCtoSourceLocation', false); +unexportedRuntimeFunction('readAsmConstArgsArray', false); +unexportedRuntimeFunction('readAsmConstArgs', false); +unexportedRuntimeFunction('mainThreadEM_ASM', false); +unexportedRuntimeFunction('jstoi_q', false); +unexportedRuntimeFunction('jstoi_s', false); +unexportedRuntimeFunction('getExecutableName', false); +unexportedRuntimeFunction('listenOnce', false); +unexportedRuntimeFunction('autoResumeAudioContext', false); +unexportedRuntimeFunction('dynCallLegacy', false); +unexportedRuntimeFunction('getDynCaller', false); +unexportedRuntimeFunction('dynCall', false); +unexportedRuntimeFunction('callRuntimeCallbacks', false); +unexportedRuntimeFunction('wasmTableMirror', false); +unexportedRuntimeFunction('setWasmTableEntry', false); +unexportedRuntimeFunction('getWasmTableEntry', false); +unexportedRuntimeFunction('handleException', false); +unexportedRuntimeFunction('runtimeKeepalivePush', false); +unexportedRuntimeFunction('runtimeKeepalivePop', false); +unexportedRuntimeFunction('callUserCallback', false); +unexportedRuntimeFunction('maybeExit', false); +unexportedRuntimeFunction('safeSetTimeout', false); +unexportedRuntimeFunction('asmjsMangle', false); +unexportedRuntimeFunction('asyncLoad', false); +unexportedRuntimeFunction('alignMemory', false); +unexportedRuntimeFunction('mmapAlloc', false); +unexportedRuntimeFunction('reallyNegative', false); +unexportedRuntimeFunction('unSign', false); +unexportedRuntimeFunction('reSign', false); +unexportedRuntimeFunction('formatString', false); +unexportedRuntimeFunction('PATH', false); +unexportedRuntimeFunction('PATH_FS', false); +unexportedRuntimeFunction('SYSCALLS', false); +unexportedRuntimeFunction('getSocketFromFD', false); +unexportedRuntimeFunction('getSocketAddress', false); +unexportedRuntimeFunction('JSEvents', false); +unexportedRuntimeFunction('registerKeyEventCallback', false); +unexportedRuntimeFunction('specialHTMLTargets', false); +unexportedRuntimeFunction('maybeCStringToJsString', false); +unexportedRuntimeFunction('findEventTarget', false); +unexportedRuntimeFunction('findCanvasEventTarget', false); +unexportedRuntimeFunction('getBoundingClientRect', false); +unexportedRuntimeFunction('fillMouseEventData', false); +unexportedRuntimeFunction('registerMouseEventCallback', false); +unexportedRuntimeFunction('registerWheelEventCallback', false); +unexportedRuntimeFunction('registerUiEventCallback', false); +unexportedRuntimeFunction('registerFocusEventCallback', false); +unexportedRuntimeFunction('fillDeviceOrientationEventData', false); +unexportedRuntimeFunction('registerDeviceOrientationEventCallback', false); +unexportedRuntimeFunction('fillDeviceMotionEventData', false); +unexportedRuntimeFunction('registerDeviceMotionEventCallback', false); +unexportedRuntimeFunction('screenOrientation', false); +unexportedRuntimeFunction('fillOrientationChangeEventData', false); +unexportedRuntimeFunction('registerOrientationChangeEventCallback', false); +unexportedRuntimeFunction('fillFullscreenChangeEventData', false); +unexportedRuntimeFunction('registerFullscreenChangeEventCallback', false); +unexportedRuntimeFunction('registerRestoreOldStyle', false); +unexportedRuntimeFunction('hideEverythingExceptGivenElement', false); +unexportedRuntimeFunction('restoreHiddenElements', false); +unexportedRuntimeFunction('setLetterbox', false); +unexportedRuntimeFunction('currentFullscreenStrategy', false); +unexportedRuntimeFunction('restoreOldWindowedStyle', false); +unexportedRuntimeFunction('softFullscreenResizeWebGLRenderTarget', false); +unexportedRuntimeFunction('doRequestFullscreen', false); +unexportedRuntimeFunction('fillPointerlockChangeEventData', false); +unexportedRuntimeFunction('registerPointerlockChangeEventCallback', false); +unexportedRuntimeFunction('registerPointerlockErrorEventCallback', false); +unexportedRuntimeFunction('requestPointerLock', false); +unexportedRuntimeFunction('fillVisibilityChangeEventData', false); +unexportedRuntimeFunction('registerVisibilityChangeEventCallback', false); +unexportedRuntimeFunction('registerTouchEventCallback', false); +unexportedRuntimeFunction('fillGamepadEventData', false); +unexportedRuntimeFunction('registerGamepadEventCallback', false); +unexportedRuntimeFunction('registerBeforeUnloadEventCallback', false); +unexportedRuntimeFunction('fillBatteryEventData', false); +unexportedRuntimeFunction('battery', false); +unexportedRuntimeFunction('registerBatteryEventCallback', false); +unexportedRuntimeFunction('setCanvasElementSize', false); +unexportedRuntimeFunction('getCanvasElementSize', false); +unexportedRuntimeFunction('demangle', false); +unexportedRuntimeFunction('demangleAll', false); +unexportedRuntimeFunction('jsStackTrace', false); +unexportedRuntimeFunction('stackTrace', false); +unexportedRuntimeFunction('getEnvStrings', false); +unexportedRuntimeFunction('checkWasiClock', false); +unexportedRuntimeFunction('flush_NO_FILESYSTEM', false); +unexportedRuntimeFunction('writeI53ToI64', false); +unexportedRuntimeFunction('writeI53ToI64Clamped', false); +unexportedRuntimeFunction('writeI53ToI64Signaling', false); +unexportedRuntimeFunction('writeI53ToU64Clamped', false); +unexportedRuntimeFunction('writeI53ToU64Signaling', false); +unexportedRuntimeFunction('readI53FromI64', false); +unexportedRuntimeFunction('readI53FromU64', false); +unexportedRuntimeFunction('convertI32PairToI53', false); +unexportedRuntimeFunction('convertU32PairToI53', false); +unexportedRuntimeFunction('setImmediateWrapped', false); +unexportedRuntimeFunction('clearImmediateWrapped', false); +unexportedRuntimeFunction('polyfillSetImmediate', false); +unexportedRuntimeFunction('uncaughtExceptionCount', false); +unexportedRuntimeFunction('exceptionLast', false); +unexportedRuntimeFunction('exceptionCaught', false); +unexportedRuntimeFunction('ExceptionInfo', false); +unexportedRuntimeFunction('CatchInfo', false); +unexportedRuntimeFunction('exception_addRef', false); +unexportedRuntimeFunction('exception_decRef', false); +unexportedRuntimeFunction('Browser', false); +unexportedRuntimeFunction('funcWrappers', false); +unexportedRuntimeFunction('getFuncWrapper', false); +unexportedRuntimeFunction('setMainLoop', false); +unexportedRuntimeFunction('wget', false); +unexportedRuntimeFunction('FS', false); +unexportedRuntimeFunction('MEMFS', false); +unexportedRuntimeFunction('TTY', false); +unexportedRuntimeFunction('PIPEFS', false); +unexportedRuntimeFunction('SOCKFS', false); +unexportedRuntimeFunction('_setNetworkCallback', false); +unexportedRuntimeFunction('tempFixedLengthArray', false); +unexportedRuntimeFunction('miniTempWebGLFloatBuffers', false); +unexportedRuntimeFunction('heapObjectForWebGLType', false); +unexportedRuntimeFunction('heapAccessShiftForWebGLHeap', false); +unexportedRuntimeFunction('GL', false); +unexportedRuntimeFunction('emscriptenWebGLGet', false); +unexportedRuntimeFunction('computeUnpackAlignedImageSize', false); +unexportedRuntimeFunction('emscriptenWebGLGetTexPixelData', false); +unexportedRuntimeFunction('emscriptenWebGLGetUniform', false); +unexportedRuntimeFunction('webglGetUniformLocation', false); +unexportedRuntimeFunction('webglPrepareUniformLocationsBeforeFirstUse', false); +unexportedRuntimeFunction('webglGetLeftBracePos', false); +unexportedRuntimeFunction('emscriptenWebGLGetVertexAttrib', false); +unexportedRuntimeFunction('writeGLArray', false); +unexportedRuntimeFunction('AL', false); +unexportedRuntimeFunction('SDL_unicode', false); +unexportedRuntimeFunction('SDL_ttfContext', false); +unexportedRuntimeFunction('SDL_audio', false); +unexportedRuntimeFunction('SDL', false); +unexportedRuntimeFunction('SDL_gfx', false); +unexportedRuntimeFunction('GLUT', false); +unexportedRuntimeFunction('EGL', false); +unexportedRuntimeFunction('GLFW_Window', false); +unexportedRuntimeFunction('GLFW', false); +unexportedRuntimeFunction('GLEW', false); +unexportedRuntimeFunction('IDBStore', false); +unexportedRuntimeFunction('runAndAbortIfError', false); +unexportedRuntimeFunction('warnOnce', false); +unexportedRuntimeFunction('stackSave', false); +unexportedRuntimeFunction('stackRestore', false); +unexportedRuntimeFunction('stackAlloc', false); +unexportedRuntimeFunction('AsciiToString', false); +unexportedRuntimeFunction('stringToAscii', false); +unexportedRuntimeFunction('UTF16ToString', false); +unexportedRuntimeFunction('stringToUTF16', false); +unexportedRuntimeFunction('lengthBytesUTF16', false); +unexportedRuntimeFunction('UTF32ToString', false); +unexportedRuntimeFunction('stringToUTF32', false); +unexportedRuntimeFunction('lengthBytesUTF32', false); +Module["allocateUTF8"] = allocateUTF8; +unexportedRuntimeFunction('allocateUTF8OnStack', false); +Module["writeStackCookie"] = writeStackCookie; +Module["checkStackCookie"] = checkStackCookie; +unexportedRuntimeSymbol('ALLOC_NORMAL', false); +unexportedRuntimeSymbol('ALLOC_STACK', false); + +var calledRun; + +/** + * @constructor + * @this {ExitStatus} + */ +function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; +} + +var calledMain = false; + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +}; + +function stackCheckInit() { + // This is normally called automatically during __wasm_call_ctors but need to + // get these values before even running any of the ctors so we call it redundantly + // here. + // TODO(sbc): Move writeStackCookie to native to to avoid this. + _emscripten_stack_init(); + writeStackCookie(); +} + +/** @type {function(Array=)} */ +function run(args) { + args = args || arguments_; + + if (runDependencies > 0) { + return; + } + + stackCheckInit(); + + preRun(); + + // a preRun added a dependency, run will be called later + if (runDependencies > 0) { + return; + } + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + readyPromiseResolve(Module); + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} +Module['run'] = run; + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var oldOut = out; + var oldErr = err; + var has = false; + out = err = (x) => { + has = true; + } + try { // it doesn't matter if it fails + var flush = null; + if (flush) flush(); + } catch(e) {} + out = oldOut; + err = oldErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.'); + warnOnce('(this may also be due to not including full filesystem support - try building with -s FORCE_FILESYSTEM=1)'); + } +} + +/** @param {boolean|number=} implicit */ +function exit(status, implicit) { + EXITSTATUS = status; + + // Skip this check if the runtime is being kept alive deliberately. + // For example if `exit_with_live_runtime` is called. + if (!runtimeKeepaliveCounter) { + checkUnflushedContent(); + } + + if (keepRuntimeAlive()) { + // if exit() was called, we may warn the user if the runtime isn't actually being shut down + if (!implicit) { + var msg = 'program exited (with status: ' + status + '), but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)'; + readyPromiseReject(msg); + err(msg); + } + } else { + exitRuntime(); + } + + procExit(status); +} + +function procExit(code) { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + if (Module['onExit']) Module['onExit'](code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); +} + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + +run(); + + + + + + + + return Base32Module.ready +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = Base32Module; +else if (typeof define === 'function' && define['amd']) + define([], function() { return Base32Module; }); +else if (typeof exports === 'object') + exports["Base32Module"] = Base32Module; diff --git a/source/_static/baseX_converter/base32.wasm b/source/_static/baseX_converter/base32.wasm Binary files differ. diff --git a/source/_static/baseX_converter/base8.js b/source/_static/baseX_converter/base8.js @@ -0,0 +1,2440 @@ + +var Base8Module = (() => { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; + return ( +function(Base8Module) { + Base8Module = Base8Module || {}; + + + +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Base8Module != 'undefined' ? Base8Module : {}; + +// See https://caniuse.com/mdn-javascript_builtins_object_assign + +// Set up the promise that indicates the Module is initialized +var readyPromiseResolve, readyPromiseReject; +Module['ready'] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; +}); + + if (!Object.getOwnPropertyDescriptor(Module['ready'], '_base8_encodeBytes')) { + Object.defineProperty(Module['ready'], '_base8_encodeBytes', { configurable: true, get: function() { abort('You are getting _base8_encodeBytes on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + Object.defineProperty(Module['ready'], '_base8_encodeBytes', { configurable: true, set: function() { abort('You are setting _base8_encodeBytes on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + } + + + if (!Object.getOwnPropertyDescriptor(Module['ready'], '_base8_stringToNum')) { + Object.defineProperty(Module['ready'], '_base8_stringToNum', { configurable: true, get: function() { abort('You are getting _base8_stringToNum on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + Object.defineProperty(Module['ready'], '_base8_stringToNum', { configurable: true, set: function() { abort('You are setting _base8_stringToNum on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + } + + + if (!Object.getOwnPropertyDescriptor(Module['ready'], '_base8_decodeNum')) { + Object.defineProperty(Module['ready'], '_base8_decodeNum', { configurable: true, get: function() { abort('You are getting _base8_decodeNum on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + Object.defineProperty(Module['ready'], '_base8_decodeNum', { configurable: true, set: function() { abort('You are setting _base8_decodeNum on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + } + + + if (!Object.getOwnPropertyDescriptor(Module['ready'], '_malloc')) { + Object.defineProperty(Module['ready'], '_malloc', { configurable: true, get: function() { abort('You are getting _malloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + Object.defineProperty(Module['ready'], '_malloc', { configurable: true, set: function() { abort('You are setting _malloc on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + } + + + if (!Object.getOwnPropertyDescriptor(Module['ready'], '_free')) { + Object.defineProperty(Module['ready'], '_free', { configurable: true, get: function() { abort('You are getting _free on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + Object.defineProperty(Module['ready'], '_free', { configurable: true, set: function() { abort('You are setting _free on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + } + + + if (!Object.getOwnPropertyDescriptor(Module['ready'], '___stdio_exit')) { + Object.defineProperty(Module['ready'], '___stdio_exit', { configurable: true, get: function() { abort('You are getting ___stdio_exit on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + Object.defineProperty(Module['ready'], '___stdio_exit', { configurable: true, set: function() { abort('You are setting ___stdio_exit on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + } + + + if (!Object.getOwnPropertyDescriptor(Module['ready'], 'onRuntimeInitialized')) { + Object.defineProperty(Module['ready'], 'onRuntimeInitialized', { configurable: true, get: function() { abort('You are getting onRuntimeInitialized on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + Object.defineProperty(Module['ready'], 'onRuntimeInitialized', { configurable: true, set: function() { abort('You are setting onRuntimeInitialized on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } }); + } + + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) +// {{PRE_JSES}} + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = Object.assign({}, Module); + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = (status, toThrow) => { + throw toThrow; +}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +// Attempt to auto-detect the environment +var ENVIRONMENT_IS_WEB = typeof window == 'object'; +var ENVIRONMENT_IS_WORKER = typeof importScripts == 'function'; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string'; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (Module['ENVIRONMENT']) { + 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)'); +} + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var read_, + readAsync, + readBinary, + setWindowTitle; + +// Normally we don't log exceptions but instead let them bubble out the top +// level where the embedding environment (e.g. the browser) can handle +// them. +// However under v8 and node we sometimes exit the process direcly in which case +// its up to use us to log the exception before exiting. +// If we fix https://github.com/emscripten-core/emscripten/issues/15080 +// this may no longer be needed under node. +function logExceptionOnExit(e) { + if (e instanceof ExitStatus) return; + let toLog = e; + if (e && typeof e == 'object' && e.stack) { + toLog = [e, e.stack]; + } + err('exiting due to exception: ' + toLog); +} + +var fs; +var nodePath; +var requireNodeFS; + +if (ENVIRONMENT_IS_NODE) { + if (!(typeof process == 'object' && typeof require == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require('path').dirname(scriptDirectory) + '/'; + } else { + scriptDirectory = __dirname + '/'; + } + +// include: node_shell_read.js + + +requireNodeFS = () => { + // Use nodePath as the indicator for these not being initialized, + // since in some environments a global fs may have already been + // created. + if (!nodePath) { + fs = require('fs'); + nodePath = require('path'); + } +}; + +read_ = function shell_read(filename, binary) { + requireNodeFS(); + filename = nodePath['normalize'](filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); +}; + +readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; +}; + +readAsync = (filename, onload, onerror) => { + requireNodeFS(); + filename = nodePath['normalize'](filename); + fs.readFile(filename, function(err, data) { + if (err) onerror(err); + else onload(data.buffer); + }); +}; + +// end include: node_shell_read.js + if (process['argv'].length > 1) { + thisProgram = process['argv'][1].replace(/\\/g, '/'); + } + + arguments_ = process['argv'].slice(2); + + // MODULARIZE will export the module in the proper place outside, we don't need to export here + + process['on']('uncaughtException', function(ex) { + // suppress ExitStatus exceptions from showing an error + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + + // Without this older versions of node (< v15) will log unhandled rejections + // but return 0, which is not normally the desired behaviour. This is + // not be needed with node v15 and about because it is now the default + // behaviour: + // See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode + process['on']('unhandledRejection', function(reason) { throw reason; }); + + quit_ = (status, toThrow) => { + if (keepRuntimeAlive()) { + process['exitCode'] = status; + throw toThrow; + } + logExceptionOnExit(toThrow); + process['exit'](status); + }; + + Module['inspect'] = function () { return '[Emscripten Module object]'; }; + +} else +if (ENVIRONMENT_IS_SHELL) { + + if ((typeof process == 'object' && typeof require === 'function') || typeof window == 'object' || typeof importScripts == 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + if (typeof read != 'undefined') { + read_ = function shell_read(f) { + return read(f); + }; + } + + readBinary = function readBinary(f) { + let data; + if (typeof readbuffer == 'function') { + return new Uint8Array(readbuffer(f)); + } + data = read(f, 'binary'); + assert(typeof data == 'object'); + return data; + }; + + readAsync = function readAsync(f, onload, onerror) { + setTimeout(() => onload(readBinary(f)), 0); + }; + + if (typeof scriptArgs != 'undefined') { + arguments_ = scriptArgs; + } else if (typeof arguments != 'undefined') { + arguments_ = arguments; + } + + if (typeof quit == 'function') { + quit_ = (status, toThrow) => { + // Unlike node which has process.exitCode, d8 has no such mechanism. So we + // have no way to set the exit code and then let the program exit with + // that code when it naturally stops running (say, when all setTimeouts + // have completed). For that reason we must call `quit` - the only way to + // set the exit code - but quit also halts immediately, so we need to be + // careful of whether the runtime is alive or not, which is why this code + // path looks different than node. It also has the downside that it will + // halt the entire program when no code remains to run, which means this + // is not friendly for bundling this code into a larger codebase, and for + // that reason the "shell" environment is mainly useful for testing whole + // programs by themselves, basically. + if (runtimeKeepaliveCounter) { + throw toThrow; + } + logExceptionOnExit(toThrow); + quit(status); + }; + } + + if (typeof print != 'undefined') { + // Prefer to use print/printErr where they exist, as they usually work better. + if (typeof console == 'undefined') console = /** @type{!Console} */({}); + console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); + console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr != 'undefined' ? printErr : print); + } + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (typeof document != 'undefined' && document.currentScript) { // web + scriptDirectory = document.currentScript.src; + } + // When MODULARIZE, this JS may be executed later, after document.currentScript + // is gone, so we saved it, and we use it here instead of any other info. + if (_scriptDir) { + scriptDirectory = _scriptDir; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), + // they are removed because they could contain a slash. + if (scriptDirectory.indexOf('blob:') !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1); + } else { + scriptDirectory = ''; + } + + if (!(typeof window == 'object' || typeof importScripts == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + // Differentiate the Web Worker from the Node Worker case, as reading must + // be done differently. + { +// include: web_or_worker_shell_read.js + + + read_ = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + } + + if (ENVIRONMENT_IS_WORKER) { + readBinary = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = (url, onload, onerror) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = () => { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + } + +// end include: web_or_worker_shell_read.js + } + + setWindowTitle = (title) => document.title = title; +} else +{ + throw new Error('environment detection error'); +} + +var out = Module['print'] || console.log.bind(console); +var err = Module['printErr'] || console.warn.bind(console); + +// Merge back in the overrides +Object.assign(Module, moduleOverrides); +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. +moduleOverrides = null; +checkIncomingModuleAPI(); + +// Emit code to handle expected values on the Module object. This applies Module.x +// to the proper local x. This has two benefits: first, we only emit it if it is +// expected to arrive, and second, by using a local everywhere else that can be +// minified. + +if (Module['arguments']) arguments_ = Module['arguments'];legacyModuleProp('arguments', 'arguments_'); + +if (Module['thisProgram']) thisProgram = Module['thisProgram'];legacyModuleProp('thisProgram', 'thisProgram'); + +if (Module['quit']) quit_ = Module['quit'];legacyModuleProp('quit', 'quit_'); + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message +// Assertions on removed incoming Module JS APIs. +assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['read'] == 'undefined', 'Module.read option was removed (modify read_ in JS)'); +assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); +assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); +assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)'); +assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); +legacyModuleProp('read', 'read_'); +legacyModuleProp('readAsync', 'readAsync'); +legacyModuleProp('readBinary', 'readBinary'); +legacyModuleProp('setWindowTitle', 'setWindowTitle'); +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; +function alignMemory() { abort('`alignMemory` is now a library function and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line'); } + +assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-s ENVIRONMENT` to enable."); + + + + +var STACK_ALIGN = 16; +var POINTER_SIZE = 4; + +function getNativeTypeSize(type) { + switch (type) { + case 'i1': case 'i8': return 1; + case 'i16': return 2; + case 'i32': return 4; + case 'i64': return 8; + case 'float': return 4; + case 'double': return 8; + default: { + if (type[type.length - 1] === '*') { + return POINTER_SIZE; + } else if (type[0] === 'i') { + const bits = Number(type.substr(1)); + assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); + return bits / 8; + } else { + return 0; + } + } + } +} + +function warnOnce(text) { + if (!warnOnce.shown) warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + err(text); + } +} + +// include: runtime_functions.js + + +// Wraps a JS function as a wasm function with a given signature. +function convertJsFunctionToWasm(func, sig) { + + // If the type reflection proposal is available, use the new + // "WebAssembly.Function" constructor. + // Otherwise, construct a minimal wasm module importing the JS function and + // re-exporting it. + if (typeof WebAssembly.Function == "function") { + var typeNames = { + 'i': 'i32', + 'j': 'i64', + 'f': 'f32', + 'd': 'f64' + }; + var type = { + parameters: [], + results: sig[0] == 'v' ? [] : [typeNames[sig[0]]] + }; + for (var i = 1; i < sig.length; ++i) { + type.parameters.push(typeNames[sig[i]]); + } + return new WebAssembly.Function(type, func); + } + + // The module is static, with the exception of the type section, which is + // generated based on the signature passed in. + var typeSection = [ + 0x01, // id: section, + 0x00, // length: 0 (placeholder) + 0x01, // count: 1 + 0x60, // form: func + ]; + var sigRet = sig.slice(0, 1); + var sigParam = sig.slice(1); + var typeCodes = { + 'i': 0x7f, // i32 + 'j': 0x7e, // i64 + 'f': 0x7d, // f32 + 'd': 0x7c, // f64 + }; + + // Parameters, length + signatures + typeSection.push(sigParam.length); + for (var i = 0; i < sigParam.length; ++i) { + typeSection.push(typeCodes[sigParam[i]]); + } + + // Return values, length + signatures + // With no multi-return in MVP, either 0 (void) or 1 (anything else) + if (sigRet == 'v') { + typeSection.push(0x00); + } else { + typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); + } + + // Write the overall length of the type section back into the section header + // (excepting the 2 bytes for the section id and length) + typeSection[1] = typeSection.length - 2; + + // Rest of the module is static + var bytes = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") + 0x01, 0x00, 0x00, 0x00, // version: 1 + ].concat(typeSection, [ + 0x02, 0x07, // import section + // (import "e" "f" (func 0 (type 0))) + 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, + 0x07, 0x05, // export section + // (export "f" (func 0 (type 0))) + 0x01, 0x01, 0x66, 0x00, 0x00, + ])); + + // We can compile this wasm module synchronously because it is very small. + // This accepts an import (at "e.f"), that it reroutes to an export (at "f") + var module = new WebAssembly.Module(bytes); + var instance = new WebAssembly.Instance(module, { + 'e': { + 'f': func + } + }); + var wrappedFunc = instance.exports['f']; + return wrappedFunc; +} + +var freeTableIndexes = []; + +// Weak map of functions in the table to their indexes, created on first use. +var functionsInTableMap; + +function getEmptyTableSlot() { + // Reuse a free index if there is one, otherwise grow. + if (freeTableIndexes.length) { + return freeTableIndexes.pop(); + } + // Grow the table + try { + wasmTable.grow(1); + } catch (err) { + if (!(err instanceof RangeError)) { + throw err; + } + throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.'; + } + return wasmTable.length - 1; +} + +function updateTableMap(offset, count) { + for (var i = offset; i < offset + count; i++) { + var item = getWasmTableEntry(i); + // Ignore null values. + if (item) { + functionsInTableMap.set(item, i); + } + } +} + +/** + * Add a function to the table. + * 'sig' parameter is required if the function being added is a JS function. + * @param {string=} sig + */ +function addFunction(func, sig) { + assert(typeof func != 'undefined'); + + // Check if the function is already in the table, to ensure each function + // gets a unique index. First, create the map if this is the first use. + if (!functionsInTableMap) { + functionsInTableMap = new WeakMap(); + updateTableMap(0, wasmTable.length); + } + if (functionsInTableMap.has(func)) { + return functionsInTableMap.get(func); + } + + // It's not in the table, add it now. + + var ret = getEmptyTableSlot(); + + // Set the new value. + try { + // Attempting to call this with JS function will cause of table.set() to fail + setWasmTableEntry(ret, func); + } catch (err) { + if (!(err instanceof TypeError)) { + throw err; + } + assert(typeof sig != 'undefined', 'Missing signature argument to addFunction: ' + func); + var wrapped = convertJsFunctionToWasm(func, sig); + setWasmTableEntry(ret, wrapped); + } + + functionsInTableMap.set(func, ret); + + return ret; +} + +function removeFunction(index) { + functionsInTableMap.delete(getWasmTableEntry(index)); + freeTableIndexes.push(index); +} + +// end include: runtime_functions.js +// include: runtime_debug.js + + +function legacyModuleProp(prop, newName) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + get: function() { + abort('Module.' + prop + ' has been replaced with plain ' + newName + ' (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); + } + }); + } +} + +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort('`Module.' + prop + '` was supplied but `' + prop + '` not included in INCOMING_MODULE_JS_API'); + } +} + +function unexportedMessage(sym, isFSSybol) { + var msg = "'" + sym + "' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"; + if (isFSSybol) { + msg += '. Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you'; + } + return msg; +} + +function unexportedRuntimeSymbol(sym, isFSSybol) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get: function() { + abort(unexportedMessage(sym, isFSSybol)); + } + }); + } +} + +function unexportedRuntimeFunction(sym, isFSSybol) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Module[sym] = () => abort(unexportedMessage(sym, isFSSybol)); + } +} + +// end include: runtime_debug.js +var tempRet0 = 0; +var setTempRet0 = (value) => { tempRet0 = value; }; +var getTempRet0 = () => tempRet0; + + + +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary; +if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];legacyModuleProp('wasmBinary', 'wasmBinary'); +var noExitRuntime = Module['noExitRuntime'] || true;legacyModuleProp('noExitRuntime', 'noExitRuntime'); + +if (typeof WebAssembly != 'object') { + abort('no native wasm support detected'); +} + +// include: runtime_safe_heap.js + + +// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking. +// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties) + +/** @param {number} ptr + @param {number} value + @param {string} type + @param {number|boolean=} noSafe */ +function setValue(ptr, value, type = 'i8', noSafe) { + if (type.charAt(type.length-1) === '*') type = 'i32'; + switch (type) { + case 'i1': HEAP8[((ptr)>>0)] = value; break; + case 'i8': HEAP8[((ptr)>>0)] = value; break; + case 'i16': HEAP16[((ptr)>>1)] = value; break; + case 'i32': HEAP32[((ptr)>>2)] = value; break; + case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break; + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + default: abort('invalid type for setValue: ' + type); + } +} + +/** @param {number} ptr + @param {string} type + @param {number|boolean=} noSafe */ +function getValue(ptr, type = 'i8', noSafe) { + if (type.charAt(type.length-1) === '*') type = 'i32'; + switch (type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': return HEAP32[((ptr)>>2)]; + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return Number(HEAPF64[((ptr)>>3)]); + default: abort('invalid type for getValue: ' + type); + } + return null; +} + +// end include: runtime_safe_heap.js +// Wasm globals + +var wasmMemory; + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS; + +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed' + (text ? ': ' + text : '')); + } +} + +// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) +function getCFunc(ident) { + var func = Module['_' + ident]; // closure exported function + assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); + return func; +} + +// C calling interface. +/** @param {string|null=} returnType + @param {Array=} argTypes + @param {Arguments|Array=} args + @param {Object=} opts */ +function ccall(ident, returnType, argTypes, args, opts) { + // For fast lookup of conversion functions + var toC = { + 'string': function(str) { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { // null string + // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' + var len = (str.length << 2) + 1; + ret = stackAlloc(len); + stringToUTF8(str, ret, len); + } + return ret; + }, + 'array': function(arr) { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + } + }; + + function convertReturnValue(ret) { + if (returnType === 'string') return UTF8ToString(ret); + if (returnType === 'boolean') return Boolean(ret); + return ret; + } + + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + assert(returnType !== 'array', 'Return type should not be "array".'); + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func.apply(null, cArgs); + function onDone(ret) { + if (stack !== 0) stackRestore(stack); + return convertReturnValue(ret); + } + + ret = onDone(ret); + return ret; +} + +/** @param {string=} returnType + @param {Array=} argTypes + @param {Object=} opts */ +function cwrap(ident, returnType, argTypes, opts) { + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + } +} + +// We used to include malloc/free by default in the past. Show a helpful error in +// builds with assertions. + +// include: runtime_legacy.js + + +var ALLOC_NORMAL = 0; // Tries to use _malloc() +var ALLOC_STACK = 1; // Lives for the duration of the current function call + +/** + * allocate(): This function is no longer used by emscripten but is kept around to avoid + * breaking external users. + * You should normally not use allocate(), and instead allocate + * memory using _malloc()/stackAlloc(), initialize it with + * setValue(), and so forth. + * @param {(Uint8Array|Array<number>)} slab: An array of data. + * @param {number=} allocator : How to allocate memory, see ALLOC_* + */ +function allocate(slab, allocator) { + var ret; + assert(typeof allocator == 'number', 'allocate no longer takes a type argument') + assert(typeof slab != 'number', 'allocate no longer takes a number as arg0') + + if (allocator == ALLOC_STACK) { + ret = stackAlloc(slab.length); + } else { + ret = _malloc(slab.length); + } + + if (!slab.subarray && !slab.slice) { + slab = new Uint8Array(slab); + } + HEAPU8.set(slab, ret); + return ret; +} + +// end include: runtime_legacy.js +// include: runtime_strings.js + + +// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime. + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns +// a copy of that string as a Javascript String object. + +var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + +/** + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) + while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ''; + // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heap[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heap[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heap[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + } + return str; +} + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a +// copy of that string as a Javascript String object. +// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit +// this parameter to scan the string until the first \0 byte. If maxBytesToRead is +// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the +// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will +// not produce a string of exact length [ptr, ptr+maxBytesToRead[) +// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may +// throw JS JIT optimizations off, so it is worth to consider consistently using one +// style or the other. +/** + * @param {number} ptr + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ToString(ptr, maxBytesToRead) { + ; + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; +} + +// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', +// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// heap: the array to copy to. Each index in this array is assumed to be one 8-byte element. +// outIdx: The starting offset in the array to begin the copying. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. +// This count should include the null terminator, +// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. +// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u > 0x10FFFF) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).'); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8(str, outPtr, maxBytesToWrite) { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. +function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); + if (u <= 0x7F) ++len; + else if (u <= 0x7FF) len += 2; + else if (u <= 0xFFFF) len += 3; + else len += 4; + } + return len; +} + +// end include: runtime_strings.js +// include: runtime_strings_extra.js + + +// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime. + +// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +function AsciiToString(ptr) { + var str = ''; + while (1) { + var ch = HEAPU8[((ptr++)>>0)]; + if (!ch) return str; + str += String.fromCharCode(ch); + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. + +function stringToAscii(str, outPtr) { + return writeAsciiToMemory(str, outPtr, false); +} + +// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +var UTF16Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf-16le') : undefined; + +function UTF16ToString(ptr, maxBytesToRead) { + assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); + var endPtr = ptr; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + var idx = endPtr >> 1; + var maxIdx = idx + maxBytesToRead / 2; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; + endPtr = idx << 1; + + if (endPtr - ptr > 32 && UTF16Decoder) { + return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); + } else { + var str = ''; + + // If maxBytesToRead is not passed explicitly, it will be undefined, and the for-loop's condition + // will always evaluate to true. The loop is then terminated on the first null char. + for (var i = 0; !(i >= maxBytesToRead / 2); ++i) { + var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; + if (codeUnit == 0) break; + // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. + str += String.fromCharCode(codeUnit); + } + + return str; + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. +// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. +// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF16(str, outPtr, maxBytesToWrite) { + assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; // Null terminator. + var startPtr = outPtr; + var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + HEAP16[((outPtr)>>1)] = codeUnit; + outPtr += 2; + } + // Null-terminate the pointer to the HEAP. + HEAP16[((outPtr)>>1)] = 0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF16(str) { + return str.length*2; +} + +function UTF32ToString(ptr, maxBytesToRead) { + assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); + var i = 0; + + var str = ''; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(i >= maxBytesToRead / 4)) { + var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; + if (utf32 == 0) break; + ++i; + // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + if (utf32 >= 0x10000) { + var ch = utf32 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } else { + str += String.fromCharCode(utf32); + } + } + return str; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. +// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. +// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF32(str, outPtr, maxBytesToWrite) { + assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 4) return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { + var trailSurrogate = str.charCodeAt(++i); + codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); + } + HEAP32[((outPtr)>>2)] = codeUnit; + outPtr += 4; + if (outPtr + 4 > endPtr) break; + } + // Null-terminate the pointer to the HEAP. + HEAP32[((outPtr)>>2)] = 0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF32(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. + len += 4; + } + + return len; +} + +// Allocate heap space for a JS string, and write it there. +// It is the responsibility of the caller to free() that memory. +function allocateUTF8(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Allocate stack space for a JS string, and write it there. +function allocateUTF8OnStack(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Deprecated: This function should not be called because it is unsafe and does not provide +// a maximum length limit of how many bytes it is allowed to write. Prefer calling the +// function stringToUTF8Array() instead, which takes in a maximum length that can be used +// to be secure from out of bounds writes. +/** @deprecated + @param {boolean=} dontAddNull */ +function writeStringToMemory(string, buffer, dontAddNull) { + warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); + + var /** @type {number} */ lastChar, /** @type {number} */ end; + if (dontAddNull) { + // stringToUTF8Array always appends null. If we don't want to do that, remember the + // character that existed at the location where the null will be placed, and restore + // that after the write (below). + end = buffer + lengthBytesUTF8(string); + lastChar = HEAP8[end]; + } + stringToUTF8(string, buffer, Infinity); + if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. +} + +function writeArrayToMemory(array, buffer) { + assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') + HEAP8.set(array, buffer); +} + +/** @param {boolean=} dontAddNull */ +function writeAsciiToMemory(str, buffer, dontAddNull) { + for (var i = 0; i < str.length; ++i) { + assert(str.charCodeAt(i) === (str.charCodeAt(i) & 0xff)); + HEAP8[((buffer++)>>0)] = str.charCodeAt(i); + } + // Null-terminate the pointer to the HEAP. + if (!dontAddNull) HEAP8[((buffer)>>0)] = 0; +} + +// end include: runtime_strings_extra.js +// Memory management + +var HEAP, +/** @type {!ArrayBuffer} */ + buffer, +/** @type {!Int8Array} */ + HEAP8, +/** @type {!Uint8Array} */ + HEAPU8, +/** @type {!Int16Array} */ + HEAP16, +/** @type {!Uint16Array} */ + HEAPU16, +/** @type {!Int32Array} */ + HEAP32, +/** @type {!Uint32Array} */ + HEAPU32, +/** @type {!Float32Array} */ + HEAPF32, +/** @type {!Float64Array} */ + HEAPF64; + +function updateGlobalBufferAndViews(buf) { + buffer = buf; + Module['HEAP8'] = HEAP8 = new Int8Array(buf); + Module['HEAP16'] = HEAP16 = new Int16Array(buf); + Module['HEAP32'] = HEAP32 = new Int32Array(buf); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); + Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); + Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); +} + +var TOTAL_STACK = 5242880; +if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime') + +var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;legacyModuleProp('INITIAL_MEMORY', 'INITIAL_MEMORY'); + +assert(INITIAL_MEMORY >= TOTAL_STACK, 'INITIAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); + +// check for full engine support (use string 'subarray' to avoid closure compiler confusion) +assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined, + 'JS engine does not provide full typed array support'); + +// If memory is defined in wasm, the user can't provide it. +assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -s IMPORTED_MEMORY to define wasmMemory externally'); +assert(INITIAL_MEMORY == 16777216, 'Detected runtime INITIAL_MEMORY setting. Use -s IMPORTED_MEMORY to define wasmMemory dynamically'); + +// include: runtime_init_table.js +// In regular non-RELOCATABLE mode the table is exported +// from the wasm module and this will be assigned once +// the exports are available. +var wasmTable; + +// end include: runtime_init_table.js +// include: runtime_stack_check.js + + +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + var max = _emscripten_stack_get_end(); + assert((max & 3) == 0); + // The stack grows downwards + HEAP32[((max + 4)>>2)] = 0x2135467; + HEAP32[((max + 8)>>2)] = 0x89BACDFE; + // Also test the global address 0 for integrity. + HEAP32[0] = 0x63736d65; /* 'emsc' */ +} + +function checkStackCookie() { + if (ABORT) return; + var max = _emscripten_stack_get_end(); + var cookie1 = HEAPU32[((max + 4)>>2)]; + var cookie2 = HEAPU32[((max + 8)>>2)]; + if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) { + abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x' + cookie2.toString(16) + ' 0x' + cookie1.toString(16)); + } + // Also test the global address 0 for integrity. + if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); +} + +// end include: runtime_stack_check.js +// include: runtime_assertions.js + + +// Endianness check +(function() { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -s SUPPORT_BIG_ENDIAN=1 to bypass)'; +})(); + +// end include: runtime_assertions.js +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called + +var runtimeInitialized = false; +var runtimeExited = false; +var runtimeKeepaliveCounter = 0; + +function keepRuntimeAlive() { + return noExitRuntime || runtimeKeepaliveCounter > 0; +} + +function preRun() { + + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPRERUN__); +} + +function initRuntime() { + checkStackCookie(); + assert(!runtimeInitialized); + runtimeInitialized = true; + + + callRuntimeCallbacks(__ATINIT__); +} + +function exitRuntime() { + checkStackCookie(); + runtimeExited = true; +} + +function postRun() { + checkStackCookie(); + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnExit(cb) { +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +// include: runtime_math.js + + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc + +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'); +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'); +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'); +assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); + +// end include: runtime_math.js +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; + +function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } +} + +function addRunDependency(id) { + runDependencies++; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval != 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(function() { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err('dependency: ' + dep); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + } + } else { + err('warning: run dependency added without ID'); + } +} + +function removeRunDependency(id) { + runDependencies--; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +Module["preloadedImages"] = {}; // maps url to image data +Module["preloadedAudios"] = {}; // maps url to audio data + +/** @param {string|number=} what */ +function abort(what) { + { + if (Module['onAbort']) { + Module['onAbort'](what); + } + } + + what = 'Aborted(' + what + ')'; + // TODO(sbc): Should we remove printing and leave it up to whoever + // catches the exception? + err(what); + + ABORT = true; + EXITSTATUS = 1; + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + + // Suppress closure compiler warning here. Closure compiler's builtin extern + // defintion for WebAssembly.RuntimeError claims it takes no arguments even + // though it can. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. + + /** @suppress {checkTypes} */ + var e = new WebAssembly.RuntimeError(what); + + readyPromiseReject(e); + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +// {{MEM_INITIALIZER}} + +// include: memoryprofiler.js + + +// end include: memoryprofiler.js +// show errors on likely calls to FS when it was not included +var FS = { + error: function() { + abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with -s FORCE_FILESYSTEM=1'); + }, + init: function() { FS.error() }, + createDataFile: function() { FS.error() }, + createPreloadedFile: function() { FS.error() }, + createLazyFile: function() { FS.error() }, + open: function() { FS.error() }, + mkdev: function() { FS.error() }, + registerDevice: function() { FS.error() }, + analyzePath: function() { FS.error() }, + loadFilesFromDB: function() { FS.error() }, + + ErrnoError: function ErrnoError() { FS.error() }, +}; +Module['FS_createDataFile'] = FS.createDataFile; +Module['FS_createPreloadedFile'] = FS.createPreloadedFile; + +// include: URIUtils.js + + +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = 'data:application/octet-stream;base64,'; + +// Indicates whether filename is a base64 data URI. +function isDataURI(filename) { + // Prefix of data URIs emitted by SINGLE_FILE and related options. + return filename.startsWith(dataURIPrefix); +} + +// Indicates whether filename is delivered via file protocol (as opposed to http/https) +function isFileURI(filename) { + return filename.startsWith('file://'); +} + +// end include: URIUtils.js +/** @param {boolean=} fixedasm */ +function createExportWrapper(name, fixedasm) { + return function() { + var displayName = name; + var asm = fixedasm; + if (!fixedasm) { + asm = Module['asm']; + } + assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization'); + assert(!runtimeExited, 'native function `' + displayName + '` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + if (!asm[name]) { + assert(asm[name], 'exported native function `' + displayName + '` not found'); + } + return asm[name].apply(null, arguments); + }; +} + +var wasmBinaryFile; + wasmBinaryFile = 'base8.wasm'; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + +function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } + catch (err) { + abort(err); + } +} + +function getBinaryPromise() { + // If we don't have the binary yet, try to to load it asynchronously. + // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. + // See https://github.com/github/fetch/pull/92#issuecomment-140665932 + // Cordova or Electron apps are typically loaded from a file:// url. + // So use fetch if it is available and the url is not a file, otherwise fall back to XHR. + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch == 'function' + && !isFileURI(wasmBinaryFile) + ) { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + if (!response['ok']) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response['arrayBuffer'](); + }).catch(function () { + return getBinary(wasmBinaryFile); + }); + } + else { + if (readAsync) { + // fetch is not available or url is file => try XHR (readAsync uses XHR internally) + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))) }, reject) + }); + } + } + } + + // Otherwise, getBinary should be able to get it synchronously + return Promise.resolve().then(function() { return getBinary(wasmBinaryFile); }); +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + // prepare imports + var info = { + 'env': asmLibraryArg, + 'wasi_snapshot_preview1': asmLibraryArg, + }; + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + var exports = instance.exports; + + Module['asm'] = exports; + + wasmMemory = Module['asm']['memory']; + assert(wasmMemory, "memory not found in wasm exports"); + // This assertion doesn't hold when emscripten is run in --post-link + // mode. + // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode. + //assert(wasmMemory.buffer.byteLength === 16777216); + updateGlobalBufferAndViews(wasmMemory.buffer); + + wasmTable = Module['asm']['__indirect_function_table']; + assert(wasmTable, "table not found in wasm exports"); + + addOnInit(Module['asm']['__wasm_call_ctors']); + + removeRunDependency('wasm-instantiate'); + } + // we can't run yet (except in a pthread, where we have a custom sync instantiator) + addRunDependency('wasm-instantiate'); + + // Prefer streaming instantiation if available. + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiationResult(result) { + // 'result' is a ResultObject object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. + receiveInstance(result['instance']); + } + + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info); + }).then(function (instance) { + return instance; + }).then(receiver, function(reason) { + err('failed to asynchronously prepare wasm: ' + reason); + + // Warn on some common problems. + if (isFileURI(wasmBinaryFile)) { + err('warning: Loading from a file URI (' + wasmBinaryFile + ') is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing'); + } + abort(reason); + }); + } + + function instantiateAsync() { + if (!wasmBinary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(wasmBinaryFile) && + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + !isFileURI(wasmBinaryFile) && + typeof fetch == 'function') { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + // Suppress closure warning here since the upstream definition for + // instantiateStreaming only allows Promise<Repsponse> rather than + // an actual Response. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed. + /** @suppress {checkTypes} */ + var result = WebAssembly.instantiateStreaming(response, info); + + return result.then( + receiveInstantiationResult, + function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err('wasm streaming compile failed: ' + reason); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer(receiveInstantiationResult); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiationResult); + } + } + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel + // to any other async startup actions they are performing. + if (Module['instantiateWasm']) { + try { + var exports = Module['instantiateWasm'](info, receiveInstance); + return exports; + } catch(e) { + err('Module.instantiateWasm callback failed with error: ' + e); + return false; + } + } + + // If instantiation fails, reject the module ready promise. + instantiateAsync().catch(readyPromiseReject); + return {}; // no exports yet; we'll fill them in later +} + +// Globals used by JS i64 conversions (see makeSetValue) +var tempDouble; +var tempI64; + +// === Body === + +var ASM_CONSTS = { + +}; + + + + + + + function callRuntimeCallbacks(callbacks) { + while (callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == 'function') { + callback(Module); // Pass the module as the first argument. + continue; + } + var func = callback.func; + if (typeof func == 'number') { + if (callback.arg === undefined) { + getWasmTableEntry(func)(); + } else { + getWasmTableEntry(func)(callback.arg); + } + } else { + func(callback.arg === undefined ? null : callback.arg); + } + } + } + + function withStackSave(f) { + var stack = stackSave(); + var ret = f(); + stackRestore(stack); + return ret; + } + function demangle(func) { + warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); + return func; + } + + function demangleAll(text) { + var regex = + /\b_Z[\w\d_]+/g; + return text.replace(regex, + function(x) { + var y = demangle(x); + return x === y ? x : (y + ' [' + x + ']'); + }); + } + + var wasmTableMirror = []; + function getWasmTableEntry(funcPtr) { + var func = wasmTableMirror[funcPtr]; + if (!func) { + if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; + wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); + } + assert(wasmTable.get(funcPtr) == func, "JavaScript-side Wasm function table mirror is out of date!"); + return func; + } + + function handleException(e) { + // Certain exception types we do not treat as errors since they are used for + // internal control flow. + // 1. ExitStatus, which is thrown by exit() + // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others + // that wish to return to JS event loop. + if (e instanceof ExitStatus || e == 'unwind') { + return EXITSTATUS; + } + quit_(1, e); + } + + function jsStackTrace() { + var error = new Error(); + if (!error.stack) { + // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, + // so try that as a special-case. + try { + throw new Error(); + } catch(e) { + error = e; + } + if (!error.stack) { + return '(no stack trace available)'; + } + } + return error.stack.toString(); + } + + function setWasmTableEntry(idx, func) { + wasmTable.set(idx, func); + wasmTableMirror[idx] = func; + } + + function stackTrace() { + var js = jsStackTrace(); + if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); + return demangleAll(js); + } + + function _emscripten_get_heap_max() { + // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate + // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side + // for any code that deals with heap sizes, which would require special + // casing all heap size related code to treat 0 specially. + return 2147483648; + } + + function emscripten_realloc_buffer(size) { + try { + // round size grow request up to wasm page size (fixed 64KB per spec) + wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16); // .grow() takes a delta compared to the previous size + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1 /*success*/; + } catch(e) { + err('emscripten_realloc_buffer: Attempted to grow heap from ' + buffer.byteLength + ' bytes to ' + size + ' bytes, but got error: ' + e); + } + // implicit 0 return to save code size (caller will cast "undefined" into 0 + // anyhow) + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = HEAPU8.length; + requestedSize = requestedSize >>> 0; + // With pthreads, races can happen (another thread might increase the size + // in between), so return a failure, and let the caller retry. + assert(requestedSize > oldSize); + + // Memory resize rules: + // 1. Always increase heap size to at least the requested size, rounded up + // to next page multiple. + // 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap + // geometrically: increase the heap size according to + // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most + // overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB). + // 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap + // linearly: increase the heap size by at least + // MEMORY_GROWTH_LINEAR_STEP bytes. + // 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by + // MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest + // 4. If we were unable to allocate as much memory, it may be due to + // over-eager decision to excessively reserve due to (3) above. + // Hence if an allocation fails, cut down on the amount of excess + // growth, in an attempt to succeed to perform a smaller allocation. + + // A limit is set for how much we can grow. We should not exceed that + // (the wasm binary specifies it, so if we tried, we'd fail anyhow). + var maxHeapSize = _emscripten_get_heap_max(); + if (requestedSize > maxHeapSize) { + err('Cannot enlarge memory, asked to go up to ' + requestedSize + ' bytes, but the limit is ' + maxHeapSize + ' bytes!'); + return false; + } + + let alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; + + // Loop through potential heap size increases. If we attempt a too eager + // reservation that fails, cut down on the attempted size and reserve a + // smaller bump instead. (max 3 times, chosen somewhat arbitrarily) + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth + // but limit overreserving (default to capping at +96MB overgrowth at most) + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 ); + + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + + return true; + } + } + err('Failed to grow the heap from ' + oldSize + ' bytes to ' + newSize + ' bytes, not enough memory!'); + return false; + } +var ASSERTIONS = true; + + + +/** @type {function(string, boolean=, number=)} */ +function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; +} + +function intArrayToString(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + var chr = array[i]; + if (chr > 0xFF) { + if (ASSERTIONS) { + assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); + } + chr &= 0xFF; + } + ret.push(String.fromCharCode(chr)); + } + return ret.join(''); +} + + +function checkIncomingModuleAPI() { + ignoredModuleProp('fetchSettings'); +} +var asmLibraryArg = { + "emscripten_resize_heap": _emscripten_resize_heap +}; +var asm = createWasm(); +/** @type {function(...*):?} */ +var ___wasm_call_ctors = Module["___wasm_call_ctors"] = createExportWrapper("__wasm_call_ctors"); + +/** @type {function(...*):?} */ +var _base8_encodeBytes = Module["_base8_encodeBytes"] = createExportWrapper("base8_encodeBytes"); + +/** @type {function(...*):?} */ +var _base8_stringToNum = Module["_base8_stringToNum"] = createExportWrapper("base8_stringToNum"); + +/** @type {function(...*):?} */ +var _base8_decodeNum = Module["_base8_decodeNum"] = createExportWrapper("base8_decodeNum"); + +/** @type {function(...*):?} */ +var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location"); + +/** @type {function(...*):?} */ +var ___stdio_exit = Module["___stdio_exit"] = createExportWrapper("__stdio_exit"); + +/** @type {function(...*):?} */ +var _malloc = Module["_malloc"] = createExportWrapper("malloc"); + +/** @type {function(...*):?} */ +var _free = Module["_free"] = createExportWrapper("free"); + +/** @type {function(...*):?} */ +var _emscripten_stack_init = Module["_emscripten_stack_init"] = function() { + return (_emscripten_stack_init = Module["_emscripten_stack_init"] = Module["asm"]["emscripten_stack_init"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = function() { + return (_emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = Module["asm"]["emscripten_stack_get_free"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_base = Module["_emscripten_stack_get_base"] = function() { + return (_emscripten_stack_get_base = Module["_emscripten_stack_get_base"] = Module["asm"]["emscripten_stack_get_base"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = function() { + return (_emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = Module["asm"]["emscripten_stack_get_end"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var stackSave = Module["stackSave"] = createExportWrapper("stackSave"); + +/** @type {function(...*):?} */ +var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore"); + +/** @type {function(...*):?} */ +var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc"); + + + + + +// === Auto-generated postamble setup entry stuff === + +Module["intArrayFromString"] = intArrayFromString; +unexportedRuntimeFunction('intArrayToString', false); +unexportedRuntimeFunction('ccall', false); +Module["cwrap"] = cwrap; +unexportedRuntimeFunction('setValue', false); +unexportedRuntimeFunction('getValue', false); +Module["allocate"] = allocate; +unexportedRuntimeFunction('UTF8ArrayToString', false); +Module["UTF8ToString"] = UTF8ToString; +unexportedRuntimeFunction('stringToUTF8Array', false); +unexportedRuntimeFunction('stringToUTF8', false); +unexportedRuntimeFunction('lengthBytesUTF8', false); +unexportedRuntimeFunction('stackTrace', false); +unexportedRuntimeFunction('addOnPreRun', false); +unexportedRuntimeFunction('addOnInit', false); +unexportedRuntimeFunction('addOnPreMain', false); +unexportedRuntimeFunction('addOnExit', false); +unexportedRuntimeFunction('addOnPostRun', false); +unexportedRuntimeFunction('writeStringToMemory', false); +unexportedRuntimeFunction('writeArrayToMemory', false); +unexportedRuntimeFunction('writeAsciiToMemory', false); +unexportedRuntimeFunction('addRunDependency', true); +unexportedRuntimeFunction('removeRunDependency', true); +unexportedRuntimeFunction('FS_createFolder', false); +unexportedRuntimeFunction('FS_createPath', true); +unexportedRuntimeFunction('FS_createDataFile', true); +unexportedRuntimeFunction('FS_createPreloadedFile', true); +unexportedRuntimeFunction('FS_createLazyFile', true); +unexportedRuntimeFunction('FS_createLink', false); +unexportedRuntimeFunction('FS_createDevice', true); +unexportedRuntimeFunction('FS_unlink', true); +unexportedRuntimeFunction('getLEB', false); +unexportedRuntimeFunction('getFunctionTables', false); +unexportedRuntimeFunction('alignFunctionTables', false); +unexportedRuntimeFunction('registerFunctions', false); +unexportedRuntimeFunction('addFunction', false); +unexportedRuntimeFunction('removeFunction', false); +unexportedRuntimeFunction('getFuncWrapper', false); +unexportedRuntimeFunction('prettyPrint', false); +unexportedRuntimeFunction('dynCall', false); +unexportedRuntimeFunction('getCompilerSetting', false); +unexportedRuntimeFunction('print', false); +unexportedRuntimeFunction('printErr', false); +unexportedRuntimeFunction('getTempRet0', false); +unexportedRuntimeFunction('setTempRet0', false); +unexportedRuntimeFunction('callMain', false); +unexportedRuntimeFunction('abort', false); +unexportedRuntimeFunction('keepRuntimeAlive', false); +unexportedRuntimeFunction('zeroMemory', false); +unexportedRuntimeFunction('stringToNewUTF8', false); +unexportedRuntimeFunction('emscripten_realloc_buffer', false); +unexportedRuntimeFunction('ENV', false); +unexportedRuntimeFunction('withStackSave', false); +unexportedRuntimeFunction('ERRNO_CODES', false); +unexportedRuntimeFunction('ERRNO_MESSAGES', false); +unexportedRuntimeFunction('setErrNo', false); +unexportedRuntimeFunction('inetPton4', false); +unexportedRuntimeFunction('inetNtop4', false); +unexportedRuntimeFunction('inetPton6', false); +unexportedRuntimeFunction('inetNtop6', false); +unexportedRuntimeFunction('readSockaddr', false); +unexportedRuntimeFunction('writeSockaddr', false); +unexportedRuntimeFunction('DNS', false); +unexportedRuntimeFunction('getHostByName', false); +unexportedRuntimeFunction('Protocols', false); +unexportedRuntimeFunction('Sockets', false); +unexportedRuntimeFunction('getRandomDevice', false); +unexportedRuntimeFunction('traverseStack', false); +unexportedRuntimeFunction('convertFrameToPC', false); +unexportedRuntimeFunction('UNWIND_CACHE', false); +unexportedRuntimeFunction('saveInUnwindCache', false); +unexportedRuntimeFunction('convertPCtoSourceLocation', false); +unexportedRuntimeFunction('readAsmConstArgsArray', false); +unexportedRuntimeFunction('readAsmConstArgs', false); +unexportedRuntimeFunction('mainThreadEM_ASM', false); +unexportedRuntimeFunction('jstoi_q', false); +unexportedRuntimeFunction('jstoi_s', false); +unexportedRuntimeFunction('getExecutableName', false); +unexportedRuntimeFunction('listenOnce', false); +unexportedRuntimeFunction('autoResumeAudioContext', false); +unexportedRuntimeFunction('dynCallLegacy', false); +unexportedRuntimeFunction('getDynCaller', false); +unexportedRuntimeFunction('dynCall', false); +unexportedRuntimeFunction('callRuntimeCallbacks', false); +unexportedRuntimeFunction('wasmTableMirror', false); +unexportedRuntimeFunction('setWasmTableEntry', false); +unexportedRuntimeFunction('getWasmTableEntry', false); +unexportedRuntimeFunction('handleException', false); +unexportedRuntimeFunction('runtimeKeepalivePush', false); +unexportedRuntimeFunction('runtimeKeepalivePop', false); +unexportedRuntimeFunction('callUserCallback', false); +unexportedRuntimeFunction('maybeExit', false); +unexportedRuntimeFunction('safeSetTimeout', false); +unexportedRuntimeFunction('asmjsMangle', false); +unexportedRuntimeFunction('asyncLoad', false); +unexportedRuntimeFunction('alignMemory', false); +unexportedRuntimeFunction('mmapAlloc', false); +unexportedRuntimeFunction('reallyNegative', false); +unexportedRuntimeFunction('unSign', false); +unexportedRuntimeFunction('reSign', false); +unexportedRuntimeFunction('formatString', false); +unexportedRuntimeFunction('PATH', false); +unexportedRuntimeFunction('PATH_FS', false); +unexportedRuntimeFunction('SYSCALLS', false); +unexportedRuntimeFunction('getSocketFromFD', false); +unexportedRuntimeFunction('getSocketAddress', false); +unexportedRuntimeFunction('JSEvents', false); +unexportedRuntimeFunction('registerKeyEventCallback', false); +unexportedRuntimeFunction('specialHTMLTargets', false); +unexportedRuntimeFunction('maybeCStringToJsString', false); +unexportedRuntimeFunction('findEventTarget', false); +unexportedRuntimeFunction('findCanvasEventTarget', false); +unexportedRuntimeFunction('getBoundingClientRect', false); +unexportedRuntimeFunction('fillMouseEventData', false); +unexportedRuntimeFunction('registerMouseEventCallback', false); +unexportedRuntimeFunction('registerWheelEventCallback', false); +unexportedRuntimeFunction('registerUiEventCallback', false); +unexportedRuntimeFunction('registerFocusEventCallback', false); +unexportedRuntimeFunction('fillDeviceOrientationEventData', false); +unexportedRuntimeFunction('registerDeviceOrientationEventCallback', false); +unexportedRuntimeFunction('fillDeviceMotionEventData', false); +unexportedRuntimeFunction('registerDeviceMotionEventCallback', false); +unexportedRuntimeFunction('screenOrientation', false); +unexportedRuntimeFunction('fillOrientationChangeEventData', false); +unexportedRuntimeFunction('registerOrientationChangeEventCallback', false); +unexportedRuntimeFunction('fillFullscreenChangeEventData', false); +unexportedRuntimeFunction('registerFullscreenChangeEventCallback', false); +unexportedRuntimeFunction('registerRestoreOldStyle', false); +unexportedRuntimeFunction('hideEverythingExceptGivenElement', false); +unexportedRuntimeFunction('restoreHiddenElements', false); +unexportedRuntimeFunction('setLetterbox', false); +unexportedRuntimeFunction('currentFullscreenStrategy', false); +unexportedRuntimeFunction('restoreOldWindowedStyle', false); +unexportedRuntimeFunction('softFullscreenResizeWebGLRenderTarget', false); +unexportedRuntimeFunction('doRequestFullscreen', false); +unexportedRuntimeFunction('fillPointerlockChangeEventData', false); +unexportedRuntimeFunction('registerPointerlockChangeEventCallback', false); +unexportedRuntimeFunction('registerPointerlockErrorEventCallback', false); +unexportedRuntimeFunction('requestPointerLock', false); +unexportedRuntimeFunction('fillVisibilityChangeEventData', false); +unexportedRuntimeFunction('registerVisibilityChangeEventCallback', false); +unexportedRuntimeFunction('registerTouchEventCallback', false); +unexportedRuntimeFunction('fillGamepadEventData', false); +unexportedRuntimeFunction('registerGamepadEventCallback', false); +unexportedRuntimeFunction('registerBeforeUnloadEventCallback', false); +unexportedRuntimeFunction('fillBatteryEventData', false); +unexportedRuntimeFunction('battery', false); +unexportedRuntimeFunction('registerBatteryEventCallback', false); +unexportedRuntimeFunction('setCanvasElementSize', false); +unexportedRuntimeFunction('getCanvasElementSize', false); +unexportedRuntimeFunction('demangle', false); +unexportedRuntimeFunction('demangleAll', false); +unexportedRuntimeFunction('jsStackTrace', false); +unexportedRuntimeFunction('stackTrace', false); +unexportedRuntimeFunction('getEnvStrings', false); +unexportedRuntimeFunction('checkWasiClock', false); +unexportedRuntimeFunction('flush_NO_FILESYSTEM', false); +unexportedRuntimeFunction('writeI53ToI64', false); +unexportedRuntimeFunction('writeI53ToI64Clamped', false); +unexportedRuntimeFunction('writeI53ToI64Signaling', false); +unexportedRuntimeFunction('writeI53ToU64Clamped', false); +unexportedRuntimeFunction('writeI53ToU64Signaling', false); +unexportedRuntimeFunction('readI53FromI64', false); +unexportedRuntimeFunction('readI53FromU64', false); +unexportedRuntimeFunction('convertI32PairToI53', false); +unexportedRuntimeFunction('convertU32PairToI53', false); +unexportedRuntimeFunction('setImmediateWrapped', false); +unexportedRuntimeFunction('clearImmediateWrapped', false); +unexportedRuntimeFunction('polyfillSetImmediate', false); +unexportedRuntimeFunction('uncaughtExceptionCount', false); +unexportedRuntimeFunction('exceptionLast', false); +unexportedRuntimeFunction('exceptionCaught', false); +unexportedRuntimeFunction('ExceptionInfo', false); +unexportedRuntimeFunction('CatchInfo', false); +unexportedRuntimeFunction('exception_addRef', false); +unexportedRuntimeFunction('exception_decRef', false); +unexportedRuntimeFunction('Browser', false); +unexportedRuntimeFunction('funcWrappers', false); +unexportedRuntimeFunction('getFuncWrapper', false); +unexportedRuntimeFunction('setMainLoop', false); +unexportedRuntimeFunction('wget', false); +unexportedRuntimeFunction('FS', false); +unexportedRuntimeFunction('MEMFS', false); +unexportedRuntimeFunction('TTY', false); +unexportedRuntimeFunction('PIPEFS', false); +unexportedRuntimeFunction('SOCKFS', false); +unexportedRuntimeFunction('_setNetworkCallback', false); +unexportedRuntimeFunction('tempFixedLengthArray', false); +unexportedRuntimeFunction('miniTempWebGLFloatBuffers', false); +unexportedRuntimeFunction('heapObjectForWebGLType', false); +unexportedRuntimeFunction('heapAccessShiftForWebGLHeap', false); +unexportedRuntimeFunction('GL', false); +unexportedRuntimeFunction('emscriptenWebGLGet', false); +unexportedRuntimeFunction('computeUnpackAlignedImageSize', false); +unexportedRuntimeFunction('emscriptenWebGLGetTexPixelData', false); +unexportedRuntimeFunction('emscriptenWebGLGetUniform', false); +unexportedRuntimeFunction('webglGetUniformLocation', false); +unexportedRuntimeFunction('webglPrepareUniformLocationsBeforeFirstUse', false); +unexportedRuntimeFunction('webglGetLeftBracePos', false); +unexportedRuntimeFunction('emscriptenWebGLGetVertexAttrib', false); +unexportedRuntimeFunction('writeGLArray', false); +unexportedRuntimeFunction('AL', false); +unexportedRuntimeFunction('SDL_unicode', false); +unexportedRuntimeFunction('SDL_ttfContext', false); +unexportedRuntimeFunction('SDL_audio', false); +unexportedRuntimeFunction('SDL', false); +unexportedRuntimeFunction('SDL_gfx', false); +unexportedRuntimeFunction('GLUT', false); +unexportedRuntimeFunction('EGL', false); +unexportedRuntimeFunction('GLFW_Window', false); +unexportedRuntimeFunction('GLFW', false); +unexportedRuntimeFunction('GLEW', false); +unexportedRuntimeFunction('IDBStore', false); +unexportedRuntimeFunction('runAndAbortIfError', false); +unexportedRuntimeFunction('warnOnce', false); +unexportedRuntimeFunction('stackSave', false); +unexportedRuntimeFunction('stackRestore', false); +unexportedRuntimeFunction('stackAlloc', false); +unexportedRuntimeFunction('AsciiToString', false); +unexportedRuntimeFunction('stringToAscii', false); +unexportedRuntimeFunction('UTF16ToString', false); +unexportedRuntimeFunction('stringToUTF16', false); +unexportedRuntimeFunction('lengthBytesUTF16', false); +unexportedRuntimeFunction('UTF32ToString', false); +unexportedRuntimeFunction('stringToUTF32', false); +unexportedRuntimeFunction('lengthBytesUTF32', false); +Module["allocateUTF8"] = allocateUTF8; +unexportedRuntimeFunction('allocateUTF8OnStack', false); +Module["writeStackCookie"] = writeStackCookie; +Module["checkStackCookie"] = checkStackCookie; +unexportedRuntimeSymbol('ALLOC_NORMAL', false); +unexportedRuntimeSymbol('ALLOC_STACK', false); + +var calledRun; + +/** + * @constructor + * @this {ExitStatus} + */ +function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; +} + +var calledMain = false; + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +}; + +function stackCheckInit() { + // This is normally called automatically during __wasm_call_ctors but need to + // get these values before even running any of the ctors so we call it redundantly + // here. + // TODO(sbc): Move writeStackCookie to native to to avoid this. + _emscripten_stack_init(); + writeStackCookie(); +} + +/** @type {function(Array=)} */ +function run(args) { + args = args || arguments_; + + if (runDependencies > 0) { + return; + } + + stackCheckInit(); + + preRun(); + + // a preRun added a dependency, run will be called later + if (runDependencies > 0) { + return; + } + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + readyPromiseResolve(Module); + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + assert(!Module['_main'], 'compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]'); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} +Module['run'] = run; + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var oldOut = out; + var oldErr = err; + var has = false; + out = err = (x) => { + has = true; + } + try { // it doesn't matter if it fails + var flush = null; + if (flush) flush(); + } catch(e) {} + out = oldOut; + err = oldErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.'); + warnOnce('(this may also be due to not including full filesystem support - try building with -s FORCE_FILESYSTEM=1)'); + } +} + +/** @param {boolean|number=} implicit */ +function exit(status, implicit) { + EXITSTATUS = status; + + // Skip this check if the runtime is being kept alive deliberately. + // For example if `exit_with_live_runtime` is called. + if (!runtimeKeepaliveCounter) { + checkUnflushedContent(); + } + + if (keepRuntimeAlive()) { + // if exit() was called, we may warn the user if the runtime isn't actually being shut down + if (!implicit) { + var msg = 'program exited (with status: ' + status + '), but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)'; + readyPromiseReject(msg); + err(msg); + } + } else { + exitRuntime(); + } + + procExit(status); +} + +function procExit(code) { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + if (Module['onExit']) Module['onExit'](code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); +} + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + +run(); + + + + + + + + return Base8Module.ready +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = Base8Module; +else if (typeof define === 'function' && define['amd']) + define([], function() { return Base8Module; }); +else if (typeof exports === 'object') + exports["Base8Module"] = Base8Module; diff --git a/source/_static/baseX_converter/base8.wasm b/source/_static/baseX_converter/base8.wasm Binary files differ. diff --git a/source/_static/baseX_converter/baseX_converter.html b/source/_static/baseX_converter/baseX_converter.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html> + +<head> + <title>Base32 Encoder</title> + <link rel="stylesheet" href="../_static/baseX_converter/baseX_converter_styles.css"> +</head> + +<body> + + <div id="parserForm" class="form-vertical"> + <!-- Input Section --> + <div class="form-section"> + <label for="inputText">Data:</label> + <textarea type="text" id="inputText" class="text-area" placeholder="DEFAULT"></textarea> + </div> + + <!-- Parser Section --> + <div class="form-section"> + <label for="baseX_parser">Parser:</label> + <select id="baseX_parser" name="parser" class="select-input"> + <option value="base8_encode">Base8 Encode</option> + <option value="base8_decode">Base8 Decode</option> + <option value="base32_encode">Base32 Encode</option> + <option value="base32_decode">Base32 Decode</option> + <option value="base32_to_base8">Base32 to Base8</option> + <option value="base8_to_base32">Base8 to Base32</option> + </select> + </div> + + <!-- Output Section --> + <div class="form-section output-wrapper"> + <label for="baseX-output">Output:</label> + <div class="pre-container"> + <pre id="baseX-output" class="baseX-output-box"></pre> + <button class="md-clipboard md-icon copy-button" title="Copy to clipboard" + data-clipboard-target="#baseX-output"></button> + </div> + </div> + </div> + + <script src="../_static/baseX_converter/base8.js"></script> + <script src="../_static/baseX_converter/base32.js"></script> + <script src="../_static/baseX_converter/parserScript.js"></script> +</body> + +</html> +\ No newline at end of file diff --git a/source/_static/baseX_converter/baseX_converter_styles.css b/source/_static/baseX_converter/baseX_converter_styles.css @@ -0,0 +1,69 @@ +/* + * Convert page fro baseX functions +*/ + +.form-vertical { + display: flex; + flex-direction: column; + gap: 20px; + width: 95%; + margin: 0 auto; +} + +.form-section { + display: flex; + flex-direction: column; +} + +.text-area { + padding: 10px; + font-size: 1em; + border: 1px solid var(--md-code-fg-color); + border-radius: 4px; + resize: vertical; + white-space: normal; + word-wrap: break-word; + background-color: var(--md-code-bg-color); + color: var(--md-code-fg-color); + min-height: 100%; + line-height: 1.75; +} + +.select-input { + padding: 10px; + font-size: 1em; + border: 1px solid var(--md-code-fg-color); + border-radius: 4px; + background-color: var(--md-code-bg-color); + color: var(--md-code-fg-color); +} + +.baseX-output-box { + background-color: var(--md-code-bg-color); + padding: 10px; + border: 1px solid var(--md-code-fg-color); + border-radius: 4px; + min-height: 100px; + white-space: pre-wrap; + word-wrap: break-word; + font-family: monospace; +} + + +/* Copy-Button position and visual */ + +.output-wrapper { + position: relative; +} + +.pre-container { + position: relative; +} + +.copy-button { + position: absolute; + top: 1.5em; + right: 1em; + padding: 6px 10px; + display: none; +} +\ No newline at end of file diff --git a/source/_static/baseX_converter/parserScript.js b/source/_static/baseX_converter/parserScript.js @@ -0,0 +1,213 @@ +/** + * Parsing module in JS using the baseX-Converter C library + */ + +let base32, base8, Module; +const outSize = 128; + +const baseX_retValues = { + 1: "Argument Error", + 2: "Buffer Overflow", + 3: "Source Error", + 4: "Unexpected Error" +} +const placeholders = { + base8_encode: "Enter text to base8 encoding", + base8_decode: "Base-8 String (1-8)", + base32_encode: "Enter text to base32 encoding", + base32_decode: "Enter Base32-String" +}; + +const parserSelect = document.getElementById("baseX_parser"); +const inputField = document.getElementById("inputText"); +const outputField = document.getElementById("baseX-output"); +const copyButton = document.querySelector(".copy-button"); + +// Load modules +Promise.all([ + Base32Module().then(mod => { + base32 = { + module: mod, + encode: mod.cwrap('base32_encodeBytes', 'number', ['number', 'number', 'number', 'number']), + decode: mod.cwrap('base32_decodeString', 'number', ['number', 'number', 'number', 'number', 'number']), + } + }), + + Base8Module().then(mod => { + base8 = { + module: mod, + encode: mod.cwrap('base8_encodeBytes', 'number', ['number', 'number', 'number', 'number']), + decode: mod.cwrap('base8_decodeNum', 'number', ['number', 'number', 'number', 'number', 'number']), + stringToNum: mod.cwrap('base8_stringToNum', 'number', ['number', 'number']) + }; + }) +]) + +function base8_encodeBytes(bytes) { + const inputLength = bytes.length; + const inputPtr = base8.module._malloc(inputLength); + base8.module.HEAPU8.set(bytes, inputPtr); + const outputPtr = base8.module._malloc(outSize); // + retVal = base8.encode(outputPtr, outSize, inputPtr, inputLength); + if (0 != retVal) { + throw new Error(`Encoding error with ${baseX_retValues[retVal]}`); + } + else { + output = base8.module.UTF8ToString(outputPtr); + } + base8.module._free(inputPtr); + base8.module._free(outputPtr); + return output; +} + +function base8_decodeString(input) { + const inputLength = input.length; + if (0 == inputLength) { + return null; + } + const inputStrPtr = base8.module.allocateUTF8(input); + const inputAsNumPtr = base8.module._malloc(inputLength); + retVal = base8.stringToNum(inputAsNumPtr, inputStrPtr); + if (retVal != 0) { + throw new Error(`Parsing input to integer fails with: ${baseX_retValues[retVal]}`); + } + const outputPtr = base8.module._malloc(outSize); + const outLengthPtr = base8.module._malloc(4); // 4 Bytes für int32 + retVal = base8.decode(outputPtr, outLengthPtr, outSize, inputAsNumPtr, inputLength); + + const outLength = base8.module.HEAP32[outLengthPtr >> 2]; + + if (0 != retVal) { + base8.module._free(inputAsNumPtr); + base8.module._free(outputPtr); + base8.module._free(outLengthPtr); + base8.module._free(inputStrPtr); + throw new Error(`Decoding error with: ${baseX_retValues[retVal]}`); + } + else { + output = new Uint8Array(base8.module.HEAPU8.buffer, outputPtr, outLength); + } + base8.module._free(inputAsNumPtr); + base8.module._free(outputPtr); + base8.module._free(outLengthPtr); + base8.module._free(inputStrPtr); + return output; +} + + +function base32_encodeBytes(inputBytes) { + const inputLength = inputBytes.length; + const inputPtr = base32.module._malloc(inputLength); + base32.module.HEAPU8.set(inputBytes, inputPtr); + const outputPtr = base32.module._malloc(outSize); // + retVal = base32.encode(outputPtr, outSize, inputPtr, inputLength); + + output = base32.module.UTF8ToString(outputPtr); + base32.module._free(inputPtr); + base32.module._free(outputPtr); + if (0 != retVal) { + throw new Error(`Encoding error with ${baseX_retValues[retVal]}`); + } + else { + return output; + } +} + +function base32_decodeString(inputString) { + const inputLength = inputString.length; + if (0 == inputLength) { + return null; + } + const inputStrPtr = base32.module.allocateUTF8(inputString); + const outputPtr = base32.module._malloc(outSize); + const outLengthPtr = base32.module._malloc(4); // 4 Bytes für int32 + retVal = base32.decode(outputPtr, outLengthPtr, outSize, inputStrPtr); + const outLength = base32.module.HEAP32[outLengthPtr >> 2]; + const decoded = new Uint8Array(base32.module.HEAPU8.buffer, outputPtr, outLength); + // Free up memory + base32.module._free(outLengthPtr); + base32.module._free(inputStrPtr); + base32.module._free(outputPtr); + if (0 != retVal) { + throw new Error(`Decoding base32 results in ${baseX_retValues[retVal]}`); + } + else { + return decoded; + } +} + +function parseInput() { + let output = ""; + let inputBytes; + + try { + switch (baseX_parser.value) { + case "base8_encode": + inputBytes = new TextEncoder().encode(inputField.value); + output = base8_encodeBytes(inputBytes); + break; + case "base8_decode": + const decodedBase8 = base8_decodeString(inputField.value) + if (null != decodedBase8) { + const hexString = Array.from(decodedBase8) + .map(byte => byte.toString(16).padStart(2, '0')).join(', '); + const asciiString = new TextDecoder("utf-8").decode(decodedBase8); + output = hexString + '\n' + asciiString; + } + break; + case "base32_encode": + inputBytes = new TextEncoder().encode(inputField.value); + output = base32_encodeBytes(inputBytes); + break; + case "base32_decode": + const decodedBase32 = base32_decodeString(inputField.value); + if (null != decodedBase32) { + const hexString = Array.from(decodedBase32) + .map(byte => byte.toString(16).padStart(2, '0')).join(', '); + const asciiString = new TextDecoder("utf-8").decode(decodedBase32); + output = hexString + '\n' + asciiString; + } + break; + case "base32_to_base8": + const base32Bytes = base32_decodeString(inputField.value); + if (null != base32Bytes) { + output = base8_encodeBytes(base32Bytes); + } + break; + case "base8_to_base32": + const base8Bytes = base8_decodeString(inputField.value); + if (null != base8Bytes) { + output = base32_encodeBytes(base8Bytes); + } + break; + default: + output = "Selection unknown"; + } + } catch (e) { + output = "Error at parsing: " + e.message; + } + + + + if (output.trim() !== "") { + copyButton.style.display = "block"; + } else { + copyButton.style.display = "none"; + } + outputField.textContent = output; +} + +function updatePlaceholder() { + const selected = parserSelect.value; + inputField.placeholder = placeholders[selected] || "Input..."; +} + +parserSelect.addEventListener("change", () => { + updatePlaceholder(); + parseInput(); +}); + +document.getElementById("inputText").addEventListener("input", parseInput); + +// Set initial +updatePlaceholder(); +\ No newline at end of file diff --git a/source/_templates/.icons/bfh/dark.svg b/source/_templates/.icons/bfh/dark.svg @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="layer" + x="0px" + y="0px" + viewBox="0 0 227.60001 354.79999" + xml:space="preserve" + sodipodi:docname="bfh-dark.svg" + width="227.60001" + height="354.79999" + inkscape:version="1.2.2 (b0a8486541, 2022-12-01)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs55"> + + + + + + + + + + + + + + + + + + + + + + + +</defs><sodipodi:namedview + id="namedview53" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + showgrid="false" + inkscape:zoom="1.5457236" + inkscape:cx="135.8587" + inkscape:cy="188.58481" + inkscape:window-width="2560" + inkscape:window-height="1531" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="layer" /> +<style + type="text/css" + id="style2"> + .st0{fill:#376C80;} + .st1{fill:#FDC300;} +</style> +<path + class="st0" + d="m 122.4,0 c 51.1,0 92.5,41.4 92.5,92.5 0,34.3 -15.9,64.1 -41.7,80.3 -0.5,0.3 -0.9,0.8 -0.9,1.4 0,1.1 0.9,1.4 1,1.4 33.4,12.9 54.3,47 54.3,86.6 0,51.1 -41.4,92.6 -92.6,92.6 H 12.8 C 5.7,354.8 0,349 0,342 V 12.9 C 0,5.8 5.8,0.1 12.8,0.1 h 109.6 z" + id="path4" /><path + class="st1" + d="m 77.7,292 c -1.6,0 -3,-1.4 -3,-3 v -74.2 c 0,-1.6 1.4,-3 3,-3 h 4.7 c 1.6,0 3,1.4 3,3 v 32.9 h 28.9 v -32.9 c 0,-1.6 1.4,-3 3,-3 h 4.7 c 1.6,0 3,1.4 3,3 V 289 c 0,1.6 -1.4,3 -3,3 h -4.7 c -1.6,0 -3,-1.4 -3,-3 V 257.1 H 85.4 V 289 c 0,1.6 -1.4,3 -3,3 z" + id="path6" /><path + class="st1" + d="m 77.4,142.8 c -1.6,0 -3,-1.4 -3,-3 V 65.6 c 0,-1.6 1.4,-3 3,-3 H 122 c 1.6,0 3,1.4 3,3 v 3.1 c 0,1.6 -1.4,3 -3,3 H 85.1 v 25.9 h 31.5 c 1.6,0 3,1.4 3,3 v 3.2 c 0,1.6 -1.4,3 -3,3 H 85.1 v 33 c 0,1.6 -1.4,3 -3,3 z" + id="path8" /> +</svg> diff --git a/source/_templates/.icons/bfh/light.svg b/source/_templates/.icons/bfh/light.svg @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="layer" + x="0px" + y="0px" + viewBox="0 0 227.60001 354.79999" + xml:space="preserve" + sodipodi:docname="bfh-light.svg" + width="227.60001" + height="354.79999" + inkscape:version="1.2.2 (b0a8486541, 2022-12-01)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs55"> + + + + + + + + + + + + + + + + + + + + + + + +</defs><sodipodi:namedview + id="namedview53" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + showgrid="false" + inkscape:zoom="1.5457236" + inkscape:cx="135.8587" + inkscape:cy="188.58481" + inkscape:window-width="2560" + inkscape:window-height="1531" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="layer" /> +<style + type="text/css" + id="style2"> + .st0{fill:#376C80;} + .st1{fill:#FDC300;} +</style> +<path + class="st0" + d="m 122.4,0 c 51.1,0 92.5,41.4 92.5,92.5 0,34.3 -15.9,64.1 -41.7,80.3 -0.5,0.3 -0.9,0.8 -0.9,1.4 0,1.1 0.9,1.4 1,1.4 33.4,12.9 54.3,47 54.3,86.6 0,51.1 -41.4,92.6 -92.6,92.6 H 12.8 C 5.7,354.8 0,349 0,342 V 12.9 C 0,5.8 5.8,0.1 12.8,0.1 h 109.6 z" + id="path4" + style="fill:#fdc300;fill-opacity:1" /><path + class="st1" + d="m 77.7,292 c -1.6,0 -3,-1.4 -3,-3 v -74.2 c 0,-1.6 1.4,-3 3,-3 h 4.7 c 1.6,0 3,1.4 3,3 v 32.9 h 28.9 v -32.9 c 0,-1.6 1.4,-3 3,-3 h 4.7 c 1.6,0 3,1.4 3,3 V 289 c 0,1.6 -1.4,3 -3,3 h -4.7 c -1.6,0 -3,-1.4 -3,-3 V 257.1 H 85.4 V 289 c 0,1.6 -1.4,3 -3,3 z" + id="path6" + style="fill:#376c80;fill-opacity:1" /><path + class="st1" + d="m 77.4,142.8 c -1.6,0 -3,-1.4 -3,-3 V 65.6 c 0,-1.6 1.4,-3 3,-3 H 122 c 1.6,0 3,1.4 3,3 v 3.1 c 0,1.6 -1.4,3 -3,3 H 85.1 v 25.9 h 31.5 c 1.6,0 3,1.4 3,3 v 3.2 c 0,1.6 -1.4,3 -3,3 H 85.1 v 33 c 0,1.6 -1.4,3 -3,3 z" + id="path8" + style="fill:#376c80;fill-opacity:1" /> +</svg> diff --git a/source/_templates/.icons/bfh/logo.svg b/source/_templates/.icons/bfh/logo.svg @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="layer" + x="0px" + y="0px" + viewBox="0 0 227.60001 354.79999" + xml:space="preserve" + sodipodi:docname="logo.svg" + width="227.60001" + height="354.79999" + inkscape:version="1.2.2 (b0a8486541, 2022-12-01)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs55" /><sodipodi:namedview + id="namedview53" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + showgrid="false" + inkscape:zoom="3.0914472" + inkscape:cx="148.31242" + inkscape:cy="182.92404" + inkscape:window-width="1720" + inkscape:window-height="1403" + inkscape:window-x="26" + inkscape:window-y="23" + inkscape:window-maximized="0" + inkscape:current-layer="layer" /><style + type="text/css" + id="style2" + style="display:inline"> +</style><path + d="m 122.4,0 c 51.1,0 92.5,41.4 92.5,92.5 0,34.3 -15.9,64.1 -41.7,80.3 -0.5,0.3 -0.9,0.8 -0.9,1.4 0,1.1 0.9,1.4 1,1.4 33.4,12.9 54.3,47 54.3,86.6 0,51.1 -41.4,92.6 -92.6,92.6 H 12.8 C 5.7,354.8 0,349 0,342 V 12.9 C 0,5.8 5.8,0.1 12.8,0.1 h 109.6 z" + id="path4" + style="fill:var(--md-primary-bg-color);fill-opacity:1" /><path + d="m 77.7,292 c -1.6,0 -3,-1.4 -3,-3 v -74.2 c 0,-1.6 1.4,-3 3,-3 h 4.7 c 1.6,0 3,1.4 3,3 v 32.9 h 28.9 v -32.9 c 0,-1.6 1.4,-3 3,-3 h 4.7 c 1.6,0 3,1.4 3,3 V 289 c 0,1.6 -1.4,3 -3,3 h -4.7 c -1.6,0 -3,-1.4 -3,-3 V 257.1 H 85.4 V 289 c 0,1.6 -1.4,3 -3,3 z" + id="path6" + style="fill:var(--md-primary-fg-color);fill-opacity:1" /><path + d="m 77.4,142.8 c -1.6,0 -3,-1.4 -3,-3 V 65.6 c 0,-1.6 1.4,-3 3,-3 H 122 c 1.6,0 3,1.4 3,3 v 3.1 c 0,1.6 -1.4,3 -3,3 H 85.1 v 25.9 h 31.5 c 1.6,0 3,1.4 3,3 v 3.2 c 0,1.6 -1.4,3 -3,3 H 85.1 v 33 c 0,1.6 -1.4,3 -3,3 z" + id="path8" + style="fill-opacity:1;fill:var(--md-primary-fg-color);" /></svg> diff --git a/source/_templates/.icons/mseLogo.svg b/source/_templates/.icons/mseLogo.svg @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + id="Ebene_1" + data-name="Ebene 1" + viewBox="0 0 102.35 19.621919" + version="1.1" + sodipodi:docname="mseLogo.svg" + width="102.35" + height="19.62192" + inkscape:version="1.2.2 (b0a8486541, 2022-12-01)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview80" + pagecolor="#505050" + bordercolor="#eeeeee" + borderopacity="1" + inkscape:showpageshadow="0" + inkscape:pageopacity="0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#505050" + showgrid="false" + inkscape:zoom="4.2012765" + inkscape:cx="107.1103" + inkscape:cy="8.21179" + inkscape:window-width="1920" + inkscape:window-height="953" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Ebene_1" /> + <defs + id="defs7"> + <style + id="style2">.cls-1{fill:none;}.cls-2{fill:#fff;}.cls-3{fill:#57595b;stroke:#fff;stroke-width:0.5px;}.cls-4{clip-path:url(#clip-path);}.cls-5{fill:#c73f4a;}</style> + <clipPath + id="clip-path"> + <rect + class="cls-1" + x="48.900002" + y="27.379999" + width="102.35" + height="19.57" + id="rect4" /> + </clipPath> + </defs> + <title + id="title9">Zeichenfläche 2</title> + <polygon + class="cls-2" + points="48.9,27.4 55.82,27.4 64.89,40.9 73.42,27.4 80.61,27.4 80.61,42.08 80.61,46.95 75.58,46.95 75.58,32.57 66.5,46.95 63.15,46.95 54.01,32.57 54.01,46.95 48.9,46.95 " + id="polygon69" + transform="translate(-48.9,-27.379999)" /> + <path + class="cls-2" + d="m 35.31,4.8900008 a 4.26,4.26 0 0 1 1.85,-3.45 7.14,7.14 0 0 1 4.5,-1.41999996 H 67.02 V 5.1900008 H 40.35 v 2.35 h 20.29 a 8.92,8.92 0 0 1 4.79,1 4,4 0 0 1 1.59,3.6000002 v 2.22 a 4.46,4.46 0 0 1 -1.81,3.88 7.69,7.69 0 0 1 -4.57,1.38 H 35.31 v -5.22 h 26.47 v -2.22 H 41.63 a 8.34,8.34 0 0 1 -4.53,-1.21 4,4 0 0 1 -1.75,-3.4300002 v -2.65 z" + id="path71" /> + <g + class="cls-4" + clip-path="url(#clip-path)" + id="g77" + transform="translate(-48.9,-27.379999)"> + <path + class="cls-2" + d="m 146.8,41.64 h 4.43 V 47 h -25.36 a 7.14,7.14 0 0 1 -4.5,-1.43 4.21,4.21 0 0 1 -1.85,-3.44 v -7.34 h 31.71 v 4.64 h -26.67 v 2.21 z" + id="path73" /> + <path + class="cls-5" + d="m 119.53,32.56 v -0.3 a 4.26,4.26 0 0 1 1.85,-3.45 7.14,7.14 0 0 1 4.5,-1.43 h 25.37 v 5.18 z" + id="path75" /> + </g> +</svg> diff --git a/source/_templates/.icons/talerLogo.svg b/source/_templates/.icons/talerLogo.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" width="670" height="300" viewBox="0 0 201 90"><g fill="#0042b3" fill-rule="evenodd" stroke-width=".3"><path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z"/><path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 018.5-.2c4 3.6 7.4 8 9.9 13z"/><path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z"/></g><path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 29.4h-4.6v31h20.6v-5h-16zM166.5 29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4h6.5l7 10.8z"/></svg> +\ No newline at end of file diff --git a/source/_templates/breadcrumbs.html b/source/_templates/breadcrumbs.html @@ -0,0 +1,84 @@ +{# Support for Sphinx 1.3+ page_source_suffix, but don't break old builds. #} + +{% if page_source_suffix %} +{% set suffix = page_source_suffix %} +{% else %} +{% set suffix = source_suffix %} +{% endif %} + +{% if meta is defined and meta is not none %} +{% set check_meta = True %} +{% else %} +{% set check_meta = False %} +{% endif %} + +{% if check_meta and 'github_url' in meta %} +{% set display_github = True %} +{% endif %} + +{% if check_meta and 'bitbucket_url' in meta %} +{% set display_bitbucket = True %} +{% endif %} + +{% if check_meta and 'gitlab_url' in meta %} +{% set display_gitlab = True %} +{% endif %} + +{% set display_vcs_links = display_vcs_links if display_vcs_links is defined else True %} + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + {% block breadcrumbs %} + <li><a href="{{ pathto(master_doc) }}" class="icon icon-home"></a> &raquo;</li> + {% for doc in parents %} + <li><a href="{{ doc.link|e }}">{{ doc.title }}</a> &raquo;</li> + {% endfor %} + <li>{{ title }}</li> + {% endblock %} + {% block breadcrumbs_aside %} + <li class="wy-breadcrumbs-aside"> + {% if hasdoc(pagename) and display_vcs_links %} + {% if display_github %} + {% if check_meta and 'github_url' in meta %} + <!-- User defined GitHub URL --> + <a href="{{ meta['github_url'] }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a> + {% else %} + <a href="https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/{{ theme_vcs_pageview_mode or "blob" }}/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ suffix }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a> + {% endif %} + {% elif display_bitbucket %} + {% if check_meta and 'bitbucket_url' in meta %} + <!-- User defined Bitbucket URL --> + <a href="{{ meta['bitbucket_url'] }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a> + {% else %} + <a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}{{ suffix }}?mode={{ theme_vcs_pageview_mode or "view" }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a> + {% endif %} + {% elif display_gitlab %} + {% if check_meta and 'gitlab_url' in meta %} + <!-- User defined GitLab URL --> + <a href="{{ meta['gitlab_url'] }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a> + {% else %} + <a href="https://{{ gitlab_host|default("gitlab.com") }}/{{ gitlab_group }}" class="fa fa-gitlab"> {{ _('Repositories') }}</a> + {% endif %} + {% elif show_source and source_url_prefix %} + <a href="{{ source_url_prefix }}{{ pagename }}{{ suffix }}">{{ _('View page source') }}</a> + {% elif show_source and has_source and sourcename %} + <a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> {{ _('View page source') }}</a> + {% endif %} + {% endif %} + </li> + {% endblock %} + </ul> + + {% if (theme_prev_next_buttons_location == 'top' or theme_prev_next_buttons_location == 'both') and (next or prev) %} + <div class="rst-breadcrumbs-buttons" role="navigation" aria-label="breadcrumb navigation"> + {% if next %} + <a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n">{{ _('Next') }} <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> + {% endif %} + {% if prev %} + <a href="{{ prev.link|e }}" class="btn btn-neutral float-left" title="{{ prev.title|striptags|e }}" accesskey="p"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> {{ _('Previous') }}</a> + {% endif %} + </div> + {% endif %} + <hr/> +</div> diff --git a/source/_templates/layout.html b/source/_templates/layout.html @@ -0,0 +1,252 @@ +{#- + This file was automatically generated - do not edit +-#} +{% import "partials/language.html" as lang with context %} +<!doctype html> +<html lang="{{ lang.t('language') }}" class="no-js"> + <head> + {% block site_meta %} + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + {% if page.meta and page.meta.description %} + <meta name="description" content="{{ page.meta.description }}"> + {% elif config.site_description %} + <meta name="description" content="{{ config.site_description }}"> + {% endif %} + {% if page.meta and page.meta.author %} + <meta name="author" content="{{ page.meta.author }}"> + {% elif config.site_author %} + <meta name="author" content="{{ config.site_author }}"> + {% endif %} + {% if page.canonical_url %} + <link rel="canonical" href="{{ page.canonical_url }}"> + {% endif %} + <link rel="icon" href="{{ favicon_url }}"> + {% endblock %} + {% block htmltitle %} + {% if page.meta and page.meta.title %} + <title>{{ page.meta.title }} - {{ config.site_name }}</title> + {% elif page.title and not page.is_homepage %} + <title>{{ page.title | striptags }} - {{ config.site_name }}</title> + {% else %} + <title>{{ config.site_name }}</title> + {% endif %} + {% endblock %} + {% block styles %} + {% if config.theme.palette %} + {% set palette = config.theme.palette %} + {% if palette.primary %} + {% import "partials/palette.html" as map %} + {% set primary = map.primary( + palette.primary | replace(" ", "-") | lower + ) %} + <meta name="theme-color" content="{{ primary }}"> + {% endif %} + {% endif %} + {% include "partials/icons.html" %} + {% endblock %} + {% block libs %}{% endblock %} + {% block fonts %} + {% if config.theme.font != false %} + {% set text = config.theme.font.text | d("Roboto", true) %} + {% set code = config.theme.font.code | d("Roboto Mono", true) %} + <style>:root{--md-text-font:"{{ text }}";--md-code-font:"{{ code }}"}</style> + {% endif %} + {% endblock %} + {%- for css in css_files %} + {%- if css|attr("filename") %} + {{ css_tag(css) }} + {%- else %} + <link rel="stylesheet" href="{{ pathto(css, 1)|e }}"> + {%- endif %} + {%- endfor %} + {% include "partials/javascripts/base.html" %} + {% block analytics %} + {% include "partials/integrations/analytics.html" %} + {% endblock %} + {% if page.meta and page.meta.meta %} + {% for tag in page.meta.meta %} + <meta {% for key, value in tag.items() %} {{ key }}="{{value}}" {% endfor %}> + {% endfor %} + {% endif %} + {% block extrahead %}{% endblock %} + </head> + {% set direction = config.theme.direction or lang.t('direction') %} + {% if config.theme.palette %} + {% set palette = config.theme.palette %} + {% if not palette is mapping %} + {% set palette = palette | first %} + {% endif %} + {% set scheme = palette.scheme | replace(" ", "-") | lower %} + {% set primary = palette.primary | replace(" ", "-") | lower %} + {% set accent = palette.accent | replace(" ", "-") | lower %} + <body dir="{{ direction }}" data-md-color-scheme="{{ scheme }}" data-md-color-primary="{{ primary }}" data-md-color-accent="{{ accent }}"> + {% else %} + <body dir="{{ direction }}"> + {% endif %} + {% set features = config.theme.features or [] %} + {% if not config.theme.palette is mapping %} + {% include "partials/javascripts/palette.html" %} + {% endif %} + <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> + <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> + <label class="md-overlay" for="__drawer"></label> + <div data-md-component="skip"> + {% if page.toc | first is defined %} + {% set skip = page.toc | first %} + <a href="{{ skip.url | url }}" class="md-skip"> + {{ lang.t('skip.link.title') }} + </a> + {% endif %} + </div> + <div data-md-component="announce"> + {% if self.announce() %} + <aside class="md-banner"> + <div class="md-banner__inner md-grid md-typeset"> + {% if "announce.dismiss" in features %} + <button class="md-banner__button md-icon" aria-label="{{ lang.t('announce.dismiss') }}"> + {% include ".icons/material/close.svg" %} + </button> + {% endif %} + {% block announce %}{% endblock %} + </div> + {% if "announce.dismiss" in features %} + {% include "partials/javascripts/announce.html" %} + {% endif %} + </aside> + {% endif %} + </div> + {% if config.extra.version %} + <div data-md-component="outdated" hidden> + {% if self.outdated() %} + <aside class="md-banner md-banner--warning"> + <div class="md-banner__inner md-grid md-typeset"> + {% block outdated %}{% endblock %} + </div> + {% include "partials/javascripts/outdated.html" %} + </aside> + {% endif %} + </div> + {% endif %} + {% block header %} + {% include "partials/header.html" %} + {% endblock %} + <div class="md-container" data-md-component="container"> + {% block hero %} + {% include "partials/hero.html" %} + {% endblock %} + {% block tabs %} + {% if not "navigation.tabs.sticky" in features %} + {% if "navigation.tabs" in features %} + {% include "partials/tabs.html" %} + {% endif %} + {% endif %} + {% endblock %} + <main class="md-main" data-md-component="main"> + <div class="md-main__inner md-grid"> + {% block site_nav %} + {% if nav %} + {% if page.meta and page.meta.hide %} + {% set hidden = "hidden" if "navigation" in page.meta.hide %} + {% endif %} + <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" {{ hidden }}> + <div class="md-sidebar__scrollwrap"> + <div class="md-sidebar__inner"> + {% include "nav.html" %} + </div> + </div> + </div> + {% endif %} + {% if not "toc.integrate" in features %} + {% if page.meta and page.meta.hide %} + {% set hidden = "hidden" if "toc" in page.meta.hide %} + {% endif %} + <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" {{ hidden }}> + <div class="md-sidebar__scrollwrap"> + <div class="md-sidebar__inner"> + {% include "partials/toc.html" %} + </div> + </div> + </div> + {% endif %} + {% endblock %} + {% block container %} + <div class="md-content" data-md-component="content"> + <article class="md-content__inner md-typeset" role="main"> + {%- if False %}{% block body %}{% endblock body %}{% endif %} + {%- set sphinx_rendered_body = self.body() -%} + {% block content %} + {% include "partials/content.html" %} + {% endblock %} + </article> + </div> + {% endblock %} + {% include "partials/javascripts/content.html" %} + </div> + {% if "navigation.top" in features %} + <a href="#" class="md-top md-icon" data-md-component="top" hidden> + {% include ".icons/material/arrow-up.svg" %} + {{ lang.t('top.title') }} + </a> + {% endif %} + </main> + {% block footer %} + {% include "partials/footer.html" %} + {% endblock %} + </div> + <div class="md-dialog" data-md-component="dialog"> + <div class="md-dialog__inner md-typeset"></div> + </div> + {% if config.extra.consent %} + <div class="md-consent" data-md-component="consent" id="__consent" hidden> + <div class="md-consent__overlay"></div> + <aside class="md-consent__inner"> + <form class="md-consent__form md-grid md-typeset" name="consent"> + {% include "partials/consent.html" %} + </form> + </aside> + </div> + {% include "partials/javascripts/consent.html" %} + {% endif %} + {% block config %} + {%- set app = { + "base": base_url, + "features": features, + "translations": {}, + } -%} + {%- if config.extra.version -%} + {%- set _ = app.update({ "version": config.extra.version }) -%} + {%- endif -%} + {%- if config.extra.tags -%} + {%- set _ = app.update({ "tags": config.extra.tags }) -%} + {%- endif -%} + {%- set translations = app.translations -%} + {%- for key in [ + "clipboard.copy", + "clipboard.copied", + "search.config.lang", + "search.config.pipeline", + "search.config.separator", + "search.placeholder", + "search.result.placeholder", + "search.result.none", + "search.result.one", + "search.result.other", + "search.result.more.one", + "search.result.more.other", + "search.result.term.missing", + "select.version.title" + ] -%} + {%- set _ = translations.update({ key: lang.t(key) }) -%} + {%- endfor -%} + <script id="__config" type="application/json"> + {{- app | tojson -}} + </script> + {% block scripts %} + {%- for js in script_files %} + {{ js_tag(js) }} + {%- endfor %} + {% endblock %} + {% endblock %} + </body> +</html> diff --git a/source/_templates/nav.html b/source/_templates/nav.html @@ -0,0 +1,31 @@ +{#- + This file was automatically generated - do not edit +-#} +{% set class = "md-nav md-nav--primary" %} +{% if "navigation.tabs" in features %} + {% set class = class ~ " md-nav--lifted" %} +{% endif %} +{% if "toc.integrate" in features %} + {% set class = class ~ " md-nav--integrated" %} +{% endif %} +<nav class="{{ class }}" aria-label="{{ lang.t('nav.title') }}" data-md-level="0"> +{# <label class="md-nav__title" for="__drawer"> + <a href="{{ config.extra.homepage | d(nav.homepage.url, true) | url }}" title="{{ config.site_name | e }}" class="md-nav__button md-logo" aria-label="{{ config.site_name }}" data-md-component="logo"> + {% include "partials/logo.html" %} + </a> + {{ config.site_name }} + </label> +#} + {% if config.repo_url %} + <div class="md-nav__source"> + {% include "partials/source.html" %} + </div> + {% endif %} + <ul class="md-nav__list" data-md-scrollfix> + {% for nav_item in nav %} + {% set path = "__nav_" ~ loop.index %} + {% set level = 1 %} + {% include "partials/nav-item.html" %} + {% endfor %} + </ul> +</nav> diff --git a/source/_templates/versions.html b/source/_templates/versions.html @@ -0,0 +1,19 @@ +{%- if current_version %} +<div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="versions"> + <span class="rst-current-version" data-toggle="rst-current-version"> + <span class="fa fa-book"> Temperature Logger</span> + v: {{ current_version.name }} + <span class="fa fa-caret-down"></span> + </span> + <div class="rst-other-versions"> + {%- if versions and versions.tags %} + <dl> + <dt>Versions</dt> + {%- for item in versions.tags %} + <dd><a href="{{ item.url }}">{{ item.name }}</a></dd> + {%- endfor %} + </dl> + {%- endif %} + </div> +</div> +{%- endif %} diff --git a/source/baseXParser/index.rst b/source/baseXParser/index.rst @@ -0,0 +1,15 @@ +:hide-toc: + +BaseX Converter +=============== + +- For currency, use the Base8 Decode parser + + It converts the character bytes to the base8 representation to enter into the xOTP Generator + +- For the secret, use the parser form base32 to base8 + + The secret in the base32 format is decoded to the byte representation and encoded to the base8 format to enter into the xOTP Generator + +.. raw:: html + :file: ../_static/baseX_converter/baseX_converter.html +\ No newline at end of file diff --git a/source/conf.py b/source/conf.py @@ -6,22 +6,230 @@ # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information -project = 'xOTP Documentation' -copyright = '2026, Adrian STEINER' -author = 'Adrian STEINER' +from datetime import datetime + +# Project configuration variables + +project = "OTP Generator Online Manual" +author = "Adrian STEINER" +copyright = str(datetime.now().year) + f", xOTP Generator, {author}" +release = "0.0.1" + +site_url = "https://taler.pages.ti.bfh.ch/otp-generator/small_serie_production-master-thesis/documentation/" +repo_url = ( + "https://git-www.taler.net/taler-xotp.git/" +) +repo_name = "xOTP Repo" +pageLogo = "bfh/logo" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration -extensions = [] +extensions = [ + "sphinx_immaterial", + "sphinx.ext.autosectionlabel", + "sphinxcontrib.video", + "sphinx_immaterial.kbd_keys", + "sphinx_embedpdf.sphinx_embedpdf", + "myst_parser", +] + +html_sidebars = { + "**": ["logo-text.html", "globaltoc.html", "localtoc.html", "searchbox.html"] +} + +# Add prefix to use the same headers in an other document +autosectionlabel_prefix_document = True -templates_path = ['_templates'] +# Add to reference to headers til header 4 +myst_heading_anchors = 4 + +# Reference files +source_suffix = { + ".rst": "restructuredtext", + ".md": "markdown", + ".txt": "restructuredtext", + ".lnk": "restructuredtext", +} + +master_doc = "index" + +templates_path = ["_templates"] exclude_patterns = [] +# some customizations on styles - relative path to _static +html_css_files = [ + # 'styles/custom.css', + "styles/bfh.css", + "styles/twocol.css", + "styles/cond-item.css", + "styles/lists.css", + "styles/bfh-tables.css", + "styles/figureHacks.css", +] + +## -- sphinx-immaterial additional admonitions ------------------------------ +sphinx_immaterial_custom_admonitions = [ + { + "name": "demo", + "color": (43, 155, 70), + "icon": "fontawesome/solid/arrow-up-right-dots", + "classes": ["demo"], + "override": True, + }, + { + "name": "solution", + "classes": ["success"], + }, + { + "name": "outcomes", + "icon": "material/compass-outline", + "classes": ["success"], + }, + { + "name": "objectives", + "classes": ["abstract"], + }, + { + "name": "exercise", + "color": (150, 130, 95), + "icon": "fontawesome/solid/pen-to-square", + "classes": ["exercise"], + "override": True, + }, + {"name": "optional", "color": (130, 90, 125), "classes": ["optional"]}, + { + "name": "discussion", + "color": (105, 150, 115), + "icon": "fontawesome/solid/comments", + "classes": ["discussion"], + "override": True, + }, +] +# material theme options (see theme.conf for more information) +html_theme_options = { + "icon": { + "repo": "fontawesome/brands/git-alt", + # "edit": "material/file-edit-outline", + "logo": pageLogo, # General path to logo, must be in the _templates.icons path + }, + # "languages": [ + # { + # "name": "English", + # "link": "/", # points to ./en/ subdirectory + # "lang": "en", + # }, + # { + # "name": "German", + # "link": "de/", # points to ./en/ subdirectory + # "lang": "de", + # }, + # { + # "name": "French", + # "link": "fr/", # points to ./fr/ subdirectory + # "lang": "fr", + # }, + # ], + "site_url": site_url, + "repo_url": repo_url, + "repo_name": repo_name, + # "edit_uri": "blob/main/docs", + "globaltoc_collapse": True, + "features": [ + "navigation.expand", + # "navigation.tabs", + # "toc.integrate", + "navigation.sections", + # "navigation.instant", + # "header.autohide", + "navigation.top", + # "navigation.tracking", + "search.highlight", + "search.share", + "toc.follow", + "toc.sticky", + "content.tabs.link", + "announce.dismiss", + ], + "palette": [ + { + "media": "(prefers-color-scheme: light)", + "scheme": "default", + "primary": "blue-grey", + "accent": "yellow", + "toggle": { + "icon": "material/weather-night", + "name": "Switch to dark mode", + }, + }, + { + "media": "(prefers-color-scheme: dark)", + "scheme": "slate", + "primary": "amber", + "accent": "amber", + "toggle": { + "icon": "material/weather-sunny", + "name": "Switch to light mode", + }, + }, + ], + "font": { + "text": "Lunasima", # used for all the pages' text + "code": "Fira Code", # used for literal code blocks + }, + # # BEGIN: version_dropdown + # "version_dropdown": True, + # "version_info": [ + # { + # "version": "https://sphinx-immaterial.rtfd.io", + # "title": "ReadTheDocs", + # "aliases": [], + # }, + # { + # "version": "https://jbms.github.io/sphinx-immaterial", + # "title": "Github Pages", + # "aliases": [], + # }, + # ], + # # END: version_dropdown + "toc_title_is_page_title": True, + # BEGIN: social icons + "social": [ + { + "icon": "bfh/dark", + "link": "https://www.bfh.ch/ti", + "name": "BFH-TI", + }, + # { + # "icon": "mseLogo", + # "link": "https://www.msengineering.ch/", + # "name": "MSE", + # }, + { + "icon": "talerLogo", + "link": "https://taler.net", + "name": "GNU Taler", + }, + ], + # END: social icons +} # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = 'alabaster' -html_static_path = ['_static'] +html_theme = "sphinx_immaterial" +html_static_path = [ + "_static", +# "../schematics", +# "../electronic-design/datasheets", +# "../pictures", +# "../userManual/_output", +# "../requirementsEngineering/_output", +# "../report/_output", +# "../measurements", +# "../docs", +] +# html_logo = '_templates/.icons/logo.svg' # Do not use this html logo variable, the icon is set at html_theme_options{"icon": {"logo": <path>} +html_favicon = "../figures/xOTP_generator_logo.svg" # Icon on browser tab window +html_title = project