yosys
Version:
WebAssembly version of Yosys.
150 lines (126 loc) • 6.2 MB
JavaScript
var Yosys = (function() {
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
return (
function(Yosys) {
Yosys = Yosys || {};
// 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 Yosys !== 'undefined' ? Yosys : {};
// See https://caniuse.com/mdn-javascript_builtins_object_assign
var objAssign = Object.assign;
// Set up the promise that indicates the Module is initialized
var readyPromiseResolve, readyPromiseReject;
Module['ready'] = new Promise(function(resolve, reject) {
readyPromiseResolve = resolve;
readyPromiseReject = reject;
});
if (!Object.getOwnPropertyDescriptor(Module['ready'], '_main')) {
Object.defineProperty(Module['ready'], '_main', { configurable: true, get: function() { abort('You are getting _main on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
Object.defineProperty(Module['ready'], '_main', { configurable: true, set: function() { abort('You are setting _main on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
}
if (!Object.getOwnPropertyDescriptor(Module['ready'], '_run')) {
Object.defineProperty(Module['ready'], '_run', { configurable: true, get: function() { abort('You are getting _run on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
Object.defineProperty(Module['ready'], '_run', { configurable: true, set: function() { abort('You are setting _run on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
}
if (!Object.getOwnPropertyDescriptor(Module['ready'], '_prompt')) {
Object.defineProperty(Module['ready'], '_prompt', { configurable: true, get: function() { abort('You are getting _prompt on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
Object.defineProperty(Module['ready'], '_prompt', { configurable: true, set: function() { abort('You are setting _prompt on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
}
if (!Object.getOwnPropertyDescriptor(Module['ready'], '_errmsg')) {
Object.defineProperty(Module['ready'], '_errmsg', { configurable: true, get: function() { abort('You are getting _errmsg on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
Object.defineProperty(Module['ready'], '_errmsg', { configurable: true, set: function() { abort('You are setting _errmsg on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
}
if (!Object.getOwnPropertyDescriptor(Module['ready'], '_memset')) {
Object.defineProperty(Module['ready'], '_memset', { configurable: true, get: function() { abort('You are getting _memset on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
Object.defineProperty(Module['ready'], '_memset', { configurable: true, set: function() { abort('You are setting _memset on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
}
if (!Object.getOwnPropertyDescriptor(Module['ready'], '_fflush')) {
Object.defineProperty(Module['ready'], '_fflush', { configurable: true, get: function() { abort('You are getting _fflush on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
Object.defineProperty(Module['ready'], '_fflush', { configurable: true, set: function() { abort('You are setting _fflush on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
}
if (!Object.getOwnPropertyDescriptor(Module['ready'], 'onRuntimeInitialized')) {
Object.defineProperty(Module['ready'], 'onRuntimeInitialized', { configurable: true, get: function() { abort('You are getting onRuntimeInitialized on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
Object.defineProperty(Module['ready'], 'onRuntimeInitialized', { configurable: true, set: function() { abort('You are setting onRuntimeInitialized on the Promise object, instead of the instance. Use .then() to get called back with the instance, see the MODULARIZE docs in src/settings.js') } });
}
// --pre-jses are emitted after the Module integration code, so that they can
// refer to Module (if they choose; they can also define Module)
if (!Module.expectedDataFileDownloads) {
Module.expectedDataFileDownloads = 0;
}
Module.expectedDataFileDownloads++;
(function() {
// When running as a pthread, FS operations are proxied to the main thread, so we don't need to
// fetch the .data bundle on the worker
if (Module['ENVIRONMENT_IS_PTHREAD']) return;
var loadPackage = function(metadata) {
function runWithFS() {
function assert(check, msg) {
if (!check) throw msg + new Error().stack;
}
Module['FS_createPath']("/", "share", true, true);
Module['FS_createPath']("/share", "ice40", true, true);
Module['FS_createPath']("/share", "fabulous", true, true);
Module['FS_createPath']("/share", "greenpak4", true, true);
Module['FS_createPath']("/share", "ecp5", true, true);
Module['FS_createPath']("/share", "quicklogic", true, true);
Module['FS_createPath']("/share", "efinix", true, true);
Module['FS_createPath']("/share", "anlogic", true, true);
Module['FS_createPath']("/share", "achronix", true, true);
Module['FS_createPath']("/share/achronix", "speedster22i", true, true);
Module['FS_createPath']("/share", "gatemate", true, true);
Module['FS_createPath']("/share", "xilinx", true, true);
Module['FS_createPath']("/share", "coolrunner2", true, true);
Module['FS_createPath']("/share", "gowin", true, true);
Module['FS_createPath']("/share", "machxo2", true, true);
Module['FS_createPath']("/share", "intel_alm", true, true);
Module['FS_createPath']("/share/intel_alm", "cyclonev", true, true);
Module['FS_createPath']("/share/intel_alm", "common", true, true);
Module['FS_createPath']("/share", "nexus", true, true);
Module['FS_createPath']("/share", "include", true, true);
Module['FS_createPath']("/share/include", "libs", true, true);
Module['FS_createPath']("/share/include/libs", "ezsat", true, true);
Module['FS_createPath']("/share/include/libs", "json11", true, true);
Module['FS_createPath']("/share/include/libs", "sha1", true, true);
Module['FS_createPath']("/share/include", "kernel", true, true);
Module['FS_createPath']("/share/include", "backends", true, true);
Module['FS_createPath']("/share/include/backends", "rtlil", true, true);
Module['FS_createPath']("/share/include/backends", "cxxrtl", true, true);
Module['FS_createPath']("/share/include", "passes", true, true);
Module['FS_createPath']("/share/include/passes", "fsm", true, true);
Module['FS_createPath']("/share/include", "frontends", true, true);
Module['FS_createPath']("/share/include/frontends", "ast", true, true);
Module['FS_createPath']("/share/include/frontends", "blif", true, true);
Module['FS_createPath']("/share", "intel", true, true);
Module['FS_createPath']("/share/intel", "cyclone10lp", true, true);
Module['FS_createPath']("/share/intel", "common", true, true);
Module['FS_createPath']("/share/intel", "max10", true, true);
Module['FS_createPath']("/share/intel", "cycloneive", true, true);
Module['FS_createPath']("/share/intel", "cycloneiv", true, true);
Module['FS_createPath']("/share", "sf2", true, true);
var fileData0 = 'LyoKICogIHlvc3lzIC0tIFlvc3lzIE9wZW4gU1ludGhlc2lzIFN1aXRlCiAqCiAqICBDb3B5cmlnaHQgKEMpIDIwMTIgIENsYWlyZSBYZW5pYSBXb2xmIDxjbGFpcmVAeW9zeXNocS5jb20+CiAqICAgICAgICAgICAgICAgIDIwMTkgIEVkZGllIEh1bmcgICAgPGVkZGllQGZwZ2VoLmNvbT4KICogICAgICAgICAgICAgICAgMjAxOSAgZ2F0ZWNhdCA8Z2F0ZWNhdEBkczAubWU+CiAqCiAqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKICogIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKICogIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAqCiAqICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKICogIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiAqICBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCiAqICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KICogIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiAqICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKgogKiAgLS0tCiAqCiAqICBUZWNoLW1hcHBpbmcgcnVsZXMgZm9yIGRlY29tcG9zaW5nIGFyYml0cmFyaWx5LXNpemVkICRtdWwgY2VsbHMKICogIGludG8gYW4gZXF1aXZhbGVudCBjb2xsZWN0aW9uIG9mIHNtYWxsZXIgYERTUF9OQU1FIGNlbGxzICh3aXRoIHRoZSAKICogIHNhbWUgaW50ZXJmYWNlIGFzICRtdWwpIG5vIGxhcmdlciB0aGFuIGBEU1BfW0FCXV9NQVhXSURUSCwgYXR0YWNoZWQgCiAqICB0byAkc2hsIGFuZCAkYWRkIGNlbGxzLgogKgogKi8KCmBpZm5kZWYgRFNQX0FfTUFYV0lEVEgKJGZhdGFsKDEsICJNYWNybyBEU1BfQV9NQVhXSURUSCBtdXN0IGJlIGRlZmluZWQiKTsKYGVuZGlmCmBpZm5kZWYgRFNQX0JfTUFYV0lEVEgKJGZhdGFsKDEsICJNYWNybyBEU1BfQl9NQVhXSURUSCBtdXN0IGJlIGRlZmluZWQiKTsKYGVuZGlmCmBpZm5kZWYgRFNQX0JfTUFYV0lEVEgKJGZhdGFsKDEsICJNYWNybyBEU1BfQl9NQVhXSURUSCBtdXN0IGJlIGRlZmluZWQiKTsKYGVuZGlmCmBpZm5kZWYgRFNQX0FfTUFYV0lEVEhfUEFSVElBTApgZGVmaW5lIERTUF9BX01BWFdJRFRIX1BBUlRJQUwgYERTUF9BX01BWFdJRFRICmBlbmRpZgpgaWZuZGVmIERTUF9CX01BWFdJRFRIX1BBUlRJQUwKYGRlZmluZSBEU1BfQl9NQVhXSURUSF9QQVJUSUFMIGBEU1BfQl9NQVhXSURUSApgZW5kaWYKCmBpZm5kZWYgRFNQX05BTUUKJGZhdGFsKDEsICJNYWNybyBEU1BfTkFNRSBtdXN0IGJlIGRlZmluZWQiKTsKYGVuZGlmCgpgZGVmaW5lIE1BWChhLGIpIChhID4gYiA/IGEgOiBiKQpgZGVmaW5lIE1JTihhLGIpIChhIDwgYiA/IGEgOiBiKQoKKCogdGVjaG1hcF9jZWxsdHlwZSA9ICIkbXVsICRfX211bCIgKikKbW9kdWxlIF84MF9tdWwgKEEsIEIsIFkpOwoJcGFyYW1ldGVyIEFfU0lHTkVEID0gMDsKCXBhcmFtZXRlciBCX1NJR05FRCA9IDA7CglwYXJhbWV0ZXIgQV9XSURUSCA9IDE7CglwYXJhbWV0ZXIgQl9XSURUSCA9IDE7CglwYXJhbWV0ZXIgWV9XSURUSCA9IDE7CgoJKCogZm9yY2VfZG93bnRvICopCglpbnB1dCBbQV9XSURUSC0xOjBdIEE7CgkoKiBmb3JjZV9kb3dudG8gKikKCWlucHV0IFtCX1dJRFRILTE6MF0gQjsKCSgqIGZvcmNlX2Rvd250byAqKQoJb3V0cHV0IFtZX1dJRFRILTE6MF0gWTsKCglwYXJhbWV0ZXIgX1RFQ0hNQVBfQ0VMTFRZUEVfID0gIiI7CgoJZ2VuZXJhdGUKCWlmICgwKSBiZWdpbiBlbmQKYGlmZGVmIERTUF9BX01JTldJRFRICgllbHNlIGlmIChBX1dJRFRIIDwgYERTUF9BX01JTldJRFRIKQoJCXdpcmUgX1RFQ0hNQVBfRkFJTF8gPSAxOwpgZW5kaWYKYGlmZGVmIERTUF9CX01JTldJRFRICgllbHNlIGlmIChCX1dJRFRIIDwgYERTUF9CX01JTldJRFRIKQoJCXdpcmUgX1RFQ0hNQVBfRkFJTF8gPSAxOwpgZW5kaWYKYGlmZGVmIERTUF9ZX01JTldJRFRICgllbHNlIGlmIChZX1dJRFRIIDwgYERTUF9ZX01JTldJRFRIKQoJCXdpcmUgX1RFQ0hNQVBfRkFJTF8gPSAxOwpgZW5kaWYKYGlmZGVmIERTUF9TSUdORURPTkxZCgllbHNlIGlmIChfVEVDSE1BUF9DRUxMVFlQRV8gPT0gIiRtdWwiICYmICFBX1NJR05FRCAmJiAhQl9TSUdORUQpCgkJXCRtdWwgIygKCQkJLkFfU0lHTkVEKDEpLAoJCQkuQl9TSUdORUQoMSksCgkJCS5BX1dJRFRIKEFfV0lEVEggKyAxKSwKCQkJLkJfV0lEVEgoQl9XSURUSCArIDEpLAoJCQkuWV9XSURUSChZX1dJRFRIKQoJCSkgX1RFQ0hNQVBfUkVQTEFDRV8gKAoJCQkuQSh7MSdiMCwgQX0pLAoJCQkuQih7MSdiMCwgQn0pLAoJCQkuWShZKQoJCSk7CmBlbmRpZgoJZWxzZSBpZiAoX1RFQ0hNQVBfQ0VMTFRZUEVfID09ICIkbXVsIiAmJiBBX1dJRFRIIDwgQl9XSURUSCkKCQlcJG11bCAjKAoJCQkuQV9TSUdORUQoQl9TSUdORUQpLAoJCQkuQl9TSUdORUQoQV9TSUdORUQpLAoJCQkuQV9XSURUSChCX1dJRFRIKSwKCQkJLkJfV0lEVEgoQV9XSURUSCksCgkJCS5ZX1dJRFRIKFlfV0lEVEgpCgkJKSBfVEVDSE1BUF9SRVBMQUNFXyAoCgkJCS5BKEIpLAoJCQkuQihBKSwKCQkJLlkoWSkKCQkpOwoJZWxzZSBiZWdpbgoJCXdpcmUgWzEwMjM6MF0gX1RFQ0hNQVBfRE9fID0gInByb2M7IGNsZWFuIjsKCmBpZmRlZiBEU1BfU0lHTkVET05MWQoJCWxvY2FscGFyYW0gc2lnbl9oZWFkcm9vbSA9IDE7CmBlbHNlCgkJbG9jYWxwYXJhbSBzaWduX2hlYWRyb29tID0gMDsKYGVuZGlmCgoJCWdlbnZhciBpOwoJCWlmIChBX1dJRFRIID4gYERTUF9BX01BWFdJRFRIKSBiZWdpbgoJCQlsb2NhbHBhcmFtIG4gPSAoQV9XSURUSC1gRFNQX0FfTUFYV0lEVEgrYERTUF9BX01BWFdJRFRIX1BBUlRJQUwtc2lnbl9oZWFkcm9vbS0xKSAvIChgRFNQX0FfTUFYV0lEVEhfUEFSVElBTC1zaWduX2hlYWRyb29tKTsKCQkJbG9jYWxwYXJhbSBwYXJ0aWFsX1lfV0lEVEggPSBgTUlOKFlfV0lEVEgsIEJfV0lEVEgrYERTUF9BX01BWFdJRFRIX1BBUlRJQUwpOwoJCQlsb2NhbHBhcmFtIGxhc3RfQV9XSURUSCA9IEFfV0lEVEgtbiooYERTUF9BX01BWFdJRFRIX1BBUlRJQUwtc2lnbl9oZWFkcm9vbSk7CgkJCWxvY2FscGFyYW0gbGFzdF9ZX1dJRFRIID0gQl9XSURUSCtsYXN0X0FfV0lEVEg7CgkJCWlmIChBX1NJR05FRCAmJiBCX1NJR05FRCkgYmVnaW4gOiBibGsKCQkJCSgqIGZvcmNlX2Rvd250byAqKQoJCQkJd2lyZSBzaWduZWQgW3BhcnRpYWxfWV9XSURUSC0xOjBdIHBhcnRpYWwgW24tMTowXTsKCQkJCSgqIGZvcmNlX2Rvd250byAqKQoJCQkJd2lyZSBzaWduZWQgW2xhc3RfWV9XSURUSC0xOjBdIGxhc3RfcGFydGlhbDsKCQkJCSgqIGZvcmNlX2Rvd250byAqKQoJCQkJd2lyZSBzaWduZWQgW1lfV0lEVEgtMTowXSBwYXJ0aWFsX3N1bSBbbjowXTsKCQkJZW5kCgkJCWVsc2UgYmVnaW4gOiBibGsKCQkJCSgqIGZvcmNlX2Rvd250byAqKQoJCQkJd2lyZSBbcGFydGlhbF9ZX1dJRFRILTE6MF0gcGFydGlhbCBbbi0xOjBdOwoJCQkJKCogZm9yY2VfZG93bnRvICopCgkJCQl3aXJlIFtsYXN0X1lfV0lEVEgtMTowXSBsYXN0X3BhcnRpYWw7CgkJCQkoKiBmb3JjZV9kb3dudG8gKikKCQkJCXdpcmUgW1lfV0lEVEgtMTowXSBwYXJ0aWFsX3N1bSBbbjowXTsKCQkJZW5kCgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaT1pKzEpIGJlZ2luOnNsaWNlQQoJCQkJXCRfX211bCAjKAoJCQkJCS5BX1NJR05FRChzaWduX2hlYWRyb29tKSwKCQkJCQkuQl9TSUdORUQoQl9TSUdORUQpLAoJCQkJCS5BX1dJRFRIKGBEU1BfQV9NQVhXSURUSF9QQVJUSUFMKSwKCQkJCQkuQl9XSURUSChCX1dJRFRIKSwKCQkJCQkuWV9XSURUSChwYXJ0aWFsX1lfV0lEVEgpCgkJCQkpIG11bCAoCgkJCQkJLkEoe3tzaWduX2hlYWRyb29tezEnYjB9fSwgQVtpKihgRFNQX0FfTUFYV0lEVEhfUEFSVElBTC1zaWduX2hlYWRyb29tKSArOiBgRFNQX0FfTUFYV0lEVEhfUEFSVElBTC1zaWduX2hlYWRyb29tXX0pLAoJCQkJCS5CKEIpLAoJCQkJCS5ZKGJsay5wYXJ0aWFsW2ldKQoJCQkJKTsKCQkJCS8vIFRPRE86IEN1cnJlbnRseSBhICdjYXNjYWRlJyBhcHByb2FjaCB0byBzdW1taW5nIHRoZSBwYXJ0aWFsCgkJCQkvLyAgICAgICBwcm9kdWN0cyBpcyB0YWtlbiBoZXJlLCBidXQgYSBtb3JlIGVmZmljaWVudCAnYmluYXJ5CgkJCQkvLyAgICAgICByZWR1Y3Rpb24nIGFwcHJvYWNoIGFsc28gZXhpc3RzLi4uCgkJCQlpZiAoaSA9PSAwKQoJCQkJCWFzc2lnbiBibGsucGFydGlhbF9zdW1baV0gPSBibGsucGFydGlhbFtpXTsKCQkJCWVsc2UKCQkJCQlhc3NpZ24gYmxrLnBhcnRpYWxfc3VtW2ldID0gKGJsay5wYXJ0aWFsW2ldIDw8ICgqIG11bDJkc3AgKikgaSooYERTUF9BX01BWFdJRFRIX1BBUlRJQUwtc2lnbl9oZWFkcm9vbSkpICsgKCogbXVsMmRzcCAqKSBibGsucGFydGlhbF9zdW1baS0xXTsKCQkJZW5kCgoJCQlcJF9fbXVsICMoCgkJCQkuQV9TSUdORUQoQV9TSUdORUQpLAoJCQkJLkJfU0lHTkVEKEJfU0lHTkVEKSwKCQkJCS5BX1dJRFRIKGxhc3RfQV9XSURUSCksCgkJCQkuQl9XSURUSChCX1dJRFRIKSwKCQkJCS5ZX1dJRFRIKGxhc3RfWV9XSURUSCkKCQkJKSBzbGljZUEubGFzdCAoCgkJCQkuQShBW0FfV0lEVEgtMSAtOiBsYXN0X0FfV0lEVEhdKSwKCQkJCS5CKEIpLAoJCQkJLlkoYmxrLmxhc3RfcGFydGlhbCkKCQkJKTsKCQkJYXNzaWduIGJsay5wYXJ0aWFsX3N1bVtuXSA9IChibGsubGFzdF9wYXJ0aWFsIDw8ICgqIG11bDJkc3AgKikgbiooYERTUF9BX01BWFdJRFRIX1BBUlRJQUwtc2lnbl9oZWFkcm9vbSkpICsgKCogbXVsMmRzcCAqKSBibGsucGFydGlhbF9zdW1bbi0xXTsKCQkJYXNzaWduIFkgPSBibGsucGFydGlhbF9zdW1bbl07CgkJZW5kCgkJZWxzZSBpZiAoQl9XSURUSCA+IGBEU1BfQl9NQVhXSURUSCkgYmVnaW4KCQkJbG9jYWxwYXJhbSBuID0gKEJfV0lEVEgtYERTUF9CX01BWFdJRFRIK2BEU1BfQl9NQVhXSURUSF9QQVJUSUFMLXNpZ25faGVhZHJvb20tMSkgLyAoYERTUF9CX01BWFdJRFRIX1BBUlRJQUwtc2lnbl9oZWFkcm9vbSk7CgkJCWxvY2FscGFyYW0gcGFydGlhbF9ZX1dJRFRIID0gYE1JTihZX1dJRFRILCBBX1dJRFRIK2BEU1BfQl9NQVhXSURUSF9QQVJUSUFMKTsKCQkJbG9jYWxwYXJhbSBsYXN0X0JfV0lEVEggPSBCX1dJRFRILW4qKGBEU1BfQl9NQVhXSURUSF9QQVJUSUFMLXNpZ25faGVhZHJvb20pOwoJCQlsb2NhbHBhcmFtIGxhc3RfWV9XSURUSCA9IEFfV0lEVEgrbGFzdF9CX1dJRFRIOwoJCQlpZiAoQV9TSUdORUQgJiYgQl9TSUdORUQpIGJlZ2luIDogYmxrCgkJCQkoKiBmb3JjZV9kb3dudG8gKikKCQkJCXdpcmUgc2lnbmVkIFtwYXJ0aWFsX1lfV0lEVEgtMTowXSBwYXJ0aWFsIFtuLTE6MF07CgkJCQkoKiBmb3JjZV9kb3dudG8gKikKCQkJCXdpcmUgc2lnbmVkIFtsYXN0X1lfV0lEVEgtMTowXSBsYXN0X3BhcnRpYWw7CgkJCQkoKiBmb3JjZV9kb3dudG8gKikKCQkJCXdpcmUgc2lnbmVkIFtZX1dJRFRILTE6MF0gcGFydGlhbF9zdW0gW246MF07CgkJCWVuZAoJCQllbHNlIGJlZ2luIDogYmxrCgkJCQkoKiBmb3JjZV9kb3dudG8gKikKCQkJCXdpcmUgW3BhcnRpYWxfWV9XSURUSC0xOjBdIHBhcnRpYWwgW24tMTowXTsKCQkJCSgqIGZvcmNlX2Rvd250byAqKQoJCQkJd2lyZSBbbGFzdF9ZX1dJRFRILTE6MF0gbGFzdF9wYXJ0aWFsOwoJCQkJKCogZm9yY2VfZG93bnRvICopCgkJCQl3aXJlIFtZX1dJRFRILTE6MF0gcGFydGlhbF9zdW0gW246MF07CgkJCWVuZAoKCQkJZm9yIChpID0gMDsgaSA8IG47IGk9aSsxKSBiZWdpbjpzbGljZUIKCQkJCVwkX19tdWwgIygKCQkJCQkuQV9TSUdORUQoQV9TSUdORUQpLAoJCQkJCS5CX1NJR05FRChzaWduX2hlYWRyb29tKSwKCQkJCQkuQV9XSURUSChBX1dJRFRIKSwKCQkJCQkuQl9XSURUSChgRFNQX0JfTUFYV0lEVEhfUEFSVElBTCksCgkJCQkJLllfV0lEVEgocGFydGlhbF9ZX1dJRFRIKQoJCQkJKSBtdWwgKAoJCQkJCS5BKEEpLAoJCQkJCS5CKHt7c2lnbl9oZWFkcm9vbXsxJ2IwfX0sIEJbaSooYERTUF9CX01BWFdJRFRIX1BBUlRJQUwtc2lnbl9oZWFkcm9vbSkgKzogYERTUF9CX01BWFdJRFRIX1BBUlRJQUwtc2lnbl9oZWFkcm9vbV19KSwKCQkJCQkuWShibGsucGFydGlhbFtpXSkKCQkJCSk7CgkJCQkvLyBUT0RPOiBDdXJyZW50bHkgYSAnY2FzY2FkZScgYXBwcm9hY2ggdG8gc3VtbWluZyB0aGUgcGFydGlhbAoJCQkJLy8gICAgICAgcHJvZHVjdHMgaXMgdGFrZW4gaGVyZSwgYnV0IGEgbW9yZSBlZmZpY2llbnQgJ2JpbmFyeQoJCQkJLy8gICAgICAgcmVkdWN0aW9uJyBhcHByb2FjaCBhbHNvIGV4aXN0cy4uLgoJCQkJaWYgKGkgPT0gMCkKCQkJCQlhc3NpZ24gYmxrLnBhcnRpYWxfc3VtW2ldID0gYmxrLnBhcnRpYWxbaV07CgkJCQllbHNlCgkJCQkJYXNzaWduIGJsay5wYXJ0aWFsX3N1bVtpXSA9IChibGsucGFydGlhbFtpXSA8PCAoKiBtdWwyZHNwICopIGkqKGBEU1BfQl9NQVhXSURUSF9QQVJUSUFMLXNpZ25faGVhZHJvb20pKSArICgqIG11bDJkc3AgKikgYmxrLnBhcnRpYWxfc3VtW2ktMV07CgkJCWVuZAoKCQkJXCRfX211bCAjKAoJCQkJLkFfU0lHTkVEKEFfU0lHTkVEKSwKCQkJCS5CX1NJR05FRChCX1NJR05FRCksCgkJCQkuQV9XSURUSChBX1dJRFRIKSwKCQkJCS5CX1dJRFRIKGxhc3RfQl9XSURUSCksCgkJCQkuWV9XSURUSChsYXN0X1lfV0lEVEgpCgkJCSkgbXVsX3NsaWNlQl9sYXN0ICgKCQkJCS5BKEEpLAoJCQkJLkIoQltCX1dJRFRILTEgLTogbGFzdF9CX1dJRFRIXSksCgkJCQkuWShibGsubGFzdF9wYXJ0aWFsKQoJCQkpOwoJCQlhc3NpZ24gYmxrLnBhcnRpYWxfc3VtW25dID0gKGJsay5sYXN0X3BhcnRpYWwgPDwgKCogbXVsMmRzcCAqKSBuKihgRFNQX0JfTUFYV0lEVEhfUEFSVElBTC1zaWduX2hlYWRyb29tKSkgKyAoKiBtdWwyZHNwICopIGJsay5wYXJ0aWFsX3N1bVtuLTFdOwoJCQlhc3NpZ24gWSA9IGJsay5wYXJ0aWFsX3N1bVtuXTsKCQllbmQKCQllbHNlIGJlZ2luCgkJCWlmIChBX1NJR05FRCkgYmVnaW4gOiBibGtBCgkJCQl3aXJlIHNpZ25lZCBbYERTUF9BX01BWFdJRFRILTE6MF0gQWV4dCA9ICRzaWduZWQoQSk7CgkJCWVuZAoJCQllbHNlIGJlZ2luIDogYmxrQQoJCQkJd2lyZSBbYERTUF9BX01BWFdJRFRILTE6MF0gQWV4dCA9IEE7CgkJCWVuZAoJCQlpZiAoQl9TSUdORUQpIGJlZ2luIDogYmxrQgoJCQkJd2lyZSBzaWduZWQgW2BEU1BfQl9NQVhXSURUSC0xOjBdIEJleHQgPSAkc2lnbmVkKEIpOwoJCQllbmQKCQkJZWxzZSBiZWdpbiA6IGJsa0IKCQkJCXdpcmUgW2BEU1BfQl9NQVhXSURUSC0xOjBdIEJleHQgPSBCOwoJCQllbmQKCgkJCWBEU1BfTkFNRSAjKAoJCQkJLkFfU0lHTkVEKEFfU0lHTkVEKSwKCQkJCS5CX1NJR05FRChCX1NJR05FRCksCgkJCQkuQV9XSURUSChgRFNQX0FfTUFYV0lEVEgpLAoJCQkJLkJfV0lEVEgoYERTUF9CX01BWFdJRFRIKSwKCQkJCS5ZX1dJRFRIKGBNSU4oWV9XSURUSCxgRFNQX0FfTUFYV0lEVEgrYERTUF9CX01BWFdJRFRIKSksCgkJCSkgX1RFQ0hNQVBfUkVQTEFDRV8gKAoJCQkJLkEoYmxrQS5BZXh0KSwKCQkJCS5CKGJsa0IuQmV4dCksCgkJCQkuWShZKQoJCQkpOwoJCWVuZAoJZW5kCgllbmRnZW5lcmF0ZQplbmRtb2R1bGUKCigqIHRlY2htYXBfY2VsbHR5cGUgPSAiJG11bCAkX19tdWwiICopCm1vZHVsZSBfOTBfc29mdF9tdWwgKEEsIEIsIFkpOwoJcGFyYW1ldGVyIEFfU0lHTkVEID0gMDsKCXBhcmFtZXRlciBCX1NJR05FRCA9IDA7CglwYXJhbWV0ZXIgQV9XSURUSCA9IDE7CglwYXJhbWV0ZXIgQl9XSURUSCA9IDE7CglwYXJhbWV0ZXIgWV9XSURUSCA9IDE7CgoJKCogZm9yY2VfZG93bnRvICopCglpbnB1dCBbQV9XSURUSC0xOjBdIEE7CgkoKiBmb3JjZV9kb3dudG8gKikKCWlucHV0IFtCX1dJRFRILTE6MF0gQjsKCSgqIGZvcmNlX2Rvd250byAqKQoJb3V0cHV0IFtZX1dJRFRILTE6MF0gWTsKCgkvLyBJbmRpcmVjdGlvbiBuZWNlc3Nhcnkgc2luY2UgbWFwcGluZwoJLy8gICBiYWNrIHRvICRtdWwgd2lsbCBjYXVzZSByZWN1cnNpb24KCWdlbmVyYXRlCglpZiAoQV9TSUdORUQgJiYgIUJfU0lHTkVEKQoJCVwkX19zb2Z0X211bCAjKAoJCQkuQV9TSUdORUQoQV9TSUdORUQpLAoJCQkuQl9TSUdORUQoMSksCgkJCS5BX1dJRFRIKEFfV0lEVEgpLAoJCQkuQl9XSURUSChCX1dJRFRIKzEpLAoJCQkuWV9XSURUSChZX1dJRFRIKQoJCSkgX1RFQ0hNQVBfUkVQTEFDRV8gKAoJCQkuQShBKSwKCQkJLkIoezEnYjAsQn0pLAoJCQkuWShZKQoJCSk7CgllbHNlIGlmICghQV9TSUdORUQgJiYgQl9TSUdORUQpCgkJXCRfX3NvZnRfbXVsICMoCgkJCS5BX1NJR05FRCgxKSwKCQkJLkJfU0lHTkVEKEJfU0lHTkVEKSwKCQkJLkFfV0lEVEgoQV9XSURUSCsxKSwKCQkJLkJfV0lEVEgoQl9XSURUSCksCgkJCS5ZX1dJRFRIKFlfV0lEVEgpCgkJKSBfVEVDSE1BUF9SRVBMQUNFXyAoCgkJCS5BKHsxJ2IwLEF9KSwKCQkJLkIoQiksCgkJCS5ZKFkpCgkJKTsKCWVsc2UKCQlcJF9fc29mdF9tdWwgIygKCQkJLkFfU0lHTkVEKEFfU0lHTkVEKSwKCQkJLkJfU0lHTkVEKEJfU0lHTkVEKSwKCQkJLkFfV0lEVEgoQV9XSURUSCksCgkJCS5CX1dJRFRIKEJfV0lEVEgpLAoJCQkuWV9XSURUSChZX1dJRFRIKQoJCSkgX1RFQ0hNQVBfUkVQTEFDRV8gKAoJCQkuQShBKSwKCQkJLkIoQiksCgkJCS5ZKFkpCgkJKTsKCWVuZGdlbmVyYXRlCmVuZG1vZHVsZQo=';
Module['FS_createDataFile']('/share', 'mul2dsp.v', decodeBase64(fileData0), true, true, false);
var fileData1 = 'Ly8gQ2VydGFpbiBhcml0aG1ldGljIG9wZXJhdGlvbnMgYmV0d2VlbiBhIHNpZ25hbCBvZiB3aWR0aCBuIGFuZCBhIGNvbnN0YW50IGNhbiBiZSBkaXJlY3RseSBtYXBwZWQKLy8gdG8gYSBzaW5nbGUgay1MVVQgKHdoZXJlIG4gPD0gaykuIFRoaXMgaXMgcHJlZmVyYWJsZSB0byBub3JtYWwgYWx1bWFjYyB0ZWNobWFwcGluZyBwcm9jZXNzCi8vIGJlY2F1c2UgZm9yIG1hbnkgdGFyZ2V0cywgYXJpdGhtZXRpYyB0ZWNobWFwcGluZyBjcmVhdGVzIGhhcmQgbG9naWMgKHN1Y2ggYXMgY2FycnkgY2VsbHMpIHdoaWNoIG9mdGVuCi8vIGNhbm5vdCBiZSBvcHRpbWl6ZWQgZnVydGhlci4KLy8KLy8gVE9ETzogQ3VycmVudGx5LCBvbmx5IGNvbXBhcmlzb25zIHdpdGggMS1iaXQgb3V0cHV0IGFyZSBtYXBwZWQuIFBvdGVudGlhbGx5LCBhbGwgYXJpdGhtZXRpYyBjZWxscwovLyB3aXRoIG4gPD0gayBpbnB1dHMgc2hvdWxkIGJlIHRlY2htYXBwZWQgaW4gdGhpcyB3YXksIGJlY2F1c2UgdGhpcyBzaG9ydGVucyB0aGUgY3JpdGljYWwgcGF0aAovLyBmcm9tIG4gdG8gMSBieSBhdm9pZGluZyBjYXJyeSBjaGFpbnMuCgooKiB0ZWNobWFwX2NlbGx0eXBlID0gIiRsdCAkbGUgJGd0ICRnZSIgKikKbW9kdWxlIF85MF9sdXRfY21wXyAoQSwgQiwgWSk7CgpwYXJhbWV0ZXIgQV9TSUdORUQgPSAwOwpwYXJhbWV0ZXIgQl9TSUdORUQgPSAwOwpwYXJhbWV0ZXIgQV9XSURUSCA9IDA7CnBhcmFtZXRlciBCX1dJRFRIID0gMDsKcGFyYW1ldGVyIFlfV0lEVEggPSAwOwoKKCogZm9yY2VfZG93bnRvICopCmlucHV0IFtBX1dJRFRILTE6MF0gQTsKKCogZm9yY2VfZG93bnRvICopCmlucHV0IFtCX1dJRFRILTE6MF0gQjsKKCogZm9yY2VfZG93bnRvICopCm91dHB1dCBbWV9XSURUSC0xOjBdIFk7CgpwYXJhbWV0ZXIgX1RFQ0hNQVBfQ0VMTFRZUEVfID0gIiI7CgpwYXJhbWV0ZXIgX1RFQ0hNQVBfQ09OU1RNU0tfQV8gPSAwOwpwYXJhbWV0ZXIgX1RFQ0hNQVBfQ09OU1RWQUxfQV8gPSAwOwpwYXJhbWV0ZXIgX1RFQ0hNQVBfQ09OU1RNU0tfQl8gPSAwOwpwYXJhbWV0ZXIgX1RFQ0hNQVBfQ09OU1RWQUxfQl8gPSAwOwoKZnVuY3Rpb24gYXV0b21hdGljIFsoMSA8PCBgTFVUX1dJRFRIKS0xOjBdIGdlbl9sdXQ7CglpbnB1dCBpbnRlZ2VyIHdpZHRoOwoJaW5wdXQgaW50ZWdlciBvcGVyYXRpb247CglpbnB1dCBpbnRlZ2VyIHN3YXA7CglpbnB1dCBpbnRlZ2VyIHNpZ247CglpbnB1dCBpbnRlZ2VyIG9wZXJhbmQ7CglpbnRlZ2VyIG4sIGlfdmFyLCBpX2NzdCwgbGhzLCByaHMsIG9fYml0OwoJYmVnaW4KCQlnZW5fbHV0ID0gd2lkdGgnYjA7CgkJZm9yIChuID0gMDsgbiA8ICgxIDw8IHdpZHRoKTsgbisrKSBiZWdpbgoJCQlpZiAoc2lnbikKCQkJCWlfdmFyID0gblt3aWR0aC0xOjBdOwoJCQllbHNlCgkJCQlpX3ZhciA9IG47CgkJCWlfY3N0ID0gb3BlcmFuZDsKCQkJaWYgKHN3YXApIGJlZ2luCgkJCQlsaHMgPSBpX2NzdDsKCQkJCXJocyA9IGlfdmFyOwoJCQllbmQgZWxzZSBiZWdpbgoJCQkJbGhzID0gaV92YXI7CgkJCQlyaHMgPSBpX2NzdDsKCQkJZW5kCgkJCWlmIChvcGVyYXRpb24gPT0gMCkKCQkJCW9fYml0ID0gKGxocyA8ICByaHMpOwoJCQlpZiAob3BlcmF0aW9uID09IDEpCgkJCQlvX2JpdCA9IChsaHMgPD0gcmhzKTsKCQkJaWYgKG9wZXJhdGlvbiA9PSAyKQoJCQkJb19iaXQgPSAobGhzID4gIHJocyk7CgkJCWlmIChvcGVyYXRpb24gPT0gMykKCQkJCW9fYml0ID0gKGxocyA+PSByaHMpOwoJCQlnZW5fbHV0ID0gZ2VuX2x1dCB8IChvX2JpdCA8PCBuKTsKCQllbmQKCWVuZAplbmRmdW5jdGlvbgoKZ2VuZXJhdGUKCWxvY2FscGFyYW0gb3BlcmF0aW9uID0KCQlfVEVDSE1BUF9DRUxMVFlQRV8gPT0gIiRsdCIgPyAwIDoKCQlfVEVDSE1BUF9DRUxMVFlQRV8gPT0gIiRsZSIgPyAxIDoKCQlfVEVDSE1BUF9DRUxMVFlQRV8gPT0gIiRndCIgPyAyIDoKCQlfVEVDSE1BUF9DRUxMVFlQRV8gPT0gIiRnZSIgPyAzIDoKCQktMTsKCglpZiAoQV9XSURUSCA+IGBMVVRfV0lEVEggfHwgQl9XSURUSCA+IGBMVVRfV0lEVEggfHwgWV9XSURUSCAhPSAxKQoJCXdpcmUgX1RFQ0hNQVBfRkFJTF8gPSAxOwoJZWxzZSBpZiAoJl9URUNITUFQX0NPTlNUTVNLX0JfKQoJCVwkbHV0ICMoCgkJCS5XSURUSChBX1dJRFRIKSwKCQkJLkxVVCh7IGdlbl9sdXQoQV9XSURUSCwgb3BlcmF0aW9uLCAwLCBBX1NJR05FRCAmJiBCX1NJR05FRCwgX1RFQ0hNQVBfQ09OU1RWQUxfQl8pIH0pCgkJKSBfVEVDSE1BUF9SRVBMQUNFXyAoCgkJCS5BKEEpLAoJCQkuWShZKQoJCSk7CgllbHNlIGlmICgmX1RFQ0hNQVBfQ09OU1RNU0tfQV8pCgkJXCRsdXQgIygKCQkJLldJRFRIKEJfV0lEVEgpLAoJCQkuTFVUKHsgZ2VuX2x1dChCX1dJRFRILCBvcGVyYXRpb24sIDEsIEFfU0lHTkVEICYmIEJfU0lHTkVELCBfVEVDSE1BUF9DT05TVFZBTF9BXykgfSkKCQkpIF9URUNITUFQX1JFUExBQ0VfICgKCQkJLkEoQiksCgkJCS5ZKFkpCgkJKTsKCWVsc2UKCQl3aXJlIF9URUNITUFQX0ZBSUxfID0gMTsKZW5kZ2VuZXJhdGUKCmVuZG1vZHVsZQo=';
Module['FS_createDataFile']('/share', 'cmp2lut.v', decodeBase64(fileData1), true, true, false);
var fileData2 = 'KCogdGVjaG1hcF9jZWxsdHlwZSA9ICIkZGZmIiAqKQptb2R1bGUgZGZmMmZmIChDTEssIEQsIFEpOwoJcGFyYW1ldGVyIFdJRFRIID0gMTsKCXBhcmFtZXRlciBDTEtfUE9MQVJJVFkgPSAxOwoKCWlucHV0IENMSzsKCSgqIGZvcmNlX2Rvd250byAqKQoJaW5wdXQgW1dJRFRILTE6MF0gRDsKCSgqIGZvcmNlX2Rvd250byAqKQoJb3V0cHV0IHJlZyBbV0lEVEgtMTowXSBROwoKCXdpcmUgWzEwMjM6MF0gX1RFQ0hNQVBfRE9fID0gInByb2M7OyI7CgoJYWx3YXlzIEAoJGdsb2JhbF9jbG9jaykKCQlRIDw9IEQ7CmVuZG1vZHVsZQo=';
Module['FS_createDataFile']('/share', 'dff2ff.v', decodeBase64(fileData2), true, true, false);
var fileData3 = 'Ly8gVGhpcyBwYXNzIHBlcmZvcm1zIGFuIG9wdGltaXNhdGlvbiB0aGF0IGRlY29tcG9zZXMgd2lkZSBhcml0aG1ldGljCi8vICAgY29tcGFyaXNvbnMgaW50byBMVVQtc2l6ZSBjaHVua3MgKGFzIGd1aWRlZCBieSB0aGUgYExVVF9XSURUSAovLyAgIG1hY3JvKSBjb25uZWN0ZWQgdG8gYSBzaW5nbGUgbG9va2FoZWFkLWNhcnJ5LXVuaXQgJGxjdSBjZWxsLAovLyAgIHdoaWNoIGlzIHR5cGljYWxseSBtYXBwZWQgdG8gZGVkaWNhdGVkIChhbmQgZmFzdCkgRlBHQQovLyAgIGNhcnJ5LWNoYWlucy4KKCogdGVjaG1hcF9jZWxsdHlwZSA9ICIkbHQgJGxlICRndCAkZ2UiICopCm1vZHVsZSBfODBfbGN1X2NtcF8gKEEsIEIsIFkpOwoKcGFyYW1ldGVyIEFfU0lHTkVEID0gMDsKcGFyYW1ldGVyIEJfU0lHTkVEID0gMDsKcGFyYW1ldGVyIEFfV0lEVEggPSAwOwpwYXJhbWV0ZXIgQl9XSURUSCA9IDA7CnBhcmFtZXRlciBZX1dJRFRIID0gMDsKCigqIGZvcmNlX2Rvd250byAqKQppbnB1dCBbQV9XSURUSC0xOjBdIEE7CigqIGZvcmNlX2Rvd250byAqKQppbnB1dCBbQl9XSURUSC0xOjBdIEI7CigqIGZvcmNlX2Rvd250byAqKQpvdXRwdXQgW1lfV0lEVEgtMTowXSBZOwoKcGFyYW1ldGVyIF9URUNITUFQX0NFTExUWVBFXyA9ICIiOwoKZ2VuZXJhdGUKICAgIGlmIChfVEVDSE1BUF9DRUxMVFlQRV8gPT0gIiIgfHwgYExVVF9XSURUSCA8IDIpCiAgICAgICAgd2lyZSBfVEVDSE1BUF9GQUlMXyA9IDE7CiAgICBlbHNlIGlmIChfVEVDSE1BUF9DRUxMVFlQRV8gPT0gIiRsdCIpIGJlZ2luCiAgICAgICAgLy8gVHJhbnNmb3JtICRsdCBpbnRvICRndCBieSBzd2FwcGluZyBBIGFuZCBCCiAgICAgICAgJGd0ICMoLkFfU0lHTkVEKEJfU0lHTkVEKSwgLkJfU0lHTkVEKEFfU0lHTkVEKSwgLkFfV0lEVEgoQl9XSURUSCksIC5CX1dJRFRIKEFfV0lEVEgpLCAuWV9XSURUSChZX1dJRFRIKSkgX1RFQ0hNQVBfUkVQTEFDRV8gKC5BKEIpLCAuQihBKSwgLlkoWSkpOwogICAgZW5kCiAgICBlbHNlIGlmIChfVEVDSE1BUF9DRUxMVFlQRV8gPT0gIiRsZSIpIGJlZ2luCiAgICAgICAgLy8gVHJhbnNmb3JtICRsZSBpbnRvICRnZSBieSBzd2FwcGluZyBBIGFuZCBCCiAgICAgICAgJGdlICMoLkFfU0lHTkVEKEJfU0lHTkVEKSwgLkJfU0lHTkVEKEFfU0lHTkVEKSwgLkFfV0lEVEgoQl9XSURUSCksIC5CX1dJRFRIKEFfV0lEVEgpLCAuWV9XSURUSChZX1dJRFRIKSkgX1RFQ0hNQVBfUkVQTEFDRV8gKC5BKEIpLCAuQihBKSwgLlkoWSkpOwogICAgZW5kCiAgICBlbHNlIGJlZ2luCiAgICAgICAgLy8gUGVyZm9ybSBzaWduIGV4dGVuc2lvbiBvbiBBIGFuZCBCCiAgICAgICAgbG9jYWxwYXJhbSBXSURUSCA9IEFfV0lEVEggPiBCX1dJRFRIID8gQV9XSURUSCA6IEJfV0lEVEg7CiAgICAgICAgKCogZm9yY2VfZG93bnRvICopCiAgICAgICAgd2lyZSBbV0lEVEgtMTowXSBBQSA9IHt7KFdJRFRILUFfV0lEVEgpe0FfU0lHTkVEID8gQVtBX1dJRFRILTFdIDogMSdiMH19LCBBfTsKICAgICAgICAoKiBmb3JjZV9kb3dudG8gKikKICAgICAgICB3aXJlIFtXSURUSC0xOjBdIEJCID0ge3soV0lEVEgtQl9XSURUSCl7Ql9TSUdORUQgPyBCW0JfV0lEVEgtMV0gOiAxJ2IwfX0sIEJ9OwogICAgICAgIC8vIEZvciAkZ2Ugb3BlcmF0aW9uLCBzdGFydCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgQSBhbmQgQiBhcmUKICAgICAgICAvLyAgIGVxdWFsIChwcm9wYWdhdGluZyB0aGlzIGVxdWFsaXR5IGlmIEEgYW5kIEIgdHVybiBvdXQgdG8gYmUgc28pCiAgICAgICAgbG9jYWxwYXJhbSBDSSA9IF9URUNITUFQX0NFTExUWVBFXyA9PSAiJGdlIjsKICAgICAgICAkX19DTVAyTENVICMoLkFCX1dJRFRIKFdJRFRIKSwgLkFCX1NJR05FRChBX1NJR05FRCAmJiBCX1NJR05FRCksIC5MQ1VfV0lEVEgoMSksIC5CVURHRVQoYExVVF9XSURUSCksIC5DSShDSSkpCiAgICAgICAgICAgIF9URUNITUFQX1JFUExBQ0VfICguQShBQSksIC5CKEJCKSwgLlAoMSdiMSksIC5HKDEnYjApLCAuWShZKSk7CiAgICBlbmQKZW5kZ2VuZXJhdGUKZW5kbW9kdWxlCgptb2R1bGUgJF9fQ01QMkxDVSAoQSwgQiwgUCwgRywgWSk7CgpwYXJhbWV0ZXIgQUJfV0lEVEggPSAwOwpwYXJhbWV0ZXIgQUJfU0lHTkVEID0gMDsKcGFyYW1ldGVyIExDVV9XSURUSCA9IDE7CnBhcmFtZXRlciBCVURHRVQgPSAwOwpwYXJhbWV0ZXIgQ0kgPSAwOwoKKCogZm9yY2VfZG93bnRvICopCmlucHV0IFtBQl9XSURUSC0xOjBdIEE7IC8vIEEgZnJvbSBvcmlnaW5hbCAkZ3QvJGdlCigqIGZvcmNlX2Rvd250byAqKQppbnB1dCBbQUJfV0lEVEgtMTowXSBCOyAvLyBCIGZyb20gb3JpZ2luYWwgJGd0LyRnZQooKiBmb3JjZV9kb3dudG8gKikKaW5wdXQgW0xDVV9XSURUSC0xOjBdIFA7IC8vIFAgb2YgJGxjdQooKiBmb3JjZV9kb3dudG8gKikKaW5wdXQgW0xDVV9XSURUSC0xOjBdIEc7IC8vIEcgb2YgJGxjdQpvdXRwdXQgWTsKCnBhcmFtZXRlciBbQUJfV0lEVEgtMTowXSBfVEVDSE1BUF9DT05TVE1TS19BXyA9IDA7CnBhcmFtZXRlciBbQUJfV0lEVEgtMTowXSBfVEVDSE1BUF9DT05TVE1TS19CXyA9IDA7CnBhcmFtZXRlciBbTENVX1dJRFRILTE6MF0gX1RFQ0hNQVBfQ09OU1RNU0tfUF8gPSAwOwoKZ2VuZXJhdGUKICAgIGlmIChBQl9XSURUSCA9PSAwKSBiZWdpbgogICAgICAgICgqIGZvcmNlX2Rvd250byAqKQogICAgICAgIHdpcmUgW0xDVV9XSURUSC0xOjBdIENPOwogICAgICAgICRsY3UgIyguV0lEVEgoTENVX1dJRFRIKSkgX1RFQ0hNQVBfUkVQTEFDRV8gKC5QKFApLCAuRyhHKSwgLkNJKENJKSwgLkNPKENPKSk7CiAgICAgICAgYXNzaWduIFkgPSBDT1tMQ1VfV0lEVEgtMV07CiAgICBlbmQKICAgIGVsc2UgYmVnaW4KICAgICAgICBsb2NhbHBhcmFtIENPU1QgPQogICAgICAgICAgICBfVEVDSE1BUF9DT05TVE1TS19BX1tBQl9XSURUSC0xOjBdICYmIF9URUNITUFQX0NPTlNUTVNLX0JfW0FCX1dJRFRILTE6MF0KICAgICAgICAgICAgPyAwCiAgICAgICAgICAgIDogKF9URUNITUFQX0NPTlNUTVNLX0FfW0FCX1dJRFRILTE6MF0gfHwgX1RFQ0hNQVBfQ09OU1RNU0tfQl9bQUJfV0lEVEgtMTowXQogICAgICAgICAgICAgICAgPyAxCiAgICAgICAgICAgICAgICA6IDIpOwoKICAgICAgICBpZiAoQlVER0VUIDwgQ09TVCkKICAgICAgICAgICAgICRfX0NNUDJMQ1UgIyguQUJfV0lEVEgoQUJfV0lEVEgpLCAuQUJfU0lHTkVEKEFCX1NJR05FRCksIC5MQ1VfV0lEVEgoTENVX1dJRFRIKzEpLCAuQlVER0VUKGBMVVRfV0lEVEgpLCAuQ0koQ0kpKQogICAgICAgICAgICAgICAgX1RFQ0hNQVBfUkVQTEFDRV8gKC5BKEEpLCAuQihCKSwgLlAoe1AsIDEnYjF9KSwgLkcoe0csIDEnYjB9KSwgLlkoWSkpOwogICAgICAgIGVsc2UgYmVnaW4KICAgICAgICAgICAgd2lyZSBQUCwgR0c7CiAgICAgICAgICAgIC8vIEJpdC13aXNlIGVxdWFsaXR5ICh4bm9yKSBvZiBBIGFuZCBCCiAgICAgICAgICAgIGFzc2lnbiBQUCA9IEFbQUJfV0lEVEgtMV0gXn4gQltBQl9XSURUSC0xXTsKICAgICAgICAgICAgaWYgKEFCX1NJR05FRCkKICAgICAgICAgICAgICAgIGFzc2lnbiBHRyA9IH5BW0FCX1dJRFRILTFdICYgQltBQl9XSURUSC0xXTsKICAgICAgICAgICAgZWxzZSBpZiAoX1RFQ0hNQVBfQ09OU1RNU0tfUF9bTENVX1dJRFRILTFdKSAvLyBGaXJzdCBjb21wYXJlIGZvciBMVVQgaWYgUCAoYW5kIEcpIGlzIGNvbnN0YW50CiAgICAgICAgICAgICAgICBhc3NpZ24gR0cgPSBBW0FCX1dJRFRILTFdICYgfkJbQUJfV0lEVEgtMV07CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIC8vIFByaW9yaXR5ICJlbmNvZGVyIiB0aGF0IGNoZWNrcyBBW2ldID09IDEnYjEgJiYgQltpXSA9PSAxJ2IwCiAgICAgICAgICAgICAgICAvLyAgIGZyb20gTVNCIGRvd24sIGRlZmVycmluZyB0byBsZXNzIHNpZ25pZmljYW50IGJpdHMgaWYgdGhlCiAgICAgICAgICAgICAgICAvLyAgIE1TQnMgYXJlIGVxdWFsCiAgICAgICAgICAgICAgICBhc3NpZ24gR0cgPSBQWzBdICYgKEFbQUJfV0lEVEgtMV0gJiB+QltBQl9XSURUSC0xXSk7CiAgICAgICAgICAgICgqIGZvcmNlX2Rvd250byAqKQogICAgICAgICAgICB3aXJlIFtMQ1VfV0lEVEgtMTowXSBQXywgR187CiAgICAgICAgICAgIGlmIChMQ1VfV0lEVEggPT0gMSkgYmVnaW4KICAgICAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBvbmx5IGlmIGFsbCBwYWlycyBhcmUgZXF1YWwKICAgICAgICAgICAgICAgIC8vICAgKGluY29uY2x1c2l2ZSBldmlkZW5jZSB0byBzYXkgQSA+PSBCKQogICAgICAgICAgICAgICAgYXNzaWduIFBfID0gUFswXSAmIFBQOwogICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgaWYgYW55IGNvbXBhcmlzb25zIGNhbGwgZm9yIGl0CiAgICAgICAgICAgICAgICBhc3NpZ24gR18gPSBHWzBdIHwgR0c7CiAgICAgICAgICAgIGVuZAogICAgICAgICAgICBlbHNlIGJlZ2luCiAgICAgICAgICAgICAgICAvLyBQcm9wYWdhdGUgb25seSBpZiBhbGwgcGFpcnMgYXJlIGVxdWFsCiAgICAgICAgICAgICAgICAvLyAgIChpbmNvbmNsdXNpdmUgZXZpZGVuY2UgdG8gc2F5IEEgPj0gQikKICAgICAgICAgICAgICAgIGFzc2lnbiBQXyA9IHtQW0xDVV9XSURUSC0xOjFdLCBQWzBdICYgUFB9OwogICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgaWYgYW55IGNvbXBhcmlzb25zIGNhbGwgZm9yIGl0CiAgICAgICAgICAgICAgICBhc3NpZ24gR18gPSB7R1tMQ1VfV0lEVEgtMToxXSwgR1swXSB8IEdHfTsKICAgICAgICAgICAgZW5kCiAgICAgICAgICAgIGlmIChBQl9XSURUSCA9PSAxKQogICAgICAgICAgICAgICAkX19DTVAyTENVICMoLkFCX1dJRFRIKEFCX1dJRFRILTEpLCAuQUJfU0lHTkVEKDEnYjApLCAuTENVX1dJRFRIKExDVV9XSURUSCksIC5CVURHRVQoQlVER0VULUNPU1QpLCAuQ0koQ0kpKQogICAgICAgICAgICAgICAgICAgIF9URUNITUFQX1JFUExBQ0VfICguQSgpLCAuQigpLCAuUChQXyksIC5HKEdfKSwgLlkoWSkpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICRfX0NNUDJMQ1UgIyguQUJfV0lEVEgoQUJfV0lEVEgtMSksIC5BQl9TSUdORUQoMSdiMCksIC5MQ1VfV0lEVEgoTENVX1dJRFRIKSwgLkJVREdFVChCVURHRVQtQ09TVCksIC5DSShDSSkpCiAgICAgICAgICAgICAgICAgICAgX1RFQ0hNQVBfUkVQTEFDRV8gKC5BKEFbQUJfV0lEVEgtMjowXSksIC5CKEJbQUJfV0lEVEgtMjowXSksIC5QKFBfKSwgLkcoR18pLCAuWShZKSk7CiAgICAgICAgZW5kCiAgICBlbmQKZW5kZ2VuZXJhdGUKZW5kbW9kdWxlCg==';
Module['FS_createDataFile']('/share', 'cmp2lcu.v', decodeBase64(fileData3), true, true, false);
var fileData4 = 'bGlicmFyeSh5b3N5c19jZWxscykgewoJY2VsbChERkZfTikgewoJCWZmKElRLCBJUU4pIHsKCQkJY2xvY2tlZF9vbjogIiFDIjsKCQkJbmV4dF9zdGF0ZTogIkQiOwoJCX0KCQlwaW4oRCkgeyBkaXJlY3Rpb246IGlucHV0OyB9CgkJcGluKEMpIHsgZGlyZWN0aW9uOiBpbnB1dDsgY2xvY2s6IHRydWU7IH0KCQlwaW4oUSkgeyBkaXJlY3Rpb246IG91dHB1dDsgZnVuY3Rpb246ICJJUSI7IH0KCX0KCWNlbGwoREZGX1ApIHsKCQlmZihJUSwgSVFOKSB7CgkJCWNsb2NrZWRfb246ICJDIjsKCQkJbmV4dF9zdGF0ZTogIkQiOwoJCX0KCQlwaW4oRCkgeyBkaXJlY3Rpb246IGlucHV0OyB9CgkJcGluKEMpIHsgZGlyZWN0aW9uOiBpbnB1dDsgY2xvY2s6IHRydWU7IH0KCQlwaW4oUSkgeyBkaXJlY3Rpb246IG91dHB1dDsgZnVuY3Rpb246ICJJUSI7IH0KCX0KCWNlbGwoREZGX05OMCkgewoJCWZmKElRLCBJUU4pIHsKCQkJY2xvY2tlZF9vbjogIiFDIjsKCQkJbmV4dF9zdGF0ZTogIkQiOwoJCQljbGVhcjogIiFSIjsKCQl9CgkJcGluKEQpIHsgZGlyZWN0aW9uOiBpbnB1dDsgfQoJCXBpbihSKSB7IGRpcmVjdGlvbjogaW5wdXQ7IH0KCQlwaW4oQykgeyBkaXJlY3Rpb246IGlucHV0OyBjbG9jazogdHJ1ZTsgfQoJCXBpbihRKSB7IGRpcmVjdGlvbjogb3V0cHV0OyBmdW5jdGlvbjogIklRIjsgfQoJfQoJY2VsbChERkZfTk4xKSB7CgkJZmYoSVEsIElRTikgewoJCQljbG9ja2VkX29uOiAiIUMiOwoJCQluZXh0X3N0YXRlOiAiRCI7CgkJCXByZXNldDogIiFSIjsKCQl9CgkJcGluKEQpIHsgZGlyZWN0aW9uOiBpbnB1dDsgfQoJCXBpbihSKSB7IGRpcmVjdGlvbjogaW5wdXQ7IH0KCQlwaW4oQykgeyBkaXJlY3Rpb246IGlucHV0OyBjbG9jazogdHJ1ZTsgfQoJCXBpbihRKSB7IGRpcmVjdGlvbjogb3V0cHV0OyBmdW5jdGlvbjogIklRIjsgfQoJfQoJY2VsbChERkZfTlAwKSB7CgkJZmYoSVEsIElRTikgewoJCQljbG9ja2VkX29uOiAiIUMiOwoJCQluZXh0X3N0YXRlOiAiRCI7CgkJCWNsZWFyOiAiUiI7CgkJfQoJCXBpbihEKSB7IGRpcmVjdGlvbjogaW5wdXQ7IH0KCQlwaW4oUikgeyBkaXJlY3Rpb246IGlucHV0OyB9CgkJcGluKEMpIHsgZGlyZWN0aW9uOiBpbnB1dDsgY2xvY2s6IHRydWU7IH0KCQlwaW4oUSkgeyBkaXJlY3Rpb246IG91dHB1dDsgZnVuY3Rpb246ICJJUSI7IH0KCX0KCWNlbGwoREZGX05QMSkgewoJCWZmKElRLCBJUU4pIHsKCQkJY2xvY2tlZF9vbjogIiFDIjsKCQkJbmV4dF9zdGF0ZTogIkQiOwoJCQlwcmVzZXQ6ICJSIjsKCQl9CgkJcGluKEQpIHsgZGlyZWN0aW9uOiBpbnB1dDsgfQoJCXBpbihSKSB7IGRpcmVjdGlvbjogaW5wdXQ7IH0KCQlwaW4oQykgeyBkaXJlY3Rpb246IGlucHV0OyBjbG9jazogdHJ1ZTsgfQoJCXBpbihRKSB7IGRpcmVjdGlvbjogb3V0cHV0OyBmdW5jdGlvbjogIklRIjsgfQoJfQoJY2VsbChERkZfUE4wKSB7CgkJZmYoSVEsIElRTikgewoJCQljbG9ja2VkX29uOiAiQyI7CgkJCW5leHRfc3RhdGU6ICJEIjsKCQkJY2xlYXI6ICIhUiI7CgkJfQoJCXBpbihEKSB7IGRpcmVjdGlvbjogaW5wdXQ7IH0KCQlwaW4oUikgeyBkaXJlY3Rpb246IGlucHV0OyB9CgkJcGluKEMpIHsgZGlyZWN0aW9uOiBpbnB1dDsgY2xvY2s6IHRydWU7IH0KCQlwaW4oUSkgeyBkaXJlY3Rpb246IG91dHB1dDsgZnVuY3Rpb246ICJJUSI7IH0KCX0KCWNlbGwoREZGX1BOMSkgewoJCWZmKElRLCBJUU4pIHsKCQkJY2xvY2tlZF9vbjogIkMiOwoJCQluZXh0X3N0YXRlOiAiRCI7CgkJCXByZXNldDogIiFSIjsKCQl9CgkJcGluKEQpIHsgZGlyZWN0aW9uOiBpbnB1dDsgfQoJCXBpbihSKSB7IGRpcmVjdGlvbjogaW5wdXQ7IH0KCQlwaW4oQykgeyBkaXJlY3Rpb246IGlucHV0OyBjbG9jazogdHJ1ZTsgfQoJCXBpbihRKSB7IGRpcmVjdGlvbjogb3V0cHV0OyBmdW5jdGlvbjogIklRIjsgfQoJfQoJY2VsbChERkZfUFAwKSB7CgkJZmYoSVEsIElRTikgewoJCQljbG9ja2VkX29uOiAiQyI7CgkJCW5leHRfc3RhdGU6ICJEIjsKCQkJY2xlYXI6ICJSIjsKCQl9CgkJcGluKEQpIHsgZGlyZWN0aW9uOiBpbnB1dDsgfQoJCXBpbihSKSB7IGRpcmVjdGlvbjogaW5wdXQ7IH0KCQlwaW4oQykgeyBkaXJlY3Rpb246IGlucHV0OyBjbG9jazogdHJ1ZTsgfQoJCXBpbihRKSB7IGRpcmVjdGlvbjogb3V0cHV0OyBmdW5jdGlvbjogIklRIjsgfQoJfQoJY2VsbChERkZfUFAxKSB7CgkJZmYoSVEsIElRTikgewoJCQljbG9ja2VkX29uOiAiQyI7CgkJCW5leHRfc3RhdGU6ICJEIjsKCQkJcHJlc2V0OiAiUiI7CgkJfQoJCXBpbihEKSB7IGRpcmVjdGlvbjogaW5wdXQ7IH0KCQlwaW4oUikgeyBkaXJlY3Rpb246IGlucHV0OyB9CgkJcGluKEMpIHsgZGlyZWN0aW9uOiBpbnB1dDsgY2xvY2s6IHRydWU7IH0KCQlwaW4oUSkgeyBkaXJlY3Rpb246IG91dHB1dDsgZnVuY3Rpb246ICJJUSI7IH0KCX0KfQo=';
Module['FS_createDataFile']('/share', 'cells.lib', decodeBase64(fileData4), true, true, false);
var fileData5 = 'KCogdGVjaG1hcF9jZWxsdHlwZSA9ICIkcG11eCIgKikKbW9kdWxlIHNtdF9wbXV4IChBLCBCLCBTLCBZKTsKCXBhcmFtZXRlciBXSURUSCA9IDE7CglwYXJhbWV0ZXIgU19XSURUSCA9IDE7CgoJKCogZm9yY2VfZG93bnRvICopCglpbnB1dCBbV0lEVEgtMTowXSBBOwoJKCogZm9yY2VfZG93bnRvICopCglpbnB1dCBbV0lEVEgqU19XSURUSC0xOjBdIEI7CgkoKiBmb3JjZV9kb3dudG8gKikKCWlucHV0IFtTX1dJRFRILTE6MF0gUzsKCSgqIGZvcmNlX2Rvd250byAqKQoJb3V0cHV0IFtXSURUSC0xOjBdIFk7CgoJKCogZm9yY2VfZG93bnRvICopCgl3aXJlIFtXSURUSC0xOjBdIFlfQjsKCglnZW52YXIgaSwgajsKCWdlbmVyYXRlCgkJKCogZm9yY2VfZG93bnRvICopCgkJd2lyZSBbV0lEVEgqKFNfV0lEVEgrMSktMTowXSBDOwoKCQlhc3NpZ24gQ1tXSURUSC0xOjBdID0gQTsKCQlmb3IgKGkgPSAwOyBpIDwgU19XSURUSDsgaSA9IGkgKyAxKQoJCQlhc3NpZ24gQ1tXSURUSCooaSsyKS0xOldJRFRIKihpKzEpXSA9IFNbaV0gPyBCW1dJRFRIKihpKzEpLTE6V0lEVEgqaV0gOiBDW1dJRFRIKihpKzEpLTE6V0lEVEgqaV07CgkJYXNzaWduIFkgPSBDW1dJRFRIKihTX1dJRFRIKzEpLTE6V0lEVEgqU19XSURUSF07CgllbmRnZW5lcmF0ZQplbmRtb2R1bGUK';
Module['FS_createDataFile']('/share', 'smtmap.v', decodeBase64(fileData5), true, true, false);
var fileData6 = 'KCogYWJjOV9ib3ggKikKbW9kdWxlICRfX0FCQzlfREVMQVkgKGlucHV0IEksIG91dHB1dCBPKTsKICBwYXJhbWV0ZXIgREVMQVkgPSAwOwogIHNwZWNpZnkKICAgIChJID0+IE8pID0gREVMQVk7CiAgZW5kc3BlY2lmeQplbmRtb2R1bGUKCm1vZHVsZSAkX19BQkM5X1NDQ19CUkVBS0VSIChpbnB1dCBbV0lEVEgtMTowXSBJLCBvdXRwdXQgW1dJRFRILTE6MF0gTyk7CnBhcmFtZXRlciBXSURUSCA9IDA7CmVuZG1vZHVsZQoKKCogYWJjOV9mbG9wLCBhYmM5X2JveCwgbGliX3doaXRlYm94ICopCm1vZHVsZSAkX19ERkZfTl9fJGFiYzlfZmxvcCAoaW5wdXQgQywgRCwgUSwgb3V0cHV0IG4xKTsKICBhc3NpZ24gbjEgPSBEOwogIHNwZWNpZnkKICAgICRzZXR1cChELCBwb3NlZGdlIEMsIDApOwogICAgKHBvc2VkZ2UgQyA9PiAobjE6RCkpID0gMDsKICBlbmRzcGVjaWZ5CmVuZG1vZHVsZQoKKCogYWJjOV9mbG9wLCBhYmM5X2JveCwgbGliX3doaXRlYm94ICopCm1vZHVsZSAkX19ERkZfUF9fJGFiYzlfZmxvcCAoaW5wdXQgQywgRCwgUSwgb3V0cHV0IG4xKTsKICBhc3NpZ24gbjEgPSBEOwogIHNwZWNpZnkKICAgICRzZXR1cChELCBwb3NlZGdlIEMsIDApOwogICAgKHBvc2VkZ2UgQyA9PiAobjE6RCkpID0gMDsKICBlbmRzcGVjaWZ5CmVuZG1vZHVsZQo=';
Module['FS_createDataFile']('/share', 'abc9_model.v', decodeBase64(fileData6), true, true, false);
var fileData7 = 'LyoKICogIHlvc3lzIC0tIFlvc3lzIE9wZW4gU1ludGhlc2lzIFN1aXRlCiAqCiAqICBDb3B5cmlnaHQgKEMpIDIwMTIgIENsYWlyZSBYZW5pYSBXb2xmIDxjbGFpcmVAeW9zeXNocS5jb20+CiAqCiAqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKICogIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKICogIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAqCiAqICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKICogIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiAqICBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCiAqICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KICogIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiAqICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKgogKiAgLS0tCiAqCiAqICBUaGUgaW50ZXJuYWwgbG9naWMgY2VsbCBzaW11bGF0aW9uIGxpYnJhcnkuCiAqCiAqICBUaGlzIFZlcmlsb2cgbGlicmFyeSBjb250YWlucyBzaW1wbGUgc2ltdWxhdGlvbiBtb2RlbHMgZm9yIHRoZSBpbnRlcm5hbAogKiAgbG9naWMgY2VsbHMgKCRfTk9UXyAsICRfQU5EXyAsIC4uLikgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBkZWZhdWx0IHRlY2hub2xvZ3kKICogIG1hcHBlciAoc2VlICJ0ZWNobWFwLnYiIGluIHRoaXMgZGlyZWN0b3J5KSBhbmQgZXhwZWN0ZWQgYnkgdGhlICJhYmMiIHBhc3MuCiAqCiAqLwoKLy8gIHwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfAovLy0KLy8tICAgICAkX0JVRl8gKEEsIFkpCi8vLQovLy0gQSBidWZmZXIuIFRoaXMgY2VsbCB0eXBlIGlzIGFsd2F5cyBvcHRpbWl6ZWQgYXdheSBieSB0aGUgb3B0X2NsZWFuIHBhc3MuCi8vLQovLy0gVHJ1dGggdGFibGU6ICAgIEEgfCBZCi8vLSAgICAgICAgICAgICAgICAtLS0rLS0tCi8vLSAgICAgICAgICAgICAgICAgMCB8IDAKLy8tICAgICAgICAgICAgICAgICAxIHwgMQovLy0KbW9kdWxlIFwkX0JVRl8gKEEsIFkpOwppbnB1dCBBOwpvdXRwdXQgWTsKYXNzaWduIFkgPSBBOwplbmRtb2R1bGUKCi8vICB8LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwKLy8tCi8vLSAgICAgJF9OT1RfIChBLCBZKQovLy0KLy8tIEFuIGludmVydGVyIGdhdGUuCi8vLQovLy0gVHJ1dGggdGFibGU6ICAgIEEgfCBZCi8vLSAgICAgICAgICAgICAgICAtLS0rLS0tCi8vLSAgICAgICAgICAgICAgICAgMCB8IDEKLy8tICAgICAgICAgICAgICAgICAxIHwgMAovLy0KbW9kdWxlIFwkX05PVF8gKEEsIFkpOwppbnB1dCBBOwpvdXRwdXQgWTsKYXNzaWduIFkgPSB+QTsKZW5kbW9kdWxlCgovLyAgfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18Ci8vLQovLy0gICAgICRfQU5EXyAoQSwgQiwgWSkKLy8tCi8vLSBBIDItaW5wdXQgQU5EIGdhdGUuCi8vLQovLy0gVHJ1dGggdGFibGU6ICAgIEEgQiB8IFkKLy8tICAgICAgICAgICAgICAgIC0tLS0tKy0tLQovLy0gICAgICAgICAgICAgICAgIDAgMCB8IDAKLy8tICAgICAgICAgICAgICAgICAwIDEgfCAwCi8vLSAgICAgICAgICAgICAgICAgMSAwIHwgMAovLy0gICAgICAgICAgICAgICAgIDEgMSB8IDEKLy8tCm1vZHVsZSBcJF9BTkRfIChBLCBCLCBZKTsKaW5wdXQgQSwgQjsKb3V0cHV0IFk7CmFzc2lnbiBZID0gQSAmIEI7CmVuZG1vZHVsZQoKLy8gIHwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfAovLy0KLy8tICAgICAkX05BTkRfIChBLCBCLCBZKQovLy0KLy8tIEEgMi1pbnB1dCBOQU5EIGdhdGUuCi8vLQovLy0gVHJ1dGggdGFibGU6ICAgIEEgQiB8IFkKLy8tICAgICAgICAgICAgICAgIC0tLS0tKy0tLQovLy0gICAgICAgICAgICAgICAgIDAgMCB8IDEKLy8tICAgICAgICAgICAgICAgICAwIDEgfCAxCi8vLSAgICAgICAgICAgICAgICAgMSAwIHwgMQovLy0gICAgICAgICAgICAgICAgIDEgMSB8IDAKLy8tCm1vZHVsZSBcJF9OQU5EXyAoQSwgQiwgWSk7CmlucHV0IEEsIEI7Cm91dHB1dCBZOwphc3NpZ24gWSA9IH4oQSAmIEIpOwplbmRtb2R1bGUKCi8vICB8LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwKLy8tCi8vLSAgICAgJF9PUl8gKEEsIEIsIFkpCi8vLQovLy0gQSAyLWlucHV0IE9SIGdhdGUuCi8vLQovLy0gVHJ1dGggdGFibGU6ICAgIEEgQiB8IFkKLy8tICAgICAgICAgICAgICAgIC0tLS0tKy0tLQovLy0gICAgICAgICAgICAgICAgIDAgMCB8IDAKLy8tICAgICAgICAgICAgICAgICAwIDEgfCAxCi8vLSAgICAgICAgICAgICAgICAgMSAwIHwgMQovLy0gICAgICAgICAgICAgICAgIDEgMSB8IDEKLy8tCm1vZHVsZSBcJF9PUl8gKEEsIEIsIFkpOwppbnB1dCBBLCBCOwpvdXRwdXQgWTsKYXNzaWduIFkgPSBBIHwgQjsKZW5kbW9kdWxlCgovLyAgfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18Ci8vLQovLy0gICAgICRfTk9SXyAoQSwgQiwgWSkKLy8tCi8vLSBBIDItaW5wdXQgTk9SIGdhdGUuCi8vLQovLy0gVHJ1dGggdGFibGU6ICAgIEEgQiB8IFkKLy8tICAgICAgICAgICAgICAgIC0tLS0tKy0tLQovLy0gICAgICAgICAgICAgICAgIDAgMCB8IDEKLy8tICAgICAgICAgICAgICAgICAwIDEgfCAwCi8vLSAgICAgICAgICAgICAgICAgMSAwIHwgMAovLy0gICAgICAgICAgICAgICAgIDEgMSB8IDAKLy8tCm1vZHVsZSBcJF9OT1JfIChBLCBCLCBZKTsKaW5wdXQgQSwgQjsKb3V0cHV0IFk7CmFzc2lnbiBZID0gfihBIHwgQik7CmVuZG1vZHVsZQoKLy8gIHwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfAovLy0KLy8tICAgICAkX1hPUl8gKEEsIEIsIFkpCi8vLQovLy0gQSAyLWlucHV0IFhPUiBnYXRlLgovLy0KLy8tIFRydXRoIHRhYmxlOiAgICBBIEIgfCBZCi8vLSAgICAgICAgICAgICAgICAtLS0tLSstLS0KLy8tICAgICAgICAgICAgICAgICAwIDAgfCAwCi8vLSAgICAgICAgICAgICAgICAgMCAxIHwgMQovLy0gICAgICAgICAgICAgICAgIDEgMCB8IDEKLy8tICAgICAgICAgICAgICAgICAxIDEgfCAwCi8vLQptb2R1bGUgXCRfWE9SXyAoQSwgQiwgWSk7CmlucHV0IEEsIEI7Cm91dHB1dCBZOwphc3NpZ24gWSA9IEEgXiBCOwplbmRtb2R1bGUKCi8vICB8LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwKLy8tCi8vLSAgICAgJF9YTk9SXyAoQSwgQiwgWSkKLy8tCi8vLSBBIDItaW5wdXQgWE5PUiBnYXRlLgovLy0KLy8tIFRydXRoIHRhYmxlOiAgICBBIEIgfCBZCi8vLSAgICAgICAgICAgICAgICAtLS0tLSstLS0KLy8tICAgICAgICAgICAgICAgICAwIDAgfCAxCi8vLSAgICAgICAgICAgICAgICAgMCAxIHwgMAovLy0gICAgICAgICAgICAgICAgIDEgMCB8IDAKLy8tICAgICAgICAgICAgICAgICAxIDEgfCAxCi8vLQptb2R1bGUgXCRfWE5PUl8gKEEsIEIsIFkpOwppbnB1dCBBLCBCOwpvdXRwdXQgWTsKYXNzaWduIFkgPSB+KEEgXiBCKTsKZW5kbW9kdWxlCgovLyAgfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18Ci8vLQovLy0gICAgICRfQU5ETk9UXyAoQSwgQiwgWSkKLy8tCi8vLSBBIDItaW5wdXQgQU5ELU5PVCBnYXRlLgovLy0KLy8tIFRydXRoIHRhYmxlOiAgICBBIEIgfCBZCi8vLSAgICAgICAgICAgICAgICAtLS0tLSstLS0KLy8tICAgICAgICAgICAgICAgICAwIDAgfCAwCi8vLSAgICAgICAgICAgICAgICAgMCAxIHwgMAovLy0gICAgICAgICAgICAgICAgIDEgMCB8IDEKLy8tICAgICAgICAgICAgICAgICAxIDEgfCAwCi8vLQptb2R1bGUgXCRfQU5ETk9UXyAoQSwgQiwgWSk7CmlucHV0IEEsIEI7Cm91dHB1dCBZOwphc3NpZ24gWSA9IEEgJiAofkIpOwplbmRtb2R1bGUKCi8vICB8LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwKLy8tCi8vLSAgICAgJF9PUk5PVF8gKEEsIEIsIFkpCi8vLQovLy0gQSAyLWlucHV0IE9SLU5PVCBnYXRlLgovLy0KLy8tIFRydXRoIHRhYmxlOiAgICBBIEIgfCBZCi8vLSAgICAgICAgICAgICAgICAtLS0tLSstLS0KLy8tICAgICAgICAgICAgICAgICAwIDAgfCAxCi8vLSAgICAgICAgICAgICAgICAgMCAxIHwgMAovLy0gICAgICAgICAgICAgICAgIDEgMCB8IDEKLy8tICAgICAgICAgICAgICAgICAxIDEgfCAxCi8vLQptb2R1bGUgXCRfT1JOT1RfIChBLCBCLCBZKTsKaW5wdXQgQSwgQjsKb3V0cHV0IFk7CmFzc2lnbiBZID0gQSB8ICh+Qik7CmVuZG1vZHVsZQoKLy8gIHwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfAovLy0KLy8tICAgICAkX01VWF8gKEEsIEIsIFMsIFkpCi8vLQovLy0gQSAyLWlucHV0IE1VWCBnYXRlLgovLy0KLy8tIFRydXRoIHRhYmxlOiAgICBBIEIgUyB8IFkKLy8tICAgICAgICAgICAgICAgIC0tLS0tLS0rLS0tCi8vLSAgICAgICAgICAgICAgICAgYSAtIDAgfCBhCi8vLSAgICAgICAgICAgICAgICAgLSBiIDEgfCBiCi8vLQptb2R1bGUgXCRfTVVYXyAoQSwgQiwgUywgWSk7CmlucHV0IEEsIEIsIFM7Cm91dHB1dCBZOwphc3NpZ24gWSA9IFMgPyBCIDogQTsKZW5kbW9kdWxlCgovLyAgfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18Ci8vLQovLy0gICAgICRfTk1VWF8gKEEsIEIsIFMsIFkpCi8vLQovLy0gQSAyLWlucHV0IGludmVydGluZyBNVVggZ2F0ZS4KLy8tCi8vLSBUcnV0aCB0YWJsZTogICAgQSBCIFMgfCBZCi8vLSAgICAgICAgICAgICAgICAtLS0tLS0tKy0tLQovLy0gICAgICAgICAgICAgICAgIDAgLSAwIHwgMQovLy0gICAgICAgICAgICAgICAgIDEgLSAwIHwgMAovLy0gICAgICAgICAgICAgICAgIC0gMCAxIHwgMQovLy0gICAgICAgICAgICAgICAgIC0gMSAxIHwgMAovLy0KbW9kdWxlIFwkX05NVVhfIChBLCBCLCBTLCBZKTsKaW5wdXQgQSwgQiwgUzsKb3V0cHV0IFk7CmFzc2lnbiBZID0gUyA/ICFCIDogIUE7CmVuZG1vZHVsZQoKLy8gIHwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfAovLy0KLy8tICAgICAkX01VWDRfIChBLCBCLCBDLCBELCBTLCBULCBZKQovLy0KLy8tIEEgNC1pbnB1dCBNVVggZ2F0ZS4KLy8tCi8vLSBUcnV0aCB0YWJsZTogICAgQSBCIEMgRCBTIFQgfCBZCi8vLSAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tKy0tLQovLy0gICAgICAgICAgICAgICAgIGEgLSAtIC0gMCAwIHwgYQovLy0gICAgICAgICAgICAgICAgIC0gYiAtIC0gMSAwIHwgYgovLy0gICAgICAgICAgICAgICAgIC0gLSBjIC0gMCAxIHwgYwovLy0gICAgICAgICAgICAgICAgIC0gLSAtIGQgMSAxIHwgZAovLy0KbW9kdWxlIFwkX01VWDRfIChBLCBCLCBDLCBELCBTLCBULCBZKTsKaW5wdXQgQSwgQiwgQywgRCwgUywgVDsKb3V0cHV0IFk7CmFzc2lnbiBZID0gVCA/IChTID8gRCA6IEMpIDoKICAgICAgICAgICAgICAgKFMgPyBCIDogQSk7CmVuZG1vZHVsZQoKLy8gIHwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfAovLy0KLy8tICAgICAkX01VWDhfIChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBTLCBULCBVLCBZKQovLy0KLy8tIEFuIDgtaW5wdXQgTVVYIGdhdGUuCi8vLQovLy0gVHJ1dGggdGFibGU6ICAgIEEgQiBDIEQgRSBGIEcgSCBTIFQgVSB8IFkKLy8tICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLQovLy0gICAgICAgICAgICAgICAgIGEgLSAtIC0gLSAtIC0gLSAwIDAgMCB8IGEKLy8tICAgICAgICAgICAgICAgICAtIGIgLSAtIC0gLSAtIC0gMSAwIDAgfCBiCi8vLSAgICAgICAgICAgICAgICAgLSAtIGMgLSAtIC0gLSAtIDAgMSAwIHwgYwovLy0gICAgICAgICAgICAgICAgIC0gLSAtIGQgLSAtIC0gLSAxIDEgMCB8IGQKLy8tICAgICAgICAgICAgICAgICAtIC0gLSAtIGUgLSAtIC0gMCAwIDEgfCBlCi8vLSAgICAgICAgICAgICAgICAgLSAtIC0gLSAtIGYgLSAtIDEgMCAxIHwgZgovLy0gICAgICAgICAgICAgICAgIC0gLSAtIC0gLSAtIGcgLSAwIDEgMSB8IGcKLy8tICAgICAgICAgICAgICAgICAtIC0gLSAtIC0gLSAtIGggMSAxIDEgfCBoCi8vLQptb2R1bGUgXCRfTVVYOF8gKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFMsIFQsIFUsIFkpOwppbnB1dCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBTLCBULCBVOwpvdXRwdXQgWTsKYXNzaWduIFkgPSBVID8gVCA/IChTID8gSCA6IEcpIDoKICAgICAgICAgICAgICAgICAgIChTID8gRiA6IEUpIDoKICAgICAgICAgICAgICAgVCA/IChTID8gRCA6IEMpIDoKICAgICAgICAgICAgICAgICAgIChTID8gQiA6IEEpOwplbmRtb2R1bGUKCi8vICB8LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwtLS12LS0tfC0tLXYtLS18LS0tdi0tLXwKLy8tCi8vLSAgICAgJF9NVVgxNl8gKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIEksIEosIEssIEwsIE0sIE4sIE8sIFAsIFMsIFQsIFUsIFYsIFkpCi8vLQovLy0gQSAxNi1pbnB1dCBNVVggZ2F0ZS4KLy8tCi8vLSBUcnV0aCB0YWJsZTogICAgQSBCIEMgRCBFIEYgRyBIIEkgSiBLIEwgTSBOIE8gUCBTIFQgVSBWIHwgWQovLy0gICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tCi8vLSAgICAgICAgICAgICAgICAgYSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAwIDAgMCAwIHwgYQovLy0gICAgICAgICAgICAgICAgIC0gYiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gMSAwIDAgMCB8IGIKLy8tICAgICAgICAgICAgICAgICAtIC0gYyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIDAgMSAwIDAgfCBjCi8vLSAgICAgICAgICAgICAgICAgLSAtIC0gZCAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAxIDEgMCAwIHwgZAovLy0gICAgICAgICAgICAgICAgIC0gLSAtIC0gZSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gMCAwIDEgMCB8IGUKLy8tICAgICAgICAgICAgICAgICAtIC0gLSAtIC0gZiAtIC0gLSAtIC0gLSAtIC0gLSAtIDEgMCAxIDAgfCBmCi8vLSAgICAgICAgICAgICAgICAgLSAtIC0gLSAtIC0gZyAtIC0gLSAtIC0gLSAtIC0gLSAwIDEgMSAwIHwgZwovLy0gICAgICAgICAgICAgICAgIC0gLSAtIC0gLSAtIC0gaCAtIC0gLSAtIC0gLSAtIC0gMSAxIDEgMCB8IGgKLy8tICAgICAgICAgICAgICAgICAtIC0gLSAtIC0gLSAtIC0gaSAtIC0gLSAtIC0gLSAtIDAgMCAwIDEgfCBpCi8vLSAgICAgICAgICAgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0gaiAtIC0gLSAtIC0gLSAxIDAgMCAxIHwgagovLy0gICAgICAgICAgICAgICAgIC0gLSAtIC0gLSAtIC0gLSAtIC0gayAtIC0gLSAtIC0gMCAxIDAgMSB8IGsKLy8tICAgICAgICAgICAgICAgICAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gbCAtIC0gLSAtIDEgMSAwIDEgfCBsCi8vLSAgICAgICAgICAgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gbSAtIC0gLSAwIDAgMSAxIHwgbQovLy0gICAgICAgICAgICAgICAgIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gbiAtIC0gMSAwIDEgMSB8IG4KLy8tICAgICAgICAgICAgICAgICAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gbyAtIDAgMSAxIDEgfCBvCi8vLSAgICAgICAgICAgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gcCAxIDEgMSAxIHwgcAovLy0KbW9kdWxlIFwkX01VWDE2XyAoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgSSwgSiwgSywgTCwgTSwgTiwgTywgUCwgUywgVCwgVSwgViwgWSk7CmlucHV0IEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIEksIEosIEssIEwsIE0sIE4sIE8sIFAsIFMsIFQsIFUsIFY7Cm91dHB1dCBZOwphc3NpZ24gWSA9IFYgPyBVID8gVCA/IChTID8gUCA6IE8pIDoKICAgICAgICAgICAgICAgICAgICAgICAoUyA/IE4gOiBNKSA6CiAgICAgICAgICAgICAgICAgICBUID8gKFMgPyBMIDogSykgOgogICAgICAgICAgICAgICAgICAgICAgIChTID8gSiA6IEkpIDoKICAgICAgICAgICAgICAgVSA/IFQgPyAoUyA/IEggOiBHKSA6CiAgICAgICAgICAgICAgICAgICAgICAgKFMgPyBGIDogRSkgOgogICAgICAgICAgICAgICAgICAgVCA/IChTID8gRCA6IEMpIDoKICA