Showing preview only (2,074K chars total). Download the full file or copy to clipboard to get everything.
Repository: chris-rudmin/Recorderjs
Branch: master
Commit: 87e0145fcf15
Files: 31
Total size: 2.0 MB
Directory structure:
gitextract_eb05weoo/
├── .circleci/
│ └── config.yml
├── .gitignore
├── .gitmodules
├── LICENSE.md
├── Makefile
├── README.md
├── dist/
│ └── decoderWorker.min.wasm
├── dist-unminified/
│ ├── decoderWorker.js
│ ├── decoderWorker.wasm
│ ├── encoderWorker.js
│ ├── recorder.js
│ └── waveWorker.js
├── example/
│ ├── decoder.html
│ ├── encoder.html
│ ├── fileEncoder.html
│ ├── mono.opus
│ └── waveRecorder.html
├── package.json
├── src/
│ ├── decoderWorker.js
│ ├── encoderWorker.js
│ ├── recorder.js
│ └── waveWorker.js
├── test/
│ ├── decoderWorker.js
│ ├── encoderWorker.js
│ ├── recorder.js
│ ├── sample/
│ │ ├── joinedMono.opus
│ │ ├── mono.opus
│ │ └── stereo.opus
│ └── waveWorker.js
├── test.js
└── webpack.config.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .circleci/config.yml
================================================
# Javascript Node CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-javascript/ for more details
#
version: 2
jobs:
build:
docker:
# specify the version you desire here
- image: circleci/node:12.16.3
# Specify service dependencies here if necessary
# CircleCI maintains a library of pre-built images
# documented at https://circleci.com/docs/2.0/circleci-images/
# - image: circleci/mongo:3.4.4
working_directory: ~/repo
steps:
- checkout
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "package.json" }}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run: yarn install
- save_cache:
paths:
- node_modules
key: v1-dependencies-{{ checksum "package.json" }}
# run tests!
- run: yarn test
================================================
FILE: .gitignore
================================================
node_modules/
.DS_Store
/.idea/
/*.iml
================================================
FILE: .gitmodules
================================================
[submodule "opus"]
path = opus
url = https://gitlab.xiph.org/xiph/opus.git
branch = v1.3.1
[submodule "speexdsp"]
path = speexdsp
url = https://gitlab.xiph.org/xiph/speexdsp.git
branch = SpeexDSP-1.2.0
================================================
FILE: LICENSE.md
================================================
## Opus Recorder License (MIT)
Original Work Copyright © 2013 Matt Diamond
Modified Work Copyright © 2014 Christopher Rudmin
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
## Opus License (BSD)
Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic,
Jean-Marc Valin, Timothy B. Terriberry,
CSIRO, Gregory Maxwell, Mark Borgerding,
Erik de Castro Lopo
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- Neither the name of Internet Society, IETF or IETF Trust, nor the
names of specific contributors, may be used to endorse or promote
products derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Opus is subject to the royalty-free patent licenses which are
specified at:
Xiph.Org Foundation:
https://datatracker.ietf.org/ipr/1524/
Microsoft Corporation:
https://datatracker.ietf.org/ipr/1914/
Broadcom Corporation:
https://datatracker.ietf.org/ipr/1526/
## Speex License (BSD)
© 2002-2003, Jean-Marc Valin/Xiph.Org Foundation
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of the Xiph.org Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: Makefile
================================================
INPUT_DIR=./src
OUTPUT_DIR=./dist
OUTPUT_DIR_UNMINIFIED=./dist-unminified
EMCC_OPTS=-O3 -s NO_DYNAMIC_EXECUTION=1 -s NO_FILESYSTEM=1
DEFAULT_EXPORTS:='_malloc','_free'
LIBOPUS_ENCODER_SRC=$(INPUT_DIR)/encoderWorker.js
LIBOPUS_DECODER_SRC=$(INPUT_DIR)/decoderWorker.js
LIBOPUS_ENCODER_MIN=$(OUTPUT_DIR)/encoderWorker.min.js
LIBOPUS_ENCODER=$(OUTPUT_DIR_UNMINIFIED)/encoderWorker.js
LIBOPUS_DECODER_MIN=$(OUTPUT_DIR)/decoderWorker.min.js
LIBOPUS_DECODER=$(OUTPUT_DIR_UNMINIFIED)/decoderWorker.js
LIBOPUS_DIR=./opus
LIBOPUS_OBJ=$(LIBOPUS_DIR)/.libs/libopus.a
LIBOPUS_ENCODER_EXPORTS:='_opus_encoder_create','_opus_encode_float','_opus_encoder_ctl','_opus_encoder_destroy'
LIBOPUS_DECODER_EXPORTS:='_opus_decoder_create','_opus_decode_float','_opus_decoder_destroy'
LIBSPEEXDSP_DIR=./speexdsp
LIBSPEEXDSP_OBJ=$(LIBSPEEXDSP_DIR)/libspeexdsp/.libs/libspeexdsp.a
LIBSPEEXDSP_EXPORTS:='_speex_resampler_init','_speex_resampler_process_interleaved_float','_speex_resampler_destroy'
RECORDER_MIN=$(OUTPUT_DIR)/recorder.min.js
RECORDER=$(OUTPUT_DIR_UNMINIFIED)/recorder.js
RECORDER_SRC=$(INPUT_DIR)/recorder.js
WAVE_WORKER_MIN=$(OUTPUT_DIR)/waveWorker.min.js
WAVE_WORKER=$(OUTPUT_DIR_UNMINIFIED)/waveWorker.js
WAVE_WORKER_SRC=$(INPUT_DIR)/waveWorker.js
default: $(LIBOPUS_ENCODER) $(LIBOPUS_ENCODER_MIN) $(LIBOPUS_DECODER) $(LIBOPUS_DECODER_MIN) $(RECORDER) $(RECORDER_MIN) $(WAVE_WORKER) $(WAVE_WORKER_MIN) test
cleanDist:
rm -rf $(OUTPUT_DIR) $(OUTPUT_DIR_UNMINIFIED)
mkdir $(OUTPUT_DIR)
mkdir $(OUTPUT_DIR_UNMINIFIED)
cleanAll: cleanDist
rm -rf $(LIBOPUS_DIR) $(LIBSPEEXDSP_DIR)
test:
# Tests need to run relative to `dist` folder for wasm file import
cd $(OUTPUT_DIR); node --expose-wasm ../test.js
.PHONY: test
$(LIBOPUS_DIR)/autogen.sh $(LIBSPEEXDSP_DIR)/autogen.sh:
git submodule update --init
$(LIBOPUS_OBJ): $(LIBOPUS_DIR)/autogen.sh
cd $(LIBOPUS_DIR); ./autogen.sh
cd $(LIBOPUS_DIR); emconfigure ./configure --disable-extra-programs --disable-doc --disable-intrinsics --disable-rtcd --disable-stack-protector
cd $(LIBOPUS_DIR); emmake make
$(LIBSPEEXDSP_OBJ): $(LIBSPEEXDSP_DIR)/autogen.sh
cd $(LIBSPEEXDSP_DIR); ./autogen.sh
cd $(LIBSPEEXDSP_DIR); emconfigure ./configure --disable-examples --disable-neon
cd $(LIBSPEEXDSP_DIR); emmake make
$(LIBOPUS_ENCODER): $(LIBOPUS_ENCODER_SRC) $(LIBOPUS_OBJ) $(LIBSPEEXDSP_OBJ)
emcc -o $@ $(EMCC_OPTS) -s BINARYEN_ASYNC_COMPILATION=0 -s SINGLE_FILE=1 -g3 -s EXPORTED_FUNCTIONS="[$(DEFAULT_EXPORTS),$(LIBOPUS_ENCODER_EXPORTS),$(LIBSPEEXDSP_EXPORTS)]" --post-js $(LIBOPUS_ENCODER_SRC) $(LIBOPUS_OBJ) $(LIBSPEEXDSP_OBJ)
$(LIBOPUS_ENCODER_MIN): $(LIBOPUS_ENCODER_SRC) $(LIBOPUS_OBJ) $(LIBSPEEXDSP_OBJ)
emcc -o $@ $(EMCC_OPTS) -s BINARYEN_ASYNC_COMPILATION=0 -s SINGLE_FILE=1 -s EXPORTED_FUNCTIONS="[$(DEFAULT_EXPORTS),$(LIBOPUS_ENCODER_EXPORTS),$(LIBSPEEXDSP_EXPORTS)]" --post-js $(LIBOPUS_ENCODER_SRC) $(LIBOPUS_OBJ) $(LIBSPEEXDSP_OBJ)
$(LIBOPUS_DECODER): $(LIBOPUS_DECODER_SRC) $(LIBOPUS_OBJ) $(LIBSPEEXDSP_OBJ)
npm run webpack -- --config webpack.config.js -d --output-library DecoderWorker $(LIBOPUS_DECODER_SRC) -o $@
emcc -o $@ $(EMCC_OPTS) -g3 -s EXPORTED_FUNCTIONS="[$(DEFAULT_EXPORTS),$(LIBOPUS_DECODER_EXPORTS),$(LIBSPEEXDSP_EXPORTS)]" --pre-js $@ $(LIBOPUS_OBJ) $(LIBSPEEXDSP_OBJ)
$(LIBOPUS_DECODER_MIN): $(LIBOPUS_DECODER_SRC) $(LIBOPUS_OBJ) $(LIBSPEEXDSP_OBJ)
npm run webpack -- --config webpack.config.js -p --output-library DecoderWorker $(LIBOPUS_DECODER_SRC) -o $@
emcc -o $@ $(EMCC_OPTS) -s EXPORTED_FUNCTIONS="[$(DEFAULT_EXPORTS),$(LIBOPUS_DECODER_EXPORTS),$(LIBSPEEXDSP_EXPORTS)]" --pre-js $@ $(LIBOPUS_OBJ) $(LIBSPEEXDSP_OBJ)
$(RECORDER): $(RECORDER_SRC)
npm run webpack -- --config webpack.config.js -d --output-library Recorder $(RECORDER_SRC) -o $@
$(RECORDER_MIN): $(RECORDER_SRC)
npm run webpack -- --config webpack.config.js -p --output-library Recorder $(RECORDER_SRC) -o $@
$(WAVE_WORKER): $(WAVE_WORKER_SRC)
npm run webpack -- -d $(WAVE_WORKER_SRC) -o $@
$(WAVE_WORKER_MIN): $(WAVE_WORKER_SRC)
npm run webpack -- -p $(WAVE_WORKER_SRC) -o $@
================================================
FILE: README.md
================================================
# Opus & Wave Recorder
A javascript library to encode the output of Web Audio API nodes in Ogg Opus or WAV format using WebAssembly.
# !!! PROJECT NO LONGER SUPPORTED !!!
Heads up that this project is no longer being maintained. There is currently good browser support for webcodecs API which replaces the need for wasm codecs
#### Libraries Used
- Libopus: v1.3.1 compiled with emscripten 2.0.31
- speexDSP: 1.2.0 compiled with emscripten 2.0.31
#### Required Files
The required files are in the `dist` folder. Unminified sources are in `dist-unminified`.
Examples for recording, encoding, and decoding are in `examples` folder.
---------
### Usage
#### Constructor
The `Recorder` object is available in the global namespace and supports CommonJS and AMD imports.
```js
var rec = new Recorder([config]);
```
Creates a recorder instance.
- **config** - An optional configuration object.
---------
#### General Config options
- **bufferLength** - (*optional*) The length of the buffer that the scriptProcessorNode uses to capture the audio. Defaults to `4096`.
- **encoderPath** - (*optional*) Path to desired worker script. Defaults to `encoderWorker.min.js`
- **mediaTrackConstraints** - (*optional*) Object to specify [media track constraints](https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints). Defaults to `true`.
- **monitorGain** - (*optional*) Sets the gain of the monitoring output. Gain is an a-weighted value between `0` and `1`. Defaults to `0`
- **numberOfChannels** - (*optional*) The number of channels to record. `1` = mono, `2` = stereo. Defaults to `1`. Maximum `2` channels are supported.
- **recordingGain** - (*optional*) Sets the gain of the recording input. Gain is an a-weighted value between `0` and `1`. Defaults to `1`
- **sourceNode** - (*optional*) An Instance of MediaStreamAudioSourceNode to use. If a sourceNode is provided, then closing the stream and audioContext will need to be managed by the implementation.
#### Config options for OGG OPUS encoder
- **encoderApplication** - (*optional*) Supported values are: `2048` - Voice, `2049` - Full Band Audio, `2051` - Restricted Low Delay. Defaults to `2049`.
- **encoderBitRate** - (*optional*) Target bitrate in bits/sec. The encoder selects an application-specific default when this is not specified.
- **encoderComplexity** - (*optional*) Value between 0 and 10 which determines latency and processing for encoding. `0` is fastest with lowest complexity. `10` is slowest with highest complexity. The encoder selects a default when this is not specified.
- **encoderFrameSize** - (*optional*) Specifies the frame size in ms used for encoding. Defaults to `20`.
- **encoderSampleRate** - (*optional*) Specifies the sample rate to encode at. Defaults to `48000`. Supported values are `8000`, `12000`, `16000`, `24000` or `48000`.
- **maxFramesPerPage** - (*optional*) Maximum number of frames to collect before generating an Ogg page. This can be used to lower the streaming latency. The lower the value the more overhead the ogg stream will incur. Defaults to `40`.
- **originalSampleRateOverride** - (*optional*) Override the ogg opus 'input sample rate' field. Google Speech API requires this field to be `16000`.
- **resampleQuality** - (*optional*) Value between 0 and 10 which determines latency and processing for resampling. `0` is fastest with lowest quality. `10` is slowest with highest quality. Defaults to `3`.
- **streamPages** - (*optional*) `dataAvailable` event will fire after each encoded page. Defaults to `false`.
#### Config options for WAV recorder
- **wavBitDepth** - (*optional*) Desired bit depth of the WAV file. Defaults to `16`. Supported values are `8`, `16`, `24` and `32` bits per sample.
---------
#### Instance Methods
```js
rec.close()
```
**close** will close the audioContext, destroy the workers, disconnect the audio nodes and close the mic stream. A new Recorder instance will be required for additional recordings. if a `sourceNode` was provided in the initial config, then the implementation will need to close the audioContext and close the mic stream.
```js
rec.pause([flush])
```
**pause** will keep the stream and monitoring alive, but will not be recording the buffers. If `flush` is `true` and `streamPages` is set, any pending encoded frames of data will be flushed, and it will return a promise that only resolves after the frames have been flushed to `ondataavailable`. Will call the `onpause` callback when paused. Subsequent calls to **resume** will add to the current recording.
```js
rec.resume()
```
**resume** will resume the recording if paused. Will call the `onresume` callback when recording is resumed.
```js
rec.setRecordingGain( gain )
```
**setRecordingGain** will set the volume on what will be passed to the recorder. Gain is an a-weighted value between `0` and `1`.
```js
rec.setMonitorGain( gain )
```
**setMonitorGain** will set the volume on what will be passed to the monitor. Monitor level does not affect the recording volume. Gain is an a-weighted value between `0` and `1`.
```js
rec.start()
```
**start** Begins a new recording. Returns a promise which resolves when recording is started. Will callback `onstart` when started. `start` ***needs to be initiated from a user action*** (click or touch) so that the audioContext can be resumed and the stream can have audio data.
```js
rec.stop()
```
**stop** will cease capturing audio and disable the monitoring and mic input stream. Will request the recorded data and then terminate the worker once the final data has been published. Will call the `onstop` callback when stopped.
---------
#### Instance Fields
```js
rec.encodedSamplePosition
```
Reads the currently encoded sample position (the number of samples up to and including the most recent data provided to `ondataavailable`). For Opus, the encoded sample rate is always 48kHz, so a time position can be determined by dividing by 48000.
---------
#### Static Methods
```js
Recorder.isRecordingSupported()
```
Returns a truthy value indicating if the browser supports recording.
#### Static Properties
```js
Recorder.version
```
The version of the library.
---------
#### Callback Handlers
```js
rec.ondataavailable( arrayBuffer )
```
A callback which returns an array buffer of audio data. If `streamPages` is `true`, this will be called with each page of encoded audio. If `streamPages` is `false`, this will be called when the recording is finished with the complete data.
```js
rec.onpause()
```
A callback which occurs when media recording is paused.
```js
rec.onresume()
```
A callback which occurs when media recording resumes after being paused.
```js
rec.onstart()
```
A callback which occurs when media recording starts.
```js
rec.onstop()
```
A callback which occurs when media recording ends.
---------
### Getting started with webpack
- To use in a web-app built with webpack, be sure to load the worker files as a chunk. This can be done with file-loader plugin.
Add to your webpack.config.js before all other loaders.
```js
module.exports = {
module: {
rules: [
{
test: /encoderWorker\.min\.js$/,
use: [{ loader: 'file-loader' }]
}
]
}
};
```
Then get the encoderPath using an import
```js
import Recorder from 'opus-recorder';
import encoderPath from 'opus-recorder/dist/encoderWorker.min.js';
const rec = new Recorder({ encoderPath });
```
---------
### Gotchas
- To be able to read the mic stream, the page must be served over https. Use ngrok for local development with https.
- All browsers require that `rec.start()` to be called from a user initiated event. In iOS and macOS Safari, the mic stream will be empty with no logged errors. In Chrome and Firefox the audioContext could be suspended.
- macOS and iOS Safari native opus playback is not yet supported
- The worker files need to be hosted on the same domain as the page recording as cross-domain workers and worklets are not supported.
---------
### Browser Support
Supported:
- Chrome v58
- Firefox v53
- Microsoft Edge v41
- Opera v44
- macOS Safari v11
- iOS Safari v11
Unsupported:
- IE 11 and below
- iOS 11 Chrome
---------
### Known Issues
- iOS 11.2.2 and iOS 11.2.5 are not working due to a regression in WebAssembly: https://bugs.webkit.org/show_bug.cgi?id=181781
- Firefox does not support sample rates above 48000Hz: https://bugzilla.mozilla.org/show_bug.cgi?id=1124981
- macOS Safari v11 does not support sample rates above 44100Hz
---------
### Building from sources
Prebuilt sources are included in the dist folder. However below are instructions if you want to build them yourself. Opus and speex are compiled without SIMD optimizations. Performace is significantly worse with SIMD optimizations enabled.
Mac: Install autotools using [MacPorts](https://www.macports.org/install.php)
```bash
port install automake autoconf libtool pkgconfig
```
Windows: Install autotools using [MSYS2](http://www.msys2.org/)
```bash
pacman -S make autoconf automake libtool pkgconfig
```
[Install Node.js](https://nodejs.org/en/download/)
[Install EMScripten](https://kripken.github.io/emscripten-site/docs/getting_started/downloads.html)
Install npm dependencies:
```bash
npm install
```
checkout, compile and create the dist from sources:
```bash
npm run make
```
Running the unit tests:
```bash
npm test
```
Clean the dist folder and git submodules:
```bash
make clean
```
================================================
FILE: dist-unminified/decoderWorker.js
================================================
// 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 Module !== 'undefined' ? Module : {};
// --pre-jses are emitted after the Module integration code, so that they can
// refer to Module (if they choose; they can also define Module)
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["DecoderWorker"] = factory();
else
root["DecoderWorker"] = factory();
})(typeof self !== 'undefined' ? self : this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/decoderWorker.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./node_modules/webpack/buildin/global.js":
/*!***********************************!*\
!*** (webpack)/buildin/global.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvd2VicGFjay9idWlsZGluL2dsb2JhbC5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0RlY29kZXJXb3JrZXIvKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzP2NkMDAiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/webpack/buildin/global.js\n");
/***/ }),
/***/ "./src/decoderWorker.js":
/*!******************************!*\
!*** ./src/decoderWorker.js ***!
\******************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("/* WEBPACK VAR INJECTION */(function(global) {\n\nvar decoder;\nvar mainReadyResolve;\nvar mainReady = new Promise(function (resolve) {\n mainReadyResolve = resolve;\n});\n\nglobal['onmessage'] = function (e) {\n mainReady.then(function () {\n switch (e['data']['command']) {\n case 'decode':\n if (decoder) {\n decoder.decode(e['data']['pages']);\n }\n\n break;\n\n case 'done':\n if (decoder) {\n decoder.sendLastBuffer();\n global['close']();\n }\n\n break;\n\n case 'init':\n decoder = new OggOpusDecoder(e['data'], Module);\n break;\n\n default: // Ignore any unknown commands and continue recieving commands\n\n }\n });\n};\n\nvar OggOpusDecoder = function OggOpusDecoder(config, Module) {\n if (!Module) {\n throw new Error('Module with exports required to initialize a decoder instance');\n }\n\n this.mainReady = mainReady; // Expose for unit testing\n\n this.config = Object.assign({\n bufferLength: 4096,\n // Define size of outgoing buffer\n decoderSampleRate: 48000,\n // Desired decoder sample rate.\n outputBufferSampleRate: 48000,\n // Desired output sample rate. Audio will be resampled\n resampleQuality: 3 // Value between 0 and 10 inclusive. 10 being highest quality.\n\n }, config);\n this._opus_decoder_create = Module._opus_decoder_create;\n this._opus_decoder_destroy = Module._opus_decoder_destroy;\n this._speex_resampler_process_interleaved_float = Module._speex_resampler_process_interleaved_float;\n this._speex_resampler_init = Module._speex_resampler_init;\n this._speex_resampler_destroy = Module._speex_resampler_destroy;\n this._opus_decode_float = Module._opus_decode_float;\n this._free = Module._free;\n this._malloc = Module._malloc;\n this.HEAPU8 = Module.HEAPU8;\n this.HEAP32 = Module.HEAP32;\n this.HEAPF32 = Module.HEAPF32;\n this.outputBuffers = [];\n};\n\nOggOpusDecoder.prototype.decode = function (typedArray) {\n var dataView = new DataView(typedArray.buffer);\n this.getPageBoundaries(dataView).map(function (pageStart) {\n var headerType = dataView.getUint8(pageStart + 5, true);\n var pageIndex = dataView.getUint32(pageStart + 18, true); // Beginning of stream\n\n if (headerType & 2) {\n this.numberOfChannels = dataView.getUint8(pageStart + 37, true);\n this.init();\n } // Decode page\n\n\n if (pageIndex > 1) {\n var segmentTableLength = dataView.getUint8(pageStart + 26, true);\n var segmentTableIndex = pageStart + 27 + segmentTableLength;\n\n for (var i = 0; i < segmentTableLength; i++) {\n var packetLength = dataView.getUint8(pageStart + 27 + i, true);\n this.decoderBuffer.set(typedArray.subarray(segmentTableIndex, segmentTableIndex += packetLength), this.decoderBufferIndex);\n this.decoderBufferIndex += packetLength;\n\n if (packetLength < 255) {\n var outputSampleLength = this._opus_decode_float(this.decoder, this.decoderBufferPointer, this.decoderBufferIndex, this.decoderOutputPointer, this.decoderOutputMaxLength, 0);\n\n var resampledLength = Math.ceil(outputSampleLength * this.config.outputBufferSampleRate / this.config.decoderSampleRate);\n this.HEAP32[this.decoderOutputLengthPointer >> 2] = outputSampleLength;\n this.HEAP32[this.resampleOutputLengthPointer >> 2] = resampledLength;\n\n this._speex_resampler_process_interleaved_float(this.resampler, this.decoderOutputPointer, this.decoderOutputLengthPointer, this.resampleOutputBufferPointer, this.resampleOutputLengthPointer);\n\n this.sendToOutputBuffers(this.HEAPF32.subarray(this.resampleOutputBufferPointer >> 2, (this.resampleOutputBufferPointer >> 2) + resampledLength * this.numberOfChannels));\n this.decoderBufferIndex = 0;\n }\n } // End of stream\n\n\n if (headerType & 4) {\n this.sendLastBuffer();\n }\n }\n }, this);\n};\n\nOggOpusDecoder.prototype.getPageBoundaries = function (dataView) {\n var pageBoundaries = [];\n\n for (var i = 0; i < dataView.byteLength - 4; i++) {\n if (dataView.getUint32(i, true) == 1399285583) {\n pageBoundaries.push(i);\n }\n }\n\n return pageBoundaries;\n};\n\nOggOpusDecoder.prototype.init = function () {\n this.resetOutputBuffers();\n this.initCodec();\n this.initResampler();\n};\n\nOggOpusDecoder.prototype.initCodec = function () {\n if (this.decoder) {\n this._opus_decoder_destroy(this.decoder);\n\n this._free(this.decoderBufferPointer);\n\n this._free(this.decoderOutputLengthPointer);\n\n this._free(this.decoderOutputPointer);\n }\n\n var errReference = this._malloc(4);\n\n this.decoder = this._opus_decoder_create(this.config.decoderSampleRate, this.numberOfChannels, errReference);\n\n this._free(errReference);\n\n this.decoderBufferMaxLength = 4000;\n this.decoderBufferPointer = this._malloc(this.decoderBufferMaxLength);\n this.decoderBuffer = this.HEAPU8.subarray(this.decoderBufferPointer, this.decoderBufferPointer + this.decoderBufferMaxLength);\n this.decoderBufferIndex = 0;\n this.decoderOutputLengthPointer = this._malloc(4);\n this.decoderOutputMaxLength = this.config.decoderSampleRate * this.numberOfChannels * 120 / 1000; // Max 120ms frame size\n\n this.decoderOutputPointer = this._malloc(this.decoderOutputMaxLength * 4); // 4 bytes per sample\n};\n\nOggOpusDecoder.prototype.initResampler = function () {\n if (this.resampler) {\n this._speex_resampler_destroy(this.resampler);\n\n this._free(this.resampleOutputLengthPointer);\n\n this._free(this.resampleOutputBufferPointer);\n }\n\n var errLocation = this._malloc(4);\n\n this.resampler = this._speex_resampler_init(this.numberOfChannels, this.config.decoderSampleRate, this.config.outputBufferSampleRate, this.config.resampleQuality, errLocation);\n\n this._free(errLocation);\n\n this.resampleOutputLengthPointer = this._malloc(4);\n this.resampleOutputMaxLength = Math.ceil(this.decoderOutputMaxLength * this.config.outputBufferSampleRate / this.config.decoderSampleRate);\n this.resampleOutputBufferPointer = this._malloc(this.resampleOutputMaxLength * 4); // 4 bytes per sample\n};\n\nOggOpusDecoder.prototype.resetOutputBuffers = function () {\n this.outputBuffers = [];\n this.outputBufferArrayBuffers = [];\n this.outputBufferIndex = 0;\n\n for (var i = 0; i < this.numberOfChannels; i++) {\n this.outputBuffers.push(new Float32Array(this.config.bufferLength));\n this.outputBufferArrayBuffers.push(this.outputBuffers[i].buffer);\n }\n};\n\nOggOpusDecoder.prototype.sendLastBuffer = function () {\n this.sendToOutputBuffers(new Float32Array((this.config.bufferLength - this.outputBufferIndex) * this.numberOfChannels));\n global['postMessage'](null);\n};\n\nOggOpusDecoder.prototype.sendToOutputBuffers = function (mergedBuffers) {\n var dataIndex = 0;\n var mergedBufferLength = mergedBuffers.length / this.numberOfChannels;\n\n while (dataIndex < mergedBufferLength) {\n var amountToCopy = Math.min(mergedBufferLength - dataIndex, this.config.bufferLength - this.outputBufferIndex);\n\n if (this.numberOfChannels === 1) {\n this.outputBuffers[0].set(mergedBuffers.subarray(dataIndex, dataIndex + amountToCopy), this.outputBufferIndex);\n } // Deinterleave\n else {\n for (var i = 0; i < amountToCopy; i++) {\n this.outputBuffers.forEach(function (buffer, channelIndex) {\n buffer[this.outputBufferIndex + i] = mergedBuffers[(dataIndex + i) * this.numberOfChannels + channelIndex];\n }, this);\n }\n }\n\n dataIndex += amountToCopy;\n this.outputBufferIndex += amountToCopy;\n\n if (this.outputBufferIndex == this.config.bufferLength) {\n global['postMessage'](this.outputBuffers, this.outputBufferArrayBuffers);\n this.resetOutputBuffers();\n }\n }\n};\n\nif (!Module) {\n Module = {};\n}\n\nModule['mainReady'] = mainReady;\nModule['OggOpusDecoder'] = OggOpusDecoder;\nModule['onRuntimeInitialized'] = mainReadyResolve;\nmodule.exports = Module;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvZGVjb2Rlcldvcmtlci5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL0RlY29kZXJXb3JrZXIvLi9zcmMvZGVjb2Rlcldvcmtlci5qcz8wYzQ1Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgZGVjb2RlcjtcbnZhciBtYWluUmVhZHlSZXNvbHZlO1xudmFyIG1haW5SZWFkeSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpeyBtYWluUmVhZHlSZXNvbHZlID0gcmVzb2x2ZTsgfSk7XG5cbmdsb2JhbFsnb25tZXNzYWdlJ10gPSBmdW5jdGlvbiggZSApe1xuICBtYWluUmVhZHkudGhlbihmdW5jdGlvbigpe1xuICAgIHN3aXRjaCggZVsnZGF0YSddWydjb21tYW5kJ10gKXtcblxuICAgICAgY2FzZSAnZGVjb2RlJzpcbiAgICAgICAgaWYgKGRlY29kZXIpe1xuICAgICAgICAgIGRlY29kZXIuZGVjb2RlKCBlWydkYXRhJ11bJ3BhZ2VzJ10gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZG9uZSc6XG4gICAgICAgIGlmIChkZWNvZGVyKSB7XG4gICAgICAgICAgZGVjb2Rlci5zZW5kTGFzdEJ1ZmZlcigpO1xuICAgICAgICAgIGdsb2JhbFsnY2xvc2UnXSgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdpbml0JzpcbiAgICAgICAgZGVjb2RlciA9IG5ldyBPZ2dPcHVzRGVjb2RlciggZVsnZGF0YSddLCBNb2R1bGUgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIElnbm9yZSBhbnkgdW5rbm93biBjb21tYW5kcyBhbmQgY29udGludWUgcmVjaWV2aW5nIGNvbW1hbmRzXG4gICAgfVxuICB9KTtcbn07XG5cbnZhciBPZ2dPcHVzRGVjb2RlciA9IGZ1bmN0aW9uKCBjb25maWcsIE1vZHVsZSApe1xuXG4gIGlmICggIU1vZHVsZSApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01vZHVsZSB3aXRoIGV4cG9ydHMgcmVxdWlyZWQgdG8gaW5pdGlhbGl6ZSBhIGRlY29kZXIgaW5zdGFuY2UnKTtcbiAgfVxuXG4gIHRoaXMubWFpblJlYWR5ID0gbWFpblJlYWR5OyAvLyBFeHBvc2UgZm9yIHVuaXQgdGVzdGluZ1xuICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oeyBcbiAgICBidWZmZXJMZW5ndGg6IDQwOTYsIC8vIERlZmluZSBzaXplIG9mIG91dGdvaW5nIGJ1ZmZlclxuICAgIGRlY29kZXJTYW1wbGVSYXRlOiA0ODAwMCwgLy8gRGVzaXJlZCBkZWNvZGVyIHNhbXBsZSByYXRlLlxuICAgIG91dHB1dEJ1ZmZlclNhbXBsZVJhdGU6IDQ4MDAwLCAvLyBEZXNpcmVkIG91dHB1dCBzYW1wbGUgcmF0ZS4gQXVkaW8gd2lsbCBiZSByZXNhbXBsZWRcbiAgICByZXNhbXBsZVF1YWxpdHk6IDMsIC8vIFZhbHVlIGJldHdlZW4gMCBhbmQgMTAgaW5jbHVzaXZlLiAxMCBiZWluZyBoaWdoZXN0IHF1YWxpdHkuXG4gIH0sIGNvbmZpZyApO1xuXG4gIHRoaXMuX29wdXNfZGVjb2Rlcl9jcmVhdGUgPSBNb2R1bGUuX29wdXNfZGVjb2Rlcl9jcmVhdGU7XG4gIHRoaXMuX29wdXNfZGVjb2Rlcl9kZXN0cm95ID0gTW9kdWxlLl9vcHVzX2RlY29kZXJfZGVzdHJveTtcbiAgdGhpcy5fc3BlZXhfcmVzYW1wbGVyX3Byb2Nlc3NfaW50ZXJsZWF2ZWRfZmxvYXQgPSBNb2R1bGUuX3NwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludGVybGVhdmVkX2Zsb2F0O1xuICB0aGlzLl9zcGVleF9yZXNhbXBsZXJfaW5pdCA9IE1vZHVsZS5fc3BlZXhfcmVzYW1wbGVyX2luaXQ7XG4gIHRoaXMuX3NwZWV4X3Jlc2FtcGxlcl9kZXN0cm95ID0gTW9kdWxlLl9zcGVleF9yZXNhbXBsZXJfZGVzdHJveTtcbiAgdGhpcy5fb3B1c19kZWNvZGVfZmxvYXQgPSBNb2R1bGUuX29wdXNfZGVjb2RlX2Zsb2F0O1xuICB0aGlzLl9mcmVlID0gTW9kdWxlLl9mcmVlO1xuICB0aGlzLl9tYWxsb2MgPSBNb2R1bGUuX21hbGxvYztcbiAgdGhpcy5IRUFQVTggPSBNb2R1bGUuSEVBUFU4O1xuICB0aGlzLkhFQVAzMiA9IE1vZHVsZS5IRUFQMzI7XG4gIHRoaXMuSEVBUEYzMiA9IE1vZHVsZS5IRUFQRjMyO1xuXG4gIHRoaXMub3V0cHV0QnVmZmVycyA9IFtdO1xufTtcblxuXG5PZ2dPcHVzRGVjb2Rlci5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24oIHR5cGVkQXJyYXkgKSB7XG4gIHZhciBkYXRhVmlldyA9IG5ldyBEYXRhVmlldyggdHlwZWRBcnJheS5idWZmZXIgKTtcbiAgdGhpcy5nZXRQYWdlQm91bmRhcmllcyggZGF0YVZpZXcgKS5tYXAoIGZ1bmN0aW9uKCBwYWdlU3RhcnQgKSB7XG4gICAgdmFyIGhlYWRlclR5cGUgPSBkYXRhVmlldy5nZXRVaW50OCggcGFnZVN0YXJ0ICsgNSwgdHJ1ZSApO1xuICAgIHZhciBwYWdlSW5kZXggPSBkYXRhVmlldy5nZXRVaW50MzIoIHBhZ2VTdGFydCArIDE4LCB0cnVlICk7XG5cbiAgICAvLyBCZWdpbm5pbmcgb2Ygc3RyZWFtXG4gICAgaWYgKCBoZWFkZXJUeXBlICYgMiApIHtcbiAgICAgIHRoaXMubnVtYmVyT2ZDaGFubmVscyA9IGRhdGFWaWV3LmdldFVpbnQ4KCBwYWdlU3RhcnQgKyAzNywgdHJ1ZSApO1xuICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuXG4gICAgLy8gRGVjb2RlIHBhZ2VcbiAgICBpZiAoIHBhZ2VJbmRleCA+IDEgKSB7XG4gICAgICB2YXIgc2VnbWVudFRhYmxlTGVuZ3RoID0gZGF0YVZpZXcuZ2V0VWludDgoIHBhZ2VTdGFydCArIDI2LCB0cnVlICk7XG4gICAgICB2YXIgc2VnbWVudFRhYmxlSW5kZXggPSBwYWdlU3RhcnQgKyAyNyArIHNlZ21lbnRUYWJsZUxlbmd0aDtcblxuICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgc2VnbWVudFRhYmxlTGVuZ3RoOyBpKysgKSB7XG4gICAgICAgIHZhciBwYWNrZXRMZW5ndGggPSBkYXRhVmlldy5nZXRVaW50OCggcGFnZVN0YXJ0ICsgMjcgKyBpLCB0cnVlICk7XG4gICAgICAgIHRoaXMuZGVjb2RlckJ1ZmZlci5zZXQoIHR5cGVkQXJyYXkuc3ViYXJyYXkoIHNlZ21lbnRUYWJsZUluZGV4LCBzZWdtZW50VGFibGVJbmRleCArPSBwYWNrZXRMZW5ndGggKSwgdGhpcy5kZWNvZGVyQnVmZmVySW5kZXggKTtcbiAgICAgICAgdGhpcy5kZWNvZGVyQnVmZmVySW5kZXggKz0gcGFja2V0TGVuZ3RoO1xuXG4gICAgICAgIGlmICggcGFja2V0TGVuZ3RoIDwgMjU1ICkge1xuICAgICAgICAgIHZhciBvdXRwdXRTYW1wbGVMZW5ndGggPSB0aGlzLl9vcHVzX2RlY29kZV9mbG9hdCggdGhpcy5kZWNvZGVyLCB0aGlzLmRlY29kZXJCdWZmZXJQb2ludGVyLCB0aGlzLmRlY29kZXJCdWZmZXJJbmRleCwgdGhpcy5kZWNvZGVyT3V0cHV0UG9pbnRlciwgdGhpcy5kZWNvZGVyT3V0cHV0TWF4TGVuZ3RoLCAwKTtcbiAgICAgICAgICB2YXIgcmVzYW1wbGVkTGVuZ3RoID0gTWF0aC5jZWlsKCBvdXRwdXRTYW1wbGVMZW5ndGggKiB0aGlzLmNvbmZpZy5vdXRwdXRCdWZmZXJTYW1wbGVSYXRlIC8gdGhpcy5jb25maWcuZGVjb2RlclNhbXBsZVJhdGUgKTtcbiAgICAgICAgICB0aGlzLkhFQVAzMlsgdGhpcy5kZWNvZGVyT3V0cHV0TGVuZ3RoUG9pbnRlciA+PiAyIF0gPSBvdXRwdXRTYW1wbGVMZW5ndGg7XG4gICAgICAgICAgdGhpcy5IRUFQMzJbIHRoaXMucmVzYW1wbGVPdXRwdXRMZW5ndGhQb2ludGVyID4+IDIgXSA9IHJlc2FtcGxlZExlbmd0aDtcbiAgICAgICAgICB0aGlzLl9zcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnRlcmxlYXZlZF9mbG9hdCggdGhpcy5yZXNhbXBsZXIsIHRoaXMuZGVjb2Rlck91dHB1dFBvaW50ZXIsIHRoaXMuZGVjb2Rlck91dHB1dExlbmd0aFBvaW50ZXIsIHRoaXMucmVzYW1wbGVPdXRwdXRCdWZmZXJQb2ludGVyLCB0aGlzLnJlc2FtcGxlT3V0cHV0TGVuZ3RoUG9pbnRlciApO1xuICAgICAgICAgIHRoaXMuc2VuZFRvT3V0cHV0QnVmZmVycyggdGhpcy5IRUFQRjMyLnN1YmFycmF5KCB0aGlzLnJlc2FtcGxlT3V0cHV0QnVmZmVyUG9pbnRlciA+PiAyLCAodGhpcy5yZXNhbXBsZU91dHB1dEJ1ZmZlclBvaW50ZXIgPj4gMikgKyByZXNhbXBsZWRMZW5ndGggKiB0aGlzLm51bWJlck9mQ2hhbm5lbHMgKSApO1xuICAgICAgICAgIHRoaXMuZGVjb2RlckJ1ZmZlckluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFbmQgb2Ygc3RyZWFtXG4gICAgICBpZiAoIGhlYWRlclR5cGUgJiA0ICkge1xuICAgICAgICB0aGlzLnNlbmRMYXN0QnVmZmVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB0aGlzICk7XG59O1xuXG5PZ2dPcHVzRGVjb2Rlci5wcm90b3R5cGUuZ2V0UGFnZUJvdW5kYXJpZXMgPSBmdW5jdGlvbiggZGF0YVZpZXcgKXtcbiAgdmFyIHBhZ2VCb3VuZGFyaWVzID0gW107XG5cbiAgZm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YVZpZXcuYnl0ZUxlbmd0aCAtIDQ7IGkrKyApIHtcbiAgICBpZiAoIGRhdGFWaWV3LmdldFVpbnQzMiggaSwgdHJ1ZSApID09IDEzOTkyODU1ODMgKSB7XG4gICAgICBwYWdlQm91bmRhcmllcy5wdXNoKCBpICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhZ2VCb3VuZGFyaWVzO1xufTtcblxuT2dnT3B1c0RlY29kZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbigpe1xuICB0aGlzLnJlc2V0T3V0cHV0QnVmZmVycygpO1xuICB0aGlzLmluaXRDb2RlYygpO1xuICB0aGlzLmluaXRSZXNhbXBsZXIoKTtcbn07XG5cbk9nZ09wdXNEZWNvZGVyLnByb3RvdHlwZS5pbml0Q29kZWMgPSBmdW5jdGlvbigpIHtcblxuICBpZiAoIHRoaXMuZGVjb2RlciApIHtcbiAgICB0aGlzLl9vcHVzX2RlY29kZXJfZGVzdHJveSggdGhpcy5kZWNvZGVyICk7XG4gICAgdGhpcy5fZnJlZSggdGhpcy5kZWNvZGVyQnVmZmVyUG9pbnRlciApO1xuICAgIHRoaXMuX2ZyZWUoIHRoaXMuZGVjb2Rlck91dHB1dExlbmd0aFBvaW50ZXIgKTtcbiAgICB0aGlzLl9mcmVlKCB0aGlzLmRlY29kZXJPdXRwdXRQb2ludGVyICk7XG4gIH1cblxuICB2YXIgZXJyUmVmZXJlbmNlID0gdGhpcy5fbWFsbG9jKCA0ICk7XG4gIHRoaXMuZGVjb2RlciA9IHRoaXMuX29wdXNfZGVjb2Rlcl9jcmVhdGUoIHRoaXMuY29uZmlnLmRlY29kZXJTYW1wbGVSYXRlLCB0aGlzLm51bWJlck9mQ2hhbm5lbHMsIGVyclJlZmVyZW5jZSApO1xuICB0aGlzLl9mcmVlKCBlcnJSZWZlcmVuY2UgKTtcblxuICB0aGlzLmRlY29kZXJCdWZmZXJNYXhMZW5ndGggPSA0MDAwO1xuICB0aGlzLmRlY29kZXJCdWZmZXJQb2ludGVyID0gdGhpcy5fbWFsbG9jKCB0aGlzLmRlY29kZXJCdWZmZXJNYXhMZW5ndGggKTtcbiAgdGhpcy5kZWNvZGVyQnVmZmVyID0gdGhpcy5IRUFQVTguc3ViYXJyYXkoIHRoaXMuZGVjb2RlckJ1ZmZlclBvaW50ZXIsIHRoaXMuZGVjb2RlckJ1ZmZlclBvaW50ZXIgKyB0aGlzLmRlY29kZXJCdWZmZXJNYXhMZW5ndGggKTtcbiAgdGhpcy5kZWNvZGVyQnVmZmVySW5kZXggPSAwO1xuXG4gIHRoaXMuZGVjb2Rlck91dHB1dExlbmd0aFBvaW50ZXIgPSB0aGlzLl9tYWxsb2MoIDQgKTtcbiAgdGhpcy5kZWNvZGVyT3V0cHV0TWF4TGVuZ3RoID0gdGhpcy5jb25maWcuZGVjb2RlclNhbXBsZVJhdGUgKiB0aGlzLm51bWJlck9mQ2hhbm5lbHMgKiAxMjAgLyAxMDAwOyAvLyBNYXggMTIwbXMgZnJhbWUgc2l6ZVxuICB0aGlzLmRlY29kZXJPdXRwdXRQb2ludGVyID0gdGhpcy5fbWFsbG9jKCB0aGlzLmRlY29kZXJPdXRwdXRNYXhMZW5ndGggKiA0ICk7IC8vIDQgYnl0ZXMgcGVyIHNhbXBsZVxufTtcblxuT2dnT3B1c0RlY29kZXIucHJvdG90eXBlLmluaXRSZXNhbXBsZXIgPSBmdW5jdGlvbigpIHtcblxuICBpZiAoIHRoaXMucmVzYW1wbGVyICkge1xuICAgIHRoaXMuX3NwZWV4X3Jlc2FtcGxlcl9kZXN0cm95KCB0aGlzLnJlc2FtcGxlciApO1xuICAgIHRoaXMuX2ZyZWUoIHRoaXMucmVzYW1wbGVPdXRwdXRMZW5ndGhQb2ludGVyICk7XG4gICAgdGhpcy5fZnJlZSggdGhpcy5yZXNhbXBsZU91dHB1dEJ1ZmZlclBvaW50ZXIgKTtcbiAgfVxuXG4gIHZhciBlcnJMb2NhdGlvbiA9IHRoaXMuX21hbGxvYyggNCApO1xuICB0aGlzLnJlc2FtcGxlciA9IHRoaXMuX3NwZWV4X3Jlc2FtcGxlcl9pbml0KCB0aGlzLm51bWJlck9mQ2hhbm5lbHMsIHRoaXMuY29uZmlnLmRlY29kZXJTYW1wbGVSYXRlLCB0aGlzLmNvbmZpZy5vdXRwdXRCdWZmZXJTYW1wbGVSYXRlLCB0aGlzLmNvbmZpZy5yZXNhbXBsZVF1YWxpdHksIGVyckxvY2F0aW9uICk7XG4gIHRoaXMuX2ZyZWUoIGVyckxvY2F0aW9uICk7XG5cbiAgdGhpcy5yZXNhbXBsZU91dHB1dExlbmd0aFBvaW50ZXIgPSB0aGlzLl9tYWxsb2MoIDQgKTtcbiAgdGhpcy5yZXNhbXBsZU91dHB1dE1heExlbmd0aCA9IE1hdGguY2VpbCggdGhpcy5kZWNvZGVyT3V0cHV0TWF4TGVuZ3RoICogdGhpcy5jb25maWcub3V0cHV0QnVmZmVyU2FtcGxlUmF0ZSAvIHRoaXMuY29uZmlnLmRlY29kZXJTYW1wbGVSYXRlICk7XG4gIHRoaXMucmVzYW1wbGVPdXRwdXRCdWZmZXJQb2ludGVyID0gdGhpcy5fbWFsbG9jKCB0aGlzLnJlc2FtcGxlT3V0cHV0TWF4TGVuZ3RoICogNCApOyAvLyA0IGJ5dGVzIHBlciBzYW1wbGVcbn07XG5cbk9nZ09wdXNEZWNvZGVyLnByb3RvdHlwZS5yZXNldE91dHB1dEJ1ZmZlcnMgPSBmdW5jdGlvbigpe1xuICB0aGlzLm91dHB1dEJ1ZmZlcnMgPSBbXTtcbiAgdGhpcy5vdXRwdXRCdWZmZXJBcnJheUJ1ZmZlcnMgPSBbXTtcbiAgdGhpcy5vdXRwdXRCdWZmZXJJbmRleCA9IDA7XG5cbiAgZm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5udW1iZXJPZkNoYW5uZWxzOyBpKysgKSB7XG4gICAgdGhpcy5vdXRwdXRCdWZmZXJzLnB1c2goIG5ldyBGbG9hdDMyQXJyYXkoIHRoaXMuY29uZmlnLmJ1ZmZlckxlbmd0aCApICk7XG4gICAgdGhpcy5vdXRwdXRCdWZmZXJBcnJheUJ1ZmZlcnMucHVzaCggdGhpcy5vdXRwdXRCdWZmZXJzW2ldLmJ1ZmZlciApO1xuICB9XG59O1xuXG5PZ2dPcHVzRGVjb2Rlci5wcm90b3R5cGUuc2VuZExhc3RCdWZmZXIgPSBmdW5jdGlvbigpe1xuICB0aGlzLnNlbmRUb091dHB1dEJ1ZmZlcnMoIG5ldyBGbG9hdDMyQXJyYXkoICggdGhpcy5jb25maWcuYnVmZmVyTGVuZ3RoIC0gdGhpcy5vdXRwdXRCdWZmZXJJbmRleCApICogdGhpcy5udW1iZXJPZkNoYW5uZWxzICkgKTtcbiAgZ2xvYmFsWydwb3N0TWVzc2FnZSddKG51bGwpO1xufTtcblxuT2dnT3B1c0RlY29kZXIucHJvdG90eXBlLnNlbmRUb091dHB1dEJ1ZmZlcnMgPSBmdW5jdGlvbiggbWVyZ2VkQnVmZmVycyApe1xuICB2YXIgZGF0YUluZGV4ID0gMDtcbiAgdmFyIG1lcmdlZEJ1ZmZlckxlbmd0aCA9IG1lcmdlZEJ1ZmZlcnMubGVuZ3RoIC8gdGhpcy5udW1iZXJPZkNoYW5uZWxzO1xuXG4gIHdoaWxlICggZGF0YUluZGV4IDwgbWVyZ2VkQnVmZmVyTGVuZ3RoICkge1xuICAgIHZhciBhbW91bnRUb0NvcHkgPSBNYXRoLm1pbiggbWVyZ2VkQnVmZmVyTGVuZ3RoIC0gZGF0YUluZGV4LCB0aGlzLmNvbmZpZy5idWZmZXJMZW5ndGggLSB0aGlzLm91dHB1dEJ1ZmZlckluZGV4ICk7XG5cbiAgICBpZiAodGhpcy5udW1iZXJPZkNoYW5uZWxzID09PSAxKSB7XG4gICAgICB0aGlzLm91dHB1dEJ1ZmZlcnNbMF0uc2V0KCBtZXJnZWRCdWZmZXJzLnN1YmFycmF5KCBkYXRhSW5kZXgsIGRhdGFJbmRleCArIGFtb3VudFRvQ29weSApLCB0aGlzLm91dHB1dEJ1ZmZlckluZGV4ICk7XG4gICAgfVxuXG4gICAgLy8gRGVpbnRlcmxlYXZlXG4gICAgZWxzZSB7XG4gICAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBhbW91bnRUb0NvcHk7IGkrKyApIHtcbiAgICAgICAgdGhpcy5vdXRwdXRCdWZmZXJzLmZvckVhY2goIGZ1bmN0aW9uKCBidWZmZXIsIGNoYW5uZWxJbmRleCApIHtcbiAgICAgICAgICBidWZmZXJbIHRoaXMub3V0cHV0QnVmZmVySW5kZXggKyBpIF0gPSBtZXJnZWRCdWZmZXJzWyAoIGRhdGFJbmRleCArIGkgKSAqIHRoaXMubnVtYmVyT2ZDaGFubmVscyArIGNoYW5uZWxJbmRleCBdO1xuICAgICAgICB9LCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkYXRhSW5kZXggKz0gYW1vdW50VG9Db3B5O1xuICAgIHRoaXMub3V0cHV0QnVmZmVySW5kZXggKz0gYW1vdW50VG9Db3B5O1xuXG4gICAgaWYgKCB0aGlzLm91dHB1dEJ1ZmZlckluZGV4ID09IHRoaXMuY29uZmlnLmJ1ZmZlckxlbmd0aCApIHtcbiAgICAgIGdsb2JhbFsncG9zdE1lc3NhZ2UnXSggdGhpcy5vdXRwdXRCdWZmZXJzLCB0aGlzLm91dHB1dEJ1ZmZlckFycmF5QnVmZmVycyApO1xuICAgICAgdGhpcy5yZXNldE91dHB1dEJ1ZmZlcnMoKTtcbiAgICB9XG4gIH1cbn07XG5cblxuaWYgKCFNb2R1bGUpIHtcbiAgTW9kdWxlID0ge307XG59XG5cbk1vZHVsZVsnbWFpblJlYWR5J10gPSBtYWluUmVhZHk7XG5Nb2R1bGVbJ09nZ09wdXNEZWNvZGVyJ10gPSBPZ2dPcHVzRGVjb2Rlcjtcbk1vZHVsZVsnb25SdW50aW1lSW5pdGlhbGl6ZWQnXSA9IG1haW5SZWFkeVJlc29sdmU7XG5cbm1vZHVsZS5leHBvcnRzID0gTW9kdWxlO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBcEJBO0FBc0JBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/decoderWorker.js\n");
/***/ })
/******/ });
});
// 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 = {};
var key;
for (key in Module) {
if (Module.hasOwnProperty(key)) {
moduleOverrides[key] = Module[key];
}
}
var arguments_ = [];
var thisProgram = './this.program';
var quit_ = function(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;
// `/` 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;
var toLog = e;
err('exiting due to exception: ' + toLog);
}
var nodeFS;
var nodePath;
if (ENVIRONMENT_IS_NODE) {
if (ENVIRONMENT_IS_WORKER) {
scriptDirectory = require('path').dirname(scriptDirectory) + '/';
} else {
scriptDirectory = __dirname + '/';
}
// include: node_shell_read.js
read_ = function shell_read(filename, binary) {
if (!nodeFS) nodeFS = require('fs');
if (!nodePath) nodePath = require('path');
filename = nodePath['normalize'](filename);
return nodeFS['readFileSync'](filename, binary ? null : 'utf8');
};
readBinary = function readBinary(filename) {
var ret = read_(filename, true);
if (!ret.buffer) {
ret = new Uint8Array(ret);
}
assert(ret.buffer);
return ret;
};
readAsync = function readAsync(filename, onload, onerror) {
if (!nodeFS) nodeFS = require('fs');
if (!nodePath) nodePath = require('path');
filename = nodePath['normalize'](filename);
nodeFS['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);
if (typeof module !== 'undefined') {
module['exports'] = Module;
}
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_ = function(status, toThrow) {
if (keepRuntimeAlive()) {
process['exitCode'] = status;
throw toThrow;
}
logExceptionOnExit(toThrow);
process['exit'](status);
};
Module['inspect'] = function () { return '[Emscripten Module object]'; };
} 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;
}
// 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 = '';
}
// Differentiate the Web Worker from the Node Worker case, as reading must
// be done differently.
{
// include: web_or_worker_shell_read.js
read_ = function(url) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.send(null);
return xhr.responseText;
};
if (ENVIRONMENT_IS_WORKER) {
readBinary = function(url) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.responseType = 'arraybuffer';
xhr.send(null);
return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response));
};
}
readAsync = function(url, onload, onerror) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'arraybuffer';
xhr.onload = function() {
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 = function(title) { document.title = title };
} else
{
}
// Set up the out() and err() hooks, which are how we can print to stdout or
// stderr, respectively.
var out = Module['print'] || console.log.bind(console);
var err = Module['printErr'] || console.warn.bind(console);
// Merge back in the overrides
for (key in moduleOverrides) {
if (moduleOverrides.hasOwnProperty(key)) {
Module[key] = moduleOverrides[key];
}
}
// 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;
// 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'];
if (Module['thisProgram']) thisProgram = Module['thisProgram'];
if (Module['quit']) quit_ = Module['quit'];
// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message
var STACK_ALIGN = 16;
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 4; // A pointer
} else if (type[0] === 'i') {
var 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;
}
// Add a wasm function to the table.
function addFunctionWasm(func, sig) {
// 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();
for (var i = 0; i < wasmTable.length; i++) {
var item = wasmTable.get(i);
// Ignore null values.
if (item) {
functionsInTableMap.set(item, i);
}
}
}
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
wasmTable.set(ret, func);
} catch (err) {
if (!(err instanceof TypeError)) {
throw err;
}
var wrapped = convertJsFunctionToWasm(func, sig);
wasmTable.set(ret, wrapped);
}
functionsInTableMap.set(func, ret);
return ret;
}
function removeFunction(index) {
functionsInTableMap.delete(wasmTable.get(index));
freeTableIndexes.push(index);
}
// 'sig' parameter is required for the llvm backend but only when func is not
// already a WebAssembly function.
function addFunction(func, sig) {
return addFunctionWasm(func, sig);
}
// end include: runtime_functions.js
// include: runtime_debug.js
// end include: runtime_debug.js
var tempRet0 = 0;
var setTempRet0 = function(value) {
tempRet0 = value;
};
var getTempRet0 = function() {
return 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'];
var noExitRuntime = Module['noExitRuntime'] || true;
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, noSafe) {
type = type || 'i8';
if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
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, noSafe) {
type = type || 'i8';
if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
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 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);
}
}
// 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;
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) {
argTypes = argTypes || [];
// When the function takes numbers and returns a number, we can just return
// the original function
var numericArgs = argTypes.every(function(type){ return type === 'number'});
var numericRet = returnType !== 'string';
if (numericRet && numericArgs && !opts) {
return getCFunc(ident);
}
return function() {
return ccall(ident, returnType, argTypes, arguments, opts);
}
}
var ALLOC_NORMAL = 0; // Tries to use _malloc()
var ALLOC_STACK = 1; // Lives for the duration of the current function call
// allocate(): This is for internal use. You can use it yourself as well, but the interface
// is a little tricky (see docs right below). The reason is that it is optimized
// for multiple syntaxes to save space in generated code. So you should
// normally not use allocate(), and instead allocate memory using _malloc(),
// initialize it with setValue(), and so forth.
// @slab: An array of data.
// @allocator: How to allocate memory, see ALLOC_*
/** @type {function((Uint8Array|Array<number>), number)} */
function allocate(slab, allocator) {
var ret;
if (allocator == ALLOC_STACK) {
ret = stackAlloc(slab.length);
} else {
ret = _malloc(slab.length);
}
if (slab.subarray || slab.slice) {
HEAPU8.set(/** @type {!Uint8Array} */(slab), ret);
} else {
HEAPU8.set(new Uint8Array(slab), ret);
}
return ret;
}
// 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 {
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;
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) {
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) {
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) {
// 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) {
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) {
// 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) {
HEAP8.set(array, buffer);
}
/** @param {boolean=} dontAddNull */
function writeAsciiToMemory(str, buffer, dontAddNull) {
for (var i = 0; i < str.length; ++i) {
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
function alignUp(x, multiple) {
if (x % multiple > 0) {
x += multiple - (x % multiple);
}
return x;
}
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;
var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;
// 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
// end include: runtime_stack_check.js
// include: runtime_assertions.js
// 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() {
runtimeInitialized = true;
callRuntimeCallbacks(__ATINIT__);
}
function exitRuntime() {
runtimeExited = true;
}
function postRun() {
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
// 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
function getUniqueRunDependency(id) {
return id;
}
function addRunDependency(id) {
runDependencies++;
if (Module['monitorRunDependencies']) {
Module['monitorRunDependencies'](runDependencies);
}
}
function removeRunDependency(id) {
runDependencies--;
if (Module['monitorRunDependencies']) {
Module['monitorRunDependencies'](runDependencies);
}
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;
what += '. Build with -s ASSERTIONS=1 for more info.';
// 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.
var e = new WebAssembly.RuntimeError(what);
// 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
// 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
var wasmBinaryFile;
wasmBinaryFile = 'decoderWorker.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'];
updateGlobalBufferAndViews(wasmMemory.buffer);
wasmTable = Module['asm']['__indirect_function_table'];
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.
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
// 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);
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) {
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;
}
}
instantiateAsync();
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) {
wasmTable.get(func)();
} else {
wasmTable.get(func)(callback.arg);
}
} else {
func(callback.arg === undefined ? null : callback.arg);
}
}
}
function demangle(func) {
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 + ']');
});
}
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 stackTrace() {
var js = jsStackTrace();
if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace']();
return demangleAll(js);
}
function _abort() {
abort('');
}
function _emscripten_memcpy_big(dest, src, num) {
HEAPU8.copyWithin(dest, src, src + num);
}
function abortOnCannotGrowMemory(requestedSize) {
abort('OOM');
}
function _emscripten_resize_heap(requestedSize) {
var oldSize = HEAPU8.length;
requestedSize = requestedSize >>> 0;
abortOnCannotGrowMemory(requestedSize);
}
var SYSCALLS = {mappings:{},buffers:[null,[],[]],printChar:function(stream, curr) {
var buffer = SYSCALLS.buffers[stream];
if (curr === 0 || curr === 10) {
(stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));
buffer.length = 0;
} else {
buffer.push(curr);
}
},varargs:undefined,get:function() {
SYSCALLS.varargs += 4;
var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)];
return ret;
},getStr:function(ptr) {
var ret = UTF8ToString(ptr);
return ret;
},get64:function(low, high) {
return low;
}};
function _fd_close(fd) {
return 0;
}
function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
}
function flush_NO_FILESYSTEM() {
// flush anything remaining in the buffers during shutdown
if (typeof _fflush !== 'undefined') _fflush(0);
var buffers = SYSCALLS.buffers;
if (buffers[1].length) SYSCALLS.printChar(1, 10);
if (buffers[2].length) SYSCALLS.printChar(2, 10);
}
function _fd_write(fd, iov, iovcnt, pnum) {
// hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0
var num = 0;
for (var i = 0; i < iovcnt; i++) {
var ptr = HEAP32[(((iov)+(i*8))>>2)];
var len = HEAP32[(((iov)+(i*8 + 4))>>2)];
for (var j = 0; j < len; j++) {
SYSCALLS.printChar(fd, HEAPU8[ptr+j]);
}
num += len;
}
HEAP32[((pnum)>>2)] = num
return 0;
}
function _setTempRet0(val) {
setTempRet0(val);
}
var ASSERTIONS = false;
/** @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('');
}
var asmLibraryArg = {
"abort": _abort,
"emscripten_memcpy_big": _emscripten_memcpy_big,
"emscripten_resize_heap": _emscripten_resize_heap,
"fd_close": _fd_close,
"fd_seek": _fd_seek,
"fd_write": _fd_write,
"setTempRet0": _setTempRet0
};
var asm = createWasm();
/** @type {function(...*):?} */
var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() {
return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["__wasm_call_ctors"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var _opus_decoder_create = Module["_opus_decoder_create"] = function() {
return (_opus_decoder_create = Module["_opus_decoder_create"] = Module["asm"]["opus_decoder_create"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var _opus_decode_float = Module["_opus_decode_float"] = function() {
return (_opus_decode_float = Module["_opus_decode_float"] = Module["asm"]["opus_decode_float"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var _opus_decoder_destroy = Module["_opus_decoder_destroy"] = function() {
return (_opus_decoder_destroy = Module["_opus_decoder_destroy"] = Module["asm"]["opus_decoder_destroy"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var _speex_resampler_init = Module["_speex_resampler_init"] = function() {
return (_speex_resampler_init = Module["_speex_resampler_init"] = Module["asm"]["speex_resampler_init"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var _speex_resampler_destroy = Module["_speex_resampler_destroy"] = function() {
return (_speex_resampler_destroy = Module["_speex_resampler_destroy"] = Module["asm"]["speex_resampler_destroy"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var _speex_resampler_process_interleaved_float = Module["_speex_resampler_process_interleaved_float"] = function() {
return (_speex_resampler_process_interleaved_float = Module["_speex_resampler_process_interleaved_float"] = Module["asm"]["speex_resampler_process_interleaved_float"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var ___errno_location = Module["___errno_location"] = function() {
return (___errno_location = Module["___errno_location"] = Module["asm"]["__errno_location"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var stackSave = Module["stackSave"] = function() {
return (stackSave = Module["stackSave"] = Module["asm"]["stackSave"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var stackRestore = Module["stackRestore"] = function() {
return (stackRestore = Module["stackRestore"] = Module["asm"]["stackRestore"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var stackAlloc = Module["stackAlloc"] = function() {
return (stackAlloc = Module["stackAlloc"] = Module["asm"]["stackAlloc"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var _malloc = Module["_malloc"] = function() {
return (_malloc = Module["_malloc"] = Module["asm"]["malloc"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var _free = Module["_free"] = function() {
return (_free = Module["_free"] = Module["asm"]["free"]).apply(null, arguments);
};
/** @type {function(...*):?} */
var dynCall_jiji = Module["dynCall_jiji"] = function() {
return (dynCall_jiji = Module["dynCall_jiji"] = Module["asm"]["dynCall_jiji"]).apply(null, arguments);
};
// === Auto-generated postamble setup entry stuff ===
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
};
/** @type {function(Array=)} */
function run(args) {
args = args || arguments_;
if (runDependencies > 0) {
return;
}
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();
if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();
postRun();
}
if (Module['setStatus']) {
Module['setStatus']('Running...');
setTimeout(function() {
setTimeout(function() {
Module['setStatus']('');
}, 1);
doRun();
}, 1);
} else
{
doRun();
}
}
Module['run'] = run;
/** @param {boolean|number=} implicit */
function exit(status, implicit) {
EXITSTATUS = status;
if (keepRuntimeAlive()) {
} 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();
================================================
FILE: dist-unminified/encoderWorker.js
================================================
// 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 Module !== 'undefined' ? Module : {};
// --pre-jses are emitted after the Module integration code, so that they can
// refer to Module (if they choose; they can also define Module)
// 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 = {};
var key;
for (key in Module) {
if (Module.hasOwnProperty(key)) {
moduleOverrides[key] = Module[key];
}
}
var arguments_ = [];
var thisProgram = './this.program';
var quit_ = function(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;
// `/` 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;
var toLog = e;
err('exiting due to exception: ' + toLog);
}
var nodeFS;
var nodePath;
if (ENVIRONMENT_IS_NODE) {
if (ENVIRONMENT_IS_WORKER) {
scriptDirectory = require('path').dirname(scriptDirectory) + '/';
} else {
scriptDirectory = __dirname + '/';
}
// include: node_shell_read.js
read_ = function shell_read(filename, binary) {
var ret = tryParseAsDataURI(filename);
if (ret) {
return binary ? ret : ret.toString();
}
if (!nodeFS) nodeFS = require('fs');
if (!nodePath) nodePath = require('path');
filename = nodePath['normalize'](filename);
return nodeFS['readFileSync'](filename, binary ? null : 'utf8');
};
readBinary = function readBinary(filename) {
var ret = read_(filename, true);
if (!ret.buffer) {
ret = new Uint8Array(ret);
}
assert(ret.buffer);
return ret;
};
readAsync = function readAsync(filename, onload, onerror) {
var ret = tryParseAsDataURI(filename);
if (ret) {
onload(ret);
}
if (!nodeFS) nodeFS = require('fs');
if (!nodePath) nodePath = require('path');
filename = nodePath['normalize'](filename);
nodeFS['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);
if (typeof module !== 'undefined') {
module['exports'] = Module;
}
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_ = function(status, toThrow) {
if (keepRuntimeAlive()) {
process['exitCode'] = status;
throw toThrow;
}
logExceptionOnExit(toThrow);
process['exit'](status);
};
Module['inspect'] = function () { return '[Emscripten Module object]'; };
} 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;
}
// 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 = '';
}
// Differentiate the Web Worker from the Node Worker case, as reading must
// be done differently.
{
// include: web_or_worker_shell_read.js
read_ = function(url) {
try {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.send(null);
return xhr.responseText;
} catch (err) {
var data = tryParseAsDataURI(url);
if (data) {
return intArrayToString(data);
}
throw err;
}
};
if (ENVIRONMENT_IS_WORKER) {
readBinary = function(url) {
try {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.responseType = 'arraybuffer';
xhr.send(null);
return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response));
} catch (err) {
var data = tryParseAsDataURI(url);
if (data) {
return data;
}
throw err;
}
};
}
readAsync = function(url, onload, onerror) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'arraybuffer';
xhr.onload = function() {
if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
onload(xhr.response);
return;
}
var data = tryParseAsDataURI(url);
if (data) {
onload(data.buffer);
return;
}
onerror();
};
xhr.onerror = onerror;
xhr.send(null);
};
// end include: web_or_worker_shell_read.js
}
setWindowTitle = function(title) { document.title = title };
} else
{
}
// Set up the out() and err() hooks, which are how we can print to stdout or
// stderr, respectively.
var out = Module['print'] || console.log.bind(console);
var err = Module['printErr'] || console.warn.bind(console);
// Merge back in the overrides
for (key in moduleOverrides) {
if (moduleOverrides.hasOwnProperty(key)) {
Module[key] = moduleOverrides[key];
}
}
// 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;
// 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'];
if (Module['thisProgram']) thisProgram = Module['thisProgram'];
if (Module['quit']) quit_ = Module['quit'];
// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message
var STACK_ALIGN = 16;
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 4; // A pointer
} else if (type[0] === 'i') {
var 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;
}
// Add a wasm function to the table.
function addFunctionWasm(func, sig) {
// 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();
for (var i = 0; i < wasmTable.length; i++) {
var item = wasmTable.get(i);
// Ignore null values.
if (item) {
functionsInTableMap.set(item, i);
}
}
}
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
wasmTable.set(ret, func);
} catch (err) {
if (!(err instanceof TypeError)) {
throw err;
}
var wrapped = convertJsFunctionToWasm(func, sig);
wasmTable.set(ret, wrapped);
}
functionsInTableMap.set(func, ret);
return ret;
}
function removeFunction(index) {
functionsInTableMap.delete(wasmTable.get(index));
freeTableIndexes.push(index);
}
// 'sig' parameter is required for the llvm backend but only when func is not
// already a WebAssembly function.
function addFunction(func, sig) {
return addFunctionWasm(func, sig);
}
// end include: runtime_functions.js
// include: runtime_debug.js
// end include: runtime_debug.js
var tempRet0 = 0;
var setTempRet0 = function(value) {
tempRet0 = value;
};
var getTempRet0 = function() {
return 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'];
var noExitRuntime = Module['noExitRuntime'] || true;
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, noSafe) {
type = type || 'i8';
if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
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, noSafe) {
type = type || 'i8';
if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit
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 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);
}
}
// 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;
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) {
argTypes = argTypes || [];
// When the function takes numbers and returns a number, we can just return
// the original function
var numericArgs = argTypes.every(function(type){ return type === 'number'});
var numericRet = returnType !== 'string';
if (numericRet && numericArgs && !opts) {
return getCFunc(ident);
}
return function() {
return ccall(ident, returnType, argTypes, arguments, opts);
}
}
var ALLOC_NORMAL = 0; // Tries to use _malloc()
var ALLOC_STACK = 1; // Lives for the duration of the current function call
// allocate(): This is for internal use. You can use it yourself as well, but the interface
// is a little tricky (see docs right below). The reason is that it is optimized
// for multiple syntaxes to save space in generated code. So you should
// normally not use allocate(), and instead allocate memory using _malloc(),
// initialize it with setValue(), and so forth.
// @slab: An array of data.
// @allocator: How to allocate memory, see ALLOC_*
/** @type {function((Uint8Array|Array<number>), number)} */
function allocate(slab, allocator) {
var ret;
if (allocator == ALLOC_STACK) {
ret = stackAlloc(slab.length);
} else {
ret = _malloc(slab.length);
}
if (slab.subarray || slab.slice) {
HEAPU8.set(/** @type {!Uint8Array} */(slab), ret);
} else {
HEAPU8.set(new Uint8Array(slab), ret);
}
return ret;
}
// 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 {
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;
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) {
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) {
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) {
// 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) {
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) {
// 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) {
HEAP8.set(array, buffer);
}
/** @param {boolean=} dontAddNull */
function writeAsciiToMemory(str, buffer, dontAddNull) {
for (var i = 0; i < str.length; ++i) {
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
function alignUp(x, multiple) {
if (x % multiple > 0) {
x += multiple - (x % multiple);
}
return x;
}
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;
var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;
// 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
// end include: runtime_stack_check.js
// include: runtime_assertions.js
// 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() {
runtimeInitialized = true;
callRuntimeCallbacks(__ATINIT__);
}
function exitRuntime() {
runtimeExited = true;
}
function postRun() {
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
// 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
function getUniqueRunDependency(id) {
return id;
}
function addRunDependency(id) {
runDependencies++;
if (Module['monitorRunDependencies']) {
Module['monitorRunDependencies'](runDependencies);
}
}
function removeRunDependency(id) {
runDependencies--;
if (Module['monitorRunDependencies']) {
Module['monitorRunDependencies'](runDependencies);
}
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;
what += '. Build with -s ASSERTIONS=1 for more info.';
// 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.
var e = new WebAssembly.RuntimeError(what);
// 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
// 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
var wasmBinaryFile;
wasmBinaryFile = 'data:application/octet-stream;base64,AGFzbQEAAAAB+wVIYAR/f39/AGABfwF/YAN/f38AYAN/f38Bf2ACf38Bf2AFf39/f38AYAZ/f39/f38Bf2AEf39/fwF/YAV/f39/fwF/YAJ/fwBgBn9/f39/fwBgAX8AYAF8AXxgB39/f39/f38Bf2AHf39/f39/fwBgAAF/YAh/f39/f39/fwBgCn9/f39/f39/f38AYAAAYAN/fn8BfmACfn8Bf2ALf39/f39/f39/f38AYAR/f31/AGAPf39/f39/f39/f39/f39/AGAMf39/f39/f39/f39/AGAIf39/f39/f38Bf2AEf39/fwF9YAt/f39/f39/f39/fwF/YAt/f39/f39/f31/fwF/YAl/f319f39/f38AYAN8fH8BfGACfH8BfGACfH8Bf2ACfHwBfGAEfX1/fwF9YAZ/fH9/f38Bf2ADfn9/AX9gDH9/f39/fX1/f39/fwBgAX0BfWABfQF/YAN/f38BfGADf39/AX1gA39/fQBgCH9/f39/f31/AX1gAn9/AXxgDH9/f39/f319f39/fwF/YAF8AX5gBX9/fX9/AGADf31/AGAKf39/f39/f39/fwF/YBp/f39/f39/f39/f39/f39/f39/f39/f39/fwBgBn9/fX9/fwF9YAR/f399AGARf39/f39/f39/f39/f39/f38AYA9/f39/f39/f39/f39/fX8Bf2AFf39/f38BfWAJf39/f39/fX9/AX9gB39/f39/f30Bf2AFfX9/f38Bf2AXf39/f39/f39/f39/f39/f39/f39/f38AYAl/f39/f39/fX8Bf2ATf39/f39/f39/f39/f39/f39/fwF/YAx/f39/f39/f39/f38Bf2AJf39/f39/f39/AGAVf39/f39/f39/f39/f39/f39/f39/AX1gDX9/f39/f39/f31/fX8Bf2AKf39/f39/f39/fwF9YA1/f39/f39/f39/f39/AX9gCX9/f39/f39/fwF/YAd9f31/f39/AX9gBH9/fn8BfmAEf35/fwF/Ar0BBwNlbnYWZW1zY3JpcHRlbl9yZXNpemVfaGVhcAABA2VudhVlbXNjcmlwdGVuX21lbWNweV9iaWcAAxZ3YXNpX3NuYXBzaG90X3ByZXZpZXcxCGZkX2Nsb3NlAAEWd2FzaV9zbmFwc2hvdF9wcmV2aWV3MQhmZF93cml0ZQAHA2VudgVhYm9ydAASA2VudgtzZXRUZW1wUmV0MAALFndhc2lfc25hcHNob3RfcHJldmlldzEHZmRfc2VlawAIA5QCkgISDwsBDw8BAwMBCwQEBAkeHwwIICEMCA0IASIGBgYGBgsGCAEFAQEBAxMBCwEDDwMEAQMIDQIBACQUFAUDAwMCASUAAQEEBAEEAAAABQAHByYnCAQCAAACAAICAgkLCQkABQQABAQECQoFCwAHBgkVCgIAKAApAioFAAACDQUKCissAAwtBQwuLwwAFgUAMAoCAgADBQQAAgUACQIKMQINAAoXMhcBGBECAAAKEQIQMzQOBQUFBAIJBgQBAxkDAQAMNTYQEQoMABoKNzg5FggBOg4OGwI7HBsAPAAVPQkCEAEHAxAGPg0/CEAcQQICCQsCGEIEBBkEAQMHDQMHBw4aB0NEBw4KBh0HHUUDCAMLRghHBAUBcAEKCgUGAQGAAoACBgkBfwFB4J7DAgsHygIRBm1lbW9yeQIAEV9fd2FzbV9jYWxsX2N0b3JzAAcTb3B1c19lbmNvZGVyX2NyZWF0ZQCEAhFvcHVzX2VuY29kZV9mbG9hdACTAhBvcHVzX2VuY29kZXJfY3RsAJQCFG9wdXNfZW5jb2Rlcl9kZXN0cm95AJUCFHNwZWV4X3Jlc2FtcGxlcl9pbml0AB0Xc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3kAJylzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnRlcmxlYXZlZF9mbG9hdAApEF9fZXJybm9fbG9jYXRpb24ADAlzdGFja1NhdmUACAxzdGFja1Jlc3RvcmUACQpzdGFja0FsbG9jAAoGbWFsbG9jABAEZnJlZQARGV9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUBAAxkeW5DYWxsX2ppamkAlwIJEAEAQQELCSIjJCUmLS8whQIKru0NkgIDAAELBAAjAAsGACAAJAALEgEBfyMAIABrQXBxIgEkACABCwcAPwBBEHQLBgBBmJoDC08CAX8Bf0GglwMoAgAiASAAQQNqQXxxIgJqIQACQCACQQAgACABTRsNABALIABJBEAgABAARQ0BC0GglwMgADYCACABDwsQDEEwNgIAQX8L9gIEAX8BfwF+AX8CQCACRQ0AIAAgAmoiA0EBayABOgAAIAAgAToAACACQQNJDQAgA0ECayABOgAAIAAgAToAASADQQNrIAE6AAAgACABOgACIAJBB0kNACADQQRrIAE6AAAgACABOgADIAJBCUkNACAAQQAgAGtBA3EiBGoiAyABQf8BcUGBgoQIbCIBNgIAIAMgAiAEa0F8cSIEaiICQQRrIAE2AgAgBEEJSQ0AIAMgATYCCCADIAE2AgQgAkEIayABNgIAIAJBDGsgATYCACAEQRlJDQAgAyABNgIYIAMgATYCFCADIAE2AhAgAyABNgIMIAJBEGsgATYCACACQRRrIAE2AgAgAkEYayABNgIAIAJBHGsgATYCACAEIANBBHFBGHIiBmsiAkEgSQ0AIAGtQoGAgIAQfiEFIAMgBmohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkEgayICQR9LDQALCyAAC4cEAwF/AX8BfyACQYAETwRAIAAgASACEAEaIAAPCyAAIAJqIQMCQCAAIAFzQQNxRQRAAkAgAEEDcUUEQCAAIQIMAQsgAkEBSARAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAkEDcUUNASACIANJDQALCwJAIANBfHEiBEHAAEkNACACIARBQGoiBUsNAANAIAIgASgCADYCACACIAEoAgQ2AgQgAiABKAIINgIIIAIgASgCDDYCDCACIAEoAhA2AhAgAiABKAIUNgIUIAIgASgCGDYCGCACIAEoAhw2AhwgAiABKAIgNgIgIAIgASgCJDYCJCACIAEoAig2AiggAiABKAIsNgIsIAIgASgCMDYCMCACIAEoAjQ2AjQgAiABKAI4NgI4IAIgASgCPDYCPCABQUBrIQEgAkFAayICIAVNDQALCyACIARPDQEDQCACIAEoAgA2AgAgAUEEaiEBIAJBBGoiAiAESQ0ACwwBCyADQQRJBEAgACECDAELIAAgA0EEayIESwRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAiABLQABOgABIAIgAS0AAjoAAiACIAEtAAM6AAMgAUEEaiEBIAJBBGoiAiAETQ0ACwsgAiADSQRAA0AgAiABLQAAOgAAIAFBAWohASACQQFqIgIgA0cNAAsLIAALti4OAX8BfwF/AX8BfwF/AX8BfwF/AX8BfwF/AX8BfyMAQRBrIgskAAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEH0AU0EQEGcmgMoAgAiBkEQIABBC2pBeHEgAEELSRsiBEEDdiIBdiIAQQNxBEAgAEF/c0EBcSABaiIDQQN0IgJBzJoDaigCACIBQQhqIQACQCABKAIIIgQgAkHEmgNqIgJGBEBBnJoDIAZBfiADd3E2AgAMAQsgBCACNgIMIAIgBDYCCAsgASADQQN0IgNBA3I2AgQgASADaiIBIAEoAgRBAXI2AgQMDAsgBEGkmgMoAgAiCE0NASAABEACQCAAIAF0QQIgAXQiAEEAIABrcnEiAEEAIABrcUEBayIAIABBDHZBEHEiAHYiAUEFdkEIcSIDIAByIAEgA3YiAEECdkEEcSIBciAAIAF2IgBBAXZBAnEiAXIgACABdiIAQQF2QQFxIgFyIAAgAXZqIgNBA3QiAkHMmgNqKAIAIgEoAggiACACQcSaA2oiAkYEQEGcmgMgBkF+IAN3cSIGNgIADAELIAAgAjYCDCACIAA2AggLIAFBCGohACABIARBA3I2AgQgASAEaiICIANBA3QiBSAEayIDQQFyNgIEIAEgBWogAzYCACAIBEAgCEEDdiIFQQN0QcSaA2ohBEGwmgMoAgAhAQJ/IAZBASAFdCIFcUUEQEGcmgMgBSAGcjYCACAEDAELIAQoAggLIQUgBCABNgIIIAUgATYCDCABIAQ2AgwgASAFNgIIC0GwmgMgAjYCAEGkmgMgAzYCAAwMC0GgmgMoAgAiCUUNASAJQQAgCWtxQQFrIgAgAEEMdkEQcSIAdiIBQQV2QQhxIgMgAHIgASADdiIAQQJ2QQRxIgFyIAAgAXYiAEEBdkECcSIBciAAIAF2IgBBAXZBAXEiAXIgACABdmpBAnRBzJwDaigCACICKAIEQXhxIARrIQEgAiEDA0ACQCADKAIQIgBFBEAgAygCFCIARQ0BCyAAKAIEQXhxIARrIgMgASABIANLIgMbIQEgACACIAMbIQIgACEDDAELCyACKAIYIQogAiACKAIMIgVHBEAgAigCCCIAQayaAygCAEkaIAAgBTYCDCAFIAA2AggMCwsgAkEUaiIDKAIAIgBFBEAgAigCECIARQ0DIAJBEGohAwsDQCADIQcgACIFQRRqIgMoAgAiAA0AIAVBEGohAyAFKAIQIgANAAsgB0EANgIADAoLQX8hBCAAQb9/Sw0AIABBC2oiAEF4cSEEQaCaAygCACIIRQ0AAn9BACAEQYACSQ0AGkEfIgcgBEH///8HSw0AGiAAQQh2IgAgAEGA/j9qQRB2QQhxIgB0IgEgAUGA4B9qQRB2QQRxIgF0IgMgA0GAgA9qQRB2QQJxIgN0QQ92IAAgAXIgA3JrIgBBAXQgBCAAQRVqdkEBcXJBHGoLIQdBACAEayEBAkACQAJAIAdBAnRBzJwDaigCACIDRQRAQQAhAAwBC0EAIQAgBEEAQRkgB0EBdmsgB0EfRht0IQIDQAJAIAMoAgRBeHEgBGsiBiABTw0AIAMhBSAGIgENAEEAIQEgAyEADAMLIAAgAygCFCIGIAYgAyACQR12QQRxaigCECIDRhsgACAGGyEAIAJBAXQhAiADDQALCyAAIAVyRQRAQQAhBUECIAd0IgBBACAAa3IgCHEiAEUNAyAAQQAgAGtxQQFrIgAgAEEMdkEQcSIAdiIDQQV2QQhxIgIgAHIgAyACdiIAQQJ2QQRxIgNyIAAgA3YiAEEBdkECcSIDciAAIAN2IgBBAXZBAXEiA3IgACADdmpBAnRBzJwDaigCACEACyAARQ0BCwNAIAAoAgRBeHEgBGsiBiABSSECIAYgASACGyEBIAAgBSACGyEFIAAoAhAiA0UEQCAAKAIUIQMLIAMiAA0ACwsgBUUNACABQaSaAygCACAEa08NACAFKAIYIQcgBSAFKAIMIgJHBEAgBSgCCCIAQayaAygCAEkaIAAgAjYCDCACIAA2AggMCQsgBUEUaiIDKAIAIgBFBEAgBSgCECIARQ0DIAVBEGohAwsDQCADIQYgACICQRRqIgMoAgAiAA0AIAJBEGohAyACKAIQIgANAAsgBkEANgIADAgLIARBpJoDKAIAIgBNBEBBsJoDKAIAIQECQCAAIARrIgNBEE8EQEGkmgMgAzYCAEGwmgMgASAEaiICNgIAIAIgA0EBcjYCBCAAIAFqIAM2AgAgASAEQQNyNgIEDAELQbCaA0EANgIAQaSaA0EANgIAIAEgAEEDcjYCBCAAIAFqIgAgACgCBEEBcjYCBAsgAUEIaiEADAoLIARBqJoDKAIAIgJJBEBBqJoDIAIgBGsiATYCAEG0mgNBtJoDKAIAIgAgBGoiAzYCACADIAFBAXI2AgQgACAEQQNyNgIEIABBCGohAAwKC0EAIQAgBEEvaiIIAn9B9J0DKAIABEBB/J0DKAIADAELQYCeA0J/NwIAQfidA0KAoICAgIAENwIAQfSdAyALQQxqQXBxQdiq1aoFczYCAEGIngNBADYCAEHYnQNBADYCAEGAIAsiAWoiBkEAIAFrIgdxIgUgBE0NCUHUnQMoAgAiAQRAQcydAygCACIDIAVqIgkgA00NCiABIAlJDQoLQdidAy0AAEEEcQ0EAkACQEG0mgMoAgAiAQRAQdydAyEAA0AgASAAKAIAIgNPBEAgAyAAKAIEaiABSw0DCyAAKAIIIgANAAsLQQAQDSICQX9GDQUgBSEGQfidAygCACIAQQFrIgEgAnEEQCAFIAJrIAEgAmpBACAAa3FqIQYLIAQgBk8NBSAGQf7///8HSw0FQdSdAygCACIABEBBzJ0DKAIAIgEgBmoiAyABTQ0GIAAgA0kNBgsgBhANIgAgAkcNAQwHCyAGIAJrIAdxIgZB/v///wdLDQQgBhANIgIgACgCACAAKAIEakYNAyACIQALAkAgAEF/Rg0AIARBMGogBk0NAEH8nQMoAgAiASAIIAZrakEAIAFrcSIBQf7///8HSwRAIAAhAgwHCyABEA1Bf0cEQCABIAZqIQYgACECDAcLQQAgBmsQDRoMBAsgACECIABBf0cNBQwDC0EAIQUMBwtBACECDAULIAJBf0cNAgtB2J0DQdidAygCAEEEcjYCAAsgBUH+////B0sNASAFEA0hAkEAEA0hACACQX9GDQEgAEF/Rg0BIAAgAk0NASAAIAJrIgYgBEEoak0NAQtBzJ0DQcydAygCACAGaiIANgIAQdCdAygCACAASQRAQdCdAyAANgIACwJAAkACQEG0mgMoAgAiAQRAQdydAyEAA0AgAiAAKAIAIgMgACgCBCIFakYNAiAAKAIIIgANAAsMAgtBrJoDKAIAIgBBACAAIAJNG0UEQEGsmgMgAjYCAAtBACEAQeCdAyAGNgIAQdydAyACNgIAQbyaA0F/NgIAQcCaA0H0nQMoAgA2AgBB6J0DQQA2AgADQCAAQQN0IgFBzJoDaiABQcSaA2oiAzYCACABQdCaA2ogAzYCACAAQQFqIgBBIEcNAAtBqJoDIAZBKGsiAEF4IAJrQQdxQQAgAkEIakEHcRsiAWsiAzYCAEG0mgMgASACaiIBNgIAIAEgA0EBcjYCBCAAIAJqQSg2AgRBuJoDQYSeAygCADYCAAwCCyAALQAMQQhxDQAgASADSQ0AIAEgAk8NACAAIAUgBmo2AgRBtJoDIAFBeCABa0EHcUEAIAFBCGpBB3EbIgBqIgM2AgBBqJoDQaiaAygCACAGaiICIABrIgA2AgAgAyAAQQFyNgIEIAEgAmpBKDYCBEG4mgNBhJ4DKAIANgIADAELQayaAygCACIFIAJLBEBBrJoDIAI2AgAgAiEFCyACIAZqIQNB3J0DIQACQAJAAkACQAJAAkADQCADIAAoAgBHBEAgACgCCCIADQEMAgsLIAAtAAxBCHFFDQELQdydAyEAA0AgASAAKAIAIgNPBEAgAyAAKAIEaiIDIAFLDQMLIAAoAgghAAwACwALIAAgAjYCACAAIAAoAgQgBmo2AgQgAkF4IAJrQQdxQQAgAkEIakEHcRtqIgcgBEEDcjYCBCADQXggA2tBB3FBACADQQhqQQdxG2oiBiAEIAdqIgRrIQMgASAGRgRAQbSaAyAENgIAQaiaA0GomgMoAgAgA2oiADYCACAEIABBAXI2AgQMAwsgBkGwmgMoAgBGBEBBsJoDIAQ2AgBBpJoDQaSaAygCACADaiIANgIAIAQgAEEBcjYCBCAAIARqIAA2AgAMAwsgBigCBCIAQQNxQQFGBEAgAEF4cSEIAkAgAEH/AU0EQCAGKAIIIgEgAEEDdiIFQQN0QcSaA2oiAkYaIAEgBigCDCIARgRAQZyaA0GcmgMoAgBBfiAFd3E2AgAMAgsgASAANgIMIAAgATYCCAwBCyAGKAIYIQkCQCAGIAYoAgwiAkcEQCAGKAIIIgAgAjYCDCACIAA2AggMAQsCQCAGQRRqIgAoAgAiAQ0AIAZBEGoiACgCACIBDQBBACECDAELA0AgACEFIAEiAkEUaiIAKAIAIgENACACQRBqIQAgAigCECIBDQALIAVBADYCAAsgCUUNAAJAIAYgBigCHCIBQQJ0QcycA2oiACgCAEYEQCAAIAI2AgAgAg0BQaCaA0GgmgMoAgBBfiABd3E2AgAMAgsgCUEQQRQgCSgCECAGRhtqIAI2AgAgAkUNAQsgAiAJNgIYIAYoAhAiAARAIAIgADYCECAAIAI2AhgLIAYoAhQiAEUNACACIAA2AhQgACACNgIYCyAGIAhqIQYgAyAIaiEDCyAGIAYoAgRBfnE2AgQgBCADQQFyNgIEIAMgBGogAzYCACADQf8BTQRAIANBA3YiAUEDdEHEmgNqIQACf0GcmgMoAgAiA0EBIAF0IgFxRQRAQZyaAyABIANyNgIAIAAMAQsgACgCCAshASAAIAQ2AgggASAENgIMIAQgADYCDCAEIAE2AggMAwtBHyEAIANB////B00EQCADQQh2IgAgAEGA/j9qQRB2QQhxIgB0IgEgAUGA4B9qQRB2QQRxIgF0IgIgAkGAgA9qQRB2QQJxIgJ0QQ92IAAgAXIgAnJrIgBBAXQgAyAAQRVqdkEBcXJBHGohAAsgBCAANgIcIARCADcCECAAQQJ0QcycA2ohAQJAQaCaAygCACICQQEgAHQiBXFFBEBBoJoDIAIgBXI2AgAgASAENgIADAELIANBAEEZIABBAXZrIABBH0YbdCEAIAEoAgAhAgNAIAIiASgCBEF4cSADRg0DIABBHXYhAiAAQQF0IQAgASACQQRxaiIMQRBqIgUoAgAiAg0ACyAMIAQ2AhALIAQgATYCGCAEIAQ2AgwgBCAENgIIDAILQaiaAyAGQShrIgBBeCACa0EHcUEAIAJBCGpBB3EbIgVrIgc2AgBBtJoDIAIgBWoiBTYCACAFIAdBAXI2AgQgACACakEoNgIEQbiaA0GEngMoAgA2AgAgASADQScgA2tBB3FBACADQSdrQQdxG2pBL2siACAAIAFBEGpJGyIFQRs2AgQgBUHknQMpAgA3AhAgBUHcnQMpAgA3AghB5J0DIAVBCGo2AgBB4J0DIAY2AgBB3J0DIAI2AgBB6J0DQQA2AgAgBUEYaiEAA0AgAEEHNgIEIABBCGohAiAAQQRqIQAgAiADSQ0ACyABIAVGDQMgBSAFKAIEQX5xNgIEIAEgBSABayIGQQFyNgIEIAUgBjYCACAGQf8BTQRAIAZBA3YiA0EDdEHEmgNqIQACf0GcmgMoAgAiAkEBIAN0IgNxRQRAQZyaAyACIANyNgIAIAAMAQsgACgCCAshAyAAIAE2AgggAyABNgIMIAEgADYCDCABIAM2AggMBAtBHyEAIAFCADcCECAGQf///wdNBEAgBkEIdiIAIABBgP4/akEQdkEIcSIAdCIDIANBgOAfakEQdkEEcSIDdCICIAJBgIAPakEQdkECcSICdEEPdiAAIANyIAJyayIAQQF0IAYgAEEVanZBAXFyQRxqIQALIAEgADYCHCAAQQJ0QcycA2ohAwJAQaCaAygCACICQQEgAHQiBXFFBEBBoJoDIAIgBXI2AgAgAyABNgIADAELIAZBAEEZIABBAXZrIABBH0YbdCEAIAMoAgAhAgNAIAIiAygCBEF4cSAGRg0EIABBHXYhAiAAQQF0IQAgAyACQQRxaiINQRBqIgUoAgAiAg0ACyANIAE2AhALIAEgAzYCGCABIAE2AgwgASABNgIIDAMLIAEoAggiACAENgIMIAEgBDYCCCAEQQA2AhggBCABNgIMIAQgADYCCAsgB0EIaiEADAULIAMoAggiACABNgIMIAMgATYCCCABQQA2AhggASADNgIMIAEgADYCCAtBqJoDKAIAIgAgBE0NAEGomgMgACAEayIBNgIAQbSaA0G0mgMoAgAiACAEaiIDNgIAIAMgAUEBcjYCBCAAIARBA3I2AgQgAEEIaiEADAMLEAxBMDYCAEEAIQAMAgsCQCAHRQ0AAkAgBSgCHCIDQQJ0QcycA2oiACgCACAFRgRAIAAgAjYCACACDQFBoJoDIAhBfiADd3EiCDYCAAwCCyAHQRBBFCAHKAIQIAVGG2ogAjYCACACRQ0BCyACIAc2AhggBSgCECIABEAgAiAANgIQIAAgAjYCGAsgBSgCFCIARQ0AIAIgADYCFCAAIAI2AhgLAkAgAUEPTQRAIAUgASAEaiIAQQNyNgIEIAAgBWoiACAAKAIEQQFyNgIEDAELIAUgBEEDcjYCBCAEIAVqIgIgAUEBcjYCBCABIAJqIAE2AgAgAUH/AU0EQCABQQN2IgFBA3RBxJoDaiEAAn9BnJoDKAIAIgNBASABdCIBcUUEQEGcmgMgASADcjYCACAADAELIAAoAggLIQEgACACNgIIIAEgAjYCDCACIAA2AgwgAiABNgIIDAELQR8hACABQf///wdNBEAgAUEIdiIAIABBgP4/akEQdkEIcSIAdCIDIANBgOAfakEQdkEEcSIDdCIEIARBgIAPakEQdkECcSIEdEEPdiAAIANyIARyayIAQQF0IAEgAEEVanZBAXFyQRxqIQALIAIgADYCHCACQgA3AhAgAEECdEHMnANqIQMCQAJAIAhBASAAdCIEcUUEQEGgmgMgBCAIcjYCACADIAI2AgAMAQsgAUEAQRkgAEEBdmsgAEEfRht0IQAgAygCACEEA0AgBCIDKAIEQXhxIAFGDQIgAEEddiEEIABBAXQhACADIARBBHFqIg5BEGoiBigCACIEDQALIA4gAjYCEAsgAiADNgIYIAIgAjYCDCACIAI2AggMAQsgAygCCCIAIAI2AgwgAyACNgIIIAJBADYCGCACIAM2AgwgAiAANgIICyAFQQhqIQAMAQsCQCAKRQ0AAkAgAigCHCIDQQJ0QcycA2oiACgCACACRgRAIAAgBTYCACAFDQFBoJoDIAlBfiADd3E2AgAMAgsgCkEQQRQgCigCECACRhtqIAU2AgAgBUUNAQsgBSAKNgIYIAIoAhAiAARAIAUgADYCECAAIAU2AhgLIAIoAhQiAEUNACAFIAA2AhQgACAFNgIYCwJAIAFBD00EQCACIAEgBGoiAEEDcjYCBCAAIAJqIgAgACgCBEEBcjYCBAwBCyACIARBA3I2AgQgAiAEaiIDIAFBAXI2AgQgASADaiABNgIAIAgEQCAIQQN2IgVBA3RBxJoDaiEEQbCaAygCACEAAn9BASAFdCIFIAZxRQRAQZyaAyAFIAZyNgIAIAQMAQsgBCgCCAshBSAEIAA2AgggBSAANgIMIAAgBDYCDCAAIAU2AggLQbCaAyADNgIAQaSaAyABNgIACyACQQhqIQALIAtBEGokACAAC80MCAF/AX8BfwF/AX8BfwF/AX8CQAJAIABFDQAgAEEIayICIABBBGsoAgAiAUF4cSIAaiEFAkAgAUEBcQ0AIAFBA3FFDQEgAiACKAIAIgFrIgJBrJoDKAIAIgRJDQEgACABaiEAIAJBsJoDKAIARwRAIAFB/wFNBEAgAigCCCIEIAFBA3YiB0EDdEHEmgNqIgNGGiAEIAIoAgwiAUYEQEGcmgNBnJoDKAIAQX4gB3dxNgIADAMLIAQgATYCDCABIAQ2AggMAgsgAigCGCEGAkAgAiACKAIMIgNHBEAgAigCCCIBIAM2AgwgAyABNgIIDAELAkAgAkEUaiIBKAIAIgQNACACQRBqIgEoAgAiBA0AQQAhAwwBCwNAIAEhByAEIgNBFGoiASgCACIEDQAgA0EQaiEBIAMoAhAiBA0ACyAHQQA2AgALIAZFDQECQCACIAIoAhwiBEECdEHMnANqIgEoAgBGBEAgASADNgIAIAMNAUGgmgNBoJoDKAIAQX4gBHdxNgIADAMLIAZBEEEUIAYoAhAgAkYbaiADNgIAIANFDQILIAMgBjYCGCACKAIQIgEEQCADIAE2AhAgASADNgIYCyACKAIUIgFFDQEgAyABNgIUIAEgAzYCGAwBCyAFKAIEIgFBA3FBA0cNAEGkmgMgADYCACAFIAFBfnE2AgQMAgsgAiAFTw0AIAUoAgQiAUEBcUUNAAJAIAFBAnFFBEAgBUG0mgMoAgBGBEBBtJoDIAI2AgBBqJoDQaiaAygCACAAaiIANgIAIAIgAEEBcjYCBCACQbCaAygCAEcNA0GkmgNBADYCAEGwmgNBADYCAA8LIAVBsJoDKAIARgRAQbCaAyACNgIAQaSaA0GkmgMoAgAgAGoiADYCAAwECyABQXhxIABqIQACQCABQf8BTQRAIAUoAggiBCABQQN2IgdBA3RBxJoDaiIDRhogBCAFKAIMIgFGBEBBnJoDQZyaAygCAEF+IAd3cTYCAAwCCyAEIAE2AgwgASAENgIIDAELIAUoAhghBgJAIAUgBSgCDCIDRwRAIAUoAggiAUGsmgMoAgBJGiABIAM2AgwgAyABNgIIDAELAkAgBUEUaiIBKAIAIgQNACAFQRBqIgEoAgAiBA0AQQAhAwwBCwNAIAEhByAEIgNBFGoiASgCACIEDQAgA0EQaiEBIAMoAhAiBA0ACyAHQQA2AgALIAZFDQACQCAFIAUoAhwiBEECdEHMnANqIgEoAgBGBEAgASADNgIAIAMNAUGgmgNBoJoDKAIAQX4gBHdxNgIADAILIAZBEEEUIAYoAhAgBUYbaiADNgIAIANFDQELIAMgBjYCGCAFKAIQIgEEQCADIAE2AhAgASADNgIYCyAFKAIUIgFFDQAgAyABNgIUIAEgAzYCGAsgAiAAQQFyNgIEIAAgAmogADYCACACQbCaAygCAEcNAUGkmgMgADYCAA8LIAUgAUF+cTYCBCACIABBAXI2AgQgACACaiAANgIACyAAQf8BTQRAIABBA3YiAUEDdEHEmgNqIQACf0GcmgMoAgAiBEEBIAF0IgFxRQRAQZyaAyABIARyNgIAIAAMAQsgACgCCAshASAAIAI2AgggASACNgIMIAIgADYCDCACIAE2AggPC0EfIQEgAkIANwIQIABB////B00EQCAAQQh2IgEgAUGA/j9qQRB2QQhxIgF0IgQgBEGA4B9qQRB2QQRxIgR0IgMgA0GAgA9qQRB2QQJxIgN0QQ92IAEgBHIgA3JrIgFBAXQgACABQRVqdkEBcXJBHGohAQsgAiABNgIcIAFBAnRBzJwDaiEEAkACQAJAQaCaAygCACIDQQEgAXQiBXFFBEBBoJoDIAMgBXI2AgAgBCACNgIADAELIABBAEEZIAFBAXZrIAFBH0YbdCEBIAQoAgAhAwNAIAMiBCgCBEF4cSAARg0CIAFBHXYhAyABQQF0IQEgBCADQQRxaiIIQRBqIgUoAgAiAw0ACyAIIAI2AhALIAIgBDYCGCACIAI2AgwgAiACNgIIDAELIAQoAggiACACNgIMIAQgAjYCCCACQQA2AhggAiAENgIMIAIgADYCCAtBvJoDQbyaAygCAEEBayICQX8gAhs2AgALDwsgAiAAQQFyNgIEIAAgAmogADYCAAtaAgF/AX4CQAJ/QQAgAEUNABogAK0gAa1+IgOnIgIgACABckGAgARJDQAaQX8gAiADQiCIpxsLIgIQECIARQ0AIABBBGstAABBA3FFDQAgAEEAIAIQDhoLIAALgQECAX8BfyAARQRAIAEQEA8LIAFBQE8EQBAMQTA2AgBBAA8LIABBCGtBECABQQtqQXhxIAFBC0kbEBQiAgRAIAJBCGoPCyABEBAiAkUEQEEADwsgAiAAQXxBeCAAQQRrKAIAIgNBA3EbIANBeHFqIgMgASABIANLGxAPGiAAEBEgAgusBwkBfwF/AX8BfwF/AX8BfwF/AX8gACgCBCIGQXhxIQICQCAGQQNxRQRAIAFBgAJJBEBBAA8LIAFBBGogAk0EQCAAIQMgAiABa0H8nQMoAgBBAXRNDQILQQAPCyAAIAJqIQUCQCABIAJNBEAgAiABayICQRBJDQEgACAGQQFxIAFyQQJyNgIEIAAgAWoiASACQQNyNgIEIAUgBSgCBEEBcjYCBCABIAIQFQwBCyAFQbSaAygCAEYEQEGomgMoAgAgAmoiAiABTQ0CIAAgBkEBcSABckECcjYCBCAAIAFqIgYgAiABayIBQQFyNgIEQaiaAyABNgIAQbSaAyAGNgIADAELIAVBsJoDKAIARgRAQaSaAygCACACaiICIAFJDQICQCACIAFrIgNBEE8EQCAAIAZBAXEgAXJBAnI2AgQgACABaiIBIANBAXI2AgQgACACaiICIAM2AgAgAiACKAIEQX5xNgIEDAELIAAgBkEBcSACckECcjYCBCAAIAJqIgEgASgCBEEBcjYCBEEAIQNBACEBC0GwmgMgATYCAEGkmgMgAzYCAAwBCyAFKAIEIgRBAnENASAEQXhxIAJqIgcgAUkNASAHIAFrIQkCQCAEQf8BTQRAIAUoAggiAiAEQQN2IgpBA3RBxJoDaiIERhogAiAFKAIMIgNGBEBBnJoDQZyaAygCAEF+IAp3cTYCAAwCCyACIAM2AgwgAyACNgIIDAELIAUoAhghCAJAIAUgBSgCDCIERwRAIAUoAggiAkGsmgMoAgBJGiACIAQ2AgwgBCACNgIIDAELAkAgBUEUaiICKAIAIgMNACAFQRBqIgIoAgAiAw0AQQAhBAwBCwNAIAIhCiADIgRBFGoiAigCACIDDQAgBEEQaiECIAQoAhAiAw0ACyAKQQA2AgALIAhFDQACQCAFIAUoAhwiA0ECdEHMnANqIgIoAgBGBEAgAiAENgIAIAQNAUGgmgNBoJoDKAIAQX4gA3dxNgIADAILIAhBEEEUIAgoAhAgBUYbaiAENgIAIARFDQELIAQgCDYCGCAFKAIQIgIEQCAEIAI2AhAgAiAENgIYCyAFKAIUIgJFDQAgBCACNgIUIAIgBDYCGAsgCUEPTQRAIAAgBkEBcSAHckECcjYCBCAAIAdqIgEgASgCBEEBcjYCBAwBCyAAIAZBAXEgAXJBAnI2AgQgACABaiIBIAlBA3I2AgQgACAHaiICIAIoAgRBAXI2AgQgASAJEBULIAAhAwsgAwuWDAcBfwF/AX8BfwF/AX8BfyAAIAFqIQUCQAJAIAAoAgQiAkEBcQ0AIAJBA3FFDQEgACgCACICIAFqIQECQCAAIAJrIgBBsJoDKAIARwRAIAJB/wFNBEAgACgCCCIEIAJBA3YiB0EDdEHEmgNqIgNGGiAAKAIMIgIgBEcNAkGcmgNBnJoDKAIAQX4gB3dxNgIADAMLIAAoAhghBgJAIAAgACgCDCIDRwRAIAAoAggiAkGsmgMoAgBJGiACIAM2AgwgAyACNgIIDAELAkAgAEEUaiICKAIAIgQNACAAQRBqIgIoAgAiBA0AQQAhAwwBCwNAIAIhByAEIgNBFGoiAigCACIEDQAgA0EQaiECIAMoAhAiBA0ACyAHQQA2AgALIAZFDQICQCAAIAAoAhwiBEECdEHMnANqIgIoAgBGBEAgAiADNgIAIAMNAUGgmgNBoJoDKAIAQX4gBHdxNgIADAQLIAZBEEEUIAYoAhAgAEYbaiADNgIAIANFDQMLIAMgBjYCGCAAKAIQIgIEQCADIAI2AhAgAiADNgIYCyAAKAIUIgJFDQIgAyACNgIUIAIgAzYCGAwCCyAFKAIEIgJBA3FBA0cNAUGkmgMgATYCACAFIAJBfnE2AgQgACABQQFyNgIEIAUgATYCAA8LIAQgAjYCDCACIAQ2AggLAkAgBSgCBCICQQJxRQRAIAVBtJoDKAIARgRAQbSaAyAANgIAQaiaA0GomgMoAgAgAWoiATYCACAAIAFBAXI2AgQgAEGwmgMoAgBHDQNBpJoDQQA2AgBBsJoDQQA2AgAPCyAFQbCaAygCAEYEQEGwmgMgADYCAEGkmgNBpJoDKAIAIAFqIgE2AgAgACABQQFyNgIEIAAgAWogATYCAA8LIAJBeHEgAWohAQJAIAJB/wFNBEAgBSgCCCIEIAJBA3YiB0EDdEHEmgNqIgNGGiAEIAUoAgwiAkYEQEGcmgNBnJoDKAIAQX4gB3dxNgIADAILIAQgAjYCDCACIAQ2AggMAQsgBSgCGCEGAkAgBSAFKAIMIgNHBEAgBSgCCCICQayaAygCAEkaIAIgAzYCDCADIAI2AggMAQsCQCAFQRRqIgQoAgAiAg0AIAVBEGoiBCgCACICDQBBACEDDAELA0AgBCEHIAIiA0EUaiIEKAIAIgINACADQRBqIQQgAygCECICDQALIAdBADYCAAsgBkUNAAJAIAUgBSgCHCIEQQJ0QcycA2oiAigCAEYEQCACIAM2AgAgAw0BQaCaA0GgmgMoAgBBfiAEd3E2AgAMAgsgBkEQQRQgBigCECAFRhtqIAM2AgAgA0UNAQsgAyAGNgIYIAUoAhAiAgRAIAMgAjYCECACIAM2AhgLIAUoAhQiAkUNACADIAI2AhQgAiADNgIYCyAAIAFBAXI2AgQgACABaiABNgIAIABBsJoDKAIARw0BQaSaAyABNgIADwsgBSACQX5xNgIEIAAgAUEBcjYCBCAAIAFqIAE2AgALIAFB/wFNBEAgAUEDdiICQQN0QcSaA2ohAQJ/QZyaAygCACIEQQEgAnQiAnFFBEBBnJoDIAIgBHI2AgAgAQwBCyABKAIICyECIAEgADYCCCACIAA2AgwgACABNgIMIAAgAjYCCA8LQR8hAiAAQgA3AhAgAUH///8HTQRAIAFBCHYiAiACQYD+P2pBEHZBCHEiAnQiBCAEQYDgH2pBEHZBBHEiBHQiAyADQYCAD2pBEHZBAnEiA3RBD3YgAiAEciADcmsiAkEBdCABIAJBFWp2QQFxckEcaiECCyAAIAI2AhwgAkECdEHMnANqIQQCQAJAQaCaAygCACIDQQEgAnQiBXFFBEBBoJoDIAMgBXI2AgAgBCAANgIADAELIAFBAEEZIAJBAXZrIAJBH0YbdCECIAQoAgAhAwNAIAMiBCgCBEF4cSABRg0CIAJBHXYhAyACQQF0IQIgBCADQQRxaiIIQRBqIgUoAgAiAw0ACyAIIAA2AhALIAAgBDYCGCAAIAA2AgwgACAANgIIDwsgBCgCCCIBIAA2AgwgBCAANgIIIABBADYCGCAAIAQ2AgwgACABNgIICwudAQMBfAF8AXwgACAAoiIDIAMgA6KiIANEfNXPWjrZ5T2iROucK4rm5Vq+oKIgAyADRH3+sVfjHcc+okTVYcEZoAEqv6CiRKb4EBEREYE/oKAhBSADIACiIQQgAkUEQCAEIAMgBaJESVVVVVVVxb+goiAAoA8LIAAgAyABRAAAAAAAAOA/oiAEIAWioaIgAaEgBERJVVVVVVXFP6KgoQuoAQACQCABQYAITgRAIABEAAAAAAAA4H+iIQAgAUH/D0gEQCABQf8HayEBDAILIABEAAAAAAAA4H+iIQAgAUH9FyABQf0XSBtB/g9rIQEMAQsgAUGBeEoNACAARAAAAAAAABAAoiEAIAFBg3BKBEAgAUH+B2ohAQwBCyAARAAAAAAAABAAoiEAIAFBhmggAUGGaEobQfwPaiEBCyAAIAFB/wdqrUI0hr+iCwUAIACcC/ARFQF8AX8BfwF/AXwBfwF/AX8BfwF/AX8BfwF8AX8BfwF/AX8BfwF/AX8BfyMAQbAEayIIJAAgAkEDa0EYbSIHQQAgB0EAShsiE0FobCACaiEKIARBAnRBgAhqKAIAIgwgA0EBayINakEATgRAIAMgDGohBiATIA1rIQJBACEHA0AgCEHAAmogB0EDdGogAkEASAR8RAAAAAAAAAAABSACQQJ0QZAIaigCALcLIgU5AwAgAkEBaiECIAdBAWoiByAGRw0ACwsgCkEYayEPIAxBACAMQQBKGyELQQAhBgNARAAAAAAAAAAAIQUgA0EASgRAIAYgDWohB0EAIQIDQCAFIAAgAkEDdGorAwAgCEHAAmogByACa0EDdGorAwCioCEFIAJBAWoiAiADRw0ACwsgCCAGQQN0aiAFOQMAIAYgC0YhAiAGQQFqIQYgAkUNAAtBLyAKayEVQTAgCmshFCAKQRlrIRYgDCEGAkADQCAIIAZBA3RqKwMAIQVBACECIAYhByAGQQFIIhJFBEADQCACQQJ0IgsgCEHgA2pqIgsCfyAFAn8gBUQAAAAAAABwPqIiCZlEAAAAAAAA4EFjBEAgCaoMAQtBgICAgHgLIg23IglEAAAAAAAAcMGioCIFmUQAAAAAAADgQWMEQCAFqgwBC0GAgICAeAsiDTYCACAIIAdBAWsiB0EDdGorAwAgCaAhBSACQQFqIgIgBkcNAAsLAn8gBSAPEBciBSAFRAAAAAAAAMA/ohAYRAAAAAAAACDAoqAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLIRAgBSAQt6EhBQJAAkACQAJ/IA9BAUgiF0UEQCAGQQJ0IAhqIhhB3ANqIgIgGCgC3AMiAiACIBR1IgIgFHRrIgc2AgAgAiAQaiEQIAcgFXUMAQsgDw0BIAZBAnQgCGooAtwDQRd1CyIOQQFIDQIMAQtBAiEOIAVEAAAAAAAA4D9mDQBBACEODAELQQAhAkEAIQ0gEkUEQANAIAhB4ANqIAJBAnRqIhIoAgAhB0H///8HIQsCfwJAIA0NAEGAgIAIIQsgBw0AQQAMAQsgEiALIAdrNgIAQQELIQ0gAkEBaiICIAZHDQALCwJAIBcNAEH///8DIQICQAJAIBYOAgEAAgtB////ASECCyAGQQJ0IAhqIhlB3ANqIgcgGSgC3AMgAnE2AgALIBBBAWohECAOQQJHDQBEAAAAAAAA8D8gBaEhBUECIQ4gDUUNACAFRAAAAAAAAPA/IA8QF6EhBQsgBUQAAAAAAAAAAGEEQEEAIQcCQCAGIgIgDEwNAANAIAhB4ANqIAJBAWsiAkECdGooAgAgB3IhByACIAxKDQALIAdFDQAgDyEKA0AgCkEYayEKIAhB4ANqIAZBAWsiBkECdGooAgBFDQALDAMLQQEhAgNAIAIiB0EBaiECIAhB4ANqIAwgB2tBAnRqKAIARQ0ACyAGIAdqIQsDQCAIQcACaiADIAZqIgdBA3RqIAZBAWoiBiATakECdEGQCGooAgC3OQMAQQAhAkQAAAAAAAAAACEFIANBAU4EQANAIAUgACACQQN0aisDACAIQcACaiAHIAJrQQN0aisDAKKgIQUgAkEBaiICIANHDQALCyAIIAZBA3RqIAU5AwAgBiALSA0ACyALIQYMAQsLAkAgBUEYIAprEBciBUQAAAAAAABwQWYEQCAGQQJ0IgMgCEHgA2pqIgMCfyAFAn8gBUQAAAAAAABwPqIiCZlEAAAAAAAA4EFjBEAgCaoMAQtBgICAgHgLIgK3RAAAAAAAAHDBoqAiBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLIgc2AgAgBkEBaiEGDAELAn8gBZlEAAAAAAAA4EFjBEAgBaoMAQtBgICAgHgLIQIgDyEKCyAIQeADaiAGQQJ0aiACNgIAC0QAAAAAAADwPyAKEBchBQJAIAZBf0wNACAGIQIDQCAIIAJBA3RqIAUgCEHgA2ogAkECdGooAgC3ojkDACAFRAAAAAAAAHA+oiEFIAJBAEohAyACQQFrIQIgAw0ACyAGQX9MDQAgBiECA0AgBiACIgdrIQBEAAAAAAAAAAAhBUEAIQIDQAJAIAUgAkEDdEHgHWorAwAgCCACIAdqQQN0aisDAKKgIQUgAiAMTg0AIAAgAkshAyACQQFqIQIgAw0BCwsgCEGgAWogAEEDdGogBTkDACAHQQFrIQIgB0EASg0ACwsCQAJAAkACQAJAIAQOBAECAgAECwJAIAZBAUgNACAIQaABaiAGQQN0aisDACEFIAYhAgNAIAhBoAFqIAJBA3RqIAUgCEGgAWogAkEBayIDQQN0aiIHKwMAIgkgCSAFoCIJoaA5AwAgByAJOQMAIAJBAUohByAJIQUgAyECIAcNAAsgBkECSA0AIAhBoAFqIAZBA3RqKwMAIQUgBiECA0AgCEGgAWogAkEDdGogBSAIQaABaiACQQFrIgNBA3RqIgcrAwAiCSAJIAWgIgmhoDkDACAHIAk5AwAgAkECSiEHIAkhBSADIQIgBw0ACyAGQQFMDQADQCARIAhBoAFqIAZBA3RqKwMAoCERIAZBAkohAiAGQQFrIQYgAg0ACwsgCCsDoAEhBSAODQIgASAFOQMAIAgrA6gBIQUgASAROQMQIAEgBTkDCAwDC0QAAAAAAAAAACEFIAZBAE4EQANAIAUgCEGgAWogBkEDdGorAwCgIQUgBkEASiECIAZBAWshBiACDQALCyABIAWaIAUgDhs5AwAMAgtEAAAAAAAAAAAhBSAGQQBOBEAgBiECA0AgBSAIQaABaiACQQN0aisDAKAhBSACQQBKIQMgAkEBayECIAMNAAsLIAEgBZogBSAOGzkDACAIKwOgASAFoSEFQQEhAiAGQQFOBEADQCAFIAhBoAFqIAJBA3RqKwMAoCEFIAIgBkchAyACQQFqIQIgAw0ACwsgASAFmiAFIA4bOQMIDAELIAEgBZo5AwAgCCsDqAEhBSABIBGaOQMQIAEgBZo5AwgLIAhBsARqJAAgEEEHcQvfCQoBfAF/AX8BfwF/AX4BfAF/AXwBfCMAQTBrIgQkAAJAAkACQCAAvSIHQiCIpyIDQf////8HcSIFQfrUvYAETQRAIANB//8/cUH7wyRGDQEgBUH8souABE0EQCAHQgBZBEAgASAARAAAQFT7Ifm/oCIARDFjYhphtNC9oCICOQMAIAEgACACoUQxY2IaYbTQvaA5AwhBASEDDAULIAEgAEQAAEBU+yH5P6AiAEQxY2IaYbTQPaAiAjkDACABIAAgAqFEMWNiGmG00D2gOQMIQX8hAwwECyAHQgBZBEAgASAARAAAQFT7IQnAoCIARDFjYhphtOC9oCICOQMAIAEgACACoUQxY2IaYbTgvaA5AwhBAiEDDAQLIAEgAEQAAEBU+yEJQKAiAEQxY2IaYbTgPaAiAjkDACABIAAgAqFEMWNiGmG04D2gOQMIQX4hAwwDCyAFQbuM8YAETQRAIAVBvPvXgARNBEAgBUH8ssuABEYNAiAHQgBZBEAgASAARAAAMH982RLAoCIARMqUk6eRDum9oCICOQMAIAEgACACoUTKlJOnkQ7pvaA5AwhBAyEDDAULIAEgAEQAADB/fNkSQKAiAETKlJOnkQ7pPaAiAjkDACABIAAgAqFEypSTp5EO6T2gOQMIQX0hAwwECyAFQfvD5IAERg0BIAdCAFkEQCABIABEAABAVPshGcCgIgBEMWNiGmG08L2gIgI5AwAgASAAIAKhRDFjYhphtPC9oDkDCEEEIQMMBAsgASAARAAAQFT7IRlAoCIARDFjYhphtPA9oCICOQMAIAEgACACoUQxY2IaYbTwPaA5AwhBfCEDDAMLIAVB+sPkiQRLDQELIAEgACAARIPIyW0wX+Q/okQAAAAAAAA4Q6BEAAAAAAAAOMOgIgJEAABAVPsh+b+ioCIIIAJEMWNiGmG00D2iIguhIgA5AwAgBUEUdiIJIAC9QjSIp0H/D3FrQRFIIQYCfyACmUQAAAAAAADgQWMEQCACqgwBC0GAgICAeAshAwJAIAYNACABIAggAkQAAGAaYbTQPaIiAKEiCiACRHNwAy6KGaM7oiAIIAqhIAChoSILoSIAOQMAIAkgAL1CNIinQf8PcWtBMkgEQCAKIQgMAQsgASAKIAJEAAAALooZozuiIgChIgggAkTBSSAlmoN7OaIgCiAIoSAAoaEiC6EiADkDAAsgASAIIAChIAuhOQMIDAELIAVBgIDA/wdPBEAgASAAIAChIgA5AwAgASAAOQMIQQAhAwwBCyAHQv////////8Hg0KAgICAgICAsMEAhL8hAEEAIQNBASEGA0AgBEEQaiADQQN0aiIDAn8gAJlEAAAAAAAA4EFjBEAgAKoMAQtBgICAgHgLIgm3IgI5AwAgACACoUQAAAAAAABwQaIhAEEBIQMgBkEBcSEJQQAhBiAJDQALIAQgADkDIAJAIABEAAAAAAAAAABiBEBBAiEDDAELQQEhBgNAIAYiA0EBayEGIARBEGogA0EDdGorAwBEAAAAAAAAAABhDQALCyAEQRBqIAQgBUEUdkGWCGsgA0EBakEBEBkhAyAEKwMAIQAgB0J/VwRAIAEgAJo5AwAgASAEKwMImjkDCEEAIANrIQMMAQsgASAAOQMAIAEgBCsDCDkDCAsgBEEwaiQAIAMLlgEDAXwBfAF8RAAAAAAAAPA/IAAgAKIiAkQAAAAAAADgP6IiA6EiBEQAAAAAAADwPyAEoSADoSACIAIgAiACRJAVyxmgAfo+okR3UcEWbMFWv6CiRExVVVVVVaU/oKIgAiACoiIDIAOiIAIgAkTUOIi+6fqovaJExLG0vZ7uIT6gokStUpyAT36SvqCioKIgACABoqGgoAvHAQIBfwF/IwBBEGsiASQAAkAgAL1CIIinQf////8HcSICQfvDpP8DTQRAIAJBgIDA8gNJDQEgAEQAAAAAAAAAAEEAEBYhAAwBCyACQYCAwP8HTwRAIAAgAKEhAAwBCwJAAkACQAJAIAAgARAaQQNxDgMAAQIDCyABKwMAIAErAwhBARAWIQAMAwsgASsDACABKwMIEBshAAwCCyABKwMAIAErAwhBARAWmiEADAELIAErAwAgASsDCBAbmiEACyABQRBqJAAgAAsSACAAIAEgAiABIAIgAyAEEB4LzwIEAX8BfwF/AX8CQAJAAkAgAEUNACABRQ0AIAJFDQAgBUEKSg0AIAVBf0oNAQsgBkUNASAGQQM2AgBBAA8LQeAAQQEQEiIHRQRAQQAhByAGRQ0BIAZBATYCAEEADwsgB0GAgID8AzYCLCAHQX82AhAgB0KBgICAEDcDWCAHIAA2AhQgB0GgATYCICAHIABBAnQiCEEBEBIiADYCPAJAIABFDQAgByAIQQEQEiIKNgJEIApFDQAgByAIQQEQEiIINgJAIAohCSAIRQ0AIAcgBTYCECAHIAEgAiADIAQQHxoCQCAHECAiBUUEQCAHQQE2AjQMAQsgBygCSBARIAcoAkwQESAHKAI8EBEgBygCRBARIAcoAkAQESAHEBFBACEHCyAGRQ0BIAYgBTYCACAHDwsgBgRAIAZBATYCAAsgABARIAkQESAHEBFBACEHCyAHC8kCBQF/AX8BfwF/AX9BAyEGAkAgAUUNACACRQ0AAkAgACgCACADRw0AIAAoAgQgBEcNACAAKAIIIAFHDQBBACEGIAAoAgwgAkYNAQsgACAENgIEIAAgAzYCACAAKAIMIQcgASEFIAIhAwNAIAUgAyIEcCEDIAQhBSADDQALIAAgAiAEbiIDNgIMIAAgASAEbjYCCAJAIAdFDQAgACgCFEUNACAAKAJAIQhBACEEA0BBBSEGIAggBEECdGoiASgCACIFIAUgB24iBSAHbGsiCUF/IANuIgJLDQIgAiAFSQ0CIAMgBWwiBSADIAlsIAduIgNBf3NLDQIgASADIAVqIgM2AgAgACgCDCIFIANNBEAgASAFQQFrNgIACyAEQQFqIgQgACgCFE8NASAAKAIMIQMMAAsACyAAKAI0RQRAQQAPCyAAECAhBgsgBgu1ERcBfwF/AX8BfwF/AX8BfwF/AX8BfwF/AX8BfwF/AX0BfQF/AX8BfwF/AX8BfwF/IAAgACgCCCICIAAoAgwiAW4iBTYCJCAAIAAoAhBBFGwiA0GkHmooAgAiBzYCMCAAKAIYIQogACADQaAeaigCACIENgIYIAAgAiABIAVsazYCKCAAKAIcIRMCQAJAAkACQCABIAJJBEAgACADQageaioCACABs5QgArOVOAIsIAQgBCABbiIDIAFsayIFQX8gAm4iBEsNAiADIARLDQIgAiADbCIEIAIgBWwgAW4iA0F/c0sNAiAAIAMgBGpBB2pBeHEiBDYCGCAHIAFBAXQgAkkiA3YgAUECdCACSSIFdiABQQN0IAJJIgZ2IAFBBHQgAkkiCHYiAkEBIAIbIQcCQCADDQAgBQ0AIAYNACAIDQAgAg0CCyAAIAc2AjAMAQsgACADQaweaioCADgCLAsCQCABIARsIgIgBCAHbEEIaiIFTQRAQQEhA0H/////ASABbiAETw0BC0EAIQMgBSECQff///8BIAduIARJDQELIAIgACgCUEsEQCAAKAJMIAJBAnQQEyIBRQ0BIAAgAjYCUCAAIAE2AkwLAkACQAJAIANFBEBBfCEBIAAoAhgiAiAAKAIwIgNsQQRqIgRBfEoNASAAKAIQIQUMAgsgACgCDCIIBEAgCLMhDyAAKAIYIgJBfm0hBUEAIQYDQCACBEAgAiAGbCEEIAazIA+VIRAgACgCEEEUbEGwHmooAgAhAyAAKAJMIQdBACEBA0AgByABIARqQQJ0aiAAKgIsIAFBAWoiASAFarIgEJMgAiADECE4AgAgASACRw0ACwsgBkEBaiIGIAhHDQALCyAAKAIQQQlOBEAgAEEBNgJUDAMLIABBAjYCVAwCCyACQQF2syEQIAOzIQ8gACgCECIFQRRsQbAeaigCACEDIAAoAkwhBwNAIAFBAnQgB2ogACoCLCABsiAPlSAQkyACIAMQITgCECABQQFqIgEgBEcNAAsLIAVBCU4EQCAAQQM2AlQMAQsgAEEENgJUCyAAKAIYIAAoAiBqQQFrIgEgACgCHCICSwRAQf////8BIAAoAhQiAm4gAUkNASAAKAJIIAEgAmxBAnQQEyICRQ0BIAAgATYCHCAAIAI2AkggASECCyAAKAI4RQRAIAIgACgCFGwiAUUEQEEADwsgACgCSEEAIAFBAnQQDhpBAA8LIAAoAhgiAiAKTQ0BIAAoAhQiCEUEQEEADwsgCkEBayEUIApBAmshESAIQQJ0QQRrIRUgACgCRCEWA0AgDEECdCEJIBYgCEEBayIIQQJ0IhdqIgYoAgAiBEEBdCENAkAgBCAUaiIBRQ0AIAggE2whAyAAKAIcIAhsIQcgACgCSCECIAFBAXEEQCACIAFBAWsiASAEaiAHakECdGogAiABIANqQQJ0aioCADgCAAsgEUEAIARrRg0AA0AgAiABQQFrIgUgBGogB2pBAnRqIAIgAyAFakECdGoqAgA4AgAgAiABQQJrIgEgBGogB2pBAnRqIAIgASADakECdGoqAgA4AgAgAQ0ACwsgFSAJayESIAogDWohCSAEBEAgACgCSCAAKAIcIBJsakEAIARBAnQQDhoLIAZBADYCAAJAIAAoAhgiCyAJSwRAAkAgCUEBayIORQ0AIAtBAmshByAJQQJrIQUgACgCHCAIbCEBQQAhAyAAKAJIIQJBACANayARRwRAIA5BfnEhBkEAIQQDQCACIAMgB2ogAWpBAnRqIAIgAyAFaiABakECdGoqAgA4AgAgAiAHIARBf3MiA2ogAWpBAnRqIAIgAyAFaiABakECdGoqAgA4AgAgBEF+cyEDIARBAmohBCAGQQJrIgYNAAsLIA5BAXFFDQAgAiADIAdqIAFqQQJ0aiACIAMgBWogAWpBAnRqKgIAOAIACyAOIAtBAWsiAUkEQCAAKAJIIAAoAhwgEmxqQQAgASAOa0ECdBAOGgsgACgCPCAXaiIBIAEoAgAgCyAJa0EBdmo2AgAMAQsgBiAJIAtrQQF2IgQ2AgAgBCAAKAIYaiIGQQFrIgVFDQAgBUEDcSEHIAAoAhwgCGwhAyAAKAJIIQFBACECIAZBAmtBA08EQCAFQXxxIQUDQCABIAIgA2oiBkECdGogASAEIAZqQQJ0aioCADgCACABIAMgAkEBcmoiBkECdGogASAEIAZqQQJ0aioCADgCACABIAMgAkECcmoiBkECdGogASAEIAZqQQJ0aioCADgCACABIAMgAkEDcmoiBkECdGogASAEIAZqQQJ0aioCADgCACACQQRqIQIgBUEEayIFDQALCyAHRQ0AA0AgASACIANqIgVBAnRqIAEgBCAFakECdGoqAgA4AgAgAkEBaiECIAdBAWsiBw0ACwsgDEEBaiEMIAgNAAtBAA8LIAAgCjYCGCAAQQU2AlRBASEBDAELQQAhASACIApPDQAgACgCFEUNACAAKAJEIQ1BACEIA0AgDSAIQQJ0aiIJKAIAIQUgCSAKIAJrQQF2IgQ2AgACQCAEIAVqIgwgACgCGCILakEBayIGRQ0AIAZBA3EhByAAKAIcIAhsIQMgACgCSCEBQQAhAiAFIAtqIARqQQJrQQNPBEAgBkF8cSEFA0AgASACIANqIgZBAnRqIAEgBCAGakECdGoqAgA4AgAgASADIAJBAXJqIgZBAnRqIAEgBCAGakECdGoqAgA4AgAgASADIAJBAnJqIgZBAnRqIAEgBCAGakECdGoqAgA4AgAgASADIAJBA3JqIgZBAnRqIAEgBCAGakECdGoqAgA4AgAgAkEEaiECIAVBBGsiBQ0ACwsgB0UNAANAIAEgAiADaiIFQQJ0aiABIAQgBWpBAnRqKgIAOAIAIAJBAWohAiAHQQFrIgcNAAsLIAkgDDYCACAIQQFqIgggACgCFE8EQEEADwUgACgCGCECDAELAAsACyABC8cCCwF8AX0BfAF8AXwBfAF9AX8BfAF8AXwgAbsiBJkiBkSN7bWg98awPmMEQCAADwsgBiACtyIHRAAAAAAAAOA/omRFBEAgACABlCEBIAMoAgACfyAEIASgIAejtosgAygCBLKUIgWOIgqLQwAAAE9dBEAgCqgMAQtBgICAgHgLIgtBA3RqIgIrAwghBiACKwMAIQcgAisDECEMIAIrAxghCCABu0QYLURU+yEJQKIiBBAcIAC7oiAEoyAIIAUgC7KTIgEgASABlCIAlLsiCUSVqGdVVVXFP6IiDSABuyIERJWoZ1VVVcU/oqEiDqIgDCAAu0QAAAAAAADgP6IiCCAEoCAJRAAAAAAAAOA/oqEiCaIgByAIIAREtStMVVVV1b+ioCANoSIEoiAGRAAAAAAAAPA/IA6hIAmhIAShoqCgoKK2IQULIAUL8QMTAX8BfwF/AXwBfAF8AX8BfAF/AX8BfwF/AX8BfwF/AX8BfwF/AX8gAUECdCIBIAAoAkBqIhEoAgAhBwJAIAAoAjwgAWoiEigCACIIIAMoAgAiE04NACAAKAIMIQwgACgCKCEUIAAoAiQhFSAAKAJcIRYgACgCTCEXIAUoAgAiA0EAIANBAEobIQ8gACgCGCIQQQFIIRgDQCAGIA9GBEAgDyEGDAILRAAAAAAAAAAAIQ0CQCAYBEBEAAAAAAAAAAAhCUQAAAAAAAAAACEKRAAAAAAAAAAAIQsMAQsgAiAIQQJ0aiEDIBcgByAQbEECdGohAUEAIQVEAAAAAAAAAAAhC0QAAAAAAAAAACEKRAAAAAAAAAAAIQkDQCAJIAEgBUECdCIAaioCACAAIANqKgIAlLugIQkgDSABIABBDHIiDmoqAgAgAyAOaioCAJS7oCENIAsgASAAQQhyIg5qKgIAIAMgDmoqAgCUu6AhCyAKIAEgAEEEciIAaioCACAAIANqKgIAlLugIQogBUEEaiIFIBBIDQALCyAEIAYgFmxBAnRqIAkgCqAgC6AgDaC2OAIAIAcgFGoiAEEAIAwgACAMSRtrIQcgBkEBaiEGIAggFWogACAMT2oiCCATSA0ACwsgEiAINgIAIBEgBzYCACAGC/UDFAF/AX0BfwF/AX8BfwF/AX8BfwF/AX8BfwF/AX8BfwF/AX8BfwF/AX8gAUECdCIBIAAoAkBqIg8oAgAhCAJAIAAoAjwgAWoiECgCACIJIAMoAgAiEU4NACAAKAIMIQwgACgCKCESIAAoAiQhEyAAKAJcIRQgACgCTCEVIAUoAgAiA0EAIANBAEobIQ4gACgCGCIKQXxxIRYgCkEDcSEXIApBAUghGCAKQQFrQQNJIRkDQCAGIA5GBEAgDiEGDAILAkAgGARAQwAAAAAhBwwBCyACIAlBAnRqIQMgFSAIIApsQQJ0aiEBQwAAAAAhB0EAIQAgFiELIBlFBEADQCAHIAEgAEECdCIFaioCACADIAVqKgIAlJIgASAFQQRyIg1qKgIAIAMgDWoqAgCUkiABIAVBCHIiDWoqAgAgAyANaioCAJSSIAEgBUEMciIFaioCACADIAVqKgIAlJIhByAAQQRqIQAgC0EEayILDQALCyAXIgVFDQADQCAHIAEgAEECdCILaioCACADIAtqKgIAlJIhByAAQQFqIQAgBUEBayIFDQALCyAEIAYgFGxBAnRqIAc4AgAgCCASaiIAQQAgDCAAIAxJG2shCCAGQQFqIQYgCSATaiAAIAxPaiIJIBFIDQALCyAQIAk2AgAgDyAINgIAIAYL4wQZAX0BfAF9AX8BfwF/AX8BfAF8AXwBfwF/AX8BfwF/AX8BfwF9AX8BfwF/AX8BfwF9AXwgAUECdCIBIAAoAkBqIhEoAgAhCwJAIAAoAjwgAWoiEigCACIMIAMoAgAiE04NACAAKAIoIRQgACgCJCEVIAAoAlwhFiAAKAIMIgqzIRcgBSgCACIDQQAgA0EAShshECAAKAIYIhhBAUghGQNAIAkgEEYEQCAQIQkMAgsgACgCMCIFIAtsIgMgAyAKbiIDIApsa7MgF5UhBgJAIBkEQEQAAAAAAAAAACEHRAAAAAAAAAAAIQ1EAAAAAAAAAAAhDkQAAAAAAAAAACEPDAELIAIgDEECdGohGkEEIANrIRsgACgCTCEcQQAhA0QAAAAAAAAAACEPRAAAAAAAAAAAIQ5EAAAAAAAAAAAhDUQAAAAAAAAAACEHA0AgDiAaIANBAnRqKgIAIgggHCAbIANBAWoiAyAFbGpBAnRqIgEqAgCUu6AhDiAPIAggASoCBJS7oCEPIA0gCCABQQRrKgIAlLugIQ0gByAIIAFBCGsqAgCUu6AhByADIBhHDQALCyAEIAkgFmxBAnRqIAcgBiAGIAZDiqsqPpQiCJSUIh0gCJO7Ih6iIA0gBiAGIAZDAAAAP5SUIgiSIAYgCJSTuyIHoqAgDkQAAAAAAADwPyAeoSAHoSAIIAZDO6qqvpSSIB2TuyIHoba7oqAgDyAHoqC2OAIAIAsgFGoiA0EAIAogAyAKSRtrIQsgCUEBaiEJIAwgFWogAyAKT2oiDCATSA0ACwsgEiAMNgIAIBEgCzYCACAJC70EGQF9AX0BfwF9AX8BfwF/AX0BfQF9AX8BfwF/AX8BfwF/AX8BfQF/AX8BfwF/AX8BfQF9IAFBAnQiASAAKAJAaiIRKAIAIQsCQCAAKAI8IAFqIhIoAgAiDCADKAIAIhNODQAgACgCKCEUIAAoAiQhFSAAKAJcIRYgACgCDCIKsyEXIAUoAgAiA0EAIANBAEobIRAgACgCGCIYQQFIIRkDQCAIIBBGBEAgECEIDAILIAAoAjAiBSALbCIDIAMgCm4iAyAKbGuzIBeVIQcCQCAZBEBDAAAAACEJQwAAAAAhDUMAAAAAIQ5DAAAAACEPDAELIAIgDEECdGohGkEEIANrIRsgACgCTCEcQQAhA0MAAAAAIQ9DAAAAACEOQwAAAAAhDUMAAAAAIQkDQCAOIBogA0ECdGoqAgAiBiAcIBsgA0EBaiIDIAVsakECdGoiASoCAJSSIQ4gDyAGIAEqAgSUkiEPIA0gBiABQQRrKgIAlJIhDSAJIAYgAUEIayoCAJSSIQkgAyAYRw0ACwsgBCAIIBZsQQJ0aiAHIAcgB0OKqyo+lCIGlJQiHSAGkyIeIAmUIAcgByAHQwAAAD+UlCIGkiAHIAaUkyIJIA2UkiAORAAAAAAAAPA/IB67oSAJu6EgBiAHQzuqqr6UkiAdkyIGu6G2lJIgBiAPlJI4AgAgCyAUaiIDQQAgCiADIApJG2shCyAIQQFqIQggDCAVaiADIApPaiIMIBNIDQALCyASIAw2AgAgESALNgIAIAgL1QEIAX8BfwF/AX8BfwF/AX8BfyABQQJ0IgYgACgCQGoiCCgCACEHQQAhAQJAIAAoAjwgBmoiCSgCACIGIAMoAgAiCk4NACAAKAIMIQMgACgCKCELIAAoAiQhDCAAKAJcIQ0gBSgCACIBQQAgAUEAShshBUEAIQEDQCABIAVGBEAgBSEBDAILIAQgASANbEECdGpBADYCACAHIAtqIgBBACADIAAgA0kbayEHIAFBAWohASAGIAxqIAAgA09qIgYgCkgNAAsLIAkgBjYCACAIIAc2AgAgAQspACAAKAJIEBEgACgCTBARIAAoAjwQESAAKAJEEBEgACgCQBARIAAQEQuUDBEBfwF/AX8BfwF/AX8BfwF/AX8BfwF/AX8BfwF/AX8BfwF/IwBBEGsiCyQAIAAoAhgiEkEBayEOIAAoAkgiFCAAKAIcIhMgAWwiFUECdGohCSAAKAJYIRAgBSgCACEPIAMoAgAhEQJAIAFBAnQiBiAAKAJEaiIIKAIABEAgCyAPNgIMIAsgCCgCADYCCCAAQQE2AjggACABIAkgC0EIaiAEIAtBDGogACgCVBEGACEHIAAoAjwgBmoiBigCACIMIAsoAggiCEgEQCALIAw2AgggDCEICyALIAc2AgwgBiAGKAIAIAhrNgIAIAsoAgghBwJAIBJBAkgNACAOQQNxIQhBACEGIBJBAmtBA08EQCAOQXxxIQwDQCAJIAZBAnRqIAkgBiAHakECdGoqAgA4AgAgCSAGQQFyIgpBAnRqIAkgByAKakECdGoqAgA4AgAgCSAGQQJyIgpBAnRqIAkgByAKakECdGoqAgA4AgAgCSAGQQNyIgpBAnRqIAkgByAKakECdGoqAgA4AgAgBkEEaiEGIAxBBGsiDA0ACwsgCEUNAANAIAkgBkECdGogCSAGIAdqQQJ0aioCADgCACAGQQFqIQYgCEEBayIIDQALCyAAKAJEIAFBAnRqIg0gDSgCACIWIAdrIgo2AgACQCAKRQ0AIApBA3EhDEEAIQYgCygCCCEIIBYgB0F/c2pBA08EQCAKQXxxIQcDQCAJIAYgDmoiCkECdGogCSAIIApqQQJ0aioCADgCACAJIAYgEmoiCkECdGogCSAIIApqQQJ0aioCADgCACAJIAZBAnIgDmoiCkECdGogCSAIIApqQQJ0aioCADgCACAJIAZBA3IgDmoiCkECdGogCSAIIApqQQJ0aioCADgCACAGQQRqIQYgB0EEayIHDQALCyAMRQ0AA0AgCSAGIA5qIgdBAnRqIAkgByAIakECdGoqAgA4AgAgBkEBaiEGIAxBAWsiDA0ACwsgDyALKAIMIgZrIQ8gDSgCAA0BIAQgACgCXCAGbEECdGohBAsgEUUNACAPRQ0AIBMgDmshEyASIBVqQQJ0IBRqQQRrIRQDQCALIBMgESARIBNLGyIHNgIMIAsgDzYCCAJAIAIEQCAHRQ0BIAdBA3EhCEEAIQYgB0EBa0EDTwRAIAdBfHEhBwNAIAkgBiAOakECdGogAiAGIBBsQQJ0aioCADgCACAJIAYgEmpBAnRqIAIgBkEBciAQbEECdGoqAgA4AgAgCSAGQQJyIgwgDmpBAnRqIAIgDCAQbEECdGoqAgA4AgAgCSAGQQNyIgwgDmpBAnRqIAIgDCAQbEECdGoqAgA4AgAgBkEEaiEGIAdBBGsiBw0ACwsgCEUNAQNAIAkgBiAOakECdGogAiAGIBBsQQJ0aioCADgCACAGQQFqIQYgCEEBayIIDQALDAELIAdFDQAgFEEAIAdBAnQQDhoLIABBATYCOCAAKAIYIQogACABIAAoAkggACgCHCABbEECdGoiCCALQQxqIAQgC0EIaiAAKAJUEQYAIQwgACgCPCABQQJ0aiIGKAIAIg0gCygCDCIHSARAIAsgDTYCDCANIQcLIAsgDDYCCCAGIAYoAgAgB2s2AgAgCygCDCIHIQYgCkECTgRAIApBAWsiDUEDcSEMQQAhBiAKQQJrQQNPBEAgDUF8cSEKA0AgCCAGQQJ0aiAIIAYgB2pBAnRqKgIAOAIAIAggBkEBciINQQJ0aiAIIAcgDWpBAnRqKgIAOAIAIAggBkECciINQQJ0aiAIIAcgDWpBAnRqKgIAOAIAIAggBkEDciINQQJ0aiAIIAcgDWpBAnRqKgIAOAIAIAZBBGohBiAKQQRrIgoNAAsLIAwEQANAIAggBkECdGogCCAGIAdqQQJ0aioCADgCACAGQQFqIQYgDEEBayIMDQALCyALKAIMIQYLIA8gCygCCCIIayEPIBEgB2siEUUNASACIAYgEGxBAnRqQQAgAhshAiAEIAAoAlwgCGxBAnRqIQQgDw0ACwsgAyADKAIAIBFrNgIAIAUgBSgCACAPazYCACAAKAJUIQYgC0EQaiQAIAZBBUYLtQEGAX8BfwF/AX8BfwF/IAAoAlwhBiACKAIAIQcgBCgCACEIIAAgACgCFCIFNgJcIAAoAlghCSAAIAU2AlggBQRAQQAhBQNAIAQgCDYCACACIAc2AgACQCABBEAgACAFIAEgBUECdCIKaiACIAMgCmogBBAoGgwBCyAAIAVBACACIAMgBUECdGogBBAoGgsgBUEBaiIFIAAoAhRJDQALCyAAIAY2AlwgACAJNgJYIAAoAlRBBUYLZwIBfwF/AkBBGCAAZyIBayICRQ0AIABB/wBNBEAgACABQRhrdCAAQTggAWt2ciEADAELIAAgAUEIanQgACACdnIhAAsgAEH/AHEiACABQQd0ayAAQYABIABrbEGzAWxBEHZqQYAfagulAggBfwF/AX8BfwF/AX8BfwF/IARBAk4EQCAEQQF2IQkgASgCBCEFIAEoAgAhBkEAIQQDQCACIARBAXQiCmpB//8BQYCAfiAAIARBAnRqIgcuAQJBCnQiCyAFayIIQf//A3FBpNQAbEEQdiAIQRB1QaTUAGxqIgggBWoiDCAHLgEAQQp0IgUgBmsiBkH//wNxQZ7CfmxBEHUgBkEQdUGewn5saiAFaiIHaiIFQQp2QQFqQQF2IAVBgPj/X0gbIAVB//f/H0obOwEAIAMgCmpB//8BQYCAfiAMIAdrIgVBCnZBAWpBAXYgBUGA+P9fSBsgBUH/9/8fShs7AQAgCCALaiEFIAYgB2ohBiAEQQFqIgQgCUcNAAsgASAFNgIEIAEgBjYCAAsLBAAgAAsLACAAKAI8ECwQAgsUACAARQRAQQAPCxAMIAA2AgBBfwvgAgcBfwF/AX8BfwF/AX8BfyMAQSBrIgMkACADIAAoAhwiBDYCECAAKAIUIQUgAyACNgIcIAMgATYCGCADIAUgBGsiATYCFCABIAJqIQZBAiEHIANBEGohAQJ/AkACQCAAKAI8IANBEGpBAiADQQxqEAMQLkUEQANAIAYgAygCDCIERg0CIARBf0wNAyABIAQgASgCBCIISyIFQQN0aiIJIAQgCEEAIAUbayIIIAkoAgBqNgIAIAFBDEEEIAUbaiIJIAkoAgAgCGs2AgAgBiAEayEGIAAoAjwgAUEIaiABIAUbIgEgByAFayIHIANBDGoQAxAuRQ0ACwsgBkF/Rw0BCyAAIAAoAiwiATYCHCAAIAE2AhQgACABIAAoAjBqNgIQIAIMAQsgAEEANgIcIABCADcDECAAIAAoAgBBIHI2AgBBACIEIAdBAkYNABogAiABKAIEawshBCADQSBqJAAgBAs7AQF/IwBBEGsiAyQAIAAoAjwgASACQf8BcSADQQhqEJgCEC4hACADKQMIIQEgA0EQaiQAQn8gASAAGwsEAEEBCwMAAQsKACAAQTBrQQpJC+UBAgF/AX8gAkEARyEDAkACQAJAIABBA3FFDQAgAkUNACABQf8BcSEEA0AgAC0AACAERg0CIAJBAWsiAkEARyEDIABBAWoiAEEDcUUNASACDQALCyADRQ0BCwJAIAAtAAAgAUH/AXFGDQAgAkEESQ0AIAFB/wFxQYGChAhsIQQDQCAAKAIAIARzIgNBf3MgA0GBgoQIa3FBgIGChHhxDQEgAEEEaiEAIAJBBGsiAkEDSw0ACwsgAkUNACABQf8BcSEDA0AgAyAALQAARgRAIAAPCyAAQQFqIQAgAkEBayICDQALC0EACwYAQbiYAwuNAgEBf0EBIQMCQCAABEAgAUH/AE0NAQJAEDUoAqgBKAIARQRAIAFBgH9xQYC/A0YNAwwBCyABQf8PTQRAIAAgAUE/cUGAAXI6AAEgACABQQZ2QcABcjoAAEECDwsgAUGAQHFBgMADRyABQYCwA09xRQRAIAAgAUE/cUGAAXI6AAIgACABQQx2QeABcjoAACAAIAFBBnZBP3FBgAFyOgABQQMPCyABQYCABGtB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBA8LCxAMQRk2AgBBfyEDCyADDwsgACABOgAAQQELEwAgAEUEQEEADwsgACABQQAQNgtZAQF/IAAgAC0ASiIBQQFrIAFyOgBKIAAoAgAiAUEIcQRAIAAgAUEgcjYCAEF/DwsgAEIANwIEIAAgACgCLCIBNgIcIAAgATYCFCAAIAEgACgCMGo2AhBBAAvJAQMBfwF/AX8CQAJ/IAIoAhAiA0UEQCACEDgNAiACKAIQIQMLIAEgAyACKAIUIgVrSwsEQCACIAAgASACKAIkEQMADwsCQCACLABLQQBIBEBBACEDDAELIAEhBANAIAQiA0UEQEEAIQMMAgsgACADQQFrIgRqLQAAQQpHDQALIAIgACADIAIoAiQRAwAiBCADSQ0BIAAgA2ohACABIANrIQEgAigCFCEFCyAFIAAgARAPGiACIAIoAhQgAWo2AhQgASADaiEECyAEC4IDAwF/AX8BfyMAQdABayIFJAAgBSACNgLMAUEAIQIgBUGgAWpBAEEoEA4aIAUgBSgCzAE2AsgBAkBBACABIAVByAFqIAVB0ABqIAVBoAFqIAMgBBA7QQBIBEBBfyEBDAELIAAoAkxBAE4EQCAAEDEhAgsgACgCACEGIAAsAEpBAEwEQCAAIAZBX3E2AgALIAZBIHEhBgJ/IAAoAjAEQCAAIAEgBUHIAWogBUHQAGogBUGgAWogAyAEEDsMAQsgAEHQADYCMCAAIAVB0ABqNgIQIAAgBTYCHCAAIAU2AhQgACgCLCEHIAAgBTYCLCAAIAEgBUHIAWogBUHQAGogBUGgAWogAyAEEDsiASAHRQ0AGiAAQQBBACAAKAIkEQMAGiAAQQA2AjAgACAHNgIsIABBADYCHCAAQQA2AhAgACgCFCEDIABBADYCFCABQX8gAxsLIQEgACAAKAIAIgMgBnI2AgBBfyABIANBIHEbIQEgAkUNACAAEDILIAVB0AFqJAAgAQuvERABfwF/AX8BfwF/AX8BfwF/AX8BfwF/AX8BfwF+AX8BfyMAQdAAayIHJAAgByABNgJMIAdBN2ohFiAHQThqIRJBACEBAkADQAJAIBBBAEgNAEH/////ByAQayABSARAEAxBPTYCAEF/IRAMAQsgASAQaiEQCyAHKAJMIgshAQJAAkACQAJAIAstAAAiCARAA0ACQAJAIAhB/wFxIghFBEAgASEIDAELIAhBJUcNASABIQgDQCABLQABQSVHDQEgByABQQJqIgk2AkwgCEEBaiEIIAEtAAIhDCAJIQEgDEElRg0ACwsgCCALayEBIAAEQCAAIAsgARA8CyABDQdBfyERQQEhCCAHKAJMLAABEDMhCSAHKAJMIQECQCAJRQ0AIAEtAAJBJEcNACABLAABQTBrIRFBASETQQMhCAsgByABIAhqIgE2AkxBACEOAkAgASwAACIMQSBrIglBH0sEQCABIQgMAQsgASEIQQEgCXQiCUGJ0QRxRQ0AA0AgByABQQFqIgg2AkwgCSAOciEOIAEsAAEiDEEgayIJQSBPDQEgCCEBQQEgCXQiCUGJ0QRxDQALCwJAIAxBKkYEQCAHAn8CQCAILAABEDNFDQAgBygCTCIILQACQSRHDQAgCCwAAUECdCAEakHAAWtBCjYCACAILAABQQN0IANqQYADaygCACEPQQEhEyAIQQNqDAELIBMNBkEAIRNBACEPIAAEQCACIAIoAgAiAUEEajYCACABKAIAIQ8LIAcoAkxBAWoLIgE2AkwgD0F/Sg0BQQAgD2shDyAOQYDAAHIhDgwBCyAHQcwAahA9Ig9BAEgNBCAHKAJMIQELQX8hCgJAIAEtAABBLkcNACABLQABQSpGBEACQCABLAACEDNFDQAgBygCTCIBLQADQSRHDQAgASwAAkECdCAEakHAAWtBCjYCACABLAACQQN0IANqQYADaygCACEKIAcgAUEEaiIBNgJMDAILIBMNBSAABH8gAiACKAIAIgFBBGo2AgAgASgCAAVBAAshCiAHIAcoAkxBAmoiATYCTAwBCyAHIAFBAWo2AkwgB0HMAGoQPSEKIAcoAkwhAQtBACEIA0AgCCEJQX8hDSABLAAAQcEAa0E5Sw0JIAcgAUEBaiIMNgJMIAEsAAAhCCAMIQEgCCAJQTpsakHf1wBqLQAAIghBAWtBCEkNAAsCQAJAIAhBE0cEQCAIRQ0LIBFBAE4EQCAEIBFBAnRqIAg2AgAgByADIBFBA3RqKQMANwNADAILIABFDQkgB0FAayAIIAIgBhA+IAcoAkwhDAwCCyARQX9KDQoLQQAhASAARQ0ICyAOQf//e3EiFSAOIA5BgMAAcRshCEEAIQ1Byy0hESASIQ4CQAJAAkACfwJAAkACQAJAAn8CQAJAAkACQAJAAkACQCAMQQFrLAAAIgFBX3EgASABQQ9xQQNGGyABIAkbIgFB2ABrDiEEFRUVFRUVFRUOFQ8GDg4OFQYVFRUVAgUDFRUJFQEVFQQACwJAIAFBwQBrDgcOFQsVDg4OAAsgAUHTAEYNCQwTCyAHKQNAIRRByy0MBQtBACEBAkACQAJAAkACQAJAAkAgCUH/AXEOCAABAgMEGwUGGwsgBygCQCAQNgIADBoLIAcoAkAgEDYCAAwZCyAHKAJAIBCsNwMADBgLIAcoAkAgEDsBAAwXCyAHKAJAIBA6AAAMFgsgBygCQCAQNgIADBULIAcoAkAgEKw3AwAMFAsgCkEIIApBCEsbIQogCEEIciEIQfgAIQELIAcpA0AgEiABQSBxED8hCyAHKQNAUA0DIAhBCHFFDQMgAUEEdkHLLWohEUECIQ0MAwsgBykDQCASEEAhCyAIQQhxRQ0CIAogEiALayIBQQFqIAEgCkgbIQoMAgsgBykDQCIUQn9XBEAgB0IAIBR9IhQ3A0BBASENQcstDAELIAhBgBBxBEBBASENQcwtDAELQc0tQcstIAhBAXEiDRsLIREgFCASEEEhCwsgCEH//3txIAggCkF/ShshCAJAIAcpA0AiFEIAUg0AIAoNAEEAIQogEiELDAwLIAogFFAgEiALa2oiASABIApIGyEKDAsLIAcoAkAiAUGX1AAgARsiC0EAIAoQNCIBIAogC2ogARshDiAVIQggASALayAKIAEbIQoMCwsgCgRAIAcoAkAMAgtBACEBIABBICAPQQAgCBBCDAILIAdBADYCDCAHIAcpA0A+AgggByAHQQhqNgJAQX8hCiAHQQhqCyEJQQAhAQJAA0AgCSgCACIMRQ0BAkAgB0EEaiAMEDciDEEASCILDQAgDCAKIAFrSw0AIAlBBGohCSAKIAEgDGoiAUsNAQwCCwtBfyENIAsNDAsgAEEgIA8gASAIEEIgAUUEQEEAIQEMAQtBACEJIAcoAkAhDANAIAwoAgAiC0UNASAHQQRqIAsQNyILIAlqIgkgAUoNASAAIAdBBGogCxA8IAxBBGohDCABIAlLDQALCyAAQSAgDyABIAhBgMAAcxBCIA8gASABIA9IGyEBDAkLIAAgBysDQCAPIAogCCABIAURIwAhAQwICyAHIAcpA0A8ADdBASEKIBYhCyAVIQgMBQsgByABQQFqIgk2AkwgAS0AASEIIAkhAQwACwALIBAhDSAADQUgE0UNA0EBIQEDQCAEIAFBAnRqKAIAIggEQCADIAFBA3RqIAggAiAGED5BASENIAFBAWoiAUEKRw0BDAcLC0EBIQ0gAUEKTw0FA0AgBCABQQJ0aigCAA0BIAFBAWoiAUEKRw0ACwwFC0F/IQ0MBAsLIABBICANIA4gC2siDCAKIAogDEgbIg5qIgkgDyAJIA9KGyIBIAkgCBBCIAAgESANEDwgAEEwIAEgCSAIQYCABHMQQiAAQTAgDiAMQQAQQiAAIAsgDBA8IABBICABIAkgCEGAwABzEEIMAQsLQQAhDQsgB0HQAGokACANCxcAIAAtAABBIHFFBEAgASACIAAQORoLC0YDAX8BfwF/IAAoAgAsAAAQMwRAA0AgACgCACICLAAAIQMgACACQQFqNgIAIAMgAUEKbGpBMGshASACLAABEDMNAAsLIAELuwIAAkAgAUEUSw0AAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4KAAECAwQFBgcICQoLIAIgAigCACIBQQRqNgIAIAAgASgCADYCAA8LIAIgAigCACIBQQRqNgIAIAAgATQCADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATUCADcDAA8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASkDADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASsDADkDAA8LIAAgAiADEQkACws9AQF/IABQRQRAA0AgAUEBayIBIACnQQ9xQfDbAGotAAAgAnI6AAAgAEIPViEDIABCBIghACADDQALCyABCzUBAX8gAFBFBEADQCABQQFrIgEgAKdBB3FBMHI6AAAgAEIHViECIABCA4ghACACDQALCyABC4cBBAF/AX4BfwF/AkAgAEKAgICAEFQEQCAAIQMMAQsDQCABQQFrIgEgACAAQgqAIgNCCn59p0EwcjoAACAAQv////+fAVYhAiADIQAgAg0ACwsgA6ciAgRAA0AgAUEBayIBIAIgAkEKbiIEQQpsa0EwcjoAACACQQlLIQUgBCECIAUNAAsLIAELbwEBfyMAQYACayIFJAACQCAEQYDABHENACACIANMDQAgBSABQf8BcSACIANrIgJBgAIgAkGAAkkiAxsQDhogA0UEQANAIAAgBUGAAhA8IAJBgAJrIgJB/wFLDQALCyAAIAUgAhA8CyAFQYACaiQACw4AIAAgASACQQBBABA6CycBAX8jAEEQayIDJAAgAyACNgIMIAAgASACEEMhAiADQRBqJAAgAgvqAgIBfwF/AkAgACABRg0AIAEgACACaiIDa0EAIAJBAXRrTQRAIAAgASACEA8PCyAAIAFzQQNxIQQCQAJAIAAgAUkEQCAEBEAgACEDDAMLIABBA3FFBEAgACEDDAILIAAhAwNAIAJFDQQgAyABLQAAOgAAIAFBAWohASACQQFrIQIgA0EBaiIDQQNxDQALDAELAkAgBA0AIANBA3EEQANAIAJFDQUgACACQQFrIgJqIgMgASACai0AADoAACADQQNxDQALCyACQQNNDQADQCAAIAJBBGsiAmogASACaigCADYCACACQQNLDQALCyACRQ0CA0AgACACQQFrIgJqIAEgAmotAAA6AAAgAg0ACwwCCyACQQNNDQADQCADIAEoAgA2AgAgAUEEaiEBIANBBGohAyACQQRrIgJBA0sNAAsLIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQQFrIgINAAsLIAALNAEBfyMAQRBrIgMkACADIAA2AgggAyACNgIEIAMgATYCAEGgKygCAEHu1wAgAxBEGhAEAAtfAAJ/AkACQAJAIABB//wATARAIABBwD5GDQEgAEHg3QBHDQJBBA8LIABBgP0ARg0CQQEgAEGA9wJGDQMaIABBwLsBRw0BQQIPC0EGDwtB39MAQfk1QdQAEEYAC0EDCwvgBREBfQF9AX0BfwF9AX8BfwF/AX8BfwF/AX0BfQF9AX0BfQF9AkACQCAFQwAAAABcDQAgBkMAAAAAXA0AIAAgAUYNASAAIAEgBEECdBBFGg8LQQIgA0EPIANBD0obIgNrIRFBfiADayESIANBf3MhE0EBIANrIRRBACADayEVIAhBDGwiFkGI3ABqKgIAIAaUIRcgFkGE3ABqKgIAIAaUIRggFkGA3ABqKgIAIAaUIRlBACAKIAcgCEYbIAogAkEPIAJBD0obIgggA0YbIAogBSAGWxsiAkEBTgRAIAdBDGwiA0GI3ABqKgIAIAWUIRogA0GE3ABqKgIAIAWUIRsgA0GA3ABqKgIAIAWUIRwgASAUQQJ0aioCACEMIAEgFUECdGoqAgAhDSABIBNBAnRqKgIAIQ4gASASQQJ0aioCACEFQQAhAwNAIAAgA0ECdCIKaiAFIAEgAyARakECdGoqAgAiEJIgFyAJIApqKgIAIgUgBZQiBZSUIAwgDpIgGCAFlJQgDSAZIAWUlCABIApqKgIAIAEgAyAIa0ECdGoiCioCACAcQwAAgD8gBZMiBZSUkiAbIAWUIAoqAgQgCkEEayoCAJKUkiAaIAWUIAoqAgggCkEIayoCAJKUkpKSkjgCACAOIQUgDSEOIAwhDSAQIQwgA0EBaiIDIAJHDQALIAIhDwsgBkMAAAAAWwRAIAAgAUYNASAAIAJBAnQiA2ogASADaiAEIAJrQQJ0EEUaDwsgBCAPayICQQFIDQAgACAPQQJ0IgNqIQAgASADaiIKIBJBAnRqKgIAIQ4gCiATQQJ0aioCACEFIAogFUECdGoqAgAhDCAKIBRBAnRqKgIAIQ1BACEDA0AgACADQQJ0IgFqIBcgDiAKIAMgEWpBAnRqKgIAIhCSlCAYIAUgDZKUIBkgDJQgASAKaioCAJKSkjgCACAFIQ4gDCEFIA0hDCAQIQ0gA0EBaiIDIAJHDQALCwuVAQgBfwF/AX8BfwF/AX8BfwF/IAAoAggiBUEBTgRAIAMgAkEBdGpBAWshByAAKAJoIQggACgCICIJLwEAIQYDQCAGQRB0IQogASAEQQJ0aiAIIAUgB2wgBGpqLQAAQUBrIAkgBEEBaiILQQF0ai4BACIGIApBEHVrIAJ0IANsbEECdTYCACAAKAIIIgUgCyIESg0ACwsLfwEBfwJ/IABBf0wEQEEAIABBwX5IDQEaQQAgAGsiAEEDdkH8////AXEiAUHQ3ABqKAIAIAFB8NwAai4BACAAQR9xbGsPC0H//wEiASAAQb8BSg0AGiAAQQN2Qfz///8BcSIBQfDcAGouAQAgAEEfcWwgAUGQ3QBqKAIAagsiAQueAQAgAEIANwIAIABCgICAgIDxBDcCOCAAQgA3AiAgAEIANwIYIABCADcCECAAQgA3AgggAEKZgICAgAI3AmAgAELxtrSAkNyeCjcCUCAAQUBrQsSTgICAyAE3AgAgAEKMgICA8AE3AmggAEKBne2AoAY3AlggAEKwiYCAgLejAzcCSCAAQoDIgYCAgBk3AiggAEKAyIGAgIAZNwIwQQAL4hsTAX8BfwF/AX8BfwF/AX8BfwF/AX8BfwF/AX8BfwF/AX8BfwF/AX8jAEEwayIEIQkgBCQAAkACQCAAKALoIyIDQcECSARAIAMgA0F4cUcNASAJQQA2AgAgCSADQQN1IgUgA0ECdSICaiIGNgIEIAkgBSAGaiIHNgIIIAkgAiAHaiIINgIMIAQgCCADQQF1IgpqQQF0QQ9qQXBxayIEJAAgASAAQSRqIAQgBCAIQQF0aiAAKALoIxArIAQgAEEsaiAEIAQgB0EBdGogChArIAQgAEE0aiAEIAQgBkEBdGogAhArIAQgBUEBayIGQQF0aiICIAIuAQBBAXUiCDsBAAJAIANBEEgNACAGQQEgBkEBSBsiA0EBaiEHAkAgBSADa0EBcUUEQCAIIQIgBiEDDAELIAQgBUECayIDQQF0aiICIAIuAQBBAXUiAjsBACAEIAZBAXRqIAggAms7AQALIAUgB0YNAANAIAQgA0EBdGoiB0ECayIFIAUuAQBBAXUiBjsBACAHIAIgBms7AQAgBCADQQJrIgdBAXRqIgIgAi4BAEEBdSICOwEAIAUgBiACazsBACADQQJKIQUgByEDIAUNAAsLIAQgBC8BACAAQdwAaiIDLwEAazsBACAAIAg7AVwDQCALQQJ0IgMgCUEgamohDyAAIANqIhRBPGoiECgCACEBAkAgACgC6CNBBCALayICQQMgAkEDSRt1IgxBA0oiEUUEQCABQf////8HIAFBf0obIQpBACEDDAELIAxBAnUiCEEBIAhBAUobIg1BAXEhDiADIAlqIhIoAgAhBQJAIA1BAWsiE0UEQEEAIQNBACECDAELIA1B/v///wdxIQZBACEDQQAhAgNAIAQgA0EBciAFakEBdGouAQBBA3UiByAHbCAEIAMgBWpBAXRqLgEAQQN1IgcgB2wgAmpqIQIgA0ECaiEDIAZBAmsiBg0ACwsCfyAOBEAgBCADIAVqQQF0ai4BAEEDdSIDIANsIAJqIQILIAEgAmoiAwtB/////wcgA0F/ShshCkEAIQMgEUUNACASKAIAIQUCQCATRQRAQQAhAgwBCyANQf7///8HcSEGQQAhAgNAIAQgA0EBciAIaiAFakEBdGouAQBBA3UiByAHbCAEIAMgCGogBWpBAXRqLgEAQQN1IgcgB2wgAmpqIQIgA0ECaiEDIAZBAmsiBg0ACwsCfyAOBEAgBCADIAhqIAVqQQF0ai4BAEEDdSIDIANsIAJqIQILIAIgCmoiAwtB/////wcgA0F/ShshCkEAIQMgDEEESCIMDQAgCEEBdCEFIBIoAgAhBgJAIBNFBEBBACECDAELIA1B/v///wdxIQdBACECA0AgBCADQQFyIAVqIAZqQQF0ai4BAEEDdSIBIAFsIAQgAyAFaiAGakEBdGouAQBBA3UiASABbCACamohAiADQQJqIQMgB0ECayIHDQALCwJ/IA4EQCAEIAMgBWogBmpBAXRqLgEAQQN1IgMgA2wgAmohAgsgAiAKaiIDC0H/////ByADQX9KGyEKQQAhAyAMDQAgCEEDbCEFIBIoAgAhBgJAIBNFBEBBACECDAELIA1B/v///wdxIQdBACECA0AgBCACQQFyIAVqIAZqQQF0ai4BAEEDdSIIIAhsIAQgAiAFaiAGakEBdGouAQBBA3UiCCAIbCADamohAyACQQJqIQIgB0ECayIHDQALCyAORQ0AIAQgAiAFaiAGakEBdGouAQBBA3UiAiACbCADaiEDCyAPIAogA0EBdmoiAkH/////ByACQX9KGzYCACAUIAM2AjwgC0EBaiILQQRHDQALDAILQbIwQcs8QegAEEYAC0Gy1gBByzxB6gAQRgALQQAhAyAAKAKQASIEQecHTARAIAAgBEEBajYCkAFB//8BIARBBHVBAWptIQMLQYABIQRB/////wcgCSgCICIMIAAoAoABaiICQf////8HIAJBf0obIgZuIQUCf0GAASICIAYgACgCYCIHQQN0Sg0AGkGACCICIAYgB0gNABogB0EQdEEQdSICIAVBEHZsIAUgB0EPdUEBakEBdWxqIAVB//8DcSACbEEQdWoiAkEFdUGAcHEgAkEFdkH/D3FyCyECIABB8ABqIgYgAiADIAIgA0obQRB0QRB1IgIgBSAAKAJwIgZrIgVBEHVsIAZqIAIgBUH//wNxbEEQdWoiAjYCACAAQf////8HIAJtIgJB////ByACQf///wdIGyIFNgJgQf////8HIAkoAiQiDSAAKAKEAWoiAkH/////ByACQX9KGyIGbiECAkAgBiAAKAJkIgdBA3RKDQBBgAghBCAGIAdIDQAgB0EQdEEQdSIEIAJBEHZsIAIgB0EPdUEBakEBdWxqIAJB//8DcSAEbEEQdWoiBEEFdUGAcHEgBEEFdkH/D3FyIQQLIABB9ABqIgYgBCADIAMgBEgbQRB0QRB1IgQgAiAAKAJ0IgZrIgJBEHVsIAZqIAQgAkH//wNxbEEQdWoiBDYCACAAQf////8HIARtIgRB////ByAEQf///wdIGzYCZEH/////ByAJKAIoIhEgACgCiAFqIgRB/////wcgBEF/ShsiB24hBkGAASEEAn9BgAEiAiAHIAAoAmgiCEEDdEoNABpBgAgiAiAHIAhIDQAaIAhBEHRBEHUiAiAGQRB2bCAGIAhBD3VBAWpBAXVsaiAGQf//A3EgAmxBEHVqIgJBBXVBgHBxIAJBBXZB/w9xcgshAiAAQfgAaiIHIAIgAyACIANKG0EQdEEQdSICIAYgACgCeCIHayIGQRB1bCAHaiACIAZB//8DcWxBEHVqIgI2AgAgAEH/////ByACbSICQf///wcgAkH///8HSBs2AmhB/////wcgCSgCLCIOIAAoAowBaiICQf////8HIAJBf0obIgZuIQICQCAGIAAoAmwiB0EDdEoNAEGACCEEIAYgB0gNACAHQRB0QRB1IgQgAkEQdmwgAiAHQQ91QQFqQQF1bGogAkH//wNxIARsQRB1aiIEQQV1QYBwcSAEQQV2Qf8PcXIhBAsgAEH8AGoiBiAEIAMgAyAESBtBEHRBEHUiAyACIAAoAnwiBGsiAkEQdWwgBGogAyACQf//A3FsQRB1aiIDNgIAIABB/////wcgA20iA0H///8HIANB////B0gbNgJsQQAhByAMIQJBACEGQQAhAwNAAkAgAiAFayIEQQFOBEAgA0ECdCIIIAlBEGpqIAJBCHQgAiACQYCAgARJIgEbIAUgBUEIdSABG0EBam0iAjYCACAGIAIQKkEQdEGAgIAga0EQdSICIAJsIgFqIQYgBEH//z9MBEAgBGciBUEYayEQAn8gBCILQRggBWsiCkUNABogBCAQdCAEQTggBWt2ciAEQf8ATQ0AGiAEIAVBCGp0IAQgCnZyCyILQf8AcUGAgNQGbEEQdkGAgAJBhukCIAVBAXEbIAVBAXZ2IgtsQRB2IAtqQQp2IAJsIQ8CQCAKRQ0AIARB/wBNBEAgBCAQdCAEQTggBWt2ciEEDAELIAQgBUEIanQgBCAKdnIhBAsgBEH/AHFBgIDUBmxBEHYgC2xBEHYgC2pBBnRBwP8DcSACbCAPQRB0akEQdSECCyAIQbDdAGooAgAiBEEQdSACbCAHaiAEQf//A3EgAmxBEHVqIQcMAQsgCUEQaiADQQJ0akGAAjYCAAsgA0EBaiIDQQRHBEAgA0ECdCIEIAlBIGpqKAIAIQIgACAEaigCYCEFDAELCyAGQQRtIQNBgH8hBAJ/IAZBBE4EQAJAQRggA2ciBGsiAkUNACADQf8ATQRAIAMgBEEYa3QgA0E4IARrdnIhAwwBCyADIARBCGp0IAMgAnZyIQMLIANB/wBxQYCA1AZsQRB2QYCAAkGG6QIgBEEBcRsgBEEBdnYiA2xBEHYgA2pBgIAMbEEQdUHI3wJsQRB1QYABayEECyAECxBKIQMgACAHEEpBAXRBgIACazYC6CQCQCANIAAoAmRrQQN1QX5xIAwgACgCYGtBBHVqIBEgACgCaGtBBHVBA2xqIA4gACgCbGtBAnVBfHFqIAAoAugjIgQgACgC4CMiAkEUbEZ1IgVBAEwEQCADQQF1IQMMAQsgBUH//wBKDQAgA0EQdEEQdSIDQYCAAkGG6QIgBUEQdCIGZyIFQQFxGyAFQQF2diIHIAcgBkEYIAVrdkH/AHFBgIDUBmxBEHZsQRB2akGAgAJqIgVB//8DcWxBEHUgBUEQdiADbGohAwsgACADQQd1IgVB/wEgBUH/AUgbNgK0IyAAQcwAaiIFIAMgA0EQdEEQdWxBFUEUIAQgAkEKbEYbdSIDIAkoAhAgACgCTCIFayIGQRB1bCAFaiAGQf//A3EgA2xBEHVqIgQ2AgAgACAEECpBA2xBgChrQQR1EEo2AtgkIABB0ABqIgQgCSgCFCAAKAJQIgRrIgJBEHUgA2wgBGogAkH//wNxIANsQRB1aiIENgIAIABB3CRqIAQQKkEDbEGAKGtBBHUQSjYCACAAQdQAaiIEIAkoAhggACgCVCIEayICQRB1IANsIARqIAJB//8DcSADbEEQdWoiBDYCACAAQeAkaiAEECpBA2xBgChrQQR1EEo2AgAgAEHYAGoiBCAJKAIcIAAoAlgiBGsiAkEQdSADbCAEaiACQf//A3EgA2xBEHVqIgM2AgAgAEHkJGogAxAqQQNsQYAoa0EEdRBKNgIAIAlBMGokAEEAC0QAIABBAEHQzgAQDiIAIAE2AuQnQYCA8AEQKiEBIABBATYCuCQgACABQQh0QYCAIGsiATYCDCAAIAE2AgggAEEkahBLC5cEAwF/AX8BfwJAAkACQAJAAkACQAJAAkACQAJAIAAEQAJAIAAoAggiAUG/uwFMBEAgAUHAPkYNASABQeDdAEYNASABQYD9AEcNDAwBCyABQcPYAkwEQCABQcC7AUYNASABQYD6AUYNAQwMCyABQYD3AkYNACABQcTYAkcNCwsCQCAAKAIUIgFBwD5GDQAgAUGA/QBGDQAgAUHg3QBHDQsLAkAgACgCDCIDQcA+Rg0AIANBgP0ARg0AIANB4N0ARw0LCwJAIAAoAhAiAkHAPkYNACACQYD9AEYNACACQeDdAEcNCwsgASACSA0KIAEgA0oNCiACIANKDQoCQAJAIAAoAhgiAUEKaw4LAQMDAwMDAwMDAwEACyABQShGDQAgAUE8Rw0CCyAAKAIgQeUATw0CIAAoAjBBAk8NAyAAKAI0QQJPDQQgACgCKEECTw0FIAAoAgAiAUEBa0ECTw0GIAAoAgQiAkEBa0ECTw0HIAEgAkgNCCAAKAIkQQtPDQlBAA8LQeM/QdI1QSkQRgALQd/TAEHSNUHFABBGAAtB39MAQdI1QckAEEYAC0Hf0wBB0jVBzQAQRgALQd/TAEHSNUHRABBGAAtB39MAQdI1QdUAEEYAC0Hf0wBB0jVB2QAQRgALQd/TAEHSNUHdABBGAAtB39MAQdI1QeEAEEYAC0Hf0wBB0jVB5QAQRgALQd/TAEHSNUE+EEYAC6EDBAF/AX8BfwF/An8gACgC4CMiAkUEQCAAKAIgIQILIAJBEHQiA0ULBEAgACgC3CMiAiAAKALMIyIAIAAgAkobQegHbQ8LIAAoAtQjIQQCQAJAIANBEHVB6AdsIgMgACgCzCMiBUoNACADIARKDQAgAyAAKALYI04NAQsgBSAEIAQgBUobIgIgACgC2CMiACAAIAJIG0HoB20PCyAAKAIYIgVBgAJOBEAgAEEANgIcCwJAAkAgACgCuCNFBEAgASgCQEUNAQsgACgC3CMiBCADSARAAkACQCAAKAIcBEAgASgCQA0BIAVBAEoNAgwFCyAAQgA3AhAgAEGAAjYCGCABKAJARQ0BCyAAQQA2AhxBDEEIIAJBEEYbDwsgAEF+NgIcIAIPCyADIARIBEAgASgCQARAIABCADcCECAAQoCAgIAQNwIYQQxBECACQQhGGw8LIAAoAhxFBEAMAwsgAEEBNgIcIAIPCyAAKAIcQX9KDQAgAEEBNgIcCyACDwsgAUEBNgJYIAEgASgCOCIAIABBBWwgASgCGEEFam1rNgI4IAIL8QMPAX8BfwF/AX8BfwF/AX8BfwF/AX8BfwF/AX8BfwF/IANBAU4EQCAAKAIUIQYgACgCECEHIAAoAgwhBCAAKAIIIQogACgCBCEIIAAoAgAhBQNAIAEgCUECdGoiDUH//wEgAiAJQQF0ai4BAEEKdCILIARrIgxB//8DcUHGNWxBEHYgDEEQdUHGNWxqIgwgBGoiDiAHayIEQf//A3FBqckBbEEQdiAEQRB1QanJAWxqIg8gB2oiBCAGayIHQf//A3FB9rF/bEEQdSAHQRB1Qfaxf2xqIARqIgRBCXVBAWpBAXUiBkGAgH4gBkGAgH5KGyAEQf/7/w9KGzsBAiANQf//ASALIAVrIgZB//8DcUHSDWxBEHYgBkEQdUHSDWxqIhAgBWoiESAIayIFQf//A3FB
gitextract_eb05weoo/ ├── .circleci/ │ └── config.yml ├── .gitignore ├── .gitmodules ├── LICENSE.md ├── Makefile ├── README.md ├── dist/ │ └── decoderWorker.min.wasm ├── dist-unminified/ │ ├── decoderWorker.js │ ├── decoderWorker.wasm │ ├── encoderWorker.js │ ├── recorder.js │ └── waveWorker.js ├── example/ │ ├── decoder.html │ ├── encoder.html │ ├── fileEncoder.html │ ├── mono.opus │ └── waveRecorder.html ├── package.json ├── src/ │ ├── decoderWorker.js │ ├── encoderWorker.js │ ├── recorder.js │ └── waveWorker.js ├── test/ │ ├── decoderWorker.js │ ├── encoderWorker.js │ ├── recorder.js │ ├── sample/ │ │ ├── joinedMono.opus │ │ ├── mono.opus │ │ └── stereo.opus │ └── waveWorker.js ├── test.js └── webpack.config.js
SYMBOL INDEX (174 symbols across 8 files)
FILE: dist-unminified/decoderWorker.js
function __webpack_require__ (line 35) | function __webpack_require__(moduleId) {
function locateFile (line 176) | function locateFile(path) {
function logExceptionOnExit (line 196) | function logExceptionOnExit(e) {
function getNativeTypeSize (line 380) | function getNativeTypeSize(type) {
function warnOnce (line 402) | function warnOnce(text) {
function convertJsFunctionToWasm (line 414) | function convertJsFunctionToWasm(func, sig) {
function getEmptyTableSlot (line 502) | function getEmptyTableSlot() {
function addFunctionWasm (line 520) | function addFunctionWasm(func, sig) {
function removeFunction (line 558) | function removeFunction(index) {
function addFunction (line 565) | function addFunction(func, sig) {
function setValue (line 615) | function setValue(ptr, value, type, noSafe) {
function getValue (line 633) | function getValue(ptr, type, noSafe) {
function assert (line 668) | function assert(condition, text) {
function getCFunc (line 675) | function getCFunc(ident) {
function ccall (line 686) | function ccall(ident, returnType, argTypes, args, opts) {
function cwrap (line 739) | function cwrap(ident, returnType, argTypes, opts) {
function allocate (line 764) | function allocate(slab, allocator) {
function UTF8ArrayToString (line 796) | function UTF8ArrayToString(heap, idx, maxBytesToRead) {
function UTF8ToString (line 851) | function UTF8ToString(ptr, maxBytesToRead) {
function stringToUTF8Array (line 868) | function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {
function stringToUTF8 (line 913) | function stringToUTF8(str, outPtr, maxBytesToWrite) {
function lengthBytesUTF8 (line 918) | function lengthBytesUTF8(str) {
function AsciiToString (line 942) | function AsciiToString(ptr) {
function stringToAscii (line 954) | function stringToAscii(str, outPtr) {
function UTF16ToString (line 963) | function UTF16ToString(ptr, maxBytesToRead) {
function stringToUTF16 (line 1003) | function stringToUTF16(str, outPtr, maxBytesToWrite) {
function lengthBytesUTF16 (line 1025) | function lengthBytesUTF16(str) {
function UTF32ToString (line 1029) | function UTF32ToString(ptr, maxBytesToRead) {
function stringToUTF32 (line 1062) | function stringToUTF32(str, outPtr, maxBytesToWrite) {
function lengthBytesUTF32 (line 1089) | function lengthBytesUTF32(str) {
function allocateUTF8 (line 1104) | function allocateUTF8(str) {
function allocateUTF8OnStack (line 1112) | function allocateUTF8OnStack(str) {
function writeStringToMemory (line 1125) | function writeStringToMemory(string, buffer, dontAddNull) {
function writeArrayToMemory (line 1140) | function writeArrayToMemory(array, buffer) {
function writeAsciiToMemory (line 1145) | function writeAsciiToMemory(str, buffer, dontAddNull) {
function alignUp (line 1156) | function alignUp(x, multiple) {
function updateGlobalBufferAndViews (line 1183) | function updateGlobalBufferAndViews(buf) {
function keepRuntimeAlive (line 1223) | function keepRuntimeAlive() {
function preRun (line 1227) | function preRun() {
function initRuntime (line 1239) | function initRuntime() {
function exitRuntime (line 1246) | function exitRuntime() {
function postRun (line 1250) | function postRun() {
function addOnPreRun (line 1262) | function addOnPreRun(cb) {
function addOnInit (line 1266) | function addOnInit(cb) {
function addOnExit (line 1270) | function addOnExit(cb) {
function addOnPostRun (line 1273) | function addOnPostRun(cb) {
function getUniqueRunDependency (line 1300) | function getUniqueRunDependency(id) {
function addRunDependency (line 1304) | function addRunDependency(id) {
function removeRunDependency (line 1313) | function removeRunDependency(id) {
function abort (line 1337) | function abort(what) {
function isDataURI (line 1378) | function isDataURI(filename) {
function isFileURI (line 1384) | function isFileURI(filename) {
function getBinary (line 1395) | function getBinary(file) {
function getBinaryPromise (line 1411) | function getBinaryPromise() {
function createWasm (line 1446) | function createWasm() {
function callRuntimeCallbacks (line 1551) | function callRuntimeCallbacks(callbacks) {
function demangle (line 1571) | function demangle(func) {
function demangleAll (line 1575) | function demangleAll(text) {
function handleException (line 1585) | function handleException(e) {
function jsStackTrace (line 1597) | function jsStackTrace() {
function stackTrace (line 1614) | function stackTrace() {
function _abort (line 1620) | function _abort() {
function _emscripten_memcpy_big (line 1624) | function _emscripten_memcpy_big(dest, src, num) {
function abortOnCannotGrowMemory (line 1628) | function abortOnCannotGrowMemory(requestedSize) {
function _emscripten_resize_heap (line 1631) | function _emscripten_resize_heap(requestedSize) {
function _fd_close (line 1655) | function _fd_close(fd) {
function _fd_seek (line 1659) | function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
function flush_NO_FILESYSTEM (line 1662) | function flush_NO_FILESYSTEM() {
function _fd_write (line 1669) | function _fd_write(fd, iov, iovcnt, pnum) {
function _setTempRet0 (line 1684) | function _setTempRet0(val) {
function intArrayFromString (line 1692) | function intArrayFromString(stringy, dontAddNull, length) {
function intArrayToString (line 1700) | function intArrayToString(array) {
function ExitStatus (line 1810) | function ExitStatus(status) {
function run (line 1825) | function run(args) {
function exit (line 1871) | function exit(status, implicit) {
function procExit (line 1882) | function procExit(code) {
FILE: dist-unminified/encoderWorker.js
function locateFile (line 54) | function locateFile(path) {
function logExceptionOnExit (line 74) | function logExceptionOnExit(e) {
function getNativeTypeSize (line 287) | function getNativeTypeSize(type) {
function warnOnce (line 309) | function warnOnce(text) {
function convertJsFunctionToWasm (line 321) | function convertJsFunctionToWasm(func, sig) {
function getEmptyTableSlot (line 409) | function getEmptyTableSlot() {
function addFunctionWasm (line 427) | function addFunctionWasm(func, sig) {
function removeFunction (line 465) | function removeFunction(index) {
function addFunction (line 472) | function addFunction(func, sig) {
function setValue (line 522) | function setValue(ptr, value, type, noSafe) {
function getValue (line 540) | function getValue(ptr, type, noSafe) {
function assert (line 575) | function assert(condition, text) {
function getCFunc (line 582) | function getCFunc(ident) {
function ccall (line 593) | function ccall(ident, returnType, argTypes, args, opts) {
function cwrap (line 646) | function cwrap(ident, returnType, argTypes, opts) {
function allocate (line 671) | function allocate(slab, allocator) {
function UTF8ArrayToString (line 703) | function UTF8ArrayToString(heap, idx, maxBytesToRead) {
function UTF8ToString (line 758) | function UTF8ToString(ptr, maxBytesToRead) {
function stringToUTF8Array (line 775) | function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {
function stringToUTF8 (line 820) | function stringToUTF8(str, outPtr, maxBytesToWrite) {
function lengthBytesUTF8 (line 825) | function lengthBytesUTF8(str) {
function AsciiToString (line 849) | function AsciiToString(ptr) {
function stringToAscii (line 861) | function stringToAscii(str, outPtr) {
function UTF16ToString (line 870) | function UTF16ToString(ptr, maxBytesToRead) {
function stringToUTF16 (line 910) | function stringToUTF16(str, outPtr, maxBytesToWrite) {
function lengthBytesUTF16 (line 932) | function lengthBytesUTF16(str) {
function UTF32ToString (line 936) | function UTF32ToString(ptr, maxBytesToRead) {
function stringToUTF32 (line 969) | function stringToUTF32(str, outPtr, maxBytesToWrite) {
function lengthBytesUTF32 (line 996) | function lengthBytesUTF32(str) {
function allocateUTF8 (line 1011) | function allocateUTF8(str) {
function allocateUTF8OnStack (line 1019) | function allocateUTF8OnStack(str) {
function writeStringToMemory (line 1032) | function writeStringToMemory(string, buffer, dontAddNull) {
function writeArrayToMemory (line 1047) | function writeArrayToMemory(array, buffer) {
function writeAsciiToMemory (line 1052) | function writeAsciiToMemory(str, buffer, dontAddNull) {
function alignUp (line 1063) | function alignUp(x, multiple) {
function updateGlobalBufferAndViews (line 1090) | function updateGlobalBufferAndViews(buf) {
function keepRuntimeAlive (line 1130) | function keepRuntimeAlive() {
function preRun (line 1134) | function preRun() {
function initRuntime (line 1146) | function initRuntime() {
function exitRuntime (line 1153) | function exitRuntime() {
function postRun (line 1157) | function postRun() {
function addOnPreRun (line 1169) | function addOnPreRun(cb) {
function addOnInit (line 1173) | function addOnInit(cb) {
function addOnExit (line 1177) | function addOnExit(cb) {
function addOnPostRun (line 1180) | function addOnPostRun(cb) {
function getUniqueRunDependency (line 1207) | function getUniqueRunDependency(id) {
function addRunDependency (line 1211) | function addRunDependency(id) {
function removeRunDependency (line 1220) | function removeRunDependency(id) {
function abort (line 1244) | function abort(what) {
function isDataURI (line 1285) | function isDataURI(filename) {
function isFileURI (line 1291) | function isFileURI(filename) {
function getBinary (line 1302) | function getBinary(file) {
function getBinaryPromise (line 1322) | function getBinaryPromise() {
function instantiateSync (line 1355) | function instantiateSync(file, info) {
function createWasm (line 1377) | function createWasm() {
function callRuntimeCallbacks (line 1442) | function callRuntimeCallbacks(callbacks) {
function demangle (line 1462) | function demangle(func) {
function demangleAll (line 1466) | function demangleAll(text) {
function handleException (line 1476) | function handleException(e) {
function jsStackTrace (line 1488) | function jsStackTrace() {
function stackTrace (line 1505) | function stackTrace() {
function _abort (line 1511) | function _abort() {
function _emscripten_memcpy_big (line 1515) | function _emscripten_memcpy_big(dest, src, num) {
function abortOnCannotGrowMemory (line 1519) | function abortOnCannotGrowMemory(requestedSize) {
function _emscripten_resize_heap (line 1522) | function _emscripten_resize_heap(requestedSize) {
function _fd_close (line 1546) | function _fd_close(fd) {
function _fd_seek (line 1550) | function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
function flush_NO_FILESYSTEM (line 1553) | function flush_NO_FILESYSTEM() {
function _fd_write (line 1560) | function _fd_write(fd, iov, iovcnt, pnum) {
function _setTempRet0 (line 1575) | function _setTempRet0(val) {
function intArrayFromString (line 1583) | function intArrayFromString(stringy, dontAddNull, length) {
function intArrayToString (line 1591) | function intArrayToString(array) {
function intArrayFromBase64 (line 1650) | function intArrayFromBase64(s) {
function tryParseAsDataURI (line 1670) | function tryParseAsDataURI(filename) {
function ExitStatus (line 1748) | function ExitStatus(status) {
function run (line 1763) | function run(args) {
function exit (line 1809) | function exit(status, implicit) {
function procExit (line 1820) | function procExit(code) {
class EncoderWorklet (line 2156) | class EncoderWorklet extends AudioWorkletProcessor {
method constructor (line 2158) | constructor(){
method process (line 2204) | process(inputs) {
method postPage (line 2211) | postPage(pageData) {
FILE: dist-unminified/recorder.js
function __webpack_require__ (line 16) | function __webpack_require__(moduleId) {
FILE: dist-unminified/waveWorker.js
function __webpack_require__ (line 16) | function __webpack_require__(moduleId) {
FILE: src/encoderWorker.js
class EncoderWorklet (line 315) | class EncoderWorklet extends AudioWorkletProcessor {
method constructor (line 317) | constructor(){
method process (line 363) | process(inputs) {
method postPage (line 370) | postPage(pageData) {
FILE: src/waveWorker.js
class EncoderWorklet (line 106) | class EncoderWorklet extends AudioWorkletProcessor {
method constructor (line 108) | constructor(){
method process (line 137) | process(inputs) {
method postPage (line 144) | postPage(pageData) {
FILE: test/encoderWorker.js
function getEncoder (line 23) | function getEncoder(config){
function getPacket (line 37) | function getPacket(page, packetNumber){
function getUTF8String (line 44) | function getUTF8String(data) {
function bufferForFrames (line 193) | function bufferForFrames(amount) {
function getEncoderWithMaxFramesPerPage (line 197) | function getEncoderWithMaxFramesPerPage(value) {
FILE: test/recorder.js
function call (line 62) | function call(e) {
Condensed preview — 31 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,081K chars).
[
{
"path": ".circleci/config.yml",
"chars": 980,
"preview": "# Javascript Node CircleCI 2.0 configuration file\n#\n# Check https://circleci.com/docs/2.0/language-javascript/ for more "
},
{
"path": ".gitignore",
"chars": 40,
"preview": "node_modules/\n\n.DS_Store\n/.idea/\n/*.iml\n"
},
{
"path": ".gitmodules",
"chars": 210,
"preview": "[submodule \"opus\"]\n\tpath = opus\n\turl = https://gitlab.xiph.org/xiph/opus.git\n branch = v1.3.1\n[submodule \"speexdsp\"]\n\tp"
},
{
"path": "LICENSE.md",
"chars": 4602,
"preview": "## Opus Recorder License (MIT)\n\nOriginal Work Copyright © 2013 Matt Diamond\n\nModified Work Copyright © 2014 Christopher "
},
{
"path": "Makefile",
"chars": 4051,
"preview": "INPUT_DIR=./src\nOUTPUT_DIR=./dist\nOUTPUT_DIR_UNMINIFIED=./dist-unminified\nEMCC_OPTS=-O3 -s NO_DYNAMIC_EXECUTION=1 -s NO_"
},
{
"path": "README.md",
"chars": 9672,
"preview": "# Opus & Wave Recorder\n\nA javascript library to encode the output of Web Audio API nodes in Ogg Opus or WAV format using"
},
{
"path": "dist-unminified/decoderWorker.js",
"chars": 86748,
"preview": "\n\n// The Module object: Our interface to the outside world. We import\n// and export values on it. There are various ways"
},
{
"path": "dist-unminified/encoderWorker.js",
"chars": 1814470,
"preview": "\n\n// The Module object: Our interface to the outside world. We import\n// and export values on it. There are various ways"
},
{
"path": "dist-unminified/recorder.js",
"chars": 32888,
"preview": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object"
},
{
"path": "dist-unminified/waveWorker.js",
"chars": 25799,
"preview": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object"
},
{
"path": "example/decoder.html",
"chars": 3364,
"preview": "<!DOCTYPE html>\n\n<html>\n\n<head>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Decode E"
},
{
"path": "example/encoder.html",
"chars": 6878,
"preview": "<!DOCTYPE html>\n\n<html>\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n <title>Ogg Opus E"
},
{
"path": "example/fileEncoder.html",
"chars": 3824,
"preview": "<!DOCTYPE html>\n\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-sca"
},
{
"path": "example/waveRecorder.html",
"chars": 4239,
"preview": "<!DOCTYPE html>\n\n<html>\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n <title>Wave Recor"
},
{
"path": "package.json",
"chars": 1152,
"preview": "{\n \"name\": \"opus-recorder\",\n \"version\": \"8.0.5\",\n \"description\": \"A library for recording opus encoded audio\",\n \"hom"
},
{
"path": "src/decoderWorker.js",
"chars": 7954,
"preview": "\"use strict\";\n\nvar decoder;\nvar mainReadyResolve;\nvar mainReady = new Promise(function(resolve){ mainReadyResolve = reso"
},
{
"path": "src/encoderWorker.js",
"chars": 16269,
"preview": "\"use strict\";\n\nconst OggOpusEncoder = function( config, Module ){\n\n if ( !Module ) {\n throw new Error('Module with e"
},
{
"path": "src/recorder.js",
"chars": 9039,
"preview": "\"use strict\";\n\nvar AudioContext = global.AudioContext || global.webkitAudioContext;\n\n\n// Constructor\nvar Recorder = func"
},
{
"path": "src/waveWorker.js",
"chars": 6006,
"preview": "\"use strict\";\n\nconst WavePCM = function( config ){\n\n var config = Object.assign({\n wavBitDepth: 16,\n numberOfChan"
},
{
"path": "test/decoderWorker.js",
"chars": 3253,
"preview": "var chai = require('chai');\nvar sinon = require('sinon');\nvar sinonChai = require(\"sinon-chai\");\nvar requireUncached = r"
},
{
"path": "test/encoderWorker.js",
"chars": 9184,
"preview": "var chai = require('chai');\nvar sinon = require('sinon');\nvar sinonChai = require(\"sinon-chai\");\nvar { Module, OggOpusEn"
},
{
"path": "test/recorder.js",
"chars": 15205,
"preview": "var chai = require('chai');\nvar sinon = require('sinon');\nvar sinonChai = require(\"sinon-chai\");\nvar requireUncached = r"
},
{
"path": "test/waveWorker.js",
"chars": 2951,
"preview": "var WavePCM = require('../src/waveWorker');\nvar chai = require('chai');\nvar sinon = require('sinon');\n\nvar should = chai"
},
{
"path": "test.js",
"chars": 590,
"preview": "var Mocha = require('mocha'),\n fs = require('fs'),\n path = require('path');\n\n// Instantiate a Mocha instance.\nvar "
},
{
"path": "webpack.config.js",
"chars": 376,
"preview": " module.exports = {\n output: {\n globalObject: 'typeof self !== \\'undefined\\' ? self : this',\n libraryTarget: 'umd"
}
]
// ... and 6 more files (download for full content)
About this extraction
This page contains the full source code of the chris-rudmin/Recorderjs GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 31 files (2.0 MB), approximately 1.1M tokens, and a symbol index with 174 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.