diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..e69de29 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..33cd640 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/rust_runtime.iml b/.idea/rust_runtime.iml new file mode 100644 index 0000000..0c25ece --- /dev/null +++ b/.idea/rust_runtime.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 0f7d129..7cb2787 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,28 +1,406 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base58ck" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8d66485a3a2ea485c1913c4572ce0256067a5377ac8c75c4960e1cda98605f" +dependencies = [ + "bitcoin-internals", + "bitcoin_hashes", +] + +[[package]] +name = "bech32" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" + +[[package]] +name = "bitcoin" +version = "0.32.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6bc65742dea50536e35ad42492b234c27904a27f0abdcbce605015cb4ea026" +dependencies = [ + "base58ck", + "bech32", + "bitcoin-internals", + "bitcoin-io", + "bitcoin-units", + "bitcoin_hashes", + "hex-conservative", + "hex_lit", + "secp256k1 0.29.1", +] + +[[package]] +name = "bitcoin-internals" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bdbe14aa07b06e6cfeffc529a1f099e5fbe249524f8125358604df99a4bed2" + +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + +[[package]] +name = "bitcoin-units" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5285c8bcaa25876d07f37e3d30c303f2609179716e11d688f51e8f1fe70063e2" +dependencies = [ + "bitcoin-internals", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cc" +version = "1.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "ethnum" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" [[package]] name = "example" version = "0.1.0" dependencies = [ - "hex", + "lol_alloc", "rust_runtime", - "wasm_allocator", + "sha2-const", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hex_lit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" + +[[package]] +name = "libc" +version = "0.2.168" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" + +[[package]] +name = "libc-print" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a660208db49e35faf57b37484350f1a61072f2a5becf0592af6015d9ddd4b0" +dependencies = [ + "libc", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "lol_alloc" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e5106554cabc97552dcadf54f57560ae6af3276652f82ca2be06120dc4c5dc" +dependencies = [ + "spin", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", ] [[package]] -name = "hex" -version = "0.4.3" +name = "ripemd" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest", +] [[package]] name = "rust_runtime" version = "0.1.0" +dependencies = [ + "bitcoin", + "ethnum", + "libc-print", + "rand", + "ripemd", + "secp256k1 0.30.0", + "sha2-const", +] [[package]] -name = "wasm_allocator" -version = "0.1.1" +name = "scopeguard" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c8f71f7436c9b614d8b94613c053fb38e87fd22796cc27c780ee97ec9a085b1" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "secp256k1" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" +dependencies = [ + "bitcoin_hashes", + "secp256k1-sys", +] + +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes", + "rand", + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + +[[package]] +name = "sha2-const" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5edcd790916d95ff81bdc1505b09c74d30d47a755929cc8c71c59cbbfa99f91b" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "syn" +version = "2.0.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index 5b1dcf6..b8b8dce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,36 @@ -[package] -name = "rust_runtime" +[workspace.package] version = "0.1.0" +authors = ["Martin Miksanik"] +description = "Rust runtime for OP_NET" +documentation = "https://dev.opnet.org/" edition = "2021" +[workspace.dependencies] +# This crate is much larger than expected. Avoid using it unless absolutely necessary. +ethnum = "1.5.0" +lol_alloc = "0.4.1" +rust_runtime = { path = "." } +sha2-const = "0.1.2" + +[package] +name = "rust_runtime" +version = { workspace = true } +edition = { workspace = true } + [workspace] members = ["example"] - [dependencies] +# This crate is much larger than expected. Avoid using it unless absolutely necessary. +ethnum = { workspace = true } +sha2-const = { workspace = true } +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +rand = { version = "0.8.5" } +libc-print = { version = "0.1.22" } +ripemd = "0.1.3" +bitcoin = "0.32.5" +secp256k1 = { version = "0.30.0", features = ["rand", "hashes", "std"] } +[features] +std = [] diff --git a/Makefile.toml b/Makefile.toml new file mode 100644 index 0000000..dca5ba3 --- /dev/null +++ b/Makefile.toml @@ -0,0 +1,46 @@ +[tasks.format] +install_crate = "rustfmt" +command = "cargo" +args = ["fmt", "--", "--emit=files"] + +[tasks.clean] +command = "cargo" +args = ["clean"] + +[tasks.build] +command = "cargo" +args = ["build", "--release", "-p", "example"] +dependencies = ["clean"] + +[tasks.opt] +command = "wasm-opt" +args = [ + "-O2", + "-Oz", + "--strip-debug", + "--strip-dwarf", + "--dce", + "--disable-multimemory", + "--disable-fp16", + "--disable-mutable-globals", + "--disable-gc", + "--disable-multivalue", + "--disable-nontrapping-float-to-int", + "--disable-threads", + "--mvp-features", + "--remove-unused-module-elements", + "target/wasm32-unknown-unknown/release/example.wasm", + "-o", + "target/wasm32-unknown-unknown/release/example.wasm" +] +dependencies = ["build"] + +[tasks.super] +command = "echo" +args = ["hello", "world"] +dependencies = ["build"] + +[tasks.test] +command = "cargo" +args = ["test"] +dependencies = ["clean"] \ No newline at end of file diff --git a/README.md b/README.md index 2409020..7e3ae45 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,40 @@ # Rust runtime for OP_NET VM + * Rust contract is able to run under [op-vm](https://github.com/btc-vision/op-vm) * The interface is defined by [btc-runtime](https://github.com/btc-vision/btc-runtime) * Library is tested like: [opnet-unit-test](https://github.com/btc-vision/opnet-unit-test) +* Reference contract: [OP_20](https://github.com/btc-vision/OP_20) ## Compilation + ```sh -cargo build --release -p example -wasm-opt -O2 -Oz ../target/wasm32-unknown-unknown/release/example.wasm -o ./rust.wasm +rustup install nightly # ensure that you have last nightly version +cargo build --release -p example --target wasm32-unknown-unknown +wasm-opt -O2 -Oz --strip-debug --strip-dwarf --dce --disable-multimemory --disable-fp16 --disable-mutable-globals --disable-gc --disable-multivalue --disable-nontrapping-float-to-int --disable-threads --mvp-features --remove-unused-module-elements ./target/wasm32-unknown-unknown/release/example.wasm -o ./rust.wasm ``` ## Testing + +### With opnet-unit-test on wasm interpreter + ```sh cp ./rust.wasm ../opnet-unit-test/bytecode/rust.wasm -node build/tests/rust.js +node build/tests/rust.js ``` -## Size -* Compiled code from [moto library](https://github.com/btc-vision/moto): 23KB (23464B) -* Unoptimized code from current Rust library: 31KB (31359B) - incomplete -* Optimized code with wasm-opt: 22KB (21778B) - incomplete +### Without wasm32 runtime -## Structure -* `./src/` - Library providing the interface and helper functions for contract interaction -* `./example/` - Sample smart contract, similar to contract used in unit tests +```sh +cargo test --target x86_64-unknown-linux-gnu +``` + +## Size (outdated) -## TODO -### Buffer operations and manipulations -* Investigate if it’s possible to directly map structs to memory -* Write memory manipulation methods (`readAddress`, `readUint32`, etc.) -* Create unit tests and check for memory leaks +* Compiled code from [moto library](https://github.com/btc-vision/OP_20): 24KB (24689) +* Unoptimized code from current Rust library: 45KB (45584) +* Optimized code with wasm-opt: 33KB (33573) -## Contract helpers -* Coding methods like `byte4`, `encodeSelector`, `hash`, etc. -* Decoding passed buffers (`set_environment`, `execute`, `on_deploy`) into correct structures +## Structure -## Smart contract and unit tests -* Copy basic functionality from OP20 contract to examples, as needed +* `./src/` - Library providing the interface and helper functions for contract interaction +* `./example/` - Sample smart contract, similar to contract used in unit tests diff --git a/done.js b/done.js deleted file mode 100644 index 2be7399..0000000 --- a/done.js +++ /dev/null @@ -1,9016 +0,0 @@ -import * as env from 'env'; - - var bufferView; - var base64ReverseLookup = new Uint8Array(123/*'z'+1*/); - for (var i = 25; i >= 0; --i) { - base64ReverseLookup[48+i] = 52+i; // '0-9' - base64ReverseLookup[65+i] = i; // 'A-Z' - base64ReverseLookup[97+i] = 26+i; // 'a-z' - } - base64ReverseLookup[43] = 62; // '+' - base64ReverseLookup[47] = 63; // '/' - /** @noinline Inlining this function would mean expanding the base64 string 4x times in the source code, which Closure seems to be happy to do. */ - function base64DecodeToExistingUint8Array(uint8Array, offset, b64) { - var b1, b2, i = 0, j = offset, bLength = b64.length, end = offset + (bLength*3>>2) - (b64[bLength-2] == '=') - (b64[bLength-1] == '='); - for (; i < bLength; i += 4) { - b1 = base64ReverseLookup[b64.charCodeAt(i+1)]; - b2 = base64ReverseLookup[b64.charCodeAt(i+2)]; - uint8Array[j++] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4; - if (j < end) uint8Array[j++] = b1 << 4 | b2 >> 2; - if (j < end) uint8Array[j++] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i+3)]; - } - } -function initActiveSegments(imports) { - base64DecodeToExistingUint8Array(bufferView, 1048576, "AwAAAAwAAAAEAAAABAAAAAUAAAAGAAAAL3J1c3QvZGVwcy9kbG1hbGxvYy0wLjIuNi9zcmMvZGxtYWxsb2MucnNhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkABgAEAApAAAAqAQAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA8PSBzaXplICsgbWF4X292ZXJoZWFkAAAYABAAKQAAAK4EAAANAAAAbWVtb3J5IGFsbG9jYXRpb24gb2YgIGJ5dGVzIGZhaWxlZAAAwAAQABUAAADVABAADQAAAHN0ZC9zcmMvYWxsb2MucnP0ABAAEAAAAGMBAAAJAAAAAwAAAAwAAAAEAAAABwAAAAAAAAAIAAAABAAAAAgAAAAAAAAACAAAAAQAAAAJAAAACgAAAAsAAAAMAAAADQAAABAAAAAEAAAADgAAAA8AAAAQAAAAEQAAAEVycm9yAAAAEgAAAAwAAAAEAAAAEwAAABQAAAAVAAAAY2FwYWNpdHkgb3ZlcmZsb3cAAACMARAAEQAAAGFsbG9jL3NyYy9yYXdfdmVjLnJzqAEQABQAAAAYAAAABQAAAAAAAAAAAAAAAQAAABYAAABhIGZvcm1hdHRpbmcgdHJhaXQgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3Igd2hlbiB0aGUgdW5kZXJseWluZyBzdHJlYW0gZGlkIG5vdGFsbG9jL3NyYy9mbXQucnMAADICEAAQAAAAfgIAAA4AAABbY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZWluZGV4IG91dCBvZiBib3VuZHM6IHRoZSBsZW4gaXMgIGJ1dCB0aGUgaW5kZXggaXMgAACAAhAAIAAAAKACEAASAAAAOiAAAAEAAAAAAAAAxAIQAAIAAAAAAAAADAAAAAQAAAAZAAAAGgAAABsAAAAgICAgLCAsCgpdY29yZS9zcmMvZm10L251bS5ycwAAAPoCEAATAAAAZgAAABcAAAAweDAwMDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5cmFuZ2Ugc3RhcnQgaW5kZXggIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIAAA6gMQABIAAAD8AxAAIgAAAHJhbmdlIGVuZCBpbmRleCAwBBAAEAAAAPwDEAAiAAAAL3J1c3RjLzNlOWJkOGI1NjZhNDdjNWQxYzFkYmM3ZTA0M2I0YjdmYTUzMzBlY2EvbGlicmFyeS9hbGxvYy9zcmMvY29sbGVjdGlvbnMvYnRyZWUvbWFwL2VudHJ5LnJzUAQQAGAAAABxAQAANgAAAC9ydXN0Yy8zZTliZDhiNTY2YTQ3YzVkMWMxZGJjN2UwNDNiNGI3ZmE1MzMwZWNhL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL25vZGUucnNhc3NlcnRpb24gZmFpbGVkOiBlZGdlLmhlaWdodCA9PSBzZWxmLmhlaWdodCAtIDEAwAQQAFsAAACvAgAACQAAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGU6IGVtcHR5IGludGVybmFsIG5vZGUAAABcBRAAPQAAAMAEEABbAAAAKwUAAB8AAABhc3NlcnRpb24gZmFpbGVkOiBzZWxmLmhlaWdodCA+IDAAAADABBAAWwAAAGICAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogc3JjLmxlbigpID09IGRzdC5sZW4oKcAEEABbAAAALwcAAAUAAADABBAAWwAAAK8EAAAjAAAAwAQQAFsAAADvBAAAJAAAAGFzc2VydGlvbiBmYWlsZWQ6IGVkZ2UuaGVpZ2h0ID09IHNlbGYubm9kZS5oZWlnaHQgLSAxAAAAwAQQAFsAAADwAwAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IG9sZF9yaWdodF9sZW4gKyBjb3VudCA8PSBDQVBBQ0lUWQDABBAAWwAAANwFAAANAAAAYXNzZXJ0aW9uIGZhaWxlZDogb2xkX2xlZnRfbGVuID49IGNvdW50AMAEEABbAAAA3QUAAA0AAABpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlwAQQAFsAAAAMBgAAFgAAAGFzc2VydGlvbiBmYWlsZWQ6IG9sZF9sZWZ0X2xlbiArIGNvdW50IDw9IENBUEFDSVRZAADABBAAWwAAABsGAAANAAAAYXNzZXJ0aW9uIGZhaWxlZDogb2xkX3JpZ2h0X2xlbiA+PSBjb3VudMAEEABbAAAAHAYAAA0AAADABBAAWwAAAEwGAAAWAAAAYXNzZXJ0aW9uIGZhaWxlZDogbWF0Y2ggdHJhY2tfZWRnZV9pZHggewogICAgTGVmdE9yUmlnaHQ6OkxlZnQoaWR4KSA9PiBpZHggPD0gb2xkX2xlZnRfbGVuLAogICAgTGVmdE9yUmlnaHQ6OlJpZ2h0KGlkeCkgPT4gaWR4IDw9IHJpZ2h0X2xlbiwKfQAAwAQQAFsAAACuBQAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IG5ld19sZWZ0X2xlbiA8PSBDQVBBQ0lUWQAAwAQQAFsAAABhBQAACQAAAGNhcGFjaXR5IG92ZXJmbG93AAAApAgQABEAAAAvcnVzdGMvM2U5YmQ4YjU2NmE0N2M1ZDFjMWRiYzdlMDQzYjRiN2ZhNTMzMGVjYS9saWJyYXJ5L2FsbG9jL3NyYy92ZWMvc3BlY19mcm9tX2l0ZXJfbmVzdGVkLnJzAADACBAAXgAAADkAAAASAAAAL3J1c3RjLzNlOWJkOGI1NjZhNDdjNWQxYzFkYmM3ZTA0M2I0YjdmYTUzMzBlY2EvbGlicmFyeS9hbGxvYy9zcmMvY29sbGVjdGlvbnMvYnRyZWUvbWFwL2VudHJ5LnJzMAkQAGAAAAA1AgAAKgAAAC9ydXN0Yy8zZTliZDhiNTY2YTQ3YzVkMWMxZGJjN2UwNDNiNGI3ZmE1MzMwZWNhL2xpYnJhcnkvYWxsb2Mvc3JjL3ZlYy9tb2QucnOgCRAATAAAAEAMAAANAAAAAAAAAAQAAAAEAAAAHQAAAHNyYy9tZW0ucnMAAAwKEAAKAAAANwAAABcAAAAMChAACgAAAIYAAAARAAAADAoQAAoAAACtAAAAEQAAAENlbGwgbm90IGZvdW5kAABIChAADgAAAAwKEAAKAAAA1AAAABEAAAAMChAACgAAAPMAAAANAAAARXhlY3V0ZToge31TZXQgZW52aXJvbm1lbnQ6IIsKEAARAAAAT24gZGVwbG95OiB7fU1lbSBzaXplOg=="); -} -function wasm2js_trap() { throw new Error('abort'); } - -function asmFunc(imports) { - var buffer = new ArrayBuffer(1114112); - var HEAP8 = new Int8Array(buffer); - var HEAP16 = new Int16Array(buffer); - var HEAP32 = new Int32Array(buffer); - var HEAPU8 = new Uint8Array(buffer); - var HEAPU16 = new Uint16Array(buffer); - var HEAPU32 = new Uint32Array(buffer); - var HEAPF32 = new Float32Array(buffer); - var HEAPF64 = new Float64Array(buffer); - var Math_imul = Math.imul; - var Math_fround = Math.fround; - var Math_abs = Math.abs; - var Math_clz32 = Math.clz32; - var Math_min = Math.min; - var Math_max = Math.max; - var Math_floor = Math.floor; - var Math_ceil = Math.ceil; - var Math_trunc = Math.trunc; - var Math_sqrt = Math.sqrt; - var env = imports.env; - var _ZN12rust_runtime3mem3log17hfd3cd80676177765E = env.log; - var __stack_pointer = 1048576; - var global$1 = 1051820; - var global$2 = 1051824; - var __wasm_intrinsics_temp_i64 = 0; - var __wasm_intrinsics_temp_i64$hi = 0; - var i64toi32_i32$HIGH_BITS = 0; - function __rust_alloc($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - return __rdl_alloc($0 | 0, $1 | 0) | 0 | 0; - } - - function __rust_dealloc($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - __rdl_dealloc($0 | 0, $1 | 0, $2 | 0); - return; - } - - function __rust_realloc($0, $1, $2, $3) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - $3 = $3 | 0; - return __rdl_realloc($0 | 0, $1 | 0, $2 | 0, $3 | 0) | 0 | 0; - } - - function __rust_alloc_error_handler($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - __rg_oom($0 | 0, $1 | 0); - return; - } - - function _ZN36_$LT$T$u20$as$u20$core__any__Any$GT$7type_id17h1116370b49193673E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var i64toi32_i32$1 = 0, i64toi32_i32$0 = 0; - i64toi32_i32$1 = $0; - i64toi32_i32$0 = 1676365868; - HEAP32[(i64toi32_i32$1 + 8 | 0) >> 2] = -691315347; - HEAP32[(i64toi32_i32$1 + 12 | 0) >> 2] = i64toi32_i32$0; - i64toi32_i32$0 = -1182065807; - HEAP32[i64toi32_i32$1 >> 2] = 1470513528; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - } - - function _ZN36_$LT$T$u20$as$u20$core__any__Any$GT$7type_id17h698f49bbed3b63dfE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var i64toi32_i32$1 = 0, i64toi32_i32$0 = 0; - i64toi32_i32$1 = $0; - i64toi32_i32$0 = 2063459409; - HEAP32[(i64toi32_i32$1 + 8 | 0) >> 2] = 2100447575; - HEAP32[(i64toi32_i32$1 + 12 | 0) >> 2] = i64toi32_i32$0; - i64toi32_i32$0 = -718796931; - HEAP32[i64toi32_i32$1 >> 2] = -1437107046; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - } - - function _ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve21do_reserve_and_handle17h5e9daeeab98ea459E($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, $4 = 0; - $3 = __stack_pointer - 32 | 0; - __stack_pointer = $3; - label$1 : { - $2 = $1 + $2 | 0; - if ($2 >>> 0 >= $1 >>> 0) { - break label$1 - } - _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE(0 | 0, 0 | 0); - wasm2js_trap(); - } - $4 = HEAP32[$0 >> 2] | 0; - $1 = $4 << 1 | 0; - $1 = $1 >>> 0 > $2 >>> 0 ? $1 : $2; - $1 = $1 >>> 0 > 8 >>> 0 ? $1 : 8; - $2 = ($1 ^ -1 | 0) >>> 31 | 0; - label$2 : { - label$3 : { - if ($4) { - break label$3 - } - $4 = 0; - break label$2; - } - HEAP32[($3 + 28 | 0) >> 2] = $4; - HEAP32[($3 + 20 | 0) >> 2] = HEAP32[($0 + 4 | 0) >> 2] | 0; - $4 = 1; - } - HEAP32[($3 + 24 | 0) >> 2] = $4; - _ZN5alloc7raw_vec11finish_grow17ha2d904593814b148E($3 + 8 | 0 | 0, $2 | 0, $1 | 0, $3 + 20 | 0 | 0); - label$4 : { - if ((HEAP32[($3 + 8 | 0) >> 2] | 0 | 0) != (1 | 0)) { - break label$4 - } - _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE(HEAP32[($3 + 12 | 0) >> 2] | 0 | 0, HEAP32[($3 + 16 | 0) >> 2] | 0 | 0); - wasm2js_trap(); - } - $2 = HEAP32[($3 + 12 | 0) >> 2] | 0; - HEAP32[$0 >> 2] = $1; - HEAP32[($0 + 4 | 0) >> 2] = $2; - __stack_pointer = $3 + 32 | 0; - } - - function _ZN4core3fmt5Write9write_fmt17h44df5905957d3a1fE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - return _ZN4core3fmt5write17hd273a061a774381dE($0 | 0, 1048576 | 0, $1 | 0) | 0 | 0; - } - - function _ZN4core3ptr42drop_in_place$LT$alloc__string__String$GT$17hb5bccdeece555eeeE($0) { - $0 = $0 | 0; - var $1 = 0; - label$1 : { - $1 = HEAP32[$0 >> 2] | 0; - if (!$1) { - break label$1 - } - __rust_dealloc(HEAP32[($0 + 4 | 0) >> 2] | 0 | 0, $1 | 0, 1 | 0); - } - } - - function _ZN4core3ptr77drop_in_place$LT$std__panicking__begin_panic_handler__FormatStringPayload$GT$17hec524af3f69d5a53E($0) { - $0 = $0 | 0; - var $1 = 0; - label$1 : { - $1 = HEAP32[$0 >> 2] | 0; - if (($1 | -2147483648 | 0 | 0) == (-2147483648 | 0)) { - break label$1 - } - __rust_dealloc(HEAP32[($0 + 4 | 0) >> 2] | 0 | 0, $1 | 0, 1 | 0); - } - } - - function _ZN4core5panic12PanicPayload6as_str17hd887f5dc9940e8f0E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - HEAP32[$0 >> 2] = 0; - } - - function _ZN58_$LT$alloc__string__String$u20$as$u20$core__fmt__Write$GT$10write_char17h9231f70fbd335441E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, $3 = 0; - $2 = __stack_pointer - 16 | 0; - __stack_pointer = $2; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - if ($1 >>> 0 < 128 >>> 0) { - break label$4 - } - HEAP32[($2 + 12 | 0) >> 2] = 0; - if ($1 >>> 0 < 2048 >>> 0) { - break label$3 - } - label$5 : { - if ($1 >>> 0 >= 65536 >>> 0) { - break label$5 - } - HEAP8[($2 + 14 | 0) >> 0] = $1 & 63 | 0 | 128 | 0; - HEAP8[($2 + 12 | 0) >> 0] = $1 >>> 12 | 0 | 224 | 0; - HEAP8[($2 + 13 | 0) >> 0] = ($1 >>> 6 | 0) & 63 | 0 | 128 | 0; - $1 = 3; - break label$2; - } - HEAP8[($2 + 15 | 0) >> 0] = $1 & 63 | 0 | 128 | 0; - HEAP8[($2 + 12 | 0) >> 0] = $1 >>> 18 | 0 | 240 | 0; - HEAP8[($2 + 14 | 0) >> 0] = ($1 >>> 6 | 0) & 63 | 0 | 128 | 0; - HEAP8[($2 + 13 | 0) >> 0] = ($1 >>> 12 | 0) & 63 | 0 | 128 | 0; - $1 = 4; - break label$2; - } - label$6 : { - $3 = HEAP32[($0 + 8 | 0) >> 2] | 0; - if (($3 | 0) != (HEAP32[$0 >> 2] | 0 | 0)) { - break label$6 - } - _ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$8grow_one17hcf301c28e3aef7c4E($0 | 0); - } - HEAP32[($0 + 8 | 0) >> 2] = $3 + 1 | 0; - HEAP8[((HEAP32[($0 + 4 | 0) >> 2] | 0) + $3 | 0) >> 0] = $1; - break label$1; - } - HEAP8[($2 + 13 | 0) >> 0] = $1 & 63 | 0 | 128 | 0; - HEAP8[($2 + 12 | 0) >> 0] = $1 >>> 6 | 0 | 192 | 0; - $1 = 2; - } - label$7 : { - $3 = HEAP32[($0 + 8 | 0) >> 2] | 0; - if (((HEAP32[$0 >> 2] | 0) - $3 | 0) >>> 0 >= $1 >>> 0) { - break label$7 - } - _ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve21do_reserve_and_handle17h5e9daeeab98ea459E($0 | 0, $3 | 0, $1 | 0); - $3 = HEAP32[($0 + 8 | 0) >> 2] | 0; - } - memcpy((HEAP32[($0 + 4 | 0) >> 2] | 0) + $3 | 0 | 0, $2 + 12 | 0 | 0, $1 | 0) | 0; - HEAP32[($0 + 8 | 0) >> 2] = $3 + $1 | 0; - } - __stack_pointer = $2 + 16 | 0; - return 0 | 0; - } - - function _ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$8grow_one17hcf301c28e3aef7c4E($0) { - $0 = $0 | 0; - var $1 = 0, $2 = 0, $3 = 0, $4 = 0; - $1 = __stack_pointer - 32 | 0; - __stack_pointer = $1; - label$1 : { - $2 = HEAP32[$0 >> 2] | 0; - if (($2 | 0) != (-1 | 0)) { - break label$1 - } - _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE(0 | 0, 0 | 0); - wasm2js_trap(); - } - $3 = $2 << 1 | 0; - $4 = $2 + 1 | 0; - $3 = $3 >>> 0 > $4 >>> 0 ? $3 : $4; - $3 = $3 >>> 0 > 8 >>> 0 ? $3 : 8; - $4 = ($3 ^ -1 | 0) >>> 31 | 0; - label$2 : { - label$3 : { - if ($2) { - break label$3 - } - $2 = 0; - break label$2; - } - HEAP32[($1 + 28 | 0) >> 2] = $2; - HEAP32[($1 + 20 | 0) >> 2] = HEAP32[($0 + 4 | 0) >> 2] | 0; - $2 = 1; - } - HEAP32[($1 + 24 | 0) >> 2] = $2; - _ZN5alloc7raw_vec11finish_grow17ha2d904593814b148E($1 + 8 | 0 | 0, $4 | 0, $3 | 0, $1 + 20 | 0 | 0); - label$4 : { - if ((HEAP32[($1 + 8 | 0) >> 2] | 0 | 0) != (1 | 0)) { - break label$4 - } - _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE(HEAP32[($1 + 12 | 0) >> 2] | 0 | 0, HEAP32[($1 + 16 | 0) >> 2] | 0 | 0); - wasm2js_trap(); - } - $2 = HEAP32[($1 + 12 | 0) >> 2] | 0; - HEAP32[$0 >> 2] = $3; - HEAP32[($0 + 4 | 0) >> 2] = $2; - __stack_pointer = $1 + 32 | 0; - } - - function _ZN58_$LT$alloc__string__String$u20$as$u20$core__fmt__Write$GT$9write_str17h9c2d3e9aafc08637E($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0; - label$1 : { - $3 = HEAP32[($0 + 8 | 0) >> 2] | 0; - if (((HEAP32[$0 >> 2] | 0) - $3 | 0) >>> 0 >= $2 >>> 0) { - break label$1 - } - _ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve21do_reserve_and_handle17h5e9daeeab98ea459E($0 | 0, $3 | 0, $2 | 0); - $3 = HEAP32[($0 + 8 | 0) >> 2] | 0; - } - memcpy((HEAP32[($0 + 4 | 0) >> 2] | 0) + $3 | 0 | 0, $1 | 0, $2 | 0) | 0; - HEAP32[($0 + 8 | 0) >> 2] = $3 + $2 | 0; - return 0 | 0; - } - - function _ZN5alloc7raw_vec11finish_grow17ha2d904593814b148E($0, $1, $2, $3) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - $3 = $3 | 0; - var $4 = 0; - label$1 : { - label$2 : { - label$3 : { - if (!$1) { - break label$3 - } - if (($2 | 0) <= (-1 | 0)) { - break label$2 - } - label$4 : { - label$5 : { - label$6 : { - if (!(HEAP32[($3 + 4 | 0) >> 2] | 0)) { - break label$6 - } - label$7 : { - $4 = HEAP32[($3 + 8 | 0) >> 2] | 0; - if ($4) { - break label$7 - } - label$8 : { - if ($2) { - break label$8 - } - $3 = $1; - break label$4; - } - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - break label$5; - } - $3 = __rust_realloc(HEAP32[$3 >> 2] | 0 | 0, $4 | 0, $1 | 0, $2 | 0) | 0; - break label$4; - } - label$9 : { - if ($2) { - break label$9 - } - $3 = $1; - break label$4; - } - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - } - $3 = __rust_alloc($2 | 0, $1 | 0) | 0; - } - label$10 : { - if (!$3) { - break label$10 - } - HEAP32[($0 + 8 | 0) >> 2] = $2; - HEAP32[($0 + 4 | 0) >> 2] = $3; - HEAP32[$0 >> 2] = 0; - return; - } - HEAP32[($0 + 8 | 0) >> 2] = $2; - HEAP32[($0 + 4 | 0) >> 2] = $1; - break label$1; - } - HEAP32[($0 + 4 | 0) >> 2] = 0; - break label$1; - } - HEAP32[($0 + 4 | 0) >> 2] = 0; - } - HEAP32[$0 >> 2] = 1; - } - - function _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h20421146e3e4e9ccE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, $4 = 0, $3 = 0, $5 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; - $2 = HEAP32[($0 + 12 | 0) >> 2] | 0; - label$1 : { - label$2 : { - label$3 : { - if ($1 >>> 0 < 256 >>> 0) { - break label$3 - } - $3 = HEAP32[($0 + 24 | 0) >> 2] | 0; - label$4 : { - label$5 : { - label$6 : { - if (($2 | 0) != ($0 | 0)) { - break label$6 - } - $2 = HEAP32[($0 + 20 | 0) >> 2] | 0; - $1 = HEAP32[($0 + ($2 ? 20 : 16) | 0) >> 2] | 0; - if ($1) { - break label$5 - } - $2 = 0; - break label$4; - } - $1 = HEAP32[($0 + 8 | 0) >> 2] | 0; - HEAP32[($1 + 12 | 0) >> 2] = $2; - HEAP32[($2 + 8 | 0) >> 2] = $1; - break label$4; - } - $4 = $2 ? $0 + 20 | 0 : $0 + 16 | 0; - label$7 : while (1) { - $5 = $4; - $2 = $1; - $1 = HEAP32[($2 + 20 | 0) >> 2] | 0; - $4 = $1 ? $2 + 20 | 0 : $2 + 16 | 0; - $1 = HEAP32[($2 + ($1 ? 20 : 16) | 0) >> 2] | 0; - if ($1) { - continue label$7 - } - break label$7; - }; - HEAP32[$5 >> 2] = 0; - } - if (!$3) { - break label$1 - } - label$8 : { - $1 = ((HEAP32[($0 + 28 | 0) >> 2] | 0) << 2 | 0) + 1051348 | 0; - if ((HEAP32[$1 >> 2] | 0 | 0) == ($0 | 0)) { - break label$8 - } - HEAP32[($3 + ((HEAP32[($3 + 16 | 0) >> 2] | 0 | 0) == ($0 | 0) ? 16 : 20) | 0) >> 2] = $2; - if (!$2) { - break label$1 - } - break label$2; - } - HEAP32[$1 >> 2] = $2; - if ($2) { - break label$2 - } - (wasm2js_i32$0 = 0, wasm2js_i32$1 = (HEAP32[(0 + 1051760 | 0) >> 2] | 0) & (__wasm_rotl_i32(-2 | 0, HEAP32[($0 + 28 | 0) >> 2] | 0 | 0) | 0) | 0), HEAP32[(wasm2js_i32$0 + 1051760 | 0) >> 2] = wasm2js_i32$1; - break label$1; - } - label$9 : { - $4 = HEAP32[($0 + 8 | 0) >> 2] | 0; - if (($2 | 0) == ($4 | 0)) { - break label$9 - } - HEAP32[($4 + 12 | 0) >> 2] = $2; - HEAP32[($2 + 8 | 0) >> 2] = $4; - return; - } - (wasm2js_i32$0 = 0, wasm2js_i32$1 = (HEAP32[(0 + 1051756 | 0) >> 2] | 0) & (__wasm_rotl_i32(-2 | 0, $1 >>> 3 | 0 | 0) | 0) | 0), HEAP32[(wasm2js_i32$0 + 1051756 | 0) >> 2] = wasm2js_i32$1; - return; - } - HEAP32[($2 + 24 | 0) >> 2] = $3; - label$10 : { - $1 = HEAP32[($0 + 16 | 0) >> 2] | 0; - if (!$1) { - break label$10 - } - HEAP32[($2 + 16 | 0) >> 2] = $1; - HEAP32[($1 + 24 | 0) >> 2] = $2; - } - $1 = HEAP32[($0 + 20 | 0) >> 2] | 0; - if (!$1) { - break label$1 - } - HEAP32[($2 + 20 | 0) >> 2] = $1; - HEAP32[($1 + 24 | 0) >> 2] = $2; - return; - } - } - - function _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$13dispose_chunk17hb68dd003b737d09cE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $3 = 0, $2 = 0; - $2 = $0 + $1 | 0; - label$1 : { - label$2 : { - $3 = HEAP32[($0 + 4 | 0) >> 2] | 0; - if ($3 & 1 | 0) { - break label$2 - } - if (!($3 & 2 | 0)) { - break label$1 - } - $3 = HEAP32[$0 >> 2] | 0; - $1 = $3 + $1 | 0; - label$3 : { - $0 = $0 - $3 | 0; - if (($0 | 0) != (HEAP32[(0 + 1051772 | 0) >> 2] | 0 | 0)) { - break label$3 - } - if (((HEAP32[($2 + 4 | 0) >> 2] | 0) & 3 | 0 | 0) != (3 | 0)) { - break label$2 - } - HEAP32[(0 + 1051764 | 0) >> 2] = $1; - HEAP32[($2 + 4 | 0) >> 2] = (HEAP32[($2 + 4 | 0) >> 2] | 0) & -2 | 0; - HEAP32[($0 + 4 | 0) >> 2] = $1 | 1 | 0; - HEAP32[$2 >> 2] = $1; - break label$1; - } - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h20421146e3e4e9ccE($0 | 0, $3 | 0); - } - label$4 : { - label$5 : { - label$6 : { - label$7 : { - $3 = HEAP32[($2 + 4 | 0) >> 2] | 0; - if ($3 & 2 | 0) { - break label$7 - } - if (($2 | 0) == (HEAP32[(0 + 1051776 | 0) >> 2] | 0 | 0)) { - break label$5 - } - if (($2 | 0) == (HEAP32[(0 + 1051772 | 0) >> 2] | 0 | 0)) { - break label$4 - } - $3 = $3 & -8 | 0; - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h20421146e3e4e9ccE($2 | 0, $3 | 0); - $1 = $3 + $1 | 0; - HEAP32[($0 + 4 | 0) >> 2] = $1 | 1 | 0; - HEAP32[($0 + $1 | 0) >> 2] = $1; - if (($0 | 0) != (HEAP32[(0 + 1051772 | 0) >> 2] | 0 | 0)) { - break label$6 - } - HEAP32[(0 + 1051764 | 0) >> 2] = $1; - return; - } - HEAP32[($2 + 4 | 0) >> 2] = $3 & -2 | 0; - HEAP32[($0 + 4 | 0) >> 2] = $1 | 1 | 0; - HEAP32[($0 + $1 | 0) >> 2] = $1; - } - label$8 : { - if ($1 >>> 0 < 256 >>> 0) { - break label$8 - } - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18insert_large_chunk17h8e4702b854476b2fE($0 | 0, $1 | 0); - return; - } - $2 = ($1 & 248 | 0) + 1051492 | 0; - label$9 : { - label$10 : { - $3 = HEAP32[(0 + 1051756 | 0) >> 2] | 0; - $1 = 1 << ($1 >>> 3 | 0) | 0; - if ($3 & $1 | 0) { - break label$10 - } - HEAP32[(0 + 1051756 | 0) >> 2] = $3 | $1 | 0; - $1 = $2; - break label$9; - } - $1 = HEAP32[($2 + 8 | 0) >> 2] | 0; - } - HEAP32[($2 + 8 | 0) >> 2] = $0; - HEAP32[($1 + 12 | 0) >> 2] = $0; - HEAP32[($0 + 12 | 0) >> 2] = $2; - HEAP32[($0 + 8 | 0) >> 2] = $1; - return; - } - HEAP32[(0 + 1051776 | 0) >> 2] = $0; - $1 = (HEAP32[(0 + 1051768 | 0) >> 2] | 0) + $1 | 0; - HEAP32[(0 + 1051768 | 0) >> 2] = $1; - HEAP32[($0 + 4 | 0) >> 2] = $1 | 1 | 0; - if (($0 | 0) != (HEAP32[(0 + 1051772 | 0) >> 2] | 0 | 0)) { - break label$1 - } - HEAP32[(0 + 1051764 | 0) >> 2] = 0; - HEAP32[(0 + 1051772 | 0) >> 2] = 0; - return; - } - HEAP32[(0 + 1051772 | 0) >> 2] = $0; - $1 = (HEAP32[(0 + 1051764 | 0) >> 2] | 0) + $1 | 0; - HEAP32[(0 + 1051764 | 0) >> 2] = $1; - HEAP32[($0 + 4 | 0) >> 2] = $1 | 1 | 0; - HEAP32[($0 + $1 | 0) >> 2] = $1; - return; - } - } - - function _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18insert_large_chunk17h8e4702b854476b2fE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, $3 = 0, $4 = 0, $5 = 0; - $2 = 0; - label$1 : { - if ($1 >>> 0 < 256 >>> 0) { - break label$1 - } - $2 = 31; - if ($1 >>> 0 > 16777215 >>> 0) { - break label$1 - } - $2 = Math_clz32($1 >>> 8 | 0); - $2 = ((($1 >>> (6 - $2 | 0) | 0) & 1 | 0) - ($2 << 1 | 0) | 0) + 62 | 0; - } - HEAP32[($0 + 16 | 0) >> 2] = 0; - HEAP32[($0 + 20 | 0) >> 2] = 0; - HEAP32[($0 + 28 | 0) >> 2] = $2; - $3 = ($2 << 2 | 0) + 1051348 | 0; - label$2 : { - $4 = 1 << $2 | 0; - if ((HEAP32[(0 + 1051760 | 0) >> 2] | 0) & $4 | 0) { - break label$2 - } - HEAP32[$3 >> 2] = $0; - HEAP32[($0 + 24 | 0) >> 2] = $3; - HEAP32[($0 + 12 | 0) >> 2] = $0; - HEAP32[($0 + 8 | 0) >> 2] = $0; - HEAP32[(0 + 1051760 | 0) >> 2] = HEAP32[(0 + 1051760 | 0) >> 2] | 0 | $4 | 0; - return; - } - label$3 : { - label$4 : { - label$5 : { - $4 = HEAP32[$3 >> 2] | 0; - if (((HEAP32[($4 + 4 | 0) >> 2] | 0) & -8 | 0 | 0) != ($1 | 0)) { - break label$5 - } - $2 = $4; - break label$4; - } - $3 = $1 << (($2 | 0) == (31 | 0) ? 0 : 25 - ($2 >>> 1 | 0) | 0) | 0; - label$6 : while (1) { - $5 = ($4 + (($3 >>> 29 | 0) & 4 | 0) | 0) + 16 | 0; - $2 = HEAP32[$5 >> 2] | 0; - if (!$2) { - break label$3 - } - $3 = $3 << 1 | 0; - $4 = $2; - if (((HEAP32[($2 + 4 | 0) >> 2] | 0) & -8 | 0 | 0) != ($1 | 0)) { - continue label$6 - } - break label$6; - }; - } - $3 = HEAP32[($2 + 8 | 0) >> 2] | 0; - HEAP32[($3 + 12 | 0) >> 2] = $0; - HEAP32[($2 + 8 | 0) >> 2] = $0; - HEAP32[($0 + 24 | 0) >> 2] = 0; - HEAP32[($0 + 12 | 0) >> 2] = $2; - HEAP32[($0 + 8 | 0) >> 2] = $3; - return; - } - HEAP32[$5 >> 2] = $0; - HEAP32[($0 + 24 | 0) >> 2] = $4; - HEAP32[($0 + 12 | 0) >> 2] = $0; - HEAP32[($0 + 8 | 0) >> 2] = $0; - } - - function _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$4free17hcade36dd23206a7bE($0) { - $0 = $0 | 0; - var $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0; - $1 = $0 + -8 | 0; - $2 = HEAP32[($0 + -4 | 0) >> 2] | 0; - $0 = $2 & -8 | 0; - $3 = $1 + $0 | 0; - label$1 : { - label$2 : { - if ($2 & 1 | 0) { - break label$2 - } - if (!($2 & 2 | 0)) { - break label$1 - } - $2 = HEAP32[$1 >> 2] | 0; - $0 = $2 + $0 | 0; - label$3 : { - $1 = $1 - $2 | 0; - if (($1 | 0) != (HEAP32[(0 + 1051772 | 0) >> 2] | 0 | 0)) { - break label$3 - } - if (((HEAP32[($3 + 4 | 0) >> 2] | 0) & 3 | 0 | 0) != (3 | 0)) { - break label$2 - } - HEAP32[(0 + 1051764 | 0) >> 2] = $0; - HEAP32[($3 + 4 | 0) >> 2] = (HEAP32[($3 + 4 | 0) >> 2] | 0) & -2 | 0; - HEAP32[($1 + 4 | 0) >> 2] = $0 | 1 | 0; - HEAP32[$3 >> 2] = $0; - return; - } - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h20421146e3e4e9ccE($1 | 0, $2 | 0); - } - label$4 : { - label$5 : { - label$6 : { - label$7 : { - label$8 : { - label$9 : { - $2 = HEAP32[($3 + 4 | 0) >> 2] | 0; - if ($2 & 2 | 0) { - break label$9 - } - if (($3 | 0) == (HEAP32[(0 + 1051776 | 0) >> 2] | 0 | 0)) { - break label$7 - } - if (($3 | 0) == (HEAP32[(0 + 1051772 | 0) >> 2] | 0 | 0)) { - break label$6 - } - $2 = $2 & -8 | 0; - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h20421146e3e4e9ccE($3 | 0, $2 | 0); - $0 = $2 + $0 | 0; - HEAP32[($1 + 4 | 0) >> 2] = $0 | 1 | 0; - HEAP32[($1 + $0 | 0) >> 2] = $0; - if (($1 | 0) != (HEAP32[(0 + 1051772 | 0) >> 2] | 0 | 0)) { - break label$8 - } - HEAP32[(0 + 1051764 | 0) >> 2] = $0; - return; - } - HEAP32[($3 + 4 | 0) >> 2] = $2 & -2 | 0; - HEAP32[($1 + 4 | 0) >> 2] = $0 | 1 | 0; - HEAP32[($1 + $0 | 0) >> 2] = $0; - } - if ($0 >>> 0 < 256 >>> 0) { - break label$5 - } - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18insert_large_chunk17h8e4702b854476b2fE($1 | 0, $0 | 0); - $1 = 0; - $0 = (HEAP32[(0 + 1051796 | 0) >> 2] | 0) + -1 | 0; - HEAP32[(0 + 1051796 | 0) >> 2] = $0; - if ($0) { - break label$1 - } - label$10 : { - $0 = HEAP32[(0 + 1051484 | 0) >> 2] | 0; - if (!$0) { - break label$10 - } - $1 = 0; - label$11 : while (1) { - $1 = $1 + 1 | 0; - $0 = HEAP32[($0 + 8 | 0) >> 2] | 0; - if ($0) { - continue label$11 - } - break label$11; - }; - } - HEAP32[(0 + 1051796 | 0) >> 2] = $1 >>> 0 > 4095 >>> 0 ? $1 : 4095; - return; - } - HEAP32[(0 + 1051776 | 0) >> 2] = $1; - $0 = (HEAP32[(0 + 1051768 | 0) >> 2] | 0) + $0 | 0; - HEAP32[(0 + 1051768 | 0) >> 2] = $0; - HEAP32[($1 + 4 | 0) >> 2] = $0 | 1 | 0; - label$12 : { - if (($1 | 0) != (HEAP32[(0 + 1051772 | 0) >> 2] | 0 | 0)) { - break label$12 - } - HEAP32[(0 + 1051764 | 0) >> 2] = 0; - HEAP32[(0 + 1051772 | 0) >> 2] = 0; - } - $4 = HEAP32[(0 + 1051788 | 0) >> 2] | 0; - if ($0 >>> 0 <= $4 >>> 0) { - break label$1 - } - $0 = HEAP32[(0 + 1051776 | 0) >> 2] | 0; - if (!$0) { - break label$1 - } - $2 = 0; - $5 = HEAP32[(0 + 1051768 | 0) >> 2] | 0; - if ($5 >>> 0 < 41 >>> 0) { - break label$4 - } - $1 = 1051476; - label$13 : while (1) { - label$14 : { - $3 = HEAP32[$1 >> 2] | 0; - if ($3 >>> 0 > $0 >>> 0) { - break label$14 - } - if ($0 >>> 0 < ($3 + (HEAP32[($1 + 4 | 0) >> 2] | 0) | 0) >>> 0) { - break label$4 - } - } - $1 = HEAP32[($1 + 8 | 0) >> 2] | 0; - continue label$13; - }; - } - HEAP32[(0 + 1051772 | 0) >> 2] = $1; - $0 = (HEAP32[(0 + 1051764 | 0) >> 2] | 0) + $0 | 0; - HEAP32[(0 + 1051764 | 0) >> 2] = $0; - HEAP32[($1 + 4 | 0) >> 2] = $0 | 1 | 0; - HEAP32[($1 + $0 | 0) >> 2] = $0; - return; - } - $3 = ($0 & 248 | 0) + 1051492 | 0; - label$15 : { - label$16 : { - $2 = HEAP32[(0 + 1051756 | 0) >> 2] | 0; - $0 = 1 << ($0 >>> 3 | 0) | 0; - if ($2 & $0 | 0) { - break label$16 - } - HEAP32[(0 + 1051756 | 0) >> 2] = $2 | $0 | 0; - $0 = $3; - break label$15; - } - $0 = HEAP32[($3 + 8 | 0) >> 2] | 0; - } - HEAP32[($3 + 8 | 0) >> 2] = $1; - HEAP32[($0 + 12 | 0) >> 2] = $1; - HEAP32[($1 + 12 | 0) >> 2] = $3; - HEAP32[($1 + 8 | 0) >> 2] = $0; - return; - } - label$17 : { - $1 = HEAP32[(0 + 1051484 | 0) >> 2] | 0; - if (!$1) { - break label$17 - } - $2 = 0; - label$18 : while (1) { - $2 = $2 + 1 | 0; - $1 = HEAP32[($1 + 8 | 0) >> 2] | 0; - if ($1) { - continue label$18 - } - break label$18; - }; - } - HEAP32[(0 + 1051796 | 0) >> 2] = $2 >>> 0 > 4095 >>> 0 ? $2 : 4095; - if ($5 >>> 0 <= $4 >>> 0) { - break label$1 - } - HEAP32[(0 + 1051788 | 0) >> 2] = -1; - } - } - - function _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$6malloc17hd9c2c8577ef4c61dE($0) { - $0 = $0 | 0; - var $7 = 0, $6 = 0, $2 = 0, $3 = 0, $8 = 0, $9 = 0, $5 = 0, $4 = 0, i64toi32_i32$1 = 0, $1 = 0, i64toi32_i32$2 = 0, i64toi32_i32$0 = 0, $247 = 0, $261 = 0, $618 = 0, $693 = 0, $10 = 0, $10$hi = 0, $721 = 0, $928 = 0, wasm2js_i32$0 = 0, wasm2js_i32$1 = 0; - $1 = __stack_pointer - 16 | 0; - __stack_pointer = $1; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - label$5 : { - label$6 : { - label$7 : { - label$8 : { - if ($0 >>> 0 < 245 >>> 0) { - break label$8 - } - label$9 : { - if ($0 >>> 0 < -65587 >>> 0) { - break label$9 - } - $0 = 0; - break label$1; - } - $2 = $0 + 11 | 0; - $3 = $2 & -8 | 0; - $4 = HEAP32[(0 + 1051760 | 0) >> 2] | 0; - if (!$4) { - break label$4 - } - $5 = 31; - label$10 : { - if ($0 >>> 0 > 16777204 >>> 0) { - break label$10 - } - $0 = Math_clz32($2 >>> 8 | 0); - $5 = ((($3 >>> (6 - $0 | 0) | 0) & 1 | 0) - ($0 << 1 | 0) | 0) + 62 | 0; - } - $2 = 0 - $3 | 0; - label$11 : { - $6 = HEAP32[(($5 << 2 | 0) + 1051348 | 0) >> 2] | 0; - if ($6) { - break label$11 - } - $0 = 0; - $7 = 0; - break label$7; - } - $0 = 0; - $8 = $3 << (($5 | 0) == (31 | 0) ? 0 : 25 - ($5 >>> 1 | 0) | 0) | 0; - $7 = 0; - label$12 : while (1) { - label$13 : { - $9 = (HEAP32[($6 + 4 | 0) >> 2] | 0) & -8 | 0; - if ($9 >>> 0 < $3 >>> 0) { - break label$13 - } - $9 = $9 - $3 | 0; - if ($9 >>> 0 >= $2 >>> 0) { - break label$13 - } - $2 = $9; - $7 = $6; - if ($2) { - break label$13 - } - $2 = 0; - $7 = $6; - $0 = $6; - break label$6; - } - $9 = HEAP32[($6 + 20 | 0) >> 2] | 0; - $6 = HEAP32[(($6 + (($8 >>> 29 | 0) & 4 | 0) | 0) + 16 | 0) >> 2] | 0; - $0 = $9 ? (($9 | 0) != ($6 | 0) ? $9 : $0) : $0; - $8 = $8 << 1 | 0; - if (!$6) { - break label$7 - } - continue label$12; - }; - } - label$14 : { - $6 = HEAP32[(0 + 1051756 | 0) >> 2] | 0; - $3 = $0 >>> 0 < 11 >>> 0 ? 16 : ($0 + 11 | 0) & 504 | 0; - $2 = $3 >>> 3 | 0; - $0 = $6 >>> $2 | 0; - if (!($0 & 3 | 0)) { - break label$14 - } - label$15 : { - label$16 : { - $8 = (($0 ^ -1 | 0) & 1 | 0) + $2 | 0; - $3 = $8 << 3 | 0; - $0 = $3 + 1051492 | 0; - $2 = HEAP32[($3 + 1051500 | 0) >> 2] | 0; - $7 = HEAP32[($2 + 8 | 0) >> 2] | 0; - if (($0 | 0) == ($7 | 0)) { - break label$16 - } - HEAP32[($7 + 12 | 0) >> 2] = $0; - HEAP32[($0 + 8 | 0) >> 2] = $7; - break label$15; - } - (wasm2js_i32$0 = 0, wasm2js_i32$1 = $6 & (__wasm_rotl_i32(-2 | 0, $8 | 0) | 0) | 0), HEAP32[(wasm2js_i32$0 + 1051756 | 0) >> 2] = wasm2js_i32$1; - } - $0 = $2 + 8 | 0; - HEAP32[($2 + 4 | 0) >> 2] = $3 | 3 | 0; - $3 = $2 + $3 | 0; - HEAP32[($3 + 4 | 0) >> 2] = HEAP32[($3 + 4 | 0) >> 2] | 0 | 1 | 0; - break label$1; - } - if ($3 >>> 0 <= (HEAP32[(0 + 1051764 | 0) >> 2] | 0) >>> 0) { - break label$4 - } - label$17 : { - label$18 : { - label$19 : { - if ($0) { - break label$19 - } - $0 = HEAP32[(0 + 1051760 | 0) >> 2] | 0; - if (!$0) { - break label$4 - } - $7 = HEAP32[(((__wasm_ctz_i32($0 | 0) | 0) << 2 | 0) + 1051348 | 0) >> 2] | 0; - $2 = ((HEAP32[($7 + 4 | 0) >> 2] | 0) & -8 | 0) - $3 | 0; - $6 = $7; - label$20 : while (1) { - label$21 : { - $0 = HEAP32[($7 + 16 | 0) >> 2] | 0; - if ($0) { - break label$21 - } - $0 = HEAP32[($7 + 20 | 0) >> 2] | 0; - if ($0) { - break label$21 - } - $5 = HEAP32[($6 + 24 | 0) >> 2] | 0; - label$22 : { - label$23 : { - label$24 : { - $0 = HEAP32[($6 + 12 | 0) >> 2] | 0; - if (($0 | 0) != ($6 | 0)) { - break label$24 - } - $0 = HEAP32[($6 + 20 | 0) >> 2] | 0; - $7 = HEAP32[($6 + ($0 ? 20 : 16) | 0) >> 2] | 0; - if ($7) { - break label$23 - } - $0 = 0; - break label$22; - } - $7 = HEAP32[($6 + 8 | 0) >> 2] | 0; - HEAP32[($7 + 12 | 0) >> 2] = $0; - HEAP32[($0 + 8 | 0) >> 2] = $7; - break label$22; - } - $8 = $0 ? $6 + 20 | 0 : $6 + 16 | 0; - label$25 : while (1) { - $9 = $8; - $0 = $7; - $7 = HEAP32[($0 + 20 | 0) >> 2] | 0; - $8 = $7 ? $0 + 20 | 0 : $0 + 16 | 0; - $7 = HEAP32[($0 + ($7 ? 20 : 16) | 0) >> 2] | 0; - if ($7) { - continue label$25 - } - break label$25; - }; - HEAP32[$9 >> 2] = 0; - } - if (!$5) { - break label$17 - } - label$26 : { - $7 = ((HEAP32[($6 + 28 | 0) >> 2] | 0) << 2 | 0) + 1051348 | 0; - if ((HEAP32[$7 >> 2] | 0 | 0) == ($6 | 0)) { - break label$26 - } - HEAP32[($5 + ((HEAP32[($5 + 16 | 0) >> 2] | 0 | 0) == ($6 | 0) ? 16 : 20) | 0) >> 2] = $0; - if (!$0) { - break label$17 - } - break label$18; - } - HEAP32[$7 >> 2] = $0; - if ($0) { - break label$18 - } - (wasm2js_i32$0 = 0, wasm2js_i32$1 = (HEAP32[(0 + 1051760 | 0) >> 2] | 0) & (__wasm_rotl_i32(-2 | 0, HEAP32[($6 + 28 | 0) >> 2] | 0 | 0) | 0) | 0), HEAP32[(wasm2js_i32$0 + 1051760 | 0) >> 2] = wasm2js_i32$1; - break label$17; - } - $7 = ((HEAP32[($0 + 4 | 0) >> 2] | 0) & -8 | 0) - $3 | 0; - $247 = $7; - $7 = $7 >>> 0 < $2 >>> 0; - $2 = $7 ? $247 : $2; - $6 = $7 ? $0 : $6; - $7 = $0; - continue label$20; - }; - } - label$27 : { - label$28 : { - $261 = $0 << $2 | 0; - $0 = 2 << $2 | 0; - $9 = __wasm_ctz_i32($261 & ($0 | (0 - $0 | 0) | 0) | 0 | 0) | 0; - $2 = $9 << 3 | 0; - $7 = $2 + 1051492 | 0; - $0 = HEAP32[($2 + 1051500 | 0) >> 2] | 0; - $8 = HEAP32[($0 + 8 | 0) >> 2] | 0; - if (($7 | 0) == ($8 | 0)) { - break label$28 - } - HEAP32[($8 + 12 | 0) >> 2] = $7; - HEAP32[($7 + 8 | 0) >> 2] = $8; - break label$27; - } - (wasm2js_i32$0 = 0, wasm2js_i32$1 = $6 & (__wasm_rotl_i32(-2 | 0, $9 | 0) | 0) | 0), HEAP32[(wasm2js_i32$0 + 1051756 | 0) >> 2] = wasm2js_i32$1; - } - HEAP32[($0 + 4 | 0) >> 2] = $3 | 3 | 0; - $8 = $0 + $3 | 0; - $7 = $2 - $3 | 0; - HEAP32[($8 + 4 | 0) >> 2] = $7 | 1 | 0; - HEAP32[($0 + $2 | 0) >> 2] = $7; - label$29 : { - $6 = HEAP32[(0 + 1051764 | 0) >> 2] | 0; - if (!$6) { - break label$29 - } - $2 = ($6 & -8 | 0) + 1051492 | 0; - $3 = HEAP32[(0 + 1051772 | 0) >> 2] | 0; - label$30 : { - label$31 : { - $9 = HEAP32[(0 + 1051756 | 0) >> 2] | 0; - $6 = 1 << ($6 >>> 3 | 0) | 0; - if ($9 & $6 | 0) { - break label$31 - } - HEAP32[(0 + 1051756 | 0) >> 2] = $9 | $6 | 0; - $6 = $2; - break label$30; - } - $6 = HEAP32[($2 + 8 | 0) >> 2] | 0; - } - HEAP32[($2 + 8 | 0) >> 2] = $3; - HEAP32[($6 + 12 | 0) >> 2] = $3; - HEAP32[($3 + 12 | 0) >> 2] = $2; - HEAP32[($3 + 8 | 0) >> 2] = $6; - } - $0 = $0 + 8 | 0; - HEAP32[(0 + 1051772 | 0) >> 2] = $8; - HEAP32[(0 + 1051764 | 0) >> 2] = $7; - break label$1; - } - HEAP32[($0 + 24 | 0) >> 2] = $5; - label$32 : { - $7 = HEAP32[($6 + 16 | 0) >> 2] | 0; - if (!$7) { - break label$32 - } - HEAP32[($0 + 16 | 0) >> 2] = $7; - HEAP32[($7 + 24 | 0) >> 2] = $0; - } - $7 = HEAP32[($6 + 20 | 0) >> 2] | 0; - if (!$7) { - break label$17 - } - HEAP32[($0 + 20 | 0) >> 2] = $7; - HEAP32[($7 + 24 | 0) >> 2] = $0; - } - label$33 : { - label$34 : { - label$35 : { - if ($2 >>> 0 < 16 >>> 0) { - break label$35 - } - HEAP32[($6 + 4 | 0) >> 2] = $3 | 3 | 0; - $3 = $6 + $3 | 0; - HEAP32[($3 + 4 | 0) >> 2] = $2 | 1 | 0; - HEAP32[($3 + $2 | 0) >> 2] = $2; - $8 = HEAP32[(0 + 1051764 | 0) >> 2] | 0; - if (!$8) { - break label$34 - } - $7 = ($8 & -8 | 0) + 1051492 | 0; - $0 = HEAP32[(0 + 1051772 | 0) >> 2] | 0; - label$36 : { - label$37 : { - $9 = HEAP32[(0 + 1051756 | 0) >> 2] | 0; - $8 = 1 << ($8 >>> 3 | 0) | 0; - if ($9 & $8 | 0) { - break label$37 - } - HEAP32[(0 + 1051756 | 0) >> 2] = $9 | $8 | 0; - $8 = $7; - break label$36; - } - $8 = HEAP32[($7 + 8 | 0) >> 2] | 0; - } - HEAP32[($7 + 8 | 0) >> 2] = $0; - HEAP32[($8 + 12 | 0) >> 2] = $0; - HEAP32[($0 + 12 | 0) >> 2] = $7; - HEAP32[($0 + 8 | 0) >> 2] = $8; - break label$34; - } - $0 = $2 + $3 | 0; - HEAP32[($6 + 4 | 0) >> 2] = $0 | 3 | 0; - $0 = $6 + $0 | 0; - HEAP32[($0 + 4 | 0) >> 2] = HEAP32[($0 + 4 | 0) >> 2] | 0 | 1 | 0; - break label$33; - } - HEAP32[(0 + 1051772 | 0) >> 2] = $3; - HEAP32[(0 + 1051764 | 0) >> 2] = $2; - } - $0 = $6 + 8 | 0; - break label$1; - } - label$38 : { - if ($0 | $7 | 0) { - break label$38 - } - $7 = 0; - $0 = 2 << $5 | 0; - $0 = ($0 | (0 - $0 | 0) | 0) & $4 | 0; - if (!$0) { - break label$4 - } - $0 = HEAP32[(((__wasm_ctz_i32($0 | 0) | 0) << 2 | 0) + 1051348 | 0) >> 2] | 0; - } - if (!$0) { - break label$5 - } - } - label$39 : while (1) { - $6 = (HEAP32[($0 + 4 | 0) >> 2] | 0) & -8 | 0; - $9 = $6 - $3 | 0; - $5 = $9 >>> 0 < $2 >>> 0; - $4 = $5 ? $0 : $7; - $8 = $6 >>> 0 < $3 >>> 0; - $9 = $5 ? $9 : $2; - label$40 : { - $6 = HEAP32[($0 + 16 | 0) >> 2] | 0; - if ($6) { - break label$40 - } - $6 = HEAP32[($0 + 20 | 0) >> 2] | 0; - } - $7 = $8 ? $7 : $4; - $2 = $8 ? $2 : $9; - $0 = $6; - if ($0) { - continue label$39 - } - break label$39; - }; - } - if (!$7) { - break label$4 - } - label$41 : { - $0 = HEAP32[(0 + 1051764 | 0) >> 2] | 0; - if ($0 >>> 0 < $3 >>> 0) { - break label$41 - } - if ($2 >>> 0 >= ($0 - $3 | 0) >>> 0) { - break label$4 - } - } - $5 = HEAP32[($7 + 24 | 0) >> 2] | 0; - label$42 : { - label$43 : { - label$44 : { - $0 = HEAP32[($7 + 12 | 0) >> 2] | 0; - if (($0 | 0) != ($7 | 0)) { - break label$44 - } - $0 = HEAP32[($7 + 20 | 0) >> 2] | 0; - $6 = HEAP32[($7 + ($0 ? 20 : 16) | 0) >> 2] | 0; - if ($6) { - break label$43 - } - $0 = 0; - break label$42; - } - $6 = HEAP32[($7 + 8 | 0) >> 2] | 0; - HEAP32[($6 + 12 | 0) >> 2] = $0; - HEAP32[($0 + 8 | 0) >> 2] = $6; - break label$42; - } - $8 = $0 ? $7 + 20 | 0 : $7 + 16 | 0; - label$45 : while (1) { - $9 = $8; - $0 = $6; - $6 = HEAP32[($0 + 20 | 0) >> 2] | 0; - $8 = $6 ? $0 + 20 | 0 : $0 + 16 | 0; - $6 = HEAP32[($0 + ($6 ? 20 : 16) | 0) >> 2] | 0; - if ($6) { - continue label$45 - } - break label$45; - }; - HEAP32[$9 >> 2] = 0; - } - if (!$5) { - break label$2 - } - label$46 : { - $6 = ((HEAP32[($7 + 28 | 0) >> 2] | 0) << 2 | 0) + 1051348 | 0; - if ((HEAP32[$6 >> 2] | 0 | 0) == ($7 | 0)) { - break label$46 - } - HEAP32[($5 + ((HEAP32[($5 + 16 | 0) >> 2] | 0 | 0) == ($7 | 0) ? 16 : 20) | 0) >> 2] = $0; - if (!$0) { - break label$2 - } - break label$3; - } - HEAP32[$6 >> 2] = $0; - if ($0) { - break label$3 - } - (wasm2js_i32$0 = 0, wasm2js_i32$1 = (HEAP32[(0 + 1051760 | 0) >> 2] | 0) & (__wasm_rotl_i32(-2 | 0, HEAP32[($7 + 28 | 0) >> 2] | 0 | 0) | 0) | 0), HEAP32[(wasm2js_i32$0 + 1051760 | 0) >> 2] = wasm2js_i32$1; - break label$2; - } - label$47 : { - label$48 : { - label$49 : { - label$50 : { - label$51 : { - label$52 : { - $0 = HEAP32[(0 + 1051764 | 0) >> 2] | 0; - if ($0 >>> 0 >= $3 >>> 0) { - break label$52 - } - label$53 : { - $0 = HEAP32[(0 + 1051768 | 0) >> 2] | 0; - if ($0 >>> 0 > $3 >>> 0) { - break label$53 - } - _ZN61_$LT$dlmalloc__sys__System$u20$as$u20$dlmalloc__Allocator$GT$5alloc17hb2750b8aaf9916efE($1 + 4 | 0 | 0, 1051800 | 0, ($3 + 65583 | 0) & -65536 | 0 | 0); - label$54 : { - $6 = HEAP32[($1 + 4 | 0) >> 2] | 0; - if ($6) { - break label$54 - } - $0 = 0; - break label$1; - } - $5 = HEAP32[($1 + 12 | 0) >> 2] | 0; - $9 = HEAP32[($1 + 8 | 0) >> 2] | 0; - $0 = (HEAP32[(0 + 1051780 | 0) >> 2] | 0) + $9 | 0; - HEAP32[(0 + 1051780 | 0) >> 2] = $0; - $2 = HEAP32[(0 + 1051784 | 0) >> 2] | 0; - HEAP32[(0 + 1051784 | 0) >> 2] = $2 >>> 0 > $0 >>> 0 ? $2 : $0; - label$55 : { - label$56 : { - label$57 : { - $2 = HEAP32[(0 + 1051776 | 0) >> 2] | 0; - if (!$2) { - break label$57 - } - $0 = 1051476; - label$58 : while (1) { - $7 = HEAP32[$0 >> 2] | 0; - $8 = HEAP32[($0 + 4 | 0) >> 2] | 0; - if (($6 | 0) == ($7 + $8 | 0 | 0)) { - break label$56 - } - $0 = HEAP32[($0 + 8 | 0) >> 2] | 0; - if ($0) { - continue label$58 - } - break label$55; - }; - } - label$59 : { - label$60 : { - $0 = HEAP32[(0 + 1051792 | 0) >> 2] | 0; - if (!$0) { - break label$60 - } - if ($6 >>> 0 >= $0 >>> 0) { - break label$59 - } - } - HEAP32[(0 + 1051792 | 0) >> 2] = $6; - } - HEAP32[(0 + 1051796 | 0) >> 2] = 4095; - HEAP32[(0 + 1051488 | 0) >> 2] = $5; - HEAP32[(0 + 1051480 | 0) >> 2] = $9; - HEAP32[(0 + 1051476 | 0) >> 2] = $6; - HEAP32[(0 + 1051504 | 0) >> 2] = 1051492; - HEAP32[(0 + 1051512 | 0) >> 2] = 1051500; - HEAP32[(0 + 1051500 | 0) >> 2] = 1051492; - HEAP32[(0 + 1051520 | 0) >> 2] = 1051508; - HEAP32[(0 + 1051508 | 0) >> 2] = 1051500; - HEAP32[(0 + 1051528 | 0) >> 2] = 1051516; - HEAP32[(0 + 1051516 | 0) >> 2] = 1051508; - HEAP32[(0 + 1051536 | 0) >> 2] = 1051524; - HEAP32[(0 + 1051524 | 0) >> 2] = 1051516; - HEAP32[(0 + 1051544 | 0) >> 2] = 1051532; - HEAP32[(0 + 1051532 | 0) >> 2] = 1051524; - HEAP32[(0 + 1051552 | 0) >> 2] = 1051540; - HEAP32[(0 + 1051540 | 0) >> 2] = 1051532; - HEAP32[(0 + 1051560 | 0) >> 2] = 1051548; - HEAP32[(0 + 1051548 | 0) >> 2] = 1051540; - HEAP32[(0 + 1051568 | 0) >> 2] = 1051556; - HEAP32[(0 + 1051556 | 0) >> 2] = 1051548; - HEAP32[(0 + 1051564 | 0) >> 2] = 1051556; - HEAP32[(0 + 1051576 | 0) >> 2] = 1051564; - HEAP32[(0 + 1051572 | 0) >> 2] = 1051564; - HEAP32[(0 + 1051584 | 0) >> 2] = 1051572; - HEAP32[(0 + 1051580 | 0) >> 2] = 1051572; - HEAP32[(0 + 1051592 | 0) >> 2] = 1051580; - HEAP32[(0 + 1051588 | 0) >> 2] = 1051580; - HEAP32[(0 + 1051600 | 0) >> 2] = 1051588; - HEAP32[(0 + 1051596 | 0) >> 2] = 1051588; - HEAP32[(0 + 1051608 | 0) >> 2] = 1051596; - HEAP32[(0 + 1051604 | 0) >> 2] = 1051596; - HEAP32[(0 + 1051616 | 0) >> 2] = 1051604; - HEAP32[(0 + 1051612 | 0) >> 2] = 1051604; - HEAP32[(0 + 1051624 | 0) >> 2] = 1051612; - HEAP32[(0 + 1051620 | 0) >> 2] = 1051612; - HEAP32[(0 + 1051632 | 0) >> 2] = 1051620; - HEAP32[(0 + 1051640 | 0) >> 2] = 1051628; - HEAP32[(0 + 1051628 | 0) >> 2] = 1051620; - HEAP32[(0 + 1051648 | 0) >> 2] = 1051636; - HEAP32[(0 + 1051636 | 0) >> 2] = 1051628; - HEAP32[(0 + 1051656 | 0) >> 2] = 1051644; - HEAP32[(0 + 1051644 | 0) >> 2] = 1051636; - HEAP32[(0 + 1051664 | 0) >> 2] = 1051652; - HEAP32[(0 + 1051652 | 0) >> 2] = 1051644; - HEAP32[(0 + 1051672 | 0) >> 2] = 1051660; - HEAP32[(0 + 1051660 | 0) >> 2] = 1051652; - HEAP32[(0 + 1051680 | 0) >> 2] = 1051668; - HEAP32[(0 + 1051668 | 0) >> 2] = 1051660; - HEAP32[(0 + 1051688 | 0) >> 2] = 1051676; - HEAP32[(0 + 1051676 | 0) >> 2] = 1051668; - HEAP32[(0 + 1051696 | 0) >> 2] = 1051684; - HEAP32[(0 + 1051684 | 0) >> 2] = 1051676; - HEAP32[(0 + 1051704 | 0) >> 2] = 1051692; - HEAP32[(0 + 1051692 | 0) >> 2] = 1051684; - HEAP32[(0 + 1051712 | 0) >> 2] = 1051700; - HEAP32[(0 + 1051700 | 0) >> 2] = 1051692; - HEAP32[(0 + 1051720 | 0) >> 2] = 1051708; - HEAP32[(0 + 1051708 | 0) >> 2] = 1051700; - HEAP32[(0 + 1051728 | 0) >> 2] = 1051716; - HEAP32[(0 + 1051716 | 0) >> 2] = 1051708; - HEAP32[(0 + 1051736 | 0) >> 2] = 1051724; - HEAP32[(0 + 1051724 | 0) >> 2] = 1051716; - HEAP32[(0 + 1051744 | 0) >> 2] = 1051732; - HEAP32[(0 + 1051732 | 0) >> 2] = 1051724; - HEAP32[(0 + 1051752 | 0) >> 2] = 1051740; - HEAP32[(0 + 1051740 | 0) >> 2] = 1051732; - $0 = ($6 + 15 | 0) & -8 | 0; - $2 = $0 + -8 | 0; - HEAP32[(0 + 1051776 | 0) >> 2] = $2; - HEAP32[(0 + 1051748 | 0) >> 2] = 1051740; - $618 = $6 - $0 | 0; - $0 = $9 + -40 | 0; - $7 = ($618 + $0 | 0) + 8 | 0; - HEAP32[(0 + 1051768 | 0) >> 2] = $7; - HEAP32[($2 + 4 | 0) >> 2] = $7 | 1 | 0; - HEAP32[(($6 + $0 | 0) + 4 | 0) >> 2] = 40; - HEAP32[(0 + 1051788 | 0) >> 2] = 2097152; - break label$47; - } - if ($2 >>> 0 >= $6 >>> 0) { - break label$55 - } - if ($7 >>> 0 > $2 >>> 0) { - break label$55 - } - $7 = HEAP32[($0 + 12 | 0) >> 2] | 0; - if ($7 & 1 | 0) { - break label$55 - } - if (($7 >>> 1 | 0 | 0) == ($5 | 0)) { - break label$51 - } - } - $0 = HEAP32[(0 + 1051792 | 0) >> 2] | 0; - HEAP32[(0 + 1051792 | 0) >> 2] = $6 >>> 0 > $0 >>> 0 ? $0 : $6; - $7 = $6 + $9 | 0; - $0 = 1051476; - label$61 : { - label$62 : { - label$63 : { - label$64 : while (1) { - $8 = HEAP32[$0 >> 2] | 0; - if (($8 | 0) == ($7 | 0)) { - break label$63 - } - $0 = HEAP32[($0 + 8 | 0) >> 2] | 0; - if ($0) { - continue label$64 - } - break label$62; - }; - } - $7 = HEAP32[($0 + 12 | 0) >> 2] | 0; - if ($7 & 1 | 0) { - break label$62 - } - if (($7 >>> 1 | 0 | 0) == ($5 | 0)) { - break label$61 - } - } - $0 = 1051476; - label$65 : { - label$66 : while (1) { - label$67 : { - $7 = HEAP32[$0 >> 2] | 0; - if ($7 >>> 0 > $2 >>> 0) { - break label$67 - } - $7 = $7 + (HEAP32[($0 + 4 | 0) >> 2] | 0) | 0; - if ($2 >>> 0 < $7 >>> 0) { - break label$65 - } - } - $0 = HEAP32[($0 + 8 | 0) >> 2] | 0; - continue label$66; - }; - } - $0 = ($6 + 15 | 0) & -8 | 0; - $8 = $0 + -8 | 0; - HEAP32[(0 + 1051776 | 0) >> 2] = $8; - $693 = $6 - $0 | 0; - $0 = $9 + -40 | 0; - $4 = ($693 + $0 | 0) + 8 | 0; - HEAP32[(0 + 1051768 | 0) >> 2] = $4; - HEAP32[($8 + 4 | 0) >> 2] = $4 | 1 | 0; - HEAP32[(($6 + $0 | 0) + 4 | 0) >> 2] = 40; - HEAP32[(0 + 1051788 | 0) >> 2] = 2097152; - $0 = (($7 + -32 | 0) & -8 | 0) + -8 | 0; - $8 = $0 >>> 0 < ($2 + 16 | 0) >>> 0 ? $2 : $0; - HEAP32[($8 + 4 | 0) >> 2] = 27; - i64toi32_i32$2 = 0; - i64toi32_i32$0 = HEAP32[(i64toi32_i32$2 + 1051476 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 1051480 | 0) >> 2] | 0; - $10 = i64toi32_i32$0; - $10$hi = i64toi32_i32$1; - i64toi32_i32$2 = 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 1051484 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[(i64toi32_i32$2 + 1051488 | 0) >> 2] | 0; - $721 = i64toi32_i32$1; - i64toi32_i32$1 = $8 + 16 | 0; - HEAP32[i64toi32_i32$1 >> 2] = $721; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - i64toi32_i32$0 = $10$hi; - i64toi32_i32$1 = $8; - HEAP32[($8 + 8 | 0) >> 2] = $10; - HEAP32[($8 + 12 | 0) >> 2] = i64toi32_i32$0; - HEAP32[(0 + 1051488 | 0) >> 2] = $5; - HEAP32[(0 + 1051480 | 0) >> 2] = $9; - HEAP32[(0 + 1051476 | 0) >> 2] = $6; - HEAP32[(0 + 1051484 | 0) >> 2] = $8 + 8 | 0; - $0 = $8 + 28 | 0; - label$68 : while (1) { - HEAP32[$0 >> 2] = 7; - $0 = $0 + 4 | 0; - if ($0 >>> 0 < $7 >>> 0) { - continue label$68 - } - break label$68; - }; - if (($8 | 0) == ($2 | 0)) { - break label$47 - } - HEAP32[($8 + 4 | 0) >> 2] = (HEAP32[($8 + 4 | 0) >> 2] | 0) & -2 | 0; - $0 = $8 - $2 | 0; - HEAP32[($2 + 4 | 0) >> 2] = $0 | 1 | 0; - HEAP32[$8 >> 2] = $0; - label$69 : { - if ($0 >>> 0 < 256 >>> 0) { - break label$69 - } - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18insert_large_chunk17h8e4702b854476b2fE($2 | 0, $0 | 0); - break label$47; - } - $7 = ($0 & 248 | 0) + 1051492 | 0; - label$70 : { - label$71 : { - $6 = HEAP32[(0 + 1051756 | 0) >> 2] | 0; - $0 = 1 << ($0 >>> 3 | 0) | 0; - if ($6 & $0 | 0) { - break label$71 - } - HEAP32[(0 + 1051756 | 0) >> 2] = $6 | $0 | 0; - $0 = $7; - break label$70; - } - $0 = HEAP32[($7 + 8 | 0) >> 2] | 0; - } - HEAP32[($7 + 8 | 0) >> 2] = $2; - HEAP32[($0 + 12 | 0) >> 2] = $2; - HEAP32[($2 + 12 | 0) >> 2] = $7; - HEAP32[($2 + 8 | 0) >> 2] = $0; - break label$47; - } - HEAP32[$0 >> 2] = $6; - HEAP32[($0 + 4 | 0) >> 2] = (HEAP32[($0 + 4 | 0) >> 2] | 0) + $9 | 0; - $7 = (($6 + 15 | 0) & -8 | 0) + -8 | 0; - HEAP32[($7 + 4 | 0) >> 2] = $3 | 3 | 0; - $2 = (($8 + 15 | 0) & -8 | 0) + -8 | 0; - $0 = $7 + $3 | 0; - $3 = $2 - $0 | 0; - if (($2 | 0) == (HEAP32[(0 + 1051776 | 0) >> 2] | 0 | 0)) { - break label$50 - } - if (($2 | 0) == (HEAP32[(0 + 1051772 | 0) >> 2] | 0 | 0)) { - break label$49 - } - label$72 : { - $6 = HEAP32[($2 + 4 | 0) >> 2] | 0; - if (($6 & 3 | 0 | 0) != (1 | 0)) { - break label$72 - } - $6 = $6 & -8 | 0; - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h20421146e3e4e9ccE($2 | 0, $6 | 0); - $3 = $6 + $3 | 0; - $2 = $2 + $6 | 0; - $6 = HEAP32[($2 + 4 | 0) >> 2] | 0; - } - HEAP32[($2 + 4 | 0) >> 2] = $6 & -2 | 0; - HEAP32[($0 + 4 | 0) >> 2] = $3 | 1 | 0; - HEAP32[($0 + $3 | 0) >> 2] = $3; - label$73 : { - if ($3 >>> 0 < 256 >>> 0) { - break label$73 - } - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18insert_large_chunk17h8e4702b854476b2fE($0 | 0, $3 | 0); - break label$48; - } - $2 = ($3 & 248 | 0) + 1051492 | 0; - label$74 : { - label$75 : { - $6 = HEAP32[(0 + 1051756 | 0) >> 2] | 0; - $3 = 1 << ($3 >>> 3 | 0) | 0; - if ($6 & $3 | 0) { - break label$75 - } - HEAP32[(0 + 1051756 | 0) >> 2] = $6 | $3 | 0; - $3 = $2; - break label$74; - } - $3 = HEAP32[($2 + 8 | 0) >> 2] | 0; - } - HEAP32[($2 + 8 | 0) >> 2] = $0; - HEAP32[($3 + 12 | 0) >> 2] = $0; - HEAP32[($0 + 12 | 0) >> 2] = $2; - HEAP32[($0 + 8 | 0) >> 2] = $3; - break label$48; - } - $2 = $0 - $3 | 0; - HEAP32[(0 + 1051768 | 0) >> 2] = $2; - $0 = HEAP32[(0 + 1051776 | 0) >> 2] | 0; - $7 = $0 + $3 | 0; - HEAP32[(0 + 1051776 | 0) >> 2] = $7; - HEAP32[($7 + 4 | 0) >> 2] = $2 | 1 | 0; - HEAP32[($0 + 4 | 0) >> 2] = $3 | 3 | 0; - $0 = $0 + 8 | 0; - break label$1; - } - $2 = HEAP32[(0 + 1051772 | 0) >> 2] | 0; - label$76 : { - label$77 : { - $7 = $0 - $3 | 0; - if ($7 >>> 0 > 15 >>> 0) { - break label$77 - } - HEAP32[(0 + 1051772 | 0) >> 2] = 0; - HEAP32[(0 + 1051764 | 0) >> 2] = 0; - HEAP32[($2 + 4 | 0) >> 2] = $0 | 3 | 0; - $0 = $2 + $0 | 0; - HEAP32[($0 + 4 | 0) >> 2] = HEAP32[($0 + 4 | 0) >> 2] | 0 | 1 | 0; - break label$76; - } - HEAP32[(0 + 1051764 | 0) >> 2] = $7; - $6 = $2 + $3 | 0; - HEAP32[(0 + 1051772 | 0) >> 2] = $6; - HEAP32[($6 + 4 | 0) >> 2] = $7 | 1 | 0; - HEAP32[($2 + $0 | 0) >> 2] = $7; - HEAP32[($2 + 4 | 0) >> 2] = $3 | 3 | 0; - } - $0 = $2 + 8 | 0; - break label$1; - } - HEAP32[($0 + 4 | 0) >> 2] = $8 + $9 | 0; - $0 = HEAP32[(0 + 1051776 | 0) >> 2] | 0; - $2 = ($0 + 15 | 0) & -8 | 0; - $7 = $2 + -8 | 0; - HEAP32[(0 + 1051776 | 0) >> 2] = $7; - $928 = $0 - $2 | 0; - $2 = (HEAP32[(0 + 1051768 | 0) >> 2] | 0) + $9 | 0; - $6 = ($928 + $2 | 0) + 8 | 0; - HEAP32[(0 + 1051768 | 0) >> 2] = $6; - HEAP32[($7 + 4 | 0) >> 2] = $6 | 1 | 0; - HEAP32[(($0 + $2 | 0) + 4 | 0) >> 2] = 40; - HEAP32[(0 + 1051788 | 0) >> 2] = 2097152; - break label$47; - } - HEAP32[(0 + 1051776 | 0) >> 2] = $0; - $3 = (HEAP32[(0 + 1051768 | 0) >> 2] | 0) + $3 | 0; - HEAP32[(0 + 1051768 | 0) >> 2] = $3; - HEAP32[($0 + 4 | 0) >> 2] = $3 | 1 | 0; - break label$48; - } - HEAP32[(0 + 1051772 | 0) >> 2] = $0; - $3 = (HEAP32[(0 + 1051764 | 0) >> 2] | 0) + $3 | 0; - HEAP32[(0 + 1051764 | 0) >> 2] = $3; - HEAP32[($0 + 4 | 0) >> 2] = $3 | 1 | 0; - HEAP32[($0 + $3 | 0) >> 2] = $3; - } - $0 = $7 + 8 | 0; - break label$1; - } - $0 = 0; - $2 = HEAP32[(0 + 1051768 | 0) >> 2] | 0; - if ($2 >>> 0 <= $3 >>> 0) { - break label$1 - } - $2 = $2 - $3 | 0; - HEAP32[(0 + 1051768 | 0) >> 2] = $2; - $0 = HEAP32[(0 + 1051776 | 0) >> 2] | 0; - $7 = $0 + $3 | 0; - HEAP32[(0 + 1051776 | 0) >> 2] = $7; - HEAP32[($7 + 4 | 0) >> 2] = $2 | 1 | 0; - HEAP32[($0 + 4 | 0) >> 2] = $3 | 3 | 0; - $0 = $0 + 8 | 0; - break label$1; - } - HEAP32[($0 + 24 | 0) >> 2] = $5; - label$78 : { - $6 = HEAP32[($7 + 16 | 0) >> 2] | 0; - if (!$6) { - break label$78 - } - HEAP32[($0 + 16 | 0) >> 2] = $6; - HEAP32[($6 + 24 | 0) >> 2] = $0; - } - $6 = HEAP32[($7 + 20 | 0) >> 2] | 0; - if (!$6) { - break label$2 - } - HEAP32[($0 + 20 | 0) >> 2] = $6; - HEAP32[($6 + 24 | 0) >> 2] = $0; - } - label$79 : { - label$80 : { - if ($2 >>> 0 < 16 >>> 0) { - break label$80 - } - HEAP32[($7 + 4 | 0) >> 2] = $3 | 3 | 0; - $0 = $7 + $3 | 0; - HEAP32[($0 + 4 | 0) >> 2] = $2 | 1 | 0; - HEAP32[($0 + $2 | 0) >> 2] = $2; - label$81 : { - if ($2 >>> 0 < 256 >>> 0) { - break label$81 - } - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$18insert_large_chunk17h8e4702b854476b2fE($0 | 0, $2 | 0); - break label$79; - } - $3 = ($2 & 248 | 0) + 1051492 | 0; - label$82 : { - label$83 : { - $6 = HEAP32[(0 + 1051756 | 0) >> 2] | 0; - $2 = 1 << ($2 >>> 3 | 0) | 0; - if ($6 & $2 | 0) { - break label$83 - } - HEAP32[(0 + 1051756 | 0) >> 2] = $6 | $2 | 0; - $2 = $3; - break label$82; - } - $2 = HEAP32[($3 + 8 | 0) >> 2] | 0; - } - HEAP32[($3 + 8 | 0) >> 2] = $0; - HEAP32[($2 + 12 | 0) >> 2] = $0; - HEAP32[($0 + 12 | 0) >> 2] = $3; - HEAP32[($0 + 8 | 0) >> 2] = $2; - break label$79; - } - $0 = $2 + $3 | 0; - HEAP32[($7 + 4 | 0) >> 2] = $0 | 3 | 0; - $0 = $7 + $0 | 0; - HEAP32[($0 + 4 | 0) >> 2] = HEAP32[($0 + 4 | 0) >> 2] | 0 | 1 | 0; - } - $0 = $7 + 8 | 0; - } - __stack_pointer = $1 + 16 | 0; - return $0 | 0; - } - - function _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$8memalign17h816986e35e0be861E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, $4 = 0, $3 = 0, $5 = 0, $6 = 0; - $2 = 0; - label$1 : { - $0 = $0 >>> 0 > 16 >>> 0 ? $0 : 16; - if ((-65587 - $0 | 0) >>> 0 <= $1 >>> 0) { - break label$1 - } - $3 = $1 >>> 0 < 11 >>> 0 ? 16 : ($1 + 11 | 0) & -8 | 0; - $1 = _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$6malloc17hd9c2c8577ef4c61dE(($0 + $3 | 0) + 12 | 0 | 0) | 0; - if (!$1) { - break label$1 - } - $2 = $1 + -8 | 0; - label$2 : { - label$3 : { - $4 = $0 + -1 | 0; - if ($4 & $1 | 0) { - break label$3 - } - $0 = $2; - break label$2; - } - $5 = $1 + -4 | 0; - $6 = HEAP32[$5 >> 2] | 0; - $1 = (($4 + $1 | 0) & (0 - $0 | 0) | 0) + -8 | 0; - $0 = $1 + (($1 - $2 | 0) >>> 0 > 16 >>> 0 ? 0 : $0) | 0; - $1 = $0 - $2 | 0; - $4 = ($6 & -8 | 0) - $1 | 0; - label$4 : { - if (!($6 & 3 | 0)) { - break label$4 - } - HEAP32[($0 + 4 | 0) >> 2] = $4 | ((HEAP32[($0 + 4 | 0) >> 2] | 0) & 1 | 0) | 0 | 2 | 0; - $4 = $0 + $4 | 0; - HEAP32[($4 + 4 | 0) >> 2] = HEAP32[($4 + 4 | 0) >> 2] | 0 | 1 | 0; - HEAP32[$5 >> 2] = $1 | ((HEAP32[$5 >> 2] | 0) & 1 | 0) | 0 | 2 | 0; - $4 = $2 + $1 | 0; - HEAP32[($4 + 4 | 0) >> 2] = HEAP32[($4 + 4 | 0) >> 2] | 0 | 1 | 0; - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$13dispose_chunk17hb68dd003b737d09cE($2 | 0, $1 | 0); - break label$2; - } - $2 = HEAP32[$2 >> 2] | 0; - HEAP32[($0 + 4 | 0) >> 2] = $4; - HEAP32[$0 >> 2] = $2 + $1 | 0; - } - label$5 : { - $1 = HEAP32[($0 + 4 | 0) >> 2] | 0; - if (!($1 & 3 | 0)) { - break label$5 - } - $2 = $1 & -8 | 0; - if ($2 >>> 0 <= ($3 + 16 | 0) >>> 0) { - break label$5 - } - HEAP32[($0 + 4 | 0) >> 2] = $3 | ($1 & 1 | 0) | 0 | 2 | 0; - $1 = $0 + $3 | 0; - $3 = $2 - $3 | 0; - HEAP32[($1 + 4 | 0) >> 2] = $3 | 3 | 0; - $2 = $0 + $2 | 0; - HEAP32[($2 + 4 | 0) >> 2] = HEAP32[($2 + 4 | 0) >> 2] | 0 | 1 | 0; - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$13dispose_chunk17hb68dd003b737d09cE($1 | 0, $3 | 0); - } - $2 = $0 + 8 | 0; - } - return $2 | 0; - } - - function _ZN3std3sys9backtrace26__rust_end_short_backtrace17h64c5c3eeff5e218cE($0) { - $0 = $0 | 0; - _ZN3std9panicking19begin_panic_handler28_$u7b$$u7b$closure$u7d$$u7d$17hae7a24cfbe5dc9e9E($0 | 0); - wasm2js_trap(); - } - - function _ZN3std9panicking19begin_panic_handler28_$u7b$$u7b$closure$u7d$$u7d$17hae7a24cfbe5dc9e9E($0) { - $0 = $0 | 0; - var $2 = 0, $1 = 0, $3 = 0, $24 = 0, $37 = 0; - $1 = __stack_pointer - 16 | 0; - __stack_pointer = $1; - $2 = HEAP32[($0 + 12 | 0) >> 2] | 0; - label$1 : { - label$2 : { - label$3 : { - switch (HEAP32[($0 + 4 | 0) >> 2] | 0 | 0) { - case 0: - if ($2) { - break label$2 - } - $2 = 1; - $3 = 0; - break label$1; - case 1: - break label$3; - default: - break label$2; - }; - } - if ($2) { - break label$2 - } - $2 = HEAP32[$0 >> 2] | 0; - $3 = HEAP32[($2 + 4 | 0) >> 2] | 0; - $2 = HEAP32[$2 >> 2] | 0; - break label$1; - } - HEAP32[$1 >> 2] = -2147483648; - HEAP32[($1 + 12 | 0) >> 2] = $0; - $24 = HEAP32[($0 + 24 | 0) >> 2] | 0; - $0 = HEAP32[($0 + 28 | 0) >> 2] | 0; - _ZN3std9panicking20rust_panic_with_hook17h142fb958becc9908E($1 | 0, 1048912 | 0, $24 | 0, HEAPU8[($0 + 28 | 0) >> 0] | 0 | 0, HEAPU8[($0 + 29 | 0) >> 0] | 0 | 0); - wasm2js_trap(); - } - HEAP32[($1 + 4 | 0) >> 2] = $3; - HEAP32[$1 >> 2] = $2; - $37 = HEAP32[($0 + 24 | 0) >> 2] | 0; - $0 = HEAP32[($0 + 28 | 0) >> 2] | 0; - _ZN3std9panicking20rust_panic_with_hook17h142fb958becc9908E($1 | 0, 1048884 | 0, $37 | 0, HEAPU8[($0 + 28 | 0) >> 0] | 0 | 0, HEAPU8[($0 + 29 | 0) >> 0] | 0 | 0); - wasm2js_trap(); - } - - function _ZN3std5alloc24default_alloc_error_hook17h708687752e0edcfaE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, i64toi32_i32$1 = 0, i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$4 = 0, i64toi32_i32$3 = 0, $12 = 0, $13 = 0, $15$hi = 0, $18$hi = 0, $19 = 0; - $2 = __stack_pointer - 48 | 0; - __stack_pointer = $2; - label$1 : { - if (!(HEAPU8[(0 + 1051324 | 0) >> 0] | 0)) { - break label$1 - } - HEAP32[($2 + 12 | 0) >> 2] = 2; - HEAP32[($2 + 8 | 0) >> 2] = 1048804; - i64toi32_i32$1 = $2; - i64toi32_i32$0 = 0; - HEAP32[($2 + 20 | 0) >> 2] = 1; - HEAP32[($2 + 24 | 0) >> 2] = i64toi32_i32$0; - HEAP32[($2 + 44 | 0) >> 2] = $1; - $13 = $2; - i64toi32_i32$0 = 0; - i64toi32_i32$2 = 1; - i64toi32_i32$1 = 0; - i64toi32_i32$3 = 32; - i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { - i64toi32_i32$1 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - $12 = 0; - } else { - i64toi32_i32$1 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$0 << i64toi32_i32$4 | 0) | 0; - $12 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - } - $15$hi = i64toi32_i32$1; - i64toi32_i32$1 = 0; - $18$hi = i64toi32_i32$1; - i64toi32_i32$1 = $15$hi; - i64toi32_i32$0 = $12; - i64toi32_i32$2 = $18$hi; - i64toi32_i32$3 = $2 + 44 | 0; - i64toi32_i32$2 = i64toi32_i32$1 | i64toi32_i32$2 | 0; - $19 = i64toi32_i32$0 | i64toi32_i32$3 | 0; - i64toi32_i32$0 = $13; - HEAP32[(i64toi32_i32$0 + 32 | 0) >> 2] = $19; - HEAP32[(i64toi32_i32$0 + 36 | 0) >> 2] = i64toi32_i32$2; - HEAP32[($2 + 16 | 0) >> 2] = $2 + 32 | 0; - _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($2 + 8 | 0 | 0, 1048836 | 0); - wasm2js_trap(); - } - __stack_pointer = $2 + 48 | 0; - } - - function __rdl_alloc($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - label$1 : { - if ($1 >>> 0 < 9 >>> 0) { - break label$1 - } - return _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$8memalign17h816986e35e0be861E($1 | 0, $0 | 0) | 0 | 0; - } - return _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$6malloc17hd9c2c8577ef4c61dE($0 | 0) | 0 | 0; - } - - function __rdl_dealloc($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, $4 = 0; - label$1 : { - label$2 : { - $3 = HEAP32[($0 + -4 | 0) >> 2] | 0; - $4 = $3 & -8 | 0; - $3 = $3 & 3 | 0; - if ($4 >>> 0 < (($3 ? 4 : 8) + $1 | 0) >>> 0) { - break label$2 - } - label$3 : { - if (!$3) { - break label$3 - } - if ($4 >>> 0 > ($1 + 39 | 0) >>> 0) { - break label$1 - } - } - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$4free17hcade36dd23206a7bE($0 | 0); - return; - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1048641 | 0, 46 | 0, 1048688 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1048704 | 0, 46 | 0, 1048752 | 0); - wasm2js_trap(); - } - - function __rdl_realloc($0, $1, $2, $3) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - $3 = $3 | 0; - var $7 = 0, $5 = 0, $8 = 0, $4 = 0, $6 = 0, $9 = 0; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - label$5 : { - $4 = $0 + -4 | 0; - $5 = HEAP32[$4 >> 2] | 0; - $6 = $5 & -8 | 0; - $7 = $5 & 3 | 0; - if ($6 >>> 0 < (($7 ? 4 : 8) + $1 | 0) >>> 0) { - break label$5 - } - $8 = $1 + 39 | 0; - label$6 : { - if (!$7) { - break label$6 - } - if ($6 >>> 0 > $8 >>> 0) { - break label$4 - } - } - label$7 : { - label$8 : { - label$9 : { - if ($2 >>> 0 < 9 >>> 0) { - break label$9 - } - $2 = _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$8memalign17h816986e35e0be861E($2 | 0, $3 | 0) | 0; - if ($2) { - break label$8 - } - return 0 | 0; - } - $2 = 0; - if ($3 >>> 0 > -65588 >>> 0) { - break label$7 - } - $1 = $3 >>> 0 < 11 >>> 0 ? 16 : ($3 + 11 | 0) & -8 | 0; - label$10 : { - label$11 : { - if ($7) { - break label$11 - } - if ($1 >>> 0 < 256 >>> 0) { - break label$10 - } - if ($6 >>> 0 < ($1 | 4 | 0) >>> 0) { - break label$10 - } - if (($6 - $1 | 0) >>> 0 >= 131073 >>> 0) { - break label$10 - } - return $0 | 0; - } - $8 = $0 + -8 | 0; - $7 = $8 + $6 | 0; - label$12 : { - label$13 : { - label$14 : { - label$15 : { - label$16 : { - if ($6 >>> 0 >= $1 >>> 0) { - break label$16 - } - if (($7 | 0) == (HEAP32[(0 + 1051776 | 0) >> 2] | 0 | 0)) { - break label$12 - } - if (($7 | 0) == (HEAP32[(0 + 1051772 | 0) >> 2] | 0 | 0)) { - break label$14 - } - $5 = HEAP32[($7 + 4 | 0) >> 2] | 0; - if ($5 & 2 | 0) { - break label$10 - } - $9 = $5 & -8 | 0; - $5 = $9 + $6 | 0; - if ($5 >>> 0 < $1 >>> 0) { - break label$10 - } - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$12unlink_chunk17h20421146e3e4e9ccE($7 | 0, $9 | 0); - $3 = $5 - $1 | 0; - if ($3 >>> 0 < 16 >>> 0) { - break label$15 - } - HEAP32[$4 >> 2] = $1 | ((HEAP32[$4 >> 2] | 0) & 1 | 0) | 0 | 2 | 0; - $1 = $8 + $1 | 0; - HEAP32[($1 + 4 | 0) >> 2] = $3 | 3 | 0; - $2 = $8 + $5 | 0; - HEAP32[($2 + 4 | 0) >> 2] = HEAP32[($2 + 4 | 0) >> 2] | 0 | 1 | 0; - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$13dispose_chunk17hb68dd003b737d09cE($1 | 0, $3 | 0); - return $0 | 0; - } - $3 = $6 - $1 | 0; - if ($3 >>> 0 > 15 >>> 0) { - break label$13 - } - return $0 | 0; - } - HEAP32[$4 >> 2] = $5 | ((HEAP32[$4 >> 2] | 0) & 1 | 0) | 0 | 2 | 0; - $1 = $8 + $5 | 0; - HEAP32[($1 + 4 | 0) >> 2] = HEAP32[($1 + 4 | 0) >> 2] | 0 | 1 | 0; - return $0 | 0; - } - $7 = (HEAP32[(0 + 1051764 | 0) >> 2] | 0) + $6 | 0; - if ($7 >>> 0 < $1 >>> 0) { - break label$10 - } - label$17 : { - label$18 : { - $3 = $7 - $1 | 0; - if ($3 >>> 0 > 15 >>> 0) { - break label$18 - } - HEAP32[$4 >> 2] = $5 & 1 | 0 | $7 | 0 | 2 | 0; - $1 = $8 + $7 | 0; - HEAP32[($1 + 4 | 0) >> 2] = HEAP32[($1 + 4 | 0) >> 2] | 0 | 1 | 0; - $3 = 0; - $1 = 0; - break label$17; - } - HEAP32[$4 >> 2] = $1 | ($5 & 1 | 0) | 0 | 2 | 0; - $1 = $8 + $1 | 0; - HEAP32[($1 + 4 | 0) >> 2] = $3 | 1 | 0; - $2 = $8 + $7 | 0; - HEAP32[$2 >> 2] = $3; - HEAP32[($2 + 4 | 0) >> 2] = (HEAP32[($2 + 4 | 0) >> 2] | 0) & -2 | 0; - } - HEAP32[(0 + 1051772 | 0) >> 2] = $1; - HEAP32[(0 + 1051764 | 0) >> 2] = $3; - return $0 | 0; - } - HEAP32[$4 >> 2] = $1 | ($5 & 1 | 0) | 0 | 2 | 0; - $1 = $8 + $1 | 0; - HEAP32[($1 + 4 | 0) >> 2] = $3 | 3 | 0; - HEAP32[($7 + 4 | 0) >> 2] = HEAP32[($7 + 4 | 0) >> 2] | 0 | 1 | 0; - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$13dispose_chunk17hb68dd003b737d09cE($1 | 0, $3 | 0); - return $0 | 0; - } - $7 = (HEAP32[(0 + 1051768 | 0) >> 2] | 0) + $6 | 0; - if ($7 >>> 0 > $1 >>> 0) { - break label$1 - } - } - $1 = _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$6malloc17hd9c2c8577ef4c61dE($3 | 0) | 0; - if (!$1) { - break label$7 - } - $2 = HEAP32[$4 >> 2] | 0; - $2 = ($2 & 3 | 0 ? -4 : -8) + ($2 & -8 | 0) | 0; - $1 = memcpy($1 | 0, $0 | 0, ($2 >>> 0 < $3 >>> 0 ? $2 : $3) | 0) | 0; - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$4free17hcade36dd23206a7bE($0 | 0); - return $1 | 0; - } - memcpy($2 | 0, $0 | 0, ($1 >>> 0 < $3 >>> 0 ? $1 : $3) | 0) | 0; - $3 = HEAP32[$4 >> 2] | 0; - $7 = $3 & -8 | 0; - $3 = $3 & 3 | 0; - if ($7 >>> 0 < (($3 ? 4 : 8) + $1 | 0) >>> 0) { - break label$3 - } - label$19 : { - if (!$3) { - break label$19 - } - if ($7 >>> 0 > $8 >>> 0) { - break label$2 - } - } - _ZN8dlmalloc8dlmalloc17Dlmalloc$LT$A$GT$4free17hcade36dd23206a7bE($0 | 0); - } - return $2 | 0; - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1048641 | 0, 46 | 0, 1048688 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1048704 | 0, 46 | 0, 1048752 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1048641 | 0, 46 | 0, 1048688 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1048704 | 0, 46 | 0, 1048752 | 0); - wasm2js_trap(); - } - HEAP32[$4 >> 2] = $1 | ($5 & 1 | 0) | 0 | 2 | 0; - $3 = $8 + $1 | 0; - $1 = $7 - $1 | 0; - HEAP32[($3 + 4 | 0) >> 2] = $1 | 1 | 0; - HEAP32[(0 + 1051768 | 0) >> 2] = $1; - HEAP32[(0 + 1051776 | 0) >> 2] = $3; - return $0 | 0; - } - - function rust_begin_unwind($0) { - $0 = $0 | 0; - var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$1 = 0, $1 = 0, $2 = 0, $12 = 0, $17 = 0, $24 = 0; - $1 = __stack_pointer - 32 | 0; - __stack_pointer = $1; - $2 = HEAP32[($0 + 24 | 0) >> 2] | 0; - i64toi32_i32$2 = $0 + 16 | 0; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $12 = i64toi32_i32$0; - i64toi32_i32$0 = $1 + 16 | 0; - HEAP32[i64toi32_i32$0 >> 2] = $12; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - i64toi32_i32$2 = $0 + 8 | 0; - i64toi32_i32$1 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$0 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $17 = i64toi32_i32$1; - i64toi32_i32$1 = $1 + 8 | 0; - HEAP32[i64toi32_i32$1 >> 2] = $17; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - HEAP32[($1 + 28 | 0) >> 2] = $0; - HEAP32[($1 + 24 | 0) >> 2] = $2; - i64toi32_i32$2 = $0; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $24 = i64toi32_i32$0; - i64toi32_i32$0 = $1; - HEAP32[i64toi32_i32$0 >> 2] = $24; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - _ZN3std3sys9backtrace26__rust_end_short_backtrace17h64c5c3eeff5e218cE(i64toi32_i32$0 | 0); - wasm2js_trap(); - } - - function _ZN102_$LT$std__panicking__begin_panic_handler__FormatStringPayload$u20$as$u20$core__panic__PanicPayload$GT$8take_box17hfdafd7cd188838afE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, $2 = 0, $3 = 0, $5 = 0, $4 = 0, $5$hi = 0, $24 = 0, $30 = 0, $33 = 0, $73 = 0; - $2 = __stack_pointer - 64 | 0; - __stack_pointer = $2; - label$1 : { - if ((HEAP32[$1 >> 2] | 0 | 0) != (-2147483648 | 0)) { - break label$1 - } - $3 = HEAP32[($1 + 12 | 0) >> 2] | 0; - $4 = ($2 + 28 | 0) + 8 | 0; - HEAP32[$4 >> 2] = 0; - i64toi32_i32$1 = $2; - i64toi32_i32$0 = 1; - HEAP32[(i64toi32_i32$1 + 28 | 0) >> 2] = 0; - HEAP32[(i64toi32_i32$1 + 32 | 0) >> 2] = i64toi32_i32$0; - i64toi32_i32$2 = $3 + 16 | 0; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $24 = i64toi32_i32$0; - i64toi32_i32$0 = ($2 + 40 | 0) + 16 | 0; - HEAP32[i64toi32_i32$0 >> 2] = $24; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - i64toi32_i32$2 = $3 + 8 | 0; - i64toi32_i32$1 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$0 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $30 = i64toi32_i32$1; - i64toi32_i32$1 = ($2 + 40 | 0) + 8 | 0; - HEAP32[i64toi32_i32$1 >> 2] = $30; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - i64toi32_i32$2 = $3; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $33 = i64toi32_i32$0; - i64toi32_i32$0 = $2; - HEAP32[(i64toi32_i32$0 + 40 | 0) >> 2] = $33; - HEAP32[(i64toi32_i32$0 + 44 | 0) >> 2] = i64toi32_i32$1; - _ZN4core3fmt5write17hd273a061a774381dE(i64toi32_i32$0 + 28 | 0 | 0, 1048576 | 0, i64toi32_i32$0 + 40 | 0 | 0) | 0; - $3 = HEAP32[$4 >> 2] | 0; - HEAP32[((i64toi32_i32$0 + 16 | 0) + 8 | 0) >> 2] = $3; - i64toi32_i32$2 = i64toi32_i32$0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$0 + 28 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[(i64toi32_i32$0 + 32 | 0) >> 2] | 0; - $5 = i64toi32_i32$1; - $5$hi = i64toi32_i32$0; - i64toi32_i32$1 = $2; - HEAP32[(i64toi32_i32$1 + 16 | 0) >> 2] = $5; - HEAP32[(i64toi32_i32$1 + 20 | 0) >> 2] = i64toi32_i32$0; - HEAP32[($1 + 8 | 0) >> 2] = $3; - i64toi32_i32$1 = $1; - HEAP32[i64toi32_i32$1 >> 2] = $5; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - } - i64toi32_i32$2 = $1; - i64toi32_i32$0 = HEAP32[$1 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($1 + 4 | 0) >> 2] | 0; - $5 = i64toi32_i32$0; - $5$hi = i64toi32_i32$1; - i64toi32_i32$0 = $1; - i64toi32_i32$1 = 1; - HEAP32[i64toi32_i32$0 >> 2] = 0; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - $3 = $2 + 8 | 0; - $1 = i64toi32_i32$0 + 8 | 0; - HEAP32[$3 >> 2] = HEAP32[$1 >> 2] | 0; - HEAP32[$1 >> 2] = 0; - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - i64toi32_i32$1 = $5$hi; - i64toi32_i32$0 = $2; - HEAP32[i64toi32_i32$0 >> 2] = $5; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - label$2 : { - $1 = __rust_alloc(12 | 0, 4 | 0) | 0; - if (!$1) { - break label$2 - } - i64toi32_i32$2 = i64toi32_i32$0; - i64toi32_i32$1 = HEAP32[i64toi32_i32$0 >> 2] | 0; - i64toi32_i32$0 = HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] | 0; - $73 = i64toi32_i32$1; - i64toi32_i32$1 = $1; - HEAP32[i64toi32_i32$1 >> 2] = $73; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - HEAP32[(i64toi32_i32$1 + 8 | 0) >> 2] = HEAP32[$3 >> 2] | 0; - HEAP32[($0 + 4 | 0) >> 2] = 1048852; - HEAP32[$0 >> 2] = i64toi32_i32$1; - __stack_pointer = $2 + 64 | 0; - return; - } - _ZN5alloc5alloc18handle_alloc_error17h123ae56be4092711E(4 | 0, 12 | 0); - wasm2js_trap(); - } - - function _ZN102_$LT$std__panicking__begin_panic_handler__FormatStringPayload$u20$as$u20$core__panic__PanicPayload$GT$3get17h3875705a18b9af03E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $24 = 0, $30 = 0, $33 = 0; - $2 = __stack_pointer - 48 | 0; - __stack_pointer = $2; - label$1 : { - if ((HEAP32[$1 >> 2] | 0 | 0) != (-2147483648 | 0)) { - break label$1 - } - $3 = HEAP32[($1 + 12 | 0) >> 2] | 0; - $4 = ($2 + 12 | 0) + 8 | 0; - HEAP32[$4 >> 2] = 0; - i64toi32_i32$1 = $2; - i64toi32_i32$0 = 1; - HEAP32[(i64toi32_i32$1 + 12 | 0) >> 2] = 0; - HEAP32[(i64toi32_i32$1 + 16 | 0) >> 2] = i64toi32_i32$0; - i64toi32_i32$2 = $3 + 16 | 0; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $24 = i64toi32_i32$0; - i64toi32_i32$0 = ($2 + 24 | 0) + 16 | 0; - HEAP32[i64toi32_i32$0 >> 2] = $24; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - i64toi32_i32$2 = $3 + 8 | 0; - i64toi32_i32$1 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$0 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $30 = i64toi32_i32$1; - i64toi32_i32$1 = ($2 + 24 | 0) + 8 | 0; - HEAP32[i64toi32_i32$1 >> 2] = $30; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - i64toi32_i32$2 = $3; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $33 = i64toi32_i32$0; - i64toi32_i32$0 = $2; - HEAP32[(i64toi32_i32$0 + 24 | 0) >> 2] = $33; - HEAP32[(i64toi32_i32$0 + 28 | 0) >> 2] = i64toi32_i32$1; - _ZN4core3fmt5write17hd273a061a774381dE(i64toi32_i32$0 + 12 | 0 | 0, 1048576 | 0, i64toi32_i32$0 + 24 | 0 | 0) | 0; - $3 = HEAP32[$4 >> 2] | 0; - HEAP32[(i64toi32_i32$0 + 8 | 0) >> 2] = $3; - i64toi32_i32$2 = i64toi32_i32$0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$0 + 12 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[(i64toi32_i32$0 + 16 | 0) >> 2] | 0; - $5 = i64toi32_i32$1; - i64toi32_i32$1 = $2; - HEAP32[i64toi32_i32$1 >> 2] = $5; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - HEAP32[($1 + 8 | 0) >> 2] = $3; - i64toi32_i32$1 = $1; - HEAP32[i64toi32_i32$1 >> 2] = $5; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - } - HEAP32[($0 + 4 | 0) >> 2] = 1048852; - HEAP32[$0 >> 2] = $1; - __stack_pointer = $2 + 48 | 0; - } - - function _ZN95_$LT$std__panicking__begin_panic_handler__FormatStringPayload$u20$as$u20$core__fmt__Display$GT$3fmt17h778dceefa8ea4afeE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, $2 = 0, $22 = 0, $28 = 0, $31 = 0; - $2 = __stack_pointer - 32 | 0; - __stack_pointer = $2; - label$1 : { - label$2 : { - if ((HEAP32[$0 >> 2] | 0 | 0) == (-2147483648 | 0)) { - break label$2 - } - $0 = _ZN4core3fmt9Formatter9write_str17h7b04ca2eef2f5010E($1 | 0, HEAP32[($0 + 4 | 0) >> 2] | 0 | 0, HEAP32[($0 + 8 | 0) >> 2] | 0 | 0) | 0; - break label$1; - } - $0 = HEAP32[($0 + 12 | 0) >> 2] | 0; - i64toi32_i32$2 = $0 + 16 | 0; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $22 = i64toi32_i32$0; - i64toi32_i32$0 = ($2 + 8 | 0) + 16 | 0; - HEAP32[i64toi32_i32$0 >> 2] = $22; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - i64toi32_i32$2 = $0 + 8 | 0; - i64toi32_i32$1 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$0 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $28 = i64toi32_i32$1; - i64toi32_i32$1 = ($2 + 8 | 0) + 8 | 0; - HEAP32[i64toi32_i32$1 >> 2] = $28; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - i64toi32_i32$2 = $0; - i64toi32_i32$0 = HEAP32[$0 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($0 + 4 | 0) >> 2] | 0; - $31 = i64toi32_i32$0; - i64toi32_i32$0 = $2; - HEAP32[(i64toi32_i32$0 + 8 | 0) >> 2] = $31; - HEAP32[(i64toi32_i32$0 + 12 | 0) >> 2] = i64toi32_i32$1; - $0 = _ZN4core3fmt5write17hd273a061a774381dE(HEAP32[($1 + 20 | 0) >> 2] | 0 | 0, HEAP32[($1 + 24 | 0) >> 2] | 0 | 0, i64toi32_i32$0 + 8 | 0 | 0) | 0; - } - __stack_pointer = $2 + 32 | 0; - return $0 | 0; - } - - function _ZN99_$LT$std__panicking__begin_panic_handler__StaticStrPayload$u20$as$u20$core__panic__PanicPayload$GT$8take_box17hdbb807c1367ee940E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, $3 = 0; - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - $2 = HEAP32[($1 + 4 | 0) >> 2] | 0; - $3 = HEAP32[$1 >> 2] | 0; - label$1 : { - $1 = __rust_alloc(8 | 0, 4 | 0) | 0; - if (!$1) { - break label$1 - } - HEAP32[($1 + 4 | 0) >> 2] = $2; - HEAP32[$1 >> 2] = $3; - HEAP32[($0 + 4 | 0) >> 2] = 1048868; - HEAP32[$0 >> 2] = $1; - return; - } - _ZN5alloc5alloc18handle_alloc_error17h123ae56be4092711E(4 | 0, 8 | 0); - wasm2js_trap(); - } - - function _ZN99_$LT$std__panicking__begin_panic_handler__StaticStrPayload$u20$as$u20$core__panic__PanicPayload$GT$3get17hd2f9ef478e42b077E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - HEAP32[($0 + 4 | 0) >> 2] = 1048868; - HEAP32[$0 >> 2] = $1; - } - - function _ZN99_$LT$std__panicking__begin_panic_handler__StaticStrPayload$u20$as$u20$core__panic__PanicPayload$GT$6as_str17h231eb7cfbc685441E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$1 = 0, $4 = 0; - i64toi32_i32$2 = $1; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $4 = i64toi32_i32$0; - i64toi32_i32$0 = $0; - HEAP32[i64toi32_i32$0 >> 2] = $4; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - } - - function _ZN92_$LT$std__panicking__begin_panic_handler__StaticStrPayload$u20$as$u20$core__fmt__Display$GT$3fmt17h7d6d1d4c62b643baE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - return _ZN4core3fmt9Formatter9write_str17h7b04ca2eef2f5010E($1 | 0, HEAP32[$0 >> 2] | 0 | 0, HEAP32[($0 + 4 | 0) >> 2] | 0 | 0) | 0 | 0; - } - - function _ZN3std9panicking20rust_panic_with_hook17h142fb958becc9908E($0, $1, $2, $3, $4) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - $3 = $3 | 0; - $4 = $4 | 0; - var $5 = 0, $6 = 0, i64toi32_i32$1 = 0; - $5 = __stack_pointer - 32 | 0; - __stack_pointer = $5; - $6 = HEAP32[(0 + 1051344 | 0) >> 2] | 0; - HEAP32[(0 + 1051344 | 0) >> 2] = $6 + 1 | 0; - label$1 : { - label$2 : { - if (($6 | 0) < (0 | 0)) { - break label$2 - } - if (HEAPU8[(0 + 1051804 | 0) >> 0] | 0) { - break label$1 - } - HEAP8[(0 + 1051804 | 0) >> 0] = 1; - HEAP32[(0 + 1051800 | 0) >> 2] = (HEAP32[(0 + 1051800 | 0) >> 2] | 0) + 1 | 0; - $6 = HEAP32[(0 + 1051332 | 0) >> 2] | 0; - if (($6 | 0) <= (-1 | 0)) { - break label$2 - } - HEAP32[(0 + 1051332 | 0) >> 2] = $6 + 1 | 0; - label$3 : { - if (!(HEAP32[(0 + 1051336 | 0) >> 2] | 0)) { - break label$3 - } - FUNCTION_TABLE[HEAP32[($1 + 20 | 0) >> 2] | 0 | 0]($5 + 8 | 0, $0); - HEAP8[($5 + 29 | 0) >> 0] = $4; - HEAP8[($5 + 28 | 0) >> 0] = $3; - HEAP32[($5 + 24 | 0) >> 2] = $2; - i64toi32_i32$1 = HEAP32[($5 + 12 | 0) >> 2] | 0; - HEAP32[($5 + 16 | 0) >> 2] = HEAP32[($5 + 8 | 0) >> 2] | 0; - HEAP32[($5 + 20 | 0) >> 2] = i64toi32_i32$1; - FUNCTION_TABLE[HEAP32[((HEAP32[(0 + 1051340 | 0) >> 2] | 0) + 20 | 0) >> 2] | 0 | 0](HEAP32[(0 + 1051336 | 0) >> 2] | 0, $5 + 16 | 0); - $6 = (HEAP32[(0 + 1051332 | 0) >> 2] | 0) + -1 | 0; - } - HEAP32[(0 + 1051332 | 0) >> 2] = $6; - HEAP8[(0 + 1051804 | 0) >> 0] = 0; - if (!$3) { - break label$2 - } - rust_panic($0 | 0, $1 | 0); - } - wasm2js_trap(); - } - FUNCTION_TABLE[HEAP32[($1 + 24 | 0) >> 2] | 0 | 0]($5, $0); - wasm2js_trap(); - } - - function rust_panic($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - __rust_start_panic($0 | 0, $1 | 0) | 0; - wasm2js_trap(); - } - - function __rg_oom($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0; - $2 = HEAP32[(0 + 1051328 | 0) >> 2] | 0; - FUNCTION_TABLE[($2 ? $2 : 2) | 0]($1, $0); - wasm2js_trap(); - } - - function __rust_start_panic($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - wasm2js_trap(); - } - - function _ZN61_$LT$dlmalloc__sys__System$u20$as$u20$dlmalloc__Allocator$GT$5alloc17hb2750b8aaf9916efE($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, $10 = 0; - $3 = __wasm_memory_grow($2 >>> 16 | 0 | 0); - HEAP32[($0 + 8 | 0) >> 2] = 0; - $10 = $2 & -65536 | 0; - $2 = ($3 | 0) == (-1 | 0); - HEAP32[($0 + 4 | 0) >> 2] = $2 ? 0 : $10; - HEAP32[$0 >> 2] = $2 ? 0 : $3 << 16 | 0; - } - - function _ZN4core3fmt5Write9write_fmt17h12c6d34f0ecf8d3dE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - return _ZN4core3fmt5write17hd273a061a774381dE($0 | 0, 1048948 | 0, $1 | 0) | 0 | 0; - } - - function _ZN4core3ptr42drop_in_place$LT$alloc__string__String$GT$17h0f9d5bab53e46359E($0) { - $0 = $0 | 0; - var $1 = 0; - label$1 : { - $1 = HEAP32[$0 >> 2] | 0; - if (!$1) { - break label$1 - } - __rust_dealloc(HEAP32[($0 + 4 | 0) >> 2] | 0 | 0, $1 | 0, 1 | 0); - } - } - - function _ZN53_$LT$core__fmt__Error$u20$as$u20$core__fmt__Debug$GT$3fmt17hc7b9dec108bfb98cE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - return _ZN4core3fmt9Formatter9write_str17h7b04ca2eef2f5010E($1 | 0, 1048940 | 0, 5 | 0) | 0 | 0; - } - - function _ZN5alloc7raw_vec17capacity_overflow17hf270d28094a4efafE() { - var $0 = 0; - $0 = __stack_pointer - 32 | 0; - __stack_pointer = $0; - HEAP32[($0 + 24 | 0) >> 2] = 0; - HEAP32[($0 + 12 | 0) >> 2] = 1; - HEAP32[($0 + 8 | 0) >> 2] = 1048992; - HEAP32[($0 + 16 | 0) >> 2] = 4; - HEAP32[($0 + 20 | 0) >> 2] = 0; - _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($0 + 8 | 0 | 0, 1049020 | 0); - wasm2js_trap(); - } - - function _ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve21do_reserve_and_handle17h1929fa6bfa2184fdE($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, $4 = 0; - $3 = __stack_pointer - 32 | 0; - __stack_pointer = $3; - label$1 : { - $2 = $1 + $2 | 0; - if ($2 >>> 0 >= $1 >>> 0) { - break label$1 - } - _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE(0 | 0, 0 | 0); - wasm2js_trap(); - } - $4 = HEAP32[$0 >> 2] | 0; - $1 = $4 << 1 | 0; - $1 = $1 >>> 0 > $2 >>> 0 ? $1 : $2; - $1 = $1 >>> 0 > 8 >>> 0 ? $1 : 8; - $2 = ($1 ^ -1 | 0) >>> 31 | 0; - label$2 : { - label$3 : { - if ($4) { - break label$3 - } - $4 = 0; - break label$2; - } - HEAP32[($3 + 28 | 0) >> 2] = $4; - HEAP32[($3 + 20 | 0) >> 2] = HEAP32[($0 + 4 | 0) >> 2] | 0; - $4 = 1; - } - HEAP32[($3 + 24 | 0) >> 2] = $4; - _ZN5alloc7raw_vec11finish_grow17h7b9ce5ade3738748E($3 + 8 | 0 | 0, $2 | 0, $1 | 0, $3 + 20 | 0 | 0); - label$4 : { - if ((HEAP32[($3 + 8 | 0) >> 2] | 0 | 0) != (1 | 0)) { - break label$4 - } - _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE(HEAP32[($3 + 12 | 0) >> 2] | 0 | 0, HEAP32[($3 + 16 | 0) >> 2] | 0 | 0); - wasm2js_trap(); - } - $2 = HEAP32[($3 + 12 | 0) >> 2] | 0; - HEAP32[$0 >> 2] = $1; - HEAP32[($0 + 4 | 0) >> 2] = $2; - __stack_pointer = $3 + 32 | 0; - } - - function _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - label$1 : { - if ($0) { - break label$1 - } - _ZN5alloc7raw_vec17capacity_overflow17hf270d28094a4efafE(); - wasm2js_trap(); - } - _ZN5alloc5alloc18handle_alloc_error17h123ae56be4092711E($0 | 0, $1 | 0); - wasm2js_trap(); - } - - function _ZN5alloc7raw_vec11finish_grow17h7b9ce5ade3738748E($0, $1, $2, $3) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - $3 = $3 | 0; - var $4 = 0, $5 = 0, $6 = 0; - $4 = 1; - $5 = 0; - $6 = 4; - label$1 : { - if (!$1) { - break label$1 - } - if (($2 | 0) < (0 | 0)) { - break label$1 - } - label$2 : { - label$3 : { - label$4 : { - label$5 : { - label$6 : { - if (!(HEAP32[($3 + 4 | 0) >> 2] | 0)) { - break label$6 - } - label$7 : { - $4 = HEAP32[($3 + 8 | 0) >> 2] | 0; - if ($4) { - break label$7 - } - label$8 : { - if ($2) { - break label$8 - } - $4 = 1; - break label$4; - } - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - $4 = __rust_alloc($2 | 0, 1 | 0) | 0; - break label$5; - } - $4 = __rust_realloc(HEAP32[$3 >> 2] | 0 | 0, $4 | 0, 1 | 0, $2 | 0) | 0; - break label$5; - } - label$9 : { - if ($2) { - break label$9 - } - $4 = 1; - break label$4; - } - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - $4 = __rust_alloc($2 | 0, 1 | 0) | 0; - } - if (!$4) { - break label$3 - } - } - HEAP32[($0 + 4 | 0) >> 2] = $4; - $4 = 0; - break label$2; - } - $4 = 1; - HEAP32[($0 + 4 | 0) >> 2] = 1; - } - $6 = 8; - $5 = $2; - } - HEAP32[($0 + $6 | 0) >> 2] = $5; - HEAP32[$0 >> 2] = $4; - } - - function _ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$8grow_one17h1fc259ca8e381992E($0) { - $0 = $0 | 0; - var $1 = 0, $2 = 0, $3 = 0, $4 = 0; - $1 = __stack_pointer - 32 | 0; - __stack_pointer = $1; - label$1 : { - $2 = HEAP32[$0 >> 2] | 0; - if (($2 | 0) != (-1 | 0)) { - break label$1 - } - _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE(0 | 0, 0 | 0); - wasm2js_trap(); - } - $3 = $2 << 1 | 0; - $4 = $2 + 1 | 0; - $3 = $3 >>> 0 > $4 >>> 0 ? $3 : $4; - $3 = $3 >>> 0 > 8 >>> 0 ? $3 : 8; - $4 = ($3 ^ -1 | 0) >>> 31 | 0; - label$2 : { - label$3 : { - if ($2) { - break label$3 - } - $2 = 0; - break label$2; - } - HEAP32[($1 + 28 | 0) >> 2] = $2; - HEAP32[($1 + 20 | 0) >> 2] = HEAP32[($0 + 4 | 0) >> 2] | 0; - $2 = 1; - } - HEAP32[($1 + 24 | 0) >> 2] = $2; - _ZN5alloc7raw_vec11finish_grow17h7b9ce5ade3738748E($1 + 8 | 0 | 0, $4 | 0, $3 | 0, $1 + 20 | 0 | 0); - label$4 : { - if ((HEAP32[($1 + 8 | 0) >> 2] | 0 | 0) != (1 | 0)) { - break label$4 - } - _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE(HEAP32[($1 + 12 | 0) >> 2] | 0 | 0, HEAP32[($1 + 16 | 0) >> 2] | 0 | 0); - wasm2js_trap(); - } - $2 = HEAP32[($1 + 12 | 0) >> 2] | 0; - HEAP32[$0 >> 2] = $3; - HEAP32[($0 + 4 | 0) >> 2] = $2; - __stack_pointer = $1 + 32 | 0; - } - - function _ZN5alloc5alloc18handle_alloc_error17h123ae56be4092711E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - __rust_alloc_error_handler($1 | 0, $0 | 0); - wasm2js_trap(); - } - - function _ZN5alloc3fmt6format12format_inner17hfada08777d0a48e9E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $3 = 0, $7 = 0, $2 = 0, $5 = 0, $6 = 0, i64toi32_i32$0 = 0, $4 = 0, $8 = 0, i64toi32_i32$1 = 0, $101 = 0; - $2 = __stack_pointer - 16 | 0; - __stack_pointer = $2; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - label$5 : { - $3 = HEAP32[($1 + 4 | 0) >> 2] | 0; - if (!$3) { - break label$5 - } - $4 = HEAP32[$1 >> 2] | 0; - $5 = $3 & 3 | 0; - label$6 : { - label$7 : { - if ($3 >>> 0 >= 4 >>> 0) { - break label$7 - } - $3 = 0; - $6 = 0; - break label$6; - } - $7 = $4 + 28 | 0; - $8 = $3 & -4 | 0; - $3 = 0; - $6 = 0; - label$8 : while (1) { - $3 = (HEAP32[$7 >> 2] | 0) + ((HEAP32[($7 + -8 | 0) >> 2] | 0) + ((HEAP32[($7 + -16 | 0) >> 2] | 0) + ((HEAP32[($7 + -24 | 0) >> 2] | 0) + $3 | 0) | 0) | 0) | 0; - $7 = $7 + 32 | 0; - $6 = $6 + 4 | 0; - if (($8 | 0) != ($6 | 0)) { - continue label$8 - } - break label$8; - }; - } - label$9 : { - if (!$5) { - break label$9 - } - $7 = (($6 << 3 | 0) + $4 | 0) + 4 | 0; - label$10 : while (1) { - $3 = (HEAP32[$7 >> 2] | 0) + $3 | 0; - $7 = $7 + 8 | 0; - $5 = $5 + -1 | 0; - if ($5) { - continue label$10 - } - break label$10; - }; - } - label$11 : { - if (!(HEAP32[($1 + 12 | 0) >> 2] | 0)) { - break label$11 - } - if (($3 | 0) < (0 | 0)) { - break label$5 - } - if ($3 >>> 0 < 16 >>> 0 & !(HEAP32[($4 + 4 | 0) >> 2] | 0) | 0) { - break label$5 - } - $3 = $3 << 1 | 0; - } - if ($3) { - break label$4 - } - } - $7 = 1; - $3 = 0; - break label$3; - } - $5 = 0; - if (($3 | 0) < (0 | 0)) { - break label$2 - } - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - $5 = 1; - $7 = __rust_alloc($3 | 0, 1 | 0) | 0; - if (!$7) { - break label$2 - } - } - HEAP32[($2 + 8 | 0) >> 2] = 0; - HEAP32[($2 + 4 | 0) >> 2] = $7; - HEAP32[$2 >> 2] = $3; - if (!(_ZN4core3fmt5write17hd273a061a774381dE($2 | 0, 1048948 | 0, $1 | 0) | 0)) { - break label$1 - } - _ZN4core6result13unwrap_failed17h63e31ad259971ff4E(1049052 | 0, 86 | 0, $2 + 15 | 0 | 0, 1049036 | 0, 1049156 | 0); - wasm2js_trap(); - } - _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE($5 | 0, $3 | 0); - wasm2js_trap(); - } - i64toi32_i32$0 = HEAP32[$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($2 + 4 | 0) >> 2] | 0; - $101 = i64toi32_i32$0; - i64toi32_i32$0 = $0; - HEAP32[i64toi32_i32$0 >> 2] = $101; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - HEAP32[(i64toi32_i32$0 + 8 | 0) >> 2] = HEAP32[($2 + 8 | 0) >> 2] | 0; - __stack_pointer = $2 + 16 | 0; - } - - function _ZN5alloc6string6String4push17heffbdde4b7aa7c44E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, $3 = 0; - $2 = __stack_pointer - 16 | 0; - __stack_pointer = $2; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - if ($1 >>> 0 < 128 >>> 0) { - break label$4 - } - HEAP32[($2 + 12 | 0) >> 2] = 0; - if ($1 >>> 0 < 2048 >>> 0) { - break label$3 - } - label$5 : { - if ($1 >>> 0 >= 65536 >>> 0) { - break label$5 - } - HEAP8[($2 + 14 | 0) >> 0] = $1 & 63 | 0 | 128 | 0; - HEAP8[($2 + 12 | 0) >> 0] = $1 >>> 12 | 0 | 224 | 0; - HEAP8[($2 + 13 | 0) >> 0] = ($1 >>> 6 | 0) & 63 | 0 | 128 | 0; - $1 = 3; - break label$2; - } - HEAP8[($2 + 15 | 0) >> 0] = $1 & 63 | 0 | 128 | 0; - HEAP8[($2 + 12 | 0) >> 0] = $1 >>> 18 | 0 | 240 | 0; - HEAP8[($2 + 14 | 0) >> 0] = ($1 >>> 6 | 0) & 63 | 0 | 128 | 0; - HEAP8[($2 + 13 | 0) >> 0] = ($1 >>> 12 | 0) & 63 | 0 | 128 | 0; - $1 = 4; - break label$2; - } - label$6 : { - $3 = HEAP32[($0 + 8 | 0) >> 2] | 0; - if (($3 | 0) != (HEAP32[$0 >> 2] | 0 | 0)) { - break label$6 - } - _ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$8grow_one17h1fc259ca8e381992E($0 | 0); - } - HEAP32[($0 + 8 | 0) >> 2] = $3 + 1 | 0; - HEAP8[((HEAP32[($0 + 4 | 0) >> 2] | 0) + $3 | 0) >> 0] = $1; - break label$1; - } - HEAP8[($2 + 13 | 0) >> 0] = $1 & 63 | 0 | 128 | 0; - HEAP8[($2 + 12 | 0) >> 0] = $1 >>> 6 | 0 | 192 | 0; - $1 = 2; - } - label$7 : { - $3 = HEAP32[($0 + 8 | 0) >> 2] | 0; - if (((HEAP32[$0 >> 2] | 0) - $3 | 0) >>> 0 >= $1 >>> 0) { - break label$7 - } - _ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve21do_reserve_and_handle17h1929fa6bfa2184fdE($0 | 0, $3 | 0, $1 | 0); - $3 = HEAP32[($0 + 8 | 0) >> 2] | 0; - } - memcpy((HEAP32[($0 + 4 | 0) >> 2] | 0) + $3 | 0 | 0, $2 + 12 | 0 | 0, $1 | 0) | 0; - HEAP32[($0 + 8 | 0) >> 2] = $3 + $1 | 0; - } - __stack_pointer = $2 + 16 | 0; - } - - function _ZN58_$LT$alloc__string__String$u20$as$u20$core__fmt__Write$GT$9write_str17h9c2d3e9aafc08637E_52($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0; - label$1 : { - $3 = HEAP32[($0 + 8 | 0) >> 2] | 0; - if (((HEAP32[$0 >> 2] | 0) - $3 | 0) >>> 0 >= $2 >>> 0) { - break label$1 - } - _ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve21do_reserve_and_handle17h1929fa6bfa2184fdE($0 | 0, $3 | 0, $2 | 0); - $3 = HEAP32[($0 + 8 | 0) >> 2] | 0; - } - memcpy((HEAP32[($0 + 4 | 0) >> 2] | 0) + $3 | 0 | 0, $1 | 0, $2 | 0) | 0; - HEAP32[($0 + 8 | 0) >> 2] = $3 + $2 | 0; - return 0 | 0; - } - - function _ZN58_$LT$alloc__string__String$u20$as$u20$core__fmt__Write$GT$10write_char17h9231f70fbd335441E_53($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - _ZN5alloc6string6String4push17heffbdde4b7aa7c44E($0 | 0, $1 | 0); - return 0 | 0; - } - - function _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$1 = 0, $2 = 0, $10 = 0, $15 = 0, $21 = 0; - $2 = __stack_pointer - 32 | 0; - __stack_pointer = $2; - i64toi32_i32$2 = $0 + 16 | 0; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $10 = i64toi32_i32$0; - i64toi32_i32$0 = $2 + 16 | 0; - HEAP32[i64toi32_i32$0 >> 2] = $10; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - i64toi32_i32$2 = $0 + 8 | 0; - i64toi32_i32$1 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$0 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $15 = i64toi32_i32$1; - i64toi32_i32$1 = $2 + 8 | 0; - HEAP32[i64toi32_i32$1 >> 2] = $15; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - HEAP16[($2 + 28 | 0) >> 1] = 1; - HEAP32[($2 + 24 | 0) >> 2] = $1; - i64toi32_i32$2 = $0; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $21 = i64toi32_i32$0; - i64toi32_i32$0 = $2; - HEAP32[i64toi32_i32$0 >> 2] = $21; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - rust_begin_unwind(i64toi32_i32$0 | 0); - wasm2js_trap(); - } - - function _ZN4core5slice5index26slice_start_index_len_fail17h65432e022682bf05E($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, i64toi32_i32$1 = 0, i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, i64toi32_i32$4 = 0, $16 = 0, $4 = 0, $15 = 0, $4$hi = 0, $21$hi = 0, $22 = 0, $26$hi = 0, $27 = 0; - $3 = __stack_pointer - 48 | 0; - __stack_pointer = $3; - HEAP32[$3 >> 2] = $0; - HEAP32[($3 + 4 | 0) >> 2] = $1; - HEAP32[($3 + 12 | 0) >> 2] = 2; - HEAP32[($3 + 8 | 0) >> 2] = 1049632; - i64toi32_i32$1 = $3; - i64toi32_i32$0 = 0; - HEAP32[($3 + 20 | 0) >> 2] = 2; - HEAP32[($3 + 24 | 0) >> 2] = i64toi32_i32$0; - $15 = $3; - i64toi32_i32$0 = 0; - i64toi32_i32$2 = 1; - i64toi32_i32$1 = 0; - i64toi32_i32$3 = 32; - i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { - i64toi32_i32$1 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - $16 = 0; - } else { - i64toi32_i32$1 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$0 << i64toi32_i32$4 | 0) | 0; - $16 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - } - $4 = $16; - $4$hi = i64toi32_i32$1; - i64toi32_i32$1 = 0; - $21$hi = i64toi32_i32$1; - i64toi32_i32$1 = $4$hi; - i64toi32_i32$0 = $4; - i64toi32_i32$2 = $21$hi; - i64toi32_i32$3 = $3 + 4 | 0; - i64toi32_i32$2 = i64toi32_i32$1 | i64toi32_i32$2 | 0; - $22 = i64toi32_i32$0 | i64toi32_i32$3 | 0; - i64toi32_i32$0 = $15; - HEAP32[(i64toi32_i32$0 + 40 | 0) >> 2] = $22; - HEAP32[(i64toi32_i32$0 + 44 | 0) >> 2] = i64toi32_i32$2; - i64toi32_i32$2 = i64toi32_i32$1; - i64toi32_i32$2 = 0; - $26$hi = i64toi32_i32$2; - i64toi32_i32$2 = i64toi32_i32$1; - i64toi32_i32$1 = $4; - i64toi32_i32$0 = $26$hi; - i64toi32_i32$3 = $3; - i64toi32_i32$0 = i64toi32_i32$2 | i64toi32_i32$0 | 0; - $27 = i64toi32_i32$1 | $3 | 0; - i64toi32_i32$1 = $3; - HEAP32[($3 + 32 | 0) >> 2] = $27; - HEAP32[($3 + 36 | 0) >> 2] = i64toi32_i32$0; - HEAP32[($3 + 16 | 0) >> 2] = $3 + 32 | 0; - _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($3 + 8 | 0 | 0, $2 | 0); - wasm2js_trap(); - } - - function _ZN4core9panicking18panic_bounds_check17hb583f390c1467acdE($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, i64toi32_i32$1 = 0, i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, i64toi32_i32$4 = 0, $16 = 0, $4 = 0, $15 = 0, $4$hi = 0, $20$hi = 0, $21 = 0, $26$hi = 0, $27 = 0; - $3 = __stack_pointer - 48 | 0; - __stack_pointer = $3; - HEAP32[($3 + 4 | 0) >> 2] = $1; - HEAP32[$3 >> 2] = $0; - HEAP32[($3 + 12 | 0) >> 2] = 2; - HEAP32[($3 + 8 | 0) >> 2] = 1049268; - i64toi32_i32$1 = $3; - i64toi32_i32$0 = 0; - HEAP32[($3 + 20 | 0) >> 2] = 2; - HEAP32[($3 + 24 | 0) >> 2] = i64toi32_i32$0; - $15 = $3; - i64toi32_i32$0 = 0; - i64toi32_i32$2 = 1; - i64toi32_i32$1 = 0; - i64toi32_i32$3 = 32; - i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { - i64toi32_i32$1 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - $16 = 0; - } else { - i64toi32_i32$1 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$0 << i64toi32_i32$4 | 0) | 0; - $16 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - } - $4 = $16; - $4$hi = i64toi32_i32$1; - i64toi32_i32$1 = 0; - $20$hi = i64toi32_i32$1; - i64toi32_i32$1 = $4$hi; - i64toi32_i32$0 = $4; - i64toi32_i32$2 = $20$hi; - i64toi32_i32$3 = $3; - i64toi32_i32$2 = i64toi32_i32$1 | i64toi32_i32$2 | 0; - $21 = i64toi32_i32$0 | $3 | 0; - i64toi32_i32$0 = $15; - HEAP32[(i64toi32_i32$0 + 40 | 0) >> 2] = $21; - HEAP32[(i64toi32_i32$0 + 44 | 0) >> 2] = i64toi32_i32$2; - i64toi32_i32$2 = i64toi32_i32$1; - i64toi32_i32$2 = 0; - $26$hi = i64toi32_i32$2; - i64toi32_i32$2 = i64toi32_i32$1; - i64toi32_i32$1 = $4; - i64toi32_i32$0 = $26$hi; - i64toi32_i32$3 = $3 + 4 | 0; - i64toi32_i32$0 = i64toi32_i32$2 | i64toi32_i32$0 | 0; - $27 = i64toi32_i32$1 | i64toi32_i32$3 | 0; - i64toi32_i32$1 = $3; - HEAP32[($3 + 32 | 0) >> 2] = $27; - HEAP32[($3 + 36 | 0) >> 2] = i64toi32_i32$0; - HEAP32[($3 + 16 | 0) >> 2] = $3 + 32 | 0; - _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($3 + 8 | 0 | 0, $2 | 0); - wasm2js_trap(); - } - - function _ZN4core5slice5index24slice_end_index_len_fail17h02d344349d5072f8E($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, i64toi32_i32$1 = 0, i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, i64toi32_i32$4 = 0, $16 = 0, $4 = 0, $15 = 0, $4$hi = 0, $21$hi = 0, $22 = 0, $26$hi = 0, $27 = 0; - $3 = __stack_pointer - 48 | 0; - __stack_pointer = $3; - HEAP32[$3 >> 2] = $0; - HEAP32[($3 + 4 | 0) >> 2] = $1; - HEAP32[($3 + 12 | 0) >> 2] = 2; - HEAP32[($3 + 8 | 0) >> 2] = 1049664; - i64toi32_i32$1 = $3; - i64toi32_i32$0 = 0; - HEAP32[($3 + 20 | 0) >> 2] = 2; - HEAP32[($3 + 24 | 0) >> 2] = i64toi32_i32$0; - $15 = $3; - i64toi32_i32$0 = 0; - i64toi32_i32$2 = 1; - i64toi32_i32$1 = 0; - i64toi32_i32$3 = 32; - i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { - i64toi32_i32$1 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - $16 = 0; - } else { - i64toi32_i32$1 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$0 << i64toi32_i32$4 | 0) | 0; - $16 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - } - $4 = $16; - $4$hi = i64toi32_i32$1; - i64toi32_i32$1 = 0; - $21$hi = i64toi32_i32$1; - i64toi32_i32$1 = $4$hi; - i64toi32_i32$0 = $4; - i64toi32_i32$2 = $21$hi; - i64toi32_i32$3 = $3 + 4 | 0; - i64toi32_i32$2 = i64toi32_i32$1 | i64toi32_i32$2 | 0; - $22 = i64toi32_i32$0 | i64toi32_i32$3 | 0; - i64toi32_i32$0 = $15; - HEAP32[(i64toi32_i32$0 + 40 | 0) >> 2] = $22; - HEAP32[(i64toi32_i32$0 + 44 | 0) >> 2] = i64toi32_i32$2; - i64toi32_i32$2 = i64toi32_i32$1; - i64toi32_i32$2 = 0; - $26$hi = i64toi32_i32$2; - i64toi32_i32$2 = i64toi32_i32$1; - i64toi32_i32$1 = $4; - i64toi32_i32$0 = $26$hi; - i64toi32_i32$3 = $3; - i64toi32_i32$0 = i64toi32_i32$2 | i64toi32_i32$0 | 0; - $27 = i64toi32_i32$1 | $3 | 0; - i64toi32_i32$1 = $3; - HEAP32[($3 + 32 | 0) >> 2] = $27; - HEAP32[($3 + 36 | 0) >> 2] = i64toi32_i32$0; - HEAP32[($3 + 16 | 0) >> 2] = $3 + 32 | 0; - _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($3 + 8 | 0 | 0, $2 | 0); - wasm2js_trap(); - } - - function _ZN4core3fmt9Formatter3pad17hc540d40003d38a61E($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, $8 = 0, $7 = 0, $5 = 0, $6 = 0, $4 = 0; - $3 = HEAP32[($0 + 8 | 0) >> 2] | 0; - label$1 : { - label$2 : { - $4 = HEAP32[$0 >> 2] | 0; - if ($4) { - break label$2 - } - if (!($3 & 1 | 0)) { - break label$1 - } - } - label$3 : { - if (!($3 & 1 | 0)) { - break label$3 - } - $5 = $1 + $2 | 0; - label$4 : { - label$5 : { - $6 = HEAP32[($0 + 12 | 0) >> 2] | 0; - if ($6) { - break label$5 - } - $7 = 0; - $8 = $1; - break label$4; - } - $7 = 0; - $8 = $1; - label$6 : while (1) { - $3 = $8; - if (($3 | 0) == ($5 | 0)) { - break label$3 - } - label$7 : { - label$8 : { - $8 = HEAP8[$3 >> 0] | 0; - if (($8 | 0) <= (-1 | 0)) { - break label$8 - } - $8 = $3 + 1 | 0; - break label$7; - } - label$9 : { - if ($8 >>> 0 >= -32 >>> 0) { - break label$9 - } - $8 = $3 + 2 | 0; - break label$7; - } - label$10 : { - if ($8 >>> 0 >= -16 >>> 0) { - break label$10 - } - $8 = $3 + 3 | 0; - break label$7; - } - $8 = $3 + 4 | 0; - } - $7 = ($8 - $3 | 0) + $7 | 0; - $6 = $6 + -1 | 0; - if ($6) { - continue label$6 - } - break label$6; - }; - } - if (($8 | 0) == ($5 | 0)) { - break label$3 - } - label$11 : { - $3 = HEAP8[$8 >> 0] | 0; - if (($3 | 0) > (-1 | 0)) { - break label$11 - } - } - label$12 : { - label$13 : { - if (!$7) { - break label$13 - } - label$14 : { - if ($7 >>> 0 >= $2 >>> 0) { - break label$14 - } - if ((HEAP8[($1 + $7 | 0) >> 0] | 0 | 0) > (-65 | 0)) { - break label$13 - } - $3 = 0; - break label$12; - } - if (($7 | 0) == ($2 | 0)) { - break label$13 - } - $3 = 0; - break label$12; - } - $3 = $1; - } - $2 = $3 ? $7 : $2; - $1 = $3 ? $3 : $1; - } - label$15 : { - if ($4) { - break label$15 - } - return FUNCTION_TABLE[HEAP32[((HEAP32[($0 + 24 | 0) >> 2] | 0) + 12 | 0) >> 2] | 0 | 0](HEAP32[($0 + 20 | 0) >> 2] | 0, $1, $2) | 0 | 0; - } - $4 = HEAP32[($0 + 4 | 0) >> 2] | 0; - label$16 : { - label$17 : { - if ($2 >>> 0 < 16 >>> 0) { - break label$17 - } - $3 = _ZN4core3str5count14do_count_chars17h03769f4f70ff5154E($1 | 0, $2 | 0) | 0; - break label$16; - } - label$18 : { - if ($2) { - break label$18 - } - $3 = 0; - break label$16; - } - $6 = $2 & 3 | 0; - label$19 : { - label$20 : { - if ($2 >>> 0 >= 4 >>> 0) { - break label$20 - } - $3 = 0; - $7 = 0; - break label$19; - } - $5 = $2 & 12 | 0; - $3 = 0; - $7 = 0; - label$21 : while (1) { - $8 = $1 + $7 | 0; - $3 = ((($3 + ((HEAP8[$8 >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($8 + 1 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($8 + 2 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($8 + 3 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0; - $7 = $7 + 4 | 0; - if (($5 | 0) != ($7 | 0)) { - continue label$21 - } - break label$21; - }; - } - if (!$6) { - break label$16 - } - $8 = $1 + $7 | 0; - label$22 : while (1) { - $3 = $3 + ((HEAP8[$8 >> 0] | 0 | 0) > (-65 | 0)) | 0; - $8 = $8 + 1 | 0; - $6 = $6 + -1 | 0; - if ($6) { - continue label$22 - } - break label$22; - }; - } - label$23 : { - label$24 : { - if ($4 >>> 0 <= $3 >>> 0) { - break label$24 - } - $5 = $4 - $3 | 0; - $3 = 0; - label$25 : { - label$26 : { - switch (HEAPU8[($0 + 32 | 0) >> 0] | 0 | 0) { - case 1: - $3 = $5; - $5 = 0; - break label$25; - case 2: - break label$26; - default: - break label$25; - }; - } - $3 = $5 >>> 1 | 0; - $5 = ($5 + 1 | 0) >>> 1 | 0; - } - $3 = $3 + 1 | 0; - $6 = HEAP32[($0 + 16 | 0) >> 2] | 0; - $8 = HEAP32[($0 + 24 | 0) >> 2] | 0; - $7 = HEAP32[($0 + 20 | 0) >> 2] | 0; - label$28 : while (1) { - $3 = $3 + -1 | 0; - if (!$3) { - break label$23 - } - if (!(FUNCTION_TABLE[HEAP32[($8 + 16 | 0) >> 2] | 0 | 0]($7, $6) | 0)) { - continue label$28 - } - break label$28; - }; - return 1 | 0; - } - return FUNCTION_TABLE[HEAP32[((HEAP32[($0 + 24 | 0) >> 2] | 0) + 12 | 0) >> 2] | 0 | 0](HEAP32[($0 + 20 | 0) >> 2] | 0, $1, $2) | 0 | 0; - } - label$29 : { - if (!(FUNCTION_TABLE[HEAP32[($8 + 12 | 0) >> 2] | 0 | 0]($7, $1, $2) | 0)) { - break label$29 - } - return 1 | 0; - } - $3 = 0; - label$30 : while (1) { - label$31 : { - if (($5 | 0) != ($3 | 0)) { - break label$31 - } - return $5 >>> 0 < $5 >>> 0 | 0; - } - $3 = $3 + 1 | 0; - if (!(FUNCTION_TABLE[HEAP32[($8 + 16 | 0) >> 2] | 0 | 0]($7, $6) | 0)) { - continue label$30 - } - break label$30; - }; - return ($3 + -1 | 0) >>> 0 < $5 >>> 0 | 0; - } - return FUNCTION_TABLE[HEAP32[((HEAP32[($0 + 24 | 0) >> 2] | 0) + 12 | 0) >> 2] | 0 | 0](HEAP32[($0 + 20 | 0) >> 2] | 0, $1, $2) | 0 | 0; - } - - function _ZN4core9panicking5panic17h9f0a34b0744fbd45E($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0; - $3 = __stack_pointer - 32 | 0; - __stack_pointer = $3; - HEAP32[($3 + 16 | 0) >> 2] = 0; - HEAP32[($3 + 4 | 0) >> 2] = 1; - HEAP32[($3 + 8 | 0) >> 2] = 4; - HEAP32[($3 + 12 | 0) >> 2] = 0; - HEAP32[($3 + 28 | 0) >> 2] = $1; - HEAP32[($3 + 24 | 0) >> 2] = $0; - HEAP32[$3 >> 2] = $3 + 24 | 0; - _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($3 | 0, $2 | 0); - wasm2js_trap(); - } - - function _ZN4core3fmt3num3imp52_$LT$impl$u20$core__fmt__Display$u20$for$u20$u32$GT$3fmt17h5732d357c58d2b36E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var i64toi32_i32$1 = 0; - i64toi32_i32$1 = 0; - return _ZN4core3fmt3num3imp7fmt_u6417h6f5511515637a348E(HEAP32[$0 >> 2] | 0 | 0, i64toi32_i32$1 | 0, 1 | 0, $1 | 0) | 0 | 0; - } - - function _ZN4core3fmt5write17hd273a061a774381dE($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, $7 = 0, $6 = 0, $11 = 0, $4 = 0, $12 = 0, $9 = 0, $5 = 0, $10 = 0, $8 = 0; - $3 = __stack_pointer - 48 | 0; - __stack_pointer = $3; - HEAP8[($3 + 44 | 0) >> 0] = 3; - HEAP32[($3 + 28 | 0) >> 2] = 32; - $4 = 0; - HEAP32[($3 + 40 | 0) >> 2] = 0; - HEAP32[($3 + 36 | 0) >> 2] = $1; - HEAP32[($3 + 32 | 0) >> 2] = $0; - HEAP32[($3 + 20 | 0) >> 2] = 0; - HEAP32[($3 + 12 | 0) >> 2] = 0; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - label$5 : { - $5 = HEAP32[($2 + 16 | 0) >> 2] | 0; - if ($5) { - break label$5 - } - $0 = HEAP32[($2 + 12 | 0) >> 2] | 0; - if (!$0) { - break label$4 - } - $1 = HEAP32[($2 + 8 | 0) >> 2] | 0; - $6 = $0 << 3 | 0; - $4 = (($0 + -1 | 0) & 536870911 | 0) + 1 | 0; - $0 = HEAP32[$2 >> 2] | 0; - label$6 : while (1) { - label$7 : { - $7 = HEAP32[($0 + 4 | 0) >> 2] | 0; - if (!$7) { - break label$7 - } - if (FUNCTION_TABLE[HEAP32[((HEAP32[($3 + 36 | 0) >> 2] | 0) + 12 | 0) >> 2] | 0 | 0](HEAP32[($3 + 32 | 0) >> 2] | 0, HEAP32[$0 >> 2] | 0, $7) | 0) { - break label$3 - } - } - if (FUNCTION_TABLE[HEAP32[($1 + 4 | 0) >> 2] | 0 | 0](HEAP32[$1 >> 2] | 0, $3 + 12 | 0) | 0) { - break label$3 - } - $1 = $1 + 8 | 0; - $0 = $0 + 8 | 0; - $6 = $6 + -8 | 0; - if ($6) { - continue label$6 - } - break label$4; - }; - } - $1 = HEAP32[($2 + 20 | 0) >> 2] | 0; - if (!$1) { - break label$4 - } - $8 = $1 << 5 | 0; - $4 = (($1 + -1 | 0) & 134217727 | 0) + 1 | 0; - $9 = HEAP32[($2 + 8 | 0) >> 2] | 0; - $0 = HEAP32[$2 >> 2] | 0; - $6 = 0; - label$8 : while (1) { - label$9 : { - $1 = HEAP32[($0 + 4 | 0) >> 2] | 0; - if (!$1) { - break label$9 - } - if (FUNCTION_TABLE[HEAP32[((HEAP32[($3 + 36 | 0) >> 2] | 0) + 12 | 0) >> 2] | 0 | 0](HEAP32[($3 + 32 | 0) >> 2] | 0, HEAP32[$0 >> 2] | 0, $1) | 0) { - break label$3 - } - } - $1 = $5 + $6 | 0; - HEAP32[($3 + 28 | 0) >> 2] = HEAP32[($1 + 16 | 0) >> 2] | 0; - HEAP8[($3 + 44 | 0) >> 0] = HEAPU8[($1 + 28 | 0) >> 0] | 0; - HEAP32[($3 + 40 | 0) >> 2] = HEAP32[($1 + 24 | 0) >> 2] | 0; - $7 = HEAP32[($1 + 12 | 0) >> 2] | 0; - $10 = 0; - $11 = 0; - label$10 : { - label$11 : { - switch (HEAP32[($1 + 8 | 0) >> 2] | 0 | 0) { - case 1: - $12 = $7 << 3 | 0; - $11 = 0; - $12 = $9 + $12 | 0; - if (HEAP32[($12 + 4 | 0) >> 2] | 0) { - break label$10 - } - $7 = HEAP32[$12 >> 2] | 0; - break; - case 2: - break label$10; - default: - break label$11; - }; - } - $11 = 1; - } - HEAP32[($3 + 16 | 0) >> 2] = $7; - HEAP32[($3 + 12 | 0) >> 2] = $11; - $7 = HEAP32[($1 + 4 | 0) >> 2] | 0; - label$13 : { - label$14 : { - switch (HEAP32[$1 >> 2] | 0 | 0) { - case 1: - $11 = $7 << 3 | 0; - $11 = $9 + $11 | 0; - if (HEAP32[($11 + 4 | 0) >> 2] | 0) { - break label$13 - } - $7 = HEAP32[$11 >> 2] | 0; - break; - case 2: - break label$13; - default: - break label$14; - }; - } - $10 = 1; - } - HEAP32[($3 + 24 | 0) >> 2] = $7; - HEAP32[($3 + 20 | 0) >> 2] = $10; - $1 = $9 + ((HEAP32[($1 + 20 | 0) >> 2] | 0) << 3 | 0) | 0; - if (FUNCTION_TABLE[HEAP32[($1 + 4 | 0) >> 2] | 0 | 0](HEAP32[$1 >> 2] | 0, $3 + 12 | 0) | 0) { - break label$3 - } - $0 = $0 + 8 | 0; - $6 = $6 + 32 | 0; - if (($8 | 0) != ($6 | 0)) { - continue label$8 - } - break label$8; - }; - } - if ($4 >>> 0 >= (HEAP32[($2 + 4 | 0) >> 2] | 0) >>> 0) { - break label$2 - } - $1 = (HEAP32[$2 >> 2] | 0) + ($4 << 3 | 0) | 0; - if (!(FUNCTION_TABLE[HEAP32[((HEAP32[($3 + 36 | 0) >> 2] | 0) + 12 | 0) >> 2] | 0 | 0](HEAP32[($3 + 32 | 0) >> 2] | 0, HEAP32[$1 >> 2] | 0, HEAP32[($1 + 4 | 0) >> 2] | 0) | 0)) { - break label$2 - } - } - $1 = 1; - break label$1; - } - $1 = 0; - } - __stack_pointer = $3 + 48 | 0; - return $1 | 0; - } - - function _ZN4core3fmt3num3imp51_$LT$impl$u20$core__fmt__Display$u20$for$u20$u8$GT$3fmt17h96ec540fce0e8c05E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var i64toi32_i32$1 = 0; - i64toi32_i32$1 = 0; - return _ZN4core3fmt3num3imp7fmt_u6417h6f5511515637a348E(HEAPU8[$0 >> 0] | 0 | 0, i64toi32_i32$1 | 0, 1 | 0, $1 | 0) | 0 | 0; - } - - function _ZN4core6result13unwrap_failed17h63e31ad259971ff4E($0, $1, $2, $3, $4) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - $3 = $3 | 0; - $4 = $4 | 0; - var $5 = 0, i64toi32_i32$1 = 0, i64toi32_i32$0 = 0, i64toi32_i32$2 = 0, i64toi32_i32$4 = 0, i64toi32_i32$3 = 0, $19 = 0, $21 = 0, $20 = 0, $22$hi = 0, $25$hi = 0, $26 = 0, $27 = 0, $29$hi = 0, $32$hi = 0, $33 = 0; - $5 = __stack_pointer - 64 | 0; - __stack_pointer = $5; - HEAP32[($5 + 12 | 0) >> 2] = $1; - HEAP32[($5 + 8 | 0) >> 2] = $0; - HEAP32[($5 + 20 | 0) >> 2] = $3; - HEAP32[($5 + 16 | 0) >> 2] = $2; - HEAP32[($5 + 28 | 0) >> 2] = 2; - HEAP32[($5 + 24 | 0) >> 2] = 1049288; - i64toi32_i32$1 = $5; - i64toi32_i32$0 = 0; - HEAP32[($5 + 36 | 0) >> 2] = 2; - HEAP32[($5 + 40 | 0) >> 2] = i64toi32_i32$0; - $20 = $5; - i64toi32_i32$0 = 0; - i64toi32_i32$2 = 23; - i64toi32_i32$1 = 0; - i64toi32_i32$3 = 32; - i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { - i64toi32_i32$1 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - $19 = 0; - } else { - i64toi32_i32$1 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$0 << i64toi32_i32$4 | 0) | 0; - $19 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - } - $22$hi = i64toi32_i32$1; - i64toi32_i32$1 = 0; - $25$hi = i64toi32_i32$1; - i64toi32_i32$1 = $22$hi; - i64toi32_i32$0 = $19; - i64toi32_i32$2 = $25$hi; - i64toi32_i32$3 = $5 + 16 | 0; - i64toi32_i32$2 = i64toi32_i32$1 | i64toi32_i32$2 | 0; - $26 = i64toi32_i32$0 | i64toi32_i32$3 | 0; - i64toi32_i32$0 = $20; - HEAP32[(i64toi32_i32$0 + 56 | 0) >> 2] = $26; - HEAP32[(i64toi32_i32$0 + 60 | 0) >> 2] = i64toi32_i32$2; - $27 = $5; - i64toi32_i32$2 = 0; - i64toi32_i32$1 = 24; - i64toi32_i32$0 = 0; - i64toi32_i32$3 = 32; - i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { - i64toi32_i32$0 = i64toi32_i32$1 << i64toi32_i32$4 | 0; - $21 = 0; - } else { - i64toi32_i32$0 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$1 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$2 << i64toi32_i32$4 | 0) | 0; - $21 = i64toi32_i32$1 << i64toi32_i32$4 | 0; - } - $29$hi = i64toi32_i32$0; - i64toi32_i32$0 = 0; - $32$hi = i64toi32_i32$0; - i64toi32_i32$0 = $29$hi; - i64toi32_i32$2 = $21; - i64toi32_i32$1 = $32$hi; - i64toi32_i32$3 = $5 + 8 | 0; - i64toi32_i32$1 = i64toi32_i32$0 | i64toi32_i32$1 | 0; - $33 = i64toi32_i32$2 | i64toi32_i32$3 | 0; - i64toi32_i32$2 = $27; - HEAP32[(i64toi32_i32$2 + 48 | 0) >> 2] = $33; - HEAP32[(i64toi32_i32$2 + 52 | 0) >> 2] = i64toi32_i32$1; - HEAP32[($5 + 32 | 0) >> 2] = $5 + 48 | 0; - _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($5 + 24 | 0 | 0, $4 | 0); - wasm2js_trap(); - } - - function _ZN4core6option13unwrap_failed17h98817bc8a3accaffE($0) { - $0 = $0 | 0; - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1049173 | 0, 43 | 0, $0 | 0); - wasm2js_trap(); - } - - function _ZN44_$LT$$RF$T$u20$as$u20$core__fmt__Display$GT$3fmt17h0e730352ba1d2064E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - return _ZN4core3fmt9Formatter3pad17hc540d40003d38a61E($1 | 0, HEAP32[$0 >> 2] | 0 | 0, HEAP32[($0 + 4 | 0) >> 2] | 0 | 0) | 0 | 0; - } - - function _ZN42_$LT$$RF$T$u20$as$u20$core__fmt__Debug$GT$3fmt17h02f2c499cdd866a1E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - return FUNCTION_TABLE[HEAP32[((HEAP32[($0 + 4 | 0) >> 2] | 0) + 12 | 0) >> 2] | 0 | 0](HEAP32[$0 >> 2] | 0, $1) | 0 | 0; - } - - function _ZN68_$LT$core__fmt__builders__PadAdapter$u20$as$u20$core__fmt__Write$GT$9write_str17hcef790f9881e69b1E($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $14 = 0, $9 = 0, $11 = 0, $13 = 0, $12 = 0, $8 = 0, $15 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $10 = 0, $3 = 0, $72 = 0; - $3 = $1 + -1 | 0; - $4 = HEAP32[($0 + 4 | 0) >> 2] | 0; - $5 = HEAP32[$0 >> 2] | 0; - $6 = HEAP32[($0 + 8 | 0) >> 2] | 0; - $7 = 0; - $8 = 0; - $9 = 0; - $10 = 0; - label$1 : { - label$2 : while (1) { - if ($10 & 1 | 0) { - break label$1 - } - label$3 : { - label$4 : { - if ($9 >>> 0 > $2 >>> 0) { - break label$4 - } - label$5 : while (1) { - $11 = $1 + $9 | 0; - label$6 : { - label$7 : { - label$8 : { - label$9 : { - $12 = $2 - $9 | 0; - if ($12 >>> 0 > 7 >>> 0) { - break label$9 - } - if (($2 | 0) != ($9 | 0)) { - break label$8 - } - $9 = $2; - break label$4; - } - label$10 : { - label$11 : { - $13 = ($11 + 3 | 0) & -4 | 0; - $14 = $13 - $11 | 0; - if (!$14) { - break label$11 - } - $0 = 0; - label$12 : while (1) { - if ((HEAPU8[($11 + $0 | 0) >> 0] | 0 | 0) == (10 | 0)) { - break label$6 - } - $0 = $0 + 1 | 0; - if (($14 | 0) != ($0 | 0)) { - continue label$12 - } - break label$12; - }; - $15 = $12 + -8 | 0; - if ($14 >>> 0 <= $15 >>> 0) { - break label$10 - } - break label$7; - } - $15 = $12 + -8 | 0; - } - label$13 : while (1) { - $0 = HEAP32[$13 >> 2] | 0; - $72 = 16843008 - ($0 ^ 168430090 | 0) | 0 | $0 | 0; - $0 = HEAP32[($13 + 4 | 0) >> 2] | 0; - if ((($72 & (16843008 - ($0 ^ 168430090 | 0) | 0 | $0 | 0) | 0) & -2139062144 | 0 | 0) != (-2139062144 | 0)) { - break label$7 - } - $13 = $13 + 8 | 0; - $14 = $14 + 8 | 0; - if ($14 >>> 0 <= $15 >>> 0) { - continue label$13 - } - break label$7; - }; - } - $0 = 0; - label$14 : while (1) { - if ((HEAPU8[($11 + $0 | 0) >> 0] | 0 | 0) == (10 | 0)) { - break label$6 - } - $0 = $0 + 1 | 0; - if (($12 | 0) != ($0 | 0)) { - continue label$14 - } - break label$14; - }; - $9 = $2; - break label$4; - } - label$15 : { - if (($14 | 0) != ($12 | 0)) { - break label$15 - } - $9 = $2; - break label$4; - } - label$16 : while (1) { - label$17 : { - if ((HEAPU8[($11 + $14 | 0) >> 0] | 0 | 0) != (10 | 0)) { - break label$17 - } - $0 = $14; - break label$6; - } - $14 = $14 + 1 | 0; - if (($12 | 0) != ($14 | 0)) { - continue label$16 - } - break label$16; - }; - $9 = $2; - break label$4; - } - $14 = $0 + $9 | 0; - $9 = $14 + 1 | 0; - label$18 : { - if ($14 >>> 0 >= $2 >>> 0) { - break label$18 - } - if ((HEAPU8[($11 + $0 | 0) >> 0] | 0 | 0) != (10 | 0)) { - break label$18 - } - $11 = $9; - $0 = $9; - break label$3; - } - if ($9 >>> 0 <= $2 >>> 0) { - continue label$5 - } - break label$5; - }; - } - $10 = 1; - $11 = $8; - $0 = $2; - if (($11 | 0) == ($0 | 0)) { - break label$1 - } - } - label$19 : { - label$20 : { - if (!(HEAPU8[$6 >> 0] | 0)) { - break label$20 - } - if (FUNCTION_TABLE[HEAP32[($4 + 12 | 0) >> 2] | 0 | 0]($5, 1049328, 4) | 0) { - break label$19 - } - } - $13 = $0 - $8 | 0; - $14 = 0; - label$21 : { - if (($0 | 0) == ($8 | 0)) { - break label$21 - } - $14 = (HEAPU8[($3 + $0 | 0) >> 0] | 0 | 0) == (10 | 0); - } - $0 = $1 + $8 | 0; - HEAP8[$6 >> 0] = $14; - $8 = $11; - if (!(FUNCTION_TABLE[HEAP32[($4 + 12 | 0) >> 2] | 0 | 0]($5, $0, $13) | 0)) { - continue label$2 - } - } - break label$2; - }; - $7 = 1; - } - return $7 | 0; - } - - function _ZN68_$LT$core__fmt__builders__PadAdapter$u20$as$u20$core__fmt__Write$GT$10write_char17h8982d69464cb262aE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, $3 = 0; - $2 = HEAP32[($0 + 4 | 0) >> 2] | 0; - $3 = HEAP32[$0 >> 2] | 0; - label$1 : { - $0 = HEAP32[($0 + 8 | 0) >> 2] | 0; - if (!(HEAPU8[$0 >> 0] | 0)) { - break label$1 - } - if (!(FUNCTION_TABLE[HEAP32[($2 + 12 | 0) >> 2] | 0 | 0]($3, 1049328, 4) | 0)) { - break label$1 - } - return 1 | 0; - } - HEAP8[$0 >> 0] = ($1 | 0) == (10 | 0); - return FUNCTION_TABLE[HEAP32[($2 + 16 | 0) >> 2] | 0 | 0]($3, $1) | 0 | 0; - } - - function _ZN4core3fmt8builders8DebugSet5entry17h7036b50f83a7398eE($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, $6 = 0, i64toi32_i32$0 = 0, $4 = 0, i64toi32_i32$1 = 0, $7 = 0, $5 = 0, $45 = 0, $52 = 0, $64 = 0; - $3 = __stack_pointer - 64 | 0; - __stack_pointer = $3; - $4 = 1; - label$1 : { - if (HEAPU8[($0 + 4 | 0) >> 0] | 0) { - break label$1 - } - $5 = HEAPU8[($0 + 5 | 0) >> 0] | 0; - label$2 : { - label$3 : { - $6 = HEAP32[$0 >> 2] | 0; - $7 = HEAP32[($6 + 28 | 0) >> 2] | 0; - if ($7 & 4 | 0) { - break label$3 - } - $4 = 1; - if (!($5 & 1 | 0)) { - break label$2 - } - if (!(FUNCTION_TABLE[HEAP32[((HEAP32[($6 + 24 | 0) >> 2] | 0) + 12 | 0) >> 2] | 0 | 0](HEAP32[($6 + 20 | 0) >> 2] | 0, 1049332, 2) | 0)) { - break label$2 - } - break label$1; - } - $4 = 1; - label$4 : { - if ($5 & 1 | 0) { - break label$4 - } - if (FUNCTION_TABLE[HEAP32[((HEAP32[($6 + 24 | 0) >> 2] | 0) + 12 | 0) >> 2] | 0 | 0](HEAP32[($6 + 20 | 0) >> 2] | 0, 1049336, 1) | 0) { - break label$1 - } - $7 = HEAP32[($6 + 28 | 0) >> 2] | 0; - } - $4 = 1; - HEAP8[($3 + 27 | 0) >> 0] = 1; - i64toi32_i32$0 = HEAP32[($6 + 20 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($6 + 24 | 0) >> 2] | 0; - $45 = i64toi32_i32$0; - i64toi32_i32$0 = $3; - HEAP32[($3 + 12 | 0) >> 2] = $45; - HEAP32[($3 + 16 | 0) >> 2] = i64toi32_i32$1; - HEAP32[($3 + 52 | 0) >> 2] = 1049304; - HEAP32[($3 + 20 | 0) >> 2] = $3 + 27 | 0; - i64toi32_i32$1 = HEAP32[($6 + 8 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($6 + 12 | 0) >> 2] | 0; - $52 = i64toi32_i32$1; - i64toi32_i32$1 = $3; - HEAP32[($3 + 36 | 0) >> 2] = $52; - HEAP32[($3 + 40 | 0) >> 2] = i64toi32_i32$0; - i64toi32_i32$0 = HEAP32[$6 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($6 + 4 | 0) >> 2] | 0; - HEAP32[($3 + 56 | 0) >> 2] = $7; - HEAP32[($3 + 44 | 0) >> 2] = HEAP32[($6 + 16 | 0) >> 2] | 0; - HEAP8[($3 + 60 | 0) >> 0] = HEAPU8[($6 + 32 | 0) >> 0] | 0; - $64 = i64toi32_i32$0; - i64toi32_i32$0 = $3; - HEAP32[($3 + 28 | 0) >> 2] = $64; - HEAP32[($3 + 32 | 0) >> 2] = i64toi32_i32$1; - HEAP32[($3 + 48 | 0) >> 2] = $3 + 12 | 0; - if (FUNCTION_TABLE[HEAP32[($2 + 12 | 0) >> 2] | 0 | 0]($1, $3 + 28 | 0) | 0) { - break label$1 - } - $4 = FUNCTION_TABLE[HEAP32[((HEAP32[($3 + 52 | 0) >> 2] | 0) + 12 | 0) >> 2] | 0 | 0](HEAP32[($3 + 48 | 0) >> 2] | 0, 1049334, 2) | 0; - break label$1; - } - $4 = FUNCTION_TABLE[HEAP32[($2 + 12 | 0) >> 2] | 0 | 0]($1, $6) | 0; - } - HEAP8[($0 + 5 | 0) >> 0] = 1; - HEAP8[($0 + 4 | 0) >> 0] = $4; - __stack_pointer = $3 + 64 | 0; - return $0 | 0; - } - - function _ZN4core3fmt8builders9DebugList6finish17h4ef7645c675cb82eE($0) { - $0 = $0 | 0; - var $1 = 0; - $1 = 1; - label$1 : { - if (HEAPU8[($0 + 4 | 0) >> 0] | 0) { - break label$1 - } - $1 = HEAP32[$0 >> 2] | 0; - $1 = FUNCTION_TABLE[HEAP32[((HEAP32[($1 + 24 | 0) >> 2] | 0) + 12 | 0) >> 2] | 0 | 0](HEAP32[($1 + 20 | 0) >> 2] | 0, 1049337, 1) | 0; - } - HEAP8[($0 + 4 | 0) >> 0] = $1; - return $1 | 0; - } - - function _ZN4core3fmt9Formatter12pad_integral17hc60d9805b485ef36E($0, $1, $2, $3, $4, $5) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - $3 = $3 | 0; - $4 = $4 | 0; - $5 = $5 | 0; - var $12 = 0, $6 = 0, $10 = 0, $9 = 0, $7 = 0, $8 = 0, $11 = 0; - label$1 : { - label$2 : { - if ($1) { - break label$2 - } - $6 = $5 + 1 | 0; - $7 = HEAP32[($0 + 28 | 0) >> 2] | 0; - $8 = 45; - break label$1; - } - $7 = HEAP32[($0 + 28 | 0) >> 2] | 0; - $1 = $7 & 1 | 0; - $8 = $1 ? 43 : 1114112; - $6 = $1 + $5 | 0; - } - label$3 : { - label$4 : { - if ($7 & 4 | 0) { - break label$4 - } - $2 = 0; - break label$3; - } - label$5 : { - label$6 : { - if ($3 >>> 0 < 16 >>> 0) { - break label$6 - } - $1 = _ZN4core3str5count14do_count_chars17h03769f4f70ff5154E($2 | 0, $3 | 0) | 0; - break label$5; - } - label$7 : { - if ($3) { - break label$7 - } - $1 = 0; - break label$5; - } - $9 = $3 & 3 | 0; - label$8 : { - label$9 : { - if ($3 >>> 0 >= 4 >>> 0) { - break label$9 - } - $1 = 0; - $10 = 0; - break label$8; - } - $11 = $3 & 12 | 0; - $1 = 0; - $10 = 0; - label$10 : while (1) { - $12 = $2 + $10 | 0; - $1 = ((($1 + ((HEAP8[$12 >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($12 + 1 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($12 + 2 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($12 + 3 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0; - $10 = $10 + 4 | 0; - if (($11 | 0) != ($10 | 0)) { - continue label$10 - } - break label$10; - }; - } - if (!$9) { - break label$5 - } - $12 = $2 + $10 | 0; - label$11 : while (1) { - $1 = $1 + ((HEAP8[$12 >> 0] | 0 | 0) > (-65 | 0)) | 0; - $12 = $12 + 1 | 0; - $9 = $9 + -1 | 0; - if ($9) { - continue label$11 - } - break label$11; - }; - } - $6 = $1 + $6 | 0; - } - label$12 : { - if (HEAP32[$0 >> 2] | 0) { - break label$12 - } - label$13 : { - $1 = HEAP32[($0 + 20 | 0) >> 2] | 0; - $12 = HEAP32[($0 + 24 | 0) >> 2] | 0; - if (!(_ZN4core3fmt9Formatter12pad_integral12write_prefix17h581ad47c6930a5a3E($1 | 0, $12 | 0, $8 | 0, $2 | 0, $3 | 0) | 0)) { - break label$13 - } - return 1 | 0; - } - return FUNCTION_TABLE[HEAP32[($12 + 12 | 0) >> 2] | 0 | 0]($1, $4, $5) | 0 | 0; - } - label$14 : { - label$15 : { - label$16 : { - label$17 : { - $1 = HEAP32[($0 + 4 | 0) >> 2] | 0; - if ($1 >>> 0 > $6 >>> 0) { - break label$17 - } - $1 = HEAP32[($0 + 20 | 0) >> 2] | 0; - $12 = HEAP32[($0 + 24 | 0) >> 2] | 0; - if (!(_ZN4core3fmt9Formatter12pad_integral12write_prefix17h581ad47c6930a5a3E($1 | 0, $12 | 0, $8 | 0, $2 | 0, $3 | 0) | 0)) { - break label$16 - } - return 1 | 0; - } - if (!($7 & 8 | 0)) { - break label$15 - } - $9 = HEAP32[($0 + 16 | 0) >> 2] | 0; - HEAP32[($0 + 16 | 0) >> 2] = 48; - $7 = HEAPU8[($0 + 32 | 0) >> 0] | 0; - $11 = 1; - HEAP8[($0 + 32 | 0) >> 0] = 1; - $12 = HEAP32[($0 + 20 | 0) >> 2] | 0; - $10 = HEAP32[($0 + 24 | 0) >> 2] | 0; - if (_ZN4core3fmt9Formatter12pad_integral12write_prefix17h581ad47c6930a5a3E($12 | 0, $10 | 0, $8 | 0, $2 | 0, $3 | 0) | 0) { - break label$14 - } - $1 = ($1 - $6 | 0) + 1 | 0; - label$18 : { - label$19 : while (1) { - $1 = $1 + -1 | 0; - if (!$1) { - break label$18 - } - if (!(FUNCTION_TABLE[HEAP32[($10 + 16 | 0) >> 2] | 0 | 0]($12, 48) | 0)) { - continue label$19 - } - break label$19; - }; - return 1 | 0; - } - label$20 : { - if (!(FUNCTION_TABLE[HEAP32[($10 + 12 | 0) >> 2] | 0 | 0]($12, $4, $5) | 0)) { - break label$20 - } - return 1 | 0; - } - HEAP8[($0 + 32 | 0) >> 0] = $7; - HEAP32[($0 + 16 | 0) >> 2] = $9; - return 0 | 0; - } - $11 = FUNCTION_TABLE[HEAP32[($12 + 12 | 0) >> 2] | 0 | 0]($1, $4, $5) | 0; - break label$14; - } - $6 = $1 - $6 | 0; - label$21 : { - label$22 : { - label$23 : { - $1 = HEAPU8[($0 + 32 | 0) >> 0] | 0; - switch ($1 | 0) { - case 2: - break label$22; - case 1: - case 3: - break label$23; - default: - break label$21; - }; - } - $1 = $6; - $6 = 0; - break label$21; - } - $1 = $6 >>> 1 | 0; - $6 = ($6 + 1 | 0) >>> 1 | 0; - } - $1 = $1 + 1 | 0; - $9 = HEAP32[($0 + 16 | 0) >> 2] | 0; - $12 = HEAP32[($0 + 24 | 0) >> 2] | 0; - $10 = HEAP32[($0 + 20 | 0) >> 2] | 0; - label$24 : { - label$25 : while (1) { - $1 = $1 + -1 | 0; - if (!$1) { - break label$24 - } - if (!(FUNCTION_TABLE[HEAP32[($12 + 16 | 0) >> 2] | 0 | 0]($10, $9) | 0)) { - continue label$25 - } - break label$25; - }; - return 1 | 0; - } - $11 = 1; - if (_ZN4core3fmt9Formatter12pad_integral12write_prefix17h581ad47c6930a5a3E($10 | 0, $12 | 0, $8 | 0, $2 | 0, $3 | 0) | 0) { - break label$14 - } - if (FUNCTION_TABLE[HEAP32[($12 + 12 | 0) >> 2] | 0 | 0]($10, $4, $5) | 0) { - break label$14 - } - $1 = 0; - label$26 : while (1) { - label$27 : { - if (($6 | 0) != ($1 | 0)) { - break label$27 - } - return $6 >>> 0 < $6 >>> 0 | 0; - } - $1 = $1 + 1 | 0; - if (!(FUNCTION_TABLE[HEAP32[($12 + 16 | 0) >> 2] | 0 | 0]($10, $9) | 0)) { - continue label$26 - } - break label$26; - }; - return ($1 + -1 | 0) >>> 0 < $6 >>> 0 | 0; - } - return $11 | 0; - } - - function _ZN4core3fmt5Write9write_fmt17h7b710d0d35de0c2bE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - return _ZN4core3fmt5write17hd273a061a774381dE($0 | 0, 1049304 | 0, $1 | 0) | 0 | 0; - } - - function _ZN4core3str5count14do_count_chars17h03769f4f70ff5154E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, $9 = 0, $8 = 0, $3 = 0, $6 = 0, $4 = 0, $5 = 0, $7 = 0, $132 = 0, $141 = 0, $150 = 0; - label$1 : { - label$2 : { - $2 = ($0 + 3 | 0) & -4 | 0; - $3 = $2 - $0 | 0; - if ($1 >>> 0 < $3 >>> 0) { - break label$2 - } - $4 = $1 - $3 | 0; - if ($4 >>> 0 < 4 >>> 0) { - break label$2 - } - $5 = $4 & 3 | 0; - $6 = 0; - $1 = 0; - label$3 : { - $7 = ($2 | 0) == ($0 | 0); - if ($7) { - break label$3 - } - $1 = 0; - label$4 : { - label$5 : { - $8 = $0 - $2 | 0; - if ($8 >>> 0 <= -4 >>> 0) { - break label$5 - } - $9 = 0; - break label$4; - } - $9 = 0; - label$6 : while (1) { - $2 = $0 + $9 | 0; - $1 = ((($1 + ((HEAP8[$2 >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($2 + 1 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($2 + 2 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($2 + 3 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0; - $9 = $9 + 4 | 0; - if ($9) { - continue label$6 - } - break label$6; - }; - } - if ($7) { - break label$3 - } - $2 = $0 + $9 | 0; - label$7 : while (1) { - $1 = $1 + ((HEAP8[$2 >> 0] | 0 | 0) > (-65 | 0)) | 0; - $2 = $2 + 1 | 0; - $8 = $8 + 1 | 0; - if ($8) { - continue label$7 - } - break label$7; - }; - } - $9 = $0 + $3 | 0; - label$8 : { - if (!$5) { - break label$8 - } - $2 = $9 + ($4 & -4 | 0) | 0; - $6 = (HEAP8[$2 >> 0] | 0 | 0) > (-65 | 0); - if (($5 | 0) == (1 | 0)) { - break label$8 - } - $6 = $6 + ((HEAP8[($2 + 1 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0; - if (($5 | 0) == (2 | 0)) { - break label$8 - } - $6 = $6 + ((HEAP8[($2 + 2 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0; - } - $3 = $4 >>> 2 | 0; - $8 = $6 + $1 | 0; - label$9 : while (1) { - $4 = $9; - if (!$3) { - break label$1 - } - $6 = $3 >>> 0 < 192 >>> 0 ? $3 : 192; - $7 = $6 & 3 | 0; - $5 = $6 << 2 | 0; - $2 = 0; - label$10 : { - if ($3 >>> 0 < 4 >>> 0) { - break label$10 - } - $0 = $9 + ($5 & 1008 | 0) | 0; - $2 = 0; - $1 = $9; - label$11 : while (1) { - $9 = HEAP32[($1 + 12 | 0) >> 2] | 0; - $132 = (($9 ^ -1 | 0) >>> 7 | 0 | ($9 >>> 6 | 0) | 0) & 16843009 | 0; - $9 = HEAP32[($1 + 8 | 0) >> 2] | 0; - $141 = (($9 ^ -1 | 0) >>> 7 | 0 | ($9 >>> 6 | 0) | 0) & 16843009 | 0; - $9 = HEAP32[($1 + 4 | 0) >> 2] | 0; - $150 = (($9 ^ -1 | 0) >>> 7 | 0 | ($9 >>> 6 | 0) | 0) & 16843009 | 0; - $9 = HEAP32[$1 >> 2] | 0; - $2 = $132 + ($141 + ($150 + (((($9 ^ -1 | 0) >>> 7 | 0 | ($9 >>> 6 | 0) | 0) & 16843009 | 0) + $2 | 0) | 0) | 0) | 0; - $1 = $1 + 16 | 0; - if (($1 | 0) != ($0 | 0)) { - continue label$11 - } - break label$11; - }; - } - $3 = $3 - $6 | 0; - $9 = $4 + $5 | 0; - $8 = (Math_imul((($2 >>> 8 | 0) & 16711935 | 0) + ($2 & 16711935 | 0) | 0, 65537) >>> 16 | 0) + $8 | 0; - if (!$7) { - continue label$9 - } - break label$9; - }; - $2 = $4 + (($6 & 252 | 0) << 2 | 0) | 0; - $1 = HEAP32[$2 >> 2] | 0; - $1 = (($1 ^ -1 | 0) >>> 7 | 0 | ($1 >>> 6 | 0) | 0) & 16843009 | 0; - label$12 : { - if (($7 | 0) == (1 | 0)) { - break label$12 - } - $9 = HEAP32[($2 + 4 | 0) >> 2] | 0; - $1 = ((($9 ^ -1 | 0) >>> 7 | 0 | ($9 >>> 6 | 0) | 0) & 16843009 | 0) + $1 | 0; - if (($7 | 0) == (2 | 0)) { - break label$12 - } - $2 = HEAP32[($2 + 8 | 0) >> 2] | 0; - $1 = ((($2 ^ -1 | 0) >>> 7 | 0 | ($2 >>> 6 | 0) | 0) & 16843009 | 0) + $1 | 0; - } - return (Math_imul((($1 >>> 8 | 0) & 459007 | 0) + ($1 & 16711935 | 0) | 0, 65537) >>> 16 | 0) + $8 | 0 | 0; - } - label$13 : { - if ($1) { - break label$13 - } - return 0 | 0; - } - $9 = $1 & 3 | 0; - label$14 : { - label$15 : { - if ($1 >>> 0 >= 4 >>> 0) { - break label$15 - } - $8 = 0; - $2 = 0; - break label$14; - } - $3 = $1 & -4 | 0; - $8 = 0; - $2 = 0; - label$16 : while (1) { - $1 = $0 + $2 | 0; - $8 = ((($8 + ((HEAP8[$1 >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($1 + 1 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($1 + 2 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($1 + 3 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0; - $2 = $2 + 4 | 0; - if (($3 | 0) != ($2 | 0)) { - continue label$16 - } - break label$16; - }; - } - if (!$9) { - break label$1 - } - $1 = $0 + $2 | 0; - label$17 : while (1) { - $8 = $8 + ((HEAP8[$1 >> 0] | 0 | 0) > (-65 | 0)) | 0; - $1 = $1 + 1 | 0; - $9 = $9 + -1 | 0; - if ($9) { - continue label$17 - } - break label$17; - }; - } - return $8 | 0; - } - - function _ZN4core3fmt9Formatter12pad_integral12write_prefix17h581ad47c6930a5a3E($0, $1, $2, $3, $4) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - $3 = $3 | 0; - $4 = $4 | 0; - label$1 : { - if (($2 | 0) == (1114112 | 0)) { - break label$1 - } - if (!(FUNCTION_TABLE[HEAP32[($1 + 16 | 0) >> 2] | 0 | 0]($0, $2) | 0)) { - break label$1 - } - return 1 | 0; - } - label$2 : { - if ($3) { - break label$2 - } - return 0 | 0; - } - return FUNCTION_TABLE[HEAP32[($1 + 12 | 0) >> 2] | 0 | 0]($0, $3, $4) | 0 | 0; - } - - function _ZN4core3fmt9Formatter9write_str17h7b04ca2eef2f5010E($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - return FUNCTION_TABLE[HEAP32[((HEAP32[($0 + 24 | 0) >> 2] | 0) + 12 | 0) >> 2] | 0 | 0](HEAP32[($0 + 20 | 0) >> 2] | 0, $1, $2) | 0 | 0; - } - - function _ZN4core3fmt9Formatter10debug_list17hd710ece3eac84443E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0; - $2 = FUNCTION_TABLE[HEAP32[((HEAP32[($1 + 24 | 0) >> 2] | 0) + 12 | 0) >> 2] | 0 | 0](HEAP32[($1 + 20 | 0) >> 2] | 0, 1049172, 1) | 0; - HEAP8[($0 + 5 | 0) >> 0] = 0; - HEAP8[($0 + 4 | 0) >> 0] = $2; - HEAP32[$0 >> 2] = $1; - } - - function _ZN4core3str5count23char_count_general_case17ha75d4189ecacd84eE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $5 = 0, $3 = 0, $2 = 0, $4 = 0; - label$1 : { - if ($1) { - break label$1 - } - return 0 | 0; - } - $2 = $1 & 3 | 0; - label$2 : { - label$3 : { - if ($1 >>> 0 >= 4 >>> 0) { - break label$3 - } - $1 = 0; - $3 = 0; - break label$2; - } - $4 = $1 & -4 | 0; - $1 = 0; - $3 = 0; - label$4 : while (1) { - $5 = $0 + $3 | 0; - $1 = ((($1 + ((HEAP8[$5 >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($5 + 1 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($5 + 2 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0) + ((HEAP8[($5 + 3 | 0) >> 0] | 0 | 0) > (-65 | 0)) | 0; - $3 = $3 + 4 | 0; - if (($4 | 0) != ($3 | 0)) { - continue label$4 - } - break label$4; - }; - } - label$5 : { - if (!$2) { - break label$5 - } - $5 = $0 + $3 | 0; - label$6 : while (1) { - $1 = $1 + ((HEAP8[$5 >> 0] | 0 | 0) > (-65 | 0)) | 0; - $5 = $5 + 1 | 0; - $2 = $2 + -1 | 0; - if ($2) { - continue label$6 - } - break label$6; - }; - } - return $1 | 0; - } - - function _ZN4core3fmt3num52_$LT$impl$u20$core__fmt__UpperHex$u20$for$u20$i8$GT$3fmt17h8bec9e17aa3a250bE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $3 = 0, $4 = 0, $2 = 0; - $2 = __stack_pointer - 128 | 0; - __stack_pointer = $2; - $3 = HEAPU8[$0 >> 0] | 0; - $0 = 0; - label$1 : while (1) { - $4 = $3 & 15 | 0; - HEAP8[(($2 + $0 | 0) + 127 | 0) >> 0] = $4 >>> 0 < 10 >>> 0 ? $4 | 48 | 0 : $4 + 55 | 0; - $0 = $0 + -1 | 0; - $4 = $3 & 255 | 0; - $3 = $4 >>> 4 | 0; - if ($4 >>> 0 >= 16 >>> 0) { - continue label$1 - } - break label$1; - }; - label$2 : { - $3 = $0 + 128 | 0; - if ($3 >>> 0 < 129 >>> 0) { - break label$2 - } - _ZN4core5slice5index26slice_start_index_len_fail17h65432e022682bf05E($3 | 0, 128 | 0, 1049360 | 0); - wasm2js_trap(); - } - $0 = _ZN4core3fmt9Formatter12pad_integral17hc60d9805b485ef36E($1 | 0, 1 | 0, 1049376 | 0, 2 | 0, ($2 + $0 | 0) + 128 | 0 | 0, 0 - $0 | 0 | 0) | 0; - __stack_pointer = $2 + 128 | 0; - return $0 | 0; - } - - function _ZN4core3fmt3num52_$LT$impl$u20$core__fmt__LowerHex$u20$for$u20$i8$GT$3fmt17hbd8bbf103c04b7d4E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $3 = 0, $4 = 0, $2 = 0; - $2 = __stack_pointer - 128 | 0; - __stack_pointer = $2; - $3 = HEAPU8[$0 >> 0] | 0; - $0 = 0; - label$1 : while (1) { - $4 = $3 & 15 | 0; - HEAP8[(($2 + $0 | 0) + 127 | 0) >> 0] = $4 >>> 0 < 10 >>> 0 ? $4 | 48 | 0 : $4 + 87 | 0; - $0 = $0 + -1 | 0; - $4 = $3 & 255 | 0; - $3 = $4 >>> 4 | 0; - if ($4 >>> 0 >= 16 >>> 0) { - continue label$1 - } - break label$1; - }; - label$2 : { - $3 = $0 + 128 | 0; - if ($3 >>> 0 < 129 >>> 0) { - break label$2 - } - _ZN4core5slice5index26slice_start_index_len_fail17h65432e022682bf05E($3 | 0, 128 | 0, 1049360 | 0); - wasm2js_trap(); - } - $0 = _ZN4core3fmt9Formatter12pad_integral17hc60d9805b485ef36E($1 | 0, 1 | 0, 1049376 | 0, 2 | 0, ($2 + $0 | 0) + 128 | 0 | 0, 0 - $0 | 0 | 0) | 0; - __stack_pointer = $2 + 128 | 0; - return $0 | 0; - } - - function _ZN4core3fmt3num3imp7fmt_u6417h6f5511515637a348E($0, $0$hi, $1, $2) { - $0 = $0 | 0; - $0$hi = $0$hi | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var i64toi32_i32$2 = 0, $4 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, $6 = 0, i64toi32_i32$3 = 0, i64toi32_i32$5 = 0, $3 = 0, $5 = 0, $5$hi = 0, $7 = 0, $8 = 0, $18 = 0, $19 = 0, $20 = 0, $21 = 0, $22 = 0, $23 = 0, $24 = 0, $26 = 0, $27 = 0, $28 = 0, $29 = 0, $30 = 0, $25 = 0, $25$hi = 0; - $3 = __stack_pointer - 48 | 0; - __stack_pointer = $3; - $4 = 39; - label$1 : { - label$2 : { - i64toi32_i32$0 = $0$hi; - i64toi32_i32$2 = $0; - i64toi32_i32$1 = 0; - i64toi32_i32$3 = 1e4; - if (i64toi32_i32$0 >>> 0 > i64toi32_i32$1 >>> 0 | ((i64toi32_i32$0 | 0) == (i64toi32_i32$1 | 0) & i64toi32_i32$2 >>> 0 >= i64toi32_i32$3 >>> 0 | 0) | 0) { - break label$2 - } - i64toi32_i32$2 = i64toi32_i32$0; - $5 = $0; - $5$hi = i64toi32_i32$2; - break label$1; - } - $4 = 39; - label$3 : while (1) { - $6 = ($3 + 9 | 0) + $4 | 0; - i64toi32_i32$2 = $0$hi; - i64toi32_i32$0 = 0; - i64toi32_i32$0 = __wasm_i64_udiv($0 | 0, i64toi32_i32$2 | 0, 1e4 | 0, i64toi32_i32$0 | 0) | 0; - i64toi32_i32$2 = i64toi32_i32$HIGH_BITS; - $5 = i64toi32_i32$0; - $5$hi = i64toi32_i32$2; - i64toi32_i32$0 = 0; - i64toi32_i32$0 = __wasm_i64_mul($5 | 0, i64toi32_i32$2 | 0, 1e4 | 0, i64toi32_i32$0 | 0) | 0; - i64toi32_i32$2 = i64toi32_i32$HIGH_BITS; - $25 = i64toi32_i32$0; - $25$hi = i64toi32_i32$2; - i64toi32_i32$2 = $0$hi; - i64toi32_i32$3 = $0; - i64toi32_i32$0 = $25$hi; - i64toi32_i32$1 = $25; - i64toi32_i32$5 = (i64toi32_i32$3 >>> 0 < i64toi32_i32$1 >>> 0) + i64toi32_i32$0 | 0; - i64toi32_i32$5 = i64toi32_i32$2 - i64toi32_i32$5 | 0; - $7 = i64toi32_i32$3 - i64toi32_i32$1 | 0; - $8 = (($7 & 65535 | 0) >>> 0) / (100 >>> 0) | 0; - $18 = ($8 << 1 | 0) + 1049378 | 0; - $19 = $6 + -4 | 0; - $20 = HEAPU8[$18 >> 0] | 0 | ((HEAPU8[($18 + 1 | 0) >> 0] | 0) << 8 | 0) | 0; - HEAP8[$19 >> 0] = $20; - HEAP8[($19 + 1 | 0) >> 0] = $20 >>> 8 | 0; - $21 = ((($7 - Math_imul($8, 100) | 0) & 65535 | 0) << 1 | 0) + 1049378 | 0; - $22 = $6 + -2 | 0; - $23 = HEAPU8[$21 >> 0] | 0 | ((HEAPU8[($21 + 1 | 0) >> 0] | 0) << 8 | 0) | 0; - HEAP8[$22 >> 0] = $23; - HEAP8[($22 + 1 | 0) >> 0] = $23 >>> 8 | 0; - $4 = $4 + -4 | 0; - i64toi32_i32$5 = i64toi32_i32$2; - i64toi32_i32$5 = i64toi32_i32$2; - i64toi32_i32$2 = i64toi32_i32$3; - i64toi32_i32$3 = 0; - i64toi32_i32$1 = 99999999; - $6 = i64toi32_i32$5 >>> 0 > i64toi32_i32$3 >>> 0 | ((i64toi32_i32$5 | 0) == (i64toi32_i32$3 | 0) & i64toi32_i32$2 >>> 0 > i64toi32_i32$1 >>> 0 | 0) | 0; - i64toi32_i32$2 = $5$hi; - $0 = $5; - $0$hi = i64toi32_i32$2; - if ($6) { - continue label$3 - } - break label$3; - }; - } - label$4 : { - label$5 : { - i64toi32_i32$2 = $5$hi; - i64toi32_i32$1 = $5; - i64toi32_i32$5 = 0; - i64toi32_i32$3 = 99; - if (i64toi32_i32$2 >>> 0 > i64toi32_i32$5 >>> 0 | ((i64toi32_i32$2 | 0) == (i64toi32_i32$5 | 0) & i64toi32_i32$1 >>> 0 > i64toi32_i32$3 >>> 0 | 0) | 0) { - break label$5 - } - i64toi32_i32$1 = i64toi32_i32$2; - i64toi32_i32$1 = i64toi32_i32$2; - $6 = $5; - break label$4; - } - $4 = $4 + -2 | 0; - i64toi32_i32$1 = $5$hi; - $6 = $5; - $6 = (($6 & 65535 | 0) >>> 0) / (100 >>> 0) | 0; - $24 = ((($5 - Math_imul($6, 100) | 0) & 65535 | 0) << 1 | 0) + 1049378 | 0; - $26 = ($3 + 9 | 0) + $4 | 0; - $27 = HEAPU8[$24 >> 0] | 0 | ((HEAPU8[($24 + 1 | 0) >> 0] | 0) << 8 | 0) | 0; - HEAP8[$26 >> 0] = $27; - HEAP8[($26 + 1 | 0) >> 0] = $27 >>> 8 | 0; - } - label$6 : { - label$7 : { - if ($6 >>> 0 < 10 >>> 0) { - break label$7 - } - $4 = $4 + -2 | 0; - $28 = ($6 << 1 | 0) + 1049378 | 0; - $29 = ($3 + 9 | 0) + $4 | 0; - $30 = HEAPU8[$28 >> 0] | 0 | ((HEAPU8[($28 + 1 | 0) >> 0] | 0) << 8 | 0) | 0; - HEAP8[$29 >> 0] = $30; - HEAP8[($29 + 1 | 0) >> 0] = $30 >>> 8 | 0; - break label$6; - } - $4 = $4 + -1 | 0; - HEAP8[(($3 + 9 | 0) + $4 | 0) >> 0] = $6 | 48 | 0; - } - $4 = _ZN4core3fmt9Formatter12pad_integral17hc60d9805b485ef36E($2 | 0, $1 | 0, 1 | 0, 0 | 0, ($3 + 9 | 0) + $4 | 0 | 0, 39 - $4 | 0 | 0) | 0; - __stack_pointer = $3 + 48 | 0; - return $4 | 0; - } - - function memcpy($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, $5 = 0, $6 = 0, $4 = 0, $9 = 0, $8 = 0, $7 = 0, $10 = 0, $66 = 0; - label$1 : { - label$2 : { - if ($2 >>> 0 >= 16 >>> 0) { - break label$2 - } - $3 = $0; - break label$1; - } - $4 = (0 - $0 | 0) & 3 | 0; - $5 = $0 + $4 | 0; - label$3 : { - if (!$4) { - break label$3 - } - $3 = $0; - $6 = $1; - label$4 : while (1) { - HEAP8[$3 >> 0] = HEAPU8[$6 >> 0] | 0; - $6 = $6 + 1 | 0; - $3 = $3 + 1 | 0; - if ($3 >>> 0 < $5 >>> 0) { - continue label$4 - } - break label$4; - }; - } - $7 = $2 - $4 | 0; - $8 = $7 & -4 | 0; - $3 = $5 + $8 | 0; - label$5 : { - label$6 : { - $9 = $1 + $4 | 0; - if (!($9 & 3 | 0)) { - break label$6 - } - if (($8 | 0) < (1 | 0)) { - break label$5 - } - $6 = $9 << 3 | 0; - $2 = $6 & 24 | 0; - $10 = $9 & -4 | 0; - $1 = $10 + 4 | 0; - $4 = (0 - $6 | 0) & 24 | 0; - $6 = HEAP32[$10 >> 2] | 0; - label$7 : while (1) { - $66 = $6 >>> $2 | 0; - $6 = HEAP32[$1 >> 2] | 0; - HEAP32[$5 >> 2] = $66 | ($6 << $4 | 0) | 0; - $1 = $1 + 4 | 0; - $5 = $5 + 4 | 0; - if ($5 >>> 0 < $3 >>> 0) { - continue label$7 - } - break label$5; - }; - } - if (($8 | 0) < (1 | 0)) { - break label$5 - } - $1 = $9; - label$8 : while (1) { - HEAP32[$5 >> 2] = HEAP32[$1 >> 2] | 0; - $1 = $1 + 4 | 0; - $5 = $5 + 4 | 0; - if ($5 >>> 0 < $3 >>> 0) { - continue label$8 - } - break label$8; - }; - } - $2 = $7 & 3 | 0; - $1 = $9 + $8 | 0; - } - label$9 : { - if (!$2) { - break label$9 - } - $5 = $3 + $2 | 0; - label$10 : while (1) { - HEAP8[$3 >> 0] = HEAPU8[$1 >> 0] | 0; - $1 = $1 + 1 | 0; - $3 = $3 + 1 | 0; - if ($3 >>> 0 < $5 >>> 0) { - continue label$10 - } - break label$10; - }; - } - return $0 | 0; - } - - function _ZN17compiler_builtins3mem7memmove17h66fcfbf60419fbe2E($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $4 = 0, $5 = 0, $8 = 0, $6 = 0, $3 = 0, $7 = 0, $9 = 0, $10 = 0, $81 = 0, $164 = 0; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - if (($0 - $1 | 0) >>> 0 >= $2 >>> 0) { - break label$4 - } - $3 = $1 + $2 | 0; - $4 = $0 + $2 | 0; - label$5 : { - if ($2 >>> 0 >= 16 >>> 0) { - break label$5 - } - $5 = $0; - break label$2; - } - $5 = $4 & -4 | 0; - $6 = $4 & 3 | 0; - $7 = 0 - $6 | 0; - label$6 : { - if (!$6) { - break label$6 - } - $8 = ($1 + $2 | 0) + -1 | 0; - label$7 : while (1) { - $4 = $4 + -1 | 0; - HEAP8[$4 >> 0] = HEAPU8[$8 >> 0] | 0; - $8 = $8 + -1 | 0; - if ($5 >>> 0 < $4 >>> 0) { - continue label$7 - } - break label$7; - }; - } - $9 = $2 - $6 | 0; - $6 = $9 & -4 | 0; - $4 = $5 - $6 | 0; - label$8 : { - $7 = $3 + $7 | 0; - if (!($7 & 3 | 0)) { - break label$8 - } - if (($6 | 0) < (1 | 0)) { - break label$3 - } - $8 = $7 << 3 | 0; - $2 = $8 & 24 | 0; - $10 = $7 & -4 | 0; - $1 = $10 + -4 | 0; - $3 = (0 - $8 | 0) & 24 | 0; - $8 = HEAP32[$10 >> 2] | 0; - label$9 : while (1) { - $5 = $5 + -4 | 0; - $81 = $8 << $3 | 0; - $8 = HEAP32[$1 >> 2] | 0; - HEAP32[$5 >> 2] = $81 | ($8 >>> $2 | 0) | 0; - $1 = $1 + -4 | 0; - if ($4 >>> 0 < $5 >>> 0) { - continue label$9 - } - break label$3; - }; - } - if (($6 | 0) < (1 | 0)) { - break label$3 - } - $1 = ($9 + $1 | 0) + -4 | 0; - label$10 : while (1) { - $5 = $5 + -4 | 0; - HEAP32[$5 >> 2] = HEAP32[$1 >> 2] | 0; - $1 = $1 + -4 | 0; - if ($4 >>> 0 < $5 >>> 0) { - continue label$10 - } - break label$3; - }; - } - label$11 : { - label$12 : { - if ($2 >>> 0 >= 16 >>> 0) { - break label$12 - } - $4 = $0; - break label$11; - } - $3 = (0 - $0 | 0) & 3 | 0; - $5 = $0 + $3 | 0; - label$13 : { - if (!$3) { - break label$13 - } - $4 = $0; - $8 = $1; - label$14 : while (1) { - HEAP8[$4 >> 0] = HEAPU8[$8 >> 0] | 0; - $8 = $8 + 1 | 0; - $4 = $4 + 1 | 0; - if ($4 >>> 0 < $5 >>> 0) { - continue label$14 - } - break label$14; - }; - } - $9 = $2 - $3 | 0; - $7 = $9 & -4 | 0; - $4 = $5 + $7 | 0; - label$15 : { - label$16 : { - $6 = $1 + $3 | 0; - if (!($6 & 3 | 0)) { - break label$16 - } - if (($7 | 0) < (1 | 0)) { - break label$15 - } - $8 = $6 << 3 | 0; - $2 = $8 & 24 | 0; - $10 = $6 & -4 | 0; - $1 = $10 + 4 | 0; - $3 = (0 - $8 | 0) & 24 | 0; - $8 = HEAP32[$10 >> 2] | 0; - label$17 : while (1) { - $164 = $8 >>> $2 | 0; - $8 = HEAP32[$1 >> 2] | 0; - HEAP32[$5 >> 2] = $164 | ($8 << $3 | 0) | 0; - $1 = $1 + 4 | 0; - $5 = $5 + 4 | 0; - if ($5 >>> 0 < $4 >>> 0) { - continue label$17 - } - break label$15; - }; - } - if (($7 | 0) < (1 | 0)) { - break label$15 - } - $1 = $6; - label$18 : while (1) { - HEAP32[$5 >> 2] = HEAP32[$1 >> 2] | 0; - $1 = $1 + 4 | 0; - $5 = $5 + 4 | 0; - if ($5 >>> 0 < $4 >>> 0) { - continue label$18 - } - break label$18; - }; - } - $2 = $9 & 3 | 0; - $1 = $6 + $7 | 0; - } - if (!$2) { - break label$1 - } - $5 = $4 + $2 | 0; - label$19 : while (1) { - HEAP8[$4 >> 0] = HEAPU8[$1 >> 0] | 0; - $1 = $1 + 1 | 0; - $4 = $4 + 1 | 0; - if ($4 >>> 0 < $5 >>> 0) { - continue label$19 - } - break label$1; - }; - } - $1 = $9 & 3 | 0; - if (!$1) { - break label$1 - } - $3 = $7 + (0 - $6 | 0) | 0; - $5 = $4 - $1 | 0; - } - $1 = $3 + -1 | 0; - label$20 : while (1) { - $4 = $4 + -1 | 0; - HEAP8[$4 >> 0] = HEAPU8[$1 >> 0] | 0; - $1 = $1 + -1 | 0; - if ($5 >>> 0 < $4 >>> 0) { - continue label$20 - } - break label$20; - }; - } - return $0 | 0; - } - - function memmove($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - return _ZN17compiler_builtins3mem7memmove17h66fcfbf60419fbe2E($0 | 0, $1 | 0, $2 | 0) | 0 | 0; - } - - function _ZN5alloc11collections5btree4node210Handle$LT$alloc__collections__btree__node__NodeRef$LT$alloc__collections__btree__node__marker__Mut$C$K$C$V$C$alloc__collections__btree__node__marker__Leaf$GT$$C$alloc__collections__btree__node__marker__Edge$GT$16insert_recursing17h01740383b348720fE($0, $1, $2, $3, $4) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - $3 = $3 | 0; - $4 = $4 | 0; - var $6 = 0, $5 = 0, $8 = 0, i64toi32_i32$1 = 0, i64toi32_i32$0 = 0, $11 = 0, $7 = 0, $12 = 0, $10 = 0, $9 = 0, $17 = 0, $14 = 0, $16 = 0, $15 = 0, $13 = 0, $18 = 0, $19 = 0, $74 = 0, $101 = 0, $116 = 0, $143 = 0, $160 = 0, $187 = 0, $202 = 0, $229 = 0, $234 = 0, $269 = 0, $331 = 0, $345 = 0, $389 = 0, $399 = 0, $415 = 0, $432 = 0, $586 = 0, $603 = 0, $693 = 0, $734 = 0, $739 = 0, $755 = 0, $770 = 0, $871 = 0, $890 = 0, $923 = 0; - $5 = __stack_pointer - 80 | 0; - __stack_pointer = $5; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - label$5 : { - label$6 : { - label$7 : { - label$8 : { - label$9 : { - label$10 : { - label$11 : { - label$12 : { - label$13 : { - label$14 : { - label$15 : { - label$16 : { - label$17 : { - label$18 : { - label$19 : { - label$20 : { - $6 = HEAP32[$1 >> 2] | 0; - $7 = HEAPU16[($6 + 182 | 0) >> 1] | 0; - if ($7 >>> 0 < 11 >>> 0) { - break label$20 - } - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - $8 = HEAP32[($1 + 4 | 0) >> 2] | 0; - $9 = HEAP32[($1 + 8 | 0) >> 2] | 0; - $7 = __rust_alloc(184 | 0, 4 | 0) | 0; - if (!$7) { - break label$12 - } - HEAP16[($7 + 182 | 0) >> 1] = 0; - HEAP32[$7 >> 2] = 0; - if ($9 >>> 0 < 5 >>> 0) { - break label$19 - } - switch ($9 + -5 | 0 | 0) { - case 1: - break label$16; - case 0: - break label$17; - default: - break label$18; - }; - } - $10 = $6 + 4 | 0; - $8 = HEAP32[($1 + 8 | 0) >> 2] | 0; - $11 = $10 + ($8 << 2 | 0) | 0; - $1 = HEAP32[($1 + 4 | 0) >> 2] | 0; - $12 = $8 + 1 | 0; - if ($12 >>> 0 <= $7 >>> 0) { - break label$14 - } - HEAP32[$11 >> 2] = $2; - break label$13; - } - $1 = (HEAPU16[($6 + 182 | 0) >> 1] | 0) + -5 | 0; - HEAP16[($7 + 182 | 0) >> 1] = $1; - $12 = ($5 + 48 | 0) + 8 | 0; - HEAP32[$12 >> 2] = HEAP32[($6 + 104 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($6 + 96 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($6 + 100 | 0) >> 2] | 0; - $74 = i64toi32_i32$0; - i64toi32_i32$0 = $5; - HEAP32[($5 + 48 | 0) >> 2] = $74; - HEAP32[($5 + 52 | 0) >> 2] = i64toi32_i32$1; - if ($1 >>> 0 >= 12 >>> 0) { - break label$11 - } - $11 = HEAP32[($6 + 20 | 0) >> 2] | 0; - memcpy($7 + 4 | 0 | 0, $6 + 24 | 0 | 0, $1 << 2 | 0 | 0) | 0; - memcpy($7 + 48 | 0 | 0, $6 + 108 | 0 | 0, Math_imul($1, 12) | 0) | 0; - HEAP16[($6 + 182 | 0) >> 1] = 4; - HEAP32[(($5 + 32 | 0) + 8 | 0) >> 2] = HEAP32[$12 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($5 + 48 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($5 + 52 | 0) >> 2] | 0; - $101 = i64toi32_i32$1; - i64toi32_i32$1 = $5; - HEAP32[($5 + 32 | 0) >> 2] = $101; - HEAP32[($5 + 36 | 0) >> 2] = i64toi32_i32$0; - break label$7; - } - $1 = (HEAPU16[($6 + 182 | 0) >> 1] | 0) + -7 | 0; - HEAP16[($7 + 182 | 0) >> 1] = $1; - $12 = ($5 + 48 | 0) + 8 | 0; - HEAP32[$12 >> 2] = HEAP32[($6 + 128 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($6 + 120 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($6 + 124 | 0) >> 2] | 0; - $116 = i64toi32_i32$0; - i64toi32_i32$0 = $5; - HEAP32[($5 + 48 | 0) >> 2] = $116; - HEAP32[($5 + 52 | 0) >> 2] = i64toi32_i32$1; - if ($1 >>> 0 >= 12 >>> 0) { - break label$10 - } - $11 = HEAP32[($6 + 28 | 0) >> 2] | 0; - memcpy($7 + 4 | 0 | 0, $6 + 32 | 0 | 0, $1 << 2 | 0 | 0) | 0; - memcpy($7 + 48 | 0 | 0, $6 + 132 | 0 | 0, Math_imul($1, 12) | 0) | 0; - HEAP16[($6 + 182 | 0) >> 1] = 6; - HEAP32[(($5 + 32 | 0) + 8 | 0) >> 2] = HEAP32[$12 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($5 + 48 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($5 + 52 | 0) >> 2] | 0; - $143 = i64toi32_i32$1; - i64toi32_i32$1 = $5; - HEAP32[($5 + 32 | 0) >> 2] = $143; - HEAP32[($5 + 36 | 0) >> 2] = i64toi32_i32$0; - $9 = $9 + -7 | 0; - break label$15; - } - $1 = (HEAPU16[($6 + 182 | 0) >> 1] | 0) + -6 | 0; - HEAP16[($7 + 182 | 0) >> 1] = $1; - $12 = ($5 + 48 | 0) + 8 | 0; - HEAP32[$12 >> 2] = HEAP32[($6 + 116 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($6 + 108 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($6 + 112 | 0) >> 2] | 0; - $160 = i64toi32_i32$0; - i64toi32_i32$0 = $5; - HEAP32[($5 + 48 | 0) >> 2] = $160; - HEAP32[($5 + 52 | 0) >> 2] = i64toi32_i32$1; - if ($1 >>> 0 >= 12 >>> 0) { - break label$9 - } - $11 = HEAP32[($6 + 24 | 0) >> 2] | 0; - memcpy($7 + 4 | 0 | 0, $6 + 28 | 0 | 0, $1 << 2 | 0 | 0) | 0; - memcpy($7 + 48 | 0 | 0, $6 + 120 | 0 | 0, Math_imul($1, 12) | 0) | 0; - $9 = 5; - HEAP16[($6 + 182 | 0) >> 1] = 5; - HEAP32[(($5 + 32 | 0) + 8 | 0) >> 2] = HEAP32[$12 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($5 + 48 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($5 + 52 | 0) >> 2] | 0; - $187 = i64toi32_i32$1; - i64toi32_i32$1 = $5; - HEAP32[($5 + 32 | 0) >> 2] = $187; - HEAP32[($5 + 36 | 0) >> 2] = i64toi32_i32$0; - break label$7; - } - $1 = (HEAPU16[($6 + 182 | 0) >> 1] | 0) + -6 | 0; - HEAP16[($7 + 182 | 0) >> 1] = $1; - $12 = ($5 + 48 | 0) + 8 | 0; - HEAP32[$12 >> 2] = HEAP32[($6 + 116 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($6 + 108 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($6 + 112 | 0) >> 2] | 0; - $202 = i64toi32_i32$0; - i64toi32_i32$0 = $5; - HEAP32[($5 + 48 | 0) >> 2] = $202; - HEAP32[($5 + 52 | 0) >> 2] = i64toi32_i32$1; - if ($1 >>> 0 >= 12 >>> 0) { - break label$8 - } - $11 = HEAP32[($6 + 24 | 0) >> 2] | 0; - memcpy($7 + 4 | 0 | 0, $6 + 28 | 0 | 0, $1 << 2 | 0 | 0) | 0; - memcpy($7 + 48 | 0 | 0, $6 + 120 | 0 | 0, Math_imul($1, 12) | 0) | 0; - HEAP16[($6 + 182 | 0) >> 1] = 5; - HEAP32[(($5 + 32 | 0) + 8 | 0) >> 2] = HEAP32[$12 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($5 + 48 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($5 + 52 | 0) >> 2] | 0; - $229 = i64toi32_i32$1; - i64toi32_i32$1 = $5; - HEAP32[($5 + 32 | 0) >> 2] = $229; - HEAP32[($5 + 36 | 0) >> 2] = i64toi32_i32$0; - $9 = 0; - } - $13 = 0; - $14 = $7; - break label$6; - } - $234 = $10 + ($12 << 2 | 0) | 0; - $10 = $7 - $8 | 0; - memmove($234 | 0, $11 | 0, $10 << 2 | 0 | 0) | 0; - HEAP32[$11 >> 2] = $2; - $11 = $6 + 48 | 0; - memmove($11 + Math_imul($12, 12) | 0 | 0, $11 + Math_imul($8, 12) | 0 | 0, Math_imul($10, 12) | 0) | 0; - } - $11 = $6 + Math_imul($8, 12) | 0; - HEAP32[($11 + 56 | 0) >> 2] = HEAP32[($3 + 8 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[$3 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($3 + 4 | 0) >> 2] | 0; - $269 = i64toi32_i32$0; - i64toi32_i32$0 = $11 + 48 | 0; - HEAP32[i64toi32_i32$0 >> 2] = $269; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - HEAP16[($6 + 182 | 0) >> 1] = $7 + 1 | 0; - HEAP32[($0 + 8 | 0) >> 2] = $8; - HEAP32[($0 + 4 | 0) >> 2] = $1; - HEAP32[$0 >> 2] = $6; - break label$5; - } - _ZN5alloc5alloc18handle_alloc_error17h123ae56be4092711E(4 | 0, 184 | 0); - wasm2js_trap(); - } - _ZN4core5slice5index24slice_end_index_len_fail17h02d344349d5072f8E($1 | 0, 11 | 0, 1050144 | 0); - wasm2js_trap(); - } - _ZN4core5slice5index24slice_end_index_len_fail17h02d344349d5072f8E($1 | 0, 11 | 0, 1050144 | 0); - wasm2js_trap(); - } - _ZN4core5slice5index24slice_end_index_len_fail17h02d344349d5072f8E($1 | 0, 11 | 0, 1050144 | 0); - wasm2js_trap(); - } - _ZN4core5slice5index24slice_end_index_len_fail17h02d344349d5072f8E($1 | 0, 11 | 0, 1050144 | 0); - wasm2js_trap(); - } - $13 = $8; - $14 = $6; - } - $1 = ($14 + 4 | 0) + ($9 << 2 | 0) | 0; - label$21 : { - label$22 : { - $10 = HEAPU16[($14 + 182 | 0) >> 1] | 0; - if ($10 >>> 0 > $9 >>> 0) { - break label$22 - } - HEAP32[$1 >> 2] = $2; - break label$21; - } - $12 = $10 - $9 | 0; - memmove($1 + 4 | 0 | 0, $1 | 0, $12 << 2 | 0 | 0) | 0; - HEAP32[$1 >> 2] = $2; - $1 = $14 + Math_imul($9, 12) | 0; - memmove($1 + 60 | 0 | 0, $1 + 48 | 0 | 0, Math_imul($12, 12) | 0) | 0; - } - $1 = $14 + Math_imul($9, 12) | 0; - HEAP32[($1 + 56 | 0) >> 2] = HEAP32[($3 + 8 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[$3 >> 2] | 0; - i64toi32_i32$0 = HEAP32[($3 + 4 | 0) >> 2] | 0; - $331 = i64toi32_i32$1; - i64toi32_i32$1 = $1 + 48 | 0; - HEAP32[i64toi32_i32$1 >> 2] = $331; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - $12 = ($5 + 16 | 0) + 8 | 0; - HEAP32[$12 >> 2] = HEAP32[(($5 + 32 | 0) + 8 | 0) >> 2] | 0; - HEAP16[($14 + 182 | 0) >> 1] = $10 + 1 | 0; - i64toi32_i32$0 = HEAP32[($5 + 32 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($5 + 36 | 0) >> 2] | 0; - $345 = i64toi32_i32$0; - i64toi32_i32$0 = $5; - HEAP32[($5 + 16 | 0) >> 2] = $345; - HEAP32[($5 + 20 | 0) >> 2] = i64toi32_i32$1; - label$23 : { - label$24 : { - label$25 : { - $1 = HEAP32[$6 >> 2] | 0; - if ($1) { - break label$25 - } - $3 = 0; - break label$24; - } - $10 = $5 + 68 | 0; - $3 = 0; - label$26 : while (1) { - if (($8 | 0) != ($3 | 0)) { - break label$4 - } - $3 = HEAPU16[($6 + 180 | 0) >> 1] | 0; - label$27 : { - label$28 : { - label$29 : { - label$30 : { - label$31 : { - label$32 : { - label$33 : { - label$34 : { - $2 = HEAPU16[($1 + 182 | 0) >> 1] | 0; - if ($2 >>> 0 < 11 >>> 0) { - break label$34 - } - $6 = $8 + 1 | 0; - if ($3 >>> 0 < 5 >>> 0) { - break label$33 - } - switch ($3 + -5 | 0 | 0) { - case 1: - break label$30; - case 0: - break label$31; - default: - break label$32; - }; - } - $10 = $1 + 4 | 0; - $15 = $3 << 2 | 0; - $8 = $10 + $15 | 0; - $6 = $3 + 1 | 0; - $12 = $2 + 1 | 0; - label$35 : { - label$36 : { - if ($3 >>> 0 < $2 >>> 0) { - break label$36 - } - HEAP32[$8 >> 2] = $11; - $8 = $1 + Math_imul($3, 12) | 0; - i64toi32_i32$1 = HEAP32[($5 + 16 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($5 + 20 | 0) >> 2] | 0; - $389 = i64toi32_i32$1; - i64toi32_i32$1 = $8 + 48 | 0; - HEAP32[i64toi32_i32$1 >> 2] = $389; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - HEAP32[($8 + 56 | 0) >> 2] = HEAP32[($5 + 24 | 0) >> 2] | 0; - break label$35; - } - $16 = $6 << 2 | 0; - $399 = $10 + $16 | 0; - $10 = $2 - $3 | 0; - $17 = $10 << 2 | 0; - memmove($399 | 0, $8 | 0, $17 | 0) | 0; - HEAP32[$8 >> 2] = $11; - $8 = $1 + 48 | 0; - $415 = $8 + Math_imul($6, 12) | 0; - $8 = $8 + Math_imul($3, 12) | 0; - memmove($415 | 0, $8 | 0, Math_imul($10, 12) | 0) | 0; - HEAP32[($8 + 8 | 0) >> 2] = HEAP32[(($5 + 16 | 0) + 8 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($5 + 16 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($5 + 20 | 0) >> 2] | 0; - $432 = i64toi32_i32$0; - i64toi32_i32$0 = $8; - HEAP32[$8 >> 2] = $432; - HEAP32[($8 + 4 | 0) >> 2] = i64toi32_i32$1; - $8 = $1 + 184 | 0; - memmove(($8 + $15 | 0) + 8 | 0 | 0, $8 + $16 | 0 | 0, $17 | 0) | 0; - } - HEAP16[($1 + 182 | 0) >> 1] = $12; - HEAP32[(($1 + ($6 << 2 | 0) | 0) + 184 | 0) >> 2] = $7; - $11 = $2 + 2 | 0; - if ($6 >>> 0 >= $11 >>> 0) { - break label$23 - } - label$37 : { - $2 = $2 - $3 | 0; - $8 = ($2 + 1 | 0) & 3 | 0; - if (!$8) { - break label$37 - } - $3 = ($1 + ($3 << 2 | 0) | 0) + 188 | 0; - label$38 : while (1) { - $7 = HEAP32[$3 >> 2] | 0; - HEAP16[($7 + 180 | 0) >> 1] = $6; - HEAP32[$7 >> 2] = $1; - $3 = $3 + 4 | 0; - $6 = $6 + 1 | 0; - $8 = $8 + -1 | 0; - if ($8) { - continue label$38 - } - break label$38; - }; - } - if ($2 >>> 0 < 3 >>> 0) { - break label$23 - } - $3 = (($6 << 2 | 0) + $1 | 0) + 196 | 0; - label$39 : while (1) { - $8 = HEAP32[($3 + -12 | 0) >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $6; - HEAP32[$8 >> 2] = $1; - $8 = HEAP32[($3 + -8 | 0) >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $6 + 1 | 0; - HEAP32[$8 >> 2] = $1; - $8 = HEAP32[($3 + -4 | 0) >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $6 + 2 | 0; - HEAP32[$8 >> 2] = $1; - $8 = HEAP32[$3 >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $6 + 3 | 0; - HEAP32[$8 >> 2] = $1; - $3 = $3 + 16 | 0; - $6 = $6 + 4 | 0; - if (($11 | 0) != ($6 | 0)) { - continue label$39 - } - break label$23; - }; - } - HEAP32[($5 + 40 | 0) >> 2] = 4; - HEAP32[($5 + 36 | 0) >> 2] = $6; - HEAP32[($5 + 32 | 0) >> 2] = $1; - _ZN5alloc11collections5btree4node212Handle$LT$alloc__collections__btree__node__NodeRef$LT$alloc__collections__btree__node__marker__Mut$C$K$C$V$C$alloc__collections__btree__node__marker__Internal$GT$$C$alloc__collections__btree__node__marker__KV$GT$5split17h714854686ba3ee4cE($5 + 48 | 0 | 0, $5 + 32 | 0 | 0); - $1 = HEAP32[($5 + 48 | 0) >> 2] | 0; - break label$28; - } - HEAP32[($5 + 40 | 0) >> 2] = 6; - HEAP32[($5 + 36 | 0) >> 2] = $6; - HEAP32[($5 + 32 | 0) >> 2] = $1; - $3 = $3 + -7 | 0; - break label$29; - } - HEAP32[($5 + 40 | 0) >> 2] = 5; - HEAP32[($5 + 36 | 0) >> 2] = $6; - HEAP32[($5 + 32 | 0) >> 2] = $1; - _ZN5alloc11collections5btree4node212Handle$LT$alloc__collections__btree__node__NodeRef$LT$alloc__collections__btree__node__marker__Mut$C$K$C$V$C$alloc__collections__btree__node__marker__Internal$GT$$C$alloc__collections__btree__node__marker__KV$GT$5split17h714854686ba3ee4cE($5 + 48 | 0 | 0, $5 + 32 | 0 | 0); - $6 = HEAP32[($5 + 48 | 0) >> 2] | 0; - $1 = HEAPU16[($6 + 182 | 0) >> 1] | 0; - $3 = $1 + 1 | 0; - label$40 : { - label$41 : { - label$42 : { - if ($1 >>> 0 < 6 >>> 0) { - break label$42 - } - $8 = $1 + -5 | 0; - memmove($6 + 28 | 0 | 0, $6 + 24 | 0 | 0, $8 << 2 | 0 | 0) | 0; - HEAP32[($6 + 24 | 0) >> 2] = $11; - memmove($6 + 120 | 0 | 0, $6 + 108 | 0 | 0, Math_imul($8, 12) | 0) | 0; - HEAP32[($6 + 116 | 0) >> 2] = HEAP32[$12 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($5 + 16 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($5 + 20 | 0) >> 2] | 0; - $586 = i64toi32_i32$1; - i64toi32_i32$1 = $6; - HEAP32[($6 + 108 | 0) >> 2] = $586; - HEAP32[($6 + 112 | 0) >> 2] = i64toi32_i32$0; - memmove($6 + 212 | 0 | 0, $6 + 208 | 0 | 0, ($1 << 2 | 0) + -20 | 0 | 0) | 0; - HEAP16[($6 + 182 | 0) >> 1] = $3; - HEAP32[($6 + 208 | 0) >> 2] = $7; - break label$41; - } - HEAP32[($6 + 24 | 0) >> 2] = $11; - i64toi32_i32$0 = HEAP32[($5 + 16 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($5 + 20 | 0) >> 2] | 0; - $603 = i64toi32_i32$0; - i64toi32_i32$0 = $6; - HEAP32[($6 + 108 | 0) >> 2] = $603; - HEAP32[($6 + 112 | 0) >> 2] = i64toi32_i32$1; - HEAP32[($6 + 208 | 0) >> 2] = $7; - HEAP16[($6 + 182 | 0) >> 1] = $3; - HEAP32[($6 + 116 | 0) >> 2] = HEAP32[$12 >> 2] | 0; - if (($1 | 0) != (5 | 0)) { - break label$40 - } - } - $7 = $1 & 3 | 0; - $3 = 6; - label$43 : { - if (($1 + -5 | 0) >>> 0 < 3 >>> 0) { - break label$43 - } - $2 = ($1 & 65532 | 0) + -8 | 0; - $1 = 6; - $8 = 0; - label$44 : while (1) { - $3 = $6 + $8 | 0; - $11 = HEAP32[($3 + 208 | 0) >> 2] | 0; - HEAP16[($11 + 180 | 0) >> 1] = $1; - HEAP32[$11 >> 2] = $6; - $11 = HEAP32[($3 + 212 | 0) >> 2] | 0; - HEAP16[($11 + 180 | 0) >> 1] = $1 + 1 | 0; - HEAP32[$11 >> 2] = $6; - $11 = HEAP32[($3 + 216 | 0) >> 2] | 0; - HEAP16[($11 + 180 | 0) >> 1] = $1 + 2 | 0; - HEAP32[$11 >> 2] = $6; - $3 = HEAP32[($3 + 220 | 0) >> 2] | 0; - HEAP16[($3 + 180 | 0) >> 1] = $1 + 3 | 0; - HEAP32[$3 >> 2] = $6; - $8 = $8 + 16 | 0; - $11 = $1 + -6 | 0; - $3 = $1 + 4 | 0; - $1 = $3; - if (($11 | 0) != ($2 | 0)) { - continue label$44 - } - break label$44; - }; - } - if (!$7) { - break label$40 - } - $1 = ($6 + ($3 << 2 | 0) | 0) + 184 | 0; - label$45 : while (1) { - $8 = HEAP32[$1 >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $3; - HEAP32[$8 >> 2] = $6; - $1 = $1 + 4 | 0; - $3 = $3 + 1 | 0; - $7 = $7 + -1 | 0; - if ($7) { - continue label$45 - } - break label$45; - }; - } - HEAP32[($5 + 8 | 0) >> 2] = HEAP32[($10 + 8 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[$10 >> 2] | 0; - i64toi32_i32$0 = HEAP32[($10 + 4 | 0) >> 2] | 0; - $693 = i64toi32_i32$1; - i64toi32_i32$1 = $5; - HEAP32[$5 >> 2] = $693; - HEAP32[($5 + 4 | 0) >> 2] = i64toi32_i32$0; - break label$27; - } - HEAP32[($5 + 40 | 0) >> 2] = 5; - HEAP32[($5 + 36 | 0) >> 2] = $6; - HEAP32[($5 + 32 | 0) >> 2] = $1; - $3 = 0; - } - _ZN5alloc11collections5btree4node212Handle$LT$alloc__collections__btree__node__NodeRef$LT$alloc__collections__btree__node__marker__Mut$C$K$C$V$C$alloc__collections__btree__node__marker__Internal$GT$$C$alloc__collections__btree__node__marker__KV$GT$5split17h714854686ba3ee4cE($5 + 48 | 0 | 0, $5 + 32 | 0 | 0); - $1 = HEAP32[($5 + 56 | 0) >> 2] | 0; - } - $17 = $1 + 4 | 0; - $16 = $3 << 2 | 0; - $2 = $17 + $16 | 0; - $6 = $3 + 1 | 0; - $8 = HEAPU16[($1 + 182 | 0) >> 1] | 0; - $15 = $8 + 1 | 0; - label$46 : { - label$47 : { - if ($8 >>> 0 > $3 >>> 0) { - break label$47 - } - HEAP32[$2 >> 2] = $11; - $11 = $1 + Math_imul($3, 12) | 0; - HEAP32[($11 + 56 | 0) >> 2] = HEAP32[$12 >> 2] | 0; - i64toi32_i32$0 = HEAP32[($5 + 16 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($5 + 20 | 0) >> 2] | 0; - $734 = i64toi32_i32$0; - i64toi32_i32$0 = $11 + 48 | 0; - HEAP32[i64toi32_i32$0 >> 2] = $734; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - break label$46; - } - $18 = $6 << 2 | 0; - $739 = $17 + $18 | 0; - $17 = $8 - $3 | 0; - $19 = $17 << 2 | 0; - memmove($739 | 0, $2 | 0, $19 | 0) | 0; - HEAP32[$2 >> 2] = $11; - $11 = $1 + 48 | 0; - $755 = $11 + Math_imul($6, 12) | 0; - $11 = $11 + Math_imul($3, 12) | 0; - memmove($755 | 0, $11 | 0, Math_imul($17, 12) | 0) | 0; - HEAP32[($11 + 8 | 0) >> 2] = HEAP32[$12 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($5 + 16 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($5 + 20 | 0) >> 2] | 0; - $770 = i64toi32_i32$1; - i64toi32_i32$1 = $11; - HEAP32[i64toi32_i32$1 >> 2] = $770; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - $11 = $1 + 184 | 0; - memmove(($11 + $16 | 0) + 8 | 0 | 0, $11 + $18 | 0 | 0, $19 | 0) | 0; - } - HEAP32[(($1 + ($6 << 2 | 0) | 0) + 184 | 0) >> 2] = $7; - HEAP16[($1 + 182 | 0) >> 1] = $15; - label$48 : { - $11 = $8 + 2 | 0; - if ($6 >>> 0 >= $11 >>> 0) { - break label$48 - } - label$49 : { - $2 = $8 - $3 | 0; - $8 = ($2 + 1 | 0) & 3 | 0; - if (!$8) { - break label$49 - } - $3 = ($1 + $16 | 0) + 188 | 0; - label$50 : while (1) { - $7 = HEAP32[$3 >> 2] | 0; - HEAP16[($7 + 180 | 0) >> 1] = $6; - HEAP32[$7 >> 2] = $1; - $3 = $3 + 4 | 0; - $6 = $6 + 1 | 0; - $8 = $8 + -1 | 0; - if ($8) { - continue label$50 - } - break label$50; - }; - } - if ($2 >>> 0 < 3 >>> 0) { - break label$48 - } - $3 = ($1 + ($6 << 2 | 0) | 0) + 196 | 0; - label$51 : while (1) { - $8 = HEAP32[($3 + -12 | 0) >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $6; - HEAP32[$8 >> 2] = $1; - $8 = HEAP32[($3 + -8 | 0) >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $6 + 1 | 0; - HEAP32[$8 >> 2] = $1; - $8 = HEAP32[($3 + -4 | 0) >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $6 + 2 | 0; - HEAP32[$8 >> 2] = $1; - $8 = HEAP32[$3 >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $6 + 3 | 0; - HEAP32[$8 >> 2] = $1; - $3 = $3 + 16 | 0; - $6 = $6 + 4 | 0; - if (($11 | 0) != ($6 | 0)) { - continue label$51 - } - break label$51; - }; - } - HEAP32[($5 + 8 | 0) >> 2] = HEAP32[($10 + 8 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[$10 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($10 + 4 | 0) >> 2] | 0; - $871 = i64toi32_i32$0; - i64toi32_i32$0 = $5; - HEAP32[$5 >> 2] = $871; - HEAP32[($5 + 4 | 0) >> 2] = i64toi32_i32$1; - $6 = HEAP32[($5 + 48 | 0) >> 2] | 0; - if (!$6) { - break label$23 - } - } - $11 = HEAP32[($5 + 64 | 0) >> 2] | 0; - $3 = HEAP32[($5 + 60 | 0) >> 2] | 0; - $7 = HEAP32[($5 + 56 | 0) >> 2] | 0; - $8 = HEAP32[($5 + 52 | 0) >> 2] | 0; - HEAP32[$12 >> 2] = HEAP32[($5 + 8 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[$5 >> 2] | 0; - i64toi32_i32$0 = HEAP32[($5 + 4 | 0) >> 2] | 0; - $890 = i64toi32_i32$1; - i64toi32_i32$1 = $5; - HEAP32[($5 + 16 | 0) >> 2] = $890; - HEAP32[($5 + 20 | 0) >> 2] = i64toi32_i32$0; - $1 = HEAP32[$6 >> 2] | 0; - if ($1) { - continue label$26 - } - break label$26; - }; - } - $1 = HEAP32[$4 >> 2] | 0; - $8 = HEAP32[$1 >> 2] | 0; - if (!$8) { - break label$3 - } - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - $2 = HEAP32[($1 + 4 | 0) >> 2] | 0; - $6 = __rust_alloc(232 | 0, 4 | 0) | 0; - if (!$6) { - break label$2 - } - HEAP32[($6 + 184 | 0) >> 2] = $8; - HEAP16[($6 + 182 | 0) >> 1] = 0; - HEAP32[$6 >> 2] = 0; - HEAP16[($8 + 180 | 0) >> 1] = 0; - HEAP32[$8 >> 2] = $6; - HEAP32[($1 + 4 | 0) >> 2] = $2 + 1 | 0; - HEAP32[$1 >> 2] = $6; - if (($2 | 0) != ($3 | 0)) { - break label$1 - } - i64toi32_i32$0 = HEAP32[($5 + 16 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($5 + 20 | 0) >> 2] | 0; - $923 = i64toi32_i32$0; - i64toi32_i32$0 = $6; - HEAP32[($6 + 48 | 0) >> 2] = $923; - HEAP32[($6 + 52 | 0) >> 2] = i64toi32_i32$1; - HEAP32[($6 + 4 | 0) >> 2] = $11; - HEAP16[($6 + 182 | 0) >> 1] = 1; - HEAP32[($6 + 188 | 0) >> 2] = $7; - HEAP32[($6 + 56 | 0) >> 2] = HEAP32[($5 + 24 | 0) >> 2] | 0; - HEAP16[($7 + 180 | 0) >> 1] = 1; - HEAP32[$7 >> 2] = $6; - } - HEAP32[($0 + 8 | 0) >> 2] = $9; - HEAP32[($0 + 4 | 0) >> 2] = $13; - HEAP32[$0 >> 2] = $14; - } - __stack_pointer = $5 + 80 | 0; - return; - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050176 | 0, 53 | 0, 1050232 | 0); - wasm2js_trap(); - } - _ZN4core6option13unwrap_failed17h98817bc8a3accaffE(1049776 | 0); - wasm2js_trap(); - } - _ZN5alloc5alloc18handle_alloc_error17h123ae56be4092711E(4 | 0, 232 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1049883 | 0, 48 | 0, 1049932 | 0); - wasm2js_trap(); - } - - function _ZN5alloc11collections5btree4node212Handle$LT$alloc__collections__btree__node__NodeRef$LT$alloc__collections__btree__node__marker__Mut$C$K$C$V$C$alloc__collections__btree__node__marker__Internal$GT$$C$alloc__collections__btree__node__marker__KV$GT$5split17h714854686ba3ee4cE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, $7 = 0, $8 = 0, $10 = 0, $6 = 0, $5 = 0, $3 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, $9 = 0, $4 = 0, $48 = 0, $11 = 0, $93 = 0, $146 = 0; - $2 = __stack_pointer - 32 | 0; - __stack_pointer = $2; - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - $3 = HEAP32[$1 >> 2] | 0; - $4 = HEAPU16[($3 + 182 | 0) >> 1] | 0; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - label$5 : { - $5 = __rust_alloc(232 | 0, 4 | 0) | 0; - if (!$5) { - break label$5 - } - HEAP32[$5 >> 2] = 0; - $6 = HEAPU16[($3 + 182 | 0) >> 1] | 0; - $7 = HEAP32[($1 + 8 | 0) >> 2] | 0; - $8 = $6 + ($7 ^ -1 | 0) | 0; - HEAP16[($5 + 182 | 0) >> 1] = $8; - $9 = $3 + 48 | 0; - $10 = $9 + Math_imul($7, 12) | 0; - HEAP32[(($2 + 16 | 0) + 8 | 0) >> 2] = HEAP32[($10 + 8 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[$10 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($10 + 4 | 0) >> 2] | 0; - $48 = i64toi32_i32$0; - i64toi32_i32$0 = $2; - HEAP32[($2 + 16 | 0) >> 2] = $48; - HEAP32[($2 + 20 | 0) >> 2] = i64toi32_i32$1; - if ($8 >>> 0 >= 12 >>> 0) { - break label$4 - } - $10 = $7 + 1 | 0; - if (($6 - $10 | 0 | 0) != ($8 | 0)) { - break label$3 - } - $6 = $3 + 4 | 0; - $11 = HEAP32[($6 + ($7 << 2 | 0) | 0) >> 2] | 0; - memcpy($5 + 4 | 0 | 0, $6 + ($10 << 2 | 0) | 0 | 0, $8 << 2 | 0 | 0) | 0; - memcpy($5 + 48 | 0 | 0, $9 + Math_imul($10, 12) | 0 | 0, Math_imul($8, 12) | 0) | 0; - HEAP16[($3 + 182 | 0) >> 1] = $7; - HEAP32[($2 + 8 | 0) >> 2] = HEAP32[(($2 + 16 | 0) + 8 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($2 + 16 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($2 + 20 | 0) >> 2] | 0; - $93 = i64toi32_i32$1; - i64toi32_i32$1 = $2; - HEAP32[$2 >> 2] = $93; - HEAP32[($2 + 4 | 0) >> 2] = i64toi32_i32$0; - $8 = HEAPU16[($5 + 182 | 0) >> 1] | 0; - $10 = $8 + 1 | 0; - if ($8 >>> 0 >= 12 >>> 0) { - break label$2 - } - $6 = $4 - $7 | 0; - if (($6 | 0) != ($10 | 0)) { - break label$1 - } - $10 = memcpy($5 + 184 | 0 | 0, ($3 + ($7 << 2 | 0) | 0) + 188 | 0 | 0, $6 << 2 | 0 | 0) | 0; - $6 = HEAP32[($1 + 4 | 0) >> 2] | 0; - $7 = 0; - label$6 : { - label$7 : while (1) { - $1 = HEAP32[($10 + ($7 << 2 | 0) | 0) >> 2] | 0; - HEAP16[($1 + 180 | 0) >> 1] = $7; - HEAP32[$1 >> 2] = $5; - if ($7 >>> 0 >= $8 >>> 0) { - break label$6 - } - $7 = $7 + ($7 >>> 0 < $8 >>> 0) | 0; - if ($7 >>> 0 <= $8 >>> 0) { - continue label$7 - } - break label$7; - }; - } - HEAP32[($0 + 16 | 0) >> 2] = $11; - HEAP32[($0 + 4 | 0) >> 2] = $6; - HEAP32[$0 >> 2] = $3; - i64toi32_i32$0 = HEAP32[$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($2 + 4 | 0) >> 2] | 0; - $146 = i64toi32_i32$0; - i64toi32_i32$0 = $0; - HEAP32[($0 + 20 | 0) >> 2] = $146; - HEAP32[($0 + 24 | 0) >> 2] = i64toi32_i32$1; - HEAP32[($0 + 12 | 0) >> 2] = $6; - HEAP32[($0 + 8 | 0) >> 2] = $5; - HEAP32[($0 + 28 | 0) >> 2] = HEAP32[($2 + 8 | 0) >> 2] | 0; - __stack_pointer = $2 + 32 | 0; - return; - } - _ZN5alloc5alloc18handle_alloc_error17h123ae56be4092711E(4 | 0, 232 | 0); - wasm2js_trap(); - } - _ZN4core5slice5index24slice_end_index_len_fail17h02d344349d5072f8E($8 | 0, 11 | 0, 1050144 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050088 | 0, 40 | 0, 1050128 | 0); - wasm2js_trap(); - } - _ZN4core5slice5index24slice_end_index_len_fail17h02d344349d5072f8E($10 | 0, 12 | 0, 1050160 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050088 | 0, 40 | 0, 1050128 | 0); - wasm2js_trap(); - } - - function _ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$15bulk_steal_left17hdff94e2f76df3257E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $8 = 0, $9 = 0, $3 = 0, $4 = 0, $6 = 0, $7 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, $12 = 0, $2 = 0, $5 = 0, $10 = 0, $11 = 0, $13 = 0, $14 = 0, $15 = 0, $16 = 0, $17 = 0, $15$hi = 0, $18 = 0, $19 = 0, $19$hi = 0; - $2 = __stack_pointer - 32 | 0; - __stack_pointer = $2; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - label$5 : { - label$6 : { - $3 = HEAP32[($0 + 20 | 0) >> 2] | 0; - $4 = HEAPU16[($3 + 182 | 0) >> 1] | 0; - $5 = $4 + $1 | 0; - if ($5 >>> 0 >= 12 >>> 0) { - break label$6 - } - $6 = HEAP32[($0 + 12 | 0) >> 2] | 0; - $7 = HEAPU16[($6 + 182 | 0) >> 1] | 0; - if ($7 >>> 0 < $1 >>> 0) { - break label$5 - } - $8 = $7 - $1 | 0; - HEAP16[($6 + 182 | 0) >> 1] = $8; - HEAP16[($3 + 182 | 0) >> 1] = $5; - $9 = $3 + 4 | 0; - $10 = $1 << 2 | 0; - $11 = $4 << 2 | 0; - memmove($9 + $10 | 0 | 0, $9 | 0, $11 | 0) | 0; - $12 = $3 + 48 | 0; - memmove($12 + Math_imul($1, 12) | 0 | 0, $12 | 0, Math_imul($4, 12) | 0) | 0; - $4 = $8 + 1 | 0; - $7 = $7 - $4 | 0; - if (($7 | 0) != ($1 + -1 | 0 | 0)) { - break label$4 - } - $13 = $6 + 4 | 0; - memcpy($9 | 0, $13 + ($4 << 2 | 0) | 0 | 0, $7 << 2 | 0 | 0) | 0; - $9 = $6 + 48 | 0; - $7 = Math_imul($7, 12); - $12 = memcpy($12 | 0, $9 + Math_imul($4, 12) | 0 | 0, $7 | 0) | 0; - $9 = $9 + Math_imul($8, 12) | 0; - $14 = HEAP32[($9 + 8 | 0) >> 2] | 0; - HEAP32[($2 + 8 | 0) >> 2] = $14; - i64toi32_i32$0 = HEAP32[$9 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($9 + 4 | 0) >> 2] | 0; - $15 = i64toi32_i32$0; - $15$hi = i64toi32_i32$1; - $9 = HEAP32[$0 >> 2] | 0; - $16 = HEAP32[($0 + 8 | 0) >> 2] | 0; - $17 = ($9 + ($16 << 2 | 0) | 0) + 4 | 0; - $18 = HEAP32[$17 >> 2] | 0; - HEAP32[$17 >> 2] = HEAP32[($13 + ($8 << 2 | 0) | 0) >> 2] | 0; - i64toi32_i32$0 = $2; - HEAP32[i64toi32_i32$0 >> 2] = $15; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - $8 = $9 + Math_imul($16, 12) | 0; - $9 = $8 + 48 | 0; - i64toi32_i32$1 = HEAP32[$9 >> 2] | 0; - i64toi32_i32$0 = HEAP32[($9 + 4 | 0) >> 2] | 0; - $19 = i64toi32_i32$1; - $19$hi = i64toi32_i32$0; - i64toi32_i32$0 = $15$hi; - i64toi32_i32$1 = $9; - HEAP32[$9 >> 2] = $15; - HEAP32[($9 + 4 | 0) >> 2] = i64toi32_i32$0; - $8 = $8 + 56 | 0; - $9 = HEAP32[$8 >> 2] | 0; - HEAP32[$8 >> 2] = $14; - HEAP32[($3 + $10 | 0) >> 2] = $18; - $8 = $12 + $7 | 0; - HEAP32[($8 + 8 | 0) >> 2] = $9; - i64toi32_i32$0 = $19$hi; - i64toi32_i32$1 = $8; - HEAP32[$8 >> 2] = $19; - HEAP32[($8 + 4 | 0) >> 2] = i64toi32_i32$0; - $8 = HEAP32[($0 + 24 | 0) >> 2] | 0; - label$7 : { - if (HEAP32[($0 + 16 | 0) >> 2] | 0) { - break label$7 - } - if (!$8) { - break label$2 - } - break label$1; - } - if (!$8) { - break label$1 - } - $0 = $3 + 184 | 0; - $1 = $1 << 2 | 0; - memmove($0 + $1 | 0 | 0, $0 | 0, $11 + 4 | 0 | 0) | 0; - memcpy($0 | 0, ($6 + ($4 << 2 | 0) | 0) + 184 | 0 | 0, $1 | 0) | 0; - $8 = $5 + 1 | 0; - $6 = $8 & 3 | 0; - $1 = 0; - if ($5 >>> 0 < 3 >>> 0) { - break label$3 - } - $0 = $3 + 196 | 0; - $4 = $8 & 60 | 0; - $1 = 0; - label$8 : while (1) { - $8 = HEAP32[($0 + -12 | 0) >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $1; - HEAP32[$8 >> 2] = $3; - $8 = HEAP32[($0 + -8 | 0) >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $1 + 1 | 0; - HEAP32[$8 >> 2] = $3; - $8 = HEAP32[($0 + -4 | 0) >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $1 + 2 | 0; - HEAP32[$8 >> 2] = $3; - $8 = HEAP32[$0 >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $1 + 3 | 0; - HEAP32[$8 >> 2] = $3; - $0 = $0 + 16 | 0; - $1 = $1 + 4 | 0; - if (($4 | 0) != ($1 | 0)) { - continue label$8 - } - break label$3; - }; - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050248 | 0, 51 | 0, 1050300 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050316 | 0, 39 | 0, 1050356 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050088 | 0, 40 | 0, 1050128 | 0); - wasm2js_trap(); - } - if (!$6) { - break label$2 - } - $0 = (($1 << 2 | 0) + $3 | 0) + 184 | 0; - label$9 : while (1) { - $8 = HEAP32[$0 >> 2] | 0; - HEAP16[($8 + 180 | 0) >> 1] = $1; - HEAP32[$8 >> 2] = $3; - $0 = $0 + 4 | 0; - $1 = $1 + 1 | 0; - $6 = $6 + -1 | 0; - if ($6) { - continue label$9 - } - break label$9; - }; - } - __stack_pointer = $2 + 32 | 0; - return; - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050372 | 0, 40 | 0, 1050412 | 0); - wasm2js_trap(); - } - - function _ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$16bulk_steal_right17h9c412c550e5d39d3E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $7 = 0, $3 = 0, $4 = 0, $6 = 0, $14 = 0, $9 = 0, i64toi32_i32$0 = 0, $12 = 0, i64toi32_i32$1 = 0, $8 = 0, $15 = 0, $2 = 0, $5 = 0, $10 = 0, $11 = 0, $13 = 0, $17 = 0, $13$hi = 0, $16 = 0, $18 = 0, $18$hi = 0, $126 = 0; - $2 = __stack_pointer - 32 | 0; - __stack_pointer = $2; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - label$5 : { - label$6 : { - $3 = HEAP32[($0 + 12 | 0) >> 2] | 0; - $4 = HEAPU16[($3 + 182 | 0) >> 1] | 0; - $5 = $4 + $1 | 0; - if ($5 >>> 0 >= 12 >>> 0) { - break label$6 - } - $6 = HEAP32[($0 + 20 | 0) >> 2] | 0; - $7 = HEAPU16[($6 + 182 | 0) >> 1] | 0; - if ($7 >>> 0 < $1 >>> 0) { - break label$5 - } - HEAP16[($3 + 182 | 0) >> 1] = $5; - $8 = $7 - $1 | 0; - HEAP16[($6 + 182 | 0) >> 1] = $8; - $9 = $6 + 48 | 0; - $10 = $1 + -1 | 0; - $11 = Math_imul($10, 12); - $7 = $9 + $11 | 0; - $12 = HEAP32[($7 + 8 | 0) >> 2] | 0; - HEAP32[($2 + 8 | 0) >> 2] = $12; - i64toi32_i32$0 = HEAP32[$7 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($7 + 4 | 0) >> 2] | 0; - $13 = i64toi32_i32$0; - $13$hi = i64toi32_i32$1; - $7 = HEAP32[$0 >> 2] | 0; - $14 = HEAP32[($0 + 8 | 0) >> 2] | 0; - $15 = ($7 + ($14 << 2 | 0) | 0) + 4 | 0; - $16 = HEAP32[$15 >> 2] | 0; - $17 = $1 << 2 | 0; - HEAP32[$15 >> 2] = HEAP32[($6 + $17 | 0) >> 2] | 0; - i64toi32_i32$0 = $2; - HEAP32[i64toi32_i32$0 >> 2] = $13; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - $7 = $7 + Math_imul($14, 12) | 0; - $14 = $7 + 48 | 0; - i64toi32_i32$1 = HEAP32[$14 >> 2] | 0; - i64toi32_i32$0 = HEAP32[($14 + 4 | 0) >> 2] | 0; - $18 = i64toi32_i32$1; - $18$hi = i64toi32_i32$0; - i64toi32_i32$0 = $13$hi; - i64toi32_i32$1 = $14; - HEAP32[i64toi32_i32$1 >> 2] = $13; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = i64toi32_i32$0; - $7 = $7 + 56 | 0; - $14 = HEAP32[$7 >> 2] | 0; - HEAP32[$7 >> 2] = $12; - $12 = $3 + 4 | 0; - HEAP32[($12 + ($4 << 2 | 0) | 0) >> 2] = $16; - $15 = $3 + 48 | 0; - $7 = $15 + Math_imul($4, 12) | 0; - i64toi32_i32$0 = $18$hi; - i64toi32_i32$1 = $7; - HEAP32[$7 >> 2] = $18; - HEAP32[($7 + 4 | 0) >> 2] = i64toi32_i32$0; - HEAP32[($7 + 8 | 0) >> 2] = $14; - $7 = $4 + 1 | 0; - if (($10 | 0) != ($5 - $7 | 0 | 0)) { - break label$4 - } - $126 = $12 + ($7 << 2 | 0) | 0; - $12 = $6 + 4 | 0; - memcpy($126 | 0, $12 | 0, $10 << 2 | 0 | 0) | 0; - memcpy($15 + Math_imul($7, 12) | 0 | 0, $9 | 0, $11 | 0) | 0; - $14 = $8 << 2 | 0; - memmove($12 | 0, $12 + $17 | 0 | 0, $14 | 0) | 0; - memmove($9 | 0, $9 + Math_imul($1, 12) | 0 | 0, Math_imul($8, 12) | 0) | 0; - $9 = HEAP32[($0 + 24 | 0) >> 2] | 0; - label$7 : { - if (HEAP32[($0 + 16 | 0) >> 2] | 0) { - break label$7 - } - if (!$9) { - break label$2 - } - break label$1; - } - if (!$9) { - break label$1 - } - $0 = $6 + 184 | 0; - $9 = $1 << 2 | 0; - memcpy(($3 + ($7 << 2 | 0) | 0) + 184 | 0 | 0, $0 | 0, $9 | 0) | 0; - memmove($0 | 0, $0 + $9 | 0 | 0, $14 + 4 | 0 | 0) | 0; - label$8 : { - $0 = $1 & 3 | 0; - if (!$0) { - break label$8 - } - $1 = (($4 << 2 | 0) + $3 | 0) + 188 | 0; - label$9 : while (1) { - $4 = HEAP32[$1 >> 2] | 0; - HEAP16[($4 + 180 | 0) >> 1] = $7; - HEAP32[$4 >> 2] = $3; - $1 = $1 + 4 | 0; - $7 = $7 + 1 | 0; - $0 = $0 + -1 | 0; - if ($0) { - continue label$9 - } - break label$9; - }; - } - label$10 : { - if ($10 >>> 0 < 3 >>> 0) { - break label$10 - } - $0 = $7 << 2 | 0; - label$11 : while (1) { - $1 = $3 + $0 | 0; - $4 = HEAP32[($1 + 184 | 0) >> 2] | 0; - HEAP16[($4 + 180 | 0) >> 1] = $7; - HEAP32[$4 >> 2] = $3; - $4 = HEAP32[($1 + 188 | 0) >> 2] | 0; - HEAP16[($4 + 180 | 0) >> 1] = $7 + 1 | 0; - HEAP32[$4 >> 2] = $3; - $4 = HEAP32[($1 + 192 | 0) >> 2] | 0; - HEAP16[($4 + 180 | 0) >> 1] = $7 + 2 | 0; - HEAP32[$4 >> 2] = $3; - $1 = HEAP32[($1 + 196 | 0) >> 2] | 0; - $4 = $7 + 3 | 0; - HEAP16[($1 + 180 | 0) >> 1] = $4; - HEAP32[$1 >> 2] = $3; - $7 = $7 + 4 | 0; - $0 = $0 + 16 | 0; - if (($4 | 0) != ($5 | 0)) { - continue label$11 - } - break label$11; - }; - } - if (($8 | 0) == (-1 | 0)) { - break label$2 - } - $0 = $8 + 1 | 0; - $1 = $0 & 3 | 0; - $7 = 0; - if ($8 >>> 0 < 3 >>> 0) { - break label$3 - } - $3 = $6 + 196 | 0; - $4 = $0 & -4 | 0; - $7 = 0; - label$12 : while (1) { - $0 = HEAP32[($3 + -12 | 0) >> 2] | 0; - HEAP16[($0 + 180 | 0) >> 1] = $7; - HEAP32[$0 >> 2] = $6; - $0 = HEAP32[($3 + -8 | 0) >> 2] | 0; - HEAP16[($0 + 180 | 0) >> 1] = $7 + 1 | 0; - HEAP32[$0 >> 2] = $6; - $0 = HEAP32[($3 + -4 | 0) >> 2] | 0; - HEAP16[($0 + 180 | 0) >> 1] = $7 + 2 | 0; - HEAP32[$0 >> 2] = $6; - $0 = HEAP32[$3 >> 2] | 0; - HEAP16[($0 + 180 | 0) >> 1] = $7 + 3 | 0; - HEAP32[$0 >> 2] = $6; - $3 = $3 + 16 | 0; - $7 = $7 + 4 | 0; - if (($4 | 0) != ($7 | 0)) { - continue label$12 - } - break label$3; - }; - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050428 | 0, 50 | 0, 1050480 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050496 | 0, 40 | 0, 1050536 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050088 | 0, 40 | 0, 1050128 | 0); - wasm2js_trap(); - } - if (!$1) { - break label$2 - } - $3 = (($7 << 2 | 0) + $6 | 0) + 184 | 0; - label$13 : while (1) { - $0 = HEAP32[$3 >> 2] | 0; - HEAP16[($0 + 180 | 0) >> 1] = $7; - HEAP32[$0 >> 2] = $6; - $3 = $3 + 4 | 0; - $7 = $7 + 1 | 0; - $1 = $1 + -1 | 0; - if ($1) { - continue label$13 - } - break label$13; - }; - } - __stack_pointer = $2 + 32 | 0; - return; - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050372 | 0, 40 | 0, 1050552 | 0); - wasm2js_trap(); - } - - function _ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$8do_merge17h3854facd3939f96eE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $13 = 0, $11 = 0, $16 = 0, $5 = 0, $3 = 0, $15 = 0, $14 = 0, $2 = 0, $4 = 0, $6 = 0, $7 = 0, $8 = 0, $12 = 0, $17 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, $9 = 0, $10 = 0, $97 = 0, $116 = 0; - $2 = __stack_pointer - 16 | 0; - __stack_pointer = $2; - label$1 : { - label$2 : { - $3 = HEAP32[($1 + 12 | 0) >> 2] | 0; - $4 = HEAPU16[($3 + 182 | 0) >> 1] | 0; - $5 = $4 + 1 | 0; - $6 = HEAP32[($1 + 20 | 0) >> 2] | 0; - $7 = HEAPU16[($6 + 182 | 0) >> 1] | 0; - $8 = $5 + $7 | 0; - if ($8 >>> 0 >= 12 >>> 0) { - break label$2 - } - $9 = HEAP32[($1 + 16 | 0) >> 2] | 0; - $10 = HEAP32[($1 + 4 | 0) >> 2] | 0; - $11 = HEAP32[$1 >> 2] | 0; - $12 = HEAPU16[($11 + 182 | 0) >> 1] | 0; - HEAP16[($3 + 182 | 0) >> 1] = $8; - $13 = HEAP32[($1 + 8 | 0) >> 2] | 0; - $1 = $11 + ($13 << 2 | 0) | 0; - $14 = $1 + 4 | 0; - $15 = HEAP32[$14 >> 2] | 0; - $16 = $12 + ($13 ^ -1 | 0) | 0; - $17 = $16 << 2 | 0; - memmove($14 | 0, $1 + 8 | 0 | 0, $17 | 0) | 0; - $1 = $3 + 4 | 0; - HEAP32[($1 + ($4 << 2 | 0) | 0) >> 2] = $15; - memcpy($1 + ($5 << 2 | 0) | 0 | 0, $6 + 4 | 0 | 0, $7 << 2 | 0 | 0) | 0; - $14 = $2 + 8 | 0; - $1 = $11 + Math_imul($13, 12) | 0; - HEAP32[$14 >> 2] = HEAP32[($1 + 56 | 0) >> 2] | 0; - $15 = $1 + 48 | 0; - i64toi32_i32$0 = HEAP32[$15 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($15 + 4 | 0) >> 2] | 0; - $97 = i64toi32_i32$0; - i64toi32_i32$0 = $2; - HEAP32[$2 >> 2] = $97; - HEAP32[($2 + 4 | 0) >> 2] = i64toi32_i32$1; - memmove($15 | 0, $1 + 60 | 0 | 0, Math_imul($16, 12) | 0) | 0; - $1 = $3 + 48 | 0; - $15 = $1 + Math_imul($4, 12) | 0; - HEAP32[($15 + 8 | 0) >> 2] = HEAP32[$14 >> 2] | 0; - i64toi32_i32$1 = HEAP32[$2 >> 2] | 0; - i64toi32_i32$0 = HEAP32[($2 + 4 | 0) >> 2] | 0; - $116 = i64toi32_i32$1; - i64toi32_i32$1 = $15; - HEAP32[$15 >> 2] = $116; - HEAP32[($15 + 4 | 0) >> 2] = i64toi32_i32$0; - memcpy($1 + Math_imul($5, 12) | 0 | 0, $6 + 48 | 0 | 0, Math_imul($7, 12) | 0) | 0; - $15 = 184; - $1 = $13 + 1 | 0; - $14 = $11 + ($1 << 2 | 0) | 0; - memmove($14 + 184 | 0 | 0, $14 + 188 | 0 | 0, $17 | 0) | 0; - label$3 : { - if ($1 >>> 0 >= $12 >>> 0) { - break label$3 - } - $17 = ($12 - $13 | 0) + -2 | 0; - label$4 : { - $16 = $16 & 3 | 0; - if (!$16) { - break label$4 - } - $13 = (($13 << 2 | 0) + $11 | 0) + 188 | 0; - label$5 : while (1) { - $14 = HEAP32[$13 >> 2] | 0; - HEAP16[($14 + 180 | 0) >> 1] = $1; - HEAP32[$14 >> 2] = $11; - $13 = $13 + 4 | 0; - $1 = $1 + 1 | 0; - $16 = $16 + -1 | 0; - if ($16) { - continue label$5 - } - break label$5; - }; - } - if ($17 >>> 0 < 3 >>> 0) { - break label$3 - } - $13 = (($1 << 2 | 0) + $11 | 0) + 196 | 0; - label$6 : while (1) { - $16 = HEAP32[($13 + -12 | 0) >> 2] | 0; - HEAP16[($16 + 180 | 0) >> 1] = $1; - HEAP32[$16 >> 2] = $11; - $16 = HEAP32[($13 + -8 | 0) >> 2] | 0; - HEAP16[($16 + 180 | 0) >> 1] = $1 + 1 | 0; - HEAP32[$16 >> 2] = $11; - $16 = HEAP32[($13 + -4 | 0) >> 2] | 0; - HEAP16[($16 + 180 | 0) >> 1] = $1 + 2 | 0; - HEAP32[$16 >> 2] = $11; - $16 = HEAP32[$13 >> 2] | 0; - HEAP16[($16 + 180 | 0) >> 1] = $1 + 3 | 0; - HEAP32[$16 >> 2] = $11; - $13 = $13 + 16 | 0; - $1 = $1 + 4 | 0; - if (($12 | 0) != ($1 | 0)) { - continue label$6 - } - break label$6; - }; - } - HEAP16[($11 + 182 | 0) >> 1] = (HEAPU16[($11 + 182 | 0) >> 1] | 0) + -1 | 0; - label$7 : { - if ($10 >>> 0 < 2 >>> 0) { - break label$7 - } - $1 = $7 + 1 | 0; - if (($1 | 0) != ($8 - $4 | 0 | 0)) { - break label$1 - } - memcpy(($3 + 184 | 0) + ($5 << 2 | 0) | 0 | 0, $6 + 184 | 0 | 0, $1 << 2 | 0 | 0) | 0; - label$8 : { - $11 = $1 & 3 | 0; - if (!$11) { - break label$8 - } - $1 = (($4 << 2 | 0) + $3 | 0) + 188 | 0; - label$9 : while (1) { - $13 = HEAP32[$1 >> 2] | 0; - HEAP16[($13 + 180 | 0) >> 1] = $5; - HEAP32[$13 >> 2] = $3; - $1 = $1 + 4 | 0; - $5 = $5 + 1 | 0; - $11 = $11 + -1 | 0; - if ($11) { - continue label$9 - } - break label$9; - }; - } - $15 = 232; - if ($7 >>> 0 < 3 >>> 0) { - break label$7 - } - $11 = $5 << 2 | 0; - label$10 : while (1) { - $1 = $3 + $11 | 0; - $13 = HEAP32[($1 + 184 | 0) >> 2] | 0; - HEAP16[($13 + 180 | 0) >> 1] = $5; - HEAP32[$13 >> 2] = $3; - $13 = HEAP32[($1 + 188 | 0) >> 2] | 0; - HEAP16[($13 + 180 | 0) >> 1] = $5 + 1 | 0; - HEAP32[$13 >> 2] = $3; - $13 = HEAP32[($1 + 192 | 0) >> 2] | 0; - HEAP16[($13 + 180 | 0) >> 1] = $5 + 2 | 0; - HEAP32[$13 >> 2] = $3; - $1 = HEAP32[($1 + 196 | 0) >> 2] | 0; - $13 = $5 + 3 | 0; - HEAP16[($1 + 180 | 0) >> 1] = $13; - HEAP32[$1 >> 2] = $3; - $5 = $5 + 4 | 0; - $11 = $11 + 16 | 0; - if (($13 | 0) != ($8 | 0)) { - continue label$10 - } - break label$10; - }; - } - __rust_dealloc($6 | 0, $15 | 0, 4 | 0); - HEAP32[($0 + 4 | 0) >> 2] = $9; - HEAP32[$0 >> 2] = $3; - __stack_pointer = $2 + 16 | 0; - return; - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050728 | 0, 42 | 0, 1050772 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050088 | 0, 40 | 0, 1050128 | 0); - wasm2js_trap(); - } - - function _ZN5alloc11collections5btree6remove259_$LT$impl$u20$alloc__collections__btree__node__Handle$LT$alloc__collections__btree__node__NodeRef$LT$alloc__collections__btree__node__marker__Mut$C$K$C$V$C$alloc__collections__btree__node__marker__Leaf$GT$$C$alloc__collections__btree__node__marker__KV$GT$$GT$14remove_leaf_kv17h1338e9b021c47ae4E($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, $6 = 0, $13 = 0, $10 = 0, $9 = 0, $7 = 0, i64toi32_i32$1 = 0, $17 = 0, $4 = 0, $12 = 0, i64toi32_i32$0 = 0, $5 = 0, $16 = 0, $15 = 0, $21 = 0, i64toi32_i32$2 = 0, $18 = 0, $19 = 0, $14 = 0, $20 = 0, $23 = 0, $11 = 0, $22 = 0, $8 = 0, $66 = 0, $332 = 0, $375 = 0, $394 = 0, $594 = 0; - $3 = __stack_pointer - 128 | 0; - __stack_pointer = $3; - $4 = HEAP32[$1 >> 2] | 0; - $5 = HEAP32[($1 + 8 | 0) >> 2] | 0; - $6 = $4 + ($5 << 2 | 0) | 0; - $7 = $6 + 4 | 0; - $8 = HEAP32[$7 >> 2] | 0; - $9 = HEAPU16[($4 + 182 | 0) >> 1] | 0; - $10 = ($5 ^ -1 | 0) + $9 | 0; - memmove($7 | 0, $6 + 8 | 0 | 0, $10 << 2 | 0 | 0) | 0; - $11 = ($3 + 24 | 0) + 8 | 0; - $6 = $4 + Math_imul($5, 12) | 0; - HEAP32[$11 >> 2] = HEAP32[($6 + 56 | 0) >> 2] | 0; - $7 = $6 + 48 | 0; - i64toi32_i32$2 = $7; - i64toi32_i32$0 = HEAP32[$7 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($7 + 4 | 0) >> 2] | 0; - $66 = i64toi32_i32$0; - i64toi32_i32$0 = $3; - HEAP32[($3 + 24 | 0) >> 2] = $66; - HEAP32[($3 + 28 | 0) >> 2] = i64toi32_i32$1; - memmove($7 | 0, $6 + 60 | 0 | 0, Math_imul($10, 12) | 0) | 0; - $6 = $9 + -1 | 0; - HEAP16[($4 + 182 | 0) >> 1] = $6; - $12 = HEAP32[($1 + 4 | 0) >> 2] | 0; - label$1 : { - if (($6 & 65535 | 0) >>> 0 > 4 >>> 0) { - break label$1 - } - $1 = HEAP32[$4 >> 2] | 0; - if (!$1) { - break label$1 - } - $7 = $12 + 1 | 0; - label$2 : { - label$3 : { - label$4 : { - label$5 : { - label$6 : { - $9 = HEAPU16[($4 + 180 | 0) >> 1] | 0; - if ($9) { - break label$6 - } - if (HEAPU16[($1 + 182 | 0) >> 1] | 0) { - break label$5 - } - HEAP32[($3 + 72 | 0) >> 2] = 1; - HEAP32[($3 + 68 | 0) >> 2] = 1050012; - i64toi32_i32$0 = $3; - i64toi32_i32$1 = 0; - HEAP32[($3 + 80 | 0) >> 2] = 0; - HEAP32[($3 + 84 | 0) >> 2] = i64toi32_i32$1; - HEAP32[($3 + 76 | 0) >> 2] = $3 + 124 | 0; - _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($3 + 68 | 0 | 0, 1050020 | 0); - wasm2js_trap(); - } - label$7 : { - $9 = $9 + -1 | 0; - $10 = HEAP32[(($1 + ($9 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - $13 = HEAPU16[($10 + 182 | 0) >> 1] | 0; - $6 = $6 & 65535 | 0; - if ((($13 + $6 | 0) + 1 | 0) >>> 0 < 12 >>> 0) { - break label$7 - } - HEAP32[($3 + 92 | 0) >> 2] = $12; - HEAP32[($3 + 88 | 0) >> 2] = $4; - HEAP32[($3 + 84 | 0) >> 2] = $12; - HEAP32[($3 + 80 | 0) >> 2] = $10; - HEAP32[($3 + 76 | 0) >> 2] = $9; - HEAP32[($3 + 72 | 0) >> 2] = $7; - HEAP32[($3 + 68 | 0) >> 2] = $1; - _ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$15bulk_steal_left17hdff94e2f76df3257E($3 + 68 | 0 | 0, 1 | 0); - $5 = $5 + 1 | 0; - break label$2; - } - HEAP32[($3 + 92 | 0) >> 2] = $12; - HEAP32[($3 + 88 | 0) >> 2] = $4; - HEAP32[($3 + 84 | 0) >> 2] = $12; - HEAP32[($3 + 80 | 0) >> 2] = $10; - HEAP32[($3 + 76 | 0) >> 2] = $9; - HEAP32[($3 + 72 | 0) >> 2] = $7; - HEAP32[($3 + 68 | 0) >> 2] = $1; - if ($5 >>> 0 > $6 >>> 0) { - break label$4 - } - $5 = ($5 + $13 | 0) + 1 | 0; - _ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$8do_merge17h3854facd3939f96eE($3 + 16 | 0 | 0, $3 + 68 | 0 | 0); - $12 = HEAP32[($3 + 20 | 0) >> 2] | 0; - $4 = HEAP32[($3 + 16 | 0) >> 2] | 0; - break label$2; - } - label$8 : { - $9 = $6 & 65535 | 0; - $6 = HEAP32[($1 + 188 | 0) >> 2] | 0; - if ((($9 + (HEAPU16[($6 + 182 | 0) >> 1] | 0) | 0) + 1 | 0) >>> 0 < 12 >>> 0) { - break label$8 - } - HEAP32[($3 + 92 | 0) >> 2] = $12; - HEAP32[($3 + 88 | 0) >> 2] = $6; - HEAP32[($3 + 84 | 0) >> 2] = $12; - HEAP32[($3 + 80 | 0) >> 2] = $4; - HEAP32[($3 + 76 | 0) >> 2] = 0; - HEAP32[($3 + 72 | 0) >> 2] = $7; - HEAP32[($3 + 68 | 0) >> 2] = $1; - _ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$16bulk_steal_right17h9c412c550e5d39d3E($3 + 68 | 0 | 0, 1 | 0); - break label$2; - } - HEAP32[($3 + 92 | 0) >> 2] = $12; - HEAP32[($3 + 88 | 0) >> 2] = $6; - HEAP32[($3 + 84 | 0) >> 2] = $12; - HEAP32[($3 + 80 | 0) >> 2] = $4; - HEAP32[($3 + 76 | 0) >> 2] = 0; - HEAP32[($3 + 72 | 0) >> 2] = $7; - HEAP32[($3 + 68 | 0) >> 2] = $1; - if ($5 >>> 0 > $9 >>> 0) { - break label$3 - } - _ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$8do_merge17h3854facd3939f96eE($3 + 8 | 0 | 0, $3 + 68 | 0 | 0); - $12 = HEAP32[($3 + 12 | 0) >> 2] | 0; - $4 = HEAP32[($3 + 8 | 0) >> 2] | 0; - break label$2; - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050568 | 0, 142 | 0, 1050712 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050568 | 0, 142 | 0, 1050712 | 0); - wasm2js_trap(); - } - $9 = HEAP32[$4 >> 2] | 0; - if (!$9) { - break label$1 - } - $6 = HEAPU16[($9 + 182 | 0) >> 1] | 0; - if ($6 >>> 0 > 4 >>> 0) { - break label$1 - } - $14 = $12 + 1 | 0; - label$9 : { - label$10 : { - label$11 : { - label$12 : while (1) { - $1 = $14; - $15 = $9; - $9 = HEAP32[$9 >> 2] | 0; - if (!$9) { - break label$11 - } - $16 = $6 & 65535 | 0; - $14 = $1 + 1 | 0; - label$13 : { - label$14 : { - label$15 : { - label$16 : { - $6 = HEAPU16[($15 + 180 | 0) >> 1] | 0; - if ($6) { - break label$16 - } - label$17 : { - $6 = HEAPU16[($9 + 182 | 0) >> 1] | 0; - if ($6) { - break label$17 - } - HEAP32[($3 + 100 | 0) >> 2] = 1; - HEAP32[($3 + 96 | 0) >> 2] = 1050012; - i64toi32_i32$0 = $3; - i64toi32_i32$1 = 0; - HEAP32[($3 + 108 | 0) >> 2] = 0; - HEAP32[($3 + 112 | 0) >> 2] = i64toi32_i32$1; - HEAP32[($3 + 104 | 0) >> 2] = $3 + 124 | 0; - _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($3 + 96 | 0 | 0, 1050020 | 0); - wasm2js_trap(); - } - HEAP32[($3 + 92 | 0) >> 2] = $1; - HEAP32[($3 + 84 | 0) >> 2] = $1; - HEAP32[($3 + 80 | 0) >> 2] = $15; - $13 = 0; - HEAP32[($3 + 76 | 0) >> 2] = 0; - HEAP32[($3 + 72 | 0) >> 2] = $14; - HEAP32[($3 + 68 | 0) >> 2] = $9; - $10 = HEAP32[($9 + 188 | 0) >> 2] | 0; - HEAP32[($3 + 88 | 0) >> 2] = $10; - $1 = $16 + 1 | 0; - $17 = HEAPU16[($10 + 182 | 0) >> 1] | 0; - $18 = $1 + $17 | 0; - if ($18 >>> 0 >= 12 >>> 0) { - break label$15 - } - $7 = $15; - $15 = $10; - $19 = $16; - $16 = $17; - break label$13; - } - HEAP32[($3 + 64 | 0) >> 2] = $1; - HEAP32[($3 + 60 | 0) >> 2] = $15; - HEAP32[($3 + 56 | 0) >> 2] = $1; - HEAP32[($3 + 44 | 0) >> 2] = $14; - $13 = $6 + -1 | 0; - HEAP32[($3 + 48 | 0) >> 2] = $13; - HEAP32[($3 + 40 | 0) >> 2] = $9; - $7 = HEAP32[(($9 + ($13 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - HEAP32[($3 + 52 | 0) >> 2] = $7; - $19 = HEAPU16[($7 + 182 | 0) >> 1] | 0; - if ((($16 + $19 | 0) + 1 | 0) >>> 0 < 12 >>> 0) { - break label$14 - } - _ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$15bulk_steal_left17hdff94e2f76df3257E($3 + 40 | 0 | 0, 5 - $16 | 0 | 0); - break label$1; - } - _ZN5alloc11collections5btree4node29BalancingContext$LT$K$C$V$GT$16bulk_steal_right17h9c412c550e5d39d3E($3 + 68 | 0 | 0, 5 - $16 | 0 | 0); - break label$1; - } - $1 = $19 + 1 | 0; - $18 = $1 + $16 | 0; - $6 = HEAPU16[($9 + 182 | 0) >> 1] | 0; - } - HEAP16[($7 + 182 | 0) >> 1] = $18; - $10 = $9 + ($13 << 2 | 0) | 0; - $17 = $10 + 4 | 0; - $20 = HEAP32[$17 >> 2] | 0; - $332 = $10 + 8 | 0; - $21 = $6 & 65535 | 0; - $10 = $21 + ($13 ^ -1 | 0) | 0; - $22 = $10 << 2 | 0; - memmove($17 | 0, $332 | 0, $22 | 0) | 0; - $6 = $7 + 4 | 0; - HEAP32[($6 + ($19 << 2 | 0) | 0) >> 2] = $20; - $23 = $1 << 2 | 0; - memcpy($6 + $23 | 0 | 0, $15 + 4 | 0 | 0, $16 << 2 | 0 | 0) | 0; - $17 = ($3 + 96 | 0) + 8 | 0; - $6 = $9 + Math_imul($13, 12) | 0; - HEAP32[$17 >> 2] = HEAP32[($6 + 56 | 0) >> 2] | 0; - $20 = $6 + 48 | 0; - i64toi32_i32$2 = $20; - i64toi32_i32$1 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$0 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $375 = i64toi32_i32$1; - i64toi32_i32$1 = $3; - HEAP32[($3 + 96 | 0) >> 2] = $375; - HEAP32[($3 + 100 | 0) >> 2] = i64toi32_i32$0; - memmove(i64toi32_i32$2 | 0, $6 + 60 | 0 | 0, Math_imul($10, 12) | 0) | 0; - $6 = $7 + 48 | 0; - $10 = $6 + Math_imul($19, 12) | 0; - HEAP32[($10 + 8 | 0) >> 2] = HEAP32[$17 >> 2] | 0; - i64toi32_i32$2 = $3; - i64toi32_i32$0 = HEAP32[($3 + 96 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($3 + 100 | 0) >> 2] | 0; - $394 = i64toi32_i32$0; - i64toi32_i32$0 = $10; - HEAP32[$10 >> 2] = $394; - HEAP32[($10 + 4 | 0) >> 2] = i64toi32_i32$1; - memcpy($6 + Math_imul($1, 12) | 0 | 0, $15 + 48 | 0 | 0, Math_imul($16, 12) | 0) | 0; - $6 = $13 + 1 | 0; - $17 = $9 + ($6 << 2 | 0) | 0; - $10 = $17 + 184 | 0; - memmove($10 | 0, $17 + 188 | 0 | 0, $22 | 0) | 0; - label$18 : { - if ($21 >>> 0 <= $6 >>> 0) { - break label$18 - } - $20 = ($21 - $13 | 0) + -2 | 0; - label$19 : { - $13 = ($21 - $6 | 0) & 3 | 0; - if (!$13) { - break label$19 - } - label$20 : while (1) { - $17 = HEAP32[$10 >> 2] | 0; - HEAP16[($17 + 180 | 0) >> 1] = $6; - HEAP32[$17 >> 2] = $9; - $10 = $10 + 4 | 0; - $6 = $6 + 1 | 0; - $13 = $13 + -1 | 0; - if ($13) { - continue label$20 - } - break label$20; - }; - } - if ($20 >>> 0 < 3 >>> 0) { - break label$18 - } - $10 = ($9 + ($6 << 2 | 0) | 0) + 196 | 0; - label$21 : while (1) { - $13 = HEAP32[($10 + -12 | 0) >> 2] | 0; - HEAP16[($13 + 180 | 0) >> 1] = $6; - HEAP32[$13 >> 2] = $9; - $13 = HEAP32[($10 + -8 | 0) >> 2] | 0; - HEAP16[($13 + 180 | 0) >> 1] = $6 + 1 | 0; - HEAP32[$13 >> 2] = $9; - $13 = HEAP32[($10 + -4 | 0) >> 2] | 0; - HEAP16[($13 + 180 | 0) >> 1] = $6 + 2 | 0; - HEAP32[$13 >> 2] = $9; - $13 = HEAP32[$10 >> 2] | 0; - HEAP16[($13 + 180 | 0) >> 1] = $6 + 3 | 0; - HEAP32[$13 >> 2] = $9; - $10 = $10 + 16 | 0; - $6 = $6 + 4 | 0; - if (($21 | 0) != ($6 | 0)) { - continue label$21 - } - break label$21; - }; - } - HEAP16[($9 + 182 | 0) >> 1] = (HEAPU16[($9 + 182 | 0) >> 1] | 0) + -1 | 0; - $17 = 184; - label$22 : { - if ($14 >>> 0 < 2 >>> 0) { - break label$22 - } - $6 = $16 + 1 | 0; - if (($6 | 0) != ($18 - $19 | 0 | 0)) { - break label$10 - } - memcpy(($7 + 184 | 0) + $23 | 0 | 0, $15 + 184 | 0 | 0, $6 << 2 | 0 | 0) | 0; - label$23 : { - $21 = $18 - $1 | 0; - $10 = ($21 + 1 | 0) & 3 | 0; - if (!$10) { - break label$23 - } - $6 = ($7 + $23 | 0) + 184 | 0; - label$24 : while (1) { - $13 = HEAP32[$6 >> 2] | 0; - HEAP16[($13 + 180 | 0) >> 1] = $1; - HEAP32[$13 >> 2] = $7; - $6 = $6 + 4 | 0; - $1 = $1 + 1 | 0; - $10 = $10 + -1 | 0; - if ($10) { - continue label$24 - } - break label$24; - }; - } - $17 = 232; - if ($21 >>> 0 < 3 >>> 0) { - break label$22 - } - $10 = $1 << 2 | 0; - label$25 : while (1) { - $6 = $7 + $10 | 0; - $13 = HEAP32[($6 + 184 | 0) >> 2] | 0; - HEAP16[($13 + 180 | 0) >> 1] = $1; - HEAP32[$13 >> 2] = $7; - $13 = HEAP32[($6 + 188 | 0) >> 2] | 0; - HEAP16[($13 + 180 | 0) >> 1] = $1 + 1 | 0; - HEAP32[$13 >> 2] = $7; - $13 = HEAP32[($6 + 192 | 0) >> 2] | 0; - HEAP16[($13 + 180 | 0) >> 1] = $1 + 2 | 0; - HEAP32[$13 >> 2] = $7; - $6 = HEAP32[($6 + 196 | 0) >> 2] | 0; - $13 = $1 + 3 | 0; - HEAP16[($6 + 180 | 0) >> 1] = $13; - HEAP32[$6 >> 2] = $7; - $1 = $1 + 4 | 0; - $10 = $10 + 16 | 0; - if (($13 | 0) != ($18 | 0)) { - continue label$25 - } - break label$25; - }; - } - __rust_dealloc($15 | 0, $17 | 0, 4 | 0); - $6 = HEAPU16[($9 + 182 | 0) >> 1] | 0; - if ($6 >>> 0 <= 4 >>> 0) { - continue label$12 - } - break label$1; - }; - } - if (!($6 & 65535 | 0)) { - break label$9 - } - break label$1; - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050088 | 0, 40 | 0, 1050128 | 0); - wasm2js_trap(); - } - HEAP8[$2 >> 0] = 1; - } - HEAP32[$0 >> 2] = $8; - i64toi32_i32$2 = $3; - i64toi32_i32$1 = HEAP32[($3 + 24 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($3 + 28 | 0) >> 2] | 0; - $594 = i64toi32_i32$1; - i64toi32_i32$1 = $0; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = $594; - HEAP32[(i64toi32_i32$1 + 8 | 0) >> 2] = i64toi32_i32$0; - HEAP32[(i64toi32_i32$1 + 24 | 0) >> 2] = $5; - HEAP32[(i64toi32_i32$1 + 20 | 0) >> 2] = $12; - HEAP32[(i64toi32_i32$1 + 16 | 0) >> 2] = $4; - HEAP32[(i64toi32_i32$1 + 12 | 0) >> 2] = HEAP32[$11 >> 2] | 0; - __stack_pointer = $3 + 128 | 0; - } - - function _ZN5alloc11collections5btree6remove269_$LT$impl$u20$alloc__collections__btree__node__Handle$LT$alloc__collections__btree__node__NodeRef$LT$alloc__collections__btree__node__marker__Mut$C$K$C$V$C$alloc__collections__btree__node__marker__LeafOrInternal$GT$$C$alloc__collections__btree__node__marker__KV$GT$$GT$18remove_kv_tracking17h9cdde6bfc5849410E($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, $5 = 0, i64toi32_i32$1 = 0, $4 = 0, $6 = 0, i64toi32_i32$5 = 0, i64toi32_i32$0 = 0, i64toi32_i32$4 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, $7 = 0, $21 = 0, $92 = 0, $112 = 0, $8 = 0, $9 = 0, $9$hi = 0, $161 = 0, $210 = 0; - $3 = __stack_pointer - 80 | 0; - __stack_pointer = $3; - $4 = HEAP32[($1 + 8 | 0) >> 2] | 0; - $5 = HEAP32[$1 >> 2] | 0; - label$1 : { - label$2 : { - $6 = HEAP32[($1 + 4 | 0) >> 2] | 0; - if ($6) { - break label$2 - } - HEAP32[($3 + 16 | 0) >> 2] = $4; - HEAP32[($3 + 12 | 0) >> 2] = 0; - HEAP32[($3 + 8 | 0) >> 2] = $5; - _ZN5alloc11collections5btree6remove259_$LT$impl$u20$alloc__collections__btree__node__Handle$LT$alloc__collections__btree__node__NodeRef$LT$alloc__collections__btree__node__marker__Mut$C$K$C$V$C$alloc__collections__btree__node__marker__Leaf$GT$$C$alloc__collections__btree__node__marker__KV$GT$$GT$14remove_leaf_kv17h1338e9b021c47ae4E($0 | 0, $3 + 8 | 0 | 0, $2 | 0); - break label$1; - } - $1 = HEAP32[(($5 + ($4 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - label$3 : { - $4 = $6 + -1 | 0; - if (!$4) { - break label$3 - } - $5 = $6 + -2 | 0; - label$4 : { - $6 = $4 & 3 | 0; - if (!$6) { - break label$4 - } - label$5 : while (1) { - $4 = $4 + -1 | 0; - $1 = HEAP32[(($1 + ((HEAPU16[($1 + 182 | 0) >> 1] | 0) << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - $6 = $6 + -1 | 0; - if ($6) { - continue label$5 - } - break label$5; - }; - } - if ($5 >>> 0 < 3 >>> 0) { - break label$3 - } - label$6 : while (1) { - $1 = HEAP32[(($1 + ((HEAPU16[($1 + 182 | 0) >> 1] | 0) << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - $1 = HEAP32[(($1 + ((HEAPU16[($1 + 182 | 0) >> 1] | 0) << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - $1 = HEAP32[(($1 + ((HEAPU16[($1 + 182 | 0) >> 1] | 0) << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - $1 = HEAP32[(($1 + ((HEAPU16[($1 + 182 | 0) >> 1] | 0) << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - $4 = $4 + -4 | 0; - if ($4) { - continue label$6 - } - break label$6; - }; - } - HEAP32[($3 + 20 | 0) >> 2] = $1; - $92 = $3; - i64toi32_i32$2 = $1; - i64toi32_i32$0 = HEAPU16[($1 + 182 | 0) >> 1] | 0; - i64toi32_i32$1 = 0; - i64toi32_i32$2 = i64toi32_i32$0; - i64toi32_i32$0 = 0; - i64toi32_i32$3 = 32; - i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { - i64toi32_i32$0 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - $21 = 0; - } else { - i64toi32_i32$0 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$1 << i64toi32_i32$4 | 0) | 0; - $21 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - } - i64toi32_i32$1 = $21; - i64toi32_i32$2 = -1; - i64toi32_i32$3 = 0; - i64toi32_i32$4 = i64toi32_i32$1 + i64toi32_i32$3 | 0; - i64toi32_i32$5 = i64toi32_i32$0 + i64toi32_i32$2 | 0; - if (i64toi32_i32$4 >>> 0 < i64toi32_i32$3 >>> 0) { - i64toi32_i32$5 = i64toi32_i32$5 + 1 | 0 - } - i64toi32_i32$1 = $92; - HEAP32[(i64toi32_i32$1 + 24 | 0) >> 2] = i64toi32_i32$4; - HEAP32[(i64toi32_i32$1 + 28 | 0) >> 2] = i64toi32_i32$5; - _ZN5alloc11collections5btree6remove259_$LT$impl$u20$alloc__collections__btree__node__Handle$LT$alloc__collections__btree__node__NodeRef$LT$alloc__collections__btree__node__marker__Mut$C$K$C$V$C$alloc__collections__btree__node__marker__Leaf$GT$$C$alloc__collections__btree__node__marker__KV$GT$$GT$14remove_leaf_kv17h1338e9b021c47ae4E($3 + 32 | 0 | 0, $3 + 20 | 0 | 0, $2 | 0); - $6 = ($3 + 64 | 0) + 8 | 0; - HEAP32[$6 >> 2] = HEAP32[(($3 + 32 | 0) + 12 | 0) >> 2] | 0; - i64toi32_i32$0 = $3; - i64toi32_i32$5 = HEAP32[($3 + 36 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($3 + 40 | 0) >> 2] | 0; - $112 = i64toi32_i32$5; - i64toi32_i32$5 = $3; - HEAP32[($3 + 64 | 0) >> 2] = $112; - HEAP32[($3 + 68 | 0) >> 2] = i64toi32_i32$1; - $5 = HEAP32[($3 + 32 | 0) >> 2] | 0; - $2 = HEAP32[($3 + 52 | 0) >> 2] | 0; - label$7 : { - $4 = HEAP32[($3 + 56 | 0) >> 2] | 0; - $1 = HEAP32[($3 + 48 | 0) >> 2] | 0; - if ($4 >>> 0 < (HEAPU16[($1 + 182 | 0) >> 1] | 0) >>> 0) { - break label$7 - } - label$8 : while (1) { - $2 = $2 + 1 | 0; - $4 = HEAPU16[($1 + 180 | 0) >> 1] | 0; - $1 = HEAP32[$1 >> 2] | 0; - if ($4 >>> 0 >= (HEAPU16[($1 + 182 | 0) >> 1] | 0) >>> 0) { - continue label$8 - } - break label$8; - }; - } - $7 = ($1 + ($4 << 2 | 0) | 0) + 4 | 0; - $8 = HEAP32[$7 >> 2] | 0; - HEAP32[$7 >> 2] = $5; - $5 = $1 + Math_imul($4, 12) | 0; - $7 = $5 + 56 | 0; - HEAP32[(($3 + 32 | 0) + 8 | 0) >> 2] = HEAP32[$7 >> 2] | 0; - $5 = $5 + 48 | 0; - i64toi32_i32$0 = $5; - i64toi32_i32$1 = HEAP32[$5 >> 2] | 0; - i64toi32_i32$5 = HEAP32[($5 + 4 | 0) >> 2] | 0; - $9 = i64toi32_i32$1; - $9$hi = i64toi32_i32$5; - i64toi32_i32$0 = $3; - i64toi32_i32$5 = HEAP32[($3 + 64 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($3 + 68 | 0) >> 2] | 0; - $161 = i64toi32_i32$5; - i64toi32_i32$5 = $5; - HEAP32[$5 >> 2] = $161; - HEAP32[($5 + 4 | 0) >> 2] = i64toi32_i32$1; - HEAP32[$7 >> 2] = HEAP32[$6 >> 2] | 0; - i64toi32_i32$1 = $9$hi; - i64toi32_i32$5 = $3; - HEAP32[($3 + 32 | 0) >> 2] = $9; - HEAP32[($3 + 36 | 0) >> 2] = i64toi32_i32$1; - $5 = $4 + 1 | 0; - label$9 : { - if (!$2) { - break label$9 - } - $4 = ($1 + ($5 << 2 | 0) | 0) + 184 | 0; - label$10 : { - label$11 : { - $5 = $2 & 7 | 0; - if ($5) { - break label$11 - } - $6 = $2; - break label$10; - } - $6 = $2; - label$12 : while (1) { - $6 = $6 + -1 | 0; - $1 = HEAP32[$4 >> 2] | 0; - $4 = $1 + 184 | 0; - $5 = $5 + -1 | 0; - if ($5) { - continue label$12 - } - break label$12; - }; - } - $5 = 0; - if ($2 >>> 0 < 8 >>> 0) { - break label$9 - } - label$13 : while (1) { - $1 = HEAP32[((HEAP32[((HEAP32[((HEAP32[((HEAP32[((HEAP32[((HEAP32[((HEAP32[$4 >> 2] | 0) + 184 | 0) >> 2] | 0) + 184 | 0) >> 2] | 0) + 184 | 0) >> 2] | 0) + 184 | 0) >> 2] | 0) + 184 | 0) >> 2] | 0) + 184 | 0) >> 2] | 0) + 184 | 0) >> 2] | 0; - $4 = $1 + 184 | 0; - $6 = $6 + -8 | 0; - if ($6) { - continue label$13 - } - break label$13; - }; - } - HEAP32[$0 >> 2] = $8; - i64toi32_i32$0 = $3; - i64toi32_i32$1 = HEAP32[($3 + 32 | 0) >> 2] | 0; - i64toi32_i32$5 = HEAP32[($3 + 36 | 0) >> 2] | 0; - $210 = i64toi32_i32$1; - i64toi32_i32$1 = $0; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = $210; - HEAP32[(i64toi32_i32$1 + 8 | 0) >> 2] = i64toi32_i32$5; - HEAP32[(i64toi32_i32$1 + 24 | 0) >> 2] = $5; - HEAP32[(i64toi32_i32$1 + 20 | 0) >> 2] = 0; - HEAP32[(i64toi32_i32$1 + 16 | 0) >> 2] = $1; - HEAP32[(i64toi32_i32$1 + 12 | 0) >> 2] = HEAP32[($3 + 40 | 0) >> 2] | 0; - } - __stack_pointer = $3 + 80 | 0; - } - - function _ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve21do_reserve_and_handle17h3c2f1fde18393d5eE_llvm_5589736827978271673($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, $4 = 0; - $3 = __stack_pointer - 32 | 0; - __stack_pointer = $3; - label$1 : { - $2 = $1 + $2 | 0; - if ($2 >>> 0 >= $1 >>> 0) { - break label$1 - } - _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE(0 | 0, 0 | 0); - wasm2js_trap(); - } - $4 = HEAP32[$0 >> 2] | 0; - $1 = $4 << 1 | 0; - $1 = $1 >>> 0 > $2 >>> 0 ? $1 : $2; - $1 = $1 >>> 0 > 8 >>> 0 ? $1 : 8; - $2 = ($1 ^ -1 | 0) >>> 31 | 0; - label$2 : { - label$3 : { - if ($4) { - break label$3 - } - $4 = 0; - break label$2; - } - HEAP32[($3 + 28 | 0) >> 2] = $4; - HEAP32[($3 + 20 | 0) >> 2] = HEAP32[($0 + 4 | 0) >> 2] | 0; - $4 = 1; - } - HEAP32[($3 + 24 | 0) >> 2] = $4; - _ZN5alloc7raw_vec11finish_grow17h2a582f1f38547224E_llvm_5589736827978271673($3 + 8 | 0 | 0, $2 | 0, $1 | 0, $3 + 20 | 0 | 0); - label$4 : { - if ((HEAP32[($3 + 8 | 0) >> 2] | 0 | 0) != (1 | 0)) { - break label$4 - } - _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE(HEAP32[($3 + 12 | 0) >> 2] | 0 | 0, HEAP32[($3 + 16 | 0) >> 2] | 0 | 0); - wasm2js_trap(); - } - $2 = HEAP32[($3 + 12 | 0) >> 2] | 0; - HEAP32[$0 >> 2] = $1; - HEAP32[($0 + 4 | 0) >> 2] = $2; - __stack_pointer = $3 + 32 | 0; - } - - function _ZN5alloc11collections5btree3map25BTreeMap$LT$K$C$V$C$A$GT$6insert17ha01c5540b97f764fE($0, $1, $2, $3) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - $3 = $3 | 0; - var $10 = 0, $4 = 0, i64toi32_i32$1 = 0, i64toi32_i32$0 = 0, $7 = 0, i64toi32_i32$2 = 0, $5 = 0, $11 = 0, $12 = 0, $6 = 0, $8 = 0, $9 = 0, $75 = 0, $95 = 0, $123 = 0, $126 = 0; - $4 = __stack_pointer - 48 | 0; - __stack_pointer = $4; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - label$5 : { - $5 = HEAP32[$1 >> 2] | 0; - if (!$5) { - break label$5 - } - $6 = HEAP32[($1 + 4 | 0) >> 2] | 0; - label$6 : while (1) { - $7 = $5 + 4 | 0; - $8 = HEAPU16[($5 + 182 | 0) >> 1] | 0; - $9 = Math_imul($8, 12); - $10 = 0; - $11 = -1; - label$7 : { - label$8 : while (1) { - label$9 : { - if (($9 | 0) != ($10 | 0)) { - break label$9 - } - $11 = $8; - break label$7; - } - $12 = HEAP32[$7 >> 2] | 0; - $11 = $11 + 1 | 0; - $10 = $10 + 12 | 0; - $7 = $7 + 4 | 0; - $12 = $12 >>> 0 > $2 >>> 0 ? -1 : ($12 | 0) != ($2 | 0); - if (($12 | 0) == (1 | 0)) { - continue label$8 - } - break label$8; - }; - if (!($12 & 255 | 0)) { - break label$3 - } - } - if (!$6) { - break label$4 - } - $6 = $6 + -1 | 0; - $5 = HEAP32[(($5 + ($11 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - continue label$6; - }; - } - $7 = 0; - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - $10 = __rust_alloc(184 | 0, 4 | 0) | 0; - if (!$10) { - break label$1 - } - HEAP16[($10 + 182 | 0) >> 1] = 1; - HEAP32[$10 >> 2] = 0; - HEAP32[($10 + 4 | 0) >> 2] = $2; - i64toi32_i32$1 = $1; - i64toi32_i32$0 = 1; - HEAP32[(i64toi32_i32$1 + 4 | 0) >> 2] = 0; - HEAP32[(i64toi32_i32$1 + 8 | 0) >> 2] = i64toi32_i32$0; - HEAP32[i64toi32_i32$1 >> 2] = $10; - i64toi32_i32$2 = $3; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $75 = i64toi32_i32$0; - i64toi32_i32$0 = $10; - HEAP32[($10 + 48 | 0) >> 2] = $75; - HEAP32[($10 + 52 | 0) >> 2] = i64toi32_i32$1; - HEAP32[($10 + 56 | 0) >> 2] = HEAP32[(i64toi32_i32$2 + 8 | 0) >> 2] | 0; - break label$2; - } - $7 = 0; - HEAP32[($4 + 16 | 0) >> 2] = 0; - HEAP32[($4 + 12 | 0) >> 2] = $5; - HEAP32[($4 + 8 | 0) >> 2] = $2; - HEAP32[($4 + 4 | 0) >> 2] = $1; - HEAP32[($4 + 20 | 0) >> 2] = $11; - HEAP32[($4 + 32 | 0) >> 2] = $11; - i64toi32_i32$2 = $4; - i64toi32_i32$1 = HEAP32[($4 + 12 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($4 + 16 | 0) >> 2] | 0; - $95 = i64toi32_i32$1; - i64toi32_i32$1 = $4; - HEAP32[($4 + 24 | 0) >> 2] = $95; - HEAP32[($4 + 28 | 0) >> 2] = i64toi32_i32$0; - _ZN5alloc11collections5btree4node210Handle$LT$alloc__collections__btree__node__NodeRef$LT$alloc__collections__btree__node__marker__Mut$C$K$C$V$C$alloc__collections__btree__node__marker__Leaf$GT$$C$alloc__collections__btree__node__marker__Edge$GT$16insert_recursing17h01740383b348720fE($4 + 36 | 0 | 0, $4 + 24 | 0 | 0, $2 | 0, $3 | 0, $4 + 4 | 0 | 0); - $10 = HEAP32[($4 + 4 | 0) >> 2] | 0; - HEAP32[($10 + 8 | 0) >> 2] = (HEAP32[($10 + 8 | 0) >> 2] | 0) + 1 | 0; - break label$2; - } - $10 = $5 + $10 | 0; - $7 = $10 + 44 | 0; - HEAP32[($0 + 12 | 0) >> 2] = HEAP32[$7 >> 2] | 0; - $10 = $10 + 36 | 0; - i64toi32_i32$2 = $10; - i64toi32_i32$0 = HEAP32[$10 >> 2] | 0; - i64toi32_i32$1 = HEAP32[($10 + 4 | 0) >> 2] | 0; - $123 = i64toi32_i32$0; - i64toi32_i32$0 = $0; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = $123; - HEAP32[(i64toi32_i32$0 + 8 | 0) >> 2] = i64toi32_i32$1; - i64toi32_i32$2 = $3; - i64toi32_i32$1 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$0 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $126 = i64toi32_i32$1; - i64toi32_i32$1 = $10; - HEAP32[$10 >> 2] = $126; - HEAP32[($10 + 4 | 0) >> 2] = i64toi32_i32$0; - HEAP32[$7 >> 2] = HEAP32[(i64toi32_i32$2 + 8 | 0) >> 2] | 0; - $7 = 1; - } - HEAP32[$0 >> 2] = $7; - __stack_pointer = $4 + 48 | 0; - return; - } - _ZN5alloc5alloc18handle_alloc_error17h123ae56be4092711E(4 | 0, 184 | 0); - wasm2js_trap(); - } - - function _ZN5alloc11collections5btree3map25BTreeMap$LT$K$C$V$C$A$GT$6remove17hc793cbb765ab111dE($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, $9 = 0, $10 = 0, $4 = 0, $6 = 0, $5 = 0, $7 = 0, $8 = 0, $82 = 0, $85 = 0, $96 = 0, $99 = 0, $123 = 0, $126 = 0, $129 = 0; - $3 = __stack_pointer - 96 | 0; - __stack_pointer = $3; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - $4 = HEAP32[$1 >> 2] | 0; - if ($4) { - break label$4 - } - $2 = 0; - break label$3; - } - $5 = HEAP32[$2 >> 2] | 0; - $6 = HEAP32[($1 + 4 | 0) >> 2] | 0; - label$5 : while (1) { - $7 = HEAPU16[($4 + 182 | 0) >> 1] | 0; - $8 = $7 << 2 | 0; - $2 = 0; - $9 = -1; - label$6 : { - label$7 : { - label$8 : while (1) { - label$9 : { - if (($8 | 0) != ($2 | 0)) { - break label$9 - } - $9 = $7; - break label$7; - } - $10 = $4 + $2 | 0; - $9 = $9 + 1 | 0; - $2 = $2 + 4 | 0; - $10 = HEAP32[($10 + 4 | 0) >> 2] | 0; - $10 = $10 >>> 0 > $5 >>> 0 ? -1 : ($10 | 0) != ($5 | 0); - if (($10 | 0) == (1 | 0)) { - continue label$8 - } - break label$8; - }; - if (!($10 & 255 | 0)) { - break label$6 - } - } - label$10 : { - if ($6) { - break label$10 - } - $2 = 0; - break label$3; - } - $6 = $6 + -1 | 0; - $4 = HEAP32[(($4 + ($9 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - continue label$5; - } - break label$5; - }; - HEAP32[($3 + 40 | 0) >> 2] = $1; - HEAP32[($3 + 36 | 0) >> 2] = $9; - HEAP32[($3 + 32 | 0) >> 2] = $6; - HEAP32[($3 + 28 | 0) >> 2] = $4; - HEAP8[($3 + 47 | 0) >> 0] = 0; - _ZN5alloc11collections5btree6remove269_$LT$impl$u20$alloc__collections__btree__node__Handle$LT$alloc__collections__btree__node__NodeRef$LT$alloc__collections__btree__node__marker__Mut$C$K$C$V$C$alloc__collections__btree__node__marker__LeafOrInternal$GT$$C$alloc__collections__btree__node__marker__KV$GT$$GT$18remove_kv_tracking17h9cdde6bfc5849410E($3 + 68 | 0 | 0, $3 + 28 | 0 | 0, $3 + 47 | 0 | 0); - $2 = ($3 + 48 | 0) + 8 | 0; - i64toi32_i32$2 = ($3 + 68 | 0) + 8 | 0; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $82 = i64toi32_i32$0; - i64toi32_i32$0 = $2; - HEAP32[i64toi32_i32$0 >> 2] = $82; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - i64toi32_i32$2 = $3; - i64toi32_i32$1 = HEAP32[($3 + 68 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($3 + 72 | 0) >> 2] | 0; - $85 = i64toi32_i32$1; - i64toi32_i32$1 = $3; - HEAP32[($3 + 48 | 0) >> 2] = $85; - HEAP32[($3 + 52 | 0) >> 2] = i64toi32_i32$0; - HEAP32[($1 + 8 | 0) >> 2] = (HEAP32[($1 + 8 | 0) >> 2] | 0) + -1 | 0; - label$11 : { - label$12 : { - if (HEAPU8[($3 + 47 | 0) >> 0] | 0) { - break label$12 - } - i64toi32_i32$2 = $2; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $96 = i64toi32_i32$0; - i64toi32_i32$0 = ($3 + 8 | 0) + 8 | 0; - HEAP32[i64toi32_i32$0 >> 2] = $96; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - i64toi32_i32$2 = $3; - i64toi32_i32$1 = HEAP32[($3 + 48 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($3 + 52 | 0) >> 2] | 0; - $99 = i64toi32_i32$1; - i64toi32_i32$1 = $3; - HEAP32[($3 + 8 | 0) >> 2] = $99; - HEAP32[($3 + 12 | 0) >> 2] = i64toi32_i32$0; - break label$11; - } - $2 = HEAP32[$1 >> 2] | 0; - if (!$2) { - break label$2 - } - $9 = HEAP32[($1 + 4 | 0) >> 2] | 0; - if (!$9) { - break label$1 - } - HEAP32[($1 + 4 | 0) >> 2] = $9 + -1 | 0; - $9 = HEAP32[($2 + 184 | 0) >> 2] | 0; - HEAP32[$1 >> 2] = $9; - HEAP32[$9 >> 2] = 0; - __rust_dealloc($2 | 0, 232 | 0, 4 | 0); - i64toi32_i32$2 = ($3 + 48 | 0) + 8 | 0; - i64toi32_i32$0 = HEAP32[i64toi32_i32$2 >> 2] | 0; - i64toi32_i32$1 = HEAP32[(i64toi32_i32$2 + 4 | 0) >> 2] | 0; - $123 = i64toi32_i32$0; - i64toi32_i32$0 = ($3 + 8 | 0) + 8 | 0; - HEAP32[i64toi32_i32$0 >> 2] = $123; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - i64toi32_i32$2 = $3; - i64toi32_i32$1 = HEAP32[($3 + 48 | 0) >> 2] | 0; - i64toi32_i32$0 = HEAP32[($3 + 52 | 0) >> 2] | 0; - $126 = i64toi32_i32$1; - i64toi32_i32$1 = $3; - HEAP32[($3 + 8 | 0) >> 2] = $126; - HEAP32[($3 + 12 | 0) >> 2] = i64toi32_i32$0; - } - i64toi32_i32$2 = $3; - i64toi32_i32$0 = HEAP32[($3 + 12 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($3 + 16 | 0) >> 2] | 0; - $129 = i64toi32_i32$0; - i64toi32_i32$0 = $0; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = $129; - HEAP32[(i64toi32_i32$0 + 8 | 0) >> 2] = i64toi32_i32$1; - HEAP32[(i64toi32_i32$0 + 12 | 0) >> 2] = HEAP32[(($3 + 8 | 0) + 12 | 0) >> 2] | 0; - $2 = 1; - } - HEAP32[$0 >> 2] = $2; - __stack_pointer = $3 + 96 | 0; - return; - } - _ZN4core6option13unwrap_failed17h98817bc8a3accaffE(1051024 | 0); - wasm2js_trap(); - } - _ZN4core9panicking5panic17h9f0a34b0744fbd45E(1050036 | 0, 33 | 0, 1050072 | 0); - wasm2js_trap(); - } - - function _ZN5alloc7raw_vec11finish_grow17h2a582f1f38547224E_llvm_5589736827978271673($0, $1, $2, $3) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - $3 = $3 | 0; - var $4 = 0, $5 = 0, $6 = 0; - $4 = 1; - $5 = 0; - $6 = 4; - label$1 : { - if (!$1) { - break label$1 - } - if (($2 | 0) < (0 | 0)) { - break label$1 - } - label$2 : { - label$3 : { - label$4 : { - label$5 : { - label$6 : { - if (!(HEAP32[($3 + 4 | 0) >> 2] | 0)) { - break label$6 - } - label$7 : { - $4 = HEAP32[($3 + 8 | 0) >> 2] | 0; - if ($4) { - break label$7 - } - label$8 : { - if ($2) { - break label$8 - } - $4 = 1; - break label$4; - } - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - $4 = __rust_alloc($2 | 0, 1 | 0) | 0; - break label$5; - } - $4 = __rust_realloc(HEAP32[$3 >> 2] | 0 | 0, $4 | 0, 1 | 0, $2 | 0) | 0; - break label$5; - } - label$9 : { - if ($2) { - break label$9 - } - $4 = 1; - break label$4; - } - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - $4 = __rust_alloc($2 | 0, 1 | 0) | 0; - } - if (!$4) { - break label$3 - } - } - HEAP32[($0 + 4 | 0) >> 2] = $4; - $4 = 0; - break label$2; - } - $4 = 1; - HEAP32[($0 + 4 | 0) >> 2] = 1; - } - $6 = 8; - $5 = $2; - } - HEAP32[($0 + $6 | 0) >> 2] = $5; - HEAP32[$0 >> 2] = $4; - } - - function _ZN98_$LT$alloc__vec__Vec$LT$T$GT$$u20$as$u20$alloc__vec__spec_from_iter__SpecFromIter$LT$T$C$I$GT$$GT$9from_iter17hace63ed3f33297cdE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, $6 = 0, $5 = 0, $3 = 0, $9 = 0, $4 = 0, i64toi32_i32$0 = 0, $10 = 0, $7 = 0, i64toi32_i32$1 = 0, $8 = 0, $11 = 0, $12 = 0, $237 = 0; - $2 = __stack_pointer - 48 | 0; - __stack_pointer = $2; - $3 = HEAP32[($1 + 8 | 0) >> 2] | 0; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - label$5 : { - label$6 : { - $4 = HEAP32[$1 >> 2] | 0; - if ($4) { - break label$6 - } - if (!$3) { - break label$5 - } - $5 = (HEAP32[($1 + 12 | 0) >> 2] | 0) - $3 | 0; - break label$3; - } - $6 = (HEAP32[($1 + 4 | 0) >> 2] | 0) - $4 | 0; - if ($3) { - break label$4 - } - $5 = $6; - break label$3; - } - i64toi32_i32$1 = $2; - i64toi32_i32$0 = 1; - HEAP32[($2 + 12 | 0) >> 2] = 0; - HEAP32[($2 + 16 | 0) >> 2] = i64toi32_i32$0; - $6 = 0; - break label$2; - } - $5 = ((HEAP32[($1 + 12 | 0) >> 2] | 0) - $3 | 0) + $6 | 0; - if ($5 >>> 0 < $6 >>> 0) { - break label$1 - } - } - label$7 : { - label$8 : { - label$9 : { - label$10 : { - label$11 : { - if ($5) { - break label$11 - } - $7 = 1; - break label$10; - } - $6 = 0; - if (($5 | 0) < (0 | 0)) { - break label$9 - } - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - $6 = 1; - $7 = __rust_alloc($5 | 0, 1 | 0) | 0; - if (!$7) { - break label$9 - } - } - $6 = 0; - HEAP32[($2 + 20 | 0) >> 2] = 0; - HEAP32[($2 + 16 | 0) >> 2] = $7; - HEAP32[($2 + 12 | 0) >> 2] = $5; - $8 = HEAP32[($1 + 12 | 0) >> 2] | 0; - $1 = HEAP32[($1 + 4 | 0) >> 2] | 0; - label$12 : { - label$13 : { - label$14 : { - if ($4) { - break label$14 - } - if (!$3) { - break label$2 - } - $6 = $8 - $3 | 0; - break label$13; - } - $9 = $1 - $4 | 0; - label$15 : { - if ($3) { - break label$15 - } - $6 = $9; - break label$13; - } - $6 = ($8 - $3 | 0) + $9 | 0; - if ($6 >>> 0 < $9 >>> 0) { - break label$12 - } - } - if ($6 >>> 0 > $5 >>> 0) { - break label$8 - } - $6 = 0; - break label$7; - } - HEAP32[($2 + 40 | 0) >> 2] = 0; - HEAP32[($2 + 28 | 0) >> 2] = 1; - HEAP32[($2 + 24 | 0) >> 2] = 1050808; - i64toi32_i32$1 = $2; - i64toi32_i32$0 = 0; - HEAP32[($2 + 32 | 0) >> 2] = 4; - HEAP32[($2 + 36 | 0) >> 2] = i64toi32_i32$0; - _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($2 + 24 | 0 | 0, 1051116 | 0); - wasm2js_trap(); - } - _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE($6 | 0, $5 | 0); - wasm2js_trap(); - } - _ZN5alloc7raw_vec19RawVec$LT$T$C$A$GT$7reserve21do_reserve_and_handle17h3c2f1fde18393d5eE_llvm_5589736827978271673($2 + 12 | 0 | 0, 0 | 0, $6 | 0); - $7 = HEAP32[($2 + 16 | 0) >> 2] | 0; - $6 = HEAP32[($2 + 20 | 0) >> 2] | 0; - } - label$16 : { - if (!$4) { - break label$16 - } - if (($4 | 0) == ($1 | 0)) { - break label$16 - } - $5 = $1 - $4 | 0; - $10 = $5 & 3 | 0; - label$17 : { - label$18 : { - if (($4 - $1 | 0) >>> 0 <= -4 >>> 0) { - break label$18 - } - $1 = 0; - break label$17; - } - $11 = $7 + $6 | 0; - $12 = $5 & -4 | 0; - $1 = 0; - label$19 : while (1) { - $5 = $11 + $1 | 0; - $9 = $4 + $1 | 0; - HEAP8[$5 >> 0] = HEAPU8[$9 >> 0] | 0; - HEAP8[($5 + 1 | 0) >> 0] = HEAPU8[($9 + 1 | 0) >> 0] | 0; - HEAP8[($5 + 2 | 0) >> 0] = HEAPU8[($9 + 2 | 0) >> 0] | 0; - HEAP8[($5 + 3 | 0) >> 0] = HEAPU8[($9 + 3 | 0) >> 0] | 0; - $1 = $1 + 4 | 0; - if (($12 | 0) != ($1 | 0)) { - continue label$19 - } - break label$19; - }; - $6 = $6 + $1 | 0; - } - if (!$10) { - break label$16 - } - $1 = $4 + $1 | 0; - label$20 : while (1) { - HEAP8[($7 + $6 | 0) >> 0] = HEAPU8[$1 >> 0] | 0; - $1 = $1 + 1 | 0; - $6 = $6 + 1 | 0; - $10 = $10 + -1 | 0; - if ($10) { - continue label$20 - } - break label$20; - }; - } - if (!$3) { - break label$2 - } - if (($3 | 0) == ($8 | 0)) { - break label$2 - } - $1 = $8 - $3 | 0; - $10 = $1 & 3 | 0; - label$21 : { - label$22 : { - if (($3 - $8 | 0) >>> 0 <= -4 >>> 0) { - break label$22 - } - $1 = 0; - break label$21; - } - $4 = $7 + $6 | 0; - $11 = $1 & -4 | 0; - $1 = 0; - label$23 : while (1) { - $5 = $4 + $1 | 0; - $9 = $3 + $1 | 0; - HEAP8[$5 >> 0] = HEAPU8[$9 >> 0] | 0; - HEAP8[($5 + 1 | 0) >> 0] = HEAPU8[($9 + 1 | 0) >> 0] | 0; - HEAP8[($5 + 2 | 0) >> 0] = HEAPU8[($9 + 2 | 0) >> 0] | 0; - HEAP8[($5 + 3 | 0) >> 0] = HEAPU8[($9 + 3 | 0) >> 0] | 0; - $1 = $1 + 4 | 0; - if (($11 | 0) != ($1 | 0)) { - continue label$23 - } - break label$23; - }; - $6 = $6 + $1 | 0; - } - if (!$10) { - break label$2 - } - $1 = $3 + $1 | 0; - label$24 : while (1) { - HEAP8[($7 + $6 | 0) >> 0] = HEAPU8[$1 >> 0] | 0; - $1 = $1 + 1 | 0; - $6 = $6 + 1 | 0; - $10 = $10 + -1 | 0; - if ($10) { - continue label$24 - } - break label$24; - }; - } - HEAP32[($2 + 20 | 0) >> 2] = $6; - i64toi32_i32$0 = HEAP32[($2 + 12 | 0) >> 2] | 0; - i64toi32_i32$1 = HEAP32[($2 + 16 | 0) >> 2] | 0; - $237 = i64toi32_i32$0; - i64toi32_i32$0 = $0; - HEAP32[i64toi32_i32$0 >> 2] = $237; - HEAP32[(i64toi32_i32$0 + 4 | 0) >> 2] = i64toi32_i32$1; - HEAP32[(i64toi32_i32$0 + 8 | 0) >> 2] = HEAP32[(($2 + 12 | 0) + 8 | 0) >> 2] | 0; - __stack_pointer = $2 + 48 | 0; - return; - } - HEAP32[($2 + 40 | 0) >> 2] = 0; - HEAP32[($2 + 28 | 0) >> 2] = 1; - HEAP32[($2 + 24 | 0) >> 2] = 1050808; - i64toi32_i32$0 = $2; - i64toi32_i32$1 = 0; - HEAP32[($2 + 32 | 0) >> 2] = 4; - HEAP32[($2 + 36 | 0) >> 2] = i64toi32_i32$1; - _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($2 + 24 | 0 | 0, 1050912 | 0); - wasm2js_trap(); - } - - function _ZN42_$LT$$RF$T$u20$as$u20$core__fmt__Debug$GT$3fmt17h48376aecd7558ddcE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, $3 = 0; - $2 = __stack_pointer - 16 | 0; - __stack_pointer = $2; - $3 = HEAP32[($0 + 4 | 0) >> 2] | 0; - $0 = HEAP32[$0 >> 2] | 0; - _ZN4core3fmt9Formatter10debug_list17hd710ece3eac84443E($2 + 4 | 0 | 0, $1 | 0); - label$1 : { - if (!$3) { - break label$1 - } - label$2 : while (1) { - HEAP32[($2 + 12 | 0) >> 2] = $0; - _ZN4core3fmt8builders8DebugSet5entry17h7036b50f83a7398eE($2 + 4 | 0 | 0, $2 + 12 | 0 | 0, 1051132 | 0) | 0; - $0 = $0 + 1 | 0; - $3 = $3 + -1 | 0; - if ($3) { - continue label$2 - } - break label$2; - }; - } - $0 = _ZN4core3fmt8builders9DebugList6finish17h4ef7645c675cb82eE($2 + 4 | 0 | 0) | 0; - __stack_pointer = $2 + 16 | 0; - return $0 | 0; - } - - function _ZN42_$LT$$RF$T$u20$as$u20$core__fmt__Debug$GT$3fmt17hc2f10bc6239b2f43E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0; - $0 = HEAP32[$0 >> 2] | 0; - label$1 : { - $2 = HEAP32[($1 + 28 | 0) >> 2] | 0; - if ($2 & 16 | 0) { - break label$1 - } - label$2 : { - if ($2 & 32 | 0) { - break label$2 - } - return _ZN4core3fmt3num3imp51_$LT$impl$u20$core__fmt__Display$u20$for$u20$u8$GT$3fmt17h96ec540fce0e8c05E($0 | 0, $1 | 0) | 0 | 0; - } - return _ZN4core3fmt3num52_$LT$impl$u20$core__fmt__UpperHex$u20$for$u20$i8$GT$3fmt17h8bec9e17aa3a250bE($0 | 0, $1 | 0) | 0 | 0; - } - return _ZN4core3fmt3num52_$LT$impl$u20$core__fmt__LowerHex$u20$for$u20$i8$GT$3fmt17hbd8bbf103c04b7d4E($0 | 0, $1 | 0) | 0 | 0; - } - - function _ZN12rust_runtime3mem6WACell8new_data17h26cb5cb718c9ee73E($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, $4 = 0, $5 = 0, $6 = 0, $10 = 0, $11 = 0, $7 = 0, $8 = 0, $9 = 0; - $3 = __stack_pointer - 48 | 0; - __stack_pointer = $3; - $4 = 0; - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - $5 = $2 + 8 | 0; - $6 = __rust_alloc($5 | 0, 1 | 0) | 0; - HEAP32[($3 + 12 | 0) >> 2] = $0 << 24 | 0 | (($0 & 65280 | 0) << 8 | 0) | 0 | (($0 >>> 8 | 0) & 65280 | 0 | ($0 >>> 24 | 0) | 0) | 0; - HEAP32[($3 + 16 | 0) >> 2] = $2 << 24 | 0 | (($2 & 65280 | 0) << 8 | 0) | 0 | (($2 >>> 8 | 0) & 65280 | 0 | ($2 >>> 24 | 0) | 0) | 0; - HEAP32[($3 + 20 | 0) >> 2] = $1; - $7 = $1 + $2 | 0; - HEAP32[($3 + 32 | 0) >> 2] = $3 + 16 | 0; - $8 = ($3 + 16 | 0) + 4 | 0; - $9 = ($3 + 12 | 0) + 4 | 0; - $0 = $3 + 12 | 0; - $1 = 1; - label$1 : { - label$2 : { - label$3 : while (1) { - label$4 : { - label$5 : { - label$6 : { - label$7 : { - if ($1 & 1 | 0) { - break label$7 - } - $10 = $0; - break label$6; - } - label$8 : { - if (!$0) { - break label$8 - } - if (($0 | 0) == ($9 | 0)) { - break label$8 - } - $1 = 1; - $10 = $0 + 1 | 0; - break label$4; - } - $10 = 0; - $0 = HEAP32[($3 + 32 | 0) >> 2] | 0; - if (!$0) { - break label$6 - } - if (($8 | 0) == ($0 | 0)) { - break label$6 - } - $11 = $3 + 32 | 0; - $1 = 1; - break label$5; - } - $0 = HEAP32[($3 + 20 | 0) >> 2] | 0; - if (!$0) { - break label$2 - } - if (($7 | 0) == ($0 | 0)) { - break label$2 - } - $11 = $3 + 20 | 0; - $1 = 0; - } - HEAP32[$11 >> 2] = $0 + 1 | 0; - } - if (($5 | 0) == ($4 | 0)) { - break label$1 - } - HEAP8[($6 + $4 | 0) >> 0] = HEAPU8[$0 >> 0] | 0; - $4 = $4 + 1 | 0; - $0 = $10; - continue label$3; - }; - } - HEAP32[($3 + 28 | 0) >> 2] = 1; - HEAP32[($3 + 20 | 0) >> 2] = $2; - HEAP32[($3 + 24 | 0) >> 2] = $6; - $0 = $6 + 8 | 0; - _ZN5alloc11collections5btree3map25BTreeMap$LT$K$C$V$C$A$GT$6insert17ha01c5540b97f764fE($3 + 32 | 0 | 0, 1051808 | 0, $0 | 0, $3 + 20 | 0 | 0); - label$9 : { - if (!(HEAP32[($3 + 32 | 0) >> 2] | 0)) { - break label$9 - } - __rust_dealloc(HEAP32[($3 + 40 | 0) >> 2] | 0 | 0, HEAP32[($3 + 36 | 0) >> 2] | 0 | 0, 1 | 0); - } - __stack_pointer = $3 + 48 | 0; - return $0 | 0; - } - _ZN4core9panicking18panic_bounds_check17hb583f390c1467acdE($5 | 0, $5 | 0, 1051176 | 0); - wasm2js_trap(); - } - - function _ZN12rust_runtime3mem6WACell8new_size17h2ed2900047365a20E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, $3 = 0, $4 = 0, $7 = 0, $5 = 0, $8 = 0, $6 = 0; - $2 = __stack_pointer - 32 | 0; - __stack_pointer = $2; - $3 = 0; - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - $4 = $1 + 8 | 0; - $5 = __rust_alloc($4 | 0, 1 | 0) | 0; - HEAP32[($2 + 4 | 0) >> 2] = $0 << 24 | 0 | (($0 & 65280 | 0) << 8 | 0) | 0 | (($0 >>> 8 | 0) & 65280 | 0 | ($0 >>> 24 | 0) | 0) | 0; - HEAP32[($2 + 16 | 0) >> 2] = $1 << 24 | 0 | (($1 & 65280 | 0) << 8 | 0) | 0 | (($1 >>> 8 | 0) & 65280 | 0 | ($1 >>> 24 | 0) | 0) | 0; - $6 = ($2 + 4 | 0) + 4 | 0; - $0 = $2 + 4 | 0; - $7 = 0; - label$1 : { - label$2 : { - label$3 : while (1) { - label$4 : { - label$5 : { - if (!$0) { - break label$5 - } - if (($0 | 0) == ($6 | 0)) { - break label$5 - } - $8 = $0 + 1 | 0; - break label$4; - } - if (($3 | 0) == (4 | 0)) { - break label$2 - } - $0 = ($2 + 16 | 0) + $3 | 0; - $3 = $3 + 1 | 0; - $8 = 0; - } - if (($4 | 0) == ($7 | 0)) { - break label$1 - } - HEAP8[($5 + $7 | 0) >> 0] = HEAPU8[$0 >> 0] | 0; - $7 = $7 + 1 | 0; - $0 = $8; - continue label$3; - }; - } - HEAP32[($2 + 12 | 0) >> 2] = 1; - HEAP32[($2 + 4 | 0) >> 2] = $1; - HEAP32[($2 + 8 | 0) >> 2] = $5; - $0 = $5 + 8 | 0; - _ZN5alloc11collections5btree3map25BTreeMap$LT$K$C$V$C$A$GT$6insert17ha01c5540b97f764fE($2 + 16 | 0 | 0, 1051808 | 0, $0 | 0, $2 + 4 | 0 | 0); - label$6 : { - if (!(HEAP32[($2 + 16 | 0) >> 2] | 0)) { - break label$6 - } - __rust_dealloc(HEAP32[($2 + 24 | 0) >> 2] | 0 | 0, HEAP32[($2 + 20 | 0) >> 2] | 0 | 0, 1 | 0); - } - __stack_pointer = $2 + 32 | 0; - return $0 | 0; - } - _ZN4core9panicking18panic_bounds_check17hb583f390c1467acdE($4 | 0, $4 | 0, 1051192 | 0); - wasm2js_trap(); - } - - function _ZN12rust_runtime3mem8WABuffer8from_ref17hd15e58422a800be2E($0) { - $0 = $0 | 0; - var $1 = 0, $8 = 0, $3 = 0, $7 = 0, $2 = 0, $4 = 0, $6 = 0, $5 = 0; - label$1 : { - $1 = HEAP32[(0 + 1051808 | 0) >> 2] | 0; - if (!$1) { - break label$1 - } - $2 = HEAP32[(0 + 1051812 | 0) >> 2] | 0; - label$2 : while (1) { - $3 = $1 + 44 | 0; - $4 = $1 + 4 | 0; - $5 = HEAPU16[($1 + 182 | 0) >> 1] | 0; - $6 = $5 << 2 | 0; - $7 = -1; - label$3 : { - label$4 : { - label$5 : while (1) { - label$6 : { - if ($6) { - break label$6 - } - $7 = $5; - break label$4; - } - $8 = HEAP32[$4 >> 2] | 0; - $7 = $7 + 1 | 0; - $3 = $3 + 12 | 0; - $6 = $6 + -4 | 0; - $4 = $4 + 4 | 0; - $8 = $8 >>> 0 > $0 >>> 0 ? -1 : ($8 | 0) != ($0 | 0); - if (($8 | 0) == (1 | 0)) { - continue label$5 - } - break label$5; - }; - if (!($8 & 255 | 0)) { - break label$3 - } - } - if (!$2) { - break label$1 - } - $2 = $2 + -1 | 0; - $1 = HEAP32[(($1 + ($7 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - continue label$2; - } - break label$2; - }; - HEAP32[$3 >> 2] = (HEAP32[$3 >> 2] | 0) + 1 | 0; - } - return $0 | 0; - } - - function _ZN12rust_runtime3mem7WAArray8from_ref17hc48303b07ff6a176E($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $12 = 0, $6 = 0, $7 = 0, $10 = 0, $11 = 0, $8 = 0, $5 = 0, $2 = 0, $3 = 0, $4 = 0, $9 = 0, $13 = 0; - $2 = __stack_pointer - 32 | 0; - __stack_pointer = $2; - label$1 : { - label$2 : { - $3 = HEAP32[(0 + 1051808 | 0) >> 2] | 0; - if (!$3) { - break label$2 - } - $4 = HEAP32[(0 + 1051812 | 0) >> 2] | 0; - $5 = $4; - $6 = $3; - label$3 : { - label$4 : while (1) { - $7 = $6 + 44 | 0; - $8 = $6 + 4 | 0; - $9 = HEAPU16[($6 + 182 | 0) >> 1] | 0; - $10 = $9 << 2 | 0; - $11 = -1; - label$5 : { - label$6 : { - label$7 : while (1) { - label$8 : { - if ($10) { - break label$8 - } - $11 = $9; - break label$6; - } - $12 = HEAP32[$8 >> 2] | 0; - $11 = $11 + 1 | 0; - $7 = $7 + 12 | 0; - $10 = $10 + -4 | 0; - $8 = $8 + 4 | 0; - $12 = $12 >>> 0 > $1 >>> 0 ? -1 : ($12 | 0) != ($1 | 0); - if (($12 | 0) == (1 | 0)) { - continue label$7 - } - break label$7; - }; - if (!($12 & 255 | 0)) { - break label$5 - } - } - if (!$5) { - break label$3 - } - $5 = $5 + -1 | 0; - $6 = HEAP32[(($6 + ($11 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - continue label$4; - } - break label$4; - }; - HEAP32[$7 >> 2] = (HEAP32[$7 >> 2] | 0) + 1 | 0; - $4 = HEAP32[(0 + 1051812 | 0) >> 2] | 0; - } - $5 = $4; - $6 = $3; - label$9 : while (1) { - $7 = $6 + 40 | 0; - $8 = $6 + 4 | 0; - $9 = HEAPU16[($6 + 182 | 0) >> 1] | 0; - $10 = $9 << 2 | 0; - $11 = -1; - label$10 : { - label$11 : { - label$12 : while (1) { - label$13 : { - if ($10) { - break label$13 - } - $11 = $9; - break label$11; - } - $12 = HEAP32[$8 >> 2] | 0; - $11 = $11 + 1 | 0; - $7 = $7 + 12 | 0; - $10 = $10 + -4 | 0; - $8 = $8 + 4 | 0; - $12 = $12 >>> 0 > $1 >>> 0 ? -1 : ($12 | 0) != ($1 | 0); - if (($12 | 0) == (1 | 0)) { - continue label$12 - } - break label$12; - }; - if (!($12 & 255 | 0)) { - break label$10 - } - } - if (!$5) { - break label$2 - } - $5 = $5 + -1 | 0; - $6 = HEAP32[(($6 + ($11 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - continue label$9; - } - break label$9; - }; - $10 = HEAP32[($7 + -4 | 0) >> 2] | 0; - if ($10 >>> 0 <= 3 >>> 0) { - break label$1 - } - $13 = (HEAP32[$7 >> 2] | 0) + 8 | 0; - $6 = HEAPU8[$13 >> 0] | 0 | ((HEAPU8[($13 + 1 | 0) >> 0] | 0) << 8 | 0) | 0 | ((HEAPU8[($13 + 2 | 0) >> 0] | 0) << 16 | 0 | ((HEAPU8[($13 + 3 | 0) >> 0] | 0) << 24 | 0) | 0) | 0; - label$14 : { - label$15 : while (1) { - $7 = $3 + 44 | 0; - $8 = $3 + 4 | 0; - $5 = HEAPU16[($3 + 182 | 0) >> 1] | 0; - $10 = $5 << 2 | 0; - $11 = -1; - label$16 : { - label$17 : { - label$18 : while (1) { - label$19 : { - if ($10) { - break label$19 - } - $11 = $5; - break label$17; - } - $12 = HEAP32[$8 >> 2] | 0; - $11 = $11 + 1 | 0; - $7 = $7 + 12 | 0; - $10 = $10 + -4 | 0; - $8 = $8 + 4 | 0; - $12 = $12 >>> 0 > $6 >>> 0 ? -1 : ($12 | 0) != ($6 | 0); - if (($12 | 0) == (1 | 0)) { - continue label$18 - } - break label$18; - }; - if (!($12 & 255 | 0)) { - break label$16 - } - } - if (!$4) { - break label$14 - } - $4 = $4 + -1 | 0; - $3 = HEAP32[(($3 + ($11 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - continue label$15; - } - break label$15; - }; - HEAP32[$7 >> 2] = (HEAP32[$7 >> 2] | 0) + 1 | 0; - } - HEAP32[($0 + 4 | 0) >> 2] = $6; - HEAP32[$0 >> 2] = $1; - __stack_pointer = $2 + 32 | 0; - return; - } - HEAP32[($2 + 24 | 0) >> 2] = 0; - HEAP32[($2 + 12 | 0) >> 2] = 1; - HEAP32[($2 + 8 | 0) >> 2] = 1051224; - HEAP32[($2 + 16 | 0) >> 2] = 4; - HEAP32[($2 + 20 | 0) >> 2] = 0; - _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($2 + 8 | 0 | 0, 1051248 | 0); - wasm2js_trap(); - } - _ZN4core5slice5index24slice_end_index_len_fail17h02d344349d5072f8E(4 | 0, $10 | 0, 1051160 | 0); - wasm2js_trap(); - } - - function _ZN12rust_runtime3mem8WAString3new17h3b4e78424fef5447E($0, $1, $2) { - $0 = $0 | 0; - $1 = $1 | 0; - $2 = $2 | 0; - var $3 = 0, $4 = 0, $5 = 0; - $3 = __stack_pointer - 32 | 0; - __stack_pointer = $3; - $4 = $1 + $2 | 0; - label$1 : { - label$2 : { - if ($2 >>> 0 < 16 >>> 0) { - break label$2 - } - $2 = _ZN4core3str5count14do_count_chars17h03769f4f70ff5154E($1 | 0, $2 | 0) | 0; - break label$1; - } - $2 = _ZN4core3str5count23char_count_general_case17ha75d4189ecacd84eE($1 | 0, $2 | 0) | 0; - } - HEAP32[($3 + 24 | 0) >> 2] = $4; - HEAP32[($3 + 20 | 0) >> 2] = $1; - HEAP32[($3 + 16 | 0) >> 2] = ($3 + 30 | 0) + 2 | 0; - HEAP16[($3 + 30 | 0) >> 1] = $2; - HEAP32[($3 + 12 | 0) >> 2] = $3 + 30 | 0; - _ZN98_$LT$alloc__vec__Vec$LT$T$GT$$u20$as$u20$alloc__vec__spec_from_iter__SpecFromIter$LT$T$C$I$GT$$GT$9from_iter17hace63ed3f33297cdE($3 | 0, $3 + 12 | 0 | 0); - $5 = HEAP32[($3 + 4 | 0) >> 2] | 0; - $4 = HEAP32[($3 + 8 | 0) >> 2] | 0; - $1 = _ZN12rust_runtime3mem6WACell8new_data17h26cb5cb718c9ee73E(1 | 0, $5 | 0, $4 | 0) | 0; - HEAPU8[(0 + 1051325 | 0) >> 0] | 0; - label$3 : { - $2 = __rust_alloc(12 | 0, 1 | 0) | 0; - if (!$2) { - break label$3 - } - HEAP8[($2 + 8 | 0) >> 0] = $4; - HEAP8[($2 + 9 | 0) >> 0] = $4 >>> 8 | 0; - HEAP8[($2 + 10 | 0) >> 0] = $4 >>> 16 | 0; - HEAP8[($2 + 11 | 0) >> 0] = $4 >>> 24 | 0; - HEAP8[($2 + 4 | 0) >> 0] = $1; - HEAP8[($2 + 5 | 0) >> 0] = $1 >>> 8 | 0; - HEAP8[($2 + 6 | 0) >> 0] = $1 >>> 16 | 0; - HEAP8[($2 + 7 | 0) >> 0] = $1 >>> 24 | 0; - HEAP8[$2 >> 0] = $1; - HEAP8[($2 + 1 | 0) >> 0] = $1 >>> 8 | 0; - HEAP8[($2 + 2 | 0) >> 0] = $1 >>> 16 | 0; - HEAP8[($2 + 3 | 0) >> 0] = $1 >>> 24 | 0; - $4 = _ZN12rust_runtime3mem6WACell8new_data17h26cb5cb718c9ee73E(2 | 0, $2 | 0, 12 | 0) | 0; - __rust_dealloc($2 | 0, 12 | 0, 1 | 0); - label$4 : { - $2 = HEAP32[$3 >> 2] | 0; - if (!$2) { - break label$4 - } - __rust_dealloc($5 | 0, $2 | 0, 1 | 0); - } - HEAP32[($0 + 4 | 0) >> 2] = $1; - HEAP32[$0 >> 2] = $4; - __stack_pointer = $3 + 32 | 0; - return; - } - _ZN5alloc7raw_vec12handle_error17h7f22430f64ae98acE(1 | 0, 12 | 0); - wasm2js_trap(); - } - - function _ZN12rust_runtime3mem7log_str17hac61e78d5ba71dcfE($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - var $2 = 0, $4 = 0, $10 = 0, $5 = 0, $7 = 0, $9 = 0, $6 = 0, $3 = 0, $8 = 0; - $2 = __stack_pointer - 32 | 0; - __stack_pointer = $2; - _ZN12rust_runtime3mem8WAString3new17h3b4e78424fef5447E($2 | 0, $0 | 0, $1 | 0); - $3 = HEAP32[($2 + 4 | 0) >> 2] | 0; - $4 = HEAP32[$2 >> 2] | 0; - _ZN12rust_runtime3mem3log17hfd3cd80676177765E($4 | 0); - label$1 : { - $5 = HEAP32[(0 + 1051808 | 0) >> 2] | 0; - if (!$5) { - break label$1 - } - $6 = HEAP32[(0 + 1051812 | 0) >> 2] | 0; - label$2 : { - label$3 : while (1) { - $7 = $5 + 44 | 0; - $0 = $5 + 4 | 0; - $8 = HEAPU16[($5 + 182 | 0) >> 1] | 0; - $1 = $8 << 2 | 0; - $9 = -1; - label$4 : { - label$5 : { - label$6 : while (1) { - label$7 : { - if ($1) { - break label$7 - } - $9 = $8; - break label$5; - } - $10 = HEAP32[$0 >> 2] | 0; - $9 = $9 + 1 | 0; - $7 = $7 + 12 | 0; - $1 = $1 + -4 | 0; - $0 = $0 + 4 | 0; - $10 = $10 >>> 0 > $4 >>> 0 ? -1 : ($10 | 0) != ($4 | 0); - if (($10 | 0) == (1 | 0)) { - continue label$6 - } - break label$6; - }; - if (!($10 & 255 | 0)) { - break label$4 - } - } - if (!$6) { - break label$2 - } - $6 = $6 + -1 | 0; - $5 = HEAP32[(($5 + ($9 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - continue label$3; - } - break label$3; - }; - label$8 : { - $1 = HEAP32[$7 >> 2] | 0; - if ($1 >>> 0 > 1 >>> 0) { - break label$8 - } - HEAP32[($2 + 12 | 0) >> 2] = $4; - _ZN5alloc11collections5btree3map25BTreeMap$LT$K$C$V$C$A$GT$6remove17hc793cbb765ab111dE($2 + 16 | 0 | 0, 1051808 | 0, $2 + 12 | 0 | 0); - if (!(HEAP32[($2 + 16 | 0) >> 2] | 0)) { - break label$2 - } - __rust_dealloc(HEAP32[($2 + 24 | 0) >> 2] | 0 | 0, HEAP32[($2 + 20 | 0) >> 2] | 0 | 0, 1 | 0); - break label$2; - } - HEAP32[$7 >> 2] = $1 + -1 | 0; - } - $4 = HEAP32[(0 + 1051808 | 0) >> 2] | 0; - if (!$4) { - break label$1 - } - $5 = HEAP32[(0 + 1051812 | 0) >> 2] | 0; - label$9 : while (1) { - $7 = $4 + 44 | 0; - $0 = $4 + 4 | 0; - $6 = HEAPU16[($4 + 182 | 0) >> 1] | 0; - $1 = $6 << 2 | 0; - $9 = -1; - label$10 : { - label$11 : { - label$12 : while (1) { - label$13 : { - if ($1) { - break label$13 - } - $9 = $6; - break label$11; - } - $10 = HEAP32[$0 >> 2] | 0; - $9 = $9 + 1 | 0; - $7 = $7 + 12 | 0; - $1 = $1 + -4 | 0; - $0 = $0 + 4 | 0; - $10 = $10 >>> 0 > $3 >>> 0 ? -1 : ($10 | 0) != ($3 | 0); - if (($10 | 0) == (1 | 0)) { - continue label$12 - } - break label$12; - }; - if (!($10 & 255 | 0)) { - break label$10 - } - } - if (!$5) { - break label$1 - } - $5 = $5 + -1 | 0; - $4 = HEAP32[(($4 + ($9 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - continue label$9; - } - break label$9; - }; - label$14 : { - $1 = HEAP32[$7 >> 2] | 0; - if ($1 >>> 0 > 1 >>> 0) { - break label$14 - } - HEAP32[($2 + 12 | 0) >> 2] = $3; - _ZN5alloc11collections5btree3map25BTreeMap$LT$K$C$V$C$A$GT$6remove17hc793cbb765ab111dE($2 + 16 | 0 | 0, 1051808 | 0, $2 + 12 | 0 | 0); - if (!(HEAP32[($2 + 16 | 0) >> 2] | 0)) { - break label$1 - } - __rust_dealloc(HEAP32[($2 + 24 | 0) >> 2] | 0 | 0, HEAP32[($2 + 20 | 0) >> 2] | 0 | 0, 1 | 0); - break label$1; - } - HEAP32[$7 >> 2] = $1 + -1 | 0; - } - __stack_pointer = $2 + 32 | 0; - } - - function execute($0) { - $0 = $0 | 0; - _ZN12rust_runtime3mem7log_str17hac61e78d5ba71dcfE(1051264 | 0, 11 | 0); - return $0 | 0; - } - - function setEnvironment($0) { - $0 = $0 | 0; - var $1 = 0, $2 = 0, $10 = 0, $7 = 0, $9 = 0, $6 = 0, $4 = 0, $5 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, $3 = 0, $8 = 0, i64toi32_i32$4 = 0, i64toi32_i32$3 = 0, $20 = 0, $80 = 0, $82$hi = 0, $85$hi = 0, $86 = 0; - $1 = __stack_pointer - 64 | 0; - __stack_pointer = $1; - _ZN12rust_runtime3mem7WAArray8from_ref17hc48303b07ff6a176E($1 | 0, $0 | 0); - label$1 : { - label$2 : { - $2 = HEAP32[(0 + 1051808 | 0) >> 2] | 0; - if (!$2) { - break label$2 - } - $3 = HEAP32[($1 + 4 | 0) >> 2] | 0; - $4 = HEAP32[$1 >> 2] | 0; - $5 = HEAP32[(0 + 1051812 | 0) >> 2] | 0; - label$3 : while (1) { - $6 = $2 + 36 | 0; - $7 = $2 + 4 | 0; - $8 = HEAPU16[($2 + 182 | 0) >> 1] | 0; - $0 = $8 << 2 | 0; - $9 = -1; - label$4 : { - label$5 : while (1) { - label$6 : { - if ($0) { - break label$6 - } - $9 = $8; - break label$4; - } - $10 = HEAP32[$7 >> 2] | 0; - $9 = $9 + 1 | 0; - $6 = $6 + 12 | 0; - $0 = $0 + -4 | 0; - $7 = $7 + 4 | 0; - $10 = $10 >>> 0 > $3 >>> 0 ? -1 : ($10 | 0) != ($3 | 0); - if (($10 | 0) == (1 | 0)) { - continue label$5 - } - break label$5; - }; - if (!($10 & 255 | 0)) { - break label$1 - } - } - if (!$5) { - break label$2 - } - $5 = $5 + -1 | 0; - $2 = HEAP32[(($2 + ($9 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - continue label$3; - }; - } - HEAP32[($1 + 56 | 0) >> 2] = 0; - HEAP32[($1 + 44 | 0) >> 2] = 1; - HEAP32[($1 + 40 | 0) >> 2] = 1051224; - i64toi32_i32$1 = $1; - i64toi32_i32$0 = 0; - HEAP32[($1 + 48 | 0) >> 2] = 4; - HEAP32[($1 + 52 | 0) >> 2] = i64toi32_i32$0; - _ZN4core9panicking9panic_fmt17hb2f16849466f57b6E($1 + 40 | 0 | 0, 1051232 | 0); - wasm2js_trap(); - } - HEAP32[($1 + 36 | 0) >> 2] = HEAP32[$6 >> 2] | 0; - HEAP32[($1 + 32 | 0) >> 2] = $3; - HEAP32[($1 + 44 | 0) >> 2] = 1; - HEAP32[($1 + 40 | 0) >> 2] = 1051292; - i64toi32_i32$1 = $1; - i64toi32_i32$0 = 0; - HEAP32[($1 + 52 | 0) >> 2] = 1; - HEAP32[($1 + 56 | 0) >> 2] = i64toi32_i32$0; - $80 = $1; - i64toi32_i32$0 = 0; - i64toi32_i32$2 = 28; - i64toi32_i32$1 = 0; - i64toi32_i32$3 = 32; - i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { - i64toi32_i32$1 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - $20 = 0; - } else { - i64toi32_i32$1 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$0 << i64toi32_i32$4 | 0) | 0; - $20 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - } - $82$hi = i64toi32_i32$1; - i64toi32_i32$1 = 0; - $85$hi = i64toi32_i32$1; - i64toi32_i32$1 = $82$hi; - i64toi32_i32$0 = $20; - i64toi32_i32$2 = $85$hi; - i64toi32_i32$3 = $1 + 32 | 0; - i64toi32_i32$2 = i64toi32_i32$1 | i64toi32_i32$2 | 0; - $86 = i64toi32_i32$0 | i64toi32_i32$3 | 0; - i64toi32_i32$0 = $80; - HEAP32[(i64toi32_i32$0 + 24 | 0) >> 2] = $86; - HEAP32[(i64toi32_i32$0 + 28 | 0) >> 2] = i64toi32_i32$2; - HEAP32[($1 + 48 | 0) >> 2] = $1 + 24 | 0; - _ZN5alloc3fmt6format12format_inner17hfada08777d0a48e9E($1 + 12 | 0 | 0, $1 + 40 | 0 | 0); - $0 = HEAP32[($1 + 16 | 0) >> 2] | 0; - _ZN12rust_runtime3mem7log_str17hac61e78d5ba71dcfE($0 | 0, HEAP32[($1 + 20 | 0) >> 2] | 0 | 0); - label$7 : { - $7 = HEAP32[($1 + 12 | 0) >> 2] | 0; - if (!$7) { - break label$7 - } - __rust_dealloc($0 | 0, $7 | 0, 1 | 0); - } - label$8 : { - $2 = HEAP32[(0 + 1051808 | 0) >> 2] | 0; - if (!$2) { - break label$8 - } - $5 = HEAP32[(0 + 1051812 | 0) >> 2] | 0; - label$9 : { - label$10 : while (1) { - $6 = $2 + 44 | 0; - $7 = $2 + 4 | 0; - $8 = HEAPU16[($2 + 182 | 0) >> 1] | 0; - $0 = $8 << 2 | 0; - $9 = -1; - label$11 : { - label$12 : { - label$13 : while (1) { - label$14 : { - if ($0) { - break label$14 - } - $9 = $8; - break label$12; - } - $10 = HEAP32[$7 >> 2] | 0; - $9 = $9 + 1 | 0; - $6 = $6 + 12 | 0; - $0 = $0 + -4 | 0; - $7 = $7 + 4 | 0; - $10 = $10 >>> 0 > $4 >>> 0 ? -1 : ($10 | 0) != ($4 | 0); - if (($10 | 0) == (1 | 0)) { - continue label$13 - } - break label$13; - }; - if (!($10 & 255 | 0)) { - break label$11 - } - } - if (!$5) { - break label$9 - } - $5 = $5 + -1 | 0; - $2 = HEAP32[(($2 + ($9 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - continue label$10; - } - break label$10; - }; - label$15 : { - $0 = HEAP32[$6 >> 2] | 0; - if ($0 >>> 0 > 1 >>> 0) { - break label$15 - } - HEAP32[($1 + 12 | 0) >> 2] = $4; - _ZN5alloc11collections5btree3map25BTreeMap$LT$K$C$V$C$A$GT$6remove17hc793cbb765ab111dE($1 + 40 | 0 | 0, 1051808 | 0, $1 + 12 | 0 | 0); - if (!(HEAP32[($1 + 40 | 0) >> 2] | 0)) { - break label$9 - } - __rust_dealloc(HEAP32[($1 + 48 | 0) >> 2] | 0 | 0, HEAP32[($1 + 44 | 0) >> 2] | 0 | 0, 1 | 0); - break label$9; - } - HEAP32[$6 >> 2] = $0 + -1 | 0; - } - $4 = HEAP32[(0 + 1051808 | 0) >> 2] | 0; - if (!$4) { - break label$8 - } - $2 = HEAP32[(0 + 1051812 | 0) >> 2] | 0; - label$16 : while (1) { - $6 = $4 + 44 | 0; - $7 = $4 + 4 | 0; - $5 = HEAPU16[($4 + 182 | 0) >> 1] | 0; - $0 = $5 << 2 | 0; - $9 = -1; - label$17 : { - label$18 : { - label$19 : while (1) { - label$20 : { - if ($0) { - break label$20 - } - $9 = $5; - break label$18; - } - $10 = HEAP32[$7 >> 2] | 0; - $9 = $9 + 1 | 0; - $6 = $6 + 12 | 0; - $0 = $0 + -4 | 0; - $7 = $7 + 4 | 0; - $10 = $10 >>> 0 > $3 >>> 0 ? -1 : ($10 | 0) != ($3 | 0); - if (($10 | 0) == (1 | 0)) { - continue label$19 - } - break label$19; - }; - if (!($10 & 255 | 0)) { - break label$17 - } - } - if (!$2) { - break label$8 - } - $2 = $2 + -1 | 0; - $4 = HEAP32[(($4 + ($9 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - continue label$16; - } - break label$16; - }; - label$21 : { - $0 = HEAP32[$6 >> 2] | 0; - if ($0 >>> 0 > 1 >>> 0) { - break label$21 - } - HEAP32[($1 + 12 | 0) >> 2] = $3; - _ZN5alloc11collections5btree3map25BTreeMap$LT$K$C$V$C$A$GT$6remove17hc793cbb765ab111dE($1 + 40 | 0 | 0, 1051808 | 0, $1 + 12 | 0 | 0); - if (!(HEAP32[($1 + 40 | 0) >> 2] | 0)) { - break label$8 - } - __rust_dealloc(HEAP32[($1 + 48 | 0) >> 2] | 0 | 0, HEAP32[($1 + 44 | 0) >> 2] | 0 | 0, 1 | 0); - break label$8; - } - HEAP32[$6 >> 2] = $0 + -1 | 0; - } - __stack_pointer = $1 + 64 | 0; - } - - function onDeploy($0) { - $0 = $0 | 0; - _ZN12rust_runtime3mem7log_str17hac61e78d5ba71dcfE(1051300 | 0, 13 | 0); - } - - function __new($0, $1) { - $0 = $0 | 0; - $1 = $1 | 0; - return _ZN12rust_runtime3mem6WACell8new_size17h2ed2900047365a20E($1 | 0, $0 | 0) | 0 | 0; - } - - function __unpin($0) { - $0 = $0 | 0; - var $1 = 0, $8 = 0, $3 = 0, $7 = 0, $2 = 0, $4 = 0, $6 = 0, $5 = 0; - label$1 : { - $1 = HEAP32[(0 + 1051808 | 0) >> 2] | 0; - if (!$1) { - break label$1 - } - $2 = HEAP32[(0 + 1051812 | 0) >> 2] | 0; - label$2 : while (1) { - $3 = $1 + 44 | 0; - $4 = $1 + 4 | 0; - $5 = HEAPU16[($1 + 182 | 0) >> 1] | 0; - $6 = $5 << 2 | 0; - $7 = -1; - label$3 : { - label$4 : { - label$5 : while (1) { - label$6 : { - if ($6) { - break label$6 - } - $7 = $5; - break label$4; - } - $8 = HEAP32[$4 >> 2] | 0; - $7 = $7 + 1 | 0; - $3 = $3 + 12 | 0; - $6 = $6 + -4 | 0; - $4 = $4 + 4 | 0; - $8 = $8 >>> 0 > $0 >>> 0 ? -1 : ($8 | 0) != ($0 | 0); - if (($8 | 0) == (1 | 0)) { - continue label$5 - } - break label$5; - }; - if (!($8 & 255 | 0)) { - break label$3 - } - } - if (!$2) { - break label$1 - } - $2 = $2 + -1 | 0; - $1 = HEAP32[(($1 + ($7 << 2 | 0) | 0) + 184 | 0) >> 2] | 0; - continue label$2; - } - break label$2; - }; - HEAP32[$3 >> 2] = (HEAP32[$3 >> 2] | 0) + -1 | 0; - } - _ZN12rust_runtime3mem7log_str17hac61e78d5ba71dcfE(1051313 | 0, 9 | 0); - } - - function __collect() { - - } - - function _ZN17compiler_builtins3int3mul3Mul3mul17h070e9a1c69faec5bE(var$0, var$0$hi, var$1, var$1$hi) { - var$0 = var$0 | 0; - var$0$hi = var$0$hi | 0; - var$1 = var$1 | 0; - var$1$hi = var$1$hi | 0; - var i64toi32_i32$4 = 0, i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, var$2 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, var$3 = 0, var$4 = 0, var$5 = 0, $21 = 0, $22 = 0, var$6 = 0, $24 = 0, $17 = 0, $18 = 0, $23 = 0, $29 = 0, $45 = 0, $56$hi = 0, $62$hi = 0; - i64toi32_i32$0 = var$1$hi; - var$2 = var$1; - var$4 = var$2 >>> 16 | 0; - i64toi32_i32$0 = var$0$hi; - var$3 = var$0; - var$5 = var$3 >>> 16 | 0; - $17 = Math_imul(var$4, var$5); - $18 = var$2; - i64toi32_i32$2 = var$3; - i64toi32_i32$1 = 0; - i64toi32_i32$3 = 32; - i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { - i64toi32_i32$1 = 0; - $21 = i64toi32_i32$0 >>> i64toi32_i32$4 | 0; - } else { - i64toi32_i32$1 = i64toi32_i32$0 >>> i64toi32_i32$4 | 0; - $21 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$0 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$2 >>> i64toi32_i32$4 | 0) | 0; - } - $23 = $17 + Math_imul($18, $21) | 0; - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$0 = var$1; - i64toi32_i32$2 = 0; - i64toi32_i32$3 = 32; - i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { - i64toi32_i32$2 = 0; - $22 = i64toi32_i32$1 >>> i64toi32_i32$4 | 0; - } else { - i64toi32_i32$2 = i64toi32_i32$1 >>> i64toi32_i32$4 | 0; - $22 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$1 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$0 >>> i64toi32_i32$4 | 0) | 0; - } - $29 = $23 + Math_imul($22, var$3) | 0; - var$2 = var$2 & 65535 | 0; - var$3 = var$3 & 65535 | 0; - var$6 = Math_imul(var$2, var$3); - var$2 = (var$6 >>> 16 | 0) + Math_imul(var$2, var$5) | 0; - $45 = $29 + (var$2 >>> 16 | 0) | 0; - var$2 = (var$2 & 65535 | 0) + Math_imul(var$4, var$3) | 0; - i64toi32_i32$2 = 0; - i64toi32_i32$1 = $45 + (var$2 >>> 16 | 0) | 0; - i64toi32_i32$0 = 0; - i64toi32_i32$3 = 32; - i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { - i64toi32_i32$0 = i64toi32_i32$1 << i64toi32_i32$4 | 0; - $24 = 0; - } else { - i64toi32_i32$0 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$1 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$2 << i64toi32_i32$4 | 0) | 0; - $24 = i64toi32_i32$1 << i64toi32_i32$4 | 0; - } - $56$hi = i64toi32_i32$0; - i64toi32_i32$0 = 0; - $62$hi = i64toi32_i32$0; - i64toi32_i32$0 = $56$hi; - i64toi32_i32$2 = $24; - i64toi32_i32$1 = $62$hi; - i64toi32_i32$3 = var$2 << 16 | 0 | (var$6 & 65535 | 0) | 0; - i64toi32_i32$1 = i64toi32_i32$0 | i64toi32_i32$1 | 0; - i64toi32_i32$2 = i64toi32_i32$2 | i64toi32_i32$3 | 0; - i64toi32_i32$HIGH_BITS = i64toi32_i32$1; - return i64toi32_i32$2 | 0; - } - - function _ZN17compiler_builtins3int4udiv10divmod_u6417h6026910b5ed08e40E(var$0, var$0$hi, var$1, var$1$hi) { - var$0 = var$0 | 0; - var$0$hi = var$0$hi | 0; - var$1 = var$1 | 0; - var$1$hi = var$1$hi | 0; - var i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, i64toi32_i32$4 = 0, i64toi32_i32$1 = 0, i64toi32_i32$0 = 0, i64toi32_i32$5 = 0, var$2 = 0, var$3 = 0, var$4 = 0, var$5 = 0, var$5$hi = 0, var$6 = 0, var$6$hi = 0, i64toi32_i32$6 = 0, $37 = 0, $38 = 0, $39 = 0, $40 = 0, $41 = 0, $42 = 0, $43 = 0, $44 = 0, var$8$hi = 0, $45 = 0, $46 = 0, $47 = 0, $48 = 0, var$7$hi = 0, $49 = 0, $63$hi = 0, $65 = 0, $65$hi = 0, $120$hi = 0, $129$hi = 0, $134$hi = 0, var$8 = 0, $140 = 0, $140$hi = 0, $142$hi = 0, $144 = 0, $144$hi = 0, $151 = 0, $151$hi = 0, $154$hi = 0, var$7 = 0, $165$hi = 0; - label$1 : { - label$2 : { - label$3 : { - label$4 : { - label$5 : { - label$6 : { - label$7 : { - label$8 : { - label$9 : { - label$10 : { - label$11 : { - i64toi32_i32$0 = var$0$hi; - i64toi32_i32$2 = var$0; - i64toi32_i32$1 = 0; - i64toi32_i32$3 = 32; - i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { - i64toi32_i32$1 = 0; - $37 = i64toi32_i32$0 >>> i64toi32_i32$4 | 0; - } else { - i64toi32_i32$1 = i64toi32_i32$0 >>> i64toi32_i32$4 | 0; - $37 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$0 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$2 >>> i64toi32_i32$4 | 0) | 0; - } - var$2 = $37; - if (var$2) { - i64toi32_i32$1 = var$1$hi; - var$3 = var$1; - if (!var$3) { - break label$11 - } - i64toi32_i32$0 = var$3; - i64toi32_i32$2 = 0; - i64toi32_i32$3 = 32; - i64toi32_i32$4 = i64toi32_i32$3 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$3 & 63 | 0) >>> 0) { - i64toi32_i32$2 = 0; - $38 = i64toi32_i32$1 >>> i64toi32_i32$4 | 0; - } else { - i64toi32_i32$2 = i64toi32_i32$1 >>> i64toi32_i32$4 | 0; - $38 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$1 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$0 >>> i64toi32_i32$4 | 0) | 0; - } - var$4 = $38; - if (!var$4) { - break label$9 - } - var$2 = Math_clz32(var$4) - Math_clz32(var$2) | 0; - if (var$2 >>> 0 <= 31 >>> 0) { - break label$8 - } - break label$2; - } - i64toi32_i32$2 = var$1$hi; - i64toi32_i32$1 = var$1; - i64toi32_i32$0 = 1; - i64toi32_i32$3 = 0; - if (i64toi32_i32$2 >>> 0 > i64toi32_i32$0 >>> 0 | ((i64toi32_i32$2 | 0) == (i64toi32_i32$0 | 0) & i64toi32_i32$1 >>> 0 >= i64toi32_i32$3 >>> 0 | 0) | 0) { - break label$2 - } - i64toi32_i32$1 = var$0$hi; - var$2 = var$0; - i64toi32_i32$1 = i64toi32_i32$2; - i64toi32_i32$1 = i64toi32_i32$2; - var$3 = var$1; - var$2 = (var$2 >>> 0) / (var$3 >>> 0) | 0; - i64toi32_i32$1 = 0; - __wasm_intrinsics_temp_i64 = var$0 - Math_imul(var$2, var$3) | 0; - __wasm_intrinsics_temp_i64$hi = i64toi32_i32$1; - i64toi32_i32$1 = 0; - i64toi32_i32$2 = var$2; - i64toi32_i32$HIGH_BITS = i64toi32_i32$1; - return i64toi32_i32$2 | 0; - } - i64toi32_i32$2 = var$1$hi; - i64toi32_i32$3 = var$1; - i64toi32_i32$1 = 0; - i64toi32_i32$0 = 32; - i64toi32_i32$4 = i64toi32_i32$0 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$0 & 63 | 0) >>> 0) { - i64toi32_i32$1 = 0; - $39 = i64toi32_i32$2 >>> i64toi32_i32$4 | 0; - } else { - i64toi32_i32$1 = i64toi32_i32$2 >>> i64toi32_i32$4 | 0; - $39 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$2 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$3 >>> i64toi32_i32$4 | 0) | 0; - } - var$3 = $39; - i64toi32_i32$1 = var$0$hi; - if (!var$0) { - break label$7 - } - if (!var$3) { - break label$6 - } - var$4 = var$3 + -1 | 0; - if (var$4 & var$3 | 0) { - break label$6 - } - i64toi32_i32$1 = 0; - i64toi32_i32$2 = var$4 & var$2 | 0; - i64toi32_i32$3 = 0; - i64toi32_i32$0 = 32; - i64toi32_i32$4 = i64toi32_i32$0 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$0 & 63 | 0) >>> 0) { - i64toi32_i32$3 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - $40 = 0; - } else { - i64toi32_i32$3 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$1 << i64toi32_i32$4 | 0) | 0; - $40 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - } - $63$hi = i64toi32_i32$3; - i64toi32_i32$3 = var$0$hi; - i64toi32_i32$1 = var$0; - i64toi32_i32$2 = 0; - i64toi32_i32$0 = -1; - i64toi32_i32$2 = i64toi32_i32$3 & i64toi32_i32$2 | 0; - $65 = i64toi32_i32$1 & i64toi32_i32$0 | 0; - $65$hi = i64toi32_i32$2; - i64toi32_i32$2 = $63$hi; - i64toi32_i32$3 = $40; - i64toi32_i32$1 = $65$hi; - i64toi32_i32$0 = $65; - i64toi32_i32$1 = i64toi32_i32$2 | i64toi32_i32$1 | 0; - __wasm_intrinsics_temp_i64 = i64toi32_i32$3 | i64toi32_i32$0 | 0; - __wasm_intrinsics_temp_i64$hi = i64toi32_i32$1; - i64toi32_i32$1 = 0; - i64toi32_i32$3 = var$2 >>> ((__wasm_ctz_i32(var$3 | 0) | 0) & 31 | 0) | 0; - i64toi32_i32$HIGH_BITS = i64toi32_i32$1; - return i64toi32_i32$3 | 0; - } - } - var$4 = var$3 + -1 | 0; - if (!(var$4 & var$3 | 0)) { - break label$5 - } - var$2 = (Math_clz32(var$3) + 33 | 0) - Math_clz32(var$2) | 0; - var$3 = 0 - var$2 | 0; - break label$3; - } - var$3 = 63 - var$2 | 0; - var$2 = var$2 + 1 | 0; - break label$3; - } - var$4 = (var$2 >>> 0) / (var$3 >>> 0) | 0; - i64toi32_i32$3 = 0; - i64toi32_i32$2 = var$2 - Math_imul(var$4, var$3) | 0; - i64toi32_i32$1 = 0; - i64toi32_i32$0 = 32; - i64toi32_i32$4 = i64toi32_i32$0 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$0 & 63 | 0) >>> 0) { - i64toi32_i32$1 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - $41 = 0; - } else { - i64toi32_i32$1 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$3 << i64toi32_i32$4 | 0) | 0; - $41 = i64toi32_i32$2 << i64toi32_i32$4 | 0; - } - __wasm_intrinsics_temp_i64 = $41; - __wasm_intrinsics_temp_i64$hi = i64toi32_i32$1; - i64toi32_i32$1 = 0; - i64toi32_i32$2 = var$4; - i64toi32_i32$HIGH_BITS = i64toi32_i32$1; - return i64toi32_i32$2 | 0; - } - var$2 = Math_clz32(var$3) - Math_clz32(var$2) | 0; - if (var$2 >>> 0 < 31 >>> 0) { - break label$4 - } - break label$2; - } - i64toi32_i32$2 = var$0$hi; - i64toi32_i32$2 = 0; - __wasm_intrinsics_temp_i64 = var$4 & var$0 | 0; - __wasm_intrinsics_temp_i64$hi = i64toi32_i32$2; - if ((var$3 | 0) == (1 | 0)) { - break label$1 - } - i64toi32_i32$2 = var$0$hi; - i64toi32_i32$2 = 0; - $120$hi = i64toi32_i32$2; - i64toi32_i32$2 = var$0$hi; - i64toi32_i32$3 = var$0; - i64toi32_i32$1 = $120$hi; - i64toi32_i32$0 = __wasm_ctz_i32(var$3 | 0) | 0; - i64toi32_i32$4 = i64toi32_i32$0 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$0 & 63 | 0) >>> 0) { - i64toi32_i32$1 = 0; - $42 = i64toi32_i32$2 >>> i64toi32_i32$4 | 0; - } else { - i64toi32_i32$1 = i64toi32_i32$2 >>> i64toi32_i32$4 | 0; - $42 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$2 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$3 >>> i64toi32_i32$4 | 0) | 0; - } - i64toi32_i32$3 = $42; - i64toi32_i32$HIGH_BITS = i64toi32_i32$1; - return i64toi32_i32$3 | 0; - } - var$3 = 63 - var$2 | 0; - var$2 = var$2 + 1 | 0; - } - i64toi32_i32$3 = var$0$hi; - i64toi32_i32$3 = 0; - $129$hi = i64toi32_i32$3; - i64toi32_i32$3 = var$0$hi; - i64toi32_i32$2 = var$0; - i64toi32_i32$1 = $129$hi; - i64toi32_i32$0 = var$2 & 63 | 0; - i64toi32_i32$4 = i64toi32_i32$0 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$0 & 63 | 0) >>> 0) { - i64toi32_i32$1 = 0; - $43 = i64toi32_i32$3 >>> i64toi32_i32$4 | 0; - } else { - i64toi32_i32$1 = i64toi32_i32$3 >>> i64toi32_i32$4 | 0; - $43 = (((1 << i64toi32_i32$4 | 0) - 1 | 0) & i64toi32_i32$3 | 0) << (32 - i64toi32_i32$4 | 0) | 0 | (i64toi32_i32$2 >>> i64toi32_i32$4 | 0) | 0; - } - var$5 = $43; - var$5$hi = i64toi32_i32$1; - i64toi32_i32$1 = var$0$hi; - i64toi32_i32$1 = 0; - $134$hi = i64toi32_i32$1; - i64toi32_i32$1 = var$0$hi; - i64toi32_i32$3 = var$0; - i64toi32_i32$2 = $134$hi; - i64toi32_i32$0 = var$3 & 63 | 0; - i64toi32_i32$4 = i64toi32_i32$0 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$0 & 63 | 0) >>> 0) { - i64toi32_i32$2 = i64toi32_i32$3 << i64toi32_i32$4 | 0; - $44 = 0; - } else { - i64toi32_i32$2 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$3 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$1 << i64toi32_i32$4 | 0) | 0; - $44 = i64toi32_i32$3 << i64toi32_i32$4 | 0; - } - var$0 = $44; - var$0$hi = i64toi32_i32$2; - label$13 : { - if (var$2) { - i64toi32_i32$2 = var$1$hi; - i64toi32_i32$1 = var$1; - i64toi32_i32$3 = -1; - i64toi32_i32$0 = -1; - i64toi32_i32$4 = i64toi32_i32$1 + i64toi32_i32$0 | 0; - i64toi32_i32$5 = i64toi32_i32$2 + i64toi32_i32$3 | 0; - if (i64toi32_i32$4 >>> 0 < i64toi32_i32$0 >>> 0) { - i64toi32_i32$5 = i64toi32_i32$5 + 1 | 0 - } - var$8 = i64toi32_i32$4; - var$8$hi = i64toi32_i32$5; - label$15 : while (1) { - i64toi32_i32$5 = var$5$hi; - i64toi32_i32$2 = var$5; - i64toi32_i32$1 = 0; - i64toi32_i32$0 = 1; - i64toi32_i32$3 = i64toi32_i32$0 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$0 & 63 | 0) >>> 0) { - i64toi32_i32$1 = i64toi32_i32$2 << i64toi32_i32$3 | 0; - $45 = 0; - } else { - i64toi32_i32$1 = ((1 << i64toi32_i32$3 | 0) - 1 | 0) & (i64toi32_i32$2 >>> (32 - i64toi32_i32$3 | 0) | 0) | 0 | (i64toi32_i32$5 << i64toi32_i32$3 | 0) | 0; - $45 = i64toi32_i32$2 << i64toi32_i32$3 | 0; - } - $140 = $45; - $140$hi = i64toi32_i32$1; - i64toi32_i32$1 = var$0$hi; - i64toi32_i32$5 = var$0; - i64toi32_i32$2 = 0; - i64toi32_i32$0 = 63; - i64toi32_i32$3 = i64toi32_i32$0 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$0 & 63 | 0) >>> 0) { - i64toi32_i32$2 = 0; - $46 = i64toi32_i32$1 >>> i64toi32_i32$3 | 0; - } else { - i64toi32_i32$2 = i64toi32_i32$1 >>> i64toi32_i32$3 | 0; - $46 = (((1 << i64toi32_i32$3 | 0) - 1 | 0) & i64toi32_i32$1 | 0) << (32 - i64toi32_i32$3 | 0) | 0 | (i64toi32_i32$5 >>> i64toi32_i32$3 | 0) | 0; - } - $142$hi = i64toi32_i32$2; - i64toi32_i32$2 = $140$hi; - i64toi32_i32$1 = $140; - i64toi32_i32$5 = $142$hi; - i64toi32_i32$0 = $46; - i64toi32_i32$5 = i64toi32_i32$2 | i64toi32_i32$5 | 0; - var$5 = i64toi32_i32$1 | i64toi32_i32$0 | 0; - var$5$hi = i64toi32_i32$5; - $144 = var$5; - $144$hi = i64toi32_i32$5; - i64toi32_i32$5 = var$8$hi; - i64toi32_i32$5 = var$5$hi; - i64toi32_i32$5 = var$8$hi; - i64toi32_i32$2 = var$8; - i64toi32_i32$1 = var$5$hi; - i64toi32_i32$0 = var$5; - i64toi32_i32$3 = i64toi32_i32$2 - i64toi32_i32$0 | 0; - i64toi32_i32$6 = i64toi32_i32$2 >>> 0 < i64toi32_i32$0 >>> 0; - i64toi32_i32$4 = i64toi32_i32$6 + i64toi32_i32$1 | 0; - i64toi32_i32$4 = i64toi32_i32$5 - i64toi32_i32$4 | 0; - i64toi32_i32$5 = i64toi32_i32$3; - i64toi32_i32$2 = 0; - i64toi32_i32$0 = 63; - i64toi32_i32$1 = i64toi32_i32$0 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$0 & 63 | 0) >>> 0) { - i64toi32_i32$2 = i64toi32_i32$4 >> 31 | 0; - $47 = i64toi32_i32$4 >> i64toi32_i32$1 | 0; - } else { - i64toi32_i32$2 = i64toi32_i32$4 >> i64toi32_i32$1 | 0; - $47 = (((1 << i64toi32_i32$1 | 0) - 1 | 0) & i64toi32_i32$4 | 0) << (32 - i64toi32_i32$1 | 0) | 0 | (i64toi32_i32$5 >>> i64toi32_i32$1 | 0) | 0; - } - var$6 = $47; - var$6$hi = i64toi32_i32$2; - i64toi32_i32$2 = var$1$hi; - i64toi32_i32$2 = var$6$hi; - i64toi32_i32$4 = var$6; - i64toi32_i32$5 = var$1$hi; - i64toi32_i32$0 = var$1; - i64toi32_i32$5 = i64toi32_i32$2 & i64toi32_i32$5 | 0; - $151 = i64toi32_i32$4 & i64toi32_i32$0 | 0; - $151$hi = i64toi32_i32$5; - i64toi32_i32$5 = $144$hi; - i64toi32_i32$2 = $144; - i64toi32_i32$4 = $151$hi; - i64toi32_i32$0 = $151; - i64toi32_i32$1 = i64toi32_i32$2 - i64toi32_i32$0 | 0; - i64toi32_i32$6 = i64toi32_i32$2 >>> 0 < i64toi32_i32$0 >>> 0; - i64toi32_i32$3 = i64toi32_i32$6 + i64toi32_i32$4 | 0; - i64toi32_i32$3 = i64toi32_i32$5 - i64toi32_i32$3 | 0; - var$5 = i64toi32_i32$1; - var$5$hi = i64toi32_i32$3; - i64toi32_i32$3 = var$0$hi; - i64toi32_i32$5 = var$0; - i64toi32_i32$2 = 0; - i64toi32_i32$0 = 1; - i64toi32_i32$4 = i64toi32_i32$0 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$0 & 63 | 0) >>> 0) { - i64toi32_i32$2 = i64toi32_i32$5 << i64toi32_i32$4 | 0; - $48 = 0; - } else { - i64toi32_i32$2 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$5 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$3 << i64toi32_i32$4 | 0) | 0; - $48 = i64toi32_i32$5 << i64toi32_i32$4 | 0; - } - $154$hi = i64toi32_i32$2; - i64toi32_i32$2 = var$7$hi; - i64toi32_i32$2 = $154$hi; - i64toi32_i32$3 = $48; - i64toi32_i32$5 = var$7$hi; - i64toi32_i32$0 = var$7; - i64toi32_i32$5 = i64toi32_i32$2 | i64toi32_i32$5 | 0; - var$0 = i64toi32_i32$3 | i64toi32_i32$0 | 0; - var$0$hi = i64toi32_i32$5; - i64toi32_i32$5 = var$6$hi; - i64toi32_i32$2 = var$6; - i64toi32_i32$3 = 0; - i64toi32_i32$0 = 1; - i64toi32_i32$3 = i64toi32_i32$5 & i64toi32_i32$3 | 0; - var$6 = i64toi32_i32$2 & i64toi32_i32$0 | 0; - var$6$hi = i64toi32_i32$3; - var$7 = var$6; - var$7$hi = i64toi32_i32$3; - var$2 = var$2 + -1 | 0; - if (var$2) { - continue label$15 - } - break label$15; - }; - break label$13; - } - } - i64toi32_i32$3 = var$5$hi; - __wasm_intrinsics_temp_i64 = var$5; - __wasm_intrinsics_temp_i64$hi = i64toi32_i32$3; - i64toi32_i32$3 = var$0$hi; - i64toi32_i32$5 = var$0; - i64toi32_i32$2 = 0; - i64toi32_i32$0 = 1; - i64toi32_i32$4 = i64toi32_i32$0 & 31 | 0; - if (32 >>> 0 <= (i64toi32_i32$0 & 63 | 0) >>> 0) { - i64toi32_i32$2 = i64toi32_i32$5 << i64toi32_i32$4 | 0; - $49 = 0; - } else { - i64toi32_i32$2 = ((1 << i64toi32_i32$4 | 0) - 1 | 0) & (i64toi32_i32$5 >>> (32 - i64toi32_i32$4 | 0) | 0) | 0 | (i64toi32_i32$3 << i64toi32_i32$4 | 0) | 0; - $49 = i64toi32_i32$5 << i64toi32_i32$4 | 0; - } - $165$hi = i64toi32_i32$2; - i64toi32_i32$2 = var$6$hi; - i64toi32_i32$2 = $165$hi; - i64toi32_i32$3 = $49; - i64toi32_i32$5 = var$6$hi; - i64toi32_i32$0 = var$6; - i64toi32_i32$5 = i64toi32_i32$2 | i64toi32_i32$5 | 0; - i64toi32_i32$3 = i64toi32_i32$3 | i64toi32_i32$0 | 0; - i64toi32_i32$HIGH_BITS = i64toi32_i32$5; - return i64toi32_i32$3 | 0; - } - i64toi32_i32$3 = var$0$hi; - __wasm_intrinsics_temp_i64 = var$0; - __wasm_intrinsics_temp_i64$hi = i64toi32_i32$3; - i64toi32_i32$3 = 0; - var$0 = 0; - var$0$hi = i64toi32_i32$3; - } - i64toi32_i32$3 = var$0$hi; - i64toi32_i32$5 = var$0; - i64toi32_i32$HIGH_BITS = i64toi32_i32$3; - return i64toi32_i32$5 | 0; - } - - function __wasm_ctz_i32(var$0) { - var$0 = var$0 | 0; - if (var$0) { - return 31 - Math_clz32((var$0 + -1 | 0) ^ var$0 | 0) | 0 | 0 - } - return 32 | 0; - } - - function __wasm_i64_mul(var$0, var$0$hi, var$1, var$1$hi) { - var$0 = var$0 | 0; - var$0$hi = var$0$hi | 0; - var$1 = var$1 | 0; - var$1$hi = var$1$hi | 0; - var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0; - i64toi32_i32$0 = var$0$hi; - i64toi32_i32$0 = var$1$hi; - i64toi32_i32$0 = var$0$hi; - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$1 = _ZN17compiler_builtins3int3mul3Mul3mul17h070e9a1c69faec5bE(var$0 | 0, i64toi32_i32$0 | 0, var$1 | 0, i64toi32_i32$1 | 0) | 0; - i64toi32_i32$0 = i64toi32_i32$HIGH_BITS; - i64toi32_i32$HIGH_BITS = i64toi32_i32$0; - return i64toi32_i32$1 | 0; - } - - function __wasm_i64_udiv(var$0, var$0$hi, var$1, var$1$hi) { - var$0 = var$0 | 0; - var$0$hi = var$0$hi | 0; - var$1 = var$1 | 0; - var$1$hi = var$1$hi | 0; - var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0; - i64toi32_i32$0 = var$0$hi; - i64toi32_i32$0 = var$1$hi; - i64toi32_i32$0 = var$0$hi; - i64toi32_i32$1 = var$1$hi; - i64toi32_i32$1 = _ZN17compiler_builtins3int4udiv10divmod_u6417h6026910b5ed08e40E(var$0 | 0, i64toi32_i32$0 | 0, var$1 | 0, i64toi32_i32$1 | 0) | 0; - i64toi32_i32$0 = i64toi32_i32$HIGH_BITS; - i64toi32_i32$HIGH_BITS = i64toi32_i32$0; - return i64toi32_i32$1 | 0; - } - - function __wasm_rotl_i32(var$0, var$1) { - var$0 = var$0 | 0; - var$1 = var$1 | 0; - var var$2 = 0; - var$2 = var$1 & 31 | 0; - var$1 = (0 - var$1 | 0) & 31 | 0; - return ((-1 >>> var$2 | 0) & var$0 | 0) << var$2 | 0 | (((-1 << var$1 | 0) & var$0 | 0) >>> var$1 | 0) | 0 | 0; - } - - bufferView = HEAPU8; - initActiveSegments(imports); - var FUNCTION_TABLE = [null, _ZN4core3fmt3num3imp52_$LT$impl$u20$core__fmt__Display$u20$for$u20$u32$GT$3fmt17h5732d357c58d2b36E, _ZN3std5alloc24default_alloc_error_hook17h708687752e0edcfaE, _ZN4core3ptr42drop_in_place$LT$alloc__string__String$GT$17hb5bccdeece555eeeE, _ZN58_$LT$alloc__string__String$u20$as$u20$core__fmt__Write$GT$9write_str17h9c2d3e9aafc08637E, _ZN58_$LT$alloc__string__String$u20$as$u20$core__fmt__Write$GT$10write_char17h9231f70fbd335441E, _ZN4core3fmt5Write9write_fmt17h44df5905957d3a1fE, _ZN36_$LT$T$u20$as$u20$core__any__Any$GT$7type_id17h698f49bbed3b63dfE, _ZN36_$LT$T$u20$as$u20$core__any__Any$GT$7type_id17h1116370b49193673E, _ZN92_$LT$std__panicking__begin_panic_handler__StaticStrPayload$u20$as$u20$core__fmt__Display$GT$3fmt17h7d6d1d4c62b643baE, _ZN99_$LT$std__panicking__begin_panic_handler__StaticStrPayload$u20$as$u20$core__panic__PanicPayload$GT$8take_box17hdbb807c1367ee940E, _ZN99_$LT$std__panicking__begin_panic_handler__StaticStrPayload$u20$as$u20$core__panic__PanicPayload$GT$3get17hd2f9ef478e42b077E, _ZN99_$LT$std__panicking__begin_panic_handler__StaticStrPayload$u20$as$u20$core__panic__PanicPayload$GT$6as_str17h231eb7cfbc685441E, _ZN4core3ptr77drop_in_place$LT$std__panicking__begin_panic_handler__FormatStringPayload$GT$17hec524af3f69d5a53E, _ZN95_$LT$std__panicking__begin_panic_handler__FormatStringPayload$u20$as$u20$core__fmt__Display$GT$3fmt17h778dceefa8ea4afeE, _ZN102_$LT$std__panicking__begin_panic_handler__FormatStringPayload$u20$as$u20$core__panic__PanicPayload$GT$8take_box17hfdafd7cd188838afE, _ZN102_$LT$std__panicking__begin_panic_handler__FormatStringPayload$u20$as$u20$core__panic__PanicPayload$GT$3get17h3875705a18b9af03E, _ZN4core5panic12PanicPayload6as_str17hd887f5dc9940e8f0E, _ZN4core3ptr42drop_in_place$LT$alloc__string__String$GT$17h0f9d5bab53e46359E, _ZN58_$LT$alloc__string__String$u20$as$u20$core__fmt__Write$GT$9write_str17h9c2d3e9aafc08637E_52, _ZN58_$LT$alloc__string__String$u20$as$u20$core__fmt__Write$GT$10write_char17h9231f70fbd335441E_53, _ZN4core3fmt5Write9write_fmt17h12c6d34f0ecf8d3dE, _ZN53_$LT$core__fmt__Error$u20$as$u20$core__fmt__Debug$GT$3fmt17hc7b9dec108bfb98cE, _ZN42_$LT$$RF$T$u20$as$u20$core__fmt__Debug$GT$3fmt17h02f2c499cdd866a1E, _ZN44_$LT$$RF$T$u20$as$u20$core__fmt__Display$GT$3fmt17h0e730352ba1d2064E, _ZN68_$LT$core__fmt__builders__PadAdapter$u20$as$u20$core__fmt__Write$GT$9write_str17hcef790f9881e69b1E, _ZN68_$LT$core__fmt__builders__PadAdapter$u20$as$u20$core__fmt__Write$GT$10write_char17h8982d69464cb262aE, _ZN4core3fmt5Write9write_fmt17h7b710d0d35de0c2bE, _ZN42_$LT$$RF$T$u20$as$u20$core__fmt__Debug$GT$3fmt17h48376aecd7558ddcE, _ZN42_$LT$$RF$T$u20$as$u20$core__fmt__Debug$GT$3fmt17hc2f10bc6239b2f43E]; - function __wasm_memory_size() { - return buffer.byteLength / 65536 | 0; - } - - function __wasm_memory_grow(pagesToAdd) { - pagesToAdd = pagesToAdd | 0; - var oldPages = __wasm_memory_size() | 0; - var newPages = oldPages + pagesToAdd | 0; - if ((oldPages < newPages) && (newPages < 65536)) { - var newBuffer = new ArrayBuffer(Math_imul(newPages, 65536)); - var newHEAP8 = new Int8Array(newBuffer); - newHEAP8.set(HEAP8); - HEAP8 = new Int8Array(newBuffer); - HEAP16 = new Int16Array(newBuffer); - HEAP32 = new Int32Array(newBuffer); - HEAPU8 = new Uint8Array(newBuffer); - HEAPU16 = new Uint16Array(newBuffer); - HEAPU32 = new Uint32Array(newBuffer); - HEAPF32 = new Float32Array(newBuffer); - HEAPF64 = new Float64Array(newBuffer); - buffer = newBuffer; - bufferView = HEAPU8; - } - return oldPages; - } - - return { - "memory": Object.create(Object.prototype, { - "grow": { - "value": __wasm_memory_grow - }, - "buffer": { - "get": function () { - return buffer; - } - - } - }), - "execute": execute, - "setEnvironment": setEnvironment, - "onDeploy": onDeploy, - "__new": __new, - "__unpin": __unpin, - "__collect": __collect, - "__pin": _ZN12rust_runtime3mem8WABuffer8from_ref17hd15e58422a800be2E, - "__data_end": { - get value() { - return global$1; - }, - set value(_global$1) { - global$1 = _global$1; - } - }, - "__heap_base": { - get value() { - return global$2; - }, - set value(_global$2) { - global$2 = _global$2; - } - } - }; -} - -var retasmFunc = asmFunc({ - "env": env, -}); -export var memory = retasmFunc.memory; -export var execute = retasmFunc.execute; -export var setEnvironment = retasmFunc.setEnvironment; -export var onDeploy = retasmFunc.onDeploy; -export var __new = retasmFunc.__new; -export var __unpin = retasmFunc.__unpin; -export var __collect = retasmFunc.__collect; -export var __pin = retasmFunc.__pin; -export var __data_end = retasmFunc.__data_end; -export var __heap_base = retasmFunc.__heap_base; diff --git a/.cargo/config b/example/.cargo/config.toml similarity index 100% rename from .cargo/config rename to example/.cargo/config.toml diff --git a/example/Cargo.lock b/example/Cargo.lock deleted file mode 100644 index dd554d5..0000000 --- a/example/Cargo.lock +++ /dev/null @@ -1,181 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "example" -version = "0.1.0" -dependencies = [ - "rust_runtime", - "wasm-bindgen", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "proc-macro2" -version = "1.0.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rust_runtime" -version = "0.1.0" - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "serde" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.132" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "syn" -version = "2.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "wasm-bindgen" -version = "0.2.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" -dependencies = [ - "cfg-if", - "once_cell", - "serde", - "serde_json", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" diff --git a/example/Cargo.toml b/example/Cargo.toml index ddec4b8..9fd7511 100644 --- a/example/Cargo.toml +++ b/example/Cargo.toml @@ -1,17 +1,22 @@ [package] name = "example" -version = "0.1.0" -edition = "2021" +version = { workspace = true } +edition = { workspace = true } [lib] crate-type = ["cdylib"] [profile.release] +opt-level = "s" # or "s" for size-speed balance +lto = true # Link Time Optimization for smaller binary +codegen-units = 1 # Ensures code is optimized across the board +panic = "abort" # Avoids including panic runtime support strip = true [dependencies] -rust_runtime = {path="../"} -hex = "0.4.3" -wasm_allocator = "0.1.1" +lol_alloc = { workspace = true } +rust_runtime = { workspace = true } +sha2-const = {workspace = true } + [features] diff --git a/example/src/contract.rs b/example/src/contract.rs new file mode 100644 index 0000000..ec10809 --- /dev/null +++ b/example/src/contract.rs @@ -0,0 +1,312 @@ +use alloc::rc::Rc; +use core::{cell::RefCell, ops::Add}; +use rust_runtime::{ + blockchain::{AddressHash, Environment}, + contract::op_20::Pointer, + ethnum::u256, + math::abi::encode_selector_const, + storage::{ + map::Map, + multi_address_map::MultiAddressMemoryMap, + stored::{StoredTrait, StoredU256, StoredU8}, + stored_map::{StoredAddresValueMap, StoredMap}, + StorageValue, + }, + types::{CallData, Selector}, + Context, ContractTrait, OP20Trait, +}; + +const SELECTOR_AIRDROP: Selector = encode_selector_const("airdrop(address)"); +const SELECTOR_AIRDROP_WITH_AMOUNT: Selector = + encode_selector_const("airdropWithAmount(address, address[]"); +const SELECTOR_MINT: Selector = encode_selector_const("mint(address,uint256)"); + +pub struct Contract { + environment: Option, + params: rust_runtime::contract::op_20::OP20Params, + nonce_map: StoredMap, + balance_of_map: StoredMap, + allowance_map: MultiAddressMemoryMap, + total_supply: StoredU256, + context: Rc, +} +impl Contract { + pub fn new(context: Rc) -> Self { + Self { + environment: None, + params: rust_runtime::contract::op_20::OP20Params { + max_supply: StoredU256::new_const( + context.clone(), + Pointer::MaxSupply.u16(), + u256::new(100000000000000000000000000), + ), + decimals: StoredU8::new_const(context.clone(), Pointer::Decimals.u16(), 18), + name: "MyToken", + symbol: "TOKEN", + }, + nonce_map: StoredMap::new(context.clone(), Pointer::NonceMap.u16(), u256::ZERO), + balance_of_map: StoredMap::new( + context.clone(), + Pointer::BalanceOfMap.u16(), + u256::ZERO, + ), + allowance_map: MultiAddressMemoryMap::new( + context.clone(), + Pointer::AllowanceMap.u16(), + StorageValue::ZERO, + ), + total_supply: StoredU256::new_const( + context.clone(), + Pointer::TotalSupply.u16(), + u256::ZERO, + ), + context, + } + } +} + +impl Contract { + fn execute( + &mut self, + selector: Selector, + mut call_data: CallData, + ) -> Result { + match selector { + SELECTOR_MINT => { + let address = call_data.read_address()?; + let amount = call_data.read_u256(true)?; + + self.mint(address, amount) + } + SELECTOR_AIRDROP => { + let drops = call_data.read_address_value_map()?; + + self.airdrop(drops) + } + SELECTOR_AIRDROP_WITH_AMOUNT => self.airdrop_with_amount(call_data), + _ => OP20Trait::execute_base(self, selector, call_data), + } + } + + fn mint( + &mut self, + address: AddressHash, + amount: u256, + ) -> Result { + let caller = self.environment().caller; + self.only_deployer(&caller)?; + + let mut result = rust_runtime::cursor::Cursor::new(1); + + result.write_bool(self.mint_base(&address, amount, false)?)?; + + return Ok(result); + } + + fn airdrop( + &mut self, + drops: Map, + ) -> Result { + let sender = self.environment().caller; + self.only_deployer(&sender)?; + + for (address, amount) in drops.iter() { + self.mint_base(address, amount.clone(), false)?; + } + + let mut cursor = rust_runtime::cursor::Cursor::new(1); + cursor.write_bool(true)?; + + Ok(cursor) + } + + fn optimized_mint( + &mut self, + address: AddressHash, + amount: u256, + ) -> Result<(), rust_runtime::error::Error> { + self.balance_of_map.set(&address, amount); + let value = self.total_supply.value() + amount; + self.total_supply.set_no_commit(value); + + self.create_mint_event(address, amount)?; + + Ok(()) + } + + fn airdrop_with_amount( + &mut self, + mut call_data: CallData, + ) -> Result { + let sender = self.environment().caller; + self.only_deployer(&sender)?; + let amount = call_data.read_u256(true)?; + let amount_of_addresses: u32 = call_data.read_u32(true)?; + + for _ in 0..amount_of_addresses { + let address = call_data.read_address()?; + self.optimized_mint(address, amount)?; + } + + self.total_supply.commit(); + + let mut cursor = rust_runtime::cursor::Cursor::new(1); + cursor.write_bool(true)?; + Ok(cursor) + } +} + +impl rust_runtime::contract::op_20::OP20Trait for Contract { + fn params(&mut self) -> &mut rust_runtime::OP20Params { + &mut self.params + } + + fn total_supply(&mut self) -> &mut StoredU256 { + &mut self.total_supply + } + + fn allowance_map(&mut self) -> &mut MultiAddressMemoryMap { + &mut self.allowance_map + } + + fn balance_of_map(&mut self) -> &mut StoredMap { + &mut self.balance_of_map + } + + fn nonce_map(&mut self) -> &mut StoredMap { + &mut self.nonce_map + } +} + +impl rust_runtime::contract::ContractTrait for Contract { + fn environment(&mut self) -> &Environment { + if self.environment.is_none() { + self.environment = Some(self.context().environment()); + } + self.environment.as_ref().unwrap() + } + + fn context(&self) -> Rc { + self.context.clone() + } + + fn execute( + &mut self, + mut call_data: CallData, + ) -> Result { + let selector = call_data.read_selector()?; + + Contract::execute(self, selector, call_data) + } + + fn on_deploy(&mut self, _call_data: CallData) {} +} + +// To run the tests, run `cargo test -p example` in the root of the workspace +#[cfg(test)] +mod tests { + use core::cell::RefCell; + + use crate::contract::SELECTOR_MINT; + use alloc::rc::Rc; + use rust_runtime::{ + contract::op_20::{ + SELECTOR_BALANCE_OF, SELECTOR_NAME, SELECTOR_SYMBOL, SELECTOR_TOTAL_SUPPLY, + }, + cursor::Cursor, + ethnum::u256, + global::call, + tests::{execute, execute_address, execute_address_amount}, + OP20Trait, + }; + + fn context() -> Rc { + Rc::new(rust_runtime::env::TestContext::default()) + } + + #[test] + fn test_contract_name() { + let context = context(); + let mut contract = super::Contract::new(context); + let mut result = contract.execute(SELECTOR_NAME, Cursor::new(0)).unwrap(); + assert_eq!(contract.params.name, result.read_string_with_len().unwrap()); + } + + #[test] + fn test_contract_symbol() { + let context = context(); + let mut contract = super::Contract::new(context); + let mut result = contract.execute(SELECTOR_SYMBOL, Cursor::new(0)).unwrap(); + assert_eq!( + contract.params.symbol, + result.read_string_with_len().unwrap() + ); + } + + #[test] + fn test_contract_mint() { + let router = Rc::new(RefCell::new(rust_runtime::env::TestRouter::new())); + + let contract_address = rust_runtime::tests::random_address(); + let address = rust_runtime::tests::random_address(); + let amount = u256::new(10000000); + let environment = rust_runtime::blockchain::Environment { + contract_deployer: address.clone(), + contract_address, + caller: address.clone(), + ..Default::default() + }; + let context = rust_runtime::env::TestContext { + environment, + ..Default::default() + }; + + router.borrow_mut().push( + contract_address, + alloc::boxed::Box::new(super::Contract::new(Rc::new(context.clone()))), + ); + + let mut call_data = Cursor::new(68); + call_data.write_selector(&SELECTOR_MINT).unwrap(); + call_data.write_address(&address).unwrap(); + call_data.write_u256(&amount, true).unwrap(); + + let mut result = router.borrow().call(contract_address, call_data); + assert_eq!(result.read_bool().unwrap(), true); + + let mut call_data = Cursor::new(36); + call_data.write_selector(&SELECTOR_BALANCE_OF).unwrap(); + call_data.write_address(&address).unwrap(); + + let mut result = router.borrow_mut().call(contract_address, call_data); + assert_eq!(result.read_u256(true).unwrap(), amount); + } + + #[test] + fn test_contract_total_supply() { + let context = context(); + let mut contract = super::Contract::new(context); + + let address = rust_runtime::tests::random_address(); + + contract.environment = Some(rust_runtime::blockchain::Environment { + contract_deployer: address.clone(), + caller: address.clone(), + ..Default::default() + }); + let amount = u256::new(10000000); + + let mut result = contract + .execute(SELECTOR_TOTAL_SUPPLY, Cursor::new(0)) + .unwrap(); + assert_eq!(result.read_u256(true).unwrap(), 0); + + let mut result = contract.mint(address.clone(), amount).unwrap(); + assert_eq!(result.read_bool().unwrap(), true); + + let mut result = contract + .execute(SELECTOR_TOTAL_SUPPLY, Cursor::new(0)) + .unwrap(); + assert_eq!(result.read_u256(true).unwrap(), amount); + } +} diff --git a/example/src/lib.rs b/example/src/lib.rs index 7188407..cc78906 100644 --- a/example/src/lib.rs +++ b/example/src/lib.rs @@ -1 +1,30 @@ -use rust_runtime; +#![no_std] +extern crate alloc; + +#[allow(unused_imports)] +use alloc::rc::Rc; + +#[allow(unused_imports)] +use core::cell::RefCell; + +#[allow(unused_imports)] +pub mod contract; + +#[cfg(target_arch = "wasm32")] +use lol_alloc::LeakingPageAllocator; + +#[cfg(target_arch = "wasm32")] +#[global_allocator] +static ALLOCATOR: LeakingPageAllocator = LeakingPageAllocator; + +#[cfg(target_arch = "wasm32")] +#[export_name = "start"] +pub unsafe fn start() { + use rust_runtime::env::global::GlobalContext; + use rust_runtime::Context; + let context = Rc::new(GlobalContext::new()); + + rust_runtime::CONTRACT = Some(Rc::new(RefCell::new(crate::contract::Contract::new( + context, + )))); +} diff --git a/rust-toolchain b/rust-toolchain index bf867e0..c3889eb 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1,4 @@ -nightly +[toolchain] +channel = "nightly" +components = [ "rustfmt", "clippy" ] +targets = [ "wasm32-unknown-unknown" ] diff --git a/rust.wasm b/rust.wasm new file mode 100644 index 0000000..9bcbf12 Binary files /dev/null and b/rust.wasm differ diff --git a/src/allocator.rs b/src/allocator.rs deleted file mode 100644 index 95a7c3d..0000000 --- a/src/allocator.rs +++ /dev/null @@ -1,69 +0,0 @@ -use core::slice; -use std::{alloc::System, io::Write}; - -pub struct WaAllocator; - -pub struct WaCell { - /* - pub mm_info: usize, - pub gc_info1: usize, - pub gc_info2: usize, - */ - pub rt_id: u32, - pub rt_size: u32, -} - -impl WaAllocator { - fn layout(layout: std::alloc::Layout) -> std::alloc::Layout { - unsafe { - std::alloc::Layout::from_size_align_unchecked( - layout.size() + std::mem::size_of::(), - layout.align(), - ) - } - } - unsafe fn write_header(ptr: *mut u8, id: u32, size: usize) { - slice::from_raw_parts_mut(ptr, 4) - .write(&id.to_le_bytes()) - .unwrap(); - slice::from_raw_parts_mut(ptr.wrapping_add(4), 4) - .write(&(size as u32).to_le_bytes()) - .unwrap(); - } -} - -unsafe impl std::alloc::GlobalAlloc for WaAllocator { - unsafe fn alloc(&self, layout: std::alloc::Layout) -> *mut u8 { - let size = layout.size(); - let layout = WaAllocator::layout(layout); - let ptr = System.alloc(layout); - WaAllocator::write_header(ptr, 1, size); - - ptr.wrapping_add(std::mem::size_of::()) - } - - unsafe fn alloc_zeroed(&self, layout: std::alloc::Layout) -> *mut u8 { - let size = layout.size(); - let layout = WaAllocator::layout(layout); - let ptr = System.alloc_zeroed(layout); - WaAllocator::write_header(ptr, 1, size); - - ptr.wrapping_add(std::mem::size_of::()) - } - - unsafe fn dealloc(&self, ptr: *mut u8, layout: std::alloc::Layout) { - let layout = WaAllocator::layout(layout); - System.dealloc(ptr.wrapping_sub(std::mem::size_of::()), layout); - } - - unsafe fn realloc(&self, ptr: *mut u8, layout: std::alloc::Layout, new_size: usize) -> *mut u8 { - let layout = WaAllocator::layout(layout); - System - .realloc( - ptr.wrapping_sub(std::mem::size_of::()), - layout, - new_size + std::mem::size_of::(), - ) - .wrapping_add(std::mem::size_of::()) - } -} diff --git a/src/blockchain/address.rs b/src/blockchain/address.rs new file mode 100644 index 0000000..908d978 --- /dev/null +++ b/src/blockchain/address.rs @@ -0,0 +1,47 @@ +use crate::{storage::StorageKey, AsBytes, FromBytes, ToHex, WaPtr}; + +#[derive(Clone, Copy, Eq, PartialEq, Debug)] +#[repr(transparent)] +pub struct AddressHash(pub [u8; crate::constant::ADDRESS_BYTE_LENGTH]); + +impl AsBytes for AddressHash { + fn as_bytes(&self) -> &[u8] { + &self.0 + } +} + +impl AsBytes for &AddressHash { + fn as_bytes(&self) -> &[u8] { + &self.0 + } +} + +impl FromBytes for AddressHash { + fn from_bytes(bytes: &[u8]) -> Self { + Self(bytes.try_into().unwrap()) + } +} + +impl ToHex for AddressHash {} +impl ToHex for &AddressHash {} + +impl From for StorageKey { + fn from(val: AddressHash) -> Self { + StorageKey::new(val.0) + } +} + +impl AddressHash { + pub const DEAD: AddressHash = AddressHash([ + 40, 74, 228, 172, 219, 50, 169, 155, 163, 235, 250, 102, 169, 29, 219, 65, 167, 183, 161, + 210, 254, 244, 21, 57, 153, 34, 205, 138, 4, 72, 92, 2, + ]); + pub const EMPTY: AddressHash = AddressHash([0; crate::constant::ADDRESS_BYTE_LENGTH]); + pub const fn new(bytes: [u8; crate::constant::ADDRESS_BYTE_LENGTH]) -> Self { + Self(bytes) + } + + pub fn ptr(&self) -> WaPtr { + WaPtr::from(&self.0) + } +} diff --git a/src/blockchain/block.rs b/src/blockchain/block.rs new file mode 100644 index 0000000..227c63c --- /dev/null +++ b/src/blockchain/block.rs @@ -0,0 +1,22 @@ +use crate::{AsBytes, FromBytes, ToHex}; + +#[derive(Clone, Copy)] +#[repr(transparent)] +pub struct BlockHash([u8; crate::constant::BLOCK_HASH_BYTE_LENGTH]); +impl BlockHash { + pub const EMPTY: BlockHash = BlockHash([0; crate::constant::BLOCK_HASH_BYTE_LENGTH]); +} + +impl AsBytes for BlockHash { + fn as_bytes(&self) -> &[u8] { + &self.0 + } +} + +impl FromBytes for BlockHash { + fn from_bytes(bytes: &[u8]) -> Self { + Self(bytes.try_into().unwrap()) + } +} + +impl ToHex for BlockHash {} diff --git a/src/blockchain/environment.rs b/src/blockchain/environment.rs new file mode 100644 index 0000000..8c4e4ac --- /dev/null +++ b/src/blockchain/environment.rs @@ -0,0 +1,62 @@ +use crate::WaPtr; + +use super::AddressHash; +use crate::{AsBytes, ToHex}; + +#[derive(Clone, Copy)] +pub struct Environment { + pub block_hash: super::BlockHash, + pub block_number: u64, + pub block_median_time: u64, + pub transaction_hash: super::TransactionHash, + + pub contract_address: super::AddressHash, + pub contract_deployer: super::AddressHash, + pub caller: super::AddressHash, + pub origin: super::AddressHash, +} + +impl Environment { + pub fn ptr(&self) -> WaPtr { + WaPtr(self as *const Environment as u32) + } +} + +#[allow(dead_code)] +#[cfg(not(target_arch = "wasm32"))] +mod display { + use crate::utils::ToHex; + use core::fmt::Display; + + impl Display for super::Environment { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.debug_struct("Environment") + .field("block_hash", &self.block_hash.to_hex()) + .field("block_number", &self.block_number) + .field("block_median_time", &self.block_median_time) + .field("transaction_hash", &self.transaction_hash.to_hex()) + .field("contract_address", &self.contract_address.to_hex()) + .field("contract_deployer", &self.contract_deployer.to_hex()) + .field("caller", &self.caller.to_hex()) + .field("origin", &self.origin.to_hex()) + .finish() + } + } +} + +#[allow(dead_code)] +#[cfg(not(target_arch = "wasm32"))] +impl Default for Environment { + fn default() -> Self { + Environment { + block_hash: crate::tests::random_block(), + block_number: crate::tests::random_u64(), + block_median_time: crate::tests::random_u64(), + transaction_hash: crate::tests::random_transaction(), + contract_address: crate::tests::random_address(), + contract_deployer: crate::tests::random_address(), + caller: crate::tests::random_address(), + origin: crate::tests::random_address(), + } + } +} diff --git a/src/blockchain/mod.rs b/src/blockchain/mod.rs new file mode 100644 index 0000000..c045bb6 --- /dev/null +++ b/src/blockchain/mod.rs @@ -0,0 +1,9 @@ +pub mod address; +pub mod block; +pub mod environment; +pub mod transaction; + +pub use address::AddressHash; +pub use block::BlockHash; +pub use environment::Environment; +pub use transaction::{Input, Output, Transaction, TransactionHash}; diff --git a/src/blockchain/transaction.rs b/src/blockchain/transaction.rs new file mode 100644 index 0000000..7b4f480 --- /dev/null +++ b/src/blockchain/transaction.rs @@ -0,0 +1,42 @@ +use crate::{AsBytes, FromBytes, ToHex}; + +#[derive(Clone, Copy, Debug)] +#[repr(transparent)] +pub struct TransactionHash([u8; crate::constant::TRANSACTION_HASH_BYTE_LENGTH]); +impl TransactionHash { + pub const EMPTY: TransactionHash = + TransactionHash([0; crate::constant::TRANSACTION_HASH_BYTE_LENGTH]); +} +impl AsBytes for TransactionHash { + fn as_bytes(&self) -> &[u8] { + &self.0 + } +} + +impl FromBytes for TransactionHash { + fn from_bytes(bytes: &[u8]) -> Self { + Self(bytes.try_into().unwrap()) + } +} +impl ToHex for TransactionHash {} + +#[derive(Clone, Debug)] +pub struct Transaction { + pub sender: super::AddressHash, + pub origin: super::AddressHash, + pub hash: TransactionHash, +} + +#[derive(Clone, Debug)] +pub struct Output { + pub index: u8, + pub script_pub_key: [u8; 32], + pub value: u64, +} + +#[derive(Clone, Debug)] +pub struct Input { + pub tx_id: [u8; 32], + pub output_index: u8, + pub script_sig: u8, +} diff --git a/src/constant.rs b/src/constant.rs index d61d6a1..580286e 100644 --- a/src/constant.rs +++ b/src/constant.rs @@ -1 +1,13 @@ -pub const ADDRESS_BYTE_LENGTH: usize = 32; +pub const HASH_BYTE_LENGTH: usize = 32; +pub const U256_BYTE_LENGTH: usize = 32; +pub const U64_BYTE_LENGTH: usize = 8; +pub const BOOLEAN_BYTE_LENGTH: usize = 1; +pub const ADDRESS_BYTE_LENGTH: usize = HASH_BYTE_LENGTH; +pub const TRANSACTION_HASH_BYTE_LENGTH: usize = HASH_BYTE_LENGTH; +pub const BLOCK_HASH_BYTE_LENGTH: usize = HASH_BYTE_LENGTH; +pub const STORE_KEY_BYTE_LENGTH: usize = HASH_BYTE_LENGTH; +pub const STORE_VALUE_BYTE_LENGTH: usize = U256_BYTE_LENGTH; +pub const ENVIRONMENT_BYTE_LENGTH: usize = 208; +pub const SCHNORR_SIGNATURE_BYTE_LENGTH: usize = 64; +pub const SCHNORR_MESSAGE_BYTE_LENGTH: usize = 32; +pub const DEBUG: bool = true; diff --git a/src/contract/mod.rs b/src/contract/mod.rs new file mode 100644 index 0000000..3f3edcf --- /dev/null +++ b/src/contract/mod.rs @@ -0,0 +1,123 @@ +use alloc::rc::Rc; +use alloc::vec::Vec; +use core::{cell::RefCell, ptr::hash}; + +use crate::{ + blockchain::{AddressHash, Environment}, + cursor::Cursor, + storage::{StorageKey, StorageValue}, + types::CallData, + Context, +}; +pub mod op_20; + +pub trait ContractTrait { + fn context(&self) -> Rc; + + fn environment(&mut self) -> &Environment; + + #[inline] + fn is_self(&mut self, address: &AddressHash) -> bool { + address.eq(&self.environment().contract_address) + } + + #[inline] + fn only_deployer(&mut self, caller: &AddressHash) -> Result<(), crate::error::Error> { + if self.environment().contract_deployer.ne(caller) { + Err(crate::error::Error::OnlyOwner) + } else { + Ok(()) + } + } + + #[inline] + fn on_deploy(&mut self, _call_data: CallData) { + self.context().log("On Deploy is not implemented"); + } + + #[inline] + fn execute(&mut self, _call_data: CallData) -> Result { + self.context().log("Execute is not implemented"); + unimplemented!("Execute needs to be implemented"); + } + + #[inline] + fn log(&self, text: &str) { + self.context().log(text); + } + + #[inline] + fn emit(&self, event: &dyn crate::event::EventTrait) { + self.context().emit(event); + } + + #[inline] + fn call( + &self, + address: &crate::blockchain::AddressHash, + data: crate::cursor::Cursor, + ) -> Cursor { + self.context().call(address, data) + } + + #[inline] + fn load(&self, pointer: &StorageKey) -> Option { + self.context().load(pointer) + } + + #[inline] + fn store(&self, pointer: StorageKey, value: StorageValue) { + self.context().store(pointer, value) + } + + #[inline] + fn exists(&self, pointer: &StorageKey) -> bool { + self.context().exists(pointer) + } + + #[inline] + fn encode_address(&self, address: &str) -> &'static [u8] { + self.context().encode_address(address) + } + + #[inline] + fn validate_bitcoin_address(&self, address: &str) -> Result { + self.context().validate_bitcoin_address(address) + } + + #[inline] + fn verify_schnorr_signature( + &self, + address: &AddressHash, + signature: &[u8], + message: &[u8], + ) -> Result { + self.context() + .verify_schnorr_signature(address, signature, message) + } + + #[inline] + fn sha256(&self, data: &[u8]) -> [u8; 32] { + self.context().sha256(data) + } + + #[inline] + fn sha256_double(&self, data: &[u8]) -> [u8; 32] { + self.context().sha256_double(data) + } + + #[inline] + fn ripemd160(&self, data: &[u8]) -> [u8; 20] { + self.context().ripemd160(data) + } + + #[inline] + fn inputs(&self) -> Vec { + self.context().inputs() + } + + #[inline] + fn outputs(&self) -> Vec { + self.context().outputs() + } +} diff --git a/src/contract/op_20.rs b/src/contract/op_20.rs new file mode 100644 index 0000000..f6cd751 --- /dev/null +++ b/src/contract/op_20.rs @@ -0,0 +1,581 @@ +use core::ops::Add; + +use alloc::format; +use ethnum::u256; + +use crate::{ + blockchain::AddressHash, + constant::{ADDRESS_BYTE_LENGTH, BOOLEAN_BYTE_LENGTH, U256_BYTE_LENGTH}, + cursor::{self, Cursor}, + error::Error, + math::abi::encode_selector_const, + storage::{ + multi_address_map::MultiAddressMemoryMap, + stored::{StoredTrait, StoredU256, StoredU8}, + stored_map::StoredMap, + }, + types::{CallData, Selector}, + AsBytes, ToHex, +}; + +pub struct OP20Params { + pub max_supply: StoredU256, + pub decimals: StoredU8, + pub name: &'static str, + pub symbol: &'static str, +} + +#[repr(u16)] +pub enum Pointer { + NonceMap = 1, + MaxSupply, + Decimals, + String, + TotalSupply, + AllowanceMap, + BalanceOfMap, +} + +impl Pointer { + pub const fn u16(self) -> u16 { + self as u16 + } +} + +pub const SELECTOR_OWNER: Selector = encode_selector_const("owner"); +pub const SELECTOR_DEPLOYER: Selector = encode_selector_const("deployer"); +pub const SELECTOR_DECIMALS: Selector = encode_selector_const("decimals"); +pub const SELECTOR_NAME: Selector = encode_selector_const("name"); +pub const SELECTOR_SYMBOL: Selector = encode_selector_const("symbol"); +pub const SELECTOR_TOTAL_SUPPLY: Selector = encode_selector_const("totalSupply"); +pub const SELECTOR_MAXIMUM_SUPPLY: Selector = encode_selector_const("maximumSupply"); +pub const SELECTOR_ALLOWANCE: Selector = encode_selector_const("allowance"); +pub const SELECTOR_APPROVE: Selector = encode_selector_const("approve(address,uint256)"); +pub const SELECTOR_APPROVE_FROM: Selector = + encode_selector_const("approveFrom(address,uint256,uint256,bytes)"); +pub const SELECTOR_BALANCE_OF: Selector = encode_selector_const("balanceOf(address)"); +pub const SELECTOR_BURN: Selector = encode_selector_const("burn(uint256)"); +pub const SELECTOR_TRANSFER: Selector = encode_selector_const("transfer(address,uint256)"); +pub const SELECTOR_TRANSFER_FROM: Selector = + encode_selector_const("transferFrom(address,address,uint256)"); +pub const SELECTOR_NONCE_OF: Selector = encode_selector_const("nonceOf(address)"); + +pub trait OP20Trait: super::ContractTrait { + fn execute_base( + &mut self, + selector: Selector, + mut call_data: CallData, + ) -> Result { + match selector { + SELECTOR_DEPLOYER => { + let mut cursor = Cursor::new(ADDRESS_BYTE_LENGTH); + cursor.write_address(&self.environment().contract_deployer)?; + Ok(cursor) + } + SELECTOR_OWNER => { + let mut cursor = Cursor::new(ADDRESS_BYTE_LENGTH); + cursor.write_address(&self.environment().contract_deployer)?; + Ok(cursor) + } + SELECTOR_DECIMALS => { + let mut cursor = Cursor::new(1); + cursor.write_u8(self.decimals())?; + Ok(cursor) + } + SELECTOR_NAME => { + let name = self.name(); + let mut cursor = Cursor::new(name.len() + 2); + cursor.write_string_with_len(name)?; + Ok(cursor) + } + SELECTOR_SYMBOL => { + let symbol = self.symbol(); + + let mut cursor = Cursor::new(symbol.len() + 2); + cursor.write_string_with_len(symbol)?; + Ok(cursor) + } + SELECTOR_TOTAL_SUPPLY => { + let mut cursor = Cursor::new(32); + cursor.write_u256(&self.total_supply().value(), true)?; + Ok(cursor) + } + SELECTOR_MAXIMUM_SUPPLY => { + let mut cursor = Cursor::new(32); + cursor.write_u256(&self.max_supply(), true)?; + Ok(cursor) + } + SELECTOR_ALLOWANCE => { + let address_owner = call_data.read_address()?; + let address_spender = call_data.read_address()?; + + self.allowance(&address_owner, &address_spender) + } + SELECTOR_APPROVE => { + let owner = self.environment().caller; + let spender = call_data.read_address()?; + let value = call_data.read_u256(true)?; + + self.approve(owner, spender, value) + } + SELECTOR_APPROVE_FROM => { + let owner = self.environment().origin; + let spender = call_data.read_address()?; + let value = call_data.read_u256(true)?; + let nonce = call_data.read_u256(true)?; + let signature = call_data.read_bytes_with_length(true)?; + + self.approve_from(owner, spender, value, nonce, signature) + } + SELECTOR_NONCE_OF => { + let owner = call_data.read_address()?; + self.nonce_of(owner) + } + SELECTOR_BALANCE_OF => { + let address = call_data.read_address()?; + + self.balance_of(address) + } + + SELECTOR_BURN => { + let amount = call_data.read_u256(true)?; + + self.burn(amount) + } + + SELECTOR_TRANSFER => { + let address = call_data.read_address()?; + let amount = call_data.read_u256(true)?; + self.transfer(address, amount) + } + + SELECTOR_TRANSFER_FROM => { + let address_from = call_data.read_address()?; + let address_to = call_data.read_address()?; + let amount = call_data.read_u256(true)?; + + self.transfer_from(address_from, address_to, amount) + } + + _ => Err(crate::error::Error::UnknownSelector), + } + } + fn execute( + &mut self, + selector: Selector, + call_data: crate::types::CallData, + ) -> Result { + self.execute_base(selector, call_data) + } + + fn params(&mut self) -> &mut OP20Params; + fn total_supply(&mut self) -> &mut StoredU256; + + fn max_supply(&mut self) -> u256 { + self.params().max_supply.value() + } + fn decimals(&mut self) -> u8 { + self.params().decimals.value() + } + + fn name(&mut self) -> &'static str { + self.params().name + } + fn symbol(&mut self) -> &'static str { + self.params().symbol + } + + fn allowance_map(&mut self) -> &mut MultiAddressMemoryMap; + fn balance_of_map(&mut self) -> &mut StoredMap; + fn nonce_map(&mut self) -> &mut StoredMap; + + #[inline] + fn allowance_base(&mut self, owner: &AddressHash, spender: &AddressHash) -> u256 { + let mut sender_map = self.allowance_map().get(owner); + sender_map.get(&spender).u256() + } + + #[inline] + fn allowance( + &mut self, + owner: &AddressHash, + spender: &AddressHash, + ) -> Result { + let mut cursor = Cursor::new(32); + let allowance = self.allowance_base(&owner, &spender); + cursor.write_u256(&allowance, true)?; + Ok(cursor) + } + + #[inline] + fn approve_base( + &mut self, + owner: AddressHash, + spender: AddressHash, + amount: u256, + ) -> Result { + if AddressHash::DEAD.eq(&owner) { + return Err(crate::error::Error::Revert( + "Address con not be dead address", + )); + } + + if AddressHash::DEAD.eq(&spender) { + return Err(crate::error::Error::Revert( + "Address con not be dead address", + )); + } + + self.allowance_map() + .get(&owner) + .set(&spender, amount.into()); + + self.create_approve_event(owner, spender, amount)?; + Ok(true) + } + + #[inline] + fn approve( + &mut self, + owner: AddressHash, + spender: AddressHash, + amount: u256, + ) -> Result { + let mut cursor = Cursor::new(BOOLEAN_BYTE_LENGTH); + cursor.write_bool(self.approve_base(owner, spender, amount)?)?; + Ok(cursor) + } + + #[inline] + fn approve_from_base( + &mut self, + owner: &AddressHash, + spender: &AddressHash, + value: &u256, + nonce: &u256, + signature: &[u8], + ) -> Result { + if AddressHash::DEAD.eq(owner) { + return Err(crate::error::Error::DeadAddress); + } + + if AddressHash::DEAD.eq(spender) { + return Err(crate::error::Error::DeadAddress); + } + + let stored_nonce = self.nonce_map().get(owner); + if stored_nonce.eq(nonce) { + return Err(crate::error::Error::Revert( + "Invalid nonce (possible replay or out-of-sync)", + )); + } + + let mut data = Cursor::new(ADDRESS_BYTE_LENGTH * 2 + 2 * U256_BYTE_LENGTH); + data.write_address(owner)?; + data.write_address(spender)?; + data.write_u256(&value, true)?; + data.write_u256(&nonce, true)?; + + let hash = self.context().sha256(data.into_inner()); + if !self + .context() + .verify_schnorr_signature(owner, signature, &hash)? + { + return Err(crate::error::Error::Revert( + "ApproveFrom: Invalid signature", + )); + } + + let mut sender_map = self.allowance_map().get(owner); + sender_map.set(&spender, (*value).into()); + + self.create_approve_event(*owner, *spender, *value)?; + + Ok(true) + } + + #[inline] + fn approve_from( + &mut self, + owner: AddressHash, + spender: AddressHash, + value: u256, + nonce: u256, + signature: &[u8], + ) -> Result { + if owner == spender { + return Err(Error::Revert( + "Direct owner approval detected. Use approve function instead of approveFrom.", + )); + } + + if signature.len() != 64 { + return Err(Error::Revert("Invalid signature length")); + } + + let mut response = Cursor::new(BOOLEAN_BYTE_LENGTH); + response + .write_bool(self.approve_from_base(&owner, &spender, &value, &nonce, signature)?)?; + Ok(response) + } + + #[inline] + fn nonce_of(&mut self, owner: AddressHash) -> Result { + let nonce = self.nonce_map().get(&owner); + let mut response = Cursor::new(U256_BYTE_LENGTH); + response.write_u256(&nonce, true)?; + Ok(response) + } + + #[inline] + fn balance_of_base(&mut self, address: &AddressHash) -> u256 { + self.balance_of_map().get(address) + } + + #[inline] + fn balance_of( + &mut self, + address: AddressHash, + ) -> Result { + let mut result = Cursor::new(U256_BYTE_LENGTH); + + let balance = self.balance_of_base(&address); + + result.write_u256(&balance, true)?; + Ok(result) + } + + #[inline] + fn burn_base(&mut self, value: u256, only_deployer: bool) -> Result { + if value.eq(&u256::ZERO) { + return Err(crate::error::Error::NoTokens); + } + + let caller = self.environment().caller; + if only_deployer { + self.only_deployer(&caller)?; + } + + let total_supply = self.total_supply().value(); + if total_supply < value { + return Err(Error::Revert("Insufficient total supply.")); + } + + if !self.balance_of_map().contains_key(&caller) { + return Err(crate::error::Error::Revert("No balance")); + } + + let balance: u256 = self.balance_of_map().get(&caller); + if balance < value { + return Err(Error::Revert("Insufficient balance")); + } + + let new_balance = balance - value; + self.balance_of_map().set(&caller, new_balance); + let value = self.total_supply().set(total_supply - value); + + self.create_burn_event(value)?; + + Ok(true) + } + + #[inline] + fn burn(&mut self, amount: u256) -> Result { + let mut response = Cursor::new(1); + + response.write_bool(self.burn_base(amount, true)?)?; + Ok(response) + } + + #[inline] + fn mint_base( + &mut self, + to: &AddressHash, + value: u256, + only_deployer: bool, + ) -> Result { + if only_deployer { + let caller = self.environment().caller; + self.only_deployer(&caller)?; + } + + if !self.balance_of_map().contains_key(to) { + self.balance_of_map().set(to, value); + } else { + let to_balance = self.balance_of_map().get(to); + self.balance_of_map().set(to, to_balance + value); + } + + let old = self.total_supply().value(); + let new = old + value; + + if new > self.max_supply() { + return Err(Error::Revert("Max supply reached")); + } + self.total_supply().set(new); + self.create_mint_event(*to, value)?; + self.context() + .log(&format!("Minted! {}: {}", to.to_hex(), value)); + Ok(true) + } + + #[inline] + fn transfer_base( + &mut self, + to: &AddressHash, + value: &u256, + ) -> Result { + let caller = self.environment().caller; + if self.is_self(&caller) { + return Err(Error::Revert("Can not transfer from self account")); + } + + if u256::ZERO.eq(value) { + return Err(Error::Revert("Cannot transfer 0 tokens")); + } + + let balance = self.balance_of_map().get(&caller); + + if balance.lt(value) { + return Err(Error::Revert("Insufficient balance")); + } + let new_balance = balance - value; + self.balance_of_map().set(&caller, new_balance); + + let balance = self.balance_of_map().get(to); + let new_balance = balance + value; + self.balance_of_map().set(to, new_balance); + + self.create_transfer_event(caller, *to, *value)?; + Ok(true) + } + + #[inline] + fn transfer( + &mut self, + address: AddressHash, + amount: u256, + ) -> Result { + let mut result = Cursor::new(1); + + result.write_bool(self.transfer_base(&address, &amount)?)?; + Ok(result) + } + + #[inline] + fn spend_allowance( + &mut self, + owner: &AddressHash, + spender: &AddressHash, + value: u256, + ) -> Result<(), crate::error::Error> { + let mut owner_allowance_map = self.allowance_map().get(owner); + let allowed: u256 = owner_allowance_map.get(&spender).u256(); + + if allowed < value { + return Err(crate::error::Error::InsufficientAllowance); + } + + let new_allowance = allowed - value; + owner_allowance_map.set(&spender, new_allowance.into()); + self.allowance_map().set(*owner, owner_allowance_map); + Ok(()) + } + + #[inline] + fn transfer_from_unsafe( + &mut self, + from: &AddressHash, + to: &AddressHash, + value: u256, + ) -> Result { + let balance: u256 = self.balance_of_map().get(from); + if balance < value { + return Err(crate::error::Error::InsufficientBalance); + } + + let new_balance = balance - value; + self.balance_of_map().set(from, new_balance); + + if !self.balance_of_map().contains_key(to) { + self.balance_of_map().set(to, value); + } else { + let to_balance: u256 = self.balance_of_map().get(to); + let new_to_balance = to_balance + value; + self.balance_of_map().set(to, new_to_balance); + } + + self.create_transfer_event(*from, *to, value)?; + + Ok(true) + } + + #[inline] + fn transfer_from_base( + &mut self, + from: &AddressHash, + to: &AddressHash, + value: u256, + ) -> Result { + if AddressHash::DEAD.eq(from) || AddressHash::DEAD.eq(to) { + return Err(crate::error::Error::DeadAddress); + } + + let sender = self.environment().caller; + + self.spend_allowance(from, &sender, value)?; + self.transfer_from_unsafe(from, to, value)?; + Ok(true) + } + + #[inline] + fn transfer_from( + &mut self, + address_from: AddressHash, + address_to: AddressHash, + amount: u256, + ) -> Result { + let mut result = Cursor::new(BOOLEAN_BYTE_LENGTH); + result.write_bool(self.transfer_from_base(&address_from, &address_to, amount)?)?; + Ok(result) + } + + #[inline] + fn create_burn_event(&mut self, value: u256) -> Result<(), crate::error::Error> { + let burn_event = crate::event::Event::burn(value)?; + self.emit(&burn_event); + Ok(()) + } + + fn create_approve_event( + &self, + deployer: AddressHash, + spender: AddressHash, + value: u256, + ) -> Result<(), crate::error::Error> { + let approve_event = crate::event::Event::approve(deployer, spender, value)?; + self.emit(&approve_event); + Ok(()) + } + + fn create_mint_event( + &mut self, + deployer: AddressHash, + amount: u256, + ) -> Result<(), crate::error::Error> { + let mint_event = crate::event::Event::mint(deployer, amount)?; + self.emit(&mint_event); + Ok(()) + } + + fn create_transfer_event( + &mut self, + from: AddressHash, + to: AddressHash, + amount: u256, + ) -> Result<(), crate::error::Error> { + let transfer_event = crate::event::Event::transfer(from, to, amount)?; + self.emit(&transfer_event); + Ok(()) + } +} diff --git a/src/cursor/mod.rs b/src/cursor/mod.rs new file mode 100644 index 0000000..64c49aa --- /dev/null +++ b/src/cursor/mod.rs @@ -0,0 +1,102 @@ +use core::alloc::Layout; + +use ::alloc::alloc::alloc; + +use crate::WaPtr; + +pub mod reader; +pub mod writer; + +pub struct Cursor { + inner: &'static mut [u8], + reader: usize, + writer: usize, +} + +impl Clone for Cursor { + fn clone(&self) -> Self { + Cursor::from_ptr(self.ptr(), self.inner.len()) + } +} + +impl Cursor { + pub fn new(size: usize) -> Cursor { + unsafe { + let layout = Layout::from_size_align_unchecked(size, 1); + Cursor { + inner: core::slice::from_raw_parts_mut(alloc(layout), size), + reader: 0, + writer: 0, + } + } + } + + pub fn from_ptr(ptr: WaPtr, size: usize) -> Cursor { + unsafe { + Cursor { + inner: core::slice::from_raw_parts_mut(ptr.0 as *mut u8, size), + reader: 0, + writer: 0, + } + } + } + pub fn from_slice(inner: &'static mut [u8]) -> Cursor { + Cursor { + reader: 0, + writer: 0, + inner, + } + } + + pub fn into_inner(self) -> &'static [u8] { + self.inner + } + + pub fn read_pos(&self) -> usize { + self.reader + } + + pub fn write_pos(&self) -> usize { + self.writer + } + + pub fn reset(&mut self) { + self.reader = 0; + self.writer = 0; + } + + pub fn ptr(&self) -> WaPtr { + WaPtr((self.inner.as_ptr()) as u32) + } + + pub fn size(&self) -> usize { + self.inner.len() + } +} + +#[cfg(test)] +mod tests { + use ethnum::u256; + + #[test] + fn test_reader() -> Result<(), crate::error::Error> { + let mem = alloc::boxed::Box::new([0; 256]); + let mut cursor = super::Cursor::from_slice(alloc::boxed::Box::leak(mem)); + + cursor.write_u8(1)?; + cursor.write_u16(&2, true)?; + cursor.write_u32(&3, true)?; + cursor.write_u64(&4, true)?; + cursor.write_u128(&5, true)?; + cursor.write_u256(&u256::new(6), true)?; + + assert_eq!(cursor.read_u8()?, 1); + assert_eq!(cursor.read_u16(true)?, 2); + assert_eq!(cursor.read_u32(true)?, 3); + assert_eq!(cursor.read_u64(true)?, 4); + assert_eq!(cursor.read_u128(true)?, 5); + assert_eq!(cursor.read_u256(true)?, u256::new(6)); + + Ok(()) + } +} diff --git a/src/cursor/reader.rs b/src/cursor/reader.rs new file mode 100644 index 0000000..53b6c99 --- /dev/null +++ b/src/cursor/reader.rs @@ -0,0 +1,174 @@ +use core::str; + +use crate::{blockchain::AddressHash, storage::map::Map, types::Selector, FromBytes}; +use ethnum::u256; + +impl super::Cursor { + pub fn read_u32_be_unchecked(&mut self) -> u32 { + self.reader += 4; + u32::from_be_bytes(self.inner[self.reader - 4..self.reader].try_into().unwrap()) + } + + pub fn read_u8(&mut self) -> Result { + if self.reader < self.inner.len() { + let result = self.inner[self.reader]; + self.reader += 1; + Ok(result) + } else { + Err(crate::error::Error::NoMoreData) + } + } + + pub fn read_u16(&mut self, be: bool) -> Result { + if self.reader + 2 <= self.inner.len() { + let result = if be { + u16::from_be_bytes(self.inner[self.reader..self.reader + 2].try_into().unwrap()) + } else { + u16::from_le_bytes(self.inner[self.reader..self.reader + 2].try_into().unwrap()) + }; + self.reader += 2; + Ok(result) + } else { + Err(crate::error::Error::NoMoreData) + } + } + + pub fn read_u32(&mut self, be: bool) -> Result { + if self.reader + 4 <= self.inner.len() { + let result = if be { + u32::from_be_bytes(self.inner[self.reader..self.reader + 4].try_into().unwrap()) + } else { + u32::from_le_bytes(self.inner[self.reader..self.reader + 4].try_into().unwrap()) + }; + self.reader += 4; + Ok(result) + } else { + Err(crate::error::Error::NoMoreData) + } + } + + pub fn read_u64(&mut self, be: bool) -> Result { + if self.reader + 8 <= self.inner.len() { + let result = + u64::from_be_bytes(self.inner[self.reader..self.reader + 8].try_into().unwrap()); + self.reader += 8; + Ok(result) + } else { + Err(crate::error::Error::NoMoreData) + } + } + + pub fn read_u128(&mut self, be: bool) -> Result { + if self.reader + 16 <= self.inner.len() { + let result = if be { + u128::from_be_bytes( + self.inner[self.reader..self.reader + 16] + .try_into() + .unwrap(), + ) + } else { + u128::from_le_bytes( + self.inner[self.reader..self.reader + 16] + .try_into() + .unwrap(), + ) + }; + self.reader += 16; + Ok(result) + } else { + Err(crate::error::Error::NoMoreData) + } + } + + pub fn read_u256(&mut self, be: bool) -> Result { + if self.reader + 32 <= self.inner.len() { + let result = if be { + u256::from_be_bytes( + self.inner[self.reader..self.reader + 32] + .try_into() + .unwrap(), + ) + } else { + u256::from_le_bytes( + self.inner[self.reader..self.reader + 32] + .try_into() + .unwrap(), + ) + }; + self.reader += 32; + Ok(result) + } else { + Err(crate::error::Error::NoMoreData) + } + } + + /* + pub fn read_u256_le(&mut self) -> Result { + if self.reader + 32 <= self.inner.len() { + let result = u256::from_le_bytes( + self.inner[self.reader..self.reader + 32] + .try_into() + .unwrap(), + ); + self.reader += 32; + Ok(result) + } else { + Err(crate::error::Error::NoMoreData) + } + } + */ + + pub fn read_bool(&mut self) -> Result { + Ok((self.read_u8()?) != 0) + } + + pub fn read_selector(&mut self) -> Result { + self.read_u32(false) + } + + pub fn read_bytes(&mut self, size: usize) -> Result<&[u8], crate::error::Error> { + if self.reader + size <= self.inner.len() { + let result = &self.inner[self.reader..self.reader + size]; + self.reader += size; + Ok(result) + } else { + Err(crate::error::Error::NoMoreData) + } + } + + pub fn read_bytes_with_length(&mut self, be: bool) -> Result<&[u8], crate::error::Error> { + let length = self.read_u32(be)?; + return self.read_bytes(length as usize); + } + + pub fn read_address(&mut self) -> Result { + Ok(AddressHash::from_bytes( + self.read_bytes(crate::constant::ADDRESS_BYTE_LENGTH)?, + )) + } + + pub fn read_address_value_map( + &mut self, + ) -> Result, crate::error::Error> { + let len = self.read_u16(true)?; + let mut result = Map::new(); + + for _ in 0..len { + result.insert(self.read_address()?, self.read_u256(true)?); + } + Ok(result) + } + + pub fn read_string_with_len(&mut self) -> Result<&str, crate::error::Error> { + let len = self.read_u16(true)?; + + let pos = self.reader; + self.reader += len as usize; + unsafe { + Ok(str::from_raw_parts( + self.inner.as_ptr().add(pos), + len as usize, + )) + } + } +} diff --git a/src/cursor/writer.rs b/src/cursor/writer.rs new file mode 100644 index 0000000..4ae318e --- /dev/null +++ b/src/cursor/writer.rs @@ -0,0 +1,138 @@ +use ethnum::u256; + +use crate::{blockchain::AddressHash, constant::ADDRESS_BYTE_LENGTH, types::Selector}; + +impl super::Cursor { + pub fn write_u8(&mut self, val: u8) -> Result<(), crate::error::Error> { + if self.writer < self.inner.len() { + self.inner[self.writer] = val; + self.writer += 1; + Ok(()) + } else { + Err(crate::error::Error::BufferIsFull) + } + } + + pub fn write_u16(&mut self, val: &u16, be: bool) -> Result<(), crate::error::Error> { + if self.writer + 2 <= self.inner.len() { + self.inner[self.writer..self.writer + 2].copy_from_slice(&if be { + val.to_be_bytes() + } else { + val.to_le_bytes() + }); + self.writer += 2; + Ok(()) + } else { + Err(crate::error::Error::BufferIsFull) + } + } + + pub fn write_u32(&mut self, val: &u32, be: bool) -> Result<(), crate::error::Error> { + if self.writer + 4 <= self.inner.len() { + self.inner[self.writer..self.writer + 4].copy_from_slice(&if be { + val.to_be_bytes() + } else { + val.to_le_bytes() + }); + self.writer += 4; + Ok(()) + } else { + Err(crate::error::Error::BufferIsFull) + } + } + + pub fn write_u64(&mut self, val: &u64, be: bool) -> Result<(), crate::error::Error> { + if self.writer + 8 <= self.inner.len() { + self.inner[self.writer..self.writer + 8].copy_from_slice(&if be { + val.to_be_bytes() + } else { + val.to_le_bytes() + }); + self.writer += 8; + Ok(()) + } else { + Err(crate::error::Error::BufferIsFull) + } + } + + pub fn write_u128(&mut self, val: &u128, be: bool) -> Result<(), crate::error::Error> { + if self.writer + 16 <= self.inner.len() { + self.inner[self.writer..self.writer + 16].copy_from_slice(&if be { + val.to_be_bytes() + } else { + val.to_le_bytes() + }); + self.writer += 16; + Ok(()) + } else { + Err(crate::error::Error::BufferIsFull) + } + } + + pub fn write_u256(&mut self, val: &u256, be: bool) -> Result<(), crate::error::Error> { + if self.writer + 32 <= self.inner.len() { + self.inner[self.writer..self.writer + 32].copy_from_slice(&if be { + val.to_be_bytes() + } else { + val.to_le_bytes() + }); + self.writer += 32; + Ok(()) + } else { + Err(crate::error::Error::BufferIsFull) + } + } + + pub fn write_bool(&mut self, val: bool) -> Result<(), crate::error::Error> { + self.write_u8(val.into()) + } + + pub fn write_selector(&mut self, selector: &Selector) -> Result<(), crate::error::Error> { + self.write_u32(selector, false) + } + + pub fn write_bytes(&mut self, bytes: &[u8]) -> Result<(), crate::error::Error> { + if self.writer + bytes.len() <= self.inner.len() { + self.inner[self.writer..self.writer + bytes.len()].copy_from_slice(bytes); + self.writer += bytes.len(); + Ok(()) + } else { + Err(crate::error::Error::BufferIsFull) + } + } + + pub fn write_bytes_with_len(&mut self, bytes: &[u8]) -> Result<(), crate::error::Error> { + if self.writer + bytes.len() + 4 <= self.inner.len() { + self.write_u32(&(bytes.len() as u32), true)?; + self.write_bytes(bytes) + } else { + Err(crate::error::Error::BufferIsFull) + } + } + + pub fn write_string(&mut self, string: &str) -> Result<(), crate::error::Error> { + if self.writer + string.len() <= self.inner.len() { + self.write_bytes(string.as_bytes()) + } else { + Err(crate::error::Error::BufferIsFull) + } + } + + pub fn write_string_with_len(&mut self, string: &str) -> Result<(), crate::error::Error> { + let bytes = string.as_bytes(); + if self.writer + bytes.len() + 2 <= self.inner.len() { + self.write_u16(&(bytes.len() as u16), true)?; + self.write_bytes(bytes) + } else { + Err(crate::error::Error::BufferIsFull) + } + } + + pub fn write_address(&mut self, address: &AddressHash) -> Result<(), crate::error::Error> { + if self.writer + ADDRESS_BYTE_LENGTH <= self.inner.len() { + self.write_bytes(&address.0) + } else { + Err(crate::error::Error::BufferIsFull) + } + } +} diff --git a/src/env/address.rs b/src/env/address.rs new file mode 100644 index 0000000..0d458f8 --- /dev/null +++ b/src/env/address.rs @@ -0,0 +1,15 @@ +#[cfg(target_arch = "wasm32")] +pub fn validate_bitcoin_address(address: &str) -> Result { + let mut buffer = crate::WaBuffer::new(address.len(), 1)?; + let mut cursor = buffer.cursor(); + cursor.write_string(address)?; + + unsafe { + crate::WaBuffer::from_raw(super::global::validateBitcoinAddress(buffer.ptr())) + .cursor() + .read_bool() + } +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn validate_bitcoin_address(address: &str) -> Result {} diff --git a/src/env/global.rs b/src/env/global.rs index 3a03f83..adac8b2 100644 --- a/src/env/global.rs +++ b/src/env/global.rs @@ -1,3 +1,247 @@ -pub struct Address { - bytes: [u8; crate::constant::ADDRESS_BYTE_LENGTH], +use alloc::format; + +use crate::{ + blockchain::{ + transaction::{Input, Output}, + AddressHash, BlockHash, Environment, TransactionHash, + }, + cursor::Cursor, + storage::{key::StorageKey, map::Map, value::StorageValue}, + FromBytes, WaPtr, +}; + +use core::cell::RefCell; + +#[link(wasm_import_module = "env")] +extern "C" { + pub fn revert(data: u32, length: u32); + + pub fn exit(status: u32, data: WaPtr, length: u32); + + #[link_name = "calldata"] + pub fn get_call_data(offset: u32, length: u32, result: WaPtr); + + #[link_name = "environment"] + pub fn get_environment(offset: u32, length: u32, result: WaPtr); + + pub fn load(key: WaPtr, result: WaPtr); + + pub fn store(key: WaPtr, value: WaPtr); + + #[link_name = "deployFromAddress"] + pub fn deploy_from_address(origin_address: u32, salt: u32, result_address: u32) -> u32; + + pub fn call(address: u32, call_data: u32, call_data_length: u32, resultLength: u32); + + #[link_name = "callResult"] + pub fn call_result(offset: u32, length: u32, result: u32); + + pub fn emit(data: u32, data_length: u32); + + #[link_name = "encodeAddress"] + pub fn encode_address(data: u32) -> u32; + + #[link_name = "validateBitcoinAddress"] + pub fn validate_bitcoin_address(addres: u32, address_length: u32) -> u32; + + #[link_name = "verifySchnorrSignature"] + pub fn verify_schnorr_signature(public_key: u32, signature: u32, message: u32) -> u32; + + pub fn sha256(data: u32, data_legth: u32, result: u32); + + pub fn ripemd160(data: u32, data_length: u32, result: u32); + + #[link_name = "inputsSize"] + pub fn inputs_size() -> u32; + + pub fn inputs(buffer: WaPtr); + + #[link_name = "outputsSize"] + pub fn outputs_size() -> u32; + + pub fn outputs(buffer: WaPtr); +} + +#[link(wasm_import_module = "debug")] +extern "C" { + pub fn log(ptr: u32, len: u32); +} + +//#[cfg(target_arch = "wasm32")] +pub struct GlobalContext { + store: RefCell>, +} + +//#[cfg(target_arch = "wasm32")] +impl GlobalContext { + pub const fn new() -> Self { + Self { + store: RefCell::new(Map::new()), + } + } +} + +//#[cfg(target_arch = "wasm32")] +impl super::Context for GlobalContext { + fn call_data(&self, size: usize) -> Cursor { + let cursor = crate::cursor::Cursor::new(size); + unsafe { + get_call_data(0, size as u32, cursor.ptr()); + } + cursor + } + + fn environment(&self) -> Environment { + unsafe { + let mut cursor = Cursor::new(crate::constant::ENVIRONMENT_BYTE_LENGTH); + get_environment( + 0, + crate::constant::ENVIRONMENT_BYTE_LENGTH as u32, + cursor.ptr(), + ); + + Environment { + block_hash: BlockHash::from_bytes( + cursor + .read_bytes(crate::constant::BLOCK_HASH_BYTE_LENGTH) + .unwrap(), + ), + block_number: cursor.read_u64(true).unwrap(), + block_median_time: cursor.read_u64(true).unwrap(), + transaction_hash: TransactionHash::from_bytes( + cursor + .read_bytes(crate::constant::TRANSACTION_HASH_BYTE_LENGTH) + .unwrap(), + ), + + contract_address: cursor.read_address().unwrap(), + contract_deployer: cursor.read_address().unwrap(), + caller: cursor.read_address().unwrap(), + origin: cursor.read_address().unwrap(), + } + } + } + + fn log(&self, text: &str) { + unsafe { + let mut cursor = Cursor::new(text.as_bytes().len() + 3); + cursor.write_string_with_len(text).unwrap(); + log(cursor.ptr().0, cursor.write_pos() as u32); + } + } + + fn emit(&self, event: &dyn crate::event::EventTrait) { + unsafe { + let buffer = event.buffer(); + self.log(&format!( + "Emit size: {:?} {} {}", + buffer, + buffer.len(), + buffer.as_ptr() as u32 + )); + emit(buffer.as_ptr() as u32, buffer.len() as u32); + } + } + + fn call(&self, address: &crate::blockchain::AddressHash, data: Cursor) -> Cursor { + data + } + + fn encode_address(&self, _address: &str) -> &'static [u8] { + b"abcd" + } + + fn deploy_from_address( + &self, + from_address: &AddressHash, + salt: [u8; 32], + ) -> Result { + Ok(*from_address) + } + + fn validate_bitcoin_address(&self, address: &str) -> Result { + unsafe { + Ok(validate_bitcoin_address( + address.as_bytes().as_ptr() as u32, + address.as_bytes().len() as u32, + ) != 0) + } + } + + fn verify_schnorr_signature( + &self, + address: &AddressHash, + signature: &[u8], + hash: &[u8], + ) -> Result { + unsafe { + Ok(verify_schnorr_signature( + address.ptr().0, + signature.as_ptr() as u32, + hash.as_ptr() as u32, + ) != 0) + } + } + + fn load(&self, pointer: &StorageKey) -> Option { + unsafe { + let value = StorageValue::ZERO; + + let result = self.store.borrow().get(pointer).cloned(); + + if let Some(value) = result { + Some(value) + } else { + load(pointer.ptr(), value.ptr()); + + if value.eq(&StorageValue::ZERO) { + None + } else { + self.store.borrow_mut().insert(*pointer, value); + Some(value) + } + } + } + } + + fn store(&self, pointer: StorageKey, value: StorageValue) { + unsafe { + if if let Some(old) = self.store.borrow().get(&pointer) { + value.ne(old) + } else { + true + } { + self.store.borrow_mut().insert(pointer, value); + store(pointer.ptr(), value.ptr()) + } + } + } + + fn exists(&self, pointer: &StorageKey) -> bool { + if self.store.borrow().contains_key(pointer) { + true + } else { + self.load(pointer).is_some() + } + } + + fn inputs(&self) -> alloc::vec::Vec { + unsafe { + let size = inputs_size(); + let buffer = Cursor::new(size as usize); + inputs(buffer.ptr()); + } + + alloc::vec::Vec::new() + } + + fn outputs(&self) -> alloc::vec::Vec { + unsafe { + let size = outputs_size(); + let buffer = Cursor::new(size as usize); + outputs(buffer.ptr()); + } + + alloc::vec::Vec::new() + } } diff --git a/src/env/hash.rs b/src/env/hash.rs new file mode 100644 index 0000000..e229ce6 --- /dev/null +++ b/src/env/hash.rs @@ -0,0 +1,87 @@ +#[allow(unused_imports)] +use crate::WaBuffer; + +#[allow(unused_imports)] +use ripemd::{Digest, Ripemd160}; + +#[cfg(target_arch = "wasm32")] +pub fn sha256(bytes: &[u8]) -> Result<&'static [u8], crate::error::Error> { + unsafe { + Ok(WaBuffer::from_raw(super::global::sha256(WaBuffer::from_bytes(bytes)?.ptr())).data()) + } +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn sha256(bytes: &[u8]) -> Result<&'static [u8], crate::error::Error> { + let sha = alloc::boxed::Box::new(sha2_const::Sha256::new().update(bytes).finalize()); + Ok(alloc::boxed::Box::leak(sha)) +} + +#[cfg(target_arch = "wasm32")] +pub fn sha256_double(bytes: &[u8]) -> Result<&'static [u8], crate::error::Error> { + unsafe { + let first = super::global::sha256(WaBuffer::from_bytes(bytes)?.ptr()); + let second = super::global::sha256(first); + Ok(WaBuffer::from_raw(second).data()) + } +} +#[cfg(not(target_arch = "wasm32"))] +pub fn sha256_double(bytes: &[u8]) -> Result<&'static [u8], crate::error::Error> { + let first = sha2_const::Sha256::new().update(bytes).finalize(); + let second = sha2_const::Sha256::new().update(&first).finalize(); + Ok(alloc::boxed::Box::leak(alloc::boxed::Box::new(second))) +} + +#[cfg(target_arch = "wasm32")] +pub fn rimemd160(bytes: &[u8]) -> Result<&'static [u8], crate::error::Error> { + unsafe { + Ok(WaBuffer::from_raw(super::global::rimemd160(WaBuffer::from_bytes(bytes)?.ptr())).data()) + } +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn rimemd160(data: &[u8]) -> Result<&'static [u8], crate::error::Error> { + use ripemd::digest::crypto_common::KeyInit; + + let mut hasher = ripemd::Ripemd160::new(); + hasher.update(data); + let hash = hasher.finalize(); + + Ok(alloc::boxed::Box::leak(alloc::boxed::Box::new( + hash.to_vec(), + ))) +} + +#[cfg(test)] +mod tests { + #[test] + fn test_sha_256() { + let text = "Hello world"; + assert_eq!( + crate::utils::to_hex(super::sha256(text.as_bytes()).unwrap()), + alloc::string::String::from( + "0x64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c" + ) + ); + } + + #[test] + fn test_sha_256_double() { + let text = "Hello world"; + assert_eq!( + crate::utils::to_hex(super::sha256_double(text.as_bytes()).unwrap()), + alloc::string::String::from( + "0xf6dc724d119649460e47ce719139e521e082be8a9755c5bece181de046ee65fe" + ) + ); + } + + #[test] + fn test_ripemd160() { + let text = "Hello world"; + assert_eq!( + crate::utils::to_hex(super::rimemd160(text.as_bytes()).unwrap()), + alloc::string::String::from("0xdbea7bd24eef40a2e79387542e36dd408b77b21a") + ); + } +} diff --git a/src/env/mod.rs b/src/env/mod.rs index cdcd83a..81f8454 100644 --- a/src/env/mod.rs +++ b/src/env/mod.rs @@ -1 +1,130 @@ +use crate::{ + blockchain::{AddressHash, Environment}, + cursor::Cursor, + storage::{StorageKey, StorageValue}, +}; +use alloc::{collections::binary_heap::Iter, vec::Vec}; +#[allow(unused_imports)] +use core::str::FromStr; pub mod global; + +#[cfg(not(target_arch = "wasm32"))] +mod test; + +#[cfg(not(target_arch = "wasm32"))] +pub use test::{TestContext, TestRouter}; + +#[cfg(target_arch = "wasm32")] +pub fn sha256(bytes: &[u8]) -> [u8; 32] { + use crate::math::bytes; + + unsafe { + //WaBuffer::from_raw(global::sha256(WaBuffer::from_bytes(bytes).unwrap().ptr())).data() + let len = bytes.len() as u32; + let result = [0u8; 32]; + global::sha256( + bytes.as_ptr() as *const u8 as u32, + (&len) as *const _ as *const u8 as u32, + result.as_ptr() as *const u8 as u32, + ); + result + } +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn sha256(bytes: &[u8]) -> [u8; 32] { + let sha = sha2_const::Sha256::new().update(bytes).finalize(); + sha +} + +#[cfg(target_arch = "wasm32")] +pub fn ripemd160(bytes: &[u8]) -> [u8; 20] { + use crate::{math::bytes, WaPtr}; + + let len = bytes.len() as u32; + let result = [0u8; 20]; + + unsafe { + global::ripemd160( + WaPtr::from(bytes).0, + WaPtr::from(&len).0, + WaPtr::from(&result[0..20]).0, + ); + result + } +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn ripemd160(data: &[u8]) -> [u8; 20] { + use ripemd::Digest; + + let mut hasher = ripemd::Ripemd160::new(); + hasher.update(data); + let hash = hasher.finalize(); + + hash[0..20].try_into().unwrap() +} + +pub trait Context { + fn call_data(&self, size: usize) -> Cursor; + fn environment(&self) -> Environment; + fn log(&self, text: &str); + fn emit(&self, event: &dyn crate::event::EventTrait); + fn call(&self, address: &crate::blockchain::AddressHash, data: Cursor) -> Cursor; + + fn deploy_from_address( + &self, + from_address: &crate::blockchain::AddressHash, + salt: [u8; 32], + ) -> Result; + + fn load(&self, pointer: &StorageKey) -> Option; + fn store(&self, pointer: StorageKey, value: StorageValue); + fn exists(&self, pointer: &StorageKey) -> bool; + + fn encode_address(&self, address: &str) -> &'static [u8]; + fn validate_bitcoin_address(&self, address: &str) -> Result; + fn verify_schnorr_signature( + &self, + address: &AddressHash, + signature: &[u8], + hash: &[u8], + ) -> Result; + fn sha256(&self, data: &[u8]) -> [u8; 32] { + sha256(data) + } + fn sha256_double(&self, data: &[u8]) -> [u8; 32] { + self.sha256(&self.sha256(data)) + } + fn ripemd160(&self, data: &[u8]) -> [u8; 20] { + ripemd160(data) + } + + fn inputs(&self) -> Vec; + //fn iter_inputs(&mut self) -> impl Iterator; + fn outputs(&self) -> Vec; + //fn iter_outputs(&mut self) -> impl Iterator; +} + +#[cfg(test)] +mod tests { + #[test] + fn test_sha_256() { + let text = "Hello world"; + assert_eq!( + crate::utils::to_hex(&super::sha256(text.as_bytes())), + alloc::string::String::from( + "0x64ec88ca00b268e5ba1a35678a1b5316d212f4f366b2477232534a8aeca37f3c" + ) + ); + } + + #[test] + fn test_ripemd160() { + let text = "Hello world"; + assert_eq!( + crate::utils::to_hex(&super::ripemd160(text.as_bytes())), + alloc::string::String::from("0xdbea7bd24eef40a2e79387542e36dd408b77b21a") + ); + } +} diff --git a/src/env/test.rs b/src/env/test.rs new file mode 100644 index 0000000..7273b38 --- /dev/null +++ b/src/env/test.rs @@ -0,0 +1,363 @@ +use core::cell::RefCell; +extern crate std; +use alloc::vec::Vec; +use alloc::{boxed::Box, rc::Rc}; +use bitcoin::{Address, Network}; +use core::str::FromStr; + +use crate::blockchain::Environment; +use crate::{ + blockchain::AddressHash, + cursor::Cursor, + storage::{map::Map, StorageKey, StorageValue}, + ContractTrait, +}; + +pub struct TestRouter { + contracts: Vec<(AddressHash, *mut dyn ContractTrait)>, +} +impl TestRouter { + pub fn new() -> Self { + Self { + contracts: Vec::new(), + } + } + + pub fn push(&mut self, address: AddressHash, contract: Box) { + let contract = Box::into_raw(contract); + self.contracts.push((address, contract)); + } + + pub fn call(&self, address: AddressHash, call_data: Cursor) -> Cursor { + if let Some((_, contract_ptr)) = self.contracts.iter().find(|(addr, _)| address.eq(addr)) { + unsafe { + let mut contract: Box = Box::from_raw(*contract_ptr); + let result = contract.execute(call_data).unwrap(); + Box::leak(contract); + result + } + } else { + panic!("Contract is not present") + } + } +} + +#[derive(Clone)] +pub struct TestContext { + pub network: Network, + pub environment: Environment, + pub events: RefCell>, + pub global_store: RefCell>, + pub cache_store: RefCell>, + pub inputs: Vec, + pub outputs: Vec, + pub router: Option>>, +} + +impl Default for TestContext { + fn default() -> Self { + Self { + network: bitcoin::Network::Bitcoin, + environment: Environment::default(), + events: RefCell::new(Vec::new()), + global_store: RefCell::new(Map::new()), + cache_store: RefCell::new(Map::new()), + inputs: Vec::new(), + outputs: Vec::new(), + router: None, + } + } +} + +impl super::Context for TestContext { + // Just mock, data are passed from different entry point + fn call_data(&self, size: usize) -> Cursor { + Cursor::new(size) + } + fn environment(&self) -> Environment { + self.environment.clone() + } + fn emit(&self, event: &dyn crate::event::EventTrait) { + let event = crate::event::Event::new(event.buffer()); + self.events.borrow_mut().push(event); + } + + fn log(&self, _text: &str) {} + + fn call( + &self, + address: &crate::blockchain::AddressHash, + call_data: crate::cursor::Cursor, + ) -> Cursor { + if let Some(router) = &self.router { + router.borrow().call(address.clone(), call_data) + } else { + panic!("There is no router associated with a contract") + } + } + + fn deploy_from_address( + &self, + from_address: &crate::blockchain::AddressHash, + salt: [u8; 32], + ) -> Result { + Ok(*from_address) + } + + fn encode_address(&self, _address: &str) -> &'static [u8] { + b"abc" + } + + fn validate_bitcoin_address(&self, address: &str) -> Result { + match Address::from_str(address) { + Ok(addr) => { + if addr.is_valid_for_network(self.network) { + Ok(true) + } else { + Ok(false) + } + } + Err(_) => Err(crate::error::Error::NoValidAddress), + } + } + + fn verify_schnorr_signature( + &self, + address: &AddressHash, + signature: &[u8], + hash: &[u8], + ) -> Result { + let secp: secp256k1::Secp256k1 = secp256k1::Secp256k1::new(); + + let xonly_public_key = secp256k1::XOnlyPublicKey::from_byte_array(&address.0).unwrap(); + let signature = secp256k1::schnorr::Signature::from_byte_array( + signature + .try_into() + .map_err(|_| crate::error::Error::ConvertError)?, + ); + let result = secp.verify_schnorr(&signature, &hash, &xonly_public_key); + Ok(result.is_ok()) + } + + fn load(&self, pointer: &crate::storage::StorageKey) -> Option { + if let Some(value) = self.cache_store.borrow().get(pointer) { + Some(*value) + } else if let Some(value) = self.global_store.borrow().get(pointer) { + self.cache_store.borrow_mut().insert(*pointer, *value); + Some(*value) + } else { + None + } + .filter(|&value| !StorageValue::ZERO.eq(&value)) + } + + fn store(&self, pointer: crate::storage::StorageKey, value: crate::storage::StorageValue) { + if if let Some(old) = self.cache_store.borrow().get(&pointer) { + value.ne(old) + } else { + true + } { + self.cache_store.borrow_mut().insert(pointer, value); + self.global_store.borrow_mut().insert(pointer, value); + } + } + + fn exists(&self, pointer: &StorageKey) -> bool { + if self.cache_store.borrow().contains_key(pointer) { + true + } else if let Some(value) = self.global_store.borrow().get(pointer) { + self.cache_store.borrow_mut().insert(*pointer, *value); + true + } else { + false + } + } + + fn inputs(&self) -> Vec { + self.inputs.clone() + } + + fn outputs(&self) -> Vec { + self.outputs.clone() + } +} + +#[cfg(test)] +mod tests { + use super::TestContext; + use crate::Context; + + #[test] + fn test_validate_mainnet_address() { + let context = TestContext::default(); + assert_eq!( + true, + context + .validate_bitcoin_address("bc1qnghhhgvz5cn8n6x2fy06yzvkuermcm5ljn06gw") + .unwrap() + ); + } + + #[test] + fn test_validate_testnet_address() { + let context = TestContext { + network: bitcoin::Network::Testnet, + ..Default::default() + }; + assert_eq!( + true, + context + .validate_bitcoin_address("mym4vP87LdQp9YzRbggpS46fYiQFfR52Nq") + .unwrap() + ); + } + + #[test] + fn test_validate_p2sh_mainnet_address() { + let context = TestContext { + network: bitcoin::Network::Bitcoin, + ..Default::default() + }; + assert_eq!( + true, + context + .validate_bitcoin_address("3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy") + .unwrap() + ); + } + + #[test] + fn test_invalid_address_format() { + let context = TestContext { + network: bitcoin::Network::Bitcoin, + ..Default::default() + }; + assert_eq!( + false, + context.validate_bitcoin_address("invalid_address").unwrap() + ); + } + + #[test] + fn test_address_valid_but_wrong_network() { + let context = TestContext { + network: bitcoin::Network::Bitcoin, + ..Default::default() + }; + assert_eq!( + false, + context + .validate_bitcoin_address("mym4vP87LdQp9YzRbggpS46fYiQFfR52Nq") + .unwrap() + ); + } + + #[test] + fn test_valid_regtest_address() { + let context = TestContext { + network: bitcoin::Network::Regtest, + ..Default::default() + }; + assert_eq!( + true, + context + .validate_bitcoin_address( + "bcrt1pe0slk2klsxckhf90hvu8g0688rxt9qts6thuxk3u4ymxeejw53gs0xjlhn" + ) + .unwrap() + ); + } + + #[test] + fn test_valid_regtest_address_segwit() { + let context = TestContext { + network: bitcoin::Network::Regtest, + ..Default::default() + }; + assert_eq!( + true, + context + .validate_bitcoin_address("bcrt1qfqsr3m7vjxheghcvw4ks0fryqxfq8qzjf8fxes") + .unwrap() + ); + } + + #[test] + fn test_valid_regtest_address_legacy() { + let context = TestContext { + network: bitcoin::Network::Regtest, + ..Default::default() + }; + assert_eq!( + true, + context + .validate_bitcoin_address("mn6KYibk94NhScakhgVPQdGE1bnscugRDG") + .unwrap() + ); + } + + #[test] + fn test_valid_regtest_address_p2sh() { + let context = TestContext { + network: bitcoin::Network::Regtest, + ..Default::default() + }; + assert_eq!( + true, + context + .validate_bitcoin_address("2MyLLEUGJSusHvPDNHTwYnG9FAJcrQ3VPZY") + .unwrap() + ); + } + + #[test] + fn test_valid_schnnor_signature() { + use secp256k1::hashes::{sha256, Hash}; + use secp256k1::rand::rngs::OsRng; + let context = TestContext::default(); + + let secp: secp256k1::Secp256k1 = secp256k1::Secp256k1::new(); + let (secret_key, public_key) = secp256k1::Secp256k1::new().generate_keypair(&mut OsRng); + let keypair = secp256k1::Keypair::from_secret_key(&secp, &secret_key); + let msg = sha256::Hash::hash("Hello World!".as_bytes()); + + // With random data + let signature = secp.sign_schnorr_with_rng(msg.as_byte_array(), &keypair, &mut OsRng); + assert!(secp + .verify_schnorr(&signature, msg.as_byte_array(), &public_key.into()) + .is_ok()); + assert!(context + .verify_schnorr_signature( + &crate::blockchain::AddressHash(public_key.x_only_public_key().0.serialize()), + signature.as_byte_array(), + msg.as_byte_array() + ) + .is_ok()); + + // NO random data + let signature = secp.sign_schnorr_no_aux_rand(msg.as_byte_array(), &keypair); + assert!(secp + .verify_schnorr(&signature, msg.as_byte_array(), &public_key.into()) + .is_ok()); + assert!(context + .verify_schnorr_signature( + &crate::blockchain::AddressHash(public_key.x_only_public_key().0.serialize()), + signature.as_byte_array(), + msg.as_byte_array() + ) + .is_ok()); + + // Custom random data + let signature = secp.sign_schnorr_with_aux_rand(msg.as_byte_array(), &keypair, &[1; 32]); + assert!(secp + .verify_schnorr(&signature, msg.as_byte_array(), &public_key.into()) + .is_ok()); + assert!(context + .verify_schnorr_signature( + &crate::blockchain::AddressHash(public_key.x_only_public_key().0.serialize()), + signature.as_byte_array(), + msg.as_byte_array() + ) + .is_ok()); + } +} diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..1394173 --- /dev/null +++ b/src/error.rs @@ -0,0 +1,61 @@ +use core::fmt::Debug; + +pub enum Error { + NoMoreData, + BufferIsFull, + UnknownSelector, + DuplicateKey, + DeadAddress, + InsufficientTotalSupply, + NoBalance, + InsufficientBalance, + MaxSupplyReached, + CanNotTransferFromSelfAccount, + CannotTransferZeroTokens, + OnlyOwner, + NoTokens, + InsufficientAllowance, + ConvertError, + ParseError, + NoValidAddress, + + Test, + + Revert(&'static str), + Extra(&'static str), +} + +impl Error { + pub fn as_str(&self) -> &'static str { + match self { + Self::NoMoreData => "No more data", + Self::BufferIsFull => "Buffer is full", + Self::UnknownSelector => "Unknown selector", + Self::DuplicateKey => "Duplicate key", + Self::DeadAddress => "Dead address", + Self::InsufficientTotalSupply => "InsufficientTotalSupply", + Self::NoBalance => "No balance", + Self::InsufficientBalance => "Insufficient balance", + Self::MaxSupplyReached => "Max supply reached", + Self::CanNotTransferFromSelfAccount => "CanNotTransferFromSelfAccount", + Self::CannotTransferZeroTokens => "CannotTransferZeroTokens", + Self::OnlyOwner => "OnlyOwner", + Self::NoTokens => "NoTokens", + Self::InsufficientAllowance => "InsufficientAllowance", + Self::ConvertError => "Convert error", + Self::ParseError => "ParseError", + Self::NoValidAddress => "NoValidAddress", + + Self::Test => "Test", + + Self::Revert(err) => err, + Self::Extra(err) => err, + } + } +} + +impl Debug for Error { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.debug_struct(self.as_str()).finish() + } +} diff --git a/src/event/mod.rs b/src/event/mod.rs new file mode 100644 index 0000000..2253d31 --- /dev/null +++ b/src/event/mod.rs @@ -0,0 +1,150 @@ +use crate::cursor::Cursor; +use crate::{blockchain::AddressHash, constant::ADDRESS_BYTE_LENGTH}; +use ethnum::u256; + +pub trait EventTrait { + fn buffer(&self) -> &'static [u8]; + fn ptr(&self) -> u32; +} + +#[derive(Clone)] +pub struct Event { + pub buffer: &'static [u8], +} + +impl Event { + pub fn new(buffer: &'static [u8]) -> Event { + Self { buffer } + } + + pub fn approve( + owner: AddressHash, + spender: AddressHash, + value: u256, + ) -> Result { + let event_type = "Approve"; + let byte_size = ADDRESS_BYTE_LENGTH * 2 + 32; + //let mut buffer = crate::mem::WaBuffer::new(event_type.len() + 6 + byte_size, 1)?; + let mut cursor = Cursor::new(event_type.len() + 6 + byte_size); + + cursor.write_string_with_len(event_type)?; + cursor.write_u32(&(byte_size as u32), true)?; + cursor.write_address(&owner)?; + cursor.write_address(&spender)?; + cursor.write_u256(&value, true)?; + + Ok(Event { + buffer: cursor.into_inner(), + }) + } + + pub fn burn(amount: u256) -> Result { + let event_type = "Burn"; + let byte_size = 32; + //let mut buffer = WaBuffer::new(event_type.len() + 6 + byte_size, 1)?; + let mut cursor = Cursor::new(event_type.len() + 6 + byte_size); + + cursor.write_string_with_len(event_type)?; + cursor.write_u32(&(byte_size as u32), true)?; + cursor.write_u256(&amount, true)?; + + Ok(Event { + buffer: cursor.into_inner(), + }) + } + + pub fn claim(amount: u256) -> Result { + let event_type = "Claim"; + let byte_size = 32; + //let mut buffer = WaBuffer::new(event_type.len() + 6 + byte_size, 1)?; + let mut cursor = Cursor::new(event_type.len() + 6 + byte_size); + + cursor.write_string_with_len(event_type)?; + cursor.write_u32(&(byte_size as u32), true)?; + cursor.write_u256(&amount, true)?; + + Ok(Event { + buffer: cursor.into_inner(), + }) + } + + pub fn mint(address: AddressHash, amount: u256) -> Result { + let event_type = "Mint"; + let byte_size = 32 + ADDRESS_BYTE_LENGTH; + //let mut buffer = WaBuffer::new(event_type.len() + 6 + byte_size, 1)?; + let mut cursor = Cursor::new(event_type.len() + 6 + byte_size); + + cursor.write_string_with_len(event_type)?; + cursor.write_u32(&(byte_size as u32), true)?; + cursor.write_address(&address)?; + cursor.write_u256(&amount, true)?; + + Ok(Event { + buffer: cursor.into_inner(), + }) + } + + pub fn stake(amount: u256) -> Result { + let event_type = "Stake"; + let byte_size = 32; + // let mut buffer = WaBuffer::new(event_type.len() + 6 + byte_size, 1)?; + let mut cursor = Cursor::new(event_type.len() + 6 + byte_size); + + cursor.write_string_with_len(event_type)?; + cursor.write_u32(&(byte_size as u32), true)?; + cursor.write_u256(&amount, true)?; + + Ok(Event { + buffer: cursor.into_inner(), + }) + } + + pub fn unstake(amount: u256) -> Result { + let event_type = "Unstake"; + let byte_size = 32; + //let mut buffer = WaBuffer::new(event_type.len() + 6 + byte_size, 1)?; + let mut cursor = Cursor::new(event_type.len() + 6 + byte_size); + + cursor.write_string_with_len(event_type)?; + cursor.write_u32(&(byte_size as u32), true)?; + cursor.write_u256(&amount, true)?; + + Ok(Event { + buffer: cursor.into_inner(), + }) + } + + pub fn transfer( + addr_from: AddressHash, + addr_to: AddressHash, + amount: u256, + ) -> Result { + let event_type = "Transfer"; + + let byte_size = ADDRESS_BYTE_LENGTH * 2 + 32; + //let mut buffer = WaBuffer::new(event_type.len() + 6 + byte_size, 1)?; + let mut cursor = Cursor::new(event_type.len() + 6 + byte_size); + + cursor.write_string_with_len(event_type)?; + + cursor.write_u32(&(byte_size as u32), true)?; + + cursor.write_address(&addr_from)?; + cursor.write_address(&addr_to)?; + cursor.write_u256(&amount, true)?; + + Ok(Event { + buffer: cursor.into_inner(), + }) + } +} + +impl EventTrait for Event { + fn buffer(&self) -> &'static [u8] { + self.buffer + } + + fn ptr(&self) -> u32 { + self.buffer.as_ptr() as u32 + } +} diff --git a/src/lib.rs b/src/lib.rs index 8c20ebd..001eba8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,131 @@ -#![feature(ptr_internals)] +#![no_std] +#![feature(const_for)] +#![feature(const_trait_impl)] +#![feature(stmt_expr_attributes)] +#![feature(str_from_raw_parts)] +extern crate alloc; -pub mod allocator; +pub mod blockchain; pub mod constant; +pub mod contract; +pub mod cursor; pub mod env; -pub mod mem; +pub mod error; +pub mod event; +pub mod math; +pub mod prelude; +pub mod storage; +pub mod types; +pub mod utils; + +//pub mod mem; +pub mod tests; + +use core::cell::RefCell; + +use alloc::rc::Rc; +pub use env::*; +pub use ethnum; + +pub use crate::constant::DEBUG; +#[cfg(not(target_arch = "wasm32"))] +pub use bitcoin; +pub use utils::*; + +pub use contract::{ + op_20::{OP20Params, OP20Trait}, + ContractTrait, +}; + +pub static mut CONTRACT: Option>> = None; + +#[repr(transparent)] +pub struct WaPtr(u32); + +impl From<&u32> for WaPtr { + fn from(value: &u32) -> Self { + Self(value as *const _ as *mut u8 as u32) + } +} + +impl From<&[u8]> for WaPtr { + fn from(value: &[u8]) -> Self { + Self(value as *const _ as *mut u8 as u32) + } +} + +impl From<&[u8; 32]> for WaPtr { + fn from(value: &[u8; 32]) -> Self { + Self(value as *const _ as *mut u8 as u32) + } +} + +fn log(text: &str) { + unsafe { + let bytes = text.as_bytes(); + env::global::log(bytes.as_ptr() as u32, bytes.len() as u32) + }; +} + +#[cfg(not(test))] +#[cfg(not(feature = "std"))] +#[cfg(target_arch = "wasm32")] +#[panic_handler] +fn panic(_panic: &core::panic::PanicInfo<'_>) -> ! { + core::arch::wasm32::unreachable() +} + +//#[cfg(target_arch = "wasm32")] +#[allow(static_mut_refs)] +#[export_name = "execute"] +pub unsafe fn execute(length: u32) -> u32 { + if let Some(contract) = &mut CONTRACT { + let mut contract = contract.borrow_mut(); + + let call_data = contract.context().call_data(length as usize); + + match contract.execute(call_data) { + Ok(result) => { + if DEBUG { + log(&alloc::format!( + "Result of contract: {:?}", + result.clone().into_inner() + )); + } + + env::global::exit(0, result.ptr(), result.size() as u32); + 0 + } + Err(err) => { + if DEBUG { + log(&alloc::format!( + "Contract failed with a error: {}", + err.as_str() + )); + } + 1 + } + } + } else { + if DEBUG { + log("Contract is empty"); + } + 1 + } +} + +#[cfg(target_arch = "wasm32")] +#[export_name = "onDeploy"] +#[allow(static_mut_refs)] +pub unsafe fn on_deploy(length: u32) -> u32 { + if let Some(contract) = &mut CONTRACT { + let mut contract = contract.borrow_mut(); + + let call_data = contract.context().call_data(length as usize); + let result = contract.on_deploy(call_data); + + 0 + } else { + 1 + } +} diff --git a/src/math/abi.rs b/src/math/abi.rs new file mode 100644 index 0000000..360cab4 --- /dev/null +++ b/src/math/abi.rs @@ -0,0 +1,55 @@ +use crate::{sha256, storage::StorageKey}; +/** + * Encode selector in static build time + */ +pub const fn encode_selector_const(selector: &str) -> crate::types::Selector { + let bytes = sha2_const::Sha256::new() + .update(selector.as_bytes()) + .finalize(); + + ((bytes[3] as u32) << 24) + | ((bytes[2] as u32) << 16) + | ((bytes[1] as u32) << 8) + | (bytes[0] as u32) +} + +/** + * Encode selector in the runtime + */ +pub fn encode_selector(selector: &str) -> crate::types::Selector { + super::bytes::bytes4( + crate::env::sha256(selector.as_bytes())[0..4] + .try_into() + .unwrap(), + ) +} + +pub const fn encode_pointer_const(unique_identifier: u16) -> StorageKey { + let mut key = [0; crate::constant::STORE_KEY_BYTE_LENGTH]; + key[0] = (unique_identifier & 0xff) as u8; + key[1] = ((unique_identifier >> 8) & 0xff) as u8; + + StorageKey::new(key) +} + +pub fn encode_pointer(unique_identifier: u16, typed: &[u8]) -> StorageKey { + let hash = if typed.len() != 32 { + sha256(typed) + } else { + typed.try_into().unwrap() + }; + + let mut final_pointer: [u8; 32] = [0; 32]; + final_pointer[0] = (unique_identifier & 0xff) as u8; + final_pointer[1] = ((unique_identifier >> 8) & 0xff) as u8; + + /* + for i in 0..30 { + // drop the last two bytes + final_pointer[i + 2] = hash[i]; + } + */ + final_pointer[2..32].copy_from_slice(&hash[..30]); + + StorageKey::new(final_pointer) +} diff --git a/src/math/bytes.rs b/src/math/bytes.rs new file mode 100644 index 0000000..ee94e56 --- /dev/null +++ b/src/math/bytes.rs @@ -0,0 +1,13 @@ +use ethnum::u256; + +pub const fn bytes4(bytes: [u8; 4]) -> u32 { + u32::from_le_bytes(bytes) +} + +pub const fn bytes8(bytes: [u8; 8]) -> u64 { + u64::from_le_bytes(bytes) +} + +pub fn bytes32(bytes: [u8; 32]) -> u256 { + u256::from_le_bytes(bytes) +} diff --git a/src/math/mod.rs b/src/math/mod.rs new file mode 100644 index 0000000..e13f9ed --- /dev/null +++ b/src/math/mod.rs @@ -0,0 +1,2 @@ +pub mod abi; +pub mod bytes; diff --git a/src/mem.rs b/src/mem.rs index 7102218..f8dab39 100644 --- a/src/mem.rs +++ b/src/mem.rs @@ -1,312 +1,195 @@ -use core::slice; -use std::{alloc::Layout, io::Write, mem, ptr}; +use alloc::alloc::{alloc, Layout}; +use alloc::slice; +use core::ptr::NonNull; +use core::str::FromStr; -extern crate alloc; - -static mut MEMORY: Vec = Vec::new(); - -pub type WaPtr = u32; - -pub struct Cursor<'a> { - inner: &'a [u8], - pos: usize, -} +#[cfg(feature = "std")] +use libc_print::std_name::println; -impl<'a> Cursor<'a> { - pub const fn new(inner: &[u8]) -> Cursor { - Cursor { pos: 0, inner } - } - - pub fn into_inner(self) -> &'a [u8] { - self.inner - } - - pub const fn position(&self) -> usize { - self.pos - } +use crate::cursor::Cursor; // Import format and String from alloc +use crate::WaPtr; +extern crate alloc; - pub fn read_u32(&mut self) -> u32 { - let result = u32::from_le_bytes( - self.inner[self.pos as usize..self.pos + 4] - .try_into() - .unwrap(), - ); - self.pos += 4; - result - } -} +//pub type WaPtr = u32; pub struct WaCell { - pub mm_info: usize, - pub gc_info1: usize, - pub gc_info2: usize, + pub mm_info: u64, + pub gc_info1: u64, + pub gc_info2: u64, pub rt_id: u32, pub rt_size: u32, + #[cfg(not(target_arch = "wasm32"))] + pub data: &'static mut [u8], } impl WaCell { - const fn size() -> WaPtr { - mem::size_of::() as WaPtr + const fn size() -> u32 { + size_of::() as u32 } const fn usize() -> usize { - mem::size_of::() + size_of::() } - const fn layout(size: usize) -> std::alloc::Layout { - unsafe { std::alloc::Layout::from_size_align_unchecked(size + WaCell::usize(), 1) } + const fn layout(size: usize) -> Layout { + unsafe { Layout::from_size_align_unchecked(size + WaCell::usize(), 1) } } - pub fn new(size: usize, id: u32) -> Box { + pub fn new(size: usize, id: u32) -> &'static mut WaCell { unsafe { let layout = WaCell::layout(size); - let ptr = std::alloc::alloc(layout); - let mut cell = Box::::from_raw(ptr.cast()); + let ptr = alloc(layout); + + let cell = NonNull::::new_unchecked(ptr.cast()).as_mut(); + cell.gc_info1 = 0; - cell.mm_info = ptr as usize; + cell.mm_info = ptr as u64; cell.rt_id = id; cell.rt_size = size as u32; + #[cfg(not(target_arch = "wasm32"))] + { + let data = alloc(Layout::from_size_align_unchecked(size, 1)); + cell.data = core::slice::from_raw_parts_mut(data, size); + } cell } } - pub fn new_data(id: u32, data: &[u8]) -> Box { - let mut cell = WaCell::new(data.len(), id); - cell.data_mut().write(data).unwrap(); + pub fn new_data(id: u32, data: &[u8]) -> &'static mut WaCell { + let cell = WaCell::new(data.len(), id); + cell.data_mut().copy_from_slice(data); // Use `copy_from_slice` instead of `write` cell } - pub fn leak(mut self: Box) { - self.dec(); - Box::leak(self); - } - - pub fn drop(mut self: Box) { - if self.gc_info1 == 0 { - let layout = WaCell::layout(self.rt_size as usize); - unsafe { - let ptr = self.ptr(); - if let Some(index) = MEMORY.iter().position(|cell_ptr| *cell_ptr == ptr) { - MEMORY.remove(index); - } - std::alloc::dealloc(Box::into_raw(self) as *mut u8, layout); - } - } else { - self.dec(); + pub fn from_raw(ptr: WaPtr) -> &'static mut WaCell { + unsafe { + NonNull::::new_unchecked((ptr.0 - WaCell::size()) as *mut WaCell).as_mut() } } - pub fn from_raw(ptr: WaPtr) -> Box { - unsafe { Box::from_raw((ptr - WaCell::size()) as *mut u8 as *mut WaCell) } - } - - pub fn to_raw(self: Box) -> WaPtr { - (Box::into_raw(self) as *const u8).wrapping_add(WaCell::usize()) as WaPtr - } - - pub fn inc(&mut self) { - self.gc_info1 += 1; + #[inline] + pub fn ptr(&self) -> WaPtr { + WaPtr((self as *const Self as *const u8 as u32) + WaCell::size()) } - pub fn dec(&mut self) { - if self.gc_info1 > 1 { - self.gc_info1 -= 1; + #[cfg(target_arch = "wasm32")] + pub fn data(&self) -> &'static [u8] { + #[cfg(target_arch = "wasm32")] + unsafe { + slice::from_raw_parts(self.ptr() as *const u8, self.rt_size as usize) } } - #[inline] - pub fn ptr(&self) -> WaPtr { - (self as *const Self as *const u8 as WaPtr) + WaCell::size() + #[cfg(not(target_arch = "wasm32"))] + pub fn data(&self) -> &'static [u8] { + unsafe { slice::from_raw_parts(self.data.as_ptr(), self.rt_size as usize) } } - pub fn data<'a>(self: &Box) -> &[u8] { - unsafe { slice::from_raw_parts(self.ptr() as *const u8, self.rt_size as usize) } + #[cfg(target_arch = "wasm32")] + pub fn data_mut(&mut self) -> &'static mut [u8] { + unsafe { slice::from_raw_parts_mut(self.ptr() as *mut u8, self.rt_size as usize) } } - pub fn data_mut<'a>(self: &mut Box) -> &mut [u8] { - unsafe { slice::from_raw_parts_mut(self.ptr() as *mut u8, self.rt_size as usize) } + #[cfg(not(target_arch = "wasm32"))] + pub fn data_mut(&mut self) -> &'static mut [u8] { + unsafe { slice::from_raw_parts_mut(self.data.as_mut_ptr(), self.rt_size as usize) } } - pub fn cursor<'a>(self: &mut Box) -> Cursor { - Cursor::new(self.data_mut()) + pub fn cursor(&mut self) -> super::cursor::Cursor { + super::cursor::Cursor::from_slice(self.data_mut()) } } -pub struct WaArray { - cell: Box, - buffer: Box, +pub struct WaBuffer { + buffer: &'static mut WaCell, + pointer: &'static mut WaCell, } -impl WaArray { - pub fn from_raw(ptr: WaPtr) -> WaArray { - let mut cell = WaCell::from_raw(ptr); - cell.inc(); - let mut cursor = cell.cursor(); - let buffer_ptr = cursor.read_u32(); - let mut buffer = WaCell::from_raw(buffer_ptr); - buffer.inc(); - WaArray { cell, buffer } - } - - pub fn ptr(&self) -> WaPtr { - self.cell.ptr() - } - - pub fn data(&self) -> &[u8] { - self.buffer.data() +impl Clone for WaBuffer { + fn clone(&self) -> Self { + WaBuffer { + buffer: WaCell::from_raw(self.buffer.ptr()), + pointer: WaCell::from_raw(self.pointer.ptr()), + } } +} - pub fn to_raw(mut self) -> WaPtr { - self.buffer.dec(); - self.buffer.to_raw(); - self.cell.dec(); - self.cell.to_raw() - } +impl WaBuffer { + pub fn new(size: usize, id: u32) -> Result { + let buffer = WaCell::new(size, 1); + let pointer = WaCell::new(12, id); + let mut cursor = pointer.cursor(); - pub fn leak(self) { - self.cell.leak(); - self.buffer.leak(); + cursor.write_u32_le(&buffer.ptr().0)?; + cursor.write_u32_le(&buffer.ptr().0)?; + cursor.write_u32_le(&(size as u32))?; + Ok(WaBuffer { pointer, buffer }) } + pub fn from_bytes(bytes: &[u8]) -> Result { + let buffer = WaCell::new_data(1, bytes); + let pointer = WaCell::new(12, 2); + let mut cursor = pointer.cursor(); - pub fn drop(self) { - self.cell.drop(); - self.buffer.drop(); + cursor.write_u32_le(&buffer.ptr().0)?; + cursor.write_u32_le(&buffer.ptr().0)?; + cursor.write_u32_le(&(bytes.len() as u32))?; + Ok(WaBuffer { pointer, buffer }) } -} - -pub struct WaString { - cell: Box, - buffer: Box, -} -impl WaString { - pub fn new(text: &str) -> WaString { - let len = (text.chars().count()) as u16; - let str_data = len - .to_le_bytes() - .iter() - // Write string itself - .chain(text.as_bytes()) - .cloned() - .collect::>(); - let buffer = WaCell::new_data(1, &str_data); - let cell = WaCell::new_data( - 2, - &[ - buffer.ptr().to_le_bytes(), - buffer.ptr().to_le_bytes(), - (str_data.len() as u32).to_le_bytes(), - ] - .concat(), - ); - - WaString { cell, buffer } + pub fn from_raw(ptr: WaPtr) -> WaBuffer { + let pointer = WaCell::from_raw(ptr); + let mut cursor = pointer.cursor(); + let buffer_ptr = cursor.read_u32_le_unchecked(); + let buffer = WaCell::from_raw(WaPtr(buffer_ptr)); + WaBuffer { pointer, buffer } } pub fn ptr(&self) -> WaPtr { - self.cell.ptr() + self.pointer.ptr() } - pub fn data(&self) -> &[u8] { + pub fn data(&self) -> &'static [u8] { self.buffer.data() } - pub fn to_raw(mut self) -> WaPtr { - self.buffer.dec(); - self.buffer.to_raw(); - self.cell.dec(); - self.cell.to_raw() + pub fn cursor(&mut self) -> Cursor { + Cursor::from_slice(self.buffer.data_mut()) } - fn leak(self) { - self.cell.leak(); - self.buffer.leak(); - } - - fn drop(self) { - self.cell.drop(); - self.buffer.drop(); + /// # Safety + /// + /// Cast memory to given Type. + /// It is very unsafe and works only on WASM32 arch due to memory align and type sizes + #[cfg(target_arch = "wasm32")] + pub unsafe fn into_type(&self) -> &'static mut T { + if core::mem::size_of::() <= self.buffer.rt_size as usize { + NonNull::new_unchecked(self.buffer.ptr() as *mut T).as_mut() + } else { + panic!("Cannot map larger objects"); + } } } -#[link(wasm_import_module = "env")] -extern "C" { - pub fn log(buffer: WaPtr); -} - -pub fn log_str(text: &str) { - unsafe { - let string = WaString::new(text); - log(string.ptr()); - string.drop(); +impl FromStr for WaBuffer { + type Err = crate::error::Error; + fn from_str(s: &str) -> Result { + let bytes = s.as_bytes(); + let len = bytes.len() as u16; + let str_data = len + .to_le_bytes() + .iter() + .chain(bytes) + .cloned() + .collect::>(); + WaBuffer::from_bytes(&str_data) } } -#[no_mangle] -pub fn execute(ptr: WaPtr) -> WaPtr { - let buffer = WaArray::from_raw(ptr); - log_str(&alloc::format!("Execute: {:?}", buffer.data())); - buffer.to_raw() -} - -#[no_mangle] -#[export_name = "setEnvironment"] -pub fn set_environment(ptr: WaPtr) { - let buffer = WaArray::from_raw(ptr); - log_str(&alloc::format!("Set environment: {:?}", buffer.data())); - buffer.leak(); -} - -#[no_mangle] -#[export_name = "onDeploy"] -pub fn on_deploy(ptr: WaPtr) { - let buffer = WaArray::from_raw(ptr); - log_str(&format!("On deploy: {:?}", buffer.data())); - buffer.leak(); -} - -#[no_mangle] #[export_name = "__new"] pub fn new(size: usize, id: u32) -> WaPtr { - unsafe { - let cell = WaCell::new(size, id); - let ptr = cell.to_raw(); - MEMORY.push(ptr); - ptr - } + WaCell::new(size, id).ptr() } -#[no_mangle] #[export_name = "__pin"] pub fn pin(ptr: WaPtr) -> WaPtr { - unsafe { - let mut cell = WaCell::from_raw(ptr); - cell.inc(); - cell.to_raw() - } + ptr } -#[no_mangle] #[export_name = "__unpin"] -pub fn unpin(ptr: WaPtr) { - unsafe { - let mut cell = WaCell::from_raw(ptr); - cell.dec(); - cell.to_raw(); - log_str(&alloc::format!("Mem size: {}", MEMORY.len())); - } -} - -/** - * Remove unused allocations - */ -#[no_mangle] -#[export_name = "__collect"] -pub fn collect() { - unsafe { - let mut new = Vec::new(); - for ptr in MEMORY.iter() { - let cell = WaCell::from_raw(*ptr); - if cell.gc_info1 > 0 { - new.push(cell.to_raw()); - } - } - MEMORY = new - } -} +pub fn unpin(_ptr: WaPtr) {} diff --git a/src/prelude.rs b/src/prelude.rs new file mode 100644 index 0000000..b4a8400 --- /dev/null +++ b/src/prelude.rs @@ -0,0 +1,3 @@ +pub use crate::cursor::Cursor; +pub use crate::ethnum; +pub use crate::ContractTrait; diff --git a/src/storage/array_merger.rs b/src/storage/array_merger.rs new file mode 100644 index 0000000..062b84e --- /dev/null +++ b/src/storage/array_merger.rs @@ -0,0 +1,104 @@ +use alloc::vec::Vec; + +use crate::{math::abi::encode_pointer, storage::StorageKey, AsBytes, Context}; + +use super::StorageValue; +use alloc::rc::Rc; + +#[derive(Clone)] +pub struct ArrayMerger { + context: Rc, + parent_key: Vec, + pointer: u16, + default_value: StorageValue, +} + +impl ArrayMerger { + pub fn new( + context: Rc, + parent_key: Vec, + pointer: u16, + default_value: StorageValue, + ) -> Self { + Self { + context, + parent_key, + pointer, + default_value, + } + } + pub fn get(&mut self, key: &T) -> StorageValue + where + T: AsBytes, + { + let pointer = self.get_key_hash(key); + self.context.load(&pointer).unwrap_or(self.default_value) + } + + pub fn set(&mut self, key: &T, value: StorageValue) + where + T: AsBytes, + { + let pointer = self.get_key_hash(key); + self.context.store(pointer, value); + } + + pub fn contains_key(&self, key: &T) -> bool + where + T: AsBytes, + { + let key = self.get_key_hash(key); + self.context.exists(&key) + } + + fn get_key_hash(&self, key: &T) -> StorageKey + where + T: AsBytes, + { + let merged: Vec = self + .parent_key + .iter() + .chain(key.as_bytes().iter()) + .cloned() + .collect(); + encode_pointer(self.pointer, &merged) + } +} + +impl PartialEq for ArrayMerger { + fn eq(&self, other: &Self) -> bool { + self.parent_key.eq(&other.parent_key) && self.pointer.eq(&other.pointer) + } + + fn ne(&self, other: &Self) -> bool { + self.parent_key.ne(&other.parent_key) && self.pointer.ne(&other.pointer) + } +} + +impl Eq for ArrayMerger {} + +#[cfg(test)] +mod tests { + use crate::{storage::StorageValue, AsBytes, FromBytes}; + + use super::ArrayMerger; + + #[test] + pub fn test1() { + let context = alloc::rc::Rc::new(crate::env::TestContext::default()); + let address1 = crate::tests::random_address(); + let address2 = crate::tests::random_address(); + let mut am1 = ArrayMerger::new(context.clone(), address1.0.to_vec(), 0, StorageValue::ZERO); + + let check_value = [1; 32]; + + let value = am1.get(&address2); + assert_eq!(value.as_bytes(), StorageValue::ZERO.as_bytes()); + + am1.set(&address2.as_bytes(), StorageValue::new(check_value)); + + let mut am2 = ArrayMerger::new(context.clone(), address1.0.to_vec(), 0, StorageValue::ZERO); + let value = am2.get(&address2); + assert_eq!(value.as_bytes(), &check_value); + } +} diff --git a/src/storage/key.rs b/src/storage/key.rs new file mode 100644 index 0000000..34f706a --- /dev/null +++ b/src/storage/key.rs @@ -0,0 +1,30 @@ +use crate::{AsBytes, FromBytes, WaPtr}; + +#[derive(Clone, Copy, Eq, PartialEq)] +#[repr(transparent)] +pub struct StorageKey(pub [u8; crate::constant::STORE_KEY_BYTE_LENGTH]); + +impl StorageKey { + pub const fn new(bytes: [u8; crate::constant::STORE_KEY_BYTE_LENGTH]) -> Self { + Self(bytes) + } + pub fn mut_ptr(&mut self) -> WaPtr { + WaPtr(self.0.as_mut_ptr() as *mut u8 as u32) + } + + pub fn ptr(&self) -> WaPtr { + WaPtr(self.0.as_ptr() as *const u8 as u32) + } +} + +impl AsBytes for StorageKey { + fn as_bytes(&self) -> &[u8] { + &self.0 + } +} + +impl FromBytes for StorageKey { + fn from_bytes(bytes: &[u8]) -> Self { + Self(bytes.try_into().unwrap()) + } +} diff --git a/src/storage/map.rs b/src/storage/map.rs new file mode 100644 index 0000000..405abcf --- /dev/null +++ b/src/storage/map.rs @@ -0,0 +1,137 @@ +//! Simplified version Map +//! + +/// Map structure +#[derive(Clone)] +pub struct Map +where + Key: Sized + Eq, + Value: Sized + Clone + Eq, +{ + items: alloc::vec::Vec<(Key, Value)>, +} +// Implement default trait +impl Default for Map { + fn default() -> Self { + Self::new() + } +} + +impl Map { + pub const fn new() -> Self { + Self { + items: alloc::vec::Vec::new(), + } + } + + pub fn new_with_capacity(capacity: usize) -> Self { + Self { + items: alloc::vec::Vec::with_capacity(capacity), + } + } + + pub fn clear(&mut self) { + self.items.clear(); + } + + /// Doesn not check for duplicities. + /// Faster, but can make map unstable + pub fn push(&mut self, key: Key, value: Value) { + self.items.push((key, value)); + } + + /// Insert element and check for duplicities + pub fn insert(&mut self, key: Key, value: Value) -> Option { + if let Some((_, val)) = self.items.iter_mut().find(|(key, _)| key.eq(key)) { + let result = val.clone(); + *val = value; + Some(result) + } else { + self.push(key, value); + None + } + } + + pub fn pop(&mut self) -> Option<(Key, Value)> { + self.items.pop() + } + + pub fn contains_key(&self, key: &Key) -> bool { + self.items.iter().any(|(k, _)| k.eq(key)) + } + + pub fn contains_value(&self, value: &Value) -> bool { + self.items.iter().any(|(_, v)| v.eq(value)) + } + + pub fn get(&self, key: &Key) -> Option<&Value> { + self.items.iter().find(|(k, _)| k.eq(key)).map(|(_, v)| v) + } + + pub fn get_mut(&mut self, key: &Key) -> Option<&mut Value> { + self.items + .iter_mut() + .find(|(k, _)| k.eq(key)) + .map(|(_, v)| v) + } + + pub fn iter(&self) -> impl Iterator { + self.items.iter() + } + + pub fn iter_mut(&mut self) -> impl Iterator { + self.items.iter_mut() + } + + pub fn iter_keys(&self) -> impl Iterator { + self.items.iter().map(|i| &i.0) + } + + pub fn iter_keys_mut(&mut self) -> impl Iterator { + self.items.iter_mut().map(|i| &mut i.0) + } + + pub fn iter_values(&self) -> impl Iterator { + self.items.iter().map(|i| &i.1) + } + + pub fn iter_values_mut(&mut self) -> impl Iterator { + self.items.iter_mut().map(|(_, v)| v) + } + + pub fn remove(&mut self, key: &Key) -> Option { + if let Some(index) = self.items.iter().position(|(k, _)| k.eq(key)) { + Some(self.items.remove(index).1) + } else { + None + } + } +} + +impl core::ops::Index<&Key> for Map { + type Output = Value; + + fn index(&self, index: &Key) -> &Value { + self.get(index).unwrap() + } +} + +impl core::ops::Index for Map { + type Output = Value; + + fn index(&self, index: Key) -> &Value { + self.get(&index).unwrap() + } +} + +impl core::ops::IndexMut<&Key> for Map { + fn index_mut(&mut self, index: &Key) -> &mut Self::Output { + self.get_mut(index).unwrap() + } +} + +impl core::ops::IndexMut for Map { + fn index_mut(&mut self, index: Key) -> &mut Self::Output { + self.get_mut(&index).unwrap() + } +} diff --git a/src/storage/mod.rs b/src/storage/mod.rs new file mode 100644 index 0000000..645a913 --- /dev/null +++ b/src/storage/mod.rs @@ -0,0 +1,11 @@ +pub mod array_merger; +pub mod key; +pub mod map; +pub mod multi_address_map; +pub mod stored; +pub mod stored_map; +pub mod stored_string; +pub mod value; + +pub use key::StorageKey; +pub use value::StorageValue; diff --git a/src/storage/multi_address_map.rs b/src/storage/multi_address_map.rs new file mode 100644 index 0000000..0feb73d --- /dev/null +++ b/src/storage/multi_address_map.rs @@ -0,0 +1,83 @@ +use alloc::{rc::Rc, vec::Vec}; + +use crate::{blockchain::AddressHash, AsBytes, Context}; + +use super::{array_merger::ArrayMerger, map::Map, StorageValue}; + +pub struct MultiAddressMemoryMap { + context: Rc, + pointer: u16, + default_value: StorageValue, + pub map: Map, +} + +impl MultiAddressMemoryMap { + pub const fn new(context: Rc, pointer: u16, default_value: StorageValue) -> Self { + Self { + context, + pointer, + default_value, + map: Map::new(), + } + } + + pub fn clear(&mut self) { + self.map.clear(); + } + + pub fn get(&mut self, address: &AddressHash) -> ArrayMerger { + self.create_key_merger(address); + self.map.get(address).unwrap().clone() + } + + pub fn set(&mut self, key: AddressHash, value: ArrayMerger) { + self.create_key_merger(&key); + self.map.insert(key, value); + } + + pub fn contains_key(&self, key: &AddressHash) -> bool { + self.map.contains_key(key) + } + + fn create_key_merger(&mut self, key: &AddressHash) { + if !self.map.contains_key(key) { + self.map.push( + *key, + ArrayMerger::new( + self.context.clone(), + key.as_bytes().to_vec(), + self.pointer, + self.default_value, + ), + ); + } + } +} + +#[cfg(test)] +mod tests { + use super::MultiAddressMemoryMap; + use crate::{storage::StorageValue, tests::random_address, AsBytes, TestContext}; + use alloc::rc::Rc; + + #[test] + fn test1() { + let context = Rc::new(TestContext::default()); + let address1 = random_address(); + let address2 = random_address(); + let one = [1; 32]; + let mut mamm1 = MultiAddressMemoryMap::new(context.clone(), 0, StorageValue::ZERO); + let mut merger1 = mamm1.get(&address1); + assert_eq!( + merger1.get(&address2).as_bytes(), + StorageValue::ZERO.as_bytes() + ); + + merger1.set(&address2, StorageValue::new(one)); + assert_eq!(merger1.get(&address2).as_bytes(), &one); + + let mut mamm2 = MultiAddressMemoryMap::new(context.clone(), 0, StorageValue::ZERO); + let mut merger2 = mamm2.get(&address1); + assert_eq!(merger2.get(&address2).as_bytes(), &one); + } +} diff --git a/src/storage/stored.rs b/src/storage/stored.rs new file mode 100644 index 0000000..53b463b --- /dev/null +++ b/src/storage/stored.rs @@ -0,0 +1,184 @@ +use ethnum::u256; + +use super::{StorageKey, StorageValue}; +use crate::{blockchain::AddressHash, math::abi::encode_pointer, Context}; +use alloc::rc::Rc; +use core::{cell::RefCell, convert::Into}; + +pub trait StoredTrait +where + D: Into, +{ + fn value<'a>(&mut self) -> T; + fn refresh<'a>(&mut self) -> T; + fn set<'a>(&mut self, value: T) -> T; + fn set_no_commit(&mut self, value: T) -> T; + fn commit<'a>(&mut self); +} + +pub struct Stored +where + T: Into + Copy + Eq, + StorageValue: Into, + D: Into + Clone, +{ + context: Rc, + pointer: StorageKey, + default_value: D, + value: Option, +} + +impl StoredTrait for Stored +where + T: Into + Copy + Eq, + StorageValue: Into, + D: Into + Clone, +{ + fn value(&mut self) -> T { + if let Some(value) = &self.value { + *value + } else { + let value: T = self + .context + .load(&self.pointer) + .map(|value| value.into()) + .unwrap_or(self.default_value.clone().into()); + + self.value = Some(value); + value + } + } + + fn set(&mut self, value: T) -> T { + if Some(value) != self.value { + self.context.store(self.pointer, value.into()); + self.value = Some(value); + value + } else { + value + } + } + + fn refresh(&mut self) -> T { + let value: T = self + .context + .load(&self.pointer) + .map(|value| value.into()) + .unwrap_or(self.default_value.clone().into()); + self.value = Some(value); + value + } + + fn set_no_commit(&mut self, value: T) -> T { + self.value = Some(value); + value + } + + fn commit(&mut self) { + if let Some(value) = self.value { + self.context.store(self.pointer, value.into()); + } + } +} + +impl Stored +where + T: Into + Copy + Eq, + StorageValue: Into, + D: Into + Clone, +{ + pub const fn new_const(context: Rc, pointer: u16, default_value: D) -> Self { + Self { + context, + pointer: crate::math::abi::encode_pointer_const(pointer), + default_value, + value: None, + } + } + + pub fn new( + context: Rc, + pointer: u16, + sub_pointer: &StorageKey, + default_value: D, + ) -> Self { + Self { + context, + pointer: encode_pointer(pointer, &sub_pointer.0), + default_value, + value: None, + } + } +} + +pub type StoredBool = Stored; +pub type StoredU8 = Stored; +pub type StoredU16 = Stored; +pub type StoredU32 = Stored; +pub type StoredU64 = Stored; +pub type StoredU128 = Stored; +pub type StoredU256 = Stored; +pub type StoredAddress = Stored; + +#[cfg(test)] +mod tests { + use crate::Context; + use crate::TestContext; + use alloc::rc::Rc; + use ethnum::u256; + + use super::StoredTrait; + + fn context() -> Rc { + Rc::new(TestContext::default()) + } + + #[test] + fn test_bool() { + let mut stored_bool = super::StoredBool::new_const(context(), 0, false); + stored_bool.set(true); + assert_eq!(stored_bool.refresh(), true) + } + + #[test] + fn test_u8() { + let mut stored_u8 = super::StoredU8::new_const(context(), 0, 0); + stored_u8.set(1); + assert_eq!(stored_u8.refresh(), 1) + } + + #[test] + fn test_u16() { + let mut stored_u16 = super::StoredU16::new_const(context(), 0, 0); + stored_u16.set(123); + assert_eq!(stored_u16.refresh(), 123) + } + + #[test] + fn test_u32() { + let mut stored_u32 = super::StoredU32::new_const(context(), 0, 0); + stored_u32.set(123); + assert_eq!(stored_u32.refresh(), 123) + } + + #[test] + fn test_u64() { + let mut stored_u64 = super::StoredU64::new_const(context(), 0, 0); + stored_u64.set(123); + assert_eq!(stored_u64.refresh(), 123) + } + + #[test] + fn test_u128() { + let mut stored_u128 = super::StoredU128::new_const(context(), 0, 0); + stored_u128.set(123); + assert_eq!(stored_u128.refresh(), 123) + } + + #[test] + fn test_u256() { + let mut stored_u256 = super::StoredU256::new_const(context(), 0, u256::new(0)); + stored_u256.set(u256::new(123)); + assert_eq!(stored_u256.refresh(), u256::new(123)) + } +} diff --git a/src/storage/stored_map.rs b/src/storage/stored_map.rs new file mode 100644 index 0000000..365f943 --- /dev/null +++ b/src/storage/stored_map.rs @@ -0,0 +1,82 @@ +use core::marker::PhantomData; +use ethnum::u256; + +use crate::{blockchain::AddressHash, math::abi::encode_pointer, AsBytes, Context}; + +use super::{StorageKey, StorageValue}; +use alloc::rc::Rc; + +pub struct StoredMap +where + K: Into, + V: Into + Clone, +{ + context: Rc, + default: V, + pointer: u16, + k: PhantomData, + v: PhantomData, +} + +impl StoredMap +where + K: Into + Copy, + V: Into + From + Clone, +{ + pub const fn new(context: Rc, pointer: u16, default: V) -> Self { + Self { + context, + default, + pointer, + k: PhantomData, + v: PhantomData, + } + } + + pub fn set(&self, key: &K, value: V) { + let key: StorageKey = (*key).into(); + let key_hash = encode_pointer(self.pointer, &key.0); + let value = Into::::into(value); + self.context.store(key_hash, value); + } + + pub fn get(&self, key: &K) -> V { + let key: StorageKey = (*key).into(); + let key_hash = encode_pointer(self.pointer, &key.0); + self.context + .load(&key_hash) + .map(|value| V::from(value)) + .unwrap_or(self.default.clone()) + } + + pub fn contains_key(&self, key: &K) -> bool { + let key: StorageKey = (*key).into(); + let key_hash = encode_pointer(self.pointer, key.as_bytes()); + let has = self.context.exists(&key_hash); + has + } +} + +pub type StoredAddresValueMap = StoredMap; + +#[cfg(test)] +mod tests { + use alloc::rc::Rc; + + use crate::{ + blockchain::AddressHash, storage::StorageValue, tests::random_address, AsBytes, TestContext, + }; + + use super::StoredMap; + + #[test] + fn test1() { + let context = Rc::new(TestContext::default()); + let one = [1; 32]; + let address1 = random_address(); + let sm: StoredMap = + StoredMap::new(context.clone(), 0, StorageValue::ZERO); + sm.set(&address1, StorageValue::new(one)); + assert_eq!(sm.get(&address1).as_bytes(), &one); + } +} diff --git a/src/storage/stored_string.rs b/src/storage/stored_string.rs new file mode 100644 index 0000000..ca38160 --- /dev/null +++ b/src/storage/stored_string.rs @@ -0,0 +1,142 @@ +use core::cell::RefCell; + +use crate::{constant::STORE_VALUE_BYTE_LENGTH, storage::StorageValue, AsBytes, Context}; +use alloc::rc::Rc; +use alloc::string::String; + +use super::stored::StoredTrait; + +pub struct StoredString { + context: Rc>, + pointer: u16, + default_value: &'static str, + value: Option, +} + +impl StoredString { + pub const fn new_const( + context: Rc>, + pointer: u16, + default_value: &'static str, + ) -> Self { + Self { + context, + pointer, + default_value, + value: None, + } + } + + pub fn new( + context: Rc>, + pointer: u16, + default_value: &'static str, + ) -> Self { + Self { + context, + pointer, + default_value, + value: None, + } + } + + fn save<'a>(&mut self, value: String) -> String { + let bytes = value.as_bytes(); + let mut remaining = bytes.len(); + let mut offset = [0u8; crate::constant::STORE_VALUE_BYTE_LENGTH]; + assert!(remaining < 2048); + let context = self.context.borrow(); + + let mut data = [0u8; crate::constant::STORE_VALUE_BYTE_LENGTH]; + let mut length = remaining.min(STORE_VALUE_BYTE_LENGTH - 4); + data[0..4].copy_from_slice(&(remaining as u32).to_le_bytes()); + data[4..4 + remaining.min(28)].copy_from_slice(&bytes[0..length]); + let key = crate::math::abi::encode_pointer(self.pointer, &offset); + remaining -= length; + context.store(key, data.into()); + + while remaining > 0 { + length = remaining.min(crate::constant::STORE_VALUE_BYTE_LENGTH); + let start = value.len() - remaining; + data[0..length].copy_from_slice(&bytes[start..start + length]); + if length < crate::constant::STORE_VALUE_BYTE_LENGTH { + data[length..crate::constant::STORE_VALUE_BYTE_LENGTH].copy_from_slice( + &[0u8; crate::constant::STORE_VALUE_BYTE_LENGTH] + [0..crate::constant::STORE_VALUE_BYTE_LENGTH - length], + ); + } + offset[crate::constant::STORE_KEY_BYTE_LENGTH - 1] += 1; + remaining -= length; + + let key = crate::math::abi::encode_pointer(self.pointer, &offset); + context.store(key, data.into()); + } + self.value = Some(value.clone()); + value + } + + fn load<'a>(&mut self) -> String { + let mut offset = [0u8; crate::constant::STORE_VALUE_BYTE_LENGTH]; + let context = self.context.borrow_mut(); + + let header = context + .load(&crate::math::abi::encode_pointer(self.pointer, &offset)) + .unwrap_or(StorageValue::ZERO); + let bytes = header.as_bytes(); + let len = u32::from_le_bytes(bytes[0..4].try_into().unwrap()) as usize; + let mut length = len.min(crate::constant::STORE_VALUE_BYTE_LENGTH); + let mut value: alloc::vec::Vec = alloc::vec::Vec::with_capacity(len); + let mut remaining = len - length; + for &byte in bytes.iter().skip(4).take(length) { + value.push(byte); + } + + while remaining > 0 { + offset[crate::constant::STORE_VALUE_BYTE_LENGTH - 1] += 1; + let key = crate::math::abi::encode_pointer(self.pointer, &offset); + let tmp = context.load(&key).unwrap_or(StorageValue::ZERO); + let bytes = tmp.as_bytes(); + length = remaining.min(crate::constant::STORE_VALUE_BYTE_LENGTH); + for &byte in bytes.iter().take(length) { + value.push(byte); + } + remaining -= length; + } + if let Ok(value) = String::from_utf8(value) { + self.value = Some(value.clone()); + value + // Unexpected state + } else { + self.default_value.into() + } + } +} + +impl StoredTrait for StoredString { + fn set(&mut self, value: String) -> String { + self.save(value) + } + + fn value(&mut self) -> String { + if let Some(value) = &self.value { + value.clone() + } else { + self.load() + } + } + + fn set_no_commit(&mut self, value: String) -> String { + self.value = Some(value.clone()); + value + } + + fn commit(&mut self) { + if let Some(value) = &self.value { + self.save(value.clone()); + } + } + + fn refresh(&mut self) -> String { + self.load() + } +} diff --git a/src/storage/value.rs b/src/storage/value.rs new file mode 100644 index 0000000..ddbc49c --- /dev/null +++ b/src/storage/value.rs @@ -0,0 +1,177 @@ +use ethnum::u256; + +use crate::{AsBytes, FromBytes, WaPtr}; + +#[derive(Copy, Clone, Eq, PartialEq)] +#[repr(transparent)] +pub struct StorageValue(pub [u8; crate::constant::STORE_VALUE_BYTE_LENGTH]); + +impl StorageValue { + pub const ZERO: StorageValue = StorageValue([0; crate::constant::STORE_VALUE_BYTE_LENGTH]); + + pub fn new(bytes: [u8; crate::constant::STORE_VALUE_BYTE_LENGTH]) -> Self { + Self(bytes) + } + + pub fn mut_ptr(&mut self) -> WaPtr { + WaPtr(self.0.as_mut_ptr() as *mut u8 as u32) + } + + pub fn ptr(&self) -> WaPtr { + WaPtr(self.0.as_ptr() as *const u8 as u32) + } + + pub fn value(&self) -> [u8; crate::constant::STORE_VALUE_BYTE_LENGTH] { + self.0 + } + + pub fn bool(&self) -> bool { + self.0.iter().any(|v| 0.le(v)) + } + + pub fn zero(&self) -> bool { + self.0.iter().all(|v| 0.eq(v)) + } + + pub fn u8(&self) -> u8 { + self.0[31] + } + + pub fn u16(&self) -> u16 { + u16::from_be_bytes(self.0[30..32].try_into().unwrap()) + } + + pub fn u32(&self) -> u32 { + u32::from_be_bytes(self.0[28..32].try_into().unwrap()) + } + + pub fn u64(&self) -> u64 { + u64::from_be_bytes(self.0[24..32].try_into().unwrap()) + } + + pub fn u128(&self) -> u128 { + u128::from_be_bytes(self.0[16..32].try_into().unwrap()) + } + + pub fn u256(&self) -> u256 { + u256::from_be_bytes(self.0) + } +} + +impl AsBytes for StorageValue { + fn as_bytes(&self) -> &[u8] { + &self.0 + } +} + +impl FromBytes for StorageValue { + fn from_bytes(bytes: &[u8]) -> Self { + let mut inner = [0u8; crate::constant::STORE_VALUE_BYTE_LENGTH]; + let length = bytes.len().min(crate::constant::STORE_VALUE_BYTE_LENGTH); + + inner[32 - length..32].copy_from_slice(&bytes[0..length]); + StorageValue(inner) + } +} + +impl From<[u8; crate::constant::STORE_VALUE_BYTE_LENGTH]> for StorageValue { + fn from(value: [u8; crate::constant::STORE_VALUE_BYTE_LENGTH]) -> Self { + StorageValue(value) + } +} + +impl From<&[u8; crate::constant::STORE_VALUE_BYTE_LENGTH]> for StorageValue { + fn from(value: &[u8; crate::constant::STORE_VALUE_BYTE_LENGTH]) -> Self { + StorageValue(*value) + } +} + +impl From<&[u8]> for StorageValue { + fn from(value: &[u8]) -> Self { + StorageValue::from_bytes(value) + } +} + +impl From for StorageValue { + fn from(value: u8) -> Self { + From::<&[u8]>::from(&value.to_be_bytes()) + } +} + +impl From for StorageValue { + fn from(value: u16) -> Self { + From::<&[u8]>::from(&value.to_be_bytes()) + } +} + +impl From for StorageValue { + fn from(value: u32) -> Self { + From::<&[u8]>::from(&value.to_be_bytes()) + } +} + +impl From for StorageValue { + fn from(value: u64) -> Self { + From::<&[u8]>::from(&value.to_be_bytes()) + } +} + +impl From for StorageValue { + fn from(value: u128) -> Self { + From::<&[u8]>::from(&value.to_be_bytes()) + } +} + +impl From for StorageValue { + fn from(value: u256) -> Self { + Self::from(value.to_be_bytes()) + } +} + +impl From for StorageValue { + fn from(value: bool) -> Self { + From::::from(value.into()) + } +} + +impl From for u8 { + fn from(val: StorageValue) -> Self { + val.u8() + } +} + +impl From for u16 { + fn from(val: StorageValue) -> Self { + val.u16() + } +} + +impl From for u32 { + fn from(val: StorageValue) -> Self { + val.u32() + } +} + +impl From for u64 { + fn from(val: StorageValue) -> Self { + val.u64() + } +} + +impl From for u128 { + fn from(val: StorageValue) -> Self { + val.u128() + } +} + +impl From for u256 { + fn from(val: StorageValue) -> Self { + val.u256() + } +} + +impl From for bool { + fn from(val: StorageValue) -> Self { + val.bool() + } +} diff --git a/src/tests/mod.rs b/src/tests/mod.rs new file mode 100644 index 0000000..c8fd253 --- /dev/null +++ b/src/tests/mod.rs @@ -0,0 +1,70 @@ +use ethnum::u256; + +use crate::{ + blockchain::{AddressHash, BlockHash, Environment, TransactionHash}, + cursor::Cursor, +}; + +#[cfg(not(target_arch = "wasm32"))] +pub fn random_bytes() -> [u8; 32] { + let mut result = [0u8; 32]; + result.iter_mut().for_each(|b| *b = rand::random::()); + result +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn random_u64() -> u64 { + rand::random() +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn random_address() -> AddressHash { + AddressHash(random_bytes()) +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn random_transaction() -> TransactionHash { + use crate::FromBytes; + + TransactionHash::from_bytes(&random_bytes()) +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn random_block() -> BlockHash { + use crate::FromBytes; + + BlockHash::from_bytes(&random_bytes()) +} + +pub fn execute( + contract: &mut dyn crate::ContractTrait, + selector: crate::types::Selector, +) -> Cursor { + let mut cursor = Cursor::new(32); + cursor.write_u32(&selector, true).unwrap(); + contract.execute(cursor).unwrap() +} + +pub fn execute_address( + contract: &mut dyn crate::ContractTrait, + selector: crate::types::Selector, + address: &AddressHash, +) -> Cursor { + let mut cursor = Cursor::new(64); + cursor.write_u32(&selector, true).unwrap(); + cursor.write_address(address).unwrap(); + contract.execute(cursor).unwrap() +} + +pub fn execute_address_amount( + contract: &mut dyn crate::ContractTrait, + selector: crate::types::Selector, + address: &AddressHash, + amount: u256, +) -> Cursor { + let mut cursor = Cursor::new(96); + cursor.write_u32(&selector, true).unwrap(); + cursor.write_address(address).unwrap(); + cursor.write_u256(&amount, true).unwrap(); + contract.execute(cursor).unwrap() +} diff --git a/src/types.rs b/src/types.rs new file mode 100644 index 0000000..1852183 --- /dev/null +++ b/src/types.rs @@ -0,0 +1,2 @@ +pub type Selector = u32; +pub type CallData = crate::cursor::Cursor; diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..ab2b917 --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,63 @@ +pub trait AsBytes { + fn as_bytes(&self) -> &[u8]; +} + +pub trait FromBytes { + fn from_bytes(bytes: &[u8]) -> Self; +} + +impl AsBytes for &[u8] { + fn as_bytes(&self) -> &[u8] { + self + } +} + +const BASE64_TABLE: [char; 16] = [ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', +]; + +pub fn to_hex(bytes: &[u8]) -> alloc::string::String { + let mut string = alloc::string::String::with_capacity(bytes.len() * 2 + 3); + string.push_str("0x"); + + for byte in bytes.iter() { + string.push(BASE64_TABLE[(*byte >> 4) as usize]); + string.push(BASE64_TABLE[(*byte & 0xf) as usize]); + } + string +} +pub trait ToHex: AsBytes { + fn to_hex(&self) -> alloc::string::String { + to_hex(self.as_bytes()) + } +} + +impl ToHex for &[u8] {} + +#[cfg(test)] +mod tests { + use super::*; + + pub struct TestHex(alloc::vec::Vec); + impl AsBytes for TestHex { + fn as_bytes(&self) -> &[u8] { + &self.0 + } + } + + impl ToHex for TestHex {} + + #[test] + fn test_to_hex() { + let v = TestHex(alloc::vec![0xda, 0x02, 0xa1, 0x1f]); + assert_eq!(v.to_hex(), alloc::string::String::from("0xda02a11f")); + assert_eq!( + to_hex(&255u8.to_be_bytes()), + alloc::string::String::from("0xff") + ); + assert_eq!( + to_hex(&255u64.to_be_bytes()), + alloc::string::String::from("0x00000000000000ff") + ); + } +}