diff --git a/.github/actions/install-rust/action.yml b/.github/actions/install-rust/action.yml index d23acbfd82..9e4fc214e1 100644 --- a/.github/actions/install-rust/action.yml +++ b/.github/actions/install-rust/action.yml @@ -28,7 +28,7 @@ runs: elif [ "${{ inputs.toolchain }}" = "msrv" ]; then echo "version=1.$msrv.0" >> "$GITHUB_OUTPUT" elif [ "${{ inputs.toolchain }}" = "wasmtime-ci-pinned-nightly" ]; then - echo "version=nightly-2025-02-20" >> "$GITHUB_OUTPUT" + echo "version=nightly-2025-04-03" >> "$GITHUB_OUTPUT" else echo "version=${{ inputs.toolchain }}" >> "$GITHUB_OUTPUT" fi diff --git a/.github/workflows/ci-cron-trigger.yml b/.github/workflows/ci-cron-trigger.yml new file mode 100644 index 0000000000..2dfaab44b5 --- /dev/null +++ b/.github/workflows/ci-cron-trigger.yml @@ -0,0 +1,53 @@ +name: "Cron triggers for CI" +on: + schedule: + # “At 02:34 on Monday.” + # + # https://crontab.guru/#34_2_*_*_1 + # + # This is used to perform a weekly run of CI for all release branches, + # ideally in off-work-hours to not clog up the queue. + - cron: '34 2 * * 1' + + # "At 02:34 on Sunday and every day-of-week from Tuesday through Saturday" + # + # https://crontab.guru/#34_2_*_*_0,2-6 + # + # This is used to perform a daily run of CI for the `main` branch to prime + # caches for github actions and the merge queue. Note that this frequency + # doesn't overlap the above schedule to avoid triggering two builds on the + # same day. + - cron: '34 2 * * 0,2-6' + + # Allow manually triggering this request via a button + workflow_dispatch: + +permissions: + issues: write + actions: write + +jobs: + run: + if: "github.repository == 'bytecodealliance/wasmtime' || !github.event.schedule" + name: Trigger release branch CI + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 + + # Always trigger a CI run on the `main` branch to prime GHA caches. + - run: gh workflow run main.yml --ref main + name: Trigger main branch CI daily + env: + GH_TOKEN: ${{ github.token }} + + # If this is a once-a-week run then additionally trigger CI for release + # branches to ensure that the CI there is kept up-to-date. + - run: rustc ci/trigger-release-branch-ci.rs + - run: ./trigger-release-branch-ci + name: Trigger release branch CI weekly + env: + GH_TOKEN: ${{ github.token }} + if: "github.event.schedule == '34 2 * * 1' || !github.event.schedule" diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8759bbeaa3..f0f8d13761 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,11 +9,6 @@ on: - main - 'release-*' - # Run full CI on the `main` branch once a day to prime the GitHub Actions - # caches used by PRs and the merge queue. - schedule: - - cron: '13 4 * * *' - # This is the CI that runs for PRs-to-merge. merge_group: @@ -26,6 +21,9 @@ on: # uploads as well as publication to crates.io. - 'release-*' + # Allow manually triggering this request via a button or another workflow. + workflow_dispatch: + defaults: run: shell: bash @@ -393,6 +391,7 @@ jobs: -p wasmtime-cli --no-default-features --features compile -p wasmtime-cli --no-default-features --features compile,cranelift -p wasmtime-cli --no-default-features --features compile,cranelift,component-model + -p wasmtime-cli --no-default-features --features objdump -p wasmtime-cli --all-features -p wasmtime-cli --features component-model @@ -401,6 +400,11 @@ jobs: -p cranelift-codegen --benches -p cranelift-codegen --no-default-features --features std,unwind,pulley + - name: cranelift-entity + checks: | + -p cranelift-entity --no-default-features + -p cranelift-entity --no-default-features --features enable-serde + - name: wasmtime-bench-api checks: | -p wasmtime-bench-api @@ -650,7 +654,7 @@ jobs: strategy: fail-fast: true matrix: - os: [ubuntu-latest, macos-latest, windows-latest] + os: [ubuntu-24.04, macos-14, windows-2025] steps: - uses: actions/checkout@v4 @@ -808,10 +812,10 @@ jobs: test_wasi_nn: strategy: matrix: - feature: ["openvino", "onnx"] - os: ["ubuntu-latest", "windows-latest"] + feature: ["openvino"] + os: ["ubuntu-24.04", "windows-2025"] include: - - os: windows-latest + - os: windows-2025 feature: winml name: Test wasi-nn (${{ matrix.feature }}, ${{ matrix.os }}) runs-on: ${{ matrix.os }} @@ -879,7 +883,12 @@ jobs: with: submodules: true - uses: ./.github/actions/install-rust - - run: rustup target add wasm32-wasip1 wasm32-unknown-unknown + - run: | + rustup target add wasm32-wasip1 wasm32-unknown-unknown + cd /tmp + curl -OL https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-24/wasi-sdk-24.0-x86_64-linux.tar.gz + tar -xzf wasi-sdk-24.0-x86_64-linux.tar.gz + mv wasi-sdk-24.0-x86_64-linux wasi-sdk - run: | sudo apt-get update && sudo apt-get install -y gdb lldb-15 llvm # workaround for https://bugs.launchpad.net/ubuntu/+source/llvm-defaults/+bug/1972855 @@ -889,6 +898,7 @@ jobs: cargo test --release --test all -- --ignored --test-threads 1 debug:: env: LLDB: lldb-15 # override default version, 14 + WASI_SDK_PATH: /tmp/wasi-sdk # common logic to cancel the entire run if this job fails - uses: ./.github/actions/cancel-on-failure @@ -1262,3 +1272,29 @@ jobs: } EOF if: steps.tag.outputs.push_tag == 'yes' + + # File an issue on the repo if this run failed and was triggered via + # `workflow_dispatch`, which mostly means that + # `.github/workflows/trigger-release-branch-ci.yml` will file issues on + # failure so we get to see a notification when a build fails for a historical + # release branch. + file-issue-on-error: + name: File an issue if this build failed and was cron-triggered + runs-on: ubuntu-latest + needs: ci-status + if: | + always() + && needs.ci-status.result != 'success' + && github.event_name == 'workflow_dispatch' + permissions: + issues: write + steps: + - uses: actions/github-script@v7 + with: + script: | + github.rest.issues.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: `Failed CI build for ${context.ref}`, + body: `See https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`, + }) diff --git a/Cargo.lock b/Cargo.lock index 28524d6867..16f4afcb95 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,18 +34,6 @@ dependencies = [ "cpufeatures", ] -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" version = "1.0.2" @@ -169,7 +157,7 @@ checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -193,12 +181,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "base64" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" - [[package]] name = "base64" version = "0.22.1" @@ -219,16 +201,14 @@ checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" [[package]] name = "bindgen" -version = "0.69.4" +version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ "bitflags 2.6.0", "cexpr", "clang-sys", "itertools 0.12.1", - "lazy_static", - "lazycell", "log", "prettyplease", "proc-macro2", @@ -236,8 +216,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.90", - "which 4.4.2", + "syn 2.0.100", ] [[package]] @@ -323,9 +302,9 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "bytesize" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" +checksum = "a3c8f83209414aacf0eeae3cf730b18d6981697fba62f200fcfb92b9f082acba" [[package]] name = "bzip2" @@ -377,7 +356,7 @@ checksum = "710b0eb776410a22c89a98f2f80b2187c2ac3a8206b99f3412332e63c9b09de0" dependencies = [ "cap-primitives", "cap-std", - "rustix", + "rustix 0.38.43", "smallvec", ] @@ -393,7 +372,7 @@ dependencies = [ "io-lifetimes", "ipnet", "maybe-owned", - "rustix", + "rustix 0.38.43", "windows-sys 0.52.0", "winx", ] @@ -417,7 +396,7 @@ dependencies = [ "cap-primitives", "io-extras", "io-lifetimes", - "rustix", + "rustix 0.38.43", ] [[package]] @@ -430,15 +409,15 @@ dependencies = [ "cap-primitives", "iana-time-zone", "once_cell", - "rustix", + "rustix 0.38.43", "winx", ] [[package]] name = "capstone" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b08ca438d9585a2b216b0c2e88ea51e096286c5f197f7be2526bb515ef775b6c" +checksum = "015ef5d5ca1743e3f94af9509ba6bd2886523cfee46e48d15c2ef5216fd4ac9a" dependencies = [ "capstone-sys", "libc", @@ -446,9 +425,9 @@ dependencies = [ [[package]] name = "capstone-sys" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7183271711ffb7c63a6480e4baf480e0140da59eeba9b18fcc8bf3478950e3" +checksum = "2267cb8d16a1e4197863ec4284ffd1aec26fe7e57c58af46b02590a0235809a0" dependencies = [ "cc", "libc", @@ -465,16 +444,16 @@ dependencies = [ [[package]] name = "cargo_metadata" -version = "0.18.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" dependencies = [ "camino", "cargo-platform", "semver", "serde", "serde_json", - "thiserror", + "thiserror 2.0.12", ] [[package]] @@ -598,7 +577,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -643,31 +622,11 @@ dependencies = [ "tokio", "wasi-http-draft", "wasm-compose", - "wasmparser", + "wasmparser 0.228.0", "wasmtime", "wasmtime-wasi", ] -[[package]] -name = "component-fuzz-util" -version = "0.0.0" -dependencies = [ - "anyhow", - "arbitrary", - "proc-macro2", - "quote", - "wasmtime-component-util", -] - -[[package]] -name = "component-macro-test" -version = "0.0.0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - [[package]] name = "component-macro-test-helpers" version = "0.0.0" @@ -676,19 +635,6 @@ dependencies = [ "quote", ] -[[package]] -name = "component-test-util" -version = "0.0.0" -dependencies = [ - "anyhow", - "arbitrary", - "env_logger 0.11.5", - "target-lexicon", - "wasmtime", - "wasmtime-environ", - "wasmtime-wast-util", -] - [[package]] name = "console" version = "0.15.8" @@ -766,6 +712,9 @@ dependencies = [ [[package]] name = "cranelift-assembler-x64-meta" version = "0.119.0" +dependencies = [ + "cranelift-srcgen", +] [[package]] name = "cranelift-bforest" @@ -806,7 +755,7 @@ dependencies = [ "postcard", "pulley-interpreter", "regalloc2", - "rustc-hash 2.0.0", + "rustc-hash 2.1.1", "serde", "serde_derive", "sha2", @@ -820,8 +769,9 @@ dependencies = [ name = "cranelift-codegen-meta" version = "0.119.0" dependencies = [ - "cranelift-assembler-x64", + "cranelift-assembler-x64-meta", "cranelift-codegen-shared", + "cranelift-srcgen", "pulley-interpreter", ] @@ -870,7 +820,7 @@ dependencies = [ "similar", "smallvec", "target-lexicon", - "thiserror", + "thiserror 2.0.12", "toml", "wat", ] @@ -910,7 +860,7 @@ dependencies = [ "libm", "log", "smallvec", - "thiserror", + "thiserror 2.0.12", ] [[package]] @@ -999,6 +949,10 @@ dependencies = [ "serde_json", ] +[[package]] +name = "cranelift-srcgen" +version = "0.119.0" + [[package]] name = "cranelift-tools" version = "0.0.0" @@ -1025,11 +979,11 @@ dependencies = [ "pulley-interpreter", "rayon", "regalloc2", - "rustc-hash 2.0.0", + "rustc-hash 2.1.1", "serde", "similar", "target-lexicon", - "thiserror", + "thiserror 2.0.12", "toml", "walkdir", ] @@ -1152,7 +1106,7 @@ checksum = "d475dfebcb4854d596b17b09f477616f80f17a550517f2b3615d8c205d5c802b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -1205,7 +1159,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -1219,9 +1173,9 @@ dependencies = [ [[package]] name = "downcast-rs" -version = "1.2.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "ea8a8b81cacc08888170eef4d13b775126db426d0b348bee9d18c2c1eaf123cf" [[package]] name = "easy-smt" @@ -1383,7 +1337,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e5768da2206272c81ef0b5e951a41862938a6070da63bcea197899942d3b947" dependencies = [ "cfg-if", - "rustix", + "rustix 0.38.43", "windows-sys 0.52.0", ] @@ -1404,7 +1358,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fe00b427b7c4835f8b82170eb7b9a63634376b63d73b9a9093367e82570bbaa" dependencies = [ "regex", - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -1469,7 +1423,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "033b337d725b97690d86893f9de22b67b80dcc4e9ad815f348254c38119db8fb" dependencies = [ "io-lifetimes", - "rustix", + "rustix 0.38.43", "windows-sys 0.52.0", ] @@ -1539,7 +1493,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -1682,15 +1636,6 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" -dependencies = [ - "ahash", -] - [[package]] name = "hashbrown" version = "0.15.2" @@ -1947,7 +1892,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -2012,12 +1957,6 @@ dependencies = [ "serde", ] -[[package]] -name = "indexmap-nostd" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" - [[package]] name = "indicatif" version = "0.13.0" @@ -2077,7 +2016,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" dependencies = [ "hermit-abi", - "rustix", + "rustix 0.38.43", "windows-sys 0.52.0", ] @@ -2124,6 +2063,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.14" @@ -2175,12 +2123,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "leb128" version = "0.2.5" @@ -2195,9 +2137,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.170" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "libfuzzer-sys" @@ -2221,20 +2163,20 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libtest-mimic" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f0f4c6f44ecfd52e8b443f2ad18f2b996540135771561283c2352ce56a1c70b" +checksum = "5297962ef19edda4ce33aaa484386e0a5b3d7f2f4e037cbeee00503ef6b29d33" dependencies = [ + "anstream", + "anstyle", "clap", "escape8259", - "termcolor", - "threadpool", ] [[package]] @@ -2243,6 +2185,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "linux-raw-sys" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" + [[package]] name = "listenfd" version = "1.0.0" @@ -2287,7 +2235,7 @@ dependencies = [ "proc-macro2", "quote", "regex-syntax 0.8.5", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -2345,7 +2293,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" dependencies = [ - "rustix", + "rustix 0.38.43", ] [[package]] @@ -2583,7 +2531,7 @@ checksum = "0bc80894094c6a875bfac64415ed456fa661081a278a035e22be661305c87e14" dependencies = [ "js-sys", "ort-sys", - "thiserror", + "thiserror 1.0.65", "tracing", "web-sys", ] @@ -2704,12 +2652,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.20" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb" dependencies = [ "proc-macro2", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -2760,7 +2708,6 @@ dependencies = [ "cranelift-bitset", "env_logger 0.11.5", "log", - "object", "termcolor", "wasmtime-math", ] @@ -2897,20 +2844,20 @@ checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", "redox_syscall 0.2.13", - "thiserror", + "thiserror 1.0.65", ] [[package]] name = "regalloc2" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145c1c267e14f20fb0f88aa76a1c5ffec42d592c1d28b3cd9148ae35916158d3" +checksum = "dc06e6b318142614e4a48bc725abbf08ff166694835c43c9dae5a9009704639a" dependencies = [ "allocator-api2", "bumpalo", "hashbrown 0.15.2", "log", - "rustc-hash 2.0.0", + "rustc-hash 2.1.1", "serde", "smallvec", ] @@ -3005,9 +2952,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustix" @@ -3019,11 +2966,24 @@ dependencies = [ "errno", "itoa", "libc", - "linux-raw-sys", + "linux-raw-sys 0.4.14", "once_cell", "windows-sys 0.59.0", ] +[[package]] +name = "rustix" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys 0.9.3", + "windows-sys 0.59.0", +] + [[package]] name = "rustls" version = "0.22.4" @@ -3139,16 +3099,17 @@ checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -3321,12 +3282,11 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "string-interner" -version = "0.17.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c6a0d765f5807e98a091107bae0a56ea3799f66a5de47b2c84c94a39c09974e" +checksum = "23de088478b31c349c9ba67816fa55d9355232d63c3afea8bf513e31f0f1d2c0" dependencies = [ - "cfg-if", - "hashbrown 0.14.3", + "hashbrown 0.15.2", "serde", ] @@ -3380,9 +3340,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -3397,7 +3357,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -3411,7 +3371,7 @@ dependencies = [ "cap-std", "fd-lock", "io-lifetimes", - "rustix", + "rustix 0.38.43", "windows-sys 0.52.0", "winx", ] @@ -3445,7 +3405,7 @@ dependencies = [ "ndarray", "rand", "safetensors", - "thiserror", + "thiserror 1.0.65", "torch-sys", "zip", ] @@ -3459,7 +3419,7 @@ dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", - "rustix", + "rustix 0.38.43", "windows-sys 0.48.0", ] @@ -3478,7 +3438,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ - "rustix", + "rustix 0.38.43", "windows-sys 0.48.0", ] @@ -3498,10 +3458,9 @@ name = "test-programs" version = "0.0.0" dependencies = [ "anyhow", - "base64 0.21.0", + "base64", "flate2", "futures", - "getrandom", "libc", "once_cell", "sha2", @@ -3519,7 +3478,7 @@ version = "0.0.0" dependencies = [ "cargo_metadata", "heck 0.5.0", - "wasmparser", + "wasmparser 0.228.0", "wasmtime", "wit-component", ] @@ -3530,7 +3489,16 @@ version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.65", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -3541,25 +3509,27 @@ checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] -name = "thread_local" -version = "1.1.4" +name = "thiserror-impl" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ - "once_cell", + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] -name = "threadpool" -version = "1.8.1" +name = "thread_local" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" dependencies = [ - "num_cpus", + "once_cell", ] [[package]] @@ -3603,9 +3573,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.43.0" +version = "1.44.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" dependencies = [ "backtrace", "bytes", @@ -3626,7 +3596,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -3721,7 +3691,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -3770,7 +3740,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -3833,7 +3803,7 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72139d247e5f97a3eff96229a7ae85ead5328a39efe76f8bf5a06313d505b6ea" dependencies = [ - "base64 0.22.1", + "base64", "log", "once_cell", "rustls 0.23.7", @@ -3879,9 +3849,9 @@ checksum = "8cfcd319456c4d6ea10087ed423473267e1a071f3bc0aa89f80d60997843c6f0" [[package]] name = "v8" -version = "129.0.0" +version = "134.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f276b42044c07ee34aaa7cdc640185148787a78de761c42e8ae0a12af9a9dc6" +checksum = "21c7a224a7eaf3f98c1bad772fbaee56394dce185ef7b19a2e0ca5e3d274165d" dependencies = [ "bindgen", "bitflags 2.6.0", @@ -3891,7 +3861,7 @@ dependencies = [ "miniz_oxide 0.7.4", "once_cell", "paste", - "which 6.0.3", + "which", ] [[package]] @@ -3911,7 +3881,7 @@ dependencies = [ "cranelift-isle", "easy-smt", "env_logger 0.11.5", - "itertools 0.12.1", + "itertools 0.14.0", "log", "strum", "strum_macros", @@ -3927,7 +3897,7 @@ name = "verify-component-adapter" version = "32.0.0" dependencies = [ "anyhow", - "wasmparser", + "wasmparser 0.228.0", "wat", ] @@ -3996,12 +3966,12 @@ dependencies = [ "io-lifetimes", "libc", "log", - "rustix", + "rustix 1.0.3", "system-interface", "tempfile", "test-log", "test-programs-artifacts", - "thiserror", + "thiserror 2.0.12", "tokio", "tracing", "tracing-subscriber", @@ -4027,7 +3997,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7031683cc05a71515d9200fb159b28d717ded3c40dbb979d1602cf46f3a68f40" dependencies = [ - "thiserror", + "thiserror 1.0.65", ] [[package]] @@ -4064,7 +4034,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", "wasm-bindgen-shared", ] @@ -4086,7 +4056,7 @@ checksum = "98c9ae5a76e46f4deecd0f0255cc223cfa18dc9b261213b8aa0c7b36f61b3f1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4099,8 +4069,8 @@ checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49" [[package]] name = "wasm-compose" -version = "0.227.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#8bd9442a363777a7ac289605247bb277f088532a" +version = "0.228.0" +source = "git+https://github.com/bytecodealliance/wasm-tools#ec621cf17a135cbf27949dcf39b7cefd83f4d3dc" dependencies = [ "anyhow", "heck 0.4.1", @@ -4113,47 +4083,47 @@ dependencies = [ "serde_yaml", "smallvec", "wasm-encoder", - "wasmparser", + "wasmparser 0.228.0", "wat", ] [[package]] name = "wasm-encoder" -version = "0.227.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#8bd9442a363777a7ac289605247bb277f088532a" +version = "0.228.0" +source = "git+https://github.com/bytecodealliance/wasm-tools#ec621cf17a135cbf27949dcf39b7cefd83f4d3dc" dependencies = [ "leb128fmt", - "wasmparser", + "wasmparser 0.228.0", ] [[package]] name = "wasm-metadata" -version = "0.227.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#8bd9442a363777a7ac289605247bb277f088532a" +version = "0.228.0" +source = "git+https://github.com/bytecodealliance/wasm-tools#ec621cf17a135cbf27949dcf39b7cefd83f4d3dc" dependencies = [ "anyhow", "indexmap 2.7.0", "wasm-encoder", - "wasmparser", + "wasmparser 0.228.0", ] [[package]] name = "wasm-mutate" -version = "0.227.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#8bd9442a363777a7ac289605247bb277f088532a" +version = "0.228.0" +source = "git+https://github.com/bytecodealliance/wasm-tools#ec621cf17a135cbf27949dcf39b7cefd83f4d3dc" dependencies = [ "egg", "log", "rand", - "thiserror", + "thiserror 1.0.65", "wasm-encoder", - "wasmparser", + "wasmparser 0.228.0", ] [[package]] name = "wasm-smith" -version = "0.227.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#8bd9442a363777a7ac289605247bb277f088532a" +version = "0.228.0" +source = "git+https://github.com/bytecodealliance/wasm-tools#ec621cf17a135cbf27949dcf39b7cefd83f4d3dc" dependencies = [ "anyhow", "arbitrary", @@ -4171,20 +4141,20 @@ dependencies = [ [[package]] name = "wasm-wave" -version = "0.227.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#8bd9442a363777a7ac289605247bb277f088532a" +version = "0.228.0" +source = "git+https://github.com/bytecodealliance/wasm-tools#ec621cf17a135cbf27949dcf39b7cefd83f4d3dc" dependencies = [ "indexmap 2.7.0", "logos", - "thiserror", + "thiserror 1.0.65", "wit-parser", ] [[package]] name = "wasmi" -version = "0.39.1" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7a1acc721dd73e4fff2dc3796cc3efda6e008369e859a20fdbe058bddeebc3" +checksum = "60160ffa66a3f95ae969aaf9cac28591b919a677d68faf29810c4989d5b0cad8" dependencies = [ "arrayvec", "multi-stash", @@ -4193,23 +4163,23 @@ dependencies = [ "wasmi_collections", "wasmi_core", "wasmi_ir", - "wasmparser-nostd", + "wasmparser 0.227.1", ] [[package]] name = "wasmi_collections" -version = "0.39.1" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "142fda775f9cda587681ff0ec63c7a7e5679dc95da75f3f9b7e3979ce3506a5b" +checksum = "e38a962e32f510cd9732dc24308658bccbfe636df813bf53e798073c16c5ab8d" dependencies = [ "string-interner", ] [[package]] name = "wasmi_core" -version = "0.39.1" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "281a49ca3c12c8efa052cb67758454fc861d80ab5a03def352e04eb08c20beb2" +checksum = "eae83f6d1e9344c25ab2defb563a65c3bcfad6fbd910c342367a15222b9e9525" dependencies = [ "downcast-rs", "libm", @@ -4217,9 +4187,9 @@ dependencies = [ [[package]] name = "wasmi_ir" -version = "0.39.1" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bbadcf529808086a74bacd3ce8aedece444a847292198a56dcde920d1fb213c" +checksum = "a9306bd1b4aa21dbfa9e4fc472d51cd40548c34add184e5ac38c3adf4214c356" dependencies = [ "wasmi_core", ] @@ -4227,32 +4197,33 @@ dependencies = [ [[package]] name = "wasmparser" version = "0.227.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#8bd9442a363777a7ac289605247bb277f088532a" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f51cad774fb3c9461ab9bccc9c62dfb7388397b5deda31bf40e8108ccd678b2" dependencies = [ "bitflags 2.6.0", - "hashbrown 0.15.2", "indexmap 2.7.0", - "semver", - "serde", ] [[package]] -name = "wasmparser-nostd" -version = "0.100.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" +name = "wasmparser" +version = "0.228.0" +source = "git+https://github.com/bytecodealliance/wasm-tools#ec621cf17a135cbf27949dcf39b7cefd83f4d3dc" dependencies = [ - "indexmap-nostd", + "bitflags 2.6.0", + "hashbrown 0.15.2", + "indexmap 2.7.0", + "semver", + "serde", ] [[package]] name = "wasmprinter" -version = "0.227.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#8bd9442a363777a7ac289605247bb277f088532a" +version = "0.228.0" +source = "git+https://github.com/bytecodealliance/wasm-tools#ec621cf17a135cbf27949dcf39b7cefd83f4d3dc" dependencies = [ "anyhow", "termcolor", - "wasmparser", + "wasmparser 0.228.0", ] [[package]] @@ -4283,14 +4254,13 @@ dependencies = [ "memfd", "object", "once_cell", - "paste", "postcard", "proptest", "psm", "pulley-interpreter", "rand", "rayon", - "rustix", + "rustix 1.0.3", "semver", "serde", "serde_derive", @@ -4303,7 +4273,7 @@ dependencies = [ "wasi-common", "wasm-encoder", "wasm-wave", - "wasmparser", + "wasmparser 0.228.0", "wasmtime-asm-macros", "wasmtime-cache", "wasmtime-component-macro", @@ -4315,6 +4285,7 @@ dependencies = [ "wasmtime-jit-icache-coherence", "wasmtime-math", "wasmtime-slab", + "wasmtime-test-util", "wasmtime-versioned-export-macros", "wasmtime-winch", "wasmtime-wmemcheck", @@ -4382,13 +4353,13 @@ name = "wasmtime-cache" version = "32.0.0" dependencies = [ "anyhow", - "base64 0.21.0", + "base64", "directories-next", "filetime", "log", "postcard", "pretty_env_logger", - "rustix", + "rustix 1.0.3", "serde", "serde_derive", "sha2", @@ -4411,8 +4382,6 @@ dependencies = [ "cfg-if", "clap", "clap_complete", - "component-macro-test", - "component-test-util", "cranelift-codegen", "cranelift-filetests", "cranelift-native", @@ -4420,9 +4389,9 @@ dependencies = [ "criterion", "env_logger 0.11.5", "filecheck", + "gimli", "http", "http-body-util", - "humantime", "hyper", "libc", "libtest-mimic", @@ -4433,13 +4402,14 @@ dependencies = [ "object", "pulley-interpreter", "rayon", - "rustix", + "rustix 1.0.3", "serde", "serde_derive", "serde_json", "similar", "target-lexicon", "tempfile", + "termcolor", "test-programs-artifacts", "tokio", "toml", @@ -4448,7 +4418,7 @@ dependencies = [ "walkdir", "wasi-common", "wasm-encoder", - "wasmparser", + "wasmparser 0.228.0", "wasmtime", "wasmtime-cache", "wasmtime-cli-flags", @@ -4457,15 +4427,16 @@ dependencies = [ "wasmtime-environ", "wasmtime-explorer", "wasmtime-test-macros", + "wasmtime-test-util", "wasmtime-wasi", "wasmtime-wasi-config", "wasmtime-wasi-http", "wasmtime-wasi-keyvalue", "wasmtime-wasi-nn", "wasmtime-wasi-threads", + "wasmtime-wasi-tls", "wasmtime-wast", - "wasmtime-wast-util", - "wast 227.0.1", + "wast 228.0.0", "wat", "windows-sys 0.59.0", "wit-component", @@ -4478,7 +4449,6 @@ dependencies = [ "anyhow", "clap", "file-per-thread-logger", - "humantime", "rayon", "serde", "serde_derive", @@ -4499,7 +4469,7 @@ dependencies = [ "serde", "serde_json", "similar", - "syn 2.0.90", + "syn 2.0.100", "tracing", "wasmtime", "wasmtime-component-util", @@ -4523,14 +4493,14 @@ dependencies = [ "cranelift-frontend", "cranelift-native", "gimli", - "itertools 0.12.1", + "itertools 0.14.0", "log", "object", "pulley-interpreter", "smallvec", "target-lexicon", - "thiserror", - "wasmparser", + "thiserror 2.0.12", + "wasmparser 0.228.0", "wasmtime-environ", "wasmtime-versioned-export-macros", ] @@ -4557,7 +4527,7 @@ dependencies = [ "smallvec", "target-lexicon", "wasm-encoder", - "wasmparser", + "wasmparser 0.228.0", "wasmprinter", "wasmtime-component-util", "wat", @@ -4568,12 +4538,12 @@ name = "wasmtime-environ-fuzz" version = "0.0.0" dependencies = [ "arbitrary", - "component-fuzz-util", "env_logger 0.11.5", "libfuzzer-sys", - "wasmparser", + "wasmparser 0.228.0", "wasmprinter", "wasmtime-environ", + "wasmtime-test-util", "wat", ] @@ -4600,7 +4570,7 @@ dependencies = [ "backtrace", "cc", "cfg-if", - "rustix", + "rustix 1.0.3", "wasmtime-asm-macros", "wasmtime-versioned-export-macros", "windows-sys 0.59.0", @@ -4612,8 +4582,7 @@ version = "0.0.0" dependencies = [ "anyhow", "arbitrary", - "component-fuzz-util", - "component-test-util", + "cranelift-assembler-x64", "cranelift-codegen", "cranelift-control", "cranelift-filetests", @@ -4630,9 +4599,10 @@ dependencies = [ "rand", "smallvec", "target-lexicon", - "wasmparser", + "wasmparser 0.228.0", "wasmtime", "wasmtime-fuzzing", + "wasmtime-test-util", ] [[package]] @@ -4641,8 +4611,6 @@ version = "0.0.0" dependencies = [ "anyhow", "arbitrary", - "component-fuzz-util", - "component-test-util", "env_logger 0.11.5", "futures", "log", @@ -4656,12 +4624,12 @@ dependencies = [ "wasm-smith", "wasm-spec-interpreter", "wasmi", - "wasmparser", + "wasmparser 0.228.0", "wasmprinter", "wasmtime", "wasmtime-cli-flags", + "wasmtime-test-util", "wasmtime-wast", - "wasmtime-wast-util", "wat", ] @@ -4671,7 +4639,7 @@ version = "32.0.0" dependencies = [ "cc", "object", - "rustix", + "rustix 1.0.3", "wasmtime-versioned-export-macros", ] @@ -4703,8 +4671,26 @@ dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.90", - "wasmtime-wast-util", + "syn 2.0.100", + "wasmtime-test-util", +] + +[[package]] +name = "wasmtime-test-util" +version = "32.0.0" +dependencies = [ + "anyhow", + "arbitrary", + "env_logger 0.11.5", + "proc-macro2", + "quote", + "serde", + "serde_derive", + "target-lexicon", + "toml", + "wasmtime", + "wasmtime-component-util", + "wasmtime-environ", ] [[package]] @@ -4713,7 +4699,7 @@ version = "32.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -4733,17 +4719,18 @@ dependencies = [ "futures", "io-extras", "io-lifetimes", - "rustix", + "rustix 1.0.3", "system-interface", "tempfile", "test-log", "test-programs-artifacts", - "thiserror", + "thiserror 2.0.12", "tokio", "tracing", "tracing-subscriber", "url", "wasmtime", + "wasmtime-test-util", "wasmtime-wasi-io", "wiggle", "windows-sys 0.59.0", @@ -4766,7 +4753,7 @@ version = "32.0.0" dependencies = [ "anyhow", "async-trait", - "base64 0.21.0", + "base64", "bytes", "futures", "http", @@ -4819,7 +4806,7 @@ dependencies = [ "ort", "tch", "test-programs-artifacts", - "thiserror", + "thiserror 2.0.12", "tracing", "tracing-subscriber", "walkdir", @@ -4842,24 +4829,30 @@ dependencies = [ ] [[package]] -name = "wasmtime-wast" +name = "wasmtime-wasi-tls" version = "32.0.0" dependencies = [ "anyhow", - "log", + "bytes", + "futures", + "rustls 0.22.4", + "test-programs-artifacts", "tokio", + "tokio-rustls", "wasmtime", - "wast 227.0.1", + "wasmtime-wasi", + "webpki-roots", ] [[package]] -name = "wasmtime-wast-util" +name = "wasmtime-wast" version = "32.0.0" dependencies = [ "anyhow", - "serde", - "serde_derive", - "toml", + "log", + "tokio", + "wasmtime", + "wast 228.0.0", ] [[package]] @@ -4871,7 +4864,7 @@ dependencies = [ "gimli", "object", "target-lexicon", - "wasmparser", + "wasmparser 0.228.0", "wasmtime-cranelift", "wasmtime-environ", "winch-codegen", @@ -4902,8 +4895,8 @@ dependencies = [ [[package]] name = "wast" -version = "227.0.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#8bd9442a363777a7ac289605247bb277f088532a" +version = "228.0.0" +source = "git+https://github.com/bytecodealliance/wasm-tools#ec621cf17a135cbf27949dcf39b7cefd83f4d3dc" dependencies = [ "bumpalo", "leb128fmt", @@ -4914,10 +4907,10 @@ dependencies = [ [[package]] name = "wat" -version = "1.227.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#8bd9442a363777a7ac289605247bb277f088532a" +version = "1.228.0" +source = "git+https://github.com/bytecodealliance/wasm-tools#ec621cf17a135cbf27949dcf39b7cefd83f4d3dc" dependencies = [ - "wast 227.0.1", + "wast 228.0.0", ] [[package]] @@ -4939,18 +4932,6 @@ dependencies = [ "rustls-pki-types", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - [[package]] name = "which" version = "6.0.3" @@ -4959,7 +4940,7 @@ checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" dependencies = [ "either", "home", - "rustix", + "rustix 0.38.43", "winsafe", ] @@ -4971,7 +4952,7 @@ dependencies = [ "async-trait", "bitflags 2.6.0", "proptest", - "thiserror", + "thiserror 2.0.12", "tokio", "tracing", "wasmtime", @@ -4989,7 +4970,7 @@ dependencies = [ "proc-macro2", "quote", "shellexpand", - "syn 2.0.90", + "syn 2.0.100", "witx", ] @@ -4999,7 +4980,7 @@ version = "32.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", "wiggle", "wiggle-generate", ] @@ -5011,7 +4992,7 @@ dependencies = [ "anyhow", "env_logger 0.11.5", "proptest", - "thiserror", + "thiserror 2.0.12", "tracing", "tracing-subscriber", "wiggle", @@ -5058,8 +5039,8 @@ dependencies = [ "regalloc2", "smallvec", "target-lexicon", - "thiserror", - "wasmparser", + "thiserror 2.0.12", + "wasmparser 0.228.0", "wasmtime-cranelift", "wasmtime-environ", ] @@ -5093,7 +5074,7 @@ checksum = "12168c33176773b86799be25e2a2ba07c7aab9968b37541f1094dbd7a60c8946" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -5104,7 +5085,7 @@ checksum = "9d8dc32e0095a7eeccebd0e3f09e9509365ecb3fc6ac4d6f5f14a3f6392942d1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] @@ -5283,7 +5264,7 @@ dependencies = [ [[package]] name = "wit-bindgen" version = "0.41.0" -source = "git+https://github.com/bytecodealliance/witx-bindgen#40ca9b144f88528119fa1e5307df514a0181a1cd" +source = "git+https://github.com/bytecodealliance/witx-bindgen#4536acf0d5d3d348968c5b42f60cb411ddf74d82" dependencies = [ "wit-bindgen-rt 0.41.0", "wit-bindgen-rust-macro", @@ -5292,7 +5273,7 @@ dependencies = [ [[package]] name = "wit-bindgen-core" version = "0.41.0" -source = "git+https://github.com/bytecodealliance/witx-bindgen#40ca9b144f88528119fa1e5307df514a0181a1cd" +source = "git+https://github.com/bytecodealliance/witx-bindgen#4536acf0d5d3d348968c5b42f60cb411ddf74d82" dependencies = [ "anyhow", "heck 0.5.0", @@ -5311,7 +5292,7 @@ dependencies = [ [[package]] name = "wit-bindgen-rt" version = "0.41.0" -source = "git+https://github.com/bytecodealliance/witx-bindgen#40ca9b144f88528119fa1e5307df514a0181a1cd" +source = "git+https://github.com/bytecodealliance/witx-bindgen#4536acf0d5d3d348968c5b42f60cb411ddf74d82" dependencies = [ "bitflags 2.6.0", "futures", @@ -5321,13 +5302,13 @@ dependencies = [ [[package]] name = "wit-bindgen-rust" version = "0.41.0" -source = "git+https://github.com/bytecodealliance/witx-bindgen#40ca9b144f88528119fa1e5307df514a0181a1cd" +source = "git+https://github.com/bytecodealliance/witx-bindgen#4536acf0d5d3d348968c5b42f60cb411ddf74d82" dependencies = [ "anyhow", "heck 0.5.0", "indexmap 2.7.0", "prettyplease", - "syn 2.0.90", + "syn 2.0.100", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -5336,21 +5317,21 @@ dependencies = [ [[package]] name = "wit-bindgen-rust-macro" version = "0.41.0" -source = "git+https://github.com/bytecodealliance/witx-bindgen#40ca9b144f88528119fa1e5307df514a0181a1cd" +source = "git+https://github.com/bytecodealliance/witx-bindgen#4536acf0d5d3d348968c5b42f60cb411ddf74d82" dependencies = [ "anyhow", "prettyplease", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", "wit-bindgen-core", "wit-bindgen-rust", ] [[package]] name = "wit-component" -version = "0.227.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#8bd9442a363777a7ac289605247bb277f088532a" +version = "0.228.0" +source = "git+https://github.com/bytecodealliance/wasm-tools#ec621cf17a135cbf27949dcf39b7cefd83f4d3dc" dependencies = [ "anyhow", "bitflags 2.6.0", @@ -5361,14 +5342,14 @@ dependencies = [ "serde_json", "wasm-encoder", "wasm-metadata", - "wasmparser", + "wasmparser 0.228.0", "wit-parser", ] [[package]] name = "wit-parser" -version = "0.227.1" -source = "git+https://github.com/bytecodealliance/wasm-tools#8bd9442a363777a7ac289605247bb277f088532a" +version = "0.228.0" +source = "git+https://github.com/bytecodealliance/wasm-tools#ec621cf17a135cbf27949dcf39b7cefd83f4d3dc" dependencies = [ "anyhow", "id-arena", @@ -5379,7 +5360,7 @@ dependencies = [ "serde_derive", "serde_json", "unicode-xid", - "wasmparser", + "wasmparser 0.228.0", ] [[package]] @@ -5390,7 +5371,7 @@ checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" dependencies = [ "anyhow", "log", - "thiserror", + "thiserror 1.0.65", "wast 35.0.2", ] @@ -5413,8 +5394,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", - "linux-raw-sys", - "rustix", + "linux-raw-sys 0.4.14", + "rustix 0.38.43", ] [[package]] @@ -5437,30 +5418,10 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", "synstructure", ] -[[package]] -name = "zerocopy" -version = "0.7.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", -] - [[package]] name = "zerofrom" version = "0.1.5" @@ -5478,7 +5439,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", "synstructure", ] @@ -5507,7 +5468,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.100", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 77969d6b03..77d55fb719 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,6 +54,7 @@ wasi-common = { workspace = true, default-features = true, features = ["exit", " wasmtime-wasi = { workspace = true, default-features = true, optional = true } wasmtime-wasi-nn = { workspace = true, optional = true } wasmtime-wasi-config = { workspace = true, optional = true } +wasmtime-wasi-tls = { workspace = true, optional = true } wasmtime-wasi-keyvalue = { workspace = true, optional = true } wasmtime-wasi-threads = { workspace = true, optional = true } wasmtime-wasi-http = { workspace = true, optional = true } @@ -69,8 +70,13 @@ serde_json = { workspace = true } wasmparser = { workspace = true } tracing = { workspace = true } log = { workspace = true } -humantime = { workspace = true } tempfile = { workspace = true, optional = true } +object = { workspace = true, optional = true } +cranelift-codegen = { workspace = true, optional = true, features = ['disas'] } +capstone = { workspace = true, optional = true } +termcolor = { workspace = true, optional = true } +gimli = { workspace = true, optional = true } +pulley-interpreter = { workspace = true, optional = true } async-trait = { workspace = true } trait-variant = { workspace = true } @@ -102,15 +108,14 @@ wat = { workspace = true } rayon = "1.5.0" wasmtime-wast = { workspace = true, features = ['component-model'] } wasmtime-component-util = { workspace = true } -component-macro-test = { path = "crates/misc/component-macro-test" } -component-test-util = { workspace = true } +wasmtime-test-util = { workspace = true, features = ['wasmtime-wast', 'component'] } bstr = "1.6.0" libc = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } walkdir = { workspace = true } test-programs-artifacts = { workspace = true } -bytesize = "1.3.0" +bytesize = "2.0.1" wit-component = { workspace = true } cranelift-filetests = { workspace = true } cranelift-codegen = { workspace = true, features = ["disas", "trace-log", "timing"] } @@ -122,7 +127,6 @@ capstone = { workspace = true } object = { workspace = true, features = ['std'] } wasmtime-test-macros = { path = "crates/test-macros" } pulley-interpreter = { workspace = true, features = ["disas"] } -wasmtime-wast-util = { path = 'crates/wast-util' } wasm-encoder = { workspace = true } cranelift-native = { workspace = true } @@ -171,10 +175,7 @@ authors = ["The Wasmtime Project Developers"] edition = "2021" # Wasmtime's current policy is that this number can be no larger than the # current stable release of Rust minus 2. -# -# NB: once this is 1.84+ delete `pulley/build.rs` and the similar code in -# `crate/wasmtime/build.rs` -rust-version = "1.83.0" +rust-version = "1.84.0" [workspace.lints.rust] # Turn on some lints which are otherwise allow-by-default in rustc. @@ -246,8 +247,7 @@ wasmtime-component-macro = { path = "crates/component-macro", version = "=32.0.0 wasmtime-asm-macros = { path = "crates/asm-macros", version = "=32.0.0" } wasmtime-versioned-export-macros = { path = "crates/versioned-export-macros", version = "=32.0.0" } wasmtime-slab = { path = "crates/slab", version = "=32.0.0" } -component-test-util = { path = "crates/misc/component-test-util" } -component-fuzz-util = { path = "crates/misc/component-fuzz-util" } +wasmtime-wasi-tls = { path = "crates/wasi-tls", version = "32.0.0" } component-async-tests = { path = "crates/misc/component-async-tests" } wiggle = { path = "crates/wiggle", version = "=32.0.0", default-features = false } wiggle-macro = { path = "crates/wiggle/macro", version = "=32.0.0" } @@ -258,10 +258,12 @@ wasmtime-jit-icache-coherence = { path = "crates/jit-icache-coherence", version wasmtime-wit-bindgen = { path = "crates/wit-bindgen", version = "=32.0.0" } wasmtime-math = { path = "crates/math", version = "=32.0.0" } test-programs-artifacts = { path = 'crates/test-programs/artifacts' } +wasmtime-test-util = { path = "crates/test-util" } pulley-interpreter = { path = 'pulley', version = "=32.0.0" } pulley-interpreter-fuzz = { path = 'pulley/fuzz' } +cranelift-assembler-x64 = { path = "cranelift/assembler-x64", version = "0.119.0" } cranelift-codegen = { path = "cranelift/codegen", version = "0.119.0", default-features = false, features = ["std", "unwind"] } cranelift-frontend = { path = "cranelift/frontend", version = "0.119.0" } cranelift-entity = { path = "cranelift/entity", version = "0.119.0" } @@ -276,6 +278,7 @@ cranelift-fuzzgen = { path = "cranelift/fuzzgen" } cranelift-bforest = { path = "cranelift/bforest", version = "0.119.0" } cranelift-bitset = { path = "cranelift/bitset", version = "0.119.0" } cranelift-control = { path = "cranelift/control", version = "0.119.0" } +cranelift-srcgen = { path = "cranelift/srcgen", version = "0.119.0" } cranelift = { path = "cranelift/umbrella", version = "0.119.0" } winch-codegen = { path = "winch/codegen", version = "=32.0.0" } @@ -285,7 +288,7 @@ byte-array-literals = { path = "crates/wasi-preview1-component-adapter/byte-arra # Bytecode Alliance maintained dependencies: # --------------------------- -regalloc2 = "0.11.1" +regalloc2 = "0.11.2" # cap-std family: target-lexicon = "0.13.0" @@ -299,23 +302,24 @@ fs-set-times = "0.20.1" system-interface = { version = "0.27.1", features = ["cap_std_impls"] } io-lifetimes = { version = "2.0.3", default-features = false } io-extras = "0.18.1" -rustix = "0.38.43" +rustix = "1.0.3" +# wit-bindgen: wit-bindgen = { version = "0.41.0", default-features = false } -wit-bindgen-rt = { version = "0.41.0", default-features = false } wit-bindgen-rust-macro = { version = "0.41.0", default-features = false } +wit-bindgen-rt = { version = "0.41.0", default-features = false } # wasm-tools family: -wasmparser = { version = "0.227.0", default-features = false, features = ['simd'] } -wat = "1.227.0" -wast = "227.0.0" -wasmprinter = "0.227.0" -wasm-encoder = "0.227.0" -wasm-smith = "0.227.0" -wasm-mutate = "0.227.0" -wit-parser = "0.227.0" -wit-component = "0.227.0" -wasm-wave = "0.227.0" -wasm-compose = "0.227.0" +wasmparser = { version = "0.228.0", default-features = false, features = ['simd'] } +wat = "1.228.0" +wast = "228.0.0" +wasmprinter = "0.228.0" +wasm-encoder = "0.228.0" +wasm-smith = "0.228.0" +wasm-mutate = "0.228.0" +wit-parser = "0.228.0" +wit-component = "0.228.0" +wasm-wave = "0.228.0" +wasm-compose = "0.228.0" # Non-Bytecode Alliance maintained dependencies: # -------------------------- @@ -330,11 +334,11 @@ log = { version = "0.4.8", default-features = false } clap = { version = "4.5.17", default-features = false, features = ["std", "derive"] } clap_complete = "4.4.7" hashbrown = { version = "0.15", default-features = false } -capstone = "0.12.0" +capstone = "0.13.0" smallvec = { version = "1.6.1", features = ["union"] } tracing = "0.1.26" bitflags = "2.0" -thiserror = "1.0.43" +thiserror = "2.0.12" async-trait = "0.1.71" trait-variant = "0.1.2" heck = "0.5" @@ -368,17 +372,24 @@ futures = { version = "0.3.27", default-features = false } indexmap = { version = "2.0.0", default-features = false } pretty_env_logger = "0.5.0" syn = "2.0.25" +quote = "1.0" +proc-macro2 = "1.0" test-log = { version = "0.2", default-features = false, features = ["trace"] } tracing-subscriber = { version = "0.3.1", default-features = false, features = ['fmt', 'env-filter', 'ansi', 'tracing-log'] } url = "2.3.1" -humantime = "2.0.0" postcard = { version = "1.0.8", default-features = false, features = ['alloc'] } criterion = { version = "0.5.0", default-features = false, features = ["html_reports", "rayon"] } rustc-hash = "2.0.0" -libtest-mimic = "0.7.0" +libtest-mimic = "0.8.1" semver = { version = "1.0.17", default-features = false } ittapi = "0.4.0" libm = "0.2.7" +tokio-rustls = "0.25.0" +rustls = "0.22.0" +webpki-roots = "0.26.0" +itertools = "0.14.0" +base64 = "0.22.1" +termcolor = "1.4.1" # ============================================================================= # @@ -404,6 +415,7 @@ default = [ "wast", "config", "completion", + "objdump", # On-by-default WASI features "wasi-nn", @@ -411,6 +423,7 @@ default = [ "wasi-http", "wasi-config", "wasi-keyvalue", + "wasi-tls", # Most features of Wasmtime are enabled by default. "wat", @@ -461,6 +474,7 @@ disable-logging = ["log/max_level_off", "tracing/max_level_off"] # These features are all included in the `default` set above and this is # the internal mapping for what they enable in Wasmtime itself. wasi-nn = ["dep:wasmtime-wasi-nn"] +wasi-tls = ["dep:wasmtime-wasi-tls"] wasi-threads = ["dep:wasmtime-wasi-threads", "threads"] wasi-http = ["component-model", "dep:wasmtime-wasi-http", "dep:tokio", "dep:hyper"] wasi-config = ["dep:wasmtime-wasi-config"] @@ -509,6 +523,14 @@ run = [ "wasmtime-cli-flags/async", ] completion = ["dep:clap_complete"] +objdump = [ + 'dep:object', + 'dep:cranelift-codegen', + 'dep:capstone', + 'dep:termcolor', + 'dep:gimli', + 'pulley-interpreter/disas', +] [[test]] name = "disas" diff --git a/README.md b/README.md index 6cd36d83ef..d5ddf40c5e 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,10 @@ Windows or otherwise interested users can download installers and binaries directly from the [GitHub Releases](https://github.com/bytecodealliance/wasmtime/releases) page. +Documentation on Wasmtime's currently supported versions can be found [in the +online book +documentation](https://docs.wasmtime.dev/stability-release.html#current-versions). + ## Example If you've got the [Rust compiler diff --git a/ci/trigger-release-branch-ci.rs b/ci/trigger-release-branch-ci.rs new file mode 100644 index 0000000000..4e56194d90 --- /dev/null +++ b/ci/trigger-release-branch-ci.rs @@ -0,0 +1,67 @@ +//! Helper script used by `.github/workflows/ci-cron-trigger.yml` + +use std::process::Command; + +fn main() { + let output = Command::new("git") + .arg("for-each-ref") + .arg("refs/remotes/origin") + .arg("--format") + .arg("%(refname)") + .output() + .unwrap(); + assert!(output.status.success()); + let mut releases = std::str::from_utf8(&output.stdout) + .unwrap() + .lines() + .filter_map(|l| l.strip_prefix("refs/remotes/origin/release-")) + .filter_map(|l| { + let mut parts = l.split('.'); + let major = parts.next()?.parse::().ok()?; + let minor = parts.next()?.parse::().ok()?; + let patch = parts.next()?.parse::().ok()?; + Some((major, minor, patch)) + }) + .collect::>(); + releases.sort(); + + let mut to_trigger: Vec<(u32, u32, u32)> = Vec::new(); + let mut iter = releases.iter().rev(); + + // Pick the latest 3 release branches to keep up-to-date. Although we + // only promise the last 2 are going to be released with security fixes when + // a new release branch is made that means there's one "pending" release + // branch and two "active" release branches. In that situation we want to + // update 3 branches. If there's no "pending" branch then we'll just be + // keeping some older branch's CI working, which shouldn't be too hard. + to_trigger.extend(iter.by_ref().take(3)); + + // We support two LTS channels 12 versions apart. If one is already included + // in the above set of 3 latest releases, however, then we're only picking + // one historical LTS release. + let mut lts_channels = 2; + if to_trigger.iter().any(|(major, _, _)| *major % 12 == 0) { + lts_channels -= 1; + } + + // Look for LTS releases, defined by every-12-versions which are after v24. + to_trigger.extend( + iter.filter(|(major, _, _)| *major % 12 == 0 && *major > 20) + .take(lts_channels), + ); + + println!("{to_trigger:?}"); + + for (major, minor, patch) in to_trigger { + dbg!(major, minor, patch); + let status = Command::new("gh") + .arg("workflow") + .arg("run") + .arg("main.yml") + .arg("--ref") + .arg(format!("release-{major}.{minor}.{patch}")) + .status() + .unwrap(); + assert!(status.success()); + } +} diff --git a/ci/vendor-wit.sh b/ci/vendor-wit.sh index 5e387c8270..d8e4645db2 100755 --- a/ci/vendor-wit.sh +++ b/ci/vendor-wit.sh @@ -59,6 +59,11 @@ make_vendor "wasi-http" " http@v0.2.3 " +make_vendor "wasi-tls" " + io@v0.2.3 + tls@v0.2.0-draft+d6fbdc7 +" + make_vendor "wasi-config" "config@f4d699b" make_vendor "wasi-keyvalue" "keyvalue@219ea36" diff --git a/cranelift/assembler-x64/build.rs b/cranelift/assembler-x64/build.rs index a7670ce980..7309fe57e0 100644 --- a/cranelift/assembler-x64/build.rs +++ b/cranelift/assembler-x64/build.rs @@ -9,11 +9,7 @@ fn main() { let out_dir = env::var("OUT_DIR").expect("The OUT_DIR environment variable must be set"); let out_dir = Path::new(&out_dir); - let built_files = [ - meta::generate_rust_assembler(out_dir.join("assembler.rs")), - meta::generate_isle_macro(out_dir.join("assembler-isle-macro.rs")), - meta::generate_isle_definitions(out_dir.join("assembler-definitions.isle")), - ]; + let built_files = [meta::generate_rust_assembler(out_dir, "assembler.rs")]; // Generating this additional bit of Rust is necessary for listing the // generated files. diff --git a/cranelift/assembler-x64/meta/.rustfmt.toml b/cranelift/assembler-x64/meta/.rustfmt.toml index 69f0bd318c..eaf5ddcbfe 100644 --- a/cranelift/assembler-x64/meta/.rustfmt.toml +++ b/cranelift/assembler-x64/meta/.rustfmt.toml @@ -1,5 +1,5 @@ # This extra configuration allows defining extra-long lines in # `src/instructions`. fn_call_width = 100 -max_width = 110 +max_width = 120 struct_lit_width = 50 diff --git a/cranelift/assembler-x64/meta/Cargo.toml b/cranelift/assembler-x64/meta/Cargo.toml index d9c667150f..7706859db3 100644 --- a/cranelift/assembler-x64/meta/Cargo.toml +++ b/cranelift/assembler-x64/meta/Cargo.toml @@ -7,6 +7,7 @@ edition.workspace = true rust-version.workspace = true [dependencies] +cranelift-srcgen = { workspace = true } [lints] workspace = true diff --git a/cranelift/assembler-x64/meta/src/dsl.rs b/cranelift/assembler-x64/meta/src/dsl.rs index 36a8236146..29ae52bf5d 100644 --- a/cranelift/assembler-x64/meta/src/dsl.rs +++ b/cranelift/assembler-x64/meta/src/dsl.rs @@ -8,9 +8,10 @@ mod encoding; mod features; pub mod format; -pub use encoding::{rex, vex, Encoding, LegacyPrefix, Rex}; +pub use encoding::{rex, vex}; +pub use encoding::{Encoding, Group1Prefix, Group2Prefix, Group3Prefix, Group4Prefix, Opcodes, Prefixes, Rex}; pub use features::{Feature, Features, ALL_FEATURES}; -pub use format::{fmt, r, rw, sxl, sxq, sxw}; +pub use format::{align, fmt, r, rw, sxl, sxq, sxw}; pub use format::{Extension, Format, Location, Mutability, Operand, OperandKind}; /// Abbreviated constructor for an x64 instruction. diff --git a/cranelift/assembler-x64/meta/src/dsl/encoding.rs b/cranelift/assembler-x64/meta/src/dsl/encoding.rs index 6ad3599a62..fa89fd0bcc 100644 --- a/cranelift/assembler-x64/meta/src/dsl/encoding.rs +++ b/cranelift/assembler-x64/meta/src/dsl/encoding.rs @@ -98,12 +98,6 @@ pub struct Rex { /// the instruction's opcode." pub digit: Option, /// The number of bits used as an immediate operand to the instruction. - /// - /// From the reference manual: "a 1-byte (ib), 2-byte (iw), 4-byte (id) or - /// 8-byte (io) immediate operand to the instruction that follows the - /// opcode, ModR/M bytes or scale-indexing bytes. The opcode determines if - /// the operand is a signed value. All words, doublewords, and quadwords are - /// given with the low-order byte first." pub imm: Imm, } @@ -188,17 +182,17 @@ impl Rex { assert!(!(self.r && self.digit.is_some())); assert!(!(self.r && self.imm != Imm::None)); assert!( - !(self.w && (self.opcodes.prefix.contains_66())), + !(self.w && (self.opcodes.prefixes.has_operand_size_override())), "though valid, if REX.W is set then the 66 prefix is ignored--avoid encoding this" ); - if self.opcodes.prefix.contains_66() { + if self.opcodes.prefixes.has_operand_size_override() { assert!( - operands.iter().all(|&op| matches!( - op.location.kind(), - OperandKind::Imm(_) | OperandKind::FixedReg(_) - ) || op.location.bits() == 16 - || op.location.bits() == 128), + operands + .iter() + .all(|&op| matches!(op.location.kind(), OperandKind::Imm(_) | OperandKind::FixedReg(_)) + || op.location.bits() == 16 + || op.location.bits() == 128), "when we encode the 66 prefix, we expect all operands to be 16-bit wide" ); } @@ -225,14 +219,17 @@ impl From for Encoding { impl fmt::Display for Rex { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self.opcodes.prefix { - LegacyPrefix::NoPrefix => {} - LegacyPrefix::_66 => write!(f, "0x66 + ")?, - LegacyPrefix::_F0 => write!(f, "0xF0 + ")?, - LegacyPrefix::_66F0 => write!(f, "0x66 0xF0 + ")?, - LegacyPrefix::_F2 => write!(f, "0xF2 + ")?, - LegacyPrefix::_F3 => write!(f, "0xF3 + ")?, - LegacyPrefix::_66F3 => write!(f, "0x66 0xF3 + ")?, + if let Some(group1) = &self.opcodes.prefixes.group1 { + write!(f, "{group1} + ")?; + } + if let Some(group2) = &self.opcodes.prefixes.group2 { + write!(f, "{group2} + ")?; + } + if let Some(group3) = &self.opcodes.prefixes.group3 { + write!(f, "{group3} + ")?; + } + if let Some(group4) = &self.opcodes.prefixes.group4 { + write!(f, "{group4} + ")?; } if self.w { write!(f, "REX.W + ")?; @@ -289,7 +286,7 @@ impl fmt::Display for Rex { /// > sequence: `66 0F 38 01`. The first byte is the mandatory prefix. pub struct Opcodes { /// The prefix bytes for this instruction. - pub prefix: LegacyPrefix, + pub prefixes: Prefixes, /// Indicates the use of an escape opcode byte, `0x0f`. pub escape: bool, /// The primary opcode. @@ -301,7 +298,7 @@ pub struct Opcodes { impl From for Opcodes { fn from(primary: u8) -> Opcodes { Opcodes { - prefix: LegacyPrefix::NoPrefix, + prefixes: Prefixes::default(), escape: false, primary, secondary: None, @@ -309,109 +306,248 @@ impl From for Opcodes { } } -impl From<[u8; 1]> for Opcodes { - fn from(bytes: [u8; 1]) -> Opcodes { - Opcodes::from(bytes[0]) +impl From<[u8; N]> for Opcodes { + fn from(bytes: [u8; N]) -> Self { + let (prefixes, remaining) = Prefixes::parse(&bytes); + let (escape, primary, secondary) = match remaining { + [primary] => (false, *primary, None), + [0x0f, primary] => (true, *primary, None), + [0x0f, primary, secondary] => (true, *primary, Some(*secondary)), + _ => panic!("invalid opcodes after prefix; expected [opcode], [0x0f, opcode], or [0x0f, opcode, opcode], found {remaining:?}"), + }; + Self { prefixes, escape, primary, secondary } } } -impl From<[u8; 2]> for Opcodes { - fn from(bytes: [u8; 2]) -> Opcodes { - let [a, b] = bytes; - match (LegacyPrefix::try_from(a), b) { - (Ok(prefix), primary) => Opcodes { prefix, escape: false, primary, secondary: None }, - (Err(0x0f), primary) => Opcodes { - prefix: LegacyPrefix::NoPrefix, - escape: true, - primary, - secondary: None, - }, - _ => panic!("invalid opcodes; expected [prefix, opcode] or [0x0f, opcode]"), +/// The allowed prefixes for an instruction. From the reference manual (section +/// 2.1.1): +/// +/// > Instruction prefixes are divided into four groups, each with a set of +/// > allowable prefix codes. For each instruction, it is only useful to include +/// > up to one prefix code from each of the four groups (Groups 1, 2, 3, 4). +/// > Groups 1 through 4 may be placed in any order relative to each other. +#[derive(Default)] +pub struct Prefixes { + pub group1: Option, + pub group2: Option, + pub group3: Option, + pub group4: Option, +} + +impl Prefixes { + /// Parse a slice of `bytes` into a set of prefixes, returning both the + /// configured [`Prefixes`] as well as any remaining bytes. + fn parse(mut bytes: &[u8]) -> (Self, &[u8]) { + let mut prefixes = Self::default(); + while !bytes.is_empty() && prefixes.try_assign(bytes[0]).is_ok() { + bytes = &bytes[1..]; } + (prefixes, bytes) + } + + /// Attempt to parse a `byte` as a prefix and, if successful, assigns it to + /// the correct prefix group. + /// + /// # Panics + /// + /// This function panics if the prefix for a group is already set; this + /// disallows specifying multiple prefixes per group. + fn try_assign(&mut self, byte: u8) -> Result<(), ()> { + if let Ok(p) = Group1Prefix::try_from(byte) { + assert!(self.group1.is_none()); + self.group1 = Some(p); + Ok(()) + } else if let Ok(p) = Group2Prefix::try_from(byte) { + assert!(self.group2.is_none()); + self.group2 = Some(p); + Ok(()) + } else if let Ok(p) = Group3Prefix::try_from(byte) { + assert!(self.group3.is_none()); + self.group3 = Some(p); + Ok(()) + } else if let Ok(p) = Group4Prefix::try_from(byte) { + assert!(self.group4.is_none()); + self.group4 = Some(p); + Ok(()) + } else { + Err(()) + } + } + + /// Check if the `0x66` prefix is present. + fn has_operand_size_override(&self) -> bool { + matches!(self.group3, Some(Group3Prefix::OperandSizeOverride)) + } + + /// Check if any prefix is present. + pub fn is_empty(&self) -> bool { + self.group1.is_none() && self.group2.is_none() && self.group3.is_none() && self.group4.is_none() } } -impl From<[u8; 3]> for Opcodes { - fn from(bytes: [u8; 3]) -> Opcodes { - let [a, b, c] = bytes; - match (LegacyPrefix::try_from(a), b, c) { - (Ok(prefix), 0x0f, primary) => Opcodes { prefix, escape: true, primary, secondary: None }, - (Err(0x0f), primary, secondary) => Opcodes { - prefix: LegacyPrefix::NoPrefix, - escape: true, - primary, - secondary: Some(secondary), - }, - _ => panic!("invalid opcodes; expected [prefix, 0x0f, opcode] or [0x0f, opcode, opcode]"), +pub enum Group1Prefix { + /// The LOCK prefix (`0xf0`). From the reference manual: + /// + /// > The LOCK prefix (F0H) forces an operation that ensures exclusive use + /// > of shared memory in a multiprocessor environment. See "LOCK—Assert + /// > LOCK# Signal Prefix" in Chapter 3, Instruction Set Reference, A-L, for + /// > a description of this prefix. + Lock, + /// A REPNE/REPNZ prefix (`0xf2`) or a BND prefix under certain conditions. + /// `REP*` prefixes apply only to string and input/output instructions but + /// can be used as mandatory prefixes in other kinds of instructions (e.g., + /// SIMD) From the reference manual: + /// + /// > Repeat prefixes (F2H, F3H) cause an instruction to be repeated for + /// > each element of a string. Use these prefixes only with string and I/O + /// > instructions (MOVS, CMPS, SCAS, LODS, STOS, INS, and OUTS). Use of + /// > repeat prefixes and/or undefined opcodes with other Intel 64 or IA-32 + /// > instructions is reserved; such use may cause unpredictable behavior. + /// > + /// > Some instructions may use F2H, F3H as a mandatory prefix to express + /// > distinct functionality. + REPNorBND, + /// A REPE/REPZ prefix (`0xf3`); `REP*` prefixes apply only to string and + /// input/output instructions but can be used as mandatory prefixes in other + /// kinds of instructions (e.g., SIMD). See `REPNorBND` for more details. + REP_, +} + +impl TryFrom for Group1Prefix { + type Error = u8; + fn try_from(byte: u8) -> Result { + Ok(match byte { + 0xF0 => Group1Prefix::Lock, + 0xF2 => Group1Prefix::REPNorBND, + 0xF3 => Group1Prefix::REP_, + byte => return Err(byte), + }) + } +} + +impl fmt::Display for Group1Prefix { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Group1Prefix::Lock => write!(f, "0xF0"), + Group1Prefix::REPNorBND => write!(f, "0xF2"), + Group1Prefix::REP_ => write!(f, "0xF3"), } } } -impl From<[u8; 4]> for Opcodes { - fn from(bytes: [u8; 4]) -> Opcodes { - let [a, b, c, d] = bytes; - match (LegacyPrefix::try_from(a), b, c, d) { - (Ok(prefix), 0x0f, primary, secondary) => Opcodes { - prefix, - escape: false, - primary, - secondary: Some(secondary), - }, - _ => panic!("invalid opcodes; expected [prefix, 0x0f, opcode, opcode]"), +/// Contains the segment override prefixes or a (deprecated) branch hint when +/// used on a `Jcc` instruction. Note that using the segment override prefixes +/// on a branch instruction is reserved. See section 2.1.1, "Instruction +/// Prefixes," in the reference manual. +pub enum Group2Prefix { + /// The CS segment override prefix (`0x2e`); also the "branch not taken" + /// hint. + CSorBNT, + /// The SS segment override prefix (`0x36`). + SS, + /// The DS segment override prefix (`0x3e`); also the "branch taken" hint. + DSorBT, + /// The ES segment override prefix (`0x26`). + ES, + /// The FS segment override prefix (`0x64`). + FS, + /// The GS segment override prefix (`0x65`). + GS, +} + +impl TryFrom for Group2Prefix { + type Error = u8; + fn try_from(byte: u8) -> Result { + Ok(match byte { + 0x2E => Group2Prefix::CSorBNT, + 0x36 => Group2Prefix::SS, + 0x3E => Group2Prefix::DSorBT, + 0x26 => Group2Prefix::ES, + 0x64 => Group2Prefix::FS, + 0x65 => Group2Prefix::GS, + byte => return Err(byte), + }) + } +} + +impl fmt::Display for Group2Prefix { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Group2Prefix::CSorBNT => write!(f, "0x2E"), + Group2Prefix::SS => write!(f, "0x36"), + Group2Prefix::DSorBT => write!(f, "0x3E"), + Group2Prefix::ES => write!(f, "0x26"), + Group2Prefix::FS => write!(f, "0x64"), + Group2Prefix::GS => write!(f, "0x65"), } } } -/// A prefix byte for an instruction. -#[derive(PartialEq)] -pub enum LegacyPrefix { - /// No prefix bytes. - NoPrefix, - /// An operand size override typically denoting "16-bit operation" or "SSE instructions". But the - /// reference manual is more nuanced: - /// - /// > The operand-size override prefix allows a program to switch between - /// > 16- and 32-bit operand sizes. Either size can be the default; use of - /// > the prefix selects the non-default. - /// > Some SSE2/SSE3/SSSE3/SSE4 instructions and instructions using a three-byte - /// > sequence of primary opcode bytes may use 66H as a mandatory prefix to express - /// > distinct functionality. - _66, - /// The lock prefix. - _F0, - /// Operand size override and lock. - _66F0, - /// REPNE, but no specific meaning here -- is just an opcode extension. - _F2, - /// REP/REPE, but no specific meaning here -- is just an opcode extension. - _F3, - /// Operand size override and same effect as F3. - _66F3, +/// Contains the operand-size override prefix (`0x66`); also used as a SIMD +/// prefix. From the reference manual: +/// +/// > The operand-size override prefix allows a program to switch between 16- +/// > and 32-bit operand sizes. Either size can be the default; use of the +/// > prefix selects the non-default size. Some SSE2/SSE3/SSSE3/SSE4 +/// > instructions and instructions using a three-byte sequence of primary +/// > opcode bytes may use 66H as a mandatory prefix to express distinct +/// > functionality. +pub enum Group3Prefix { + OperandSizeOverride, } -impl LegacyPrefix { - #[must_use] - pub fn contains_66(&self) -> bool { +impl TryFrom for Group3Prefix { + type Error = u8; + fn try_from(byte: u8) -> Result { + Ok(match byte { + 0x66 => Group3Prefix::OperandSizeOverride, + byte => return Err(byte), + }) + } +} + +impl fmt::Display for Group3Prefix { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { - LegacyPrefix::_66 | LegacyPrefix::_66F0 | LegacyPrefix::_66F3 => true, - LegacyPrefix::NoPrefix | LegacyPrefix::_F0 | LegacyPrefix::_F2 | LegacyPrefix::_F3 => false, + Group3Prefix::OperandSizeOverride => write!(f, "0x66"), } } } -impl TryFrom for LegacyPrefix { +/// Contains the address-size override prefix (`0x67`). From the reference +/// manual: +/// +/// > The address-size override prefix (67H) allows programs to switch between +/// > 16- and 32-bit addressing. Either size can be the default; the prefix +/// > selects the non-default size. +pub enum Group4Prefix { + AddressSizeOverride, +} + +impl TryFrom for Group4Prefix { type Error = u8; fn try_from(byte: u8) -> Result { Ok(match byte { - 0x66 => LegacyPrefix::_66, - 0xF0 => LegacyPrefix::_F0, - 0xF2 => LegacyPrefix::_F2, - 0xF3 => LegacyPrefix::_F3, + 0x67 => Group4Prefix::AddressSizeOverride, byte => return Err(byte), }) } } +impl fmt::Display for Group4Prefix { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Group4Prefix::AddressSizeOverride => write!(f, "0x67"), + } + } +} + +/// Indicate the size of an immediate operand. From the reference manual: +/// +/// > A 1-byte (ib), 2-byte (iw), 4-byte (id) or 8-byte (io) immediate operand +/// > to the instruction that follows the opcode, ModR/M bytes or scale-indexing +/// > bytes. The opcode determines if the operand is a signed value. All words, +/// > doublewords, and quadwords are given with the low-order byte first. #[derive(Debug, PartialEq)] #[allow(non_camel_case_types, reason = "makes DSL definitions easier to read")] pub enum Imm { diff --git a/cranelift/assembler-x64/meta/src/dsl/features.rs b/cranelift/assembler-x64/meta/src/dsl/features.rs index f643f257be..95c03e3100 100644 --- a/cranelift/assembler-x64/meta/src/dsl/features.rs +++ b/cranelift/assembler-x64/meta/src/dsl/features.rs @@ -13,6 +13,13 @@ use std::ops::BitOr; /// let fs = Feature::_64b | Feature::compat; /// assert_eq!(fs.to_string(), "_64b | compat"); /// ``` +/// +/// Duplicate features are not allowed and will cause a panic. +/// +/// ```should_panic +/// # use cranelift_assembler_x64_meta::dsl::Feature; +/// let fs = Feature::_64b | Feature::_64b; +/// ``` #[derive(PartialEq)] pub struct Features(Vec); @@ -29,15 +36,7 @@ impl Features { impl fmt::Display for Features { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!( - f, - "{}", - self.0 - .iter() - .map(ToString::to_string) - .collect::>() - .join(" | ") - ) + write!(f, "{}", self.0.iter().map(ToString::to_string).collect::>().join(" | ")) } } @@ -47,11 +46,15 @@ impl fmt::Display for Features { /// processors. It consists of two sub-modes: /// - __64-bit mode__: uses the full 64-bit address space /// - __compatibility mode__: allows use of legacy 32-bit code -#[derive(Clone, Copy, PartialEq)] +/// +/// Other features listed here should match the __CPUID Feature Flags__ column +/// of the instruction tables of the x64 reference manual. +#[derive(Clone, Copy, Debug, PartialEq)] #[allow(non_camel_case_types, reason = "makes DSL definitions easier to read")] pub enum Feature { _64b, compat, + sse, } /// List all CPU features. @@ -61,13 +64,14 @@ pub enum Feature { /// transcribe each variant to an `enum` available in the generated layer above. /// If this list is incomplete, we will (fortunately) see compile errors for /// generated functions that use the missing variants. -pub const ALL_FEATURES: &[Feature] = &[Feature::_64b, Feature::compat]; +pub const ALL_FEATURES: &[Feature] = &[Feature::_64b, Feature::compat, Feature::sse]; impl fmt::Display for Feature { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { Feature::_64b => write!(f, "_64b"), Feature::compat => write!(f, "compat"), + Feature::sse => write!(f, "sse"), } } } @@ -87,6 +91,16 @@ impl From> for Features { impl BitOr for Feature { type Output = Features; fn bitor(self, rhs: Self) -> Self::Output { + assert_ne!(self, rhs, "duplicate feature: {self:?}"); Features(vec![self, rhs]) } } + +impl BitOr for Features { + type Output = Features; + fn bitor(mut self, rhs: Feature) -> Self::Output { + assert!(!self.0.contains(&rhs), "duplicate feature: {rhs:?}"); + self.0.push(rhs); + self + } +} diff --git a/cranelift/assembler-x64/meta/src/dsl/format.rs b/cranelift/assembler-x64/meta/src/dsl/format.rs index 42290bf940..37ac70a405 100644 --- a/cranelift/assembler-x64/meta/src/dsl/format.rs +++ b/cranelift/assembler-x64/meta/src/dsl/format.rs @@ -37,16 +37,26 @@ pub fn rw(location: Location) -> Operand { location, mutability: Mutability::ReadWrite, extension: Extension::default(), + align: false, } } /// An abbreviated constructor for a "read" operand. #[must_use] -pub fn r(location: Location) -> Operand { +pub fn r(op: impl Into) -> Operand { + let op = op.into(); + assert!(op.mutability.is_read()); + op +} + +/// An abbreviated constructor for a memory operand that requires alignment. +pub fn align(location: Location) -> Operand { + assert!(location.uses_memory()); Operand { location, mutability: Mutability::Read, extension: Extension::None, + align: true, } } @@ -63,6 +73,7 @@ pub fn sxq(location: Location) -> Operand { location, mutability: Mutability::Read, extension: Extension::SignExtendQuad, + align: false, } } @@ -79,6 +90,7 @@ pub fn sxl(location: Location) -> Operand { location, mutability: Mutability::Read, extension: Extension::SignExtendLong, + align: false, } } @@ -95,6 +107,7 @@ pub fn sxw(location: Location) -> Operand { location, mutability: Mutability::Read, extension: Extension::SignExtendWord, + align: false, } } @@ -153,10 +166,11 @@ impl core::fmt::Display for Format { /// _Instruction Set Reference_. /// /// ``` -/// # use cranelift_assembler_x64_meta::dsl::{Operand, r, rw, sxq, Location::*}; +/// # use cranelift_assembler_x64_meta::dsl::{align, r, rw, sxq, Location::*}; /// assert_eq!(r(r8).to_string(), "r8"); /// assert_eq!(rw(rm16).to_string(), "rm16[rw]"); /// assert_eq!(sxq(imm32).to_string(), "imm32[sxq]"); +/// assert_eq!(align(rm128).to_string(), "rm128[align]"); /// ``` #[derive(Clone, Copy, Debug)] pub struct Operand { @@ -166,19 +180,28 @@ pub struct Operand { pub mutability: Mutability, /// Some operands are sign- or zero-extended. pub extension: Extension, + /// Some memory operands require alignment; `true` indicates that the memory + /// address used in the operand must align to the size of the operand (e.g., + /// `m128` must be 16-byte aligned). + pub align: bool, } impl core::fmt::Display for Operand { fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { - let Self { location, mutability, extension } = self; + let Self { location, mutability, extension, align } = self; write!(f, "{location}")?; - let has_default_mutability = matches!(mutability, Mutability::Read); - let has_default_extension = matches!(extension, Extension::None); - match (has_default_mutability, has_default_extension) { - (true, true) => {} - (true, false) => write!(f, "[{extension}]")?, - (false, true) => write!(f, "[{mutability}]")?, - (false, false) => write!(f, "[{mutability},{extension}]")?, + let mut flags = vec![]; + if !matches!(mutability, Mutability::Read) { + flags.push(format!("{mutability}")); + } + if !matches!(extension, Extension::None) { + flags.push(format!("{extension}")); + } + if *align != false { + flags.push("align".to_owned()); + } + if !flags.is_empty() { + write!(f, "[{}]", flags.join(","))?; } Ok(()) } @@ -188,7 +211,8 @@ impl From for Operand { fn from(location: Location) -> Self { let mutability = Mutability::default(); let extension = Extension::default(); - Self { location, mutability, extension } + let align = false; + Self { location, mutability, extension, align } } } @@ -219,6 +243,11 @@ pub enum Location { rm32, rm64, rm128, + + m8, + m16, + m32, + m64, } impl Location { @@ -227,10 +256,10 @@ impl Location { pub fn bits(&self) -> u8 { use Location::*; match self { - al | cl | imm8 | r8 | rm8 => 8, - ax | imm16 | r16 | rm16 => 16, - eax | imm32 | r32 | rm32 => 32, - rax | r64 | rm64 => 64, + al | cl | imm8 | r8 | rm8 | m8 => 8, + ax | imm16 | r16 | rm16 | m16 => 16, + eax | imm32 | r32 | rm32 | m32 => 32, + rax | r64 | rm64 | m64 => 64, xmm | rm128 => 128, } } @@ -247,7 +276,7 @@ impl Location { use Location::*; match self { al | cl | ax | eax | rax | imm8 | imm16 | imm32 | r8 | r16 | r32 | r64 | xmm => false, - rm8 | rm16 | rm32 | rm64 | rm128 => true, + rm8 | rm16 | rm32 | rm64 | rm128 | m8 | m16 | m32 | m64 => true, } } @@ -258,7 +287,7 @@ impl Location { use Location::*; match self { al | ax | eax | rax | cl | imm8 | imm16 | imm32 => false, - r8 | r16 | r32 | r64 | xmm | rm8 | rm16 | rm32 | rm64 | rm128 => true, + r8 | r16 | r32 | r64 | xmm | rm8 | rm16 | rm32 | rm64 | rm128 | m8 | m16 | m32 | m64 => true, } } @@ -271,6 +300,7 @@ impl Location { imm8 | imm16 | imm32 => OperandKind::Imm(*self), r8 | r16 | r32 | r64 | xmm => OperandKind::Reg(*self), rm8 | rm16 | rm32 | rm64 | rm128 => OperandKind::RegMem(*self), + m8 | m16 | m32 | m64 => OperandKind::Mem(*self), } } } @@ -302,6 +332,11 @@ impl core::fmt::Display for Location { rm32 => write!(f, "rm32"), rm64 => write!(f, "rm64"), rm128 => write!(f, "rm128"), + + m8 => write!(f, "m8"), + m16 => write!(f, "m16"), + m32 => write!(f, "m32"), + m64 => write!(f, "m64"), } } } @@ -318,6 +353,7 @@ pub enum OperandKind { Imm(Location), Reg(Location), RegMem(Location), + Mem(Location), } /// x64 operands can be mutable or not. diff --git a/cranelift/assembler-x64/meta/src/generate.rs b/cranelift/assembler-x64/meta/src/generate.rs index 75c216d013..f199ad7bbf 100644 --- a/cranelift/assembler-x64/meta/src/generate.rs +++ b/cranelift/assembler-x64/meta/src/generate.rs @@ -2,13 +2,11 @@ mod features; mod format; -mod formatter; mod inst; mod operand; use crate::dsl; -use formatter::fmtln; -pub use formatter::{maybe_file_loc, Formatter}; +use cranelift_srcgen::{fmtln, Formatter}; /// Generate the Rust assembler code; e.g., `enum Inst { ... }`. pub fn rust_assembler(f: &mut Formatter, insts: &[dsl::Inst]) { @@ -33,63 +31,6 @@ pub fn rust_assembler(f: &mut Formatter, insts: &[dsl::Inst]) { dsl::Feature::generate_enum(f); } -/// Generate the `isle_assembler_methods!` macro. -pub fn isle_macro(f: &mut Formatter, insts: &[dsl::Inst]) { - fmtln!(f, "#[macro_export]"); - fmtln!(f, "macro_rules! isle_assembler_methods {{"); - f.indent(|f| { - fmtln!(f, "() => {{"); - f.indent(|f| { - for inst in insts { - inst.generate_isle_macro(f); - } - }); - fmtln!(f, "}};"); - }); - fmtln!(f, "}}"); -} - -/// Generate the ISLE definitions that match the `isle_assembler_methods!` macro -/// above. -pub fn isle_definitions(f: &mut Formatter, insts: &[dsl::Inst]) { - f.line("(type AssemblerOutputs (enum", None); - f.line(" ;; Used for instructions that have ISLE `SideEffect`s (memory stores, traps,", None); - f.line(" ;; etc.) and do not return a `Value`.", None); - f.line(" (SideEffect (inst MInst))", None); - f.line(" ;; Used for instructions that return a GPR (including `GprMem` variants with", None); - f.line(" ;; a GPR as the first argument).", None); - f.line(" (RetGpr (inst MInst) (gpr Gpr))", None); - f.line(" ;; Used for instructions that return an XMM register.", None); - f.line(" (RetXmm (inst MInst) (xmm Xmm))", None); - f.line(" ;; TODO: eventually add more variants for multi-return, XMM, etc.; see", None); - f.line(" ;; https://github.com/bytecodealliance/wasmtime/pull/10276", None); - f.line("))", None); - f.empty_line(); - - f.line(";; Directly emit instructions that return a GPR.", None); - f.line("(decl emit_ret_gpr (AssemblerOutputs) Gpr)", None); - f.line("(rule (emit_ret_gpr (AssemblerOutputs.RetGpr inst gpr))", None); - f.line(" (let ((_ Unit (emit inst))) gpr))", None); - f.empty_line(); - - f.line(";; Directly emit instructions that return an XMM register.", None); - f.line("(decl emit_ret_xmm (AssemblerOutputs) Xmm)", None); - f.line("(rule (emit_ret_xmm (AssemblerOutputs.RetXmm inst xmm))", None); - f.line(" (let ((_ Unit (emit inst))) xmm))", None); - f.empty_line(); - - f.line(";; Pass along the side-effecting instruction for later emission.", None); - f.line("(decl defer_side_effect (AssemblerOutputs) SideEffectNoResult)", None); - f.line("(rule (defer_side_effect (AssemblerOutputs.SideEffect inst))", None); - f.line(" (SideEffectNoResult.Inst inst))", None); - f.empty_line(); - - for inst in insts { - inst.generate_isle_definition(f); - f.empty_line(); - } -} - /// `enum Inst { ... }` fn generate_inst_enum(f: &mut Formatter, insts: &[dsl::Inst]) { fmtln!(f, "#[doc(hidden)]"); @@ -108,16 +49,16 @@ fn generate_inst_enum(f: &mut Formatter, insts: &[dsl::Inst]) { /// `#[derive(...)]` fn generate_derive(f: &mut Formatter) { - f.line("#[derive(Clone, Debug)]", None); - f.line("#[cfg_attr(any(test, feature = \"fuzz\"), derive(arbitrary::Arbitrary))]", None); + fmtln!(f, "#[derive(Clone, Debug)]"); + fmtln!(f, "#[cfg_attr(any(test, feature = \"fuzz\"), derive(arbitrary::Arbitrary))]"); } /// Adds a custom bound to the `Arbitrary` implementation which ensures that /// the associated registers are all `Arbitrary` as well. fn generate_derive_arbitrary_bounds(f: &mut Formatter) { - f.line( - "#[cfg_attr(any(test, feature = \"fuzz\"), arbitrary(bound = \"R: crate::fuzz::RegistersArbitrary\"))]", - None, + fmtln!( + f, + "#[cfg_attr(any(test, feature = \"fuzz\"), arbitrary(bound = \"R: crate::fuzz::RegistersArbitrary\"))]" ); } diff --git a/cranelift/assembler-x64/meta/src/generate/features.rs b/cranelift/assembler-x64/meta/src/generate/features.rs index f86266b53d..7080ed3a4c 100644 --- a/cranelift/assembler-x64/meta/src/generate/features.rs +++ b/cranelift/assembler-x64/meta/src/generate/features.rs @@ -12,12 +12,10 @@ impl dsl::Feature { fmtln!(f, "#[doc(hidden)]"); generate_derive(f); fmtln!(f, "#[derive(Copy, PartialEq)]"); // Add a couple more helpful derives. - fmtln!(f, "pub enum Feature {{"); - f.indent(|f| { + f.add_block("pub enum Feature", |f| { for feature in dsl::ALL_FEATURES { fmtln!(f, "{feature},"); } }); - fmtln!(f, "}}"); } } diff --git a/cranelift/assembler-x64/meta/src/generate/format.rs b/cranelift/assembler-x64/meta/src/generate/format.rs index 922a5937a0..dbf3b5770f 100644 --- a/cranelift/assembler-x64/meta/src/generate/format.rs +++ b/cranelift/assembler-x64/meta/src/generate/format.rs @@ -3,7 +3,6 @@ use super::{fmtln, Formatter}; use crate::dsl; -use crate::generate::inst::IsleConstructor; impl dsl::Format { /// Re-order the Intel-style operand order to accommodate ATT-style @@ -26,7 +25,7 @@ impl dsl::Format { } pub fn generate_rex_encoding(&self, f: &mut Formatter, rex: &dsl::Rex) { - self.generate_legacy_prefix(f, rex); + self.generate_prefixes(f, rex); self.generate_rex_prefix(f, rex); self.generate_opcodes(f, rex); self.generate_modrm_byte(f, rex); @@ -34,26 +33,22 @@ impl dsl::Format { } /// `buf.put1(...);` - fn generate_legacy_prefix(&self, f: &mut Formatter, rex: &dsl::Rex) { - use dsl::LegacyPrefix::*; - if rex.opcodes.prefix != NoPrefix { + fn generate_prefixes(&self, f: &mut Formatter, rex: &dsl::Rex) { + if !rex.opcodes.prefixes.is_empty() { f.empty_line(); - f.comment("Emit legacy prefixes."); - match rex.opcodes.prefix { - NoPrefix => unreachable!(), - _66 => fmtln!(f, "buf.put1(0x66);"), - _F0 => fmtln!(f, "buf.put1(0xf0);"), - _66F0 => { - fmtln!(f, "buf.put1(0x66);"); - fmtln!(f, "buf.put1(0xf0);"); - } - _F2 => fmtln!(f, "buf.put1(0xf2);"), - _F3 => fmtln!(f, "buf.put1(0xf3);"), - _66F3 => { - fmtln!(f, "buf.put1(0x66);"); - fmtln!(f, "buf.put1(0xf3);"); - } - } + f.comment("Emit prefixes."); + } + if let Some(group1) = &rex.opcodes.prefixes.group1 { + fmtln!(f, "buf.put1({group1});"); + } + if let Some(group2) = &rex.opcodes.prefixes.group2 { + fmtln!(f, "buf.put1({group2});"); + } + if let Some(group3) = &rex.opcodes.prefixes.group3 { + fmtln!(f, "buf.put1({group3});"); + } + if let Some(group4) = &rex.opcodes.prefixes.group4 { + fmtln!(f, "buf.put1({group4});"); } } @@ -71,7 +66,7 @@ impl dsl::Format { } fn generate_rex_prefix(&self, f: &mut Formatter, rex: &dsl::Rex) { - use dsl::OperandKind::{FixedReg, Imm, Reg, RegMem}; + use dsl::OperandKind::{FixedReg, Imm, Mem, Reg, RegMem}; f.empty_line(); f.comment("Emit REX prefix."); @@ -93,22 +88,22 @@ impl dsl::Format { fmtln!(f, "let digit = 0;"); fmtln!(f, "rex.emit_two_op(buf, digit, {dst}.enc());"); } + [Mem(dst), Imm(_)] => { + let digit = rex.digit.expect("REX digit must be set for operands: [Mem, Imm]"); + fmtln!(f, "let digit = 0x{digit:x};"); + fmtln!(f, "self.{dst}.emit_rex_prefix(rex, digit, buf);"); + } [RegMem(dst), Imm(_)] => { - let digit = rex - .digit - .expect("REX digit must be set for operands: [RegMem, Imm]"); + let digit = rex.digit.expect("REX digit must be set for operands: [RegMem, Imm]"); fmtln!(f, "let digit = 0x{digit:x};"); - fmtln!(f, "match &self.{dst} {{"); - f.indent(|f| { + f.add_block(&format!("match &self.{dst}"), |f| { fmtln!(f, "GprMem::Gpr({dst}) => rex.emit_two_op(buf, digit, {dst}.enc()),"); fmtln!(f, "GprMem::Mem({dst}) => {dst}.emit_rex_prefix(rex, digit, buf),"); }); - fmtln!(f, "}}"); } [Reg(dst), RegMem(src)] => { fmtln!(f, "let {dst} = self.{dst}.enc();"); - fmtln!(f, "match &self.{src} {{"); - f.indent(|f| { + f.add_block(&format!("match &self.{src}"), |f| { match dst.bits() { 128 => { fmtln!(f, "XmmMem::Xmm({src}) => rex.emit_two_op(buf, {dst}, {src}.enc()),"); @@ -120,14 +115,14 @@ impl dsl::Format { } }; }); - fmtln!(f, "}}"); } - [RegMem(dst), Reg(src)] - | [RegMem(dst), Reg(src), Imm(_)] - | [RegMem(dst), Reg(src), FixedReg(_)] => { + [Mem(dst), Reg(src)] => { fmtln!(f, "let {src} = self.{src}.enc();"); - fmtln!(f, "match &self.{dst} {{"); - f.indent(|f| match src.bits() { + fmtln!(f, "self.{dst}.emit_rex_prefix(rex, {src}, buf);"); + } + [RegMem(dst), Reg(src)] | [RegMem(dst), Reg(src), Imm(_)] | [RegMem(dst), Reg(src), FixedReg(_)] => { + fmtln!(f, "let {src} = self.{src}.enc();"); + f.add_block(&format!("match &self.{dst}"), |f| match src.bits() { 128 => { fmtln!(f, "XmmMem::Xmm({dst}) => rex.emit_two_op(buf, {src}, {dst}.enc()),"); fmtln!(f, "XmmMem::Mem({dst}) => {dst}.emit_rex_prefix(rex, {src}, buf),"); @@ -137,7 +132,6 @@ impl dsl::Format { fmtln!(f, "GprMem::Mem({dst}) => {dst}.emit_rex_prefix(rex, {src}, buf),"); } }); - fmtln!(f, "}}"); } unknown => unimplemented!("unknown pattern: {unknown:?}"), @@ -145,7 +139,7 @@ impl dsl::Format { } fn generate_modrm_byte(&self, f: &mut Formatter, rex: &dsl::Rex) { - use dsl::OperandKind::{FixedReg, Imm, Reg, RegMem}; + use dsl::OperandKind::{FixedReg, Imm, Mem, Reg, RegMem}; if let [FixedReg(_), Imm(_)] = self.operands_by_kind().as_slice() { // No need to emit a comment. @@ -158,65 +152,52 @@ impl dsl::Format { [FixedReg(_), Imm(_)] => { // No need to emit a ModRM byte: we know the register used. } + [Mem(dst), Imm(_)] => { + let digit = rex.digit.expect("REX digit must be set for operands: [RegMem, Imm]"); + fmtln!(f, "let digit = 0x{digit:x};"); + fmtln!(f, "emit_modrm_sib_disp(buf, off, digit, &self.{dst}, 0, None);"); + } [RegMem(dst), Imm(_)] => { - let digit = rex - .digit - .expect("REX digit must be set for operands: [RegMem, Imm]"); + let digit = rex.digit.expect("REX digit must be set for operands: [RegMem, Imm]"); fmtln!(f, "let digit = 0x{digit:x};"); - fmtln!(f, "match &self.{dst} {{"); - f.indent(|f| { + f.add_block(&format!("match &self.{dst}"), |f| { fmtln!(f, "GprMem::Gpr({dst}) => emit_modrm(buf, digit, {dst}.enc()),"); fmtln!(f, "GprMem::Mem({dst}) => emit_modrm_sib_disp(buf, off, digit, {dst}, 0, None),"); }); - fmtln!(f, "}}"); } [Reg(dst), RegMem(src)] => { fmtln!(f, "let {dst} = self.{dst}.enc();"); - fmtln!(f, "match &self.{src} {{"); - f.indent(|f| { + f.add_block(&format!("match &self.{src}"), |f| { match dst.bits() { 128 => { fmtln!(f, "XmmMem::Xmm({src}) => emit_modrm(buf, {dst}, {src}.enc()),"); - fmtln!( - f, - "XmmMem::Mem({src}) => emit_modrm_sib_disp(buf, off, {dst}, {src}, 0, None)," - ); + fmtln!(f, "XmmMem::Mem({src}) => emit_modrm_sib_disp(buf, off, {dst}, {src}, 0, None),"); } _ => { fmtln!(f, "GprMem::Gpr({src}) => emit_modrm(buf, {dst}, {src}.enc()),"); - fmtln!( - f, - "GprMem::Mem({src}) => emit_modrm_sib_disp(buf, off, {dst}, {src}, 0, None)," - ); + fmtln!(f, "GprMem::Mem({src}) => emit_modrm_sib_disp(buf, off, {dst}, {src}, 0, None),"); } }; }); - fmtln!(f, "}}"); } - [RegMem(dst), Reg(src)] - | [RegMem(dst), Reg(src), Imm(_)] - | [RegMem(dst), Reg(src), FixedReg(_)] => { + [Mem(dst), Reg(src)] => { + fmtln!(f, "let {src} = self.{src}.enc();"); + fmtln!(f, "emit_modrm_sib_disp(buf, off, {src}, &self.{dst}, 0, None);"); + } + [RegMem(dst), Reg(src)] | [RegMem(dst), Reg(src), Imm(_)] | [RegMem(dst), Reg(src), FixedReg(_)] => { fmtln!(f, "let {src} = self.{src}.enc();"); - fmtln!(f, "match &self.{dst} {{"); - f.indent(|f| { + f.add_block(&format!("match &self.{dst}"), |f| { match src.bits() { 128 => { fmtln!(f, "XmmMem::Xmm({dst}) => emit_modrm(buf, {src}, {dst}.enc()),"); - fmtln!( - f, - "XmmMem::Mem({dst}) => emit_modrm_sib_disp(buf, off, {src}, {dst}, 0, None)," - ); + fmtln!(f, "XmmMem::Mem({dst}) => emit_modrm_sib_disp(buf, off, {src}, {dst}, 0, None),"); } _ => { fmtln!(f, "GprMem::Gpr({dst}) => emit_modrm(buf, {src}, {dst}.enc()),"); - fmtln!( - f, - "GprMem::Mem({dst}) => emit_modrm_sib_disp(buf, off, {src}, {dst}, 0, None)," - ); + fmtln!(f, "GprMem::Mem({dst}) => emit_modrm_sib_disp(buf, off, {src}, {dst}, 0, None),"); } }; }); - fmtln!(f, "}}"); } unknown => unimplemented!("unknown pattern: {unknown:?}"), } @@ -238,45 +219,6 @@ impl dsl::Format { } } } - - /// Returns the ISLE constructors that are going to be used when generating - /// this instruction. - /// - /// Note that one instruction might need multiple constructors, such as one - /// for operating on memory and one for operating on registers. - pub fn isle_constructors(&self) -> Vec { - use dsl::Mutability::*; - use dsl::OperandKind::*; - - let write_operands = self - .operands - .iter() - .filter(|o| o.mutability.is_write()) - .collect::>(); - match &write_operands[..] { - [] => unimplemented!("if you truly need this (and not a `SideEffect*`), add a `NoReturn` variant to `AssemblerOutputs`"), - [one] => match one.mutability { - Read => unreachable!(), - ReadWrite => match one.location.kind() { - Imm(_) => unreachable!(), - FixedReg(_) => vec![IsleConstructor::RetGpr], - // One read/write register output? Output the instruction - // and that register. - Reg(r) => match r.bits() { - 128 => vec![IsleConstructor::RetXmm], - _ => vec![IsleConstructor::RetGpr], - }, - // One read/write reg-mem output? We need constructors for - // both variants. - RegMem(rm) => match rm.bits() { - 128 => vec![IsleConstructor::RetXmm, IsleConstructor::RetMemorySideEffect], - _ => vec![IsleConstructor::RetGpr, IsleConstructor::RetMemorySideEffect], - }, - } - }, - other => panic!("unsupported number of write operands {other:?}"), - } - } } impl dsl::Rex { diff --git a/cranelift/assembler-x64/meta/src/generate/formatter.rs b/cranelift/assembler-x64/meta/src/generate/formatter.rs deleted file mode 100644 index d9c6e81d8b..0000000000 --- a/cranelift/assembler-x64/meta/src/generate/formatter.rs +++ /dev/null @@ -1,137 +0,0 @@ -//! Logic for writing generated code to a file. -//! -//! Use [`fmtln`] by default since it will append Rust comments with the original source location. -//! For more control, use the [`Formatter`] directly. The [`Formatter`] logic has been borrowed -//! extensively from `cranelift/codegen/meta/src/srcgen.rs`. - -use std::fs; -use std::io::{self, Write}; - -static SHIFTWIDTH: usize = 4; - -/// A macro that simplifies the usage of the [`Formatter`] by allowing format strings. -macro_rules! fmtln { - ($fmt:ident, $fmtstring:expr, $($fmtargs:expr),*) => { - let loc = crate::generate::maybe_file_loc($fmtstring, file!(), line!()); - $fmt.line(format!($fmtstring, $($fmtargs),*), loc) - }; - - ($fmt:ident, $arg:expr) => {{ - let loc = crate::generate::maybe_file_loc($arg, file!(), line!()); - $fmt.line(format!($arg), loc) - }}; - - ($_:tt, $($args:expr),+) => { - compile_error!("This macro requires at least two arguments: the Formatter instance and a format string.") - }; - - ($_:tt) => { - compile_error!("This macro requires at least two arguments: the Formatter instance and a format string.") - }; -} -pub(crate) use fmtln; - -/// Append a source location comment "intelligently:" only on generated lines that do not start or -/// end a braces block. -pub fn maybe_file_loc(fmtstr: &str, file: &'static str, line: u32) -> Option { - if fmtstr.ends_with(['{', '}']) { - None - } else { - Some(FileLocation { file, line }) - } -} - -/// Record a source location; preferably, use [`fmtln`] directly. -pub struct FileLocation { - file: &'static str, - line: u32, -} - -impl FileLocation { - pub fn new(file: &'static str, line: u32) -> Self { - Self { file, line } - } -} - -impl core::fmt::Display for FileLocation { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}:{}", self.file, self.line) - } -} - -/// Collect source code to be written to a file and keep track of indentation. -#[derive(Default)] -pub struct Formatter { - indent: usize, - lines: Vec, -} - -impl Formatter { - /// Construct a [`Formatter`]. - /// - /// This constructor reminds us to add the `generated_by` header (typically - /// a comment) to the output file. - pub fn new(generated_by: &str, file: &'static str, line: u32) -> Self { - let mut fmt = Self::default(); - let loc = FileLocation::new(file, line); - fmt.line(format!("{generated_by}, {loc}"), None); - fmt - } - - /// Increase current indentation level by one. - pub fn indent_push(&mut self) { - self.indent += 1; - } - - /// Decrease indentation by one level. - pub fn indent_pop(&mut self) { - assert!(self.indent > 0, "Already at top level indentation"); - self.indent -= 1; - } - - /// Write all formatting commands in `f` while indented one level. - pub fn indent T>(&mut self, f: F) -> T { - self.indent_push(); - let ret = f(self); - self.indent_pop(); - ret - } - - /// Get the current whitespace indentation. - fn get_indent(&self) -> String { - if self.indent == 0 { - String::new() - } else { - format!("{:-1$}", " ", self.indent * SHIFTWIDTH) - } - } - - /// Add an indented line. - pub fn line(&mut self, contents: impl AsRef, location: Option) { - let indented_line = if let Some(location) = location { - format!("{} {} // {location}\n", self.get_indent(), contents.as_ref()) - } else { - format!("{}{}\n", self.get_indent(), contents.as_ref()) - }; - self.lines.push(indented_line); - } - - /// Push an empty line. - pub fn empty_line(&mut self) { - self.lines.push("\n".to_string()); - } - - /// Add a comment line. - pub fn comment(&mut self, s: impl AsRef) { - self.line(format!("// {}", s.as_ref()), None); - } - - /// Write the collected lines to a file. - pub fn write(&self, path: impl AsRef) -> io::Result<()> { - let mut f = fs::File::create(path)?; - for l in self.lines.iter().map(String::as_bytes) { - f.write_all(l)?; - } - Ok(()) - } -} diff --git a/cranelift/assembler-x64/meta/src/generate/inst.rs b/cranelift/assembler-x64/meta/src/generate/inst.rs index aa69b72f5d..e1000335af 100644 --- a/cranelift/assembler-x64/meta/src/generate/inst.rs +++ b/cranelift/assembler-x64/meta/src/generate/inst.rs @@ -1,6 +1,5 @@ use super::{fmtln, generate_derive, generate_derive_arbitrary_bounds, Formatter}; use crate::dsl; -use crate::dsl::OperandKind; impl dsl::Inst { /// `struct { : Reg, : Reg, ... }` @@ -12,13 +11,12 @@ impl dsl::Inst { "" }; - f.line(format!("/// `{self}`"), None); + fmtln!(f, "/// `{self}`"); generate_derive(f); if self.requires_generic() { generate_derive_arbitrary_bounds(f); } - fmtln!(f, "pub struct {struct_name} {where_clause} {{"); - f.indent(|f| { + f.add_block(&format!("pub struct {struct_name} {where_clause}"), |f| { for k in &self.format.operands { if let Some(ty) = k.generate_type() { let loc = k.location; @@ -26,7 +24,6 @@ impl dsl::Inst { } } }); - fmtln!(f, "}}"); } fn requires_generic(&self) -> bool { @@ -56,8 +53,7 @@ impl dsl::Inst { pub fn generate_struct_impl(&self, f: &mut Formatter) { let impl_block = self.generate_impl_block_start(); let struct_name = self.struct_name_with_generic(); - fmtln!(f, "{impl_block} {struct_name} {{"); - f.indent(|f| { + f.add_block(&format!("{impl_block} {struct_name}"), |f| { self.generate_new_function(f); f.empty_line(); self.generate_encode_function(f); @@ -66,7 +62,6 @@ impl dsl::Inst { f.empty_line(); self.generate_features_function(f); }); - fmtln!(f, "}}"); } // `fn new() -> Self { ... }` @@ -86,11 +81,9 @@ impl dsl::Inst { ); fmtln!(f, "#[must_use]"); - fmtln!(f, "pub fn new({params}) -> Self {{"); - f.indent(|f| { + f.add_block(&format!("pub fn new({params}) -> Self"), |f| { fmtln!(f, "Self {{ {args} }}",); }); - fmtln!(f, "}}"); } /// `fn encode(&self, ...) { ... }` @@ -100,113 +93,108 @@ impl dsl::Inst { } else { "_" }; - fmtln!(f, "pub fn encode(&self, buf: &mut impl CodeSink, {off}: &impl KnownOffsetTable) {{"); - f.indent_push(); - - // Emit trap. - if let Some(op) = self.format.uses_memory() { - f.empty_line(); - f.comment("Emit trap."); - match op { - crate::dsl::Location::rm128 => { - fmtln!(f, "if let XmmMem::Mem({op}) = &self.{op} {{"); - } - _ => { - fmtln!(f, "if let GprMem::Mem({op}) = &self.{op} {{"); + f.add_block(&format!("pub fn encode(&self, buf: &mut impl CodeSink, {off}: &impl KnownOffsetTable)"), |f| { + // Emit trap. + if let Some(op) = self.format.uses_memory() { + use dsl::OperandKind::*; + f.comment("Emit trap."); + match op.kind() { + Mem(_) => { + f.add_block(&format!("if let Some(trap_code) = self.{op}.trap_code()"), |f| { + fmtln!(f, "buf.add_trap(trap_code);"); + }); + } + RegMem(_) => { + let ty = match op.bits() { + 128 => "XmmMem", + _ => "GprMem", + }; + f.add_block(&format!("if let {ty}::Mem({op}) = &self.{op}"), |f| { + f.add_block(&format!("if let Some(trap_code) = {op}.trap_code()"), |f| { + fmtln!(f, "buf.add_trap(trap_code);"); + }); + }); + } + _ => unreachable!(), } } - f.indent(|f| { - fmtln!(f, "if let Some(trap_code) = {op}.trap_code() {{"); - f.indent(|f| { - fmtln!(f, "buf.add_trap(trap_code);"); - }); - fmtln!(f, "}}"); - }); - fmtln!(f, "}}"); - } - match &self.encoding { - dsl::Encoding::Rex(rex) => self.format.generate_rex_encoding(f, rex), - dsl::Encoding::Vex(_) => todo!(), - } - - f.indent_pop(); - fmtln!(f, "}}"); + match &self.encoding { + dsl::Encoding::Rex(rex) => self.format.generate_rex_encoding(f, rex), + dsl::Encoding::Vex(_) => todo!(), + } + }); } /// `fn visit(&self, ...) { ... }` fn generate_visit_function(&self, f: &mut Formatter) { use dsl::OperandKind::*; - let extra_generic_bound = if self.requires_generic() { - "" - } else { - "" - }; - fmtln!(f, "pub fn visit{extra_generic_bound}(&mut self, visitor: &mut impl RegisterVisitor) {{"); - f.indent(|f| { - for o in &self.format.operands { - match o.location.kind() { - Imm(_) => { - // Immediates do not need register allocation. - } - FixedReg(_) => { - let call = o.mutability.generate_regalloc_call(); - let ty = o.mutability.generate_type(); - let Some(fixed) = o.location.generate_fixed_reg() else { - unreachable!() - }; - fmtln!(f, "visitor.fixed_{call}(&R::{ty}Gpr::new({fixed}));"); - } - Reg(reg) => { - match reg.bits() { - 128 => { - let call = o.mutability.generate_xmm_regalloc_call(); - fmtln!(f, "visitor.{call}(self.{reg}.as_mut());"); - } - _ => { - let call = o.mutability.generate_regalloc_call(); - fmtln!(f, "visitor.{call}(self.{reg}.as_mut());"); - } - }; - } - RegMem(rm) => { - match rm.bits() { - 128 => { - let call = o.mutability.generate_xmm_regalloc_call(); - fmtln!(f, "match &mut self.{rm} {{"); - f.indent(|f| { - fmtln!(f, "XmmMem::Xmm(r) => visitor.{call}(r),"); - fmtln!( + let extra_generic_bound = if self.requires_generic() { "" } else { "" }; + f.add_block( + &format!("pub fn visit{extra_generic_bound}(&mut self, visitor: &mut impl RegisterVisitor)"), + |f| { + for o in &self.format.operands { + match o.location.kind() { + Imm(_) => { + // Immediates do not need register allocation. + } + FixedReg(_) => { + let call = o.mutability.generate_regalloc_call(); + let ty = o.mutability.generate_type(); + let Some(fixed) = o.location.generate_fixed_reg() else { + unreachable!() + }; + fmtln!(f, "visitor.fixed_{call}(&R::{ty}Gpr::new({fixed}));"); + } + Reg(reg) => { + match reg.bits() { + 128 => { + let call = o.mutability.generate_xmm_regalloc_call(); + fmtln!(f, "visitor.{call}(self.{reg}.as_mut());"); + } + _ => { + let call = o.mutability.generate_regalloc_call(); + fmtln!(f, "visitor.{call}(self.{reg}.as_mut());"); + } + }; + } + RegMem(rm) => { + match rm.bits() { + 128 => { + let call = o.mutability.generate_xmm_regalloc_call(); + f.add_block(&format!("match &mut self.{rm}"), |f| { + fmtln!(f, "XmmMem::Xmm(r) => visitor.{call}(r),"); + fmtln!( f, "XmmMem::Mem(m) => m.registers_mut().iter_mut().for_each(|r| visitor.read(r))," ); - }); - } - _ => { - let call = o.mutability.generate_regalloc_call(); - fmtln!(f, "match &mut self.{rm} {{"); - f.indent(|f| { - fmtln!(f, "GprMem::Gpr(r) => visitor.{call}(r),"); - fmtln!( + }); + } + _ => { + let call = o.mutability.generate_regalloc_call(); + f.add_block(&format!("match &mut self.{rm}"), |f| { + fmtln!(f, "GprMem::Gpr(r) => visitor.{call}(r),"); + fmtln!( f, "GprMem::Mem(m) => m.registers_mut().iter_mut().for_each(|r| visitor.read(r))," ); - }); - } - }; - fmtln!(f, "}}"); + }); + } + }; + } + Mem(m) => { + fmtln!(f, "self.{m}.registers_mut().iter_mut().for_each(|r| visitor.read(r));"); + } } } - } - }); - fmtln!(f, "}}"); + }, + ); } /// `fn features(&self) -> Vec { ... }` fn generate_features_function(&self, f: &mut Formatter) { fmtln!(f, "#[must_use]"); - fmtln!(f, "pub fn features(&self) -> Vec {{"); - f.indent(|f| { + f.add_block("pub fn features(&self) -> Vec", |f| { let flags = self .features .iter() @@ -214,289 +202,44 @@ impl dsl::Inst { .collect::>(); fmtln!(f, "vec![{}]", flags.join(", ")); }); - fmtln!(f, "}}"); } /// `impl Display for { ... }` pub fn generate_display_impl(&self, f: &mut Formatter) { let impl_block = self.generate_impl_block_start(); let struct_name = self.struct_name_with_generic(); - fmtln!(f, "{impl_block} std::fmt::Display for {struct_name} {{"); - f.indent(|f| { - fmtln!(f, "fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {{"); - f.indent(|f| { + f.add_block(&format!("{impl_block} std::fmt::Display for {struct_name}"), |f| { + f.add_block("fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result", |f| { for op in &self.format.operands { let location = op.location; let to_string = location.generate_to_string(op.extension); fmtln!(f, "let {location} = {to_string};"); } - let inst_name = &self.mnemonic; + // Fix up the mnemonic for locked instructions: we want to print + // "lock ", not "lock_". + let inst_name = if self.mnemonic.starts_with("lock_") { + &format!("lock {}", &self.mnemonic[5..]) + } else { + &self.mnemonic + }; let ordered_ops = self.format.generate_att_style_operands(); fmtln!(f, "write!(f, \"{inst_name} {ordered_ops}\")"); }); - fmtln!(f, "}}"); }); - fmtln!(f, "}}"); } /// `impl From for Inst { ... }` pub fn generate_from_impl(&self, f: &mut Formatter) { let struct_name_r = self.struct_name_with_generic(); let variant_name = self.name(); - fmtln!(f, "impl From<{struct_name_r}> for Inst {{"); - f.indent(|f| { - fmtln!(f, "fn from(inst: {struct_name_r}) -> Self {{",); - f.indent(|f| { + f.add_block(&format!("impl From<{struct_name_r}> for Inst"), |f| { + f.add_block(&format!("fn from(inst: {struct_name_r}) -> Self"), |f| { fmtln!(f, "Self::{variant_name}(inst)"); }); - fmtln!(f, "}}"); }); - fmtln!(f, "}}"); - } - - /// `fn x64_(&mut self, ) -> Inst { ... }` - /// - /// # Panics - /// - /// This function panics if the instruction has no operands. - pub fn generate_isle_macro(&self, f: &mut Formatter) { - let struct_name = self.name(); - let params = self - .format - .operands - .iter() - .filter(|o| o.mutability.is_read()) - // FIXME(#10238) don't filter out fixed regs here - .filter(|o| !matches!(o.location.kind(), OperandKind::FixedReg(_))) - .collect::>(); - let results = self - .format - .operands - .iter() - .filter(|o| o.mutability.is_write()) - .collect::>(); - let rust_params = params - .iter() - .map(|o| format!("{}: {}", o.location, o.rust_param_raw())) - .collect::>() - .join(", "); - fmtln!(f, "fn x64_{struct_name}_raw(&mut self, {rust_params}) -> AssemblerOutputs {{",); - f.indent(|f| { - for o in params.iter() { - let l = o.location; - match o.rust_convert_isle_to_assembler() { - Some(cvt) => fmtln!(f, "let {l} = {cvt}({l});"), - None => fmtln!(f, "let {l} = {l}.clone();"), - } - } - let args = params - .iter() - .map(|o| format!("{}.clone()", o.location)) - .collect::>(); - let args = args.join(", "); - fmtln!(f, "let inst = cranelift_assembler_x64::inst::{struct_name}::new({args}).into();"); - fmtln!(f, "let inst = MInst::External {{ inst }};"); - - use dsl::Mutability::*; - match results.as_slice() { - [] => fmtln!(f, "SideEffectNoResult::Inst(inst)"), - [one] => match one.mutability { - Read => unreachable!(), - ReadWrite => match one.location.kind() { - OperandKind::Imm(_) => unreachable!(), - // FIXME(#10238) - OperandKind::FixedReg(_) => fmtln!(f, "todo!()"), - // One read/write register output? Output the instruction - // and that register. - OperandKind::Reg(r) => match r.bits() { - 128 => { - fmtln!(f, "let xmm = {}.as_ref().write.to_reg();", results[0].location); - fmtln!(f, "AssemblerOutputs::RetXmm {{ inst, xmm }}") - } - _ => { - fmtln!(f, "let gpr = {}.as_ref().write.to_reg();", results[0].location); - fmtln!(f, "AssemblerOutputs::RetGpr {{ inst, gpr }}") - } - }, - // One read/write regmem output? We need to output - // everything and it'll internally disambiguate which was - // emitted (e.g. the mem variant or the register variant). - OperandKind::RegMem(_) => { - assert_eq!(results.len(), 1); - let l = results[0].location; - fmtln!(f, "match {l} {{"); - match l.bits() { - 128 => { - f.indent(|f| { - fmtln!(f, "asm::XmmMem::Xmm(reg) => {{"); - fmtln!(f, "let xmm = reg.write.to_reg();"); - fmtln!(f, "AssemblerOutputs::RetXmm {{ inst, xmm }} "); - fmtln!(f, "}}"); - - fmtln!(f, "asm::XmmMem::Mem(_) => {{"); - fmtln!(f, "AssemblerOutputs::SideEffect {{ inst }} "); - fmtln!(f, "}}"); - }); - } - _ => { - f.indent(|f| { - fmtln!(f, "asm::GprMem::Gpr(reg) => {{"); - fmtln!(f, "let gpr = reg.write.to_reg();"); - fmtln!(f, "AssemblerOutputs::RetGpr {{ inst, gpr }} "); - fmtln!(f, "}}"); - - fmtln!(f, "asm::GprMem::Mem(_) => {{"); - fmtln!(f, "AssemblerOutputs::SideEffect {{ inst }} "); - fmtln!(f, "}}"); - }); - } - }; - fmtln!(f, "}}"); - } - }, - }, - _ => panic!("instruction has more than one result"), - } - }); - fmtln!(f, "}}"); - } - - /// Generate a "raw" constructor that simply constructs, but does not emit - /// the assembly instruction: - /// - /// ```text - /// (decl x64__raw () AssemblerOutputs) - /// (extern constructor x64__raw x64__raw) - /// ``` - /// - /// Using the "raw" constructor, we also generate "emitter" constructors - /// (see [`IsleConstructor`]). E.g., instructions that write to a register - /// will return the register: - /// - /// ```text - /// (decl x64_ () Gpr) - /// (rule (x64_ ) (emit_ret_gpr (x64__raw ))) - /// ``` - /// - /// For instructions that write to memory, we also generate an "emitter" - /// constructor with the `_mem` suffix: - /// - /// ```text - /// (decl x64__mem () SideEffectNoResult) - /// (rule (x64__mem ) (defer_side_effect (x64__raw ))) - /// ``` - /// - /// # Panics - /// - /// This function panics if the instruction has no operands. - pub fn generate_isle_definition(&self, f: &mut Formatter) { - // First declare the "raw" constructor which is implemented in Rust - // with `generate_isle_macro` above. This is an "extern" constructor - // with relatively raw types. This is not intended to be used by - // general lowering rules in ISLE. - let struct_name = self.name(); - let raw_name = format!("x64_{struct_name}_raw"); - let params = self - .format - .operands - .iter() - .filter(|o| o.mutability.is_read()) - // FIXME(#10238) don't filter out fixed regs here - .filter(|o| !matches!(o.location.kind(), OperandKind::FixedReg(_))) - .collect::>(); - let raw_param_tys = params - .iter() - .map(|o| o.isle_param_raw()) - .collect::>() - .join(" "); - f.line(format!("(decl {raw_name} ({raw_param_tys}) AssemblerOutputs)"), None); - f.line(format!("(extern constructor {raw_name} {raw_name})"), None); - - // Next, for each "emitter" ISLE constructor being generated, synthesize - // a pure-ISLE constructor which delegates appropriately to the `*_raw` - // constructor above. - // - // The main purpose of these constructors is to have faithful type - // signatures for the SSA nature of VCode/ISLE, effectively translating - // x64's type system to ISLE/VCode's type system. - for ctor in self.format.isle_constructors() { - let suffix = ctor.suffix(); - let rule_name = format!("x64_{struct_name}{suffix}"); - let result_ty = ctor.result_ty(); - let param_tys = params - .iter() - .map(|o| o.isle_param_for_ctor(ctor)) - .collect::>() - .join(" "); - let param_names = params - .iter() - .map(|o| o.location.to_string()) - .collect::>() - .join(" "); - let convert = ctor.conversion_constructor(); - - f.line(format!("(decl {rule_name} ({param_tys}) {result_ty})"), None); - f.line( - format!("(rule ({rule_name} {param_names}) ({convert} ({raw_name} {param_names})))"), - None, - ); - } } } fn comma_join>(items: impl Iterator) -> String { items.map(Into::into).collect::>().join(", ") } - -/// Different kinds of ISLE constructors generated for a particular instruction. -/// -/// One instruction may generate a single constructor or multiple constructors. -/// For example an instruction that writes its result to a register will -/// generate only a single constructor. An instruction where the destination -/// read/write operand is `GprMem` will generate two constructors though, one -/// for memory and one for in registers. -#[derive(Copy, Clone, Debug)] -pub enum IsleConstructor { - /// This constructor only produces a side effect, meaning that the - /// instruction does not produce results in registers. This may produce - /// a result in memory, however. - RetMemorySideEffect, - - /// This constructor produces a `Gpr` value, meaning that it will write the - /// result to a `Gpr`. - RetGpr, - - /// This constructor produces an `Xmm` value, meaning that it will write the - /// result to an `Xmm`. - RetXmm, -} - -impl IsleConstructor { - /// Returns the result type, in ISLE, that this constructor generates. - pub fn result_ty(&self) -> &'static str { - match self { - IsleConstructor::RetMemorySideEffect => "SideEffectNoResult", - IsleConstructor::RetGpr => "Gpr", - IsleConstructor::RetXmm => "Xmm", - } - } - - /// Returns the constructor used to convert an `AssemblerOutput` into the - /// type returned by [`Self::result_ty`]. - pub fn conversion_constructor(&self) -> &'static str { - match self { - IsleConstructor::RetMemorySideEffect => "defer_side_effect", - IsleConstructor::RetGpr => "emit_ret_gpr", - IsleConstructor::RetXmm => "emit_ret_xmm", - } - } - - /// Returns the suffix used in the ISLE constructor name. - pub fn suffix(&self) -> &'static str { - match self { - IsleConstructor::RetMemorySideEffect => "_mem", - IsleConstructor::RetGpr => "", - IsleConstructor::RetXmm => "", - } - } -} diff --git a/cranelift/assembler-x64/meta/src/generate/operand.rs b/cranelift/assembler-x64/meta/src/generate/operand.rs index e2e6dc54c9..3c0862882c 100644 --- a/cranelift/assembler-x64/meta/src/generate/operand.rs +++ b/cranelift/assembler-x64/meta/src/generate/operand.rs @@ -1,5 +1,4 @@ -use super::inst::IsleConstructor; -use crate::dsl::{self, Mutability, OperandKind}; +use crate::dsl; impl dsl::Operand { #[must_use] @@ -23,102 +22,7 @@ impl dsl::Operand { 128 => Some(format!("XmmMem", self.mutability.generate_type())), _ => Some(format!("GprMem", self.mutability.generate_type())), }, - } - } - - /// Returns the type of this operand in ISLE as a part of the ISLE "raw" - /// constructors. - pub fn isle_param_raw(&self) -> String { - match self.location.kind() { - OperandKind::Imm(loc) => { - let bits = loc.bits(); - if self.extension.is_sign_extended() { - format!("i{bits}") - } else { - format!("u{bits}") - } - } - OperandKind::Reg(r) => match r.bits() { - 128 => "Xmm".to_string(), - _ => "Gpr".to_string(), - }, - OperandKind::FixedReg(_) => "Gpr".to_string(), - OperandKind::RegMem(rm) => match rm.bits() { - 128 => "XmmMem".to_string(), - _ => "GprMem".to_string(), - }, - } - } - - /// Returns the parameter type used for the `IsleConstructor` variant - /// provided. - pub fn isle_param_for_ctor(&self, ctor: IsleConstructor) -> String { - match self.location.kind() { - // Writable `RegMem` operands are special here: in one constructor - // it's operating on memory so the argument is `Amode` and in the - // other constructor it's operating on registers so the argument is - // a `Gpr`. - OperandKind::RegMem(_) if self.mutability.is_write() => match ctor { - IsleConstructor::RetMemorySideEffect => "Amode".to_string(), - IsleConstructor::RetGpr => "Gpr".to_string(), - IsleConstructor::RetXmm => "Xmm".to_string(), - }, - - // everything else is the same as the "raw" variant - _ => self.isle_param_raw(), - } - } - - /// Returns the Rust type used for the `IsleConstructorRaw` variants. - pub fn rust_param_raw(&self) -> String { - match self.location.kind() { - OperandKind::Imm(loc) => { - let bits = loc.bits(); - if self.extension.is_sign_extended() { - format!("i{bits}") - } else { - format!("u{bits}") - } - } - OperandKind::RegMem(rm) => match rm.bits() { - 128 => "&XmmMem".to_string(), - _ => "&GprMem".to_string(), - }, - OperandKind::Reg(r) => match r.bits() { - 128 => "Xmm".to_string(), - _ => "Gpr".to_string(), - }, - OperandKind::FixedReg(_) => "Gpr".to_string(), - } - } - - /// Returns the conversion function, if any, when converting the ISLE type - /// for this parameter to the assembler type for this parameter. - /// Effectively converts `self.rust_param_raw()` to the assembler type. - pub fn rust_convert_isle_to_assembler(&self) -> Option<&'static str> { - match self.location.kind() { - OperandKind::Reg(r) => Some(match (r.bits(), self.mutability) { - (128, Mutability::Read) => "cranelift_assembler_x64::Xmm::new", - (128, Mutability::ReadWrite) => "self.convert_xmm_to_assembler_read_write_xmm", - (_, Mutability::Read) => "cranelift_assembler_x64::Gpr::new", - (_, Mutability::ReadWrite) => "self.convert_gpr_to_assembler_read_write_gpr", - }), - OperandKind::RegMem(r) => Some(match (r.bits(), self.mutability) { - (128, Mutability::Read) => "self.convert_xmm_mem_to_assembler_read_xmm_mem", - (128, Mutability::ReadWrite) => "self.convert_xmm_mem_to_assembler_read_write_xmm_mem", - (_, Mutability::Read) => "self.convert_gpr_mem_to_assembler_read_gpr_mem", - (_, Mutability::ReadWrite) => "self.convert_gpr_mem_to_assembler_read_write_gpr_mem", - }), - OperandKind::Imm(loc) => match (self.extension.is_sign_extended(), loc.bits()) { - (true, 8) => Some("cranelift_assembler_x64::Simm8::new"), - (true, 16) => Some("cranelift_assembler_x64::Simm16::new"), - (true, 32) => Some("cranelift_assembler_x64::Simm32::new"), - (false, 8) => Some("cranelift_assembler_x64::Imm8::new"), - (false, 16) => Some("cranelift_assembler_x64::Imm16::new"), - (false, 32) => Some("cranelift_assembler_x64::Imm32::new"), - _ => None, - }, - OperandKind::FixedReg(_) => None, + Mem(_) => Some(format!("Amode")), } } } @@ -146,7 +50,7 @@ impl dsl::Location { Some(size) => format!("self.{self}.to_string({size})"), None => unreachable!(), }, - xmm | rm128 => format!("self.{self}.to_string()"), + xmm | rm128 | m8 | m16 | m32 | m64 => format!("self.{self}.to_string()"), } } @@ -160,7 +64,12 @@ impl dsl::Location { r16 | rm16 => Some("Size::Word"), r32 | rm32 => Some("Size::Doubleword"), r64 | rm64 => Some("Size::Quadword"), - xmm | rm128 => panic!("no need to generate a size for XMM-sized access"), + m8 | m16 | m32 | m64 => { + panic!("no need to generate a size for memory-only access") + } + xmm | rm128 => { + panic!("no need to generate a size for XMM-sized access") + } } } @@ -169,9 +78,10 @@ impl dsl::Location { pub fn generate_fixed_reg(&self) -> Option<&str> { use dsl::Location::*; match self { - al | ax | eax | rax => Some("reg::enc::RAX"), - cl => Some("reg::enc::RCX"), - imm8 | imm16 | imm32 | r8 | r16 | r32 | r64 | xmm | rm8 | rm16 | rm32 | rm64 | rm128 => None, + al | ax | eax | rax => Some("gpr::enc::RAX"), + cl => Some("gpr::enc::RCX"), + imm8 | imm16 | imm32 | r8 | r16 | r32 | r64 | xmm | rm8 | rm16 | rm32 | rm64 | rm128 | m8 | m16 | m32 + | m64 => None, } } } diff --git a/cranelift/assembler-x64/meta/src/instructions/add.rs b/cranelift/assembler-x64/meta/src/instructions/add.rs index df802670ce..ff9453c494 100644 --- a/cranelift/assembler-x64/meta/src/instructions/add.rs +++ b/cranelift/assembler-x64/meta/src/instructions/add.rs @@ -1,4 +1,4 @@ -use crate::dsl::{fmt, inst, r, rex, rw, sxl, sxq}; +use crate::dsl::{align, fmt, inst, r, rex, rw, sxl, sxq}; use crate::dsl::{Feature::*, Inst, Location::*}; pub fn list() -> Vec { @@ -40,5 +40,29 @@ pub fn list() -> Vec { inst("adcw", fmt("RM", [rw(r16), r(rm16)]), rex([0x66, 0x13]).r(), _64b | compat), inst("adcl", fmt("RM", [rw(r32), r(rm32)]), rex(0x13).r(), _64b | compat), inst("adcq", fmt("RM", [rw(r64), r(rm64)]), rex(0x13).w().r(), _64b), + // `LOCK`-prefixed memory-writing instructions. + inst("lock_addb", fmt("MI", [rw(m8), r(imm8)]), rex([0xf0, 0x80]).digit(0).ib(), _64b | compat), + inst("lock_addw", fmt("MI", [rw(m16), r(imm16)]), rex([0xf0, 0x66, 0x81]).digit(0).iw(), _64b | compat), + inst("lock_addl", fmt("MI", [rw(m32), r(imm32)]), rex([0xf0, 0x81]).digit(0).id(), _64b | compat), + inst("lock_addq", fmt("MI_SXL", [rw(m64), sxq(imm32)]), rex([0xf0, 0x81]).w().digit(0).id(), _64b), + inst("lock_addl", fmt("MI_SXB", [rw(m32), sxl(imm8)]), rex([0xf0, 0x83]).digit(0).ib(), _64b | compat), + inst("lock_addq", fmt("MI_SXB", [rw(m64), sxq(imm8)]), rex([0xf0, 0x83]).w().digit(0).ib(), _64b), + inst("lock_addb", fmt("MR", [rw(m8), r(r8)]), rex([0xf0, 0x0]).r(), _64b | compat), + inst("lock_addw", fmt("MR", [rw(m16), r(r16)]), rex([0xf0, 0x66, 0x1]).r(), _64b | compat), + inst("lock_addl", fmt("MR", [rw(m32), r(r32)]), rex([0xf0, 0x1]).r(), _64b | compat), + inst("lock_addq", fmt("MR", [rw(m64), r(r64)]), rex([0xf0, 0x1]).w().r(), _64b), + inst("lock_adcb", fmt("MI", [rw(m8), r(imm8)]), rex([0xf0, 0x80]).digit(2).ib(), _64b | compat), + inst("lock_adcw", fmt("MI", [rw(m16), r(imm16)]), rex([0xf0, 0x66, 0x81]).digit(2).iw(), _64b | compat), + inst("lock_adcl", fmt("MI", [rw(m32), r(imm32)]), rex([0xf0, 0x81]).digit(2).id(), _64b | compat), + inst("lock_adcq", fmt("MI_SXL", [rw(m64), sxq(imm32)]), rex([0xf0, 0x81]).w().digit(2).id(), _64b), + inst("lock_adcl", fmt("MI_SXB", [rw(m32), sxl(imm8)]), rex([0xf0, 0x83]).digit(2).ib(), _64b | compat), + inst("lock_adcq", fmt("MI_SXB", [rw(m64), sxq(imm8)]), rex([0xf0, 0x83]).w().digit(2).ib(), _64b), + inst("lock_adcb", fmt("MR", [rw(m8), r(r8)]), rex([0xf0, 0x10]).r(), _64b | compat), + inst("lock_adcw", fmt("MR", [rw(m16), r(r16)]), rex([0xf0, 0x66, 0x11]).r(), _64b | compat), + inst("lock_adcl", fmt("MR", [rw(m32), r(r32)]), rex([0xf0, 0x11]).r(), _64b | compat), + inst("lock_adcq", fmt("MR", [rw(m64), r(r64)]), rex([0xf0, 0x11]).w().r(), _64b), + // Vector instructions. + inst("addps", fmt("A", [rw(xmm), r(align(rm128))]), rex([0x0F, 0x58]).r(), _64b | compat | sse), + inst("addpd", fmt("A", [rw(xmm), r(align(rm128))]), rex([0x66, 0x0F, 0x58]).r(), _64b | compat | sse), ] } diff --git a/cranelift/assembler-x64/meta/src/instructions/and.rs b/cranelift/assembler-x64/meta/src/instructions/and.rs index 5997de9f77..ee418f97fd 100644 --- a/cranelift/assembler-x64/meta/src/instructions/and.rs +++ b/cranelift/assembler-x64/meta/src/instructions/and.rs @@ -1,4 +1,4 @@ -use crate::dsl::{fmt, inst, r, rex, rw, sxl, sxq}; +use crate::dsl::{align, fmt, inst, r, rex, rw, sxl, sxq}; use crate::dsl::{Feature::*, Inst, Location::*}; pub fn list() -> Vec { @@ -28,5 +28,19 @@ pub fn list() -> Vec { inst("andw", fmt("RM", [rw(r16), r(rm16)]), rex([0x66, 0x23]).r(), _64b | compat), inst("andl", fmt("RM", [rw(r32), r(rm32)]), rex(0x23).r(), _64b | compat), inst("andq", fmt("RM", [rw(r64), r(rm64)]), rex(0x23).w().r(), _64b), + // `LOCK`-prefixed memory-writing instructions. + inst("lock_andb", fmt("MI", [rw(m8), r(imm8)]), rex([0xf0, 0x80]).digit(4).ib(), _64b | compat), + inst("lock_andw", fmt("MI", [rw(m16), r(imm16)]), rex([0xf0, 0x66, 0x81]).digit(4).iw(), _64b | compat), + inst("lock_andl", fmt("MI", [rw(m32), r(imm32)]), rex([0xf0, 0x81]).digit(4).id(), _64b | compat), + inst("lock_andq", fmt("MI_SXL", [rw(m64), sxq(imm32)]), rex([0xf0, 0x81]).w().digit(4).id(), _64b), + inst("lock_andl", fmt("MI_SXB", [rw(m32), sxl(imm8)]), rex([0xf0, 0x83]).digit(4).ib(), _64b | compat), + inst("lock_andq", fmt("MI_SXB", [rw(m64), sxq(imm8)]), rex([0xf0, 0x83]).w().digit(4).ib(), _64b), + inst("lock_andb", fmt("MR", [rw(m8), r(r8)]), rex([0xf0, 0x20]).r(), _64b | compat), + inst("lock_andw", fmt("MR", [rw(m16), r(r16)]), rex([0xf0, 0x66, 0x21]).r(), _64b | compat), + inst("lock_andl", fmt("MR", [rw(m32), r(r32)]), rex([0xf0, 0x21]).r(), _64b | compat), + inst("lock_andq", fmt("MR", [rw(m64), r(r64)]), rex([0xf0, 0x21]).w().r(), _64b), + // Vector instructions. + inst("andps", fmt("A", [rw(xmm), r(align(rm128))]), rex([0x0F, 0x54]).r(), _64b | compat | sse), + inst("andpd", fmt("A", [rw(xmm), r(align(rm128))]), rex([0x66, 0x0F, 0x54]).r(), _64b | compat | sse), ] } diff --git a/cranelift/assembler-x64/meta/src/instructions/or.rs b/cranelift/assembler-x64/meta/src/instructions/or.rs index 2b918991ef..79fb1bb2ca 100644 --- a/cranelift/assembler-x64/meta/src/instructions/or.rs +++ b/cranelift/assembler-x64/meta/src/instructions/or.rs @@ -1,4 +1,4 @@ -use crate::dsl::{fmt, inst, r, rex, rw, sxl, sxq}; +use crate::dsl::{align, fmt, inst, r, rex, rw, sxl, sxq}; use crate::dsl::{Feature::*, Inst, Location::*}; pub fn list() -> Vec { @@ -21,6 +21,19 @@ pub fn list() -> Vec { inst("orw", fmt("RM", [rw(r16), r(rm16)]), rex([0x66, 0x0B]).r(), _64b | compat), inst("orl", fmt("RM", [rw(r32), r(rm32)]), rex(0x0B).r(), _64b | compat), inst("orq", fmt("RM", [rw(r64), r(rm64)]), rex(0x0B).w().r(), _64b), - inst("orpd", fmt("A", [rw(xmm), r(rm128)]), rex([0x66, 0x0F, 0x56]).r(), _64b), + // `LOCK`-prefixed memory-writing instructions. + inst("lock_orb", fmt("MI", [rw(m8), r(imm8)]), rex([0xf0, 0x80]).digit(1).ib(), _64b | compat), + inst("lock_orw", fmt("MI", [rw(m16), r(imm16)]), rex([0xf0, 0x66, 0x81]).digit(1).iw(), _64b | compat), + inst("lock_orl", fmt("MI", [rw(m32), r(imm32)]), rex([0xf0, 0x81]).digit(1).id(), _64b | compat), + inst("lock_orq", fmt("MI_SXL", [rw(m64), sxq(imm32)]), rex([0xf0, 0x81]).w().digit(1).id(), _64b), + inst("lock_orl", fmt("MI_SXB", [rw(m32), sxl(imm8)]), rex([0xf0, 0x83]).digit(1).ib(), _64b | compat), + inst("lock_orq", fmt("MI_SXB", [rw(m64), sxq(imm8)]), rex([0xf0, 0x83]).w().digit(1).ib(), _64b), + inst("lock_orb", fmt("MR", [rw(m8), r(r8)]), rex([0xf0, 0x08]).r(), _64b | compat), + inst("lock_orw", fmt("MR", [rw(m16), r(r16)]), rex([0xf0, 0x66, 0x09]).r(), _64b | compat), + inst("lock_orl", fmt("MR", [rw(m32), r(r32)]), rex([0xf0, 0x09]).r(), _64b | compat), + inst("lock_orq", fmt("MR", [rw(m64), r(r64)]), rex([0xf0, 0x09]).w().r(), _64b), + // Vector instructions. + inst("orps", fmt("A", [rw(xmm), r(align(rm128))]), rex([0x0F, 0x56]).r(), _64b | compat | sse), + inst("orpd", fmt("A", [rw(xmm), r(align(rm128))]), rex([0x66, 0x0F, 0x56]).r(), _64b | compat | sse), ] } diff --git a/cranelift/assembler-x64/meta/src/instructions/sub.rs b/cranelift/assembler-x64/meta/src/instructions/sub.rs index edaf75d404..8e72c58fa2 100644 --- a/cranelift/assembler-x64/meta/src/instructions/sub.rs +++ b/cranelift/assembler-x64/meta/src/instructions/sub.rs @@ -1,4 +1,4 @@ -use crate::dsl::{fmt, inst, r, rex, rw, sxl, sxq}; +use crate::dsl::{align, fmt, inst, r, rex, rw, sxl, sxq}; use crate::dsl::{Feature::*, Inst, Location::*}; pub fn list() -> Vec { @@ -40,5 +40,29 @@ pub fn list() -> Vec { inst("sbbw", fmt("RM", [rw(r16), r(rm16)]), rex([0x66, 0x1B]).r(), _64b | compat), inst("sbbl", fmt("RM", [rw(r32), r(rm32)]), rex(0x1B).r(), _64b | compat), inst("sbbq", fmt("RM", [rw(r64), r(rm64)]), rex(0x1B).w().r(), _64b), + // `LOCK`-prefixed memory-writing instructions. + inst("lock_subb", fmt("MI", [rw(m8), r(imm8)]), rex([0xf0, 0x80]).digit(5).ib(), _64b | compat), + inst("lock_subw", fmt("MI", [rw(m16), r(imm16)]), rex([0xf0, 0x66, 0x81]).digit(5).iw(), _64b | compat), + inst("lock_subl", fmt("MI", [rw(m32), r(imm32)]), rex([0xf0, 0x81]).digit(5).id(), _64b | compat), + inst("lock_subq", fmt("MI_SXL", [rw(m64), sxq(imm32)]), rex([0xf0, 0x81]).w().digit(5).id(), _64b), + inst("lock_subl", fmt("MI_SXB", [rw(m32), sxl(imm8)]), rex([0xf0, 0x83]).digit(5).ib(), _64b | compat), + inst("lock_subq", fmt("MI_SXB", [rw(m64), sxq(imm8)]), rex([0xf0, 0x83]).w().digit(5).ib(), _64b), + inst("lock_subb", fmt("MR", [rw(m8), r(r8)]), rex([0xf0, 0x28]).r(), _64b | compat), + inst("lock_subw", fmt("MR", [rw(m16), r(r16)]), rex([0xf0, 0x66, 0x29]).r(), _64b | compat), + inst("lock_subl", fmt("MR", [rw(m32), r(r32)]), rex([0xf0, 0x29]).r(), _64b | compat), + inst("lock_subq", fmt("MR", [rw(m64), r(r64)]), rex([0xf0, 0x29]).w().r(), _64b), + inst("lock_sbbb", fmt("MI", [rw(m8), r(imm8)]), rex([0xf0, 0x80]).digit(3).ib(), _64b | compat), + inst("lock_sbbw", fmt("MI", [rw(m16), r(imm16)]), rex([0xf0, 0x66, 0x81]).digit(3).iw(), _64b | compat), + inst("lock_sbbl", fmt("MI", [rw(m32), r(imm32)]), rex([0xf0, 0x81]).digit(3).id(), _64b | compat), + inst("lock_sbbq", fmt("MI_SXL", [rw(m64), sxq(imm32)]), rex([0xf0, 0x81]).w().digit(3).id(), _64b), + inst("lock_sbbl", fmt("MI_SXB", [rw(m32), sxl(imm8)]), rex([0xf0, 0x83]).digit(3).ib(), _64b | compat), + inst("lock_sbbq", fmt("MI_SXB", [rw(m64), sxq(imm8)]), rex([0xf0, 0x83]).w().digit(3).ib(), _64b), + inst("lock_sbbb", fmt("MR", [rw(m8), r(r8)]), rex([0xf0, 0x18]).r(), _64b | compat), + inst("lock_sbbw", fmt("MR", [rw(m16), r(r16)]), rex([0xf0, 0x66, 0x19]).r(), _64b | compat), + inst("lock_sbbl", fmt("MR", [rw(m32), r(r32)]), rex([0xf0, 0x19]).r(), _64b | compat), + inst("lock_sbbq", fmt("MR", [rw(m64), r(r64)]), rex([0xf0, 0x19]).w().r(), _64b), + // Vector instructions. + inst("subps", fmt("A", [rw(xmm), r(align(rm128))]), rex([0x0F, 0x5C]).r(), _64b | compat | sse), + inst("subpd", fmt("A", [rw(xmm), r(align(rm128))]), rex([0x66, 0x0F, 0x5C]).r(), _64b | compat | sse), ] } diff --git a/cranelift/assembler-x64/meta/src/instructions/xor.rs b/cranelift/assembler-x64/meta/src/instructions/xor.rs index 2529c7dd98..77098b897b 100644 --- a/cranelift/assembler-x64/meta/src/instructions/xor.rs +++ b/cranelift/assembler-x64/meta/src/instructions/xor.rs @@ -1,4 +1,4 @@ -use crate::dsl::{fmt, inst, r, rex, rw, sxl, sxq}; +use crate::dsl::{align, fmt, inst, r, rex, rw, sxl, sxq}; use crate::dsl::{Feature::*, Inst, Location::*}; pub fn list() -> Vec { @@ -21,5 +21,19 @@ pub fn list() -> Vec { inst("xorw", fmt("RM", [rw(r16), r(rm16)]), rex([0x66, 0x33]).r(), _64b | compat), inst("xorl", fmt("RM", [rw(r32), r(rm32)]), rex(0x33).r(), _64b | compat), inst("xorq", fmt("RM", [rw(r64), r(rm64)]), rex(0x33).w().r(), _64b), + // `LOCK`-prefixed memory-writing instructions. + inst("lock_xorb", fmt("MI", [rw(m8), r(imm8)]), rex([0xf0, 0x80]).digit(6).ib(), _64b | compat), + inst("lock_xorw", fmt("MI", [rw(m16), r(imm16)]), rex([0xf0, 0x66, 0x81]).digit(6).iw(), _64b | compat), + inst("lock_xorl", fmt("MI", [rw(m32), r(imm32)]), rex([0xf0, 0x81]).digit(6).id(), _64b | compat), + inst("lock_xorq", fmt("MI_SXL", [rw(m64), sxq(imm32)]), rex([0xf0, 0x81]).w().digit(6).id(), _64b), + inst("lock_xorl", fmt("MI_SXB", [rw(m32), sxl(imm8)]), rex([0xf0, 0x83]).digit(6).ib(), _64b | compat), + inst("lock_xorq", fmt("MI_SXB", [rw(m64), sxq(imm8)]), rex([0xf0, 0x83]).w().digit(6).ib(), _64b), + inst("lock_xorb", fmt("MR", [rw(m8), r(r8)]), rex([0xf0, 0x30]).r(), _64b | compat), + inst("lock_xorw", fmt("MR", [rw(m16), r(r16)]), rex([0xf0, 0x66, 0x31]).r(), _64b | compat), + inst("lock_xorl", fmt("MR", [rw(m32), r(r32)]), rex([0xf0, 0x31]).r(), _64b | compat), + inst("lock_xorq", fmt("MR", [rw(m64), r(r64)]), rex([0xf0, 0x31]).w().r(), _64b), + // Vector instructions. + inst("xorps", fmt("A", [rw(xmm), r(align(rm128))]), rex([0x0F, 0x57]).r(), _64b | compat | sse), + inst("xorpd", fmt("A", [rw(xmm), r(align(rm128))]), rex([0x66, 0x0F, 0x57]).r(), _64b | compat | sse), ] } diff --git a/cranelift/assembler-x64/meta/src/lib.rs b/cranelift/assembler-x64/meta/src/lib.rs index 7c4783832a..c8f8cba685 100644 --- a/cranelift/assembler-x64/meta/src/lib.rs +++ b/cranelift/assembler-x64/meta/src/lib.rs @@ -5,60 +5,20 @@ pub mod dsl; mod generate; pub mod instructions; +use cranelift_srcgen::{Formatter, Language}; use std::path::{Path, PathBuf}; -use std::process::Command; /// Generate the assembler `file` containing the core assembler logic; each of /// the DSL-defined instructions is emitted into a Rust `enum Inst`. -pub fn generate_rust_assembler>(file: P) -> PathBuf { - let mut fmt = generate::Formatter::new("// Generated by `generate::rust_assembler`", file!(), line!()); - generate(file, &mut fmt, generate::rust_assembler, true) -} - -/// Generate a macro containing builder functions for the assembler's ISLE -/// constructors; this uses the `build` module emitted in -/// [`generate_rust_assembler`]. -pub fn generate_isle_macro>(file: P) -> PathBuf { - let mut fmt = generate::Formatter::new("// Generated by `generate::isle_macro`", file!(), line!()); - generate(file, &mut fmt, generate::isle_macro, true) -} - -/// Generate the ISLE definitions; this provides ISLE glue to access the builder -/// functions from [`generate_isle_macro`]. -pub fn generate_isle_definitions>(file: P) -> PathBuf { - let mut fmt = generate::Formatter::new(";; Generated by `generate::isle_definitions`", file!(), line!()); - generate(file, &mut fmt, generate::isle_definitions, false) -} - -/// Helper for emitting generated lines into a formatted file. /// /// # Panics /// /// This function panics if we cannot update the file. -fn generate>( - file: P, - fmt: &mut generate::Formatter, - generator: fn(&mut generate::Formatter, &[dsl::Inst]), - format_rust: bool, -) -> PathBuf { - let file = file.as_ref(); - eprintln!("Generating {}", file.display()); - generator(fmt, &instructions::list()); - fmt.write(file).unwrap(); - if format_rust { - rustfmt(file); - } - file.to_path_buf() -} - -/// Use the installed `rustfmt` binary to format the generated code; if it -/// fails, skip formatting with a warning. -fn rustfmt(file: &Path) { - if let Ok(status) = Command::new("rustfmt").arg(file).status() { - if !status.success() { - eprintln!("`rustfmt` exited with a non-zero status; skipping formatting of generated files"); - } - } else { - eprintln!("`rustfmt` not found; skipping formatting of generated files"); - } +pub fn generate_rust_assembler>(dir: P, file: &str) -> PathBuf { + let out = dir.as_ref().join(file); + eprintln!("Generating {}", out.display()); + let mut fmt = Formatter::new(Language::Rust); + generate::rust_assembler(&mut fmt, &instructions::list()); + fmt.write(file, dir.as_ref()).unwrap(); + out } diff --git a/cranelift/assembler-x64/src/api.rs b/cranelift/assembler-x64/src/api.rs index 384c76c25b..eff5f98d2b 100644 --- a/cranelift/assembler-x64/src/api.rs +++ b/cranelift/assembler-x64/src/api.rs @@ -1,6 +1,6 @@ //! Contains traits that a user of this assembler must implement. -use crate::reg; +use crate::gpr; use crate::xmm; use std::{num::NonZeroU8, ops::Index, vec::Vec}; @@ -130,10 +130,10 @@ pub trait AsReg: Clone + std::fmt::Debug { fn enc(&self) -> u8; /// Return the register name. - fn to_string(&self, size: Option) -> &str { + fn to_string(&self, size: Option) -> String { match size { - Some(size) => reg::enc::to_string(self.enc(), size), - None => xmm::enc::to_string(self.enc()), + Some(size) => gpr::enc::to_string(self.enc(), size).into(), + None => xmm::enc::to_string(self.enc()).into(), } } } diff --git a/cranelift/assembler-x64/src/fuzz.rs b/cranelift/assembler-x64/src/fuzz.rs index f4d703a46b..e87ce579a4 100644 --- a/cranelift/assembler-x64/src/fuzz.rs +++ b/cranelift/assembler-x64/src/fuzz.rs @@ -19,7 +19,7 @@ use capstone::{arch::x86, arch::BuildsCapstone, arch::BuildsCapstoneSyntax, Caps pub fn roundtrip(inst: &Inst) { // Check that we can actually assemble this instruction. let assembled = assemble(inst); - let expected = disassemble(&assembled); + let expected = disassemble(&assembled, inst); // Check that our pretty-printed output matches the known-good output. Trim // off the instruction offset first. @@ -39,15 +39,15 @@ pub fn roundtrip(inst: &Inst) { /// /// This will skip any traps or label registrations, but this is fine for the /// single-instruction disassembly we're doing here. -fn assemble(insn: &Inst) -> Vec { +fn assemble(inst: &Inst) -> Vec { let mut buffer = Vec::new(); let offsets: Vec = Vec::new(); - insn.encode(&mut buffer, &offsets); + inst.encode(&mut buffer, &offsets); buffer } /// Building a new `Capstone` each time is suboptimal (TODO). -fn disassemble(assembled: &[u8]) -> String { +fn disassemble(assembled: &[u8], original: &Inst) -> String { let cs = Capstone::new() .x86() .mode(x86::ArchMode::Mode64) @@ -55,21 +55,30 @@ fn disassemble(assembled: &[u8]) -> String { .detail(true) .build() .expect("failed to create Capstone object"); - let insns = cs + let insts = cs .disasm_all(assembled, 0x0) .expect("failed to disassemble"); - assert_eq!(insns.len(), 1, "not a single instruction: {assembled:02x?}"); - let insn = insns.first().expect("at least one instruction"); - assert_eq!( - assembled.len(), - insn.len(), - "\ncranelift generated {} bytes: {assembled:02x?}\n\ - capstone generated {} bytes: {:02x?}", - assembled.len(), - insn.len(), - insn.bytes(), - ); - insn.to_string() + + if insts.len() != 1 { + println!("> {original}"); + println!(" debug: {original:x?}"); + println!(" assembled: {}", pretty_print_hexadecimal(&assembled)); + assert_eq!(insts.len(), 1, "not a single instruction"); + } + + let inst = insts.first().expect("at least one instruction"); + if assembled.len() != inst.len() { + println!("> {original}"); + println!(" debug: {original:x?}"); + println!(" assembled: {}", pretty_print_hexadecimal(&assembled)); + println!( + " capstone-assembled: {}", + pretty_print_hexadecimal(inst.bytes()) + ); + assert_eq!(assembled.len(), inst.len(), "extra bytes not disassembled"); + } + + inst.to_string() } fn pretty_print_hexadecimal(hex: &[u8]) -> String { @@ -84,7 +93,6 @@ fn pretty_print_hexadecimal(hex: &[u8]) -> String { /// See `replace_signed_immediates`. macro_rules! hex_print_signed_imm { ($hex:expr, $from:ty => $to:ty) => {{ - #[allow(clippy::cast_possible_wrap, reason = "bit conversion is intended here")] let imm = <$from>::from_str_radix($hex, 16).unwrap() as $to; let mut simm = String::new(); if imm < 0 { @@ -199,7 +207,7 @@ impl Arbitrary<'_> for AmodeOffsetPlusKnownOffset { } impl Arbitrary<'_> for NonRspGpr { fn arbitrary(u: &mut Unstructured<'_>) -> Result { - use crate::reg::enc::*; + use crate::gpr::enc::*; let gpr = u.choose(&[ RAX, RCX, RDX, RBX, RBP, RSI, RDI, R8, R9, R10, R11, R12, R13, R14, R15, ])?; diff --git a/cranelift/assembler-x64/src/reg.rs b/cranelift/assembler-x64/src/gpr.rs similarity index 96% rename from cranelift/assembler-x64/src/reg.rs rename to cranelift/assembler-x64/src/gpr.rs index 19fa8d4e96..626beef7a1 100644 --- a/cranelift/assembler-x64/src/reg.rs +++ b/cranelift/assembler-x64/src/gpr.rs @@ -30,8 +30,8 @@ impl Gpr { } /// Return the register name at the given `size`. - pub fn to_string(&self, size: Size) -> &str { - enc::to_string(self.enc(), size) + pub fn to_string(&self, size: Size) -> String { + self.0.to_string(Some(size)) } /// Proxy on the 8-bit REX flag emission; helpful for simplifying generated @@ -79,6 +79,11 @@ impl NonRspGpr { Self(reg) } + /// See [`Gpr::to_string`]. + pub fn to_string(&self, size: Size) -> String { + self.0.to_string(Some(size)) + } + /// See [`Gpr::enc`]. /// /// # Panics diff --git a/cranelift/assembler-x64/src/imm.rs b/cranelift/assembler-x64/src/imm.rs index 59c4b71f19..ebcc513a89 100644 --- a/cranelift/assembler-x64/src/imm.rs +++ b/cranelift/assembler-x64/src/imm.rs @@ -1,7 +1,5 @@ //! Immediate operands to instructions. -#![allow(clippy::module_name_repetitions, reason = "'imm::Imm*' is fine")] - use crate::api::CodeSink; use std::fmt; @@ -67,7 +65,6 @@ impl Simm8 { } pub fn encode(&self, sink: &mut impl CodeSink) { - #[allow(clippy::cast_sign_loss, reason = "bit conversion is intended here")] sink.put1(self.0 as u8); } @@ -127,7 +124,6 @@ impl Simm16 { } pub fn encode(&self, sink: &mut impl CodeSink) { - #[allow(clippy::cast_sign_loss, reason = "bit conversion is intended here")] sink.put2(self.0 as u16); } @@ -195,7 +191,6 @@ impl Simm32 { } pub fn encode(&self, sink: &mut impl CodeSink) { - #[allow(clippy::cast_sign_loss, reason = "bit conversion is intended here")] sink.put4(self.0 as u32); } diff --git a/cranelift/assembler-x64/src/inst.rs b/cranelift/assembler-x64/src/inst.rs index 487b458c3f..bdb72e3b75 100644 --- a/cranelift/assembler-x64/src/inst.rs +++ b/cranelift/assembler-x64/src/inst.rs @@ -4,9 +4,9 @@ //! See also: [`Inst`], an `enum` containing all these instructions. use crate::api::{AsReg, CodeSink, KnownOffsetTable, RegisterVisitor, Registers}; +use crate::gpr::{self, Gpr, Size}; use crate::imm::{Extension, Imm16, Imm32, Imm8, Simm32, Simm8}; -use crate::mem::{emit_modrm_sib_disp, GprMem, XmmMem}; -use crate::reg::{self, Gpr, Size}; +use crate::mem::{emit_modrm_sib_disp, Amode, GprMem, XmmMem}; use crate::rex::{self, RexFlags}; use crate::xmm::Xmm; diff --git a/cranelift/assembler-x64/src/isle.rs b/cranelift/assembler-x64/src/isle.rs deleted file mode 100644 index 9f4e1e1f6d..0000000000 --- a/cranelift/assembler-x64/src/isle.rs +++ /dev/null @@ -1,3 +0,0 @@ -//! Expose the ISLE-related code generated in `build.rs`. - -include!(concat!(env!("OUT_DIR"), "/assembler-isle-macro.rs")); diff --git a/cranelift/assembler-x64/src/lib.rs b/cranelift/assembler-x64/src/lib.rs index 796c6713f5..6337645b99 100644 --- a/cranelift/assembler-x64/src/lib.rs +++ b/cranelift/assembler-x64/src/lib.rs @@ -44,13 +44,12 @@ )] mod api; +pub mod gpr; mod imm; pub mod inst; -pub mod isle; mod mem; -mod reg; mod rex; -mod xmm; +pub mod xmm; #[cfg(any(test, feature = "fuzz"))] pub mod fuzz; @@ -77,11 +76,11 @@ pub use api::{ AsReg, CodeSink, Constant, KnownOffset, KnownOffsetTable, Label, RegisterVisitor, Registers, TrapCode, }; +pub use gpr::{Gpr, NonRspGpr, Size}; pub use imm::{Extension, Imm16, Imm32, Imm8, Simm16, Simm32, Simm8}; pub use mem::{ Amode, AmodeOffset, AmodeOffsetPlusKnownOffset, DeferredTarget, GprMem, Scale, XmmMem, }; -pub use reg::{Gpr, NonRspGpr, Size}; pub use rex::RexFlags; pub use xmm::Xmm; diff --git a/cranelift/assembler-x64/src/mem.rs b/cranelift/assembler-x64/src/mem.rs index 2e9f6a39f6..f79f746932 100644 --- a/cranelift/assembler-x64/src/mem.rs +++ b/cranelift/assembler-x64/src/mem.rs @@ -1,9 +1,8 @@ //! Memory operands to instructions. use crate::api::{AsReg, CodeSink, Constant, KnownOffset, KnownOffsetTable, Label, TrapCode}; -use crate::reg::{self, NonRspGpr, Size}; +use crate::gpr::{self, NonRspGpr, Size}; use crate::rex::{encode_modrm, encode_sib, Imm, RexFlags}; -use crate::xmm; /// x64 memory addressing modes. #[derive(Clone, Debug)] @@ -165,11 +164,12 @@ pub enum DeferredTarget { impl std::fmt::Display for Amode { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let pointer_width = Size::Quadword; match self { Amode::ImmReg { simm32, base, .. } => { // Note: size is always 8; the address is 64 bits, // even if the addressed operand is smaller. - let base = reg::enc::to_string(base.enc(), Size::Quadword); + let base = base.to_string(Some(pointer_width)); write!(f, "{simm32:x}({base})") } Amode::ImmRegRegShift { @@ -179,8 +179,8 @@ impl std::fmt::Display for Amode { scale, .. } => { - let base = reg::enc::to_string(base.enc(), Size::Quadword); - let index = reg::enc::to_string(index.enc(), Size::Quadword); + let base = base.to_string(Some(pointer_width)); + let index = index.to_string(pointer_width); let shift = scale.shift(); if shift > 1 { write!(f, "{simm32:x}({base}, {index}, {shift})") @@ -256,7 +256,7 @@ impl GprMem { /// Pretty-print the operand. pub fn to_string(&self, size: Size) -> String { match self { - GprMem::Gpr(gpr) => reg::enc::to_string(gpr.enc(), size).to_owned(), + GprMem::Gpr(gpr) => gpr.to_string(Some(size)), GprMem::Mem(amode) => amode.to_string(), } } @@ -289,7 +289,7 @@ impl XmmMem { /// Pretty-print the operand. pub fn to_string(&self) -> String { match self { - XmmMem::Xmm(xmm) => xmm::enc::to_string(xmm.enc()).to_owned(), + XmmMem::Xmm(xmm) => xmm.to_string(None), XmmMem::Mem(amode) => amode.to_string(), } } @@ -313,7 +313,7 @@ pub fn emit_modrm_sib_disp( // optional immediate. If rsp is the base register, however, then a // SIB byte must be used. let enc_e_low3 = enc_e & 7; - if enc_e_low3 == reg::enc::RSP { + if enc_e_low3 == gpr::enc::RSP { // Displacement from RSP is encoded with a SIB byte where // the index and base are both encoded as RSP's encoding of // 0b100. This special encoding means that the index register @@ -326,7 +326,7 @@ pub fn emit_modrm_sib_disp( // If the base register is rbp and there's no offset then force // a 1-byte zero offset since otherwise the encoding would be // invalid. - if enc_e_low3 == reg::enc::RBP { + if enc_e_low3 == gpr::enc::RBP { imm.force_immediate(); } sink.put1(encode_modrm(imm.m0d(), enc_g & 7, enc_e & 7)); @@ -348,14 +348,14 @@ pub fn emit_modrm_sib_disp( // ever be rsp. Note, though, that the encoding of r12, whose three // lower bits match the encoding of rsp, is explicitly allowed with // REX bytes so only rsp is disallowed. - assert!(enc_index != reg::enc::RSP); + assert!(enc_index != gpr::enc::RSP); // If the offset is zero then there is no immediate. Note, though, // that if the base register's lower three bits are `101` then an // offset must be present. This is a special case in the encoding of // the SIB byte and requires an explicit displacement with rbp/r13. let mut imm = Imm::new(simm32.value(), evex_scaling); - if enc_base & 7 == reg::enc::RBP { + if enc_base & 7 == gpr::enc::RBP { imm.force_immediate(); } @@ -384,7 +384,6 @@ pub fn emit_modrm_sib_disp( // to the end of the u32 field. So, to compensate for // this, we emit a negative extra offset in the u32 field // initially, and the relocation will add to it. - #[allow(clippy::cast_sign_loss, reason = "bit conversion is intended here")] sink.put4(-(i32::from(bytes_at_end)) as u32); } } diff --git a/cranelift/assembler-x64/src/rex.rs b/cranelift/assembler-x64/src/rex.rs index 886fd52cf9..b8d4842ff4 100644 --- a/cranelift/assembler-x64/src/rex.rs +++ b/cranelift/assembler-x64/src/rex.rs @@ -1,7 +1,5 @@ //! Encoding logic for REX instructions. -// #![allow(clippy::bool_to_int_with_if)] - use crate::api::CodeSink; pub(crate) fn low8_will_sign_extend_to_32(xs: i32) -> bool { @@ -121,7 +119,6 @@ impl RexFlags { } #[derive(Copy, Clone)] -#[allow(missing_docs, reason = "variants are self-explanatory")] pub enum Imm { None, Imm8(i8), @@ -151,7 +148,6 @@ impl Imm { if val % i32::from(scaling) == 0 { let scaled = val / i32::from(scaling); if low8_will_sign_extend_to_32(scaled) { - #[allow(clippy::cast_possible_truncation, reason = "pre-existing code")] return Imm::Imm8(scaled as i8); } } @@ -183,7 +179,6 @@ impl Imm { } /// Emit the truncated immediate into the code sink. - #[allow(clippy::cast_sign_loss, reason = "bit conversion is intended here")] pub fn emit(self, sink: &mut impl CodeSink) { match self { Imm::None => {} diff --git a/cranelift/bitset/src/compound.rs b/cranelift/bitset/src/compound.rs index ebb9b4e7d7..508a80126f 100644 --- a/cranelift/bitset/src/compound.rs +++ b/cranelift/bitset/src/compound.rs @@ -1,6 +1,6 @@ //! Compound bit sets. -use crate::scalar::{self, ScalarBitSet}; +use crate::scalar::{self, ScalarBitSet, ScalarBitSetStorage}; use alloc::boxed::Box; use core::{cmp, iter, mem}; @@ -45,8 +45,8 @@ use core::{cmp, iter, mem}; feature = "enable-serde", derive(serde_derive::Serialize, serde_derive::Deserialize) )] -pub struct CompoundBitSet { - elems: Box<[ScalarBitSet]>, +pub struct CompoundBitSet { + elems: Box<[ScalarBitSet]>, max: Option, } @@ -57,8 +57,6 @@ impl core::fmt::Debug for CompoundBitSet { } } -const BITS_PER_WORD: usize = mem::size_of::() * 8; - impl CompoundBitSet { /// Construct a new, empty bit set. /// @@ -75,6 +73,10 @@ impl CompoundBitSet { pub fn new() -> Self { CompoundBitSet::default() } +} + +impl CompoundBitSet { + const BITS_PER_SCALAR: usize = mem::size_of::() * 8; /// Construct a new, empty bit set with space reserved to store any element /// `x` such that `x < capacity`. @@ -86,14 +88,14 @@ impl CompoundBitSet { /// ``` /// use cranelift_bitset::CompoundBitSet; /// - /// let bitset = CompoundBitSet::with_capacity(4096); + /// let bitset = CompoundBitSet::::with_capacity(4096); /// /// assert!(bitset.is_empty()); /// assert!(bitset.capacity() >= 4096); /// ``` #[inline] pub fn with_capacity(capacity: usize) -> Self { - let mut bitset = Self::new(); + let mut bitset = Self::default(); bitset.ensure_capacity(capacity); bitset } @@ -144,7 +146,7 @@ impl CompoundBitSet { /// assert!(bitset.capacity() >= 999); ///``` pub fn capacity(&self) -> usize { - self.elems.len() * BITS_PER_WORD + self.elems.len() * Self::BITS_PER_SCALAR } /// Is this bitset empty? @@ -172,8 +174,8 @@ impl CompoundBitSet { /// `ScalarBitSet` at `self.elems[word]`. #[inline] fn word_and_bit(i: usize) -> (usize, u8) { - let word = i / BITS_PER_WORD; - let bit = i % BITS_PER_WORD; + let word = i / Self::BITS_PER_SCALAR; + let bit = i % Self::BITS_PER_SCALAR; let bit = u8::try_from(bit).unwrap(); (word, bit) } @@ -183,8 +185,8 @@ impl CompoundBitSet { #[inline] fn elem(word: usize, bit: u8) -> usize { let bit = usize::from(bit); - debug_assert!(bit < BITS_PER_WORD); - word * BITS_PER_WORD + bit + debug_assert!(bit < Self::BITS_PER_SCALAR); + word * Self::BITS_PER_SCALAR + bit } /// Is `i` contained in this bitset? @@ -241,7 +243,13 @@ impl CompoundBitSet { /// ``` #[inline] pub fn ensure_capacity(&mut self, n: usize) { - let (word, _bit) = Self::word_and_bit(n); + // Subtract one from the capacity to get the maximum bit that we might + // set. If `n` is 0 then nothing need be done as no capacity needs to be + // allocated. + let (word, _bit) = Self::word_and_bit(match n.checked_sub(1) { + None => return, + Some(n) => n, + }); if word >= self.elems.len() { assert!(word < usize::try_from(isize::MAX).unwrap()); @@ -461,19 +469,63 @@ impl CompoundBitSet { /// ); /// ``` #[inline] - pub fn iter(&self) -> Iter<'_> { + pub fn iter(&self) -> Iter<'_, T> { Iter { bitset: self, word: 0, sub: None, } } + + /// Returns an iterator over the words of this bit-set or the in-memory + /// representation of the bit set. + /// + /// # Example + /// + /// ``` + /// use cranelift_bitset::{CompoundBitSet, ScalarBitSet}; + /// + /// let mut bitset = CompoundBitSet::::default(); + /// + /// assert_eq!( + /// bitset.iter_scalars().collect::>(), + /// [], + /// ); + /// + /// bitset.insert(0); + /// + /// assert_eq!( + /// bitset.iter_scalars().collect::>(), + /// [ScalarBitSet(0x1)], + /// ); + /// + /// bitset.insert(1); + /// + /// assert_eq!( + /// bitset.iter_scalars().collect::>(), + /// [ScalarBitSet(0x3)], + /// ); + /// + /// bitset.insert(32); + /// + /// assert_eq!( + /// bitset.iter_scalars().collect::>(), + /// [ScalarBitSet(0x3), ScalarBitSet(0x1)], + /// ); + /// ``` + pub fn iter_scalars(&self) -> impl Iterator> + '_ { + let nwords = match self.max { + Some(n) => 1 + (n as usize / Self::BITS_PER_SCALAR), + None => 0, + }; + self.elems.iter().copied().take(nwords) + } } -impl<'a> IntoIterator for &'a CompoundBitSet { +impl<'a, T: ScalarBitSetStorage> IntoIterator for &'a CompoundBitSet { type Item = usize; - type IntoIter = Iter<'a>; + type IntoIter = Iter<'a, T>; #[inline] fn into_iter(self) -> Self::IntoIter { @@ -482,13 +534,13 @@ impl<'a> IntoIterator for &'a CompoundBitSet { } /// An iterator over the elements in a [`CompoundBitSet`]. -pub struct Iter<'a> { - bitset: &'a CompoundBitSet, +pub struct Iter<'a, T = usize> { + bitset: &'a CompoundBitSet, word: usize, - sub: Option>, + sub: Option>, } -impl Iterator for Iter<'_> { +impl Iterator for Iter<'_, T> { type Item = usize; #[inline] @@ -496,7 +548,7 @@ impl Iterator for Iter<'_> { loop { if let Some(sub) = &mut self.sub { if let Some(bit) = sub.next() { - return Some(CompoundBitSet::elem(self.word, bit)); + return Some(CompoundBitSet::::elem(self.word, bit)); } else { self.word += 1; } @@ -506,3 +558,16 @@ impl Iterator for Iter<'_> { } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn zero_capacity_no_allocs() { + let set = CompoundBitSet::::with_capacity(0); + assert_eq!(set.capacity(), 0); + let set = CompoundBitSet::new(); + assert_eq!(set.capacity(), 0); + } +} diff --git a/cranelift/codegen/Cargo.toml b/cranelift/codegen/Cargo.toml index 16f0f1f52c..fccc1354a6 100644 --- a/cranelift/codegen/Cargo.toml +++ b/cranelift/codegen/Cargo.toml @@ -24,7 +24,7 @@ features = ["all-arch"] anyhow = { workspace = true, optional = true, features = ['std'] } bumpalo = "3" capstone = { workspace = true, optional = true } -cranelift-assembler-x64 = { path = "../assembler-x64", version = "0.119.0" } +cranelift-assembler-x64 = { workspace = true } cranelift-codegen-shared = { path = "./shared", version = "0.119.0" } cranelift-entity = { workspace = true } cranelift-bforest = { workspace = true } diff --git a/cranelift/codegen/build.rs b/cranelift/codegen/build.rs index 7dac7408dc..b06b42ae8d 100644 --- a/cranelift/codegen/build.rs +++ b/cranelift/codegen/build.rs @@ -63,6 +63,7 @@ fn main() { let crate_dir = cur_dir.as_path(); println!("cargo:rerun-if-changed=build.rs"); + println!("cargo:rerun-if-env-changed=ISLE_SOURCE_DIR"); let isle_dir = if let Ok(path) = std::env::var("ISLE_SOURCE_DIR") { // This will canonicalize any relative path in terms of the diff --git a/cranelift/codegen/meta/Cargo.toml b/cranelift/codegen/meta/Cargo.toml index c569686b17..6b8fdbc5f9 100644 --- a/cranelift/codegen/meta/Cargo.toml +++ b/cranelift/codegen/meta/Cargo.toml @@ -16,7 +16,8 @@ workspace = true rustdoc-args = ["--document-private-items"] [dependencies] -cranelift-assembler-x64 = { path = "../../assembler-x64", version = "0.119.0" } +cranelift-srcgen = { workspace = true } +cranelift-assembler-x64-meta = { path = "../../assembler-x64/meta", version = "0.119.0" } cranelift-codegen-shared = { path = "../shared", version = "0.119.0" } pulley-interpreter = { workspace = true, optional = true } diff --git a/cranelift/codegen/meta/src/gen_asm.rs b/cranelift/codegen/meta/src/gen_asm.rs new file mode 100644 index 0000000000..af8a3ef025 --- /dev/null +++ b/cranelift/codegen/meta/src/gen_asm.rs @@ -0,0 +1,470 @@ +//! Generate the Cranelift-specific integration of the x64 assembler. + +use cranelift_assembler_x64_meta::dsl::{Format, Inst, Mutability, Operand, OperandKind}; +use cranelift_srcgen::{fmtln, Formatter}; + +/// Returns the Rust type used for the `IsleConstructorRaw` variants. +pub fn rust_param_raw(op: &Operand) -> String { + match op.location.kind() { + OperandKind::Imm(loc) => { + let bits = loc.bits(); + if op.extension.is_sign_extended() { + format!("i{bits}") + } else { + format!("u{bits}") + } + } + OperandKind::RegMem(rm) => { + let reg = match rm.bits() { + 128 => "Xmm", + _ => "Gpr", + }; + let aligned = if op.align { "Aligned" } else { "" }; + format!("&{reg}Mem{aligned}") + } + OperandKind::Mem(_) => { + format!("&Amode") + } + OperandKind::Reg(r) => match r.bits() { + 128 => "Xmm".to_string(), + _ => "Gpr".to_string(), + }, + OperandKind::FixedReg(_) => "Gpr".to_string(), + } +} + +/// Returns the conversion function, if any, when converting the ISLE type for +/// this parameter to the assembler type for this parameter. Effectively +/// converts `self.rust_param_raw()` to the assembler type. +pub fn rust_convert_isle_to_assembler(op: &Operand) -> Option<&'static str> { + match op.location.kind() { + OperandKind::Reg(r) => Some(match (r.bits(), op.mutability) { + (128, Mutability::Read) => "cranelift_assembler_x64::Xmm::new", + (128, Mutability::ReadWrite) => "self.convert_xmm_to_assembler_read_write_xmm", + (_, Mutability::Read) => "cranelift_assembler_x64::Gpr::new", + (_, Mutability::ReadWrite) => "self.convert_gpr_to_assembler_read_write_gpr", + }), + OperandKind::Mem(_) => Some("self.convert_amode_to_assembler_amode"), + OperandKind::RegMem(r) => Some(match (r.bits(), op.mutability) { + (128, Mutability::Read) => "self.convert_xmm_mem_to_assembler_read_xmm_mem", + (128, Mutability::ReadWrite) => "self.convert_xmm_mem_to_assembler_read_write_xmm_mem", + (_, Mutability::Read) => "self.convert_gpr_mem_to_assembler_read_gpr_mem", + (_, Mutability::ReadWrite) => "self.convert_gpr_mem_to_assembler_read_write_gpr_mem", + }), + OperandKind::Imm(loc) => match (op.extension.is_sign_extended(), loc.bits()) { + (true, 8) => Some("cranelift_assembler_x64::Simm8::new"), + (true, 16) => Some("cranelift_assembler_x64::Simm16::new"), + (true, 32) => Some("cranelift_assembler_x64::Simm32::new"), + (false, 8) => Some("cranelift_assembler_x64::Imm8::new"), + (false, 16) => Some("cranelift_assembler_x64::Imm16::new"), + (false, 32) => Some("cranelift_assembler_x64::Imm32::new"), + _ => None, + }, + OperandKind::FixedReg(_) => None, + } +} + +/// `fn x64_(&mut self, ) -> Inst { ... }` +/// +/// # Panics +/// +/// This function panics if the instruction has no operands. +pub fn generate_macro_inst_fn(f: &mut Formatter, inst: &Inst) { + let struct_name = inst.name(); + let params = inst + .format + .operands + .iter() + .filter(|o| o.mutability.is_read()) + // FIXME(#10238) don't filter out fixed regs here + .filter(|o| !matches!(o.location.kind(), OperandKind::FixedReg(_))) + .collect::>(); + let results = inst + .format + .operands + .iter() + .filter(|o| o.mutability.is_write()) + .collect::>(); + let rust_params = params + .iter() + .map(|o| format!("{}: {}", o.location, rust_param_raw(o))) + .collect::>() + .join(", "); + f.add_block( + &format!("fn x64_{struct_name}_raw(&mut self, {rust_params}) -> AssemblerOutputs"), + |f| { + for o in params.iter() { + let l = o.location; + match rust_convert_isle_to_assembler(o) { + Some(cvt) => fmtln!(f, "let {l} = {cvt}({l});"), + None => fmtln!(f, "let {l} = {l}.clone();"), + } + } + let args = params + .iter() + .map(|o| format!("{}.clone()", o.location)) + .collect::>(); + let args = args.join(", "); + fmtln!( + f, + "let inst = cranelift_assembler_x64::inst::{struct_name}::new({args}).into();" + ); + if let Some(OperandKind::FixedReg(_)) = results.first().map(|o| o.location.kind()) { + fmtln!(f, "#[allow(unused_variables, reason = \"FIXME(#10238): fixed register instructions have TODOs\")]"); + } + fmtln!(f, "let inst = MInst::External {{ inst }};"); + + use cranelift_assembler_x64_meta::dsl::Mutability::*; + match results.as_slice() { + [] => fmtln!(f, "SideEffectNoResult::Inst(inst)"), + [one] => match one.mutability { + Read => unreachable!(), + ReadWrite => match one.location.kind() { + OperandKind::Imm(_) => unreachable!(), + // FIXME(#10238) + OperandKind::FixedReg(_) => fmtln!(f, "todo!()"), + // One read/write register output? Output the instruction + // and that register. + OperandKind::Reg(r) => { + let (var, ty) = match r.bits() { + 128 => ("xmm", "Xmm"), + _ => ("gpr", "Gpr"), + }; + fmtln!( + f, + "let {var} = {r}.as_ref().write.to_reg();", + ); + fmtln!(f, "AssemblerOutputs::Ret{ty} {{ inst, {var} }}"); + }, + // One read/write memory operand? Output a side effect. + OperandKind::Mem(_) => { + fmtln!(f, "AssemblerOutputs::SideEffect {{ inst }}") + } + // One read/write regmem output? We need to output + // everything and it'll internally disambiguate which was + // emitted (e.g. the mem variant or the register variant). + OperandKind::RegMem(rm) => { + assert_eq!(results.len(), 1); + let (var, ty) = match rm.bits() { + 128 => ("xmm", "Xmm"), + _ => ("gpr", "Gpr"), + }; + f.add_block(&format!("match {rm}"), |f| { + f.add_block(&format!("asm::{ty}Mem::{ty}(reg) => "), |f| { + fmtln!(f, "let {var} = reg.write.to_reg();"); + fmtln!(f, "AssemblerOutputs::Ret{ty} {{ inst, {var} }} "); + }); + f.add_block(&format!("asm::{ty}Mem::Mem(_) => "), |f| { + fmtln!(f, "AssemblerOutputs::SideEffect {{ inst }} "); + }); + }); + } + }, + }, + _ => panic!("instruction has more than one result"), + } + }, + ); +} + +/// Generate the `isle_assembler_methods!` macro. +pub fn generate_rust_macro(f: &mut Formatter, insts: &[Inst]) { + fmtln!(f, "#[doc(hidden)]"); + fmtln!(f, "macro_rules! isle_assembler_methods {{"); + f.indent(|f| { + fmtln!(f, "() => {{"); + f.indent(|f| { + for inst in insts { + generate_macro_inst_fn(f, inst); + } + }); + fmtln!(f, "}};"); + }); + fmtln!(f, "}}"); +} + +/// Returns the type of this operand in ISLE as a part of the ISLE "raw" +/// constructors. +pub fn isle_param_raw(op: &Operand) -> String { + match op.location.kind() { + OperandKind::Imm(loc) => { + let bits = loc.bits(); + if op.extension.is_sign_extended() { + format!("i{bits}") + } else { + format!("u{bits}") + } + } + OperandKind::Reg(r) => match r.bits() { + 128 => "Xmm".to_string(), + _ => "Gpr".to_string(), + }, + OperandKind::FixedReg(_) => "Gpr".to_string(), + OperandKind::Mem(_) => { + if op.align { + unimplemented!("no way yet to mark an Amode as aligned") + } else { + "Amode".to_string() + } + } + OperandKind::RegMem(rm) => { + let reg = match rm.bits() { + 128 => "Xmm", + _ => "Gpr", + }; + let aligned = if op.align { "Aligned" } else { "" }; + format!("{reg}Mem{aligned}") + } + } +} + +/// Different kinds of ISLE constructors generated for a particular instruction. +/// +/// One instruction may generate a single constructor or multiple constructors. +/// For example an instruction that writes its result to a register will +/// generate only a single constructor. An instruction where the destination +/// read/write operand is `GprMem` will generate two constructors though, one +/// for memory and one for in registers. +#[derive(Copy, Clone, Debug)] +pub enum IsleConstructor { + /// This constructor only produces a side effect, meaning that the + /// instruction does not produce results in registers. This may produce + /// a result in memory, however. + RetMemorySideEffect, + + /// This constructor produces a `Gpr` value, meaning that it will write the + /// result to a `Gpr`. + RetGpr, + + /// This constructor produces an `Xmm` value, meaning that it will write the + /// result to an `Xmm`. + RetXmm, +} + +impl IsleConstructor { + /// Returns the result type, in ISLE, that this constructor generates. + pub fn result_ty(&self) -> &'static str { + match self { + IsleConstructor::RetMemorySideEffect => "SideEffectNoResult", + IsleConstructor::RetGpr => "Gpr", + IsleConstructor::RetXmm => "Xmm", + } + } + + /// Returns the constructor used to convert an `AssemblerOutput` into the + /// type returned by [`Self::result_ty`]. + pub fn conversion_constructor(&self) -> &'static str { + match self { + IsleConstructor::RetMemorySideEffect => "defer_side_effect", + IsleConstructor::RetGpr => "emit_ret_gpr", + IsleConstructor::RetXmm => "emit_ret_xmm", + } + } + + /// Returns the suffix used in the ISLE constructor name. + pub fn suffix(&self) -> &'static str { + match self { + IsleConstructor::RetMemorySideEffect => "_mem", + IsleConstructor::RetGpr => "", + IsleConstructor::RetXmm => "", + } + } +} + +/// Returns the parameter type used for the `IsleConstructor` variant +/// provided. +pub fn isle_param_for_ctor(op: &Operand, ctor: IsleConstructor) -> String { + match op.location.kind() { + // Writable `RegMem` operands are special here: in one constructor + // it's operating on memory so the argument is `Amode` and in the + // other constructor it's operating on registers so the argument is + // a `Gpr`. + OperandKind::RegMem(_) if op.mutability.is_write() => match ctor { + IsleConstructor::RetMemorySideEffect => "Amode".to_string(), + IsleConstructor::RetGpr => "Gpr".to_string(), + IsleConstructor::RetXmm => "Xmm".to_string(), + }, + + // everything else is the same as the "raw" variant + _ => isle_param_raw(op), + } +} + +/// Returns the ISLE constructors that are going to be used when generating +/// this instruction. +/// +/// Note that one instruction might need multiple constructors, such as one +/// for operating on memory and one for operating on registers. +pub fn isle_constructors(format: &Format) -> Vec { + use Mutability::*; + use OperandKind::*; + + let write_operands = format + .operands + .iter() + .filter(|o| o.mutability.is_write()) + .collect::>(); + match &write_operands[..] { + [] => unimplemented!("if you truly need this (and not a `SideEffect*`), add a `NoReturn` variant to `AssemblerOutputs`"), + [one] => match one.mutability { + Read => unreachable!(), + ReadWrite => match one.location.kind() { + Imm(_) => unreachable!(), + FixedReg(_) => vec![IsleConstructor::RetGpr], + // One read/write register output? Output the instruction + // and that register. + Reg(r) => match r.bits() { + 128 => vec![IsleConstructor::RetXmm], + _ => vec![IsleConstructor::RetGpr], + }, + // One read/write memory operand? Output a side effect. + Mem(_) => vec![IsleConstructor::RetMemorySideEffect], + // One read/write reg-mem output? We need constructors for + // both variants. + RegMem(rm) => match rm.bits() { + 128 => vec![IsleConstructor::RetXmm, IsleConstructor::RetMemorySideEffect], + _ => vec![IsleConstructor::RetGpr, IsleConstructor::RetMemorySideEffect], + }, + } + }, + other => panic!("unsupported number of write operands {other:?}"), + } +} + +/// Generate a "raw" constructor that simply constructs, but does not emit +/// the assembly instruction: +/// +/// ```text +/// (decl x64__raw () AssemblerOutputs) +/// (extern constructor x64__raw x64__raw) +/// ``` +/// +/// Using the "raw" constructor, we also generate "emitter" constructors +/// (see [`IsleConstructor`]). E.g., instructions that write to a register +/// will return the register: +/// +/// ```text +/// (decl x64_ () Gpr) +/// (rule (x64_ ) (emit_ret_gpr (x64__raw ))) +/// ``` +/// +/// For instructions that write to memory, we also generate an "emitter" +/// constructor with the `_mem` suffix: +/// +/// ```text +/// (decl x64__mem () SideEffectNoResult) +/// (rule (x64__mem ) (defer_side_effect (x64__raw ))) +/// ``` +/// +/// # Panics +/// +/// This function panics if the instruction has no operands. +pub fn generate_isle_inst_decls(f: &mut Formatter, inst: &Inst) { + // First declare the "raw" constructor which is implemented in Rust + // with `generate_isle_macro` above. This is an "extern" constructor + // with relatively raw types. This is not intended to be used by + // general lowering rules in ISLE. + let struct_name = inst.name(); + let raw_name = format!("x64_{struct_name}_raw"); + let params = inst + .format + .operands + .iter() + .filter(|o| o.mutability.is_read()) + // FIXME(#10238) don't filter out fixed regs here + .filter(|o| !matches!(o.location.kind(), OperandKind::FixedReg(_))) + .collect::>(); + let raw_param_tys = params + .iter() + .map(|o| isle_param_raw(o)) + .collect::>() + .join(" "); + fmtln!(f, "(decl {raw_name} ({raw_param_tys}) AssemblerOutputs)"); + fmtln!(f, "(extern constructor {raw_name} {raw_name})"); + + // Next, for each "emitter" ISLE constructor being generated, synthesize + // a pure-ISLE constructor which delegates appropriately to the `*_raw` + // constructor above. + // + // The main purpose of these constructors is to have faithful type + // signatures for the SSA nature of VCode/ISLE, effectively translating + // x64's type system to ISLE/VCode's type system. + for ctor in isle_constructors(&inst.format) { + let suffix = ctor.suffix(); + let rule_name = format!("x64_{struct_name}{suffix}"); + let result_ty = ctor.result_ty(); + let param_tys = params + .iter() + .map(|o| isle_param_for_ctor(o, ctor)) + .collect::>() + .join(" "); + let param_names = params + .iter() + .map(|o| o.location.to_string()) + .collect::>() + .join(" "); + let convert = ctor.conversion_constructor(); + + fmtln!(f, "(decl {rule_name} ({param_tys}) {result_ty})"); + fmtln!( + f, + "(rule ({rule_name} {param_names}) ({convert} ({raw_name} {param_names})))" + ); + } +} + +/// Generate the ISLE definitions that match the `isle_assembler_methods!` macro +/// above. +pub fn generate_isle(f: &mut Formatter, insts: &[Inst]) { + fmtln!(f, "(type AssemblerOutputs (enum"); + fmtln!(f, " ;; Used for instructions that have ISLE"); + fmtln!(f, " ;; `SideEffect`s (memory stores, traps,"); + fmtln!(f, " ;; etc.) and do not return a `Value`."); + fmtln!(f, " (SideEffect (inst MInst))"); + fmtln!(f, " ;; Used for instructions that return a"); + fmtln!(f, " ;; GPR (including `GprMem` variants with"); + fmtln!(f, " ;; a GPR as the first argument)."); + fmtln!(f, " (RetGpr (inst MInst) (gpr Gpr))"); + fmtln!(f, " ;; Used for instructions that return an"); + fmtln!(f, " ;; XMM register."); + fmtln!(f, " (RetXmm (inst MInst) (xmm Xmm))"); + fmtln!(f, " ;; TODO: eventually add more variants for"); + fmtln!(f, " ;; multi-return, XMM, etc.; see"); + fmtln!( + f, + " ;; https://github.com/bytecodealliance/wasmtime/pull/10276" + ); + fmtln!(f, "))"); + f.empty_line(); + + fmtln!(f, ";; Directly emit instructions that return a GPR."); + fmtln!(f, "(decl emit_ret_gpr (AssemblerOutputs) Gpr)"); + fmtln!(f, "(rule (emit_ret_gpr (AssemblerOutputs.RetGpr inst gpr))"); + fmtln!(f, " (let ((_ Unit (emit inst))) gpr))"); + f.empty_line(); + + fmtln!(f, ";; Directly emit instructions that return an"); + fmtln!(f, ";; XMM register."); + fmtln!(f, "(decl emit_ret_xmm (AssemblerOutputs) Xmm)"); + fmtln!(f, "(rule (emit_ret_xmm (AssemblerOutputs.RetXmm inst xmm))"); + fmtln!(f, " (let ((_ Unit (emit inst))) xmm))"); + f.empty_line(); + + fmtln!(f, ";; Pass along the side-effecting instruction"); + fmtln!(f, ";; for later emission."); + fmtln!( + f, + "(decl defer_side_effect (AssemblerOutputs) SideEffectNoResult)" + ); + fmtln!( + f, + "(rule (defer_side_effect (AssemblerOutputs.SideEffect inst))" + ); + fmtln!(f, " (SideEffectNoResult.Inst inst))"); + f.empty_line(); + + for inst in insts { + generate_isle_inst_decls(f, inst); + f.empty_line(); + } +} diff --git a/cranelift/codegen/meta/src/gen_inst.rs b/cranelift/codegen/meta/src/gen_inst.rs index 82e80c722f..f26b326f93 100644 --- a/cranelift/codegen/meta/src/gen_inst.rs +++ b/cranelift/codegen/meta/src/gen_inst.rs @@ -1,18 +1,15 @@ -//! Generate instruction data (including opcodes, formats, builders, etc.). -use std::fmt; -use std::rc::Rc; - -use cranelift_codegen_shared::constant_hash; +//! Generate CLIF instruction data (including opcodes, formats, builders, etc.). use crate::cdsl::camel_case; use crate::cdsl::formats::InstructionFormat; use crate::cdsl::instructions::{AllInstructions, Instruction}; use crate::cdsl::operands::Operand; use crate::cdsl::typevar::{TypeSet, TypeVar}; - -use crate::error; -use crate::srcgen::{Formatter, Match}; use crate::unique_table::{UniqueSeqTable, UniqueTable}; +use cranelift_codegen_shared::constant_hash; +use cranelift_srcgen::{error, fmtln, Formatter, Language, Match}; +use std::fmt; +use std::rc::Rc; // TypeSet indexes are encoded in 8 bits, with `0xff` reserved. const TYPESET_LIMIT: usize = 0xff; @@ -29,35 +26,32 @@ fn gen_formats(formats: &[Rc], fmt: &mut Formatter) { "#, ); fmt.line("#[derive(Copy, Clone, PartialEq, Eq, Debug)]"); - fmt.line("pub enum InstructionFormat {"); - fmt.indent(|fmt| { + fmt.add_block("pub enum InstructionFormat", |fmt| { for format in formats { fmt.doc_comment(format.to_string()); fmtln!(fmt, "{},", format.name); } }); - fmt.line("}"); fmt.empty_line(); // Emit a From which also serves to verify that // InstructionFormat and InstructionData are in sync. - fmt.line("impl<'a> From<&'a InstructionData> for InstructionFormat {"); - fmt.indent(|fmt| { - fmt.line("fn from(inst: &'a InstructionData) -> Self {"); - fmt.indent(|fmt| { - let mut m = Match::new("*inst"); - for format in formats { - m.arm( - format!("InstructionData::{}", format.name), - vec![".."], - format!("Self::{}", format.name), - ); - } - fmt.add_match(m); - }); - fmt.line("}"); - }); - fmt.line("}"); + fmt.add_block( + "impl<'a> From<&'a InstructionData> for InstructionFormat", + |fmt| { + fmt.add_block("fn from(inst: &'a InstructionData) -> Self", |fmt| { + let mut m = Match::new("*inst"); + for format in formats { + m.arm( + format!("InstructionData::{}", format.name), + vec![".."], + format!("Self::{}", format.name), + ); + } + fmt.add_match(m); + }); + }, + ); fmt.empty_line(); } @@ -70,11 +64,9 @@ fn gen_instruction_data(formats: &[Rc], fmt: &mut Formatter) fmt.line("#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]"); fmt.line(r#"#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]"#); fmt.line("#[allow(missing_docs)]"); - fmtln!(fmt, "pub enum InstructionData {"); - fmt.indent(|fmt| { + fmt.add_block("pub enum InstructionData", |fmt| { for format in formats { - fmtln!(fmt, "{} {{", format.name); - fmt.indent(|fmt| { + fmt.add_block(&format!("{}", format.name), |fmt| { fmt.line("opcode: Opcode,"); if format.has_value_list { fmt.line("args: ValueList,"); @@ -99,10 +91,9 @@ fn gen_instruction_data(formats: &[Rc], fmt: &mut Formatter) fmtln!(fmt, "{}: {},", field.member, field.kind.rust_type); } }); - fmtln!(fmt, "},"); + fmtln!(fmt, ","); } }); - fmt.line("}"); } fn gen_arguments_method(formats: &[Rc], fmt: &mut Formatter, is_mut: bool) { @@ -117,15 +108,10 @@ fn gen_arguments_method(formats: &[Rc], fmt: &mut Formatter, ("arguments", "", "core::slice::from_ref", "as_slice") }; - fmtln!( - fmt, - "pub fn {}<'a>(&'a {}self, pool: &'a {}ir::ValueListPool) -> &'a {}[Value] {{", - method, - mut_, - mut_, - mut_ - ); - fmt.indent(|fmt| { + fmt.add_block(&format!( + "pub fn {method}<'a>(&'a {mut_}self, pool: &'a {mut_}ir::ValueListPool) -> &'a {mut_}[Value]"), + + |fmt| { let mut m = Match::new("*self"); for format in formats { let name = format!("Self::{}", format.name); @@ -160,7 +146,6 @@ fn gen_arguments_method(formats: &[Rc], fmt: &mut Formatter, } fmt.add_match(m); }); - fmtln!(fmt, "}"); } /// Generate the boring parts of the InstructionData implementation. @@ -174,11 +159,9 @@ fn gen_arguments_method(formats: &[Rc], fmt: &mut Formatter, /// - `pub fn eq(&self, &other: Self, &pool) -> bool` /// - `pub fn hash(&self, state: &mut H, &pool)` fn gen_instruction_data_impl(formats: &[Rc], fmt: &mut Formatter) { - fmt.line("impl InstructionData {"); - fmt.indent(|fmt| { + fmt.add_block("impl InstructionData",|fmt| { fmt.doc_comment("Get the opcode of this instruction."); - fmt.line("pub fn opcode(&self) -> Opcode {"); - fmt.indent(|fmt| { + fmt.add_block("pub fn opcode(&self) -> Opcode",|fmt| { let mut m = Match::new("*self"); for format in formats { m.arm(format!("Self::{}", format.name), vec!["opcode", ".."], @@ -186,12 +169,10 @@ fn gen_instruction_data_impl(formats: &[Rc], fmt: &mut Format } fmt.add_match(m); }); - fmt.line("}"); - fmt.empty_line(); + fmt.empty_line(); fmt.doc_comment("Get the controlling type variable operand."); - fmt.line("pub fn typevar_operand(&self, pool: &ir::ValueListPool) -> Option {"); - fmt.indent(|fmt| { + fmt.add_block("pub fn typevar_operand(&self, pool: &ir::ValueListPool) -> Option",|fmt| { let mut m = Match::new("*self"); for format in formats { let name = format!("Self::{}", format.name); @@ -212,8 +193,7 @@ fn gen_instruction_data_impl(formats: &[Rc], fmt: &mut Format } fmt.add_match(m); }); - fmt.line("}"); - fmt.empty_line(); + fmt.empty_line(); fmt.doc_comment("Get the value arguments to this instruction."); gen_arguments_method(formats, fmt, false); @@ -234,29 +214,25 @@ fn gen_instruction_data_impl(formats: &[Rc], fmt: &mut Format argument value to some other value before the instructions are compared. This allows various forms of canonicalization. "#); - fmt.line("pub fn eq Value>(&self, other: &Self, pool: &ir::ValueListPool, mapper: F) -> bool {"); - fmt.indent(|fmt| { - fmt.line("if ::core::mem::discriminant(self) != ::core::mem::discriminant(other) {"); - fmt.indent(|fmt| { + fmt.add_block("pub fn eq(&self, other: &Self, pool: &ir::ValueListPool) -> bool", |fmt| { + fmt.add_block("if ::core::mem::discriminant(self) != ::core::mem::discriminant(other)", |fmt| { fmt.line("return false;"); }); - fmt.line("}"); - fmt.line("match (self, other) {"); - fmt.indent(|fmt| { + fmt.add_block("match (self, other)",|fmt| { for format in formats { let name = format!("&Self::{}", format.name); let mut members = vec!["opcode"]; let args_eq = if format.has_value_list { members.push("args"); - Some("args1.as_slice(pool).iter().zip(args2.as_slice(pool).iter()).all(|(a, b)| mapper(*a) == mapper(*b))") + Some("args1.as_slice(pool).iter().zip(args2.as_slice(pool).iter()).all(|(a, b)| a == b)") } else if format.num_value_operands == 1 { members.push("arg"); - Some("mapper(*arg1) == mapper(*arg2)") + Some("arg1 == arg2") } else if format.num_value_operands > 0 { members.push("args"); - Some("args1.iter().zip(args2.iter()).all(|(a, b)| mapper(*a) == mapper(*b))") + Some("args1.iter().zip(args2.iter()).all(|(a, b)| a == b)") } else { None }; @@ -279,8 +255,7 @@ fn gen_instruction_data_impl(formats: &[Rc], fmt: &mut Format let pat1 = members.iter().map(|x| format!("{x}: ref {x}1")).collect::>().join(", "); let pat2 = members.iter().map(|x| format!("{x}: ref {x}2")).collect::>().join(", "); - fmtln!(fmt, "({} {{ {} }}, {} {{ {} }}) => {{", name, pat1, name, pat2); - fmt.indent(|fmt| { + fmt.add_block(&format!("({name} {{ {pat1} }}, {name} {{ {pat2} }}) => "), |fmt| { fmt.line("opcode1 == opcode2"); for field in &format.imm_fields { fmtln!(fmt, "&& {}1 == {}2", field.member, field.member); @@ -292,14 +267,11 @@ fn gen_instruction_data_impl(formats: &[Rc], fmt: &mut Format fmtln!(fmt, "&& {}", blocks_eq); } }); - fmtln!(fmt, "}"); } fmt.line("_ => unreachable!()"); }); - fmt.line("}"); - }); - fmt.line("}"); - fmt.empty_line(); + }); + fmt.empty_line(); fmt.doc_comment(r#" Hash an `InstructionData`. @@ -311,25 +283,23 @@ fn gen_instruction_data_impl(formats: &[Rc], fmt: &mut Format argument value to some other value before it is hashed. This allows various forms of canonicalization. "#); - fmt.line("pub fn hash Value>(&self, state: &mut H, pool: &ir::ValueListPool, mapper: F) {"); - fmt.indent(|fmt| { - fmt.line("match *self {"); - fmt.indent(|fmt| { + fmt.add_block("pub fn hash(&self, state: &mut H, pool: &ir::ValueListPool)",|fmt| { + fmt.add_block("match *self",|fmt| { for format in formats { let name = format!("Self::{}", format.name); let mut members = vec!["opcode"]; let (args, len) = if format.has_value_list { members.push("ref args"); - ("args.as_slice(pool)", "args.len(pool)") + (Some("args.as_slice(pool)"), "args.len(pool)") } else if format.num_value_operands == 1 { members.push("ref arg"); - ("std::slice::from_ref(arg)", "1") + (Some("std::slice::from_ref(arg)"), "1") } else if format.num_value_operands > 0 { members.push("ref args"); - ("args", "args.len()") + (Some("args"), "args.len()") } else { - ("&[]", "0") + (None, "0") }; let blocks = match format.num_block_operands { @@ -349,42 +319,32 @@ fn gen_instruction_data_impl(formats: &[Rc], fmt: &mut Format } let members = members.join(", "); - fmtln!(fmt, "{}{{{}}} => {{", name, members ); // beware the moustaches - fmt.indent(|fmt| { + fmt.add_block(&format!("{name}{{{members}}} => "), |fmt| { fmt.line("::core::hash::Hash::hash( &::core::mem::discriminant(self), state);"); fmt.line("::core::hash::Hash::hash(&opcode, state);"); for field in &format.imm_fields { fmtln!(fmt, "::core::hash::Hash::hash(&{}, state);", field.member); } fmtln!(fmt, "::core::hash::Hash::hash(&{}, state);", len); - fmtln!(fmt, "for &arg in {} {{", args); - fmt.indent(|fmt| { - fmtln!(fmt, "let arg = mapper(arg);"); - fmtln!(fmt, "::core::hash::Hash::hash(&arg, state);"); - }); - fmtln!(fmt, "}"); + if let Some(args) = args { + fmt.add_block(&format!("for &arg in {args}"), |fmt| { + fmtln!(fmt, "::core::hash::Hash::hash(&arg, state);"); + }); + } if let Some((blocks, len)) = blocks { - fmtln!(fmt, "::core::hash::Hash::hash(&{}, state);", len); - fmtln!(fmt, "for &block in {} {{", blocks); - fmt.indent(|fmt| { + fmtln!(fmt, "::core::hash::Hash::hash(&{len}, state);"); + fmt.add_block(&format!("for &block in {blocks}"), |fmt| { fmtln!(fmt, "::core::hash::Hash::hash(&block.block(pool), state);"); - fmtln!(fmt, "for &arg in block.args_slice(pool) {"); - fmt.indent(|fmt| { - fmtln!(fmt, "let arg = mapper(arg);"); + fmt.add_block("for &arg in block.args_slice(pool)", |fmt| { fmtln!(fmt, "::core::hash::Hash::hash(&arg, state);"); }); - fmtln!(fmt, "}"); }); - fmtln!(fmt, "}"); } }); - fmtln!(fmt, "}"); } }); - fmt.line("}"); - }); - fmt.line("}"); + }); fmt.empty_line(); @@ -394,10 +354,8 @@ fn gen_instruction_data_impl(formats: &[Rc], fmt: &mut Format This operation requires a reference to a `ValueListPool` to clone the `ValueLists`. "#); - fmt.line("pub fn deep_clone(&self, pool: &mut ir::ValueListPool) -> Self {"); - fmt.indent(|fmt| { - fmt.line("match *self {"); - fmt.indent(|fmt| { + fmt.add_block("pub fn deep_clone(&self, pool: &mut ir::ValueListPool) -> Self",|fmt| { + fmt.add_block("match *self",|fmt| { for format in formats { let name = format!("Self::{}", format.name); let mut members = vec!["opcode"]; @@ -425,10 +383,8 @@ fn gen_instruction_data_impl(formats: &[Rc], fmt: &mut Format } let members = members.join(", "); - fmtln!(fmt, "{}{{{}}} => {{", name, members ); // beware the moustaches - fmt.indent(|fmt| { - fmtln!(fmt, "Self::{} {{", format.name); - fmt.indent(|fmt| { + fmt.add_block(&format!("{name}{{{members}}} => "),|fmt| { + fmt.add_block(&format!("Self::{}", format.name), |fmt| { fmtln!(fmt, "opcode,"); if format.has_value_list { @@ -454,16 +410,11 @@ fn gen_instruction_data_impl(formats: &[Rc], fmt: &mut Format fmtln!(fmt, "{},", field.member); } }); - fmtln!(fmt, "}"); }); - fmtln!(fmt, "}"); } }); - fmt.line("}"); - }); - fmt.line("}"); - }); - fmt.line("}"); + }); + }); } fn gen_bool_accessor bool>( @@ -474,8 +425,7 @@ fn gen_bool_accessor bool>( fmt: &mut Formatter, ) { fmt.doc_comment(doc); - fmtln!(fmt, "pub fn {}(self) -> bool {{", name); - fmt.indent(|fmt| { + fmt.add_block(&format!("pub fn {name}(self) -> bool"), |fmt| { let mut m = Match::new("self"); for inst in all_inst.iter() { if get_attr(inst) { @@ -485,7 +435,6 @@ fn gen_bool_accessor bool>( m.arm_no_fields("_", "false"); fmt.add_match(m); }); - fmtln!(fmt, "}"); fmt.empty_line(); } @@ -510,8 +459,7 @@ fn gen_opcodes(all_inst: &AllInstructions, fmt: &mut Formatter) { // advantage of the NonZero optimization, meaning that wrapping enums can use the 0 // discriminant instead of increasing the size of the whole type, and so the size of // Option is the same as Opcode's. - fmt.line("pub enum Opcode {"); - fmt.indent(|fmt| { + fmt.add_block("pub enum Opcode", |fmt| { let mut is_first_opcode = true; for inst in all_inst.iter() { fmt.doc_comment(format!("`{}`. ({})", inst, inst.format.name)); @@ -536,11 +484,9 @@ fn gen_opcodes(all_inst: &AllInstructions, fmt: &mut Formatter) { } } }); - fmt.line("}"); fmt.empty_line(); - fmt.line("impl Opcode {"); - fmt.indent(|fmt| { + fmt.add_block("impl Opcode", |fmt| { gen_bool_accessor( all_inst, |inst| inst.is_terminator, @@ -607,8 +553,7 @@ fn gen_opcodes(all_inst: &AllInstructions, fmt: &mut Formatter) { // Generate an opcode list, for iterating over all known opcodes. fmt.doc_comment("All cranelift opcodes."); - fmt.line("pub fn all() -> &'static [Opcode] {"); - fmt.indent(|fmt| { + fmt.add_block("pub fn all() -> &'static [Opcode]", |fmt| { fmt.line("return &["); for inst in all_inst { fmt.indent(|fmt| { @@ -617,10 +562,8 @@ fn gen_opcodes(all_inst: &AllInstructions, fmt: &mut Formatter) { } fmt.line("];"); }); - fmt.line("}"); fmt.empty_line(); }); - fmt.line("}"); fmt.empty_line(); // Generate a private opcode_format table. @@ -643,8 +586,7 @@ fn gen_opcodes(all_inst: &AllInstructions, fmt: &mut Formatter) { fmt.empty_line(); // Generate a private opcode_name function. - fmt.line("fn opcode_name(opc: Opcode) -> &\'static str {"); - fmt.indent(|fmt| { + fmt.add_block("fn opcode_name(opc: Opcode) -> &\'static str", |fmt| { let mut m = Match::new("opc"); for inst in all_inst.iter() { m.arm_no_fields( @@ -654,7 +596,6 @@ fn gen_opcodes(all_inst: &AllInstructions, fmt: &mut Formatter) { } fmt.add_match(m); }); - fmt.line("}"); fmt.empty_line(); // Generate an opcode hash table for looking up opcodes by name. @@ -764,15 +705,14 @@ pub(crate) fn gen_typesets_table(type_sets: &UniqueTable, fmt: &mut For ); fmt.indent(|fmt| { for ts in type_sets.iter() { - fmt.line("ir::instructions::ValueTypeSet {"); - fmt.indent(|fmt| { + fmt.add_block("ir::instructions::ValueTypeSet", |fmt| { fmt.comment(typeset_to_string(ts)); gen_bitset(&ts.lanes, "lanes", 16, fmt); gen_bitset(&ts.dynamic_lanes, "dynamic_lanes", 16, fmt); gen_bitset(&ts.ints, "ints", 8, fmt); gen_bitset(&ts.floats, "floats", 8, fmt); }); - fmt.line("},"); + fmt.line(","); } }); fmtln!(fmt, "];"); @@ -867,13 +807,12 @@ fn gen_type_constraints(all_inst: &AllInstructions, fmt: &mut Formatter) { } flags |= fixed_values << 5; // 6th bit and more - fmt.line("OpcodeConstraints {"); - fmt.indent(|fmt| { + fmt.add_block("OpcodeConstraints",|fmt| { fmtln!(fmt, "flags: {:#04x},", flags); fmtln!(fmt, "typeset_offset: {},", ctrl_typeset); fmtln!(fmt, "constraint_offset: {},", constraint_offset); }); - fmt.line("},"); + fmt.line(","); } }); fmtln!(fmt, "];"); @@ -976,31 +915,27 @@ fn gen_format_constructor(format: &InstructionFormat, fmt: &mut Formatter) { fmt.doc_comment(format.to_string()); fmt.line("#[allow(non_snake_case)]"); - fmtln!(fmt, "fn {} {{", proto); - fmt.indent(|fmt| { + fmt.add_block(&format!("fn {proto}"), |fmt| { // Generate the instruction data. - fmtln!( - fmt, - "let{} data = ir::InstructionData::{} {{", - if imms_need_masking { " mut" } else { "" }, - format.name - ); - fmt.indent(|fmt| { + fmt.add_block(&format!( + "let{} data = ir::InstructionData::{}", + if imms_need_masking { " mut" } else { "" }, + format.name + ), |fmt| { fmt.line("opcode,"); gen_member_inits(format, fmt); }); - fmtln!(fmt, "};"); + fmtln!(fmt, ";"); if imms_need_masking { fmtln!(fmt, "data.mask_immediates(ctrl_typevar);"); } // Assert that this opcode belongs to this format - fmtln!(fmt, "debug_assert_eq!(opcode.format(), InstructionFormat::from(&data), \"Wrong InstructionFormat for Opcode: {opcode}\");"); + fmtln!(fmt, "debug_assert_eq!(opcode.format(), InstructionFormat::from(&data), \"Wrong InstructionFormat for Opcode: {{opcode}}\");"); fmt.line("self.build(data, ctrl_typevar)"); }); - fmtln!(fmt, "}"); } /// Emit a method for generating the instruction `inst`. @@ -1106,8 +1041,7 @@ fn gen_inst_builder(inst: &Instruction, format: &InstructionFormat, fmt: &mut Fo } fmt.line("#[allow(non_snake_case)]"); - fmtln!(fmt, "fn {} {{", proto); - fmt.indent(|fmt| { + fmt.add_block(&format!("fn {proto}"), |fmt| { // Convert all of the `Into<>` arguments. for arg in into_args { fmtln!(fmt, "let {} = {}.into();", arg, arg); @@ -1181,7 +1115,7 @@ fn gen_inst_builder(inst: &Instruction, format: &InstructionFormat, fmt: &mut Fo fmtln!(fmt, "let (inst, dfg) = {};", fcall); fmtln!( fmt, - "crate::trace!(\"inserted {inst:?}: {}\", dfg.display_inst(inst));" + "crate::trace!(\"inserted {{inst:?}}: {{}}\", dfg.display_inst(inst));" ); if inst.value_results.is_empty() { @@ -1209,7 +1143,6 @@ fn gen_inst_builder(inst: &Instruction, format: &InstructionFormat, fmt: &mut Fo ); } }); - fmtln!(fmt, "}") } /// Generate a Builder trait with methods for all instructions. @@ -1238,8 +1171,7 @@ fn gen_builder( size is required to be equal to the platform's pointer width. "#, ); - fmt.line("pub trait InstBuilder<'f>: InstBuilderBase<'f> {"); - fmt.indent(|fmt| { + fmt.add_block("pub trait InstBuilder<'f>: InstBuilderBase<'f>", |fmt| { for inst in instructions.iter() { gen_inst_builder(inst, &inst.format, fmt); fmt.empty_line(); @@ -1251,7 +1183,6 @@ fn gen_builder( } } }); - fmt.line("}"); } pub(crate) fn generate( @@ -1262,7 +1193,7 @@ pub(crate) fn generate( out_dir: &std::path::Path, ) -> Result<(), error::Error> { // Opcodes. - let mut fmt = Formatter::new(); + let mut fmt = Formatter::new(Language::Rust); gen_formats(&formats, &mut fmt); gen_instruction_data(&formats, &mut fmt); fmt.empty_line(); @@ -1271,12 +1202,12 @@ pub(crate) fn generate( gen_opcodes(all_inst, &mut fmt); fmt.empty_line(); gen_type_constraints(all_inst, &mut fmt); - fmt.update_file(opcode_filename, out_dir)?; + fmt.write(opcode_filename, out_dir)?; // Instruction builder. - let mut fmt = Formatter::new(); + let mut fmt = Formatter::new(Language::Rust); gen_builder(all_inst, &formats, &mut fmt); - fmt.update_file(inst_builder_filename, out_dir)?; + fmt.write(inst_builder_filename, out_dir)?; Ok(()) } diff --git a/cranelift/codegen/meta/src/gen_isle.rs b/cranelift/codegen/meta/src/gen_isle.rs index e48285bfee..d37994f39e 100644 --- a/cranelift/codegen/meta/src/gen_isle.rs +++ b/cranelift/codegen/meta/src/gen_isle.rs @@ -1,9 +1,8 @@ -use std::rc::Rc; - use crate::cdsl::formats::InstructionFormat; use crate::cdsl::instructions::AllInstructions; use crate::error; -use crate::srcgen::Formatter; +use cranelift_srcgen::{fmtln, Formatter, Language}; +use std::rc::Rc; /// Which ISLE target are we generating code for? #[derive(Clone, Copy, PartialEq, Eq)] @@ -506,14 +505,14 @@ pub(crate) fn generate( isle_dir: &std::path::Path, ) -> Result<(), error::Error> { // ISLE DSL: mid-end ("opt") generated bindings. - let mut fmt = Formatter::new(); + let mut fmt = Formatter::new(Language::Isle); gen_opt_isle(&formats, all_inst, &mut fmt); - fmt.update_file(isle_opt_filename, isle_dir)?; + fmt.write(isle_opt_filename, isle_dir)?; // ISLE DSL: lowering generated bindings. - let mut fmt = Formatter::new(); + let mut fmt = Formatter::new(Language::Isle); gen_lower_isle(&formats, all_inst, &mut fmt); - fmt.update_file(isle_lower_filename, isle_dir)?; + fmt.write(isle_lower_filename, isle_dir)?; Ok(()) } diff --git a/cranelift/codegen/meta/src/gen_settings.rs b/cranelift/codegen/meta/src/gen_settings.rs index 1730c21120..f05ebaea90 100644 --- a/cranelift/codegen/meta/src/gen_settings.rs +++ b/cranelift/codegen/meta/src/gen_settings.rs @@ -1,16 +1,14 @@ //! Generate the ISA-specific settings. -use std::collections::HashMap; - -use crate::constant_hash::generate_table; -use cranelift_codegen_shared::constant_hash::simple_hash; use crate::cdsl::camel_case; use crate::cdsl::settings::{ BoolSetting, Predicate, Preset, Setting, SettingGroup, SpecificSetting, }; -use crate::error; -use crate::srcgen::{Formatter, Match}; +use crate::constant_hash::generate_table; use crate::unique_table::UniqueSeqTable; +use cranelift_codegen_shared::constant_hash::simple_hash; +use cranelift_srcgen::{error, fmtln, Formatter, Language, Match}; +use std::collections::HashMap; pub(crate) enum ParentGroup { None, @@ -23,12 +21,10 @@ fn gen_constructor(group: &SettingGroup, parent: ParentGroup, fmt: &mut Formatte ParentGroup::None => "builder: Builder", ParentGroup::Shared => "shared: &settings::Flags, builder: &Builder", }; - fmtln!(fmt, "impl Flags {"); - fmt.indent(|fmt| { + fmt.add_block("impl Flags", |fmt| { fmt.doc_comment(format!("Create flags {} settings group.", group.name)); fmtln!(fmt, "#[allow(unused_variables)]"); - fmtln!(fmt, "pub fn new({}) -> Self {{", args); - fmt.indent(|fmt| { + fmt.add_block(&format!("pub fn new({args}) -> Self"), |fmt| { fmtln!(fmt, "let bvec = builder.state_for(\"{}\");", group.name); fmtln!( fmt, @@ -51,8 +47,7 @@ fn gen_constructor(group: &SettingGroup, parent: ParentGroup, fmt: &mut Formatte // Now compute the predicates. for p in &group.predicates { fmt.comment(format!("Precompute #{}.", p.number)); - fmtln!(fmt, "if {} {{", p.render(group)); - fmt.indent(|fmt| { + fmt.add_block(&format!("if {}", p.render(group)), |fmt| { fmtln!( fmt, "{}.bytes[{}] |= 1 << {};", @@ -61,41 +56,32 @@ fn gen_constructor(group: &SettingGroup, parent: ParentGroup, fmt: &mut Formatte p.number % 8 ); }); - fmtln!(fmt, "}"); } - fmtln!(fmt, group.name); + fmtln!(fmt, "{}", group.name); }); - fmtln!(fmt, "}"); }); - fmtln!(fmt, "}"); } /// Generates the `iter` function. fn gen_iterator(group: &SettingGroup, fmt: &mut Formatter) { - fmtln!(fmt, "impl Flags {"); - fmt.indent(|fmt| { + fmt.add_block("impl Flags",|fmt| { fmt.doc_comment("Iterates the setting values."); - fmtln!(fmt, "pub fn iter(&self) -> impl Iterator + use<> {"); - fmt.indent(|fmt| { + fmt.add_block("pub fn iter(&self) -> impl Iterator + use<>",|fmt| { fmtln!(fmt, "let mut bytes = [0; {}];", group.settings_size); fmtln!(fmt, "bytes.copy_from_slice(&self.bytes[0..{}]);", group.settings_size); - fmtln!(fmt, "DESCRIPTORS.iter().filter_map(move |d| {"); - fmt.indent(|fmt| { - fmtln!(fmt, "let values = match &d.detail {"); - fmt.indent(|fmt| { + fmt.add_block("DESCRIPTORS.iter().filter_map(move |d|", |fmt| { + fmt.add_block("let values = match &d.detail", |fmt| { fmtln!(fmt, "detail::Detail::Preset => return None,"); - fmtln!(fmt, "detail::Detail::Enum { last, enumerators } => Some(TEMPLATE.enums(*last, *enumerators)),"); + fmtln!(fmt, "detail::Detail::Enum {{ last, enumerators }} => Some(TEMPLATE.enums(*last, *enumerators)),"); fmtln!(fmt, "_ => None"); }); - fmtln!(fmt, "};"); - fmtln!(fmt, "Some(Value{ name: d.name, detail: d.detail, values, value: bytes[d.offset as usize] })"); + fmtln!(fmt, ";"); + fmtln!(fmt, "Some(Value {{ name: d.name, detail: d.detail, values, value: bytes[d.offset as usize] }})"); }); - fmtln!(fmt, "})"); + fmtln!(fmt, ")"); }); - fmtln!(fmt, "}"); }); - fmtln!(fmt, "}"); } /// Generates a `all()` function with all options for this enum @@ -105,8 +91,7 @@ fn gen_enum_all(name: &str, values: &[&'static str], fmt: &mut Formatter) { "/// Returns a slice with all possible [{}] values.", name ); - fmtln!(fmt, "pub fn all() -> &'static [{}] {{", name); - fmt.indent(|fmt| { + fmt.add_block(&format!("pub fn all() -> &'static [{name}]"), |fmt| { fmtln!(fmt, "&["); fmt.indent(|fmt| { for v in values.iter() { @@ -115,47 +100,35 @@ fn gen_enum_all(name: &str, values: &[&'static str], fmt: &mut Formatter) { }); fmtln!(fmt, "]"); }); - fmtln!(fmt, "}"); } /// Emit Display and FromStr implementations for enum settings. fn gen_to_and_from_str(name: &str, values: &[&'static str], fmt: &mut Formatter) { - fmtln!(fmt, "impl fmt::Display for {} {{", name); - fmt.indent(|fmt| { - fmtln!( - fmt, - "fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {" + fmt.add_block(&format!("impl fmt::Display for {name}"), |fmt| { + fmt.add_block( + "fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result", + |fmt| { + fmt.add_block("f.write_str(match *self", |fmt| { + for v in values.iter() { + fmtln!(fmt, "Self::{} => \"{}\",", camel_case(v), v); + } + }); + fmtln!(fmt, ")"); + }, ); - fmt.indent(|fmt| { - fmtln!(fmt, "f.write_str(match *self {"); - fmt.indent(|fmt| { - for v in values.iter() { - fmtln!(fmt, "Self::{} => \"{}\",", camel_case(v), v); - } - }); - fmtln!(fmt, "})"); - }); - fmtln!(fmt, "}"); }); - fmtln!(fmt, "}"); - fmtln!(fmt, "impl core::str::FromStr for {} {{", name); - fmt.indent(|fmt| { + fmt.add_block(&format!("impl core::str::FromStr for {name}"), |fmt| { fmtln!(fmt, "type Err = ();"); - fmtln!(fmt, "fn from_str(s: &str) -> Result {"); - fmt.indent(|fmt| { - fmtln!(fmt, "match s {"); - fmt.indent(|fmt| { + fmt.add_block("fn from_str(s: &str) -> Result", |fmt| { + fmt.add_block("match s", |fmt| { for v in values.iter() { fmtln!(fmt, "\"{}\" => Ok(Self::{}),", v, camel_case(v)); } fmtln!(fmt, "_ => Err(()),"); }); - fmtln!(fmt, "}"); }); - fmtln!(fmt, "}"); }); - fmtln!(fmt, "}"); } /// Emit real enum for the Enum settings. @@ -169,20 +142,16 @@ fn gen_enum_types(group: &SettingGroup, fmt: &mut Formatter) { fmt.doc_comment(format!("Values for `{}.{}`.", group.name, setting.name)); fmtln!(fmt, "#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]"); - fmtln!(fmt, "pub enum {} {{", name); - fmt.indent(|fmt| { + fmt.add_block(&format!("pub enum {name}"), |fmt| { for v in values.iter() { fmt.doc_comment(format!("`{v}`.")); fmtln!(fmt, "{},", camel_case(v)); } }); - fmtln!(fmt, "}"); - fmtln!(fmt, "impl {} {{", name); - fmt.indent(|fmt| { + fmt.add_block(&format!("impl {name}"), |fmt| { gen_enum_all(&name, values, fmt); }); - fmtln!(fmt, "}"); gen_to_and_from_str(&name, values, fmt); } @@ -195,75 +164,68 @@ fn gen_getter(setting: &Setting, fmt: &mut Formatter) { SpecificSetting::Bool(BoolSetting { predicate_number, .. }) => { - fmtln!(fmt, "pub fn {}(&self) -> bool {{", setting.name); - fmt.indent(|fmt| { + fmt.add_block(&format!("pub fn {}(&self) -> bool", setting.name), |fmt| { fmtln!(fmt, "self.numbered_predicate({})", predicate_number); }); - fmtln!(fmt, "}"); } SpecificSetting::Enum(ref values) => { let ty = camel_case(setting.name); - fmtln!(fmt, "pub fn {}(&self) -> {} {{", setting.name, ty); - fmt.indent(|fmt| { - let mut m = Match::new(format!("self.bytes[{}]", setting.byte_offset)); - for (i, v) in values.iter().enumerate() { - m.arm_no_fields(format!("{i}"), format!("{}::{}", ty, camel_case(v))); - } - m.arm_no_fields("_", "panic!(\"Invalid enum value\")"); - fmt.add_match(m); - }); - fmtln!(fmt, "}"); + fmt.add_block( + &format!("pub fn {}(&self) -> {}", setting.name, ty), + |fmt| { + let mut m = Match::new(format!("self.bytes[{}]", setting.byte_offset)); + for (i, v) in values.iter().enumerate() { + m.arm_no_fields(format!("{i}"), format!("{}::{}", ty, camel_case(v))); + } + m.arm_no_fields("_", "panic!(\"Invalid enum value\")"); + fmt.add_match(m); + }, + ); } SpecificSetting::Num(_) => { - fmtln!(fmt, "pub fn {}(&self) -> u8 {{", setting.name); - fmt.indent(|fmt| { + fmt.add_block(&format!("pub fn {}(&self) -> u8", setting.name), |fmt| { fmtln!(fmt, "self.bytes[{}]", setting.byte_offset); }); - fmtln!(fmt, "}"); } } } fn gen_pred_getter(predicate: &Predicate, group: &SettingGroup, fmt: &mut Formatter) { fmt.doc_comment(format!("Computed predicate `{}`.", predicate.render(group))); - fmtln!(fmt, "pub fn {}(&self) -> bool {{", predicate.name); - fmt.indent(|fmt| { - fmtln!(fmt, "self.numbered_predicate({})", predicate.number); - }); - fmtln!(fmt, "}"); + fmt.add_block( + &format!("pub fn {}(&self) -> bool", predicate.name), + |fmt| { + fmtln!(fmt, "self.numbered_predicate({})", predicate.number); + }, + ); } /// Emits getters for each setting value. fn gen_getters(group: &SettingGroup, fmt: &mut Formatter) { fmt.doc_comment("User-defined settings."); fmtln!(fmt, "#[allow(dead_code)]"); - fmtln!(fmt, "impl Flags {"); - fmt.indent(|fmt| { + fmt.add_block("impl Flags", |fmt| { fmt.doc_comment("Get a view of the boolean predicates."); - fmtln!( - fmt, - "pub fn predicate_view(&self) -> crate::settings::PredicateView {" + fmt.add_block( + "pub fn predicate_view(&self) -> crate::settings::PredicateView", + |fmt| { + fmtln!( + fmt, + "crate::settings::PredicateView::new(&self.bytes[{}..])", + group.bool_start_byte_offset + ); + }, ); - fmt.indent(|fmt| { - fmtln!( - fmt, - "crate::settings::PredicateView::new(&self.bytes[{}..])", - group.bool_start_byte_offset - ); - }); - fmtln!(fmt, "}"); if !group.settings.is_empty() { fmt.doc_comment("Dynamic numbered predicate getter."); - fmtln!(fmt, "fn numbered_predicate(&self, p: usize) -> bool {"); - fmt.indent(|fmt| { + fmt.add_block("fn numbered_predicate(&self, p: usize) -> bool", |fmt| { fmtln!( fmt, "self.bytes[{} + p / 8] & (1 << (p % 8)) != 0", group.bool_start_byte_offset ); }); - fmtln!(fmt, "}"); } for setting in &group.settings { @@ -273,7 +235,6 @@ fn gen_getters(group: &SettingGroup, fmt: &mut Formatter) { gen_pred_getter(predicate, group, fmt); } }); - fmtln!(fmt, "}"); } #[derive(Hash, PartialEq, Eq)] @@ -305,8 +266,7 @@ fn gen_descriptors(group: &SettingGroup, fmt: &mut Formatter) { ); fmt.indent(|fmt| { for (idx, setting) in group.settings.iter().enumerate() { - fmtln!(fmt, "detail::Descriptor {"); - fmt.indent(|fmt| { + fmt.add_block("detail::Descriptor", |fmt| { fmtln!(fmt, "name: \"{}\",", setting.name); fmtln!(fmt, "description: \"{}\",", setting.description); fmtln!(fmt, "offset: {},", setting.byte_offset); @@ -334,18 +294,17 @@ fn gen_descriptors(group: &SettingGroup, fmt: &mut Formatter) { descriptor_index_map.insert(SettingOrPreset::Setting(setting), idx); }); - fmtln!(fmt, "},"); + fmtln!(fmt, ","); } for (idx, preset) in group.presets.iter().enumerate() { - fmtln!(fmt, "detail::Descriptor {"); - fmt.indent(|fmt| { + fmt.add_block("detail::Descriptor", |fmt| { fmtln!(fmt, "name: \"{}\",", preset.name); fmtln!(fmt, "description: \"{}\",", preset.description); fmtln!(fmt, "offset: {},", (idx as u8) * group.settings_size); fmtln!(fmt, "detail: detail::Detail::Preset,"); }); - fmtln!(fmt, "},"); + fmtln!(fmt, ","); let whole_idx = idx + group.settings.len(); descriptor_index_map.insert(SettingOrPreset::Preset(preset), whole_idx); @@ -418,70 +377,57 @@ fn gen_template(group: &SettingGroup, fmt: &mut Formatter) { let default_bytes: Vec = default_bytes.iter().map(|x| format!("{x:#04x}")).collect(); let default_bytes_str = default_bytes.join(", "); - fmtln!( - fmt, - "static TEMPLATE: detail::Template = detail::Template {" + fmt.add_block( + "static TEMPLATE: detail::Template = detail::Template", + |fmt| { + fmtln!(fmt, "name: \"{}\",", group.name); + fmtln!(fmt, "descriptors: &DESCRIPTORS,"); + fmtln!(fmt, "enumerators: &ENUMERATORS,"); + fmtln!(fmt, "hash_table: &HASH_TABLE,"); + fmtln!(fmt, "defaults: &[{}],", default_bytes_str); + fmtln!(fmt, "presets: &PRESETS,"); + }, ); - fmt.indent(|fmt| { - fmtln!(fmt, "name: \"{}\",", group.name); - fmtln!(fmt, "descriptors: &DESCRIPTORS,"); - fmtln!(fmt, "enumerators: &ENUMERATORS,"); - fmtln!(fmt, "hash_table: &HASH_TABLE,"); - fmtln!(fmt, "defaults: &[{}],", default_bytes_str); - fmtln!(fmt, "presets: &PRESETS,"); - }); - fmtln!(fmt, "};"); + fmtln!(fmt, ";"); fmt.doc_comment(format!( "Create a `settings::Builder` for the {} settings group.", group.name )); - fmtln!(fmt, "pub fn builder() -> Builder {"); - fmt.indent(|fmt| { + fmt.add_block("pub fn builder() -> Builder", |fmt| { fmtln!(fmt, "Builder::new(&TEMPLATE)"); }); - fmtln!(fmt, "}"); } fn gen_display(group: &SettingGroup, fmt: &mut Formatter) { - fmtln!(fmt, "impl fmt::Display for Flags {"); - fmt.indent(|fmt| { - fmtln!( - fmt, - "fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {" - ); - fmt.indent(|fmt| { - fmtln!(fmt, "writeln!(f, \"[{}]\")?;", group.name); - fmtln!(fmt, "for d in &DESCRIPTORS {"); - fmt.indent(|fmt| { - fmtln!(fmt, "if !d.detail.is_preset() {"); - fmt.indent(|fmt| { - fmtln!(fmt, "write!(f, \"{} = \", d.name)?;"); - fmtln!( + fmt.add_block("impl fmt::Display for Flags", |fmt| { + fmt.add_block( + "fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result", + |fmt| { + fmtln!(fmt, "writeln!(f, \"[{}]\")?;", group.name); + fmt.add_block("for d in &DESCRIPTORS", |fmt| { + fmt.add_block("if !d.detail.is_preset()", |fmt| { + fmtln!(fmt, "write!(f, \"{{}} = \", d.name)?;"); + fmtln!( fmt, "TEMPLATE.format_toml_value(d.detail, self.bytes[d.offset as usize], f)?;", ); - fmtln!(fmt, "writeln!(f)?;"); + fmtln!(fmt, "writeln!(f)?;"); + }); }); - fmtln!(fmt, "}"); - }); - fmtln!(fmt, "}"); - fmtln!(fmt, "Ok(())"); - }); - fmtln!(fmt, "}") + fmtln!(fmt, "Ok(())"); + }, + ); }); - fmtln!(fmt, "}"); } fn gen_group(group: &SettingGroup, parent: ParentGroup, fmt: &mut Formatter) { // Generate struct. fmtln!(fmt, "#[derive(Clone, Hash)]"); fmt.doc_comment(format!("Flags group `{}`.", group.name)); - fmtln!(fmt, "pub struct Flags {"); - fmt.indent(|fmt| { + fmt.add_block("pub struct Flags", |fmt| { fmtln!(fmt, "bytes: [u8; {}],", group.byte_size()); }); - fmtln!(fmt, "}"); gen_constructor(group, parent, fmt); gen_iterator(group, fmt); @@ -498,8 +444,8 @@ pub(crate) fn generate( filename: &str, out_dir: &std::path::Path, ) -> Result<(), error::Error> { - let mut fmt = Formatter::new(); + let mut fmt = Formatter::new(Language::Rust); gen_group(settings, parent_group, &mut fmt); - fmt.update_file(filename, out_dir)?; + fmt.write(filename, out_dir)?; Ok(()) } diff --git a/cranelift/codegen/meta/src/gen_types.rs b/cranelift/codegen/meta/src/gen_types.rs index e0e66a3de9..a099c346d2 100644 --- a/cranelift/codegen/meta/src/gen_types.rs +++ b/cranelift/codegen/meta/src/gen_types.rs @@ -8,11 +8,10 @@ //! type numbering. use crate::cdsl::types as cdsl_types; -use crate::error; -use crate::srcgen; +use cranelift_srcgen::{error, fmtln, Formatter, Language}; /// Emit a constant definition of a single value type. -fn emit_type(ty: &cdsl_types::ValueType, fmt: &mut srcgen::Formatter) { +fn emit_type(ty: &cdsl_types::ValueType, fmt: &mut Formatter) { let name = ty.to_string().to_uppercase(); let number = ty.number(); @@ -21,7 +20,7 @@ fn emit_type(ty: &cdsl_types::ValueType, fmt: &mut srcgen::Formatter) { } /// Emit definition for all vector types with `bits` total size. -fn emit_vectors(bits: u64, fmt: &mut srcgen::Formatter) { +fn emit_vectors(bits: u64, fmt: &mut Formatter) { let vec_size: u64 = bits / 8; for vec in cdsl_types::ValueType::all_lane_types() .map(|ty| (ty, cdsl_types::ValueType::from(ty).membytes())) @@ -34,7 +33,7 @@ fn emit_vectors(bits: u64, fmt: &mut srcgen::Formatter) { } /// Emit definition for all dynamic vector types with `bits` total size. -fn emit_dynamic_vectors(bits: u64, fmt: &mut srcgen::Formatter) { +fn emit_dynamic_vectors(bits: u64, fmt: &mut Formatter) { let vec_size: u64 = bits / 8; for vec in cdsl_types::ValueType::all_lane_types() .map(|ty| (ty, cdsl_types::ValueType::from(ty).membytes())) @@ -47,7 +46,7 @@ fn emit_dynamic_vectors(bits: u64, fmt: &mut srcgen::Formatter) { } /// Emit types using the given formatter object. -fn emit_types(fmt: &mut srcgen::Formatter) { +fn emit_types(fmt: &mut Formatter) { // Emit all of the lane types, such integers, floats, and booleans. for ty in cdsl_types::ValueType::all_lane_types().map(cdsl_types::ValueType::from) { emit_type(&ty, fmt); @@ -63,8 +62,8 @@ fn emit_types(fmt: &mut srcgen::Formatter) { /// Generate the types file. pub(crate) fn generate(filename: &str, out_dir: &std::path::Path) -> Result<(), error::Error> { - let mut fmt = srcgen::Formatter::new(); + let mut fmt = Formatter::new(Language::Rust); emit_types(&mut fmt); - fmt.update_file(filename, out_dir)?; + fmt.write(filename, out_dir)?; Ok(()) } diff --git a/cranelift/codegen/meta/src/isle.rs b/cranelift/codegen/meta/src/isle.rs index 844e45230e..8abed778dc 100644 --- a/cranelift/codegen/meta/src/isle.rs +++ b/cranelift/codegen/meta/src/isle.rs @@ -81,13 +81,6 @@ pub fn get_isle_compilations( .join("isa") .join("pulley_shared"); - // Assembler definitions. - let asm_isle_definitions = cranelift_assembler_x64::generated_files() - .into_iter() - .filter(|p| p.extension() == Some(std::ffi::OsStr::new("isle"))) - .next() - .unwrap(); - // This is a set of ISLE compilation units. // // The format of each entry is: @@ -133,9 +126,8 @@ pub fn get_isle_compilations( prelude_lower_isle.clone(), src_isa_x64.join("inst.isle"), src_isa_x64.join("lower.isle"), - asm_isle_definitions.clone(), ], - untracked_inputs: vec![clif_lower_isle.clone()], + untracked_inputs: vec![clif_lower_isle.clone(), gen_dir.join("assembler.isle")], }, // The aarch64 instruction selector. IsleCompilation { diff --git a/cranelift/codegen/meta/src/lib.rs b/cranelift/codegen/meta/src/lib.rs index 188e7e7ffb..8a2c233040 100644 --- a/cranelift/codegen/meta/src/lib.rs +++ b/cranelift/codegen/meta/src/lib.rs @@ -1,16 +1,16 @@ //! This crate generates Rust sources for use by //! [`cranelift_codegen`](../cranelift_codegen/index.html). +use cranelift_srcgen::{error, Formatter, Language}; use shared::Definitions; #[macro_use] mod cdsl; -mod srcgen; -pub mod error; pub mod isa; pub mod isle; +mod gen_asm; mod gen_inst; mod gen_isle; mod gen_settings; @@ -98,6 +98,29 @@ fn generate_isle_for_shared_defs( Ok(()) } +/// Generate the ISLE definitions; this provides ISLE glue to access the +/// assembler instructions in [cranelift_assembler_x64_meta]. +fn generate_isle_for_assembler( + insts: &[cranelift_assembler_x64_meta::dsl::Inst], + isle_dir: &std::path::Path, +) -> Result<(), error::Error> { + let mut fmt = Formatter::new(Language::Isle); + gen_asm::generate_isle(&mut fmt, insts); + fmt.write("assembler.isle", isle_dir) +} + +/// Generate a macro containing builder functions for the assembler's ISLE +/// constructors; this provides Rust implementations backing up the ISLE +/// definitions in [generate_isle_for_assembler]. +fn generate_rust_macro_for_assembler( + insts: &[cranelift_assembler_x64_meta::dsl::Inst], + out_dir: &std::path::Path, +) -> Result<(), error::Error> { + let mut fmt = Formatter::new(Language::Rust); + gen_asm::generate_rust_macro(&mut fmt, insts); + fmt.write("assembler-isle-macro.rs", out_dir) +} + /// Generates all the source files used in Cranelift from the meta-language. pub fn generate( isas: &[isa::Isa], @@ -107,5 +130,10 @@ pub fn generate( let shared_defs = shared::define(); generate_rust_for_shared_defs(&shared_defs, isas, out_dir)?; generate_isle_for_shared_defs(&shared_defs, isle_dir)?; + + let insts = cranelift_assembler_x64_meta::instructions::list(); + generate_isle_for_assembler(&insts, isle_dir)?; + generate_rust_macro_for_assembler(&insts, out_dir)?; + Ok(()) } diff --git a/cranelift/codegen/meta/src/pulley.rs b/cranelift/codegen/meta/src/pulley.rs index 4117ce497f..06d1448721 100644 --- a/cranelift/codegen/meta/src/pulley.rs +++ b/cranelift/codegen/meta/src/pulley.rs @@ -1,4 +1,4 @@ -use crate::error::Error; +use cranelift_srcgen::error::Error; use std::path::Path; struct Inst<'a> { diff --git a/cranelift/codegen/meta/src/shared/settings.rs b/cranelift/codegen/meta/src/shared/settings.rs index 43b5c54c5e..e7ea9af009 100644 --- a/cranelift/codegen/meta/src/shared/settings.rs +++ b/cranelift/codegen/meta/src/shared/settings.rs @@ -398,6 +398,13 @@ pub(crate) fn define() -> SettingGroup { 0, ); + settings.add_num( + "log2_min_function_alignment", + "The log2 of the minimum alignment of functions", + "The bigger of this value and the default alignment will be used as actual alignment.", + 0, + ); + // When adding new settings please check if they can also be added // in cranelift/fuzzgen/src/lib.rs for fuzzing. settings.build() diff --git a/cranelift/codegen/src/context.rs b/cranelift/codegen/src/context.rs index 9cc7b7140d..b52d82a03e 100644 --- a/cranelift/codegen/src/context.rs +++ b/cranelift/codegen/src/context.rs @@ -373,7 +373,6 @@ impl Context { ); pass.run(); log::debug!("egraph stats: {:?}", pass.stats); - trace!("pinned_union_count: {}", pass.eclasses.pinned_union_count); trace!("After egraph optimization:\n{}", self.func.display()); self.verify_if(fisa) diff --git a/cranelift/codegen/src/ctxhash.rs b/cranelift/codegen/src/ctxhash.rs index 2946bf5bab..98931566aa 100644 --- a/cranelift/codegen/src/ctxhash.rs +++ b/cranelift/codegen/src/ctxhash.rs @@ -114,6 +114,69 @@ impl CtxHashMap { }) .map(|bucket| &bucket.v) } + + /// Look up a key, returning an `Entry` that refers to an existing + /// value or allows inserting a new one. + pub fn entry<'a, Ctx>(&'a mut self, k: K, ctx: &Ctx) -> Entry<'a, K, V> + where + Ctx: CtxEq + CtxHash, + { + let hash = compute_hash(ctx, &k); + let raw = self.raw.entry( + hash as u64, + |bucket| hash == bucket.hash && ctx.ctx_eq(&bucket.k, &k), + |bucket| compute_hash(ctx, &bucket.k) as u64, + ); + match raw { + hashbrown::hash_table::Entry::Occupied(o) => Entry::Occupied(OccupiedEntry { raw: o }), + hashbrown::hash_table::Entry::Vacant(v) => Entry::Vacant(VacantEntry { + hash, + key: k, + raw: v, + }), + } + } +} + +/// A reference to an existing or vacant entry in the hash table. +pub enum Entry<'a, K, V> { + Occupied(OccupiedEntry<'a, K, V>), + Vacant(VacantEntry<'a, K, V>), +} + +/// A reference to an occupied entry in the hash table. +pub struct OccupiedEntry<'a, K, V> { + raw: hashbrown::hash_table::OccupiedEntry<'a, BucketData>, +} + +/// A reference to a vacant entry in the hash table. +pub struct VacantEntry<'a, K, V> { + hash: u32, + key: K, + raw: hashbrown::hash_table::VacantEntry<'a, BucketData>, +} + +impl<'a, K, V> OccupiedEntry<'a, K, V> { + /// Get the existing value. + pub fn get(&self) -> &V { + &self.raw.get().v + } + + /// Get the existing value, mutably. + pub fn get_mut(&mut self) -> &mut V { + &mut self.raw.get_mut().v + } +} + +impl<'a, K, V> VacantEntry<'a, K, V> { + /// Insert a new value. + pub fn insert(self, v: V) { + self.raw.insert(BucketData { + hash: self.hash, + k: self.key, + v, + }); + } } #[cfg(test)] diff --git a/cranelift/codegen/src/egraph.rs b/cranelift/codegen/src/egraph.rs index c541cd9ec7..1aac6c3b88 100644 --- a/cranelift/codegen/src/egraph.rs +++ b/cranelift/codegen/src/egraph.rs @@ -1,7 +1,7 @@ //! Support for egraphs represented in the DataFlowGraph. use crate::alias_analysis::{AliasAnalysis, LastStores}; -use crate::ctxhash::{CtxEq, CtxHash, CtxHashMap}; +use crate::ctxhash::{CtxEq, CtxHash, NullCtx}; use crate::cursor::{Cursor, CursorPosition, FuncCursor}; use crate::dominator_tree::{DominatorTree, DominatorTreePreorder}; use crate::egraph::elaborate::Elaborator; @@ -16,14 +16,14 @@ use crate::opts::IsleContext; use crate::scoped_hash_map::{Entry as ScopedEntry, ScopedHashMap}; use crate::settings::Flags; use crate::trace; -use crate::unionfind::UnionFind; +use alloc::vec::Vec; use core::cmp::Ordering; +use core::hash::Hasher; use cranelift_control::ControlPlane; use cranelift_entity::packed_option::ReservedValue; use cranelift_entity::SecondaryMap; use rustc_hash::FxHashSet; use smallvec::SmallVec; -use std::hash::Hasher; mod cost; mod elaborate; @@ -63,17 +63,11 @@ pub struct EgraphPass<'a> { /// Chaos-mode control-plane so we can test that we still get /// correct results when our heuristics make bad decisions. ctrl_plane: &'a mut ControlPlane, - /// Which canonical Values do we want to rematerialize in each - /// block where they're used? - /// - /// (A canonical Value is the *oldest* Value in an eclass, - /// i.e. tree of union value-nodes). + /// Which Values do we want to rematerialize in each block where + /// they're used? remat_values: FxHashSet, /// Stats collected while we run this pass. pub(crate) stats: Stats, - /// Union-find that maps all members of a Union tree (eclass) back - /// to the *oldest* (lowest-numbered) `Value`. - pub(crate) eclasses: UnionFind, } // The maximum number of rewrites we will take from a single call into ISLE. @@ -87,10 +81,9 @@ where // Borrowed from EgraphPass: pub(crate) func: &'opt mut Function, pub(crate) value_to_opt_value: &'opt mut SecondaryMap, - pub(crate) gvn_map: &'opt mut CtxHashMap<(Type, InstructionData), Value>, - pub(crate) effectful_gvn_map: &'opt mut ScopedHashMap<(Type, InstructionData), Option>, available_block: &'opt mut SecondaryMap, - pub(crate) eclasses: &'opt mut UnionFind, + pub(crate) gvn_map: &'opt mut ScopedHashMap<(Type, InstructionData), Option>, + pub(crate) gvn_map_blocks: &'opt Vec, pub(crate) remat_values: &'opt mut FxHashSet, pub(crate) stats: &'opt mut Stats, domtree: &'opt DominatorTreePreorder, @@ -136,12 +129,6 @@ where /// already have the same instruction somewhere else, with the /// same args, then we can alias the original instruction's /// results and omit this instruction entirely. - /// - Note that we do this canonicalization based on the - /// instruction with its arguments as *canonical* eclass IDs, - /// that is, the oldest (smallest index) `Value` reachable in - /// the tree-of-unions (whole eclass). This ensures that we - /// properly canonicalize newer nodes that use newer "versions" - /// of a value that are still equal to the older versions. /// - If the instruction is "new" (not deduplicated), then apply /// optimization rules: /// - All of the mid-end rules written in ISLE. @@ -154,7 +141,6 @@ where // do not have to carry all the references or data for a full // `Eq` or `Hash` impl. let gvn_context = GVNContext { - union_find: self.eclasses, value_lists: &self.func.dfg.value_lists, }; @@ -167,24 +153,16 @@ where // the value-map to rewrite uses of its results to the results // of the original (existing) instruction. If not, optimize // the new instruction. - if let Some(&orig_result) = self + if let Some(&Some(orig_result)) = self .gvn_map - .get(&inst.get_inst_key(&self.func.dfg), &gvn_context) + .get(&gvn_context, &inst.get_inst_key(&self.func.dfg)) { self.stats.pure_inst_deduped += 1; if let NewOrExistingInst::Existing(inst) = inst { debug_assert_eq!(self.func.dfg.inst_results(inst).len(), 1); let result = self.func.dfg.first_result(inst); - debug_assert!( - self.domtree.dominates( - self.available_block[orig_result], - self.get_available_block(inst) - ), - "GVN shouldn't replace {result} (available in {}) with non-dominating {orig_result} (available in {})", - self.get_available_block(inst), - self.available_block[orig_result], - ); self.value_to_opt_value[result] = orig_result; + self.available_block[result] = self.available_block[orig_result]; self.func.dfg.merge_facts(result, orig_result); } orig_result @@ -193,16 +171,16 @@ where // result value (exactly one). let (inst, result, ty) = match inst { NewOrExistingInst::New(data, typevar) => { + self.stats.pure_inst_insert_new += 1; let inst = self.func.dfg.make_inst(data); // TODO: reuse return value? self.func.dfg.make_inst_results(inst, typevar); let result = self.func.dfg.first_result(inst); - // Add to eclass unionfind. - self.eclasses.add(result); // New inst. We need to do the analysis of its result. (inst, result, typevar) } NewOrExistingInst::Existing(inst) => { + self.stats.pure_inst_insert_orig += 1; let result = self.func.dfg.first_result(inst); let ty = self.func.dfg.ctrl_typevar(inst); (inst, result, ty) @@ -213,17 +191,43 @@ where self.available_block[result] = self.get_available_block(inst); let opt_value = self.optimize_pure_enode(inst); - - for &argument in self.func.dfg.inst_args(inst) { - self.eclasses.pin_index(argument); - } + log::trace!( + "optimizing inst {} orig result {} gave {}", + inst, + result, + opt_value + ); let gvn_context = GVNContext { - union_find: self.eclasses, value_lists: &self.func.dfg.value_lists, }; - self.gvn_map - .insert((ty, self.func.dfg.insts[inst]), opt_value, &gvn_context); + // Insert at level implied by args. This enables merging + // in LICM cases like: + // + // while (...) { + // if (...) { + // let x = loop_invariant_expr; + // } + // if (...) { + // let x = loop_invariant_expr; + // } + // } + // + // where the two instances of the expression otherwise + // wouldn't merge because each would be in a separate + // subscope of the scoped hashmap during traversal. + log::trace!( + "value {} is available at {}", + opt_value, + self.available_block[opt_value] + ); + let depth = self.depth_of_block_in_gvn_map(self.available_block[opt_value]); + self.gvn_map.insert_with_depth( + &gvn_context, + (ty, self.func.dfg.insts[inst]), + Some(opt_value), + depth, + ); self.value_to_opt_value[result] = opt_value; opt_value } @@ -268,6 +272,21 @@ where .unwrap_or(self.func.layout.entry_block().unwrap()) } + fn depth_of_block_in_gvn_map(&self, block: Block) -> usize { + log::trace!( + "finding depth of available block {} in domtree stack: {:?}", + block, + self.gvn_map_blocks + ); + self.gvn_map_blocks + .iter() + .enumerate() + .rev() + .find(|&(_, b)| *b == block) + .unwrap() + .0 + } + /// Optimizes an enode by applying any matching mid-end rewrite /// rules (or store-to-load forwarding, which is a special case), /// unioning together all possible optimized (or rewritten) forms @@ -307,42 +326,7 @@ where &mut optimized_values, ); - optimized_values.push(orig_value); - - // Remove any values from optimized_values that do not have - // the highest possible available block in the domtree, in - // O(n) time. This loop scans in reverse, establishing the - // loop invariant that all values at indices >= idx have the - // same available block, which is the best available block - // seen so far. Note that orig_value must also be removed if - // it isn't in the best block, so we push it above, which means - // optimized_values is never empty: there's always at least one - // value in best_block. - let mut best_block = self.available_block[*optimized_values.last().unwrap()]; - for idx in (0..optimized_values.len() - 1).rev() { - // At the beginning of each iteration, there is a non-empty - // collection of values after idx, which are all available - // at best_block. - let this_block = self.available_block[optimized_values[idx]]; - if this_block != best_block { - if self.domtree.dominates(this_block, best_block) { - // If the available block for this value dominates - // the best block we've seen so far, discard all - // the values we already checked and leave only this - // value in the tail of the vector. - optimized_values.truncate(idx + 1); - best_block = this_block; - } else { - // Otherwise the tail of the vector contains values - // which are all better than this value, so we can - // swap any of them in place of this value to delete - // this one in O(1) time. - debug_assert!(self.domtree.dominates(best_block, this_block)); - optimized_values.swap_remove(idx); - debug_assert!(optimized_values.len() > idx); - } - } - } + self.stats.rewrite_rule_results += optimized_values.len() as u64; // It's not supposed to matter what order `simplify` returns values in. self.ctrl_plane.shuffle(&mut optimized_values); @@ -358,60 +342,70 @@ where trace!(" -> returned from ISLE: {orig_value} -> {optimized_values:?}"); - // Create a union of all new values with the original (or - // maybe just one new value marked as "subsuming" the - // original, if present.) - let mut union_value = optimized_values.pop().unwrap(); - for optimized_value in optimized_values.drain(..) { - trace!( - "Returned from ISLE for {}, got {:?}", - orig_value, - optimized_value - ); - if optimized_value == orig_value { - trace!(" -> same as orig value; skipping"); - continue; - } - if self.subsume_values.contains(&optimized_value) { - // Merge in the unionfind so canonicalization - // still works, but take *only* the subsuming - // value, and break now. - self.eclasses.union(optimized_value, union_value); - self.func.dfg.merge_facts(optimized_value, union_value); - union_value = optimized_value; - break; + // Construct a union-node tree representing the new eclass + // that results from rewriting. If any returned value was + // marked "subsume", take only that value. Otherwise, + // sequentially build the chain over the original value and + // all returned values. + let result_value = if let Some(&subsuming_value) = optimized_values + .iter() + .find(|&value| self.subsume_values.contains(value)) + { + optimized_values.clear(); + self.stats.pure_inst_subsume += 1; + subsuming_value + } else { + let mut union_value = orig_value; + for optimized_value in optimized_values.drain(..) { + trace!( + "Returned from ISLE for {}, got {:?}", + orig_value, + optimized_value + ); + if optimized_value == orig_value { + trace!(" -> same as orig value; skipping"); + self.stats.pure_inst_rewrite_to_self += 1; + continue; + } + let old_union_value = union_value; + union_value = self.func.dfg.union(old_union_value, optimized_value); + self.stats.union += 1; + trace!(" -> union: now {}", union_value); + self.func.dfg.merge_facts(old_union_value, optimized_value); + self.available_block[union_value] = + self.merge_availability(old_union_value, optimized_value); } - - let old_union_value = union_value; - union_value = self.func.dfg.union(old_union_value, optimized_value); - self.available_block[union_value] = best_block; - self.stats.union += 1; - trace!(" -> union: now {}", union_value); - self.eclasses.add(union_value); - self.eclasses.union(old_union_value, optimized_value); - self.func.dfg.merge_facts(old_union_value, optimized_value); - self.eclasses.union(old_union_value, union_value); - } + union_value + }; self.rewrite_depth -= 1; trace!("Decrementing rewrite depth; now {}", self.rewrite_depth); + if self.rewrite_depth == 0 { + self.subsume_values.clear(); + } debug_assert!(self.optimized_values.is_empty()); self.optimized_values = optimized_values; - union_value + result_value + } + + fn merge_availability(&self, a: Value, b: Value) -> Block { + let a = self.available_block[a]; + let b = self.available_block[b]; + if self.domtree.dominates(a, b) { + a + } else { + b + } } /// Optimize a "skeleton" instruction, possibly removing /// it. Returns `true` if the instruction should be removed from /// the layout. - fn optimize_skeleton_inst(&mut self, inst: Inst) -> bool { + fn optimize_skeleton_inst(&mut self, inst: Inst, block: Block) -> bool { self.stats.skeleton_inst += 1; - for &result in self.func.dfg.inst_results(inst) { - self.available_block[result] = self.func.layout.inst_block(inst).unwrap(); - } - // First, can we try to deduplicate? We need to keep some copy // of the instruction around because it's side-effecting, but // we may be able to reuse an earlier instance of it. @@ -424,28 +418,31 @@ where // of the original (existing) instruction. If not, optimize // the new instruction. // - // Note that we use the "effectful GVN map", which is - // scoped: because effectful ops are not removed from the + // Note that the GVN map is scoped, which is important + // here: because effectful ops are not removed from the // skeleton (`Layout`), we need to be mindful of whether // our current position is dominated by an instance of the // instruction. (See #5796 for details.) let ty = self.func.dfg.ctrl_typevar(inst); match self - .effectful_gvn_map - .entry((ty, self.func.dfg.insts[inst])) + .gvn_map + .entry(&NullCtx, (ty, self.func.dfg.insts[inst])) { ScopedEntry::Occupied(o) => { let orig_result = *o.get(); match (result, orig_result) { (Some(result), Some(orig_result)) => { // Hit in GVN map -- reuse value. + self.stats.skeleton_inst_gvn += 1; self.value_to_opt_value[result] = orig_result; + self.available_block[result] = self.available_block[orig_result]; trace!(" -> merges result {} to {}", result, orig_result); } (None, None) => { // Hit in the GVN map, but the instruction doesn't // produce results, only side effects. Nothing else // to do here. + self.stats.skeleton_inst_gvn += 1; trace!(" -> merges with dominating instruction"); } (_, _) => unreachable!(), @@ -456,6 +453,7 @@ where // Otherwise, insert it into the value-map. if let Some(result) = result { self.value_to_opt_value[result] = result; + self.available_block[result] = block; } v.insert(result); trace!(" -> inserts as new (no GVN)"); @@ -479,6 +477,7 @@ where new_result ); self.value_to_opt_value[result] = new_result; + self.available_block[result] = self.available_block[new_result]; self.func.dfg.merge_facts(result, new_result); true } @@ -489,7 +488,7 @@ where // in the value-to-opt-value map. for &result in self.func.dfg.inst_results(inst) { self.value_to_opt_value[result] = result; - self.eclasses.add(result); + self.available_block[result] = block; } false } @@ -523,7 +522,6 @@ impl<'a> EgraphPass<'a> { flags: &'a Flags, ctrl_plane: &'a mut ControlPlane, ) -> Self { - let num_values = func.dfg.num_values(); let mut domtree = DominatorTreePreorder::new(); domtree.compute(raw_domtree); Self { @@ -534,7 +532,6 @@ impl<'a> EgraphPass<'a> { flags, ctrl_plane, stats: Stats::default(), - eclasses: UnionFind::with_capacity(num_values), remat_values: FxHashSet::default(), } } @@ -555,9 +552,10 @@ impl<'a> EgraphPass<'a> { } } } - trace!("stats: {:#?}", self.stats); - trace!("pinned_union_count: {}", self.eclasses.pinned_union_count); + self.elaborate(); + + log::trace!("stats: {:#?}", self.stats); } /// Remove pure nodes from the `Layout` of the function, ensuring @@ -592,43 +590,28 @@ impl<'a> EgraphPass<'a> { // Note also that we keep the controlling typevar (the `Type` // in the tuple below) because it may disambiguate // instructions that are identical except for type. - let mut gvn_map: CtxHashMap<(Type, InstructionData), Value> = - CtxHashMap::with_capacity(cursor.func.dfg.num_values()); - - // Map from instruction to an optional value for GVN'ing of effectful - // but idempotent ops, which remain in the side-effecting skeleton. This - // needs to be scoped because we cannot deduplicate one instruction to - // another that is in a non-dominating block. // - // If the instruction produces a value, then it is stored in the map and - // can be used to GVN the results of idempotently side-effectful - // instructions. If the instruction does not produce a value, and is - // only used for its effects, then the entry's value is `None`. In the - // latter case, we can still deduplicate the idempotent instructions, - // but there is no value to GVN. - // - // Note that we can use a ScopedHashMap here without the "context" (as - // needed by CtxHashMap) because in practice the ops we want to GVN have - // all their args inline. Equality on the InstructionData itself is - // conservative: two insts whose struct contents compare shallowly equal - // are definitely identical, but identical insts in a deep-equality - // sense may not compare shallowly equal, due to list indirection. This - // is fine for GVN, because it is still sound to skip any given GVN - // opportunity (and keep the original instructions). - // - // As above, we keep the controlling typevar here as part of the key: - // effectful instructions may (as for pure instructions) be - // differentiated only on the type. - let mut effectful_gvn_map: ScopedHashMap<(Type, InstructionData), Option> = - ScopedHashMap::new(); - - // We assign an "available block" to every value. Values tied to - // the side-effecting skeleton are available in the block where - // they're defined. Results from pure instructions could legally - // float up the domtree so they are available as soon as all - // their arguments are available. Values which identify union - // nodes are available in the same block as all values in the - // eclass, enforced by optimize_pure_enode. + // We store both skeleton and non-skeleton instructions in the + // GVN map; for skeleton instructions, we only store those + // that are idempotent, i.e., still eligible to GVN. Note that + // some skeleton instructions are idempotent but do not + // produce a value: e.g., traps on a given condition. To allow + // for both cases, we store an `Option` as the value in + // this map. + let mut gvn_map: ScopedHashMap<(Type, InstructionData), Option> = + ScopedHashMap::with_capacity(cursor.func.dfg.num_values()); + + // The block in the domtree preorder traversal at each level + // of the GVN map. + let mut gvn_map_blocks: Vec = vec![]; + + // To get the best possible merging and canonicalization, we + // track where a value is "available" at: this is the + // domtree-nearest-ancestor join of all args if the value + // itself is pure, otherwise the block where the value is + // defined. (And for union nodes, the + // domtree-highest-ancestor, i.e., the meet or the dual to the + // above join.) let mut available_block: SecondaryMap = SecondaryMap::with_default(Block::reserved_value()); @@ -656,7 +639,8 @@ impl<'a> EgraphPass<'a> { .shuffled(self.domtree.children(block)) .map(StackEntry::Visit), ); - effectful_gvn_map.increment_depth(); + gvn_map.increment_depth(); + gvn_map_blocks.push(block); trace!("Processing block {}", block); cursor.set_position(CursorPosition::Before(block)); @@ -665,22 +649,12 @@ impl<'a> EgraphPass<'a> { for ¶m in cursor.func.dfg.block_params(block) { trace!("creating initial singleton eclass for blockparam {}", param); - self.eclasses.add(param); value_to_opt_value[param] = param; available_block[param] = block; } while let Some(inst) = cursor.next_inst() { trace!("Processing inst {}", inst); - // While we're passing over all insts, create initial - // singleton eclasses for all result and blockparam - // values. Also do initial analysis of all inst - // results. - for &result in cursor.func.dfg.inst_results(inst) { - trace!("creating initial singleton eclass for {}", result); - self.eclasses.add(result); - } - // Rewrite args of *all* instructions using the // value-to-opt-value map. cursor.func.dfg.map_inst_values(inst, |arg| { @@ -699,9 +673,8 @@ impl<'a> EgraphPass<'a> { func: cursor.func, value_to_opt_value: &mut value_to_opt_value, gvn_map: &mut gvn_map, - effectful_gvn_map: &mut effectful_gvn_map, + gvn_map_blocks: &mut gvn_map_blocks, available_block: &mut available_block, - eclasses: &mut self.eclasses, rewrite_depth: 0, subsume_values: FxHashSet::default(), remat_values: &mut self.remat_values, @@ -725,14 +698,15 @@ impl<'a> EgraphPass<'a> { // enode in the eclass, so we can remove it. cursor.remove_inst_and_step_back(); } else { - if ctx.optimize_skeleton_inst(inst) { + if ctx.optimize_skeleton_inst(inst, block) { cursor.remove_inst_and_step_back(); } } } } StackEntry::Pop => { - effectful_gvn_map.decrement_depth(); + gvn_map.decrement_depth(); + gvn_map_blocks.pop(); } } } @@ -804,11 +778,11 @@ impl<'a> EgraphPass<'a> { /// Implementation of external-context equality and hashing on /// InstructionData. This allows us to deduplicate instructions given -/// some context that lets us see its value lists and the mapping from -/// any value to "canonical value" (in an eclass). +/// some context that lets us see its value lists, so we don't need to +/// store arguments inline in the `InstuctionData` (or alongside it in +/// some newly-defined key type) in all cases. struct GVNContext<'a> { value_lists: &'a ValueListPool, - union_find: &'a UnionFind, } impl<'a> CtxEq<(Type, InstructionData), (Type, InstructionData)> for GVNContext<'a> { @@ -817,17 +791,14 @@ impl<'a> CtxEq<(Type, InstructionData), (Type, InstructionData)> for GVNContext< (a_ty, a_inst): &(Type, InstructionData), (b_ty, b_inst): &(Type, InstructionData), ) -> bool { - a_ty == b_ty - && a_inst.eq(b_inst, self.value_lists, |value| { - self.union_find.find(value) - }) + a_ty == b_ty && a_inst.eq(b_inst, self.value_lists) } } impl<'a> CtxHash<(Type, InstructionData)> for GVNContext<'a> { fn ctx_hash(&self, state: &mut H, (ty, inst): &(Type, InstructionData)) { std::hash::Hash::hash(&ty, state); - inst.hash(state, self.value_lists, |value| self.union_find.find(value)); + inst.hash(state, self.value_lists); } } @@ -836,13 +807,19 @@ impl<'a> CtxHash<(Type, InstructionData)> for GVNContext<'a> { pub(crate) struct Stats { pub(crate) pure_inst: u64, pub(crate) pure_inst_deduped: u64, + pub(crate) pure_inst_subsume: u64, + pub(crate) pure_inst_rewrite_to_self: u64, + pub(crate) pure_inst_insert_orig: u64, + pub(crate) pure_inst_insert_new: u64, pub(crate) skeleton_inst: u64, + pub(crate) skeleton_inst_gvn: u64, pub(crate) alias_analysis_removed: u64, pub(crate) new_inst: u64, pub(crate) union: u64, pub(crate) subsume: u64, pub(crate) remat: u64, pub(crate) rewrite_rule_invoked: u64, + pub(crate) rewrite_rule_results: u64, pub(crate) rewrite_depth_limit: u64, pub(crate) elaborate_visit_node: u64, pub(crate) elaborate_memoize_hit: u64, diff --git a/cranelift/codegen/src/egraph/cost.rs b/cranelift/codegen/src/egraph/cost.rs index 28aab40e97..a5cda3a925 100644 --- a/cranelift/codegen/src/egraph/cost.rs +++ b/cranelift/codegen/src/egraph/cost.rs @@ -150,7 +150,7 @@ fn pure_op_cost(op: Opcode) -> Cost { // Extends/reduces. Opcode::Uextend | Opcode::Sextend | Opcode::Ireduce | Opcode::Iconcat | Opcode::Isplit => { - Cost::new(2, 0) + Cost::new(1, 0) } // "Simple" arithmetic. diff --git a/cranelift/codegen/src/egraph/elaborate.rs b/cranelift/codegen/src/egraph/elaborate.rs index a35c2ac257..203eed6ff2 100644 --- a/cranelift/codegen/src/egraph/elaborate.rs +++ b/cranelift/codegen/src/egraph/elaborate.rs @@ -3,6 +3,7 @@ use super::cost::Cost; use super::Stats; +use crate::ctxhash::NullCtx; use crate::dominator_tree::DominatorTreePreorder; use crate::hash_map::Entry as HashEntry; use crate::inst_predicates::is_pure_for_egraph; @@ -428,7 +429,9 @@ impl<'a> Elaborator<'a> { trace!("elaborate: value {} -> best {}", value, best_value); debug_assert_ne!(best_value, Value::reserved_value()); - if let Some(elab_val) = self.value_to_elaborated_value.get(&best_value) { + if let Some(elab_val) = + self.value_to_elaborated_value.get(&NullCtx, &best_value) + { // Value is available; use it. trace!("elaborate: value {} -> {:?}", value, elab_val); self.stats.elaborate_memoize_hit += 1; @@ -652,6 +655,7 @@ impl<'a> Elaborator<'a> { }; let best_result = self.value_to_best_value[result]; self.value_to_elaborated_value.insert_if_absent_with_depth( + &NullCtx, best_result.1, elab_value, scope_depth, @@ -678,6 +682,7 @@ impl<'a> Elaborator<'a> { }; let best_result = self.value_to_best_value[result]; self.value_to_elaborated_value.insert_if_absent_with_depth( + &NullCtx, best_result.1, elab_value, scope_depth, @@ -772,6 +777,7 @@ impl<'a> Elaborator<'a> { trace!(" -> result {}", result); let best_result = self.value_to_best_value[result]; self.value_to_elaborated_value.insert_if_absent( + &NullCtx, best_result.1, ElaboratedValue { in_block: block, diff --git a/cranelift/codegen/src/inst_predicates.rs b/cranelift/codegen/src/inst_predicates.rs index b9bb23855a..7a345264cc 100644 --- a/cranelift/codegen/src/inst_predicates.rs +++ b/cranelift/codegen/src/inst_predicates.rs @@ -41,15 +41,15 @@ fn has_side_effect(func: &Function, inst: Inst) -> bool { /// Does the given instruction behave as a "pure" node with respect to /// aegraph semantics? /// -/// - Actual pure nodes (arithmetic, etc) -/// - Loads with the `readonly` flag set +/// - Trivially pure nodes (bitwise arithmetic, etc) +/// - Loads with the `readonly`, `notrap`, and `can_move` flags set pub fn is_pure_for_egraph(func: &Function, inst: Inst) -> bool { - let is_readonly_load = match func.dfg.insts[inst] { + let is_pure_load = match func.dfg.insts[inst] { InstructionData::Load { opcode: Opcode::Load, flags, .. - } => flags.readonly() && flags.notrap(), + } => flags.readonly() && flags.notrap() && flags.can_move(), _ => false, }; @@ -65,7 +65,7 @@ pub fn is_pure_for_egraph(func: &Function, inst: Inst) -> bool { let op = func.dfg.insts[inst].opcode(); - has_one_result && (is_readonly_load || (!op.can_load() && !trivially_has_side_effects(op))) + has_one_result && (is_pure_load || (!op.can_load() && !trivially_has_side_effects(op))) } /// Can the given instruction be merged into another copy of itself? diff --git a/cranelift/codegen/src/ir/instructions.rs b/cranelift/codegen/src/ir/instructions.rs index 556e3092b3..8aa8d7cb0e 100644 --- a/cranelift/codegen/src/ir/instructions.rs +++ b/cranelift/codegen/src/ir/instructions.rs @@ -807,7 +807,7 @@ impl OperandConstraint { // control type to construct the interval of [F16, ctrl_type). tys.floats = BitSet8::from_range(4, ctrl_type_bits as u8); } else { - panic!("The Narrower constraint only operates on floats or ints"); + panic!("The Narrower constraint only operates on floats or ints, got {ctrl_type:?}"); } ResolvedConstraint::Free(tys) } @@ -838,7 +838,9 @@ impl OperandConstraint { tys.floats = BitSet8::from_range(lower_bound, 8); } } else { - panic!("The Wider constraint only operates on floats or ints"); + panic!( + "The Wider constraint only operates on floats or ints, got {ctrl_type:?}" + ); } ResolvedConstraint::Free(tys) diff --git a/cranelift/codegen/src/ir/memflags.rs b/cranelift/codegen/src/ir/memflags.rs index e83466f814..d9ac892c7a 100644 --- a/cranelift/codegen/src/ir/memflags.rs +++ b/cranelift/codegen/src/ir/memflags.rs @@ -73,7 +73,7 @@ pub struct MemFlags { // * 4 - checked flag // * 5/6 - alias region // * 7/8/9/10/11/12/13/14 - trap code - // * 15 - unallocated + // * 15 - can_move flag // // Current properties upheld are: // @@ -112,6 +112,13 @@ const ALIAS_REGION_OFFSET: u16 = 5; const MASK_TRAP_CODE: u16 = 0b1111_1111 << TRAP_CODE_OFFSET; const TRAP_CODE_OFFSET: u16 = 7; +/// Whether this memory operation may be freely moved by the optimizer so long +/// as its data dependencies are satisfied. That is, by setting this flag, the +/// producer is guaranteeing that this memory operation's safety is not guarded +/// by outside-the-data-flow-graph properties, like implicit bounds-checking +/// control dependencies. +const BIT_CAN_MOVE: u16 = 1 << 15; + impl MemFlags { /// Create a new empty set of flags. pub const fn new() -> Self { @@ -198,6 +205,7 @@ impl MemFlags { self.with_alias_region(Some(AliasRegion::Vmctx)) } "checked" => self.with_checked(), + "can_move" => self.with_can_move(), other => match TrapCode::from_str(other) { Ok(code) => self.with_trap_code(Some(code)), @@ -261,6 +269,12 @@ impl MemFlags { /// If this returns `true` then the memory is *accessible*, which means /// that accesses will not trap. This makes it possible to delete an unused /// load or a dead store instruction. + /// + /// This flag does *not* mean that the associated instruction can be + /// code-motioned to arbitrary places in the function so long as its data + /// dependencies are met. This only means that, given its current location + /// in the function, it will never trap. See the `can_move` method for more + /// details. pub const fn notrap(self) -> bool { self.trap_code().is_none() } @@ -276,6 +290,35 @@ impl MemFlags { self.with_trap_code(None) } + /// Is this memory operation safe to move so long as its data dependencies + /// remain satisfied? + /// + /// If this is `true`, then it is okay to code motion this instruction to + /// arbitrary locations, in the function, including across blocks and + /// conditional branches, so long as data dependencies (and trap ordering, + /// if any) are upheld. + /// + /// If this is `false`, then this memory operation's safety potentially + /// relies upon invariants that are not reflected in its data dependencies, + /// and therefore it is not safe to code motion this operation. For example, + /// this operation could be in a block that is dominated by a control-flow + /// bounds check, which is not reflected in its operands, and it would be + /// unsafe to code motion it above the bounds check, even if its data + /// dependencies would still be satisfied. + pub const fn can_move(self) -> bool { + self.read_bit(BIT_CAN_MOVE) + } + + /// Set the `can_move` flag. + pub const fn set_can_move(&mut self) { + *self = self.with_can_move(); + } + + /// Set the `can_move` flag, returning new flags. + pub const fn with_can_move(self) -> Self { + self.with_bit(BIT_CAN_MOVE) + } + /// Test if the `aligned` flag is set. /// /// By default, Cranelift memory instructions work with any unaligned effective address. If the @@ -382,6 +425,9 @@ impl fmt::Display for MemFlags { if self.readonly() { write!(f, " readonly")?; } + if self.can_move() { + write!(f, " can_move")?; + } if self.read_bit(BIT_BIG_ENDIAN) { write!(f, " big")?; } diff --git a/cranelift/codegen/src/isa/aarch64/inst.isle b/cranelift/codegen/src/isa/aarch64/inst.isle index 1dfeea4b08..7b82b1ce79 100644 --- a/cranelift/codegen/src/isa/aarch64/inst.isle +++ b/cranelift/codegen/src/isa/aarch64/inst.isle @@ -3884,10 +3884,10 @@ ;; extension must happen before the shift. This will pattern-match the shift ;; first and then if that succeeds afterwards try to find an extend. (rule 6 (amode_no_more_iconst ty (iadd x (ishl y (iconst (u64_from_imm64 n)))) offset) - (if-let true (u64_eq (ty_bytes ty) (u64_shl 1 n))) + (if-let true (u64_eq (ty_bytes ty) (u64_shl 1 (shift_masked_imm ty n)))) (amode_reg_scaled (amode_add x offset) y)) (rule 7 (amode_no_more_iconst ty (iadd (ishl y (iconst (u64_from_imm64 n))) x) offset) - (if-let true (u64_eq (ty_bytes ty) (u64_shl 1 n))) + (if-let true (u64_eq (ty_bytes ty) (u64_shl 1 (shift_masked_imm ty n)))) (amode_reg_scaled (amode_add x offset) y)) (decl amode_reg_scaled (Reg Value) AMode) diff --git a/cranelift/codegen/src/isa/x64/abi.rs b/cranelift/codegen/src/isa/x64/abi.rs index 5200585555..18bbee0346 100644 --- a/cranelift/codegen/src/isa/x64/abi.rs +++ b/cranelift/codegen/src/isa/x64/abi.rs @@ -115,7 +115,7 @@ impl ABIMachineSpec for X64ABIMachineSpec { // the four initial in-arg parameters. // // (See: - // https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160) + // https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170) next_stack = 32; } @@ -1142,12 +1142,7 @@ fn get_intreg_for_retval( _ => None, }, - CallConv::Winch => { - // TODO: Once Winch supports SIMD, this will need to be updated to support values - // returned in more than one register. - // https://github.com/bytecodealliance/wasmtime/issues/8093 - is_last.then(|| regs::rax()) - } + CallConv::Winch => is_last.then(|| regs::rax()), CallConv::Probestack => todo!(), CallConv::AppleAarch64 => unreachable!(), } diff --git a/cranelift/codegen/src/isa/x64/inst.isle b/cranelift/codegen/src/isa/x64/inst.isle index b180bdbd4d..c8338adae6 100644 --- a/cranelift/codegen/src/isa/x64/inst.isle +++ b/cranelift/codegen/src/isa/x64/inst.isle @@ -20,13 +20,6 @@ (src2 GprMemImm) (dst WritableGpr)) - ;; Integer arithmetic read-modify-write on memory. - (AluRM (size OperandSize) ;; 1, 2, 4 or 8 - (op AluRmiROpcode) - (src1_dst SyntheticAmode) - (src2 Gpr) - (lock bool)) - ;; Integer arithmetic binary op that relies on the VEX prefix. ;; NOTE: we don't currently support emitting VEX instructions with memory ;; arguments, so `src2` is artificially constrained to be a Gpr. @@ -3564,19 +3557,17 @@ ;; Helper for creating `andps` instructions. (decl x64_andps (Xmm XmmMem) Xmm) -(rule 0 (x64_andps src1 src2) - (xmm_rm_r (SseOpcode.Andps) src1 src2)) (rule 1 (x64_andps src1 src2) (if-let true (use_avx)) (xmm_rmir_vex (AvxOpcode.Vandps) src1 src2)) +(rule 0 (x64_andps src1 src2) (x64_andps_a src1 src2)) ;; Helper for creating `andpd` instructions. (decl x64_andpd (Xmm XmmMem) Xmm) -(rule 0 (x64_andpd src1 src2) - (xmm_rm_r (SseOpcode.Andpd) src1 src2)) (rule 1 (x64_andpd src1 src2) (if-let true (use_avx)) (xmm_rmir_vex (AvxOpcode.Vandpd) src1 src2)) +(rule 0 (x64_andpd src1 src2) (x64_andpd_a src1 src2)) ;; Helper for creating `por` instructions. (decl x64_por (Xmm XmmMem) Xmm) @@ -3588,11 +3579,10 @@ ;; Helper for creating `orps` instructions. (decl x64_orps (Xmm XmmMem) Xmm) -(rule 0 (x64_orps src1 src2) - (xmm_rm_r (SseOpcode.Orps) src1 src2)) (rule 1 (x64_orps src1 src2) (if-let true (use_avx)) (xmm_rmir_vex (AvxOpcode.Vorps) src1 src2)) +(rule 0 (x64_orps src1 src2) (x64_orps_a src1 src2)) ;; Helper for creating `orpd` instructions. (decl x64_orpd (Xmm XmmMem) Xmm) @@ -3613,19 +3603,17 @@ ;; Helper fxor creating `xorps` instructions. (decl x64_xorps (Xmm XmmMem) Xmm) -(rule 0 (x64_xorps src1 src2) - (xmm_rm_r (SseOpcode.Xorps) src1 src2)) (rule 1 (x64_xorps src1 src2) (if-let true (use_avx)) (xmm_rmir_vex (AvxOpcode.Vxorps) src1 src2)) +(rule 0 (x64_xorps src1 src2) (x64_xorps_a src1 src2)) ;; Helper fxor creating `xorpd` instructions. (decl x64_xorpd (Xmm XmmMem) Xmm) -(rule 0 (x64_xorpd src1 src2) - (xmm_rm_r (SseOpcode.Xorpd) src1 src2)) (rule 1 (x64_xorpd src1 src2) (if-let true (use_avx)) (xmm_rmir_vex (AvxOpcode.Vxorpd) src1 src2)) +(rule 0 (x64_xorpd src1 src2) (x64_xorpd_a src1 src2)) ;; Helper for creating `pmullw` instructions. (decl x64_pmullw (Xmm XmmMem) Xmm) @@ -3797,19 +3785,17 @@ ;; Helper for creating `addps` instructions. (decl x64_addps (Xmm XmmMem) Xmm) -(rule 0 (x64_addps src1 src2) - (xmm_rm_r (SseOpcode.Addps) src1 src2)) (rule 1 (x64_addps src1 src2) (if-let true (use_avx)) (xmm_rmir_vex (AvxOpcode.Vaddps) src1 src2)) +(rule 0 (x64_addps src1 src2) (x64_addps_a src1 src2)) ;; Helper for creating `addpd` instructions. (decl x64_addpd (Xmm XmmMem) Xmm) -(rule 0 (x64_addpd src1 src2) - (xmm_rm_r (SseOpcode.Addpd) src1 src2)) (rule 1 (x64_addpd src1 src2) (if-let true (use_avx)) (xmm_rmir_vex (AvxOpcode.Vaddpd) src1 src2)) +(rule 0 (x64_addpd src1 src2) (x64_addpd_a src1 src2)) ;; Helper for creating `subss` instructions. (decl x64_subss (Xmm XmmMem) Xmm) @@ -3829,19 +3815,17 @@ ;; Helper for creating `subps` instructions. (decl x64_subps (Xmm XmmMem) Xmm) -(rule 0 (x64_subps src1 src2) - (xmm_rm_r (SseOpcode.Subps) src1 src2)) (rule 1 (x64_subps src1 src2) (if-let true (use_avx)) (xmm_rmir_vex (AvxOpcode.Vsubps) src1 src2)) +(rule 0 (x64_subps src1 src2) (x64_subps_a src1 src2)) ;; Helper for creating `subpd` instructions. (decl x64_subpd (Xmm XmmMem) Xmm) -(rule 0 (x64_subpd src1 src2) - (xmm_rm_r (SseOpcode.Subpd) src1 src2)) (rule 1 (x64_subpd src1 src2) (if-let true (use_avx)) (xmm_rmir_vex (AvxOpcode.Vsubpd) src1 src2)) +(rule 0 (x64_subpd src1 src2) (x64_subpd_a src1 src2)) ;; Helper for creating `mulss` instructions. (decl x64_mulss (Xmm XmmMem) Xmm) @@ -5041,12 +5025,6 @@ (if-let true (use_avx)) (xmm_rmir_vex (AvxOpcode.Vpcmpgtq) x y)) -;; Helpers for read-modify-write ALU form (AluRM). -(decl alu_rm (Type AluRmiROpcode Amode Gpr) SideEffectNoResult) -(rule (alu_rm ty opcode src1_dst src2) - (let ((size OperandSize (operand_size_of_type_32_64 ty))) - (SideEffectNoResult.Inst (MInst.AluRM size opcode src1_dst src2 false)))) - (decl x64_add_mem (Type Amode Gpr) SideEffectNoResult) (spec (x64_add_mem ty addr val) (provide (= result (store_effect @@ -5465,30 +5443,35 @@ (_ Unit (emit (MInst.Xchg size operand addr dst)))) dst)) -(decl lock_alu_rm (OperandSize AluRmiROpcode SyntheticAmode Gpr) Reg) -(rule (lock_alu_rm size opcode addr operand) - (let ((_ Unit (emit (MInst.AluRM size opcode addr operand true)))) - (invalid_reg))) - -(decl x64_lock_add (OperandSize SyntheticAmode Gpr) Reg) -(rule (x64_lock_add size addr operand) - (lock_alu_rm size (AluRmiROpcode.Add) addr operand)) - -(decl x64_lock_sub (OperandSize SyntheticAmode Gpr) Reg) -(rule (x64_lock_sub size addr operand) - (lock_alu_rm size (AluRmiROpcode.Sub) addr operand)) - -(decl x64_lock_and (OperandSize SyntheticAmode Gpr) Reg) -(rule (x64_lock_and size addr operand) - (lock_alu_rm size (AluRmiROpcode.And) addr operand)) - -(decl x64_lock_or (OperandSize SyntheticAmode Gpr) Reg) -(rule (x64_lock_or size addr operand) - (lock_alu_rm size (AluRmiROpcode.Or) addr operand)) - -(decl x64_lock_xor (OperandSize SyntheticAmode Gpr) Reg) -(rule (x64_lock_xor size addr operand) - (lock_alu_rm size (AluRmiROpcode.Xor) addr operand)) +(decl x64_lock_add (OperandSize Amode Gpr) SideEffectNoResult) +(rule (x64_lock_add (OperandSize.Size8) addr reg) (x64_lock_addb_mr_mem addr reg)) +(rule (x64_lock_add (OperandSize.Size16) addr reg) (x64_lock_addw_mr_mem addr reg)) +(rule (x64_lock_add (OperandSize.Size32) addr reg) (x64_lock_addl_mr_mem addr reg)) +(rule (x64_lock_add (OperandSize.Size64) addr reg) (x64_lock_addq_mr_mem addr reg)) + +(decl x64_lock_sub (OperandSize Amode Gpr) SideEffectNoResult) +(rule (x64_lock_sub (OperandSize.Size8) addr reg) (x64_lock_subb_mr_mem addr reg)) +(rule (x64_lock_sub (OperandSize.Size16) addr reg) (x64_lock_subw_mr_mem addr reg)) +(rule (x64_lock_sub (OperandSize.Size32) addr reg) (x64_lock_subl_mr_mem addr reg)) +(rule (x64_lock_sub (OperandSize.Size64) addr reg) (x64_lock_subq_mr_mem addr reg)) + +(decl x64_lock_and (OperandSize Amode Gpr) SideEffectNoResult) +(rule (x64_lock_and (OperandSize.Size8) addr reg) (x64_lock_andb_mr_mem addr reg)) +(rule (x64_lock_and (OperandSize.Size16) addr reg) (x64_lock_andw_mr_mem addr reg)) +(rule (x64_lock_and (OperandSize.Size32) addr reg) (x64_lock_andl_mr_mem addr reg)) +(rule (x64_lock_and (OperandSize.Size64) addr reg) (x64_lock_andq_mr_mem addr reg)) + +(decl x64_lock_or (OperandSize Amode Gpr) SideEffectNoResult) +(rule (x64_lock_or (OperandSize.Size8) addr reg) (x64_lock_orb_mr_mem addr reg)) +(rule (x64_lock_or (OperandSize.Size16) addr reg) (x64_lock_orw_mr_mem addr reg)) +(rule (x64_lock_or (OperandSize.Size32) addr reg) (x64_lock_orl_mr_mem addr reg)) +(rule (x64_lock_or (OperandSize.Size64) addr reg) (x64_lock_orq_mr_mem addr reg)) + +(decl x64_lock_xor (OperandSize Amode Gpr) SideEffectNoResult) +(rule (x64_lock_xor (OperandSize.Size8) addr reg) (x64_lock_xorb_mr_mem addr reg)) +(rule (x64_lock_xor (OperandSize.Size16) addr reg) (x64_lock_xorw_mr_mem addr reg)) +(rule (x64_lock_xor (OperandSize.Size32) addr reg) (x64_lock_xorl_mr_mem addr reg)) +(rule (x64_lock_xor (OperandSize.Size64) addr reg) (x64_lock_xorq_mr_mem addr reg)) (decl x64_atomic_rmw_seq (Type AtomicRmwSeqOp SyntheticAmode Gpr) Gpr) (rule (x64_atomic_rmw_seq ty op mem input) diff --git a/cranelift/codegen/src/isa/x64/inst/emit.rs b/cranelift/codegen/src/isa/x64/inst/emit.rs index b07dc5e501..b812fab48b 100644 --- a/cranelift/codegen/src/isa/x64/inst/emit.rs +++ b/cranelift/codegen/src/isa/x64/inst/emit.rs @@ -250,47 +250,6 @@ pub(crate) fn emit( ); } - Inst::AluRM { - size, - src1_dst, - src2, - op, - lock, - } => { - let src2 = src2.to_reg(); - let src1_dst = src1_dst.finalize(state.frame_layout(), sink).clone(); - - let opcode = match op { - AluRmiROpcode::Add => 0x01, - AluRmiROpcode::Sub => 0x29, - AluRmiROpcode::And => 0x21, - AluRmiROpcode::Or => 0x09, - AluRmiROpcode::Xor => 0x31, - _ => panic!("Unsupported read-modify-write ALU opcode"), - }; - - let prefix = match (size, lock) { - (OperandSize::Size16, false) => LegacyPrefixes::_66, - (OperandSize::Size16, true) => LegacyPrefixes::_66F0, - (_, false) => LegacyPrefixes::None, - (_, true) => LegacyPrefixes::_F0, - }; - let opcode = if *size == OperandSize::Size8 { - opcode - 1 - } else { - opcode - }; - - let mut rex = RexFlags::from(*size); - if *size == OperandSize::Size8 { - debug_assert!(src2.is_real()); - rex.always_emit_if_8bit_needed(src2); - } - - let enc_g = int_reg_enc(src2); - emit_std_enc_mem(sink, prefix, opcode, 1, enc_g, &src1_dst, rex, 0); - } - Inst::AluRmRVex { size, op, diff --git a/cranelift/codegen/src/isa/x64/inst/emit_tests.rs b/cranelift/codegen/src/isa/x64/inst/emit_tests.rs index f6f41d48c0..79740b9d51 100644 --- a/cranelift/codegen/src/isa/x64/inst/emit_tests.rs +++ b/cranelift/codegen/src/isa/x64/inst/emit_tests.rs @@ -1629,243 +1629,6 @@ fn test_x64_emit() { "sbbq %r15, 99(%rdi), %r15", )); - // ======================================================== - // AluRM - - insns.push(( - Inst::AluRM { - size: OperandSize::Size32, - op: AluRmiROpcode::Add, - src1_dst: Amode::imm_reg(99, rdi).into(), - src2: Gpr::unwrap_new(r12), - lock: false, - }, - "44016763", - "addl %r12d, 99(%rdi)", - )); - - insns.push(( - Inst::AluRM { - size: OperandSize::Size64, - op: AluRmiROpcode::Add, - src1_dst: Amode::imm_reg_reg_shift(0, Gpr::unwrap_new(rbp), Gpr::unwrap_new(rax), 3) - .into(), - src2: Gpr::unwrap_new(rax), - lock: false, - }, - "480144C500", - "addq %rax, 0(%rbp,%rax,8)", - )); - - insns.push(( - Inst::AluRM { - size: OperandSize::Size32, - op: AluRmiROpcode::Sub, - src1_dst: Amode::imm_reg(0, rsp).into(), - src2: Gpr::unwrap_new(rcx), - lock: false, - }, - "290C24", - "subl %ecx, 0(%rsp)", - )); - - insns.push(( - Inst::AluRM { - size: OperandSize::Size64, - op: AluRmiROpcode::Sub, - src1_dst: Amode::imm_reg(0, rbp).into(), - src2: Gpr::unwrap_new(rax), - lock: false, - }, - "48294500", - "subq %rax, 0(%rbp)", - )); - - insns.push(( - Inst::AluRM { - size: OperandSize::Size32, - op: AluRmiROpcode::And, - src1_dst: Amode::imm_reg(0, rsp).into(), - src2: Gpr::unwrap_new(rcx), - lock: false, - }, - "210C24", - "andl %ecx, 0(%rsp)", - )); - - insns.push(( - Inst::AluRM { - size: OperandSize::Size64, - op: AluRmiROpcode::And, - src1_dst: Amode::imm_reg(0, rbp).into(), - src2: Gpr::unwrap_new(rax), - lock: false, - }, - "48214500", - "andq %rax, 0(%rbp)", - )); - - insns.push(( - Inst::AluRM { - size: OperandSize::Size32, - op: AluRmiROpcode::Or, - src1_dst: Amode::imm_reg(0, rsp).into(), - src2: Gpr::unwrap_new(rcx), - lock: false, - }, - "090C24", - "orl %ecx, 0(%rsp)", - )); - - insns.push(( - Inst::AluRM { - size: OperandSize::Size64, - op: AluRmiROpcode::Or, - src1_dst: Amode::imm_reg(0, rbp).into(), - src2: Gpr::unwrap_new(rax), - lock: false, - }, - "48094500", - "orq %rax, 0(%rbp)", - )); - - insns.push(( - Inst::AluRM { - size: OperandSize::Size32, - op: AluRmiROpcode::Xor, - src1_dst: Amode::imm_reg(0, rsp).into(), - src2: Gpr::unwrap_new(rcx), - lock: false, - }, - "310C24", - "xorl %ecx, 0(%rsp)", - )); - - insns.push(( - Inst::AluRM { - size: OperandSize::Size64, - op: AluRmiROpcode::Xor, - src1_dst: Amode::imm_reg(0, rbp).into(), - src2: Gpr::unwrap_new(rax), - lock: false, - }, - "48314500", - "xorq %rax, 0(%rbp)", - )); - - insns.push(( - Inst::AluRM { - size: OperandSize::Size16, - op: AluRmiROpcode::Add, - src1_dst: Amode::imm_reg(0, rbp).into(), - src2: Gpr::unwrap_new(rax), - lock: false, - }, - "66014500", - "addw %ax, 0(%rbp)", - )); - insns.push(( - Inst::AluRM { - size: OperandSize::Size16, - op: AluRmiROpcode::Sub, - src1_dst: Amode::imm_reg(0, rbp).into(), - src2: Gpr::unwrap_new(r12), - lock: false, - }, - "6644296500", - "subw %r12w, 0(%rbp)", - )); - - insns.push(( - Inst::AluRM { - size: OperandSize::Size8, - op: AluRmiROpcode::Add, - src1_dst: Amode::imm_reg(0, rbp).into(), - src2: Gpr::unwrap_new(rax), - lock: false, - }, - "004500", - "addb %al, 0(%rbp)", - )); - insns.push(( - Inst::AluRM { - size: OperandSize::Size8, - op: AluRmiROpcode::Sub, - src1_dst: Amode::imm_reg(0, rbp).into(), - src2: Gpr::unwrap_new(rbp), - lock: false, - }, - "40286D00", - "subb %bpl, 0(%rbp)", - )); - insns.push(( - Inst::AluRM { - size: OperandSize::Size8, - op: AluRmiROpcode::Xor, - src1_dst: Amode::imm_reg(0, rbp).into(), - src2: Gpr::unwrap_new(r10), - lock: false, - }, - "44305500", - "xorb %r10b, 0(%rbp)", - )); - insns.push(( - Inst::AluRM { - size: OperandSize::Size8, - op: AluRmiROpcode::And, - src1_dst: Amode::imm_reg(0, rbp).into(), - src2: Gpr::unwrap_new(r15), - lock: false, - }, - "44207D00", - "andb %r15b, 0(%rbp)", - )); - - insns.push(( - Inst::AluRM { - size: OperandSize::Size64, - op: AluRmiROpcode::And, - src1_dst: Amode::imm_reg(0, rdx).into(), - src2: Gpr::unwrap_new(rax), - lock: true, - }, - "F0482102", - "lock andq %rax, 0(%rdx)", - )); - insns.push(( - Inst::AluRM { - size: OperandSize::Size32, - op: AluRmiROpcode::Or, - src1_dst: Amode::imm_reg(0, rdx).into(), - src2: Gpr::unwrap_new(rax), - lock: true, - }, - "F00902", - "lock orl %eax, 0(%rdx)", - )); - insns.push(( - Inst::AluRM { - size: OperandSize::Size16, - op: AluRmiROpcode::Xor, - src1_dst: Amode::imm_reg(0, rdx).into(), - src2: Gpr::unwrap_new(rax), - lock: true, - }, - "66F03102", - "lock xorw %ax, 0(%rdx)", - )); - insns.push(( - Inst::AluRM { - size: OperandSize::Size8, - op: AluRmiROpcode::Add, - src1_dst: Amode::imm_reg(0, r9).into(), - src2: Gpr::unwrap_new(rax), - lock: true, - }, - "F0410001", - "lock addb %al, 0(%r9)", - )); - // ======================================================== // UnaryRmR diff --git a/cranelift/codegen/src/isa/x64/inst/external.rs b/cranelift/codegen/src/isa/x64/inst/external.rs index 6a111ed136..7380fe7001 100644 --- a/cranelift/codegen/src/isa/x64/inst/external.rs +++ b/cranelift/codegen/src/isa/x64/inst/external.rs @@ -6,6 +6,7 @@ use super::{ }; use crate::ir::TrapCode; use cranelift_assembler_x64 as asm; +use std::string::String; /// Define the types of registers Cranelift will use. #[derive(Clone, Debug)] @@ -38,6 +39,16 @@ impl asm::AsReg for PairedGpr { write } + fn to_string(&self, size: Option) -> String { + if self.read.is_real() { + asm::gpr::enc::to_string(self.enc(), size.unwrap()).into() + } else { + let read = self.read.to_reg(); + let write = self.write.to_reg().to_reg(); + format!("(%{write:?} <- %{read:?})") + } + } + fn new(_: u8) -> Self { panic!("disallow creation of new assembler registers") } @@ -59,6 +70,17 @@ impl asm::AsReg for PairedXmm { write } + fn to_string(&self, size: Option) -> String { + assert!(size.is_none(), "XMM registers do not have size variants"); + if self.read.is_real() { + asm::xmm::enc::to_string(self.enc()).into() + } else { + let read = self.read.to_reg(); + let write = self.write.to_reg().to_reg(); + format!("(%{write:?} <- %{read:?})") + } + } + fn new(_: u8) -> Self { panic!("disallow creation of new assembler registers") } @@ -70,6 +92,14 @@ impl asm::AsReg for Gpr { enc_gpr(self) } + fn to_string(&self, size: Option) -> String { + if self.is_real() { + asm::gpr::enc::to_string(self.enc(), size.unwrap()).into() + } else { + format!("%{:?}", self.to_reg()) + } + } + fn new(_: u8) -> Self { panic!("disallow creation of new assembler registers") } @@ -81,6 +111,15 @@ impl asm::AsReg for Xmm { enc_xmm(self) } + fn to_string(&self, size: Option) -> String { + assert!(size.is_none(), "XMM registers do not have size variants"); + if self.is_real() { + asm::xmm::enc::to_string(self.enc()).into() + } else { + format!("%{:?}", self.to_reg()) + } + } + fn new(_: u8) -> Self { panic!("disallow creation of new assembler registers") } @@ -157,36 +196,7 @@ impl<'a, T: OperandVisitor> asm::RegisterVisitor for Regallo impl Into> for SyntheticAmode { fn into(self) -> asm::Amode { match self { - SyntheticAmode::Real(amode) => match amode { - Amode::ImmReg { - simm32, - base, - flags, - } => asm::Amode::ImmReg { - simm32: asm::AmodeOffsetPlusKnownOffset { - simm32: simm32.into(), - offset: None, - }, - base: Gpr::unwrap_new(base), - trap: flags.trap_code().map(Into::into), - }, - Amode::ImmRegRegShift { - simm32, - base, - index, - shift, - flags, - } => asm::Amode::ImmRegRegShift { - base, - index: asm::NonRspGpr::new(index), - scale: asm::Scale::new(shift), - simm32: simm32.into(), - trap: flags.trap_code().map(Into::into), - }, - Amode::RipRelative { target } => asm::Amode::RipRelative { - target: asm::DeferredTarget::Label(asm::Label(target.as_u32())), - }, - }, + SyntheticAmode::Real(amode) => amode.into(), SyntheticAmode::IncomingArg { offset } => asm::Amode::ImmReg { base: Gpr::unwrap_new(regs::rbp()), simm32: asm::AmodeOffsetPlusKnownOffset { @@ -210,6 +220,41 @@ impl Into> for SyntheticAmode { } } +impl Into> for Amode { + fn into(self) -> asm::Amode { + match self { + Amode::ImmReg { + simm32, + base, + flags, + } => asm::Amode::ImmReg { + simm32: asm::AmodeOffsetPlusKnownOffset { + simm32: simm32.into(), + offset: None, + }, + base: Gpr::unwrap_new(base), + trap: flags.trap_code().map(Into::into), + }, + Amode::ImmRegRegShift { + simm32, + base, + index, + shift, + flags, + } => asm::Amode::ImmRegRegShift { + base, + index: asm::NonRspGpr::new(index), + scale: asm::Scale::new(shift), + simm32: simm32.into(), + trap: flags.trap_code().map(Into::into), + }, + Amode::RipRelative { target } => asm::Amode::RipRelative { + target: asm::DeferredTarget::Label(asm::Label(target.as_u32())), + }, + } + } +} + /// Keep track of the offset slots to fill in during emission; see /// `KnownOffsetTable`. pub mod offsets { @@ -280,3 +325,51 @@ impl From for VCodeConstant { Self::from_u32(value.0) } } + +// Include code generated by `cranelift-codegen/meta/src/gen_asm.rs`. This file +// contains a `isle_assembler_methods!` macro with Rust implementations of all +// the assembler instructions exposed to ISLE. +include!(concat!(env!("OUT_DIR"), "/assembler-isle-macro.rs")); +pub(crate) use isle_assembler_methods; + +#[cfg(test)] +mod tests { + use super::asm::{AsReg, Size}; + use super::PairedGpr; + use crate::isa::x64::args::{FromWritableReg, Gpr, WritableGpr, WritableXmm, Xmm}; + use crate::isa::x64::inst::external::PairedXmm; + use crate::{Reg, Writable}; + use regalloc2::{RegClass, VReg}; + + #[test] + fn pretty_print_registers() { + // For logging, we need to be able to pretty-print the virtual registers + // that Cranelift uses before register allocation. This test ensures + // that these remain printable using the `AsReg::to_string` interface + // (see issue #10631). + + let v200: Reg = VReg::new(200, RegClass::Int).into(); + let gpr200 = Gpr::new(v200).unwrap(); + assert_eq!(gpr200.to_string(Some(Size::Quadword)), "%v200"); + + let v300: Reg = VReg::new(300, RegClass::Int).into(); + let wgpr300 = WritableGpr::from_writable_reg(Writable::from_reg(v300).into()).unwrap(); + let pair = PairedGpr { + read: gpr200, + write: wgpr300, + }; + assert_eq!(pair.to_string(Some(Size::Quadword)), "(%v300 <- %v200)"); + + let v400: Reg = VReg::new(400, RegClass::Float).into(); + let xmm400 = Xmm::new(v400).unwrap(); + assert_eq!(xmm400.to_string(None), "%v400"); + + let v500: Reg = VReg::new(500, RegClass::Float).into(); + let wxmm500 = WritableXmm::from_writable_reg(Writable::from_reg(v500).into()).unwrap(); + let pair = PairedXmm { + read: xmm400, + write: wxmm500, + }; + assert_eq!(pair.to_string(None), "(%v500 <- %v400)"); + } +} diff --git a/cranelift/codegen/src/isa/x64/inst/mod.rs b/cranelift/codegen/src/isa/x64/inst/mod.rs index 14c2c0b7d6..033e96c8f9 100644 --- a/cranelift/codegen/src/isa/x64/inst/mod.rs +++ b/cranelift/codegen/src/isa/x64/inst/mod.rs @@ -56,7 +56,7 @@ pub struct ReturnCallInfo { fn inst_size_test() { // This test will help with unintentionally growing the size // of the Inst enum. - assert_eq!(48, std::mem::size_of::()); + assert_eq!(56, std::mem::size_of::()); } pub(crate) fn low32_will_sign_extend_to_64(x: u64) -> bool { @@ -74,7 +74,6 @@ impl Inst { // These instructions are part of SSE2, which is a basic requirement in Cranelift, and // don't have to be checked. Inst::AluRmiR { .. } - | Inst::AluRM { .. } | Inst::AtomicRmwSeq { .. } | Inst::Bswap { .. } | Inst::CallKnown { .. } @@ -193,10 +192,11 @@ impl Inst { Inst::External { inst } => { use cranelift_assembler_x64::Feature::*; - let features = smallvec![]; + let mut features = smallvec![]; for f in inst.features() { match f { _64b | compat => {} + sse => features.push(InstructionSet::SSE), } } features @@ -712,20 +712,6 @@ impl PrettyPrint for Inst { let op = ljustify2(op.to_string(), suffix_lqb(*size)); format!("{op} {dst}, {dst}, {dst}") } - Inst::AluRM { - size, - op, - src1_dst, - src2, - lock, - } => { - let size_bytes = size.to_bytes(); - let src2 = pretty_print_reg(src2.to_reg(), size_bytes); - let src1_dst = src1_dst.pretty_print(size_bytes); - let op = ljustify2(op.to_string(), suffix_bwlq(*size)); - let prefix = if *lock { "lock " } else { "" }; - format!("{prefix}{op} {src2}, {src1_dst}") - } Inst::AluRmRVex { size, op, @@ -2011,10 +1997,6 @@ fn x64_get_operands(inst: &mut Inst, collector: &mut impl OperandVisitor) { src2.get_operands(collector); } Inst::AluConstOp { dst, .. } => collector.reg_def(dst), - Inst::AluRM { src1_dst, src2, .. } => { - collector.reg_use(src2); - src1_dst.get_operands(collector); - } Inst::AluRmRVex { src1, src2, dst, .. } => { diff --git a/cranelift/codegen/src/isa/x64/lower.isle b/cranelift/codegen/src/isa/x64/lower.isle index 71ace37edb..02e8479bfe 100644 --- a/cranelift/codegen/src/isa/x64/lower.isle +++ b/cranelift/codegen/src/isa/x64/lower.isle @@ -112,6 +112,23 @@ (iadd128 (value_regs_get_gpr x 0) (value_regs_get_gpr x 1) y (RegMemImm.Imm 0)))) +;; Specialized lowering rule for `iadd` of two 64-bit unsigned integers, meaning +;; that we can skip the `adc` and instead use `setb`. This is in some sense a +;; way of modeling `uadd_overflow`. +(rule 4 (lower (has_type $I128 (iadd (uextend x) (uextend y @ (value_type $I64))))) + (let ( + (x Gpr (extend_to_gpr x $I64 (ExtendKind.Zero))) + (ret ValueRegs (with_flags (x64_add_with_flags_paired $I64 x y) + (x64_setcc_paired (CC.B)))) + ) + ;; FIXME: this `movzx` ideally would happen before the `add` itself to + ;; zero out the destination register with `xor %dst,%dst` and then + ;; the `setb` would just write to the lower bytes. That would probably + ;; require modeling this as a pseudo-inst which isn't quite worth it + ;; at this time. + (value_regs (value_regs_get ret 0) + (x64_movzx (ExtMode.BQ) (value_regs_get ret 1))))) + ;; Helper for lowering 128-bit addition with the 64-bit halves of the lhs/rhs ;; already split. The first two arguments are lo/hi for the lhs and the second ;; two are lo/hi for the rhs. @@ -3432,27 +3449,27 @@ (atomic_rmw flags (AtomicRmwOp.Add) address input))) (if-let (first_result res) i) (if-let true (value_is_unused res)) - (x64_lock_add (raw_operand_size_of_type ty) (to_amode flags address (zero_offset)) input)) + (side_effect_as_invalid (x64_lock_add (raw_operand_size_of_type ty) (to_amode flags address (zero_offset)) input))) (rule 2 (lower i @ (has_type (fits_in_64 (ty_int ty)) (atomic_rmw flags (AtomicRmwOp.Sub) address input))) (if-let (first_result res) i) (if-let true (value_is_unused res)) - (x64_lock_sub (raw_operand_size_of_type ty) (to_amode flags address (zero_offset)) input)) + (side_effect_as_invalid (x64_lock_sub (raw_operand_size_of_type ty) (to_amode flags address (zero_offset)) input))) (rule 2 (lower i @ (has_type (fits_in_64 (ty_int ty)) (atomic_rmw flags (AtomicRmwOp.And) address input))) (if-let (first_result res) i) (if-let true (value_is_unused res)) - (x64_lock_and (raw_operand_size_of_type ty) (to_amode flags address (zero_offset)) input)) + (side_effect_as_invalid (x64_lock_and (raw_operand_size_of_type ty) (to_amode flags address (zero_offset)) input))) (rule 2 (lower i @ (has_type (fits_in_64 (ty_int ty)) (atomic_rmw flags (AtomicRmwOp.Or) address input))) (if-let (first_result res) i) (if-let true (value_is_unused res)) - (x64_lock_or (raw_operand_size_of_type ty) (to_amode flags address (zero_offset)) input)) + (side_effect_as_invalid (x64_lock_or (raw_operand_size_of_type ty) (to_amode flags address (zero_offset)) input))) (rule 2 (lower i @ (has_type (fits_in_64 (ty_int ty)) (atomic_rmw flags (AtomicRmwOp.Xor) address input))) (if-let (first_result res) i) (if-let true (value_is_unused res)) - (x64_lock_xor (raw_operand_size_of_type ty) (to_amode flags address (zero_offset)) input)) + (side_effect_as_invalid (x64_lock_xor (raw_operand_size_of_type ty) (to_amode flags address (zero_offset)) input))) ;; 128-bit integers always use a `lock cmpxchg16b` loop. (rule 3 (lower (has_type $I128 (atomic_rmw flags op address input))) diff --git a/cranelift/codegen/src/isa/x64/lower/isle.rs b/cranelift/codegen/src/isa/x64/lower/isle.rs index 1fcaed5d67..923d0124f7 100644 --- a/cranelift/codegen/src/isa/x64/lower/isle.rs +++ b/cranelift/codegen/src/isa/x64/lower/isle.rs @@ -6,7 +6,7 @@ use crate::{ir::types, ir::AtomicRmwOp, isa}; use generated_code::{AssemblerOutputs, Context, MInst, RegisterClass}; // Types that the generated ISLE code uses via `use super::*`. -use super::external::{CraneliftRegisters, PairedGpr, PairedXmm}; +use super::external::{isle_assembler_methods, CraneliftRegisters, PairedGpr, PairedXmm}; use super::{is_int_or_ref_ty, is_mergeable_load, lower_to_amode, MergeableLoadSize}; use crate::ir::condcodes::{FloatCC, IntCC}; use crate::ir::immediates::*; @@ -76,7 +76,7 @@ pub(crate) fn lower_branch( impl Context for IsleContext<'_, '_, MInst, X64Backend> { isle_lower_prelude_methods!(); isle_prelude_caller_methods!(X64CallSite); - asm::isle_assembler_methods!(); + isle_assembler_methods!(); #[inline] fn operand_size_of_type_32_64(&mut self, ty: Type) -> OperandSize { @@ -1058,7 +1058,10 @@ impl IsleContext<'_, '_, MInst, X64Backend> { } /// Helper used by code generated by the `cranelift-assembler-x64` crate. - fn convert_xmm_mem_to_assembler_read_xmm_mem(&self, read: &XmmMem) -> asm::XmmMem { + fn convert_xmm_mem_to_assembler_read_xmm_mem( + &self, + read: &XmmMemAligned, + ) -> asm::XmmMem { match read.clone().into() { RegMem::Reg { reg } => asm::XmmMem::Xmm(Xmm::new(reg).unwrap()), RegMem::Mem { addr } => asm::XmmMem::Mem(addr.into()), @@ -1079,6 +1082,11 @@ impl IsleContext<'_, '_, MInst, X64Backend> { RegMem::Mem { addr } => asm::GprMem::Mem(addr.into()), } } + + /// Helper used by code generated by the `cranelift-assembler-x64` crate. + fn convert_amode_to_assembler_amode(&mut self, amode: &Amode) -> asm::Amode { + amode.clone().into() + } } // Since x64 doesn't have 8x16 shifts and we must use a 16x8 shift instead, we diff --git a/cranelift/codegen/src/isa/x64/pcc.rs b/cranelift/codegen/src/isa/x64/pcc.rs index 17d5352586..dcaec43cde 100644 --- a/cranelift/codegen/src/isa/x64/pcc.rs +++ b/cranelift/codegen/src/isa/x64/pcc.rs @@ -158,17 +158,6 @@ pub(crate) fn check( } }, - Inst::AluRM { - size, - op: _, - ref src1_dst, - src2: _, - lock: _, - } => { - check_load(ctx, None, src1_dst, vcode, size.to_type(), 64)?; - check_store(ctx, None, src1_dst, vcode, size.to_type()) - } - Inst::AluRmRVex { size, ref src2, diff --git a/cranelift/codegen/src/lib.rs b/cranelift/codegen/src/lib.rs index 55f7a12b34..be404d44f8 100644 --- a/cranelift/codegen/src/lib.rs +++ b/cranelift/codegen/src/lib.rs @@ -82,7 +82,6 @@ mod ranges; mod remove_constant_phis; mod result; mod scoped_hash_map; -mod unionfind; mod unreachable_code; mod value_label; diff --git a/cranelift/codegen/src/machinst/abi.rs b/cranelift/codegen/src/machinst/abi.rs index 1849a7e2ff..fbe14d6c2c 100644 --- a/cranelift/codegen/src/machinst/abi.rs +++ b/cranelift/codegen/src/machinst/abi.rs @@ -1173,7 +1173,7 @@ impl Callee { let start_offset = checked_round_up(unaligned_start_offset, mask) .ok_or(CodegenError::ImplLimitExceeded)?; - // The end offset is the the start offset increased by the size + // The end offset is the start offset increased by the size end_offset = start_offset .checked_add(data.size) .ok_or(CodegenError::ImplLimitExceeded)?; diff --git a/cranelift/codegen/src/machinst/blockorder.rs b/cranelift/codegen/src/machinst/blockorder.rs index b23fcf4859..e0ac62bbfd 100644 --- a/cranelift/codegen/src/machinst/blockorder.rs +++ b/cranelift/codegen/src/machinst/blockorder.rs @@ -132,7 +132,6 @@ impl LoweredBlock { } /// The associated out-edge successor, if this is a critical edge. - #[cfg(test)] pub fn out_edge(&self) -> Option { match self { &LoweredBlock::CriticalEdge { succ, .. } => Some(succ), diff --git a/cranelift/codegen/src/machinst/buffer.rs b/cranelift/codegen/src/machinst/buffer.rs index e3ba867af1..403f425e8e 100644 --- a/cranelift/codegen/src/machinst/buffer.rs +++ b/cranelift/codegen/src/machinst/buffer.rs @@ -239,6 +239,8 @@ enum ForceVeneers { pub struct MachBuffer { /// The buffer contents, as raw bytes. data: SmallVec<[u8; 1024]>, + /// The required alignment of this buffer. + min_alignment: u32, /// Any relocations referring to this code. Note that only *external* /// relocations are tracked here; references to labels within the buffer are /// resolved before emission. @@ -433,6 +435,7 @@ impl MachBuffer { pub fn new() -> MachBuffer { MachBuffer { data: SmallVec::new(), + min_alignment: I::function_alignment().minimum, relocs: SmallVec::new(), traps: SmallVec::new(), call_sites: SmallVec::new(), @@ -607,7 +610,7 @@ impl MachBuffer { /// at the ISA's minimum function alignment and can be increased due to /// constant requirements. fn finish_constants(&mut self, constants: &VCodeConstants) -> u32 { - let mut alignment = I::function_alignment().minimum; + let mut alignment = self.min_alignment; for (constant, offset) in mem::take(&mut self.used_constants) { let constant = constants.get(constant); let data = constant.as_slice(); @@ -1665,6 +1668,15 @@ impl MachBuffer { stack_map.finalize(emit_state.frame_layout().sp_to_sized_stack_slots()); self.user_stack_maps.push((return_addr, span, stack_map)); } + + /// Increase the alignment of the buffer to the given alignment if bigger + /// than the current alignment. + pub fn set_log2_min_function_alignment(&mut self, align_to: u8) { + self.min_alignment = self.min_alignment.max( + 1u32.checked_shl(u32::from(align_to)) + .expect("log2_min_function_alignment too large"), + ); + } } impl Extend for MachBuffer { diff --git a/cranelift/codegen/src/machinst/lower.rs b/cranelift/codegen/src/machinst/lower.rs index ea4fda7fc8..cfe7fd9f90 100644 --- a/cranelift/codegen/src/machinst/lower.rs +++ b/cranelift/codegen/src/machinst/lower.rs @@ -382,6 +382,7 @@ impl<'func, I: VCodeInst> Lower<'func, I> { block_order, constants, VCodeBuildDirection::Backward, + flags.log2_min_function_alignment(), ); // We usually need two VRegs per instruction result, plus extras for @@ -871,7 +872,7 @@ impl<'func, I: VCodeInst> Lower<'func, I> { self.vcode.end_bb(); } - fn lower_clif_branches>( + fn lower_clif_branch>( &mut self, backend: &B, // Lowered block index: @@ -882,7 +883,7 @@ impl<'func, I: VCodeInst> Lower<'func, I> { targets: &[MachLabel], ) -> CodegenResult<()> { trace!( - "lower_clif_branches: block {} branch {:?} targets {:?}", + "lower_clif_branch: block {} branch {:?} targets {:?}", block, branch, targets, @@ -908,31 +909,17 @@ impl<'func, I: VCodeInst> Lower<'func, I> { } fn lower_branch_blockparam_args(&mut self, block: BlockIndex) { + let mut branch_arg_vregs: SmallVec<[Reg; 16]> = smallvec![]; + // TODO: why not make `block_order` public? for succ_idx in 0..self.vcode.block_order().succ_indices(block).1.len() { - // Avoid immutable borrow by explicitly indexing. - let (opt_inst, succs) = self.vcode.block_order().succ_indices(block); - let inst = opt_inst.expect("lower_branch_blockparam_args called on a critical edge!"); - let succ = succs[succ_idx]; - - // The use of `succ_idx` to index `branch_destination` is valid on the assumption that - // the traversal order defined in `visit_block_succs` mirrors the order returned by - // `branch_destination`. If that assumption is violated, the branch targets returned - // here will not match the clif. - let branches = self.f.dfg.insts[inst].branch_destination(&self.f.dfg.jump_tables); - let branch_args = branches[succ_idx].args_slice(&self.f.dfg.value_lists); - - let mut branch_arg_vregs: SmallVec<[Reg; 16]> = smallvec![]; - for &arg in branch_args { - debug_assert!(self.f.dfg.value_is_real(arg)); - let regs = self.put_value_in_regs(arg); - branch_arg_vregs.extend_from_slice(regs.regs()); - } - self.vcode.add_succ(succ, &branch_arg_vregs[..]); + branch_arg_vregs.clear(); + let (succ, args) = self.collect_block_call(block, succ_idx, &mut branch_arg_vregs); + self.vcode.add_succ(succ, args); } } - fn collect_branches_and_targets( + fn collect_branch_and_targets( &self, bindex: BlockIndex, _bb: Block, @@ -944,6 +931,56 @@ impl<'func, I: VCodeInst> Lower<'func, I> { opt_inst } + /// Collect the outgoing block-call arguments for a given edge out + /// of a lowered block. + fn collect_block_call<'a>( + &mut self, + block: BlockIndex, + succ_idx: usize, + buffer: &'a mut SmallVec<[Reg; 16]>, + ) -> (BlockIndex, &'a [Reg]) { + let block_order = self.vcode.block_order(); + let (_, succs) = block_order.succ_indices(block); + let succ = succs[succ_idx]; + let this_lb = block_order.lowered_order()[block.index()]; + let succ_lb = block_order.lowered_order()[succ.index()]; + + let (branch_inst, succ_idx) = match (this_lb, succ_lb) { + (_, LoweredBlock::CriticalEdge { .. }) => { + // The successor is a split-critical-edge block. In this + // case, this block-call has no arguments, and the + // arguments go on the critical edge block's unconditional + // branch instead. + return (succ, &[]); + } + (LoweredBlock::CriticalEdge { pred, succ_idx, .. }, _) => { + // This is a split-critical-edge block. In this case, our + // block-call has the arguments that in the CLIF appear in + // the predecessor's branch to this edge. + let branch_inst = self.f.layout.last_inst(pred).unwrap(); + (branch_inst, succ_idx as usize) + } + + (this, _) => { + let block = this.orig_block().unwrap(); + // Ordinary block, with an ordinary block as + // successor. Take the arguments from the branch. + let branch_inst = self.f.layout.last_inst(block).unwrap(); + (branch_inst, succ_idx) + } + }; + + let block_call = + self.f.dfg.insts[branch_inst].branch_destination(&self.f.dfg.jump_tables)[succ_idx]; + let args = block_call.args_slice(&self.f.dfg.value_lists); + for &arg in args { + debug_assert!(self.f.dfg.value_is_real(arg)); + let regs = self.put_value_in_regs(arg); + buffer.extend_from_slice(regs.regs()); + } + (succ, &buffer[..]) + } + /// Lower the function. pub fn lower>( mut self, @@ -980,39 +1017,22 @@ impl<'func, I: VCodeInst> Lower<'func, I> { // Lower the block body in reverse order (see comment in // `lower_clif_block()` for rationale). - // End branches. + // End branch. if let Some(bb) = lb.orig_block() { - if let Some(branch) = self.collect_branches_and_targets(bindex, bb, &mut targets) { - self.lower_clif_branches(backend, bindex, bb, branch, &targets)?; + if let Some(branch) = self.collect_branch_and_targets(bindex, bb, &mut targets) { + self.lower_clif_branch(backend, bindex, bb, branch, &targets)?; self.finish_ir_inst(self.srcloc(branch)); } } else { // If no orig block, this must be a pure edge block; - // get the successor and emit a jump. Add block params - // according to the one successor, and pass them - // through; note that the successor must have an - // original block. - let (_, succs) = self.vcode.block_order().succ_indices(bindex); - let succ = succs[0]; - - let orig_succ = lowered_order[succ.index()]; - let orig_succ = orig_succ - .orig_block() - .expect("Edge block succ must be body block"); - - let mut branch_arg_vregs: SmallVec<[Reg; 16]> = smallvec![]; - for ty in self.f.dfg.block_param_types(orig_succ) { - let regs = self.vregs.alloc(ty)?; - for ® in regs.regs() { - branch_arg_vregs.push(reg); - let vreg = reg.to_virtual_reg().unwrap(); - self.vcode.add_block_param(vreg); - } - } - self.vcode.add_succ(succ, &branch_arg_vregs[..]); - + // get the successor and emit a jump. This block has + // no block params; and this jump's block-call args + // will be filled in by + // `lower_branch_blockparam_args`. + let succ = self.vcode.block_order().succ_indices(bindex).1[0]; self.emit(I::gen_jump(MachLabel::from_block(succ))); self.finish_ir_inst(Default::default()); + self.lower_branch_blockparam_args(bindex); } // Original block body. diff --git a/cranelift/codegen/src/machinst/vcode.rs b/cranelift/codegen/src/machinst/vcode.rs index c026d723e7..45c58a78ae 100644 --- a/cranelift/codegen/src/machinst/vcode.rs +++ b/cranelift/codegen/src/machinst/vcode.rs @@ -195,6 +195,8 @@ pub struct VCode { /// Facts on VRegs, for proof-carrying code verification. facts: Vec>, + + log2_min_function_alignment: u8, } /// The result of `VCode::emit`. Contains all information computed @@ -281,8 +283,16 @@ impl VCodeBuilder { block_order: BlockLoweringOrder, constants: VCodeConstants, direction: VCodeBuildDirection, + log2_min_function_alignment: u8, ) -> Self { - let vcode = VCode::new(sigs, abi, emit_info, block_order, constants); + let vcode = VCode::new( + sigs, + abi, + emit_info, + block_order, + constants, + log2_min_function_alignment, + ); VCodeBuilder { vcode, @@ -602,6 +612,7 @@ impl VCode { emit_info: I::Info, block_order: BlockLoweringOrder, constants: VCodeConstants, + log2_min_function_alignment: u8, ) -> Self { let n_blocks = block_order.lowered_order().len(); VCode { @@ -630,6 +641,7 @@ impl VCode { constants, debug_value_labels: vec![], facts: vec![], + log2_min_function_alignment, } } @@ -714,6 +726,7 @@ impl VCode { let _tt = timing::vcode_emit(); let mut buffer = MachBuffer::new(); + buffer.set_log2_min_function_alignment(self.log2_min_function_alignment); let mut bb_starts: Vec> = vec![]; // The first M MachLabels are reserved for block indices. diff --git a/cranelift/codegen/src/opts.rs b/cranelift/codegen/src/opts.rs index c22a0ab2e0..ddbbbfcbda 100644 --- a/cranelift/codegen/src/opts.rs +++ b/cranelift/codegen/src/opts.rs @@ -64,6 +64,7 @@ impl Default for InstDataEtorIter<'_, '_, '_> { impl<'a, 'b, 'c> InstDataEtorIter<'a, 'b, 'c> { fn new(root: Value) -> Self { debug_assert_ne!(root, Value::reserved_value()); + trace!("new iter from root {root}"); Self { stack: smallvec![root], _phantom1: PhantomData, @@ -196,6 +197,7 @@ impl<'a, 'b, 'c> generated_code::Context for IsleContext<'a, 'b, 'c> { } fn make_inst_ctor(&mut self, ty: Type, op: &InstructionData) -> Value { + trace!("make_inst_ctor: creating {:?}", op); let value = self.ctx.insert_pure_enode(NewOrExistingInst::New(*op, ty)); trace!("make_inst_ctor: {:?} -> {}", op, value); value diff --git a/cranelift/codegen/src/opts/cprop.isle b/cranelift/codegen/src/opts/cprop.isle index cde054d9d1..06c386d1fb 100644 --- a/cranelift/codegen/src/opts/cprop.isle +++ b/cranelift/codegen/src/opts/cprop.isle @@ -172,6 +172,24 @@ (rule (simplify (select ty (iconst_u _ 0) _ y)) (subsume y)) +;; Reassociate across `==`/`!=` when we can simplify a constant +;; `x + K1 == K2` --> `x == K2 - K1` +(rule (simplify (eq ty1 (iadd ty2 x k1@(iconst _ _)) k2@(iconst _ _))) + (eq ty1 x (isub ty2 k2 k1))) +(rule (simplify (ne ty1 (iadd ty2 x k1@(iconst _ _)) k2@(iconst _ _))) + (ne ty1 x (isub ty2 k2 k1))) +;; `x - K1 == K2` --> `x == K2 + K1` +(rule (simplify (eq ty1 (isub ty2 x k1@(iconst _ _)) k2@(iconst _ _))) + (eq ty1 x (iadd ty2 k2 k1))) +(rule (simplify (ne ty1 (isub ty2 x k1@(iconst _ _)) k2@(iconst _ _))) + (ne ty1 x (iadd ty2 k2 k1))) +;; `x + K1 == y + K2` --> `x == y + (K2 - K1)` +(rule (simplify (eq ty1 (iadd ty2 x k1@(iconst _ _)) (iadd ty3 y k2@(iconst _ _)))) + (eq ty1 x (iadd ty2 y (isub ty3 k2 k1)))) +(rule (simplify (ne ty1 (iadd ty2 x k1@(iconst _ _)) (iadd ty3 y k2@(iconst _ _)))) + (ne ty1 x (iadd ty2 y (isub ty3 k2 k1)))) +;; An icmp rule normalizes (eq sub sub), so we don't need to handle it here. + ;; Replace subtraction by a "negative" constant with addition. ;; Notably, this gives `x - (-1) == x + 1`, so other patterns don't have to ;; match the subtract-negative-one version too. diff --git a/cranelift/codegen/src/opts/icmp.isle b/cranelift/codegen/src/opts/icmp.isle index c919525ccd..613b20f2b2 100644 --- a/cranelift/codegen/src/opts/icmp.isle +++ b/cranelift/codegen/src/opts/icmp.isle @@ -13,6 +13,36 @@ (rule (simplify (slt (ty_int ty) x x)) (subsume (iconst_u ty 0))) (rule (simplify (sle (ty_int ty) x x)) (subsume (iconst_u ty 1))) +;; For integers, adding the same thing on both sides of an equality check +;; (or an inequality check) doesn't change the result. +;; This applies for arbitrary expressions, not just constants, so we need to +;; check all possible orderings since nothing normalizes it. + +(rule (simplify (eq ty (iadd _ a k) (iadd _ b k))) + (subsume (eq ty a b))) +(rule (simplify (eq ty (iadd _ a k) (iadd _ k b))) + (subsume (eq ty a b))) +(rule (simplify (eq ty (iadd _ k a) (iadd _ b k))) + (subsume (eq ty a b))) +(rule (simplify (eq ty (iadd _ k a) (iadd _ k b))) + (subsume (eq ty a b))) +(rule (simplify (ne ty (iadd _ a k) (iadd _ b k))) + (subsume (ne ty a b))) +(rule (simplify (ne ty (iadd _ a k) (iadd _ k b))) + (subsume (ne ty a b))) +(rule (simplify (ne ty (iadd _ k a) (iadd _ b k))) + (subsume (ne ty a b))) +(rule (simplify (ne ty (iadd _ k a) (iadd _ k b))) + (subsume (ne ty a b))) + +;; To avoid repeating all the above rules again, normalize isub to iadd +;; (a - b) == (c - d) ⟹ (a + d) == (c + b) + +(rule (simplify (eq ty1 (isub ty2 a b) (isub ty3 c d))) + (eq ty1 (iadd ty2 a d) (iadd ty3 c b))) +(rule (simplify (ne ty1 (isub ty2 a b) (isub ty3 c d))) + (ne ty1 (iadd ty2 a d) (iadd ty3 c b))) + ;; Optimize icmp-of-icmp. ;; ne(icmp(ty, cc, x, y), 0) == icmp(ty, cc, x, y) ;; e.g. neq(ugt(x, y), 0) == ugt(x, y) diff --git a/cranelift/codegen/src/opts/shifts.isle b/cranelift/codegen/src/opts/shifts.isle index e6aa9e58f2..dcfbd3ab10 100644 --- a/cranelift/codegen/src/opts/shifts.isle +++ b/cranelift/codegen/src/opts/shifts.isle @@ -81,11 +81,11 @@ ;; ;; Note that the shift is required to be >0 to ensure this doesn't accidentally ;; try to `ireduce` a type to itself, which isn't a valid use of `ireduce`. -(rule (simplify (sshr ty (ishl ty x (iconst _ shift)) (iconst _ shift))) +(rule (simplify (sshr (ty_int ty) (ishl ty x (iconst _ shift)) (iconst _ shift))) (if-let (u64_from_imm64 (u64_nonzero shift_u64)) shift) (if-let ty_small (shift_amt_to_type (u64_sub (ty_bits ty) shift_u64))) (sextend ty (ireduce ty_small x))) -(rule (simplify (ushr ty (ishl ty x (iconst _ shift)) (iconst _ shift))) +(rule (simplify (ushr (ty_int ty) (ishl ty x (iconst _ shift)) (iconst _ shift))) (if-let (u64_from_imm64 (u64_nonzero shift_u64)) shift) (if-let ty_small (shift_amt_to_type (u64_sub (ty_bits ty) shift_u64))) (uextend ty (ireduce ty_small x))) diff --git a/cranelift/codegen/src/prelude_lower.isle b/cranelift/codegen/src/prelude_lower.isle index f01c847ff6..860a1072b4 100644 --- a/cranelift/codegen/src/prelude_lower.isle +++ b/cranelift/codegen/src/prelude_lower.isle @@ -467,6 +467,13 @@ (rule (side_effect_concat (SideEffectNoResult.Inst2 inst1 inst2) (SideEffectNoResult.Inst inst3)) (SideEffectNoResult.Inst3 inst1 inst2 inst3)) +;; In certain cases (e.g., RMW lowerings) it can be useful to emit an invalid +;; register after a side-effectful instruction. +(decl side_effect_as_invalid (SideEffectNoResult) InstOutput) +(rule (side_effect_as_invalid inst) + (let ((_ InstOutput (side_effect inst))) + (invalid_reg))) + ;;;; Helpers for Working with Flags ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Newtype wrapper around `MInst` for instructions that are used for their diff --git a/cranelift/codegen/src/scoped_hash_map.rs b/cranelift/codegen/src/scoped_hash_map.rs index 170a6140d2..dae53df33f 100644 --- a/cranelift/codegen/src/scoped_hash_map.rs +++ b/cranelift/codegen/src/scoped_hash_map.rs @@ -1,18 +1,17 @@ //! `ScopedHashMap` //! -//! This module defines a struct `ScopedHashMap` which defines a `FxHashMap`-like -//! container that has a concept of scopes that can be entered and exited, such that -//! values inserted while inside a scope aren't visible outside the scope. +//! This module defines a struct `ScopedHashMap` which +//! defines a `FxHashMap`-like container that has a concept of scopes +//! that can be entered and exited, such that values inserted while +//! inside a scope aren't visible outside the scope. +//! +//! The context type `C` is given to `CtxEq` and `CtxHash` methods on +//! the key values so that keys do not need to be fully +//! self-contained. -use core::hash::Hash; -use rustc_hash::FxHashMap; +use crate::ctxhash::{CtxEq, CtxHash, CtxHashMap}; use smallvec::{smallvec, SmallVec}; -#[cfg(not(feature = "std"))] -use crate::fx::FxHasher; -#[cfg(not(feature = "std"))] -type Hasher = core::hash::BuildHasherDefault; - struct Val { value: V, level: u32, @@ -21,7 +20,7 @@ struct Val { /// A view into an occupied entry in a `ScopedHashMap`. It is part of the `Entry` enum. pub struct OccupiedEntry<'a, K: 'a, V: 'a> { - entry: super::hash_map::OccupiedEntry<'a, K, Val>, + entry: crate::ctxhash::OccupiedEntry<'a, K, Val>, } impl<'a, K, V> OccupiedEntry<'a, K, V> { @@ -41,8 +40,8 @@ pub struct VacantEntry<'a, K: 'a, V: 'a> { /// Where to insert from a `VacantEntry`. May be vacant or occupied in /// the underlying map because of lazy (generation-based) deletion. enum InsertLoc<'a, K: 'a, V: 'a> { - Vacant(super::hash_map::VacantEntry<'a, K, Val>), - Occupied(super::hash_map::OccupiedEntry<'a, K, Val>), + Vacant(crate::ctxhash::VacantEntry<'a, K, Val>), + Occupied(crate::ctxhash::OccupiedEntry<'a, K, Val>), } impl<'a, K, V> VacantEntry<'a, K, V> { @@ -58,7 +57,7 @@ impl<'a, K, V> VacantEntry<'a, K, V> { v.insert(val); } InsertLoc::Occupied(mut o) => { - o.insert(val); + *o.get_mut() = val; } } } @@ -78,30 +77,25 @@ pub enum Entry<'a, K: 'a, V: 'a> { /// Shadowing, where one scope has entries with the same keys as a containing scope, /// is not supported in this implementation. pub struct ScopedHashMap { - map: FxHashMap>, + map: CtxHashMap>, generation_by_depth: SmallVec<[u32; 8]>, generation: u32, } impl ScopedHashMap where - K: PartialEq + Eq + Hash + Clone, + K: Clone, { /// Creates an empty `ScopedHashMap`. + #[allow(dead_code)] // Used in testing. pub fn new() -> Self { - Self { - map: FxHashMap::default(), - generation: 0, - generation_by_depth: smallvec![0], - } + Self::with_capacity(16) } /// Creates an empty `ScopedHashMap` with some pre-allocated capacity. pub fn with_capacity(cap: usize) -> Self { - let mut map = FxHashMap::default(); - map.reserve(cap); Self { - map, + map: CtxHashMap::with_capacity(cap), generation: 0, generation_by_depth: smallvec![0], } @@ -109,18 +103,23 @@ where /// Similar to `FxHashMap::entry`, gets the given key's corresponding entry in the map for /// in-place manipulation. - pub fn entry<'a>(&'a mut self, key: K) -> Entry<'a, K, V> { - self.entry_with_depth(key, self.depth()) + pub fn entry<'a, C>(&'a mut self, ctx: &C, key: K) -> Entry<'a, K, V> + where + C: CtxEq + CtxHash, + { + self.entry_with_depth(ctx, key, self.depth()) } /// Get the entry, setting the scope depth at which to insert. - pub fn entry_with_depth<'a>(&'a mut self, key: K, depth: usize) -> Entry<'a, K, V> { + pub fn entry_with_depth<'a, C>(&'a mut self, ctx: &C, key: K, depth: usize) -> Entry<'a, K, V> + where + C: CtxEq + CtxHash, + { debug_assert!(depth <= self.generation_by_depth.len()); let generation = self.generation_by_depth[depth]; let depth = depth as u32; - use super::hash_map::Entry::*; - match self.map.entry(key) { - Occupied(entry) => { + match self.map.entry(key, ctx) { + crate::ctxhash::Entry::Occupied(entry) => { let entry_generation = entry.get().generation; let entry_depth = entry.get().level as usize; if self.generation_by_depth.get(entry_depth).cloned() == Some(entry_generation) { @@ -133,7 +132,7 @@ where }) } } - Vacant(entry) => Entry::Vacant(VacantEntry { + crate::ctxhash::Entry::Vacant(entry) => Entry::Vacant(VacantEntry { entry: InsertLoc::Vacant(entry), depth, generation, @@ -142,9 +141,12 @@ where } /// Get a value from a key, if present. - pub fn get<'a>(&'a self, key: &K) -> Option<&'a V> { + pub fn get<'a, C>(&'a self, ctx: &C, key: &K) -> Option<&'a V> + where + C: CtxEq + CtxHash, + { self.map - .get(key) + .get(key, ctx) .filter(|entry| { let level = entry.level as usize; self.generation_by_depth.get(level).cloned() == Some(entry.generation) @@ -153,14 +155,20 @@ where } /// Insert a key-value pair if absent. No-op if already exists. - pub fn insert_if_absent(&mut self, key: K, value: V) { - self.insert_if_absent_with_depth(key, value, self.depth()); + pub fn insert_if_absent(&mut self, ctx: &C, key: K, value: V) + where + C: CtxEq + CtxHash, + { + self.insert_if_absent_with_depth(ctx, key, value, self.depth()); } /// Insert a key-value pair if absent, using the given depth for /// the insertion. No-op if already exists. - pub fn insert_if_absent_with_depth(&mut self, key: K, value: V, depth: usize) { - match self.entry_with_depth(key, depth) { + pub fn insert_if_absent_with_depth(&mut self, ctx: &C, key: K, value: V, depth: usize) + where + C: CtxEq + CtxHash, + { + match self.entry_with_depth(ctx, key, depth) { Entry::Vacant(v) => { v.insert(value); } @@ -170,6 +178,21 @@ where } } + /// Insert a key-value pair, using the given depth for the + /// insertion. Removes existing entry and overwrites if already + /// existed. + pub fn insert_with_depth(&mut self, ctx: &C, key: K, value: V, depth: usize) + where + C: CtxEq + CtxHash, + { + let val = Val { + value, + level: depth as u32, + generation: self.generation_by_depth[depth], + }; + self.map.insert(key, val, ctx); + } + /// Enter a new scope. pub fn increment_depth(&mut self) { self.generation_by_depth.push(self.generation); @@ -193,67 +216,68 @@ where #[cfg(test)] mod tests { use super::*; + use crate::ctxhash::NullCtx; #[test] fn basic() { let mut map: ScopedHashMap = ScopedHashMap::new(); - match map.entry(0) { + match map.entry(&NullCtx, 0) { Entry::Occupied(_entry) => panic!(), Entry::Vacant(entry) => entry.insert(1), } - match map.entry(2) { + match map.entry(&NullCtx, 2) { Entry::Occupied(_entry) => panic!(), Entry::Vacant(entry) => entry.insert(8), } - match map.entry(2) { + match map.entry(&NullCtx, 2) { Entry::Occupied(entry) => assert!(*entry.get() == 8), Entry::Vacant(_entry) => panic!(), } map.increment_depth(); - match map.entry(2) { + match map.entry(&NullCtx, 2) { Entry::Occupied(entry) => assert!(*entry.get() == 8), Entry::Vacant(_entry) => panic!(), } - match map.entry(1) { + match map.entry(&NullCtx, 1) { Entry::Occupied(_entry) => panic!(), Entry::Vacant(entry) => entry.insert(3), } - match map.entry(1) { + match map.entry(&NullCtx, 1) { Entry::Occupied(entry) => assert!(*entry.get() == 3), Entry::Vacant(_entry) => panic!(), } - match map.entry(0) { + match map.entry(&NullCtx, 0) { Entry::Occupied(entry) => assert!(*entry.get() == 1), Entry::Vacant(_entry) => panic!(), } - match map.entry(2) { + match map.entry(&NullCtx, 2) { Entry::Occupied(entry) => assert!(*entry.get() == 8), Entry::Vacant(_entry) => panic!(), } map.decrement_depth(); - match map.entry(0) { + match map.entry(&NullCtx, 0) { Entry::Occupied(entry) => assert!(*entry.get() == 1), Entry::Vacant(_entry) => panic!(), } - match map.entry(2) { + match map.entry(&NullCtx, 2) { Entry::Occupied(entry) => assert!(*entry.get() == 8), Entry::Vacant(_entry) => panic!(), } map.increment_depth(); - match map.entry(2) { + match map.entry(&NullCtx, 2) { Entry::Occupied(entry) => assert!(*entry.get() == 8), Entry::Vacant(_entry) => panic!(), } - match map.entry(1) { + match map.entry(&NullCtx, 1) { Entry::Occupied(_entry) => panic!(), Entry::Vacant(entry) => entry.insert(4), } - match map.entry(1) { + match map.entry(&NullCtx, 1) { Entry::Occupied(entry) => assert!(*entry.get() == 4), Entry::Vacant(_entry) => panic!(), } - match map.entry(2) { + match map.entry(&NullCtx, 2) { Entry::Occupied(entry) => assert!(*entry.get() == 8), Entry::Vacant(_entry) => panic!(), } @@ -261,30 +285,30 @@ mod tests { map.increment_depth(); map.increment_depth(); map.increment_depth(); - match map.entry(2) { + match map.entry(&NullCtx, 2) { Entry::Occupied(entry) => assert!(*entry.get() == 8), Entry::Vacant(_entry) => panic!(), } - match map.entry(1) { + match map.entry(&NullCtx, 1) { Entry::Occupied(_entry) => panic!(), Entry::Vacant(entry) => entry.insert(5), } - match map.entry(1) { + match map.entry(&NullCtx, 1) { Entry::Occupied(entry) => assert!(*entry.get() == 5), Entry::Vacant(_entry) => panic!(), } - match map.entry(2) { + match map.entry(&NullCtx, 2) { Entry::Occupied(entry) => assert!(*entry.get() == 8), Entry::Vacant(_entry) => panic!(), } map.decrement_depth(); map.decrement_depth(); map.decrement_depth(); - match map.entry(2) { + match map.entry(&NullCtx, 2) { Entry::Occupied(entry) => assert!(*entry.get() == 8), Entry::Vacant(_entry) => panic!(), } - match map.entry(1) { + match map.entry(&NullCtx, 1) { Entry::Occupied(_entry) => panic!(), Entry::Vacant(entry) => entry.insert(3), } @@ -293,18 +317,18 @@ mod tests { #[test] fn insert_arbitrary_depth() { let mut map: ScopedHashMap = ScopedHashMap::new(); - map.insert_if_absent(1, 2); - assert_eq!(map.get(&1), Some(&2)); + map.insert_if_absent(&NullCtx, 1, 2); + assert_eq!(map.get(&NullCtx, &1), Some(&2)); map.increment_depth(); - assert_eq!(map.get(&1), Some(&2)); - map.insert_if_absent(3, 4); - assert_eq!(map.get(&3), Some(&4)); + assert_eq!(map.get(&NullCtx, &1), Some(&2)); + map.insert_if_absent(&NullCtx, 3, 4); + assert_eq!(map.get(&NullCtx, &3), Some(&4)); map.decrement_depth(); - assert_eq!(map.get(&3), None); + assert_eq!(map.get(&NullCtx, &3), None); map.increment_depth(); - map.insert_if_absent_with_depth(3, 4, 0); - assert_eq!(map.get(&3), Some(&4)); + map.insert_if_absent_with_depth(&NullCtx, 3, 4, 0); + assert_eq!(map.get(&NullCtx, &3), Some(&4)); map.decrement_depth(); - assert_eq!(map.get(&3), Some(&4)); + assert_eq!(map.get(&NullCtx, &3), Some(&4)); } } diff --git a/cranelift/codegen/src/settings.rs b/cranelift/codegen/src/settings.rs index d8c2ad198e..a1e4763a55 100644 --- a/cranelift/codegen/src/settings.rs +++ b/cranelift/codegen/src/settings.rs @@ -517,6 +517,7 @@ libcall_call_conv = "isa_default" probestack_size_log2 = 12 probestack_strategy = "outline" bb_padding_log2_minus_one = 0 +log2_min_function_alignment = 0 regalloc_checker = false regalloc_verbose_logs = false enable_alias_analysis = true diff --git a/cranelift/codegen/src/unionfind.rs b/cranelift/codegen/src/unionfind.rs deleted file mode 100644 index da96611ec3..0000000000 --- a/cranelift/codegen/src/unionfind.rs +++ /dev/null @@ -1,143 +0,0 @@ -//! Simple union-find data structure. - -use crate::trace; -use cranelift_entity::{packed_option::ReservedValue, EntityRef, SecondaryMap}; -use std::hash::Hash; -use std::mem::swap; - -/// A union-find data structure. The data structure can allocate -/// `Idx`s, indicating eclasses, and can merge eclasses together. -/// -/// Running `union(a, b)` will change the canonical `Idx` of `a` or `b`. -/// Usually, this is chosen based on what will minimize path lengths, -/// but it is also possible to _pin_ an eclass, such that its canonical `Idx` -/// won't change unless it gets unioned with another pinned eclass. -/// -/// In the context of the egraph pass, merging two pinned eclasses -/// is very unlikely to happen – we do not know a single concrete test case -/// where it does. The only situation where it might happen looks as follows: -/// -/// 1. We encounter terms `A` and `B`, and the optimizer does not find any -/// reason to union them together. -/// 2. We encounter a term `C`, and we rewrite `C -> A`, and separately, `C -> B`. -/// -/// Unless `C` somehow includes some crucial hint without which it is hard to -/// notice that `A = B`, there's probably a rewrite rule that we should add. -/// -/// Worst case, if we do merge two pinned eclasses, some nodes will essentially -/// disappear from the GVN map, which only affects the quality of the generated -/// code. -#[derive(Clone, Debug, PartialEq)] -pub struct UnionFind { - parent: SecondaryMap>, - /// The `rank` table is used to perform the union operations optimally, - /// without creating unnecessarily long paths. Pins are represented by - /// eclasses with a rank of `u8::MAX`. - /// - /// `rank[x]` is the upper bound on the height of the subtree rooted at `x`. - /// The subtree is guaranteed to have at least `2**rank[x]` elements, - /// unless `rank` has been artificially inflated by pinning. - rank: SecondaryMap, - - pub(crate) pinned_union_count: u64, -} - -#[derive(Clone, Debug, PartialEq)] -struct Val(Idx); - -impl Default for Val { - fn default() -> Self { - Self(Idx::reserved_value()) - } -} - -impl UnionFind { - /// Create a new `UnionFind` with the given capacity. - pub fn with_capacity(cap: usize) -> Self { - UnionFind { - parent: SecondaryMap::with_capacity(cap), - rank: SecondaryMap::with_capacity(cap), - pinned_union_count: 0, - } - } - - /// Add an `Idx` to the `UnionFind`, with its own equivalence class - /// initially. All `Idx`s must be added before being queried or - /// unioned. - pub fn add(&mut self, id: Idx) { - debug_assert!(id != Idx::reserved_value()); - self.parent[id] = Val(id); - } - - /// Find the canonical `Idx` of a given `Idx`. - pub fn find(&self, mut node: Idx) -> Idx { - while node != self.parent[node].0 { - node = self.parent[node].0; - } - node - } - - /// Find the canonical `Idx` of a given `Idx`, updating the data - /// structure in the process so that future queries for this `Idx` - /// (and others in its chain up to the root of the equivalence - /// class) will be faster. - pub fn find_and_update(&mut self, mut node: Idx) -> Idx { - // "Path halving" mutating find (Tarjan and Van Leeuwen). - debug_assert!(node != Idx::reserved_value()); - while node != self.parent[node].0 { - let next = self.parent[self.parent[node].0].0; - debug_assert!(next != Idx::reserved_value()); - self.parent[node] = Val(next); - node = next; - } - debug_assert!(node != Idx::reserved_value()); - node - } - - /// Request a stable identifier for `node`. - /// - /// After an `union` operation, the canonical representative of one - /// of the eclasses being merged together necessarily changes. If a pinned - /// eclass is merged with a non-pinned eclass, it'll be the other eclass - /// whose representative will change. - /// - /// If two pinned eclasses are unioned, one of the pins gets broken, - /// which is reported in the statistics for the pass. No concrete test case - /// which triggers this is known. - pub fn pin_index(&mut self, mut node: Idx) -> Idx { - node = self.find_and_update(node); - self.rank[node] = u8::MAX; - node - } - - /// Merge the equivalence classes of the two `Idx`s. - pub fn union(&mut self, a: Idx, b: Idx) { - let mut a = self.find_and_update(a); - let mut b = self.find_and_update(b); - - if a == b { - return; - } - - if self.rank[a] < self.rank[b] { - swap(&mut a, &mut b); - } else if self.rank[a] == self.rank[b] { - self.rank[a] = self.rank[a].checked_add(1).unwrap_or_else( - #[cold] - || { - // Both `a` and `b` are pinned. - // - // This should only occur if we rewrite X -> Y and X -> Z, - // yet neither Y -> Z nor Z -> Y can be established without - // the "hint" provided by X. This probably means we're - // missing an optimization rule. - self.pinned_union_count += 1; - u8::MAX - }, - ); - } - - self.parent[b] = Val(a); - trace!("union: {}, {}", a, b); - } -} diff --git a/cranelift/codegen/src/verifier/mod.rs b/cranelift/codegen/src/verifier/mod.rs index ac95cf0cc2..292e129e1d 100644 --- a/cranelift/codegen/src/verifier/mod.rs +++ b/cranelift/codegen/src/verifier/mod.rs @@ -1766,6 +1766,7 @@ impl<'a> Verifier<'a> { return errors.fatal((block, format!("{block} cannot be empty"))); } for inst in self.func.layout.block_insts(block) { + crate::trace!("verifying {inst:?}: {}", self.func.dfg.display_inst(inst)); self.block_integrity(block, inst, errors)?; self.instruction_integrity(inst, errors)?; self.typecheck(inst, errors)?; diff --git a/cranelift/docs/isle-integration.md b/cranelift/docs/isle-integration.md index e0af45822d..10c3cd8a62 100644 --- a/cranelift/docs/isle-integration.md +++ b/cranelift/docs/isle-integration.md @@ -24,18 +24,15 @@ ISLE. Sometimes, it's desirable to see what code is actually generated. By default, the generated code is placed in a Cargo-managed path in `target/`. If you want -to see the source instead, invoke Cargo with the optional feature -`isle-in-source-tree` as follows: +to see the source instead, invoke Cargo with the environment variable +`ISLE_SOURCE_DIR` set to another directory, as follows: ```shell -$ cargo check -p cranelift-codegen --features isle-in-source-tree +$ ISLE_SOURCE_DIR=`pwd`/isle-sources cargo check -p cranelift-codegen ``` -This will place the ISLE source in `cranelift/codegen/isle_generated_code/`, -where you can inspect it, debug by setting breakpoints in it, etc. Note that if -you later build without this feature, the build system will require you to -delete the directory. This is to ensure that no out-of-date copies exist, which -could cause significant confusion. +This will place the ISLE source in `./isle-sources`, where you can inspect it, +debug by setting breakpoints in it, etc. If there are any errors during ISLE compilation (e.g., a type mismatch), you will see a basic error message with a file, line number, and one-line error. To diff --git a/cranelift/entity/src/lib.rs b/cranelift/entity/src/lib.rs index 6a899ab42b..afe5751c7a 100644 --- a/cranelift/entity/src/lib.rs +++ b/cranelift/entity/src/lib.rs @@ -287,7 +287,7 @@ pub use self::keys::Keys; pub use self::list::{EntityList, ListPool}; pub use self::map::SecondaryMap; pub use self::primary::PrimaryMap; -pub use self::set::EntitySet; +pub use self::set::{EntitySet, SetIter}; pub use self::signed::Signed; pub use self::sparse::{SparseMap, SparseMapValue, SparseSet}; pub use self::unsigned::Unsigned; diff --git a/cranelift/entity/src/set.rs b/cranelift/entity/src/set.rs index 3c5925a219..bcf70cda8e 100644 --- a/cranelift/entity/src/set.rs +++ b/cranelift/entity/src/set.rs @@ -2,6 +2,7 @@ use crate::keys::Keys; use crate::EntityRef; +use core::fmt; use core::marker::PhantomData; use cranelift_bitset::CompoundBitSet; @@ -9,7 +10,11 @@ use cranelift_bitset::CompoundBitSet; /// /// The `EntitySet` data structure uses the dense index space to implement a set with a bitvector. /// Like `SecondaryMap`, an `EntitySet` is used to associate secondary information with entities. -#[derive(Debug, Clone)] +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr( + feature = "enable-serde", + derive(serde_derive::Serialize, serde_derive::Deserialize) +)] pub struct EntitySet where K: EntityRef, @@ -18,6 +23,15 @@ where unused: PhantomData, } +impl fmt::Debug for EntitySet +where + K: EntityRef, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_set().entries(self.keys()).finish() + } +} + impl Default for EntitySet { fn default() -> Self { Self { @@ -75,12 +89,60 @@ where self.bitset.clear() } - /// Iterate over all the keys in this set. + /// Iterate over all the keys up to the maximum in this set. + /// + /// This will yield intermediate keys on the way up to the max key, even if + /// they are not contained within the set. + /// + /// ``` + /// use cranelift_entity::{entity_impl, EntityRef, EntitySet}; + /// + /// #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] + /// struct Entity(u32); + /// entity_impl!(Entity); + /// + /// let mut set = EntitySet::new(); + /// set.insert(Entity::new(2)); + /// + /// let mut keys = set.keys(); + /// assert_eq!(keys.next(), Some(Entity::new(0))); + /// assert_eq!(keys.next(), Some(Entity::new(1))); + /// assert_eq!(keys.next(), Some(Entity::new(2))); + /// assert!(keys.next().is_none()); + /// ``` pub fn keys(&self) -> Keys { Keys::with_len(self.bitset.max().map_or(0, |x| x + 1)) } + /// Iterate over the elements of this set. + /// + /// ``` + /// use cranelift_entity::{entity_impl, EntityRef, EntitySet}; + /// + /// #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] + /// struct Entity(u32); + /// entity_impl!(Entity); + /// + /// let mut set = EntitySet::new(); + /// set.insert(Entity::new(2)); + /// set.insert(Entity::new(3)); + /// + /// let mut iter = set.iter(); + /// assert_eq!(iter.next(), Some(Entity::new(2))); + /// assert_eq!(iter.next(), Some(Entity::new(3))); + /// assert!(iter.next().is_none()); + /// ``` + pub fn iter(&self) -> SetIter { + SetIter { + inner: self.bitset.iter(), + _phantom: PhantomData, + } + } + /// Insert the element at `k`. + /// + /// Returns `true` if `k` was not present in the set, i.e. this is a + /// newly-added element. Returns `false` otherwise. pub fn insert(&mut self, k: K) -> bool { let index = k.index(); self.bitset.insert(index) @@ -93,6 +155,25 @@ where } } +/// An iterator over the elements in an `EntitySet`. +pub struct SetIter<'a, K> { + inner: cranelift_bitset::compound::Iter<'a>, + _phantom: PhantomData, +} + +impl Iterator for SetIter<'_, K> +where + K: EntityRef, +{ + type Item = K; + + #[inline] + fn next(&mut self) -> Option { + let k = self.inner.next()?; + Some(K::new(k)) + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/cranelift/filetests/filetests/egraph/arithmetic.clif b/cranelift/filetests/filetests/egraph/arithmetic.clif index 2e64d73d86..5dea343003 100644 --- a/cranelift/filetests/filetests/egraph/arithmetic.clif +++ b/cranelift/filetests/filetests/egraph/arithmetic.clif @@ -124,6 +124,17 @@ block0(v0: i32): ; check: return v6 } +function %mul2_ne_add(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = iconst.i32 2 + v3 = imul v0, v2 + v4 = iadd v1, v0 + v5 = icmp ne v3, v4 + return v5 + ; check: v11 = icmp ne v0, v1 + ; check: return v11 +} + function %mul_minus_one(i32) -> i32 { block0(v0: i32): v1 = iconst.i32 0xffff_ffff ; -1 diff --git a/cranelift/filetests/filetests/egraph/cprop.clif b/cranelift/filetests/filetests/egraph/cprop.clif index ab9a125454..0835662d6c 100644 --- a/cranelift/filetests/filetests/egraph/cprop.clif +++ b/cranelift/filetests/filetests/egraph/cprop.clif @@ -231,6 +231,58 @@ block0: ; check: v3 = iconst.i8 0 ; nextln: return v3 +function %icmp_sums_same_addend(i32, i32, i32) -> i8 { +block0(v0: i32, v1: i32, v2: i32): + v3 = iadd v0, v2 + v4 = iadd v1, v2 + v5 = icmp eq v3, v4 + return v5 +} + +; check: v6 = icmp eq v0, v1 +; nextln: return v6 + +function %icmp_subs_same_minuend(i32, i32, i32) -> i8 { +block0(v0: i32, v1: i32, v2: i32): + v3 = isub v0, v1 + v4 = isub v0, v2 + v5 = icmp eq v3, v4 + return v5 +} + +; check: v9 = icmp eq v2, v1 +; nextln: return v9 + +function %icmp_sums_const_addends(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v3 = iconst.i32 123 + v4 = iconst.i32 456 + v5 = iadd v0, v3 + v6 = iadd v1, v4 + v7 = icmp eq v5, v6 + return v7 +} + +; check: v9 = iconst.i32 333 +; check: v19 = iadd v1, v9 +; check: v20 = icmp eq v0, v19 +; nextln: return v20 + +function %icmp_subs_const_addends(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v3 = iconst.i32 123 + v4 = iconst.i32 456 + v5 = isub v3, v0 + v6 = isub v4, v1 + v7 = icmp eq v5, v6 + return v7 +} + +; check: v42 = iconst.i32 333 +; check: v51 = iadd v0, v42 +; check: v52 = icmp eq v1, v51 +; nextln: return v52 + function %ireduce_iconst() -> i8 { block0: v1 = iconst.i16 -10 diff --git a/cranelift/filetests/filetests/egraph/issue-10409.clif b/cranelift/filetests/filetests/egraph/issue-10409.clif new file mode 100644 index 0000000000..49bd7e6f21 --- /dev/null +++ b/cranelift/filetests/filetests/egraph/issue-10409.clif @@ -0,0 +1,28 @@ +test optimize +set opt_level=speed_and_size +target x86_64 + +function u0:0(i64x2) -> i64x2 system_v { + block0(v1: i64x2): + v2 = iconst.i8 96 + v3 = ishl v1, v2 + v4 = ushr v3, v2 + return v4 +} + +; check: v5 = iconst.i8 32 +; next: v6 = ishl v1, v5 +; next: v8 = ushr v6, v5 +; next: return v8 + +function u0:1(i64) -> i64 system_v { + block0(v1: i64): + v2 = iconst.i8 32 + v3 = ishl v1, v2 + v4 = ushr v3, v2 + return v4 +} + +; check: v5 = ireduce.i32 v1 +; next: v6 = uextend.i64 v5 +; next: return v6 diff --git a/cranelift/filetests/filetests/egraph/load-hoist.clif b/cranelift/filetests/filetests/egraph/load-hoist.clif index 37cf9ad360..bebb723672 100644 --- a/cranelift/filetests/filetests/egraph/load-hoist.clif +++ b/cranelift/filetests/filetests/egraph/load-hoist.clif @@ -2,7 +2,7 @@ test optimize set opt_level=speed_and_size target x86_64 -function %foo(i64 vmctx, i64, i32, i32) -> i32 fast { +function %can_move_hoists(i64 vmctx, i64, i32, i32) -> i32 fast { gv0 = vmctx gv1 = load.i64 notrap aligned readonly gv0+8 gv2 = load.i64 notrap aligned gv1 @@ -15,7 +15,7 @@ function %foo(i64 vmctx, i64, i32, i32) -> i32 fast { jump block2(v5, v2, v3) ; v5 = 0 block2(v6: i32, v7: i32, v15: i32): - v9 = load.i64 notrap aligned readonly v0+80 + v9 = load.i64 notrap aligned readonly can_move v0+80 v8 = uextend.i64 v7 v10 = iadd v9, v8 v11 = load.i32 little heap v10 @@ -37,8 +37,46 @@ function %foo(i64 vmctx, i64, i32, i32) -> i32 fast { return v12 } -; check: v9 = load.i64 notrap aligned readonly v0+80 +; check: v9 = load.i64 notrap aligned readonly can_move v0+80 ; check: block2(v6: i32, v7: i32, v15: i32): ; check: v10 = iadd.i64 v9, v8 ; check: v11 = load.i32 little heap v10 ; check: brif v19, block2(v12, v21, v19), block4 + +function %non_can_move_does_not_hoist(i64 vmctx, i64, i32, i32) -> i32 fast { + gv0 = vmctx + gv1 = load.i64 notrap aligned readonly gv0+8 + gv2 = load.i64 notrap aligned gv1 + gv3 = vmctx + gv4 = load.i64 notrap aligned readonly gv3+80 + stack_limit = gv2 + + block0(v0: i64, v1: i64, v2: i32, v3: i32): + v5 = iconst.i32 0 + jump block2(v5, v2, v3) ; v5 = 0 + + block2(v6: i32, v7: i32, v15: i32): + v9 = load.i64 notrap aligned readonly v0+80 + v8 = uextend.i64 v7 + v10 = iadd v9, v8 + v11 = load.i32 little heap v10 + v16 = iconst.i32 1 + v17 = isub v15, v16 ; v16 = 1 + v12 = iadd v6, v11 + v4 -> v12 + v13 = iconst.i32 4 + v14 = iadd v7, v13 ; v13 = 4 + brif v17, block2(v12, v14, v17), block4 + + block4: + jump block3 + + block3: + jump block1 + + block1: + return v12 +} + +; check: block2(v6: i32, v7: i32, v15: i32): +; nextln: v9 = load.i64 notrap aligned readonly v0+80 diff --git a/cranelift/filetests/filetests/egraph/not_a_load.clif b/cranelift/filetests/filetests/egraph/not_a_load.clif index 6fdeed24c3..ac311dd406 100644 --- a/cranelift/filetests/filetests/egraph/not_a_load.clif +++ b/cranelift/filetests/filetests/egraph/not_a_load.clif @@ -16,7 +16,7 @@ function u0:1302(i64) -> i64 system_v { ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock addq %rdi, 0(%rdi) +; lock addq %rdi, (%rdi) ; movq %rdi, %rax ; movq %rbp, %rsp ; popq %rbp diff --git a/cranelift/filetests/filetests/egraph/shifts.clif b/cranelift/filetests/filetests/egraph/shifts.clif index 8e8192d3e0..f0c0e0754d 100644 --- a/cranelift/filetests/filetests/egraph/shifts.clif +++ b/cranelift/filetests/filetests/egraph/shifts.clif @@ -86,8 +86,8 @@ block0(v0: i32): v3 = ishl v2, v1 v4 = ushr v3, v1 return v4 - ; check: v7 = uextend.i64 v0 - ; check: return v7 + ; check: v6 = uextend.i64 v0 + ; check: return v6 } function %sextend_shift_32_64_signed(i32) -> i64 { @@ -129,8 +129,8 @@ block0(v0: i8): v3 = ishl v2, v1 v4 = ushr v3, v1 return v4 - ; check: v7 = uextend.i64 v0 - ; check: return v7 + ; check: v6 = uextend.i64 v0 + ; check: return v6 } function %sextend_shift_8_64_signed(i8) -> i64 { @@ -271,9 +271,9 @@ block0(v0: i32): v1 = ishl_imm v0, 24 v2 = ushr_imm v1, 24 return v2 - ; check: v7 = ireduce.i8 v0 - ; check: v8 = uextend.i32 v7 - ; check: return v8 + ; check: v5 = ireduce.i8 v0 + ; check: v6 = uextend.i32 v5 + ; check: return v6 } function %i32_shl_ushr_16_to_ireduce(i32) -> i32 { @@ -281,9 +281,9 @@ block0(v0: i32): v1 = ishl_imm v0, 16 v2 = ushr_imm v1, 16 return v2 - ; check: v7 = ireduce.i16 v0 - ; check: v8 = uextend.i32 v7 - ; check: return v8 + ; check: v5 = ireduce.i16 v0 + ; check: v6 = uextend.i32 v5 + ; check: return v6 } function %i64_shl_ushr_8_to_ireduce(i64) -> i64 { @@ -291,9 +291,9 @@ block0(v0: i64): v1 = ishl_imm v0, 56 v2 = ushr_imm v1, 56 return v2 - ; check: v7 = ireduce.i8 v0 - ; check: v8 = uextend.i64 v7 - ; check: return v8 + ; check: v5 = ireduce.i8 v0 + ; check: v6 = uextend.i64 v5 + ; check: return v6 } function %i64_shl_ushr_16_to_ireduce(i64) -> i64 { @@ -301,9 +301,9 @@ block0(v0: i64): v1 = ishl_imm v0, 48 v2 = ushr_imm v1, 48 return v2 - ; check: v7 = ireduce.i16 v0 - ; check: v8 = uextend.i64 v7 - ; check: return v8 + ; check: v5 = ireduce.i16 v0 + ; check: v6 = uextend.i64 v5 + ; check: return v6 } function %i64_shl_ushr_32_to_ireduce(i64) -> i64 { @@ -311,9 +311,9 @@ block0(v0: i64): v1 = ishl_imm v0, 32 v2 = ushr_imm v1, 32 return v2 - ; check: v7 = ireduce.i32 v0 - ; check: v8 = uextend.i64 v7 - ; check: return v8 + ; check: v5 = ireduce.i32 v0 + ; check: v6 = uextend.i64 v5 + ; check: return v6 } function %ishl_amt_type_ireduce(i8, i16) -> i8 { diff --git a/cranelift/filetests/filetests/isa/aarch64/amodes.clif b/cranelift/filetests/filetests/isa/aarch64/amodes.clif index e4a6721654..466bb64472 100644 --- a/cranelift/filetests/filetests/isa/aarch64/amodes.clif +++ b/cranelift/filetests/filetests/isa/aarch64/amodes.clif @@ -784,3 +784,33 @@ block0(v0: i64, v1: i32): ; ldr x0, [x0, w1, sxtw #3] ; trap: heap_oob ; ret +function %no_panic(i64, i64) -> i64 { +block0(v0: i64, v1: i64): + v8 = ishl_imm v1, 100 + v9 = iadd v0, v8 + v10 = load.i64 v9 + + v5 = ishl_imm v1, 100 + v6 = iadd v5, v0 + v7 = load.i64 v6 + return v10 +} + +; VCode: +; block0: +; lsl x6, x1, #36 +; ldr x6, [x0, x6] +; lsl x7, x1, #36 +; ldr x7, [x7, x0] +; mov x0, x6 +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; lsl x6, x1, #0x24 +; ldr x6, [x0, x6] ; trap: heap_oob +; lsl x7, x1, #0x24 +; ldr x7, [x7, x0] ; trap: heap_oob +; mov x0, x6 +; ret + diff --git a/cranelift/filetests/filetests/isa/aarch64/cold-blocks.clif b/cranelift/filetests/filetests/isa/aarch64/cold-blocks.clif index 5a377557a9..2bc2781eed 100644 --- a/cranelift/filetests/filetests/isa/aarch64/cold-blocks.clif +++ b/cranelift/filetests/filetests/isa/aarch64/cold-blocks.clif @@ -16,8 +16,8 @@ block2: ; VCode: ; block0: -; mov w5, w0 -; cbnz x5, label1 ; b label2 +; mov w4, w0 +; cbnz x4, label1 ; b label2 ; block1: ; b label3 ; block2: @@ -28,8 +28,8 @@ block2: ; ; Disassembled: ; block0: ; offset 0x0 -; mov w5, w0 -; cbnz x5, #0xc +; mov w4, w0 +; cbnz x4, #0xc ; block1: ; offset 0x8 ; mov w0, #0x61 ; block2: ; offset 0xc @@ -49,8 +49,8 @@ block2 cold: ; VCode: ; block0: -; mov w5, w0 -; cbnz x5, label1 ; b label2 +; mov w4, w0 +; cbnz x4, label1 ; b label2 ; block1: ; b label3 ; block3: @@ -61,8 +61,8 @@ block2 cold: ; ; Disassembled: ; block0: ; offset 0x0 -; mov w5, w0 -; cbz x5, #0xc +; mov w4, w0 +; cbz x4, #0xc ; block1: ; offset 0x8 ; ret ; block2: ; offset 0xc diff --git a/cranelift/filetests/filetests/isa/aarch64/nan-canonicalization.clif b/cranelift/filetests/filetests/isa/aarch64/nan-canonicalization.clif index 8ffffcdd2d..bb83982f1d 100644 --- a/cranelift/filetests/filetests/isa/aarch64/nan-canonicalization.clif +++ b/cranelift/filetests/filetests/isa/aarch64/nan-canonicalization.clif @@ -12,7 +12,7 @@ block0(v0: f32x4, v1: f32x4): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; addps %xmm0, %xmm1, %xmm0 +; addps %xmm1, %xmm0 ; movl $2143289344, %r10d ; movd %r10d, %xmm7 ; shufps $0, %xmm7, const(0), %xmm7 diff --git a/cranelift/filetests/filetests/isa/riscv64/bitops-float.clif b/cranelift/filetests/filetests/isa/riscv64/bitops-float.clif index a302407c6d..649dbc6c59 100644 --- a/cranelift/filetests/filetests/isa/riscv64/bitops-float.clif +++ b/cranelift/filetests/filetests/isa/riscv64/bitops-float.clif @@ -22,19 +22,19 @@ block1(v4: f32): ; VCode: ; block0: ; li a0,0 -; fmv.w.x fa1,zero -; fmv.x.w a5,fa1 -; not a1,a5 -; fmv.w.x fa3,a1 -; fmv.x.w a4,fa3 -; fmv.x.w a1,fa3 -; or a2,a4,a1 -; fmv.w.x fa2,a2 -; br_table a0,[MachLabel(1),MachLabel(2)]##tmp1=a2,tmp2=a1 +; fmv.w.x fa5,zero +; fmv.x.w a3,fa5 +; not a5,a3 +; fmv.w.x fa1,a5 +; fmv.x.w a2,fa1 +; fmv.x.w a4,fa1 +; or a1,a2,a4 +; fmv.w.x fa2,a1 +; br_table a0,[MachLabel(1),MachLabel(2)]##tmp1=a4,tmp2=a5 ; block1: ; j label3 ; block2: -; fmv.d fa2,fa1 +; fmv.d fa2,fa5 ; j label3 ; block3: ; ret @@ -42,30 +42,30 @@ block1(v4: f32): ; Disassembled: ; block0: ; offset 0x0 ; mv a0, zero -; fmv.w.x fa1, zero -; fmv.x.w a5, fa1 -; not a1, a5 -; fmv.w.x fa3, a1 -; fmv.x.w a4, fa3 -; fmv.x.w a1, fa3 -; or a2, a4, a1 -; fmv.w.x fa2, a2 +; fmv.w.x fa5, zero +; fmv.x.w a3, fa5 +; not a5, a3 +; fmv.w.x fa1, a5 +; fmv.x.w a2, fa1 +; fmv.x.w a4, fa1 +; or a1, a2, a4 +; fmv.w.x fa2, a1 ; slli t6, a0, 0x20 ; srli t6, t6, 0x20 -; addi a1, zero, 1 -; bltu t6, a1, 0xc -; auipc a1, 0 -; jalr zero, a1, 0x28 -; auipc a2, 0 -; slli a1, t6, 3 -; add a2, a2, a1 -; jalr zero, a2, 0x10 -; auipc a1, 0 -; jalr zero, a1, 0xc +; addi a5, zero, 1 +; bltu t6, a5, 0xc +; auipc a5, 0 +; jalr zero, a5, 0x28 +; auipc a4, 0 +; slli a5, t6, 3 +; add a4, a4, a5 +; jalr zero, a4, 0x10 +; auipc a5, 0 +; jalr zero, a5, 0xc ; block1: ; offset 0x54 ; j 8 ; block2: ; offset 0x58 -; fmv.d fa2, fa1 +; fmv.d fa2, fa5 ; block3: ; offset 0x5c ; ret diff --git a/cranelift/filetests/filetests/isa/riscv64/cold-blocks.clif b/cranelift/filetests/filetests/isa/riscv64/cold-blocks.clif index 98db409e8a..7b6fa896f8 100644 --- a/cranelift/filetests/filetests/isa/riscv64/cold-blocks.clif +++ b/cranelift/filetests/filetests/isa/riscv64/cold-blocks.clif @@ -16,8 +16,8 @@ block2: ; VCode: ; block0: -; sext.w a5,a0 -; bne a5,zero,taken(label1),not_taken(label2) +; sext.w a4,a0 +; bne a4,zero,taken(label1),not_taken(label2) ; block1: ; j label3 ; block2: @@ -28,8 +28,8 @@ block2: ; ; Disassembled: ; block0: ; offset 0x0 -; sext.w a5, a0 -; bnez a5, 8 +; sext.w a4, a0 +; bnez a4, 8 ; block1: ; offset 0x8 ; addi a0, zero, 0x61 ; block2: ; offset 0xc @@ -49,8 +49,8 @@ block2 cold: ; VCode: ; block0: -; sext.w a5,a0 -; bne a5,zero,taken(label1),not_taken(label2) +; sext.w a4,a0 +; bne a4,zero,taken(label1),not_taken(label2) ; block1: ; j label3 ; block3: @@ -61,8 +61,8 @@ block2 cold: ; ; Disassembled: ; block0: ; offset 0x0 -; sext.w a5, a0 -; beqz a5, 8 +; sext.w a4, a0 +; beqz a4, 8 ; block1: ; offset 0x8 ; ret ; block2: ; offset 0xc diff --git a/cranelift/filetests/filetests/isa/x64/atomic-rmw.clif b/cranelift/filetests/filetests/isa/x64/atomic-rmw.clif index 628fb64714..6c4a8df01f 100644 --- a/cranelift/filetests/filetests/isa/x64/atomic-rmw.clif +++ b/cranelift/filetests/filetests/isa/x64/atomic-rmw.clif @@ -119,7 +119,7 @@ block0(v0: i64, v1: i64): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock addq %rsi, 0(%rdi) +; lock addq %rsi, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -144,7 +144,7 @@ block0(v0: i64, v1: i32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock addl %esi, 0(%rdi) +; lock addl %esi, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -169,7 +169,7 @@ block0(v0: i64, v1: i16): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock addw %si, 0(%rdi) +; lock addw %si, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -194,7 +194,7 @@ block0(v0: i64, v1: i8): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock addb %sil, 0(%rdi) +; lock addb %sil, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -335,7 +335,7 @@ block0(v0: i64, v1: i64): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock subq %rsi, 0(%rdi) +; lock subq %rsi, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -360,7 +360,7 @@ block0(v0: i64, v1: i32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock subl %esi, 0(%rdi) +; lock subl %esi, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -385,7 +385,7 @@ block0(v0: i64, v1: i16): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock subw %si, 0(%rdi) +; lock subw %si, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -410,7 +410,7 @@ block0(v0: i64, v1: i8): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock subb %sil, 0(%rdi) +; lock subb %sil, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -551,7 +551,7 @@ block0(v0: i64, v1: i64): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock andq %rsi, 0(%rdi) +; lock andq %rsi, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -576,7 +576,7 @@ block0(v0: i64, v1: i32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock andl %esi, 0(%rdi) +; lock andl %esi, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -601,7 +601,7 @@ block0(v0: i64, v1: i16): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock andw %si, 0(%rdi) +; lock andw %si, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -626,7 +626,7 @@ block0(v0: i64, v1: i8): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock andb %sil, 0(%rdi) +; lock andb %sil, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -887,7 +887,7 @@ block0(v0: i64, v1: i64): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock orq %rsi, 0(%rdi) +; lock orq %rsi, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -912,7 +912,7 @@ block0(v0: i64, v1: i32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock orl %esi, 0(%rdi) +; lock orl %esi, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -937,7 +937,7 @@ block0(v0: i64, v1: i16): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock orw %si, 0(%rdi) +; lock orw %si, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -962,7 +962,7 @@ block0(v0: i64, v1: i8): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock orb %sil, 0(%rdi) +; lock orb %sil, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -1103,7 +1103,7 @@ block0(v0: i64, v1: i64): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock xorq %rsi, 0(%rdi) +; lock xorq %rsi, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -1128,7 +1128,7 @@ block0(v0: i64, v1: i32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock xorl %esi, 0(%rdi) +; lock xorl %esi, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -1153,7 +1153,7 @@ block0(v0: i64, v1: i16): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock xorw %si, 0(%rdi) +; lock xorw %si, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret @@ -1178,7 +1178,7 @@ block0(v0: i64, v1: i8): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; lock xorb %sil, 0(%rdi) +; lock xorb %sil, (%rdi) ; movq %rbp, %rsp ; popq %rbp ; ret diff --git a/cranelift/filetests/filetests/isa/x64/branches.clif b/cranelift/filetests/filetests/isa/x64/branches.clif index 061b43b56b..545fd4b99e 100644 --- a/cranelift/filetests/filetests/isa/x64/branches.clif +++ b/cranelift/filetests/filetests/isa/x64/branches.clif @@ -1039,28 +1039,28 @@ block1(v5: i32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; movl $1, %r10d -; movl $2, %r11d -; movl $3, %esi +; movl $1, %r8d +; movl $2, %ecx +; movl $3, %edx ; movl $4, %eax -; movl $4, %r8d -; movl %edi, %r9d -; cmpl %r8d, %r9d -; cmovbl %r9d, %r8d, %r8d -; br_table %r8, %rdi, %rcx +; movl $4, %esi +; movl %edi, %edi +; cmpl %esi, %edi +; cmovbl %edi, %esi, %esi +; br_table %rsi, %r10, %r9 ; block1: ; jmp label6 ; block2: -; movq %r10, %rax +; movq %r8, %rax ; jmp label6 ; block3: -; movq %r11, %rax +; movq %rcx, %rax ; jmp label6 ; block4: -; movq %r11, %rax +; movq %rcx, %rax ; jmp label6 ; block5: -; movq %rsi, %rax +; movq %rdx, %rax ; jmp label6 ; block6: ; movq %rbp, %rsp @@ -1072,18 +1072,18 @@ block1(v5: i32): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; movl $1, %r10d -; movl $2, %r11d -; movl $3, %esi +; movl $1, %r8d +; movl $2, %ecx +; movl $3, %edx ; movl $4, %eax -; movl $4, %r8d -; movl %edi, %r9d -; cmpl %r8d, %r9d -; cmovbl %r9d, %r8d -; leaq 9(%rip), %rdi -; movslq (%rdi, %r8, 4), %rcx -; addq %rcx, %rdi -; jmpq *%rdi +; movl $4, %esi +; movl %edi, %edi +; cmpl %esi, %edi +; cmovbl %edi, %esi +; leaq 0xa(%rip), %r10 +; movslq (%r10, %rsi, 4), %r9 +; addq %r9, %r10 +; jmpq *%r10 ; sbbl %eax, (%rax) ; addb %al, (%rax) ; andl %eax, (%rax) @@ -1094,20 +1094,20 @@ block1(v5: i32): ; addb %al, (%rax) ; xorb $0, %al ; addb %al, (%rax) -; block2: ; offset 0x4e -; jmp 0x6e -; block3: ; offset 0x53 -; movq %r10, %rax -; jmp 0x6e -; block4: ; offset 0x5b -; movq %r11, %rax -; jmp 0x6e -; block5: ; offset 0x63 -; movq %r11, %rax -; jmp 0x6e -; block6: ; offset 0x6b -; movq %rsi, %rax -; block7: ; offset 0x6e +; block2: ; offset 0x4a +; jmp 0x6a +; block3: ; offset 0x4f +; movq %r8, %rax +; jmp 0x6a +; block4: ; offset 0x57 +; movq %rcx, %rax +; jmp 0x6a +; block5: ; offset 0x5f +; movq %rcx, %rax +; jmp 0x6a +; block6: ; offset 0x67 +; movq %rdx, %rax +; block7: ; offset 0x6a ; movq %rbp, %rsp ; popq %rbp ; retq diff --git a/cranelift/filetests/filetests/isa/x64/crit-edge.clif b/cranelift/filetests/filetests/isa/x64/crit-edge.clif new file mode 100644 index 0000000000..99cecae46b --- /dev/null +++ b/cranelift/filetests/filetests/isa/x64/crit-edge.clif @@ -0,0 +1,82 @@ +test compile precise-output +target x86_64 + +function %f(i32) -> i32 { + block0(v0: i32): + v1 = iadd_imm.i32 v0, 1 + brif v0, block1(v0), block2(v1) + + block1(v2: i32): + brif v2, block3(v0), block4(v1) + + block2(v3: i32): + brif v3, block3(v1), block4(v0) + + block3(v4: i32): + return v4 + + block4(v5: i32): + return v5 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; lea 1(%rdi), %eax +; testl %edi, %edi +; jnz label4; j label1 +; block1: +; testl %eax, %eax +; jnz label2; j label3 +; block2: +; jmp label8 +; block3: +; movq %rdi, %rax +; jmp label7 +; block4: +; testl %edi, %edi +; jnz label5; j label6 +; block5: +; movq %rdi, %rax +; jmp label8 +; block6: +; jmp label7 +; block7: +; movq %rbp, %rsp +; popq %rbp +; ret +; block8: +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; leal 1(%rdi), %eax +; testl %edi, %edi +; jne 0x1f +; block2: ; offset 0xf +; testl %eax, %eax +; jne 0x34 +; block3: ; offset 0x17 +; movq %rdi, %rax +; jmp 0x2f +; block4: ; offset 0x1f +; testl %edi, %edi +; je 0x2f +; block5: ; offset 0x27 +; movq %rdi, %rax +; jmp 0x34 +; block6: ; offset 0x2f +; movq %rbp, %rsp +; popq %rbp +; retq +; block7: ; offset 0x34 +; movq %rbp, %rsp +; popq %rbp +; retq + diff --git a/cranelift/filetests/filetests/isa/x64/f128const.clif b/cranelift/filetests/filetests/isa/x64/f128const.clif index 22ee804d6d..8d96cbc872 100644 --- a/cranelift/filetests/filetests/isa/x64/f128const.clif +++ b/cranelift/filetests/filetests/isa/x64/f128const.clif @@ -12,7 +12,7 @@ block0(): ; movq %rsp, %rbp ; block0: ; uninit %xmm0 -; xorps %xmm0, %xmm0, %xmm0 +; xorps %xmm0, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret diff --git a/cranelift/filetests/filetests/isa/x64/f16const.clif b/cranelift/filetests/filetests/isa/x64/f16const.clif index edcaf2ac29..8687801024 100644 --- a/cranelift/filetests/filetests/isa/x64/f16const.clif +++ b/cranelift/filetests/filetests/isa/x64/f16const.clif @@ -12,7 +12,7 @@ block0(): ; movq %rsp, %rbp ; block0: ; uninit %xmm0 -; xorps %xmm0, %xmm0, %xmm0 +; xorps %xmm0, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret diff --git a/cranelift/filetests/filetests/isa/x64/fabs.clif b/cranelift/filetests/filetests/isa/x64/fabs.clif index c8b621285c..28523f44d1 100644 --- a/cranelift/filetests/filetests/isa/x64/fabs.clif +++ b/cranelift/filetests/filetests/isa/x64/fabs.clif @@ -13,7 +13,7 @@ block0(v0: f32): ; block0: ; movl $2147483647, %eax ; movd %eax, %xmm4 -; andps %xmm0, %xmm4, %xmm0 +; andps %xmm4, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -42,7 +42,7 @@ block0(v0: f64): ; block0: ; movabsq $9223372036854775807, %rax ; movq %rax, %xmm4 -; andpd %xmm0, %xmm4, %xmm0 +; andpd %xmm4, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -72,7 +72,7 @@ block0(v0: f32x4): ; uninit %xmm4 ; pcmpeqd %xmm4, %xmm4, %xmm4 ; psrld %xmm4, $1, %xmm4 -; andps %xmm0, %xmm4, %xmm0 +; andps %xmm4, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -102,7 +102,7 @@ block0(v0: f64x2): ; uninit %xmm4 ; pcmpeqd %xmm4, %xmm4, %xmm4 ; psrlq %xmm4, $1, %xmm4 -; andpd %xmm0, %xmm4, %xmm0 +; andpd %xmm4, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret diff --git a/cranelift/filetests/filetests/isa/x64/fastcall.clif b/cranelift/filetests/filetests/isa/x64/fastcall.clif index b12e545223..8050b97f8e 100644 --- a/cranelift/filetests/filetests/isa/x64/fastcall.clif +++ b/cranelift/filetests/filetests/isa/x64/fastcall.clif @@ -241,7 +241,7 @@ block0(v0: i64): ; subq %rsp, $48, %rsp ; block0: ; uninit %xmm3 -; xorpd %xmm3, %xmm3, %xmm3 +; xorpd %xmm3, %xmm3 ; cvtsi2sd %xmm3, %rcx, %xmm3 ; movq %rcx, 32(%rsp) ; movq %rcx, 40(%rsp) diff --git a/cranelift/filetests/filetests/isa/x64/fcopysign.clif b/cranelift/filetests/filetests/isa/x64/fcopysign.clif index 19d288482a..0cf64c1c39 100644 --- a/cranelift/filetests/filetests/isa/x64/fcopysign.clif +++ b/cranelift/filetests/filetests/isa/x64/fcopysign.clif @@ -16,8 +16,8 @@ block0(v0: f32, v1: f32): ; movdqa %xmm0, %xmm2 ; movdqa %xmm7, %xmm0 ; andnps %xmm0, %xmm2, %xmm0 -; andps %xmm7, %xmm1, %xmm7 -; orps %xmm0, %xmm7, %xmm0 +; andps %xmm1, %xmm7 +; orps %xmm7, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -53,7 +53,7 @@ block0(v0: f64, v1: f64): ; movdqa %xmm0, %xmm2 ; movdqa %xmm7, %xmm0 ; andnpd %xmm0, %xmm2, %xmm0 -; andpd %xmm7, %xmm1, %xmm7 +; andpd %xmm1, %xmm7 ; orpd %xmm7, %xmm0 ; movq %rbp, %rsp ; popq %rbp diff --git a/cranelift/filetests/filetests/isa/x64/fcvt.clif b/cranelift/filetests/filetests/isa/x64/fcvt.clif index ae506aa096..0d73f6c486 100644 --- a/cranelift/filetests/filetests/isa/x64/fcvt.clif +++ b/cranelift/filetests/filetests/isa/x64/fcvt.clif @@ -12,7 +12,7 @@ block0(v0: i8): ; movq %rsp, %rbp ; block0: ; uninit %xmm0 -; xorps %xmm0, %xmm0, %xmm0 +; xorps %xmm0, %xmm0 ; movsbl %dil, %r9d ; cvtsi2ss %xmm0, %r9d, %xmm0 ; movq %rbp, %rsp @@ -42,7 +42,7 @@ block0(v0: i16): ; movq %rsp, %rbp ; block0: ; uninit %xmm0 -; xorps %xmm0, %xmm0, %xmm0 +; xorps %xmm0, %xmm0 ; movswl %di, %r9d ; cvtsi2ss %xmm0, %r9d, %xmm0 ; movq %rbp, %rsp @@ -72,7 +72,7 @@ block0(v0: i32): ; movq %rsp, %rbp ; block0: ; uninit %xmm0 -; xorps %xmm0, %xmm0, %xmm0 +; xorps %xmm0, %xmm0 ; cvtsi2ss %xmm0, %edi, %xmm0 ; movq %rbp, %rsp ; popq %rbp @@ -100,7 +100,7 @@ block0(v0: i64): ; movq %rsp, %rbp ; block0: ; uninit %xmm0 -; xorps %xmm0, %xmm0, %xmm0 +; xorps %xmm0, %xmm0 ; cvtsi2ss %xmm0, %rdi, %xmm0 ; movq %rbp, %rsp ; popq %rbp @@ -128,7 +128,7 @@ block0(v0: i8): ; movq %rsp, %rbp ; block0: ; uninit %xmm0 -; xorpd %xmm0, %xmm0, %xmm0 +; xorpd %xmm0, %xmm0 ; movsbl %dil, %r9d ; cvtsi2sd %xmm0, %r9d, %xmm0 ; movq %rbp, %rsp @@ -158,7 +158,7 @@ block0(v0: i16): ; movq %rsp, %rbp ; block0: ; uninit %xmm0 -; xorpd %xmm0, %xmm0, %xmm0 +; xorpd %xmm0, %xmm0 ; movswl %di, %r9d ; cvtsi2sd %xmm0, %r9d, %xmm0 ; movq %rbp, %rsp @@ -188,7 +188,7 @@ block0(v0: i32): ; movq %rsp, %rbp ; block0: ; uninit %xmm0 -; xorpd %xmm0, %xmm0, %xmm0 +; xorpd %xmm0, %xmm0 ; cvtsi2sd %xmm0, %edi, %xmm0 ; movq %rbp, %rsp ; popq %rbp @@ -216,7 +216,7 @@ block0(v0: i64): ; movq %rsp, %rbp ; block0: ; uninit %xmm0 -; xorpd %xmm0, %xmm0, %xmm0 +; xorpd %xmm0, %xmm0 ; cvtsi2sd %xmm0, %rdi, %xmm0 ; movq %rbp, %rsp ; popq %rbp @@ -276,15 +276,15 @@ block0(v0: i8, v1: i16, v2: i32, v3: i64): ; movq %rsp, %rbp ; block0: ; uninit %xmm0 -; xorps %xmm0, %xmm0, %xmm0 +; xorps %xmm0, %xmm0 ; movzbq %dil, %r8 ; cvtsi2ss %xmm0, %r8, %xmm0 ; uninit %xmm6 -; xorps %xmm6, %xmm6, %xmm6 +; xorps %xmm6, %xmm6 ; movzwq %si, %r8 ; cvtsi2ss %xmm6, %r8, %xmm6 ; uninit %xmm7 -; xorps %xmm7, %xmm7, %xmm7 +; xorps %xmm7, %xmm7 ; movl %edx, %r8d ; cvtsi2ss %xmm7, %r8, %xmm7 ; u64_to_f32_seq %rcx, %xmm4, %r8, %rdx @@ -339,7 +339,7 @@ block0(v0: i32x4): ; movq %rsp, %rbp ; block0: ; unpcklps %xmm0, const(0), %xmm0 -; subpd %xmm0, const(1), %xmm0 +; subpd (%rip), %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -390,8 +390,8 @@ block0(v0: i32x4): ; cvtdq2ps %xmm3, %xmm1 ; psrld %xmm0, $1, %xmm0 ; cvtdq2ps %xmm0, %xmm0 -; addps %xmm0, %xmm0, %xmm0 -; addps %xmm0, %xmm1, %xmm0 +; addps %xmm0, %xmm0 +; addps %xmm1, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -1065,13 +1065,13 @@ block0(v0: f32x4): ; movq %rsp, %rbp ; block0: ; uninit %xmm6 -; xorps %xmm6, %xmm6, %xmm6 +; xorps %xmm6, %xmm6 ; maxps %xmm0, %xmm6, %xmm0 ; pcmpeqd %xmm6, %xmm6, %xmm6 ; psrld %xmm6, $1, %xmm6 ; cvtdq2ps %xmm6, %xmm7 ; cvttps2dq %xmm0, %xmm6 -; subps %xmm0, %xmm7, %xmm0 +; subps %xmm7, %xmm0 ; cmpps $2, %xmm7, %xmm0, %xmm7 ; cvttps2dq %xmm0, %xmm0 ; pxor %xmm0, %xmm7, %xmm0 @@ -1117,7 +1117,7 @@ block0(v0: f32x4): ; block0: ; movdqa %xmm0, %xmm4 ; cmpps $0, %xmm4, %xmm0, %xmm4 -; andps %xmm0, %xmm4, %xmm0 +; andps %xmm4, %xmm0 ; pxor %xmm4, %xmm0, %xmm4 ; cvttps2dq %xmm0, %xmm1 ; movdqa %xmm1, %xmm0 @@ -1163,10 +1163,10 @@ block0(v0: i64x2): ; movdqa %xmm1, %xmm7 ; psrlq %xmm0, $32, %xmm0 ; por %xmm0, const(2), %xmm0 -; subpd %xmm0, const(3), %xmm0 +; subpd (%rip), %xmm0 ; movdqa %xmm0, %xmm1 ; movdqa %xmm7, %xmm0 -; addpd %xmm0, %xmm1, %xmm0 +; addpd %xmm1, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -1207,7 +1207,7 @@ block0(v0: i64x2): ; movq %rsp, %rbp ; block0: ; uninit %xmm1 -; xorpd %xmm1, %xmm1, %xmm1 +; xorpd %xmm1, %xmm1 ; movdqa %xmm0, %xmm6 ; movq %xmm6, %r9 ; movdqa %xmm1, %xmm0 diff --git a/cranelift/filetests/filetests/isa/x64/floating-point.clif b/cranelift/filetests/filetests/isa/x64/floating-point.clif index 8175a4e833..cf399ebed6 100644 --- a/cranelift/filetests/filetests/isa/x64/floating-point.clif +++ b/cranelift/filetests/filetests/isa/x64/floating-point.clif @@ -13,7 +13,7 @@ block0(v0: f64): ; block0: ; movabsq $9223372036854775807, %rax ; movq %rax, %xmm4 -; andpd %xmm0, %xmm4, %xmm0 +; andpd %xmm4, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -44,7 +44,7 @@ block0(v0: i64): ; movsd 0(%rdi), %xmm0 ; movabsq $9223372036854775807, %rcx ; movq %rcx, %xmm5 -; andpd %xmm0, %xmm5, %xmm0 +; andpd %xmm5, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret diff --git a/cranelift/filetests/filetests/isa/x64/fneg.clif b/cranelift/filetests/filetests/isa/x64/fneg.clif index 7a8c77d4ed..de0ba6f149 100644 --- a/cranelift/filetests/filetests/isa/x64/fneg.clif +++ b/cranelift/filetests/filetests/isa/x64/fneg.clif @@ -13,7 +13,7 @@ block0(v0: f32): ; block0: ; movl $-2147483648, %eax ; movd %eax, %xmm4 -; xorps %xmm0, %xmm4, %xmm0 +; xorps %xmm4, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -42,7 +42,7 @@ block0(v0: f64): ; block0: ; movabsq $-9223372036854775808, %rax ; movq %rax, %xmm4 -; xorpd %xmm0, %xmm4, %xmm0 +; xorpd %xmm4, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -72,7 +72,7 @@ block0(v0: f32x4): ; uninit %xmm4 ; pcmpeqd %xmm4, %xmm4, %xmm4 ; pslld %xmm4, $31, %xmm4 -; xorps %xmm0, %xmm4, %xmm0 +; xorps %xmm4, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -102,7 +102,7 @@ block0(v0: f64x2): ; uninit %xmm4 ; pcmpeqd %xmm4, %xmm4, %xmm4 ; psllq %xmm4, $63, %xmm4 -; xorpd %xmm0, %xmm4, %xmm0 +; xorpd %xmm4, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret diff --git a/cranelift/filetests/filetests/isa/x64/fpromote-demote.clif b/cranelift/filetests/filetests/isa/x64/fpromote-demote.clif index c064b2b6b8..6931e0d789 100644 --- a/cranelift/filetests/filetests/isa/x64/fpromote-demote.clif +++ b/cranelift/filetests/filetests/isa/x64/fpromote-demote.clif @@ -13,7 +13,7 @@ block0(v0: f32): ; block0: ; movdqa %xmm0, %xmm5 ; uninit %xmm0 -; xorpd %xmm0, %xmm0, %xmm0 +; xorpd %xmm0, %xmm0 ; movdqa %xmm5, %xmm7 ; cvtss2sd %xmm0, %xmm7, %xmm0 ; movq %rbp, %rsp @@ -52,7 +52,7 @@ block0(v1: i64, v2: f32): ; lea rsp(0 + virtual offset), %r8 ; movss %xmm0, 0(%r8) ; uninit %xmm0 -; xorpd %xmm0, %xmm0, %xmm0 +; xorpd %xmm0, %xmm0 ; cvtss2sd %xmm0, 0(%r8), %xmm0 ; addq %rsp, $16, %rsp ; movq %rbp, %rsp @@ -86,7 +86,7 @@ block0(v0: f64): ; block0: ; movdqa %xmm0, %xmm5 ; uninit %xmm0 -; xorps %xmm0, %xmm0, %xmm0 +; xorps %xmm0, %xmm0 ; movdqa %xmm5, %xmm7 ; cvtsd2ss %xmm0, %xmm7, %xmm0 ; movq %rbp, %rsp @@ -125,7 +125,7 @@ block0(v1: i64, v2: f64): ; lea rsp(0 + virtual offset), %r8 ; movsd %xmm0, 0(%r8) ; uninit %xmm0 -; xorps %xmm0, %xmm0, %xmm0 +; xorps %xmm0, %xmm0 ; cvtsd2ss %xmm0, 0(%r8), %xmm0 ; addq %rsp, $16, %rsp ; movq %rbp, %rsp diff --git a/cranelift/filetests/filetests/isa/x64/fsqrt.clif b/cranelift/filetests/filetests/isa/x64/fsqrt.clif index be10b19ac4..c916d0b333 100644 --- a/cranelift/filetests/filetests/isa/x64/fsqrt.clif +++ b/cranelift/filetests/filetests/isa/x64/fsqrt.clif @@ -13,7 +13,7 @@ block0(v0: f32): ; block0: ; movdqa %xmm0, %xmm5 ; uninit %xmm0 -; xorps %xmm0, %xmm0, %xmm0 +; xorps %xmm0, %xmm0 ; movdqa %xmm5, %xmm7 ; sqrtss %xmm0, %xmm7, %xmm0 ; movq %rbp, %rsp @@ -45,7 +45,7 @@ block0(v0: f64): ; block0: ; movdqa %xmm0, %xmm5 ; uninit %xmm0 -; xorpd %xmm0, %xmm0, %xmm0 +; xorpd %xmm0, %xmm0 ; movdqa %xmm5, %xmm7 ; sqrtsd %xmm0, %xmm7, %xmm0 ; movq %rbp, %rsp diff --git a/cranelift/filetests/filetests/isa/x64/i128.clif b/cranelift/filetests/filetests/isa/x64/i128.clif index 979ef81148..1a03ba7aa5 100644 --- a/cranelift/filetests/filetests/isa/x64/i128.clif +++ b/cranelift/filetests/filetests/isa/x64/i128.clif @@ -1112,20 +1112,19 @@ block2(v8: i128): ; movq %rsp, %rbp ; block0: ; xorq %rax, %rax, %rax -; xorq %r8, %r8, %r8 ; testb %dl, %dl ; jnz label2; j label1 ; block1: ; addq %rax, $2, %rax -; movq %r8, %rdx -; adcq %rdx, $0, %rdx +; setb %dil +; movzbq %dil, %rdx ; movq %rbp, %rsp ; popq %rbp ; ret ; block2: -; movq %r8, %rdx ; addq %rax, $1, %rax -; adcq %rdx, $0, %rdx +; setb %cl +; movzbq %cl, %rdx ; movq %rbp, %rsp ; popq %rbp ; ret @@ -1136,20 +1135,19 @@ block2(v8: i128): ; movq %rsp, %rbp ; block1: ; offset 0x4 ; xorq %rax, %rax -; xorq %r8, %r8 ; testb %dl, %dl -; jne 0x22 -; block2: ; offset 0x12 +; jne 0x20 +; block2: ; offset 0xf ; addq $2, %rax -; movq %r8, %rdx -; adcq $0, %rdx +; setb %dil +; movzbq %dil, %rdx ; movq %rbp, %rsp ; popq %rbp ; retq -; block3: ; offset 0x22 -; movq %r8, %rdx +; block3: ; offset 0x20 ; addq $1, %rax -; adcq $0, %rdx +; setb %cl +; movzbq %cl, %rdx ; movq %rbp, %rsp ; popq %rbp ; retq @@ -2047,10 +2045,10 @@ block0(v0: i64, v1: i64): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; xorq %rdx, %rdx, %rdx ; movq %rsi, %rax ; addq %rax, 0(%rdi), %rax -; adcq %rdx, $0, %rdx +; setb %r8b +; movzbq %r8b, %rdx ; movq %rbp, %rsp ; popq %rbp ; ret @@ -2060,10 +2058,10 @@ block0(v0: i64, v1: i64): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; xorq %rdx, %rdx ; movq %rsi, %rax ; addq (%rdi), %rax ; trap: heap_oob -; adcq $0, %rdx +; setb %r8b +; movzbq %r8b, %rdx ; movq %rbp, %rsp ; popq %rbp ; retq @@ -2181,3 +2179,37 @@ block0(v0: i128, v1: i128): ; addb %al, (%rax) ; addb %al, (%rax) +function %uadd_overflow_as_i128(i64, i64) -> i64, i64 { +block0(v0: i64, v1: i64): + v2 = uextend.i128 v0 + v3 = uextend.i128 v1 + v4 = iadd v2, v3 + v5, v6 = isplit v4 + return v5, v6 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; addq %rax, %rsi, %rax +; setb %r8b +; movzbq %r8b, %rdx +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; addq %rsi, %rax +; setb %r8b +; movzbq %r8b, %rdx +; movq %rbp, %rsp +; popq %rbp +; retq + diff --git a/cranelift/filetests/filetests/isa/x64/nan-canonicalization-sse41.clif b/cranelift/filetests/filetests/isa/x64/nan-canonicalization-sse41.clif index b29003307f..f2dbee6031 100644 --- a/cranelift/filetests/filetests/isa/x64/nan-canonicalization-sse41.clif +++ b/cranelift/filetests/filetests/isa/x64/nan-canonicalization-sse41.clif @@ -12,7 +12,7 @@ block0(v0: f32x4, v1: f32x4): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; addps %xmm0, %xmm1, %xmm0 +; addps %xmm1, %xmm0 ; movl $2143289344, %r10d ; movd %r10d, %xmm7 ; shufps $0, %xmm7, const(0), %xmm7 diff --git a/cranelift/filetests/filetests/isa/x64/nan-canonicalization.clif b/cranelift/filetests/filetests/isa/x64/nan-canonicalization.clif index 144a19654b..c59bae7583 100644 --- a/cranelift/filetests/filetests/isa/x64/nan-canonicalization.clif +++ b/cranelift/filetests/filetests/isa/x64/nan-canonicalization.clif @@ -12,15 +12,15 @@ block0(v0: f32x4, v1: f32x4): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; addps %xmm0, %xmm1, %xmm0 +; addps %xmm1, %xmm0 ; movdqa %xmm0, %xmm1 ; movl $2143289344, %esi ; movd %esi, %xmm5 ; shufps $0, %xmm5, const(0), %xmm5 ; cmpps $3, %xmm0, %xmm1, %xmm0 -; andps %xmm5, %xmm0, %xmm5 +; andps %xmm0, %xmm5 ; andnps %xmm0, %xmm1, %xmm0 -; orps %xmm0, %xmm5, %xmm0 +; orps %xmm5, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -66,7 +66,7 @@ block0(v0: f64, v1: f64): ; movabsq $9221120237041090560, %r11 ; movq %r11, %xmm5 ; cmppd $3, %xmm0, %xmm7, %xmm0 -; andpd %xmm5, %xmm0, %xmm5 +; andpd %xmm0, %xmm5 ; andnpd %xmm0, %xmm7, %xmm0 ; orpd %xmm5, %xmm0 ; movq %rbp, %rsp @@ -105,9 +105,9 @@ block0(v0: f32, v1: f32): ; movl $2143289344, %r11d ; movd %r11d, %xmm5 ; cmpps $3, %xmm0, %xmm7, %xmm0 -; andps %xmm5, %xmm0, %xmm5 +; andps %xmm0, %xmm5 ; andnps %xmm0, %xmm7, %xmm0 -; orps %xmm0, %xmm5, %xmm0 +; orps %xmm5, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret diff --git a/cranelift/filetests/filetests/isa/x64/narrowing.clif b/cranelift/filetests/filetests/isa/x64/narrowing.clif index d46d1c9980..e1d17c5dc3 100644 --- a/cranelift/filetests/filetests/isa/x64/narrowing.clif +++ b/cranelift/filetests/filetests/isa/x64/narrowing.clif @@ -65,7 +65,7 @@ block0(v0: f64x2): ; block0: ; movdqa %xmm0, %xmm3 ; cmppd $0, %xmm3, %xmm0, %xmm3 -; andps %xmm3, const(0), %xmm3 +; andps (%rip), %xmm3 ; minpd %xmm0, %xmm3, %xmm0 ; cvttpd2dq %xmm0, %xmm0 ; movq %rbp, %rsp diff --git a/cranelift/filetests/filetests/isa/x64/simd-bitwise-compile.clif b/cranelift/filetests/filetests/isa/x64/simd-bitwise-compile.clif index 335833332a..55d4b89be8 100644 --- a/cranelift/filetests/filetests/isa/x64/simd-bitwise-compile.clif +++ b/cranelift/filetests/filetests/isa/x64/simd-bitwise-compile.clif @@ -11,7 +11,7 @@ block0(v0: f32x4, v1: f32x4): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; andps %xmm0, %xmm1, %xmm0 +; andps %xmm1, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -36,7 +36,7 @@ block0(v0: f64x2, v1: f64x2): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; andpd %xmm0, %xmm1, %xmm0 +; andpd %xmm1, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -86,7 +86,7 @@ block0(v0: f32x4, v1: f32x4): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; orps %xmm0, %xmm1, %xmm0 +; orps %xmm1, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -161,7 +161,7 @@ block0(v0: f32x4, v1: f32x4): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; xorps %xmm0, %xmm1, %xmm0 +; xorps %xmm1, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -186,7 +186,7 @@ block0(v0: f64x2, v1: f64x2): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; xorpd %xmm0, %xmm1, %xmm0 +; xorpd %xmm1, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -265,9 +265,9 @@ block0(v0: f32x4, v1: f32x4, v2: f32x4): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; andps %xmm1, %xmm0, %xmm1 +; andps %xmm0, %xmm1 ; andnps %xmm0, %xmm2, %xmm0 -; orps %xmm0, %xmm1, %xmm0 +; orps %xmm1, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -294,7 +294,7 @@ block0(v0: f64x2, v1: f64x2, v2: f64x2): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; andpd %xmm1, %xmm0, %xmm1 +; andpd %xmm0, %xmm1 ; andnpd %xmm0, %xmm2, %xmm0 ; orpd %xmm1, %xmm0 ; movq %rbp, %rsp diff --git a/cranelift/filetests/filetests/isa/x64/simd-float-min-max.clif b/cranelift/filetests/filetests/isa/x64/simd-float-min-max.clif index 4ca19dce7f..5d5603d0d9 100644 --- a/cranelift/filetests/filetests/isa/x64/simd-float-min-max.clif +++ b/cranelift/filetests/filetests/isa/x64/simd-float-min-max.clif @@ -17,10 +17,10 @@ block0(v0: i64, v1: f32x4): ; maxps %xmm0, %xmm4, %xmm0 ; maxps %xmm4, %xmm6, %xmm4 ; movdqa %xmm0, %xmm1 -; xorps %xmm1, %xmm4, %xmm1 -; orps %xmm0, %xmm1, %xmm0 +; xorps %xmm4, %xmm1 +; orps %xmm1, %xmm0 ; movdqa %xmm0, %xmm4 -; subps %xmm4, %xmm1, %xmm4 +; subps %xmm1, %xmm4 ; cmpps $3, %xmm0, %xmm0, %xmm0 ; psrld %xmm0, $10, %xmm0 ; andnps %xmm0, %xmm4, %xmm0 @@ -64,10 +64,10 @@ block0(v0: i64, v1: f32x4): ; movdqa %xmm0, %xmm1 ; minps %xmm1, %xmm4, %xmm1 ; minps %xmm4, %xmm0, %xmm4 -; orps %xmm1, %xmm4, %xmm1 +; orps %xmm4, %xmm1 ; movdqa %xmm1, %xmm0 ; cmpps $3, %xmm0, %xmm4, %xmm0 -; orps %xmm1, %xmm0, %xmm1 +; orps %xmm0, %xmm1 ; psrld %xmm0, $10, %xmm0 ; andnps %xmm0, %xmm1, %xmm0 ; movq %rbp, %rsp @@ -109,10 +109,10 @@ block0(v0: i64, v1: f64x2): ; maxpd %xmm0, %xmm4, %xmm0 ; maxpd %xmm4, %xmm6, %xmm4 ; movdqa %xmm0, %xmm1 -; xorpd %xmm1, %xmm4, %xmm1 +; xorpd %xmm4, %xmm1 ; orpd %xmm1, %xmm0 ; movdqa %xmm0, %xmm4 -; subpd %xmm4, %xmm1, %xmm4 +; subpd %xmm1, %xmm4 ; cmppd $3, %xmm0, %xmm0, %xmm0 ; psrlq %xmm0, $13, %xmm0 ; andnpd %xmm0, %xmm4, %xmm0 diff --git a/cranelift/filetests/filetests/isa/x64/uunarrow.clif b/cranelift/filetests/filetests/isa/x64/uunarrow.clif index 57fdf011cb..e2391ab778 100644 --- a/cranelift/filetests/filetests/isa/x64/uunarrow.clif +++ b/cranelift/filetests/filetests/isa/x64/uunarrow.clif @@ -14,11 +14,11 @@ block0(v0: f64x2): ; movq %rsp, %rbp ; block0: ; uninit %xmm3 -; xorpd %xmm3, %xmm3, %xmm3 +; xorpd %xmm3, %xmm3 ; maxpd %xmm0, %xmm3, %xmm0 ; minpd %xmm0, const(0), %xmm0 ; roundpd $3, %xmm0, %xmm0 -; addpd %xmm0, const(1), %xmm0 +; addpd (%rip), %xmm0 ; shufps $136, %xmm0, %xmm3, %xmm0 ; movq %rbp, %rsp ; popq %rbp diff --git a/cranelift/filetests/filetests/isa/x64/very-carefully-sink-loads-in-float-compares.clif b/cranelift/filetests/filetests/isa/x64/very-carefully-sink-loads-in-float-compares.clif index 2e07692623..d856484790 100644 --- a/cranelift/filetests/filetests/isa/x64/very-carefully-sink-loads-in-float-compares.clif +++ b/cranelift/filetests/filetests/isa/x64/very-carefully-sink-loads-in-float-compares.clif @@ -184,8 +184,8 @@ block1(v8: i32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; movss 0(%rdi), %xmm1 -; ucomiss %xmm1, %xmm0 +; movss 0(%rdi), %xmm6 +; ucomiss %xmm6, %xmm0 ; jp,nz label2; j label1 ; block1: ; movq %rsi, %rax @@ -203,8 +203,8 @@ block1(v8: i32): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; movss (%rdi), %xmm1 -; ucomiss %xmm1, %xmm0 +; movss (%rdi), %xmm6 +; ucomiss %xmm6, %xmm0 ; jp 0x1f ; jne 0x1f ; block2: ; offset 0x17 @@ -230,8 +230,8 @@ block1(v8: i32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; movss 0(%rdi), %xmm1 -; ucomiss %xmm0, %xmm1 +; movss 0(%rdi), %xmm6 +; ucomiss %xmm0, %xmm6 ; jp,nz label2; j label1 ; block1: ; movq %rsi, %rax @@ -249,8 +249,8 @@ block1(v8: i32): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; movss (%rdi), %xmm1 -; ucomiss %xmm0, %xmm1 +; movss (%rdi), %xmm6 +; ucomiss %xmm0, %xmm6 ; jp 0x1f ; jne 0x1f ; block2: ; offset 0x17 @@ -278,8 +278,8 @@ block2(v7: i32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; movss 0(%rdi), %xmm3 -; ucomiss %xmm3, %xmm0 +; movss 0(%rdi), %xmm7 +; ucomiss %xmm7, %xmm0 ; jp,nz label2; j label1 ; block1: ; movq %rsi, %rax @@ -288,7 +288,7 @@ block2(v7: i32): ; movq %rdx, %rax ; jmp label3 ; block3: -; ucomiss %xmm3, %xmm0 +; ucomiss %xmm7, %xmm0 ; jp,nz label5; j label4 ; block4: ; jmp label6 @@ -305,8 +305,8 @@ block2(v7: i32): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; movss (%rdi), %xmm3 -; ucomiss %xmm3, %xmm0 +; movss (%rdi), %xmm7 +; ucomiss %xmm7, %xmm0 ; jp 0x1f ; jne 0x1f ; block2: ; offset 0x17 @@ -315,7 +315,7 @@ block2(v7: i32): ; block3: ; offset 0x1f ; movq %rdx, %rax ; block4: ; offset 0x22 -; ucomiss %xmm3, %xmm0 +; ucomiss %xmm7, %xmm0 ; jp 0x31 ; je 0x34 ; block5: ; offset 0x31 @@ -340,8 +340,8 @@ block2(v7: i32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; movss 0(%rdi), %xmm3 -; ucomiss %xmm0, %xmm3 +; movss 0(%rdi), %xmm7 +; ucomiss %xmm0, %xmm7 ; jp,nz label2; j label1 ; block1: ; movq %rsi, %rax @@ -350,7 +350,7 @@ block2(v7: i32): ; movq %rdx, %rax ; jmp label3 ; block3: -; ucomiss %xmm0, %xmm3 +; ucomiss %xmm0, %xmm7 ; jp,nz label5; j label4 ; block4: ; jmp label6 @@ -367,8 +367,8 @@ block2(v7: i32): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; movss (%rdi), %xmm3 -; ucomiss %xmm0, %xmm3 +; movss (%rdi), %xmm7 +; ucomiss %xmm0, %xmm7 ; jp 0x1f ; jne 0x1f ; block2: ; offset 0x17 @@ -377,7 +377,7 @@ block2(v7: i32): ; block3: ; offset 0x1f ; movq %rdx, %rax ; block4: ; offset 0x22 -; ucomiss %xmm0, %xmm3 +; ucomiss %xmm0, %xmm7 ; jp 0x31 ; je 0x34 ; block5: ; offset 0x31 @@ -401,12 +401,12 @@ block1(v7: i32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; movss 0(%rdi), %xmm2 -; ucomiss %xmm2, %xmm0 +; movss 0(%rdi), %xmm1 +; ucomiss %xmm1, %xmm0 ; movq %rsi, %rax ; cmovpl %edx, %eax, %eax ; cmovnzl %edx, %eax, %eax -; ucomiss %xmm2, %xmm0 +; ucomiss %xmm1, %xmm0 ; jp,nz label2; j label1 ; block1: ; jmp label3 @@ -423,12 +423,12 @@ block1(v7: i32): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; movss (%rdi), %xmm2 -; ucomiss %xmm2, %xmm0 +; movss (%rdi), %xmm1 +; ucomiss %xmm1, %xmm0 ; movq %rsi, %rax ; cmovpl %edx, %eax ; cmovnel %edx, %eax -; ucomiss %xmm2, %xmm0 +; ucomiss %xmm1, %xmm0 ; jp 0x23 ; je 0x26 ; block2: ; offset 0x23 @@ -452,12 +452,12 @@ block1(v7: i32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; movss 0(%rdi), %xmm2 -; ucomiss %xmm0, %xmm2 +; movss 0(%rdi), %xmm1 +; ucomiss %xmm0, %xmm1 ; movq %rsi, %rax ; cmovpl %edx, %eax, %eax ; cmovnzl %edx, %eax, %eax -; ucomiss %xmm0, %xmm2 +; ucomiss %xmm0, %xmm1 ; jp,nz label2; j label1 ; block1: ; jmp label3 @@ -474,12 +474,12 @@ block1(v7: i32): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; movss (%rdi), %xmm2 -; ucomiss %xmm0, %xmm2 +; movss (%rdi), %xmm1 +; ucomiss %xmm0, %xmm1 ; movq %rsi, %rax ; cmovpl %edx, %eax ; cmovnel %edx, %eax -; ucomiss %xmm0, %xmm2 +; ucomiss %xmm0, %xmm1 ; jp 0x23 ; je 0x26 ; block2: ; offset 0x23 diff --git a/cranelift/filetests/filetests/isa/x64/widening.clif b/cranelift/filetests/filetests/isa/x64/widening.clif index 1bd9ef170b..8e16188adf 100644 --- a/cranelift/filetests/filetests/isa/x64/widening.clif +++ b/cranelift/filetests/filetests/isa/x64/widening.clif @@ -299,7 +299,7 @@ block0(v0: i32x4): ; movq %rsp, %rbp ; block0: ; uninit %xmm3 -; xorps %xmm3, %xmm3, %xmm3 +; xorps %xmm3, %xmm3 ; unpckhps %xmm0, %xmm3, %xmm0 ; movq %rbp, %rsp ; popq %rbp diff --git a/cranelift/frontend/src/frontend.rs b/cranelift/frontend/src/frontend.rs index 53f13630a5..927c8833b9 100644 --- a/cranelift/frontend/src/frontend.rs +++ b/cranelift/frontend/src/frontend.rs @@ -473,12 +473,6 @@ impl<'a> FunctionBuilder<'a> { }; self.handle_ssa_side_effects(side_effects); - // If the variable was declared as needing stack maps, then propagate - // that requirement to all values derived from using the variable. - if self.func_ctx.stack_map_vars.contains(var) { - self.declare_value_needs_stack_map(val); - } - Ok(val) } @@ -494,6 +488,8 @@ impl<'a> FunctionBuilder<'a> { /// an error if the value supplied does not match the type the variable was /// declared to have. pub fn try_def_var(&mut self, var: Variable, val: Value) -> Result<(), DefVariableError> { + log::trace!("try_def_var: {var:?} = {val:?}"); + let var_ty = *self .func_ctx .types @@ -503,11 +499,6 @@ impl<'a> FunctionBuilder<'a> { return Err(DefVariableError::TypeMismatch(var, val)); } - // If `var` needs inclusion in stack maps, then `val` does too. - if self.func_ctx.stack_map_vars.contains(var) { - self.declare_value_needs_stack_map(val); - } - self.func_ctx.ssa.def_var(var, val, self.position.unwrap()); Ok(()) } @@ -720,6 +711,19 @@ impl<'a> FunctionBuilder<'a> { } } + // Propagate the needs-stack-map bit from variables to each of their + // associated values. + for var in self.func_ctx.stack_map_vars.iter() { + for val in self.func_ctx.ssa.values_for_var(var) { + log::trace!("propagating needs-stack-map from {var:?} to {val:?}"); + debug_assert_eq!(self.func.dfg.value_type(val), self.func_ctx.types[var]); + self.func_ctx.stack_map_values.insert(val); + } + } + + // If we have any values that need inclusion in stack maps, then we need + // to run our pass to spill those values to the stack at safepoints and + // generate stack maps. if !self.func_ctx.stack_map_values.is_empty() { self.func_ctx .safepoints @@ -1178,7 +1182,11 @@ impl<'a> FunctionBuilder<'a> { } fn handle_ssa_side_effects(&mut self, side_effects: SideEffects) { - for modified_block in side_effects.instructions_added_to_blocks { + let SideEffects { + instructions_added_to_blocks, + } = side_effects; + + for modified_block in instructions_added_to_blocks { if self.is_pristine(modified_block) { self.func_ctx.status[modified_block] = BlockStatus::Partial; } diff --git a/cranelift/frontend/src/frontend/safepoints.rs b/cranelift/frontend/src/frontend/safepoints.rs index f4a9f8455a..561d7c338e 100644 --- a/cranelift/frontend/src/frontend/safepoints.rs +++ b/cranelift/frontend/src/frontend/safepoints.rs @@ -2402,6 +2402,351 @@ block3: call fn1(v6), stack_map=[i32 @ ss0+0, i32 @ ss1+0, i32 @ ss2+0] call fn0(), stack_map=[i32 @ ss0+0, i32 @ ss1+0, i32 @ ss2+0] jump block2 +} + "#, + ); + } + + fn import_func( + builder: &mut FunctionBuilder, + params: impl IntoIterator, + results: impl IntoIterator, + ) -> ir::FuncRef { + let index = u32::try_from(builder.func.dfg.ext_funcs.len()).unwrap(); + + let name = builder + .func + .declare_imported_user_function(ir::UserExternalName { + namespace: 0, + index, + }); + let name = ir::ExternalName::user(name); + + let mut signature = Signature::new(CallConv::SystemV); + signature + .params + .extend(params.into_iter().map(|ty| AbiParam::new(ty))); + signature + .returns + .extend(results.into_iter().map(|ty| AbiParam::new(ty))); + let signature = builder.func.import_signature(signature); + + builder.import_function(ir::ExtFuncData { + name, + signature, + colocated: true, + }) + } + + #[test] + fn issue_10397_stack_map_vars_and_indirect_block_params() { + let _ = env_logger::try_init(); + + let mut sig = Signature::new(CallConv::SystemV); + if false { + sig.params.push(AbiParam::new(ir::types::I32)); + } + + let mut fn_ctx = FunctionBuilderContext::new(); + let mut func = Function::with_name_signature(ir::UserFuncName::testcase("f"), sig); + let mut builder = FunctionBuilder::new(&mut func, &mut fn_ctx); + + let alloc_struct = import_func(&mut builder, None, Some(ir::types::I32)); + let alloc_array = import_func(&mut builder, None, Some(ir::types::I32)); + let array_init_elem = import_func(&mut builder, Some(ir::types::I32), None); + let type_of = import_func(&mut builder, Some(ir::types::I32), Some(ir::types::I32)); + let ref_test = import_func( + &mut builder, + vec![ir::types::I32, ir::types::I32], + Some(ir::types::I32), + ); + let access_array = import_func(&mut builder, Some(ir::types::I32), None); + let should_continue_inner_loop = import_func(&mut builder, None, Some(ir::types::I32)); + let access_struct = import_func(&mut builder, Some(ir::types::I32), None); + let should_return = import_func(&mut builder, None, Some(ir::types::I32)); + + // This test exercises the combination of declaring stack maps and when + // we need to insert block params during SSA construction. The following + // CLIF uses vars in such a way that it will ultimately require that we + // insert block params. However, some of the inserted block params are + // only ever used in such a way that they are passed as arguments to + // *other* blocks. That is, there are regions where we never use them + // directly, and therefore, if we are only declaring that the variable's + // values need inclusion in stack maps on direct uses, we will + // completely miss these inserted block params. That leads to incomplete + // stack maps, which leads to collecting objects too early, which leads + // to use-after-free bugs. + // + // After inserting safepoint spills and stack map annotations to the + // following pseudo-CLIF, we should have stack map entries for the + // `live: {...}` annotations (or an over-approximation of that + // annotation). + // + // block_entry: + // v0 = call alloc_struct() ;; live: {} + // define var_struct = v0 + // jump block_outer_loop_head + // + // block_outer_loop_head: + // v1 = call alloc_array() ;; live: {struct} + // define var_array = v1 + // v2 = iconst.i32 0 + // jump block_array_init_loop_head(v2) + // + // block_array_init_loop_head(v3): + // v4 = iconst.i32 1 + // v5 = icmp ult v3, v4 + // br_if v5, block_array_init_loop_body, block_array_init_loop_done + // + // block_array_init_loop_body: + // call array_init_elem(v1, v4) ;; live: {struct, array} + // v6 = iconst.i32 1 + // v7 = iadd v4, v6 + // jump block_array_init_loop_head(v7) + // + // block_array_init_loop_done: + // jump block_inner_loop_head + // + // block_inner_loop_head: + // v8 = use var_array + // v9 = iconst.i32 0 + // v10 = icmp eq v8, v9 + // br_if v10, block_ref_test_done(v9), block_ref_test_non_null + // + // block_ref_test_non_null: + // v11 = call type_of(v8) ;; live: {struct, array} + // v12 = iconst.i32 0xbeefbeef + // v13 = icmp eq v11, v12 + // v14 = iconst.i31 1 + // br_if v13, block_ref_test_done(v14), block_ref_test_slow + // + // block_ref_test_slow: + // v15 = call ref_test(v8, v12) ;; live: {struct, array} + // jump block_ref_test_done(v15) + // + // block_ref_test_done(v16): + // trapz v16, user1 + // define var_array = v8 + // call access_array(v8) ;; live: {struct} + // v17 = call should_continue_inner_loop() ;; live: {struct} + // br_if v17, block_inner_loop_head, block_after_inner_loop + // + // block_after_inner_loop: + // v18 = use var_struct + // call access_struct(v18) ;; live: {struct} + // v19 = call should_return() ;; live: {struct} + // br_if v19, block_return, block_outer_loop_head + // + // block_return: + // return + + let var_struct = Variable::from_u32(0); + builder.declare_var(var_struct, cranelift_codegen::ir::types::I32); + builder.declare_var_needs_stack_map(var_struct); + + let var_array = Variable::from_u32(1); + builder.declare_var(var_array, cranelift_codegen::ir::types::I32); + builder.declare_var_needs_stack_map(var_array); + + let block_entry = builder.create_block(); + let block_outer_loop_head = builder.create_block(); + let block_array_init_loop_head = builder.create_block(); + let block_array_init_loop_body = builder.create_block(); + let block_array_init_loop_done = builder.create_block(); + let block_inner_loop_head = builder.create_block(); + let block_ref_test_non_null = builder.create_block(); + let block_ref_test_slow = builder.create_block(); + let block_ref_test_done = builder.create_block(); + let block_after_inner_loop = builder.create_block(); + let block_return = builder.create_block(); + + builder.append_block_params_for_function_params(block_entry); + builder.switch_to_block(block_entry); + builder.seal_block(block_entry); + let call_inst = builder.ins().call(alloc_struct, &[]); + let v0 = builder.func.dfg.first_result(call_inst); + builder.def_var(var_struct, v0); + builder.ins().jump(block_outer_loop_head, &[]); + + builder.switch_to_block(block_outer_loop_head); + let call_inst = builder.ins().call(alloc_array, &[]); + let v1 = builder.func.dfg.first_result(call_inst); + builder.def_var(var_array, v1); + let v2 = builder.ins().iconst(ir::types::I32, 0); + builder.ins().jump(block_array_init_loop_head, &[v2]); + + builder.switch_to_block(block_array_init_loop_head); + let v3 = builder.append_block_param(block_array_init_loop_head, ir::types::I32); + let v4 = builder.ins().iconst(ir::types::I32, 1); + let v5 = builder + .ins() + .icmp(ir::condcodes::IntCC::UnsignedLessThan, v3, v4); + builder.ins().brif( + v5, + block_array_init_loop_body, + &[], + block_array_init_loop_done, + &[], + ); + + builder.switch_to_block(block_array_init_loop_body); + builder.seal_block(block_array_init_loop_body); + builder.ins().call(array_init_elem, &[v1, v4]); + let v6 = builder.ins().iconst(ir::types::I32, 1); + let v7 = builder.ins().iadd(v4, v6); + builder.ins().jump(block_array_init_loop_head, &[v7]); + builder.seal_block(block_array_init_loop_head); + + builder.switch_to_block(block_array_init_loop_done); + builder.seal_block(block_array_init_loop_done); + builder.ins().jump(block_inner_loop_head, &[]); + + builder.switch_to_block(block_inner_loop_head); + let v8 = builder.use_var(var_array); + let v9 = builder.ins().iconst(ir::types::I32, 0); + let v10 = builder.ins().icmp(ir::condcodes::IntCC::Equal, v8, v9); + builder.ins().brif( + v10, + block_ref_test_done, + &[v9], + block_ref_test_non_null, + &[], + ); + + builder.switch_to_block(block_ref_test_non_null); + builder.seal_block(block_ref_test_non_null); + let call_inst = builder.ins().call(type_of, &[v8]); + let v11 = builder.func.dfg.first_result(call_inst); + let v12 = builder.ins().iconst(ir::types::I32, 0xbeefbeef); + let v13 = builder.ins().icmp(ir::condcodes::IntCC::Equal, v11, v12); + let v14 = builder.ins().iconst(ir::types::I32, 1); + builder + .ins() + .brif(v13, block_ref_test_done, &[v14], block_ref_test_slow, &[]); + + builder.switch_to_block(block_ref_test_slow); + builder.seal_block(block_ref_test_slow); + let call_inst = builder.ins().call(ref_test, &[v8, v12]); + let v15 = builder.func.dfg.first_result(call_inst); + builder.ins().jump(block_ref_test_done, &[v15]); + + builder.switch_to_block(block_ref_test_done); + let v16 = builder.append_block_param(block_ref_test_done, ir::types::I32); + builder.seal_block(block_ref_test_done); + builder.ins().trapz(v16, ir::TrapCode::user(1).unwrap()); + builder.def_var(var_array, v8); + builder.ins().call(access_array, &[v8]); + let call_inst = builder.ins().call(should_continue_inner_loop, &[]); + let v17 = builder.func.dfg.first_result(call_inst); + builder + .ins() + .brif(v17, block_inner_loop_head, &[], block_after_inner_loop, &[]); + builder.seal_block(block_inner_loop_head); + + builder.switch_to_block(block_after_inner_loop); + builder.seal_block(block_after_inner_loop); + let v18 = builder.use_var(var_struct); + builder.ins().call(access_struct, &[v18]); + let call_inst = builder.ins().call(should_return, &[]); + let v19 = builder.func.dfg.first_result(call_inst); + builder + .ins() + .brif(v19, block_return, &[], block_outer_loop_head, &[]); + builder.seal_block(block_outer_loop_head); + + builder.switch_to_block(block_return); + builder.seal_block(block_return); + builder.ins().return_(&[]); + + builder.finalize(); + assert_eq_output!( + func.display().to_string(), + r#" +function %f() system_v { + ss0 = explicit_slot 4, align = 4 + ss1 = explicit_slot 4, align = 4 + ss2 = explicit_slot 4, align = 4 + sig0 = () -> i32 system_v + sig1 = () -> i32 system_v + sig2 = (i32) system_v + sig3 = (i32) -> i32 system_v + sig4 = (i32, i32) -> i32 system_v + sig5 = (i32) system_v + sig6 = () -> i32 system_v + sig7 = (i32) system_v + sig8 = () -> i32 system_v + fn0 = colocated u0:0 sig0 + fn1 = colocated u0:1 sig1 + fn2 = colocated u0:2 sig2 + fn3 = colocated u0:3 sig3 + fn4 = colocated u0:4 sig4 + fn5 = colocated u0:5 sig5 + fn6 = colocated u0:6 sig6 + fn7 = colocated u0:7 sig7 + fn8 = colocated u0:8 sig8 + +block0: + v0 = call fn0() + jump block1(v0) + +block1(v22: i32): + v21 -> v22 + stack_store v22, ss1 + v1 = call fn1(), stack_map=[i32 @ ss1+0] + v8 -> v1 + v18 -> v1 + stack_store v1, ss0 + v2 = iconst.i32 0 + jump block2(v2) ; v2 = 0 + +block2(v3: i32): + v4 = iconst.i32 1 + v5 = icmp ult v3, v4 ; v4 = 1 + brif v5, block3, block4 + +block3: + v24 = stack_load.i32 ss0 + call fn2(v24, v4), stack_map=[i32 @ ss0+0, i32 @ ss1+0] ; v4 = 1 + v6 = iconst.i32 1 + v7 = iadd.i32 v4, v6 ; v4 = 1, v6 = 1 + jump block2(v7) + +block4: + v26 = stack_load.i32 ss1 + jump block5(v26) + +block5(v20: i32): + v19 -> v20 + stack_store v20, ss2 + v9 = iconst.i32 0 + v10 = icmp.i32 eq v8, v9 ; v9 = 0 + brif v10, block8(v9), block6 ; v9 = 0 + +block6: + v11 = call fn3(v8), stack_map=[i32 @ ss0+0, i32 @ ss2+0] + v12 = iconst.i32 -1091584273 + v13 = icmp eq v11, v12 ; v12 = -1091584273 + v14 = iconst.i32 1 + brif v13, block8(v14), block7 ; v14 = 1 + +block7: + v15 = call fn4(v8, v12), stack_map=[i32 @ ss0+0, i32 @ ss2+0] ; v12 = -1091584273 + jump block8(v15) + +block8(v16: i32): + trapz v16, user1 + call fn5(v8), stack_map=[i32 @ ss0+0, i32 @ ss2+0] + v17 = call fn6(), stack_map=[i32 @ ss0+0, i32 @ ss2+0] + brif v17, block5(v19), block9 + +block9: + v25 = stack_load.i32 ss2 + call fn7(v25), stack_map=[i32 @ ss2+0] + v23 = call fn8(), stack_map=[i32 @ ss2+0] + brif v23, block10, block1(v19) + +block10: + return } "#, ); diff --git a/cranelift/frontend/src/ssa.rs b/cranelift/frontend/src/ssa.rs index 694e467b0b..c29a8fd9bd 100644 --- a/cranelift/frontend/src/ssa.rs +++ b/cranelift/frontend/src/ssa.rs @@ -71,7 +71,10 @@ pub struct SideEffects { impl SideEffects { fn is_empty(&self) -> bool { - self.instructions_added_to_blocks.is_empty() + let Self { + instructions_added_to_blocks, + } = self; + instructions_added_to_blocks.is_empty() } } @@ -185,6 +188,12 @@ fn emit_zero(ty: Type, mut cur: FuncCursor) -> Value { /// Phi functions. /// impl SSABuilder { + /// Get all of the values associated with the given variable that we have + /// inserted in the function thus far. + pub fn values_for_var(&self, var: Variable) -> impl Iterator + '_ { + self.variables[var].values().filter_map(|v| v.expand()) + } + /// Declares a new definition of a variable in a given basic block. /// The SSA value is passed as an argument because it should be created with /// `ir::DataFlowGraph::append_result`. diff --git a/cranelift/isle/veri/veri_engine/Cargo.toml b/cranelift/isle/veri/veri_engine/Cargo.toml index 8460f1c1a2..02ac46c38b 100644 --- a/cranelift/isle/veri/veri_engine/Cargo.toml +++ b/cranelift/isle/veri/veri_engine/Cargo.toml @@ -23,7 +23,7 @@ cranelift-codegen-meta = { path = "../../../codegen/meta" } veri_ir = { path = "../veri_ir" } easy-smt = "0.2.2" clap = { workspace = true } -itertools = "0.12.0" +itertools = { workspace = true } log = { workspace = true } env_logger = { workspace = true } anyhow = { workspace = true } diff --git a/cranelift/jit/src/backend.rs b/cranelift/jit/src/backend.rs index 8f95a30b5a..5a2f27d52a 100644 --- a/cranelift/jit/src/backend.rs +++ b/cranelift/jit/src/backend.rs @@ -4,7 +4,7 @@ use crate::{compiled_blob::CompiledBlob, memory::BranchProtection, memory::Memor use cranelift_codegen::binemit::Reloc; use cranelift_codegen::isa::{OwnedTargetIsa, TargetIsa}; use cranelift_codegen::settings::Configurable; -use cranelift_codegen::{ir, settings, FinalizedMachReloc}; +use cranelift_codegen::{ir, settings}; use cranelift_control::ControlPlane; use cranelift_entity::SecondaryMap; use cranelift_module::{ @@ -17,8 +17,6 @@ use std::collections::HashMap; use std::ffi::CString; use std::io::Write; use std::ptr; -use std::ptr::NonNull; -use std::sync::atomic::{AtomicPtr, Ordering}; use target_lexicon::PointerWidth; const WRITABLE_DATA_ALIGNMENT: u64 = 0x8; @@ -30,7 +28,6 @@ pub struct JITBuilder { symbols: HashMap>, lookup_symbols: Vec Option<*const u8> + Send>>, libcall_names: Box String + Send + Sync>, - hotswap_enabled: bool, } impl JITBuilder { @@ -65,7 +62,7 @@ impl JITBuilder { // which might not reach all definitions; we can't handle that here, so // we require long-range relocation types. flag_builder.set("use_colocated_libcalls", "false").unwrap(); - flag_builder.set("is_pic", "true").unwrap(); + flag_builder.set("is_pic", "false").unwrap(); let isa_builder = cranelift_native::builder().unwrap_or_else(|msg| { panic!("host machine is not supported: {msg}"); }); @@ -94,7 +91,6 @@ impl JITBuilder { symbols, lookup_symbols, libcall_names, - hotswap_enabled: false, } } @@ -145,28 +141,8 @@ impl JITBuilder { self.lookup_symbols.push(symbol_lookup_fn); self } - - /// Enable or disable hotswap support. See [`JITModule::prepare_for_function_redefine`] - /// for more information. - /// - /// Enabling hotswap support requires PIC code. - pub fn hotswap(&mut self, enabled: bool) -> &mut Self { - self.hotswap_enabled = enabled; - self - } } -/// A pending update to the GOT. -struct GotUpdate { - /// The entry that is to be updated. - entry: NonNull>, - - /// The new value of the entry. - ptr: *const u8, -} - -unsafe impl Send for GotUpdate {} - /// A wrapper that impls Send for the contents. /// /// SAFETY: This must not be used for any types where it would be UB for them to be Send @@ -180,24 +156,15 @@ unsafe impl Send for SendWrapper {} /// See the `JITBuilder` for a convenient way to construct `JITModule` instances. pub struct JITModule { isa: OwnedTargetIsa, - hotswap_enabled: bool, symbols: RefCell>>, lookup_symbols: Vec Option<*const u8> + Send>>, libcall_names: Box String + Send + Sync>, memory: MemoryHandle, declarations: ModuleDeclarations, - function_got_entries: SecondaryMap>>>>, - function_plt_entries: SecondaryMap>>>, - data_object_got_entries: SecondaryMap>>>>, - libcall_got_entries: HashMap>>>, - libcall_plt_entries: HashMap>>, compiled_functions: SecondaryMap>, compiled_data_objects: SecondaryMap>, functions_to_finalize: Vec, data_objects_to_finalize: Vec, - - /// Updates to the GOT awaiting relocations to be made and region protections to be set - pending_got_updates: Vec, } /// A handle to allow freeing memory allocated by the `Module`. @@ -239,89 +206,16 @@ impl JITModule { } } - fn new_got_entry(&mut self, val: *const u8) -> NonNull> { - let got_entry = self - .memory - .writable - .allocate( - std::mem::size_of::>(), - std::mem::align_of::>().try_into().unwrap(), - ) - .unwrap() - .cast::>(); - unsafe { - std::ptr::write(got_entry, AtomicPtr::new(val as *mut _)); - } - NonNull::new(got_entry).unwrap() - } - - fn new_plt_entry(&mut self, got_entry: NonNull>) -> NonNull<[u8; 16]> { - let plt_entry = self - .memory - .code - .allocate( - std::mem::size_of::<[u8; 16]>(), - self.isa - .symbol_alignment() - .max(self.isa.function_alignment().minimum as u64), - ) - .unwrap() - .cast::<[u8; 16]>(); - unsafe { - Self::write_plt_entry_bytes(plt_entry, got_entry); - } - NonNull::new(plt_entry).unwrap() - } - - fn new_func_plt_entry(&mut self, id: FuncId, val: *const u8) { - let got_entry = self.new_got_entry(val); - self.function_got_entries[id] = Some(SendWrapper(got_entry)); - let plt_entry = self.new_plt_entry(got_entry); - self.record_function_for_perf( - plt_entry.as_ptr().cast(), - std::mem::size_of::<[u8; 16]>(), - &format!( - "{}@plt", - self.declarations.get_function_decl(id).linkage_name(id) - ), - ); - self.function_plt_entries[id] = Some(SendWrapper(plt_entry)); - } - - fn new_data_got_entry(&mut self, id: DataId, val: *const u8) { - let got_entry = self.new_got_entry(val); - self.data_object_got_entries[id] = Some(SendWrapper(got_entry)); - } - - unsafe fn write_plt_entry_bytes(plt_ptr: *mut [u8; 16], got_ptr: NonNull>) { - assert!( - cfg!(target_arch = "x86_64"), - "PLT is currently only supported on x86_64" - ); - // jmp *got_ptr; ud2; ud2; ud2; ud2; ud2 - let mut plt_val = [ - 0xff, 0x25, 0, 0, 0, 0, 0x0f, 0x0b, 0x0f, 0x0b, 0x0f, 0x0b, 0x0f, 0x0b, 0x0f, 0x0b, - ]; - let what = got_ptr.as_ptr() as isize - 4; - let at = plt_ptr as isize + 2; - plt_val[2..6].copy_from_slice(&i32::to_ne_bytes(i32::try_from(what - at).unwrap())); - std::ptr::write(plt_ptr, plt_val); - } - fn get_address(&self, name: &ModuleRelocTarget) -> *const u8 { match *name { ModuleRelocTarget::User { .. } => { let (name, linkage) = if ModuleDeclarations::is_function(name) { - if self.hotswap_enabled { - return self.get_plt_address(name); - } else { - let func_id = FuncId::from_name(name); - match &self.compiled_functions[func_id] { - Some(compiled) => return compiled.ptr, - None => { - let decl = self.declarations.get_function_decl(func_id); - (&decl.name, decl.linkage) - } + let func_id = FuncId::from_name(name); + match &self.compiled_functions[func_id] { + Some(compiled) => return compiled.ptr, + None => { + let decl = self.declarations.get_function_decl(func_id); + (&decl.name, decl.linkage) } } } else { @@ -354,60 +248,6 @@ impl JITModule { } } - /// Returns the given function's entry in the Global Offset Table. - /// - /// Panics if there's no entry in the table for the given function. - pub fn read_got_entry(&self, func_id: FuncId) -> *const u8 { - let got_entry = self.function_got_entries[func_id].unwrap(); - unsafe { got_entry.0.as_ref() }.load(Ordering::SeqCst) - } - - fn get_got_address(&self, name: &ModuleRelocTarget) -> NonNull> { - match *name { - ModuleRelocTarget::User { .. } => { - if ModuleDeclarations::is_function(name) { - let func_id = FuncId::from_name(name); - self.function_got_entries[func_id].unwrap().0 - } else { - let data_id = DataId::from_name(name); - self.data_object_got_entries[data_id].unwrap().0 - } - } - ModuleRelocTarget::LibCall(ref libcall) => { - self.libcall_got_entries - .get(libcall) - .unwrap_or_else(|| panic!("can't resolve libcall {libcall}")) - .0 - } - _ => panic!("invalid name"), - } - } - - fn get_plt_address(&self, name: &ModuleRelocTarget) -> *const u8 { - match *name { - ModuleRelocTarget::User { .. } => { - if ModuleDeclarations::is_function(name) { - let func_id = FuncId::from_name(name); - self.function_plt_entries[func_id] - .unwrap() - .0 - .as_ptr() - .cast::() - } else { - unreachable!("PLT relocations can only have functions as target"); - } - } - ModuleRelocTarget::LibCall(ref libcall) => self - .libcall_plt_entries - .get(libcall) - .unwrap_or_else(|| panic!("can't resolve libcall {libcall}")) - .0 - .as_ptr() - .cast::(), - _ => panic!("invalid name"), - } - } - /// Returns the address of a finalized function. /// /// The pointer remains valid until either [`JITModule::free_memory`] is called or in the future @@ -472,11 +312,7 @@ impl JITModule { let func = self.compiled_functions[func] .as_ref() .expect("function must be compiled before it can be finalized"); - func.perform_relocations( - |name| self.get_address(name), - |name| self.get_got_address(name).as_ptr().cast(), - |name| self.get_plt_address(name), - ); + func.perform_relocations(|name| self.get_address(name)); } for data in std::mem::take(&mut self.data_objects_to_finalize) { @@ -485,31 +321,22 @@ impl JITModule { let data = self.compiled_data_objects[data] .as_ref() .expect("data object must be compiled before it can be finalized"); - data.perform_relocations( - |name| self.get_address(name), - |name| self.get_got_address(name).as_ptr().cast(), - |name| self.get_plt_address(name), - ); + data.perform_relocations(|name| self.get_address(name)); } // Now that we're done patching, prepare the memory for execution! self.memory.readonly.set_readonly()?; self.memory.code.set_readable_and_executable()?; - for update in self.pending_got_updates.drain(..) { - unsafe { update.entry.as_ref() }.store(update.ptr as *mut _, Ordering::SeqCst); - } Ok(()) } /// Create a new `JITModule`. pub fn new(builder: JITBuilder) -> Self { - if builder.hotswap_enabled { - assert!( - builder.isa.flags().is_pic(), - "Hotswapping requires PIC code" - ); - } + assert!( + !builder.isa.flags().is_pic(), + "cranelift-jit needs is_pic=false" + ); let branch_protection = if cfg!(target_arch = "aarch64") && use_bti(&builder.isa.isa_flags()) { @@ -517,9 +344,8 @@ impl JITModule { } else { BranchProtection::None }; - let mut module = Self { + Self { isa: builder.isa, - hotswap_enabled: builder.hotswap_enabled, symbols: RefCell::new(builder.symbols), lookup_symbols: builder.lookup_symbols, libcall_names: builder.libcall_names, @@ -530,69 +356,11 @@ impl JITModule { writable: Memory::new(BranchProtection::None), }, declarations: ModuleDeclarations::default(), - function_got_entries: SecondaryMap::new(), - function_plt_entries: SecondaryMap::new(), - data_object_got_entries: SecondaryMap::new(), - libcall_got_entries: HashMap::new(), - libcall_plt_entries: HashMap::new(), compiled_functions: SecondaryMap::new(), compiled_data_objects: SecondaryMap::new(), functions_to_finalize: Vec::new(), data_objects_to_finalize: Vec::new(), - pending_got_updates: Vec::new(), - }; - - // Pre-create a GOT and PLT entry for each libcall. - let all_libcalls = if module.isa.flags().is_pic() { - ir::LibCall::all_libcalls() - } else { - &[] // Not PIC, so no GOT and PLT entries necessary - }; - for &libcall in all_libcalls { - let sym = (module.libcall_names)(libcall); - let addr = if let Some(addr) = module.lookup_symbol(&sym) { - addr - } else { - continue; - }; - let got_entry = module.new_got_entry(addr); - module - .libcall_got_entries - .insert(libcall, SendWrapper(got_entry)); - let plt_entry = module.new_plt_entry(got_entry); - module - .libcall_plt_entries - .insert(libcall, SendWrapper(plt_entry)); } - - module - } - - /// Allow a single future `define_function` on a previously defined function. This allows for - /// hot code swapping and lazy compilation of functions. - /// - /// This requires hotswap support to be enabled first using [`JITBuilder::hotswap`]. - pub fn prepare_for_function_redefine(&mut self, func_id: FuncId) -> ModuleResult<()> { - assert!(self.hotswap_enabled, "Hotswap support is not enabled"); - let decl = self.declarations.get_function_decl(func_id); - if !decl.linkage.is_definable() { - return Err(ModuleError::InvalidImportDefinition( - decl.linkage_name(func_id).into_owned(), - )); - } - - if self.compiled_functions[func_id].is_none() { - return Err(ModuleError::Backend(anyhow::anyhow!( - "Tried to redefine not yet defined function {}", - decl.linkage_name(func_id), - ))); - } - - self.compiled_functions[func_id] = None; - - // FIXME return some kind of handle that allows for deallocating the function - - Ok(()) } } @@ -611,26 +379,14 @@ impl Module for JITModule { linkage: Linkage, signature: &ir::Signature, ) -> ModuleResult { - let (id, linkage) = self + let (id, _linkage) = self .declarations .declare_function(name, linkage, signature)?; - if self.function_got_entries[id].is_none() && self.isa.flags().is_pic() { - // FIXME populate got entries with a null pointer when defined - let val = if linkage == Linkage::Import { - self.lookup_symbol(name).unwrap_or(std::ptr::null()) - } else { - std::ptr::null() - }; - self.new_func_plt_entry(id, val); - } Ok(id) } fn declare_anonymous_function(&mut self, signature: &ir::Signature) -> ModuleResult { let id = self.declarations.declare_anonymous_function(signature)?; - if self.isa.flags().is_pic() { - self.new_func_plt_entry(id, std::ptr::null()); - } Ok(id) } @@ -642,27 +398,15 @@ impl Module for JITModule { tls: bool, ) -> ModuleResult { assert!(!tls, "JIT doesn't yet support TLS"); - let (id, linkage) = self + let (id, _linkage) = self .declarations .declare_data(name, linkage, writable, tls)?; - if self.data_object_got_entries[id].is_none() && self.isa.flags().is_pic() { - // FIXME populate got entries with a null pointer when defined - let val = if linkage == Linkage::Import { - self.lookup_symbol(name).unwrap_or(std::ptr::null()) - } else { - std::ptr::null() - }; - self.new_data_got_entry(id, val); - } Ok(id) } fn declare_anonymous_data(&mut self, writable: bool, tls: bool) -> ModuleResult { assert!(!tls, "JIT doesn't yet support TLS"); let id = self.declarations.declare_anonymous_data(writable, tls)?; - if self.isa.flags().is_pic() { - self.new_data_got_entry(id, std::ptr::null()); - } Ok(id) } @@ -686,30 +430,13 @@ impl Module for JITModule { )); } - if self.hotswap_enabled { - // Disable colocated if hotswapping is enabled to avoid a PLT indirection in case of - // calls and to allow data objects to be hotswapped in the future. - for func in ctx.func.dfg.ext_funcs.values_mut() { - func.colocated = false; - } - - for gv in ctx.func.global_values.values_mut() { - match gv { - ir::GlobalValueData::Symbol { colocated, .. } => *colocated = false, - _ => {} - } - } - } - // work around borrow-checker to allow reuse of ctx below let res = ctx.compile(self.isa(), ctrl_plane)?; let alignment = res.buffer.alignment as u64; let compiled_code = ctx.compiled_code().unwrap(); let size = compiled_code.code_info().total_size as usize; - let align = alignment - .max(self.isa.function_alignment().minimum as u64) - .max(self.isa.symbol_alignment()); + let align = alignment.max(self.isa.symbol_alignment()); let ptr = self .memory .code @@ -734,37 +461,7 @@ impl Module for JITModule { self.record_function_for_perf(ptr, size, &decl.linkage_name(id)); self.compiled_functions[id] = Some(CompiledBlob { ptr, size, relocs }); - if self.isa.flags().is_pic() { - self.pending_got_updates.push(GotUpdate { - entry: self.function_got_entries[id].unwrap().0, - ptr, - }) - } - - if self.hotswap_enabled { - self.compiled_functions[id] - .as_ref() - .unwrap() - .perform_relocations( - |name| match *name { - ModuleRelocTarget::User { .. } => { - unreachable!("non GOT or PLT relocation in function {} to {}", id, name) - } - ModuleRelocTarget::LibCall(ref libcall) => self - .libcall_plt_entries - .get(libcall) - .unwrap_or_else(|| panic!("can't resolve libcall {libcall}")) - .0 - .as_ptr() - .cast::(), - _ => panic!("invalid name"), - }, - |name| self.get_got_address(name).as_ptr().cast(), - |name| self.get_plt_address(name), - ); - } else { - self.functions_to_finalize.push(id); - } + self.functions_to_finalize.push(id); Ok(()) } @@ -772,10 +469,9 @@ impl Module for JITModule { fn define_function_bytes( &mut self, id: FuncId, - func: &ir::Function, alignment: u64, bytes: &[u8], - relocs: &[FinalizedMachReloc], + relocs: &[ModuleReloc], ) -> ModuleResult<()> { info!("defining function {} with bytes", id); let decl = self.declarations.get_function_decl(id); @@ -792,9 +488,7 @@ impl Module for JITModule { } let size = bytes.len(); - let align = alignment - .max(self.isa.function_alignment().minimum as u64) - .max(self.isa.symbol_alignment()); + let align = alignment.max(self.isa.symbol_alignment()); let ptr = self .memory .code @@ -812,31 +506,10 @@ impl Module for JITModule { self.compiled_functions[id] = Some(CompiledBlob { ptr, size, - relocs: relocs - .iter() - .map(|reloc| ModuleReloc::from_mach_reloc(reloc, func, id)) - .collect(), + relocs: relocs.to_owned(), }); - if self.isa.flags().is_pic() { - self.pending_got_updates.push(GotUpdate { - entry: self.function_got_entries[id].unwrap().0, - ptr, - }) - } - - if self.hotswap_enabled { - self.compiled_functions[id] - .as_ref() - .unwrap() - .perform_relocations( - |name| unreachable!("non GOT or PLT relocation in function {} to {}", id, name), - |name| self.get_got_address(name).as_ptr().cast(), - |name| self.get_plt_address(name), - ); - } else { - self.functions_to_finalize.push(id); - } + self.functions_to_finalize.push(id); Ok(()) } @@ -867,15 +540,16 @@ impl Module for JITModule { align, } = data; - let size = init.size(); - let ptr = if size == 0 { - // Return a correctly aligned non-null pointer to avoid UB in write_bytes and - // copy_nonoverlapping. - usize::try_from(align.unwrap_or(WRITABLE_DATA_ALIGNMENT)).unwrap() as *mut u8 - } else if decl.writable { + // Make sure to allocate at least 1 byte. Allocating 0 bytes is UB. Previously a dummy + // value was used, however as it turns out this will cause pc-relative relocations to + // fail on architectures where pc-relative offsets are range restricted as the dummy + // value is not close enough to the code that has the pc-relative relocation. + let alloc_size = std::cmp::max(init.size(), 1); + + let ptr = if decl.writable { self.memory .writable - .allocate(size, align.unwrap_or(WRITABLE_DATA_ALIGNMENT)) + .allocate(alloc_size, align.unwrap_or(WRITABLE_DATA_ALIGNMENT)) .map_err(|e| ModuleError::Allocation { message: "unable to alloc writable data", err: e, @@ -883,7 +557,7 @@ impl Module for JITModule { } else { self.memory .readonly - .allocate(size, align.unwrap_or(READONLY_DATA_ALIGNMENT)) + .allocate(alloc_size, align.unwrap_or(READONLY_DATA_ALIGNMENT)) .map_err(|e| ModuleError::Allocation { message: "unable to alloc readonly data", err: e, @@ -894,7 +568,7 @@ impl Module for JITModule { // FIXME pass a Layout to allocate and only compute the layout once. std::alloc::handle_alloc_error( std::alloc::Layout::from_size_align( - size, + alloc_size, align.unwrap_or(READONLY_DATA_ALIGNMENT).try_into().unwrap(), ) .unwrap(), @@ -905,12 +579,12 @@ impl Module for JITModule { Init::Uninitialized => { panic!("data is not initialized yet"); } - Init::Zeros { .. } => { + Init::Zeros { size } => { unsafe { ptr::write_bytes(ptr, 0, size) }; } Init::Bytes { ref contents } => { let src = contents.as_ptr(); - unsafe { ptr::copy_nonoverlapping(src, ptr, size) }; + unsafe { ptr::copy_nonoverlapping(src, ptr, contents.len()) }; } } @@ -921,14 +595,12 @@ impl Module for JITModule { }; let relocs = data.all_relocs(pointer_reloc).collect::>(); - self.compiled_data_objects[id] = Some(CompiledBlob { ptr, size, relocs }); + self.compiled_data_objects[id] = Some(CompiledBlob { + ptr, + size: init.size(), + relocs, + }); self.data_objects_to_finalize.push(id); - if self.isa.flags().is_pic() { - self.pending_got_updates.push(GotUpdate { - entry: self.data_object_got_entries[id].unwrap().0, - ptr, - }) - } Ok(()) } diff --git a/cranelift/jit/src/compiled_blob.rs b/cranelift/jit/src/compiled_blob.rs index 95c3d2495b..4313c9f7ff 100644 --- a/cranelift/jit/src/compiled_blob.rs +++ b/cranelift/jit/src/compiled_blob.rs @@ -23,8 +23,6 @@ impl CompiledBlob { pub(crate) fn perform_relocations( &self, get_address: impl Fn(&ModuleRelocTarget) -> *const u8, - get_got_entry: impl Fn(&ModuleRelocTarget) -> *const u8, - get_plt_entry: impl Fn(&ModuleRelocTarget) -> *const u8, ) { use std::ptr::write_unaligned; @@ -59,16 +57,10 @@ impl CompiledBlob { unsafe { write_unaligned(at as *mut i32, pcrel) }; } Reloc::X86GOTPCRel4 => { - let base = get_got_entry(name); - let what = unsafe { base.offset(isize::try_from(addend).unwrap()) }; - let pcrel = i32::try_from((what as isize) - (at as isize)).unwrap(); - unsafe { write_unaligned(at as *mut i32, pcrel) }; + panic!("GOT relocation shouldn't be generated when !is_pic"); } Reloc::X86CallPLTRel4 => { - let base = get_plt_entry(name); - let what = unsafe { base.offset(isize::try_from(addend).unwrap()) }; - let pcrel = i32::try_from((what as isize) - (at as isize)).unwrap(); - unsafe { write_unaligned(at as *mut i32, pcrel) }; + panic!("PLT relocation shouldn't be generated when !is_pic"); } Reloc::S390xPCRel32Dbl | Reloc::S390xPLTRel32Dbl => { let base = get_address(name); @@ -95,33 +87,10 @@ impl CompiledBlob { unsafe { modify_inst32(iptr, |inst| inst | imm26) }; } Reloc::Aarch64AdrGotPage21 => { - // Set the immediate value of an ADRP to bits [32:12] of X; check that –2^32 <= X < 2^32 - assert_eq!(addend, 0, "addend affects the address looked up in get_got_entry, which is currently only called with a symbol"); - let what = get_got_entry(name); - let what_page = (what as usize) & !0xfff; - let at_page = (at as usize) & !0xfff; - let pcrel = (what_page as isize).checked_sub(at_page as isize).unwrap(); - assert!( - (-1 << 32) <= (pcrel as i64) && (pcrel as i64) < (1 << 32), - "can't reach GOT page with ±4GB `adrp` instruction" - ); - let val = pcrel >> 12; - - let immlo = ((val as u32) & 0b11) << 29; - let immhi = (((val as u32) >> 2) & &0x7ffff) << 5; - let mask = !((0x7ffff << 5) | (0b11 << 29)); - unsafe { modify_inst32(at as *mut u32, |adrp| (adrp & mask) | immlo | immhi) }; + panic!("GOT relocation shouldn't be generated when !is_pic"); } Reloc::Aarch64Ld64GotLo12Nc => { - // Set the LD/ST immediate field to bits 11:3 of X. No overflow check; check that X&7 = 0 - assert_eq!(addend, 0); - let base = get_got_entry(name); - let what = base as u32; - assert_eq!(what & 0b111, 0); - let val = what >> 3; - let imm9 = (val & 0x1ff) << 10; - let mask = !(0x1ff << 10); - unsafe { modify_inst32(at as *mut u32, |ldr| (ldr & mask) | imm9) }; + panic!("GOT relocation shouldn't be generated when !is_pic"); } Reloc::RiscvCallPlt => { // A R_RISCV_CALL_PLT relocation expects auipc+jalr instruction pair. diff --git a/cranelift/module/src/module.rs b/cranelift/module/src/module.rs index 4a32837787..ed62230369 100644 --- a/cranelift/module/src/module.rs +++ b/cranelift/module/src/module.rs @@ -220,7 +220,7 @@ impl From for ModuleRelocTarget { feature = "enable-serde", derive(serde_derive::Serialize, serde_derive::Deserialize) )] -#[allow(missing_docs, reason = "self-describing fields")] +#[expect(missing_docs, reason = "self-describing fields")] pub struct FunctionDeclaration { pub name: Option, pub linkage: Linkage, @@ -377,7 +377,7 @@ pub type ModuleResult = Result; feature = "enable-serde", derive(serde_derive::Serialize, serde_derive::Deserialize) )] -#[allow(missing_docs, reason = "self-describing fields")] +#[expect(missing_docs, reason = "self-describing fields")] pub struct DataDeclaration { pub name: Option, pub linkage: Linkage, @@ -974,10 +974,9 @@ pub trait Module { fn define_function_bytes( &mut self, func_id: FuncId, - func: &ir::Function, alignment: u64, bytes: &[u8], - relocs: &[FinalizedMachReloc], + relocs: &[ModuleReloc], ) -> ModuleResult<()>; /// Define a data object, producing the data contents from the given `DataContext`. @@ -1076,12 +1075,11 @@ impl Module for &mut M { fn define_function_bytes( &mut self, func_id: FuncId, - func: &ir::Function, alignment: u64, bytes: &[u8], - relocs: &[FinalizedMachReloc], + relocs: &[ModuleReloc], ) -> ModuleResult<()> { - (**self).define_function_bytes(func_id, func, alignment, bytes, relocs) + (**self).define_function_bytes(func_id, alignment, bytes, relocs) } fn define_data(&mut self, data_id: DataId, data: &DataDescription) -> ModuleResult<()> { @@ -1181,12 +1179,11 @@ impl Module for Box { fn define_function_bytes( &mut self, func_id: FuncId, - func: &ir::Function, alignment: u64, bytes: &[u8], - relocs: &[FinalizedMachReloc], + relocs: &[ModuleReloc], ) -> ModuleResult<()> { - (**self).define_function_bytes(func_id, func, alignment, bytes, relocs) + (**self).define_function_bytes(func_id, alignment, bytes, relocs) } fn define_data(&mut self, data_id: DataId, data: &DataDescription) -> ModuleResult<()> { diff --git a/cranelift/object/Cargo.toml b/cranelift/object/Cargo.toml index 25299af19f..805b9aba22 100644 --- a/cranelift/object/Cargo.toml +++ b/cranelift/object/Cargo.toml @@ -25,3 +25,4 @@ log = { workspace = true } [dev-dependencies] cranelift-frontend = { workspace = true } cranelift-entity = { workspace = true } +cranelift-codegen = { workspace = true, features = ["x86"] } diff --git a/cranelift/object/src/backend.rs b/cranelift/object/src/backend.rs index 2de2222386..c8a4d99c1f 100644 --- a/cranelift/object/src/backend.rs +++ b/cranelift/object/src/backend.rs @@ -3,8 +3,8 @@ use anyhow::anyhow; use cranelift_codegen::binemit::{Addend, CodeOffset, Reloc}; use cranelift_codegen::entity::SecondaryMap; +use cranelift_codegen::ir; use cranelift_codegen::isa::{OwnedTargetIsa, TargetIsa}; -use cranelift_codegen::{ir, FinalizedMachReloc}; use cranelift_control::ControlPlane; use cranelift_module::{ DataDescription, DataId, FuncId, Init, Linkage, Module, ModuleDeclarations, ModuleError, @@ -345,65 +345,29 @@ impl Module for ObjectModule { let res = ctx.compile(self.isa(), ctrl_plane)?; let alignment = res.buffer.alignment as u64; - self.define_function_bytes( - func_id, - &ctx.func, - alignment, - ctx.compiled_code().unwrap().code_buffer(), - ctx.compiled_code().unwrap().buffer.relocs(), - ) + let buffer = &ctx.compiled_code().unwrap().buffer; + let relocs = buffer + .relocs() + .iter() + .map(|reloc| { + self.process_reloc(&ModuleReloc::from_mach_reloc(&reloc, &ctx.func, func_id)) + }) + .collect::>(); + self.define_function_inner(func_id, alignment, buffer.data(), relocs) } fn define_function_bytes( &mut self, func_id: FuncId, - func: &ir::Function, alignment: u64, bytes: &[u8], - relocs: &[FinalizedMachReloc], + relocs: &[ModuleReloc], ) -> ModuleResult<()> { - info!("defining function {} with bytes", func_id); - let decl = self.declarations.get_function_decl(func_id); - let decl_name = decl.linkage_name(func_id); - if !decl.linkage.is_definable() { - return Err(ModuleError::InvalidImportDefinition(decl_name.into_owned())); - } - - let &mut (symbol, ref mut defined) = self.functions[func_id].as_mut().unwrap(); - if *defined { - return Err(ModuleError::DuplicateDefinition(decl_name.into_owned())); - } - *defined = true; - - let align = alignment - .max(self.isa.function_alignment().minimum.into()) - .max(self.isa.symbol_alignment()); - let section = if self.per_function_section { - // FIXME pass empty symbol name once add_subsection produces `.text` as section name - // instead of `.text.` when passed an empty symbol name. (object#748) Until then pass - // `subsection` to produce `.text.subsection` as section name to reduce confusion. - self.object - .add_subsection(StandardSection::Text, b"subsection") - } else { - self.object.section_id(StandardSection::Text) - }; - let offset = self.object.add_symbol_data(symbol, section, bytes, align); - - if !relocs.is_empty() { - let relocs = relocs - .iter() - .map(|record| { - self.process_reloc(&ModuleReloc::from_mach_reloc(&record, func, func_id)) - }) - .collect(); - self.relocs.push(SymbolRelocs { - section, - offset, - relocs, - }); - } - - Ok(()) + let relocs = relocs + .iter() + .map(|reloc| self.process_reloc(reloc)) + .collect(); + self.define_function_inner(func_id, alignment, bytes, relocs) } fn define_data(&mut self, data_id: DataId, data: &DataDescription) -> ModuleResult<()> { @@ -511,6 +475,49 @@ impl Module for ObjectModule { } impl ObjectModule { + fn define_function_inner( + &mut self, + func_id: FuncId, + alignment: u64, + bytes: &[u8], + relocs: Vec, + ) -> Result<(), ModuleError> { + info!("defining function {} with bytes", func_id); + let decl = self.declarations.get_function_decl(func_id); + let decl_name = decl.linkage_name(func_id); + if !decl.linkage.is_definable() { + return Err(ModuleError::InvalidImportDefinition(decl_name.into_owned())); + } + + let &mut (symbol, ref mut defined) = self.functions[func_id].as_mut().unwrap(); + if *defined { + return Err(ModuleError::DuplicateDefinition(decl_name.into_owned())); + } + *defined = true; + + let align = alignment.max(self.isa.symbol_alignment()); + let section = if self.per_function_section { + // FIXME pass empty symbol name once add_subsection produces `.text` as section name + // instead of `.text.` when passed an empty symbol name. (object#748) Until then pass + // `subsection` to produce `.text.subsection` as section name to reduce confusion. + self.object + .add_subsection(StandardSection::Text, b"subsection") + } else { + self.object.section_id(StandardSection::Text) + }; + let offset = self.object.add_symbol_data(symbol, section, bytes, align); + + if !relocs.is_empty() { + self.relocs.push(SymbolRelocs { + section, + offset, + relocs, + }); + } + + Ok(()) + } + /// Finalize all relocations and output an object. pub fn finish(mut self) -> ObjectProduct { let symbol_relocs = mem::take(&mut self.relocs); diff --git a/cranelift/reader/src/lib.rs b/cranelift/reader/src/lib.rs index e4d5ea95e0..e14635e5e1 100644 --- a/cranelift/reader/src/lib.rs +++ b/cranelift/reader/src/lib.rs @@ -29,7 +29,7 @@ use std::str::FromStr; use target_lexicon::Triple; /// Like `FlagsOrIsa`, but holds ownership. -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] pub enum OwnedFlagsOrIsa { Flags(settings::Flags), Isa(OwnedTargetIsa), diff --git a/cranelift/reader/src/run_command.rs b/cranelift/reader/src/run_command.rs index 2fa6165396..c1ecd29656 100644 --- a/cranelift/reader/src/run_command.rs +++ b/cranelift/reader/src/run_command.rs @@ -105,7 +105,7 @@ impl Display for Invocation { } /// A CLIF comparison operation; e.g. `==`. -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] #[derive(Debug, PartialEq)] pub enum Comparison { Equals, diff --git a/cranelift/srcgen/Cargo.toml b/cranelift/srcgen/Cargo.toml new file mode 100644 index 0000000000..f82089e732 --- /dev/null +++ b/cranelift/srcgen/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "cranelift-srcgen" +version = "0.119.0" +authors = ["The Wasmtime Project Developers"] +description = "Helper functions for generating Rust and ISLE files" +license = "Apache-2.0 WITH LLVM-exception" +repository = "https://github.com/bytecodealliance/wasmtime" +edition.workspace = true +rust-version.workspace = true + +[lints] +workspace = true + +[dependencies] diff --git a/cranelift/codegen/meta/src/error.rs b/cranelift/srcgen/src/error.rs similarity index 94% rename from cranelift/codegen/meta/src/error.rs rename to cranelift/srcgen/src/error.rs index e898dea4e2..7fbc25b6f4 100644 --- a/cranelift/codegen/meta/src/error.rs +++ b/cranelift/srcgen/src/error.rs @@ -1,4 +1,5 @@ -//! Error returned during meta code-generation. +//! Defines an `Error` returned during source code generation. + use std::fmt; use std::io; diff --git a/cranelift/codegen/meta/src/srcgen.rs b/cranelift/srcgen/src/lib.rs similarity index 76% rename from cranelift/codegen/meta/src/srcgen.rs rename to cranelift/srcgen/src/lib.rs index d3c321e5bc..019fba9b82 100644 --- a/cranelift/codegen/meta/src/srcgen.rs +++ b/cranelift/srcgen/src/lib.rs @@ -1,28 +1,53 @@ -//! Source code generator. +//! A source code generator. //! -//! The `srcgen` module contains generic helper routines and classes for -//! generating source code. - -#![macro_use] +//! This crate contains generic helper routines and classes for generating +//! source code. use std::cmp; use std::collections::{BTreeMap, BTreeSet}; use std::fs; use std::io::Write; -use crate::error; +pub mod error; static SHIFTWIDTH: usize = 4; -/// A macro that simplifies the usage of the Formatter by allowing format +/// A macro for constructing a [`FileLocation`] at the current location. +#[macro_export] +macro_rules! loc { + () => { + $crate::FileLocation::new(file!(), line!()) + }; +} + +/// Record a source location; preferably, use [`loc`] directly. +pub struct FileLocation { + file: &'static str, + line: u32, +} + +impl FileLocation { + pub fn new(file: &'static str, line: u32) -> Self { + Self { file, line } + } +} + +impl core::fmt::Display for FileLocation { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}:{}", self.file, self.line) + } +} + +/// A macro that simplifies the usage of the [`Formatter`] by allowing format /// strings. +#[macro_export] macro_rules! fmtln { ($fmt:ident, $fmtstring:expr, $($fmtargs:expr),*) => { - $fmt.line(format!($fmtstring, $($fmtargs),*)) + $fmt.line_with_location(format!($fmtstring, $($fmtargs),*), $crate::loc!()) }; ($fmt:ident, $arg:expr) => { - $fmt.line($arg) + $fmt.line_with_location(format!($arg), $crate::loc!()) }; ($_:tt, $($args:expr),+) => { @@ -34,18 +59,46 @@ macro_rules! fmtln { }; } -pub(crate) struct Formatter { +/// Identify the source code language a [`Formatter`] will emit. +#[derive(Debug, Clone, Copy)] +pub enum Language { + Rust, + Isle, +} + +impl Language { + /// Determine if a [`FileLocation`] comment should be appended to a line. + pub fn should_append_location(&self, line: &str) -> bool { + match self { + Language::Rust => !line.ends_with(['{', '}']), + Language::Isle => true, + } + } + + /// Get the comment token for the language. + pub fn comment_token(&self) -> &'static str { + match self { + Language::Rust => "//", + Language::Isle => ";;", + } + } +} + +/// Collect source code to be written to a file and keep track of indentation. +pub struct Formatter { indent: usize, lines: Vec, + lang: Language, } impl Formatter { - /// Source code formatter class. Used to collect source code to be written - /// to a file, and keep track of indentation. - pub fn new() -> Self { + /// Source code formatter class. Used to collect source code of a specific + /// [`Language`] to be written to a file, and keep track of indentation. + pub fn new(lang: Language) -> Self { Self { indent: 0, lines: Vec::new(), + lang, } } @@ -60,6 +113,7 @@ impl Formatter { self.indent -= 1; } + /// Increase indentation level for the duration of `f`. pub fn indent T>(&mut self, f: F) -> T { self.indent_push(); let ret = f(self); @@ -82,28 +136,25 @@ impl Formatter { self.lines.push(indented_line); } + /// Add an indented lin with a given a `location` appended as a comment to + /// the line (this is useful for identifying where a line was generated). + pub fn line_with_location(&mut self, contents: impl AsRef, location: FileLocation) { + let indent = self.get_indent(); + let contents = contents.as_ref(); + let indented_line = if self.lang.should_append_location(contents) { + let comment_token = self.lang.comment_token(); + format!("{indent}{contents} {comment_token} {location}\n") + } else { + format!("{indent}{contents}\n") + }; + self.lines.push(indented_line); + } + /// Pushes an empty line. pub fn empty_line(&mut self) { self.lines.push("\n".to_string()); } - /// Write `self.lines` to a file. - pub fn update_file( - &self, - filename: impl AsRef, - directory: &std::path::Path, - ) -> Result<(), error::Error> { - let path = directory.join(&filename); - eprintln!("Writing generated file: {}", path.display()); - let mut f = fs::File::create(path)?; - - for l in self.lines.iter().map(|l| l.as_bytes()) { - f.write_all(l)?; - } - - Ok(()) - } - /// Add one or more lines after stripping common indentation. pub fn multi_line(&mut self, s: &str) { parse_multiline(s).into_iter().for_each(|l| self.line(&l)); @@ -111,11 +162,14 @@ impl Formatter { /// Add a comment line. pub fn comment(&mut self, s: impl AsRef) { - fmtln!(self, "// {}", s.as_ref()); + // Avoid `fmtln!` here: we don't want to append a location comment to a + // comment. + self.line(format!("{} {}", self.lang.comment_token(), s.as_ref())); } /// Add a (multi-line) documentation comment. pub fn doc_comment(&mut self, contents: impl AsRef) { + assert!(matches!(self.lang, Language::Rust)); parse_multiline(contents.as_ref()) .iter() .map(|l| { @@ -128,8 +182,19 @@ impl Formatter { .for_each(|s| self.line(s.as_str())); } + /// Add a brace-delimited block that begins with `start`: i.e., ` { + /// }`. This properly indents the contents of the block. + pub fn add_block T>(&mut self, start: &str, f: F) -> T { + assert!(matches!(self.lang, Language::Rust)); + self.line(format!("{start} {{")); + let ret = self.indent(f); + self.line("}"); + ret + } + /// Add a match expression. pub fn add_match(&mut self, m: Match) { + assert!(matches!(self.lang, Language::Rust)); fmtln!(self, "match {} {{", m.expr); self.indent(|fmt| { for (&(ref fields, ref body), ref names) in m.arms.iter() { @@ -165,6 +230,23 @@ impl Formatter { }); self.line("}"); } + + /// Write `self.lines` to a file. + pub fn write( + &self, + filename: impl AsRef, + directory: &std::path::Path, + ) -> Result<(), error::Error> { + let path = directory.join(&filename); + eprintln!("Writing generated file: {}", path.display()); + let mut f = fs::File::create(path)?; + + for l in self.lines.iter().map(|l| l.as_bytes()) { + f.write_all(l)?; + } + + Ok(()) + } } /// Compute the indentation of s, or None of an empty line. @@ -240,7 +322,7 @@ fn parse_multiline(s: &str) -> Vec { /// Note that this class is ignorant of Rust types, and considers two fields /// with the same name to be equivalent. BTreeMap/BTreeSet are used to /// represent the arms in order to make the order deterministic. -pub(crate) struct Match { +pub struct Match { expr: String, arms: BTreeMap<(Vec, String), BTreeSet>, /// The clause for the placeholder pattern _. @@ -301,6 +383,7 @@ impl Match { mod srcgen_tests { use super::parse_multiline; use super::Formatter; + use super::Language; use super::Match; fn from_raw_string>(s: S) -> Vec { @@ -321,7 +404,7 @@ mod srcgen_tests { m.arm("Blue", vec!["x", "y"], "some body"); assert_eq!(m.arms.len(), 3); - let mut fmt = Formatter::new(); + let mut fmt = Formatter::new(Language::Rust); fmt.add_match(m); let expected_lines = from_raw_string( @@ -352,7 +435,7 @@ match x { m.arm_no_fields("_", "unreachable!()"); assert_eq!(m.arms.len(), 2); // catchall is not counted - let mut fmt = Formatter::new(); + let mut fmt = Formatter::new(Language::Rust); fmt.add_match(m); let expected_lines = from_raw_string( @@ -383,7 +466,7 @@ match x { #[test] fn formatter_basic_example_works() { - let mut fmt = Formatter::new(); + let mut fmt = Formatter::new(Language::Rust); fmt.line("Hello line 1"); fmt.indent_push(); fmt.comment("Nested comment"); @@ -399,7 +482,7 @@ match x { #[test] fn get_indent_works() { - let mut fmt = Formatter::new(); + let mut fmt = Formatter::new(Language::Rust); let expected_results = vec!["", " ", " ", ""]; let actual_results = Vec::with_capacity(4); @@ -418,15 +501,15 @@ match x { #[test] fn fmt_can_add_type_to_lines() { - let mut fmt = Formatter::new(); - fmt.line(format!("pub const {}: Type = Type({:#x});", "example", 0,)); + let mut fmt = Formatter::new(Language::Rust); + fmt.line(format!("pub const {}: Type = Type({:#x});", "example", 0)); let expected_lines = vec!["pub const example: Type = Type(0x0);\n"]; assert_eq!(fmt.lines, expected_lines); } #[test] fn fmt_can_add_indented_line() { - let mut fmt = Formatter::new(); + let mut fmt = Formatter::new(Language::Rust); fmt.line("hello"); fmt.indent_push(); fmt.line("world"); @@ -436,7 +519,7 @@ match x { #[test] fn fmt_can_add_doc_comments() { - let mut fmt = Formatter::new(); + let mut fmt = Formatter::new(Language::Rust); fmt.doc_comment("documentation\nis\ngood"); let expected_lines = vec!["/// documentation\n", "/// is\n", "/// good\n"]; assert_eq!(fmt.lines, expected_lines); @@ -444,7 +527,7 @@ match x { #[test] fn fmt_can_add_doc_comments_with_empty_lines() { - let mut fmt = Formatter::new(); + let mut fmt = Formatter::new(Language::Rust); fmt.doc_comment( r#"documentation can be really good. diff --git a/crates/c-api-macros/Cargo.toml b/crates/c-api-macros/Cargo.toml index 99945a8ebd..da2ab36998 100644 --- a/crates/c-api-macros/Cargo.toml +++ b/crates/c-api-macros/Cargo.toml @@ -17,5 +17,5 @@ test = false doctest = false [dependencies] -quote = "1.0" -proc-macro2 = "1.0" +quote = { workspace = true } +proc-macro2 = { workspace = true } diff --git a/crates/c-api/Cargo.toml b/crates/c-api/Cargo.toml index 17fe11fe54..25d87d3d61 100644 --- a/crates/c-api/Cargo.toml +++ b/crates/c-api/Cargo.toml @@ -58,5 +58,6 @@ cranelift = ['wasmtime/cranelift'] winch = ['wasmtime/winch'] debug-builtins = ['wasmtime/debug-builtins'] wat = ['dep:wat', 'wasmtime/wat'] +pooling-allocator = ["wasmtime/pooling-allocator"] # ... if you add a line above this be sure to change the other locations # marked WASMTIME_FEATURE_LIST diff --git a/crates/c-api/artifact/Cargo.toml b/crates/c-api/artifact/Cargo.toml index 8aa846d233..5d56f4c302 100644 --- a/crates/c-api/artifact/Cargo.toml +++ b/crates/c-api/artifact/Cargo.toml @@ -39,6 +39,7 @@ default = [ 'cranelift', 'winch', 'debug-builtins', + 'pooling-allocator', # ... if you add a line above this be sure to change the other locations # marked WASMTIME_FEATURE_LIST ] @@ -60,5 +61,6 @@ gc-null = ["wasmtime-c-api/gc-null"] cranelift = ["wasmtime-c-api/cranelift"] winch = ["wasmtime-c-api/winch"] debug-builtins = ["wasmtime-c-api/debug-builtins"] +pooling-allocator = ["wasmtime-c-api/pooling-allocator"] # ... if you add a line above this be sure to read the comment at the end of # `default` diff --git a/crates/c-api/build.rs b/crates/c-api/build.rs index ffb80e2d15..9f256f0063 100644 --- a/crates/c-api/build.rs +++ b/crates/c-api/build.rs @@ -21,6 +21,7 @@ const FEATURES: &[&str] = &[ "WINCH", "DEBUG_BUILTINS", "WAT", + "POOLING_ALLOCATOR", ]; // ... if you add a line above this be sure to change the other locations // marked WASMTIME_FEATURE_LIST diff --git a/crates/c-api/cmake/features.cmake b/crates/c-api/cmake/features.cmake index 727412a043..4b98e89b64 100644 --- a/crates/c-api/cmake/features.cmake +++ b/crates/c-api/cmake/features.cmake @@ -44,5 +44,6 @@ feature(async ON) feature(cranelift ON) feature(winch ON) feature(debug-builtins ON) +feature(pooling-allocator ON) # ... if you add a line above this be sure to change the other locations # marked WASMTIME_FEATURE_LIST diff --git a/crates/c-api/doxygen.conf.in b/crates/c-api/doxygen.conf.in index 6ba0b993b7..4417b81819 100644 --- a/crates/c-api/doxygen.conf.in +++ b/crates/c-api/doxygen.conf.in @@ -942,6 +942,7 @@ EXCLUDE_SYMBOLS = assertions \ WASMTIME_DECLARE_OWN \ WASI_DECLARE_OWN \ WASMTIME_CONFIG_PROP \ + WASMTIME_POOLING_ALLOCATION_CONFIG_PROP \ own \ wasm_*_enum diff --git a/crates/c-api/include/doc-wasm.h b/crates/c-api/include/doc-wasm.h index 45afbecf91..d7911f0e9a 100644 --- a/crates/c-api/include/doc-wasm.h +++ b/crates/c-api/include/doc-wasm.h @@ -220,7 +220,7 @@ * vector should not be previously initialized and the caller is responsible for * calling #wasm_byte_vec_delete after this function returns. * - * Note that memory of the the initialization vector provided to this function + * Note that memory of the initialization vector provided to this function * must be managed externally. This function will copy the contents to the * output vector, but it's up to the caller to properly deallocate the memory. * diff --git a/crates/c-api/include/wasmtime/conf.h.in b/crates/c-api/include/wasmtime/conf.h.in index 03f4debf92..a89fc8d0d5 100644 --- a/crates/c-api/include/wasmtime/conf.h.in +++ b/crates/c-api/include/wasmtime/conf.h.in @@ -26,6 +26,7 @@ #cmakedefine WASMTIME_FEATURE_CRANELIFT #cmakedefine WASMTIME_FEATURE_WINCH #cmakedefine WASMTIME_FEATURE_DEBUG_BUILTINS +#cmakedefine WASMTIME_FEATURE_POOLING_ALLOCATOR // ... if you add a line above this be sure to change the other locations // marked WASMTIME_FEATURE_LIST diff --git a/crates/c-api/include/wasmtime/config.h b/crates/c-api/include/wasmtime/config.h index 4788ea9bb1..1acaeae175 100644 --- a/crates/c-api/include/wasmtime/config.h +++ b/crates/c-api/include/wasmtime/config.h @@ -542,6 +542,228 @@ wasmtime_config_host_memory_creator_set(wasm_config_t *, */ WASMTIME_CONFIG_PROP(void, memory_init_cow, bool) +#ifdef WASMTIME_FEATURE_POOLING_ALLOCATOR + +/** + * \brief A type containing configuration options for the pooling allocator. + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html + */ +typedef struct wasmtime_pooling_allocation_config_t + wasmtime_pooling_allocation_config_t; + +/** + * \brief Creates a new pooling allocation configuration object. Must be + * deallocated with a call to wasmtime_pooling_allocation_config_delete. + */ +WASM_API_EXTERN wasmtime_pooling_allocation_config_t * +wasmtime_pooling_allocation_config_new(); + +/** + * \brief Deallocates a pooling allocation configuration object created with a + * call to wasmtime_pooling_allocation_config_new. + */ +WASM_API_EXTERN void wasmtime_pooling_allocation_config_delete( + wasmtime_pooling_allocation_config_t *); + +#define WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(name, ty) \ + WASM_API_EXTERN void wasmtime_pooling_allocation_config_##name##_set( \ + wasmtime_pooling_allocation_config_t *, ty); + +/** + * \brief Configures the maximum number of “unused warm slots” to retain in the + * pooling allocator. + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.max_unused_warm_slots. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(max_unused_warm_slots, uint32_t) + +/** + * \brief The target number of decommits to do per batch. + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.decommit_batch_size. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(decommit_batch_size, size_t) + +#ifdef WASMTIME_FEATURE_ASYNC +/** + * \brief How much memory, in bytes, to keep resident for async stacks allocated + * with the pooling allocator. + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.async_stack_keep_resident. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(async_stack_keep_resident, size_t) +#endif + +/** + * \brief How much memory, in bytes, to keep resident for each linear memory + * after deallocation. + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.linear_memory_keep_resident. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(linear_memory_keep_resident, size_t) + +/** + * \brief How much memory, in bytes, to keep resident for each table after + * deallocation. + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.table_keep_resident. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(table_keep_resident, size_t) + +/** + * \brief The maximum number of concurrent component instances supported + * (default is 1000). + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.total_component_instances. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(total_component_instances, uint32_t) + +/** + * \brief The maximum size, in bytes, allocated for a component instance’s + * VMComponentContext metadata. + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.max_component_instance_size. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(max_component_instance_size, size_t) + +/** + * \brief The maximum number of core instances a single component may contain + * (default is unlimited). + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.max_core_instances_per_component. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(max_core_instances_per_component, + uint32_t) + +/** + * \brief The maximum number of Wasm linear memories that a single component may + * transitively contain (default is unlimited). + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.max_memories_per_component. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(max_memories_per_component, uint32_t) + +/** + * \brief The maximum number of tables that a single component may transitively + * contain (default is unlimited). + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.max_tables_per_component. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(max_tables_per_component, uint32_t) + +/** + * \brief The maximum number of concurrent Wasm linear memories supported + * (default is 1000). + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.total_memories. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(total_memories, uint32_t) + +/** + * \brief The maximum number of concurrent tables supported (default is 1000). + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.total_tables. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(total_tables, uint32_t) + +#ifdef WASMTIME_FEATURE_ASYNC +/** + * \brief The maximum number of execution stacks allowed for asynchronous + * execution, when enabled (default is 1000). + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.total_stacks. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(total_stacks, uint32_t) +#endif + +/** + * \brief The maximum number of concurrent core instances supported (default is + * 1000). + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.total_core_instances. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(total_core_instances, uint32_t) + +/** + * \brief The maximum size, in bytes, allocated for a core instance’s VMContext + * metadata. + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.max_core_instance_size. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(max_core_instance_size, size_t) + +/** + * \brief The maximum number of defined tables for a core module (default is 1). + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.max_tables_per_module. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(max_tables_per_module, uint32_t) + +/** + * \brief The maximum table elements for any table defined in a module (default + * is 20000). + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.table_elements. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(table_elements, size_t) + +/** + * \brief The maximum number of defined linear memories for a module (default is + * 1). + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.max_memories_per_module. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(max_memories_per_module, uint32_t) + +/** + * \brief The maximum byte size that any WebAssembly linear memory may grow to. + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.max_memory_size. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(max_memory_size, size_t) + +/** + * \brief The maximum number of concurrent GC heaps supported (default is 1000). + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.PoolingAllocationConfig.html#method.total_gc_heaps. + */ +WASMTIME_POOLING_ALLOCATION_CONFIG_PROP(total_gc_heaps, uint32_t) + +/** + * \brief Sets the Wasmtime allocation strategy to use the pooling allocator. It + * does not take ownership of the pooling allocation configuration object, which + * must be deleted with a call to wasmtime_pooling_allocation_config_delete. + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.Config.html#method.allocation_strategy. + */ +WASM_API_EXTERN void wasmtime_pooling_allocation_strategy_set( + wasm_config_t *, const wasmtime_pooling_allocation_config_t *); + +#endif // WASMTIME_FEATURE_POOLING_ALLOCATOR + #ifdef __cplusplus } // extern "C" #endif diff --git a/crates/c-api/src/config.rs b/crates/c-api/src/config.rs index 455802416c..53baad8815 100644 --- a/crates/c-api/src/config.rs +++ b/crates/c-api/src/config.rs @@ -7,9 +7,13 @@ use std::os::raw::c_char; use std::ptr; use std::{ffi::CStr, sync::Arc}; use wasmtime::{ - Config, LinearMemory, MemoryCreator, OptLevel, ProfilingStrategy, Result, Strategy, + Config, InstanceAllocationStrategy, LinearMemory, MemoryCreator, OptLevel, ProfilingStrategy, + Result, Strategy, }; +#[cfg(feature = "pooling-allocator")] +use wasmtime::PoolingAllocationConfig; + #[repr(C)] #[derive(Clone)] pub struct wasm_config_t { @@ -444,3 +448,216 @@ pub extern "C" fn wasmtime_config_memory_init_cow_set(c: &mut wasm_config_t, ena pub extern "C" fn wasmtime_config_wasm_wide_arithmetic_set(c: &mut wasm_config_t, enable: bool) { c.config.wasm_wide_arithmetic(enable); } + +#[repr(C)] +#[derive(Clone)] +#[cfg(feature = "pooling-allocator")] +pub struct wasmtime_pooling_allocation_config_t { + pub(crate) config: PoolingAllocationConfig, +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_new( +) -> Box { + Box::new(wasmtime_pooling_allocation_config_t { + config: PoolingAllocationConfig::default(), + }) +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_delete( + _: Box, +) { +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_max_unused_warm_slots_set( + c: &mut wasmtime_pooling_allocation_config_t, + max: u32, +) { + c.config.max_unused_warm_slots(max); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_decommit_batch_size_set( + c: &mut wasmtime_pooling_allocation_config_t, + batch_size: usize, +) { + c.config.decommit_batch_size(batch_size); +} + +#[unsafe(no_mangle)] +#[cfg(all(feature = "pooling-allocator", feature = "async"))] +pub extern "C" fn wasmtime_pooling_allocation_config_async_stack_keep_resident_set( + c: &mut wasmtime_pooling_allocation_config_t, + size: usize, +) { + c.config.async_stack_keep_resident(size); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_linear_memory_keep_resident_set( + c: &mut wasmtime_pooling_allocation_config_t, + size: usize, +) { + c.config.linear_memory_keep_resident(size); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_table_keep_resident_set( + c: &mut wasmtime_pooling_allocation_config_t, + size: usize, +) { + c.config.table_keep_resident(size); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_total_component_instances_set( + c: &mut wasmtime_pooling_allocation_config_t, + count: u32, +) { + c.config.total_component_instances(count); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_max_component_instance_size_set( + c: &mut wasmtime_pooling_allocation_config_t, + size: usize, +) { + c.config.max_component_instance_size(size); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_max_core_instances_per_component_set( + c: &mut wasmtime_pooling_allocation_config_t, + count: u32, +) { + c.config.max_core_instances_per_component(count); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_max_memories_per_component_set( + c: &mut wasmtime_pooling_allocation_config_t, + count: u32, +) { + c.config.max_memories_per_component(count); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_max_tables_per_component_set( + c: &mut wasmtime_pooling_allocation_config_t, + count: u32, +) { + c.config.max_tables_per_component(count); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_total_memories_set( + c: &mut wasmtime_pooling_allocation_config_t, + count: u32, +) { + c.config.total_memories(count); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_total_tables_set( + c: &mut wasmtime_pooling_allocation_config_t, + count: u32, +) { + c.config.total_tables(count); +} + +#[unsafe(no_mangle)] +#[cfg(all(feature = "pooling-allocator", feature = "async"))] +pub extern "C" fn wasmtime_pooling_allocation_config_total_stacks_set( + c: &mut wasmtime_pooling_allocation_config_t, + count: u32, +) { + c.config.total_stacks(count); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_total_core_instances_set( + c: &mut wasmtime_pooling_allocation_config_t, + count: u32, +) { + c.config.total_core_instances(count); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_max_core_instance_size_set( + c: &mut wasmtime_pooling_allocation_config_t, + size: usize, +) { + c.config.max_core_instance_size(size); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_max_tables_per_module_set( + c: &mut wasmtime_pooling_allocation_config_t, + tables: u32, +) { + c.config.max_tables_per_module(tables); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_table_elements_set( + c: &mut wasmtime_pooling_allocation_config_t, + elements: usize, +) { + c.config.table_elements(elements); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_max_memories_per_module_set( + c: &mut wasmtime_pooling_allocation_config_t, + memories: u32, +) { + c.config.max_memories_per_module(memories); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_config_max_memory_size_set( + c: &mut wasmtime_pooling_allocation_config_t, + bytes: usize, +) { + c.config.max_memory_size(bytes); +} + +#[unsafe(no_mangle)] +#[cfg(all(feature = "pooling-allocator", feature = "gc"))] +pub extern "C" fn wasmtime_pooling_allocation_config_total_gc_heaps_set( + c: &mut wasmtime_pooling_allocation_config_t, + count: u32, +) { + c.config.total_gc_heaps(count); +} + +#[unsafe(no_mangle)] +#[cfg(feature = "pooling-allocator")] +pub extern "C" fn wasmtime_pooling_allocation_strategy_set( + c: &mut wasm_config_t, + pc: &wasmtime_pooling_allocation_config_t, +) { + c.config + .allocation_strategy(InstanceAllocationStrategy::Pooling(pc.config.clone())); +} diff --git a/crates/c-api/src/profiling.rs b/crates/c-api/src/profiling.rs index 6c4e8f51be..cda09c4e33 100644 --- a/crates/c-api/src/profiling.rs +++ b/crates/c-api/src/profiling.rs @@ -34,7 +34,7 @@ pub unsafe extern "C" fn wasmtime_guestprofiler_new( entry.module.module.clone(), ) }) - .collect(); + .collect::>(); Box::new(wasmtime_guestprofiler_t { guest_profiler: GuestProfiler::new(module_name, Duration::from_nanos(interval_nanos), list), }) diff --git a/crates/cache/Cargo.toml b/crates/cache/Cargo.toml index 07375ff6ae..d76286acd3 100644 --- a/crates/cache/Cargo.toml +++ b/crates/cache/Cargo.toml @@ -14,7 +14,7 @@ workspace = true [dependencies] anyhow = { workspace = true, features = ['std'] } -base64 = "0.21.0" +base64 = { workspace = true } postcard = { workspace = true } directories-next = "2.0" log = { workspace = true } diff --git a/crates/cli-flags/Cargo.toml b/crates/cli-flags/Cargo.toml index 9a532e7577..23dc34036e 100644 --- a/crates/cli-flags/Cargo.toml +++ b/crates/cli-flags/Cargo.toml @@ -19,7 +19,6 @@ file-per-thread-logger = { workspace = true, optional = true } tracing-subscriber = { workspace = true, optional = true } rayon = { version = "1.5.0", optional = true } wasmtime = { workspace = true } -humantime = { workspace = true } serde = { workspace = true } serde_derive = { workspace = true } toml = { workspace = true } diff --git a/crates/cli-flags/src/lib.rs b/crates/cli-flags/src/lib.rs index bafdf377d9..d2bfe01949 100644 --- a/crates/cli-flags/src/lib.rs +++ b/crates/cli-flags/src/lib.rs @@ -364,6 +364,14 @@ wasmtime_option_group! { pub component_model: Option, /// Component model support for async lifting/lowering. pub component_model_async: Option, + /// Component model support for async lifting/lowering: this corresponds + /// to the 🚝 emoji in the component model specification. + pub component_model_async_builtins: Option, + /// Component model support for async lifting/lowering: this corresponds + /// to the 🚟 emoji in the component model specification. + pub component_model_async_stackful: Option, + /// TODO + pub component_model_error_context: Option, /// Configure support for the function-references proposal. pub function_references: Option, /// Configure support for the GC proposal. @@ -414,6 +422,8 @@ wasmtime_option_group! { /// Grant access to the given TCP listen socket #[serde(default)] pub tcplisten: Vec, + /// Enable support for WASI TLS (Transport Layer Security) imports (experimental) + pub tls: Option, /// Implement WASI Preview1 using new Preview2 implementation (true, default) or legacy /// implementation (false) pub preview2: Option, @@ -824,7 +834,9 @@ impl CommonOptions { if let Some(limit) = self.opts.pooling_total_tables { cfg.total_tables(limit); } - if let Some(limit) = self.opts.pooling_table_elements { + if let Some(limit) = self.opts.pooling_table_elements + .or(self.wasm.max_table_elements) + { cfg.table_elements(limit); } if let Some(limit) = self.opts.pooling_max_core_instance_size { @@ -835,7 +847,9 @@ impl CommonOptions { limit => cfg.total_stacks(limit), _ => err, } - if let Some(max) = self.opts.pooling_max_memory_size { + if let Some(max) = self.opts.pooling_max_memory_size + .or(self.wasm.max_memory_size) + { cfg.max_memory_size(max); } if let Some(size) = self.opts.pooling_decommit_batch_size { @@ -971,6 +985,9 @@ impl CommonOptions { if let Some(enable) = self.wasm.extended_const.or(all) { config.wasm_extended_const(enable); } + if let Some(enable) = self.wasm.component_model_error_context.or(all) { + config.wasm_component_model_error_context(enable); + } macro_rules! handle_conditionally_compiled { ($(($feature:tt, $field:tt, $method:tt))*) => ($( @@ -988,6 +1005,8 @@ impl CommonOptions { handle_conditionally_compiled! { ("component-model", component_model, wasm_component_model) ("component-model-async", component_model_async, wasm_component_model_async) + ("component-model-async", component_model_async_builtins, wasm_component_model_async_builtins) + ("component-model-async", component_model_async_stackful, wasm_component_model_async_stackful) ("threads", threads, wasm_threads) ("gc", gc, wasm_gc) ("gc", reference_types, wasm_reference_types) diff --git a/crates/cli-flags/src/opt.rs b/crates/cli-flags/src/opt.rs index 12bfb09fff..96518169d4 100644 --- a/crates/cli-flags/src/opt.rs +++ b/crates/cli-flags/src/opt.rs @@ -417,13 +417,42 @@ impl WasmtimeOptionValue for Duration { if let Ok(val) = s.parse() { return Ok(Duration::from_secs(val)); } - // ... otherwise try to parse it with units such as `3s` or `300ms` - let dur = humantime::parse_duration(&s)?; - Ok(dur) + + if let Some(num) = s.strip_suffix("s") { + if let Ok(val) = num.parse() { + return Ok(Duration::from_secs(val)); + } + } + if let Some(num) = s.strip_suffix("ms") { + if let Ok(val) = num.parse() { + return Ok(Duration::from_millis(val)); + } + } + if let Some(num) = s.strip_suffix("us").or(s.strip_suffix("μs")) { + if let Ok(val) = num.parse() { + return Ok(Duration::from_micros(val)); + } + } + if let Some(num) = s.strip_suffix("ns") { + if let Ok(val) = num.parse() { + return Ok(Duration::from_nanos(val)); + } + } + + bail!("failed to parse duration: {s}") } fn display(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", humantime::format_duration(*self)) + let subsec = self.subsec_nanos(); + if subsec == 0 { + write!(f, "{}s", self.as_secs()) + } else if subsec % 1_000 == 0 { + write!(f, "{}μs", self.as_micros()) + } else if subsec % 1_000_000 == 0 { + write!(f, "{}ms", self.as_millis()) + } else { + write!(f, "{}ns", self.as_nanos()) + } } } diff --git a/crates/component-macro/Cargo.toml b/crates/component-macro/Cargo.toml index 112cd0d69b..92182c6ae5 100644 --- a/crates/component-macro/Cargo.toml +++ b/crates/component-macro/Cargo.toml @@ -20,9 +20,9 @@ test = false doctest = false [dependencies] -anyhow = "1.0" -proc-macro2 = "1.0" -quote = "1.0" +anyhow = { workspace = true } +proc-macro2 = { workspace = true } +quote = { workspace = true } syn = { workspace = true, features = ["extra-traits"] } wasmtime-component-util = { workspace = true } wasmtime-wit-bindgen = { workspace = true } @@ -36,7 +36,7 @@ tracing = { workspace = true } # For use with the custom attributes test serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } -prettyplease = "0.2.19" +prettyplease = "0.2.31" similar = { workspace = true } [features] diff --git a/crates/component-macro/test-helpers/Cargo.toml b/crates/component-macro/test-helpers/Cargo.toml index 03d2b1372b..1f245a941c 100644 --- a/crates/component-macro/test-helpers/Cargo.toml +++ b/crates/component-macro/test-helpers/Cargo.toml @@ -15,5 +15,5 @@ test = false doctest = false [dependencies] -proc-macro2 = "1.0" -quote = "1.0" +proc-macro2 = { workspace = true } +quote = { workspace = true } diff --git a/crates/cranelift/Cargo.toml b/crates/cranelift/Cargo.toml index f20a91139c..1f4cac9061 100644 --- a/crates/cranelift/Cargo.toml +++ b/crates/cranelift/Cargo.toml @@ -31,7 +31,7 @@ smallvec = { workspace = true } thiserror = { workspace = true } cfg-if = { workspace = true } wasmtime-versioned-export-macros = { workspace = true } -itertools = "0.12" +itertools = { workspace = true } pulley-interpreter = { workspace = true, optional = true } [features] diff --git a/crates/cranelift/src/compiler.rs b/crates/cranelift/src/compiler.rs index 1b9e0fb167..4ecc3d0c56 100644 --- a/crates/cranelift/src/compiler.rs +++ b/crates/cranelift/src/compiler.rs @@ -6,7 +6,6 @@ use crate::{array_call_signature, CompiledFunction, ModuleTextBuilder}; use crate::{builder::LinkOptions, wasm_call_signature, BuiltinFunctionSignatures}; use anyhow::{Context as _, Result}; use cranelift_codegen::binemit::CodeOffset; -use cranelift_codegen::bitset::CompoundBitSet; use cranelift_codegen::ir::condcodes::IntCC; use cranelift_codegen::ir::{self, InstBuilder, MemFlags, UserExternalName, UserFuncName, Value}; use cranelift_codegen::isa::{ @@ -23,14 +22,15 @@ use std::any::Any; use std::cmp; use std::collections::HashMap; use std::mem; +use std::ops::Range; use std::path; use std::sync::{Arc, Mutex}; use wasmparser::{FuncValidatorAllocations, FunctionBody}; use wasmtime_environ::{ - AddressMapSection, BuiltinFunctionIndex, CacheStore, CompileError, DefinedFuncIndex, FlagValue, - FunctionBodyData, FunctionLoc, HostCall, ModuleTranslation, ModuleTypesBuilder, PtrSize, - RelocationTarget, StackMapInformation, StaticModuleIndex, TrapEncodingBuilder, TrapSentinel, - TripleExt, Tunables, VMOffsets, WasmFuncType, WasmFunctionInfo, WasmValType, + AddressMapSection, BuiltinFunctionIndex, CacheStore, CompileError, CompiledFunctionBody, + DefinedFuncIndex, FlagValue, FunctionBodyData, FunctionLoc, HostCall, ModuleTranslation, + ModuleTypesBuilder, PtrSize, RelocationTarget, StackMapSection, StaticModuleIndex, + TrapEncodingBuilder, TrapSentinel, TripleExt, Tunables, VMOffsets, WasmFuncType, WasmValType, }; #[cfg(feature = "component-model")] @@ -187,7 +187,7 @@ impl wasmtime_environ::Compiler for Compiler { func_index: DefinedFuncIndex, input: FunctionBodyData<'_>, types: &ModuleTypesBuilder, - ) -> Result<(WasmFunctionInfo, Box), CompileError> { + ) -> Result { let isa = &*self.isa; let module = &translation.module; let func_index = module.func_index(func_index); @@ -249,7 +249,7 @@ impl wasmtime_environ::Compiler for Compiler { .create_global_value(ir::GlobalValueData::VMContext); let interrupts_ptr = context.func.create_global_value(ir::GlobalValueData::Load { base: vmctx, - offset: i32::from(func_env.offsets.ptr.vmctx_runtime_limits()).into(), + offset: i32::from(func_env.offsets.ptr.vmctx_store_context()).into(), global_type: isa.pointer_type(), flags: MemFlags::trusted().with_readonly(), }); @@ -275,7 +275,7 @@ impl wasmtime_environ::Compiler for Compiler { &mut func_env, )?; - let (info, func) = compiler.finish_with_info( + let func = compiler.finish_with_info( Some((&body, &self.tunables)), &format!("wasm_func_{}", func_index.as_u32()), )?; @@ -284,7 +284,10 @@ impl wasmtime_environ::Compiler for Compiler { log::debug!("{:?} translated in {:?}", func_index, timing.total()); log::trace!("{:?} timing info\n{}", func_index, timing); - Ok((info, Box::new(func))) + Ok(CompiledFunctionBody { + code: Box::new(func), + needs_gc_heap: func_env.needs_gc_heap(), + }) } fn compile_array_to_wasm_trampoline( @@ -292,7 +295,7 @@ impl wasmtime_environ::Compiler for Compiler { translation: &ModuleTranslation<'_>, types: &ModuleTypesBuilder, def_func_index: DefinedFuncIndex, - ) -> Result, CompileError> { + ) -> Result { let func_index = translation.module.func_index(def_func_index); let sig = translation.module.functions[func_index] .signature @@ -329,12 +332,12 @@ impl wasmtime_environ::Compiler for Compiler { // what we are assuming with our offsets below. debug_assert_vmctx_kind(isa, &mut builder, vmctx, wasmtime_environ::VMCONTEXT_MAGIC); let offsets = VMOffsets::new(isa.pointer_bytes(), &translation.module); - let vm_runtime_limits_offset = offsets.ptr.vmctx_runtime_limits(); + let vm_store_context_offset = offsets.ptr.vmctx_store_context(); save_last_wasm_entry_fp( &mut builder, pointer_type, &offsets.ptr, - vm_runtime_limits_offset.into(), + vm_store_context_offset.into(), vmctx, ); @@ -359,16 +362,16 @@ impl wasmtime_environ::Compiler for Compiler { builder.ins().return_(&[true_return]); builder.finalize(); - Ok(Box::new(compiler.finish(&format!( - "array_to_wasm_{}", - func_index.as_u32(), - ))?)) + Ok(CompiledFunctionBody { + code: Box::new(compiler.finish(&format!("array_to_wasm_{}", func_index.as_u32(),))?), + needs_gc_heap: false, + }) } fn compile_wasm_to_array_trampoline( &self, wasm_func_ty: &WasmFuncType, - ) -> Result, CompileError> { + ) -> Result { let isa = &*self.isa; let pointer_type = isa.pointer_type(); let wasm_call_sig = wasm_call_signature(isa, wasm_func_ty, &self.tunables); @@ -432,9 +435,10 @@ impl wasmtime_environ::Compiler for Compiler { builder.ins().return_(&results); builder.finalize(); - Ok(Box::new(compiler.finish(&format!( - "wasm_to_array_trampoline_{wasm_func_ty}" - ))?)) + Ok(CompiledFunctionBody { + code: Box::new(compiler.finish(&format!("wasm_to_array_trampoline_{wasm_func_ty}"))?), + needs_gc_heap: false, + }) } fn append_code( @@ -450,6 +454,7 @@ impl wasmtime_environ::Compiler for Compiler { } let mut addrs = AddressMapSection::default(); let mut traps = TrapEncodingBuilder::default(); + let mut stack_maps = StackMapSection::default(); let mut ret = Vec::with_capacity(funcs.len()); for (i, (sym, func)) in funcs.iter().enumerate() { @@ -459,6 +464,11 @@ impl wasmtime_environ::Compiler for Compiler { let addr = func.address_map(); addrs.push(range.clone(), &addr.instructions); } + clif_to_env_stack_maps( + &mut stack_maps, + range.clone(), + func.buffer.user_stack_maps(), + ); traps.push(range.clone(), &func.traps().collect::>()); builder.append_padding(self.linkopts.padding_between_functions); let info = FunctionLoc { @@ -473,6 +483,7 @@ impl wasmtime_environ::Compiler for Compiler { if self.tunables.generate_address_map { addrs.append_to(obj); } + stack_maps.append_to(obj); traps.append_to(obj); Ok(ret) @@ -575,7 +586,7 @@ impl wasmtime_environ::Compiler for Compiler { fn compile_wasm_to_builtin( &self, index: BuiltinFunctionIndex, - ) -> Result, CompileError> { + ) -> Result { let isa = &*self.isa; let ptr_size = isa.pointer_bytes(); let pointer_type = isa.pointer_type(); @@ -644,9 +655,10 @@ impl wasmtime_environ::Compiler for Compiler { builder.ins().return_(&results); builder.finalize(); - Ok(Box::new( - compiler.finish(&format!("wasm_to_builtin_{}", index.name()))?, - )) + Ok(CompiledFunctionBody { + code: Box::new(compiler.finish(&format!("wasm_to_builtin_{}", index.name()))?), + needs_gc_heap: false, + }) } fn compiled_function_relocation_targets<'a>( @@ -963,16 +975,14 @@ impl FunctionCompiler<'_> { } fn finish(self, clif_filename: &str) -> Result { - let (info, func) = self.finish_with_info(None, clif_filename)?; - assert!(info.stack_maps.is_empty()); - Ok(func) + self.finish_with_info(None, clif_filename) } fn finish_with_info( mut self, body_and_tunables: Option<(&FunctionBody<'_>, &Tunables)>, clif_filename: &str, - ) -> Result<(WasmFunctionInfo, CompiledFunction), CompileError> { + ) -> Result { let context = &mut self.cx.codegen_context; let isa = &*self.compiler.isa; @@ -994,7 +1004,7 @@ impl FunctionCompiler<'_> { write!(output, "{}", context.func.display()).unwrap(); } - let mut compiled_code = compilation_result?; + let compiled_code = compilation_result?; // Give wasm functions, user defined code, a "preferred" alignment // instead of the minimum alignment as this can help perf in niche @@ -1054,45 +1064,35 @@ impl FunctionCompiler<'_> { } } - let stack_maps = - clif_to_env_stack_maps(compiled_code.buffer.take_user_stack_maps().into_iter()); compiled_function .set_sized_stack_slots(std::mem::take(&mut context.func.sized_stack_slots)); self.compiler.contexts.lock().unwrap().push(self.cx); - Ok(( - WasmFunctionInfo { - start_srcloc: compiled_function.metadata().address_map.start_srcloc, - stack_maps: stack_maps.into(), - }, - compiled_function, - )) + Ok(compiled_function) } } /// Convert from Cranelift's representation of a stack map to Wasmtime's /// compiler-agnostic representation. +/// +/// Here `section` is the wasmtime data section being created and `range` is the +/// range of the function being added. The `clif_stack_maps` entry is the raw +/// listing of stack maps from Cranelift. fn clif_to_env_stack_maps( - clif_stack_maps: impl ExactSizeIterator, -) -> Vec { - let mut stack_maps = Vec::with_capacity(clif_stack_maps.len()); - for (code_offset, mapped_bytes, stack_map) in clif_stack_maps { - let mut bitset = CompoundBitSet::new(); - for (ty, offset) in stack_map.entries() { + section: &mut StackMapSection, + range: Range, + clif_stack_maps: &[(CodeOffset, u32, ir::UserStackMap)], +) { + for (offset, frame_size, stack_map) in clif_stack_maps { + let mut frame_offsets = Vec::new(); + for (ty, frame_offset) in stack_map.entries() { assert_eq!(ty, ir::types::I32); - bitset.insert(usize::try_from(offset).unwrap()); + frame_offsets.push(frame_offset); } - if bitset.is_empty() { - continue; - } - let stack_map = wasmtime_environ::StackMap::new(mapped_bytes, bitset); - stack_maps.push(StackMapInformation { - code_offset, - stack_map, - }); + let code_offset = range.start + u64::from(*offset); + assert!(code_offset < range.end); + section.push(code_offset, *frame_size, frame_offsets.into_iter()); } - stack_maps.sort_unstable_by_key(|info| info.code_offset); - stack_maps } fn declare_and_call( diff --git a/crates/cranelift/src/compiler/component.rs b/crates/cranelift/src/compiler/component.rs index bccd257933..04d90afa8a 100644 --- a/crates/cranelift/src/compiler/component.rs +++ b/crates/cranelift/src/compiler/component.rs @@ -6,9 +6,8 @@ use cranelift_codegen::ir::condcodes::IntCC; use cranelift_codegen::ir::{self, InstBuilder, MemFlags, Value}; use cranelift_codegen::isa::{CallConv, TargetIsa}; use cranelift_frontend::FunctionBuilder; -use std::any::Any; -use wasmtime_environ::component::*; use wasmtime_environ::fact::SYNC_ENTER_FIXED_PARAMS; +use wasmtime_environ::{component::*, CompiledFunctionBody}; use wasmtime_environ::{ HostCall, ModuleInternedTypeIndex, PtrSize, TrapSentinel, Tunables, WasmFuncType, WasmValType, }; @@ -1527,7 +1526,7 @@ impl ComponentCompiler for Compiler { types: &ComponentTypesBuilder, index: TrampolineIndex, tunables: &Tunables, - ) -> Result>> { + ) -> Result> { let compile = |abi: Abi| -> Result<_> { let mut compiler = self.function_compiler(); let mut c = TrampolineCompiler::new( @@ -1571,10 +1570,12 @@ impl ComponentCompiler for Compiler { c.translate(&component.trampolines[index]); c.builder.finalize(); - Ok(Box::new(compiler.finish(&format!( - "component_trampoline_{}_{abi:?}", - index.as_u32(), - ))?)) + Ok(CompiledFunctionBody { + code: Box::new( + compiler.finish(&format!("component_trampoline_{}_{abi:?}", index.as_u32()))?, + ), + needs_gc_heap: false, + }) }; Ok(AllCallFunc { wasm_call: compile(Abi::Wasm)?, diff --git a/crates/cranelift/src/debug/transform/attr.rs b/crates/cranelift/src/debug/transform/attr.rs index 4b753e175a..5cbacc8b02 100644 --- a/crates/cranelift/src/debug/transform/attr.rs +++ b/crates/cranelift/src/debug/transform/attr.rs @@ -241,6 +241,7 @@ pub(crate) fn clone_die_attributes<'a>( frame_info, isa, ) + .expressions .filter(|i| { // Ignore empty range if let Ok((_, 0, _)) = i { @@ -296,28 +297,29 @@ pub(crate) fn clone_die_attributes<'a>( } else { // Conversion to loclist is required. if let Some(scope_ranges) = scope_ranges { - let exprs = expr - .build_with_locals(scope_ranges, addr_tr, frame_info, isa) + let built_expression = + expr.build_with_locals(scope_ranges, addr_tr, frame_info, isa); + let exprs = built_expression + .expressions .collect::, _>>()?; if exprs.is_empty() { continue; } - let found_single_expr = { - // Micro-optimization all expressions alike, use one exprloc. - let mut found_expr: Option = None; + // Micro-optimization all expressions alike, use one exprloc. + let mut single_expr: Option = None; + if built_expression.covers_entire_scope { for (_, _, expr) in &exprs { - if let Some(ref prev_expr) = found_expr { + if let Some(ref prev_expr) = single_expr { if expr == prev_expr { continue; // the same expression } - found_expr = None; + single_expr = None; break; } - found_expr = Some(expr.clone()) + single_expr = Some(expr.clone()) } - found_expr - }; - if let Some(expr) = found_single_expr { + } + if let Some(expr) = single_expr { write::AttributeValue::Exprloc(expr) } else if is_exprloc_to_loclist_allowed(attr.name()) { // Converting exprloc to loclist. diff --git a/crates/cranelift/src/debug/transform/expression.rs b/crates/cranelift/src/debug/transform/expression.rs index 1b27276c7e..5f68d63ec4 100644 --- a/crates/cranelift/src/debug/transform/expression.rs +++ b/crates/cranelift/src/debug/transform/expression.rs @@ -227,6 +227,11 @@ fn append_memory_deref( Ok(true) } +pub struct BuiltCompiledExpression { + pub expressions: TIter, + pub covers_entire_scope: bool, +} + impl CompiledExpression { pub fn is_simple(&self) -> bool { if let [CompiledExpressionPart::Code(_)] = self.parts.as_slice() { @@ -250,7 +255,9 @@ impl CompiledExpression { addr_tr: &'a AddressTransform, frame_info: Option<&'a FunctionFrameInfo>, isa: &'a dyn TargetIsa, - ) -> impl Iterator> + use<'a> { + ) -> BuiltCompiledExpression< + impl Iterator> + use<'a>, + > { enum BuildWithLocalsResult<'a> { Empty, Simple( @@ -284,18 +291,24 @@ impl CompiledExpression { } if scope.is_empty() { - return BuildWithLocalsResult::Empty; + return BuiltCompiledExpression { + expressions: BuildWithLocalsResult::Empty, + covers_entire_scope: false, + }; } // If it a simple DWARF code, no need in locals processing. Just translate // the scope ranges. if let [CompiledExpressionPart::Code(code)] = self.parts.as_slice() { - return BuildWithLocalsResult::Simple( - Box::new(scope.iter().flat_map(move |(wasm_start, wasm_end)| { - addr_tr.translate_ranges(*wasm_start, *wasm_end) - })), - code.clone(), - ); + return BuiltCompiledExpression { + expressions: BuildWithLocalsResult::Simple( + Box::new(scope.iter().flat_map(move |(wasm_start, wasm_end)| { + addr_tr.translate_ranges(*wasm_start, *wasm_end) + })), + code.clone(), + ), + covers_entire_scope: false, + }; } let vmctx_label = get_vmctx_value_label(); @@ -315,10 +328,11 @@ impl CompiledExpression { if self.need_deref { ranges_builder.process_label(vmctx_label); } - let ranges = ranges_builder.into_ranges(); - return BuildWithLocalsResult::Ranges(Box::new( + let ranges = ranges_builder.into_ranges(); + let expressions = BuildWithLocalsResult::Ranges(Box::new( ranges + .ranges .into_iter() .map( move |CachedValueLabelRange { @@ -402,6 +416,11 @@ impl CompiledExpression { ) .filter_map(Result::transpose), )); + + BuiltCompiledExpression { + expressions, + covers_entire_scope: ranges.covers_entire_scope, + } } } @@ -690,6 +709,12 @@ struct ValueLabelRangesBuilder<'a, 'b> { ranges: Vec, frame_info: Option<&'a FunctionFrameInfo<'b>>, processed_labels: HashSet, + covers_entire_scope: bool, +} + +struct BuiltValueLabelRanges { + ranges: TIter, + covers_entire_scope: bool, } impl<'a, 'b> ValueLabelRangesBuilder<'a, 'b> { @@ -725,6 +750,7 @@ impl<'a, 'b> ValueLabelRangesBuilder<'a, 'b> { ranges, frame_info, processed_labels: HashSet::new(), + covers_entire_scope: true, } } @@ -778,6 +804,7 @@ impl<'a, 'b> ValueLabelRangesBuilder<'a, 'b> { ranges[i].end = range_end; tail.start = range_end; ranges.insert(i + 1, tail); + self.covers_entire_scope = false; } assert!(ranges[i].end <= range_end); if range_start <= ranges[i].start { @@ -790,11 +817,14 @@ impl<'a, 'b> ValueLabelRangesBuilder<'a, 'b> { tail.start = range_start; tail.label_location.insert(label, loc); ranges.insert(i + 1, tail); + self.covers_entire_scope = false; } } } - pub fn into_ranges(self) -> impl Iterator + use<> { + pub fn into_ranges( + self, + ) -> BuiltValueLabelRanges + use<>> { // Ranges with not-enough labels are discarded. let processed_labels_len = self.processed_labels.len(); let is_valid_range = @@ -813,7 +843,11 @@ impl<'a, 'b> ValueLabelRangesBuilder<'a, 'b> { } dbi_log!(""); } - self.ranges.into_iter().filter(is_valid_range) + + BuiltValueLabelRanges { + ranges: self.ranges.into_iter().filter(is_valid_range), + covers_entire_scope: self.covers_entire_scope, + } } } @@ -1304,7 +1338,7 @@ mod tests { // No value labels, testing if entire function range coming through. let builder = ValueLabelRangesBuilder::new(&[(10, 20)], &addr_tr, Some(&fi), isa.as_ref()); - let ranges = builder.into_ranges().collect::>(); + let ranges = builder.into_ranges().ranges.collect::>(); assert_eq!(ranges.len(), 1); assert_eq!(ranges[0].func_index, 0); assert_eq!(ranges[0].start, 0); @@ -1315,7 +1349,7 @@ mod tests { ValueLabelRangesBuilder::new(&[(10, 20)], &addr_tr, Some(&fi), isa.as_ref()); builder.process_label(value_labels.0); builder.process_label(value_labels.1); - let ranges = builder.into_ranges().collect::>(); + let ranges = builder.into_ranges().ranges.collect::>(); assert_eq!(ranges.len(), 1); assert_eq!(ranges[0].start, 5); assert_eq!(ranges[0].end, 25); @@ -1327,7 +1361,7 @@ mod tests { builder.process_label(value_labels.0); builder.process_label(value_labels.1); builder.process_label(value_labels.2); - let ranges = builder.into_ranges().collect::>(); + let ranges = builder.into_ranges().ranges.collect::>(); // Result is two ranges @5..10 and @20..23 assert_eq!(ranges.len(), 2); assert_eq!(ranges[0].start, 5); diff --git a/crates/cranelift/src/debug/transform/simulate.rs b/crates/cranelift/src/debug/transform/simulate.rs index 1e8ab10400..2c88638e77 100644 --- a/crates/cranelift/src/debug/transform/simulate.rs +++ b/crates/cranelift/src/debug/transform/simulate.rs @@ -229,6 +229,7 @@ fn generate_vars( let loc_list_id = { let locs = CompiledExpression::from_label(*label) .build_with_locals(scope_ranges, addr_tr, Some(frame_info), isa) + .expressions .map(|i| { i.map(|(begin, length, data)| write::Location::StartLength { begin, diff --git a/crates/cranelift/src/debug/transform/utils.rs b/crates/cranelift/src/debug/transform/utils.rs index c23e98b4d4..7df0480ba0 100644 --- a/crates/cranelift/src/debug/transform/utils.rs +++ b/crates/cranelift/src/debug/transform/utils.rs @@ -20,6 +20,7 @@ pub(crate) fn append_vmctx_info( let expr = CompiledExpression::vmctx(); let locs = expr .build_with_locals(scope_ranges, addr_tr, frame_info, isa) + .expressions .map(|i| { i.map(|(begin, length, data)| write::Location::StartLength { begin, diff --git a/crates/cranelift/src/func_environ.rs b/crates/cranelift/src/func_environ.rs index d1f5ba1e97..0ee29a26a7 100644 --- a/crates/cranelift/src/func_environ.rs +++ b/crates/cranelift/src/func_environ.rs @@ -1,9 +1,11 @@ +mod gc; + use crate::compiler::Compiler; use crate::translate::{ FuncTranslationState, GlobalVariable, Heap, HeapData, StructFieldsVec, TableData, TableSize, TargetEnvironment, }; -use crate::{gc, BuiltinFunctionSignatures, TRAP_INTERNAL_ASSERT}; +use crate::{BuiltinFunctionSignatures, TRAP_INTERNAL_ASSERT}; use cranelift_codegen::cursor::FuncCursor; use cranelift_codegen::ir::condcodes::{FloatCC, IntCC}; use cranelift_codegen::ir::immediates::{Imm64, Offset32}; @@ -12,7 +14,7 @@ use cranelift_codegen::ir::types::*; use cranelift_codegen::ir::{self, types}; use cranelift_codegen::ir::{ArgumentPurpose, Function, InstBuilder, MemFlags}; use cranelift_codegen::isa::{TargetFrontendConfig, TargetIsa}; -use cranelift_entity::packed_option::ReservedValue; +use cranelift_entity::packed_option::ReservedValue as _; use cranelift_entity::{EntityRef, PrimaryMap, SecondaryMap}; use cranelift_frontend::FunctionBuilder; use cranelift_frontend::Variable; @@ -92,13 +94,14 @@ wasmtime_environ::foreach_builtin_function!(declare_function_signatures); pub struct FuncEnvironment<'module_environment> { compiler: &'module_environment Compiler, isa: &'module_environment (dyn TargetIsa + 'module_environment), - pub(crate) module: &'module_environment Module, - pub(crate) types: &'module_environment ModuleTypesBuilder, + module: &'module_environment Module, + types: &'module_environment ModuleTypesBuilder, wasm_func_ty: &'module_environment WasmFuncType, sig_ref_to_ty: SecondaryMap>, + needs_gc_heap: bool, #[cfg(feature = "gc")] - pub(crate) ty_to_gc_layout: std::collections::HashMap< + ty_to_gc_layout: std::collections::HashMap< wasmtime_environ::ModuleInternedTypeIndex, wasmtime_environ::GcLayout, >, @@ -120,12 +123,12 @@ pub struct FuncEnvironment<'module_environment> { pcc_vmctx_memtype: Option, /// Caches of signatures for builtin functions. - pub(crate) builtin_functions: BuiltinFunctions, + builtin_functions: BuiltinFunctions, /// Offsets to struct fields accessed by JIT code. pub(crate) offsets: VMOffsets, - pub(crate) tunables: &'module_environment Tunables, + tunables: &'module_environment Tunables, /// A function-local variable which stores the cached value of the amount of /// fuel remaining to execute. If used this is modified frequently so it's @@ -185,6 +188,7 @@ impl<'module_environment> FuncEnvironment<'module_environment> { types, wasm_func_ty, sig_ref_to_ty: SecondaryMap::default(), + needs_gc_heap: false, #[cfg(feature = "gc")] ty_to_gc_layout: std::collections::HashMap::new(), @@ -298,7 +302,7 @@ impl<'module_environment> FuncEnvironment<'module_environment> { base: vmctx, offset: Offset32::new(i32::try_from(from_offset).unwrap()), global_type: pointer_type, - flags: MemFlags::trusted().with_readonly(), + flags: MemFlags::trusted().with_readonly().with_can_move(), }); (global, 0) } @@ -312,12 +316,14 @@ impl<'module_environment> FuncEnvironment<'module_environment> { let pointer_type = self.pointer_type(); let vmctx = self.vmctx(builder.func); let base = builder.ins().global_value(pointer_type, vmctx); - let offset = i32::from(self.offsets.ptr.vmctx_runtime_limits()); + let offset = i32::from(self.offsets.ptr.vmctx_store_context()); debug_assert!(self.vmstore_context_ptr.is_reserved_value()); - self.vmstore_context_ptr = - builder - .ins() - .load(pointer_type, ir::MemFlags::trusted(), base, offset); + self.vmstore_context_ptr = builder.ins().load( + pointer_type, + ir::MemFlags::trusted().with_readonly().with_can_move(), + base, + offset, + ); } fn fuel_function_entry(&mut self, builder: &mut FunctionBuilder<'_>) { @@ -803,12 +809,12 @@ impl<'module_environment> FuncEnvironment<'module_environment> { .unwrap(); (vmctx, base_offset, current_elements_offset) } else { - let from_offset = self.offsets.vmctx_vmtable_import_from(index); + let from_offset = self.offsets.vmctx_vmtable_from(index); let table = func.create_global_value(ir::GlobalValueData::Load { base: vmctx, offset: Offset32::new(i32::try_from(from_offset).unwrap()), global_type: pointer_type, - flags: MemFlags::trusted().with_readonly(), + flags: MemFlags::trusted().with_readonly().with_can_move(), }); let base_offset = i32::from(self.offsets.vmtable_definition_base()); let current_elements_offset = @@ -832,7 +838,7 @@ impl<'module_environment> FuncEnvironment<'module_environment> { flags: if Some(table.limits.min) == table.limits.max { // A fixed-size table can't be resized so its base address won't // change. - MemFlags::trusted().with_readonly() + MemFlags::trusted().with_readonly().with_can_move() } else { MemFlags::trusted() }, @@ -1008,18 +1014,18 @@ impl<'module_environment> FuncEnvironment<'module_environment> { /// memtypes are in use, add a field to the original struct and /// generate a new memtype for the pointee. fn load_pointer_with_memtypes( - &self, + &mut self, func: &mut ir::Function, - value: ir::GlobalValue, offset: u32, readonly: bool, memtype: Option, ) -> (ir::GlobalValue, Option) { + let vmctx = self.vmctx(func); let pointee = func.create_global_value(ir::GlobalValueData::Load { - base: value, + base: vmctx, offset: Offset32::new(i32::try_from(offset).unwrap()), global_type: self.pointer_type(), - flags: MemFlags::trusted().with_readonly(), + flags: MemFlags::trusted().with_readonly().with_can_move(), }); let mt = memtype.map(|mt| { @@ -1153,7 +1159,7 @@ impl<'module_environment> FuncEnvironment<'module_environment> { ) -> ir::Value { let vmctx = self.vmctx_val(pos); let pointer_type = self.pointer_type(); - let mem_flags = ir::MemFlags::trusted().with_readonly(); + let mem_flags = ir::MemFlags::trusted().with_readonly().with_can_move(); // Load the base pointer of the array of `VMSharedTypeIndex`es. let shared_indices = pos.ins().load( @@ -1190,6 +1196,11 @@ impl<'module_environment> FuncEnvironment<'module_environment> { i32::from(self.offsets.ptr.vm_func_ref_type_index()), ) } + + /// Does this function need a GC heap? + pub fn needs_gc_heap(&self) -> bool { + self.needs_gc_heap + } } struct Call<'a, 'func, 'module_env> { @@ -1270,7 +1281,7 @@ impl<'a, 'func, 'module_env> Call<'a, 'func, 'module_env> { let vmctx = self.env.vmctx(self.builder.func); let base = self.builder.ins().global_value(pointer_type, vmctx); - let mem_flags = ir::MemFlags::trusted().with_readonly(); + let mem_flags = ir::MemFlags::trusted().with_readonly().with_can_move(); // Load the callee address. let body_offset = i32::try_from( @@ -1426,10 +1437,11 @@ impl<'a, 'func, 'module_env> Call<'a, 'func, 'module_env> { // anyway. if table.ref_type.nullable { if self.env.clif_memory_traps_enabled() { - let mem_flags = ir::MemFlags::trusted().with_readonly(); self.builder.ins().load( sig_id_type, - mem_flags.with_trap_code(Some(crate::TRAP_INDIRECT_CALL_TO_NULL)), + ir::MemFlags::trusted() + .with_readonly() + .with_trap_code(Some(crate::TRAP_INDIRECT_CALL_TO_NULL)), funcref_ptr, i32::from(self.env.offsets.ptr.vm_func_ref_type_index()), ); @@ -2048,8 +2060,7 @@ impl FuncEnvironment<'_> { libcall, &[vmctx, interned_type_index, data_index, data_offset, len], ); - let result = builder.func.dfg.first_result(call_inst); - Ok(builder.ins().ireduce(ir::types::I32, result)) + Ok(builder.func.dfg.first_result(call_inst)) } pub fn translate_array_new_elem( @@ -2071,8 +2082,7 @@ impl FuncEnvironment<'_> { libcall, &[vmctx, interned_type_index, elem_index, elem_offset, len], ); - let result = builder.func.dfg.first_result(call_inst); - Ok(builder.ins().ireduce(ir::types::I32, result)) + Ok(builder.func.dfg.first_result(call_inst)) } pub fn translate_array_copy( @@ -2252,12 +2262,13 @@ impl FuncEnvironment<'_> { builder: &mut FunctionBuilder, index: GlobalIndex, ) -> WasmResult { - let ty = self.module.globals[index].wasm_ty; + let global_ty = self.module.globals[index]; + let wasm_ty = global_ty.wasm_ty; debug_assert!( - ty.is_vmgcref_type(), + wasm_ty.is_vmgcref_type(), "We only use GlobalVariable::Custom for VMGcRef types" ); - let WasmValType::Ref(ty) = ty else { + let WasmValType::Ref(ref_ty) = wasm_ty else { unreachable!() }; @@ -2268,9 +2279,13 @@ impl FuncEnvironment<'_> { gc::gc_compiler(self)?.translate_read_gc_reference( self, builder, - ty, + ref_ty, src, - ir::MemFlags::trusted(), + if global_ty.mutability { + ir::MemFlags::trusted() + } else { + ir::MemFlags::trusted().with_readonly().with_can_move() + }, ) } @@ -2319,7 +2334,6 @@ impl FuncEnvironment<'_> { let from_offset = self.offsets.vmctx_vmmemory_pointer(def_index); let (memory, def_mt) = self.load_pointer_with_memtypes( func, - vmctx, from_offset, true, self.pcc_vmctx_memtype, @@ -2348,7 +2362,6 @@ impl FuncEnvironment<'_> { let from_offset = self.offsets.vmctx_vmmemory_import_from(index); let (memory, def_mt) = self.load_pointer_with_memtypes( func, - vmctx, from_offset, true, self.pcc_vmctx_memtype, @@ -2474,7 +2487,7 @@ impl FuncEnvironment<'_> { } }; - let mut flags = MemFlags::trusted().with_checked(); + let mut flags = MemFlags::trusted().with_checked().with_can_move(); if !memory.memory_may_move(self.tunables) { flags.set_readonly(); } diff --git a/crates/cranelift/src/gc.rs b/crates/cranelift/src/func_environ/gc.rs similarity index 92% rename from crates/cranelift/src/gc.rs rename to crates/cranelift/src/func_environ/gc.rs index 953be8f401..2c5aa19a83 100644 --- a/crates/cranelift/src/gc.rs +++ b/crates/cranelift/src/func_environ/gc.rs @@ -163,15 +163,19 @@ pub mod builtins { func: &mut ir::Function, ) -> WasmResult { #[cfg(feature = "gc")] - return Ok(func_env.builtin_functions.$name(func)); + { + func_env.needs_gc_heap = true; + return Ok(func_env.builtin_functions.$name(func)); + } #[cfg(not(feature = "gc"))] - let _ = (func, func_env); - #[cfg(not(feature = "gc"))] - return Err(wasmtime_environ::wasm_unsupported!( - "support for Wasm GC disabled at compile time because the `gc` cargo \ - feature was not enabled" - )); + { + let _ = (func, func_env); + return Err(wasmtime_environ::wasm_unsupported!( + "support for Wasm GC disabled at compile time because the `gc` cargo \ + feature was not enabled" + )); + } } )* }; diff --git a/crates/cranelift/src/gc/disabled.rs b/crates/cranelift/src/func_environ/gc/disabled.rs similarity index 100% rename from crates/cranelift/src/gc/disabled.rs rename to crates/cranelift/src/func_environ/gc/disabled.rs diff --git a/crates/cranelift/src/gc/enabled.rs b/crates/cranelift/src/func_environ/gc/enabled.rs similarity index 97% rename from crates/cranelift/src/gc/enabled.rs rename to crates/cranelift/src/func_environ/gc/enabled.rs index 3e769d2215..3f45454239 100644 --- a/crates/cranelift/src/gc/enabled.rs +++ b/crates/cranelift/src/func_environ/gc/enabled.rs @@ -1,6 +1,5 @@ -use super::GcCompiler; +use super::{ArrayInit, GcCompiler}; use crate::func_environ::{Extension, FuncEnvironment}; -use crate::gc::ArrayInit; use crate::translate::{StructFieldsVec, TargetEnvironment}; use crate::TRAP_INTERNAL_ASSERT; use cranelift_codegen::{ @@ -22,7 +21,11 @@ mod drc; mod null; /// Get the default GC compiler. -pub fn gc_compiler(func_env: &FuncEnvironment<'_>) -> WasmResult> { +pub fn gc_compiler(func_env: &mut FuncEnvironment<'_>) -> WasmResult> { + // If this function requires a GC compiler, that is not too bad of an + // over-approximation for it requiring a GC heap. + func_env.needs_gc_heap = true; + match func_env.tunables.collector { #[cfg(feature = "gc-drc")] Some(Collector::DeferredReferenceCounting) => Ok(Box::new(drc::DrcCompiler::default())), @@ -316,7 +319,7 @@ pub fn translate_struct_get( let struct_size = struct_layout.size; let struct_size_val = builder.ins().iconst(ir::types::I32, i64::from(struct_size)); - let field_offset = struct_layout.fields[field_index]; + let field_offset = struct_layout.fields[field_index].offset; let field_ty = &func_env.types.unwrap_struct(interned_type_index)?.fields[field_index]; let field_size = wasmtime_environ::byte_size_of_wasm_ty_in_gc_heap(&field_ty.element_type); assert!(field_offset + field_size <= struct_size); @@ -361,7 +364,7 @@ pub fn translate_struct_set( let struct_size = struct_layout.size; let struct_size_val = builder.ins().iconst(ir::types::I32, i64::from(struct_size)); - let field_offset = struct_layout.fields[field_index]; + let field_offset = struct_layout.fields[field_index].offset; let field_ty = &func_env.types.unwrap_struct(interned_type_index)?.fields[field_index]; let field_size = wasmtime_environ::byte_size_of_wasm_ty_in_gc_heap(&field_ty.element_type); assert!(field_offset + field_size <= struct_size); @@ -637,7 +640,8 @@ pub fn translate_array_fill( ); // Calculate the end address, just after the filled region. - let fill_size = uextend_i32_to_pointer_type(builder, func_env.pointer_type(), offset_in_elems); + let fill_size = builder.ins().imul(n, one_elem_size); + let fill_size = uextend_i32_to_pointer_type(builder, func_env.pointer_type(), fill_size); let fill_end = builder.ins().iadd(elem_addr, fill_size); let one_elem_size = @@ -657,9 +661,9 @@ pub fn translate_array_fill( .element_type; write_field_at_addr(func_env, builder, elem_ty, elem_addr, value) }, - )?; + ); log::trace!("translate_array_fill(..) -> {result:?}"); - Ok(result) + result } pub fn translate_array_len( @@ -680,9 +684,12 @@ pub fn translate_array_len( // don't know its length yet. Chicken and egg problem. BoundsCheck::Access(ir::types::I32.bytes()), ); - let result = builder - .ins() - .load(ir::types::I32, ir::MemFlags::trusted(), len_field, 0); + let result = builder.ins().load( + ir::types::I32, + ir::MemFlags::trusted().with_readonly(), + len_field, + 0, + ); log::trace!("translate_array_len(..) -> {result:?}"); Ok(result) } @@ -1134,12 +1141,11 @@ fn emit_array_size( func_env: &mut FuncEnvironment<'_>, builder: &mut FunctionBuilder<'_>, array_layout: &GcArrayLayout, - init: ArrayInit<'_>, + len: ir::Value, ) -> ir::Value { let base_size = builder .ins() .iconst(ir::types::I32, i64::from(array_layout.base_size)); - let len = init.len(&mut builder.cursor()); // `elems_size = len * elem_size` // @@ -1152,6 +1158,7 @@ fn emit_array_size( // i64 values, doing a 64-bit multiplication, and then checking the high // 32 bits of the multiplication's result. If the high 32 bits are not // all zeros, then the multiplication overflowed. + debug_assert_eq!(builder.func.dfg.value_type(len), ir::types::I32); let len = builder.ins().uextend(ir::types::I64, len); let elems_size_64 = builder .ins() @@ -1191,7 +1198,7 @@ fn initialize_struct_fields( ) -> WasmResult<()> { let struct_layout = func_env.struct_layout(struct_ty); let struct_size = struct_layout.size; - let field_offsets: SmallVec<[_; 8]> = struct_layout.fields.iter().copied().collect(); + let field_offsets: SmallVec<[_; 8]> = struct_layout.fields.iter().map(|f| f.offset).collect(); assert_eq!(field_offsets.len(), field_values.len()); assert!(!func_env.types[struct_ty].composite_type.shared); @@ -1241,7 +1248,7 @@ impl FuncEnvironment<'_> { /// Get the GC heap's base pointer. fn get_gc_heap_base(&mut self, builder: &mut FunctionBuilder) -> ir::Value { let ptr_ty = self.pointer_type(); - let flags = ir::MemFlags::trusted().with_readonly(); + let flags = ir::MemFlags::trusted().with_readonly().with_can_move(); let vmctx = self.vmctx(builder.func); let vmctx = builder.ins().global_value(ptr_ty, vmctx); @@ -1255,7 +1262,7 @@ impl FuncEnvironment<'_> { /// Get the GC heap's bound. fn get_gc_heap_bound(&mut self, builder: &mut FunctionBuilder) -> ir::Value { let ptr_ty = self.pointer_type(); - let flags = ir::MemFlags::trusted().with_readonly(); + let flags = ir::MemFlags::trusted().with_readonly().with_can_move(); let vmctx = self.vmctx(builder.func); let vmctx = builder.ins().global_value(ptr_ty, vmctx); @@ -1385,8 +1392,14 @@ impl FuncEnvironment<'_> { | WasmHeapType::ConcreteStruct(_) | WasmHeapType::None => false, - // Wrong type hierarchy: cannot be an i31. - WasmHeapType::Extern | WasmHeapType::NoExtern => false, + // Despite being a different type hierarchy, this *could* be an + // `i31` if it is the result of + // + // (extern.convert_any (ref.i31 ...)) + WasmHeapType::Extern => true, + + // Can only ever be `null`. + WasmHeapType::NoExtern => false, // Wrong type hierarchy, and also funcrefs are not GC-managed // types. Should have been caught by the assertion at the start of diff --git a/crates/cranelift/src/gc/enabled/drc.rs b/crates/cranelift/src/func_environ/gc/enabled/drc.rs similarity index 97% rename from crates/cranelift/src/gc/enabled/drc.rs rename to crates/cranelift/src/func_environ/gc/enabled/drc.rs index 68701dbe04..f3be7fdfb2 100644 --- a/crates/cranelift/src/gc/enabled/drc.rs +++ b/crates/cranelift/src/func_environ/gc/enabled/drc.rs @@ -2,9 +2,8 @@ //! barriers. use super::*; -use crate::gc::gc_compiler; use crate::translate::TargetEnvironment; -use crate::{func_environ::FuncEnvironment, gc::GcCompiler, TRAP_INTERNAL_ASSERT}; +use crate::{func_environ::FuncEnvironment, TRAP_INTERNAL_ASSERT}; use cranelift_codegen::ir::condcodes::IntCC; use cranelift_codegen::ir::{self, InstBuilder}; use cranelift_frontend::FunctionBuilder; @@ -260,9 +259,6 @@ impl DrcCompiler { } /// Emit CLIF to call the `gc_raw_alloc` libcall. -/// -/// It is the caller's responsibility to ensure that `size` fits within the -/// `VMGcKind`'s unused bits. fn emit_gc_raw_alloc( func_env: &mut FuncEnvironment<'_>, builder: &mut FunctionBuilder<'_>, @@ -288,7 +284,6 @@ fn emit_gc_raw_alloc( .call(gc_alloc_raw_builtin, &[vmctx, kind, ty, size, align]); let gc_ref = builder.func.dfg.first_result(call_inst); - let gc_ref = builder.ins().ireduce(ir::types::I32, gc_ref); builder.declare_value_needs_stack_map(gc_ref); gc_ref } @@ -317,7 +312,8 @@ impl GcCompiler for DrcCompiler { // First, compute the array's total size from its base size, element // size, and length. - let size = emit_array_size(func_env, builder, &array_layout, init); + let len = init.len(&mut builder.cursor()); + let size = emit_array_size(func_env, builder, &array_layout, len); // Second, now that we have the array object's total size, call the // `gc_alloc_raw` builtin libcall to allocate the array. @@ -436,6 +432,21 @@ impl GcCompiler for DrcCompiler { // null, or we are in dynamically unreachable code and should just trap. if let WasmHeapType::None = ty.heap_type { let null = builder.ins().iconst(reference_type, 0); + + // If the `flags` can trap, then we need to do an actual load. We + // might be relying on, e.g., this load trapping to raise a + // out-of-bounds-table-index trap, rather than successfully loading + // a null `noneref`. + // + // That said, while we will do the load, we won't use the loaded + // value, and will still use our null constant below. This will + // avoid an unnecessary load dependency, slightly improving the code + // we ultimately emit. This probably doesn't matter, but it is easy + // to do and can only improve things, so we do it. + if flags.trap_code().is_some() { + let _ = builder.ins().load(reference_type, flags, src, 0); + } + if !ty.nullable { // NB: Don't use an unconditional trap instruction, since that // is a block terminator, and we still need to integrate with @@ -443,6 +454,7 @@ impl GcCompiler for DrcCompiler { let zero = builder.ins().iconst(ir::types::I32, 0); builder.ins().trapz(zero, TRAP_INTERNAL_ASSERT); } + return Ok(null); }; diff --git a/crates/cranelift/src/gc/enabled/null.rs b/crates/cranelift/src/func_environ/gc/enabled/null.rs similarity index 99% rename from crates/cranelift/src/gc/enabled/null.rs rename to crates/cranelift/src/func_environ/gc/enabled/null.rs index 4239c77481..1d2989afa5 100644 --- a/crates/cranelift/src/gc/enabled/null.rs +++ b/crates/cranelift/src/func_environ/gc/enabled/null.rs @@ -5,8 +5,7 @@ //! anything. use super::*; -use crate::gc::gc_compiler; -use crate::{func_environ::FuncEnvironment, gc::GcCompiler}; +use crate::func_environ::FuncEnvironment; use cranelift_codegen::ir::{self, InstBuilder}; use cranelift_frontend::FunctionBuilder; use wasmtime_environ::VMSharedTypeIndex; @@ -166,7 +165,8 @@ impl GcCompiler for NullCompiler { // First, compute the array's total size from its base size, element // size, and length. - let size = emit_array_size(func_env, builder, &array_layout, init); + let len = init.len(&mut builder.cursor()); + let size = emit_array_size(func_env, builder, &array_layout, len); // Next, allocate the array. assert!(align.is_power_of_two()); diff --git a/crates/cranelift/src/lib.rs b/crates/cranelift/src/lib.rs index a98a9c04b7..076bf6a202 100644 --- a/crates/cranelift/src/lib.rs +++ b/crates/cranelift/src/lib.rs @@ -34,7 +34,6 @@ mod builder; mod compiler; mod debug; mod func_environ; -mod gc; mod translate; use self::compiler::Compiler; diff --git a/crates/cranelift/src/obj.rs b/crates/cranelift/src/obj.rs index 8cccc7690f..e0e9d9e860 100644 --- a/crates/cranelift/src/obj.rs +++ b/crates/cranelift/src/obj.rs @@ -30,6 +30,16 @@ use wasmtime_environ::{Compiler, TripleExt, Unsigned}; const TEXT_SECTION_NAME: &[u8] = b".text"; +fn text_align(compiler: &dyn Compiler) -> u64 { + // text pages will not be made executable with pulley, so the section + // doesn't need to be padded out to page alignment boundaries. + if compiler.triple().is_pulley() { + 0x1 + } else { + compiler.page_size_align() + } +} + /// A helper structure used to assemble the final text section of an executable, /// plus unwinding information and other related details. /// @@ -282,7 +292,7 @@ impl<'a> ModuleTextBuilder<'a> { let text = self.text.finish(&mut self.ctrl_plane); self.obj .section_mut(self.text_section) - .set_data(text, self.compiler.page_size_align()); + .set_data(text, text_align(self.compiler)); // Append the unwind information for all our functions, if necessary. self.unwind_info @@ -440,8 +450,7 @@ impl<'a> UnwindInfoBuilder<'a> { // This write will align the text section to a page boundary and then // return the offset at that point. This gives us the full size of the // text section at that point, after alignment. - let text_section_size = - obj.append_section_data(text_section, &[], compiler.page_size_align()); + let text_section_size = obj.append_section_data(text_section, &[], text_align(compiler)); if self.windows_xdata.len() > 0 { assert!(self.systemv_unwind_info.len() == 0); diff --git a/crates/environ/Cargo.toml b/crates/environ/Cargo.toml index dfad9a9d9d..e85aef15b3 100644 --- a/crates/environ/Cargo.toml +++ b/crates/environ/Cargo.toml @@ -42,6 +42,11 @@ smallvec = { workspace = true, features = ['serde'] } clap = { workspace = true, features = ['default'] } env_logger = { workspace = true } wat = { workspace = true } +# Fix a test parsing ELF files internally where the bytes themselves reside in a +# `Vec` with no alignment requirements on it. By enabling the `unaligned` +# feature we don't require anything to be aligned so it doesn't matter the +# alignment of the bytes that we're reading. +object = { workspace = true, features = ['unaligned'] } [[example]] name = "factc" diff --git a/crates/environ/fuzz/Cargo.toml b/crates/environ/fuzz/Cargo.toml index d6a1774bfe..026f741b88 100644 --- a/crates/environ/fuzz/Cargo.toml +++ b/crates/environ/fuzz/Cargo.toml @@ -17,7 +17,7 @@ wasmparser = { workspace = true } wasmprinter = { workspace = true } wat = { workspace = true } wasmtime-environ = { workspace = true } -component-fuzz-util = { workspace = true, optional = true } +wasmtime-test-util = { workspace = true, optional = true, features = ['component-fuzz'] } [[bin]] name = "fact-valid-module" @@ -30,5 +30,5 @@ required-features = ["component-model"] component-model = [ "wasmtime-environ/component-model", "wasmtime-environ/compile", - "dep:component-fuzz-util", + "dep:wasmtime-test-util", ] diff --git a/crates/environ/fuzz/fuzz_targets/fact-valid-module.rs b/crates/environ/fuzz/fuzz_targets/fact-valid-module.rs index 06a57929cf..aab09571d0 100644 --- a/crates/environ/fuzz/fuzz_targets/fact-valid-module.rs +++ b/crates/environ/fuzz/fuzz_targets/fact-valid-module.rs @@ -10,12 +10,12 @@ #![no_main] use arbitrary::Unstructured; -use component_fuzz_util::{TestCase, Type, MAX_TYPE_DEPTH}; use libfuzzer_sys::fuzz_target; use wasmparser::component_types::ComponentAnyTypeId; use wasmparser::{Parser, Payload, Validator, WasmFeatures}; use wasmtime_environ::component::*; use wasmtime_environ::fact::Module; +use wasmtime_test_util::component_fuzz::{TestCase, Type, MAX_TYPE_DEPTH}; const TYPE_COUNT: usize = 50; const MAX_ARITY: u32 = 5; @@ -220,10 +220,14 @@ fn target(data: &[u8]) -> arbitrary::Result<()> { panic!() } -fn convert_encoding(encoding: component_fuzz_util::StringEncoding) -> StringEncoding { +fn convert_encoding( + encoding: wasmtime_test_util::component_fuzz::StringEncoding, +) -> StringEncoding { match encoding { - component_fuzz_util::StringEncoding::Utf8 => StringEncoding::Utf8, - component_fuzz_util::StringEncoding::Utf16 => StringEncoding::Utf16, - component_fuzz_util::StringEncoding::Latin1OrUtf16 => StringEncoding::CompactUtf16, + wasmtime_test_util::component_fuzz::StringEncoding::Utf8 => StringEncoding::Utf8, + wasmtime_test_util::component_fuzz::StringEncoding::Utf16 => StringEncoding::Utf16, + wasmtime_test_util::component_fuzz::StringEncoding::Latin1OrUtf16 => { + StringEncoding::CompactUtf16 + } } } diff --git a/crates/environ/src/address_map.rs b/crates/environ/src/address_map.rs index a707d69b47..fe69dcebc6 100644 --- a/crates/environ/src/address_map.rs +++ b/crates/environ/src/address_map.rs @@ -55,7 +55,8 @@ fn parse_address_map( section: &[u8], ) -> Option<(&[U32Bytes], &[U32Bytes])> { let mut section = Bytes(section); - // NB: this matches the encoding written by `append_to` above. + // NB: this matches the encoding written by `append_to` in the + // `compile::address_map` module. let count = section.read::>().ok()?; let count = usize::try_from(count.get(LittleEndian)).ok()?; let (offsets, section) = diff --git a/crates/environ/src/builtin.rs b/crates/environ/src/builtin.rs index a446829af7..df1fa0a87a 100644 --- a/crates/environ/src/builtin.rs +++ b/crates/environ/src/builtin.rs @@ -89,7 +89,7 @@ macro_rules! foreach_builtin_function { module_interned_type_index: u32, size: u32, align: u32 - ) -> u64; + ) -> u32; // Intern a `funcref` into the GC heap, returning its // `FuncRefTableId`. @@ -133,7 +133,7 @@ macro_rules! foreach_builtin_function { data_index: u32, data_offset: u32, len: u32 - ) -> u64; + ) -> u32; // Builtin implementation of the `array.new_elem` instruction. #[cfg(feature = "gc")] @@ -143,7 +143,7 @@ macro_rules! foreach_builtin_function { elem_index: u32, elem_offset: u32, len: u32 - ) -> u64; + ) -> u32; // Builtin implementation of the `array.copy` instruction. #[cfg(feature = "gc")] @@ -285,7 +285,7 @@ macro_rules! declare_builtin_index_constructors { $rest_name:ident; )* ) => { - #[allow(missing_docs, reason = "macro-generated")] + #[expect(missing_docs, reason = "macro-generated")] pub const fn $this_name() -> Self { Self($index) } @@ -354,12 +354,15 @@ impl BuiltinFunctionIndex { (@get memory_atomic_wait32 u64) => (TrapSentinel::Negative); (@get memory_atomic_wait64 u64) => (TrapSentinel::Negative); - // GC-related functions return a 64-bit value which is negative to - // indicate a trap. + // GC returns an optional GC ref, encoded as a `u64` with a negative + // value indicating a trap. (@get gc u64) => (TrapSentinel::Negative); - (@get gc_alloc_raw u64) => (TrapSentinel::Negative); - (@get array_new_data u64) => (TrapSentinel::Negative); - (@get array_new_elem u64) => (TrapSentinel::Negative); + + // GC allocation functions return a u32 which is zero to indicate a + // trap. + (@get gc_alloc_raw u32) => (TrapSentinel::Falsy); + (@get array_new_data u32) => (TrapSentinel::Falsy); + (@get array_new_elem u32) => (TrapSentinel::Falsy); // The final epoch represents a trap (@get new_epoch u64) => (TrapSentinel::NegativeOne); diff --git a/crates/environ/src/compile/mod.rs b/crates/environ/src/compile/mod.rs index 5832ff9dfc..f5adaf3105 100644 --- a/crates/environ/src/compile/mod.rs +++ b/crates/environ/src/compile/mod.rs @@ -5,7 +5,7 @@ use crate::prelude::*; use crate::{obj, Tunables}; use crate::{ BuiltinFunctionIndex, DefinedFuncIndex, FlagValue, FuncIndex, FunctionLoc, ObjectKind, - PrimaryMap, StaticModuleIndex, TripleExt, WasmError, WasmFuncType, WasmFunctionInfo, + PrimaryMap, StaticModuleIndex, TripleExt, WasmError, WasmFuncType, }; use anyhow::Result; use object::write::{Object, SymbolId}; @@ -20,12 +20,14 @@ mod address_map; mod module_artifacts; mod module_environ; mod module_types; +mod stack_maps; mod trap_encoding; pub use self::address_map::*; pub use self::module_artifacts::*; pub use self::module_environ::*; pub use self::module_types::*; +pub use self::stack_maps::*; pub use self::trap_encoding::*; /// An error while compiling WebAssembly to machine code. @@ -176,6 +178,16 @@ pub enum SettingKind { Preset, } +/// The result of compiling a single function body. +pub struct CompiledFunctionBody { + /// The code. This is whatever type the `Compiler` implementation wants it + /// to be, we just shepherd it around. + pub code: Box, + /// Whether the compiled function needs a GC heap to run; that is, whether + /// it reads a struct field, allocates, an array, or etc... + pub needs_gc_heap: bool, +} + /// An implementation of a compiler which can compile WebAssembly functions to /// machine code and perform other miscellaneous tasks needed by the JIT runtime. pub trait Compiler: Send + Sync { @@ -184,19 +196,13 @@ pub trait Compiler: Send + Sync { /// The body of the function is available in `data` and configuration /// values are also passed in via `tunables`. Type information in /// `translation` is all relative to `types`. - /// - /// This function returns a tuple: - /// - /// 1. Metadata about the wasm function itself. - /// 2. The function itself, as an `Any` to get downcasted later when passed - /// to `append_code`. fn compile_function( &self, translation: &ModuleTranslation<'_>, index: DefinedFuncIndex, data: FunctionBodyData<'_>, types: &ModuleTypesBuilder, - ) -> Result<(WasmFunctionInfo, Box), CompileError>; + ) -> Result; /// Compile a trampoline for an array-call host function caller calling the /// `index`th Wasm function. @@ -208,7 +214,7 @@ pub trait Compiler: Send + Sync { translation: &ModuleTranslation<'_>, types: &ModuleTypesBuilder, index: DefinedFuncIndex, - ) -> Result, CompileError>; + ) -> Result; /// Compile a trampoline for a Wasm caller calling a array callee with the /// given signature. @@ -218,9 +224,9 @@ pub trait Compiler: Send + Sync { fn compile_wasm_to_array_trampoline( &self, wasm_func_ty: &WasmFuncType, - ) -> Result, CompileError>; + ) -> Result; - /// Creates a tramopline that can be used to call Wasmtime's implementation + /// Creates a trampoline that can be used to call Wasmtime's implementation /// of the builtin function specified by `index`. /// /// The trampoline created can technically have any ABI but currently has @@ -232,7 +238,7 @@ pub trait Compiler: Send + Sync { fn compile_wasm_to_builtin( &self, index: BuiltinFunctionIndex, - ) -> Result, CompileError>; + ) -> Result; /// Returns the list of relocations required for a function from one of the /// previous `compile_*` functions above. @@ -285,23 +291,29 @@ pub trait Compiler: Send + Sync { use target_lexicon::Architecture::*; let triple = self.triple(); + let (arch, flags) = match triple.architecture { + X86_32(_) => (Architecture::I386, 0), + X86_64 => (Architecture::X86_64, 0), + Arm(_) => (Architecture::Arm, 0), + Aarch64(_) => (Architecture::Aarch64, 0), + S390x => (Architecture::S390x, 0), + Riscv64(_) => (Architecture::Riscv64, 0), + // XXX: the `object` crate won't successfully build an object + // with relocations and such if it doesn't know the + // architecture, so just pretend we are riscv64. Yolo! + // + // Also note that we add some flags to `e_flags` in the object file + // to indicate that it's pulley, not actually riscv64. This is used + // by `wasmtime objdump` for example. + Pulley32 | Pulley32be => (Architecture::Riscv64, obj::EF_WASMTIME_PULLEY32), + Pulley64 | Pulley64be => (Architecture::Riscv64, obj::EF_WASMTIME_PULLEY64), + architecture => { + anyhow::bail!("target architecture {:?} is unsupported", architecture,); + } + }; let mut obj = Object::new( BinaryFormat::Elf, - match triple.architecture { - X86_32(_) => Architecture::I386, - X86_64 => Architecture::X86_64, - Arm(_) => Architecture::Arm, - Aarch64(_) => Architecture::Aarch64, - S390x => Architecture::S390x, - Riscv64(_) => Architecture::Riscv64, - // XXX: the `object` crate won't successfully build an object - // with relocations and such if it doesn't know the - // architecture, so just pretend we are riscv64. Yolo! - Pulley32 | Pulley64 | Pulley32be | Pulley64be => Architecture::Riscv64, - architecture => { - anyhow::bail!("target architecture {:?} is unsupported", architecture,); - } - }, + arch, match triple.endianness().unwrap() { target_lexicon::Endianness::Little => object::Endianness::Little, target_lexicon::Endianness::Big => object::Endianness::Big, @@ -309,10 +321,11 @@ pub trait Compiler: Send + Sync { ); obj.flags = FileFlags::Elf { os_abi: obj::ELFOSABI_WASMTIME, - e_flags: match kind { - ObjectKind::Module => obj::EF_WASMTIME_MODULE, - ObjectKind::Component => obj::EF_WASMTIME_COMPONENT, - }, + e_flags: flags + | match kind { + ObjectKind::Module => obj::EF_WASMTIME_MODULE, + ObjectKind::Component => obj::EF_WASMTIME_COMPONENT, + }, abi_version: 0, }; Ok(obj) diff --git a/crates/environ/src/compile/module_environ.rs b/crates/environ/src/compile/module_environ.rs index 15dcace442..9175d87cba 100644 --- a/crates/environ/src/compile/module_environ.rs +++ b/crates/environ/src/compile/module_environ.rs @@ -118,7 +118,7 @@ pub struct FunctionBodyData<'a> { } #[derive(Debug, Default)] -#[allow(missing_docs, reason = "self-describing fields")] +#[expect(missing_docs, reason = "self-describing fields")] pub struct DebugInfoData<'a> { pub dwarf: Dwarf<'a>, pub name_section: NameSection<'a>, @@ -131,13 +131,13 @@ pub struct DebugInfoData<'a> { pub debug_tu_index: gimli::DebugTuIndex>, } -#[allow(missing_docs, reason = "self-describing")] +#[expect(missing_docs, reason = "self-describing")] pub type Dwarf<'input> = gimli::Dwarf>; type Reader<'input> = gimli::EndianSlice<'input, gimli::LittleEndian>; #[derive(Debug, Default)] -#[allow(missing_docs, reason = "self-describing fields")] +#[expect(missing_docs, reason = "self-describing fields")] pub struct NameSection<'a> { pub module_name: Option<&'a str>, pub func_names: HashMap, @@ -145,7 +145,7 @@ pub struct NameSection<'a> { } #[derive(Debug, Default)] -#[allow(missing_docs, reason = "self-describing fields")] +#[expect(missing_docs, reason = "self-describing fields")] pub struct WasmFileInfo { pub path: Option, pub code_section_offset: u64, @@ -154,7 +154,7 @@ pub struct WasmFileInfo { } #[derive(Debug)] -#[allow(missing_docs, reason = "self-describing fields")] +#[expect(missing_docs, reason = "self-describing fields")] pub struct FunctionMetadata { pub params: Box<[WasmValType]>, pub locals: Box<[(u32, WasmValType)]>, diff --git a/crates/environ/src/compile/stack_maps.rs b/crates/environ/src/compile/stack_maps.rs new file mode 100644 index 0000000000..a02b5e7162 --- /dev/null +++ b/crates/environ/src/compile/stack_maps.rs @@ -0,0 +1,230 @@ +use crate::obj::ELF_WASMTIME_STACK_MAP; +use crate::prelude::*; +use cranelift_bitset::CompoundBitSet; +use object::write::{Object, StandardSegment}; +use object::{LittleEndian, SectionKind, U32Bytes}; + +/// Builder for the `ELF_WASMTIME_STACK_MAP` section in compiled executables. +/// +/// This format is parsed by `crate::stack_map`. +/// +/// The current layout of the format is: +/// +/// ```text +/// ┌─────────────────────┬───── 0x00 (relative, not necessarily aligned) +/// │ count: 4-byte LE │ +/// ├─────────────────────┼───── 0x04 +/// │ pc1: 4-byte LE │ +/// │ pc2: 4-byte LE │ +/// │ ... │ +/// │ pcN: 4-byte LE │ +/// ├─────────────────────┼───── 0x04 + 4 * count +/// │ offset1: 4-byte LE │ +/// │ offset1: 4-byte LE │ +/// │ ... │ +/// │ offsetN: 4-byte LE │ +/// ├─────────────────────┼───── 0x04 + 8 * count +/// │ data[0]: 4-byte LE │ +/// │ data[1]: 4-byte LE │ +/// │ ... │ +/// │ data[M]: 4-byte LE │ +/// └─────────────────────┴───── 0x04 + 8 * count + 4 * M +/// ``` +/// +/// Here `count` is the size of the `pcN` and `offsetN` arrays. The two arrays +/// are the same size and have corresponding entries in one another. When +/// looking up a stack map for a particular program counter: +/// +/// * A binary search is performed on the `pcN` array. +/// * The corresponding `offsetM` value is looked up once the `pcM` entry, +/// matching the lookup pc, is found. +/// * The `offsetM` value is used to access `data[offsetM]` which is an array of +/// 4-byte entries located after the `offset*` array. This stack map is then +/// encoded as below. +/// +/// This encoding scheme is chosen so parsing this data structure effectively +/// isn't required. It's usable at-rest from a compiled artifact in a section of +/// an executable. Notably having offsets into the data array means that a stack +/// map is just a slice into the data array, and the entire data structure can +/// be "parsed" by reading `count` and otherwise just making sure various +/// offsets are in-bounds. +/// +/// A stack map located at `data[offsetM]` is encoded as: +/// +/// ```text +/// ┌───────────────────────────────────────────────────────┐ +/// │ data[offsetM + 0]: frame_size: 4-byte LE │ +/// ├───────────────────────────────────────────────────────┤ +/// │ data[offsetM + 1]: count: 4-byte LE │ +/// ├───────────────────────────────────────────────────────┤ +/// │ data[offsetM + 2 + 0]: bitmap: 4-byte LE │ +/// │ data[offsetM + 2 + 1]: bitmap: 4-byte LE │ +/// │ ... │ +/// │ data[offsetM + 2 + count - 1]: bitmap: 4-byte LE │ +/// └───────────────────────────────────────────────────────┘ +/// ``` +/// +/// Here `frame_size` and `count` are always greater than 0. Entries in the bit +/// map represent `stack_slot / 4` so must be multiplied by 4 to get the actual +/// stack offset entry. This is because all stack slots are aligned at 4 bytes +/// so by dividing them all by 4 we're able to compress the bit map that much +/// more. +#[derive(Default)] +pub struct StackMapSection { + pcs: Vec>, + pointers_to_stack_map: Vec>, + stack_map_data: Vec>, + last_offset: u32, +} + +impl StackMapSection { + /// Appends stack map information for `code_offset` which has the specified + /// `frame_size` and `frame_offsets` are the active GC references. + pub fn push( + &mut self, + code_offset: u64, + frame_size: u32, + frame_offsets: impl ExactSizeIterator, + ) { + // NB: for now this only supports <=4GB text sections in object files. + // Alternative schemes will need to be created for >32-bit offsets to + // avoid making this section overly large. + let code_offset = u32::try_from(code_offset).unwrap(); + + // Sanity-check to ensure that functions are pushed in-order, otherwise + // the `pcs` array won't be sorted which is our goal. + assert!(code_offset >= self.last_offset); + self.last_offset = code_offset; + + // Skip encoding information for this code offset if there's not + // actually anything in the stack map. + if frame_offsets.len() == 0 { + return; + } + + // Record parallel entries in `pcs`/`pointers_to_stack_map`. + self.pcs.push(U32Bytes::new(LittleEndian, code_offset)); + self.pointers_to_stack_map.push(U32Bytes::new( + LittleEndian, + u32::try_from(self.stack_map_data.len()).unwrap(), + )); + + // The frame data starts with the frame size and is then followed by + // `offsets` represented as a bit set. + self.stack_map_data + .push(U32Bytes::new(LittleEndian, frame_size)); + + let mut bits = CompoundBitSet::::default(); + for offset in frame_offsets { + assert!(offset % 4 == 0); + bits.insert((offset / 4) as usize); + } + let count = bits.iter_scalars().count(); + self.stack_map_data + .push(U32Bytes::new(LittleEndian, count as u32)); + for scalar in bits.iter_scalars() { + self.stack_map_data + .push(U32Bytes::new(LittleEndian, scalar.0)); + } + } + + /// Finishes encoding this section into the `Object` provided. + pub fn append_to(self, obj: &mut Object) { + // Don't append anything for this section if there weren't any actual + // stack maps present, no need to waste space! + if self.pcs.is_empty() { + return; + } + let section = obj.add_section( + obj.segment_name(StandardSegment::Data).to_vec(), + ELF_WASMTIME_STACK_MAP.as_bytes().to_vec(), + SectionKind::ReadOnlyData, + ); + + // NB: this matches the encoding expected by `lookup` in the + // `crate::stack_maps` module. + let amt = u32::try_from(self.pcs.len()).unwrap(); + obj.append_section_data(section, &amt.to_le_bytes(), 1); + obj.append_section_data(section, object::bytes_of_slice(&self.pcs), 1); + obj.append_section_data( + section, + object::bytes_of_slice(&self.pointers_to_stack_map), + 1, + ); + obj.append_section_data(section, object::bytes_of_slice(&self.stack_map_data), 1); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::stack_map::StackMap; + use object::{Object, ObjectSection}; + + fn roundtrip(maps: &[(u64, u32, &[u32])]) { + let mut section = StackMapSection::default(); + for (pc, frame, offsets) in maps { + println!("append {pc}"); + section.push(*pc, *frame, offsets.iter().copied()); + } + let mut object = object::write::Object::new( + object::BinaryFormat::Elf, + object::Architecture::X86_64, + object::Endianness::Little, + ); + section.append_to(&mut object); + let elf = object.write().unwrap(); + + let image = object::File::parse(&elf[..]).unwrap(); + let data = image + .sections() + .find(|s| s.name().ok() == Some(ELF_WASMTIME_STACK_MAP)) + .unwrap() + .data() + .unwrap(); + + for (pc, frame, offsets) in maps { + println!("lookup {pc}"); + let map = match StackMap::lookup(*pc as u32, data) { + Some(map) => map, + None => { + assert!(offsets.is_empty()); + continue; + } + }; + assert_eq!(map.frame_size(), *frame); + + let map_offsets = map.offsets().collect::>(); + assert_eq!(map_offsets, *offsets); + } + + let mut expected = maps.iter(); + 'outer: for (pc, map) in StackMap::iter(data).unwrap() { + while let Some((expected_pc, expected_frame, expected_offsets)) = expected.next() { + if expected_offsets.is_empty() { + continue; + } + assert_eq!(*expected_pc, u64::from(pc)); + assert_eq!(*expected_frame, map.frame_size()); + let offsets = map.offsets().collect::>(); + assert_eq!(offsets, *expected_offsets); + continue 'outer; + } + panic!("didn't find {pc:#x} in expected list"); + } + assert!(expected.next().is_none()); + } + + #[test] + fn roundtrip_many() { + roundtrip(&[(0, 4, &[0])]); + roundtrip(&[ + (0, 4, &[0]), + (4, 200, &[0, 4, 20, 180]), + (200, 20, &[12]), + (600, 0, &[]), + (800, 20, &[0, 4, 8, 12, 16]), + (1200, 2000, &[1800, 1804, 1808, 1900]), + ]); + } +} diff --git a/crates/environ/src/component/compiler.rs b/crates/environ/src/component/compiler.rs index b4320ec407..b65f1da0a4 100644 --- a/crates/environ/src/component/compiler.rs +++ b/crates/environ/src/component/compiler.rs @@ -1,8 +1,6 @@ use crate::component::{AllCallFunc, ComponentTranslation, ComponentTypesBuilder, TrampolineIndex}; -use crate::prelude::*; -use crate::Tunables; +use crate::{CompiledFunctionBody, Tunables}; use anyhow::Result; -use std::any::Any; /// Compilation support necessary for components. pub trait ComponentCompiler: Send + Sync { @@ -18,5 +16,5 @@ pub trait ComponentCompiler: Send + Sync { types: &ComponentTypesBuilder, trampoline: TrampolineIndex, tunables: &Tunables, - ) -> Result>>; + ) -> Result>; } diff --git a/crates/environ/src/component/dfg.rs b/crates/environ/src/component/dfg.rs index b58c52e61a..c0f20216f6 100644 --- a/crates/environ/src/component/dfg.rs +++ b/crates/environ/src/component/dfg.rs @@ -166,7 +166,7 @@ pub enum SideEffect { macro_rules! id { ($(pub struct $name:ident(u32);)*) => ($( #[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)] - #[allow(missing_docs, reason = "tedious to document")] + #[expect(missing_docs, reason = "tedious to document")] pub struct $name(u32); cranelift_entity::entity_impl!($name); )*) @@ -175,6 +175,7 @@ macro_rules! id { id! { pub struct InstanceId(u32); pub struct MemoryId(u32); + pub struct TableId(u32); pub struct ReallocId(u32); pub struct CallbackId(u32); pub struct AdapterId(u32); @@ -183,7 +184,7 @@ id! { } /// Same as `info::InstantiateModule` -#[allow(missing_docs, reason = "tedious to document variants")] +#[expect(missing_docs, reason = "tedious to document variants")] pub enum Instance { Static(StaticModuleIndex, Box<[CoreDef]>), Import( @@ -193,7 +194,7 @@ pub enum Instance { } /// Same as `info::Export` -#[allow(missing_docs, reason = "tedious to document variants")] +#[expect(missing_docs, reason = "tedious to document variants")] pub enum Export { LiftedFunction { ty: TypeFuncIndex, @@ -217,7 +218,7 @@ pub enum Export { /// Same as `info::CoreDef`, except has an extra `Adapter` variant. #[derive(Debug, Clone, Hash, Eq, PartialEq)] -#[allow(missing_docs, reason = "tedious to document variants")] +#[expect(missing_docs, reason = "tedious to document variants")] pub enum CoreDef { Export(CoreExport), InstanceFlags(RuntimeComponentInstanceIndex), @@ -244,14 +245,14 @@ where /// Same as `info::CoreExport` #[derive(Debug, Clone, Hash, Eq, PartialEq)] -#[allow(missing_docs, reason = "self-describing fields")] +#[expect(missing_docs, reason = "self-describing fields")] pub struct CoreExport { pub instance: InstanceId, pub item: ExportItem, } impl CoreExport { - #[allow(missing_docs, reason = "self-describing function")] + #[expect(missing_docs, reason = "self-describing function")] pub fn map_index(self, f: impl FnOnce(T) -> U) -> CoreExport { CoreExport { instance: self.instance, @@ -265,7 +266,7 @@ impl CoreExport { /// Same as `info::Trampoline` #[derive(Clone, PartialEq, Eq, Hash)] -#[allow(missing_docs, reason = "self-describing fields")] +#[expect(missing_docs, reason = "self-describing fields")] pub enum Trampoline { LowerImport { import: RuntimeImportIndex, @@ -401,14 +402,14 @@ pub enum Trampoline { } #[derive(Copy, Clone, Hash, Eq, PartialEq)] -#[allow(missing_docs, reason = "self-describing fields")] +#[expect(missing_docs, reason = "self-describing fields")] pub struct FutureInfo { pub instance: RuntimeComponentInstanceIndex, pub payload_type: Option, } #[derive(Copy, Clone, Hash, Eq, PartialEq)] -#[allow(missing_docs, reason = "self-describing fields")] +#[expect(missing_docs, reason = "self-describing fields")] pub struct StreamInfo { pub instance: RuntimeComponentInstanceIndex, pub payload_type: InterfaceType, @@ -416,7 +417,7 @@ pub struct StreamInfo { /// Same as `info::CanonicalOptions` #[derive(Clone, Hash, Eq, PartialEq)] -#[allow(missing_docs, reason = "self-describing fields")] +#[expect(missing_docs, reason = "self-describing fields")] pub struct CanonicalOptions { pub instance: RuntimeComponentInstanceIndex, pub string_encoding: StringEncoding, @@ -428,7 +429,7 @@ pub struct CanonicalOptions { } /// Same as `info::Resource` -#[allow(missing_docs, reason = "self-describing fields")] +#[expect(missing_docs, reason = "self-describing fields")] pub struct Resource { pub rep: WasmValType, pub dtor: Option, @@ -499,6 +500,7 @@ impl ComponentDfg { dfg: &self, initializers: Vec::new(), runtime_memories: Default::default(), + runtime_tables: Default::default(), runtime_post_return: Default::default(), runtime_reallocs: Default::default(), runtime_callbacks: Default::default(), @@ -540,6 +542,7 @@ impl ComponentDfg { num_lowerings: linearize.num_lowerings, num_runtime_memories: linearize.runtime_memories.len() as u32, + num_runtime_tables: linearize.runtime_tables.len() as u32, num_runtime_post_returns: linearize.runtime_post_return.len() as u32, num_runtime_reallocs: linearize.runtime_reallocs.len() as u32, num_runtime_callbacks: linearize.runtime_callbacks.len() as u32, @@ -576,6 +579,7 @@ struct LinearizeDfg<'a> { trampoline_defs: PrimaryMap, trampoline_map: HashMap, runtime_memories: HashMap, + runtime_tables: HashMap, runtime_reallocs: HashMap, runtime_callbacks: HashMap, runtime_post_return: HashMap, diff --git a/crates/environ/src/component/info.rs b/crates/environ/src/component/info.rs index 842440e035..41e9e717ef 100644 --- a/crates/environ/src/component/info.rs +++ b/crates/environ/src/component/info.rs @@ -141,6 +141,10 @@ pub struct Component { /// stored in two different locations). pub num_runtime_memories: u32, + /// The number of runtime tables (maximum `RuntimeTableIndex`) needed to + /// instantiate this component. See notes on `num_runtime_memories`. + pub num_runtime_tables: u32, + /// The number of runtime reallocs (maximum `RuntimeReallocIndex`) needed to /// instantiate this component. /// @@ -215,10 +219,11 @@ impl Component { } } -/// GlobalInitializer instructions to get processed when instantiating a component +/// GlobalInitializer instructions to get processed when instantiating a +/// component. /// -/// The variants of this enum are processed during the instantiation phase of -/// a component in-order from front-to-back. These are otherwise emitted as a +/// The variants of this enum are processed during the instantiation phase of a +/// component in-order from front-to-back. These are otherwise emitted as a /// component is parsed and read and translated. // // FIXME(#2639) if processing this list is ever a bottleneck we could @@ -257,11 +262,10 @@ pub enum GlobalInitializer { /// A core wasm linear memory is going to be saved into the /// `VMComponentContext`. /// - /// This instruction indicates that the `index`th core wasm linear memory - /// needs to be extracted from the `export` specified, a pointer to a - /// previously created module instance, and stored into the - /// `VMComponentContext` at the `index` specified. This lowering is then - /// used in the future by pointers from `CanonicalOptions`. + /// This instruction indicates that a core wasm linear memory needs to be + /// extracted from the `export` and stored into the `VMComponentContext` at + /// the `index` specified. This lowering is then used in the future by + /// pointers from `CanonicalOptions`. ExtractMemory(ExtractMemory), /// Same as `ExtractMemory`, except it's extracting a function pointer to be @@ -276,14 +280,24 @@ pub enum GlobalInitializer { /// used as a `post-return` function. ExtractPostReturn(ExtractPostReturn), + /// A core wasm table is going to be saved into the `VMComponentContext`. + /// + /// This instruction indicates that s core wasm table needs to be extracted + /// from its `export` and stored into the `VMComponentContext` at the + /// `index` specified. During this extraction, we will also capture the + /// table's containing instance pointer to access the table at runtime. This + /// extraction is useful for `thread.spawn_indirect`. + ExtractTable(ExtractTable), + /// Declares a new defined resource within this component. /// /// Contains information about the destructor, for example. Resource(Resource), } -/// Metadata for extraction of a memory of what's being extracted and where it's -/// going. +/// Metadata for extraction of a memory; contains what's being extracted (the +/// memory at `export`) and where it's going (the `index` within a +/// `VMComponentContext`). #[derive(Debug, Serialize, Deserialize)] pub struct ExtractMemory { /// The index of the memory being defined. @@ -319,6 +333,15 @@ pub struct ExtractPostReturn { pub def: CoreDef, } +/// Metadata for extraction of a table. +#[derive(Debug, Serialize, Deserialize)] +pub struct ExtractTable { + /// The index of the table being defined in a `VMComponentContext`. + pub index: RuntimeTableIndex, + /// Where this table is being extracted from. + pub export: CoreExport, +} + /// Different methods of instantiating a core wasm module. #[derive(Debug, Serialize, Deserialize)] pub enum InstantiateModule { @@ -488,7 +511,7 @@ pub struct CanonicalOptions { /// Possible encodings of strings within the component model. #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)] -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] pub enum StringEncoding { Utf8, Utf16, @@ -515,7 +538,7 @@ impl StringEncoding { /// /// Note that each transcoding operation may have a unique signature depending /// on the precise operation. -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] #[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)] pub enum Transcode { Copy(FixedEncoding), @@ -571,7 +594,7 @@ impl Transcode { } #[derive(Debug, Copy, Clone, Hash, Eq, PartialEq, Serialize, Deserialize)] -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] pub enum FixedEncoding { Utf8, Utf16, diff --git a/crates/environ/src/component/translate.rs b/crates/environ/src/component/translate.rs index fc2aeaecfd..752b46e29a 100644 --- a/crates/environ/src/component/translate.rs +++ b/crates/environ/src/component/translate.rs @@ -3,8 +3,8 @@ use crate::prelude::*; use crate::ScopeVec; use crate::{ EngineOrModuleTypeIndex, EntityIndex, ModuleEnvironment, ModuleInternedTypeIndex, - ModuleTranslation, ModuleTypesBuilder, PrimaryMap, Tunables, TypeConvert, WasmHeapType, - WasmResult, WasmValType, + ModuleTranslation, ModuleTypesBuilder, PrimaryMap, TagIndex, Tunables, TypeConvert, + WasmHeapType, WasmResult, WasmValType, }; use anyhow::anyhow; use anyhow::{bail, Result}; @@ -329,6 +329,7 @@ enum LocalInitializer<'data> { AliasExportTable(ModuleInstanceIndex, &'data str), AliasExportGlobal(ModuleInstanceIndex, &'data str), AliasExportMemory(ModuleInstanceIndex, &'data str), + AliasExportTag(ModuleInstanceIndex, &'data str), AliasComponentExport(ComponentInstanceIndex, &'data str), AliasModule(ClosedOverModule), AliasComponent(ClosedOverComponent), @@ -1058,9 +1059,10 @@ impl<'a, 'data> Translator<'a, 'data> { let index = GlobalIndex::from_u32(export.index); EntityIndex::Global(index) } - - // doesn't get past validation - wasmparser::ExternalKind::Tag => unimplemented!("wasm exceptions"), + wasmparser::ExternalKind::Tag => { + let index = TagIndex::from_u32(export.index); + EntityIndex::Tag(index) + } }; map.insert(export.name, idx); } @@ -1142,9 +1144,7 @@ impl<'a, 'data> Translator<'a, 'data> { wasmparser::ExternalKind::Memory => LocalInitializer::AliasExportMemory(instance, name), wasmparser::ExternalKind::Table => LocalInitializer::AliasExportTable(instance, name), wasmparser::ExternalKind::Global => LocalInitializer::AliasExportGlobal(instance, name), - wasmparser::ExternalKind::Tag => { - unimplemented!("wasm exceptions"); - } + wasmparser::ExternalKind::Tag => LocalInitializer::AliasExportTag(instance, name), } } diff --git a/crates/environ/src/component/translate/inline.rs b/crates/environ/src/component/translate/inline.rs index 0b6f77f6a0..4f270a4087 100644 --- a/crates/environ/src/component/translate/inline.rs +++ b/crates/environ/src/component/translate/inline.rs @@ -204,6 +204,7 @@ struct InlinerFrame<'a> { memories: PrimaryMap>, tables: PrimaryMap>, globals: PrimaryMap>, + tags: PrimaryMap>, modules: PrimaryMap>, // component model index spaces @@ -1166,6 +1167,15 @@ impl<'a> Inliner<'a> { ); } + AliasExportTag(instance, name) => { + frame.tags.push( + match self.core_def_of_module_instance_export(frame, *instance, *name) { + dfg::CoreDef::Export(e) => e, + _ => unreachable!(), + }, + ); + } + AliasComponentExport(instance, name) => { match &frame.component_instances[*instance] { // Aliasing an export from an imported instance means that @@ -1482,6 +1492,7 @@ impl<'a> InlinerFrame<'a> { memories: Default::default(), tables: Default::default(), globals: Default::default(), + tags: Default::default(), component_instances: Default::default(), component_funcs: Default::default(), diff --git a/crates/environ/src/component/types.rs b/crates/environ/src/component/types.rs index 20d2d14236..078b5227c6 100644 --- a/crates/environ/src/component/types.rs +++ b/crates/environ/src/component/types.rs @@ -222,6 +222,14 @@ indices! { /// Same as `RuntimeMemoryIndex` except for the `post-return` function. pub struct RuntimePostReturnIndex(u32); + /// Index representing a table extracted from a wasm instance which is + /// stored in a `VMComponentContext`. This is used to deduplicate references + /// to the same table when it's only stored once in a `VMComponentContext`. + /// + /// This does not correspond to anything in the binary format for the + /// component model. + pub struct RuntimeTableIndex(u32); + /// Index for all trampolines that are compiled in Cranelift for a /// component. /// @@ -241,7 +249,7 @@ pub use crate::{FuncIndex, GlobalIndex, MemoryIndex, TableIndex}; /// Equivalent of `EntityIndex` but for the component model instead of core /// wasm. #[derive(Debug, Clone, Copy)] -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] pub enum ComponentItem { Func(ComponentFuncIndex), Module(ModuleIndex), @@ -546,7 +554,7 @@ pub struct TypeFunc { /// forms where for non-primitive types a `ComponentTypes` structure is used to /// lookup further information based on the index found here. #[derive(Serialize, Deserialize, Copy, Clone, Hash, Eq, PartialEq, Debug)] -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] pub enum InterfaceType { Bool, S8, @@ -1179,7 +1187,7 @@ impl FlatTypes<'_> { // regardless to changes in the core wasm type system since this will only // ever use integers/floats for the foreseeable future. #[derive(Serialize, Deserialize, Hash, Debug, PartialEq, Eq, Copy, Clone)] -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] pub enum FlatType { I32, I64, diff --git a/crates/environ/src/component/vmcomponent_offsets.rs b/crates/environ/src/component/vmcomponent_offsets.rs index 9dbc0ee1a5..6f256b4966 100644 --- a/crates/environ/src/component/vmcomponent_offsets.rs +++ b/crates/environ/src/component/vmcomponent_offsets.rs @@ -8,6 +8,7 @@ // trampoline_func_refs: [VMFuncRef; component.num_trampolines], // lowerings: [VMLowering; component.num_lowerings], // memories: [*mut VMMemoryDefinition; component.num_runtime_memories], +// tables: [VMTable; component.num_runtime_tables], // reallocs: [*mut VMFuncRef; component.num_runtime_reallocs], // post_returns: [*mut VMFuncRef; component.num_runtime_post_returns], // resource_destructors: [*mut VMFuncRef; component.num_resources], @@ -44,6 +45,8 @@ pub struct VMComponentOffsets

{ pub num_lowerings: u32, /// The number of memories which are recorded in this component for options. pub num_runtime_memories: u32, + /// The number of tables which are recorded in this component for options. + pub num_runtime_tables: u32, /// The number of reallocs which are recorded in this component for options. pub num_runtime_reallocs: u32, /// The number of callbacks which are recorded in this component for options. @@ -66,6 +69,7 @@ pub struct VMComponentOffsets

{ trampoline_func_refs: u32, lowerings: u32, memories: u32, + tables: u32, reallocs: u32, callbacks: u32, post_returns: u32, @@ -87,6 +91,7 @@ impl VMComponentOffsets

{ ptr, num_lowerings: component.num_lowerings, num_runtime_memories: component.num_runtime_memories.try_into().unwrap(), + num_runtime_tables: component.num_runtime_tables.try_into().unwrap(), num_runtime_reallocs: component.num_runtime_reallocs.try_into().unwrap(), num_runtime_callbacks: component.num_runtime_callbacks.try_into().unwrap(), num_runtime_post_returns: component.num_runtime_post_returns.try_into().unwrap(), @@ -103,6 +108,7 @@ impl VMComponentOffsets

{ trampoline_func_refs: 0, lowerings: 0, memories: 0, + tables: 0, reallocs: 0, callbacks: 0, post_returns: 0, @@ -145,6 +151,7 @@ impl VMComponentOffsets

{ size(trampoline_func_refs) = cmul(ret.num_trampolines, ret.ptr.size_of_vm_func_ref()), size(lowerings) = cmul(ret.num_lowerings, ret.ptr.size() * 2), size(memories) = cmul(ret.num_runtime_memories, ret.ptr.size()), + size(tables) = cmul(ret.num_runtime_tables, ret.size_of_vmtable()), size(reallocs) = cmul(ret.num_runtime_reallocs, ret.ptr.size()), size(callbacks) = cmul(ret.num_runtime_callbacks, ret.ptr.size()), size(post_returns) = cmul(ret.num_runtime_post_returns, ret.ptr.size()), @@ -262,6 +269,26 @@ impl VMComponentOffsets

{ self.runtime_memories() + index.as_u32() * u32::from(self.ptr.size()) } + /// The offset of the base of the `runtime_tables` field + #[inline] + pub fn runtime_tables(&self) -> u32 { + self.tables + } + + /// The offset of the table for the runtime index provided. + #[inline] + pub fn runtime_table(&self, index: RuntimeTableIndex) -> u32 { + assert!(index.as_u32() < self.num_runtime_tables); + self.runtime_tables() + index.as_u32() * u32::from(self.size_of_vmtable()) + } + + /// Return the size of `VMTable`, used here to hold the pointers to + /// the `VMTableDefinition` and `VMContext`. + #[inline] + pub fn size_of_vmtable(&self) -> u8 { + 2 * self.pointer_size() + } + /// The offset of the base of the `runtime_reallocs` field #[inline] pub fn runtime_reallocs(&self) -> u32 { diff --git a/crates/environ/src/gc.rs b/crates/environ/src/gc.rs index 4fa7d8745b..98da4ab028 100644 --- a/crates/environ/src/gc.rs +++ b/crates/environ/src/gc.rs @@ -81,29 +81,42 @@ fn common_array_layout( header_align: u32, expected_array_length_offset: u32, ) -> GcArrayLayout { + use core::mem; + assert!(header_size >= crate::VM_GC_HEADER_SIZE); assert!(header_align >= crate::VM_GC_HEADER_ALIGN); let mut size = header_size; let mut align = header_align; - let length_field_offset = field(&mut size, &mut align, 4); + let length_field_size = u32::try_from(mem::size_of::()).unwrap(); + let length_field_offset = field(&mut size, &mut align, length_field_size); assert_eq!(length_field_offset, expected_array_length_offset); let elem_size = byte_size_of_wasm_ty_in_gc_heap(&ty.0.element_type); let elems_offset = align_up(&mut size, &mut align, elem_size); assert_eq!(elems_offset, size); + let elems_are_gc_refs = ty.0.element_type.is_vmgcref_type_and_not_i31(); + if elems_are_gc_refs { + debug_assert_eq!( + length_field_offset + length_field_size, + elems_offset, + "DRC collector relies on GC ref elements appearing directly after the length field, without any padding", + ); + } + GcArrayLayout { base_size: size, align, elem_size, + elems_are_gc_refs, } } /// Common code to define a GC struct's layout, given the size and alignment of /// the collector's GC header and its expected offset of the array length field. -#[cfg(any(feature = "gc-drc", feature = "gc-null"))] +#[cfg(any(feature = "gc-null", feature = "gc-drc"))] fn common_struct_layout( ty: &WasmStructType, header_size: u32, @@ -114,11 +127,12 @@ fn common_struct_layout( // Process each field, aligning it to its natural alignment. // - // We don't try and do any fancy field reordering to minimize padding - // (yet?) because (a) the toolchain probably already did that and (b) - // we're just doing the simple thing first. We can come back and improve - // things here if we find that (a) isn't actually holding true in - // practice. + // We don't try and do any fancy field reordering to minimize padding (yet?) + // because (a) the toolchain probably already did that and (b) we're just + // doing the simple thing first, and (c) this is tricky in the presence of + // subtyping where we need a subtype's fields to be assigned the same + // offsets as its supertype's fields. We can come back and improve things + // here if we find that (a) isn't actually holding true in practice. let mut size = header_size; let mut align = header_align; @@ -127,7 +141,9 @@ fn common_struct_layout( .iter() .map(|f| { let field_size = byte_size_of_wasm_ty_in_gc_heap(&f.element_type); - field(&mut size, &mut align, field_size) + let offset = field(&mut size, &mut align, field_size); + let is_gc_ref = f.element_type.is_vmgcref_type_and_not_i31(); + GcStructLayoutField { offset, is_gc_ref } }) .collect(); @@ -241,6 +257,9 @@ pub struct GcArrayLayout { /// The size and natural alignment of each element in this array. pub elem_size: u32, + + /// Whether or not the elements of this array are GC references or not. + pub elems_are_gc_refs: bool, } impl GcArrayLayout { @@ -283,9 +302,9 @@ pub struct GcStructLayout { /// The alignment (in bytes) of this struct. pub align: u32, - /// The fields of this struct. The `i`th entry is the `i`th struct field's - /// offset (in bytes) in the struct. - pub fields: Vec, + /// The fields of this struct. The `i`th entry contains information about + /// the `i`th struct field's layout. + pub fields: Vec, } impl GcStructLayout { @@ -297,6 +316,20 @@ impl GcStructLayout { } } +/// A field in a `GcStructLayout`. +#[derive(Clone, Copy, Debug)] +pub struct GcStructLayoutField { + /// The offset (in bytes) of this field inside instances of this type. + pub offset: u32, + + /// Whether or not this field might contain a reference to another GC + /// object. + /// + /// Note: it is okay for this to be `false` for `i31ref`s, since they never + /// actually reference another GC object. + pub is_gc_ref: bool, +} + /// The kind of an object in a GC heap. /// /// Note that this type is accessed from Wasm JIT code. @@ -325,7 +358,7 @@ impl GcStructLayout { #[repr(u32)] #[derive(Clone, Copy, Debug, PartialEq, Eq)] #[rustfmt::skip] -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] pub enum VMGcKind { ExternRef = 0b01000 << 27, AnyRef = 0b10000 << 27, diff --git a/crates/environ/src/lib.rs b/crates/environ/src/lib.rs index 511b4a73cf..66149fcedb 100644 --- a/crates/environ/src/lib.rs +++ b/crates/environ/src/lib.rs @@ -1,7 +1,11 @@ -//! Standalone environment for WebAssembly using Cranelift. Provides functions to translate -//! `get_global`, `set_global`, `memory.size`, `memory.grow`, `call_indirect` that hardcode in -//! the translation the base addresses of regions of memory that will hold the globals, tables and -//! linear memories. +//! Internal dependency of the `wasmtime` crate. +//! +//! This crate is responsible for defining types and basic runtime structures +//! used by the `wasmtime` crate. This additionally defines primitives of +//! compilation and what compilers are expected to emit. +//! +//! If you don't already know what this crate is you probably want to use +//! `wasmtime`, not this crate. #![deny(missing_docs)] #![warn(clippy::cast_sign_loss)] @@ -46,7 +50,7 @@ pub use crate::module_artifacts::*; pub use crate::module_types::*; pub use crate::ref_bits::*; pub use crate::scopevec::ScopeVec; -pub use crate::stack_map::StackMap; +pub use crate::stack_map::*; pub use crate::trap_encoding::*; pub use crate::tunables::*; pub use crate::types::*; diff --git a/crates/environ/src/module.rs b/crates/environ/src/module.rs index de0300cac5..978576e167 100644 --- a/crates/environ/src/module.rs +++ b/crates/environ/src/module.rs @@ -336,6 +336,9 @@ pub struct Module { /// Number of imported or aliased tags in the module. pub num_imported_tags: usize, + /// Does this module need a GC heap to run? + pub needs_gc_heap: bool, + /// Number of functions that "escape" from this module may need to have a /// `VMFuncRef` constructed for them. /// @@ -616,6 +619,7 @@ impl TypeTrace for Module { num_imported_globals: _, num_imported_tags: _, num_escaped_funcs: _, + needs_gc_heap: _, functions, tables, memories: _, @@ -665,6 +669,7 @@ impl TypeTrace for Module { num_imported_globals: _, num_imported_tags: _, num_escaped_funcs: _, + needs_gc_heap: _, functions, tables, memories: _, diff --git a/crates/environ/src/module_artifacts.rs b/crates/environ/src/module_artifacts.rs index 1d51f1215c..0d41a68f84 100644 --- a/crates/environ/src/module_artifacts.rs +++ b/crates/environ/src/module_artifacts.rs @@ -2,9 +2,7 @@ //! with `bincode` as part of a module's compilation process. use crate::prelude::*; -use crate::{ - DefinedFuncIndex, FilePos, FuncIndex, Module, ModuleInternedTypeIndex, PrimaryMap, StackMap, -}; +use crate::{DefinedFuncIndex, FilePos, FuncIndex, Module, ModuleInternedTypeIndex, PrimaryMap}; use core::fmt; use core::ops::Range; use core::str; @@ -13,8 +11,8 @@ use serde_derive::{Deserialize, Serialize}; /// Secondary in-memory results of function compilation. #[derive(Serialize, Deserialize)] pub struct CompiledFunctionInfo { - /// The [`WasmFunctionInfo`] for this function. - pub wasm_func_info: WasmFunctionInfo, + /// Where this function was found in the original wasm file. + pub start_srcloc: FilePos, /// The [`FunctionLoc`] indicating the location of this function in the text /// section of the competition artifact. pub wasm_func_loc: FunctionLoc, @@ -22,15 +20,6 @@ pub struct CompiledFunctionInfo { pub array_to_wasm_trampoline: Option, } -/// Information about a function, such as trap information, address map, -/// and stack maps. -#[derive(Serialize, Deserialize, Default)] -#[allow(missing_docs, reason = "self-describing fields")] -pub struct WasmFunctionInfo { - pub start_srcloc: FilePos, - pub stack_maps: Box<[StackMapInformation]>, -} - /// Description of where a function is located in the text section of a /// compiled image. #[derive(Copy, Clone, Debug, Serialize, Deserialize)] @@ -42,18 +31,6 @@ pub struct FunctionLoc { pub length: u32, } -/// The offset within a function of a GC safepoint, and its associated stack -/// map. -#[derive(Serialize, Deserialize, Debug)] -pub struct StackMapInformation { - /// The offset of the GC safepoint within the function's native code. It is - /// relative to the beginning of the function. - pub code_offset: u32, - - /// The stack map for identifying live GC refs at the GC safepoint. - pub stack_map: StackMap, -} - /// Secondary in-memory results of module compilation. /// /// This opaque structure can be optionally passed back to diff --git a/crates/environ/src/obj.rs b/crates/environ/src/obj.rs index d50b5b1eca..160fddca7f 100644 --- a/crates/environ/src/obj.rs +++ b/crates/environ/src/obj.rs @@ -17,6 +17,14 @@ pub const EF_WASMTIME_MODULE: u32 = 1 << 0; /// component. pub const EF_WASMTIME_COMPONENT: u32 = 1 << 1; +/// Flag for the `e_flags` field in the ELF header indicating compiled code for +/// pulley32 +pub const EF_WASMTIME_PULLEY32: u32 = 1 << 2; + +/// Flag for the `e_flags` field in the ELF header indicating compiled code for +/// pulley64 +pub const EF_WASMTIME_PULLEY64: u32 = 1 << 3; + /// Flag for the `sh_flags` field in the ELF text section that indicates that /// the text section does not itself need to be executable. This is used for the /// Pulley target, for example, to indicate that it does not need to be made @@ -52,6 +60,17 @@ pub const SH_WASMTIME_NOT_EXECUTED: u64 = 1 << 0; /// mean that >=4gb text sections are not supported. pub const ELF_WASMTIME_ADDRMAP: &str = ".wasmtime.addrmap"; +/// A custom Wasmtime-specific section of compilation which store information +/// about live gc references at various locations in the text section (stack +/// maps). +/// +/// This section has a custom binary encoding described in `stack_maps.rs` which +/// is used to implement the single query we want to satisy of: where are the +/// live GC references at this pc? Like the addrmap section this has an +/// alignment of 1 with unaligned reads, and it additionally doesn't support +/// >=4gb text sections. +pub const ELF_WASMTIME_STACK_MAP: &str = ".wasmtime.stackmap"; + /// A custom binary-encoded section of wasmtime compilation artifacts which /// encodes the ability to map an offset in the text section to the trap code /// that it corresponds to. @@ -140,7 +159,7 @@ pub const ELF_WASMTIME_DWARF: &str = ".wasmtime.dwarf"; macro_rules! libcalls { ($($rust:ident = $sym:tt)*) => ( #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Ord, PartialOrd)] - #[allow(missing_docs, reason = "self-describing variants")] + #[expect(missing_docs, reason = "self-describing variants")] pub enum LibCall { $($rust,)* } diff --git a/crates/environ/src/stack_map.rs b/crates/environ/src/stack_map.rs index 2737e26426..b998be1e3b 100644 --- a/crates/environ/src/stack_map.rs +++ b/crates/environ/src/stack_map.rs @@ -1,22 +1,93 @@ -use cranelift_bitset::CompoundBitSet; -use serde_derive::{Deserialize, Serialize}; +use cranelift_bitset::ScalarBitSet; +use object::{Bytes, LittleEndian, U32Bytes}; + +struct StackMapSection<'a> { + pcs: &'a [U32Bytes], + pointers_to_stack_map: &'a [U32Bytes], + stack_map_data: &'a [U32Bytes], +} + +impl<'a> StackMapSection<'a> { + fn parse(section: &'a [u8]) -> Option> { + let mut section = Bytes(section); + // NB: this matches the encoding written by `append_to` in the + // `compile::stack_map` module. + let pc_count = section.read::>().ok()?; + let pc_count = usize::try_from(pc_count.get(LittleEndian)).ok()?; + let (pcs, section) = + object::slice_from_bytes::>(section.0, pc_count).ok()?; + let (pointers_to_stack_map, section) = + object::slice_from_bytes::>(section, pc_count).ok()?; + let stack_map_data = + object::slice_from_all_bytes::>(section).ok()?; + Some(StackMapSection { + pcs, + pointers_to_stack_map, + stack_map_data, + }) + } + + fn lookup(&self, pc: u32) -> Option> { + let pc_index = self + .pcs + .binary_search_by_key(&pc, |v| v.get(LittleEndian)) + .ok()?; + self.get(pc_index) + } + + fn into_iter(self) -> impl Iterator)> + 'a { + self.pcs + .iter() + .enumerate() + .map(move |(i, pc)| (pc.get(LittleEndian), self.get(i).unwrap())) + } + + /// Returns the stack map corresponding to the `i`th pc. + fn get(&self, i: usize) -> Option> { + let pointer_to_stack_map = self.pointers_to_stack_map[i].get(LittleEndian) as usize; + let data = self.stack_map_data.get(pointer_to_stack_map..)?; + + let (frame_size, data) = data.split_first()?; + let (count, data) = data.split_first()?; + let data = data.get(..count.get(LittleEndian) as usize)?; + + Some(StackMap { + frame_size: frame_size.get(LittleEndian), + data, + }) + } +} /// A map for determining where live GC references live in a stack frame. /// /// Note that this is currently primarily documented as cranelift's /// `binemit::StackMap`, so for detailed documentation about this please read /// the docs over there. -#[derive(Debug, Serialize, Deserialize)] -pub struct StackMap { - bits: CompoundBitSet, +pub struct StackMap<'a> { frame_size: u32, + data: &'a [U32Bytes], } -impl StackMap { - /// Creates a new `StackMap`, typically from a preexisting - /// `binemit::StackMap`. - pub fn new(frame_size: u32, bits: CompoundBitSet) -> StackMap { - StackMap { bits, frame_size } +impl<'a> StackMap<'a> { + /// Looks up a stack map for `pc` within the `section` provided. + /// + /// The `section` should be produced by `StackMapSection` in the + /// `compile::stack_map` module. The `pc` should be relative to the start + /// of the `.text` section in the final executable. + pub fn lookup(pc: u32, section: &'a [u8]) -> Option> { + StackMapSection::parse(section)?.lookup(pc) + } + + /// Iterate over the stack maps contained in the given stack map section. + /// + /// This function takes a `section` as its first argument which must have + /// been created with `StackMapSection` builder. This is intended to be the + /// raw `ELF_WASMTIME_STACK_MAP` section from the compilation artifact. + /// + /// The yielded offsets are relative to the start of the text section for + /// this map's code object. + pub fn iter(section: &'a [u8]) -> Option)> + 'a> { + Some(StackMapSection::parse(section)?.into_iter()) } /// Returns the byte size of this stack map's frame. @@ -43,8 +114,9 @@ impl StackMap { /// The `sp` must be the stack pointer at the code offset that this stack /// map is associated with. pub unsafe fn live_gc_refs(&self, sp: *mut usize) -> impl Iterator + '_ { - self.bits.iter().map(move |i| { + self.offsets().map(move |i| { log::trace!("Live GC ref in frame at frame offset {:#x}", i); + let i = usize::try_from(i).unwrap(); let ptr_to_gc_ref = sp.byte_add(i); // Assert that the pointer is inside this stack map's frame. @@ -57,4 +129,17 @@ impl StackMap { ptr_to_gc_ref.cast::() }) } + + /// Returns the offsets that this stack map registers GC references at. + pub fn offsets(&self) -> impl Iterator + '_ { + // Here `self.data` is a bit set of offsets divided by 4, so iterate + // over all the bits in `self.data` and multiply their position by 4. + let bit_positions = self.data.iter().enumerate().flat_map(|(i, word)| { + ScalarBitSet(word.get(LittleEndian)) + .iter() + .map(move |bit| (i as u32) * 32 + u32::from(bit)) + }); + + bit_positions.map(|pos| pos * 4) + } } diff --git a/crates/environ/src/trap_encoding.rs b/crates/environ/src/trap_encoding.rs index 38e5e5dd41..7514557d7d 100644 --- a/crates/environ/src/trap_encoding.rs +++ b/crates/environ/src/trap_encoding.rs @@ -22,7 +22,7 @@ pub struct TrapInformation { // These need to be kept in sync. #[non_exhaustive] #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] pub enum Trap { /// The current stack space was exhausted. StackOverflow, @@ -174,13 +174,7 @@ impl core::error::Error for Trap {} /// `TrapEncodingBuilder` above. Additionally the `offset` should be a relative /// offset within the text section of the compilation image. pub fn lookup_trap_code(section: &[u8], offset: usize) -> Option { - let mut section = Bytes(section); - // NB: this matches the encoding written by `append_to` above. - let count = section.read::>().ok()?; - let count = usize::try_from(count.get(LittleEndian)).ok()?; - let (offsets, traps) = - object::slice_from_bytes::>(section.0, count).ok()?; - debug_assert_eq!(traps.len(), count); + let (offsets, traps) = parse(section)?; // The `offsets` table is sorted in the trap section so perform a binary // search of the contents of this section to find whether `offset` is an @@ -202,3 +196,26 @@ pub fn lookup_trap_code(section: &[u8], offset: usize) -> Option { debug_assert!(trap.is_some(), "missing mapping for {byte}"); trap } + +fn parse(section: &[u8]) -> Option<(&[U32Bytes], &[u8])> { + let mut section = Bytes(section); + // NB: this matches the encoding written by `append_to` above. + let count = section.read::>().ok()?; + let count = usize::try_from(count.get(LittleEndian)).ok()?; + let (offsets, traps) = + object::slice_from_bytes::>(section.0, count).ok()?; + debug_assert_eq!(traps.len(), count); + Some((offsets, traps)) +} + +/// Returns an iterator over all of the traps encoded in `section`, which should +/// have been produced by `TrapEncodingBuilder`. +pub fn iterate_traps(section: &[u8]) -> Option + '_> { + let (offsets, traps) = parse(section)?; + Some( + offsets + .iter() + .zip(traps) + .map(|(offset, trap)| (offset.get(LittleEndian), Trap::from_u8(*trap).unwrap())), + ) +} diff --git a/crates/environ/src/tunables.rs b/crates/environ/src/tunables.rs index e29912d1b7..e947e6c773 100644 --- a/crates/environ/src/tunables.rs +++ b/crates/environ/src/tunables.rs @@ -28,7 +28,7 @@ macro_rules! define_tunables { /// Optional tunable configuration options used in `wasmtime::Config` #[derive(Default, Clone)] - #[allow(missing_docs, reason = "macro-generated fields")] + #[expect(missing_docs, reason = "macro-generated fields")] pub struct $config_tunables { $(pub $field: Option<$field_ty>,)* } diff --git a/crates/environ/src/types.rs b/crates/environ/src/types.rs index 14829377ea..8656abad0f 100644 --- a/crates/environ/src/types.rs +++ b/crates/environ/src/types.rs @@ -198,8 +198,8 @@ impl WasmValType { /// Is this a type that is represented as a `VMGcRef` and is additionally /// not an `i31`? /// - /// That is, is this a a type that actually refers to an object allocated in - /// a GC heap? + /// That is, is this a type that actually refers to an object allocated in a + /// GC heap? #[inline] pub fn is_vmgcref_type_and_not_i31(&self) -> bool { match self { @@ -280,8 +280,8 @@ impl WasmRefType { /// Is this a type that is represented as a `VMGcRef` and is additionally /// not an `i31`? /// - /// That is, is this a a type that actually refers to an object allocated in - /// a GC heap? + /// That is, is this a type that actually refers to an object allocated in a + /// GC heap? #[inline] pub fn is_vmgcref_type_and_not_i31(&self) -> bool { self.heap_type.is_vmgcref_type_and_not_i31() @@ -425,7 +425,7 @@ impl EngineOrModuleTypeIndex { /// WebAssembly heap type -- equivalent of `wasmparser`'s HeapType #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] pub enum WasmHeapType { // External types. Extern, @@ -545,8 +545,8 @@ impl WasmHeapType { /// Is this a type that is represented as a `VMGcRef` and is additionally /// not an `i31`? /// - /// That is, is this a a type that actually refers to an object allocated in - /// a GC heap? + /// That is, is this a type that actually refers to an object allocated in a + /// GC heap? #[inline] pub fn is_vmgcref_type_and_not_i31(&self) -> bool { self.is_vmgcref_type() && *self != Self::I31 @@ -862,6 +862,20 @@ impl TypeTrace for WasmStorageType { } } +impl WasmStorageType { + /// Is this a type that is represented as a `VMGcRef` and is additionally + /// not an `i31`? + /// + /// That is, is this a type that actually refers to an object allocated in a + /// GC heap? + pub fn is_vmgcref_type_and_not_i31(&self) -> bool { + match self { + WasmStorageType::I8 | WasmStorageType::I16 => false, + WasmStorageType::Val(v) => v.is_vmgcref_type_and_not_i31(), + } + } +} + /// The type of a struct field or array element. #[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)] pub struct WasmFieldType { @@ -964,7 +978,7 @@ impl TypeTrace for WasmStructType { } #[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)] -#[allow(missing_docs, reason = "self-describing type")] +#[expect(missing_docs, reason = "self-describing type")] pub struct WasmCompositeType { /// The type defined inside the composite type. pub inner: WasmCompositeInnerType, @@ -988,7 +1002,7 @@ impl fmt::Display for WasmCompositeType { /// A function, array, or struct type. #[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)] -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] pub enum WasmCompositeInnerType { Array(WasmArrayType), Func(WasmFuncType), @@ -1007,7 +1021,7 @@ impl fmt::Display for WasmCompositeInnerType { } } -#[allow(missing_docs, reason = "self-describing functions")] +#[expect(missing_docs, reason = "self-describing functions")] impl WasmCompositeInnerType { #[inline] pub fn is_array(&self) -> bool { @@ -1142,7 +1156,7 @@ impl fmt::Display for WasmSubType { /// Implicitly define all of these helper functions to handle only unshared /// types; essentially, these act like `is_unshared_*` functions until shared /// support is implemented. -#[allow(missing_docs, reason = "self-describing functions")] +#[expect(missing_docs, reason = "self-describing functions")] impl WasmSubType { #[inline] pub fn is_func(&self) -> bool { @@ -1694,7 +1708,7 @@ impl ConstExpr { } /// The subset of Wasm opcodes that are constant. -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)] pub enum ConstOp { I32Const(i32), @@ -1780,7 +1794,7 @@ impl ConstOp { /// The type that can be used to index into [Memory] and [Table]. #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Serialize, Deserialize)] -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] pub enum IndexType { I32, I64, @@ -1788,7 +1802,7 @@ pub enum IndexType { /// The size range of resizeable storage associated with [Memory] types and [Table] types. #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Serialize, Deserialize)] -#[allow(missing_docs, reason = "self-describing fields")] +#[expect(missing_docs, reason = "self-describing fields")] pub struct Limits { pub min: u64, pub max: Option, @@ -2013,7 +2027,7 @@ impl Memory { } #[derive(Copy, Clone, Debug)] -#[allow(missing_docs, reason = "self-describing error struct")] +#[expect(missing_docs, reason = "self-describing error struct")] pub struct SizeOverflow; impl fmt::Display for SizeOverflow { @@ -2072,7 +2086,7 @@ impl TypeTrace for Tag { } /// Helpers used to convert a `wasmparser` type to a type in this crate. -#[allow(missing_docs, reason = "self-describing functions")] +#[expect(missing_docs, reason = "self-describing functions")] pub trait TypeConvert { /// Converts a wasmparser table type into a wasmtime type fn convert_global_type(&self, ty: &wasmparser::GlobalType) -> Global { diff --git a/crates/environ/src/vmoffsets.rs b/crates/environ/src/vmoffsets.rs index 9923a62643..0f52039197 100644 --- a/crates/environ/src/vmoffsets.rs +++ b/crates/environ/src/vmoffsets.rs @@ -16,7 +16,6 @@ // gc_heap_bound: *mut u8, // gc_heap_data: *mut T, // Collector-specific pointer // type_ids: *const VMSharedTypeIndex, -// stack_chain: *const StackChainCell, // // // Variable-width fields come after the fixed-width fields above. Place // // memory-related items first as they're some of the most frequently @@ -28,7 +27,7 @@ // memories: [*mut VMMemoryDefinition; module.num_defined_memories], // owned_memories: [VMMemoryDefinition; module.num_owned_memories], // imported_functions: [VMFunctionImport; module.num_imported_functions], -// imported_tables: [VMTableImport; module.num_imported_tables], +// imported_tables: [VMTable; module.num_imported_tables], // imported_globals: [VMGlobalImport; module.num_imported_globals], // imported_tags: [VMTagImport; module.num_imported_tags], // tables: [VMTableDefinition; module.num_defined_tables], @@ -108,7 +107,7 @@ pub trait PtrSize { /// Returns the pointer size, in bytes, for the target. fn size(&self) -> u8; - /// The offset of the `VMContext::runtime_limits` field + /// The offset of the `VMContext::store_context` field fn vmcontext_store_context(&self) -> u8 { u8::try_from(align( u32::try_from(core::mem::size_of::()).unwrap(), @@ -248,14 +247,14 @@ pub trait PtrSize { /// Return the offset to the `VMStoreContext` structure #[inline] - fn vmctx_runtime_limits(&self) -> u8 { + fn vmctx_store_context(&self) -> u8 { self.vmctx_magic() + self.size() } /// Return the offset to the `VMBuiltinFunctionsArray` structure #[inline] fn vmctx_builtin_functions(&self) -> u8 { - self.vmctx_runtime_limits() + self.size() + self.vmctx_store_context() + self.size() } /// Return the offset to the `callee` member in this `VMContext`. @@ -298,22 +297,12 @@ pub trait PtrSize { self.vmctx_gc_heap_data() + self.size() } - /// The offset of the `stack_chain` field. - /// This field stores a pointer into the `StoreOpauqe`, to a value of type - /// `crate::stack_switching::StackChain`. - // FIXME(#10248) This field is not actually in use, yet. It is only here for - // future use in a subsequent stack-switching PR. - #[inline] - fn vmctx_stack_chain(&self) -> u8 { - self.vmctx_type_ids_array() + self.size() - } - /// The end of statically known offsets in `VMContext`. /// /// Data after this is dynamically sized. #[inline] fn vmctx_dynamic_data_start(&self) -> u8 { - self.vmctx_stack_chain() + self.size() + self.vmctx_type_ids_array() + self.size() } } @@ -531,7 +520,7 @@ impl From> for VMOffsets

{ size(imported_functions) = cmul(ret.num_imported_functions, ret.size_of_vmfunction_import()), size(imported_tables) - = cmul(ret.num_imported_tables, ret.size_of_vmtable_import()), + = cmul(ret.num_imported_tables, ret.size_of_vmtable()), size(imported_globals) = cmul(ret.num_imported_globals, ret.size_of_vmglobal_import()), size(imported_tags) @@ -589,23 +578,23 @@ impl VMOffsets

{ } } -/// Offsets for `VMTableImport`. +/// Offsets for `VMTable`. impl VMOffsets

{ /// The offset of the `from` field. #[inline] - pub fn vmtable_import_from(&self) -> u8 { + pub fn vmtable_from(&self) -> u8 { 0 * self.pointer_size() } /// The offset of the `vmctx` field. #[inline] - pub fn vmtable_import_vmctx(&self) -> u8 { + pub fn vmtable_vmctx(&self) -> u8 { 1 * self.pointer_size() } - /// Return the size of `VMTableImport`. + /// Return the size of `VMTable`. #[inline] - pub fn size_of_vmtable_import(&self) -> u8 { + pub fn size_of_vmtable(&self) -> u8 { 2 * self.pointer_size() } } @@ -778,12 +767,11 @@ impl VMOffsets

{ + index.as_u32() * u32::from(self.size_of_vmfunction_import()) } - /// Return the offset to `VMTableImport` index `index`. + /// Return the offset to `VMTable` index `index`. #[inline] pub fn vmctx_vmtable_import(&self, index: TableIndex) -> u32 { assert!(index.as_u32() < self.num_imported_tables); - self.vmctx_imported_tables_begin() - + index.as_u32() * u32::from(self.size_of_vmtable_import()) + self.vmctx_imported_tables_begin() + index.as_u32() * u32::from(self.size_of_vmtable()) } /// Return the offset to `VMMemoryImport` index `index`. @@ -874,10 +862,11 @@ impl VMOffsets

{ self.vmctx_vmfunction_import(index) + u32::from(self.vmfunction_import_vmctx()) } - /// Return the offset to the `from` field in `VMTableImport` index `index`. + /// Return the offset to the `from` field in the imported `VMTable` at index + /// `index`. #[inline] - pub fn vmctx_vmtable_import_from(&self, index: TableIndex) -> u32 { - self.vmctx_vmtable_import(index) + u32::from(self.vmtable_import_from()) + pub fn vmctx_vmtable_from(&self, index: TableIndex) -> u32 { + self.vmctx_vmtable_import(index) + u32::from(self.vmtable_from()) } /// Return the offset to the `base` field in `VMTableDefinition` index `index`. diff --git a/crates/fuzzing/Cargo.toml b/crates/fuzzing/Cargo.toml index 7c19ba1d03..ca7f8be24b 100644 --- a/crates/fuzzing/Cargo.toml +++ b/crates/fuzzing/Cargo.toml @@ -12,13 +12,11 @@ license = "Apache-2.0 WITH LLVM-exception" workspace = true [build-dependencies] -wasmtime-wast-util = { path = '../wast-util' } +wasmtime-test-util = { workspace = true, features = ['wast'] } [dependencies] anyhow = { workspace = true } arbitrary = { workspace = true, features = ["derive"] } -component-test-util = { workspace = true } -component-fuzz-util = { workspace = true } env_logger = { workspace = true } log = { workspace = true } rayon = "1.2.1" @@ -32,9 +30,9 @@ wasm-encoder = { workspace = true } wasm-smith = { workspace = true } wasm-mutate = { workspace = true } wasm-spec-interpreter = { path = "./wasm-spec-interpreter", optional = true } -wasmi = "0.39.1" +wasmi = { version = "0.43.0", default-features = false, features = ["std", "simd"] } futures = { workspace = true } -wasmtime-wast-util = { path = '../wast-util' } +wasmtime-test-util = { workspace = true, features = ['wast', 'component-fuzz', 'component'] } [dependencies.wasmtime-cli-flags] workspace = true @@ -58,7 +56,7 @@ features = [ # though, so we could use that if we wanted. For now though just simplify a bit # and don't depend on this on Windows. The same applies on s390x and riscv. [target.'cfg(not(any(windows, target_arch = "s390x", target_arch = "riscv64")))'.dependencies] -v8 = "129.0.0" +v8 = "134.5.0" [dev-dependencies] wat = { workspace = true } diff --git a/crates/fuzzing/build.rs b/crates/fuzzing/build.rs index f58919189f..19fb491cbe 100644 --- a/crates/fuzzing/build.rs +++ b/crates/fuzzing/build.rs @@ -4,7 +4,7 @@ use std::env; use std::path::PathBuf; -use wasmtime_wast_util::WastTest; +use wasmtime_test_util::wast::WastTest; fn main() { println!("cargo:rerun-if-changed=build.rs"); @@ -15,10 +15,10 @@ fn main() { root.pop(); // chop off 'fuzzing' root.pop(); // chop off 'crates' - let mut tests = wasmtime_wast_util::find_tests(&root).unwrap(); + let mut tests = wasmtime_test_util::wast::find_tests(&root).unwrap(); tests.sort_by_key(|test| test.path.clone()); - let mut code = format!("static FILES: &[fn() -> wasmtime_wast_util::WastTest] = &[\n"); + let mut code = format!("static FILES: &[fn() -> wasmtime_test_util::wast::WastTest] = &[\n"); for test in tests { let WastTest { @@ -29,10 +29,10 @@ fn main() { println!("cargo:rerun-if-changed={}", path.to_str().unwrap()); code.push_str(&format!( "|| {{ - wasmtime_wast_util::WastTest {{ + wasmtime_test_util::wast::WastTest {{ path: {path:?}.into(), contents: include_str!({path:?}).into(), - config: wasmtime_wast_util::{config:?}, + config: wasmtime_test_util::wast::{config:?}, }} }}," )); diff --git a/crates/fuzzing/src/generators/component_types.rs b/crates/fuzzing/src/generators/component_types.rs index 79f022e441..81de70142c 100644 --- a/crates/fuzzing/src/generators/component_types.rs +++ b/crates/fuzzing/src/generators/component_types.rs @@ -7,12 +7,12 @@ //! lifting and lowering code and verify the values remain intact during both processes. use arbitrary::{Arbitrary, Unstructured}; -use component_fuzz_util::{Declarations, EXPORT_FUNCTION, IMPORT_FUNCTION}; use std::any::Any; use std::fmt::Debug; use std::ops::ControlFlow; use wasmtime::component::{self, Component, ComponentNamedList, Lift, Linker, Lower, Val}; use wasmtime::{Config, Engine, Store, StoreContextMut}; +use wasmtime_test_util::component_fuzz::{Declarations, EXPORT_FUNCTION, IMPORT_FUNCTION}; /// Minimum length of an arbitrary list value generated for a test case const MIN_LIST_LENGTH: u32 = 0; diff --git a/crates/fuzzing/src/generators/config.rs b/crates/fuzzing/src/generators/config.rs index ecb0204bae..ab69b0d7bb 100644 --- a/crates/fuzzing/src/generators/config.rs +++ b/crates/fuzzing/src/generators/config.rs @@ -10,7 +10,7 @@ use arbitrary::{Arbitrary, Unstructured}; use std::sync::Arc; use std::time::Duration; use wasmtime::{Engine, Module, MpkEnabled, Store}; -use wasmtime_wast_util::{limits, WastConfig, WastTest}; +use wasmtime_test_util::wast::{limits, WastConfig, WastTest}; /// Configuration for `wasmtime::Config` and generated modules for a session of /// fuzzing. @@ -126,7 +126,7 @@ impl Config { /// This will additionally update limits in the pooling allocator to be able /// to execute all tests. pub fn make_wast_test_compliant(&mut self, test: &WastTest) -> WastConfig { - let wasmtime_wast_util::TestConfig { + let wasmtime_test_util::wast::TestConfig { memory64, custom_page_sizes, multi_memory, @@ -138,9 +138,10 @@ impl Config { tail_call, extended_const, wide_arithmetic, - cm_async, - cm_async_builtins, - cm_async_stackful, + component_model_async, + component_model_async_builtins, + component_model_async_stackful, + component_model_error_context, simd, hogs_memory: _, @@ -152,11 +153,13 @@ impl Config { // but are configurable in Wasmtime. self.module_config.function_references_enabled = function_references.or(gc).unwrap_or(false); - self.module_config.cm_async_stackful = cm_async_stackful.unwrap_or(false); - self.module_config.cm_async_builtins = cm_async_builtins.unwrap_or(false); - self.module_config.cm_async = self.module_config.cm_async_stackful - || self.module_config.cm_async_builtins - || cm_async.unwrap_or(false); + self.module_config.component_model_async = component_model_async.unwrap_or(false); + self.module_config.component_model_async_builtins = + component_model_async_builtins.unwrap_or(false); + self.module_config.component_model_async_stackful = + component_model_async_stackful.unwrap_or(false); + self.module_config.component_model_error_context = + component_model_error_context.unwrap_or(false); // Enable/disable proposals that wasm-smith has knobs for which will be // read when creating `wasmtime::Config`. @@ -233,9 +236,9 @@ impl Config { // fail or not. WastConfig { collector: match self.wasmtime.collector { - Collector::Null => wasmtime_wast_util::Collector::Null, + Collector::Null => wasmtime_test_util::wast::Collector::Null, Collector::DeferredReferenceCounting => { - wasmtime_wast_util::Collector::DeferredReferenceCounting + wasmtime_test_util::wast::Collector::DeferredReferenceCounting } }, pooling: matches!( @@ -243,9 +246,13 @@ impl Config { InstanceAllocationStrategy::Pooling(_) ), compiler: match self.wasmtime.compiler_strategy { - CompilerStrategy::CraneliftNative => wasmtime_wast_util::Compiler::CraneliftNative, - CompilerStrategy::CraneliftPulley => wasmtime_wast_util::Compiler::CraneliftPulley, - CompilerStrategy::Winch => wasmtime_wast_util::Compiler::Winch, + CompilerStrategy::CraneliftNative => { + wasmtime_test_util::wast::Compiler::CraneliftNative + } + CompilerStrategy::CraneliftPulley => { + wasmtime_test_util::wast::Compiler::CraneliftPulley + } + CompilerStrategy::Winch => wasmtime_test_util::wast::Compiler::Winch, }, } } @@ -270,8 +277,13 @@ impl Config { )); cfg.wasm.async_stack_zeroing = Some(self.wasmtime.async_stack_zeroing); cfg.wasm.bulk_memory = Some(true); - cfg.wasm.component_model_async = Some(self.module_config.cm_async); - // TODO: handle cm_async_{builtins,stackful} + cfg.wasm.component_model_async = Some(self.module_config.component_model_async); + cfg.wasm.component_model_async_builtins = + Some(self.module_config.component_model_async_builtins); + cfg.wasm.component_model_async_stackful = + Some(self.module_config.component_model_async_stackful); + cfg.wasm.component_model_error_context = + Some(self.module_config.component_model_error_context); cfg.wasm.custom_page_sizes = Some(self.module_config.config.custom_page_sizes_enabled); cfg.wasm.epoch_interruption = Some(self.wasmtime.epoch_interruption); cfg.wasm.extended_const = Some(self.module_config.config.extended_const_enabled); @@ -534,7 +546,7 @@ impl<'a> Arbitrary<'a> for Config { config .wasmtime - .update_module_config(&mut config.module_config.config, u)?; + .update_module_config(&mut config.module_config, u)?; Ok(config) } @@ -611,7 +623,7 @@ impl WasmtimeConfig { /// too. pub fn update_module_config( &mut self, - config: &mut wasm_smith::Config, + config: &mut ModuleConfig, u: &mut Unstructured<'_>, ) -> arbitrary::Result<()> { match self.compiler_strategy { @@ -634,10 +646,11 @@ impl WasmtimeConfig { // at this time, so if winch is selected be sure to disable wasm // proposals in `Config` to ensure that Winch can compile the // module that wasm-smith generates. - config.relaxed_simd_enabled = false; - config.gc_enabled = false; - config.tail_call_enabled = false; - config.reference_types_enabled = false; + config.config.relaxed_simd_enabled = false; + config.config.gc_enabled = false; + config.config.tail_call_enabled = false; + config.config.reference_types_enabled = false; + config.function_references_enabled = false; // Winch's SIMD implementations require AVX and AVX2. if self @@ -647,7 +660,7 @@ impl WasmtimeConfig { .codegen_flag("has_avx2") .is_some_and(|value| value == "false") { - config.simd_enabled = false; + config.config.simd_enabled = false; } // Tuning the following engine options is currently not supported @@ -658,7 +671,7 @@ impl WasmtimeConfig { } CompilerStrategy::CraneliftPulley => { - config.threads_enabled = false; + config.config.threads_enabled = false; } } @@ -668,7 +681,8 @@ impl WasmtimeConfig { // and for wasm threads that will require some refactoring of the // `LinearMemory` trait to bubble up the request that the linear memory // not move. Otherwise that just generates a panic right now. - if config.threads_enabled || matches!(self.strategy, InstanceAllocationStrategy::Pooling(_)) + if config.config.threads_enabled + || matches!(self.strategy, InstanceAllocationStrategy::Pooling(_)) { self.avoid_custom_unaligned_memory(u)?; } @@ -679,31 +693,38 @@ impl WasmtimeConfig { // If the pooling allocator is used, do not allow shared memory to // be created. FIXME: see // https://github.com/bytecodealliance/wasmtime/issues/4244. - config.threads_enabled = false; + config.config.threads_enabled = false; // Ensure the pooling allocator can support the maximal size of // memory, picking the smaller of the two to win. let min_bytes = config + .config .max_memory32_bytes // memory64_bytes is a u128, but since we are taking the min // we can truncate it down to a u64. - .min(config.max_memory64_bytes.try_into().unwrap_or(u64::MAX)); + .min( + config + .config + .max_memory64_bytes + .try_into() + .unwrap_or(u64::MAX), + ); let mut min = min_bytes.min(pooling.max_memory_size as u64); if let MemoryConfig::Normal(cfg) = &self.memory_config { min = min.min(cfg.memory_reservation.unwrap_or(0)); } pooling.max_memory_size = min as usize; - config.max_memory32_bytes = min; - config.max_memory64_bytes = min as u128; + config.config.max_memory32_bytes = min; + config.config.max_memory64_bytes = min as u128; // If traps are disallowed then memories must have at least one page // of memory so if we still are only allowing 0 pages of memory then // increase that to one here. - if config.disallow_traps { + if config.config.disallow_traps { if pooling.max_memory_size < (1 << 16) { pooling.max_memory_size = 1 << 16; - config.max_memory32_bytes = 1 << 16; - config.max_memory64_bytes = 1 << 16; + config.config.max_memory32_bytes = 1 << 16; + config.config.max_memory64_bytes = 1 << 16; if let MemoryConfig::Normal(cfg) = &mut self.memory_config { match &mut cfg.memory_reservation { Some(size) => *size = (*size).max(pooling.max_memory_size as u64), @@ -719,13 +740,13 @@ impl WasmtimeConfig { // Don't allow too many linear memories per instance since massive // virtual mappings can fail to get allocated. - config.min_memories = config.min_memories.min(10); - config.max_memories = config.max_memories.min(10); + config.config.min_memories = config.config.min_memories.min(10); + config.config.max_memories = config.config.max_memories.min(10); // Force this pooling allocator to always be able to accommodate the // module that may be generated. - pooling.total_memories = config.max_memories as u32; - pooling.total_tables = config.max_tables as u32; + pooling.total_memories = config.config.max_memories as u32; + pooling.total_tables = config.config.max_tables as u32; } if !self.signals_based_traps { @@ -735,7 +756,7 @@ impl WasmtimeConfig { // fixable with some more work on the bounds-checks side of things // to do a full bounds check even on static memories, but that's // left for a future PR. - config.threads_enabled = false; + config.config.threads_enabled = false; // Spectre-based heap mitigations require signal handlers so this // must always be disabled if signals-based traps are disabled. diff --git a/crates/fuzzing/src/generators/module.rs b/crates/fuzzing/src/generators/module.rs index 16f52e0e1d..32cb58cdd1 100644 --- a/crates/fuzzing/src/generators/module.rs +++ b/crates/fuzzing/src/generators/module.rs @@ -15,9 +15,10 @@ pub struct ModuleConfig { // in our `*.wast` testing so keep knobs here so they can be read during // config-to-`wasmtime::Config` translation. pub function_references_enabled: bool, - pub cm_async: bool, - pub cm_async_builtins: bool, - pub cm_async_stackful: bool, + pub component_model_async: bool, + pub component_model_async_builtins: bool, + pub component_model_async_stackful: bool, + pub component_model_error_context: bool, } impl<'a> Arbitrary<'a> for ModuleConfig { @@ -43,8 +44,8 @@ impl<'a> Arbitrary<'a> for ModuleConfig { let _ = config.relaxed_simd_enabled; let _ = config.tail_call_enabled; let _ = config.extended_const_enabled; + let _ = config.gc_enabled; config.exceptions_enabled = false; - config.gc_enabled = false; config.custom_page_sizes_enabled = u.arbitrary()?; config.wide_arithmetic_enabled = u.arbitrary()?; config.memory64_enabled = u.ratio(1, 20)?; @@ -63,9 +64,10 @@ impl<'a> Arbitrary<'a> for ModuleConfig { config.disallow_traps = u.ratio(9, 10)?; Ok(ModuleConfig { - cm_async: false, - cm_async_builtins: false, - cm_async_stackful: false, + component_model_async: false, + component_model_async_builtins: false, + component_model_async_stackful: false, + component_model_error_context: false, function_references_enabled: config.gc_enabled, config, }) diff --git a/crates/fuzzing/src/generators/value.rs b/crates/fuzzing/src/generators/value.rs index 886d59073d..516f733570 100644 --- a/crates/fuzzing/src/generators/value.rs +++ b/crates/fuzzing/src/generators/value.rs @@ -267,6 +267,7 @@ impl PartialEq for DiffValue { } (Self::FuncRef { null: a }, Self::FuncRef { null: b }) => a == b, (Self::ExternRef { null: a }, Self::ExternRef { null: b }) => a == b, + (Self::AnyRef { null: a }, Self::AnyRef { null: b }) => a == b, _ => false, } } @@ -302,7 +303,7 @@ impl TryFrom for DiffValueType { (true, HeapType::Any) => Ok(Self::AnyRef), (true, HeapType::I31) => Ok(Self::AnyRef), (true, HeapType::None) => Ok(Self::AnyRef), - _ => Err("non-funcref and non-externref reference types are not supported yet"), + _ => Err("non-null reference types are not supported yet"), }, } } diff --git a/crates/fuzzing/src/generators/wast_test.rs b/crates/fuzzing/src/generators/wast_test.rs index cee5d75568..410f7b23b8 100644 --- a/crates/fuzzing/src/generators/wast_test.rs +++ b/crates/fuzzing/src/generators/wast_test.rs @@ -9,7 +9,7 @@ include!(concat!(env!("OUT_DIR"), "/wasttests.rs")); #[derive(Debug)] pub struct WastTest { #[expect(missing_docs, reason = "self-describing field")] - pub test: wasmtime_wast_util::WastTest, + pub test: wasmtime_test_util::wast::WastTest, } impl<'a> Arbitrary<'a> for WastTest { diff --git a/crates/fuzzing/src/oracles.rs b/crates/fuzzing/src/oracles.rs index 9165a58f5e..6def154d1e 100644 --- a/crates/fuzzing/src/oracles.rs +++ b/crates/fuzzing/src/oracles.rs @@ -246,13 +246,27 @@ pub fn instantiate_many( config: &generators::Config, commands: &[Command], ) { + log::debug!("instantiate_many: {commands:#?}"); + assert!(!config.module_config.config.allow_start_export); let engine = Engine::new(&config.to_wasmtime()).unwrap(); let modules = modules .iter() - .filter_map(|bytes| compile_module(&engine, bytes, known_valid, config)) + .enumerate() + .filter_map( + |(i, bytes)| match compile_module(&engine, bytes, known_valid, config) { + Some(m) => { + log::debug!("successfully compiled module {i}"); + Some(m) + } + None => { + log::debug!("failed to compile module {i}"); + None + } + }, + ) .collect::>(); // If no modules were valid, we're done @@ -318,7 +332,7 @@ fn compile_module( // when arbitrary table element limits have been exceeded as // there is currently no way to constrain the generated module // table types. - let string = e.to_string(); + let string = format!("{e:?}"); if string.contains("minimum element size") { return None; } @@ -369,8 +383,11 @@ pub fn instantiate_with_dummy(store: &mut Store, module: &Module) - // Creation of imports can fail due to resource limit constraints, and then // instantiation can naturally fail for a number of reasons as well. Bundle // the two steps together to match on the error below. - let instance = - dummy::dummy_linker(store, module).and_then(|l| l.instantiate(&mut *store, module)); + let linker = dummy::dummy_linker(store, module); + if let Err(e) = &linker { + log::warn!("failed to create dummy linker: {e:?}"); + } + let instance = linker.and_then(|l| l.instantiate(&mut *store, module)); unwrap_instance(store, instance) } @@ -383,33 +400,32 @@ fn unwrap_instance( Err(e) => e, }; + log::debug!("failed to instantiate: {e:?}"); + // If the instantiation hit OOM for some reason then that's ok, it's // expected that fuzz-generated programs try to allocate lots of // stuff. if store.data().is_oom() { - log::debug!("failed to instantiate: OOM"); return None; } // Allow traps which can happen normally with `unreachable` or a // timeout or such - if let Some(trap) = e.downcast_ref::() { - log::debug!("failed to instantiate: {}", trap); + if e.is::() { return None; } let string = e.to_string(); + // Currently we instantiate with a `Linker` which can't instantiate // every single module under the sun due to using name-based resolution // rather than positional-based resolution if string.contains("incompatible import type") { - log::debug!("failed to instantiate: {}", string); return None; } // Also allow failures to instantiate as a result of hitting pooling limits. if e.is::() { - log::debug!("failed to instantiate: {}", string); return None; } @@ -507,6 +523,32 @@ pub enum DiffEqResult { Failed, } +fn wasmtime_trap_is_non_deterministic(trap: &Trap) -> bool { + match trap { + // Allocations being too large for the GC are + // implementation-defined. + Trap::AllocationTooLarge | + // Stack size, and therefore when overflow happens, is + // implementation-defined. + Trap::StackOverflow => true, + _ => false, + } +} + +fn wasmtime_error_is_non_deterministic(error: &wasmtime::Error) -> bool { + match error.downcast_ref::() { + Some(trap) => wasmtime_trap_is_non_deterministic(trap), + + // For general, unknown errors, we can't rely on this being + // a deterministic Wasm failure that both engines handled + // identically, leaving Wasm in identical states. We could + // just as easily be hitting engine-specific failures, like + // different implementation-defined limits. So simply poison + // this execution and move on to the next test. + None => true, + } +} + impl DiffEqResult { /// Computes the differential result from executing in two different /// engines. @@ -518,41 +560,37 @@ impl DiffEqResult { match (lhs_result, rhs_result) { (Ok(lhs_result), Ok(rhs_result)) => DiffEqResult::Success(lhs_result, rhs_result), - // Both sides failed. Check that the trap and state at the time of - // failure is the same, when possible. - (Err(lhs), Err(rhs)) => { - let rhs = match rhs.downcast::() { - Ok(trap) => trap, - - // For general, unknown errors, we can't rely on this being - // a deterministic Wasm failure that both engines handled - // identically, leaving Wasm in identical states. We could - // just as easily be hitting engine-specific failures, like - // different implementation-defined limits. So simply report - // failure and move on to the next test. - Err(err) => { - log::debug!("rhs failed: {err:?}"); - return DiffEqResult::Failed; - } - }; + // Handle all non-deterministic errors by poisoning this execution's + // state, so that we simply move on to the next test. + (Err(lhs), _) if lhs_engine.is_non_deterministic_error(&lhs) => { + log::debug!("lhs failed non-deterministically: {lhs:?}"); + DiffEqResult::Poisoned + } + (_, Err(rhs)) if wasmtime_error_is_non_deterministic(&rhs) => { + log::debug!("rhs failed non-deterministically: {rhs:?}"); + DiffEqResult::Poisoned + } - // Even some traps are nondeterministic, and we can't rely on - // the errors matching or leaving Wasm in the same state. - let poisoned = - // Allocations being too large for the GC are - // implementation-defined. - rhs == Trap::AllocationTooLarge - // Stack size, and therefore when overflow happens, is - // implementation-defined. - || rhs == Trap::StackOverflow - || lhs_engine.is_stack_overflow(&lhs); - if poisoned { - return DiffEqResult::Poisoned; - } + // Both sides failed deterministically. Check that the trap and + // state at the time of failure is the same. + (Err(lhs), Err(rhs)) => { + let rhs = rhs + .downcast::() + .expect("non-traps handled in earlier match arm"); + + debug_assert!( + !lhs_engine.is_non_deterministic_error(&lhs), + "non-deterministic traps handled in earlier match arm", + ); + debug_assert!( + !wasmtime_trap_is_non_deterministic(&rhs), + "non-deterministic traps handled in earlier match arm", + ); lhs_engine.assert_error_match(&lhs, &rhs); DiffEqResult::Failed } + // A real bug is found if only one side fails. (Ok(_), Err(err)) => panic!("only the `rhs` failed for this input: {err:?}"), (Err(err), Ok(_)) => panic!("only the `lhs` failed for this input: {err:?}"), @@ -642,7 +680,11 @@ pub fn make_api_calls(api: generators::api::ApiCalls) { let nth = nth % funcs.len(); let f = &funcs[nth]; let ty = f.ty(&store); - if let Ok(params) = dummy::dummy_values(ty.params()) { + if let Some(params) = ty + .params() + .map(|p| p.default_value()) + .collect::>>() + { let mut results = vec![Val::I32(0); ty.results().len()]; let _ = f.call(store, ¶ms, &mut results); } @@ -967,9 +1009,11 @@ impl Drop for HelperThread { /// arbitrary types and values. pub fn dynamic_component_api_target(input: &mut arbitrary::Unstructured) -> arbitrary::Result<()> { use crate::generators::component_types; - use component_fuzz_util::{TestCase, Type, EXPORT_FUNCTION, IMPORT_FUNCTION, MAX_TYPE_DEPTH}; - use component_test_util::FuncExt; use wasmtime::component::{Component, Linker, Val}; + use wasmtime_test_util::component::FuncExt; + use wasmtime_test_util::component_fuzz::{ + TestCase, Type, EXPORT_FUNCTION, IMPORT_FUNCTION, MAX_TYPE_DEPTH, + }; crate::init_fuzzing(); @@ -995,7 +1039,7 @@ pub fn dynamic_component_api_target(input: &mut arbitrary::Unstructured) -> arbi encoding2: input.arbitrary()?, }; - let mut config = component_test_util::config(); + let mut config = wasmtime_test_util::component::config(); config.debug_adapter_modules(input.arbitrary()?); let engine = Engine::new(&config).unwrap(); let mut store = Store::new(&engine, (Vec::new(), None)); @@ -1089,17 +1133,17 @@ pub fn call_async(wasm: &[u8], config: &generators::Config, mut poll_amts: &[u32 log::info!("yielding {} times in import", poll_amt); YieldN(poll_amt).await; for (ret_ty, result) in ty.results().zip(results) { - *result = dummy::dummy_value(ret_ty)?; + *result = ret_ty.default_value().unwrap(); } Ok(()) }) }) .into() } - other_ty => match dummy::dummy_extern(&mut store, other_ty) { - Ok(item) => item, - Err(e) => { - log::warn!("couldn't create import: {}", e); + other_ty => match other_ty.default_value(&mut store) { + Some(item) => item, + None => { + log::warn!("couldn't create import for {import:?}"); return; } }, @@ -1147,11 +1191,11 @@ pub fn call_async(wasm: &[u8], config: &generators::Config, mut poll_amts: &[u32 let ty = func.ty(&store); let params = ty .params() - .map(|ty| dummy::dummy_value(ty).unwrap()) + .map(|ty| ty.default_value().unwrap()) .collect::>(); let mut results = ty .results() - .map(|ty| dummy::dummy_value(ty).unwrap()) + .map(|ty| ty.default_value().unwrap()) .collect::>(); log::info!("invoking export {:?}", name); @@ -1337,6 +1381,8 @@ mod tests { | WasmFeatures::TAIL_CALL | WasmFeatures::WIDE_ARITHMETIC | WasmFeatures::MEMORY64 + | WasmFeatures::FUNCTION_REFERENCES + | WasmFeatures::GC | WasmFeatures::GC_TYPES | WasmFeatures::CUSTOM_PAGE_SIZES | WasmFeatures::EXTENDED_CONST; diff --git a/crates/fuzzing/src/oracles/diff_spec.rs b/crates/fuzzing/src/oracles/diff_spec.rs index 09c590ac55..2cf660c6ec 100644 --- a/crates/fuzzing/src/oracles/diff_spec.rs +++ b/crates/fuzzing/src/oracles/diff_spec.rs @@ -49,7 +49,7 @@ impl DiffEngine for SpecInterpreter { let _ = (trap, err); } - fn is_stack_overflow(&self, err: &Error) -> bool { + fn is_non_deterministic_error(&self, err: &Error) -> bool { err.to_string().contains("(Isabelle) call stack exhausted") } } diff --git a/crates/fuzzing/src/oracles/diff_v8.rs b/crates/fuzzing/src/oracles/diff_v8.rs index f2fa5603d1..8eab995ef9 100644 --- a/crates/fuzzing/src/oracles/diff_v8.rs +++ b/crates/fuzzing/src/oracles/diff_v8.rs @@ -145,7 +145,7 @@ impl DiffEngine for V8Engine { verify_wasmtime("not possibly present in an error, just panic please"); } - fn is_stack_overflow(&self, err: &Error) -> bool { + fn is_non_deterministic_error(&self, err: &Error) -> bool { err.to_string().contains("Maximum call stack size exceeded") } } diff --git a/crates/fuzzing/src/oracles/diff_wasmi.rs b/crates/fuzzing/src/oracles/diff_wasmi.rs index 49219f9228..4517d0f540 100644 --- a/crates/fuzzing/src/oracles/diff_wasmi.rs +++ b/crates/fuzzing/src/oracles/diff_wasmi.rs @@ -14,14 +14,10 @@ impl WasmiEngine { pub(crate) fn new(config: &mut Config) -> Self { let config = &mut config.module_config.config; // Force generated Wasm modules to never have features that Wasmi doesn't support. - config.simd_enabled = false; config.relaxed_simd_enabled = false; - config.memory64_enabled = false; config.threads_enabled = false; config.exceptions_enabled = false; config.gc_enabled = false; - config.custom_page_sizes_enabled = false; - config.wide_arithmetic_enabled = false; let mut wasmi_config = wasmi::Config::default(); wasmi_config @@ -35,7 +31,11 @@ impl WasmiEngine { .wasm_reference_types(config.reference_types_enabled) .wasm_tail_call(config.tail_call_enabled) .wasm_multi_memory(config.max_memories > 1) - .wasm_extended_const(config.extended_const_enabled); + .wasm_extended_const(config.extended_const_enabled) + .wasm_custom_page_sizes(config.custom_page_sizes_enabled) + .wasm_memory64(config.memory64_enabled) + .wasm_simd(config.simd_enabled) + .wasm_wide_arithmetic(config.wide_arithmetic_enabled); Self { engine: wasmi::Engine::new(&wasmi_config), } @@ -85,7 +85,7 @@ impl DiffEngine for WasmiEngine { } } - fn is_stack_overflow(&self, err: &Error) -> bool { + fn is_non_deterministic_error(&self, err: &Error) -> bool { matches!( self.trap_code(err), Some(wasmi::core::TrapCode::StackOverflow) @@ -175,7 +175,7 @@ impl From<&DiffValue> for wasmi::Val { DiffValue::I64(n) => WasmiValue::I64(n), DiffValue::F32(n) => WasmiValue::F32(wasmi::core::F32::from_bits(n)), DiffValue::F64(n) => WasmiValue::F64(wasmi::core::F64::from_bits(n)), - DiffValue::V128(_) => unimplemented!(), + DiffValue::V128(n) => WasmiValue::V128(wasmi::core::V128::from(n)), DiffValue::FuncRef { null } => { assert!(null); WasmiValue::FuncRef(wasmi::FuncRef::null()) @@ -197,6 +197,7 @@ impl From for DiffValue { WasmiValue::I64(n) => DiffValue::I64(n), WasmiValue::F32(n) => DiffValue::F32(n.to_bits()), WasmiValue::F64(n) => DiffValue::F64(n.to_bits()), + WasmiValue::V128(n) => DiffValue::V128(n.as_u128()), WasmiValue::FuncRef(f) => DiffValue::FuncRef { null: f.is_null() }, WasmiValue::ExternRef(e) => DiffValue::ExternRef { null: e.is_null() }, } diff --git a/crates/fuzzing/src/oracles/diff_wasmtime.rs b/crates/fuzzing/src/oracles/diff_wasmtime.rs index 9e92a59356..4ef7c69583 100644 --- a/crates/fuzzing/src/oracles/diff_wasmtime.rs +++ b/crates/fuzzing/src/oracles/diff_wasmtime.rs @@ -26,13 +26,15 @@ impl WasmtimeEngine { ) -> arbitrary::Result { let mut new_config = u.arbitrary::()?; new_config.compiler_strategy = compiler_strategy; - new_config.update_module_config(&mut config.module_config.config, u)?; + new_config.update_module_config(&mut config.module_config, u)?; new_config.make_compatible_with(&config.wasmtime); let config = generators::Config { wasmtime: new_config, module_config: config.module_config.clone(), }; + log::debug!("Created new Wasmtime differential engine with config: {config:?}"); + Ok(Self { config }) } } @@ -57,12 +59,13 @@ impl DiffEngine for WasmtimeEngine { let lhs = lhs .downcast_ref::() .expect(&format!("not a trap: {lhs:?}")); + assert_eq!(lhs, rhs, "{lhs}\nis not equal to\n{rhs}"); } - fn is_stack_overflow(&self, err: &Error) -> bool { + fn is_non_deterministic_error(&self, err: &Error) -> bool { match err.downcast_ref::() { - Some(trap) => *trap == Trap::StackOverflow, + Some(trap) => super::wasmtime_trap_is_non_deterministic(trap), None => false, } } @@ -118,11 +121,10 @@ impl WasmtimeInstance { globals .into_iter() - .map(|(name, global)| { - ( - name, - global.ty(&self.store).content().clone().try_into().unwrap(), - ) + .filter_map(|(name, global)| { + DiffValueType::try_from(global.ty(&self.store).content().clone()) + .map(|ty| (name, ty)) + .ok() }) .collect() } diff --git a/crates/fuzzing/src/oracles/dummy.rs b/crates/fuzzing/src/oracles/dummy.rs index 79dd25e685..c16f170c8e 100644 --- a/crates/fuzzing/src/oracles/dummy.rs +++ b/crates/fuzzing/src/oracles/dummy.rs @@ -1,6 +1,5 @@ //! Dummy implementations of things that a Wasm module can import. -use anyhow::ensure; use wasmtime::*; /// Create a set of dummy functions/globals/etc for the given imports. @@ -8,7 +7,10 @@ pub fn dummy_linker(store: &mut Store, module: &Module) -> Result(store: &mut Store, module: &Module) -> Result(store: &mut Store, ty: ExternType) -> Result { - Ok(match ty { - ExternType::Func(func_ty) => Extern::Func(dummy_func(store, func_ty)?), - ExternType::Global(global_ty) => Extern::Global(dummy_global(store, global_ty)?), - ExternType::Table(table_ty) => Extern::Table(dummy_table(store, table_ty)?), - ExternType::Memory(mem_ty) => Extern::Memory(dummy_memory(store, mem_ty)?), - ExternType::Tag(_tag_ty) => todo!(), // FIXME: #10252 - }) -} - -/// Construct a dummy function for the given function type -pub fn dummy_func(store: &mut Store, ty: FuncType) -> Result { - let dummy_results = ty.results().map(dummy_value).collect::>>()?; - Ok(Func::new(store, ty.clone(), move |_, _, results| { - for (slot, dummy) in results.iter_mut().zip(&dummy_results) { - *slot = *dummy; - } - Ok(()) - })) -} - -/// Construct a dummy value for the given value type. -pub fn dummy_value(val_ty: ValType) -> Result { - Ok(match val_ty { - ValType::I32 => Val::I32(0), - ValType::I64 => Val::I64(0), - ValType::F32 => Val::F32(0), - ValType::F64 => Val::F64(0), - ValType::V128 => Val::V128(0.into()), - ValType::Ref(r) => { - ensure!( - r.is_nullable(), - "cannot construct a dummy value of type `{r}`" - ); - Val::null_ref(r.heap_type()) - } - }) -} - -/// Construct a sequence of dummy values for the given types. -pub fn dummy_values(val_tys: impl IntoIterator) -> Result> { - val_tys.into_iter().map(dummy_value).collect() -} - -/// Construct a dummy global for the given global type. -pub fn dummy_global(store: &mut Store, ty: GlobalType) -> Result { - let val = dummy_value(ty.content().clone())?; - Global::new(store, ty, val) -} - -/// Construct a dummy table for the given table type. -pub fn dummy_table(store: &mut Store, ty: TableType) -> Result { - let init_val = dummy_value(ty.element().clone().into())?; - Table::new(store, ty, init_val.ref_().unwrap()) -} - -/// Construct a dummy memory for the given memory type. -pub fn dummy_memory(store: &mut Store, ty: MemoryType) -> Result { - Memory::new(store, ty) -} - #[cfg(test)] mod tests { @@ -93,7 +33,8 @@ mod tests { #[test] fn dummy_table_import() { let mut store = store(); - let table = dummy_table(&mut store, TableType::new(RefType::EXTERNREF, 10, None)).unwrap(); + let table_type = TableType::new(RefType::EXTERNREF, 10, None); + let table = table_type.default_value(&mut store).unwrap(); assert_eq!(table.size(&store), 10); for i in 0..10 { assert!(table.get(&mut store, i).unwrap().unwrap_extern().is_none()); @@ -103,8 +44,8 @@ mod tests { #[test] fn dummy_global_import() { let mut store = store(); - let global = - dummy_global(&mut store, GlobalType::new(ValType::I32, Mutability::Const)).unwrap(); + let global_type = GlobalType::new(ValType::I32, Mutability::Const); + let global = global_type.default_value(&mut store).unwrap(); assert!(global.ty(&store).content().is_i32()); assert_eq!(global.ty(&store).mutability(), Mutability::Const); } @@ -112,7 +53,8 @@ mod tests { #[test] fn dummy_memory_import() { let mut store = store(); - let memory = dummy_memory(&mut store, MemoryType::new(1, None)).unwrap(); + let memory_type = MemoryType::new(1, None); + let memory = memory_type.default_value(&mut store).unwrap(); assert_eq!(memory.size(&store), 1); } @@ -120,7 +62,7 @@ mod tests { fn dummy_function_import() { let mut store = store(); let func_ty = FuncType::new(store.engine(), vec![ValType::I32], vec![ValType::I64]); - let func = dummy_func(&mut store, func_ty.clone()).unwrap(); + let func = func_ty.default_value(&mut store).unwrap(); let actual_ty = func.ty(&store); assert!(FuncType::eq(&actual_ty, &func_ty)); } diff --git a/crates/fuzzing/src/oracles/engine.rs b/crates/fuzzing/src/oracles/engine.rs index 6fc82a69da..e64eca7aff 100644 --- a/crates/fuzzing/src/oracles/engine.rs +++ b/crates/fuzzing/src/oracles/engine.rs @@ -61,9 +61,12 @@ pub trait DiffEngine { /// generated. fn assert_error_match(&self, err: &Error, trap: &Trap); - /// Returns whether the error specified from this engine might be stack - /// overflow. - fn is_stack_overflow(&self, err: &Error) -> bool; + /// Returns whether the error specified from this engine is + /// non-deterministic, like a stack overflow or an attempt to allocate an + /// object that is too large (which is non-deterministic because it may + /// depend on which collector it was configured with or memory available on + /// the system). + fn is_non_deterministic_error(&self, err: &Error) -> bool; } /// Provide a way to evaluate Wasm functions--a Wasm instance implemented by a diff --git a/crates/misc/component-async-tests/src/util.rs b/crates/misc/component-async-tests/src/util.rs index 902bd7b9cb..a5f2884a6b 100644 --- a/crates/misc/component-async-tests/src/util.rs +++ b/crates/misc/component-async-tests/src/util.rs @@ -55,6 +55,7 @@ pub async fn test_run(component: &[u8]) -> Result<()> { config.cranelift_debug_verifier(true); config.wasm_component_model(true); config.wasm_component_model_async(true); + config.wasm_component_model_error_context(true); config.async_support(true); config.epoch_interruption(true); diff --git a/crates/misc/component-fuzz-util/Cargo.toml b/crates/misc/component-fuzz-util/Cargo.toml deleted file mode 100644 index 9f6f4a8e99..0000000000 --- a/crates/misc/component-fuzz-util/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "component-fuzz-util" -authors = ["The Wasmtime Project Developers"] -license = "Apache-2.0 WITH LLVM-exception" -version = "0.0.0" -edition.workspace = true -rust-version.workspace = true -publish = false - -[lints] -workspace = true - -[dependencies] -anyhow = { workspace = true } -arbitrary = { workspace = true, features = ["derive"] } -proc-macro2 = "1.0" -quote = "1.0" -wasmtime-component-util = { workspace = true } diff --git a/crates/misc/component-macro-test/Cargo.toml b/crates/misc/component-macro-test/Cargo.toml deleted file mode 100644 index 5bc71a5fdf..0000000000 --- a/crates/misc/component-macro-test/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "component-macro-test" -authors = ["The Wasmtime Project Developers"] -license = "Apache-2.0 WITH LLVM-exception" -version = "0.0.0" -edition.workspace = true -rust-version.workspace = true -publish = false - -[lib] -proc-macro = true -test = false -doctest = false - -[dependencies] -proc-macro2 = "1.0" -quote = "1.0" -syn = { workspace = true, features = ["full"] } diff --git a/crates/misc/component-macro-test/src/lib.rs b/crates/misc/component-macro-test/src/lib.rs deleted file mode 100644 index 26fc265465..0000000000 --- a/crates/misc/component-macro-test/src/lib.rs +++ /dev/null @@ -1,78 +0,0 @@ -use proc_macro2::{Span, TokenStream}; -use quote::{format_ident, quote}; -use syn::parse::{Parse, ParseStream}; -use syn::{parse_macro_input, Error, Result, Token}; - -#[proc_macro_attribute] -pub fn add_variants( - attr: proc_macro::TokenStream, - item: proc_macro::TokenStream, -) -> proc_macro::TokenStream { - expand_variants( - &parse_macro_input!(attr as syn::LitInt), - parse_macro_input!(item as syn::ItemEnum), - ) - .unwrap_or_else(syn::Error::into_compile_error) - .into() -} - -fn expand_variants(count: &syn::LitInt, mut ty: syn::ItemEnum) -> syn::Result { - let count = count - .base10_digits() - .parse::() - .map_err(|_| syn::Error::new(count.span(), "expected unsigned integer"))?; - - ty.variants = (0..count) - .map(|index| syn::Variant { - attrs: Vec::new(), - ident: syn::Ident::new(&format!("V{}", index), Span::call_site()), - fields: syn::Fields::Unit, - discriminant: None, - }) - .collect(); - - Ok(quote!(#ty)) -} - -#[derive(Debug)] -struct FlagsTest { - name: String, - flag_count: usize, -} - -impl Parse for FlagsTest { - fn parse(input: ParseStream) -> Result { - let name = input.parse::()?.to_string(); - input.parse::()?; - let flag_count = input.parse::()?.base10_parse()?; - - Ok(Self { name, flag_count }) - } -} - -#[proc_macro] -pub fn flags_test(input: proc_macro::TokenStream) -> proc_macro::TokenStream { - expand_flags_test(&parse_macro_input!(input as FlagsTest)) - .unwrap_or_else(Error::into_compile_error) - .into() -} - -fn expand_flags_test(test: &FlagsTest) -> Result { - let name = format_ident!("{}", test.name); - let flags = (0..test.flag_count) - .map(|index| { - let name = format_ident!("F{}", index); - quote!(const #name;) - }) - .collect::(); - - let expanded = quote! { - wasmtime::component::flags! { - #name { - #flags - } - } - }; - - Ok(expanded) -} diff --git a/crates/misc/component-test-util/Cargo.toml b/crates/misc/component-test-util/Cargo.toml deleted file mode 100644 index dc1ce92d02..0000000000 --- a/crates/misc/component-test-util/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "component-test-util" -authors = ["The Wasmtime Project Developers"] -license = "Apache-2.0 WITH LLVM-exception" -version = "0.0.0" -edition.workspace = true -rust-version.workspace = true -publish = false - -[dependencies] -env_logger = { workspace = true } -anyhow = { workspace = true } -arbitrary = { workspace = true, features = ["derive"] } -wasmtime = { workspace = true, features = ["component-model", "async", "component-model-async"] } -wasmtime-environ = { workspace = true } -wasmtime-wast-util = { path = '../../wast-util' } -target-lexicon = { workspace = true } diff --git a/crates/test-macros/Cargo.toml b/crates/test-macros/Cargo.toml index e240766309..4728614177 100644 --- a/crates/test-macros/Cargo.toml +++ b/crates/test-macros/Cargo.toml @@ -17,8 +17,8 @@ doctest = false workspace = true [dependencies] -quote = "1.0" -proc-macro2 = "1.0" +quote = { workspace = true } +proc-macro2 = { workspace = true } syn = { workspace = true, features = ["full"] } anyhow = { workspace = true } -wasmtime-wast-util = { path = '../wast-util' } +wasmtime-test-util = { workspace = true, features = ['wast'] } diff --git a/crates/test-macros/src/add_variants.rs b/crates/test-macros/src/add_variants.rs new file mode 100644 index 0000000000..bc32fd3635 --- /dev/null +++ b/crates/test-macros/src/add_variants.rs @@ -0,0 +1,33 @@ +use proc_macro2::{Span, TokenStream}; +use quote::quote; +use syn::parse_macro_input; + +pub fn run( + attr: proc_macro::TokenStream, + item: proc_macro::TokenStream, +) -> proc_macro::TokenStream { + expand_variants( + &parse_macro_input!(attr as syn::LitInt), + parse_macro_input!(item as syn::ItemEnum), + ) + .unwrap_or_else(syn::Error::into_compile_error) + .into() +} + +fn expand_variants(count: &syn::LitInt, mut ty: syn::ItemEnum) -> syn::Result { + let count = count + .base10_digits() + .parse::() + .map_err(|_| syn::Error::new(count.span(), "expected unsigned integer"))?; + + ty.variants = (0..count) + .map(|index| syn::Variant { + attrs: Vec::new(), + ident: syn::Ident::new(&format!("V{index}"), Span::call_site()), + fields: syn::Fields::Unit, + discriminant: None, + }) + .collect(); + + Ok(quote!(#ty)) +} diff --git a/crates/test-macros/src/flags_test.rs b/crates/test-macros/src/flags_test.rs new file mode 100644 index 0000000000..18682a68a0 --- /dev/null +++ b/crates/test-macros/src/flags_test.rs @@ -0,0 +1,46 @@ +use proc_macro2::TokenStream; +use quote::{format_ident, quote}; +use syn::parse::{Parse, ParseStream}; +use syn::{parse_macro_input, Error, Result, Token}; + +#[derive(Debug)] +struct FlagsTest { + name: String, + flag_count: usize, +} + +impl Parse for FlagsTest { + fn parse(input: ParseStream) -> Result { + let name = input.parse::()?.to_string(); + input.parse::()?; + let flag_count = input.parse::()?.base10_parse()?; + + Ok(Self { name, flag_count }) + } +} + +pub fn run(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + expand(&parse_macro_input!(input as FlagsTest)) + .unwrap_or_else(Error::into_compile_error) + .into() +} + +fn expand(test: &FlagsTest) -> Result { + let name = format_ident!("{}", test.name); + let flags = (0..test.flag_count) + .map(|index| { + let name = format_ident!("F{}", index); + quote!(const #name;) + }) + .collect::(); + + let expanded = quote! { + wasmtime::component::flags! { + #name { + #flags + } + } + }; + + Ok(expanded) +} diff --git a/crates/test-macros/src/lib.rs b/crates/test-macros/src/lib.rs index 7056ce391b..782b601a9d 100644 --- a/crates/test-macros/src/lib.rs +++ b/crates/test-macros/src/lib.rs @@ -1,306 +1,22 @@ -//! Wasmtime test macro. -//! -//! This macro is a helper to define tests that exercise multiple configuration -//! combinations for Wasmtime. Currently compiler strategies and wasm features -//! are supported. -//! -//! Usage -//! -//! To exclude a compiler strategy: -//! -//! ```rust -//! #[wasmtime_test(strategies(not(Winch)))] -//! fn my_test(config: &mut Config) -> Result<()> { -//! Ok(()) -//! } -//! ``` -//! -//! To use just one specific compiler strategy: -//! -//! ```rust -//! #[wasmtime_test(strategies(only(Winch)))] -//! fn my_test(config: &mut Config) -> Result<()> { -//! Ok(()) -//! } -//! ``` -//! -//! To explicitly indicate that a wasm features is needed -//! ``` -//! #[wasmtime_test(wasm_features(gc))] -//! fn my_wasm_gc_test(config: &mut Config) -> Result<()> { -//! Ok(()) -//! } -//! ``` -//! -//! If the specified wasm feature is disabled by default, the macro will enable -//! the feature in the configuration passed to the test. -//! -//! If the wasm feature is not supported by any of the compiler strategies, no -//! tests will be generated for such strategy. -use proc_macro::TokenStream; -use quote::{quote, ToTokens, TokenStreamExt}; -use syn::{ - braced, - meta::ParseNestedMeta, - parse::{Parse, ParseStream}, - parse_macro_input, token, Attribute, Ident, Result, ReturnType, Signature, Visibility, -}; -use wasmtime_wast_util::Compiler; - -/// Test configuration. -struct TestConfig { - strategies: Vec, - flags: wasmtime_wast_util::TestConfig, - /// The test attribute to use. Defaults to `#[test]`. - test_attribute: Option, -} - -impl TestConfig { - fn strategies_from(&mut self, meta: &ParseNestedMeta) -> Result<()> { - meta.parse_nested_meta(|meta| { - if meta.path.is_ident("not") { - meta.parse_nested_meta(|meta| { - if meta.path.is_ident("Winch") { - self.strategies.retain(|s| *s != Compiler::Winch); - Ok(()) - } else if meta.path.is_ident("CraneliftNative") { - self.strategies.retain(|s| *s != Compiler::CraneliftNative); - Ok(()) - } else if meta.path.is_ident("CraneliftPulley") { - self.strategies.retain(|s| *s != Compiler::CraneliftPulley); - Ok(()) - } else { - Err(meta.error("Unknown strategy")) - } - }) - } else if meta.path.is_ident("only") { - meta.parse_nested_meta(|meta| { - if meta.path.is_ident("Winch") { - self.strategies.retain(|s| *s == Compiler::Winch); - Ok(()) - } else if meta.path.is_ident("CraneliftNative") { - self.strategies.retain(|s| *s == Compiler::CraneliftNative); - Ok(()) - } else if meta.path.is_ident("CraneliftPulley") { - self.strategies.retain(|s| *s == Compiler::CraneliftPulley); - Ok(()) - } else { - Err(meta.error("Unknown strategy")) - } - }) - } else { - Err(meta.error("Unknown identifier")) - } - })?; - - if self.strategies.len() == 0 { - Err(meta.error("Expected at least one strategy")) - } else { - Ok(()) - } - } - - fn wasm_features_from(&mut self, meta: &ParseNestedMeta) -> Result<()> { - meta.parse_nested_meta(|meta| { - for (feature, enabled) in self.flags.options_mut() { - if meta.path.is_ident(feature) { - *enabled = Some(true); - return Ok(()); - } - } - Err(meta.error("Unsupported test feature")) - })?; - - Ok(()) - } - - fn test_attribute_from(&mut self, meta: &ParseNestedMeta) -> Result<()> { - let v: syn::LitStr = meta.value()?.parse()?; - self.test_attribute = Some(v.value().parse()?); - Ok(()) - } -} - -impl Default for TestConfig { - fn default() -> Self { - Self { - strategies: vec![ - Compiler::CraneliftNative, - Compiler::Winch, - Compiler::CraneliftPulley, - ], - flags: Default::default(), - test_attribute: None, - } - } -} - -/// A generic function body represented as a braced [`TokenStream`]. -struct Block { - brace: token::Brace, - rest: proc_macro2::TokenStream, -} - -impl Parse for Block { - fn parse(input: ParseStream) -> Result { - let content; - Ok(Self { - brace: braced!(content in input), - rest: content.parse()?, - }) - } -} - -impl ToTokens for Block { - fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { - self.brace.surround(tokens, |tokens| { - tokens.append_all(self.rest.clone()); - }); - } -} +//! Various helper macros used throughout testing wasmtime -/// Custom function parser. -/// Parses the function's attributes, visibility and signature, leaving the -/// block as an opaque [`TokenStream`]. -struct Fn { - attrs: Vec, - visibility: Visibility, - sig: Signature, - body: Block, -} - -impl Parse for Fn { - fn parse(input: ParseStream) -> Result { - let attrs = input.call(Attribute::parse_outer)?; - let visibility: Visibility = input.parse()?; - let sig: Signature = input.parse()?; - let body: Block = input.parse()?; - - Ok(Self { - attrs, - visibility, - sig, - body, - }) - } -} +use proc_macro::TokenStream; -impl ToTokens for Fn { - fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { - for attr in &self.attrs { - attr.to_tokens(tokens); - } - self.visibility.to_tokens(tokens); - self.sig.to_tokens(tokens); - self.body.to_tokens(tokens); - } -} +mod add_variants; +mod flags_test; +mod wasmtime_test; #[proc_macro_attribute] pub fn wasmtime_test(attrs: TokenStream, item: TokenStream) -> TokenStream { - let mut test_config = TestConfig::default(); - - let config_parser = syn::meta::parser(|meta| { - if meta.path.is_ident("strategies") { - test_config.strategies_from(&meta) - } else if meta.path.is_ident("wasm_features") { - test_config.wasm_features_from(&meta) - } else if meta.path.is_ident("with") { - test_config.test_attribute_from(&meta) - } else { - Err(meta.error("Unsupported attributes")) - } - }); - - parse_macro_input!(attrs with config_parser); - - match expand(&test_config, parse_macro_input!(item as Fn)) { - Ok(tok) => tok, - Err(e) => e.into_compile_error().into(), - } + wasmtime_test::run(attrs, item) } -fn expand(test_config: &TestConfig, func: Fn) -> Result { - let mut tests = if test_config.strategies == [Compiler::Winch] { - vec![quote! { - // This prevents dead code warning when the macro is invoked as: - // #[wasmtime_test(strategies(only(Winch))] - // Given that Winch only fully supports x86_64. - #[allow(dead_code)] - #func - }] - } else { - vec![quote! { #func }] - }; - let attrs = &func.attrs; - - let test_attr = test_config - .test_attribute - .clone() - .unwrap_or_else(|| quote! { #[test] }); - - for strategy in &test_config.strategies { - let strategy_name = format!("{strategy:?}"); - // Winch currently only offers support for x64, and it requires - // signals-based-traps which MIRI disables so disable winch tests on MIRI - let target = if *strategy == Compiler::Winch { - quote! { #[cfg(all(target_arch = "x86_64", not(miri)))] } - } else { - quote! {} - }; - let (asyncness, await_) = if func.sig.asyncness.is_some() { - (quote! { async }, quote! { .await }) - } else { - (quote! {}, quote! {}) - }; - let func_name = &func.sig.ident; - let expect = match &func.sig.output { - ReturnType::Default => quote! {}, - ReturnType::Type(..) => quote! { .expect("test is expected to pass") }, - }; - let test_name = Ident::new( - &format!("{}_{}", strategy_name.to_lowercase(), func_name), - func_name.span(), - ); - - let should_panic = if strategy.should_fail(&test_config.flags) { - quote!(#[should_panic]) - } else { - quote!() - }; - - let test_config = format!("wasmtime_wast_util::{:?}", test_config.flags) - .parse::() - .unwrap(); - let strategy_ident = quote::format_ident!("{strategy_name}"); - - let tok = quote! { - #test_attr - #target - #should_panic - #(#attrs)* - #asyncness fn #test_name() { - let mut config = Config::new(); - component_test_util::apply_test_config( - &mut config, - &#test_config, - ); - component_test_util::apply_wast_config( - &mut config, - &wasmtime_wast_util::WastConfig { - compiler: wasmtime_wast_util::Compiler::#strategy_ident, - pooling: false, - collector: wasmtime_wast_util::Collector::Auto, - }, - ); - #func_name(&mut config) #await_ #expect - } - }; +#[proc_macro_attribute] +pub fn add_variants(attr: TokenStream, item: TokenStream) -> TokenStream { + add_variants::run(attr, item) +} - tests.push(tok); - } - Ok(quote! { - #(#tests)* - } - .into()) +#[proc_macro] +pub fn flags_test(input: TokenStream) -> TokenStream { + flags_test::run(input) } diff --git a/crates/test-macros/src/wasmtime_test.rs b/crates/test-macros/src/wasmtime_test.rs new file mode 100644 index 0000000000..6fe9af34e3 --- /dev/null +++ b/crates/test-macros/src/wasmtime_test.rs @@ -0,0 +1,306 @@ +//! Wasmtime test macro. +//! +//! This macro is a helper to define tests that exercise multiple configuration +//! combinations for Wasmtime. Currently compiler strategies and wasm features +//! are supported. +//! +//! Usage +//! +//! To exclude a compiler strategy: +//! +//! ```rust +//! #[wasmtime_test(strategies(not(Winch)))] +//! fn my_test(config: &mut Config) -> Result<()> { +//! Ok(()) +//! } +//! ``` +//! +//! To use just one specific compiler strategy: +//! +//! ```rust +//! #[wasmtime_test(strategies(only(Winch)))] +//! fn my_test(config: &mut Config) -> Result<()> { +//! Ok(()) +//! } +//! ``` +//! +//! To explicitly indicate that a wasm features is needed +//! ``` +//! #[wasmtime_test(wasm_features(gc))] +//! fn my_wasm_gc_test(config: &mut Config) -> Result<()> { +//! Ok(()) +//! } +//! ``` +//! +//! If the specified wasm feature is disabled by default, the macro will enable +//! the feature in the configuration passed to the test. +//! +//! If the wasm feature is not supported by any of the compiler strategies, no +//! tests will be generated for such strategy. +use proc_macro::TokenStream; +use quote::{quote, ToTokens, TokenStreamExt}; +use syn::{ + braced, + meta::ParseNestedMeta, + parse::{Parse, ParseStream}, + parse_macro_input, token, Attribute, Ident, Result, ReturnType, Signature, Visibility, +}; +use wasmtime_test_util::wast::Compiler; + +/// Test configuration. +struct TestConfig { + strategies: Vec, + flags: wasmtime_test_util::wast::TestConfig, + /// The test attribute to use. Defaults to `#[test]`. + test_attribute: Option, +} + +impl TestConfig { + fn strategies_from(&mut self, meta: &ParseNestedMeta) -> Result<()> { + meta.parse_nested_meta(|meta| { + if meta.path.is_ident("not") { + meta.parse_nested_meta(|meta| { + if meta.path.is_ident("Winch") { + self.strategies.retain(|s| *s != Compiler::Winch); + Ok(()) + } else if meta.path.is_ident("CraneliftNative") { + self.strategies.retain(|s| *s != Compiler::CraneliftNative); + Ok(()) + } else if meta.path.is_ident("CraneliftPulley") { + self.strategies.retain(|s| *s != Compiler::CraneliftPulley); + Ok(()) + } else { + Err(meta.error("Unknown strategy")) + } + }) + } else if meta.path.is_ident("only") { + meta.parse_nested_meta(|meta| { + if meta.path.is_ident("Winch") { + self.strategies.retain(|s| *s == Compiler::Winch); + Ok(()) + } else if meta.path.is_ident("CraneliftNative") { + self.strategies.retain(|s| *s == Compiler::CraneliftNative); + Ok(()) + } else if meta.path.is_ident("CraneliftPulley") { + self.strategies.retain(|s| *s == Compiler::CraneliftPulley); + Ok(()) + } else { + Err(meta.error("Unknown strategy")) + } + }) + } else { + Err(meta.error("Unknown identifier")) + } + })?; + + if self.strategies.len() == 0 { + Err(meta.error("Expected at least one strategy")) + } else { + Ok(()) + } + } + + fn wasm_features_from(&mut self, meta: &ParseNestedMeta) -> Result<()> { + meta.parse_nested_meta(|meta| { + for (feature, enabled) in self.flags.options_mut() { + if meta.path.is_ident(feature) { + *enabled = Some(true); + return Ok(()); + } + } + Err(meta.error("Unsupported test feature")) + })?; + + Ok(()) + } + + fn test_attribute_from(&mut self, meta: &ParseNestedMeta) -> Result<()> { + let v: syn::LitStr = meta.value()?.parse()?; + self.test_attribute = Some(v.value().parse()?); + Ok(()) + } +} + +impl Default for TestConfig { + fn default() -> Self { + Self { + strategies: vec![ + Compiler::CraneliftNative, + Compiler::Winch, + Compiler::CraneliftPulley, + ], + flags: Default::default(), + test_attribute: None, + } + } +} + +/// A generic function body represented as a braced [`TokenStream`]. +struct Block { + brace: token::Brace, + rest: proc_macro2::TokenStream, +} + +impl Parse for Block { + fn parse(input: ParseStream) -> Result { + let content; + Ok(Self { + brace: braced!(content in input), + rest: content.parse()?, + }) + } +} + +impl ToTokens for Block { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + self.brace.surround(tokens, |tokens| { + tokens.append_all(self.rest.clone()); + }); + } +} + +/// Custom function parser. +/// Parses the function's attributes, visibility and signature, leaving the +/// block as an opaque [`TokenStream`]. +struct Fn { + attrs: Vec, + visibility: Visibility, + sig: Signature, + body: Block, +} + +impl Parse for Fn { + fn parse(input: ParseStream) -> Result { + let attrs = input.call(Attribute::parse_outer)?; + let visibility: Visibility = input.parse()?; + let sig: Signature = input.parse()?; + let body: Block = input.parse()?; + + Ok(Self { + attrs, + visibility, + sig, + body, + }) + } +} + +impl ToTokens for Fn { + fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) { + for attr in &self.attrs { + attr.to_tokens(tokens); + } + self.visibility.to_tokens(tokens); + self.sig.to_tokens(tokens); + self.body.to_tokens(tokens); + } +} + +pub fn run(attrs: TokenStream, item: TokenStream) -> TokenStream { + let mut test_config = TestConfig::default(); + + let config_parser = syn::meta::parser(|meta| { + if meta.path.is_ident("strategies") { + test_config.strategies_from(&meta) + } else if meta.path.is_ident("wasm_features") { + test_config.wasm_features_from(&meta) + } else if meta.path.is_ident("with") { + test_config.test_attribute_from(&meta) + } else { + Err(meta.error("Unsupported attributes")) + } + }); + + parse_macro_input!(attrs with config_parser); + + match expand(&test_config, parse_macro_input!(item as Fn)) { + Ok(tok) => tok, + Err(e) => e.into_compile_error().into(), + } +} + +fn expand(test_config: &TestConfig, func: Fn) -> Result { + let mut tests = if test_config.strategies == [Compiler::Winch] { + vec![quote! { + // This prevents dead code warning when the macro is invoked as: + // #[wasmtime_test(strategies(only(Winch))] + // Given that Winch only fully supports x86_64. + #[allow(dead_code)] + #func + }] + } else { + vec![quote! { #func }] + }; + let attrs = &func.attrs; + + let test_attr = test_config + .test_attribute + .clone() + .unwrap_or_else(|| quote! { #[test] }); + + for strategy in &test_config.strategies { + let strategy_name = format!("{strategy:?}"); + // Winch currently only offers support for x64, and it requires + // signals-based-traps which MIRI disables so disable winch tests on MIRI + let target = if *strategy == Compiler::Winch { + quote! { #[cfg(all(target_arch = "x86_64", not(miri)))] } + } else { + quote! {} + }; + let (asyncness, await_) = if func.sig.asyncness.is_some() { + (quote! { async }, quote! { .await }) + } else { + (quote! {}, quote! {}) + }; + let func_name = &func.sig.ident; + let expect = match &func.sig.output { + ReturnType::Default => quote! {}, + ReturnType::Type(..) => quote! { .expect("test is expected to pass") }, + }; + let test_name = Ident::new( + &format!("{}_{}", strategy_name.to_lowercase(), func_name), + func_name.span(), + ); + + let should_panic = if strategy.should_fail(&test_config.flags) { + quote!(#[should_panic]) + } else { + quote!() + }; + + let test_config = format!("wasmtime_test_util::wast::{:?}", test_config.flags) + .parse::() + .unwrap(); + let strategy_ident = quote::format_ident!("{strategy_name}"); + + let tok = quote! { + #test_attr + #target + #should_panic + #(#attrs)* + #asyncness fn #test_name() { + let _ = env_logger::try_init(); + let mut config = Config::new(); + wasmtime_test_util::wasmtime_wast::apply_test_config( + &mut config, + &#test_config, + ); + wasmtime_test_util::wasmtime_wast::apply_wast_config( + &mut config, + &wasmtime_test_util::wast::WastConfig { + compiler: wasmtime_test_util::wast::Compiler::#strategy_ident, + pooling: false, + collector: wasmtime_test_util::wast::Collector::Auto, + }, + ); + #func_name(&mut config) #await_ #expect + } + }; + + tests.push(tok); + } + Ok(quote! { + #(#tests)* + } + .into()) +} diff --git a/crates/test-programs/Cargo.toml b/crates/test-programs/Cargo.toml index 4fbf971c63..d9b15d499c 100644 --- a/crates/test-programs/Cargo.toml +++ b/crates/test-programs/Cargo.toml @@ -12,16 +12,15 @@ workspace = true [dependencies] anyhow = { workspace = true, features = ['std'] } -wasi = "0.11.0" wasi-nn = "0.6.0" wit-bindgen = { workspace = true, features = ['default'] } wit-bindgen-rt = { workspace = true, features = ['async'] } libc = { workspace = true } -getrandom = "0.2.9" futures = { workspace = true, default-features = false, features = ['alloc'] } url = { workspace = true } sha2 = "0.10.2" -base64 = "0.21.0" +base64 = { workspace = true } +wasip1 = { version = "0.11.0", package = 'wasi' } wasip2 = { version = "0.14.0", package = 'wasi' } once_cell = "1.19.0" flate2 = "1.0.28" diff --git a/crates/test-programs/artifacts/Cargo.toml b/crates/test-programs/artifacts/Cargo.toml index b5141bbfdc..f92d9a9422 100644 --- a/crates/test-programs/artifacts/Cargo.toml +++ b/crates/test-programs/artifacts/Cargo.toml @@ -17,4 +17,4 @@ wasmtime = { workspace = true, features = ['incremental-cache', 'cranelift', 'co heck = { workspace = true } wit-component = { workspace = true } wasmparser = { workspace = true, features = ['features', 'validate', 'component-model'] } -cargo_metadata = "0.18.1" +cargo_metadata = "0.19.2" diff --git a/crates/test-programs/artifacts/build.rs b/crates/test-programs/artifacts/build.rs index 3275caecf3..2b4ee70148 100644 --- a/crates/test-programs/artifacts/build.rs +++ b/crates/test-programs/artifacts/build.rs @@ -1,6 +1,7 @@ use heck::*; use std::collections::BTreeMap; use std::env; +use std::ffi::OsString; use std::fs; use std::path::{Path, PathBuf}; use std::process::Command; @@ -47,7 +48,7 @@ fn build_and_generate_tests() { .unwrap() .targets .iter() - .filter(move |t| t.kind == &["bin"]) + .filter(move |t| t.kind == &[cargo_metadata::TargetKind::Bin]) .map(|t| &t.name) .collect::>(); @@ -83,6 +84,7 @@ fn build_and_generate_tests() { s if s.starts_with("dwarf_") => "dwarf", s if s.starts_with("config_") => "config", s if s.starts_with("keyvalue_") => "keyvalue", + s if s.starts_with("tls_") => "tls", s if s.starts_with("async_") => "async", // If you're reading this because you hit this panic, either add it // to a test suite above or add a new "suite". The purpose of the @@ -119,6 +121,8 @@ fn build_and_generate_tests() { generated_code += &format!("pub const {shouty}_COMPONENT: &'static str = {path:?};\n"); } + build_debug_info_assets(&mut generated_code); + for (kind, targets) in kinds { generated_code += &format!("#[macro_export]"); generated_code += &format!("macro_rules! foreach_{kind} {{\n"); @@ -194,6 +198,104 @@ fn compile_component(wasm: &Path, adapter: &[u8]) -> PathBuf { component_path } +fn build_debug_info_assets(paths_code: &mut String) { + const ASSETS_REL_SRC_DIR: &'static str = "../../../tests/all/debug/testsuite"; + println!("cargo:rerun-if-changed={ASSETS_REL_SRC_DIR}"); + + // There are three types of assets at this time: + // 1. Binary - we use them as-is from the source directory. + // They have the .wasm extension. + // 2. C/C++ source - we compile them below. + // 3. Explanatory - things like WAT for a binary we don't + // know how to compile (yet). They are ignored. + // + let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap()); + let assets_src_dir = fs::canonicalize(ASSETS_REL_SRC_DIR).unwrap(); + let binary_assets = [ + "dead_code.wasm", + "dwarf_fission.wasm", + "fib-wasm-dwarf5.wasm", + "fib-wasm-split4.wasm", + "fib-wasm.wasm", + "fraction-norm.wasm", + "reverse-str.wasm", + "spilled_frame_base.wasm", + "two_removed_branches.wasm", + ]; + for asset in binary_assets { + let (_, path_code) = get_di_asset_path(&assets_src_dir, asset); + *paths_code += &path_code; + } + + // Compile the C/C++ assets. + let compile_commands = [ + ( + "clang", + "generic.wasm", + [ + "-target", + "wasm32-unknown-wasip1", + "-g", + "generic.cpp", + "generic-satellite.cpp", + ] + .as_slice(), + ), + ( + "clang", + "codegen-optimized.wasm", + [ + "-target", + "wasm32-unknown-wasip1", + "-g", + "codegen-optimized.cpp", + ] + .as_slice(), + ), + ]; + + // The debug tests relying on these assets are ignored by default, + // so we cannot force the requirement of having a working WASI SDK + // install on everyone. At the same time, those tests (due to their + // monolithic nature), are always compiled, so we still have to + // produce the path constants. To solve this, we move the failure + // of missing WASI SDK from compile time to runtime by producing + // fake paths (that themselves will serve as diagnostic messages). + let wasi_sdk_bin_path = env::var_os("WASI_SDK_PATH").map(|p| PathBuf::from(p).join("bin")); + let missing_sdk_path = + PathBuf::from("Asset not compiled, WASI_SDK_PATH missing at compile time"); + let out_arg = OsString::from("-o"); + + for (compiler, asset, args) in compile_commands { + if let Some(compiler_dir) = &wasi_sdk_bin_path { + let (out_path, path_code) = get_di_asset_path(&out_dir, asset); + + let mut command = Command::new(compiler_dir.join(compiler)); + let output = command + .current_dir(&assets_src_dir) + .args([&out_arg, out_path.as_os_str()]) + .args(args) + .output(); + if !output.as_ref().is_ok_and(|o| o.status.success()) { + panic!("{command:?}: {output:?}"); + } + + *paths_code += &path_code; + } else { + let (_, path_code) = get_di_asset_path(&missing_sdk_path, asset); + *paths_code += &path_code; + } + } +} + +fn get_di_asset_path(dir: &PathBuf, asset: &str) -> (PathBuf, String) { + let mut name = asset.replace("-", "_").replace(".", "_"); + name = name.to_uppercase(); + let out_path = dir.join(asset); + let out_path_code = format!("pub const {name}_PATH: &'static str = {out_path:?};\n"); + (out_path, out_path_code) +} + fn cargo() -> Command { // Miri configures its own sysroot which we don't want to use, so remove // miri's own wrappers around rustc to ensure that we're using the real diff --git a/crates/test-programs/artifacts/src/lib.rs b/crates/test-programs/artifacts/src/lib.rs index bea4484b1a..98ab8272a4 100644 --- a/crates/test-programs/artifacts/src/lib.rs +++ b/crates/test-programs/artifacts/src/lib.rs @@ -19,6 +19,7 @@ pub fn wasi_tests_environment() -> &'static [(&'static str, &'static str)] { // Windows does not support renaming a directory to an empty directory - // empty directory must be deleted. ("NO_RENAME_DIR_TO_EMPTY_DIR", "1"), + ("RENAME_DIR_ONTO_FILE", "1"), ] } #[cfg(all(unix, not(target_os = "macos")))] diff --git a/crates/test-programs/src/bin/cli_multiple_preopens.rs b/crates/test-programs/src/bin/cli_multiple_preopens.rs index 4c1dfd7bea..db2bf098d9 100644 --- a/crates/test-programs/src/bin/cli_multiple_preopens.rs +++ b/crates/test-programs/src/bin/cli_multiple_preopens.rs @@ -3,10 +3,10 @@ use std::str; fn main() { dbg!(wasip2::filesystem::preopens::get_directories()); unsafe { - let p3 = wasi::fd_prestat_get(3).unwrap(); - let p4 = wasi::fd_prestat_get(4).unwrap(); - let p5 = wasi::fd_prestat_get(5).unwrap(); - assert_eq!(wasi::fd_prestat_get(6).err().unwrap(), wasi::ERRNO_BADF); + let p3 = wasip1::fd_prestat_get(3).unwrap(); + let p4 = wasip1::fd_prestat_get(4).unwrap(); + let p5 = wasip1::fd_prestat_get(5).unwrap(); + assert_eq!(wasip1::fd_prestat_get(6).err().unwrap(), wasip1::ERRNO_BADF); assert_eq!(p3.u.dir.pr_name_len, 2); assert_eq!(p4.u.dir.pr_name_len, 2); @@ -14,15 +14,15 @@ fn main() { let mut buf = [0; 100]; - wasi::fd_prestat_dir_name(3, buf.as_mut_ptr(), buf.len()).unwrap(); + wasip1::fd_prestat_dir_name(3, buf.as_mut_ptr(), buf.len()).unwrap(); assert_eq!(str::from_utf8(&buf[..2]).unwrap(), "/a"); - wasi::fd_prestat_dir_name(4, buf.as_mut_ptr(), buf.len()).unwrap(); + wasip1::fd_prestat_dir_name(4, buf.as_mut_ptr(), buf.len()).unwrap(); assert_eq!(str::from_utf8(&buf[..2]).unwrap(), "/b"); - wasi::fd_prestat_dir_name(5, buf.as_mut_ptr(), buf.len()).unwrap(); + wasip1::fd_prestat_dir_name(5, buf.as_mut_ptr(), buf.len()).unwrap(); assert_eq!(str::from_utf8(&buf[..2]).unwrap(), "/c"); assert_eq!( - wasi::fd_prestat_dir_name(6, buf.as_mut_ptr(), buf.len()), - Err(wasi::ERRNO_BADF), + wasip1::fd_prestat_dir_name(6, buf.as_mut_ptr(), buf.len()), + Err(wasip1::ERRNO_BADF), ); } // .. diff --git a/crates/test-programs/src/bin/cli_serve_return_before_set.rs b/crates/test-programs/src/bin/cli_serve_return_before_set.rs new file mode 100644 index 0000000000..25c33e71c0 --- /dev/null +++ b/crates/test-programs/src/bin/cli_serve_return_before_set.rs @@ -0,0 +1,12 @@ +use test_programs::proxy; +use test_programs::wasi::http::types::{IncomingRequest, ResponseOutparam}; + +struct T; + +proxy::export!(T); + +impl proxy::exports::wasi::http::incoming_handler::Guest for T { + fn handle(_request: IncomingRequest, _outparam: ResponseOutparam) {} +} + +fn main() {} diff --git a/crates/test-programs/src/bin/cli_serve_trap_before_set.rs b/crates/test-programs/src/bin/cli_serve_trap_before_set.rs new file mode 100644 index 0000000000..935ea2eb04 --- /dev/null +++ b/crates/test-programs/src/bin/cli_serve_trap_before_set.rs @@ -0,0 +1,15 @@ +use test_programs::proxy; +use test_programs::wasi::http::types::{IncomingRequest, ResponseOutparam}; + +struct T; + +proxy::export!(T); + +impl proxy::exports::wasi::http::incoming_handler::Guest for T { + fn handle(_request: IncomingRequest, _outparam: ResponseOutparam) { + #[cfg(target_arch = "wasm32")] + core::arch::wasm32::unreachable(); + } +} + +fn main() {} diff --git a/crates/test-programs/src/bin/cli_stdin_empty.rs b/crates/test-programs/src/bin/cli_stdin_empty.rs index c5df2f0903..8096f5569a 100644 --- a/crates/test-programs/src/bin/cli_stdin_empty.rs +++ b/crates/test-programs/src/bin/cli_stdin_empty.rs @@ -4,9 +4,9 @@ fn main() { let mut buffer = [0_u8; 0]; unsafe { - wasi::fd_read( + wasip1::fd_read( STDIN_FD, - &[wasi::Iovec { + &[wasip1::Iovec { buf: buffer.as_mut_ptr(), buf_len: 0, }], diff --git a/crates/test-programs/src/bin/preview1_big_random_buf.rs b/crates/test-programs/src/bin/preview1_big_random_buf.rs index ad40497f5c..d6b9709867 100644 --- a/crates/test-programs/src/bin/preview1_big_random_buf.rs +++ b/crates/test-programs/src/bin/preview1_big_random_buf.rs @@ -2,7 +2,7 @@ fn test_big_random_buf() { let mut buf = Vec::new(); buf.resize(1024, 0); unsafe { - wasi::random_get(buf.as_mut_ptr(), 1024).expect("failed to call random_get"); + wasip1::random_get(buf.as_mut_ptr(), 1024).expect("failed to call random_get"); } // Chances are pretty good that at least *one* byte will be non-zero in // any meaningful random function producing 1024 u8 values. diff --git a/crates/test-programs/src/bin/preview1_clock_time_get.rs b/crates/test-programs/src/bin/preview1_clock_time_get.rs index fcfcd582d9..416030784a 100644 --- a/crates/test-programs/src/bin/preview1_clock_time_get.rs +++ b/crates/test-programs/src/bin/preview1_clock_time_get.rs @@ -2,12 +2,13 @@ unsafe fn test_clock_time_get() { // Test that clock_time_get succeeds. Even in environments where it's not // desirable to expose high-precision timers, it should still succeed. // clock_res_get is where information about precision can be provided. - wasi::clock_time_get(wasi::CLOCKID_MONOTONIC, 1).expect("precision 1 should work"); + wasip1::clock_time_get(wasip1::CLOCKID_MONOTONIC, 1).expect("precision 1 should work"); let first_time = - wasi::clock_time_get(wasi::CLOCKID_MONOTONIC, 0).expect("precision 0 should work"); + wasip1::clock_time_get(wasip1::CLOCKID_MONOTONIC, 0).expect("precision 0 should work"); - let time = wasi::clock_time_get(wasi::CLOCKID_MONOTONIC, 0).expect("re-fetch time should work"); + let time = + wasip1::clock_time_get(wasip1::CLOCKID_MONOTONIC, 0).expect("re-fetch time should work"); assert!(first_time <= time, "CLOCK_MONOTONIC should be monotonic"); } diff --git a/crates/test-programs/src/bin/preview1_close_preopen.rs b/crates/test-programs/src/bin/preview1_close_preopen.rs index ba19148822..88e72d7fc2 100644 --- a/crates/test-programs/src/bin/preview1_close_preopen.rs +++ b/crates/test-programs/src/bin/preview1_close_preopen.rs @@ -1,26 +1,26 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, open_scratch_directory}; -unsafe fn test_close_preopen(dir_fd: wasi::Fd) { - let pre_fd: wasi::Fd = (libc::STDERR_FILENO + 1) as wasi::Fd; +unsafe fn test_close_preopen(dir_fd: wasip1::Fd) { + let pre_fd: wasip1::Fd = (libc::STDERR_FILENO + 1) as wasip1::Fd; assert!(dir_fd > pre_fd, "dir_fd number"); // Try to close a preopened directory handle. - wasi::fd_close(pre_fd).expect("closing a preopened file descriptor"); + wasip1::fd_close(pre_fd).expect("closing a preopened file descriptor"); // Ensure that dir_fd is still open. - let dir_fdstat = wasi::fd_fdstat_get(dir_fd).expect("failed fd_fdstat_get"); + let dir_fdstat = wasip1::fd_fdstat_get(dir_fd).expect("failed fd_fdstat_get"); assert_eq!( dir_fdstat.fs_filetype, - wasi::FILETYPE_DIRECTORY, + wasip1::FILETYPE_DIRECTORY, "expected the scratch directory to be a directory", ); // Ensure that pre_fd is closed. assert_errno!( - wasi::fd_fdstat_get(pre_fd).expect_err("failed fd_fdstat_get"), - wasi::ERRNO_BADF + wasip1::fd_fdstat_get(pre_fd).expect_err("failed fd_fdstat_get"), + wasip1::ERRNO_BADF ); } diff --git a/crates/test-programs/src/bin/preview1_dangling_fd.rs b/crates/test-programs/src/bin/preview1_dangling_fd.rs index 50217aeb1e..00681ca4ad 100644 --- a/crates/test-programs/src/bin/preview1_dangling_fd.rs +++ b/crates/test-programs/src/bin/preview1_dangling_fd.rs @@ -1,31 +1,31 @@ use std::{env, process}; use test_programs::preview1::{config, open_scratch_directory}; -unsafe fn test_dangling_fd(dir_fd: wasi::Fd) { +unsafe fn test_dangling_fd(dir_fd: wasip1::Fd) { if config().support_dangling_filesystem() { // Create a file, open it, delete it without closing the handle, // and then try creating it again - let fd = wasi::path_open(dir_fd, 0, "file", wasi::OFLAGS_CREAT, 0, 0, 0).unwrap(); - wasi::fd_close(fd).unwrap(); - let file_fd = wasi::path_open(dir_fd, 0, "file", 0, 0, 0, 0).expect("failed to open"); + let fd = wasip1::path_open(dir_fd, 0, "file", wasip1::OFLAGS_CREAT, 0, 0, 0).unwrap(); + wasip1::fd_close(fd).unwrap(); + let file_fd = wasip1::path_open(dir_fd, 0, "file", 0, 0, 0, 0).expect("failed to open"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::path_unlink_file(dir_fd, "file").expect("failed to unlink"); - let fd = wasi::path_open(dir_fd, 0, "file", wasi::OFLAGS_CREAT, 0, 0, 0).unwrap(); - wasi::fd_close(fd).unwrap(); + wasip1::path_unlink_file(dir_fd, "file").expect("failed to unlink"); + let fd = wasip1::path_open(dir_fd, 0, "file", wasip1::OFLAGS_CREAT, 0, 0, 0).unwrap(); + wasip1::fd_close(fd).unwrap(); // Now, repeat the same process but for a directory - wasi::path_create_directory(dir_fd, "subdir").expect("failed to create dir"); - let subdir_fd = wasi::path_open(dir_fd, 0, "subdir", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + wasip1::path_create_directory(dir_fd, "subdir").expect("failed to create dir"); + let subdir_fd = wasip1::path_open(dir_fd, 0, "subdir", wasip1::OFLAGS_DIRECTORY, 0, 0, 0) .expect("failed to open dir"); assert!( - subdir_fd > libc::STDERR_FILENO as wasi::Fd, + subdir_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::path_remove_directory(dir_fd, "subdir").expect("failed to remove dir 2"); - wasi::path_create_directory(dir_fd, "subdir").expect("failed to create dir 2"); + wasip1::path_remove_directory(dir_fd, "subdir").expect("failed to remove dir 2"); + wasip1::path_create_directory(dir_fd, "subdir").expect("failed to create dir 2"); } } diff --git a/crates/test-programs/src/bin/preview1_dangling_symlink.rs b/crates/test-programs/src/bin/preview1_dangling_symlink.rs index f4c6d34f4d..665479cbb3 100644 --- a/crates/test-programs/src/bin/preview1_dangling_symlink.rs +++ b/crates/test-programs/src/bin/preview1_dangling_symlink.rs @@ -1,30 +1,30 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, config, open_scratch_directory}; -unsafe fn test_dangling_symlink(dir_fd: wasi::Fd) { +unsafe fn test_dangling_symlink(dir_fd: wasip1::Fd) { if config().support_dangling_filesystem() { // First create a dangling symlink. - wasi::path_symlink("target", dir_fd, "symlink").expect("creating a symlink"); + wasip1::path_symlink("target", dir_fd, "symlink").expect("creating a symlink"); // Try to open it as a directory with O_NOFOLLOW. assert_errno!( - wasi::path_open(dir_fd, 0, "symlink", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "symlink", wasip1::OFLAGS_DIRECTORY, 0, 0, 0) .expect_err("opening a dangling symlink as a directory"), - wasi::ERRNO_NOTDIR, - wasi::ERRNO_LOOP, - wasi::ERRNO_NOENT + wasip1::ERRNO_NOTDIR, + wasip1::ERRNO_LOOP, + wasip1::ERRNO_NOENT ); // Try to open it as a file with O_NOFOLLOW. assert_errno!( - wasi::path_open(dir_fd, 0, "symlink", 0, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "symlink", 0, 0, 0, 0) .expect_err("opening a dangling symlink as a file"), - wasi::ERRNO_LOOP, - wasi::ERRNO_NOENT + wasip1::ERRNO_LOOP, + wasip1::ERRNO_NOENT ); // Clean up. - wasi::path_unlink_file(dir_fd, "symlink").expect("failed to remove file"); + wasip1::path_unlink_file(dir_fd, "symlink").expect("failed to remove file"); } } diff --git a/crates/test-programs/src/bin/preview1_dir_fd_op_failures.rs b/crates/test-programs/src/bin/preview1_dir_fd_op_failures.rs index 0860fadb4d..3188271236 100644 --- a/crates/test-programs/src/bin/preview1_dir_fd_op_failures.rs +++ b/crates/test-programs/src/bin/preview1_dir_fd_op_failures.rs @@ -1,93 +1,93 @@ use std::{env, process}; use test_programs::preview1::open_scratch_directory; -unsafe fn test_fd_dir_ops(dir_fd: wasi::Fd) { - let stat = wasi::fd_filestat_get(dir_fd).expect("failed to fdstat"); - assert_eq!(stat.filetype, wasi::FILETYPE_DIRECTORY); +unsafe fn test_fd_dir_ops(dir_fd: wasip1::Fd) { + let stat = wasip1::fd_filestat_get(dir_fd).expect("failed to fdstat"); + assert_eq!(stat.filetype, wasip1::FILETYPE_DIRECTORY); let (pr_fd, pr_name_len) = (3..) - .map_while(|fd| wasi::fd_prestat_get(fd).ok().map(|stat| (fd, stat))) - .find_map(|(fd, wasi::Prestat { tag, u })| { - (tag == wasi::PREOPENTYPE_DIR.raw()).then_some((fd, u.dir.pr_name_len)) + .map_while(|fd| wasip1::fd_prestat_get(fd).ok().map(|stat| (fd, stat))) + .find_map(|(fd, wasip1::Prestat { tag, u })| { + (tag == wasip1::PREOPENTYPE_DIR.raw()).then_some((fd, u.dir.pr_name_len)) }) .expect("failed to find preopen directory"); let mut pr_name = vec![]; - let r = wasi::fd_prestat_dir_name(pr_fd, pr_name.as_mut_ptr(), 0); - assert_eq!(r, Err(wasi::ERRNO_NAMETOOLONG)); + let r = wasip1::fd_prestat_dir_name(pr_fd, pr_name.as_mut_ptr(), 0); + assert_eq!(r, Err(wasip1::ERRNO_NAMETOOLONG)); // Test that passing a larger than necessary buffer works correctly let mut pr_name = vec![0; pr_name_len + 1]; - let r = wasi::fd_prestat_dir_name(pr_fd, pr_name.as_mut_ptr(), pr_name_len + 1); + let r = wasip1::fd_prestat_dir_name(pr_fd, pr_name.as_mut_ptr(), pr_name_len + 1); assert_eq!(r, Ok(())); let mut read_buf = vec![0; 128].into_boxed_slice(); - let iovec = wasi::Iovec { + let iovec = wasip1::Iovec { buf: read_buf.as_mut_ptr(), buf_len: read_buf.len(), }; - let r = wasi::fd_read(dir_fd, &[iovec]); + let r = wasip1::fd_read(dir_fd, &[iovec]); // On posix, this fails with ERRNO_ISDIR: - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_read error"); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_read error"); - let r = wasi::fd_pread(dir_fd, &[iovec], 0); + let r = wasip1::fd_pread(dir_fd, &[iovec], 0); // On posix, this fails with ERRNO_ISDIR - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_pread error"); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_pread error"); let write_buf = vec![0; 128].into_boxed_slice(); - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: write_buf.as_ptr(), buf_len: write_buf.len(), }; - let r = wasi::fd_write(dir_fd, &[ciovec]); + let r = wasip1::fd_write(dir_fd, &[ciovec]); // Same behavior as specified by POSIX: - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_write error"); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_write error"); - let r = wasi::fd_pwrite(dir_fd, &[ciovec], 0); + let r = wasip1::fd_pwrite(dir_fd, &[ciovec], 0); // Same behavior as specified by POSIX: - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_pwrite error"); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_pwrite error"); // Divergence from posix: lseek(dirfd) will return 0 - let r = wasi::fd_seek(dir_fd, 0, wasi::WHENCE_CUR); - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_seek WHENCE_CUR error"); - let r = wasi::fd_seek(dir_fd, 0, wasi::WHENCE_SET); - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_seek WHENCE_SET error"); - let r = wasi::fd_seek(dir_fd, 0, wasi::WHENCE_END); - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_seek WHENCE_END error"); + let r = wasip1::fd_seek(dir_fd, 0, wasip1::WHENCE_CUR); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_seek WHENCE_CUR error"); + let r = wasip1::fd_seek(dir_fd, 0, wasip1::WHENCE_SET); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_seek WHENCE_SET error"); + let r = wasip1::fd_seek(dir_fd, 0, wasip1::WHENCE_END); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_seek WHENCE_END error"); // Tell isn't in posix, its basically lseek with WHENCE_CUR above - let r = wasi::fd_tell(dir_fd); - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_tell error"); + let r = wasip1::fd_tell(dir_fd); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_tell error"); // posix_fadvise(dirfd, 0, 0, POSIX_FADV_DONTNEED) will return 0 on linux. // not available on mac os. - let r = wasi::fd_advise(dir_fd, 0, 0, wasi::ADVICE_DONTNEED); - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_advise error"); + let r = wasip1::fd_advise(dir_fd, 0, 0, wasip1::ADVICE_DONTNEED); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_advise error"); // fallocate(dirfd, FALLOC_FL_ZERO_RANGE, 0, 1) will fail with errno EBADF on linux. // not available on mac os. - let r = wasi::fd_allocate(dir_fd, 0, 0); - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_allocate error"); + let r = wasip1::fd_allocate(dir_fd, 0, 0); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_allocate error"); // fdatasync(dirfd) will return 0 on linux. // not available on mac os. - let r = wasi::fd_datasync(dir_fd); - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_datasync error"); + let r = wasip1::fd_datasync(dir_fd); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_datasync error"); // fsync(dirfd) will return 0 on linux. // not available on mac os. - let r = wasi::fd_sync(dir_fd); - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_sync error"); + let r = wasip1::fd_sync(dir_fd); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_sync error"); // fcntl(dirfd, F_SETFL, O_NONBLOCK) will return 0 on linux. // not available on mac os. - let r = wasi::fd_fdstat_set_flags(dir_fd, wasi::FDFLAGS_NONBLOCK); - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_fdstat_set_flags error"); + let r = wasip1::fd_fdstat_set_flags(dir_fd, wasip1::FDFLAGS_NONBLOCK); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_fdstat_set_flags error"); // ftruncate(dirfd, 1) will fail with errno EINVAL on posix. // here, we fail with EBADF instead: - let r = wasi::fd_filestat_set_size(dir_fd, 0); - assert_eq!(r, Err(wasi::ERRNO_BADF), "fd_filestat_set_size error"); + let r = wasip1::fd_filestat_set_size(dir_fd, 0); + assert_eq!(r, Err(wasip1::ERRNO_BADF), "fd_filestat_set_size error"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_directory_seek.rs b/crates/test-programs/src/bin/preview1_directory_seek.rs index efd35870ab..81b046a695 100644 --- a/crates/test-programs/src/bin/preview1_directory_seek.rs +++ b/crates/test-programs/src/bin/preview1_directory_seek.rs @@ -1,27 +1,27 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, open_scratch_directory}; -unsafe fn test_directory_seek(dir_fd: wasi::Fd) { +unsafe fn test_directory_seek(dir_fd: wasip1::Fd) { // Create a directory in the scratch directory. - wasi::path_create_directory(dir_fd, "dir").expect("failed to make directory"); + wasip1::path_create_directory(dir_fd, "dir").expect("failed to make directory"); // Open the directory and attempt to request rights for seeking. - let fd = wasi::path_open(dir_fd, 0, "dir", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + let fd = wasip1::path_open(dir_fd, 0, "dir", wasip1::OFLAGS_DIRECTORY, 0, 0, 0) .expect("failed to open file"); assert!( - fd > libc::STDERR_FILENO as wasi::Fd, + fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); // Attempt to seek. assert_errno!( - wasi::fd_seek(fd, 0, wasi::WHENCE_CUR).expect_err("seek on a directory"), - wasi::ERRNO_BADF + wasip1::fd_seek(fd, 0, wasip1::WHENCE_CUR).expect_err("seek on a directory"), + wasip1::ERRNO_BADF ); // Clean up. - wasi::fd_close(fd).expect("failed to close fd"); - wasi::path_remove_directory(dir_fd, "dir").expect("failed to remove dir"); + wasip1::fd_close(fd).expect("failed to close fd"); + wasip1::path_remove_directory(dir_fd, "dir").expect("failed to remove dir"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_fd_advise.rs b/crates/test-programs/src/bin/preview1_fd_advise.rs index af0b2678b9..098c4a34c8 100644 --- a/crates/test-programs/src/bin/preview1_fd_advise.rs +++ b/crates/test-programs/src/bin/preview1_fd_advise.rs @@ -1,42 +1,42 @@ use std::{env, process}; use test_programs::preview1::open_scratch_directory; -unsafe fn test_fd_advise(dir_fd: wasi::Fd) { +unsafe fn test_fd_advise(dir_fd: wasip1::Fd) { // Create a file in the scratch directory. - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, "file", - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("failed to open file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); // Check file size - let stat = wasi::fd_filestat_get(file_fd).expect("failed to fdstat"); + let stat = wasip1::fd_filestat_get(file_fd).expect("failed to fdstat"); assert_eq!(stat.size, 0, "file size should be 0"); // set_size it bigger - wasi::fd_filestat_set_size(file_fd, 100).expect("setting size"); + wasip1::fd_filestat_set_size(file_fd, 100).expect("setting size"); - let stat = wasi::fd_filestat_get(file_fd).expect("failed to fdstat 2"); + let stat = wasip1::fd_filestat_get(file_fd).expect("failed to fdstat 2"); assert_eq!(stat.size, 100, "file size should be 100"); // Advise the kernel - wasi::fd_advise(file_fd, 10, 50, wasi::ADVICE_NORMAL).expect("failed advise"); + wasip1::fd_advise(file_fd, 10, 50, wasip1::ADVICE_NORMAL).expect("failed advise"); // Advise shouldn't change size - let stat = wasi::fd_filestat_get(file_fd).expect("failed to fdstat 3"); + let stat = wasip1::fd_filestat_get(file_fd).expect("failed to fdstat 3"); assert_eq!(stat.size, 100, "file size should be 100"); - wasi::fd_close(file_fd).expect("failed to close"); - wasi::path_unlink_file(dir_fd, "file").expect("failed to unlink"); + wasip1::fd_close(file_fd).expect("failed to close"); + wasip1::path_unlink_file(dir_fd, "file").expect("failed to unlink"); } fn main() { let mut args = env::args(); diff --git a/crates/test-programs/src/bin/preview1_fd_filestat_get.rs b/crates/test-programs/src/bin/preview1_fd_filestat_get.rs index 3cff4e7221..31ecf093c3 100644 --- a/crates/test-programs/src/bin/preview1_fd_filestat_get.rs +++ b/crates/test-programs/src/bin/preview1_fd_filestat_get.rs @@ -1,17 +1,17 @@ unsafe fn test_fd_filestat_get() { - let stat = wasi::fd_filestat_get(libc::STDIN_FILENO as u32).expect("failed filestat 0"); + let stat = wasip1::fd_filestat_get(libc::STDIN_FILENO as u32).expect("failed filestat 0"); assert_eq!(stat.size, 0, "stdio size should be 0"); assert_eq!(stat.atim, 0, "stdio atim should be 0"); assert_eq!(stat.mtim, 0, "stdio mtim should be 0"); assert_eq!(stat.ctim, 0, "stdio ctim should be 0"); - let stat = wasi::fd_filestat_get(libc::STDOUT_FILENO as u32).expect("failed filestat 1"); + let stat = wasip1::fd_filestat_get(libc::STDOUT_FILENO as u32).expect("failed filestat 1"); assert_eq!(stat.size, 0, "stdio size should be 0"); assert_eq!(stat.atim, 0, "stdio atim should be 0"); assert_eq!(stat.mtim, 0, "stdio mtim should be 0"); assert_eq!(stat.ctim, 0, "stdio ctim should be 0"); - let stat = wasi::fd_filestat_get(libc::STDERR_FILENO as u32).expect("failed filestat 2"); + let stat = wasip1::fd_filestat_get(libc::STDERR_FILENO as u32).expect("failed filestat 2"); assert_eq!(stat.size, 0, "stdio size should be 0"); assert_eq!(stat.atim, 0, "stdio atim should be 0"); assert_eq!(stat.mtim, 0, "stdio mtim should be 0"); diff --git a/crates/test-programs/src/bin/preview1_fd_filestat_set.rs b/crates/test-programs/src/bin/preview1_fd_filestat_set.rs index a4fe2e2a30..269b652e3d 100644 --- a/crates/test-programs/src/bin/preview1_fd_filestat_set.rs +++ b/crates/test-programs/src/bin/preview1_fd_filestat_set.rs @@ -3,95 +3,95 @@ use test_programs::preview1::{ assert_errno, assert_fs_time_eq, open_scratch_directory, TestConfig, }; -unsafe fn test_fd_filestat_set_size_rw(dir_fd: wasi::Fd) { +unsafe fn test_fd_filestat_set_size_rw(dir_fd: wasip1::Fd) { // Create a file in the scratch directory, opened read/write - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, "file", - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("failed to create file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); // Check file size - let stat = wasi::fd_filestat_get(file_fd).expect("failed filestat"); + let stat = wasip1::fd_filestat_get(file_fd).expect("failed filestat"); assert_eq!(stat.size, 0, "file size should be 0"); // Check fd_filestat_set_size - wasi::fd_filestat_set_size(file_fd, 100).expect("fd_filestat_set_size"); + wasip1::fd_filestat_set_size(file_fd, 100).expect("fd_filestat_set_size"); - let stat = wasi::fd_filestat_get(file_fd).expect("failed filestat 2"); + let stat = wasip1::fd_filestat_get(file_fd).expect("failed filestat 2"); assert_eq!(stat.size, 100, "file size should be 100"); - wasi::fd_close(file_fd).expect("failed to close fd"); - wasi::path_unlink_file(dir_fd, "file").expect("failed to remove file"); + wasip1::fd_close(file_fd).expect("failed to close fd"); + wasip1::path_unlink_file(dir_fd, "file").expect("failed to remove file"); } -unsafe fn test_fd_filestat_set_size_ro(dir_fd: wasi::Fd) { +unsafe fn test_fd_filestat_set_size_ro(dir_fd: wasip1::Fd) { // Create a file in the scratch directory. Creating a file implies opening it for writing, so // we have to close and re-open read-only to observe read-only behavior. - let file_fd = wasi::path_open(dir_fd, 0, "file", wasi::OFLAGS_CREAT, 0, 0, 0) + let file_fd = wasip1::path_open(dir_fd, 0, "file", wasip1::OFLAGS_CREAT, 0, 0, 0) .expect("failed to create file"); - wasi::fd_close(file_fd).expect("failed to close fd"); + wasip1::fd_close(file_fd).expect("failed to close fd"); // Open the created file read-only - let file_fd = wasi::path_open(dir_fd, 0, "file", 0, wasi::RIGHTS_FD_READ, 0, 0) + let file_fd = wasip1::path_open(dir_fd, 0, "file", 0, wasip1::RIGHTS_FD_READ, 0, 0) .expect("failed to create file"); // Check file size - let stat = wasi::fd_filestat_get(file_fd).expect("failed filestat"); + let stat = wasip1::fd_filestat_get(file_fd).expect("failed filestat"); assert_eq!(stat.size, 0, "file size should be 0"); // Check fd_filestat_set_size on a file opened read-only fails with EINVAL, like ftruncate is defined to do on posix assert_errno!( - wasi::fd_filestat_set_size(file_fd, 100) + wasip1::fd_filestat_set_size(file_fd, 100) .expect_err("fd_filestat_set_size should error when file is opened read-only"), - windows => wasi::ERRNO_ACCES, - wasi::ERRNO_INVAL + windows => wasip1::ERRNO_ACCES, + wasip1::ERRNO_INVAL ); - let stat = wasi::fd_filestat_get(file_fd).expect("failed filestat 2"); + let stat = wasip1::fd_filestat_get(file_fd).expect("failed filestat 2"); assert_eq!(stat.size, 0, "file size should remain 0"); - wasi::fd_close(file_fd).expect("failed to close fd"); - wasi::path_unlink_file(dir_fd, "file").expect("failed to remove file"); + wasip1::fd_close(file_fd).expect("failed to close fd"); + wasip1::path_unlink_file(dir_fd, "file").expect("failed to remove file"); } -unsafe fn test_fd_filestat_set_times(dir_fd: wasi::Fd, rights: wasi::Rights) { +unsafe fn test_fd_filestat_set_times(dir_fd: wasip1::Fd, rights: wasip1::Rights) { let cfg = TestConfig::from_env(); // Create a file in the scratch directory. OFLAGS_CREAT implies opening for writing, so we will // close it and re-open with the desired rights (FD_READ for read only, FD_READ | FD_WRITE for // readwrite) - let file_fd = wasi::path_open(dir_fd, 0, "file", wasi::OFLAGS_CREAT, 0, 0, 0) + let file_fd = wasip1::path_open(dir_fd, 0, "file", wasip1::OFLAGS_CREAT, 0, 0, 0) .expect("failed to create file"); - wasi::fd_close(file_fd).expect("failed to close fd"); + wasip1::fd_close(file_fd).expect("failed to close fd"); // Open the file with the rights given. let file_fd = - wasi::path_open(dir_fd, 0, "file", 0, rights, 0, 0).expect("failed to create file"); + wasip1::path_open(dir_fd, 0, "file", 0, rights, 0, 0).expect("failed to create file"); - let stat = wasi::fd_filestat_get(file_fd).expect("failed filestat 2"); + let stat = wasip1::fd_filestat_get(file_fd).expect("failed filestat 2"); // Check fd_filestat_set_times let old_atim = Duration::from_nanos(stat.atim); let new_mtim = Duration::from_nanos(stat.mtim) - cfg.fs_time_precision() * 2; - wasi::fd_filestat_set_times( + wasip1::fd_filestat_set_times( file_fd, new_mtim.as_nanos() as u64, new_mtim.as_nanos() as u64, - wasi::FSTFLAGS_MTIM, + wasip1::FSTFLAGS_MTIM, ) .expect("fd_filestat_set_times"); - let stat = wasi::fd_filestat_get(file_fd).expect("failed filestat 3"); + let stat = wasip1::fd_filestat_get(file_fd).expect("failed filestat 3"); assert_eq!(stat.size, 0, "file size should remain unchanged at 0"); // Support accuracy up to at least 1ms @@ -106,11 +106,11 @@ unsafe fn test_fd_filestat_set_times(dir_fd: wasi::Fd, rights: wasi::Rights) { "atim should not change" ); - // let status = wasi_fd_filestat_set_times(file_fd, new_mtim, new_mtim, wasi::FILESTAT_SET_MTIM | wasi::FILESTAT_SET_MTIM_NOW); - // assert_eq!(status, wasi::EINVAL, "ATIM & ATIM_NOW can't both be set"); + // let status = wasi_fd_filestat_set_times(file_fd, new_mtim, new_mtim, wasip1::FILESTAT_SET_MTIM | wasip1::FILESTAT_SET_MTIM_NOW); + // assert_eq!(status, wasip1::EINVAL, "ATIM & ATIM_NOW can't both be set"); - wasi::fd_close(file_fd).expect("failed to close fd"); - wasi::path_unlink_file(dir_fd, "file").expect("failed to remove file"); + wasip1::fd_close(file_fd).expect("failed to close fd"); + wasip1::path_unlink_file(dir_fd, "file").expect("failed to remove file"); } fn main() { let mut args = env::args(); @@ -143,7 +143,7 @@ fn main() { if test_programs::preview1::config().support_dangling_filesystem() { // Guarding to run on non-windows filesystems. Windows rejects set-times on read-only // files. - unsafe { test_fd_filestat_set_times(dir_fd, wasi::RIGHTS_FD_READ) } + unsafe { test_fd_filestat_set_times(dir_fd, wasip1::RIGHTS_FD_READ) } } - unsafe { test_fd_filestat_set_times(dir_fd, wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE) } + unsafe { test_fd_filestat_set_times(dir_fd, wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE) } } diff --git a/crates/test-programs/src/bin/preview1_fd_flags_set.rs b/crates/test-programs/src/bin/preview1_fd_flags_set.rs index 5c0be39b31..de91e20f17 100644 --- a/crates/test-programs/src/bin/preview1_fd_flags_set.rs +++ b/crates/test-programs/src/bin/preview1_fd_flags_set.rs @@ -1,26 +1,26 @@ use std::{env, process}; use test_programs::preview1::open_scratch_directory; -unsafe fn test_fd_fdstat_set_flags(dir_fd: wasi::Fd) { +unsafe fn test_fd_fdstat_set_flags(dir_fd: wasip1::Fd) { const FILE_NAME: &str = "file"; let data = &[0u8; 100]; - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, FILE_NAME, - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, - wasi::FDFLAGS_APPEND, + wasip1::FDFLAGS_APPEND, ) .expect("opening a file"); // Write some data and then verify the written data assert_eq!( - wasi::fd_write( + wasip1::fd_write( file_fd, - &[wasi::Ciovec { + &[wasip1::Ciovec { buf: data.as_ptr(), buf_len: data.len(), }], @@ -31,14 +31,14 @@ unsafe fn test_fd_fdstat_set_flags(dir_fd: wasi::Fd) { data.len(), ); - wasi::fd_seek(file_fd, 0, wasi::WHENCE_SET).expect("seeking file"); + wasip1::fd_seek(file_fd, 0, wasip1::WHENCE_SET).expect("seeking file"); let buffer = &mut [0u8; 100]; assert_eq!( - wasi::fd_read( + wasip1::fd_read( file_fd, - &[wasi::Iovec { + &[wasip1::Iovec { buf: buffer.as_mut_ptr(), buf_len: buffer.len(), }] @@ -54,12 +54,12 @@ unsafe fn test_fd_fdstat_set_flags(dir_fd: wasi::Fd) { let data = &[1u8; 100]; // Seek back to the start to ensure we're in append-only mode - wasi::fd_seek(file_fd, 0, wasi::WHENCE_SET).expect("seeking file"); + wasip1::fd_seek(file_fd, 0, wasip1::WHENCE_SET).expect("seeking file"); assert_eq!( - wasi::fd_write( + wasip1::fd_write( file_fd, - &[wasi::Ciovec { + &[wasip1::Ciovec { buf: data.as_ptr(), buf_len: data.len(), }], @@ -70,12 +70,12 @@ unsafe fn test_fd_fdstat_set_flags(dir_fd: wasi::Fd) { data.len(), ); - wasi::fd_seek(file_fd, 100, wasi::WHENCE_SET).expect("seeking file"); + wasip1::fd_seek(file_fd, 100, wasip1::WHENCE_SET).expect("seeking file"); assert_eq!( - wasi::fd_read( + wasip1::fd_read( file_fd, - &[wasi::Iovec { + &[wasip1::Iovec { buf: buffer.as_mut_ptr(), buf_len: buffer.len(), }] @@ -88,17 +88,17 @@ unsafe fn test_fd_fdstat_set_flags(dir_fd: wasi::Fd) { assert_eq!(&data[..], &buffer[..]); - wasi::fd_fdstat_set_flags(file_fd, 0).expect("disabling flags"); + wasip1::fd_fdstat_set_flags(file_fd, 0).expect("disabling flags"); // Overwrite some existing data to ensure the append mode is now off - wasi::fd_seek(file_fd, 0, wasi::WHENCE_SET).expect("seeking file"); + wasip1::fd_seek(file_fd, 0, wasip1::WHENCE_SET).expect("seeking file"); let data = &[2u8; 100]; assert_eq!( - wasi::fd_write( + wasip1::fd_write( file_fd, - &[wasi::Ciovec { + &[wasip1::Ciovec { buf: data.as_ptr(), buf_len: data.len(), }], @@ -109,12 +109,12 @@ unsafe fn test_fd_fdstat_set_flags(dir_fd: wasi::Fd) { data.len(), ); - wasi::fd_seek(file_fd, 0, wasi::WHENCE_SET).expect("seeking file"); + wasip1::fd_seek(file_fd, 0, wasip1::WHENCE_SET).expect("seeking file"); assert_eq!( - wasi::fd_read( + wasip1::fd_read( file_fd, - &[wasi::Iovec { + &[wasip1::Iovec { buf: buffer.as_mut_ptr(), buf_len: buffer.len(), }] @@ -127,13 +127,13 @@ unsafe fn test_fd_fdstat_set_flags(dir_fd: wasi::Fd) { assert_eq!(&data[..], &buffer[..]); - wasi::fd_close(file_fd).expect("close file"); + wasip1::fd_close(file_fd).expect("close file"); - let stat = wasi::path_filestat_get(dir_fd, 0, FILE_NAME).expect("stat path"); + let stat = wasip1::path_filestat_get(dir_fd, 0, FILE_NAME).expect("stat path"); assert_eq!(stat.size, 200, "expected a file size of 200"); - wasi::path_unlink_file(dir_fd, FILE_NAME).expect("unlinking file"); + wasip1::path_unlink_file(dir_fd, FILE_NAME).expect("unlinking file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_fd_readdir.rs b/crates/test-programs/src/bin/preview1_fd_readdir.rs index 021a593eed..5b4fad774b 100644 --- a/crates/test-programs/src/bin/preview1_fd_readdir.rs +++ b/crates/test-programs/src/bin/preview1_fd_readdir.rs @@ -4,7 +4,7 @@ use test_programs::preview1::open_scratch_directory; const BUF_LEN: usize = 256; struct DirEntry { - dirent: wasi::Dirent, + dirent: wasip1::Dirent, name: String, } @@ -25,15 +25,15 @@ impl<'a> Iterator for ReadDir<'a> { fn next(&mut self) -> Option { unsafe { - if self.buf.len() < mem::size_of::() { + if self.buf.len() < mem::size_of::() { return None; } // Read the data - let dirent_ptr = self.buf.as_ptr() as *const wasi::Dirent; + let dirent_ptr = self.buf.as_ptr() as *const wasip1::Dirent; let dirent = dirent_ptr.read_unaligned(); - if self.buf.len() < mem::size_of::() + dirent.d_namlen as usize { + if self.buf.len() < mem::size_of::() + dirent.d_namlen as usize { return None; } @@ -53,10 +53,10 @@ impl<'a> Iterator for ReadDir<'a> { } /// Return the entries plus a bool indicating EOF. -unsafe fn exec_fd_readdir(fd: wasi::Fd, cookie: wasi::Dircookie) -> (Vec, bool) { +unsafe fn exec_fd_readdir(fd: wasip1::Fd, cookie: wasip1::Dircookie) -> (Vec, bool) { let mut buf: [u8; BUF_LEN] = [0; BUF_LEN]; let bufused = - wasi::fd_readdir(fd, buf.as_mut_ptr(), BUF_LEN, cookie).expect("failed fd_readdir"); + wasip1::fd_readdir(fd, buf.as_mut_ptr(), BUF_LEN, cookie).expect("failed fd_readdir"); assert!(bufused <= BUF_LEN); let sl = slice::from_raw_parts(buf.as_ptr(), bufused); @@ -65,8 +65,8 @@ unsafe fn exec_fd_readdir(fd: wasi::Fd, cookie: wasi::Dircookie) -> (Vec libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - let file_stat = wasi::fd_filestat_get(file_fd).expect("failed filestat"); - wasi::fd_close(file_fd).expect("closing a file"); + let file_stat = wasip1::fd_filestat_get(file_fd).expect("failed filestat"); + wasip1::fd_close(file_fd).expect("closing a file"); - wasi::path_create_directory(dir_fd, "nested").expect("create a directory"); - let nested_fd = - wasi::path_open(dir_fd, 0, "nested", 0, 0, 0, 0).expect("failed to open nested directory"); - let nested_stat = wasi::fd_filestat_get(nested_fd).expect("failed filestat"); + wasip1::path_create_directory(dir_fd, "nested").expect("create a directory"); + let nested_fd = wasip1::path_open(dir_fd, 0, "nested", 0, 0, 0, 0) + .expect("failed to open nested directory"); + let nested_stat = wasip1::fd_filestat_get(nested_fd).expect("failed filestat"); // Execute another readdir let (mut dirs, eof) = exec_fd_readdir(dir_fd, 0); @@ -139,7 +139,7 @@ unsafe fn test_fd_readdir(dir_fd: wasi::Fd) { assert_eq!(dir.name, "file", "file name doesn't match"); assert_eq!( dir.dirent.d_type, - wasi::FILETYPE_REGULAR_FILE, + wasip1::FILETYPE_REGULAR_FILE, "type for the real file" ); assert_eq!(dir.dirent.d_ino, file_stat.ino); @@ -148,7 +148,7 @@ unsafe fn test_fd_readdir(dir_fd: wasi::Fd) { assert_eq!(dir.name, "nested", "nested directory name doesn't match"); assert_eq!( dir.dirent.d_type, - wasi::FILETYPE_DIRECTORY, + wasip1::FILETYPE_DIRECTORY, "type for the nested directory" ); assert_eq!(dir.dirent.d_ino, nested_stat.ino); @@ -161,30 +161,30 @@ unsafe fn test_fd_readdir(dir_fd: wasi::Fd) { // check if nested directory shows up as empty assert_empty_dir(nested_fd); - wasi::fd_close(nested_fd).expect("closing a nested directory"); + wasip1::fd_close(nested_fd).expect("closing a nested directory"); - wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); - wasi::path_remove_directory(dir_fd, "nested").expect("removing a nested directory"); + wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); + wasip1::path_remove_directory(dir_fd, "nested").expect("removing a nested directory"); } -unsafe fn test_fd_readdir_lots(dir_fd: wasi::Fd) { +unsafe fn test_fd_readdir_lots(dir_fd: wasip1::Fd) { // Add a file and check the behavior for count in 0..1000 { - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, &format!("file.{count}"), - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("failed to create file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::fd_close(file_fd).expect("closing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); } // Count the entries to ensure that we see the correct number. @@ -201,31 +201,31 @@ unsafe fn test_fd_readdir_lots(dir_fd: wasi::Fd) { assert_eq!(total, 1002, "expected 1000 entries plus . and .."); for count in 0..1000 { - wasi::path_unlink_file(dir_fd, &format!("file.{count}")).expect("removing a file"); + wasip1::path_unlink_file(dir_fd, &format!("file.{count}")).expect("removing a file"); } } -unsafe fn test_fd_readdir_unicode_boundary(dir_fd: wasi::Fd) { +unsafe fn test_fd_readdir_unicode_boundary(dir_fd: wasip1::Fd) { let filename = "Действие"; - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, filename, - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("failed to create file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::fd_close(file_fd).expect("closing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); let mut buf = Vec::new(); 'outer: loop { - let len = wasi::fd_readdir(dir_fd, buf.as_mut_ptr(), buf.capacity(), 0).unwrap(); + let len = wasip1::fd_readdir(dir_fd, buf.as_mut_ptr(), buf.capacity(), 0).unwrap(); buf.set_len(len); for entry in ReadDir::from_slice(&buf) { @@ -236,7 +236,7 @@ unsafe fn test_fd_readdir_unicode_boundary(dir_fd: wasi::Fd) { buf = Vec::with_capacity(buf.capacity() + 1); } - wasi::path_unlink_file(dir_fd, filename).expect("removing a file"); + wasip1::path_unlink_file(dir_fd, filename).expect("removing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_file_allocate.rs b/crates/test-programs/src/bin/preview1_file_allocate.rs index 987e44a93a..2a0141b9f8 100644 --- a/crates/test-programs/src/bin/preview1_file_allocate.rs +++ b/crates/test-programs/src/bin/preview1_file_allocate.rs @@ -1,41 +1,41 @@ use std::{env, process}; use test_programs::preview1::open_scratch_directory; -unsafe fn test_file_allocate(dir_fd: wasi::Fd) { +unsafe fn test_file_allocate(dir_fd: wasip1::Fd) { // Create a file in the scratch directory. - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, "file", - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("opening a file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); // Check file size - let mut stat = wasi::fd_filestat_get(file_fd).expect("reading file stats"); + let mut stat = wasip1::fd_filestat_get(file_fd).expect("reading file stats"); assert_eq!(stat.size, 0, "file size should be 0"); - let err = wasi::fd_allocate(file_fd, 0, 100) + let err = wasip1::fd_allocate(file_fd, 0, 100) .err() .expect("fd_allocate must fail"); assert_eq!( err, - wasi::ERRNO_NOTSUP, + wasip1::ERRNO_NOTSUP, "fd_allocate should fail with NOTSUP" ); - stat = wasi::fd_filestat_get(file_fd).expect("reading file stats"); + stat = wasip1::fd_filestat_get(file_fd).expect("reading file stats"); assert_eq!(stat.size, 0, "file size should still be 0"); - wasi::fd_close(file_fd).expect("closing a file"); - wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); + wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_file_pread_pwrite.rs b/crates/test-programs/src/bin/preview1_file_pread_pwrite.rs index 46928cfbda..97868f4669 100644 --- a/crates/test-programs/src/bin/preview1_file_pread_pwrite.rs +++ b/crates/test-programs/src/bin/preview1_file_pread_pwrite.rs @@ -1,37 +1,37 @@ use std::{env, process}; use test_programs::preview1::open_scratch_directory; -unsafe fn test_file_pread_pwrite(dir_fd: wasi::Fd) { +unsafe fn test_file_pread_pwrite(dir_fd: wasip1::Fd) { // Create a file in the scratch directory. - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, "file", - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("opening a file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); let contents = &[0u8, 1, 2, 3]; - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: contents.as_ptr() as *const _, buf_len: contents.len(), }; - let mut nwritten = wasi::fd_pwrite(file_fd, &[ciovec], 0).expect("writing bytes at offset 0"); + let mut nwritten = wasip1::fd_pwrite(file_fd, &[ciovec], 0).expect("writing bytes at offset 0"); assert_eq!(nwritten, 4, "nwritten bytes check"); let contents = &mut [0u8; 4]; - let iovec = wasi::Iovec { + let iovec = wasip1::Iovec { buf: contents.as_mut_ptr() as *mut _, buf_len: contents.len(), }; - let mut nread = wasi::fd_pread(file_fd, &[iovec], 0).expect("reading bytes at offset 0"); + let mut nread = wasip1::fd_pread(file_fd, &[iovec], 0).expect("reading bytes at offset 0"); assert_eq!(nread, 4, "nread bytes check"); assert_eq!(contents, &[0u8, 1, 2, 3], "written bytes equal read bytes"); @@ -43,21 +43,21 @@ unsafe fn test_file_pread_pwrite(dir_fd: wasi::Fd) { let contents = &[0u8, 1, 2, 3]; let mut offset = 0usize; loop { - let mut ciovecs: Vec = Vec::new(); + let mut ciovecs: Vec = Vec::new(); let mut remaining = contents.len() - offset; if remaining > 2 { - ciovecs.push(wasi::Ciovec { + ciovecs.push(wasip1::Ciovec { buf: contents[offset..].as_ptr() as *const _, buf_len: 2, }); remaining -= 2; } - ciovecs.push(wasi::Ciovec { + ciovecs.push(wasip1::Ciovec { buf: contents[contents.len() - remaining..].as_ptr() as *const _, buf_len: remaining, }); - nwritten = wasi::fd_pwrite(file_fd, ciovecs.as_slice(), offset.try_into().unwrap()) + nwritten = wasip1::fd_pwrite(file_fd, ciovecs.as_slice(), offset.try_into().unwrap()) .expect("writing bytes at offset 0"); offset += nwritten; @@ -77,16 +77,16 @@ unsafe fn test_file_pread_pwrite(dir_fd: wasi::Fd) { loop { let buffer = &mut [0u8; 4]; let iovecs = &[ - wasi::Iovec { + wasip1::Iovec { buf: buffer.as_mut_ptr() as *mut _, buf_len: 2, }, - wasi::Iovec { + wasip1::Iovec { buf: buffer[2..].as_mut_ptr() as *mut _, buf_len: 2, }, ]; - nread = wasi::fd_pread(file_fd, iovecs, offset as _).expect("reading bytes at offset 0"); + nread = wasip1::fd_pread(file_fd, iovecs, offset as _).expect("reading bytes at offset 0"); if nread == 0 { break; } @@ -97,118 +97,118 @@ unsafe fn test_file_pread_pwrite(dir_fd: wasi::Fd) { assert_eq!(contents, &[0u8, 1, 2, 3], "file cursor was overwritten"); let contents = &mut [0u8; 4]; - let iovec = wasi::Iovec { + let iovec = wasip1::Iovec { buf: contents.as_mut_ptr() as *mut _, buf_len: contents.len(), }; - nread = wasi::fd_pread(file_fd, &[iovec], 2).expect("reading bytes at offset 2"); + nread = wasip1::fd_pread(file_fd, &[iovec], 2).expect("reading bytes at offset 2"); assert_eq!(nread, 2, "nread bytes check"); assert_eq!(contents, &[2u8, 3, 0, 0], "file cursor was overwritten"); let contents = &[1u8, 0]; - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: contents.as_ptr() as *const _, buf_len: contents.len(), }; - nwritten = wasi::fd_pwrite(file_fd, &[ciovec], 2).expect("writing bytes at offset 2"); + nwritten = wasip1::fd_pwrite(file_fd, &[ciovec], 2).expect("writing bytes at offset 2"); assert_eq!(nwritten, 2, "nwritten bytes check"); let contents = &mut [0u8; 4]; - let iovec = wasi::Iovec { + let iovec = wasip1::Iovec { buf: contents.as_mut_ptr() as *mut _, buf_len: contents.len(), }; - nread = wasi::fd_pread(file_fd, &[iovec], 0).expect("reading bytes at offset 0"); + nread = wasip1::fd_pread(file_fd, &[iovec], 0).expect("reading bytes at offset 0"); assert_eq!(nread, 4, "nread bytes check"); assert_eq!(contents, &[0u8, 1, 1, 0], "file cursor was overwritten"); - wasi::fd_close(file_fd).expect("closing a file"); - wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); + wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); } -unsafe fn test_file_pwrite_and_file_pos(dir_fd: wasi::Fd) { +unsafe fn test_file_pwrite_and_file_pos(dir_fd: wasip1::Fd) { let path = "file2"; - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, path, - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("opening a file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); // Perform a 0-sized pwrite at an offset beyond the end of the file. Unix // semantics should pop out where nothing is actually written and the size // of the file isn't modified. - assert_eq!(wasi::fd_tell(file_fd).unwrap(), 0); - let ciovec = wasi::Ciovec { + assert_eq!(wasip1::fd_tell(file_fd).unwrap(), 0); + let ciovec = wasip1::Ciovec { buf: [].as_ptr(), buf_len: 0, }; - let n = wasi::fd_pwrite(file_fd, &[ciovec], 50).expect("writing bytes at offset 2"); + let n = wasip1::fd_pwrite(file_fd, &[ciovec], 50).expect("writing bytes at offset 2"); assert_eq!(n, 0); - assert_eq!(wasi::fd_tell(file_fd).unwrap(), 0); - let stat = wasi::fd_filestat_get(file_fd).unwrap(); + assert_eq!(wasip1::fd_tell(file_fd).unwrap(), 0); + let stat = wasip1::fd_filestat_get(file_fd).unwrap(); assert_eq!(stat.size, 0); // Now write a single byte and make sure it actually works let buf = [0]; - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: buf.as_ptr(), buf_len: buf.len(), }; - let n = wasi::fd_pwrite(file_fd, &[ciovec], 50).expect("writing bytes at offset 50"); + let n = wasip1::fd_pwrite(file_fd, &[ciovec], 50).expect("writing bytes at offset 50"); assert_eq!(n, 1); - assert_eq!(wasi::fd_tell(file_fd).unwrap(), 0); - let stat = wasi::fd_filestat_get(file_fd).unwrap(); + assert_eq!(wasip1::fd_tell(file_fd).unwrap(), 0); + let stat = wasip1::fd_filestat_get(file_fd).unwrap(); assert_eq!(stat.size, 51); - wasi::fd_close(file_fd).expect("closing a file"); - wasi::path_unlink_file(dir_fd, path).expect("removing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); + wasip1::path_unlink_file(dir_fd, path).expect("removing a file"); } -unsafe fn test_file_pwrite_and_append(dir_fd: wasi::Fd) { +unsafe fn test_file_pwrite_and_append(dir_fd: wasip1::Fd) { let path = "file3"; - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, path, - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, - wasi::FDFLAGS_APPEND, + wasip1::FDFLAGS_APPEND, ) .expect("opening a file"); // Inherit linux semantics for `pwrite` where if the file is opened in // append mode then the offset to `pwrite` is ignored. let buf = [0]; - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: buf.as_ptr(), buf_len: buf.len(), }; - let n = wasi::fd_pwrite(file_fd, &[ciovec], 50).expect("writing bytes at offset 50"); + let n = wasip1::fd_pwrite(file_fd, &[ciovec], 50).expect("writing bytes at offset 50"); assert_eq!(n, 1); - let stat = wasi::fd_filestat_get(file_fd).unwrap(); + let stat = wasip1::fd_filestat_get(file_fd).unwrap(); assert_eq!(stat.size, 1); - let n = wasi::fd_pwrite(file_fd, &[ciovec], 0).expect("writing bytes at offset 50"); + let n = wasip1::fd_pwrite(file_fd, &[ciovec], 0).expect("writing bytes at offset 50"); assert_eq!(n, 1); - let stat = wasi::fd_filestat_get(file_fd).unwrap(); + let stat = wasip1::fd_filestat_get(file_fd).unwrap(); assert_eq!(stat.size, 2); - wasi::fd_close(file_fd).expect("closing a file"); - wasi::path_unlink_file(dir_fd, path).expect("removing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); + wasip1::path_unlink_file(dir_fd, path).expect("removing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_file_read_write.rs b/crates/test-programs/src/bin/preview1_file_read_write.rs index 3c9cab2829..c2c45d58bd 100644 --- a/crates/test-programs/src/bin/preview1_file_read_write.rs +++ b/crates/test-programs/src/bin/preview1_file_read_write.rs @@ -1,38 +1,38 @@ use std::{env, process}; use test_programs::preview1::open_scratch_directory; -unsafe fn test_file_read_write(dir_fd: wasi::Fd) { +unsafe fn test_file_read_write(dir_fd: wasip1::Fd) { // Create a file in the scratch directory. - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, "file", - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("opening a file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); let contents = &[0u8, 1, 2, 3]; - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: contents.as_ptr() as *const _, buf_len: contents.len(), }; - let mut nwritten = wasi::fd_write(file_fd, &[ciovec]).expect("writing bytes at offset 0"); + let mut nwritten = wasip1::fd_write(file_fd, &[ciovec]).expect("writing bytes at offset 0"); assert_eq!(nwritten, 4, "nwritten bytes check"); let contents = &mut [0u8; 4]; - let iovec = wasi::Iovec { + let iovec = wasip1::Iovec { buf: contents.as_mut_ptr() as *mut _, buf_len: contents.len(), }; - wasi::fd_seek(file_fd, 0, wasi::WHENCE_SET).expect("seeking to offset 0"); - let mut nread = wasi::fd_read(file_fd, &[iovec]).expect("reading bytes at offset 0"); + wasip1::fd_seek(file_fd, 0, wasip1::WHENCE_SET).expect("seeking to offset 0"); + let mut nread = wasip1::fd_read(file_fd, &[iovec]).expect("reading bytes at offset 0"); assert_eq!(nread, 4, "nread bytes check"); assert_eq!(contents, &[0u8, 1, 2, 3], "written bytes equal read bytes"); @@ -43,23 +43,24 @@ unsafe fn test_file_read_write(dir_fd: wasi::Fd) { // See https://github.com/rust-lang/rust/issues/74825. let contents = &[0u8, 1, 2, 3]; let mut offset = 0usize; - wasi::fd_seek(file_fd, 0, wasi::WHENCE_SET).expect("seeking to offset 0"); + wasip1::fd_seek(file_fd, 0, wasip1::WHENCE_SET).expect("seeking to offset 0"); loop { - let mut ciovecs: Vec = Vec::new(); + let mut ciovecs: Vec = Vec::new(); let mut remaining = contents.len() - offset; if remaining > 2 { - ciovecs.push(wasi::Ciovec { + ciovecs.push(wasip1::Ciovec { buf: contents[offset..].as_ptr() as *const _, buf_len: 2, }); remaining -= 2; } - ciovecs.push(wasi::Ciovec { + ciovecs.push(wasip1::Ciovec { buf: contents[contents.len() - remaining..].as_ptr() as *const _, buf_len: remaining, }); - nwritten = wasi::fd_write(file_fd, ciovecs.as_slice()).expect("writing bytes at offset 0"); + nwritten = + wasip1::fd_write(file_fd, ciovecs.as_slice()).expect("writing bytes at offset 0"); offset += nwritten; if offset == contents.len() { @@ -75,20 +76,20 @@ unsafe fn test_file_read_write(dir_fd: wasi::Fd) { // See https://github.com/rust-lang/rust/issues/74825. let contents = &mut [0u8; 4]; let mut offset = 0usize; - wasi::fd_seek(file_fd, 0, wasi::WHENCE_SET).expect("seeking to offset 0"); + wasip1::fd_seek(file_fd, 0, wasip1::WHENCE_SET).expect("seeking to offset 0"); loop { let buffer = &mut [0u8; 4]; let iovecs = &[ - wasi::Iovec { + wasip1::Iovec { buf: buffer.as_mut_ptr() as *mut _, buf_len: 2, }, - wasi::Iovec { + wasip1::Iovec { buf: buffer[2..].as_mut_ptr() as *mut _, buf_len: 2, }, ]; - nread = wasi::fd_read(file_fd, iovecs).expect("reading bytes at offset 0"); + nread = wasip1::fd_read(file_fd, iovecs).expect("reading bytes at offset 0"); if nread == 0 { break; } @@ -99,87 +100,87 @@ unsafe fn test_file_read_write(dir_fd: wasi::Fd) { assert_eq!(contents, &[0u8, 1, 2, 3], "file cursor was overwritten"); let contents = &mut [0u8; 4]; - let iovec = wasi::Iovec { + let iovec = wasip1::Iovec { buf: contents.as_mut_ptr() as *mut _, buf_len: contents.len(), }; - wasi::fd_seek(file_fd, 2, wasi::WHENCE_SET).expect("seeking to offset 2"); - nread = wasi::fd_read(file_fd, &[iovec]).expect("reading bytes at offset 2"); + wasip1::fd_seek(file_fd, 2, wasip1::WHENCE_SET).expect("seeking to offset 2"); + nread = wasip1::fd_read(file_fd, &[iovec]).expect("reading bytes at offset 2"); assert_eq!(nread, 2, "nread bytes check"); assert_eq!(contents, &[2u8, 3, 0, 0], "file cursor was overwritten"); let contents = &[1u8, 0]; - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: contents.as_ptr() as *const _, buf_len: contents.len(), }; - wasi::fd_seek(file_fd, 2, wasi::WHENCE_SET).expect("seeking to offset 2"); - nwritten = wasi::fd_write(file_fd, &[ciovec]).expect("writing bytes at offset 2"); + wasip1::fd_seek(file_fd, 2, wasip1::WHENCE_SET).expect("seeking to offset 2"); + nwritten = wasip1::fd_write(file_fd, &[ciovec]).expect("writing bytes at offset 2"); assert_eq!(nwritten, 2, "nwritten bytes check"); let contents = &mut [0u8; 4]; - let iovec = wasi::Iovec { + let iovec = wasip1::Iovec { buf: contents.as_mut_ptr() as *mut _, buf_len: contents.len(), }; - wasi::fd_seek(file_fd, 0, wasi::WHENCE_SET).expect("seeking to offset 0"); - nread = wasi::fd_read(file_fd, &[iovec]).expect("reading bytes at offset 0"); + wasip1::fd_seek(file_fd, 0, wasip1::WHENCE_SET).expect("seeking to offset 0"); + nread = wasip1::fd_read(file_fd, &[iovec]).expect("reading bytes at offset 0"); assert_eq!(nread, 4, "nread bytes check"); assert_eq!(contents, &[0u8, 1, 1, 0], "file cursor was overwritten"); - wasi::fd_close(file_fd).expect("closing a file"); - wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); + wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); } -unsafe fn test_file_write_and_file_pos(dir_fd: wasi::Fd) { +unsafe fn test_file_write_and_file_pos(dir_fd: wasip1::Fd) { let path = "file2"; - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, path, - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("opening a file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); // Perform a 0-sized pwrite at an offset beyond the end of the file. Unix // semantics should pop out where nothing is actually written and the size // of the file isn't modified. - assert_eq!(wasi::fd_tell(file_fd).unwrap(), 0); - let ciovec = wasi::Ciovec { + assert_eq!(wasip1::fd_tell(file_fd).unwrap(), 0); + let ciovec = wasip1::Ciovec { buf: [].as_ptr(), buf_len: 0, }; - wasi::fd_seek(file_fd, 2, wasi::WHENCE_SET).expect("seeking to offset 2"); - let n = wasi::fd_write(file_fd, &[ciovec]).expect("writing bytes at offset 2"); + wasip1::fd_seek(file_fd, 2, wasip1::WHENCE_SET).expect("seeking to offset 2"); + let n = wasip1::fd_write(file_fd, &[ciovec]).expect("writing bytes at offset 2"); assert_eq!(n, 0); - assert_eq!(wasi::fd_tell(file_fd).unwrap(), 2); - let stat = wasi::fd_filestat_get(file_fd).unwrap(); + assert_eq!(wasip1::fd_tell(file_fd).unwrap(), 2); + let stat = wasip1::fd_filestat_get(file_fd).unwrap(); assert_eq!(stat.size, 0); // Now write a single byte and make sure it actually works let buf = [0]; - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: buf.as_ptr(), buf_len: buf.len(), }; - wasi::fd_seek(file_fd, 50, wasi::WHENCE_SET).expect("seeking to offset 50"); - let n = wasi::fd_write(file_fd, &[ciovec]).expect("writing bytes at offset 50"); + wasip1::fd_seek(file_fd, 50, wasip1::WHENCE_SET).expect("seeking to offset 50"); + let n = wasip1::fd_write(file_fd, &[ciovec]).expect("writing bytes at offset 50"); assert_eq!(n, 1); - assert_eq!(wasi::fd_tell(file_fd).unwrap(), 51); - let stat = wasi::fd_filestat_get(file_fd).unwrap(); + assert_eq!(wasip1::fd_tell(file_fd).unwrap(), 51); + let stat = wasip1::fd_filestat_get(file_fd).unwrap(); assert_eq!(stat.size, 51); - wasi::fd_close(file_fd).expect("closing a file"); - wasi::path_unlink_file(dir_fd, path).expect("removing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); + wasip1::path_unlink_file(dir_fd, path).expect("removing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_file_seek_tell.rs b/crates/test-programs/src/bin/preview1_file_seek_tell.rs index 738b664e44..71c9a7afa6 100644 --- a/crates/test-programs/src/bin/preview1_file_seek_tell.rs +++ b/crates/test-programs/src/bin/preview1_file_seek_tell.rs @@ -1,124 +1,124 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, open_scratch_directory}; -unsafe fn test_file_seek_tell(dir_fd: wasi::Fd) { +unsafe fn test_file_seek_tell(dir_fd: wasip1::Fd) { // Create a file in the scratch directory. - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, "file", - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("opening a file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); // Check current offset - let mut offset = wasi::fd_tell(file_fd).expect("getting initial file offset"); + let mut offset = wasip1::fd_tell(file_fd).expect("getting initial file offset"); assert_eq!(offset, 0, "current offset should be 0"); // Write to file let data = &[0u8; 100]; - let iov = wasi::Ciovec { + let iov = wasip1::Ciovec { buf: data.as_ptr() as *const _, buf_len: data.len(), }; - let nwritten = wasi::fd_write(file_fd, &[iov]).expect("writing to a file"); + let nwritten = wasip1::fd_write(file_fd, &[iov]).expect("writing to a file"); assert_eq!(nwritten, 100, "should write 100 bytes to file"); // Check current offset - offset = wasi::fd_tell(file_fd).expect("getting file offset after writing"); + offset = wasip1::fd_tell(file_fd).expect("getting file offset after writing"); assert_eq!(offset, 100, "offset after writing should be 100"); // Seek to middle of the file let mut newoffset = - wasi::fd_seek(file_fd, -50, wasi::WHENCE_CUR).expect("seeking to the middle of a file"); + wasip1::fd_seek(file_fd, -50, wasip1::WHENCE_CUR).expect("seeking to the middle of a file"); assert_eq!( newoffset, 50, "offset after seeking to the middle should be at 50" ); // Seek to the beginning of the file - newoffset = - wasi::fd_seek(file_fd, 0, wasi::WHENCE_SET).expect("seeking to the beginning of the file"); + newoffset = wasip1::fd_seek(file_fd, 0, wasip1::WHENCE_SET) + .expect("seeking to the beginning of the file"); assert_eq!( newoffset, 0, "offset after seeking to the beginning of the file should be at 0" ); // Seek beyond the file should be possible - wasi::fd_seek(file_fd, 1000, wasi::WHENCE_CUR).expect("seeking beyond the end of the file"); + wasip1::fd_seek(file_fd, 1000, wasip1::WHENCE_CUR).expect("seeking beyond the end of the file"); // Seek before byte 0 is an error though assert_errno!( - wasi::fd_seek(file_fd, -2000, wasi::WHENCE_CUR) + wasip1::fd_seek(file_fd, -2000, wasip1::WHENCE_CUR) .expect_err("seeking before byte 0 should be an error"), - wasi::ERRNO_INVAL + wasip1::ERRNO_INVAL ); // Check that fd_read properly updates the file offset - wasi::fd_seek(file_fd, 0, wasi::WHENCE_SET) + wasip1::fd_seek(file_fd, 0, wasip1::WHENCE_SET) .expect("seeking to the beginning of the file again"); let buffer = &mut [0u8; 100]; - let iovec = wasi::Iovec { + let iovec = wasip1::Iovec { buf: buffer.as_mut_ptr(), buf_len: buffer.len(), }; - let nread = wasi::fd_read(file_fd, &[iovec]).expect("reading file"); + let nread = wasip1::fd_read(file_fd, &[iovec]).expect("reading file"); assert_eq!(nread, buffer.len(), "should read {} bytes", buffer.len()); - offset = wasi::fd_tell(file_fd).expect("getting file offset after reading"); + offset = wasip1::fd_tell(file_fd).expect("getting file offset after reading"); assert_eq!(offset, 100, "offset after reading should be 100"); - wasi::fd_close(file_fd).expect("closing a file"); - wasi::path_unlink_file(dir_fd, "file").expect("deleting a file"); + wasip1::fd_close(file_fd).expect("closing a file"); + wasip1::path_unlink_file(dir_fd, "file").expect("deleting a file"); } // Test that when a file is opened with `O_APPEND` that acquiring the current // position indicates the end of the file. -unsafe fn seek_and_o_append(dir_fd: wasi::Fd) { +unsafe fn seek_and_o_append(dir_fd: wasip1::Fd) { let path = "file2"; - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, path, - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, - wasi::FDFLAGS_APPEND, + wasip1::FDFLAGS_APPEND, ) .expect("opening a file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - let mut offset = wasi::fd_seek(file_fd, 0, wasi::WHENCE_CUR).unwrap(); + let mut offset = wasip1::fd_seek(file_fd, 0, wasip1::WHENCE_CUR).unwrap(); assert_eq!(offset, 0); - offset = wasi::fd_tell(file_fd).unwrap(); + offset = wasip1::fd_tell(file_fd).unwrap(); assert_eq!(offset, 0); let data = &[0u8; 100]; - let iov = wasi::Ciovec { + let iov = wasip1::Ciovec { buf: data.as_ptr() as *const _, buf_len: data.len(), }; - let nwritten = wasi::fd_write(file_fd, &[iov]).unwrap(); + let nwritten = wasip1::fd_write(file_fd, &[iov]).unwrap(); assert_eq!(nwritten, 100); - let mut offset = wasi::fd_seek(file_fd, 0, wasi::WHENCE_CUR).unwrap(); + let mut offset = wasip1::fd_seek(file_fd, 0, wasip1::WHENCE_CUR).unwrap(); assert_eq!(offset, 100); - offset = wasi::fd_tell(file_fd).unwrap(); + offset = wasip1::fd_tell(file_fd).unwrap(); assert_eq!(offset, 100); - wasi::fd_close(file_fd).unwrap(); - wasi::path_unlink_file(dir_fd, path).unwrap(); + wasip1::fd_close(file_fd).unwrap(); + wasip1::path_unlink_file(dir_fd, path).unwrap(); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_file_truncation.rs b/crates/test-programs/src/bin/preview1_file_truncation.rs index 42b1698bdd..365101bb31 100644 --- a/crates/test-programs/src/bin/preview1_file_truncation.rs +++ b/crates/test-programs/src/bin/preview1_file_truncation.rs @@ -1,16 +1,16 @@ use std::{env, process}; use test_programs::preview1::open_scratch_directory; -unsafe fn test_file_truncation(dir_fd: wasi::Fd) { +unsafe fn test_file_truncation(dir_fd: wasip1::Fd) { const FILENAME: &str = "test.txt"; // Open a file for writing - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, FILENAME, - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_WRITE, 0, 0, ) @@ -18,9 +18,9 @@ unsafe fn test_file_truncation(dir_fd: wasi::Fd) { // Write to the file let content = b"this content will be truncated!"; - let nwritten = wasi::fd_write( + let nwritten = wasip1::fd_write( file_fd, - &[wasi::Ciovec { + &[wasip1::Ciovec { buf: content.as_ptr() as *const _, buf_len: content.len(), }], @@ -28,15 +28,15 @@ unsafe fn test_file_truncation(dir_fd: wasi::Fd) { .expect("writing file content"); assert_eq!(nwritten, content.len(), "nwritten bytes check"); - wasi::fd_close(file_fd).expect("closing the file"); + wasip1::fd_close(file_fd).expect("closing the file"); // Open the file for truncation - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, FILENAME, - wasi::OFLAGS_CREAT | wasi::OFLAGS_TRUNC, - wasi::RIGHTS_FD_WRITE | wasi::RIGHTS_FD_READ, + wasip1::OFLAGS_CREAT | wasip1::OFLAGS_TRUNC, + wasip1::RIGHTS_FD_WRITE | wasip1::RIGHTS_FD_READ, 0, 0, ) @@ -44,9 +44,9 @@ unsafe fn test_file_truncation(dir_fd: wasi::Fd) { // Read the file's contents let buffer = &mut [0u8; 100]; - let nread = wasi::fd_read( + let nread = wasip1::fd_read( file_fd, - &[wasi::Iovec { + &[wasip1::Iovec { buf: buffer.as_mut_ptr(), buf_len: buffer.len(), }], @@ -56,7 +56,7 @@ unsafe fn test_file_truncation(dir_fd: wasi::Fd) { // The file should be empty due to truncation assert_eq!(nread, 0, "expected an empty file after truncation"); - wasi::fd_close(file_fd).expect("closing the file"); + wasip1::fd_close(file_fd).expect("closing the file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_file_unbuffered_write.rs b/crates/test-programs/src/bin/preview1_file_unbuffered_write.rs index ba0cb52cd0..1617a415f9 100644 --- a/crates/test-programs/src/bin/preview1_file_unbuffered_write.rs +++ b/crates/test-programs/src/bin/preview1_file_unbuffered_write.rs @@ -1,54 +1,54 @@ use std::{env, process}; use test_programs::preview1::open_scratch_directory; -unsafe fn test_file_unbuffered_write(dir_fd: wasi::Fd) { +unsafe fn test_file_unbuffered_write(dir_fd: wasip1::Fd) { // Create and open file for reading - let fd_read = wasi::path_open( + let fd_read = wasip1::path_open( dir_fd, 0, "file", - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ, 0, 0, ) .expect("create and open file for reading"); assert!( - fd_read > libc::STDERR_FILENO as wasi::Fd, + fd_read > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); // Open the same file but for writing - let fd_write = wasi::path_open(dir_fd, 0, "file", 0, wasi::RIGHTS_FD_WRITE, 0, 0) + let fd_write = wasip1::path_open(dir_fd, 0, "file", 0, wasip1::RIGHTS_FD_WRITE, 0, 0) .expect("opening file for writing"); assert!( - fd_write > libc::STDERR_FILENO as wasi::Fd, + fd_write > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); // Write to file let contents = &[1u8]; - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: contents.as_ptr() as *const _, buf_len: contents.len(), }; - let nwritten = wasi::fd_write(fd_write, &[ciovec]).expect("writing byte to file"); + let nwritten = wasip1::fd_write(fd_write, &[ciovec]).expect("writing byte to file"); assert_eq!(nwritten, 1, "nwritten bytes check"); // Read from file let contents = &mut [0u8; 1]; - let iovec = wasi::Iovec { + let iovec = wasip1::Iovec { buf: contents.as_mut_ptr() as *mut _, buf_len: contents.len(), }; - let nread = wasi::fd_read(fd_read, &[iovec]).expect("reading bytes from file"); + let nread = wasip1::fd_read(fd_read, &[iovec]).expect("reading bytes from file"); assert_eq!(nread, 1, "nread bytes check"); assert_eq!(contents, &[1u8], "written bytes equal read bytes"); // Clean up - wasi::fd_close(fd_write).expect("closing a file"); - wasi::fd_close(fd_read).expect("closing a file"); - wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); + wasip1::fd_close(fd_write).expect("closing a file"); + wasip1::fd_close(fd_read).expect("closing a file"); + wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); } fn main() { let mut args = env::args(); diff --git a/crates/test-programs/src/bin/preview1_file_write.rs b/crates/test-programs/src/bin/preview1_file_write.rs index 7047fcf25d..891a6d6e87 100644 --- a/crates/test-programs/src/bin/preview1_file_write.rs +++ b/crates/test-programs/src/bin/preview1_file_write.rs @@ -1,14 +1,14 @@ use std::{env, process}; use test_programs::preview1::open_scratch_directory; -unsafe fn test_file_long_write(dir_fd: wasi::Fd, filename: &str) { +unsafe fn test_file_long_write(dir_fd: wasip1::Fd, filename: &str) { // Open a file for writing - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, filename, - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_WRITE, 0, 0, ) @@ -23,9 +23,9 @@ unsafe fn test_file_long_write(dir_fd: wasi::Fd, filename: &str) { } // Write to the file - let nwritten = wasi::fd_write( + let nwritten = wasip1::fd_write( file_fd, - &[wasi::Ciovec { + &[wasip1::Ciovec { buf: content.as_slice().as_ptr() as *const _, buf_len: content.len(), }], @@ -33,23 +33,23 @@ unsafe fn test_file_long_write(dir_fd: wasi::Fd, filename: &str) { .expect("writing file content"); assert_eq!(nwritten, content.len(), "nwritten bytes check"); - let stat = wasi::fd_filestat_get(file_fd).expect("reading file stats"); + let stat = wasip1::fd_filestat_get(file_fd).expect("reading file stats"); assert_eq!( stat.size, content.len() as u64, "file should be size of content", ); - wasi::fd_close(file_fd).expect("closing the file"); + wasip1::fd_close(file_fd).expect("closing the file"); // Open the file for reading - let file_fd = wasi::path_open(dir_fd, 0, filename, 0, wasi::RIGHTS_FD_READ, 0, 0) + let file_fd = wasip1::path_open(dir_fd, 0, filename, 0, wasip1::RIGHTS_FD_READ, 0, 0) .expect("open the file for reading"); // Read the file's contents let buffer = &mut [0u8; 100]; - let nread = wasi::fd_read( + let nread = wasip1::fd_read( file_fd, - &[wasi::Iovec { + &[wasip1::Iovec { buf: buffer.as_mut_ptr(), buf_len: buffer.len(), }], @@ -64,12 +64,12 @@ unsafe fn test_file_long_write(dir_fd: wasi::Fd, filename: &str) { ); let end_cursor = content.len() - buffer.len(); - wasi::fd_seek(file_fd, end_cursor as i64, wasi::WHENCE_SET) + wasip1::fd_seek(file_fd, end_cursor as i64, wasip1::WHENCE_SET) .expect("seeking to end of file minus buffer size"); - let nread = wasi::fd_read( + let nread = wasip1::fd_read( file_fd, - &[wasi::Iovec { + &[wasip1::Iovec { buf: buffer.as_mut_ptr(), buf_len: buffer.len(), }], @@ -79,32 +79,32 @@ unsafe fn test_file_long_write(dir_fd: wasi::Fd, filename: &str) { assert_eq!(nread, buffer.len(), "read end chunk len"); assert_eq!(buffer, &content[end_cursor..], "contents of end read chunk"); - wasi::fd_close(file_fd).expect("closing the file"); + wasip1::fd_close(file_fd).expect("closing the file"); // Open a file for writing let filename = "test-zero-write-fails.txt"; - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, filename, - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("creating a file for writing"); - wasi::fd_close(file_fd).expect("closing the file"); - let file_fd = wasi::path_open(dir_fd, 0, filename, 0, wasi::RIGHTS_FD_READ, 0, 0) + wasip1::fd_close(file_fd).expect("closing the file"); + let file_fd = wasip1::path_open(dir_fd, 0, filename, 0, wasip1::RIGHTS_FD_READ, 0, 0) .expect("opening a file for writing"); - let res = wasi::fd_write( + let res = wasip1::fd_write( file_fd, - &[wasi::Ciovec { + &[wasip1::Ciovec { buf: 3 as *const u8, buf_len: 0, }], ); assert!( - res == Err(wasi::ERRNO_BADF) || res == Err(wasi::ERRNO_PERM), + res == Err(wasip1::ERRNO_BADF) || res == Err(wasip1::ERRNO_PERM), "bad result {res:?}" ) } diff --git a/crates/test-programs/src/bin/preview1_interesting_paths.rs b/crates/test-programs/src/bin/preview1_interesting_paths.rs index e91d0bc3e6..69c29899e8 100644 --- a/crates/test-programs/src/bin/preview1_interesting_paths.rs +++ b/crates/test-programs/src/bin/preview1_interesting_paths.rs @@ -1,25 +1,25 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, create_file, open_scratch_directory}; -unsafe fn test_interesting_paths(dir_fd: wasi::Fd, arg: &str) { +unsafe fn test_interesting_paths(dir_fd: wasip1::Fd, arg: &str) { // Create a directory in the scratch directory. - wasi::path_create_directory(dir_fd, "dir").expect("creating dir"); + wasip1::path_create_directory(dir_fd, "dir").expect("creating dir"); // Create a directory in the directory we just created. - wasi::path_create_directory(dir_fd, "dir/nested").expect("creating a nested dir"); + wasip1::path_create_directory(dir_fd, "dir/nested").expect("creating a nested dir"); // Create a file in the nested directory. create_file(dir_fd, "dir/nested/file"); // Now open it with an absolute path. assert_errno!( - wasi::path_open(dir_fd, 0, "/dir/nested/file", 0, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "/dir/nested/file", 0, 0, 0, 0) .expect_err("opening a file with an absolute path"), - wasi::ERRNO_PERM + wasip1::ERRNO_PERM ); // Now open it with a path containing "..". - let mut file_fd = wasi::path_open( + let mut file_fd = wasip1::path_open( dir_fd, 0, "dir/.//nested/../../dir/nested/../nested///./file", @@ -30,65 +30,65 @@ unsafe fn test_interesting_paths(dir_fd: wasi::Fd, arg: &str) { ) .expect("opening a file with \"..\" in the path"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::fd_close(file_fd).expect("closing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); // Now open it with a trailing NUL. Windows will allow this. assert_errno!( - wasi::path_open(dir_fd, 0, "dir/nested/file\0", 0, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "dir/nested/file\0", 0, 0, 0, 0) .expect_err("opening a file with a trailing NUL"), - unix => wasi::ERRNO_INVAL, - windows => wasi::ERRNO_NOENT + unix => wasip1::ERRNO_INVAL, + windows => wasip1::ERRNO_NOENT ); // Now open it with a trailing slash. assert_errno!( - wasi::path_open(dir_fd, 0, "dir/nested/file/", 0, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "dir/nested/file/", 0, 0, 0, 0) .expect_err("opening a file with a trailing slash should fail"), - wasi::ERRNO_NOTDIR, - wasi::ERRNO_NOENT + wasip1::ERRNO_NOTDIR, + wasip1::ERRNO_NOENT ); // Now open it with trailing slashes. assert_errno!( - wasi::path_open(dir_fd, 0, "dir/nested/file///", 0, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "dir/nested/file///", 0, 0, 0, 0) .expect_err("opening a file with trailing slashes should fail"), - wasi::ERRNO_NOTDIR, - wasi::ERRNO_NOENT + wasip1::ERRNO_NOTDIR, + wasip1::ERRNO_NOENT ); // Now open the directory with a trailing slash. - file_fd = wasi::path_open(dir_fd, 0, "dir/nested/", 0, 0, 0, 0) + file_fd = wasip1::path_open(dir_fd, 0, "dir/nested/", 0, 0, 0, 0) .expect("opening a directory with a trailing slash"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::fd_close(file_fd).expect("closing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); // Now open the directory with trailing slashes. - file_fd = wasi::path_open(dir_fd, 0, "dir/nested///", 0, 0, 0, 0) + file_fd = wasip1::path_open(dir_fd, 0, "dir/nested///", 0, 0, 0, 0) .expect("opening a directory with trailing slashes"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::fd_close(file_fd).expect("closing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); // Now open it with a path containing too many ".."s. let bad_path = format!("dir/nested/../../../{arg}/dir/nested/file"); assert_errno!( - wasi::path_open(dir_fd, 0, &bad_path, 0, 0, 0, 0) + wasip1::path_open(dir_fd, 0, &bad_path, 0, 0, 0, 0) .expect_err("opening a file with too many \"..\"s in the path should fail"), - wasi::ERRNO_PERM + wasip1::ERRNO_PERM ); - wasi::path_unlink_file(dir_fd, "dir/nested/file") + wasip1::path_unlink_file(dir_fd, "dir/nested/file") .expect("unlink_file on a symlink should succeed"); - wasi::path_remove_directory(dir_fd, "dir/nested") + wasip1::path_remove_directory(dir_fd, "dir/nested") .expect("remove_directory on a directory should succeed"); - wasi::path_remove_directory(dir_fd, "dir") + wasip1::path_remove_directory(dir_fd, "dir") .expect("remove_directory on a directory should succeed"); } diff --git a/crates/test-programs/src/bin/preview1_nofollow_errors.rs b/crates/test-programs/src/bin/preview1_nofollow_errors.rs index 2c5d1bcfa8..6aa642790d 100644 --- a/crates/test-programs/src/bin/preview1_nofollow_errors.rs +++ b/crates/test-programs/src/bin/preview1_nofollow_errors.rs @@ -1,89 +1,89 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, open_scratch_directory}; -unsafe fn test_nofollow_errors(dir_fd: wasi::Fd) { +unsafe fn test_nofollow_errors(dir_fd: wasip1::Fd) { // Create a directory for the symlink to point to. - wasi::path_create_directory(dir_fd, "target").expect("creating a dir"); + wasip1::path_create_directory(dir_fd, "target").expect("creating a dir"); // Create a symlink. - wasi::path_symlink("target", dir_fd, "symlink").expect("creating a symlink"); + wasip1::path_symlink("target", dir_fd, "symlink").expect("creating a symlink"); // Try to open it as a directory with O_NOFOLLOW again. assert_errno!( - wasi::path_open(dir_fd, 0, "symlink", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "symlink", wasip1::OFLAGS_DIRECTORY, 0, 0, 0) .expect_err("opening a directory symlink as a directory should fail"), - wasi::ERRNO_LOOP, - wasi::ERRNO_NOTDIR + wasip1::ERRNO_LOOP, + wasip1::ERRNO_NOTDIR ); // Try to open it with just O_NOFOLLOW. assert_errno!( - wasi::path_open(dir_fd, 0, "symlink", 0, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "symlink", 0, 0, 0, 0) .expect_err("opening a symlink with O_NOFOLLOW should fail"), - wasi::ERRNO_LOOP, - wasi::ERRNO_ACCES + wasip1::ERRNO_LOOP, + wasip1::ERRNO_ACCES ); // Try to open it as a directory without O_NOFOLLOW. - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, - wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, + wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "symlink", - wasi::OFLAGS_DIRECTORY, + wasip1::OFLAGS_DIRECTORY, 0, 0, 0, ) .expect("opening a symlink as a directory"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::fd_close(file_fd).expect("closing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); // Replace the target directory with a file. - wasi::path_unlink_file(dir_fd, "symlink").expect("removing a file"); - wasi::path_remove_directory(dir_fd, "target") + wasip1::path_unlink_file(dir_fd, "symlink").expect("removing a file"); + wasip1::path_remove_directory(dir_fd, "target") .expect("remove_directory on a directory should succeed"); - let file_fd = - wasi::path_open(dir_fd, 0, "target", wasi::OFLAGS_CREAT, 0, 0, 0).expect("creating a file"); - wasi::fd_close(file_fd).expect("closing a file"); - wasi::path_symlink("target", dir_fd, "symlink").expect("creating a symlink"); + let file_fd = wasip1::path_open(dir_fd, 0, "target", wasip1::OFLAGS_CREAT, 0, 0, 0) + .expect("creating a file"); + wasip1::fd_close(file_fd).expect("closing a file"); + wasip1::path_symlink("target", dir_fd, "symlink").expect("creating a symlink"); // Try to open it as a directory with O_NOFOLLOW again. assert_errno!( - wasi::path_open(dir_fd, 0, "symlink", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "symlink", wasip1::OFLAGS_DIRECTORY, 0, 0, 0) .expect_err("opening a directory symlink as a directory should fail"), - wasi::ERRNO_LOOP, - wasi::ERRNO_NOTDIR + wasip1::ERRNO_LOOP, + wasip1::ERRNO_NOTDIR ); // Try to open it with just O_NOFOLLOW. assert_errno!( - wasi::path_open(dir_fd, 0, "symlink", 0, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "symlink", 0, 0, 0, 0) .expect_err("opening a symlink with NOFOLLOW should fail"), - wasi::ERRNO_LOOP + wasip1::ERRNO_LOOP ); // Try to open it as a directory without O_NOFOLLOW. assert_errno!( - wasi::path_open( + wasip1::path_open( dir_fd, - wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, + wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "symlink", - wasi::OFLAGS_DIRECTORY, + wasip1::OFLAGS_DIRECTORY, 0, 0, 0, ) .expect_err("opening a symlink to a file as a directory"), - wasi::ERRNO_NOTDIR + wasip1::ERRNO_NOTDIR ); // Clean up. - wasi::path_unlink_file(dir_fd, "target").expect("removing a file"); - wasi::path_unlink_file(dir_fd, "symlink").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "target").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "symlink").expect("removing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_overwrite_preopen.rs b/crates/test-programs/src/bin/preview1_overwrite_preopen.rs index 949bf2ee62..38c55410cc 100644 --- a/crates/test-programs/src/bin/preview1_overwrite_preopen.rs +++ b/crates/test-programs/src/bin/preview1_overwrite_preopen.rs @@ -1,18 +1,18 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, open_scratch_directory}; -unsafe fn test_overwrite_preopen(dir_fd: wasi::Fd) { - let pre_fd: wasi::Fd = (libc::STDERR_FILENO + 1) as wasi::Fd; +unsafe fn test_overwrite_preopen(dir_fd: wasip1::Fd) { + let pre_fd: wasip1::Fd = (libc::STDERR_FILENO + 1) as wasip1::Fd; assert!(dir_fd > pre_fd, "dir_fd number"); - let old_dir_filestat = wasi::fd_filestat_get(dir_fd).expect("failed fd_filestat_get"); + let old_dir_filestat = wasip1::fd_filestat_get(dir_fd).expect("failed fd_filestat_get"); // Try to renumber over a preopened directory handle. - wasi::fd_renumber(dir_fd, pre_fd).expect("renumbering over a preopened file descriptor"); + wasip1::fd_renumber(dir_fd, pre_fd).expect("renumbering over a preopened file descriptor"); // Ensure that pre_fd is still open. - let new_dir_filestat = wasi::fd_filestat_get(pre_fd).expect("failed fd_filestat_get"); + let new_dir_filestat = wasip1::fd_filestat_get(pre_fd).expect("failed fd_filestat_get"); // Ensure that we renumbered. assert_eq!(old_dir_filestat.dev, new_dir_filestat.dev); @@ -20,8 +20,8 @@ unsafe fn test_overwrite_preopen(dir_fd: wasi::Fd) { // Ensure that dir_fd is closed. assert_errno!( - wasi::fd_fdstat_get(dir_fd).expect_err("failed fd_fdstat_get"), - wasi::ERRNO_BADF + wasip1::fd_fdstat_get(dir_fd).expect_err("failed fd_fdstat_get"), + wasip1::ERRNO_BADF ); } diff --git a/crates/test-programs/src/bin/preview1_path_exists.rs b/crates/test-programs/src/bin/preview1_path_exists.rs index e0afe4f973..40a12e9c85 100644 --- a/crates/test-programs/src/bin/preview1_path_exists.rs +++ b/crates/test-programs/src/bin/preview1_path_exists.rs @@ -1,57 +1,58 @@ use std::{env, process}; use test_programs::preview1::{create_file, open_scratch_directory}; -unsafe fn test_path_exists(dir_fd: wasi::Fd) { +unsafe fn test_path_exists(dir_fd: wasip1::Fd) { // Create a temporary directory - wasi::path_create_directory(dir_fd, "subdir").expect("create directory"); + wasip1::path_create_directory(dir_fd, "subdir").expect("create directory"); // Check directory exists: - let file_stat = wasi::path_filestat_get(dir_fd, 0, "subdir").expect("reading file stats"); - assert_eq!(file_stat.filetype, wasi::FILETYPE_DIRECTORY); + let file_stat = wasip1::path_filestat_get(dir_fd, 0, "subdir").expect("reading file stats"); + assert_eq!(file_stat.filetype, wasip1::FILETYPE_DIRECTORY); // Should still exist with symlink follow flag: - let file_stat = wasi::path_filestat_get(dir_fd, wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, "subdir") + let file_stat = wasip1::path_filestat_get(dir_fd, wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "subdir") .expect("reading file stats"); - assert_eq!(file_stat.filetype, wasi::FILETYPE_DIRECTORY); + assert_eq!(file_stat.filetype, wasip1::FILETYPE_DIRECTORY); // Create a file: create_file(dir_fd, "subdir/file"); // Check directory exists: - let file_stat = wasi::path_filestat_get(dir_fd, 0, "subdir/file").expect("reading file stats"); - assert_eq!(file_stat.filetype, wasi::FILETYPE_REGULAR_FILE); + let file_stat = + wasip1::path_filestat_get(dir_fd, 0, "subdir/file").expect("reading file stats"); + assert_eq!(file_stat.filetype, wasip1::FILETYPE_REGULAR_FILE); // Should still exist with symlink follow flag: let file_stat = - wasi::path_filestat_get(dir_fd, wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, "subdir/file") + wasip1::path_filestat_get(dir_fd, wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "subdir/file") .expect("reading file stats"); - assert_eq!(file_stat.filetype, wasi::FILETYPE_REGULAR_FILE); + assert_eq!(file_stat.filetype, wasip1::FILETYPE_REGULAR_FILE); // Create a symlink to a file: - wasi::path_symlink("subdir/file", dir_fd, "link1").expect("create symlink"); + wasip1::path_symlink("subdir/file", dir_fd, "link1").expect("create symlink"); // Check symlink exists: - let file_stat = wasi::path_filestat_get(dir_fd, 0, "link1").expect("reading file stats"); - assert_eq!(file_stat.filetype, wasi::FILETYPE_SYMBOLIC_LINK); + let file_stat = wasip1::path_filestat_get(dir_fd, 0, "link1").expect("reading file stats"); + assert_eq!(file_stat.filetype, wasip1::FILETYPE_SYMBOLIC_LINK); // Should still exist with symlink follow flag, pointing to regular file - let file_stat = wasi::path_filestat_get(dir_fd, wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, "link1") + let file_stat = wasip1::path_filestat_get(dir_fd, wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "link1") .expect("reading file stats"); - assert_eq!(file_stat.filetype, wasi::FILETYPE_REGULAR_FILE); + assert_eq!(file_stat.filetype, wasip1::FILETYPE_REGULAR_FILE); // Create a symlink to a dir: - wasi::path_symlink("subdir", dir_fd, "link2").expect("create symlink"); + wasip1::path_symlink("subdir", dir_fd, "link2").expect("create symlink"); // Check symlink exists: - let file_stat = wasi::path_filestat_get(dir_fd, 0, "link2").expect("reading file stats"); - assert_eq!(file_stat.filetype, wasi::FILETYPE_SYMBOLIC_LINK); + let file_stat = wasip1::path_filestat_get(dir_fd, 0, "link2").expect("reading file stats"); + assert_eq!(file_stat.filetype, wasip1::FILETYPE_SYMBOLIC_LINK); // Should still exist with symlink follow flag, pointing to directory - let file_stat = wasi::path_filestat_get(dir_fd, wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, "link2") + let file_stat = wasip1::path_filestat_get(dir_fd, wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "link2") .expect("reading file stats"); - assert_eq!(file_stat.filetype, wasi::FILETYPE_DIRECTORY); + assert_eq!(file_stat.filetype, wasip1::FILETYPE_DIRECTORY); - wasi::path_unlink_file(dir_fd, "link1").expect("clean up"); - wasi::path_unlink_file(dir_fd, "link2").expect("clean up"); - wasi::path_unlink_file(dir_fd, "subdir/file").expect("clean up"); - wasi::path_remove_directory(dir_fd, "subdir").expect("clean up"); + wasip1::path_unlink_file(dir_fd, "link1").expect("clean up"); + wasip1::path_unlink_file(dir_fd, "link2").expect("clean up"); + wasip1::path_unlink_file(dir_fd, "subdir/file").expect("clean up"); + wasip1::path_remove_directory(dir_fd, "subdir").expect("clean up"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_path_filestat.rs b/crates/test-programs/src/bin/preview1_path_filestat.rs index 6b25fc2e7e..1d287fdf88 100644 --- a/crates/test-programs/src/bin/preview1_path_filestat.rs +++ b/crates/test-programs/src/bin/preview1_path_filestat.rs @@ -3,64 +3,64 @@ use test_programs::preview1::{ assert_errno, assert_fs_time_eq, open_scratch_directory, TestConfig, }; -unsafe fn test_path_filestat(dir_fd: wasi::Fd) { +unsafe fn test_path_filestat(dir_fd: wasip1::Fd) { let cfg = TestConfig::from_env(); - let fdflags = wasi::FDFLAGS_APPEND; + let fdflags = wasip1::FDFLAGS_APPEND; // Create a file in the scratch directory. - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, "file", - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, // Pass some flags for later retrieval fdflags, ) .expect("opening a file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - let fdstat = wasi::fd_fdstat_get(file_fd).expect("fd_fdstat_get"); + let fdstat = wasip1::fd_fdstat_get(file_fd).expect("fd_fdstat_get"); assert_eq!( - fdstat.fs_flags & wasi::FDFLAGS_APPEND, - wasi::FDFLAGS_APPEND, + fdstat.fs_flags & wasip1::FDFLAGS_APPEND, + wasip1::FDFLAGS_APPEND, "file should have the APPEND fdflag used to create the file" ); assert_errno!( - wasi::path_open( + wasip1::path_open( dir_fd, 0, "file", 0, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, - wasi::FDFLAGS_SYNC, + wasip1::FDFLAGS_SYNC, ) .expect_err("FDFLAGS_SYNC not supported by platform"), - wasi::ERRNO_NOTSUP + wasip1::ERRNO_NOTSUP ); // Check file size - let file_stat = wasi::path_filestat_get(dir_fd, 0, "file").expect("reading file stats"); + let file_stat = wasip1::path_filestat_get(dir_fd, 0, "file").expect("reading file stats"); assert_eq!(file_stat.size, 0, "file size should be 0"); // Check path_filestat_set_times let new_mtim = Duration::from_nanos(file_stat.mtim) - 2 * cfg.fs_time_precision(); - wasi::path_filestat_set_times( + wasip1::path_filestat_set_times( dir_fd, 0, "file", 0, new_mtim.as_nanos() as u64, - wasi::FSTFLAGS_MTIM, + wasip1::FSTFLAGS_MTIM, ) .expect("path_filestat_set_times should succeed"); - let modified_file_stat = wasi::path_filestat_get(dir_fd, 0, "file") + let modified_file_stat = wasip1::path_filestat_get(dir_fd, 0, "file") .expect("reading file stats after path_filestat_set_times"); assert_fs_time_eq!( @@ -70,20 +70,20 @@ unsafe fn test_path_filestat(dir_fd: wasi::Fd) { ); assert_errno!( - wasi::path_filestat_set_times( + wasip1::path_filestat_set_times( dir_fd, 0, "file", 0, new_mtim.as_nanos() as u64, - wasi::FSTFLAGS_MTIM | wasi::FSTFLAGS_MTIM_NOW, + wasip1::FSTFLAGS_MTIM | wasip1::FSTFLAGS_MTIM_NOW, ) .expect_err("MTIM and MTIM_NOW can't both be set"), - wasi::ERRNO_INVAL + wasip1::ERRNO_INVAL ); // check if the times were untouched - let unmodified_file_stat = wasi::path_filestat_get(dir_fd, 0, "file") + let unmodified_file_stat = wasip1::path_filestat_get(dir_fd, 0, "file") .expect("reading file stats after ERRNO_INVAL fd_filestat_set_times"); assert_fs_time_eq!( @@ -94,20 +94,20 @@ unsafe fn test_path_filestat(dir_fd: wasi::Fd) { // Invalid arguments to set_times: assert_errno!( - wasi::path_filestat_set_times( + wasip1::path_filestat_set_times( dir_fd, 0, "file", 0, 0, - wasi::FSTFLAGS_ATIM | wasi::FSTFLAGS_ATIM_NOW, + wasip1::FSTFLAGS_ATIM | wasip1::FSTFLAGS_ATIM_NOW, ) .expect_err("ATIM & ATIM_NOW can't both be set"), - wasi::ERRNO_INVAL + wasip1::ERRNO_INVAL ); - wasi::fd_close(file_fd).expect("closing a file"); - wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); + wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); } fn main() { let mut args = env::args(); diff --git a/crates/test-programs/src/bin/preview1_path_link.rs b/crates/test-programs/src/bin/preview1_path_link.rs index c8f30d0858..cb82b1421f 100644 --- a/crates/test-programs/src/bin/preview1_path_link.rs +++ b/crates/test-programs/src/bin/preview1_path_link.rs @@ -38,144 +38,146 @@ macro_rules! fdstats_assert_eq { macro_rules! check_rights { ($orig_fd:ident, $link_fd:ident) => { let orig_filestat = - wasi::fd_filestat_get($orig_fd).expect("reading filestat of the source"); - let link_filestat = wasi::fd_filestat_get($link_fd).expect("reading filestat of the link"); + wasip1::fd_filestat_get($orig_fd).expect("reading filestat of the source"); + let link_filestat = + wasip1::fd_filestat_get($link_fd).expect("reading filestat of the link"); filestats_assert_eq!(orig_filestat, link_filestat); // Compare Fdstats - let orig_fdstat = wasi::fd_fdstat_get($orig_fd).expect("reading fdstat of the source"); - let link_fdstat = wasi::fd_fdstat_get($link_fd).expect("reading fdstat of the link"); + let orig_fdstat = wasip1::fd_fdstat_get($orig_fd).expect("reading fdstat of the source"); + let link_fdstat = wasip1::fd_fdstat_get($link_fd).expect("reading fdstat of the link"); fdstats_assert_eq!(orig_fdstat, link_fdstat); }; } // Extra calls of fd_close are needed for Windows, which will not remove // the directory until all handles are closed. -unsafe fn test_path_link(dir_fd: wasi::Fd) { +unsafe fn test_path_link(dir_fd: wasip1::Fd) { // Create a file let create_fd = - wasi::path_open(dir_fd, 0, "file", wasi::OFLAGS_CREAT, 0, 0, 0).expect("create file"); - wasi::fd_close(create_fd).unwrap(); + wasip1::path_open(dir_fd, 0, "file", wasip1::OFLAGS_CREAT, 0, 0, 0).expect("create file"); + wasip1::fd_close(create_fd).unwrap(); // Open a fresh descriptor to the file. We won't have a write right that was implied by OFLAGS_CREAT // above. - let file_fd = wasi::path_open(dir_fd, 0, "file", 0, 0, 0, 0).expect("open file"); + let file_fd = wasip1::path_open(dir_fd, 0, "file", 0, 0, 0, 0).expect("open file"); // Create a link in the same directory and compare rights - wasi::path_link(dir_fd, 0, "file", dir_fd, "link") + wasip1::path_link(dir_fd, 0, "file", dir_fd, "link") .expect("creating a link in the same directory"); - let link_fd = wasi::path_open(dir_fd, 0, "link", 0, 0, 0, 0).expect("open link"); + let link_fd = wasip1::path_open(dir_fd, 0, "link", 0, 0, 0, 0).expect("open link"); check_rights!(file_fd, link_fd); - wasi::fd_close(link_fd).expect("Closing link_fd"); // needed for Windows - wasi::path_unlink_file(dir_fd, "link").expect("removing a link"); + wasip1::fd_close(link_fd).expect("Closing link_fd"); // needed for Windows + wasip1::path_unlink_file(dir_fd, "link").expect("removing a link"); // Create a link in a different directory and compare rights - wasi::path_create_directory(dir_fd, "subdir").expect("creating a subdirectory"); - let subdir_fd = wasi::path_open(dir_fd, 0, "subdir", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + wasip1::path_create_directory(dir_fd, "subdir").expect("creating a subdirectory"); + let subdir_fd = wasip1::path_open(dir_fd, 0, "subdir", wasip1::OFLAGS_DIRECTORY, 0, 0, 0) .expect("open subdir directory"); - wasi::path_link(dir_fd, 0, "file", subdir_fd, "link").expect("creating a link in subdirectory"); - let link_fd = wasi::path_open(subdir_fd, 0, "link", 0, 0, 0, 0).expect("open link in subdir"); + wasip1::path_link(dir_fd, 0, "file", subdir_fd, "link") + .expect("creating a link in subdirectory"); + let link_fd = wasip1::path_open(subdir_fd, 0, "link", 0, 0, 0, 0).expect("open link in subdir"); check_rights!(file_fd, link_fd); - wasi::fd_close(link_fd).expect("Closing link_fd"); // needed for Windows - wasi::path_unlink_file(subdir_fd, "link").expect("removing a link"); - wasi::fd_close(subdir_fd).expect("Closing subdir_fd"); // needed for Windows - wasi::path_remove_directory(dir_fd, "subdir").expect("removing a subdirectory"); + wasip1::fd_close(link_fd).expect("Closing link_fd"); // needed for Windows + wasip1::path_unlink_file(subdir_fd, "link").expect("removing a link"); + wasip1::fd_close(subdir_fd).expect("Closing subdir_fd"); // needed for Windows + wasip1::path_remove_directory(dir_fd, "subdir").expect("removing a subdirectory"); // Create a link to a path that already exists create_file(dir_fd, "link"); assert_errno!( - wasi::path_link(dir_fd, 0, "file", dir_fd, "link") + wasip1::path_link(dir_fd, 0, "file", dir_fd, "link") .expect_err("creating a link to existing path should fail"), - wasi::ERRNO_EXIST + wasip1::ERRNO_EXIST ); - wasi::path_unlink_file(dir_fd, "link").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "link").expect("removing a file"); // Create a link to itself assert_errno!( - wasi::path_link(dir_fd, 0, "file", dir_fd, "file") + wasip1::path_link(dir_fd, 0, "file", dir_fd, "file") .expect_err("creating a link to itself should fail"), - wasi::ERRNO_EXIST + wasip1::ERRNO_EXIST ); // Create a link where target is a directory - wasi::path_create_directory(dir_fd, "link").expect("creating a dir"); + wasip1::path_create_directory(dir_fd, "link").expect("creating a dir"); assert_errno!( - wasi::path_link(dir_fd, 0, "file", dir_fd, "link") + wasip1::path_link(dir_fd, 0, "file", dir_fd, "link") .expect_err("creating a link where target is a directory should fail"), - wasi::ERRNO_EXIST + wasip1::ERRNO_EXIST ); - wasi::path_remove_directory(dir_fd, "link").expect("removing a dir"); + wasip1::path_remove_directory(dir_fd, "link").expect("removing a dir"); // Create a link to a directory - wasi::path_create_directory(dir_fd, "subdir").expect("creating a subdirectory"); - let subdir_fd = wasi::path_open(dir_fd, 0, "subdir", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + wasip1::path_create_directory(dir_fd, "subdir").expect("creating a subdirectory"); + let subdir_fd = wasip1::path_open(dir_fd, 0, "subdir", wasip1::OFLAGS_DIRECTORY, 0, 0, 0) .expect("open new descriptor to subdir"); assert_errno!( - wasi::path_link(dir_fd, 0, "subdir", dir_fd, "link") + wasip1::path_link(dir_fd, 0, "subdir", dir_fd, "link") .expect_err("creating a link to a directory should fail"), - wasi::ERRNO_PERM, - wasi::ERRNO_ACCES + wasip1::ERRNO_PERM, + wasip1::ERRNO_ACCES ); - wasi::fd_close(subdir_fd).expect("close subdir before deleting it"); - wasi::path_remove_directory(dir_fd, "subdir").expect("removing a subdirectory"); + wasip1::fd_close(subdir_fd).expect("close subdir before deleting it"); + wasip1::path_remove_directory(dir_fd, "subdir").expect("removing a subdirectory"); // Create a link to a file with trailing slash assert_errno!( - wasi::path_link(dir_fd, 0, "file", dir_fd, "link/") + wasip1::path_link(dir_fd, 0, "file", dir_fd, "link/") .expect_err("creating a link to a file with trailing slash should fail"), - wasi::ERRNO_NOENT + wasip1::ERRNO_NOENT ); if config().support_dangling_filesystem() { // Create a link to a dangling symlink - wasi::path_symlink("target", dir_fd, "symlink").expect("creating a dangling symlink"); + wasip1::path_symlink("target", dir_fd, "symlink").expect("creating a dangling symlink"); // This should succeed, because we're not following symlinks - wasi::path_link(dir_fd, 0, "symlink", dir_fd, "link") + wasip1::path_link(dir_fd, 0, "symlink", dir_fd, "link") .expect("creating a link to a dangling symlink should succeed"); - wasi::path_unlink_file(dir_fd, "symlink").expect("removing a symlink"); - wasi::path_unlink_file(dir_fd, "link").expect("removing a hardlink"); + wasip1::path_unlink_file(dir_fd, "symlink").expect("removing a symlink"); + wasip1::path_unlink_file(dir_fd, "link").expect("removing a hardlink"); // Create a link to a symlink loop - wasi::path_symlink("symlink", dir_fd, "symlink").expect("creating a symlink loop"); + wasip1::path_symlink("symlink", dir_fd, "symlink").expect("creating a symlink loop"); - wasi::path_link(dir_fd, 0, "symlink", dir_fd, "link") + wasip1::path_link(dir_fd, 0, "symlink", dir_fd, "link") .expect("creating a link to a symlink loop should succeed"); - wasi::path_unlink_file(dir_fd, "symlink").expect("removing a symlink"); - wasi::path_unlink_file(dir_fd, "link").expect("removing a hardlink"); + wasip1::path_unlink_file(dir_fd, "symlink").expect("removing a symlink"); + wasip1::path_unlink_file(dir_fd, "link").expect("removing a hardlink"); // Create a link where target is a dangling symlink - wasi::path_symlink("target", dir_fd, "symlink").expect("creating a dangling symlink"); + wasip1::path_symlink("target", dir_fd, "symlink").expect("creating a dangling symlink"); assert_errno!( - wasi::path_link(dir_fd, 0, "file", dir_fd, "symlink") + wasip1::path_link(dir_fd, 0, "file", dir_fd, "symlink") .expect_err("creating a link where target is a dangling symlink"), - wasi::ERRNO_EXIST + wasip1::ERRNO_EXIST ); - wasi::path_unlink_file(dir_fd, "symlink").expect("removing a symlink"); + wasip1::path_unlink_file(dir_fd, "symlink").expect("removing a symlink"); // Create a link where target is a dangling symlink following symlinks - wasi::path_symlink("target", dir_fd, "symlink").expect("creating a dangling symlink"); + wasip1::path_symlink("target", dir_fd, "symlink").expect("creating a dangling symlink"); // Symlink following with path_link is rejected assert_errno!( - wasi::path_link( + wasip1::path_link( dir_fd, - wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, + wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "symlink", dir_fd, "link", ) .expect_err("calling path_link with LOOKUPFLAGS_SYMLINK_FOLLOW should fail"), - wasi::ERRNO_INVAL + wasip1::ERRNO_INVAL ); // Clean up. - wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); } } diff --git a/crates/test-programs/src/bin/preview1_path_open_create_existing.rs b/crates/test-programs/src/bin/preview1_path_open_create_existing.rs index 963e583720..8bd9229735 100644 --- a/crates/test-programs/src/bin/preview1_path_open_create_existing.rs +++ b/crates/test-programs/src/bin/preview1_path_open_create_existing.rs @@ -1,22 +1,22 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, create_file, open_scratch_directory}; -unsafe fn test_path_open_create_existing(dir_fd: wasi::Fd) { +unsafe fn test_path_open_create_existing(dir_fd: wasip1::Fd) { create_file(dir_fd, "file"); assert_errno!( - wasi::path_open( + wasip1::path_open( dir_fd, 0, "file", - wasi::OFLAGS_CREAT | wasi::OFLAGS_EXCL, + wasip1::OFLAGS_CREAT | wasip1::OFLAGS_EXCL, 0, 0, 0, ) .expect_err("trying to create a file that already exists"), - wasi::ERRNO_EXIST + wasip1::ERRNO_EXIST ); - wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_path_open_dirfd_not_dir.rs b/crates/test-programs/src/bin/preview1_path_open_dirfd_not_dir.rs index de35d964f2..b4103e708e 100644 --- a/crates/test-programs/src/bin/preview1_path_open_dirfd_not_dir.rs +++ b/crates/test-programs/src/bin/preview1_path_open_dirfd_not_dir.rs @@ -1,17 +1,17 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, open_scratch_directory}; -unsafe fn test_dirfd_not_dir(dir_fd: wasi::Fd) { +unsafe fn test_dirfd_not_dir(dir_fd: wasip1::Fd) { // Open a file. - let file_fd = - wasi::path_open(dir_fd, 0, "file", wasi::OFLAGS_CREAT, 0, 0, 0).expect("opening a file"); + let file_fd = wasip1::path_open(dir_fd, 0, "file", wasip1::OFLAGS_CREAT, 0, 0, 0) + .expect("opening a file"); // Now try to open a file underneath it as if it were a directory. assert_errno!( - wasi::path_open(file_fd, 0, "foo", wasi::OFLAGS_CREAT, 0, 0, 0) + wasip1::path_open(file_fd, 0, "foo", wasip1::OFLAGS_CREAT, 0, 0, 0) .expect_err("non-directory base fd should get ERRNO_NOTDIR"), - wasi::ERRNO_NOTDIR + wasip1::ERRNO_NOTDIR ); - wasi::fd_close(file_fd).expect("closing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_path_open_lots.rs b/crates/test-programs/src/bin/preview1_path_open_lots.rs index 16f32be951..b48f0e3fe5 100644 --- a/crates/test-programs/src/bin/preview1_path_open_lots.rs +++ b/crates/test-programs/src/bin/preview1_path_open_lots.rs @@ -1,86 +1,86 @@ use std::{env, process}; use test_programs::preview1::{create_file, open_scratch_directory}; -unsafe fn test_path_open_lots(dir_fd: wasi::Fd) { +unsafe fn test_path_open_lots(dir_fd: wasip1::Fd) { create_file(dir_fd, "file"); for _ in 0..2000 { - let f_readonly = wasi::path_open(dir_fd, 0, "file", 0, wasi::RIGHTS_FD_READ, 0, 0) + let f_readonly = wasip1::path_open(dir_fd, 0, "file", 0, wasip1::RIGHTS_FD_READ, 0, 0) .expect("open file readonly"); let buffer = &mut [0u8; 100]; - let iovec = wasi::Iovec { + let iovec = wasip1::Iovec { buf: buffer.as_mut_ptr(), buf_len: buffer.len(), }; - let nread = wasi::fd_read(f_readonly, &[iovec]).expect("reading readonly file"); + let nread = wasip1::fd_read(f_readonly, &[iovec]).expect("reading readonly file"); assert_eq!(nread, 0, "readonly file is empty"); - wasi::fd_close(f_readonly).expect("close readonly"); + wasip1::fd_close(f_readonly).expect("close readonly"); } for _ in 0..2000 { - let f_readonly = wasi::path_open(dir_fd, 0, "file", 0, wasi::RIGHTS_FD_READ, 0, 0) + let f_readonly = wasip1::path_open(dir_fd, 0, "file", 0, wasip1::RIGHTS_FD_READ, 0, 0) .expect("open file readonly"); let buffer = &mut [0u8; 100]; - let iovec = wasi::Iovec { + let iovec = wasip1::Iovec { buf: buffer.as_mut_ptr(), buf_len: buffer.len(), }; - let nread = wasi::fd_pread(f_readonly, &[iovec], 0).expect("reading readonly file"); + let nread = wasip1::fd_pread(f_readonly, &[iovec], 0).expect("reading readonly file"); assert_eq!(nread, 0, "readonly file is empty"); - wasi::fd_close(f_readonly).expect("close readonly"); + wasip1::fd_close(f_readonly).expect("close readonly"); } for _ in 0..2000 { - let f = wasi::path_open( + let f = wasip1::path_open( dir_fd, 0, "file", 0, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .unwrap(); let buffer = &[0u8; 100]; - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: buffer.as_ptr(), buf_len: buffer.len(), }; - let nwritten = wasi::fd_write(f, &[ciovec]).expect("write failed"); + let nwritten = wasip1::fd_write(f, &[ciovec]).expect("write failed"); assert_eq!(nwritten, 100); - wasi::fd_close(f).unwrap(); + wasip1::fd_close(f).unwrap(); } for _ in 0..2000 { - let f = wasi::path_open( + let f = wasip1::path_open( dir_fd, 0, "file", 0, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .unwrap(); let buffer = &[0u8; 100]; - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: buffer.as_ptr(), buf_len: buffer.len(), }; - let nwritten = wasi::fd_pwrite(f, &[ciovec], 0).expect("write failed"); + let nwritten = wasip1::fd_pwrite(f, &[ciovec], 0).expect("write failed"); assert_eq!(nwritten, 100); - wasi::fd_close(f).unwrap(); + wasip1::fd_close(f).unwrap(); } - wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_path_open_missing.rs b/crates/test-programs/src/bin/preview1_path_open_missing.rs index 78a1623a89..cef1ad9daa 100644 --- a/crates/test-programs/src/bin/preview1_path_open_missing.rs +++ b/crates/test-programs/src/bin/preview1_path_open_missing.rs @@ -1,14 +1,14 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, open_scratch_directory}; -unsafe fn test_path_open_missing(dir_fd: wasi::Fd) { +unsafe fn test_path_open_missing(dir_fd: wasip1::Fd) { assert_errno!( - wasi::path_open( + wasip1::path_open( dir_fd, 0, "file", 0, // not passing O_CREAT here 0, 0, 0, ) .expect_err("trying to open a file that doesn't exist"), - wasi::ERRNO_NOENT + wasip1::ERRNO_NOENT ); } diff --git a/crates/test-programs/src/bin/preview1_path_open_nonblock.rs b/crates/test-programs/src/bin/preview1_path_open_nonblock.rs index 9c8b85f59d..23f5a9f552 100644 --- a/crates/test-programs/src/bin/preview1_path_open_nonblock.rs +++ b/crates/test-programs/src/bin/preview1_path_open_nonblock.rs @@ -1,9 +1,9 @@ use std::{env, process}; use test_programs::preview1::open_scratch_directory; -unsafe fn try_path_open(dir_fd: wasi::Fd) { - let _fd = - wasi::path_open(dir_fd, 0, ".", 0, 0, 0, wasi::FDFLAGS_NONBLOCK).expect("opening the dir"); +unsafe fn try_path_open(dir_fd: wasip1::Fd) { + let _fd = wasip1::path_open(dir_fd, 0, ".", 0, 0, 0, wasip1::FDFLAGS_NONBLOCK) + .expect("opening the dir"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_path_open_preopen.rs b/crates/test-programs/src/bin/preview1_path_open_preopen.rs index 218446bd8a..251e20280c 100644 --- a/crates/test-programs/src/bin/preview1_path_open_preopen.rs +++ b/crates/test-programs/src/bin/preview1_path_open_preopen.rs @@ -1,18 +1,18 @@ const FIRST_PREOPEN: u32 = 3; unsafe fn path_open_preopen() { - let prestat = wasi::fd_prestat_get(FIRST_PREOPEN).expect("fd 3 is a preopen"); + let prestat = wasip1::fd_prestat_get(FIRST_PREOPEN).expect("fd 3 is a preopen"); assert_eq!( prestat.tag, - wasi::PREOPENTYPE_DIR.raw(), + wasip1::PREOPENTYPE_DIR.raw(), "prestat is a directory" ); let mut dst = Vec::with_capacity(prestat.u.dir.pr_name_len); - wasi::fd_prestat_dir_name(FIRST_PREOPEN, dst.as_mut_ptr(), dst.capacity()) + wasip1::fd_prestat_dir_name(FIRST_PREOPEN, dst.as_mut_ptr(), dst.capacity()) .expect("get preopen dir name"); dst.set_len(prestat.u.dir.pr_name_len); - let fdstat = wasi::fd_fdstat_get(FIRST_PREOPEN).expect("get fdstat"); + let fdstat = wasip1::fd_fdstat_get(FIRST_PREOPEN).expect("get fdstat"); println!( "preopen dir: {:?} base {:?} inheriting {:?}", @@ -34,7 +34,7 @@ unsafe fn path_open_preopen() { } // Open with same rights it has now: - let _ = wasi::path_open( + let _ = wasip1::path_open( FIRST_PREOPEN, 0, ".", @@ -46,19 +46,19 @@ unsafe fn path_open_preopen() { .expect("open with same rights"); // Open with an empty set of rights: - let _ = wasi::path_open(FIRST_PREOPEN, 0, ".", 0, 0, 0, 0).expect("open with empty rights"); + let _ = wasip1::path_open(FIRST_PREOPEN, 0, ".", 0, 0, 0, 0).expect("open with empty rights"); // Open OFLAGS_DIRECTORY with an empty set of rights: - let _ = wasi::path_open(FIRST_PREOPEN, 0, ".", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + let _ = wasip1::path_open(FIRST_PREOPEN, 0, ".", wasip1::OFLAGS_DIRECTORY, 0, 0, 0) .expect("open with O_DIRECTORY empty rights"); // Open OFLAGS_DIRECTORY with just the read right: - let _ = wasi::path_open( + let _ = wasip1::path_open( FIRST_PREOPEN, 0, ".", - wasi::OFLAGS_DIRECTORY, - wasi::RIGHTS_FD_READ, + wasip1::OFLAGS_DIRECTORY, + wasip1::RIGHTS_FD_READ, 0, 0, ) @@ -66,12 +66,12 @@ unsafe fn path_open_preopen() { if !test_programs::preview1::config().errno_expect_windows() { // Open OFLAGS_DIRECTORY and read/write rights should fail with isdir: - let err = wasi::path_open( + let err = wasip1::path_open( FIRST_PREOPEN, 0, ".", - wasi::OFLAGS_DIRECTORY, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_DIRECTORY, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) @@ -79,17 +79,17 @@ unsafe fn path_open_preopen() { .expect("open with O_DIRECTORY and read/write should fail"); assert_eq!( err, - wasi::ERRNO_ISDIR, + wasip1::ERRNO_ISDIR, "opening directory read/write should fail with ISDIR" ); } else { // Open OFLAGS_DIRECTORY and read/write rights will succeed, only on windows: - let _ = wasi::path_open( + let _ = wasip1::path_open( FIRST_PREOPEN, 0, ".", - wasi::OFLAGS_DIRECTORY, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_DIRECTORY, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) @@ -108,46 +108,58 @@ fn main() { // implementations expect (at least) this set of rights to be present on all // directories: -fn directory_base_rights() -> Vec<(wasi::Rights, &'static str)> { +fn directory_base_rights() -> Vec<(wasip1::Rights, &'static str)> { vec![ - (wasi::RIGHTS_PATH_CREATE_DIRECTORY, "PATH_CREATE_DIRECTORY"), - (wasi::RIGHTS_PATH_CREATE_FILE, "PATH_CREATE_FILE"), - (wasi::RIGHTS_PATH_LINK_SOURCE, "PATH_LINK_SOURCE"), - (wasi::RIGHTS_PATH_LINK_TARGET, "PATH_LINK_TARGET"), - (wasi::RIGHTS_PATH_OPEN, "PATH_OPEN"), - (wasi::RIGHTS_FD_READDIR, "FD_READDIR"), - (wasi::RIGHTS_PATH_READLINK, "PATH_READLINK"), - (wasi::RIGHTS_PATH_RENAME_SOURCE, "PATH_RENAME_SOURCE"), - (wasi::RIGHTS_PATH_RENAME_TARGET, "PATH_RENAME_TARGET"), - (wasi::RIGHTS_PATH_SYMLINK, "PATH_SYMLINK"), - (wasi::RIGHTS_PATH_REMOVE_DIRECTORY, "PATH_REMOVE_DIRECTORY"), - (wasi::RIGHTS_PATH_UNLINK_FILE, "PATH_UNLINK_FILE"), - (wasi::RIGHTS_PATH_FILESTAT_GET, "PATH_FILESTAT_GET"), ( - wasi::RIGHTS_PATH_FILESTAT_SET_TIMES, + wasip1::RIGHTS_PATH_CREATE_DIRECTORY, + "PATH_CREATE_DIRECTORY", + ), + (wasip1::RIGHTS_PATH_CREATE_FILE, "PATH_CREATE_FILE"), + (wasip1::RIGHTS_PATH_LINK_SOURCE, "PATH_LINK_SOURCE"), + (wasip1::RIGHTS_PATH_LINK_TARGET, "PATH_LINK_TARGET"), + (wasip1::RIGHTS_PATH_OPEN, "PATH_OPEN"), + (wasip1::RIGHTS_FD_READDIR, "FD_READDIR"), + (wasip1::RIGHTS_PATH_READLINK, "PATH_READLINK"), + (wasip1::RIGHTS_PATH_RENAME_SOURCE, "PATH_RENAME_SOURCE"), + (wasip1::RIGHTS_PATH_RENAME_TARGET, "PATH_RENAME_TARGET"), + (wasip1::RIGHTS_PATH_SYMLINK, "PATH_SYMLINK"), + ( + wasip1::RIGHTS_PATH_REMOVE_DIRECTORY, + "PATH_REMOVE_DIRECTORY", + ), + (wasip1::RIGHTS_PATH_UNLINK_FILE, "PATH_UNLINK_FILE"), + (wasip1::RIGHTS_PATH_FILESTAT_GET, "PATH_FILESTAT_GET"), + ( + wasip1::RIGHTS_PATH_FILESTAT_SET_TIMES, "PATH_FILESTAT_SET_TIMES", ), - (wasi::RIGHTS_FD_FILESTAT_GET, "FD_FILESTAT_GET"), - (wasi::RIGHTS_FD_FILESTAT_SET_TIMES, "FD_FILESTAT_SET_TIMES"), + (wasip1::RIGHTS_FD_FILESTAT_GET, "FD_FILESTAT_GET"), + ( + wasip1::RIGHTS_FD_FILESTAT_SET_TIMES, + "FD_FILESTAT_SET_TIMES", + ), ] } -pub(crate) fn directory_inheriting_rights() -> Vec<(wasi::Rights, &'static str)> { +pub(crate) fn directory_inheriting_rights() -> Vec<(wasip1::Rights, &'static str)> { let mut rights = directory_base_rights(); rights.extend_from_slice(&[ - (wasi::RIGHTS_FD_DATASYNC, "FD_DATASYNC"), - (wasi::RIGHTS_FD_READ, "FD_READ"), - (wasi::RIGHTS_FD_SEEK, "FD_SEEK"), - (wasi::RIGHTS_FD_FDSTAT_SET_FLAGS, "FD_FDSTAT_SET_FLAGS"), - (wasi::RIGHTS_FD_SYNC, "FD_SYNC"), - (wasi::RIGHTS_FD_TELL, "FD_TELL"), - (wasi::RIGHTS_FD_WRITE, "FD_WRITE"), - (wasi::RIGHTS_FD_ADVISE, "FD_ADVISE"), - (wasi::RIGHTS_FD_ALLOCATE, "FD_ALLOCATE"), - (wasi::RIGHTS_FD_FILESTAT_GET, "FD_FILESTAT_GET"), - (wasi::RIGHTS_FD_FILESTAT_SET_SIZE, "FD_FILESTAT_SET_SIZE"), - (wasi::RIGHTS_FD_FILESTAT_SET_TIMES, "FD_FILESTAT_SET_TIMES"), - (wasi::RIGHTS_POLL_FD_READWRITE, "POLL_FD_READWRITE"), + (wasip1::RIGHTS_FD_DATASYNC, "FD_DATASYNC"), + (wasip1::RIGHTS_FD_READ, "FD_READ"), + (wasip1::RIGHTS_FD_SEEK, "FD_SEEK"), + (wasip1::RIGHTS_FD_FDSTAT_SET_FLAGS, "FD_FDSTAT_SET_FLAGS"), + (wasip1::RIGHTS_FD_SYNC, "FD_SYNC"), + (wasip1::RIGHTS_FD_TELL, "FD_TELL"), + (wasip1::RIGHTS_FD_WRITE, "FD_WRITE"), + (wasip1::RIGHTS_FD_ADVISE, "FD_ADVISE"), + (wasip1::RIGHTS_FD_ALLOCATE, "FD_ALLOCATE"), + (wasip1::RIGHTS_FD_FILESTAT_GET, "FD_FILESTAT_GET"), + (wasip1::RIGHTS_FD_FILESTAT_SET_SIZE, "FD_FILESTAT_SET_SIZE"), + ( + wasip1::RIGHTS_FD_FILESTAT_SET_TIMES, + "FD_FILESTAT_SET_TIMES", + ), + (wasip1::RIGHTS_POLL_FD_READWRITE, "POLL_FD_READWRITE"), ]); rights } diff --git a/crates/test-programs/src/bin/preview1_path_open_read_write.rs b/crates/test-programs/src/bin/preview1_path_open_read_write.rs index c8615a6177..944eb88096 100644 --- a/crates/test-programs/src/bin/preview1_path_open_read_write.rs +++ b/crates/test-programs/src/bin/preview1_path_open_read_write.rs @@ -1,32 +1,32 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, create_file, open_scratch_directory}; -unsafe fn test_path_open_read_write(dir_fd: wasi::Fd) { +unsafe fn test_path_open_read_write(dir_fd: wasip1::Fd) { create_file(dir_fd, "file"); - let f_readonly = wasi::path_open(dir_fd, 0, "file", 0, wasi::RIGHTS_FD_READ, 0, 0) + let f_readonly = wasip1::path_open(dir_fd, 0, "file", 0, wasip1::RIGHTS_FD_READ, 0, 0) .expect("open file readonly"); - let stat = wasi::fd_fdstat_get(f_readonly).expect("get fdstat readonly"); + let stat = wasip1::fd_fdstat_get(f_readonly).expect("get fdstat readonly"); assert!( - stat.fs_rights_base & wasi::RIGHTS_FD_READ == wasi::RIGHTS_FD_READ, + stat.fs_rights_base & wasip1::RIGHTS_FD_READ == wasip1::RIGHTS_FD_READ, "readonly has read right" ); assert!( - stat.fs_rights_base & wasi::RIGHTS_FD_WRITE == 0, + stat.fs_rights_base & wasip1::RIGHTS_FD_WRITE == 0, "readonly does not have write right" ); let buffer = &mut [0u8; 100]; - let iovec = wasi::Iovec { + let iovec = wasip1::Iovec { buf: buffer.as_mut_ptr(), buf_len: buffer.len(), }; - let nread = wasi::fd_read(f_readonly, &[iovec]).expect("reading readonly file"); + let nread = wasip1::fd_read(f_readonly, &[iovec]).expect("reading readonly file"); assert_eq!(nread, 0, "readonly file is empty"); let write_buffer = &[1u8; 50]; - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: write_buffer.as_ptr(), buf_len: write_buffer.len(), }; @@ -34,69 +34,69 @@ unsafe fn test_path_open_read_write(dir_fd: wasi::Fd) { // fails on windows with BADF, so we can't use the `windows =>` syntax // because that doesn't support alternatives like the agnostic syntax does. assert_errno!( - wasi::fd_write(f_readonly, &[ciovec]) + wasip1::fd_write(f_readonly, &[ciovec]) .err() .expect("read of writeonly fails"), - wasi::ERRNO_PERM, - wasi::ERRNO_BADF + wasip1::ERRNO_PERM, + wasip1::ERRNO_BADF ); - wasi::fd_close(f_readonly).expect("close readonly"); + wasip1::fd_close(f_readonly).expect("close readonly"); // =============== WRITE ONLY ================== - let f_writeonly = wasi::path_open(dir_fd, 0, "file", 0, wasi::RIGHTS_FD_WRITE, 0, 0) + let f_writeonly = wasip1::path_open(dir_fd, 0, "file", 0, wasip1::RIGHTS_FD_WRITE, 0, 0) .expect("open file writeonly"); - let stat = wasi::fd_fdstat_get(f_writeonly).expect("get fdstat writeonly"); + let stat = wasip1::fd_fdstat_get(f_writeonly).expect("get fdstat writeonly"); assert!( - stat.fs_rights_base & wasi::RIGHTS_FD_READ == 0, + stat.fs_rights_base & wasip1::RIGHTS_FD_READ == 0, "writeonly does not have read right" ); assert!( - stat.fs_rights_base & wasi::RIGHTS_FD_READDIR == 0, + stat.fs_rights_base & wasip1::RIGHTS_FD_READDIR == 0, "writeonly does not have readdir right" ); assert!( - stat.fs_rights_base & wasi::RIGHTS_FD_WRITE == wasi::RIGHTS_FD_WRITE, + stat.fs_rights_base & wasip1::RIGHTS_FD_WRITE == wasip1::RIGHTS_FD_WRITE, "writeonly has write right" ); // See above for description of PERM assert_errno!( - wasi::fd_read(f_writeonly, &[iovec]) + wasip1::fd_read(f_writeonly, &[iovec]) .err() .expect("read of writeonly fails"), - wasi::ERRNO_PERM, - wasi::ERRNO_BADF + wasip1::ERRNO_PERM, + wasip1::ERRNO_BADF ); - let bytes_written = wasi::fd_write(f_writeonly, &[ciovec]).expect("write to writeonly"); + let bytes_written = wasip1::fd_write(f_writeonly, &[ciovec]).expect("write to writeonly"); assert_eq!(bytes_written, write_buffer.len()); - wasi::fd_close(f_writeonly).expect("close writeonly"); + wasip1::fd_close(f_writeonly).expect("close writeonly"); // ============== READ WRITE ======================= - let f_readwrite = wasi::path_open( + let f_readwrite = wasip1::path_open( dir_fd, 0, "file", 0, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("open file readwrite"); - let stat = wasi::fd_fdstat_get(f_readwrite).expect("get fdstat readwrite"); + let stat = wasip1::fd_fdstat_get(f_readwrite).expect("get fdstat readwrite"); assert!( - stat.fs_rights_base & wasi::RIGHTS_FD_READ == wasi::RIGHTS_FD_READ, + stat.fs_rights_base & wasip1::RIGHTS_FD_READ == wasip1::RIGHTS_FD_READ, "readwrite has read right" ); assert!( - stat.fs_rights_base & wasi::RIGHTS_FD_WRITE == wasi::RIGHTS_FD_WRITE, + stat.fs_rights_base & wasip1::RIGHTS_FD_WRITE == wasip1::RIGHTS_FD_WRITE, "readwrite has write right" ); - let nread = wasi::fd_read(f_readwrite, &[iovec]).expect("reading readwrite file"); + let nread = wasip1::fd_read(f_readwrite, &[iovec]).expect("reading readwrite file"); assert_eq!( nread, write_buffer.len(), @@ -104,23 +104,23 @@ unsafe fn test_path_open_read_write(dir_fd: wasi::Fd) { ); let write_buffer_2 = &[2u8; 25]; - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: write_buffer_2.as_ptr(), buf_len: write_buffer_2.len(), }; - let bytes_written = wasi::fd_write(f_readwrite, &[ciovec]).expect("write to readwrite"); + let bytes_written = wasip1::fd_write(f_readwrite, &[ciovec]).expect("write to readwrite"); assert_eq!(bytes_written, write_buffer_2.len()); - let filestat = wasi::fd_filestat_get(f_readwrite).expect("get filestat readwrite"); + let filestat = wasip1::fd_filestat_get(f_readwrite).expect("get filestat readwrite"); assert_eq!( filestat.size as usize, write_buffer.len() + write_buffer_2.len(), "total written is both write buffers" ); - wasi::fd_close(f_readwrite).expect("close readwrite"); + wasip1::fd_close(f_readwrite).expect("close readwrite"); - wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_path_rename.rs b/crates/test-programs/src/bin/preview1_path_rename.rs index 4430617648..032ac006a2 100644 --- a/crates/test-programs/src/bin/preview1_path_rename.rs +++ b/crates/test-programs/src/bin/preview1_path_rename.rs @@ -1,133 +1,138 @@ use std::{env, process}; -use test_programs::preview1::{assert_errno, create_file, open_scratch_directory}; +use test_programs::preview1::{assert_errno, create_file, open_scratch_directory, TestConfig}; -unsafe fn test_path_rename(dir_fd: wasi::Fd) { +unsafe fn test_path_rename(dir_fd: wasip1::Fd) { // First, try renaming a dir to nonexistent path // Create source directory - wasi::path_create_directory(dir_fd, "source").expect("creating a directory"); + wasip1::path_create_directory(dir_fd, "source").expect("creating a directory"); // Try renaming the directory - wasi::path_rename(dir_fd, "source", dir_fd, "target").expect("renaming a directory"); + wasip1::path_rename(dir_fd, "source", dir_fd, "target").expect("renaming a directory"); // Check that source directory doesn't exist anymore assert_errno!( - wasi::path_open(dir_fd, 0, "source", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "source", wasip1::OFLAGS_DIRECTORY, 0, 0, 0) .expect_err("opening a nonexistent path as a directory should fail"), - wasi::ERRNO_NOENT + wasip1::ERRNO_NOENT ); // Check that target directory exists - let mut fd = wasi::path_open(dir_fd, 0, "target", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + let mut fd = wasip1::path_open(dir_fd, 0, "target", wasip1::OFLAGS_DIRECTORY, 0, 0, 0) .expect("opening renamed path as a directory"); assert!( - fd > libc::STDERR_FILENO as wasi::Fd, + fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::fd_close(fd).expect("closing a file"); - wasi::path_remove_directory(dir_fd, "target").expect("removing a directory"); + wasip1::fd_close(fd).expect("closing a file"); + wasip1::path_remove_directory(dir_fd, "target").expect("removing a directory"); // Now, try renaming renaming a dir to existing empty dir - wasi::path_create_directory(dir_fd, "source").expect("creating a directory"); - wasi::path_create_directory(dir_fd, "target").expect("creating a directory"); - wasi::path_rename(dir_fd, "source", dir_fd, "target").expect("renaming a directory"); + wasip1::path_create_directory(dir_fd, "source").expect("creating a directory"); + wasip1::path_create_directory(dir_fd, "target").expect("creating a directory"); + wasip1::path_rename(dir_fd, "source", dir_fd, "target").expect("renaming a directory"); // Check that source directory doesn't exist anymore assert_errno!( - wasi::path_open(dir_fd, 0, "source", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "source", wasip1::OFLAGS_DIRECTORY, 0, 0, 0) .expect_err("opening a nonexistent path as a directory"), - wasi::ERRNO_NOENT + wasip1::ERRNO_NOENT ); // Check that target directory exists - fd = wasi::path_open(dir_fd, 0, "target", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + fd = wasip1::path_open(dir_fd, 0, "target", wasip1::OFLAGS_DIRECTORY, 0, 0, 0) .expect("opening renamed path as a directory"); assert!( - fd > libc::STDERR_FILENO as wasi::Fd, + fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::fd_close(fd).expect("closing a file"); - wasi::path_remove_directory(dir_fd, "target").expect("removing a directory"); + wasip1::fd_close(fd).expect("closing a file"); + wasip1::path_remove_directory(dir_fd, "target").expect("removing a directory"); // Now, try renaming a dir to existing non-empty dir - wasi::path_create_directory(dir_fd, "source").expect("creating a directory"); - wasi::path_create_directory(dir_fd, "target").expect("creating a directory"); + wasip1::path_create_directory(dir_fd, "source").expect("creating a directory"); + wasip1::path_create_directory(dir_fd, "target").expect("creating a directory"); create_file(dir_fd, "target/file"); assert_errno!( - wasi::path_rename(dir_fd, "source", dir_fd, "target") + wasip1::path_rename(dir_fd, "source", dir_fd, "target") .expect_err("renaming directory to a nonempty directory"), - wasi::ERRNO_NOTEMPTY + wasip1::ERRNO_NOTEMPTY ); // Try renaming dir to a file - assert_errno!( - wasi::path_rename(dir_fd, "source", dir_fd, "target/file") - .expect_err("renaming a directory to a file"), - wasi::ERRNO_NOTDIR - ); - wasi::path_unlink_file(dir_fd, "target/file").expect("removing a file"); - wasi::path_remove_directory(dir_fd, "source").expect("removing a directory"); - wasi::path_remove_directory(dir_fd, "target").expect("removing a directory"); + if TestConfig::from_env().support_rename_dir_onto_file() { + wasip1::path_rename(dir_fd, "source", dir_fd, "target/file").unwrap(); + wasip1::path_remove_directory(dir_fd, "target/file").expect("removing a directory"); + } else { + assert_errno!( + wasip1::path_rename(dir_fd, "source", dir_fd, "target/file") + .expect_err("renaming a directory to a file"), + wasip1::ERRNO_NOTDIR + ); + wasip1::path_unlink_file(dir_fd, "target/file").expect("removing a file"); + wasip1::path_remove_directory(dir_fd, "source").expect("removing a directory"); + } + wasip1::path_remove_directory(dir_fd, "target").expect("removing a directory"); // Now, try renaming a file to a nonexistent path create_file(dir_fd, "source"); - wasi::path_rename(dir_fd, "source", dir_fd, "target").expect("renaming a file"); + wasip1::path_rename(dir_fd, "source", dir_fd, "target").expect("renaming a file"); // Check that source file doesn't exist anymore assert_errno!( - wasi::path_open(dir_fd, 0, "source", 0, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "source", 0, 0, 0, 0) .expect_err("opening a nonexistent path should fail"), - wasi::ERRNO_NOENT + wasip1::ERRNO_NOENT ); // Check that target file exists - fd = wasi::path_open(dir_fd, 0, "target", 0, 0, 0, 0).expect("opening renamed path"); + fd = wasip1::path_open(dir_fd, 0, "target", 0, 0, 0, 0).expect("opening renamed path"); assert!( - fd > libc::STDERR_FILENO as wasi::Fd, + fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::fd_close(fd).expect("closing a file"); - wasi::path_unlink_file(dir_fd, "target").expect("removing a file"); + wasip1::fd_close(fd).expect("closing a file"); + wasip1::path_unlink_file(dir_fd, "target").expect("removing a file"); // Now, try renaming file to an existing file create_file(dir_fd, "source"); create_file(dir_fd, "target"); - wasi::path_rename(dir_fd, "source", dir_fd, "target") + wasip1::path_rename(dir_fd, "source", dir_fd, "target") .expect("renaming file to another existing file"); // Check that source file doesn't exist anymore assert_errno!( - wasi::path_open(dir_fd, 0, "source", 0, 0, 0, 0).expect_err("opening a nonexistent path"), - wasi::ERRNO_NOENT + wasip1::path_open(dir_fd, 0, "source", 0, 0, 0, 0).expect_err("opening a nonexistent path"), + wasip1::ERRNO_NOENT ); // Check that target file exists - fd = wasi::path_open(dir_fd, 0, "target", 0, 0, 0, 0).expect("opening renamed path"); + fd = wasip1::path_open(dir_fd, 0, "target", 0, 0, 0, 0).expect("opening renamed path"); assert!( - fd > libc::STDERR_FILENO as wasi::Fd, + fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::fd_close(fd).expect("closing a file"); - wasi::path_unlink_file(dir_fd, "target").expect("removing a file"); + wasip1::fd_close(fd).expect("closing a file"); + wasip1::path_unlink_file(dir_fd, "target").expect("removing a file"); // Try renaming to an (empty) directory instead create_file(dir_fd, "source"); - wasi::path_create_directory(dir_fd, "target").expect("creating a directory"); + wasip1::path_create_directory(dir_fd, "target").expect("creating a directory"); assert_errno!( - wasi::path_rename(dir_fd, "source", dir_fd, "target") + wasip1::path_rename(dir_fd, "source", dir_fd, "target") .expect_err("renaming a file to existing directory should fail"), - windows => wasi::ERRNO_ACCES, - unix => wasi::ERRNO_ISDIR + windows => wasip1::ERRNO_ACCES, + unix => wasip1::ERRNO_ISDIR ); - wasi::path_remove_directory(dir_fd, "target").expect("removing a directory"); - wasi::path_unlink_file(dir_fd, "source").expect("removing a file"); + wasip1::path_remove_directory(dir_fd, "target").expect("removing a directory"); + wasip1::path_unlink_file(dir_fd, "source").expect("removing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_path_rename_dir_trailing_slashes.rs b/crates/test-programs/src/bin/preview1_path_rename_dir_trailing_slashes.rs index a5d2dd51a6..4d67a793c6 100644 --- a/crates/test-programs/src/bin/preview1_path_rename_dir_trailing_slashes.rs +++ b/crates/test-programs/src/bin/preview1_path_rename_dir_trailing_slashes.rs @@ -1,18 +1,18 @@ use std::{env, process}; use test_programs::preview1::open_scratch_directory; -unsafe fn test_path_rename_trailing_slashes(dir_fd: wasi::Fd) { +unsafe fn test_path_rename_trailing_slashes(dir_fd: wasip1::Fd) { // Test renaming a directory with a trailing slash in the name. - wasi::path_create_directory(dir_fd, "source").expect("creating a directory"); - wasi::path_rename(dir_fd, "source/", dir_fd, "target") + wasip1::path_create_directory(dir_fd, "source").expect("creating a directory"); + wasip1::path_rename(dir_fd, "source/", dir_fd, "target") .expect("renaming a directory with a trailing slash in the source name"); - wasi::path_rename(dir_fd, "target", dir_fd, "source/") + wasip1::path_rename(dir_fd, "target", dir_fd, "source/") .expect("renaming a directory with a trailing slash in the destination name"); - wasi::path_rename(dir_fd, "source/", dir_fd, "target/") + wasip1::path_rename(dir_fd, "source/", dir_fd, "target/") .expect("renaming a directory with a trailing slash in the source and destination names"); - wasi::path_rename(dir_fd, "target", dir_fd, "source") + wasip1::path_rename(dir_fd, "target", dir_fd, "source") .expect("renaming a directory with no trailing slashes at all should work"); - wasi::path_remove_directory(dir_fd, "source").expect("removing the directory"); + wasip1::path_remove_directory(dir_fd, "source").expect("removing the directory"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_path_symlink_trailing_slashes.rs b/crates/test-programs/src/bin/preview1_path_symlink_trailing_slashes.rs index 18d3ace9f2..74d4d1b42d 100644 --- a/crates/test-programs/src/bin/preview1_path_symlink_trailing_slashes.rs +++ b/crates/test-programs/src/bin/preview1_path_symlink_trailing_slashes.rs @@ -1,62 +1,62 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, config, create_file, open_scratch_directory}; -unsafe fn test_path_symlink_trailing_slashes(dir_fd: wasi::Fd) { +unsafe fn test_path_symlink_trailing_slashes(dir_fd: wasip1::Fd) { if config().support_dangling_filesystem() { // Dangling symlink: Link destination shouldn't end with a slash. assert_errno!( - wasi::path_symlink("source", dir_fd, "target/") + wasip1::path_symlink("source", dir_fd, "target/") .expect_err("link destination ending with a slash should fail"), - wasi::ERRNO_NOENT + wasip1::ERRNO_NOENT ); // Dangling symlink: Without the trailing slash, this should succeed. - wasi::path_symlink("source", dir_fd, "target") + wasip1::path_symlink("source", dir_fd, "target") .expect("link destination ending with a slash"); - wasi::path_unlink_file(dir_fd, "target").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "target").expect("removing a file"); } // Link destination already exists, target has trailing slash. - wasi::path_create_directory(dir_fd, "target").expect("creating a directory"); + wasip1::path_create_directory(dir_fd, "target").expect("creating a directory"); assert_errno!( - wasi::path_symlink("source", dir_fd, "target/") + wasip1::path_symlink("source", dir_fd, "target/") .expect_err("link destination already exists"), - unix => wasi::ERRNO_EXIST, - windows => wasi::ERRNO_NOENT + unix => wasip1::ERRNO_EXIST, + windows => wasip1::ERRNO_NOENT ); - wasi::path_remove_directory(dir_fd, "target").expect("removing a directory"); + wasip1::path_remove_directory(dir_fd, "target").expect("removing a directory"); // Link destination already exists, target has no trailing slash. - wasi::path_create_directory(dir_fd, "target").expect("creating a directory"); + wasip1::path_create_directory(dir_fd, "target").expect("creating a directory"); assert_errno!( - wasi::path_symlink("source", dir_fd, "target") + wasip1::path_symlink("source", dir_fd, "target") .expect_err("link destination already exists"), - unix => wasi::ERRNO_EXIST, - windows => wasi::ERRNO_NOENT + unix => wasip1::ERRNO_EXIST, + windows => wasip1::ERRNO_NOENT ); - wasi::path_remove_directory(dir_fd, "target").expect("removing a directory"); + wasip1::path_remove_directory(dir_fd, "target").expect("removing a directory"); // Link destination already exists, target has trailing slash. create_file(dir_fd, "target"); assert_errno!( - wasi::path_symlink("source", dir_fd, "target/") + wasip1::path_symlink("source", dir_fd, "target/") .expect_err("link destination already exists"), - unix => wasi::ERRNO_NOTDIR, - windows => wasi::ERRNO_NOENT + unix => wasip1::ERRNO_NOTDIR, + windows => wasip1::ERRNO_NOENT ); - wasi::path_unlink_file(dir_fd, "target").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "target").expect("removing a file"); // Link destination already exists, target has no trailing slash. create_file(dir_fd, "target"); assert_errno!( - wasi::path_symlink("source", dir_fd, "target") + wasip1::path_symlink("source", dir_fd, "target") .expect_err("link destination already exists"), - unix => wasi::ERRNO_EXIST, - windows => wasi::ERRNO_NOENT + unix => wasip1::ERRNO_EXIST, + windows => wasip1::ERRNO_NOENT ); - wasi::path_unlink_file(dir_fd, "target").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "target").expect("removing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_poll_oneoff_files.rs b/crates/test-programs/src/bin/preview1_poll_oneoff_files.rs index 08bad56e95..c03181a407 100644 --- a/crates/test-programs/src/bin/preview1_poll_oneoff_files.rs +++ b/crates/test-programs/src/bin/preview1_poll_oneoff_files.rs @@ -1,14 +1,16 @@ use std::{env, mem::MaybeUninit, process}; use test_programs::preview1::{assert_errno, open_scratch_directory}; -const CLOCK_ID: wasi::Userdata = 0x0123_45678; +const CLOCK_ID: wasip1::Userdata = 0x0123_45678; -unsafe fn poll_oneoff_impl(r#in: &[wasi::Subscription]) -> Result, wasi::Errno> { - let mut out: Vec = Vec::new(); +unsafe fn poll_oneoff_impl( + r#in: &[wasip1::Subscription], +) -> Result, wasip1::Errno> { + let mut out: Vec = Vec::new(); out.resize_with(r#in.len(), || { - MaybeUninit::::zeroed().assume_init() + MaybeUninit::::zeroed().assume_init() }); - let size = wasi::poll_oneoff(r#in.as_ptr(), out.as_mut_ptr(), r#in.len())?; + let size = wasip1::poll_oneoff(r#in.as_ptr(), out.as_mut_ptr(), r#in.len())?; out.truncate(size); Ok(out) } @@ -16,16 +18,16 @@ unsafe fn poll_oneoff_impl(r#in: &[wasi::Subscription]) -> Result Result, wasi::Errno> { + r#in: &[wasip1::Subscription], +) -> Result, wasip1::Errno> { let mut subscriptions = r#in.to_vec(); let mut events = Vec::new(); while !subscriptions.is_empty() { - let mut out: Vec = Vec::new(); + let mut out: Vec = Vec::new(); out.resize_with(subscriptions.len(), || { - MaybeUninit::::zeroed().assume_init() + MaybeUninit::::zeroed().assume_init() }); - let size = wasi::poll_oneoff( + let size = wasip1::poll_oneoff( subscriptions.as_ptr(), out.as_mut_ptr(), subscriptions.len(), @@ -44,38 +46,38 @@ unsafe fn poll_oneoff_with_retry( unsafe fn test_empty_poll() { let r#in = []; - let mut out: Vec = Vec::new(); + let mut out: Vec = Vec::new(); assert_errno!( - wasi::poll_oneoff(r#in.as_ptr(), out.as_mut_ptr(), r#in.len()) + wasip1::poll_oneoff(r#in.as_ptr(), out.as_mut_ptr(), r#in.len()) .expect_err("empty poll_oneoff should fail"), - wasi::ERRNO_INVAL + wasip1::ERRNO_INVAL ); } unsafe fn test_timeout() { let timeout = 5_000_000u64; // 5 milliseconds - let clock = wasi::SubscriptionClock { - id: wasi::CLOCKID_MONOTONIC, + let clock = wasip1::SubscriptionClock { + id: wasip1::CLOCKID_MONOTONIC, timeout, precision: 0, flags: 0, }; - let r#in = [wasi::Subscription { + let r#in = [wasip1::Subscription { userdata: CLOCK_ID, - u: wasi::SubscriptionU { - tag: wasi::EVENTTYPE_CLOCK.raw(), - u: wasi::SubscriptionUU { clock }, + u: wasip1::SubscriptionU { + tag: wasip1::EVENTTYPE_CLOCK.raw(), + u: wasip1::SubscriptionUU { clock }, }, }]; - let before = wasi::clock_time_get(wasi::CLOCKID_MONOTONIC, 0).unwrap(); + let before = wasip1::clock_time_get(wasip1::CLOCKID_MONOTONIC, 0).unwrap(); let out = poll_oneoff_impl(&r#in).unwrap(); - let after = wasi::clock_time_get(wasi::CLOCKID_MONOTONIC, 0).unwrap(); + let after = wasip1::clock_time_get(wasip1::CLOCKID_MONOTONIC, 0).unwrap(); assert_eq!(out.len(), 1, "should return 1 event"); let event = &out[0]; - assert_errno!(event.error, wasi::ERRNO_SUCCESS); + assert_errno!(event.error, wasip1::ERRNO_SUCCESS); assert_eq!( event.type_, - wasi::EVENTTYPE_CLOCK, + wasip1::EVENTTYPE_CLOCK, "the event.type should equal clock" ); assert_eq!( @@ -92,28 +94,28 @@ unsafe fn test_timeout() { // functions do. unsafe fn test_sleep() { let timeout = 5_000_000u64; // 5 milliseconds - let clock = wasi::SubscriptionClock { - id: wasi::CLOCKID_REALTIME, + let clock = wasip1::SubscriptionClock { + id: wasip1::CLOCKID_REALTIME, timeout, precision: 0, flags: 0, }; - let r#in = [wasi::Subscription { + let r#in = [wasip1::Subscription { userdata: CLOCK_ID, - u: wasi::SubscriptionU { - tag: wasi::EVENTTYPE_CLOCK.raw(), - u: wasi::SubscriptionUU { clock }, + u: wasip1::SubscriptionU { + tag: wasip1::EVENTTYPE_CLOCK.raw(), + u: wasip1::SubscriptionUU { clock }, }, }]; - let before = wasi::clock_time_get(wasi::CLOCKID_MONOTONIC, 0).unwrap(); + let before = wasip1::clock_time_get(wasip1::CLOCKID_MONOTONIC, 0).unwrap(); let out = poll_oneoff_impl(&r#in).unwrap(); - let after = wasi::clock_time_get(wasi::CLOCKID_MONOTONIC, 0).unwrap(); + let after = wasip1::clock_time_get(wasip1::CLOCKID_MONOTONIC, 0).unwrap(); assert_eq!(out.len(), 1, "should return 1 event"); let event = &out[0]; - assert_errno!(event.error, wasi::ERRNO_SUCCESS); + assert_errno!(event.error, wasip1::ERRNO_SUCCESS); assert_eq!( event.type_, - wasi::EVENTTYPE_CLOCK, + wasip1::EVENTTYPE_CLOCK, "the event.type should equal clock" ); assert_eq!( @@ -126,25 +128,29 @@ unsafe fn test_sleep() { ); } -unsafe fn test_fd_readwrite(readable_fd: wasi::Fd, writable_fd: wasi::Fd, error_code: wasi::Errno) { +unsafe fn test_fd_readwrite( + readable_fd: wasip1::Fd, + writable_fd: wasip1::Fd, + error_code: wasip1::Errno, +) { let r#in = [ - wasi::Subscription { + wasip1::Subscription { userdata: 1, - u: wasi::SubscriptionU { - tag: wasi::EVENTTYPE_FD_READ.raw(), - u: wasi::SubscriptionUU { - fd_read: wasi::SubscriptionFdReadwrite { + u: wasip1::SubscriptionU { + tag: wasip1::EVENTTYPE_FD_READ.raw(), + u: wasip1::SubscriptionUU { + fd_read: wasip1::SubscriptionFdReadwrite { file_descriptor: readable_fd, }, }, }, }, - wasi::Subscription { + wasip1::Subscription { userdata: 2, - u: wasi::SubscriptionU { - tag: wasi::EVENTTYPE_FD_WRITE.raw(), - u: wasi::SubscriptionUU { - fd_write: wasi::SubscriptionFdReadwrite { + u: wasip1::SubscriptionU { + tag: wasip1::EVENTTYPE_FD_WRITE.raw(), + u: wasip1::SubscriptionUU { + fd_write: wasip1::SubscriptionFdReadwrite { file_descriptor: writable_fd, }, }, @@ -166,7 +172,7 @@ unsafe fn test_fd_readwrite(readable_fd: wasi::Fd, writable_fd: wasi::Fd, error_ assert_errno!(read.error, error_code); assert_eq!( read.type_, - wasi::EVENTTYPE_FD_READ, + wasip1::EVENTTYPE_FD_READ, "the event.type_ should equal FD_READ" ); assert_eq!( @@ -176,93 +182,94 @@ unsafe fn test_fd_readwrite(readable_fd: wasi::Fd, writable_fd: wasi::Fd, error_ assert_errno!(write.error, error_code); assert_eq!( write.type_, - wasi::EVENTTYPE_FD_WRITE, + wasip1::EVENTTYPE_FD_WRITE, "the event.type_ should equal FD_WRITE" ); } -unsafe fn test_fd_readwrite_valid_fd(dir_fd: wasi::Fd) { +unsafe fn test_fd_readwrite_valid_fd(dir_fd: wasip1::Fd) { // Create a file in the scratch directory. - let nonempty_file = wasi::path_open( + let nonempty_file = wasip1::path_open( dir_fd, 0, "readable_file", - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("create writable file"); // Write to file let contents = &[1u8]; - let ciovec = wasi::Ciovec { + let ciovec = wasip1::Ciovec { buf: contents.as_ptr() as *const _, buf_len: contents.len(), }; - wasi::fd_write(nonempty_file, &[ciovec]).expect("write"); - wasi::fd_close(nonempty_file).expect("close"); + wasip1::fd_write(nonempty_file, &[ciovec]).expect("write"); + wasip1::fd_close(nonempty_file).expect("close"); // Now open the file for reading - let readable_fd = wasi::path_open(dir_fd, 0, "readable_file", 0, wasi::RIGHTS_FD_READ, 0, 0) - .expect("opening a readable file"); + let readable_fd = + wasip1::path_open(dir_fd, 0, "readable_file", 0, wasip1::RIGHTS_FD_READ, 0, 0) + .expect("opening a readable file"); assert!( - readable_fd > libc::STDERR_FILENO as wasi::Fd, + readable_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); // Create a file in the scratch directory. - let writable_fd = wasi::path_open( + let writable_fd = wasip1::path_open( dir_fd, 0, "writable_file", - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("opening a writable file"); assert!( - writable_fd > libc::STDERR_FILENO as wasi::Fd, + writable_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - test_fd_readwrite(readable_fd, writable_fd, wasi::ERRNO_SUCCESS); + test_fd_readwrite(readable_fd, writable_fd, wasip1::ERRNO_SUCCESS); - wasi::fd_close(readable_fd).expect("closing readable_file"); - wasi::fd_close(writable_fd).expect("closing writable_file"); - wasi::path_unlink_file(dir_fd, "readable_file").expect("removing readable_file"); - wasi::path_unlink_file(dir_fd, "writable_file").expect("removing writable_file"); + wasip1::fd_close(readable_fd).expect("closing readable_file"); + wasip1::fd_close(writable_fd).expect("closing writable_file"); + wasip1::path_unlink_file(dir_fd, "readable_file").expect("removing readable_file"); + wasip1::path_unlink_file(dir_fd, "writable_file").expect("removing writable_file"); } unsafe fn test_fd_readwrite_invalid_fd() { - let fd_readwrite = wasi::SubscriptionFdReadwrite { - file_descriptor: wasi::Fd::max_value(), + let fd_readwrite = wasip1::SubscriptionFdReadwrite { + file_descriptor: wasip1::Fd::max_value(), }; let r#in = [ - wasi::Subscription { + wasip1::Subscription { userdata: 1, - u: wasi::SubscriptionU { - tag: wasi::EVENTTYPE_FD_READ.raw(), - u: wasi::SubscriptionUU { + u: wasip1::SubscriptionU { + tag: wasip1::EVENTTYPE_FD_READ.raw(), + u: wasip1::SubscriptionUU { fd_read: fd_readwrite, }, }, }, - wasi::Subscription { + wasip1::Subscription { userdata: 2, - u: wasi::SubscriptionU { - tag: wasi::EVENTTYPE_FD_WRITE.raw(), - u: wasi::SubscriptionUU { + u: wasip1::SubscriptionU { + tag: wasip1::EVENTTYPE_FD_WRITE.raw(), + u: wasip1::SubscriptionUU { fd_write: fd_readwrite, }, }, }, ]; let err = poll_oneoff_impl(&r#in).unwrap_err(); - assert_eq!(err, wasi::ERRNO_BADF) + assert_eq!(err, wasip1::ERRNO_BADF) } -unsafe fn test_poll_oneoff(dir_fd: wasi::Fd) { +unsafe fn test_poll_oneoff(dir_fd: wasip1::Fd) { test_timeout(); test_sleep(); test_empty_poll(); diff --git a/crates/test-programs/src/bin/preview1_poll_oneoff_stdio.rs b/crates/test-programs/src/bin/preview1_poll_oneoff_stdio.rs index 6d0616dcb1..0f5618f573 100644 --- a/crates/test-programs/src/bin/preview1_poll_oneoff_stdio.rs +++ b/crates/test-programs/src/bin/preview1_poll_oneoff_stdio.rs @@ -3,43 +3,45 @@ use std::mem::MaybeUninit; use test_programs::preview1::{assert_errno, STDERR_FD, STDIN_FD, STDOUT_FD}; const TIMEOUT: u64 = 200_000_000u64; // 200 milliseconds, required to satisfy slow execution in CI -const CLOCK_ID: wasi::Userdata = 0x0123_45678; -const STDIN_ID: wasi::Userdata = 0x8765_43210; +const CLOCK_ID: wasip1::Userdata = 0x0123_45678; +const STDIN_ID: wasip1::Userdata = 0x8765_43210; -unsafe fn poll_oneoff_impl(r#in: &[wasi::Subscription]) -> Result, wasi::Errno> { - let mut out: Vec = Vec::new(); +unsafe fn poll_oneoff_impl( + r#in: &[wasip1::Subscription], +) -> Result, wasip1::Errno> { + let mut out: Vec = Vec::new(); out.resize_with(r#in.len(), || { - MaybeUninit::::zeroed().assume_init() + MaybeUninit::::zeroed().assume_init() }); - let size = wasi::poll_oneoff(r#in.as_ptr(), out.as_mut_ptr(), r#in.len())?; + let size = wasip1::poll_oneoff(r#in.as_ptr(), out.as_mut_ptr(), r#in.len())?; out.truncate(size); Ok(out) } unsafe fn test_stdin_read() { - let clock = wasi::SubscriptionClock { - id: wasi::CLOCKID_MONOTONIC, + let clock = wasip1::SubscriptionClock { + id: wasip1::CLOCKID_MONOTONIC, timeout: TIMEOUT, precision: 0, flags: 0, }; - let fd_readwrite = wasi::SubscriptionFdReadwrite { + let fd_readwrite = wasip1::SubscriptionFdReadwrite { file_descriptor: STDIN_FD, }; // Either stdin can be ready for reading, or this poll can timeout. let r#in = [ - wasi::Subscription { + wasip1::Subscription { userdata: CLOCK_ID, - u: wasi::SubscriptionU { - tag: wasi::EVENTTYPE_CLOCK.raw(), - u: wasi::SubscriptionUU { clock }, + u: wasip1::SubscriptionU { + tag: wasip1::EVENTTYPE_CLOCK.raw(), + u: wasip1::SubscriptionUU { clock }, }, }, - wasi::Subscription { + wasip1::Subscription { userdata: STDIN_ID, - u: wasi::SubscriptionU { - tag: wasi::EVENTTYPE_FD_READ.raw(), - u: wasi::SubscriptionUU { + u: wasip1::SubscriptionU { + tag: wasip1::EVENTTYPE_FD_READ.raw(), + u: wasip1::SubscriptionUU { fd_read: fd_readwrite, }, }, @@ -50,14 +52,14 @@ unsafe fn test_stdin_read() { // Both are valid behaviors that depend on the test environment. assert!(out.len() >= 1, "stdin read should return at least 1 event"); for event in out { - if event.type_ == wasi::EVENTTYPE_CLOCK { - assert_errno!(event.error, wasi::ERRNO_SUCCESS); + if event.type_ == wasip1::EVENTTYPE_CLOCK { + assert_errno!(event.error, wasip1::ERRNO_SUCCESS); assert_eq!( event.userdata, CLOCK_ID, "the event.userdata should contain CLOCK_ID", ); - } else if event.type_ == wasi::EVENTTYPE_FD_READ { - assert_errno!(event.error, wasi::ERRNO_SUCCESS); + } else if event.type_ == wasip1::EVENTTYPE_FD_READ { + assert_errno!(event.error, wasip1::ERRNO_SUCCESS); assert_eq!( event.userdata, STDIN_ID, "the event.userdata should contain STDIN_ID", @@ -68,14 +70,14 @@ unsafe fn test_stdin_read() { } } -fn writable_subs(h: &HashMap) -> Vec { +fn writable_subs(h: &HashMap) -> Vec { h.iter() - .map(|(ud, fd)| wasi::Subscription { + .map(|(ud, fd)| wasip1::Subscription { userdata: *ud, - u: wasi::SubscriptionU { - tag: wasi::EVENTTYPE_FD_WRITE.raw(), - u: wasi::SubscriptionUU { - fd_write: wasi::SubscriptionFdReadwrite { + u: wasip1::SubscriptionU { + tag: wasip1::EVENTTYPE_FD_WRITE.raw(), + u: wasip1::SubscriptionUU { + fd_write: wasip1::SubscriptionFdReadwrite { file_descriptor: *fd, }, }, @@ -85,16 +87,16 @@ fn writable_subs(h: &HashMap) -> Vec { } unsafe fn test_stdout_stderr_write() { - let mut writable: HashMap = + let mut writable: HashMap = [(1, STDOUT_FD), (2, STDERR_FD)].into_iter().collect(); - let clock = wasi::Subscription { + let clock = wasip1::Subscription { userdata: CLOCK_ID, - u: wasi::SubscriptionU { - tag: wasi::EVENTTYPE_CLOCK.raw(), - u: wasi::SubscriptionUU { - clock: wasi::SubscriptionClock { - id: wasi::CLOCKID_MONOTONIC, + u: wasip1::SubscriptionU { + tag: wasip1::EVENTTYPE_CLOCK.raw(), + u: wasip1::SubscriptionUU { + clock: wasip1::SubscriptionClock { + id: wasip1::CLOCKID_MONOTONIC, timeout: TIMEOUT, precision: 0, flags: 0, @@ -115,8 +117,8 @@ unsafe fn test_stdout_stderr_write() { CLOCK_ID => timed_out = true, ud => { if let Some(_) = writable.remove(&ud) { - assert_eq!(event.type_, wasi::EVENTTYPE_FD_WRITE); - assert_errno!(event.error, wasi::ERRNO_SUCCESS); + assert_eq!(event.type_, wasip1::EVENTTYPE_FD_WRITE); + assert_errno!(event.error, wasip1::ERRNO_SUCCESS); } else { panic!("Unknown userdata {ud}, pending sub: {writable:?}") } diff --git a/crates/test-programs/src/bin/preview1_readlink.rs b/crates/test-programs/src/bin/preview1_readlink.rs index cba9d9ada7..b1d2f0c44b 100644 --- a/crates/test-programs/src/bin/preview1_readlink.rs +++ b/crates/test-programs/src/bin/preview1_readlink.rs @@ -1,16 +1,16 @@ use std::{env, process}; use test_programs::preview1::{create_file, open_scratch_directory}; -unsafe fn test_readlink(dir_fd: wasi::Fd) { +unsafe fn test_readlink(dir_fd: wasip1::Fd) { // Create a file in the scratch directory. create_file(dir_fd, "target"); // Create a symlink - wasi::path_symlink("target", dir_fd, "symlink").expect("creating a symlink"); + wasip1::path_symlink("target", dir_fd, "symlink").expect("creating a symlink"); // Read link into the buffer let buf = &mut [0u8; 10]; - let bufused = wasi::path_readlink(dir_fd, "symlink", buf.as_mut_ptr(), buf.len()) + let bufused = wasip1::path_readlink(dir_fd, "symlink", buf.as_mut_ptr(), buf.len()) .expect("readlink should succeed"); assert_eq!(bufused, 6, "should use 6 bytes of the buffer"); assert_eq!(&buf[..6], b"target", "buffer should contain 'target'"); @@ -22,28 +22,28 @@ unsafe fn test_readlink(dir_fd: wasi::Fd) { // Read link into smaller buffer than the actual link's length let buf = &mut [0u8; 4]; - let bufused = wasi::path_readlink(dir_fd, "symlink", buf.as_mut_ptr(), buf.len()) + let bufused = wasip1::path_readlink(dir_fd, "symlink", buf.as_mut_ptr(), buf.len()) .expect("readlink with too-small buffer should silently truncate"); assert_eq!(bufused, 4); assert_eq!(buf, b"targ"); // Clean up. - wasi::path_unlink_file(dir_fd, "target").expect("removing a file"); - wasi::path_unlink_file(dir_fd, "symlink").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "target").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "symlink").expect("removing a file"); } -unsafe fn test_incremental_readlink(dir_fd: wasi::Fd) { +unsafe fn test_incremental_readlink(dir_fd: wasip1::Fd) { let filename = "Действие"; create_file(dir_fd, filename); - wasi::path_symlink(filename, dir_fd, "symlink").expect("creating a symlink"); + wasip1::path_symlink(filename, dir_fd, "symlink").expect("creating a symlink"); let mut buf = Vec::new(); loop { if buf.capacity() > 2 * filename.len() { panic!() } - let bufused = wasi::path_readlink(dir_fd, "symlink", buf.as_mut_ptr(), buf.capacity()) + let bufused = wasip1::path_readlink(dir_fd, "symlink", buf.as_mut_ptr(), buf.capacity()) .expect("readlink should succeed"); buf.set_len(bufused); if buf.capacity() > filename.len() { @@ -52,8 +52,8 @@ unsafe fn test_incremental_readlink(dir_fd: wasi::Fd) { } buf = Vec::with_capacity(buf.capacity() + 1); } - wasi::path_unlink_file(dir_fd, filename).expect("removing a file"); - wasi::path_unlink_file(dir_fd, "symlink").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, filename).expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "symlink").expect("removing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_regular_file_isatty.rs b/crates/test-programs/src/bin/preview1_regular_file_isatty.rs index 54f407c0a2..1602583545 100644 --- a/crates/test-programs/src/bin/preview1_regular_file_isatty.rs +++ b/crates/test-programs/src/bin/preview1_regular_file_isatty.rs @@ -1,12 +1,12 @@ use std::{env, process}; use test_programs::preview1::open_scratch_directory; -unsafe fn test_file_isatty(dir_fd: wasi::Fd) { +unsafe fn test_file_isatty(dir_fd: wasip1::Fd) { // Create a file in the scratch directory and test if it's a tty. - let file_fd = - wasi::path_open(dir_fd, 0, "file", wasi::OFLAGS_CREAT, 0, 0, 0).expect("opening a file"); + let file_fd = wasip1::path_open(dir_fd, 0, "file", wasip1::OFLAGS_CREAT, 0, 0, 0) + .expect("opening a file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); assert_eq!( @@ -14,8 +14,8 @@ unsafe fn test_file_isatty(dir_fd: wasi::Fd) { 0, "file is a tty" ); - wasi::fd_close(file_fd).expect("closing a file"); - wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); + wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_remove_directory.rs b/crates/test-programs/src/bin/preview1_remove_directory.rs index 307cbd155e..45649e4d1f 100644 --- a/crates/test-programs/src/bin/preview1_remove_directory.rs +++ b/crates/test-programs/src/bin/preview1_remove_directory.rs @@ -1,12 +1,12 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, create_file, open_scratch_directory}; -unsafe fn test_remove_directory(dir_fd: wasi::Fd) { +unsafe fn test_remove_directory(dir_fd: wasip1::Fd) { // Create a directory in the scratch directory. - wasi::path_create_directory(dir_fd, "dir").expect("creating a directory"); + wasip1::path_create_directory(dir_fd, "dir").expect("creating a directory"); // Test that removing it succeeds. - wasi::path_remove_directory(dir_fd, "dir") + wasip1::path_remove_directory(dir_fd, "dir") .expect("remove_directory on a directory should succeed"); // There isn't consistient behavior across operating systems of whether removing with a @@ -18,19 +18,19 @@ unsafe fn test_remove_directory(dir_fd: wasi::Fd) { // Test that removing it with no trailing slash fails. assert_errno!( - wasi::path_remove_directory(dir_fd, "file") + wasip1::path_remove_directory(dir_fd, "file") .expect_err("remove_directory without a trailing slash on a file should fail"), - wasi::ERRNO_NOTDIR + wasip1::ERRNO_NOTDIR ); // Test that removing it with a trailing slash fails. assert_errno!( - wasi::path_remove_directory(dir_fd, "file/") + wasip1::path_remove_directory(dir_fd, "file/") .expect_err("remove_directory with a trailing slash on a file should fail"), - wasi::ERRNO_NOTDIR + wasip1::ERRNO_NOTDIR ); - wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_remove_nonempty_directory.rs b/crates/test-programs/src/bin/preview1_remove_nonempty_directory.rs index 583c63e5ca..275008139d 100644 --- a/crates/test-programs/src/bin/preview1_remove_nonempty_directory.rs +++ b/crates/test-programs/src/bin/preview1_remove_nonempty_directory.rs @@ -1,24 +1,24 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, open_scratch_directory}; -unsafe fn test_remove_nonempty_directory(dir_fd: wasi::Fd) { +unsafe fn test_remove_nonempty_directory(dir_fd: wasip1::Fd) { // Create a directory in the scratch directory. - wasi::path_create_directory(dir_fd, "dir").expect("creating a directory"); + wasip1::path_create_directory(dir_fd, "dir").expect("creating a directory"); // Create a directory in the directory we just created. - wasi::path_create_directory(dir_fd, "dir/nested").expect("creating a subdirectory"); + wasip1::path_create_directory(dir_fd, "dir/nested").expect("creating a subdirectory"); // Test that attempting to unlink the first directory returns the expected error code. assert_errno!( - wasi::path_remove_directory(dir_fd, "dir") + wasip1::path_remove_directory(dir_fd, "dir") .expect_err("remove_directory on a directory should return ENOTEMPTY"), - wasi::ERRNO_NOTEMPTY + wasip1::ERRNO_NOTEMPTY ); // Removing the directories. - wasi::path_remove_directory(dir_fd, "dir/nested") + wasip1::path_remove_directory(dir_fd, "dir/nested") .expect("remove_directory on a nested directory should succeed"); - wasi::path_remove_directory(dir_fd, "dir").expect("removing a directory"); + wasip1::path_remove_directory(dir_fd, "dir").expect("removing a directory"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_renumber.rs b/crates/test-programs/src/bin/preview1_renumber.rs index 233ab2b586..708eb83266 100644 --- a/crates/test-programs/src/bin/preview1_renumber.rs +++ b/crates/test-programs/src/bin/preview1_renumber.rs @@ -1,59 +1,59 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, open_scratch_directory}; -unsafe fn test_renumber(dir_fd: wasi::Fd) { - let pre_fd: wasi::Fd = (libc::STDERR_FILENO + 1) as wasi::Fd; +unsafe fn test_renumber(dir_fd: wasip1::Fd) { + let pre_fd: wasip1::Fd = (libc::STDERR_FILENO + 1) as wasip1::Fd; assert!(dir_fd > pre_fd, "dir_fd number"); // Create a file in the scratch directory. - let fd_from = wasi::path_open( + let fd_from = wasip1::path_open( dir_fd, 0, "file1", - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("opening a file"); assert!( - fd_from > libc::STDERR_FILENO as wasi::Fd, + fd_from > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); // Get fd_from fdstat attributes let fdstat_from = - wasi::fd_fdstat_get(fd_from).expect("calling fd_fdstat on the open file descriptor"); + wasip1::fd_fdstat_get(fd_from).expect("calling fd_fdstat on the open file descriptor"); // Create another file in the scratch directory. - let fd_to = wasi::path_open( + let fd_to = wasip1::path_open( dir_fd, 0, "file2", - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("opening a file"); assert!( - fd_to > libc::STDERR_FILENO as wasi::Fd, + fd_to > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); // Renumber fd of file1 into fd of file2 - wasi::fd_renumber(fd_from, fd_to).expect("renumbering two descriptors"); + wasip1::fd_renumber(fd_from, fd_to).expect("renumbering two descriptors"); // Ensure that fd_from is closed assert_errno!( - wasi::fd_close(fd_from).expect_err("closing already closed file descriptor"), - wasi::ERRNO_BADF + wasip1::fd_close(fd_from).expect_err("closing already closed file descriptor"), + wasip1::ERRNO_BADF ); // Ensure that fd_to is still open. let fdstat_to = - wasi::fd_fdstat_get(fd_to).expect("calling fd_fdstat on the open file descriptor"); + wasip1::fd_fdstat_get(fd_to).expect("calling fd_fdstat on the open file descriptor"); assert_eq!( fdstat_from.fs_filetype, fdstat_to.fs_filetype, "expected fd_to have the same fdstat as fd_from" @@ -71,7 +71,7 @@ unsafe fn test_renumber(dir_fd: wasi::Fd) { "expected fd_to have the same fdstat as fd_from" ); - wasi::fd_close(fd_to).expect("closing a file"); + wasip1::fd_close(fd_to).expect("closing a file"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_sched_yield.rs b/crates/test-programs/src/bin/preview1_sched_yield.rs index a00ab2991a..4efa8d14c7 100644 --- a/crates/test-programs/src/bin/preview1_sched_yield.rs +++ b/crates/test-programs/src/bin/preview1_sched_yield.rs @@ -1,5 +1,5 @@ unsafe fn test_sched_yield() { - wasi::sched_yield().expect("sched_yield"); + wasip1::sched_yield().expect("sched_yield"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_stdio.rs b/crates/test-programs/src/bin/preview1_stdio.rs index 49d5d430c9..6df06bbe85 100644 --- a/crates/test-programs/src/bin/preview1_stdio.rs +++ b/crates/test-programs/src/bin/preview1_stdio.rs @@ -2,8 +2,8 @@ use test_programs::preview1::{STDERR_FD, STDIN_FD, STDOUT_FD}; unsafe fn test_stdio() { for fd in &[STDIN_FD, STDOUT_FD, STDERR_FD] { - wasi::fd_fdstat_get(*fd).expect("fd_fdstat_get on stdio"); - wasi::fd_renumber(*fd, *fd + 100).expect("renumbering stdio"); + wasip1::fd_fdstat_get(*fd).expect("fd_fdstat_get on stdio"); + wasip1::fd_renumber(*fd, *fd + 100).expect("renumbering stdio"); } } diff --git a/crates/test-programs/src/bin/preview1_symlink_create.rs b/crates/test-programs/src/bin/preview1_symlink_create.rs index fac57a8a49..7af7e1de72 100644 --- a/crates/test-programs/src/bin/preview1_symlink_create.rs +++ b/crates/test-programs/src/bin/preview1_symlink_create.rs @@ -1,19 +1,19 @@ use std::{env, process}; use test_programs::preview1::open_scratch_directory; -unsafe fn create_symlink_to_file(dir_fd: wasi::Fd) { +unsafe fn create_symlink_to_file(dir_fd: wasip1::Fd) { // Create a directory for the symlink to point to. - let target_fd = - wasi::path_open(dir_fd, 0, "target", wasi::OFLAGS_CREAT, 0, 0, 0).expect("creating a file"); - wasi::fd_close(target_fd).expect("closing file"); + let target_fd = wasip1::path_open(dir_fd, 0, "target", wasip1::OFLAGS_CREAT, 0, 0, 0) + .expect("creating a file"); + wasip1::fd_close(target_fd).expect("closing file"); // Create a symlink. - wasi::path_symlink("target", dir_fd, "symlink").expect("creating a symlink"); + wasip1::path_symlink("target", dir_fd, "symlink").expect("creating a symlink"); // Try to open it as a directory without O_NOFOLLOW. - let target_file_via_symlink = wasi::path_open( + let target_file_via_symlink = wasip1::path_open( dir_fd, - wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, + wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "symlink", 0, 0, @@ -22,49 +22,50 @@ unsafe fn create_symlink_to_file(dir_fd: wasi::Fd) { ) .expect("opening a symlink as a directory"); assert!( - target_file_via_symlink > libc::STDERR_FILENO as wasi::Fd, + target_file_via_symlink > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::fd_close(target_file_via_symlink).expect("close the symlink file"); + wasip1::fd_close(target_file_via_symlink).expect("close the symlink file"); // Replace the target directory with a file. - wasi::path_unlink_file(dir_fd, "symlink").expect("removing the symlink"); - wasi::path_unlink_file(dir_fd, "target").expect("removing the target file"); + wasip1::path_unlink_file(dir_fd, "symlink").expect("removing the symlink"); + wasip1::path_unlink_file(dir_fd, "target").expect("removing the target file"); } -unsafe fn create_symlink_to_directory(dir_fd: wasi::Fd) { +unsafe fn create_symlink_to_directory(dir_fd: wasip1::Fd) { // Create a directory for the symlink to point to. - wasi::path_create_directory(dir_fd, "target").expect("creating a dir"); + wasip1::path_create_directory(dir_fd, "target").expect("creating a dir"); // Create a symlink. - wasi::path_symlink("target", dir_fd, "symlink").expect("creating a symlink"); + wasip1::path_symlink("target", dir_fd, "symlink").expect("creating a symlink"); // Try to open it as a directory without O_NOFOLLOW. - let target_dir_via_symlink = wasi::path_open( + let target_dir_via_symlink = wasip1::path_open( dir_fd, - wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, + wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "symlink", - wasi::OFLAGS_DIRECTORY, + wasip1::OFLAGS_DIRECTORY, 0, 0, 0, ) .expect("opening a symlink as a directory"); assert!( - target_dir_via_symlink > libc::STDERR_FILENO as wasi::Fd, + target_dir_via_symlink > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); - wasi::fd_close(target_dir_via_symlink).expect("closing a file"); + wasip1::fd_close(target_dir_via_symlink).expect("closing a file"); // Replace the target directory with a file. - wasi::path_unlink_file(dir_fd, "symlink").expect("remove symlink to directory"); - wasi::path_remove_directory(dir_fd, "target") + wasip1::path_unlink_file(dir_fd, "symlink").expect("remove symlink to directory"); + wasip1::path_remove_directory(dir_fd, "target") .expect("remove_directory on a directory should succeed"); } -unsafe fn create_symlink_to_root(dir_fd: wasi::Fd) { +unsafe fn create_symlink_to_root(dir_fd: wasip1::Fd) { // Create a symlink. - wasi::path_symlink("/", dir_fd, "symlink").expect_err("creating a symlink to an absolute path"); + wasip1::path_symlink("/", dir_fd, "symlink") + .expect_err("creating a symlink to an absolute path"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_symlink_filestat.rs b/crates/test-programs/src/bin/preview1_symlink_filestat.rs index 57ec517d96..3abd1cb524 100644 --- a/crates/test-programs/src/bin/preview1_symlink_filestat.rs +++ b/crates/test-programs/src/bin/preview1_symlink_filestat.rs @@ -1,48 +1,48 @@ use std::{env, process, time::Duration}; use test_programs::preview1::{assert_fs_time_eq, open_scratch_directory, TestConfig}; -unsafe fn test_path_filestat(dir_fd: wasi::Fd) { +unsafe fn test_path_filestat(dir_fd: wasip1::Fd) { let cfg = TestConfig::from_env(); // Create a file in the scratch directory. - let file_fd = wasi::path_open( + let file_fd = wasip1::path_open( dir_fd, 0, "file", - wasi::OFLAGS_CREAT, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + wasip1::OFLAGS_CREAT, + wasip1::RIGHTS_FD_READ | wasip1::RIGHTS_FD_WRITE, 0, 0, ) .expect("opening a file"); assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, + file_fd > libc::STDERR_FILENO as wasip1::Fd, "file descriptor range check", ); // Check file size - let file_stat = wasi::path_filestat_get(dir_fd, 0, "file").expect("reading file stats"); + let file_stat = wasip1::path_filestat_get(dir_fd, 0, "file").expect("reading file stats"); assert_eq!(file_stat.size, 0, "file size should be 0"); // Create a symlink - wasi::path_symlink("file", dir_fd, "symlink").expect("creating symlink to a file"); + wasip1::path_symlink("file", dir_fd, "symlink").expect("creating symlink to a file"); // Check path_filestat_set_times on the symlink itself - let sym_stat = wasi::path_filestat_get(dir_fd, 0, "symlink").expect("reading symlink stats"); + let sym_stat = wasip1::path_filestat_get(dir_fd, 0, "symlink").expect("reading symlink stats"); // Modify mtim of symlink let sym_new_mtim = Duration::from_nanos(sym_stat.mtim) - cfg.fs_time_precision() * 2; - wasi::path_filestat_set_times( + wasip1::path_filestat_set_times( dir_fd, 0, "symlink", 0, sym_new_mtim.as_nanos() as u64, - wasi::FSTFLAGS_MTIM, + wasip1::FSTFLAGS_MTIM, ) .expect("path_filestat_set_times should succeed on symlink"); // Check that symlink mtim motification worked - let modified_sym_stat = wasi::path_filestat_get(dir_fd, 0, "symlink") + let modified_sym_stat = wasip1::path_filestat_get(dir_fd, 0, "symlink") .expect("reading file stats after path_filestat_set_times"); assert_fs_time_eq!( @@ -52,7 +52,7 @@ unsafe fn test_path_filestat(dir_fd: wasi::Fd) { ); // Check that pointee mtim is not modified - let unmodified_file_stat = wasi::path_filestat_get(dir_fd, 0, "file") + let unmodified_file_stat = wasip1::path_filestat_get(dir_fd, 0, "file") .expect("reading file stats after path_filestat_set_times"); assert_eq!( @@ -62,7 +62,7 @@ unsafe fn test_path_filestat(dir_fd: wasi::Fd) { // Now, dereference the symlink let deref_sym_stat = - wasi::path_filestat_get(dir_fd, wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, "symlink") + wasip1::path_filestat_get(dir_fd, wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "symlink") .expect("reading file stats on the dereferenced symlink"); assert_eq!( deref_sym_stat.mtim, file_stat.mtim, @@ -70,17 +70,17 @@ unsafe fn test_path_filestat(dir_fd: wasi::Fd) { ); // Finally, change stat of the original file by dereferencing the symlink - wasi::path_filestat_set_times( + wasip1::path_filestat_set_times( dir_fd, - wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, + wasip1::LOOKUPFLAGS_SYMLINK_FOLLOW, "symlink", 0, sym_stat.mtim, - wasi::FSTFLAGS_MTIM, + wasip1::FSTFLAGS_MTIM, ) .expect("path_filestat_set_times should succeed on setting stat on original file"); - let new_file_stat = wasi::path_filestat_get(dir_fd, 0, "file") + let new_file_stat = wasip1::path_filestat_get(dir_fd, 0, "file") .expect("reading file stats after path_filestat_set_times"); assert_fs_time_eq!( @@ -89,9 +89,9 @@ unsafe fn test_path_filestat(dir_fd: wasi::Fd) { "mtim should change" ); - wasi::fd_close(file_fd).expect("closing a file"); - wasi::path_unlink_file(dir_fd, "symlink").expect("removing a symlink"); - wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); + wasip1::path_unlink_file(dir_fd, "symlink").expect("removing a symlink"); + wasip1::path_unlink_file(dir_fd, "file").expect("removing a file"); } fn main() { let mut args = env::args(); diff --git a/crates/test-programs/src/bin/preview1_symlink_loop.rs b/crates/test-programs/src/bin/preview1_symlink_loop.rs index 8aeb3b9e12..16bc7718d2 100644 --- a/crates/test-programs/src/bin/preview1_symlink_loop.rs +++ b/crates/test-programs/src/bin/preview1_symlink_loop.rs @@ -1,20 +1,20 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, config, open_scratch_directory}; -unsafe fn test_symlink_loop(dir_fd: wasi::Fd) { +unsafe fn test_symlink_loop(dir_fd: wasip1::Fd) { if config().support_dangling_filesystem() { // Create a self-referencing symlink. - wasi::path_symlink("symlink", dir_fd, "symlink").expect("creating a symlink"); + wasip1::path_symlink("symlink", dir_fd, "symlink").expect("creating a symlink"); // Try to open it. assert_errno!( - wasi::path_open(dir_fd, 0, "symlink", 0, 0, 0, 0) + wasip1::path_open(dir_fd, 0, "symlink", 0, 0, 0, 0) .expect_err("opening a self-referencing symlink"), - wasi::ERRNO_LOOP + wasip1::ERRNO_LOOP ); // Clean up. - wasi::path_unlink_file(dir_fd, "symlink").expect("removing a file"); + wasip1::path_unlink_file(dir_fd, "symlink").expect("removing a file"); } } diff --git a/crates/test-programs/src/bin/preview1_unicode_output.rs b/crates/test-programs/src/bin/preview1_unicode_output.rs index 7e88dc27c7..1118170983 100644 --- a/crates/test-programs/src/bin/preview1_unicode_output.rs +++ b/crates/test-programs/src/bin/preview1_unicode_output.rs @@ -2,11 +2,11 @@ use test_programs::preview1::STDOUT_FD; fn main() { let text = "مرحبا بكم\n"; - let ciovecs = [wasi::Ciovec { + let ciovecs = [wasip1::Ciovec { buf: text.as_bytes().as_ptr(), buf_len: text.as_bytes().len(), }]; - let written = unsafe { wasi::fd_write(STDOUT_FD, &ciovecs) }.expect("write succeeds"); + let written = unsafe { wasip1::fd_write(STDOUT_FD, &ciovecs) }.expect("write succeeds"); assert_eq!( written, text.as_bytes().len(), diff --git a/crates/test-programs/src/bin/preview1_unlink_file_trailing_slashes.rs b/crates/test-programs/src/bin/preview1_unlink_file_trailing_slashes.rs index 9e27dab05d..ee5c3cd2bc 100644 --- a/crates/test-programs/src/bin/preview1_unlink_file_trailing_slashes.rs +++ b/crates/test-programs/src/bin/preview1_unlink_file_trailing_slashes.rs @@ -1,43 +1,43 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, create_file, open_scratch_directory}; -unsafe fn test_unlink_file_trailing_slashes(dir_fd: wasi::Fd) { +unsafe fn test_unlink_file_trailing_slashes(dir_fd: wasip1::Fd) { // Create a directory in the scratch directory. - wasi::path_create_directory(dir_fd, "dir").expect("creating a directory"); + wasip1::path_create_directory(dir_fd, "dir").expect("creating a directory"); // Test that unlinking it fails. assert_errno!( - wasi::path_unlink_file(dir_fd, "dir") + wasip1::path_unlink_file(dir_fd, "dir") .expect_err("unlink_file on a directory should fail"), - macos => wasi::ERRNO_PERM, - unix => wasi::ERRNO_ISDIR, - windows => wasi::ERRNO_ACCES + macos => wasip1::ERRNO_PERM, + unix => wasip1::ERRNO_ISDIR, + windows => wasip1::ERRNO_ACCES ); // Test that unlinking it with a trailing flash fails. assert_errno!( - wasi::path_unlink_file(dir_fd, "dir/") + wasip1::path_unlink_file(dir_fd, "dir/") .expect_err("unlink_file on a directory should fail"), - macos => wasi::ERRNO_PERM, - unix => wasi::ERRNO_ISDIR, - windows => wasi::ERRNO_ACCES + macos => wasip1::ERRNO_PERM, + unix => wasip1::ERRNO_ISDIR, + windows => wasip1::ERRNO_ACCES ); // Clean up. - wasi::path_remove_directory(dir_fd, "dir").expect("removing a directory"); + wasip1::path_remove_directory(dir_fd, "dir").expect("removing a directory"); // Create a temporary file. create_file(dir_fd, "file"); // Test that unlinking it with a trailing flash fails. assert_errno!( - wasi::path_unlink_file(dir_fd, "file/") + wasip1::path_unlink_file(dir_fd, "file/") .expect_err("unlink_file with a trailing slash should fail"), - wasi::ERRNO_NOTDIR + wasip1::ERRNO_NOTDIR ); // Test that unlinking it with no trailing flash succeeds. - wasi::path_unlink_file(dir_fd, "file") + wasip1::path_unlink_file(dir_fd, "file") .expect("unlink_file with no trailing slash should succeed"); } diff --git a/crates/test-programs/src/bin/preview2_adapter_badfd.rs b/crates/test-programs/src/bin/preview2_adapter_badfd.rs index 9887c368ce..36caba3d00 100644 --- a/crates/test-programs/src/bin/preview2_adapter_badfd.rs +++ b/crates/test-programs/src/bin/preview2_adapter_badfd.rs @@ -2,45 +2,48 @@ fn main() { #[link(wasm_import_module = "wasi_snapshot_preview1")] unsafe extern "C" { #[cfg_attr(target_arch = "wasm32", link_name = "adapter_open_badfd")] - fn adapter_open_badfd(fd: *mut u32) -> wasi::Errno; + fn adapter_open_badfd(fd: *mut u32) -> wasip1::Errno; #[cfg_attr(target_arch = "wasm32", link_name = "adapter_close_badfd")] - fn adapter_close_badfd(fd: u32) -> wasi::Errno; + fn adapter_close_badfd(fd: u32) -> wasip1::Errno; } unsafe { let mut fd = 0; - assert_eq!(adapter_open_badfd(&mut fd), wasi::ERRNO_SUCCESS); + assert_eq!(adapter_open_badfd(&mut fd), wasip1::ERRNO_SUCCESS); - assert_eq!(wasi::fd_close(fd), Err(wasi::ERRNO_BADF)); + assert_eq!(wasip1::fd_close(fd), Err(wasip1::ERRNO_BADF)); - assert_eq!(wasi::fd_fdstat_get(fd).map(drop), Err(wasi::ERRNO_BADF)); + assert_eq!(wasip1::fd_fdstat_get(fd).map(drop), Err(wasip1::ERRNO_BADF)); - assert_eq!(wasi::fd_fdstat_set_rights(fd, 0, 0), Err(wasi::ERRNO_BADF)); + assert_eq!( + wasip1::fd_fdstat_set_rights(fd, 0, 0), + Err(wasip1::ERRNO_BADF) + ); let mut buffer = [0_u8; 1]; assert_eq!( - wasi::fd_read( + wasip1::fd_read( fd, - &[wasi::Iovec { + &[wasip1::Iovec { buf: buffer.as_mut_ptr(), buf_len: 1 }] ), - Err(wasi::ERRNO_BADF) + Err(wasip1::ERRNO_BADF) ); assert_eq!( - wasi::fd_write( + wasip1::fd_write( fd, - &[wasi::Ciovec { + &[wasip1::Ciovec { buf: buffer.as_ptr(), buf_len: 1 }] ), - Err(wasi::ERRNO_BADF) + Err(wasip1::ERRNO_BADF) ); - assert_eq!(adapter_close_badfd(fd), wasi::ERRNO_SUCCESS); + assert_eq!(adapter_close_badfd(fd), wasip1::ERRNO_SUCCESS); } } diff --git a/crates/test-programs/src/bin/preview2_random.rs b/crates/test-programs/src/bin/preview2_random.rs index 491037d657..9d437cbc4b 100644 --- a/crates/test-programs/src/bin/preview2_random.rs +++ b/crates/test-programs/src/bin/preview2_random.rs @@ -2,7 +2,9 @@ use test_programs::wasi::random; fn main() { let mut bytes = [0_u8; 256]; - getrandom::getrandom(&mut bytes).unwrap(); + unsafe { + wasip1::random_get(bytes.as_mut_ptr(), bytes.len()).unwrap(); + } assert!(bytes.iter().any(|x| *x != 0)); diff --git a/crates/test-programs/src/bin/random_0_3_imports.rs b/crates/test-programs/src/bin/random_0_3_imports.rs index 8e3549da41..c7aca55b6c 100644 --- a/crates/test-programs/src/bin/random_0_3_imports.rs +++ b/crates/test-programs/src/bin/random_0_3_imports.rs @@ -7,7 +7,9 @@ test_programs::p3::export!(Component); impl test_programs::p3::exports::wasi::cli::run::Guest for Component { async fn run() -> Result<(), ()> { let mut bytes = [0_u8; 256]; - getrandom::getrandom(&mut bytes).unwrap(); + unsafe { + wasip1::random_get(bytes.as_mut_ptr(), bytes.len()).unwrap(); + } assert!(bytes.iter().any(|x| *x != 0)); diff --git a/crates/test-programs/src/bin/tls_sample_application.rs b/crates/test-programs/src/bin/tls_sample_application.rs new file mode 100644 index 0000000000..4c7f306a43 --- /dev/null +++ b/crates/test-programs/src/bin/tls_sample_application.rs @@ -0,0 +1,96 @@ +use anyhow::{anyhow, Context, Result}; +use core::str; +use test_programs::wasi::sockets::network::{IpAddress, IpSocketAddress, Network}; +use test_programs::wasi::sockets::tcp::{ShutdownType, TcpSocket}; +use test_programs::wasi::tls::types::ClientHandshake; + +const PORT: u16 = 443; + +fn test_tls_sample_application(domain: &str, ip: IpAddress) -> Result<()> { + let request = + format!("GET / HTTP/1.1\r\nHost: {domain}\r\nUser-Agent: wasmtime-wasi-rust\r\n\r\n"); + + let net = Network::default(); + + let socket = TcpSocket::new(ip.family()).unwrap(); + let (tcp_input, tcp_output) = socket + .blocking_connect(&net, IpSocketAddress::new(ip, PORT)) + .context("tcp connect failed")?; + + let (client_connection, tls_input, tls_output) = + ClientHandshake::new(domain, tcp_input, tcp_output) + .blocking_finish() + .context("tls handshake failed")?; + + tls_output + .blocking_write_util(request.as_bytes()) + .context("writing http request failed")?; + client_connection + .blocking_close_output(&tls_output) + .context("closing tls connection failed")?; + socket.shutdown(ShutdownType::Send)?; + let response = tls_input + .blocking_read_to_end() + .context("reading http response failed")?; + + if String::from_utf8(response)?.contains("HTTP/1.1 200 OK") { + Ok(()) + } else { + Err(anyhow!("server did not respond with 200 OK")) + } +} + +/// This test sets up a TCP connection using one domain, and then attempts to +/// perform a TLS handshake using another unrelated domain. This should result +/// in a handshake error. +fn test_tls_invalid_certificate(_domain: &str, ip: IpAddress) -> Result<()> { + const BAD_DOMAIN: &'static str = "wrongdomain.localhost"; + + let net = Network::default(); + + let socket = TcpSocket::new(ip.family()).unwrap(); + let (tcp_input, tcp_output) = socket + .blocking_connect(&net, IpSocketAddress::new(ip, PORT)) + .context("tcp connect failed")?; + + match ClientHandshake::new(BAD_DOMAIN, tcp_input, tcp_output).blocking_finish() { + // We're expecting an error regarding the "certificate" is some form or + // another. When we add more TLS backends other than rustls, this naive + // check will likely need to be revisited/expanded: + Err(e) if e.to_debug_string().contains("certificate") => Ok(()), + + Err(e) => Err(e.into()), + Ok(_) => panic!("expecting server name mismatch"), + } +} + +fn try_live_endpoints(test: impl Fn(&str, IpAddress) -> Result<()>) { + // since this is testing remote endpoints to ensure system cert store works + // the test uses a couple different endpoints to reduce the number of flakes + const DOMAINS: &'static [&'static str] = &["example.com", "api.github.com"]; + + let net = Network::default(); + + for &domain in DOMAINS { + let lookup = net + .permissive_blocking_resolve_addresses(domain) + .unwrap() + .first() + .map(|a| a.to_owned()) + .ok_or_else(|| anyhow!("DNS lookup failed.")); + + match lookup.and_then(|ip| test(&domain, ip)) { + Ok(()) => return, + Err(e) => { + eprintln!("test for {domain} failed: {e:#}"); + } + } + } + + panic!("all tests failed"); +} + +fn main() { + try_live_endpoints(test_tls_sample_application); + try_live_endpoints(test_tls_invalid_certificate); +} diff --git a/crates/test-programs/src/lib.rs b/crates/test-programs/src/lib.rs index 8b5315c80e..a69ab4ff92 100644 --- a/crates/test-programs/src/lib.rs +++ b/crates/test-programs/src/lib.rs @@ -4,6 +4,7 @@ pub mod nn; pub mod p3; pub mod preview1; pub mod sockets; +pub mod tls; wit_bindgen::generate!({ inline: " @@ -14,15 +15,17 @@ wit_bindgen::generate!({ include wasi:http/imports@0.2.3; include wasi:config/imports@0.2.0-draft; include wasi:keyvalue/imports@0.2.0-draft; + include wasi:tls/imports@0.2.0-draft; } ", path: [ "../wasi-http/wit", "../wasi-config/wit", "../wasi-keyvalue/wit", + "../wasi-tls/wit/deps/tls@v0.2.0-draft+d6fbdc7", ], world: "wasmtime:test/test", - features: ["cli-exit-with-code"], + features: ["cli-exit-with-code", "tls"], generate_all, }); @@ -47,3 +50,11 @@ pub mod proxy { }, }); } + +impl std::fmt::Display for wasi::io::error::Error { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(&self.to_debug_string()) + } +} + +impl std::error::Error for wasi::io::error::Error {} diff --git a/crates/test-programs/src/preview1.rs b/crates/test-programs/src/preview1.rs index bc327391ed..e49601f635 100644 --- a/crates/test-programs/src/preview1.rs +++ b/crates/test-programs/src/preview1.rs @@ -7,30 +7,32 @@ pub fn config() -> &'static TestConfig { // The `wasi` crate version 0.9.0 and beyond, doesn't // seem to define these constants, so we do it ourselves. -pub const STDIN_FD: wasi::Fd = 0x0; -pub const STDOUT_FD: wasi::Fd = 0x1; -pub const STDERR_FD: wasi::Fd = 0x2; +pub const STDIN_FD: wasip1::Fd = 0x0; +pub const STDOUT_FD: wasip1::Fd = 0x1; +pub const STDERR_FD: wasip1::Fd = 0x2; /// Opens a fresh file descriptor for `path` where `path` should be a preopened /// directory. -pub fn open_scratch_directory(path: &str) -> Result { +pub fn open_scratch_directory(path: &str) -> Result { unsafe { for i in 3.. { - let stat = match wasi::fd_prestat_get(i) { + let stat = match wasip1::fd_prestat_get(i) { Ok(s) => s, Err(_) => break, }; - if stat.tag != wasi::PREOPENTYPE_DIR.raw() { + if stat.tag != wasip1::PREOPENTYPE_DIR.raw() { continue; } let mut dst = Vec::with_capacity(stat.u.dir.pr_name_len); - if wasi::fd_prestat_dir_name(i, dst.as_mut_ptr(), dst.capacity()).is_err() { + if wasip1::fd_prestat_dir_name(i, dst.as_mut_ptr(), dst.capacity()).is_err() { continue; } dst.set_len(stat.u.dir.pr_name_len); if dst == path.as_bytes() { - return Ok(wasi::path_open(i, 0, ".", wasi::OFLAGS_DIRECTORY, 0, 0, 0) - .expect("failed to open dir")); + return Ok( + wasip1::path_open(i, 0, ".", wasip1::OFLAGS_DIRECTORY, 0, 0, 0) + .expect("failed to open dir"), + ); } } @@ -38,11 +40,11 @@ pub fn open_scratch_directory(path: &str) -> Result { } } -pub unsafe fn create_file(dir_fd: wasi::Fd, filename: &str) { - let file_fd = - wasi::path_open(dir_fd, 0, filename, wasi::OFLAGS_CREAT, 0, 0, 0).expect("creating a file"); +pub unsafe fn create_file(dir_fd: wasip1::Fd, filename: &str) { + let file_fd = wasip1::path_open(dir_fd, 0, filename, wasip1::OFLAGS_CREAT, 0, 0, 0) + .expect("creating a file"); assert!(file_fd > STDERR_FD, "file descriptor range check",); - wasi::fd_close(file_fd).expect("closing a file"); + wasip1::fd_close(file_fd).expect("closing a file"); } // Small workaround to get the crate's macros, through the @@ -127,6 +129,7 @@ pub struct TestConfig { fs_time_precision: u64, no_dangling_filesystem: bool, no_rename_dir_to_empty_dir: bool, + rename_dir_onto_file: bool, } enum ErrnoMode { @@ -158,6 +161,7 @@ impl TestConfig { fs_time_precision, no_dangling_filesystem, no_rename_dir_to_empty_dir, + rename_dir_onto_file: std::env::var("RENAME_DIR_ONTO_FILE").is_ok(), } } pub fn errno_expect_unix(&self) -> bool { @@ -187,4 +191,7 @@ impl TestConfig { pub fn support_rename_dir_to_empty_dir(&self) -> bool { !self.no_rename_dir_to_empty_dir } + pub fn support_rename_dir_onto_file(&self) -> bool { + self.rename_dir_onto_file + } } diff --git a/crates/test-programs/src/tls.rs b/crates/test-programs/src/tls.rs new file mode 100644 index 0000000000..68076aa494 --- /dev/null +++ b/crates/test-programs/src/tls.rs @@ -0,0 +1,46 @@ +use crate::wasi::clocks::monotonic_clock; +use crate::wasi::io::error::Error as IoError; +use crate::wasi::io::streams::StreamError; +use crate::wasi::tls::types::{ClientConnection, ClientHandshake, InputStream, OutputStream}; + +const TIMEOUT_NS: u64 = 1_000_000_000; + +impl ClientHandshake { + pub fn blocking_finish(self) -> Result<(ClientConnection, InputStream, OutputStream), IoError> { + let future = ClientHandshake::finish(self); + let timeout = monotonic_clock::subscribe_duration(TIMEOUT_NS * 200); + let pollable = future.subscribe(); + + loop { + match future.get() { + None => pollable.block_until(&timeout).expect("timed out"), + Some(Ok(r)) => return r, + Some(Err(e)) => { + eprintln!("{e:?}"); + unimplemented!() + } + } + } + } +} + +impl ClientConnection { + pub fn blocking_close_output( + &self, + output: &OutputStream, + ) -> Result<(), crate::wasi::io::error::Error> { + let timeout = monotonic_clock::subscribe_duration(TIMEOUT_NS); + let pollable = output.subscribe(); + + self.close_output(); + + loop { + match output.check_write() { + Ok(0) => pollable.block_until(&timeout).expect("timed out"), + Ok(_) => unreachable!("After calling close_output, the output stream should never accept new writes again."), + Err(StreamError::Closed) => return Ok(()), + Err(StreamError::LastOperationFailed(e)) => return Err(e), + } + } + } +} diff --git a/crates/test-util/Cargo.toml b/crates/test-util/Cargo.toml new file mode 100644 index 0000000000..6069d7b257 --- /dev/null +++ b/crates/test-util/Cargo.toml @@ -0,0 +1,67 @@ +[package] +name = "wasmtime-test-util" +version.workspace = true +authors.workspace = true +edition.workspace = true +rust-version.workspace = true +publish = false +description = "Utilities tests in Wasmtime" +license = "Apache-2.0 WITH LLVM-exception" +repository = "https://github.com/bytecodealliance/wasmtime" + +[lints] +workspace = true + +[dependencies] +anyhow = { workspace = true, optional = true } +serde = { workspace = true, optional = true } +serde_derive = { workspace = true, optional = true } +toml = { workspace = true, optional = true } +arbitrary = { workspace = true, optional = true } +quote = { workspace = true, optional = true } +proc-macro2 = { workspace = true, optional = true } +wasmtime-component-util = { workspace = true, optional = true } +wasmtime-environ = { workspace = true, optional = true } +target-lexicon = { workspace = true, optional = true } +env_logger = { workspace = true, optional = true } +wasmtime = { workspace = true, optional = true } +# NB: this crate is compiled both in as a dependency of a proc-macro and as a +# dependency of tests themselves. That means dependencies of this crate are +# compiled twice. Try to ensure "big" dependencies are optional and feature +# gated. + +[features] +wast = [ + 'dep:serde', + 'dep:anyhow', + 'dep:toml', + 'dep:serde_derive', +] +wasmtime-wast = [ + 'dep:wasmtime-environ', + 'wast', + 'dep:wasmtime', + 'wasmtime/cranelift', + 'wasmtime/winch', + 'wasmtime/gc-drc', + 'wasmtime/gc-null', + 'wasmtime/threads', + 'wasmtime/component-model-async', + 'dep:target-lexicon', +] +component = [ + 'dep:anyhow', + 'dep:anyhow', + 'arbitrary/derive', + 'wast', + 'dep:env_logger', + 'dep:wasmtime', + 'wasmtime/component-model', + 'wasmtime/async', +] +component-fuzz = [ + 'dep:arbitrary', + 'dep:quote', + 'dep:proc-macro2', + 'dep:wasmtime-component-util', +] diff --git a/crates/misc/component-test-util/src/lib.rs b/crates/test-util/src/component.rs similarity index 51% rename from crates/misc/component-test-util/src/lib.rs rename to crates/test-util/src/component.rs index 06c0f9e58b..ce85ec5b2b 100644 --- a/crates/misc/component-test-util/src/lib.rs +++ b/crates/test-util/src/component.rs @@ -137,92 +137,3 @@ forward_impls! { Float32 => f32, Float64 => f64, } - -/// Helper method to apply `wast_config` to `config`. -pub fn apply_wast_config(config: &mut Config, wast_config: &wasmtime_wast_util::WastConfig) { - use wasmtime_environ::TripleExt; - use wasmtime_wast_util::{Collector, Compiler}; - - config.strategy(match wast_config.compiler { - Compiler::CraneliftNative | Compiler::CraneliftPulley => wasmtime::Strategy::Cranelift, - Compiler::Winch => wasmtime::Strategy::Winch, - }); - if let Compiler::CraneliftPulley = wast_config.compiler { - config - .target(&target_lexicon::Triple::pulley_host().to_string()) - .unwrap(); - } - config.collector(match wast_config.collector { - Collector::Auto => wasmtime::Collector::Auto, - Collector::Null => wasmtime::Collector::Null, - Collector::DeferredReferenceCounting => wasmtime::Collector::DeferredReferenceCounting, - }); -} - -/// Helper method to apply `test_config` to `config`. -pub fn apply_test_config(config: &mut Config, test_config: &wasmtime_wast_util::TestConfig) { - let wasmtime_wast_util::TestConfig { - memory64, - custom_page_sizes, - multi_memory, - threads, - gc, - function_references, - relaxed_simd, - reference_types, - tail_call, - extended_const, - wide_arithmetic, - cm_async, - cm_async_builtins, - cm_async_stackful, - nan_canonicalization, - simd, - - hogs_memory: _, - gc_types: _, - } = *test_config; - // Note that all of these proposals/features are currently default-off to - // ensure that we annotate all tests accurately with what features they - // need, even in the future when features are stabilized. - let memory64 = memory64.unwrap_or(false); - let custom_page_sizes = custom_page_sizes.unwrap_or(false); - let multi_memory = multi_memory.unwrap_or(false); - let threads = threads.unwrap_or(false); - let gc = gc.unwrap_or(false); - let tail_call = tail_call.unwrap_or(false); - let extended_const = extended_const.unwrap_or(false); - let wide_arithmetic = wide_arithmetic.unwrap_or(false); - let cm_async_builtins = cm_async_builtins.unwrap_or(false); - let cm_async_stackful = cm_async_stackful.unwrap_or(false); - let nan_canonicalization = nan_canonicalization.unwrap_or(false); - let relaxed_simd = relaxed_simd.unwrap_or(false); - - // Some proposals in wasm depend on previous proposals. For example the gc - // proposal depends on function-references which depends on reference-types. - // To avoid needing to enable all of them at once implicitly enable - // downstream proposals once the end proposal is enabled (e.g. when enabling - // gc that also enables function-references and reference-types). - let function_references = gc || function_references.unwrap_or(false); - let reference_types = function_references || reference_types.unwrap_or(false); - let simd = relaxed_simd || simd.unwrap_or(false); - let cm_async = cm_async_builtins || cm_async_stackful || cm_async.unwrap_or(false); - - config - .wasm_multi_memory(multi_memory) - .wasm_threads(threads) - .wasm_memory64(memory64) - .wasm_function_references(function_references) - .wasm_gc(gc) - .wasm_reference_types(reference_types) - .wasm_relaxed_simd(relaxed_simd) - .wasm_simd(simd) - .wasm_tail_call(tail_call) - .wasm_custom_page_sizes(custom_page_sizes) - .wasm_extended_const(extended_const) - .wasm_wide_arithmetic(wide_arithmetic) - .wasm_component_model_async(cm_async) - .wasm_component_model_async_builtins(cm_async_builtins) - .wasm_component_model_async_stackful(cm_async_stackful) - .cranelift_nan_canonicalization(nan_canonicalization); -} diff --git a/crates/misc/component-fuzz-util/src/lib.rs b/crates/test-util/src/component_fuzz.rs similarity index 99% rename from crates/misc/component-fuzz-util/src/lib.rs rename to crates/test-util/src/component_fuzz.rs index a84ff22a9f..b1b44c777b 100644 --- a/crates/misc/component-fuzz-util/src/lib.rs +++ b/crates/test-util/src/component_fuzz.rs @@ -93,7 +93,7 @@ impl Deref for VecInRange { } /// Represents a component model interface type -#[allow(missing_docs, reason = "self-describing")] +#[expect(missing_docs, reason = "self-describing")] #[derive(Debug, Clone)] pub enum Type { Bool, @@ -957,6 +957,6 @@ impl ToTokens for StringEncoding { StringEncoding::Utf16 => quote!(Utf16), StringEncoding::Latin1OrUtf16 => quote!(Latin1OrUtf16), }; - tokens.extend(quote!(component_fuzz_util::StringEncoding::#me)); + tokens.extend(quote!(wasmtime_test_util::component_fuzz::StringEncoding::#me)); } } diff --git a/crates/test-util/src/lib.rs b/crates/test-util/src/lib.rs new file mode 100644 index 0000000000..abd4e677cb --- /dev/null +++ b/crates/test-util/src/lib.rs @@ -0,0 +1,37 @@ +use std::path::Path; +use std::process::Command; + +#[cfg(feature = "component")] +pub mod component; +#[cfg(feature = "component-fuzz")] +pub mod component_fuzz; +#[cfg(feature = "wasmtime-wast")] +pub mod wasmtime_wast; +#[cfg(feature = "wast")] +pub mod wast; + +pub fn cargo_test_runner() -> Option { + // Note that this technically should look for the current target as well + // instead of picking "any runner", but that's left for a future + // refactoring. + let (_, runner) = std::env::vars() + .filter(|(k, _v)| k.starts_with("CARGO_TARGET") && k.ends_with("RUNNER")) + .next()?; + Some(runner) +} + +pub fn command(bin: impl AsRef) -> Command { + let bin = bin.as_ref(); + match cargo_test_runner() { + Some(runner) => { + let mut parts = runner.split_whitespace(); + let mut cmd = Command::new(parts.next().unwrap()); + for arg in parts { + cmd.arg(arg); + } + cmd.arg(bin); + cmd + } + None => Command::new(bin), + } +} diff --git a/crates/test-util/src/wasmtime_wast.rs b/crates/test-util/src/wasmtime_wast.rs new file mode 100644 index 0000000000..fed2440e6f --- /dev/null +++ b/crates/test-util/src/wasmtime_wast.rs @@ -0,0 +1,94 @@ +use crate::wast; +use wasmtime::Config; + +/// Helper method to apply `wast_config` to `config`. +pub fn apply_wast_config(config: &mut Config, wast_config: &wast::WastConfig) { + use wasmtime_environ::TripleExt; + use wast::{Collector, Compiler}; + + config.strategy(match wast_config.compiler { + Compiler::CraneliftNative | Compiler::CraneliftPulley => wasmtime::Strategy::Cranelift, + Compiler::Winch => wasmtime::Strategy::Winch, + }); + if let Compiler::CraneliftPulley = wast_config.compiler { + config + .target(&target_lexicon::Triple::pulley_host().to_string()) + .unwrap(); + } + config.collector(match wast_config.collector { + Collector::Auto => wasmtime::Collector::Auto, + Collector::Null => wasmtime::Collector::Null, + Collector::DeferredReferenceCounting => wasmtime::Collector::DeferredReferenceCounting, + }); +} + +/// Helper method to apply `test_config` to `config`. +pub fn apply_test_config(config: &mut Config, test_config: &wast::TestConfig) { + let wast::TestConfig { + memory64, + custom_page_sizes, + multi_memory, + threads, + gc, + function_references, + relaxed_simd, + reference_types, + tail_call, + extended_const, + wide_arithmetic, + component_model_async, + component_model_async_builtins, + component_model_async_stackful, + component_model_error_context, + nan_canonicalization, + simd, + + hogs_memory: _, + gc_types: _, + } = *test_config; + // Note that all of these proposals/features are currently default-off to + // ensure that we annotate all tests accurately with what features they + // need, even in the future when features are stabilized. + let memory64 = memory64.unwrap_or(false); + let custom_page_sizes = custom_page_sizes.unwrap_or(false); + let multi_memory = multi_memory.unwrap_or(false); + let threads = threads.unwrap_or(false); + let gc = gc.unwrap_or(false); + let tail_call = tail_call.unwrap_or(false); + let extended_const = extended_const.unwrap_or(false); + let wide_arithmetic = wide_arithmetic.unwrap_or(false); + let component_model_async = component_model_async.unwrap_or(false); + let component_model_async_builtins = component_model_async_builtins.unwrap_or(false); + let component_model_async_stackful = component_model_async_stackful.unwrap_or(false); + let component_model_error_context = component_model_error_context.unwrap_or(false); + let nan_canonicalization = nan_canonicalization.unwrap_or(false); + let relaxed_simd = relaxed_simd.unwrap_or(false); + + // Some proposals in wasm depend on previous proposals. For example the gc + // proposal depends on function-references which depends on reference-types. + // To avoid needing to enable all of them at once implicitly enable + // downstream proposals once the end proposal is enabled (e.g. when enabling + // gc that also enables function-references and reference-types). + let function_references = gc || function_references.unwrap_or(false); + let reference_types = function_references || reference_types.unwrap_or(false); + let simd = relaxed_simd || simd.unwrap_or(false); + + config + .wasm_multi_memory(multi_memory) + .wasm_threads(threads) + .wasm_memory64(memory64) + .wasm_function_references(function_references) + .wasm_gc(gc) + .wasm_reference_types(reference_types) + .wasm_relaxed_simd(relaxed_simd) + .wasm_simd(simd) + .wasm_tail_call(tail_call) + .wasm_custom_page_sizes(custom_page_sizes) + .wasm_extended_const(extended_const) + .wasm_wide_arithmetic(wide_arithmetic) + .wasm_component_model_async(component_model_async) + .wasm_component_model_async_builtins(component_model_async_builtins) + .wasm_component_model_async_stackful(component_model_async_stackful) + .wasm_component_model_error_context(component_model_error_context) + .cranelift_nan_canonicalization(nan_canonicalization); +} diff --git a/crates/wast-util/src/lib.rs b/crates/test-util/src/wast.rs similarity index 98% rename from crates/wast-util/src/lib.rs rename to crates/test-util/src/wast.rs index db790bbd90..78f9458293 100644 --- a/crates/wast-util/src/lib.rs +++ b/crates/test-util/src/wast.rs @@ -184,11 +184,12 @@ macro_rules! foreach_config_option { wide_arithmetic hogs_memory nan_canonicalization + component_model_async + component_model_async_builtins + component_model_async_stackful + component_model_error_context simd gc_types - cm_async - cm_async_builtins - cm_async_stackful } }; } @@ -440,6 +441,8 @@ impl WastTest { "misc_testsuite/simd/issue6725-no-egraph-panic.wast", "misc_testsuite/simd/replace-lane-preserve.wast", "misc_testsuite/simd/spillslot-size-fuzzbug.wast", + "misc_testsuite/winch/issue-10331.wast", + "misc_testsuite/winch/replace_lane.wast", "spec_testsuite/simd_align.wast", "spec_testsuite/simd_boolean.wast", "spec_testsuite/simd_conversions.wast", diff --git a/crates/versioned-export-macros/Cargo.toml b/crates/versioned-export-macros/Cargo.toml index 59109a0473..a92be5abbf 100644 --- a/crates/versioned-export-macros/Cargo.toml +++ b/crates/versioned-export-macros/Cargo.toml @@ -12,8 +12,8 @@ version.workspace = true [dependencies] syn = { workspace = true, features = ["full"] } -quote = "1.0" -proc-macro2 = "1.0" +quote = { workspace = true } +proc-macro2 = { workspace = true } [lib] proc-macro = true diff --git a/crates/wasi-common/src/sync/net.rs b/crates/wasi-common/src/sync/net.rs index f35e53c371..ee0d5ddf71 100644 --- a/crates/wasi-common/src/sync/net.rs +++ b/crates/wasi-common/src/sync/net.rs @@ -373,7 +373,9 @@ pub fn get_fd_flags(f: Socketlike) -> io::Result Ok(crate::file::FdFlags::empty()), Err(rustix::io::Errno::WOULDBLOCK) => Ok(crate::file::FdFlags::NONBLOCK), Err(e) => Err(e.into()), diff --git a/crates/wasi-common/src/sync/sched/unix.rs b/crates/wasi-common/src/sync/sched/unix.rs index 6d5bd05899..ac3ccf540c 100644 --- a/crates/wasi-common/src/sync/sched/unix.rs +++ b/crates/wasi-common/src/sync/sched/unix.rs @@ -32,18 +32,20 @@ pub async fn poll_oneoff<'a>(poll: &mut Poll<'a>) -> Result<(), Error> { let ready = loop { let poll_timeout = if let Some(t) = poll.earliest_clock_deadline() { let duration = t.duration_until().unwrap_or(Duration::from_secs(0)); - (duration.as_millis() + 1) // XXX try always rounding up? - .try_into() - .map_err(|_| Error::overflow().context("poll timeout"))? + Some( + duration + .try_into() + .map_err(|_| Error::overflow().context("poll timeout"))?, + ) } else { - std::os::raw::c_int::max_value() + None }; tracing::debug!( poll_timeout = tracing::field::debug(poll_timeout), poll_fds = tracing::field::debug(&pollfds), "poll" ); - match rustix::event::poll(&mut pollfds, poll_timeout) { + match rustix::event::poll(&mut pollfds, poll_timeout.as_ref()) { Ok(ready) => break ready, Err(rustix::io::Errno::INTR) => continue, Err(err) => return Err(std::io::Error::from(err).into()), diff --git a/crates/wasi-http/Cargo.toml b/crates/wasi-http/Cargo.toml index 3339fc1b57..624e69773b 100644 --- a/crates/wasi-http/Cargo.toml +++ b/crates/wasi-http/Cargo.toml @@ -28,12 +28,9 @@ http-body-util = { workspace = true } tracing = { workspace = true } wasmtime-wasi = { workspace = true } wasmtime = { workspace = true, features = ['component-model'] } - -# The `ring` crate, used to implement TLS, does not build on riscv64 or s390x -[target.'cfg(not(any(target_arch = "riscv64", target_arch = "s390x")))'.dependencies] -tokio-rustls = { version = "0.25.0" } -rustls = { version = "0.22.0" } -webpki-roots = { version = "0.26.0" } +tokio-rustls = { workspace = true } +rustls = { workspace = true } +webpki-roots = { workspace = true } [dev-dependencies] test-programs-artifacts = { workspace = true } @@ -43,4 +40,4 @@ wasmtime = { workspace = true, features = ['cranelift'] } tokio = { workspace = true, features = ['macros'] } futures = { workspace = true, default-features = false, features = ['alloc'] } sha2 = "0.10.2" -base64 = "0.21.0" +base64 = { workspace = true } diff --git a/crates/wasi-http/src/lib.rs b/crates/wasi-http/src/lib.rs index 0a9544f7c4..c9bd946c2e 100644 --- a/crates/wasi-http/src/lib.rs +++ b/crates/wasi-http/src/lib.rs @@ -179,10 +179,13 @@ //! // inspect the `task` result to see what happened //! Err(_) => { //! let e = match task.await { -//! Ok(r) => r.unwrap_err(), +//! Ok(Ok(())) => { +//! bail!("guest never invoked `response-outparam::set` method") +//! } +//! Ok(Err(e)) => e, //! Err(e) => e.into(), //! }; -//! bail!("guest never invoked `response-outparam::set` method: {e:?}") +//! return Err(e.context("guest never invoked `response-outparam::set` method")); //! } //! } //! } diff --git a/crates/wasi-http/src/types.rs b/crates/wasi-http/src/types.rs index 7a7b518db5..f510a065c2 100644 --- a/crates/wasi-http/src/types.rs +++ b/crates/wasi-http/src/types.rs @@ -373,58 +373,48 @@ pub async fn default_send_request_handler( })?; let (mut sender, worker) = if use_tls { - #[cfg(any(target_arch = "riscv64", target_arch = "s390x"))] - { - return Err(crate::bindings::http::types::ErrorCode::InternalError( - Some("unsupported architecture for SSL".to_string()), - )); - } + use rustls::pki_types::ServerName; - #[cfg(not(any(target_arch = "riscv64", target_arch = "s390x")))] - { - use rustls::pki_types::ServerName; - - // derived from https://github.com/rustls/rustls/blob/main/examples/src/bin/simpleclient.rs - let root_cert_store = rustls::RootCertStore { - roots: webpki_roots::TLS_SERVER_ROOTS.into(), - }; - let config = rustls::ClientConfig::builder() - .with_root_certificates(root_cert_store) - .with_no_client_auth(); - let connector = tokio_rustls::TlsConnector::from(std::sync::Arc::new(config)); - let mut parts = authority.split(":"); - let host = parts.next().unwrap_or(&authority); - let domain = ServerName::try_from(host) - .map_err(|e| { - tracing::warn!("dns lookup error: {e:?}"); - dns_error("invalid dns name".to_string(), 0) - })? - .to_owned(); - let stream = connector.connect(domain, tcp_stream).await.map_err(|e| { - tracing::warn!("tls protocol error: {e:?}"); - types::ErrorCode::TlsProtocolError - })?; - let stream = TokioIo::new(stream); - - let (sender, conn) = timeout( - connect_timeout, - hyper::client::conn::http1::handshake(stream), - ) - .await - .map_err(|_| types::ErrorCode::ConnectionTimeout)? - .map_err(hyper_request_error)?; - - let worker = wasmtime_wasi::runtime::spawn(async move { - match conn.await { - Ok(()) => {} - // TODO: shouldn't throw away this error and ideally should - // surface somewhere. - Err(e) => tracing::warn!("dropping error {e}"), - } - }); + // derived from https://github.com/rustls/rustls/blob/main/examples/src/bin/simpleclient.rs + let root_cert_store = rustls::RootCertStore { + roots: webpki_roots::TLS_SERVER_ROOTS.into(), + }; + let config = rustls::ClientConfig::builder() + .with_root_certificates(root_cert_store) + .with_no_client_auth(); + let connector = tokio_rustls::TlsConnector::from(std::sync::Arc::new(config)); + let mut parts = authority.split(":"); + let host = parts.next().unwrap_or(&authority); + let domain = ServerName::try_from(host) + .map_err(|e| { + tracing::warn!("dns lookup error: {e:?}"); + dns_error("invalid dns name".to_string(), 0) + })? + .to_owned(); + let stream = connector.connect(domain, tcp_stream).await.map_err(|e| { + tracing::warn!("tls protocol error: {e:?}"); + types::ErrorCode::TlsProtocolError + })?; + let stream = TokioIo::new(stream); - (sender, worker) - } + let (sender, conn) = timeout( + connect_timeout, + hyper::client::conn::http1::handshake(stream), + ) + .await + .map_err(|_| types::ErrorCode::ConnectionTimeout)? + .map_err(hyper_request_error)?; + + let worker = wasmtime_wasi::runtime::spawn(async move { + match conn.await { + Ok(()) => {} + // TODO: shouldn't throw away this error and ideally should + // surface somewhere. + Err(e) => tracing::warn!("dropping error {e}"), + } + }); + + (sender, worker) } else { let tcp_stream = TokioIo::new(tcp_stream); let (sender, conn) = timeout( diff --git a/crates/wasi-http/tests/all/main.rs b/crates/wasi-http/tests/all/main.rs index 0f6c1d7cf4..395d67ab73 100644 --- a/crates/wasi-http/tests/all/main.rs +++ b/crates/wasi-http/tests/all/main.rs @@ -528,8 +528,6 @@ async fn do_wasi_http_echo(uri: &str, url_header: Option<&str>) -> Result<()> { } #[test_log::test(tokio::test)] -// test uses TLS but riscv/s390x don't support that yet -#[cfg_attr(any(target_arch = "riscv64", target_arch = "s390x"), ignore)] async fn wasi_http_without_port() -> Result<()> { let req = hyper::Request::builder() .method(http::Method::GET) diff --git a/crates/wasi-nn/examples/classification-example-named/.gitignore b/crates/wasi-nn/examples/classification-example-named/.gitignore new file mode 100644 index 0000000000..99d0ae58e2 --- /dev/null +++ b/crates/wasi-nn/examples/classification-example-named/.gitignore @@ -0,0 +1,2 @@ +fixture +mobilenet diff --git a/crates/wasi-nn/examples/classification-example-named/README.md b/crates/wasi-nn/examples/classification-example-named/README.md index f0b4e0fa4b..3bdedee756 100644 --- a/crates/wasi-nn/examples/classification-example-named/README.md +++ b/crates/wasi-nn/examples/classification-example-named/README.md @@ -1,2 +1,42 @@ -This example project demonstrates using the `wasi-nn` API to perform ML inference. It consists of Rust code that is -built using the `wasm32-wasip1` target. See `ci/run-wasi-nn-example.sh` for how this is used. +# Named Model Example + +This example is mostly the same as the [`classification-example`] but uses +wasi-nn's "named model" API to load the ML model before the WebAssembly program +executes. Instead of loading the model bytes during program execution (which may +be prohibitively slow for large models), this wasi-nn extension allows the model +to be loaded by the engine prior to execution. + +### Pre-requisites + +The example pre-requisites are mostly the same as that of the +[`classification-example`], except that we separate the model files that the +engine pre-loads (`mobilenet/*`) from the image file read via WASI from the host +(`fixture/*`): + +``` +wget https://download.01.org/openvinotoolkit/fixtures/mobilenet/mobilenet.bin -O mobilenet/model.bin +wget https://download.01.org/openvinotoolkit/fixtures/mobilenet/mobilenet.xml -O mobilenet/model.xml +wget https://download.01.org/openvinotoolkit/fixtures/mobilenet/tensor-1x224x224x3-f32.bgr -O fixture/tensor.bgr +``` + +As before, this Rust [example] compiles to a WebAssembly program using the +`wasm32-wasip1` target: `cargo build --target=wasm32-wasip1`. + +[example]: src/main.rs + +### Run + +The program is invoked with slightly different flags than the +[`classification-example`]: + +``` +//wasmtime run --dir=fixture --wasi=nn --wasi=nn-graph=openvino::mobilenet target/wasm32-wasip1/debug/wasi-nn-example-named.wasm +``` + +The primary difference is the addition of `--wasi=nn-graph=openvino::mobilenet`: +this informs Wasmtime's wasi-nn implementation to pre-load a named model from +the `mobilenet` directory using the `openvino` encoding. Note that, in this +implementation, the model name (i.e., `mobilenet`) is derived from the base name +of the path passed in `--nn-graph=::`. + +[`classification-example`]: ../classification-example diff --git a/crates/wasi-nn/examples/classification-example/.gitignore b/crates/wasi-nn/examples/classification-example/.gitignore new file mode 100644 index 0000000000..ee8c1ee49b --- /dev/null +++ b/crates/wasi-nn/examples/classification-example/.gitignore @@ -0,0 +1 @@ +fixture diff --git a/crates/wasi-nn/examples/classification-example/README.md b/crates/wasi-nn/examples/classification-example/README.md index f0b4e0fa4b..698974c574 100644 --- a/crates/wasi-nn/examples/classification-example/README.md +++ b/crates/wasi-nn/examples/classification-example/README.md @@ -1,2 +1,78 @@ -This example project demonstrates using the `wasi-nn` API to perform ML inference. It consists of Rust code that is -built using the `wasm32-wasip1` target. See `ci/run-wasi-nn-example.sh` for how this is used. +# Image Classification Example + +This example project demonstrates using the `wasi-nn` API to perform machine +learning (ML) inference. It shows how to collect and use the various parts of a +wasi-nn program: +- an ML __framework__ ("backend" in wasi-nn terms) +- an ML __model__ ("graph" terms in wasi-nn terms) +- a WebAssembly __program__ +- a wasi-nn-compatible __engine__ + +### Pre-requisite: Framework + +This example uses the OpenVINO framework: [installation +instructions][openvino-install]. If you're interested in how the engine forwards +calls from the WebAssembly program to this framework, see the +[backend][openvino-backend] source code. + +[openvino-install]: https://docs.openvino.ai/2025/get-started/install-openvino.html +[openvino-backend]: ../../src/backend/openvino.rs + +### Pre-requisite: Model + +MobileNet is a small, common model for classifying images; it returns the +probabilities for words that best describe the image. To retrieve the files +needed to use this model on OpenVINO, download: + +``` +wget https://download.01.org/openvinotoolkit/fixtures/mobilenet/mobilenet.bin -O fixture/model.bin +wget https://download.01.org/openvinotoolkit/fixtures/mobilenet/mobilenet.xml -O fixture/model.xml +wget https://download.01.org/openvinotoolkit/fixtures/mobilenet/tensor-1x224x224x3-f32.bgr -O fixture/tensor.bgr +``` + +The `.bgr` file is a tensor representation of an image file (more details +[here]). + +[here]: https://download.01.org/openvinotoolkit/fixtures/mobilenet + +### Pre-requisite: Program + +Compile this Rust [example] to a WebAssembly program using the `wasm32-wasip1` +target. This requires a Rust toolchain (e.g., [rustup]) and the appropriate +compilation target (e.g., `rustup target add wasm32-wasip1`). To compile the +program to a `*.wasm` file in the `target` directory: + +``` +cargo build --target=wasm32-wasip1 +``` + +[example]: src/main.rs +[rustup]: https://rustup.rs + +### Pre-requisites: Engine + +This example uses Wasmtime, which contains a wasi-nn [implementation][crate]. To +use Wasmtime, follow the instructions to either [build] or [install] it. + +[build]: https://docs.wasmtime.dev/contributing-building.html +[crate]: ../.. +[install]: https://docs.wasmtime.dev/cli-install.html + +### Run + +With the pre-requisites in place, run the example: + +``` +//wasmtime run --wasi=nn --dir=fixture target/wasm32-wasip1/debug/wasi-nn-example.wasm +``` + +Some words of explanation: the `--wasi` flag enables the wasi-nn proposal (see +`-S help`), the `--dir` maps our host-side `fixture` directory to a directory of +the same name in the guest, and we pass the `*.wasm` module as the sole +argument. For this model (see the [source][example]), we expect to see the list +of tags that mostly likely describe the image: + +``` +... +Found results, sorted top 5: [InferenceResult(885, 0.3958254), InferenceResult(904, 0.36464655), InferenceResult(84, 0.010480323), InferenceResult(911, 0.0082290955), InferenceResult(741, 0.007244849)] +``` diff --git a/crates/wasi-nn/src/lib.rs b/crates/wasi-nn/src/lib.rs index 0d3f80f6da..7e012cd741 100644 --- a/crates/wasi-nn/src/lib.rs +++ b/crates/wasi-nn/src/lib.rs @@ -70,9 +70,9 @@ impl std::ops::Deref for Graph { /// https://github.com/WebAssembly/wasi-nn/pull/70). #[derive(Clone, PartialEq)] pub struct Tensor { - dimensions: Vec, - ty: wit::TensorType, - data: Vec, + pub dimensions: Vec, + pub ty: wit::TensorType, + pub data: Vec, } impl fmt::Debug for Tensor { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { diff --git a/crates/wasi-tls/Cargo.toml b/crates/wasi-tls/Cargo.toml new file mode 100644 index 0000000000..7bc7a29c26 --- /dev/null +++ b/crates/wasi-tls/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "wasmtime-wasi-tls" +version.workspace = true +authors.workspace = true +edition.workspace = true +rust-version.workspace = true +repository = "https://github.com/bytecodealliance/wasmtime" +license = "Apache-2.0 WITH LLVM-exception" +description = "Wasmtime implementation of the wasi-tls API" + +[lints] +workspace = true + +[dependencies] +anyhow = { workspace = true } +bytes = { workspace = true } +tokio = { workspace = true, features = [ + "net", + "rt-multi-thread", + "time", +] } +wasmtime = { workspace = true, features = ["runtime", "component-model"] } +wasmtime-wasi = { workspace = true } +tokio-rustls = { workspace = true } +rustls = { workspace = true } +webpki-roots = { workspace = true } + + +[dev-dependencies] +test-programs-artifacts = { workspace = true } +wasmtime-wasi = { workspace = true } +tokio = { workspace = true, features = ["macros"] } +futures = { workspace = true } diff --git a/crates/wasi-tls/src/lib.rs b/crates/wasi-tls/src/lib.rs new file mode 100644 index 0000000000..583d37c2e8 --- /dev/null +++ b/crates/wasi-tls/src/lib.rs @@ -0,0 +1,709 @@ +//! # Wasmtime's [wasi-tls] (Transport Layer Security) Implementation +//! +//! This crate provides the Wasmtime host implementation for the [wasi-tls] API. +//! The [wasi-tls] world allows WebAssembly modules to perform SSL/TLS operations, +//! such as establishing secure connections to servers. TLS often relies on other wasi networking systems +//! to provide the stream so it will be common to enable the [wasi:cli] world as well with the networking features enabled. +//! +//! # An example of how to configure [wasi-tls] is the following: +//! +//! ```rust +//! use wasmtime_wasi::{IoView, WasiCtx, WasiCtxBuilder, WasiView}; +//! use wasmtime::{ +//! component::{Linker, ResourceTable}, +//! Store, Engine, Result, Config +//! }; +//! use wasmtime_wasi_tls::{LinkOptions, WasiTlsCtx}; +//! +//! struct Ctx { +//! table: ResourceTable, +//! wasi_ctx: WasiCtx, +//! } +//! +//! impl IoView for Ctx { +//! fn table(&mut self) -> &mut ResourceTable { +//! &mut self.table +//! } +//! } +//! +//! impl WasiView for Ctx { +//! fn ctx(&mut self) -> &mut WasiCtx { +//! &mut self.wasi_ctx +//! } +//! } +//! +//! #[tokio::main] +//! async fn main() -> Result<()> { +//! let ctx = Ctx { +//! table: ResourceTable::new(), +//! wasi_ctx: WasiCtxBuilder::new() +//! .inherit_stderr() +//! .inherit_network() +//! .allow_ip_name_lookup(true) +//! .build(), +//! }; +//! +//! let mut config = Config::new(); +//! config.async_support(true); +//! let engine = Engine::new(&config)?; +//! +//! // Set up wasi-cli +//! let mut store = Store::new(&engine, ctx); +//! let mut linker = Linker::new(&engine); +//! wasmtime_wasi::add_to_linker_async(&mut linker)?; +//! +//! // Add wasi-tls types and turn on the feature in linker +//! let mut opts = LinkOptions::default(); +//! opts.tls(true); +//! wasmtime_wasi_tls::add_to_linker(&mut linker, &mut opts, |h: &mut Ctx| { +//! WasiTlsCtx::new(&mut h.table) +//! })?; +//! +//! // ... use `linker` to instantiate within `store` ... +//! Ok(()) +//! } +//! +//! ``` +//! [wasi-tls]: https://github.com/WebAssembly/wasi-tls +//! [wasi:cli]: https://docs.rs/wasmtime-wasi/latest + +#![deny(missing_docs)] +#![doc(test(attr(deny(warnings))))] +#![doc(test(attr(allow(dead_code, unused_variables, unused_mut))))] + +use anyhow::Result; +use bytes::Bytes; +use rustls::pki_types::ServerName; +use std::io; +use std::sync::Arc; +use std::task::{ready, Poll}; +use std::{future::Future, mem, pin::Pin, sync::LazyLock}; +use tokio::io::{AsyncRead, AsyncWrite, AsyncWriteExt}; +use tokio::sync::Mutex; +use tokio_rustls::client::TlsStream; +use wasmtime::component::{Resource, ResourceTable}; +use wasmtime_wasi::pipe::AsyncReadStream; +use wasmtime_wasi::runtime::AbortOnDropJoinHandle; +use wasmtime_wasi::OutputStream; +use wasmtime_wasi::{ + async_trait, + bindings::io::{ + error::Error as HostIoError, + poll::Pollable as HostPollable, + streams::{InputStream as BoxInputStream, OutputStream as BoxOutputStream}, + }, + Pollable, StreamError, +}; + +mod gen_ { + wasmtime::component::bindgen!({ + path: "wit", + world: "wasi:tls/imports", + with: { + "wasi:io": wasmtime_wasi::bindings::io, + "wasi:tls/types/client-connection": super::ClientConnection, + "wasi:tls/types/client-handshake": super::ClientHandShake, + "wasi:tls/types/future-client-streams": super::FutureClientStreams, + }, + trappable_imports: true, + async: { + only_imports: [], + } + }); +} +pub use gen_::wasi::tls::types::LinkOptions; +use gen_::wasi::tls::{self as generated}; + +fn default_client_config() -> Arc { + static CONFIG: LazyLock> = LazyLock::new(|| { + let roots = rustls::RootCertStore { + roots: webpki_roots::TLS_SERVER_ROOTS.into(), + }; + let config = rustls::ClientConfig::builder() + .with_root_certificates(roots) + .with_no_client_auth(); + Arc::new(config) + }); + Arc::clone(&CONFIG) +} + +/// Wasi TLS context needed fro internal `wasi-tls`` state +pub struct WasiTlsCtx<'a> { + table: &'a mut ResourceTable, +} + +impl<'a> WasiTlsCtx<'a> { + /// Create a new Wasi TLS context + pub fn new(table: &'a mut ResourceTable) -> Self { + Self { table } + } +} + +impl<'a> generated::types::Host for WasiTlsCtx<'a> {} + +/// Add the `wasi-tls` world's types to a [`wasmtime::component::Linker`]. +pub fn add_to_linker( + l: &mut wasmtime::component::Linker, + opts: &mut LinkOptions, + f: impl Fn(&mut T) -> WasiTlsCtx + Send + Sync + Copy + 'static, +) -> Result<()> { + generated::types::add_to_linker_get_host(l, &opts, f)?; + Ok(()) +} + +enum TlsError { + /// The component should trap. Under normal circumstances, this only occurs + /// when the underlying transport stream returns [`StreamError::Trap`]. + Trap(anyhow::Error), + + /// A failure indicated by the underlying transport stream as + /// [`StreamError::LastOperationFailed`]. + Io(wasmtime_wasi::IoError), + + /// A TLS protocol error occurred. + Tls(rustls::Error), +} + +impl TlsError { + /// Create a [`TlsError::Tls`] error from a simple message. + fn msg(msg: &str) -> Self { + // (Ab)using rustls' error type to synthesize our own TLS errors: + Self::Tls(rustls::Error::General(msg.to_string())) + } +} + +impl From for TlsError { + fn from(error: io::Error) -> Self { + // Report unexpected EOFs as an error to prevent truncation attacks. + // See: https://docs.rs/rustls/latest/rustls/struct.Reader.html#method.read + if let io::ErrorKind::WriteZero | io::ErrorKind::UnexpectedEof = error.kind() { + return Self::msg("underlying transport closed abruptly"); + } + + // Errors from underlying transport. + // These have been wrapped inside `io::Error`s by our wasi-to-tokio stream transformer below. + let error = match error.downcast::() { + Ok(StreamError::LastOperationFailed(e)) => return Self::Io(e), + Ok(StreamError::Trap(e)) => return Self::Trap(e), + Ok(StreamError::Closed) => unreachable!("our wasi-to-tokio stream transformer should have translated this to a 0-sized read"), + Err(e) => e, + }; + + // Errors from `rustls`. + // These have been wrapped inside `io::Error`s by `tokio-rustls`. + let error = match error.downcast::() { + Ok(e) => return Self::Tls(e), + Err(e) => e, + }; + + // All errors should have been handled by the clauses above. + Self::Trap(anyhow::Error::new(error).context("unknown wasi-tls error")) + } +} + +/// Represents the ClientHandshake which will be used to configure the handshake +pub struct ClientHandShake { + server_name: String, + streams: WasiStreams, +} + +impl<'a> generated::types::HostClientHandshake for WasiTlsCtx<'a> { + fn new( + &mut self, + server_name: String, + input: Resource, + output: Resource, + ) -> wasmtime::Result> { + let input = self.table.delete(input)?; + let output = self.table.delete(output)?; + Ok(self.table.push(ClientHandShake { + server_name, + streams: WasiStreams { + input: StreamState::Ready(input), + output: StreamState::Ready(output), + }, + })?) + } + + fn finish( + &mut self, + this: wasmtime::component::Resource, + ) -> wasmtime::Result> { + let handshake = self.table.delete(this)?; + let server_name = handshake.server_name; + let streams = handshake.streams; + + Ok(self + .table + .push(FutureStreams(StreamState::Pending(Box::pin(async move { + let domain = ServerName::try_from(server_name) + .map_err(|_| TlsError::msg("invalid server name"))?; + + let stream = tokio_rustls::TlsConnector::from(default_client_config()) + .connect(domain, streams) + .await?; + Ok(stream) + }))))?) + } + + fn drop( + &mut self, + this: wasmtime::component::Resource, + ) -> wasmtime::Result<()> { + self.table.delete(this)?; + Ok(()) + } +} + +/// Future streams provides the tls streams after the handshake is completed +pub struct FutureStreams(StreamState>); + +/// Library specific version of TLS connection after the handshake is completed. +/// This alias allows it to use with wit-bindgen component generator which won't take generic types +pub type FutureClientStreams = FutureStreams>; + +#[async_trait] +impl Pollable for FutureStreams { + async fn ready(&mut self) { + match &mut self.0 { + StreamState::Ready(_) | StreamState::Closed => return, + StreamState::Pending(task) => self.0 = StreamState::Ready(task.as_mut().await), + } + } +} + +impl<'a> generated::types::HostFutureClientStreams for WasiTlsCtx<'a> { + fn subscribe( + &mut self, + this: wasmtime::component::Resource, + ) -> wasmtime::Result> { + wasmtime_wasi::subscribe(self.table, this) + } + + fn get( + &mut self, + this: wasmtime::component::Resource, + ) -> wasmtime::Result< + Option< + Result< + Result< + ( + Resource, + Resource, + Resource, + ), + Resource, + >, + (), + >, + >, + > { + let this = &mut self.table.get_mut(&this)?.0; + match this { + StreamState::Pending(_) => return Ok(None), + StreamState::Closed => return Ok(Some(Err(()))), + StreamState::Ready(_) => (), + } + + let StreamState::Ready(result) = mem::replace(this, StreamState::Closed) else { + unreachable!() + }; + + let tls_stream = match result { + Ok(s) => s, + Err(TlsError::Trap(e)) => return Err(e), + Err(TlsError::Io(e)) => { + let error = self.table.push(e)?; + return Ok(Some(Ok(Err(error)))); + } + Err(TlsError::Tls(e)) => { + let error = self.table.push(wasmtime_wasi::IoError::new(e))?; + return Ok(Some(Ok(Err(error)))); + } + }; + + let (rx, tx) = tokio::io::split(tls_stream); + let write_stream = AsyncTlsWriteStream::new(TlsWriter::new(tx)); + let client = ClientConnection { + writer: write_stream.clone(), + }; + + let input = Box::new(AsyncReadStream::new(rx)) as BoxInputStream; + let output = Box::new(write_stream) as BoxOutputStream; + + let client = self.table.push(client)?; + let input = self.table.push_child(input, &client)?; + let output = self.table.push_child(output, &client)?; + + Ok(Some(Ok(Ok((client, input, output))))) + } + + fn drop( + &mut self, + this: wasmtime::component::Resource, + ) -> wasmtime::Result<()> { + self.table.delete(this)?; + Ok(()) + } +} + +/// Represents the client connection and used to shut down the tls stream +pub struct ClientConnection { + writer: AsyncTlsWriteStream, +} + +impl<'a> generated::types::HostClientConnection for WasiTlsCtx<'a> { + fn close_output(&mut self, this: Resource) -> wasmtime::Result<()> { + self.table.get_mut(&this)?.writer.close() + } + + fn drop(&mut self, this: Resource) -> wasmtime::Result<()> { + self.table.delete(this)?; + Ok(()) + } +} + +enum StreamState { + Ready(T), + Pending(Pin + Send>>), + Closed, +} + +/// Wrapper around Input and Output wasi IO Stream that provides Async Read/Write +pub struct WasiStreams { + input: StreamState, + output: StreamState, +} + +impl AsyncWrite for WasiStreams { + fn poll_write( + mut self: Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + buf: &[u8], + ) -> std::task::Poll> { + loop { + match &mut self.as_mut().output { + StreamState::Closed => unreachable!(), + StreamState::Pending(future) => { + let value = ready!(future.as_mut().poll(cx)); + self.as_mut().output = StreamState::Ready(value); + } + StreamState::Ready(output) => { + match output.check_write() { + Ok(0) => { + let StreamState::Ready(mut output) = + mem::replace(&mut self.as_mut().output, StreamState::Closed) + else { + unreachable!() + }; + self.as_mut().output = StreamState::Pending(Box::pin(async move { + output.ready().await; + output + })); + } + Ok(count) => { + let count = count.min(buf.len()); + return match output.write(Bytes::copy_from_slice(&buf[..count])) { + Ok(()) => Poll::Ready(Ok(count)), + Err(StreamError::Closed) => Poll::Ready(Ok(0)), + Err(e) => Poll::Ready(Err(std::io::Error::other(e))), + }; + } + Err(StreamError::Closed) => { + // Our current version of tokio-rustls does not handle returning `Ok(0)` well. + // See: https://github.com/rustls/tokio-rustls/issues/92 + return Poll::Ready(Err(std::io::ErrorKind::WriteZero.into())); + } + Err(e) => return Poll::Ready(Err(std::io::Error::other(e))), + }; + } + } + } + } + + fn poll_flush( + self: Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.poll_write(cx, &[]).map(|v| v.map(drop)) + } + + fn poll_shutdown( + self: Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + self.poll_flush(cx) + } +} + +impl AsyncRead for WasiStreams { + fn poll_read( + mut self: Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + buf: &mut tokio::io::ReadBuf<'_>, + ) -> std::task::Poll> { + loop { + let stream = match &mut self.input { + StreamState::Ready(stream) => stream, + StreamState::Pending(fut) => { + let stream = ready!(fut.as_mut().poll(cx)); + self.input = StreamState::Ready(stream); + if let StreamState::Ready(stream) = &mut self.input { + stream + } else { + unreachable!() + } + } + StreamState::Closed => { + return Poll::Ready(Ok(())); + } + }; + match stream.read(buf.remaining()) { + Ok(bytes) if bytes.is_empty() => { + let StreamState::Ready(mut stream) = + std::mem::replace(&mut self.input, StreamState::Closed) + else { + unreachable!() + }; + + self.input = StreamState::Pending(Box::pin(async move { + stream.ready().await; + stream + })); + } + Ok(bytes) => { + buf.put_slice(&bytes); + + return Poll::Ready(Ok(())); + } + Err(StreamError::Closed) => { + self.input = StreamState::Closed; + return Poll::Ready(Ok(())); + } + Err(e) => { + self.input = StreamState::Closed; + return Poll::Ready(Err(std::io::Error::other(e))); + } + } + } + } +} + +type TlsWriteHalf = tokio::io::WriteHalf>; + +struct TlsWriter { + state: WriteState, +} + +enum WriteState { + Ready(TlsWriteHalf), + Writing(AbortOnDropJoinHandle>), + Closing(AbortOnDropJoinHandle>), + Closed, + Error(io::Error), +} +const READY_SIZE: usize = 1024 * 1024 * 1024; + +impl TlsWriter { + fn new(stream: TlsWriteHalf) -> Self { + Self { + state: WriteState::Ready(stream), + } + } + + fn write(&mut self, mut bytes: bytes::Bytes) -> Result<(), StreamError> { + let WriteState::Ready(_) = self.state else { + return Err(StreamError::Trap(anyhow::anyhow!( + "unpermitted: must call check_write first" + ))); + }; + + if bytes.is_empty() { + return Ok(()); + } + + let WriteState::Ready(mut stream) = std::mem::replace(&mut self.state, WriteState::Closed) + else { + unreachable!() + }; + + self.state = WriteState::Writing(wasmtime_wasi::runtime::spawn(async move { + while !bytes.is_empty() { + match stream.write(&bytes).await { + Ok(n) => { + let _ = bytes.split_to(n); + } + Err(e) => return Err(e.into()), + } + } + + Ok(stream) + })); + + Ok(()) + } + + fn flush(&mut self) -> Result<(), StreamError> { + // `flush` is a no-op here, as we're not managing any internal buffer. + match self.state { + WriteState::Ready(_) + | WriteState::Writing(_) + | WriteState::Closing(_) + | WriteState::Error(_) => Ok(()), + WriteState::Closed => Err(StreamError::Closed), + } + } + + fn check_write(&mut self) -> Result { + match &mut self.state { + WriteState::Ready(_) => Ok(READY_SIZE), + WriteState::Writing(_) => Ok(0), + WriteState::Closing(_) => Ok(0), + WriteState::Closed => Err(StreamError::Closed), + WriteState::Error(_) => { + let WriteState::Error(e) = std::mem::replace(&mut self.state, WriteState::Closed) + else { + unreachable!() + }; + + Err(StreamError::LastOperationFailed(e.into())) + } + } + } + + fn close(&mut self) { + match std::mem::replace(&mut self.state, WriteState::Closed) { + // No write in progress, immediately shut down: + WriteState::Ready(mut stream) => { + self.state = WriteState::Closing(wasmtime_wasi::runtime::spawn(async move { + stream.shutdown().await + })); + } + + // Schedule the shutdown after the current write has finished: + WriteState::Writing(write) => { + self.state = WriteState::Closing(wasmtime_wasi::runtime::spawn(async move { + let mut stream = write.await?; + stream.shutdown().await + })); + } + + WriteState::Closing(t) => { + self.state = WriteState::Closing(t); + } + WriteState::Closed | WriteState::Error(_) => {} + } + } + + async fn cancel(&mut self) { + match std::mem::replace(&mut self.state, WriteState::Closed) { + WriteState::Writing(task) => _ = task.cancel().await, + WriteState::Closing(task) => _ = task.cancel().await, + _ => {} + } + } + + async fn ready(&mut self) { + match &mut self.state { + WriteState::Writing(task) => { + self.state = match task.await { + Ok(s) => WriteState::Ready(s), + Err(e) => WriteState::Error(e), + } + } + WriteState::Closing(task) => { + self.state = match task.await { + Ok(()) => WriteState::Closed, + Err(e) => WriteState::Error(e), + } + } + _ => {} + } + } +} + +#[derive(Clone)] +struct AsyncTlsWriteStream(Arc>); + +impl AsyncTlsWriteStream { + fn new(writer: TlsWriter) -> Self { + AsyncTlsWriteStream(Arc::new(Mutex::new(writer))) + } + + fn close(&mut self) -> wasmtime::Result<()> { + try_lock_for_stream(&self.0)?.close(); + Ok(()) + } +} + +#[async_trait] +impl OutputStream for AsyncTlsWriteStream { + fn write(&mut self, bytes: bytes::Bytes) -> Result<(), StreamError> { + try_lock_for_stream(&self.0)?.write(bytes) + } + + fn flush(&mut self) -> Result<(), StreamError> { + try_lock_for_stream(&self.0)?.flush() + } + + fn check_write(&mut self) -> Result { + try_lock_for_stream(&self.0)?.check_write() + } + + async fn cancel(&mut self) { + self.0.lock().await.cancel().await + } +} + +#[async_trait] +impl Pollable for AsyncTlsWriteStream { + async fn ready(&mut self) { + self.0.lock().await.ready().await + } +} + +fn try_lock_for_stream( + mutex: &Mutex, +) -> Result, StreamError> { + mutex + .try_lock() + .map_err(|_| StreamError::trap("concurrent access to resource not supported")) +} + +#[cfg(test)] +mod tests { + use super::*; + use tokio::sync::oneshot; + + #[tokio::test] + async fn test_future_client_streams_ready_can_be_canceled() { + let (tx1, rx1) = oneshot::channel::<()>(); + + let mut future_streams = FutureStreams(StreamState::Pending(Box::pin(async move { + rx1.await + .map_err(|_| TlsError::Trap(anyhow::anyhow!("oneshot canceled"))) + }))); + + let mut fut = future_streams.ready(); + + let mut cx = std::task::Context::from_waker(futures::task::noop_waker_ref()); + assert!(fut.as_mut().poll(&mut cx).is_pending()); + + //cancel the readiness check + drop(fut); + + match future_streams.0 { + StreamState::Closed => panic!("First future should be in Pending/ready state"), + _ => (), + } + + // make it ready and wait for it to progress + tx1.send(()).unwrap(); + future_streams.ready().await; + + match future_streams.0 { + StreamState::Ready(Ok(())) => (), + _ => panic!("First future should be in Ready(Err) state"), + } + } +} diff --git a/crates/wasi-tls/tests/main.rs b/crates/wasi-tls/tests/main.rs new file mode 100644 index 0000000000..6919a73ead --- /dev/null +++ b/crates/wasi-tls/tests/main.rs @@ -0,0 +1,72 @@ +use anyhow::{anyhow, Result}; +use test_programs_artifacts::{foreach_tls, TLS_SAMPLE_APPLICATION_COMPONENT}; +use wasmtime::{ + component::{Component, Linker, ResourceTable}, + Store, +}; +use wasmtime_wasi::{bindings::Command, IoView, WasiCtx, WasiCtxBuilder, WasiView}; +use wasmtime_wasi_tls::{LinkOptions, WasiTlsCtx}; + +struct Ctx { + table: ResourceTable, + wasi_ctx: WasiCtx, +} + +impl IoView for Ctx { + fn table(&mut self) -> &mut ResourceTable { + &mut self.table + } +} +impl WasiView for Ctx { + fn ctx(&mut self) -> &mut WasiCtx { + &mut self.wasi_ctx + } +} + +async fn run_wasi(path: &str, ctx: Ctx) -> Result<()> { + let engine = test_programs_artifacts::engine(|config| { + config.async_support(true); + }); + let mut store = Store::new(&engine, ctx); + let component = Component::from_file(&engine, path)?; + + let mut linker = Linker::new(&engine); + wasmtime_wasi::add_to_linker_async(&mut linker)?; + let mut opts = LinkOptions::default(); + opts.tls(true); + wasmtime_wasi_tls::add_to_linker(&mut linker, &mut opts, |h: &mut Ctx| { + WasiTlsCtx::new(&mut h.table) + })?; + + let command = Command::instantiate_async(&mut store, &component, &linker).await?; + command + .wasi_cli_run() + .call_run(&mut store) + .await? + .map_err(|()| anyhow!("command returned with failing exit status")) +} + +macro_rules! assert_test_exists { + ($name:ident) => { + #[expect(unused_imports, reason = "just here to assert it exists")] + use self::$name as _; + }; +} + +foreach_tls!(assert_test_exists); + +#[tokio::test(flavor = "multi_thread")] +async fn tls_sample_application() -> Result<()> { + run_wasi( + TLS_SAMPLE_APPLICATION_COMPONENT, + Ctx { + table: ResourceTable::new(), + wasi_ctx: WasiCtxBuilder::new() + .inherit_stderr() + .inherit_network() + .allow_ip_name_lookup(true) + .build(), + }, + ) + .await +} diff --git a/crates/wasi-tls/wit/deps/io@v0.2.3/error.wit b/crates/wasi-tls/wit/deps/io@v0.2.3/error.wit new file mode 100644 index 0000000000..97c6068779 --- /dev/null +++ b/crates/wasi-tls/wit/deps/io@v0.2.3/error.wit @@ -0,0 +1,34 @@ +package wasi:io@0.2.3; + +@since(version = 0.2.0) +interface error { + /// A resource which represents some error information. + /// + /// The only method provided by this resource is `to-debug-string`, + /// which provides some human-readable information about the error. + /// + /// In the `wasi:io` package, this resource is returned through the + /// `wasi:io/streams/stream-error` type. + /// + /// To provide more specific error information, other interfaces may + /// offer functions to "downcast" this error into more specific types. For example, + /// errors returned from streams derived from filesystem types can be described using + /// the filesystem's own error-code type. This is done using the function + /// `wasi:filesystem/types/filesystem-error-code`, which takes a `borrow` + /// parameter and returns an `option`. + /// + /// The set of functions which can "downcast" an `error` into a more + /// concrete type is open. + @since(version = 0.2.0) + resource error { + /// Returns a string that is suitable to assist humans in debugging + /// this error. + /// + /// WARNING: The returned string should not be consumed mechanically! + /// It may change across platforms, hosts, or other implementation + /// details. Parsing this string is a major platform-compatibility + /// hazard. + @since(version = 0.2.0) + to-debug-string: func() -> string; + } +} diff --git a/crates/wasi-tls/wit/deps/io@v0.2.3/poll.wit b/crates/wasi-tls/wit/deps/io@v0.2.3/poll.wit new file mode 100644 index 0000000000..9bcbe8e036 --- /dev/null +++ b/crates/wasi-tls/wit/deps/io@v0.2.3/poll.wit @@ -0,0 +1,47 @@ +package wasi:io@0.2.3; + +/// A poll API intended to let users wait for I/O events on multiple handles +/// at once. +@since(version = 0.2.0) +interface poll { + /// `pollable` represents a single I/O event which may be ready, or not. + @since(version = 0.2.0) + resource pollable { + + /// Return the readiness of a pollable. This function never blocks. + /// + /// Returns `true` when the pollable is ready, and `false` otherwise. + @since(version = 0.2.0) + ready: func() -> bool; + + /// `block` returns immediately if the pollable is ready, and otherwise + /// blocks until ready. + /// + /// This function is equivalent to calling `poll.poll` on a list + /// containing only this pollable. + @since(version = 0.2.0) + block: func(); + } + + /// Poll for completion on a set of pollables. + /// + /// This function takes a list of pollables, which identify I/O sources of + /// interest, and waits until one or more of the events is ready for I/O. + /// + /// The result `list` contains one or more indices of handles in the + /// argument list that is ready for I/O. + /// + /// This function traps if either: + /// - the list is empty, or: + /// - the list contains more elements than can be indexed with a `u32` value. + /// + /// A timeout can be implemented by adding a pollable from the + /// wasi-clocks API to the list. + /// + /// This function does not return a `result`; polling in itself does not + /// do any I/O so it doesn't fail. If any of the I/O sources identified by + /// the pollables has an error, it is indicated by marking the source as + /// being ready for I/O. + @since(version = 0.2.0) + poll: func(in: list>) -> list; +} diff --git a/crates/wasi-tls/wit/deps/io@v0.2.3/streams.wit b/crates/wasi-tls/wit/deps/io@v0.2.3/streams.wit new file mode 100644 index 0000000000..0de0846293 --- /dev/null +++ b/crates/wasi-tls/wit/deps/io@v0.2.3/streams.wit @@ -0,0 +1,290 @@ +package wasi:io@0.2.3; + +/// WASI I/O is an I/O abstraction API which is currently focused on providing +/// stream types. +/// +/// In the future, the component model is expected to add built-in stream types; +/// when it does, they are expected to subsume this API. +@since(version = 0.2.0) +interface streams { + @since(version = 0.2.0) + use error.{error}; + @since(version = 0.2.0) + use poll.{pollable}; + + /// An error for input-stream and output-stream operations. + @since(version = 0.2.0) + variant stream-error { + /// The last operation (a write or flush) failed before completion. + /// + /// More information is available in the `error` payload. + /// + /// After this, the stream will be closed. All future operations return + /// `stream-error::closed`. + last-operation-failed(error), + /// The stream is closed: no more input will be accepted by the + /// stream. A closed output-stream will return this error on all + /// future operations. + closed + } + + /// An input bytestream. + /// + /// `input-stream`s are *non-blocking* to the extent practical on underlying + /// platforms. I/O operations always return promptly; if fewer bytes are + /// promptly available than requested, they return the number of bytes promptly + /// available, which could even be zero. To wait for data to be available, + /// use the `subscribe` function to obtain a `pollable` which can be polled + /// for using `wasi:io/poll`. + @since(version = 0.2.0) + resource input-stream { + /// Perform a non-blocking read from the stream. + /// + /// When the source of a `read` is binary data, the bytes from the source + /// are returned verbatim. When the source of a `read` is known to the + /// implementation to be text, bytes containing the UTF-8 encoding of the + /// text are returned. + /// + /// This function returns a list of bytes containing the read data, + /// when successful. The returned list will contain up to `len` bytes; + /// it may return fewer than requested, but not more. The list is + /// empty when no bytes are available for reading at this time. The + /// pollable given by `subscribe` will be ready when more bytes are + /// available. + /// + /// This function fails with a `stream-error` when the operation + /// encounters an error, giving `last-operation-failed`, or when the + /// stream is closed, giving `closed`. + /// + /// When the caller gives a `len` of 0, it represents a request to + /// read 0 bytes. If the stream is still open, this call should + /// succeed and return an empty list, or otherwise fail with `closed`. + /// + /// The `len` parameter is a `u64`, which could represent a list of u8 which + /// is not possible to allocate in wasm32, or not desirable to allocate as + /// as a return value by the callee. The callee may return a list of bytes + /// less than `len` in size while more bytes are available for reading. + @since(version = 0.2.0) + read: func( + /// The maximum number of bytes to read + len: u64 + ) -> result, stream-error>; + + /// Read bytes from a stream, after blocking until at least one byte can + /// be read. Except for blocking, behavior is identical to `read`. + @since(version = 0.2.0) + blocking-read: func( + /// The maximum number of bytes to read + len: u64 + ) -> result, stream-error>; + + /// Skip bytes from a stream. Returns number of bytes skipped. + /// + /// Behaves identical to `read`, except instead of returning a list + /// of bytes, returns the number of bytes consumed from the stream. + @since(version = 0.2.0) + skip: func( + /// The maximum number of bytes to skip. + len: u64, + ) -> result; + + /// Skip bytes from a stream, after blocking until at least one byte + /// can be skipped. Except for blocking behavior, identical to `skip`. + @since(version = 0.2.0) + blocking-skip: func( + /// The maximum number of bytes to skip. + len: u64, + ) -> result; + + /// Create a `pollable` which will resolve once either the specified stream + /// has bytes available to read or the other end of the stream has been + /// closed. + /// The created `pollable` is a child resource of the `input-stream`. + /// Implementations may trap if the `input-stream` is dropped before + /// all derived `pollable`s created with this function are dropped. + @since(version = 0.2.0) + subscribe: func() -> pollable; + } + + + /// An output bytestream. + /// + /// `output-stream`s are *non-blocking* to the extent practical on + /// underlying platforms. Except where specified otherwise, I/O operations also + /// always return promptly, after the number of bytes that can be written + /// promptly, which could even be zero. To wait for the stream to be ready to + /// accept data, the `subscribe` function to obtain a `pollable` which can be + /// polled for using `wasi:io/poll`. + /// + /// Dropping an `output-stream` while there's still an active write in + /// progress may result in the data being lost. Before dropping the stream, + /// be sure to fully flush your writes. + @since(version = 0.2.0) + resource output-stream { + /// Check readiness for writing. This function never blocks. + /// + /// Returns the number of bytes permitted for the next call to `write`, + /// or an error. Calling `write` with more bytes than this function has + /// permitted will trap. + /// + /// When this function returns 0 bytes, the `subscribe` pollable will + /// become ready when this function will report at least 1 byte, or an + /// error. + @since(version = 0.2.0) + check-write: func() -> result; + + /// Perform a write. This function never blocks. + /// + /// When the destination of a `write` is binary data, the bytes from + /// `contents` are written verbatim. When the destination of a `write` is + /// known to the implementation to be text, the bytes of `contents` are + /// transcoded from UTF-8 into the encoding of the destination and then + /// written. + /// + /// Precondition: check-write gave permit of Ok(n) and contents has a + /// length of less than or equal to n. Otherwise, this function will trap. + /// + /// returns Err(closed) without writing if the stream has closed since + /// the last call to check-write provided a permit. + @since(version = 0.2.0) + write: func( + contents: list + ) -> result<_, stream-error>; + + /// Perform a write of up to 4096 bytes, and then flush the stream. Block + /// until all of these operations are complete, or an error occurs. + /// + /// This is a convenience wrapper around the use of `check-write`, + /// `subscribe`, `write`, and `flush`, and is implemented with the + /// following pseudo-code: + /// + /// ```text + /// let pollable = this.subscribe(); + /// while !contents.is_empty() { + /// // Wait for the stream to become writable + /// pollable.block(); + /// let Ok(n) = this.check-write(); // eliding error handling + /// let len = min(n, contents.len()); + /// let (chunk, rest) = contents.split_at(len); + /// this.write(chunk ); // eliding error handling + /// contents = rest; + /// } + /// this.flush(); + /// // Wait for completion of `flush` + /// pollable.block(); + /// // Check for any errors that arose during `flush` + /// let _ = this.check-write(); // eliding error handling + /// ``` + @since(version = 0.2.0) + blocking-write-and-flush: func( + contents: list + ) -> result<_, stream-error>; + + /// Request to flush buffered output. This function never blocks. + /// + /// This tells the output-stream that the caller intends any buffered + /// output to be flushed. the output which is expected to be flushed + /// is all that has been passed to `write` prior to this call. + /// + /// Upon calling this function, the `output-stream` will not accept any + /// writes (`check-write` will return `ok(0)`) until the flush has + /// completed. The `subscribe` pollable will become ready when the + /// flush has completed and the stream can accept more writes. + @since(version = 0.2.0) + flush: func() -> result<_, stream-error>; + + /// Request to flush buffered output, and block until flush completes + /// and stream is ready for writing again. + @since(version = 0.2.0) + blocking-flush: func() -> result<_, stream-error>; + + /// Create a `pollable` which will resolve once the output-stream + /// is ready for more writing, or an error has occurred. When this + /// pollable is ready, `check-write` will return `ok(n)` with n>0, or an + /// error. + /// + /// If the stream is closed, this pollable is always ready immediately. + /// + /// The created `pollable` is a child resource of the `output-stream`. + /// Implementations may trap if the `output-stream` is dropped before + /// all derived `pollable`s created with this function are dropped. + @since(version = 0.2.0) + subscribe: func() -> pollable; + + /// Write zeroes to a stream. + /// + /// This should be used precisely like `write` with the exact same + /// preconditions (must use check-write first), but instead of + /// passing a list of bytes, you simply pass the number of zero-bytes + /// that should be written. + @since(version = 0.2.0) + write-zeroes: func( + /// The number of zero-bytes to write + len: u64 + ) -> result<_, stream-error>; + + /// Perform a write of up to 4096 zeroes, and then flush the stream. + /// Block until all of these operations are complete, or an error + /// occurs. + /// + /// This is a convenience wrapper around the use of `check-write`, + /// `subscribe`, `write-zeroes`, and `flush`, and is implemented with + /// the following pseudo-code: + /// + /// ```text + /// let pollable = this.subscribe(); + /// while num_zeroes != 0 { + /// // Wait for the stream to become writable + /// pollable.block(); + /// let Ok(n) = this.check-write(); // eliding error handling + /// let len = min(n, num_zeroes); + /// this.write-zeroes(len); // eliding error handling + /// num_zeroes -= len; + /// } + /// this.flush(); + /// // Wait for completion of `flush` + /// pollable.block(); + /// // Check for any errors that arose during `flush` + /// let _ = this.check-write(); // eliding error handling + /// ``` + @since(version = 0.2.0) + blocking-write-zeroes-and-flush: func( + /// The number of zero-bytes to write + len: u64 + ) -> result<_, stream-error>; + + /// Read from one stream and write to another. + /// + /// The behavior of splice is equivalent to: + /// 1. calling `check-write` on the `output-stream` + /// 2. calling `read` on the `input-stream` with the smaller of the + /// `check-write` permitted length and the `len` provided to `splice` + /// 3. calling `write` on the `output-stream` with that read data. + /// + /// Any error reported by the call to `check-write`, `read`, or + /// `write` ends the splice and reports that error. + /// + /// This function returns the number of bytes transferred; it may be less + /// than `len`. + @since(version = 0.2.0) + splice: func( + /// The stream to read from + src: borrow, + /// The number of bytes to splice + len: u64, + ) -> result; + + /// Read from one stream and write to another, with blocking. + /// + /// This is similar to `splice`, except that it blocks until the + /// `output-stream` is ready for writing, and the `input-stream` + /// is ready for reading, before performing the `splice`. + @since(version = 0.2.0) + blocking-splice: func( + /// The stream to read from + src: borrow, + /// The number of bytes to splice + len: u64, + ) -> result; + } +} diff --git a/crates/wasi-tls/wit/deps/io@v0.2.3/world.wit b/crates/wasi-tls/wit/deps/io@v0.2.3/world.wit new file mode 100644 index 0000000000..f1d2102dca --- /dev/null +++ b/crates/wasi-tls/wit/deps/io@v0.2.3/world.wit @@ -0,0 +1,10 @@ +package wasi:io@0.2.3; + +@since(version = 0.2.0) +world imports { + @since(version = 0.2.0) + import streams; + + @since(version = 0.2.0) + import poll; +} diff --git a/crates/wasi-tls/wit/deps/tls@v0.2.0-draft+d6fbdc7/types.wit b/crates/wasi-tls/wit/deps/tls@v0.2.0-draft+d6fbdc7/types.wit new file mode 100644 index 0000000000..6c8a487347 --- /dev/null +++ b/crates/wasi-tls/wit/deps/tls@v0.2.0-draft+d6fbdc7/types.wit @@ -0,0 +1,33 @@ +@unstable(feature = tls) +interface types { + @unstable(feature = tls) + use wasi:io/streams@0.2.3.{input-stream, output-stream}; + @unstable(feature = tls) + use wasi:io/poll@0.2.3.{pollable}; + @unstable(feature = tls) + use wasi:io/error@0.2.3.{error as io-error}; + + @unstable(feature = tls) + resource client-handshake { + @unstable(feature = tls) + constructor(server-name: string, input: input-stream, output: output-stream); + + @unstable(feature = tls) + finish: static func(this: client-handshake) -> future-client-streams; + } + + @unstable(feature = tls) + resource client-connection { + @unstable(feature = tls) + close-output: func(); + } + + @unstable(feature = tls) + resource future-client-streams { + @unstable(feature = tls) + subscribe: func() -> pollable; + + @unstable(feature = tls) + get: func() -> option, io-error>>>; + } +} diff --git a/crates/wasi-tls/wit/deps/tls@v0.2.0-draft+d6fbdc7/world.wit b/crates/wasi-tls/wit/deps/tls@v0.2.0-draft+d6fbdc7/world.wit new file mode 100644 index 0000000000..8efd9593dd --- /dev/null +++ b/crates/wasi-tls/wit/deps/tls@v0.2.0-draft+d6fbdc7/world.wit @@ -0,0 +1,7 @@ +package wasi:tls@0.2.0-draft; + +@unstable(feature = tls) +world imports { + @unstable(feature = tls) + import types; +} diff --git a/crates/wasi-tls/wit/world.wit b/crates/wasi-tls/wit/world.wit new file mode 100644 index 0000000000..e515eecce1 --- /dev/null +++ b/crates/wasi-tls/wit/world.wit @@ -0,0 +1,6 @@ +// We actually don't use this; it's just to let bindgen! find the corresponding world in wit/deps. +package wasmtime:wasi-tls; + +world bindings { + include wasi:tls/imports@0.2.0-draft; +} diff --git a/crates/wasi/Cargo.toml b/crates/wasi/Cargo.toml index 5267746af7..1e669c1e92 100644 --- a/crates/wasi/Cargo.toml +++ b/crates/wasi/Cargo.toml @@ -44,6 +44,7 @@ tracing-subscriber = { workspace = true } test-programs-artifacts = { workspace = true } tempfile = { workspace = true } wasmtime = { workspace = true, features = ['cranelift', 'incremental-cache'] } +wasmtime-test-util = { workspace = true } [target.'cfg(unix)'.dependencies] rustix = { workspace = true, features = ["event", "fs", "net"] } diff --git a/crates/wasi/src/host/network.rs b/crates/wasi/src/host/network.rs index e7de7e92b6..5d04ebf1d7 100644 --- a/crates/wasi/src/host/network.rs +++ b/crates/wasi/src/host/network.rs @@ -467,13 +467,13 @@ pub(crate) mod util { } pub fn get_ip_ttl(sockfd: Fd) -> rustix::io::Result { - sockopt::get_ip_ttl(sockfd)? + sockopt::ip_ttl(sockfd)? .try_into() .map_err(|_| Errno::OPNOTSUPP) } pub fn get_ipv6_unicast_hops(sockfd: Fd) -> rustix::io::Result { - sockopt::get_ipv6_unicast_hops(sockfd) + sockopt::ipv6_unicast_hops(sockfd) } pub fn set_ip_ttl(sockfd: Fd, value: u8) -> rustix::io::Result<()> { @@ -513,12 +513,12 @@ pub(crate) mod util { } pub fn get_socket_recv_buffer_size(sockfd: Fd) -> rustix::io::Result { - let value = sockopt::get_socket_recv_buffer_size(sockfd)?; + let value = sockopt::socket_recv_buffer_size(sockfd)?; Ok(normalize_get_buffer_size(value)) } pub fn get_socket_send_buffer_size(sockfd: Fd) -> rustix::io::Result { - let value = sockopt::get_socket_send_buffer_size(sockfd)?; + let value = sockopt::socket_send_buffer_size(sockfd)?; Ok(normalize_get_buffer_size(value)) } diff --git a/crates/wasi/src/lib.rs b/crates/wasi/src/lib.rs index 5e89545d7b..91e9a2bf1a 100644 --- a/crates/wasi/src/lib.rs +++ b/crates/wasi/src/lib.rs @@ -282,7 +282,8 @@ pub use wasmtime::component::{ResourceTable, ResourceTableError}; // users of this crate depend on them at these names. pub use wasmtime_wasi_io::poll::{subscribe, DynFuture, DynPollable, MakeFuture, Pollable}; pub use wasmtime_wasi_io::streams::{ - DynInputStream, DynOutputStream, InputStream, OutputStream, StreamError, StreamResult, + DynInputStream, DynOutputStream, Error as IoError, InputStream, OutputStream, StreamError, + StreamResult, }; pub use wasmtime_wasi_io::{IoImpl, IoView}; diff --git a/crates/wasi/src/p3/sockets/tcp.rs b/crates/wasi/src/p3/sockets/tcp.rs index 7cddcde044..af617c99c8 100644 --- a/crates/wasi/src/p3/sockets/tcp.rs +++ b/crates/wasi/src/p3/sockets/tcp.rs @@ -234,7 +234,7 @@ impl TcpSocket { pub fn keep_alive_enabled(&self) -> Result { let fd = &*self.as_std_view()?; - let v = sockopt::get_socket_keepalive(fd)?; + let v = sockopt::socket_keepalive(fd)?; Ok(v) } @@ -246,7 +246,7 @@ impl TcpSocket { pub fn keep_alive_idle_time(&self) -> Result { let fd = &*self.as_std_view()?; - let v = sockopt::get_tcp_keepidle(fd)?; + let v = sockopt::tcp_keepidle(fd)?; Ok(v.as_nanos().try_into().unwrap_or(u64::MAX)) } @@ -276,7 +276,7 @@ impl TcpSocket { pub fn keep_alive_interval(&self) -> Result { let fd = &*self.as_std_view()?; - let v = sockopt::get_tcp_keepintvl(fd)?; + let v = sockopt::tcp_keepintvl(fd)?; Ok(v.as_nanos().try_into().unwrap_or(u64::MAX)) } @@ -301,7 +301,7 @@ impl TcpSocket { pub fn keep_alive_count(&self) -> Result { let fd = &*self.as_std_view()?; - let v = sockopt::get_tcp_keepcnt(fd)?; + let v = sockopt::tcp_keepcnt(fd)?; Ok(v) } diff --git a/crates/wasi/src/p3/sockets/util.rs b/crates/wasi/src/p3/sockets/util.rs index 149d255371..514bf9d3f0 100644 --- a/crates/wasi/src/p3/sockets/util.rs +++ b/crates/wasi/src/p3/sockets/util.rs @@ -272,7 +272,7 @@ impl From<&Errno> for types::ErrorCode { } pub fn get_ip_ttl(fd: impl AsFd) -> Result { - let v = sockopt::get_ip_ttl(fd)?; + let v = sockopt::ip_ttl(fd)?; let Ok(v) = v.try_into() else { return Err(ErrorCode::NotSupported); }; @@ -280,7 +280,7 @@ pub fn get_ip_ttl(fd: impl AsFd) -> Result { } pub fn get_ipv6_unicast_hops(fd: impl AsFd) -> Result { - let v = sockopt::get_ipv6_unicast_hops(fd)?; + let v = sockopt::ipv6_unicast_hops(fd)?; Ok(v) } @@ -316,7 +316,7 @@ pub fn set_unicast_hop_limit( } pub fn receive_buffer_size(fd: impl AsFd) -> Result { - let v = sockopt::get_socket_recv_buffer_size(fd)?; + let v = sockopt::socket_recv_buffer_size(fd)?; Ok(normalize_get_buffer_size(v).try_into().unwrap_or(u64::MAX)) } @@ -336,7 +336,7 @@ pub fn set_receive_buffer_size(fd: impl AsFd, value: u64) -> Result Result { - let v = sockopt::get_socket_send_buffer_size(fd)?; + let v = sockopt::socket_send_buffer_size(fd)?; Ok(normalize_get_buffer_size(v).try_into().unwrap_or(u64::MAX)) } diff --git a/crates/wasi/src/runtime.rs b/crates/wasi/src/runtime.rs index 762e4045e3..2c23bd7885 100644 --- a/crates/wasi/src/runtime.rs +++ b/crates/wasi/src/runtime.rs @@ -42,7 +42,7 @@ pub struct AbortOnDropJoinHandle(tokio::task::JoinHandle); impl AbortOnDropJoinHandle { /// Abort the task and wait for it to finish. Optionally returns the result /// of the task if it ran to completion prior to being aborted. - pub(crate) async fn cancel(mut self) -> Option { + pub async fn cancel(mut self) -> Option { self.0.abort(); match (&mut self.0).await { diff --git a/crates/wasi/src/tcp.rs b/crates/wasi/src/tcp.rs index 5edaef9c77..359a5fe577 100644 --- a/crates/wasi/src/tcp.rs +++ b/crates/wasi/src/tcp.rs @@ -520,7 +520,7 @@ impl TcpSocket { pub fn keep_alive_enabled(&self) -> SocketResult { let view = &*self.as_std_view()?; - Ok(sockopt::get_socket_keepalive(view)?) + Ok(sockopt::socket_keepalive(view)?) } pub fn set_keep_alive_enabled(&self, value: bool) -> SocketResult<()> { @@ -530,7 +530,7 @@ impl TcpSocket { pub fn keep_alive_idle_time(&self) -> SocketResult { let view = &*self.as_std_view()?; - Ok(sockopt::get_tcp_keepidle(view)?) + Ok(sockopt::tcp_keepidle(view)?) } pub fn set_keep_alive_idle_time(&mut self, duration: std::time::Duration) -> SocketResult<()> { @@ -549,7 +549,7 @@ impl TcpSocket { pub fn keep_alive_interval(&self) -> SocketResult { let view = &*self.as_std_view()?; - Ok(sockopt::get_tcp_keepintvl(view)?) + Ok(sockopt::tcp_keepintvl(view)?) } pub fn set_keep_alive_interval(&self, duration: std::time::Duration) -> SocketResult<()> { @@ -559,7 +559,7 @@ impl TcpSocket { pub fn keep_alive_count(&self) -> SocketResult { let view = &*self.as_std_view()?; - Ok(sockopt::get_tcp_keepcnt(view)?) + Ok(sockopt::tcp_keepcnt(view)?) } pub fn set_keep_alive_count(&self, value: u32) -> SocketResult<()> { diff --git a/crates/wasi/tests/process_stdin.rs b/crates/wasi/tests/process_stdin.rs index dc1688301d..99e85a3b26 100644 --- a/crates/wasi/tests/process_stdin.rs +++ b/crates/wasi/tests/process_stdin.rs @@ -11,11 +11,7 @@ fn main() { // Skip this tests if it looks like we're in a cross-compiled situation and // we're emulating this test for a different platform. In that scenario // emulators (like QEMU) tend to not report signals the same way and such. - if std::env::vars() - .filter(|(k, _v)| k.starts_with("CARGO_TARGET") && k.ends_with("RUNNER")) - .count() - > 0 - { + if wasmtime_test_util::cargo_test_runner().is_some() { return; } diff --git a/crates/wasmtime/Cargo.toml b/crates/wasmtime/Cargo.toml index 8445a8b10a..ff0d06a9a9 100644 --- a/crates/wasmtime/Cargo.toml +++ b/crates/wasmtime/Cargo.toml @@ -47,7 +47,6 @@ serde_json = { workspace = true, optional = true } sptr = { workspace = true } postcard = { workspace = true } indexmap = { workspace = true } -paste = "1.0.3" once_cell = { version = "1.12.0", optional = true } rayon = { version = "1.0", optional = true } object = { workspace = true } @@ -108,6 +107,7 @@ tempfile = { workspace = true } wasi-common = { path = "../wasi-common", default-features = true } libtest-mimic = { workspace = true } cranelift-native = { workspace = true } +wasmtime-test-util = { workspace = true } [build-dependencies] cc = { workspace = true, optional = true } diff --git a/crates/wasmtime/README.md b/crates/wasmtime/README.md index 69e0d899fc..97c0043056 100644 --- a/crates/wasmtime/README.md +++ b/crates/wasmtime/README.md @@ -115,5 +115,8 @@ Wasmtime can do for you or help answer your questions about Wasmtime. If you're curious in contributing to Wasmtime, [it can also help you do that][contributing]! +For information on supported versions of Wasmtime see [the corresponding online book +documentation](https://docs.wasmtime.dev/stability-release.html#current-versions). + [contributing]: https://bytecodealliance.github.io/wasmtime/contributing.html [guide]: https://bytecodealliance.github.io/wasmtime diff --git a/crates/wasmtime/build.rs b/crates/wasmtime/build.rs index 9dbc0f3a5f..3b005414ad 100644 --- a/crates/wasmtime/build.rs +++ b/crates/wasmtime/build.rs @@ -1,11 +1,8 @@ -use std::process::Command; use std::str; fn main() { println!("cargo:rerun-if-changed=build.rs"); - enable_features_based_on_rustc_version(); - // NB: duplicating a workaround in the wasmtime-fiber build script. custom_cfg("asan", cfg_is("sanitize", "address")); @@ -95,23 +92,3 @@ fn build_c_helpers() { build.file("src/runtime/vm/helpers.c"); build.compile("wasmtime-helpers"); } - -fn enable_features_based_on_rustc_version() { - // Temporary check to see if the rustc version >= 1.84 in which case - // provenance-related pointer APIs are available. This is temporary because - // in the future the MSRV of this crate will be beyond 1.84 in which case - // this build script can be deleted. - let minor = rustc_minor_version().unwrap_or(0); - custom_cfg("has_provenance_apis", minor >= 84); -} - -fn rustc_minor_version() -> Option { - let rustc = std::env::var("RUSTC").unwrap(); - let output = Command::new(rustc).arg("--version").output().ok()?; - let version = str::from_utf8(&output.stdout).ok()?; - let mut pieces = version.split('.'); - if pieces.next() != Some("rustc 1") { - return None; - } - pieces.next()?.parse().ok() -} diff --git a/crates/wasmtime/src/compile.rs b/crates/wasmtime/src/compile.rs index 0012823fa5..67a94cd5f9 100644 --- a/crates/wasmtime/src/compile.rs +++ b/crates/wasmtime/src/compile.rs @@ -35,11 +35,12 @@ use std::{ #[cfg(feature = "component-model")] use wasmtime_environ::component::Translator; +use wasmtime_environ::CompiledFunctionBody; use wasmtime_environ::{ BuiltinFunctionIndex, CompiledFunctionInfo, CompiledModuleInfo, Compiler, DefinedFuncIndex, - FinishedObject, FunctionBodyData, ModuleEnvironment, ModuleInternedTypeIndex, + FilePos, FinishedObject, FunctionBodyData, ModuleEnvironment, ModuleInternedTypeIndex, ModuleTranslation, ModuleTypes, ModuleTypesBuilder, ObjectKind, PrimaryMap, RelocationTarget, - StaticModuleIndex, WasmFunctionInfo, + StaticModuleIndex, }; mod code_builder; @@ -83,7 +84,12 @@ pub(crate) fn build_artifacts( let compile_inputs = CompileInputs::for_module(&types, &translation, functions); let unlinked_compile_outputs = compile_inputs.compile(engine)?; - let (compiled_funcs, function_indices) = unlinked_compile_outputs.pre_link(); + let PreLinkOutput { + needs_gc_heap, + compiled_funcs, + indices, + } = unlinked_compile_outputs.pre_link(); + translation.module.needs_gc_heap |= needs_gc_heap; // Emplace all compiled functions into the object file with any other // sections associated with code as well. @@ -100,7 +106,7 @@ pub(crate) fn build_artifacts( engine.append_compiler_info(&mut object); engine.append_bti(&mut object); - let (mut object, compilation_artifacts) = function_indices.link_and_append_code( + let (mut object, compilation_artifacts) = indices.link_and_append_code( &types, object, engine, @@ -158,13 +164,20 @@ pub(crate) fn build_component_artifacts( ); let unlinked_compile_outputs = compile_inputs.compile(&engine)?; - let (compiled_funcs, function_indices) = unlinked_compile_outputs.pre_link(); + let PreLinkOutput { + needs_gc_heap, + compiled_funcs, + indices, + } = unlinked_compile_outputs.pre_link(); + for (_, t) in &mut module_translations { + t.module.needs_gc_heap |= needs_gc_heap + } let mut object = compiler.object(ObjectKind::Component)?; engine.append_compiler_info(&mut object); engine.append_bti(&mut object); - let (mut object, compilation_artifacts) = function_indices.link_and_append_code( + let (mut object, compilation_artifacts) = indices.link_and_append_code( types.module_types_builder(), object, engine, @@ -318,8 +331,8 @@ impl From> for CompiledFunction>, - info: Option, + function: CompiledFunction, + start_srcloc: FilePos, } /// The collection of things we need to compile for a Wasm module or component. @@ -376,7 +389,7 @@ impl<'a> CompileInputs<'a> { .compile_trampoline(component, types, idx, tunables) .with_context(|| format!("failed to compile {}", trampoline.symbol_name()))? .into(), - info: None, + start_srcloc: FilePos::default(), }) }); } @@ -391,14 +404,14 @@ impl<'a> CompileInputs<'a> { if let Some(sig) = types.find_resource_drop_signature() { ret.push_input(move |compiler| { let symbol = "resource_drop_trampoline".to_string(); - let trampoline = compiler + let function = compiler .compile_wasm_to_array_trampoline(types[sig].unwrap_func()) .with_context(|| format!("failed to compile `{symbol}`"))?; Ok(CompileOutput { key: CompileKey::resource_drop_wasm_to_array_trampoline(), - function: CompiledFunction::Function(trampoline), + function: CompiledFunction::Function(function), symbol, - info: None, + start_srcloc: FilePos::default(), }) }); } @@ -470,7 +483,10 @@ impl<'a> CompileInputs<'a> { func_index.as_u32() ), }; - let (info, function) = compiler + let data = func_body.body.get_binary_reader(); + let offset = data.original_position(); + let start_srcloc = FilePos::new(u32::try_from(offset).unwrap()); + let function = compiler .compile_function(translation, def_func_index, func_body, types) .with_context(|| format!("failed to compile: {symbol}"))?; @@ -478,7 +494,7 @@ impl<'a> CompileInputs<'a> { key: CompileKey::wasm_function(module, def_func_index), symbol, function: CompiledFunction::Function(function), - info: Some(info), + start_srcloc, }) }); @@ -498,7 +514,7 @@ impl<'a> CompileInputs<'a> { key: CompileKey::array_to_wasm_trampoline(module, def_func_index), symbol, function: CompiledFunction::Function(trampoline), - info: None, + start_srcloc: FilePos::default(), }) }); } @@ -524,7 +540,7 @@ impl<'a> CompileInputs<'a> { key: CompileKey::wasm_to_array_trampoline(trampoline_type_index), function: CompiledFunction::Function(trampoline), symbol, - info: None, + start_srcloc: FilePos::default(), }) }); } @@ -562,15 +578,14 @@ fn compile_required_builtins(engine: &Engine, raw_outputs: &mut Vec continue, }; - for reloc in compiler.compiled_function_relocation_targets(&**f) { + for reloc in compiler.compiled_function_relocation_targets(&*f.code) { match reloc { RelocationTarget::Builtin(i) => { if builtins.insert(i) { @@ -605,7 +620,7 @@ struct UnlinkedCompileOutputs { impl UnlinkedCompileOutputs { /// Flatten all our functions into a single list and remember each of their /// indices within it. - fn pre_link(self) -> (Vec<(String, Box)>, FunctionIndices) { + fn pre_link(self) -> PreLinkOutput { // The order the functions end up within `compiled_funcs` is the order // that they will be laid out in the ELF file, so try and group hot and // cold functions together as best we can. However, because we bucket by @@ -613,55 +628,82 @@ impl UnlinkedCompileOutputs { // appearing in between hot Wasm functions. let mut compiled_funcs = vec![]; let mut indices = FunctionIndices::default(); - for x in self.outputs.into_iter().flat_map(|(_kind, xs)| xs) { - let index = match x.function { + let mut needs_gc_heap = false; + + for output in self.outputs.into_iter().flat_map(|(_kind, outs)| outs) { + let index = match output.function { CompiledFunction::Function(f) => { + needs_gc_heap |= f.needs_gc_heap; let index = compiled_funcs.len(); - compiled_funcs.push((x.symbol, f)); + compiled_funcs.push((output.symbol, f.code)); CompiledFunction::Function(index) } #[cfg(feature = "component-model")] - CompiledFunction::AllCallFunc(f) => { - let array_call = compiled_funcs.len(); - compiled_funcs.push((format!("{}_array_call", x.symbol), f.array_call)); - let wasm_call = compiled_funcs.len(); - compiled_funcs.push((format!("{}_wasm_call", x.symbol), f.wasm_call)); + CompiledFunction::AllCallFunc(wasmtime_environ::component::AllCallFunc { + wasm_call, + array_call, + }) => { + needs_gc_heap |= array_call.needs_gc_heap; + let array_call_idx = compiled_funcs.len(); + compiled_funcs.push((format!("{}_array_call", output.symbol), array_call.code)); + + needs_gc_heap |= wasm_call.needs_gc_heap; + let wasm_call_idx = compiled_funcs.len(); + compiled_funcs.push((format!("{}_wasm_call", output.symbol), wasm_call.code)); + CompiledFunction::AllCallFunc(wasmtime_environ::component::AllCallFunc { - array_call, - wasm_call, + array_call: array_call_idx, + wasm_call: wasm_call_idx, }) } }; - if x.key.kind() == CompileKey::WASM_FUNCTION_KIND - || x.key.kind() == CompileKey::ARRAY_TO_WASM_TRAMPOLINE_KIND + if output.key.kind() == CompileKey::WASM_FUNCTION_KIND + || output.key.kind() == CompileKey::ARRAY_TO_WASM_TRAMPOLINE_KIND { indices .compiled_func_index_to_module - .insert(index.unwrap_function(), x.key.module()); - if let Some(info) = x.info { - indices.wasm_function_infos.insert(x.key, info); - } + .insert(index.unwrap_function(), output.key.module()); + indices + .start_srclocs + .insert(output.key, output.start_srcloc); } indices .indices - .entry(x.key.kind()) + .entry(output.key.kind()) .or_default() - .insert(x.key, index); + .insert(output.key, index); + } + + PreLinkOutput { + needs_gc_heap, + compiled_funcs, + indices, } - (compiled_funcs, indices) } } +/// Our pre-link functions that have been flattened into a single list. +struct PreLinkOutput { + /// Whether or not any of these functions require a GC heap + needs_gc_heap: bool, + /// The flattened list of (symbol name, compiled function) pairs, as they + /// will be laid out in the object file. + compiled_funcs: Vec<(String, Box)>, + /// The `FunctionIndices` mapping our function keys to indices in that flat + /// list. + indices: FunctionIndices, +} + #[derive(Default)] struct FunctionIndices { // A reverse map from an index in `compiled_funcs` to the // `StaticModuleIndex` for that function. compiled_func_index_to_module: HashMap, - // A map from Wasm functions' compile keys to their infos. - wasm_function_infos: HashMap, + // A map of wasm functions and where they're located in the original file. + start_srclocs: HashMap, // The index of each compiled function, bucketed by compile key kind. indices: BTreeMap>>, @@ -804,7 +846,7 @@ impl FunctionIndices { .map(|(key, wasm_func_index)| { let wasm_func_index = wasm_func_index.unwrap_function(); let wasm_func_loc = symbol_ids_and_locs[wasm_func_index].1; - let wasm_func_info = self.wasm_function_infos.remove(&key).unwrap(); + let start_srcloc = self.start_srclocs.remove(&key).unwrap(); let array_to_wasm_trampoline = array_to_wasm_trampolines .remove(&CompileKey::array_to_wasm_trampoline( @@ -814,7 +856,7 @@ impl FunctionIndices { .map(|x| symbol_ids_and_locs[x.unwrap_function()].1); CompiledFunctionInfo { - wasm_func_info, + start_srcloc, wasm_func_loc, array_to_wasm_trampoline, } diff --git a/crates/wasmtime/src/config.rs b/crates/wasmtime/src/config.rs index 211e263cfe..975abe2ecc 100644 --- a/crates/wasmtime/src/config.rs +++ b/crates/wasmtime/src/config.rs @@ -491,9 +491,9 @@ impl Config { WasmBacktraceDetails::Enable => Some(true), WasmBacktraceDetails::Disable => Some(false), WasmBacktraceDetails::Environment => { - self.wasm_backtrace_details_env_used = true; #[cfg(feature = "std")] { + self.wasm_backtrace_details_env_used = true; std::env::var("WASMTIME_BACKTRACE_DETAILS") .map(|s| Some(s == "1")) .unwrap_or(Some(false)) @@ -1115,27 +1115,48 @@ impl Config { /// lifting and lowering functions, as well as `stream`, `future`, and /// `error-context` types. /// - /// [proposal]: https://github.com/WebAssembly/component-model/blob/main/design/mvp/Async.md + /// Please note that Wasmtime's support for this feature is _very_ + /// incomplete. + /// + /// [proposal]: + /// https://github.com/WebAssembly/component-model/blob/main/design/mvp/Async.md #[cfg(feature = "component-model-async")] pub fn wasm_component_model_async(&mut self, enable: bool) -> &mut Self { self.wasm_feature(WasmFeatures::CM_ASYNC, enable); self } - /// TODO + /// This corresponds to the 🚝 emoji in the component model specification. + /// + /// Please note that Wasmtime's support for this feature is _very_ + /// incomplete. + /// + /// [proposal]: + /// https://github.com/WebAssembly/component-model/blob/main/design/mvp/Async.md #[cfg(feature = "component-model-async")] pub fn wasm_component_model_async_builtins(&mut self, enable: bool) -> &mut Self { self.wasm_feature(WasmFeatures::CM_ASYNC_BUILTINS, enable); self } - /// TODO + /// This corresponds to the 🚟 emoji in the component model specification. + /// + /// Please note that Wasmtime's support for this feature is _very_ + /// incomplete. + /// + /// [proposal]: https://github.com/WebAssembly/component-model/blob/main/design/mvp/Async.md #[cfg(feature = "component-model-async")] pub fn wasm_component_model_async_stackful(&mut self, enable: bool) -> &mut Self { self.wasm_feature(WasmFeatures::CM_ASYNC_STACKFUL, enable); self } + /// TODO + pub fn wasm_component_model_error_context(&mut self, enable: bool) -> &mut Self { + self.wasm_feature(WasmFeatures::CM_ERROR_CONTEXT, enable); + self + } + /// Configures which compilation strategy will be used for wasm modules. /// /// This method can be used to configure which compiler is used for wasm @@ -1204,7 +1225,7 @@ impl Config { /// optimization level used for generated code in a few various ways. For /// more information see the documentation of [`OptLevel`]. /// - /// The default value for this is `OptLevel::None`. + /// The default value for this is `OptLevel::Speed`. #[cfg(any(feature = "cranelift", feature = "winch"))] pub fn cranelift_opt_level(&mut self, level: OptLevel) -> &mut Self { let val = match level { diff --git a/crates/wasmtime/src/engine.rs b/crates/wasmtime/src/engine.rs index b303926dfc..9790763de0 100644 --- a/crates/wasmtime/src/engine.rs +++ b/crates/wasmtime/src/engine.rs @@ -7,6 +7,7 @@ use crate::runtime::type_registry::TypeRegistry; use crate::runtime::vm::GcRuntime; use crate::Config; use alloc::sync::Arc; +use core::ptr::NonNull; #[cfg(target_has_atomic = "64")] use core::sync::atomic::{AtomicU64, Ordering}; #[cfg(any(feature = "cranelift", feature = "winch"))] @@ -225,13 +226,13 @@ impl Engine { /// [`Engine::precompile_module`], or [`Engine::precompile_component`], then /// this will return `Some(...)` indicating so. Otherwise `None` is /// returned. - pub fn detect_precompiled(&self, bytes: &[u8]) -> Option { + pub fn detect_precompiled(bytes: &[u8]) -> Option { serialization::detect_precompiled_bytes(bytes) } /// Like [`Engine::detect_precompiled`], but performs the detection on a file. #[cfg(feature = "std")] - pub fn detect_precompiled_file(&self, path: impl AsRef) -> Result> { + pub fn detect_precompiled_file(path: impl AsRef) -> Result> { serialization::detect_precompiled_file(path) } @@ -391,6 +392,7 @@ impl Engine { | "regalloc_algorithm" | "is_pic" | "bb_padding_log2_minus_one" + | "log2_min_function_alignment" | "machine_code_cfg_info" | "tls_model" // wasmtime doesn't use tls right now | "stack_switch_model" // wasmtime doesn't use stack switching right now @@ -783,6 +785,29 @@ impl Engine { ) } + /// Loads a `CodeMemory` from the specified memory region without copying + /// + /// The `expected` marker here is whether the bytes are expected to be + /// a precompiled module or a component. The `memory` provided is expected + /// to be a serialized module (.cwasm) generated by `[Module::serialize]` + /// or [`Engine::precompile_module] or their `Component` counterparts + /// [`Component::serialize`] or `[Engine::precompile_component]`. + /// + /// The memory provided is guaranteed to only be immutably by the runtime. + /// + /// # Safety + /// + /// As there is no copy here, the runtime will be making direct readonly use + /// of the provided memory. As such, outside writes to this memory region + /// will result in undefined and likely very undesirable behavior. + pub(crate) unsafe fn load_code_raw( + &self, + memory: NonNull<[u8]>, + expected: ObjectKind, + ) -> Result> { + self.load_code(crate::runtime::vm::MmapVec::from_raw(memory)?, expected) + } + /// Like `load_code_bytes`, but creates a mmap from a file on disk. #[cfg(feature = "std")] pub(crate) fn load_code_file( diff --git a/crates/wasmtime/src/engine/serialization.rs b/crates/wasmtime/src/engine/serialization.rs index add152315b..092087f56d 100644 --- a/crates/wasmtime/src/engine/serialization.rs +++ b/crates/wasmtime/src/engine/serialization.rs @@ -68,7 +68,7 @@ pub fn check_compatible(engine: &Engine, mmap: &[u8], expected: ObjectKind) -> R os_abi: obj::ELFOSABI_WASMTIME, abi_version: 0, e_flags, - } if e_flags == expected_e_flags => {} + } if e_flags & expected_e_flags == expected_e_flags => {} _ => bail!("incompatible object file format"), } @@ -149,13 +149,13 @@ fn detect_precompiled<'data, R: object::ReadRef<'data>>( FileFlags::Elf { os_abi: obj::ELFOSABI_WASMTIME, abi_version: 0, - e_flags: obj::EF_WASMTIME_MODULE, - } => Some(Precompiled::Module), + e_flags, + } if e_flags & obj::EF_WASMTIME_MODULE != 0 => Some(Precompiled::Module), FileFlags::Elf { os_abi: obj::ELFOSABI_WASMTIME, abi_version: 0, - e_flags: obj::EF_WASMTIME_COMPONENT, - } => Some(Precompiled::Component), + e_flags, + } if e_flags & obj::EF_WASMTIME_COMPONENT != 0 => Some(Precompiled::Component), _ => None, } } @@ -200,9 +200,10 @@ struct WasmFeatures { function_references: bool, gc: bool, custom_page_sizes: bool, - cm_async: bool, - cm_async_builtins: bool, - cm_async_stackful: bool, + component_model_async: bool, + component_model_async_builtins: bool, + component_model_async_stackful: bool, + component_model_error_context: bool, gc_types: bool, wide_arithmetic: bool, stack_switching: bool, @@ -229,11 +230,12 @@ impl Metadata<'_> { gc, custom_page_sizes, shared_everything_threads, - cm_values, - cm_nested_names, cm_async, - cm_async_stackful, cm_async_builtins, + cm_async_stackful, + cm_error_context, + cm_nested_names, + cm_values, legacy_exceptions, gc_types, stack_switching, @@ -250,8 +252,8 @@ impl Metadata<'_> { // above so that once we do implement support for them, we won't // silently ignore them during serialization. assert!(!memory_control); - assert!(!cm_values); assert!(!cm_nested_names); + assert!(!cm_values); assert!(!shared_everything_threads); assert!(!legacy_exceptions); @@ -276,12 +278,13 @@ impl Metadata<'_> { function_references, gc, custom_page_sizes, - cm_async, gc_types, wide_arithmetic, stack_switching, - cm_async_builtins, - cm_async_stackful, + component_model_async: cm_async, + component_model_async_builtins: cm_async_builtins, + component_model_async_stackful: cm_async_stackful, + component_model_error_context: cm_error_context, }, } } @@ -488,12 +491,13 @@ impl Metadata<'_> { function_references, gc, custom_page_sizes, - cm_async, + component_model_async, + component_model_async_builtins, + component_model_async_stackful, + component_model_error_context, gc_types, wide_arithmetic, stack_switching, - cm_async_builtins, - cm_async_stackful, } = self.features; use wasmparser::WasmFeatures as F; @@ -569,10 +573,25 @@ impl Metadata<'_> { "WebAssembly custom-page-sizes support", )?; Self::check_bool( - cm_async, + component_model_async, other.contains(F::CM_ASYNC), "WebAssembly component model support for async lifts/lowers, futures, streams, and errors", )?; + Self::check_bool( + component_model_async_builtins, + other.contains(F::CM_ASYNC_BUILTINS), + "WebAssembly component model support for async builtins", + )?; + Self::check_bool( + component_model_async_stackful, + other.contains(F::CM_ASYNC_STACKFUL), + "WebAssembly component model support for async stackful", + )?; + Self::check_bool( + component_model_error_context, + other.contains(F::CM_ERROR_CONTEXT), + "WebAssembly component model support for error-context", + )?; Self::check_cfg_bool( cfg!(feature = "gc"), "gc", @@ -590,16 +609,6 @@ impl Metadata<'_> { other.contains(F::STACK_SWITCHING), "WebAssembly stack switching support", )?; - Self::check_bool( - cm_async_builtins, - other.contains(F::CM_ASYNC_BUILTINS), - "TODO better error message", - )?; - Self::check_bool( - cm_async_stackful, - other.contains(F::CM_ASYNC_STACKFUL), - "TODO better error message", - )?; Ok(()) } diff --git a/crates/wasmtime/src/runtime/code_memory.rs b/crates/wasmtime/src/runtime/code_memory.rs index 295ecfb5f4..a185c3f7a7 100644 --- a/crates/wasmtime/src/runtime/code_memory.rs +++ b/crates/wasmtime/src/runtime/code_memory.rs @@ -35,6 +35,7 @@ pub struct CodeMemory { trap_data: Range, wasm_data: Range, address_map_data: Range, + stack_map_data: Range, func_name_data: Range, info_data: Range, wasm_dwarf: Range, @@ -45,9 +46,11 @@ impl Drop for CodeMemory { // If there is a custom code memory handler, restore the // original (non-executable) state of the memory. if let Some(mem) = self.custom_code_memory.as_ref() { - let text = self.text(); - mem.unpublish_executable(text.as_ptr(), text.len()) - .expect("Executable memory unpublish failed"); + if self.published && self.needs_executable { + let text = self.text(); + mem.unpublish_executable(text.as_ptr(), text.len()) + .expect("Executable memory unpublish failed"); + } } // Drop the registrations before `self.mmap` since they (implicitly) refer to it. @@ -121,6 +124,7 @@ impl CodeMemory { let mut trap_data = 0..0; let mut wasm_data = 0..0; let mut address_map_data = 0..0; + let mut stack_map_data = 0..0; let mut func_name_data = 0..0; let mut info_data = 0..0; let mut wasm_dwarf = 0..0; @@ -181,6 +185,7 @@ impl CodeMemory { crate::runtime::vm::UnwindRegistration::SECTION_NAME => unwind = range, obj::ELF_WASM_DATA => wasm_data = range, obj::ELF_WASMTIME_ADDRMAP => address_map_data = range, + obj::ELF_WASMTIME_STACK_MAP => stack_map_data = range, obj::ELF_WASMTIME_TRAPS => trap_data = range, obj::ELF_NAME_DATA => func_name_data = range, obj::ELF_WASMTIME_INFO => info_data = range, @@ -213,6 +218,7 @@ impl CodeMemory { unwind, trap_data, address_map_data, + stack_map_data, func_name_data, wasm_dwarf, info_data, @@ -263,6 +269,12 @@ impl CodeMemory { &self.mmap[self.address_map_data.clone()] } + /// Returns the encoded stack map section used to pass to + /// `wasmtime_environ::StackMap::lookup`. + pub fn stack_map_data(&self) -> &[u8] { + &self.mmap[self.stack_map_data.clone()] + } + /// Returns the contents of the `ELF_WASMTIME_INFO` section, or an empty /// slice if it wasn't found. #[inline] @@ -324,11 +336,17 @@ impl CodeMemory { // we aren't able to make it readonly, but this is just a // defense-in-depth measure and isn't required for correctness. #[cfg(has_virtual_memory)] - self.mmap.make_readonly(0..self.mmap.len())?; + if self.mmap.supports_virtual_memory() { + self.mmap.make_readonly(0..self.mmap.len())?; + } // Switch the executable portion from readonly to read/execute. if self.needs_executable { if !self.custom_publish()? { + if !self.mmap.supports_virtual_memory() { + bail!("this target requires virtual memory to be enabled"); + } + #[cfg(has_virtual_memory)] { let text = self.text(); @@ -349,8 +367,6 @@ impl CodeMemory { // Flush any in-flight instructions from the pipeline icache_coherence::pipeline_flush_mt().expect("Failed pipeline flush"); } - #[cfg(not(has_virtual_memory))] - bail!("this target requires virtual memory to be enabled"); } } @@ -395,6 +411,10 @@ impl CodeMemory { return Ok(()); } + if self.mmap.is_always_readonly() { + bail!("Unable to apply relocations to readonly MmapVec"); + } + for (offset, libcall) in self.relocations.iter() { let offset = self.text.start + offset; let libcall = match libcall { @@ -413,6 +433,7 @@ impl CodeMemory { #[cfg(not(target_arch = "x86_64"))] obj::LibCall::X86Pshufb => unreachable!(), }; + self.mmap .as_mut_slice() .as_mut_ptr() diff --git a/crates/wasmtime/src/runtime/component/bindgen_examples/mod.rs b/crates/wasmtime/src/runtime/component/bindgen_examples/mod.rs index d61c9e7c96..e77ce276ed 100644 --- a/crates/wasmtime/src/runtime/component/bindgen_examples/mod.rs +++ b/crates/wasmtime/src/runtime/component/bindgen_examples/mod.rs @@ -493,7 +493,7 @@ pub mod _6_exported_resources; /// * async functions are used /// * enabled async in bindgen! macro /// -/// See [wasi_async_example](https://github.com/bytecodealliance/wasmtime/tree/main/examples/wasi-async) for async function calls on a host. +/// See [wasi_async_example](https://github.com/bytecodealliance/wasmtime/blob/main/examples/wasip1-async/main.rs) for async function calls on a host. /// /// ```rust /// use wasmtime::Result; diff --git a/crates/wasmtime/src/runtime/component/component.rs b/crates/wasmtime/src/runtime/component/component.rs index 4b956d656c..495d291a19 100644 --- a/crates/wasmtime/src/runtime/component/component.rs +++ b/crates/wasmtime/src/runtime/component/component.rs @@ -214,6 +214,23 @@ impl Component { Component::from_parts(engine, code, None) } + /// Same as [`Module::deserialize_raw`], but for components. + /// + /// See [`Component::deserialize`] for additional information; this method + /// works identically except that it will not create a copy of the provided + /// memory but will use it directly. + /// + /// # Unsafety + /// + /// All of the safety notes from [`Component::deserialize`] apply here as well + /// with the additional constraint that the code memory provide by `memory` + /// lives for as long as the module and is nevery externally modified for + /// the lifetime of the deserialized module. + pub unsafe fn deserialize_raw(engine: &Engine, memory: NonNull<[u8]>) -> Result { + let code = engine.load_code_raw(memory, ObjectKind::Component)?; + Component::from_parts(engine, code, None) + } + /// Same as [`Module::deserialize_file`], but for components. /// /// Note that the file referenced here must contain contents previously @@ -453,6 +470,11 @@ impl Component { &self.inner.static_modules[idx] } + #[cfg_attr(not(feature = "profiling"), allow(dead_code))] + pub(crate) fn static_modules(&self) -> impl Iterator { + self.inner.static_modules.values() + } + #[inline] pub(crate) fn types(&self) -> &Arc { self.inner.component_types() @@ -606,6 +628,7 @@ impl Component { }, GlobalInitializer::LowerImport { .. } | GlobalInitializer::ExtractMemory(_) + | GlobalInitializer::ExtractTable(_) | GlobalInitializer::ExtractRealloc(_) | GlobalInitializer::ExtractCallback(_) | GlobalInitializer::ExtractPostReturn(_) diff --git a/crates/wasmtime/src/runtime/component/func/options.rs b/crates/wasmtime/src/runtime/component/func/options.rs index e91271aa8e..ae7303a4c8 100644 --- a/crates/wasmtime/src/runtime/component/func/options.rs +++ b/crates/wasmtime/src/runtime/component/func/options.rs @@ -220,7 +220,7 @@ impl<'a, T> LowerContext<'a, T> { /// # Unsafety /// /// This function is unsafe as it needs to be guaranteed by the caller that - /// the `instance` here is is valid within `store` and is a valid component + /// the `instance` here is valid within `store` and is a valid component /// instance. pub unsafe fn new( store: StoreContextMut<'a, T>, diff --git a/crates/wasmtime/src/runtime/component/func/typed.rs b/crates/wasmtime/src/runtime/component/func/typed.rs index 6c6fa788b9..affca9fdca 100644 --- a/crates/wasmtime/src/runtime/component/func/typed.rs +++ b/crates/wasmtime/src/runtime/component/func/typed.rs @@ -8,6 +8,7 @@ use crate::{AsContextMut, StoreContext, StoreContextMut, ValRaw}; use alloc::borrow::Cow; use alloc::sync::Arc; use core::fmt; +use core::iter; use core::marker; use core::mem::{self, MaybeUninit}; use core::ptr::NonNull; @@ -1176,6 +1177,39 @@ macro_rules! floats { *ptr = self.to_bits().to_le_bytes(); Ok(()) } + + fn store_list( + cx: &mut LowerContext<'_, T>, + ty: InterfaceType, + offset: usize, + items: &[Self], + ) -> Result<()> { + debug_assert!(matches!(ty, InterfaceType::$ty)); + + // Double-check that the CM alignment is at least the host's + // alignment for this type which should be true for all + // platforms. + assert!((Self::ALIGN32 as usize) >= mem::align_of::()); + + // Slice `cx`'s memory to the window that we'll be modifying. + // This should all have already been verified in terms of + // alignment and sizing meaning that these assertions here are + // not truly necessary but are instead double-checks. + let dst = &mut cx.as_slice_mut()[offset..][..items.len() * Self::SIZE32]; + assert!(dst.as_ptr().cast::().is_aligned()); + + // And with all that out of the way perform the copying loop. + // This is not a `copy_from_slice` because endianness needs to + // be handled here, but LLVM should pretty easily transform this + // into a memcpy on little-endian platforms. + // TODO use `as_chunks` when https://github.com/rust-lang/rust/issues/74985 + // is stabilized + for (dst, src) in iter::zip(dst.chunks_exact_mut(Self::SIZE32), items) { + let dst: &mut [u8; Self::SIZE32] = dst.try_into().unwrap(); + *dst = src.to_le_bytes(); + } + Ok(()) + } } unsafe impl Lift for $float { @@ -1191,6 +1225,27 @@ macro_rules! floats { debug_assert!((bytes.as_ptr() as usize) % Self::SIZE32 == 0); Ok($float::from_le_bytes(bytes.try_into().unwrap())) } + + fn load_list(cx: &mut LiftContext<'_>, list: &WasmList) -> Result> where Self: Sized { + // See comments in `WasmList::get` for the panicking indexing + let byte_size = list.len * mem::size_of::(); + let bytes = &cx.memory()[list.ptr..][..byte_size]; + + // The canonical ABI requires that everything is aligned to its + // own size, so this should be an aligned array. + assert!(bytes.as_ptr().cast::().is_aligned()); + + // Copy the resulting slice to a new Vec, handling endianness + // in the process + // TODO use `as_chunks` when https://github.com/rust-lang/rust/issues/74985 + // is stabilized + Ok( + bytes + .chunks_exact(Self::SIZE32) + .map(|i| $float::from_le_bytes(i.try_into().unwrap())) + .collect() + ) + } } };)*) } @@ -2142,7 +2197,7 @@ unsafe impl ComponentType for Option where T: ComponentType, { - type Lower = TupleLower2<::Lower, T::Lower>; + type Lower = TupleLower<::Lower, T::Lower>; const ABI: CanonicalAbiInfo = CanonicalAbiInfo::variant_static(&[None, Some(T::ABI)]); @@ -2564,22 +2619,61 @@ where unsafe { MaybeUninit::uninit().assume_init() } } -macro_rules! impl_component_ty_for_tuples { - ($n:tt $($t:ident)*) => {paste::paste!{ - #[allow(non_snake_case)] - #[doc(hidden)] - #[derive(Clone, Copy)] - #[repr(C)] - pub struct []<$($t),*> { - $($t: $t,)* - _align_tuple_lower0_correctly: [ValRaw; 0], - } +/// Helper structure to define `Lower` for tuples below. +/// +/// Uses default type parameters to have fields be zero-sized and not present +/// in memory for smaller tuple values. +#[allow(non_snake_case)] +#[doc(hidden)] +#[derive(Clone, Copy)] +#[repr(C)] +pub struct TupleLower< + T1 = (), + T2 = (), + T3 = (), + T4 = (), + T5 = (), + T6 = (), + T7 = (), + T8 = (), + T9 = (), + T10 = (), + T11 = (), + T12 = (), + T13 = (), + T14 = (), + T15 = (), + T16 = (), + T17 = (), +> { + // NB: these names match the names in `for_each_function_signature!` + A1: T1, + A2: T2, + A3: T3, + A4: T4, + A5: T5, + A6: T6, + A7: T7, + A8: T8, + A9: T9, + A10: T10, + A11: T11, + A12: T12, + A13: T13, + A14: T14, + A15: T15, + A16: T16, + A17: T17, + _align_tuple_lower0_correctly: [ValRaw; 0], +} +macro_rules! impl_component_ty_for_tuples { + ($n:tt $($t:ident)*) => { #[allow(non_snake_case)] unsafe impl<$($t,)*> ComponentType for ($($t,)*) where $($t: ComponentType),* { - type Lower = []<$($t::Lower),*>; + type Lower = TupleLower<$($t::Lower),*>; const ABI: CanonicalAbiInfo = CanonicalAbiInfo::record_static(&[ $($t::ABI),* @@ -2687,7 +2781,7 @@ macro_rules! impl_component_ty_for_tuples { unsafe impl<$($t,)*> ComponentNamedList for ($($t,)*) where $($t: ComponentType),* {} - }}; + }; } for_each_function_signature!(impl_component_ty_for_tuples); diff --git a/crates/wasmtime/src/runtime/component/instance.rs b/crates/wasmtime/src/runtime/component/instance.rs index b872dcb1ce..dc164311d8 100644 --- a/crates/wasmtime/src/runtime/component/instance.rs +++ b/crates/wasmtime/src/runtime/component/instance.rs @@ -601,6 +601,8 @@ impl<'a> Instantiator<'a> { self.data.state.set_lowering(*index, func.lowering()); } + GlobalInitializer::ExtractTable(table) => self.extract_table(store.0, table), + GlobalInitializer::ExtractMemory(mem) => self.extract_memory(store.0, mem), GlobalInitializer::ExtractRealloc(realloc) => { @@ -678,6 +680,16 @@ impl<'a> Instantiator<'a> { .set_runtime_post_return(post_return.index, func_ref); } + fn extract_table(&mut self, store: &mut StoreOpaque, table: &ExtractTable) { + let export = match self.data.lookup_export(store, &table.export) { + crate::runtime::vm::Export::Table(t) => t, + _ => unreachable!(), + }; + self.data + .state + .set_runtime_table(table.index, export.definition, export.vmctx); + } + fn build_imports<'b>( &mut self, store: &mut StoreOpaque, diff --git a/crates/wasmtime/src/runtime/externals/table.rs b/crates/wasmtime/src/runtime/externals/table.rs index dad515655d..983b1eaabe 100644 --- a/crates/wasmtime/src/runtime/externals/table.rs +++ b/crates/wasmtime/src/runtime/externals/table.rs @@ -120,7 +120,7 @@ impl Table { unsafe { let table = Table::from_wasmtime_table(wasmtime_export, store); let wasmtime_table = table.wasmtime_table(store, iter::empty()); - (*wasmtime_table).fill(store.optional_gc_store_mut()?, 0, init, ty.minimum())?; + (*wasmtime_table).fill(store.optional_gc_store_mut(), 0, init, ty.minimum())?; Ok(table) } } @@ -166,7 +166,7 @@ impl Table { pub fn get(&self, mut store: impl AsContextMut, index: u64) -> Option { let mut store = AutoAssertNoGc::new(store.as_context_mut().0); let table = self.wasmtime_table(&mut store, iter::once(index)); - let gc_store = store.optional_gc_store_mut().ok().and_then(|s| s); + let gc_store = store.optional_gc_store_mut(); unsafe { match (*table).get(gc_store, index)? { runtime::TableElement::FuncRef(f) => { @@ -356,7 +356,7 @@ impl Table { let src_table = src_table.wasmtime_table(store, src_range); unsafe { runtime::Table::copy( - store.optional_gc_store_mut()?, + store.optional_gc_store_mut(), dst_table, src_table, dst_index, @@ -390,7 +390,7 @@ impl Table { let table = self.wasmtime_table(store, iter::empty()); unsafe { - (*table).fill(store.optional_gc_store_mut()?, dst, val, len)?; + (*table).fill(store.optional_gc_store_mut(), dst, val, len)?; } Ok(()) @@ -436,9 +436,9 @@ impl Table { &data[self.0].table } - pub(crate) fn vmimport(&self, store: &StoreOpaque) -> crate::runtime::vm::VMTableImport { + pub(crate) fn vmimport(&self, store: &StoreOpaque) -> crate::runtime::vm::VMTable { let export = &store[self.0]; - crate::runtime::vm::VMTableImport { + crate::runtime::vm::VMTable { from: export.definition.into(), vmctx: export.vmctx.into(), } diff --git a/crates/wasmtime/src/runtime/func.rs b/crates/wasmtime/src/runtime/func.rs index 028bfdc8f7..6fa1a1d104 100644 --- a/crates/wasmtime/src/runtime/func.rs +++ b/crates/wasmtime/src/runtime/func.rs @@ -1246,9 +1246,8 @@ impl Func { let num_gc_refs = ty.as_wasm_func_type().non_i31_gc_ref_params_count(); if let Some(num_gc_refs) = core::num::NonZeroUsize::new(num_gc_refs) { return Ok(opaque - .gc_store()? - .gc_heap - .need_gc_before_entering_wasm(num_gc_refs)); + .optional_gc_store() + .is_some_and(|s| s.gc_heap.need_gc_before_entering_wasm(num_gc_refs))); } } @@ -2018,7 +2017,7 @@ pub unsafe trait WasmTyList { } macro_rules! impl_wasm_ty_list { - ($num:tt $($args:ident)*) => (paste::paste!{ + ($num:tt $($args:ident)*) => ( #[allow(non_snake_case)] unsafe impl<$($args),*> WasmTyList for ($($args,)*) where @@ -2042,7 +2041,7 @@ macro_rules! impl_wasm_ty_list { $( $args::may_gc() || )* false } } - }); + ); } for_each_function_signature!(impl_wasm_ty_list); diff --git a/crates/wasmtime/src/runtime/gc/enabled/anyref.rs b/crates/wasmtime/src/runtime/gc/enabled/anyref.rs index 82efee8089..7f6ef8af3b 100644 --- a/crates/wasmtime/src/runtime/gc/enabled/anyref.rs +++ b/crates/wasmtime/src/runtime/gc/enabled/anyref.rs @@ -278,6 +278,7 @@ impl AnyRef { // (Not actually memory unsafe since we have indexed GC heaps.) pub(crate) fn _from_raw(store: &mut AutoAssertNoGc, raw: u32) -> Option> { let gc_ref = VMGcRef::from_raw_u32(raw)?; + let gc_ref = store.unwrap_gc_store_mut().clone_gc_ref(&gc_ref); Some(Self::from_cloned_gc_ref(store, gc_ref)) } @@ -330,9 +331,8 @@ impl AnyRef { pub(crate) unsafe fn _to_raw(&self, store: &mut AutoAssertNoGc<'_>) -> Result { let gc_ref = self.inner.try_clone_gc_ref(store)?; - let raw = gc_ref.as_raw_u32(); - store.gc_store_mut()?.expose_gc_ref_to_wasm(gc_ref); - Ok(raw) + let raw = store.gc_store_mut()?.expose_gc_ref_to_wasm(gc_ref); + Ok(raw.get()) } /// Get the type of this reference. diff --git a/crates/wasmtime/src/runtime/gc/enabled/externref.rs b/crates/wasmtime/src/runtime/gc/enabled/externref.rs index 995477f2fa..1f5a0349fc 100644 --- a/crates/wasmtime/src/runtime/gc/enabled/externref.rs +++ b/crates/wasmtime/src/runtime/gc/enabled/externref.rs @@ -503,9 +503,8 @@ impl ExternRef { pub(crate) fn _to_raw(&self, store: &mut AutoAssertNoGc) -> Result { let gc_ref = self.inner.try_clone_gc_ref(store)?; - let raw = gc_ref.as_raw_u32(); - store.unwrap_gc_store_mut().expose_gc_ref_to_wasm(gc_ref); - Ok(raw) + let raw = store.unwrap_gc_store_mut().expose_gc_ref_to_wasm(gc_ref); + Ok(raw.get()) } } diff --git a/crates/wasmtime/src/runtime/gc/enabled/rooting.rs b/crates/wasmtime/src/runtime/gc/enabled/rooting.rs index ae525854ad..b020c7a0b6 100644 --- a/crates/wasmtime/src/runtime/gc/enabled/rooting.rs +++ b/crates/wasmtime/src/runtime/gc/enabled/rooting.rs @@ -437,8 +437,8 @@ impl RootSet { for root in lifo_roots.drain(scope..) { // Only drop the GC reference if we actually have a GC store. How // can we have a GC reference but not a GC store? If we've only - // create `i31refs`, we never force a GC store's allocation. This is - // fine because `i31ref`s never need drop barriers. + // created `i31refs`, we never force a GC store's allocation. This + // is fine because `i31ref`s never need drop barriers. if let Some(gc_store) = &mut gc_store { gc_store.drop_gc_ref(root.gc_ref); } @@ -968,10 +968,18 @@ impl Rooted { val_raw: impl Fn(u32) -> ValRaw, ) -> Result<()> { let gc_ref = self.inner.try_clone_gc_ref(store)?; - let raw = gc_ref.as_raw_u32(); - debug_assert_ne!(raw, 0); - store.gc_store_mut()?.expose_gc_ref_to_wasm(gc_ref); - ptr.write(val_raw(raw)); + + let raw = match store.optional_gc_store_mut() { + Some(s) => s.expose_gc_ref_to_wasm(gc_ref), + None => { + // NB: do not force the allocation of a GC heap just because the + // program is using `i31ref`s. + debug_assert!(gc_ref.is_i31()); + gc_ref.as_raw_non_zero_u32() + } + }; + + ptr.write(val_raw(raw.get())); Ok(()) } @@ -984,7 +992,17 @@ impl Rooted { ) -> Self { debug_assert_ne!(raw_gc_ref, 0); let gc_ref = VMGcRef::from_raw_u32(raw_gc_ref).expect("non-null"); - let gc_ref = store.unwrap_gc_store_mut().clone_gc_ref(&gc_ref); + + let gc_ref = match store.optional_gc_store_mut() { + Some(s) => s.clone_gc_ref(&gc_ref), + None => { + // NB: do not force the allocation of a GC heap just because the + // program is using `i31ref`s. + debug_assert!(gc_ref.is_i31()); + gc_ref.unchecked_copy() + } + }; + from_cloned_gc_ref(store, gc_ref) } @@ -1758,10 +1776,8 @@ where val_raw: impl Fn(u32) -> ValRaw, ) -> Result<()> { let gc_ref = self.try_clone_gc_ref(store)?; - let raw = gc_ref.as_raw_u32(); - debug_assert_ne!(raw, 0); - store.gc_store_mut()?.expose_gc_ref_to_wasm(gc_ref); - ptr.write(val_raw(raw)); + let raw = store.gc_store_mut()?.expose_gc_ref_to_wasm(gc_ref); + ptr.write(val_raw(raw.get())); Ok(()) } diff --git a/crates/wasmtime/src/runtime/instance.rs b/crates/wasmtime/src/runtime/instance.rs index 0fdccad18e..553b00442a 100644 --- a/crates/wasmtime/src/runtime/instance.rs +++ b/crates/wasmtime/src/runtime/instance.rs @@ -2,7 +2,7 @@ use crate::linker::{Definition, DefinitionType}; use crate::prelude::*; use crate::runtime::vm::{ Imports, InstanceAllocationRequest, ModuleRuntimeInfo, StorePtr, VMFuncRef, VMFunctionImport, - VMGlobalImport, VMMemoryImport, VMOpaqueContext, VMTableImport, VMTagImport, + VMGlobalImport, VMMemoryImport, VMOpaqueContext, VMTable, VMTagImport, }; use crate::store::{InstanceId, StoreOpaque, Stored}; use crate::types::matching; @@ -269,7 +269,7 @@ impl Instance { store.bump_resource_counts(module)?; // Allocate the GC heap, if necessary. - if store.engine().features().gc_types() { + if module.env_module().needs_gc_heap { let _ = store.gc_store_mut()?; } @@ -666,7 +666,7 @@ impl Instance { pub(crate) struct OwnedImports { functions: PrimaryMap, - tables: PrimaryMap, + tables: PrimaryMap, memories: PrimaryMap, globals: PrimaryMap, tags: PrimaryMap, @@ -749,7 +749,7 @@ impl OwnedImports { }); } crate::runtime::vm::Export::Table(t) => { - self.tables.push(VMTableImport { + self.tables.push(VMTable { from: t.definition.into(), vmctx: t.vmctx.into(), }); diff --git a/crates/wasmtime/src/runtime/instantiate.rs b/crates/wasmtime/src/runtime/instantiate.rs index c36ac31949..201b28b566 100644 --- a/crates/wasmtime/src/runtime/instantiate.rs +++ b/crates/wasmtime/src/runtime/instantiate.rs @@ -9,9 +9,8 @@ use crate::{code_memory::CodeMemory, profiling_agent::ProfilingAgent}; use alloc::sync::Arc; use core::str; use wasmtime_environ::{ - CompiledFunctionInfo, CompiledModuleInfo, DefinedFuncIndex, FuncIndex, FunctionLoc, - FunctionName, Metadata, Module, ModuleInternedTypeIndex, PrimaryMap, StackMapInformation, - WasmFunctionInfo, + CompiledFunctionInfo, CompiledModuleInfo, DefinedFuncIndex, FilePos, FuncIndex, FunctionLoc, + FunctionName, Metadata, Module, ModuleInternedTypeIndex, PrimaryMap, }; /// A compiled wasm module, ready to be instantiated. @@ -174,19 +173,6 @@ impl CompiledModule { &self.text()[loc.start as usize..][..loc.length as usize] } - /// Returns the stack map information for all functions defined in this - /// module. - /// - /// The iterator returned iterates over the span of the compiled function in - /// memory with the stack maps associated with those bytes. - pub fn stack_maps(&self) -> impl Iterator { - self.finished_functions().map(|(_, f)| f).zip( - self.funcs - .values() - .map(|f| &f.wasm_func_info.stack_maps[..]), - ) - } - /// Lookups a defined function by a program counter value. /// /// Returns the defined function index and the relative address of @@ -231,13 +217,10 @@ impl CompiledModule { .wasm_func_loc } - /// Gets the function information for a given function index. - pub fn wasm_func_info(&self, index: DefinedFuncIndex) -> &WasmFunctionInfo { - &self - .funcs - .get(index) - .expect("defined function should be present") - .wasm_func_info + /// Returns the original binary offset in the file that `index` was defined + /// at. + pub fn func_start_srcloc(&self, index: DefinedFuncIndex) -> FilePos { + self.funcs[index].start_srcloc } /// Creates a new symbolication context which can be used to further diff --git a/crates/wasmtime/src/runtime/linker.rs b/crates/wasmtime/src/runtime/linker.rs index 2c4ab49893..625139a568 100644 --- a/crates/wasmtime/src/runtime/linker.rs +++ b/crates/wasmtime/src/runtime/linker.rs @@ -5,10 +5,10 @@ use crate::store::StoreOpaque; use crate::{prelude::*, IntoFunc}; use crate::{ AsContext, AsContextMut, Caller, Engine, Extern, ExternType, Func, FuncType, ImportType, - Instance, Module, StoreContextMut, Val, ValRaw, ValType, + Instance, Module, StoreContextMut, Val, ValRaw, }; use alloc::sync::Arc; -use core::fmt; +use core::fmt::{self, Debug}; use core::marker; #[cfg(feature = "async")] use core::{future::Future, pin::Pin}; @@ -90,6 +90,12 @@ pub struct Linker { _marker: marker::PhantomData T>, } +impl Debug for Linker { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Linker").finish_non_exhaustive() + } +} + impl Clone for Linker { fn clone(&self) -> Linker { Linker { @@ -263,48 +269,28 @@ impl Linker { /// # let module = Module::new(&engine, "(module (import \"unknown\" \"import\" (func)))")?; /// # let mut store = Store::new(&engine, ()); /// let mut linker = Linker::new(&engine); - /// linker.define_unknown_imports_as_default_values(&module)?; + /// linker.define_unknown_imports_as_default_values(&mut store, &module)?; /// linker.instantiate(&mut store, &module)?; /// # Ok(()) /// # } /// ``` pub fn define_unknown_imports_as_default_values( &mut self, + store: &mut impl AsContextMut, module: &Module, ) -> anyhow::Result<()> { for import in module.imports() { if let Err(import_err) = self._get_by_import(&import) { - if let ExternType::Func(func_ty) = import_err.ty() { - let result_tys: Vec<_> = func_ty.results().collect(); - - for ty in &result_tys { - if ty.as_ref().map_or(false, |r| !r.is_nullable()) { - bail!("no default value exists for type `{ty}`") - } - } - - self.func_new( - import.module(), - import.name(), - func_ty, - move |_caller, _args, results| { - for (result, ty) in results.iter_mut().zip(&result_tys) { - *result = match ty { - ValType::I32 => Val::I32(0), - ValType::I64 => Val::I64(0), - ValType::F32 => Val::F32(0.0_f32.to_bits()), - ValType::F64 => Val::F64(0.0_f64.to_bits()), - ValType::V128 => Val::V128(0_u128.into()), - ValType::Ref(r) => { - debug_assert!(r.is_nullable()); - Val::null_ref(r.heap_type()) - } - }; - } - Ok(()) - }, - )?; - } + let default_extern = + import_err.ty().default_value(&mut *store).ok_or_else(|| { + anyhow!("no default value exists for type `{:?}`", import_err.ty()) + })?; + self.define( + store.as_context(), + import.module(), + import.name(), + default_extern, + )?; } } Ok(()) diff --git a/crates/wasmtime/src/runtime/module.rs b/crates/wasmtime/src/runtime/module.rs index 12b5e28748..b254925572 100644 --- a/crates/wasmtime/src/runtime/module.rs +++ b/crates/wasmtime/src/runtime/module.rs @@ -402,6 +402,24 @@ impl Module { Module::from_parts(engine, code, None) } + /// In-place deserialization of an in-memory compiled module previously + /// created with [`Module::serialize`] or [`Engine::precompile_module`]. + /// + /// See [`Self::deserialize`] for additional information; this method + /// works identically except that it will not create a copy of the provided + /// memory but will use it directly. + /// + /// # Unsafety + /// + /// All of the safety notes from [`Self::deserialize`] apply here as well + /// with the additional constraint that the code memory provide by `memory` + /// lives for as long as the module and is nevery externally modified for + /// the lifetime of the deserialized module. + pub unsafe fn deserialize_raw(engine: &Engine, memory: NonNull<[u8]>) -> Result { + let code = engine.load_code_raw(memory, ObjectKind::Module)?; + Module::from_parts(engine, code, None) + } + /// Same as [`deserialize`], except that the contents of `path` are read to /// deserialize into a [`Module`]. /// @@ -1099,28 +1117,10 @@ impl Module { /// Lookup the stack map at a program counter value. #[cfg(feature = "gc")] - pub(crate) fn lookup_stack_map(&self, pc: usize) -> Option<&wasmtime_environ::StackMap> { - let text_offset = pc - self.inner.module.text().as_ptr() as usize; - let (index, func_offset) = self.inner.module.func_by_text_offset(text_offset)?; - let info = self.inner.module.wasm_func_info(index); - - // Do a binary search to find the stack map for the given offset. - let index = match info - .stack_maps - .binary_search_by_key(&func_offset, |i| i.code_offset) - { - // Found it. - Ok(i) => i, - - // No stack map associated with this PC. - // - // Because we know we are in Wasm code, and we must be at some kind - // of call/safepoint, then the Cranelift backend must have avoided - // emitting a stack map for this location because no refs were live. - Err(_) => return None, - }; - - Some(&info.stack_maps[index].stack_map) + pub(crate) fn lookup_stack_map(&self, pc: usize) -> Option> { + let text_offset = u32::try_from(pc - self.inner.module.text().as_ptr() as usize).unwrap(); + let info = self.inner.code.code_memory().stack_map_data(); + wasmtime_environ::StackMap::lookup(text_offset, info) } } diff --git a/crates/wasmtime/src/runtime/profiling.rs b/crates/wasmtime/src/runtime/profiling.rs index eeaa315c6d..8e11a9c3fd 100644 --- a/crates/wasmtime/src/runtime/profiling.rs +++ b/crates/wasmtime/src/runtime/profiling.rs @@ -1,7 +1,10 @@ +#[cfg(feature = "component-model")] +use crate::component::Component; use crate::instantiate::CompiledModule; use crate::prelude::*; use crate::runtime::vm::Backtrace; use crate::{AsContext, CallHook, Module}; +use core::cmp::Ordering; use fxprof_processed_profile::debugid::DebugId; use fxprof_processed_profile::{ CategoryHandle, Frame, FrameFlags, FrameInfo, LibraryInfo, MarkerLocation, MarkerSchema, @@ -78,7 +81,14 @@ pub struct GuestProfiler { start: Instant, } -type Modules = Vec<(Range, fxprof_processed_profile::LibraryHandle)>; +#[derive(Debug)] +struct ProfiledModule { + module: Module, + fxprof_libhandle: fxprof_processed_profile::LibraryHandle, + text_range: Range, +} + +type Modules = Vec; impl GuestProfiler { /// Begin profiling a new guest. When this function is called, the current @@ -96,21 +106,42 @@ impl GuestProfiler { /// host code or functions from other modules will be omitted. See the /// "Security" section of the [`GuestProfiler`] documentation for guidance /// on what modules should not be included in this list. - pub fn new(module_name: &str, interval: Duration, modules: Vec<(String, Module)>) -> Self { + pub fn new( + module_name: &str, + interval: Duration, + modules: impl IntoIterator, + ) -> Self { let zero = ReferenceTimestamp::from_millis_since_unix_epoch(0.0); let mut profile = Profile::new(module_name, zero, interval.into()); + // Past this point, we just need to think about modules as we pull out + // the disparate module information from components. let mut modules: Vec<_> = modules .into_iter() .filter_map(|(name, module)| { let compiled = module.compiled_module(); - let text = compiled.text().as_ptr_range(); - let address_range = text.start as usize..text.end as usize; - module_symbols(name, compiled).map(|lib| (address_range, profile.add_lib(lib))) + let text_range = { + // Assumption: within text, the code for a given module is packed linearly and + // is non-overlapping; if this is violated, it should be safe but might result + // in incorrect profiling results. + let start = + compiled.finished_functions().next()?.1.as_ptr_range().start as usize; + let end = compiled.finished_functions().last()?.1.as_ptr_range().end as usize; + start..end + }; + + module_symbols(name, compiled).map(|lib| { + let libhandle = profile.add_lib(lib); + ProfiledModule { + module, + fxprof_libhandle: libhandle, + text_range, + } + }) }) .collect(); - modules.sort_unstable_by_key(|(range, _)| range.start); + modules.sort_unstable_by_key(|m| m.text_range.start); profile.set_reference_timestamp(std::time::SystemTime::now().into()); let process = profile.add_process(module_name, 0, Timestamp::from_nanos_since_reference(0)); @@ -125,6 +156,26 @@ impl GuestProfiler { } } + /// Create a new profiler for the provided component + /// + /// See [`GuestProfiler::new`] for additional information; this function + /// works identically except that it takes a component and sets up + /// instrumentation to track calls in each of its constituent modules. + #[cfg(feature = "component-model")] + pub fn new_component( + component_name: &str, + interval: Duration, + component: Component, + extra_modules: impl IntoIterator, + ) -> Self { + let modules = component + .static_modules() + .into_iter() + .map(|m| (m.name().unwrap_or("").to_string(), m.clone())) + .chain(extra_modules); + Self::new(component_name, interval, modules) + } + /// Add a sample to the profile. This function collects a backtrace from /// any stack frames for allowed modules on the current stack. It should /// typically be called from a callback registered using @@ -236,21 +287,29 @@ fn lookup_frames<'a>( // first, so iterate in reverse. .rev() .filter_map(|frame| { - // Find the first module whose start address includes this PC. - let module_idx = modules.partition_point(|(range, _)| range.start > frame.pc()); - if let Some((range, lib)) = modules.get(module_idx) { - if range.contains(&frame.pc()) { - return Some(FrameInfo { - frame: Frame::RelativeAddressFromReturnAddress( - *lib, - u32::try_from(frame.pc() - range.start).unwrap(), - ), - category_pair: CategoryHandle::OTHER.into(), - flags: FrameFlags::empty(), - }); - } - } - None + let idx = modules + .binary_search_by(|probe| { + if probe.text_range.contains(&frame.pc()) { + Ordering::Equal + } else { + probe.text_range.start.cmp(&frame.pc()) + } + }) + .ok()?; + let module = modules.get(idx)?; + + // We need to point to the modules full text (not just its functions) as + // the offset for the final phase; these can be different for component + // model modules. + let module_text_start = module.module.text().as_ptr_range().start as usize; + return Some(FrameInfo { + frame: Frame::RelativeAddressFromReturnAddress( + module.fxprof_libhandle, + u32::try_from(frame.pc() - module_text_start).unwrap(), + ), + category_pair: CategoryHandle::OTHER.into(), + flags: FrameFlags::empty(), + }); }) } diff --git a/crates/wasmtime/src/runtime/store.rs b/crates/wasmtime/src/runtime/store.rs index f5bc897312..d90d6fdad2 100644 --- a/crates/wasmtime/src/runtime/store.rs +++ b/crates/wasmtime/src/runtime/store.rs @@ -1447,7 +1447,7 @@ impl StoreOpaque { ); let (index, heap) = engine .allocator() - .allocate_gc_heap(&**engine.gc_runtime()?)?; + .allocate_gc_heap(engine, &**engine.gc_runtime()?)?; Ok(GcStore::new(index, heap)) } @@ -1477,15 +1477,30 @@ impl StoreOpaque { /// If this store is configured with a GC heap, return a mutable reference /// to it. Otherwise, return `None`. #[inline] - pub(crate) fn optional_gc_store_mut(&mut self) -> Result> { + pub(crate) fn optional_gc_store_mut(&mut self) -> Option<&mut GcStore> { if cfg!(not(feature = "gc")) || !self.engine.features().gc_types() { - Ok(None) + debug_assert!(self.gc_store.is_none()); + None + } else { + self.gc_store.as_mut() + } + } + + /// If this store is configured with a GC heap, return a shared reference to + /// it. Otherwise, return `None`. + #[inline] + #[cfg(feature = "gc")] + pub(crate) fn optional_gc_store(&self) -> Option<&GcStore> { + if cfg!(not(feature = "gc")) || !self.engine.features().gc_types() { + debug_assert!(self.gc_store.is_none()); + None } else { - Ok(Some(self.gc_store_mut()?)) + self.gc_store.as_ref() } } #[inline] + #[track_caller] #[cfg(feature = "gc")] pub(crate) fn unwrap_gc_store(&self) -> &GcStore { self.gc_store @@ -1494,6 +1509,7 @@ impl StoreOpaque { } #[inline] + #[track_caller] pub(crate) fn unwrap_gc_store_mut(&mut self) -> &mut GcStore { self.gc_store .as_mut() @@ -2280,7 +2296,7 @@ impl Drop for StoreOpaque { } } -impl StoreContextMut<'_, T> { +impl StoreOpaque { #[cfg(not(feature = "async"))] pub(crate) fn async_guard_range(&self) -> core::ops::Range<*mut u8> { core::ptr::null_mut()..core::ptr::null_mut() diff --git a/crates/wasmtime/src/runtime/store/async_.rs b/crates/wasmtime/src/runtime/store/async_.rs index b245feb04b..dc9faa38de 100644 --- a/crates/wasmtime/src/runtime/store/async_.rs +++ b/crates/wasmtime/src/runtime/store/async_.rs @@ -241,125 +241,6 @@ impl StoreInner { #[doc(hidden)] impl StoreOpaque { - #[cfg(feature = "gc")] - pub async fn gc_async(&mut self) { - assert!( - self.async_support(), - "cannot use `gc_async` without enabling async support in the config", - ); - - // If the GC heap hasn't been initialized, there is nothing to collect. - if self.gc_store.is_none() { - return; - } - - log::trace!("============ Begin Async GC ==========="); - - // Take the GC roots out of `self` so we can borrow it mutably but still - // call mutable methods on `self`. - let mut roots = core::mem::take(&mut self.gc_roots_list); - - self.trace_roots_async(&mut roots).await; - self.unwrap_gc_store_mut() - .gc_async(unsafe { roots.iter() }) - .await; - - // Restore the GC roots for the next GC. - roots.clear(); - self.gc_roots_list = roots; - - log::trace!("============ End Async GC ==========="); - } - - #[inline] - #[cfg(not(feature = "gc"))] - pub async fn gc_async(&mut self) { - // Nothing to collect. - // - // Note that this is *not* a public method, this is just defined for the - // crate-internal `StoreOpaque` type. This is a convenience so that we - // don't have to `cfg` every call site. - } - - #[cfg(feature = "gc")] - async fn trace_roots_async(&mut self, gc_roots_list: &mut crate::runtime::vm::GcRootsList) { - use crate::runtime::vm::Yield; - - log::trace!("Begin trace GC roots"); - - // We shouldn't have any leftover, stale GC roots. - assert!(gc_roots_list.is_empty()); - - self.trace_wasm_stack_roots(gc_roots_list); - Yield::new().await; - self.trace_vmctx_roots(gc_roots_list); - Yield::new().await; - self.trace_user_roots(gc_roots_list); - - log::trace!("End trace GC roots") - } - - /// Yields the async context, assuming that we are executing on a fiber and - /// that fiber is not in the process of dying. This function will return - /// None in the latter case (the fiber is dying), and panic if - /// `async_support()` is false. - #[inline] - pub fn async_cx(&self) -> Option { - assert!(self.async_support()); - - let poll_cx_box_ptr = self.async_state.current_poll_cx.get(); - if poll_cx_box_ptr.is_null() { - return None; - } - - let poll_cx_inner_ptr = unsafe { *poll_cx_box_ptr }; - if poll_cx_inner_ptr.future_context.is_null() { - return None; - } - - Some(AsyncCx { - current_suspend: self.async_state.current_suspend.get(), - current_poll_cx: unsafe { &raw mut (*poll_cx_box_ptr).future_context }, - track_pkey_context_switch: self.pkey.is_some(), - }) - } - - fn allocate_fiber_stack(&mut self) -> Result { - if let Some(stack) = self.async_state.last_fiber_stack.take() { - return Ok(stack); - } - self.engine().allocator().allocate_fiber_stack() - } - - fn deallocate_fiber_stack(&mut self, stack: wasmtime_fiber::FiberStack) { - self.flush_fiber_stack(); - self.async_state.last_fiber_stack = Some(stack); - } - - /// Releases the last fiber stack to the underlying instance allocator, if - /// present. - pub fn flush_fiber_stack(&mut self) { - if let Some(stack) = self.async_state.last_fiber_stack.take() { - unsafe { - self.engine.allocator().deallocate_fiber_stack(stack); - } - } - } -} - -impl StoreContextMut<'_, T> { - pub(crate) fn async_guard_range(&mut self) -> Range<*mut u8> { - #[cfg(feature = "component-model-async")] - { - self.0.concurrent_async_state().async_guard_range() - } - #[cfg(not(feature = "component-model-async"))] - unsafe { - let ptr = self.0.inner.async_state.current_poll_cx.get(); - (*ptr).guard_range_start..(*ptr).guard_range_end - } - } - /// Executes a synchronous computation `func` asynchronously on a new fiber. /// /// This function will convert the synchronous `func` into an asynchronous @@ -371,20 +252,17 @@ impl StoreContextMut<'_, T> { /// that the various comments are illuminating as to what's going on here. pub(crate) async fn on_fiber( &mut self, - func: impl FnOnce(&mut StoreContextMut<'_, T>) -> R + Send, - ) -> Result - where - T: Send, - { + func: impl FnOnce(&mut Self) -> R + Send, + ) -> Result { let config = self.engine().config(); - debug_assert!(self.0.async_support()); + debug_assert!(self.async_support()); debug_assert!(config.async_stack_size > 0); let mut slot = None; let mut future = { - let current_poll_cx = self.0.async_state.current_poll_cx.get(); - let current_suspend = self.0.async_state.current_suspend.get(); - let stack = self.0.allocate_fiber_stack()?; + let current_poll_cx = self.async_state.current_poll_cx.get(); + let current_suspend = self.async_state.current_suspend.get(); + let stack = self.allocate_fiber_stack()?; let engine = self.engine().clone(); let slot = &mut slot; @@ -425,7 +303,7 @@ impl StoreContextMut<'_, T> { let stack = future.fiber.take().map(|f| f.into_stack()); drop(future); if let Some(stack) = stack { - self.0.deallocate_fiber_stack(stack); + self.deallocate_fiber_stack(stack); } return Ok(slot.unwrap()); @@ -659,6 +537,164 @@ impl StoreContextMut<'_, T> { } } } + + #[cfg(feature = "gc")] + pub async fn gc_async(&mut self) { + assert!( + self.async_support(), + "cannot use `gc_async` without enabling async support in the config", + ); + + // If the GC heap hasn't been initialized, there is nothing to collect. + if self.gc_store.is_none() { + return; + } + + log::trace!("============ Begin Async GC ==========="); + + // Take the GC roots out of `self` so we can borrow it mutably but still + // call mutable methods on `self`. + let mut roots = core::mem::take(&mut self.gc_roots_list); + + self.trace_roots_async(&mut roots).await; + self.unwrap_gc_store_mut() + .gc_async(unsafe { roots.iter() }) + .await; + + // Restore the GC roots for the next GC. + roots.clear(); + self.gc_roots_list = roots; + + log::trace!("============ End Async GC ==========="); + } + + #[inline] + #[cfg(not(feature = "gc"))] + pub async fn gc_async(&mut self) { + // Nothing to collect. + // + // Note that this is *not* a public method, this is just defined for the + // crate-internal `StoreOpaque` type. This is a convenience so that we + // don't have to `cfg` every call site. + } + + #[cfg(feature = "gc")] + async fn trace_roots_async(&mut self, gc_roots_list: &mut crate::runtime::vm::GcRootsList) { + use crate::runtime::vm::Yield; + + log::trace!("Begin trace GC roots"); + + // We shouldn't have any leftover, stale GC roots. + assert!(gc_roots_list.is_empty()); + + self.trace_wasm_stack_roots(gc_roots_list); + Yield::new().await; + self.trace_vmctx_roots(gc_roots_list); + Yield::new().await; + self.trace_user_roots(gc_roots_list); + + log::trace!("End trace GC roots") + } + + /// Yields the async context, assuming that we are executing on a fiber and + /// that fiber is not in the process of dying. This function will return + /// None in the latter case (the fiber is dying), and panic if + /// `async_support()` is false. + #[inline] + pub fn async_cx(&self) -> Option { + assert!(self.async_support()); + + let poll_cx_box_ptr = self.async_state.current_poll_cx.get(); + if poll_cx_box_ptr.is_null() { + return None; + } + + let poll_cx_inner_ptr = unsafe { *poll_cx_box_ptr }; + if poll_cx_inner_ptr.future_context.is_null() { + return None; + } + + Some(AsyncCx { + current_suspend: self.async_state.current_suspend.get(), + current_poll_cx: unsafe { &raw mut (*poll_cx_box_ptr).future_context }, + track_pkey_context_switch: self.pkey.is_some(), + }) + } + + /// Yields execution to the caller on out-of-gas or epoch interruption. + /// + /// This only works on async futures and stores, and assumes that we're + /// executing on a fiber. This will yield execution back to the caller once. + pub fn async_yield_impl(&mut self) -> Result<()> { + use crate::runtime::vm::Yield; + + let mut future = Yield::new(); + + // When control returns, we have a `Result<()>` passed + // in from the host fiber. If this finished successfully then + // we were resumed normally via a `poll`, so keep going. If + // the future was dropped while we were yielded, then we need + // to clean up this fiber. Do so by raising a trap which will + // abort all wasm and get caught on the other side to clean + // things up. + unsafe { + self.async_cx() + .expect("attempted to pull async context during shutdown") + .block_on(Pin::new_unchecked(&mut future)) + } + } + + fn allocate_fiber_stack(&mut self) -> Result { + if let Some(stack) = self.async_state.last_fiber_stack.take() { + return Ok(stack); + } + self.engine().allocator().allocate_fiber_stack() + } + + fn deallocate_fiber_stack(&mut self, stack: wasmtime_fiber::FiberStack) { + self.flush_fiber_stack(); + self.async_state.last_fiber_stack = Some(stack); + } + + /// Releases the last fiber stack to the underlying instance allocator, if + /// present. + pub fn flush_fiber_stack(&mut self) { + if let Some(stack) = self.async_state.last_fiber_stack.take() { + unsafe { + self.engine.allocator().deallocate_fiber_stack(stack); + } + } + } + + pub(crate) fn async_guard_range(&mut self) -> Range<*mut u8> { + #[cfg(feature = "component-model-async")] + { + self.concurrent_async_state().async_guard_range() + } + #[cfg(not(feature = "component-model-async"))] + unsafe { + let ptr = self.async_state.current_poll_cx.get(); + (*ptr).guard_range_start..(*ptr).guard_range_end + } + } +} + +impl StoreContextMut<'_, T> { + /// Executes a synchronous computation `func` asynchronously on a new fiber. + pub(crate) async fn on_fiber( + &mut self, + func: impl FnOnce(&mut StoreContextMut<'_, T>) -> R + Send, + ) -> Result + where + T: Send, + { + self.0 + .on_fiber(|opaque| { + let store = unsafe { opaque.traitobj().cast::>().as_mut() }; + func(&mut StoreContextMut(store)) + }) + .await + } } pub struct AsyncCx { diff --git a/crates/wasmtime/src/runtime/trampoline/memory.rs b/crates/wasmtime/src/runtime/trampoline/memory.rs index 38bc7e3aa3..e6f191a6e9 100644 --- a/crates/wasmtime/src/runtime/trampoline/memory.rs +++ b/crates/wasmtime/src/runtime/trampoline/memory.rs @@ -244,6 +244,7 @@ unsafe impl InstanceAllocatorImpl for SingleMemoryInstance<'_> { #[cfg(feature = "gc")] fn allocate_gc_heap( &self, + _engine: &crate::Engine, _gc_runtime: &dyn crate::runtime::vm::GcRuntime, ) -> Result<( crate::runtime::vm::GcHeapAllocationIndex, diff --git a/crates/wasmtime/src/runtime/trap.rs b/crates/wasmtime/src/runtime/trap.rs index 413cb33f8d..425086dbe0 100644 --- a/crates/wasmtime/src/runtime/trap.rs +++ b/crates/wasmtime/src/runtime/trap.rs @@ -323,7 +323,10 @@ impl WasmBacktrace { // `Display` to indicate that more detailed information // in a trap may be available. let has_unparsed_debuginfo = module.compiled_module().has_unparsed_debuginfo(); - if has_unparsed_debuginfo && wasm_backtrace_details_env_used { + if has_unparsed_debuginfo + && wasm_backtrace_details_env_used + && cfg!(feature = "addr2line") + { hint_wasm_backtrace_details_env = true; } } @@ -359,7 +362,7 @@ impl fmt::Display for WasmBacktrace { write!(f, " {i:>3}: ")?; if let Some(offset) = frame.module_offset() { - write!(f, "{offset:#6x} - ")?; + write!(f, "{offset:#8x} - ")?; } let write_raw_func_name = |f: &mut fmt::Formatter<'_>| { @@ -371,7 +374,12 @@ impl fmt::Display for WasmBacktrace { } else { for (i, symbol) in frame.symbols().iter().enumerate() { if i > 0 { - write!(f, " - ")?; + if needs_newline { + writeln!(f, "")?; + } else { + needs_newline = true; + } + write!(f, " - ")?; } else { // ... } @@ -394,7 +402,11 @@ impl fmt::Display for WasmBacktrace { } } if self.hint_wasm_backtrace_details_env { - write!(f, "\nnote: using the `WASMTIME_BACKTRACE_DETAILS=1` environment variable may show more debugging information")?; + write!( + f, + "\nnote: using the `WASMTIME_BACKTRACE_DETAILS=1` \ + environment variable may show more debugging information" + )?; } Ok(()) } @@ -423,8 +435,7 @@ impl FrameInfo { pub(crate) fn new(module: Module, text_offset: usize) -> Option { let compiled_module = module.compiled_module(); let (index, _func_offset) = compiled_module.func_by_text_offset(text_offset)?; - let info = compiled_module.wasm_func_info(index); - let func_start = info.start_srcloc; + let func_start = compiled_module.func_start_srcloc(index); let instr = wasmtime_environ::lookup_file_pos( compiled_module.code_memory().address_map_data(), text_offset, diff --git a/crates/wasmtime/src/runtime/type_registry.rs b/crates/wasmtime/src/runtime/type_registry.rs index ded58a1f9e..edb35f70c2 100644 --- a/crates/wasmtime/src/runtime/type_registry.rs +++ b/crates/wasmtime/src/runtime/type_registry.rs @@ -111,6 +111,7 @@ impl Debug for TypeCollection { impl Engine { /// Registers the given types in this engine, re-canonicalizing them for /// runtime usage. + #[must_use = "types are only registered as long as the `TypeCollection` is live"] pub(crate) fn register_and_canonicalize_types<'a, I>( &self, module_types: &mut ModuleTypes, @@ -120,32 +121,47 @@ impl Engine { I: IntoIterator, I::IntoIter: ExactSizeIterator, { + if cfg!(debug_assertions) { + module_types + .trace(&mut |idx| match idx { + EngineOrModuleTypeIndex::Module(_) => Ok(()), + EngineOrModuleTypeIndex::Engine(_) | EngineOrModuleTypeIndex::RecGroup(_) => { + Err(idx) + } + }) + .expect("should only have module type indices"); + } + let engine = self.clone(); let registry = engine.signatures(); let gc_runtime = engine.gc_runtime().ok().map(|rt| &**rt); + + // First, register these types in this engine's registry. let (rec_groups, types) = registry .0 .write() .register_module_types(gc_runtime, module_types); - // First, register the types in this engine's registry. - log::trace!("Begin building module's shared-to-module-trampoline-types map"); + // Then build our map from each function type's engine index to the + // module-index of its trampoline. Trampoline functions are queried by + // module-index in a compiled module, and doing this engine-to-module + // resolution now means we don't need to do it on the function call hot + // path. let mut trampolines = SecondaryMap::with_capacity(types.len()); for (module_ty, module_trampoline_ty) in module_types.trampoline_types() { let shared_ty = types[module_ty]; let trampoline_shared_ty = registry.trampoline_type(shared_ty); trampolines[trampoline_shared_ty] = Some(module_trampoline_ty).into(); - log::trace!("--> shared_to_module_trampolines[{trampoline_shared_ty:?}] = {module_trampoline_ty:?}"); } - log::trace!("Done building module's shared-to-module-trampoline-types map"); - // Second, re-canonicalize those types for runtime usage in this engine, - // replacing `ModuleInternedTypeIndex`es with the `VMSharedTypeIndex`es - // we just registered. + // Finally, to ensure that no matter which API from which layer + // (`wasmtime::runtime::vm` vs `wasmtime_environ`, etc...) we use to + // grab an entity's type, we will always end up with a type that has + // `VMSharedTypeIndex` rather than `ModuleInternedTypeIndex` type + // references, we canonicalize both the `ModuleTypes` and + // `wasmtime_environ::Module`s for runtime usage. All our type-of-X APIs + // ultimately use one of these two structures. module_types.canonicalize_for_runtime_usage(&mut |idx| types[idx]); - - // Third, re-canonicalize the types in our `wasmtime_environ::Module`s - // to point to the just-registered engine type indices. for module in env_modules { module.canonicalize_for_runtime_usage(&mut |idx| types[idx]); } @@ -253,7 +269,8 @@ impl Debug for RegisteredType { impl Clone for RegisteredType { fn clone(&self) -> Self { - self.entry.incref("cloning RegisteredType"); + self.engine.signatures().debug_assert_contains(self.index); + self.entry.incref("RegisteredType::clone"); RegisteredType { engine: self.engine.clone(), entry: self.entry.clone(), @@ -266,7 +283,8 @@ impl Clone for RegisteredType { impl Drop for RegisteredType { fn drop(&mut self) { - if self.entry.decref("dropping RegisteredType") { + self.engine.signatures().debug_assert_contains(self.index); + if self.entry.decref("RegisteredType::drop") { self.engine .signatures() .0 @@ -286,6 +304,9 @@ impl core::ops::Deref for RegisteredType { impl PartialEq for RegisteredType { fn eq(&self, other: &Self) -> bool { + self.engine.signatures().debug_assert_contains(self.index); + other.engine.signatures().debug_assert_contains(other.index); + let eq = self.index == other.index && Engine::same(&self.engine, &other.engine); if cfg!(debug_assertions) && eq { @@ -303,6 +324,7 @@ impl Eq for RegisteredType {} impl Hash for RegisteredType { fn hash(&self, state: &mut H) { + self.engine.signatures().debug_assert_contains(self.index); let ptr = Arc::as_ptr(&self.entry.0); ptr.hash(state); } @@ -330,7 +352,7 @@ impl RegisteredType { let index = entry.0.shared_type_indices[0]; let id = shared_type_index_to_slab_id(index); - let ty = inner.types[id].clone(); + let ty = inner.types[id].clone().unwrap(); let layout = inner.type_to_gc_layout.get(index).and_then(|l| l.clone()); (entry, index, ty, layout) @@ -343,15 +365,14 @@ impl RegisteredType { /// /// This will prevent the associated type from being unregistered as long as /// the returned `RegisteredType` is kept alive. - /// - /// Returns `None` if `index` is not registered in the given engine's - /// registry. - pub fn root(engine: &Engine, index: VMSharedTypeIndex) -> Option { + pub fn root(engine: &Engine, index: VMSharedTypeIndex) -> RegisteredType { + engine.signatures().debug_assert_contains(index); + let (entry, ty, layout) = { let id = shared_type_index_to_slab_id(index); let inner = engine.signatures().0.read(); - let ty = inner.types.get(id)?.clone(); + let ty = inner.types[id].clone().unwrap(); let entry = inner.type_to_rec_group[index].clone().unwrap(); let layout = inner.type_to_gc_layout.get(index).and_then(|l| l.clone()); @@ -366,13 +387,7 @@ impl RegisteredType { (entry, ty, layout) }; - Some(RegisteredType::from_parts( - engine.clone(), - entry, - index, - ty, - layout, - )) + RegisteredType::from_parts(engine.clone(), entry, index, ty, layout) } /// Construct a new `RegisteredType`. @@ -389,7 +404,11 @@ impl RegisteredType { log::trace!( "RegisteredType::from_parts({engine:?}, {entry:?}, {index:?}, {ty:?}, {layout:?})" ); - debug_assert!(entry.0.registrations.load(Acquire) != 0); + engine.signatures().debug_assert_contains(index); + debug_assert!( + entry.0.registrations.load(Acquire) != 0, + "entry should have a non-zero registration count" + ); RegisteredType { engine, entry, @@ -430,18 +449,15 @@ struct RecGroupEntry(Arc); impl Debug for RecGroupEntry { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - struct Ptr<'a, P>(&'a P); - impl Debug for Ptr<'_, P> { + struct FormatAsPtr<'a, P>(&'a P); + impl Debug for FormatAsPtr<'_, P> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:#p}", *self.0) } } - f.debug_struct("RecGroupEntry") - .field("ptr", &Ptr(&self.0)) - .field("shared_type_indices", &self.0.shared_type_indices) - .field("hash_consing_key", &self.0.hash_consing_key) - .field("registrations", &self.0.registrations.load(Acquire)) + f.debug_tuple("RecGroupEntry") + .field(&FormatAsPtr(&self.0)) .finish() } } @@ -494,10 +510,7 @@ impl RecGroupEntry { /// Increment the registration count. fn incref(&self, why: &str) { let old_count = self.0.registrations.fetch_add(1, AcqRel); - log::trace!( - "increment registration count for {self:?} (registrations -> {}): {why}", - old_count + 1 - ); + log::trace!("incref({self:?}) -> count {}: {why}", old_count + 1); } /// Decrement the registration count and return `true` if the registration @@ -506,10 +519,7 @@ impl RecGroupEntry { fn decref(&self, why: &str) -> bool { let old_count = self.0.registrations.fetch_sub(1, AcqRel); debug_assert_ne!(old_count, 0); - log::trace!( - "decrement registration count for {self:?} (registrations -> {}): {why}", - old_count - 1 - ); + log::trace!("decref({self:?}) -> count {}: {why}", old_count - 1); old_count == 1 } } @@ -529,7 +539,12 @@ struct TypeRegistryInner { // Wasm type. // // These types are always canonicalized for runtime usage. - types: Slab>, + // + // These are only `None` during the process of inserting a new rec group + // into the registry, where we need registered `VMSharedTypeIndex`es for + // forward type references within the rec group, but have not actually + // inserted all the types within the rec group yet. + types: Slab>>, // A map that lets you walk backwards from a `VMSharedTypeIndex` to its // `RecGroupEntry`. @@ -570,6 +585,37 @@ struct TypeRegistryInner { } impl TypeRegistryInner { + #[inline] + #[track_caller] + fn debug_assert_registered(&self, index: VMSharedTypeIndex) { + debug_assert!( + !index.is_reserved_value(), + "should have an actual VMSharedTypeIndex, not the reserved value" + ); + debug_assert!( + self.types.contains(shared_type_index_to_slab_id(index)), + "registry's slab should contain {index:?}", + ); + debug_assert!( + self.types[shared_type_index_to_slab_id(index)].is_some(), + "registry's slab should actually contain a type for {index:?}", + ); + debug_assert!( + self.type_to_rec_group[index].is_some(), + "{index:?} should have an associated rec group entry" + ); + } + + #[inline] + #[track_caller] + fn debug_assert_all_registered(&self, indices: impl IntoIterator) { + if cfg!(debug_assertions) { + for index in indices { + self.debug_assert_registered(index); + } + } + } + fn register_module_types( &mut self, gc_runtime: Option<&dyn GcRuntime>, @@ -580,7 +626,11 @@ impl TypeRegistryInner { ) { log::trace!("Start registering module types"); + // The engine's type registry entries for these module types. let mut entries = Vec::with_capacity(types.rec_groups().len()); + + // The map from a module type index to an engine type index for these + // module types. let mut map = PrimaryMap::::with_capacity( types.wasm_types().len(), ); @@ -593,6 +643,8 @@ impl TypeRegistryInner { iter_entity_range(module_group.clone()).map(|ty| types[ty].clone()), ); + // Update the module-to-engine map with this rec group's + // newly-registered types. for (module_ty, engine_ty) in iter_entity_range(module_group).zip(entry.0.shared_type_indices.iter()) { @@ -641,8 +693,17 @@ impl TypeRegistryInner { range: Range, types: impl ExactSizeIterator, ) -> RecGroupEntry { + log::trace!("registering rec group of length {}", types.len()); debug_assert_eq!(iter_entity_range(range.clone()).len(), types.len()); + // We need two different canonicalizations of this rec group: one for + // hash-consing and another for runtime usage within this + // engine. However, we only need the latter if this is a new rec group + // that hasn't been registered before. Therefore, we only eagerly create + // the hash-consing canonicalized version, and while we lazily + // canonicalize for runtime usage in this engine, we must still eagerly + // clone and set aside the original, non-canonicalized types for that + // potential engine canonicalization eventuality. let mut non_canon_types = Vec::with_capacity(types.len()); let hash_consing_key = WasmRecGroup { types: types @@ -658,25 +719,34 @@ impl TypeRegistryInner { .collect::>(), }; + // Any references in the hash-consing key to types outside of this rec + // group may only be to fully-registered types. + if cfg!(debug_assertions) { + hash_consing_key + .trace_engine_indices::<_, ()>(&mut |index| Ok(self.debug_assert_registered(index))) + .unwrap(); + } + // If we've already registered this rec group before, reuse it. if let Some(entry) = self.hash_consing_map.get(&hash_consing_key) { + log::trace!("hash-consing map hit: reusing {entry:?}"); assert_eq!(entry.0.unregistered.load(Acquire), false); - entry.incref( - "hash consed to already-registered type in `TypeRegistryInner::register_rec_group`", - ); + self.debug_assert_all_registered(entry.0.shared_type_indices.iter().copied()); + entry.incref("hash-consing map hit"); return entry.clone(); } + log::trace!("hash-consing map miss: making new registration"); + // Inter-group edges: increment the referenced group's ref // count, because these other rec groups shouldn't be dropped // while this rec group is still alive. hash_consing_key .trace_engine_indices::<_, ()>(&mut |index| { - let other_entry = &self.type_to_rec_group[index].as_ref().unwrap(); + self.debug_assert_registered(index); + let other_entry = self.type_to_rec_group[index].as_ref().unwrap(); assert_eq!(other_entry.0.unregistered.load(Acquire), false); - other_entry.incref( - "new cross-group type reference to existing type in `register_rec_group`", - ); + other_entry.incref("new rec group's type references"); Ok(()) }) .unwrap(); @@ -684,34 +754,59 @@ impl TypeRegistryInner { // Register the individual types. // // Note that we can't update the reverse type-to-rec-group map until - // after we've constructed the `RecGroupEntry`, since that map needs to - // the fully-constructed entry for its values. + // after we've constructed the `RecGroupEntry`, since that map needs the + // fully-constructed entry for its values. let module_rec_group_start = range.start; - let engine_rec_group_start = u32::try_from(self.types.len()).unwrap(); let shared_type_indices: Box<[_]> = non_canon_types - .into_iter() - .map(|(module_index, mut ty)| { - ty.canonicalize_for_runtime_usage(&mut |idx| { - if idx < module_rec_group_start { - map[idx] - } else { - let rec_group_offset = idx.as_u32() - module_rec_group_start.as_u32(); - let index = - VMSharedTypeIndex::from_u32(engine_rec_group_start + rec_group_offset); - assert!(!index.is_reserved_value()); - index - } - }); - self.insert_one_type_from_rec_group(gc_runtime, module_index, ty) + .iter() + .map(|(module_index, ty)| { + let engine_index = slab_id_to_shared_type_index(self.types.alloc(None)); + log::trace!( + "reserved {engine_index:?} for {module_index:?} = non-canonical {ty:?}" + ); + engine_index }) .collect(); + for (engine_index, (module_index, mut ty)) in + shared_type_indices.iter().copied().zip(non_canon_types) + { + log::trace!("canonicalizing {engine_index:?} for runtime usage"); + ty.canonicalize_for_runtime_usage(&mut |module_index| { + if module_index < module_rec_group_start { + let engine_index = map[module_index]; + log::trace!(" cross-group {module_index:?} becomes {engine_index:?}"); + self.debug_assert_registered(engine_index); + engine_index + } else { + assert!(module_index < range.end); + let rec_group_offset = module_index.as_u32() - module_rec_group_start.as_u32(); + let rec_group_offset = usize::try_from(rec_group_offset).unwrap(); + let engine_index = shared_type_indices[rec_group_offset]; + log::trace!(" intra-group {module_index:?} becomes {engine_index:?}"); + assert!(!engine_index.is_reserved_value()); + assert!(self + .types + .contains(shared_type_index_to_slab_id(engine_index))); + engine_index + } + }); + self.insert_one_type_from_rec_group(gc_runtime, module_index, engine_index, ty); + } + // Although we haven't finished registering all their metadata, the + // types themselves should all be filled in now. + if cfg!(debug_assertions) { + for index in &shared_type_indices { + let id = shared_type_index_to_slab_id(*index); + debug_assert!(self.types.contains(id)); + debug_assert!(self.types[id].is_some()); + } + } debug_assert_eq!( shared_type_indices.len(), shared_type_indices .iter() .copied() - .inspect(|ty| assert!(!ty.is_reserved_value())) .collect::>() .len(), "should not have any duplicate type indices", @@ -723,7 +818,7 @@ impl TypeRegistryInner { registrations: AtomicUsize::new(1), unregistered: AtomicBool::new(false), })); - log::trace!("create new entry {entry:?} (registrations -> 1)"); + log::trace!("new {entry:?} -> count 1"); let is_new_entry = self.hash_consing_map.insert(entry.clone()); debug_assert!(is_new_entry); @@ -734,12 +829,13 @@ impl TypeRegistryInner { debug_assert!(self.type_to_rec_group[ty].is_none()); self.type_to_rec_group[ty] = Some(entry.clone()); } + self.debug_assert_all_registered(entry.0.shared_type_indices.iter().copied()); // Finally, make sure to register the trampoline type for each function // type in the rec group. for shared_type_index in entry.0.shared_type_indices.iter().copied() { let slab_id = shared_type_index_to_slab_id(shared_type_index); - let sub_ty = &self.types[slab_id]; + let sub_ty = self.types[slab_id].as_ref().unwrap(); if let Some(f) = sub_ty.as_func() { let trampoline = f.trampoline_type(); match &trampoline { @@ -748,9 +844,7 @@ impl TypeRegistryInner { // its entry in `type_to_trampoline` empty to signal // this. log::trace!( - "function type is its own trampoline type: \n\ - --> trampoline_type[{shared_type_index:?}] = {shared_type_index:?}\n\ - --> trampoline_type[{f}] = {f}" + "trampoline_type({shared_type_index:?}) = {shared_type_index:?}", ); } Cow::Borrowed(_) | Cow::Owned(_) => { @@ -770,20 +864,12 @@ impl TypeRegistryInner { }, }, ); + assert_eq!(trampoline_entry.0.shared_type_indices.len(), 1); let trampoline_index = trampoline_entry.0.shared_type_indices[0]; log::trace!( - "Registering trampoline type:\n\ - --> trampoline_type[{shared_type_index:?}] = {trampoline_index:?}\n\ - --> trampoline_type[{f}] = {g}", - f = { - let slab_id = shared_type_index_to_slab_id(shared_type_index); - self.types[slab_id].unwrap_func() - }, - g = { - let slab_id = shared_type_index_to_slab_id(trampoline_index); - self.types[slab_id].unwrap_func() - } + "trampoline_type({shared_type_index:?}) = {trampoline_index:?}", ); + self.debug_assert_registered(trampoline_index); debug_assert_ne!(shared_type_index, trampoline_index); self.type_to_trampoline[shared_type_index] = Some(trampoline_index).into(); } @@ -801,11 +887,7 @@ impl TypeRegistryInner { panic!("not canonicalized for runtime usage: {ty:?}") } EngineOrModuleTypeIndex::Engine(idx) => { - let id = shared_type_index_to_slab_id(idx); - assert!( - self.types.contains(id), - "canonicalized in a different engine? {ty:?}" - ); + self.debug_assert_registered(idx); Ok(()) } }) @@ -821,8 +903,9 @@ impl TypeRegistryInner { &mut self, gc_runtime: Option<&dyn GcRuntime>, module_index: ModuleInternedTypeIndex, + engine_index: VMSharedTypeIndex, ty: WasmSubType, - ) -> VMSharedTypeIndex { + ) { // Despite being canonicalized for runtime usage, this type may still // have forward references to other types in the rec group we haven't // yet registered. Therefore, we can't use our usual @@ -855,15 +938,13 @@ impl TypeRegistryInner { }; // Add the type to our slab. - let id = self.types.alloc(Arc::new(ty)); - let engine_index = slab_id_to_shared_type_index(id); - log::trace!( - "registered type {module_index:?} as {engine_index:?} = {:?}", - &self.types[id] - ); + let id = shared_type_index_to_slab_id(engine_index); + assert!(self.types.contains(id)); + assert!(self.types[id].is_none()); + self.types[id] = Some(Arc::new(ty)); // Create the supertypes list for this type. - if let Some(supertype) = self.types[id].supertype { + if let Some(supertype) = self.types[id].as_ref().unwrap().supertype { let supertype = supertype.unwrap_engine_type_index(); let supers_supertypes = self.supertypes(supertype); let mut supertypes = Vec::with_capacity(supers_supertypes.len() + 1); @@ -883,7 +964,10 @@ impl TypeRegistryInner { self.type_to_gc_layout[engine_index] = Some(layout); } - engine_index + log::trace!( + "finished registering type {module_index:?} as {engine_index:?} = runtime-canonical {:?}", + self.types[id].as_ref().unwrap() + ); } /// Get the supertypes list for the given type. @@ -927,11 +1011,14 @@ impl TypeRegistryInner { /// Unregister all of a type collection's rec groups. fn unregister_type_collection(&mut self, collection: &TypeCollection) { + log::trace!("Begin unregistering `TypeCollection`"); for entry in &collection.rec_groups { + self.debug_assert_all_registered(entry.0.shared_type_indices.iter().copied()); if entry.decref("TypeRegistryInner::unregister_type_collection") { self.unregister_entry(entry.clone()); } } + log::trace!("Finished unregistering `TypeCollection`"); } /// Remove a zero-refcount entry from the registry. @@ -940,6 +1027,7 @@ impl TypeRegistryInner { /// instead be invoked only after a previous decrement operation observed /// zero remaining registrations. fn unregister_entry(&mut self, entry: RecGroupEntry) { + log::trace!("Attempting to unregister {entry:?}"); debug_assert!(self.drop_stack.is_empty()); // There are two races to guard against before we can unregister the @@ -1030,7 +1118,7 @@ impl TypeRegistryInner { let registrations = entry.0.registrations.load(Acquire); if registrations != 0 { log::trace!( - "{entry:?} was concurrently resurrected and no longer has \ + " {entry:?} was concurrently resurrected and no longer has \ zero registrations (registrations -> {registrations})", ); assert_eq!(entry.0.unregistered.load(Acquire), false); @@ -1040,7 +1128,7 @@ impl TypeRegistryInner { // Handle scenario (2) from above. if entry.0.unregistered.load(Acquire) { log::trace!( - "{entry:?} was concurrently resurrected, dropped again, \ + " {entry:?} was concurrently resurrected, dropped again, \ and already unregistered" ); return; @@ -1057,7 +1145,8 @@ impl TypeRegistryInner { // drop stack to avoid recursion and the potential stack overflows that // recursion implies. while let Some(entry) = self.drop_stack.pop() { - log::trace!("Start unregistering {entry:?}"); + log::trace!("Begin unregistering {entry:?}"); + self.debug_assert_all_registered(entry.0.shared_type_indices.iter().copied()); // All entries on the drop stack should *really* be ready for // unregistration, since no one can resurrect entries once we've @@ -1078,11 +1167,9 @@ impl TypeRegistryInner { .0 .hash_consing_key .trace_engine_indices::<_, ()>(&mut |other_index| { + self.debug_assert_registered(other_index); let other_entry = self.type_to_rec_group[other_index].as_ref().unwrap(); - if other_entry.decref( - "referenced by dropped entry in \ - `TypeCollection::unregister_entry`", - ) { + if other_entry.decref("dropping rec group's type references") { self.drop_stack.push(other_entry.clone()); } Ok(()) @@ -1094,7 +1181,8 @@ impl TypeRegistryInner { // will be as if it is the first time it has ever been registered, // and it will be inserted into the hash-consing map again at that // time. - self.hash_consing_map.remove(&entry); + let was_in_map = self.hash_consing_map.remove(&entry); + debug_assert!(was_in_map); // Similarly, remove the rec group's types from the registry, as // well as their entries from the reverse type-to-rec-group @@ -1108,7 +1196,6 @@ impl TypeRegistryInner { .shared_type_indices .iter() .copied() - .inspect(|ty| assert!(!ty.is_reserved_value())) .collect::>() .len(), "should not have any duplicate type indices", @@ -1123,11 +1210,10 @@ impl TypeRegistryInner { if let Some(trampoline_ty) = self.type_to_trampoline.get(ty).and_then(|x| x.expand()) { + self.debug_assert_registered(trampoline_ty); self.type_to_trampoline[ty] = None.into(); let trampoline_entry = self.type_to_rec_group[trampoline_ty].as_ref().unwrap(); - if trampoline_entry - .decref("removing reference from a function type to its trampoline type") - { + if trampoline_entry.decref("dropping rec group's trampoline-type references") { self.drop_stack.push(trampoline_entry.clone()); } } @@ -1146,7 +1232,8 @@ impl TypeRegistryInner { } let id = shared_type_index_to_slab_id(ty); - self.types.dealloc(id); + let deallocated_ty = self.types.dealloc(id); + assert!(deallocated_ty.is_some()); } log::trace!("End unregistering {entry:?}"); @@ -1159,7 +1246,6 @@ impl TypeRegistryInner { #[cfg(debug_assertions)] impl Drop for TypeRegistryInner { fn drop(&mut self) { - log::trace!("Dropping type registry: {self:#?}"); let TypeRegistryInner { hash_consing_map, types, @@ -1215,6 +1301,13 @@ impl TypeRegistry { Self(RwLock::new(TypeRegistryInner::default())) } + #[inline] + pub fn debug_assert_contains(&self, index: VMSharedTypeIndex) { + if cfg!(debug_assertions) { + self.0.read().debug_assert_registered(index); + } + } + /// Looks up a function type from a shared type index. /// /// This does *NOT* prevent the type from being unregistered while you are @@ -1224,7 +1317,7 @@ impl TypeRegistry { pub fn borrow(&self, index: VMSharedTypeIndex) -> Option> { let id = shared_type_index_to_slab_id(index); let inner = self.0.read(); - inner.types.get(id).cloned() + inner.types.get(id).and_then(|ty| ty.clone()) } /// Get the GC layout for the given index's type. @@ -1242,27 +1335,31 @@ impl TypeRegistry { pub fn trampoline_type(&self, index: VMSharedTypeIndex) -> VMSharedTypeIndex { let slab_id = shared_type_index_to_slab_id(index); let inner = self.0.read(); + inner.debug_assert_registered(index); - let ty = &inner.types[slab_id]; + let ty = inner.types[slab_id].as_ref().unwrap(); debug_assert!( ty.is_func(), "cannot get the trampoline type of a non-function type: {index:?} = {ty:?}" ); - let trampoline_ty = match inner.type_to_trampoline.get(index).and_then(|x| x.expand()) { + match inner.type_to_trampoline.get(index).and_then(|x| x.expand()) { Some(ty) => ty, None => { // The function type is its own trampoline type. index } - }; - log::trace!("TypeRegistry::trampoline_type({index:?}) -> {trampoline_ty:?}"); - trampoline_ty + } } /// Is type `sub` a subtype of `sup`? #[inline] pub fn is_subtype(&self, sub: VMSharedTypeIndex, sup: VMSharedTypeIndex) -> bool { + if cfg!(debug_assertions) { + self.0.read().debug_assert_registered(sub); + self.0.read().debug_assert_registered(sup); + } + if sub == sup { return true; } diff --git a/crates/wasmtime/src/runtime/types.rs b/crates/wasmtime/src/runtime/types.rs index 2d985acc93..3137481434 100644 --- a/crates/wasmtime/src/runtime/types.rs +++ b/crates/wasmtime/src/runtime/types.rs @@ -1,5 +1,9 @@ use crate::prelude::*; +use crate::runtime::externals::Global as RuntimeGlobal; +use crate::runtime::externals::Table as RuntimeTable; +use crate::runtime::Memory as RuntimeMemory; use crate::{type_registry::RegisteredType, Engine}; +use crate::{AsContextMut, Extern, Func, Val}; use core::fmt::{self, Display, Write}; use wasmtime_environ::{ EngineOrModuleTypeIndex, EntityType, Global, IndexType, Limits, Memory, ModuleTypes, Table, @@ -341,6 +345,23 @@ impl ValType { WasmValType::Ref(r) => Self::Ref(RefType::from_wasm_type(engine, r)), } } + /// Construct a default value. Returns None for non-nullable Ref types, which have no default. + pub fn default_value(&self) -> Option { + match self { + ValType::I32 => Some(Val::I32(0)), + ValType::I64 => Some(Val::I64(0)), + ValType::F32 => Some(Val::F32(0)), + ValType::F64 => Some(Val::F64(0)), + ValType::V128 => Some(Val::V128(0.into())), + ValType::Ref(r) => { + if r.is_nullable() { + Some(Val::null_ref(r.heap_type())) + } else { + None + } + } + } + } } /// Opaque references to data in the Wasm heap or to host data. @@ -1227,6 +1248,16 @@ impl ExternType { EntityType::Tag(ty) => TagType::from_wasmtime_tag(engine, ty).into(), } } + /// Construct a default value, if possible for the underlying type. Tags do not have a default value. + pub fn default_value(&self, store: impl AsContextMut) -> Option { + match self { + ExternType::Func(func_ty) => func_ty.default_value(store).map(Extern::Func), + ExternType::Global(global_ty) => global_ty.default_value(store).map(Extern::Global), + ExternType::Table(table_ty) => table_ty.default_value(store).map(Extern::Table), + ExternType::Memory(mem_ty) => mem_ty.default_value(store).map(Extern::Memory), + ExternType::Tag(_) => None, // FIXME: #10252 + } + } } impl From for ExternType { @@ -1796,10 +1827,7 @@ impl StructType { } pub(crate) fn from_shared_type_index(engine: &Engine, index: VMSharedTypeIndex) -> StructType { - let ty = RegisteredType::root(engine, index).expect( - "VMSharedTypeIndex is not registered in the Engine! Wrong \ - engine? Didn't root the index somewhere?", - ); + let ty = RegisteredType::root(engine, index); Self::from_registered_type(ty) } @@ -2040,10 +2068,7 @@ impl ArrayType { } pub(crate) fn from_shared_type_index(engine: &Engine, index: VMSharedTypeIndex) -> ArrayType { - let ty = RegisteredType::root(engine, index).expect( - "VMSharedTypeIndex is not registered in the Engine! Wrong \ - engine? Didn't root the index somewhere?", - ); + let ty = RegisteredType::root(engine, index); Self::from_registered_type(ty) } @@ -2400,10 +2425,7 @@ impl FuncType { } pub(crate) fn from_shared_type_index(engine: &Engine, index: VMSharedTypeIndex) -> FuncType { - let ty = RegisteredType::root(engine, index).expect( - "VMSharedTypeIndex is not registered in the Engine! Wrong \ - engine? Didn't root the index somewhere?", - ); + let ty = RegisteredType::root(engine, index); Self::from_registered_type(ty) } @@ -2411,6 +2433,19 @@ impl FuncType { debug_assert!(registered_type.is_func()); Self { registered_type } } + /// Construct a func which returns results of default value, if each result type has a default value. + pub fn default_value(&self, mut store: impl AsContextMut) -> Option { + let dummy_results = self + .results() + .map(|ty| ty.default_value()) + .collect::>>()?; + Some(Func::new(&mut store, self.clone(), move |_, _, results| { + for (slot, dummy) in results.iter_mut().zip(dummy_results.iter()) { + *slot = *dummy; + } + Ok(()) + })) + } } // Global Types @@ -2466,6 +2501,11 @@ impl GlobalType { }; GlobalType::new(ty, mutability) } + /// + pub fn default_value(&self, store: impl AsContextMut) -> Option { + let val = self.content().default_value()?; + RuntimeGlobal::new(store, self.clone(), val).ok() + } } // Tag Types @@ -2596,6 +2636,12 @@ impl TableType { pub(crate) fn wasmtime_table(&self) -> &Table { &self.ty } + /// + pub fn default_value(&self, store: impl AsContextMut) -> Option { + let val: ValType = self.element().clone().into(); + let init_val = val.default_value()?.ref_()?; + RuntimeTable::new(store, self.clone(), init_val).ok() + } } // Memory Types @@ -2927,6 +2973,10 @@ impl MemoryType { pub(crate) fn wasmtime_memory(&self) -> &Memory { &self.ty } + /// + pub fn default_value(&self, store: impl AsContextMut) -> Option { + RuntimeMemory::new(store, self.clone()).ok() + } } // Import Types diff --git a/crates/wasmtime/src/runtime/vm.rs b/crates/wasmtime/src/runtime/vm.rs index 67dea2b648..8a5d0df594 100644 --- a/crates/wasmtime/src/runtime/vm.rs +++ b/crates/wasmtime/src/runtime/vm.rs @@ -90,10 +90,12 @@ pub use crate::runtime::vm::sys::unwind::UnwindRegistration; pub use crate::runtime::vm::table::{Table, TableElement}; pub use crate::runtime::vm::traphandlers::*; pub use crate::runtime::vm::unwind::*; +#[cfg(feature = "component-model")] +pub use crate::runtime::vm::vmcontext::VMTableDefinition; pub use crate::runtime::vm::vmcontext::{ VMArrayCallFunction, VMArrayCallHostFuncContext, VMContext, VMFuncRef, VMFunctionBody, VMFunctionImport, VMGlobalDefinition, VMGlobalImport, VMMemoryDefinition, VMMemoryImport, - VMOpaqueContext, VMStoreContext, VMTableImport, VMTagImport, VMWasmCallFunction, ValRaw, + VMOpaqueContext, VMStoreContext, VMTable, VMTagImport, VMWasmCallFunction, ValRaw, }; pub use send_sync_ptr::SendSyncPtr; diff --git a/crates/wasmtime/src/runtime/vm/component.rs b/crates/wasmtime/src/runtime/vm/component.rs index b95723353c..9217204404 100644 --- a/crates/wasmtime/src/runtime/vm/component.rs +++ b/crates/wasmtime/src/runtime/vm/component.rs @@ -8,8 +8,9 @@ use crate::prelude::*; use crate::runtime::vm::{ - SendSyncPtr, VMArrayCallFunction, VMFuncRef, VMGlobalDefinition, VMMemoryDefinition, - VMOpaqueContext, VMStore, VMStoreRawPtr, VMWasmCallFunction, ValRaw, VmPtr, VmSafe, + SendSyncPtr, VMArrayCallFunction, VMContext, VMFuncRef, VMGlobalDefinition, VMMemoryDefinition, + VMOpaqueContext, VMStore, VMStoreRawPtr, VMTable, VMTableDefinition, VMWasmCallFunction, + ValRaw, VmPtr, VmSafe, }; use alloc::alloc::Layout; use alloc::sync::Arc; @@ -312,6 +313,20 @@ impl ComponentInstance { } } + /// Returns the runtime table definition and associated instance `VMContext` + /// corresponding to the index of the table provided. + /// + /// This can only be called after `idx` has been initialized at runtime + /// during the instantiation process of a component. + pub fn runtime_table(&self, idx: RuntimeTableIndex) -> VMTable { + unsafe { + let ret = *self.vmctx_plus_offset::(self.offsets.runtime_table(idx)); + debug_assert!(ret.from.as_ptr() as usize != INVALID_PTR); + debug_assert!(ret.vmctx.as_ptr() as usize != INVALID_PTR); + ret + } + } + /// Returns the realloc pointer corresponding to the index provided. /// /// This can only be called after `idx` has been initialized at runtime @@ -439,6 +454,31 @@ impl ComponentInstance { } } + /// Stores the runtime table pointer at the index specified. + /// + /// This is intended to be called during the instantiation process of a + /// component once a table is available, which may not be until part-way + /// through component instantiation. + /// + /// Note that it should be a property of the component model that the `ptr` + /// here is never needed prior to it being configured here in the instance. + pub fn set_runtime_table( + &mut self, + idx: RuntimeTableIndex, + ptr: NonNull, + vmctx: NonNull, + ) { + unsafe { + let storage = self.vmctx_plus_offset_mut::(self.offsets.runtime_table(idx)); + debug_assert!((*storage).vmctx.as_ptr() as usize == INVALID_PTR); + debug_assert!((*storage).from.as_ptr() as usize == INVALID_PTR); + *storage = VMTable { + vmctx: vmctx.into(), + from: ptr.into(), + }; + } + } + /// Configures host runtime lowering information associated with imported f /// functions for the `idx` specified. pub fn set_lowering(&mut self, idx: LoweredIndex, lowering: VMLowering) { @@ -558,6 +598,11 @@ impl ComponentInstance { let offset = self.offsets.resource_destructor(i); *self.vmctx_plus_offset_mut(offset) = INVALID_PTR; } + for i in 0..self.offsets.num_runtime_tables { + let i = RuntimeTableIndex::from_u32(i); + let offset = self.offsets.runtime_table(i); + *self.vmctx_plus_offset_mut(offset) = INVALID_PTR; + } } } @@ -803,6 +848,16 @@ impl OwnedComponentInstance { unsafe { self.instance_mut().set_runtime_post_return(idx, ptr) } } + /// See `ComponentInstance::set_runtime_table` + pub fn set_runtime_table( + &mut self, + idx: RuntimeTableIndex, + ptr: NonNull, + vmctx: NonNull, + ) { + unsafe { self.instance_mut().set_runtime_table(idx, ptr, vmctx) } + } + /// See `ComponentInstance::set_lowering` pub fn set_lowering(&mut self, idx: LoweredIndex, lowering: VMLowering) { unsafe { self.instance_mut().set_lowering(idx, lowering) } diff --git a/crates/wasmtime/src/runtime/vm/const_expr.rs b/crates/wasmtime/src/runtime/vm/const_expr.rs index 43228dcd97..78f1a0b1ec 100644 --- a/crates/wasmtime/src/runtime/vm/const_expr.rs +++ b/crates/wasmtime/src/runtime/vm/const_expr.rs @@ -167,6 +167,7 @@ impl ConstExprEvaluator { let mut store = AutoAssertNoGc::new(&mut store); for op in expr.ops() { + log::trace!("const-evaluating op: {op:?}"); match op { ConstOp::I32Const(i) => self.stack.push(ValRaw::i32(*i)), ConstOp::I64Const(i) => self.stack.push(ValRaw::i64(*i)), diff --git a/crates/wasmtime/src/runtime/vm/gc.rs b/crates/wasmtime/src/runtime/vm/gc.rs index a5c2ae226f..de7be7c81b 100644 --- a/crates/wasmtime/src/runtime/vm/gc.rs +++ b/crates/wasmtime/src/runtime/vm/gc.rs @@ -22,9 +22,9 @@ pub use i31::*; use crate::prelude::*; use crate::runtime::vm::GcHeapAllocationIndex; -use core::alloc::Layout; use core::any::Any; use core::mem::MaybeUninit; +use core::{alloc::Layout, num::NonZeroU32}; use wasmtime_environ::{GcArrayLayout, GcStructLayout, VMGcKind, VMSharedTypeIndex}; /// GC-related data that is one-to-one with a `wasmtime::Store`. @@ -134,11 +134,17 @@ impl GcStore { } /// Hook to call whenever a GC reference is about to be exposed to Wasm. - pub fn expose_gc_ref_to_wasm(&mut self, gc_ref: VMGcRef) { + /// + /// Returns the raw representation of this GC ref, ready to be passed to + /// Wasm. + #[must_use] + pub fn expose_gc_ref_to_wasm(&mut self, gc_ref: VMGcRef) -> NonZeroU32 { + let raw = gc_ref.as_raw_non_zero_u32(); if !gc_ref.is_i31() { log::trace!("exposing GC ref to Wasm: {gc_ref:p}"); self.gc_heap.expose_gc_ref_to_wasm(gc_ref); } + raw } /// Allocate a new `externref`. @@ -214,8 +220,8 @@ impl GcStore { /// Get the data for the given object reference. /// /// Panics when the structref and its size is out of the GC heap bounds. - pub fn gc_object_data(&mut self, gc_ref: &VMGcRef) -> VMGcObjectDataMut<'_> { - self.gc_heap.gc_object_data(gc_ref) + pub fn gc_object_data(&mut self, gc_ref: &VMGcRef) -> &mut VMGcObjectData { + self.gc_heap.gc_object_data_mut(gc_ref) } /// Get the object datas for the given pair of object references. @@ -225,7 +231,7 @@ impl GcStore { &mut self, a: &VMGcRef, b: &VMGcRef, - ) -> (VMGcObjectDataMut<'_>, VMGcObjectDataMut<'_>) { + ) -> (&mut VMGcObjectData, &mut VMGcObjectData) { assert_ne!(a, b); self.gc_heap.gc_object_data_pair(a, b) } diff --git a/crates/wasmtime/src/runtime/vm/gc/disabled.rs b/crates/wasmtime/src/runtime/vm/gc/disabled.rs index ead2faa6c8..c7f24101e2 100644 --- a/crates/wasmtime/src/runtime/vm/gc/disabled.rs +++ b/crates/wasmtime/src/runtime/vm/gc/disabled.rs @@ -1,7 +1,4 @@ //! Dummy GC types for when the `gc` cargo feature is disabled. -//! -//! To reduce `#[cfg(...)]`s, this provides all the same methods as the real -//! `VMExternRef` except for constructors. #![allow(missing_docs)] @@ -11,13 +8,19 @@ pub enum VMStructRef {} pub enum VMArrayRef {} -pub struct VMGcObjectDataMut<'a> { +pub struct VMGcObjectData { _inner: VMStructRef, - _phantom: core::marker::PhantomData<&'a mut ()>, + _phantom: core::marker::PhantomData<[u8]>, } -impl VMGcObjectDataMut<'_> { - pub fn new(_data: &mut [u8]) -> Self { +impl<'a> From<&'a [u8]> for &'a VMGcObjectData { + fn from(_: &'a [u8]) -> Self { + unreachable!() + } +} + +impl<'a> From<&'a mut [u8]> for &'a mut VMGcObjectData { + fn from(_: &'a mut [u8]) -> Self { unreachable!() } } diff --git a/crates/wasmtime/src/runtime/vm/gc/enabled/arrayref.rs b/crates/wasmtime/src/runtime/vm/gc/enabled/arrayref.rs index b5c47042da..8cdd4f6ffe 100644 --- a/crates/wasmtime/src/runtime/vm/gc/enabled/arrayref.rs +++ b/crates/wasmtime/src/runtime/vm/gc/enabled/arrayref.rs @@ -202,7 +202,7 @@ impl VMArrayRef { debug_assert!(val._matches_ty(&store, &ty.unpack())?); let offset = layout.elem_offset(index); - let mut data = store.unwrap_gc_store_mut().gc_object_data(self.as_gc_ref()); + let data = store.unwrap_gc_store_mut().gc_object_data(self.as_gc_ref()); match val { Val::I32(i) if ty.is_i8() => data.write_i8(offset, truncate_i32_to_i8(i)), Val::I32(i) if ty.is_i16() => data.write_i16(offset, truncate_i32_to_i16(i)), @@ -232,7 +232,7 @@ impl VMArrayRef { None => None, }; store.gc_store_mut()?.write_gc_ref(&mut gc_ref, e.as_ref()); - let mut data = store.gc_store_mut()?.gc_object_data(self.as_gc_ref()); + let data = store.gc_store_mut()?.gc_object_data(self.as_gc_ref()); data.write_u32(offset, gc_ref.map_or(0, |r| r.as_raw_u32())); } Val::AnyRef(a) => { @@ -243,7 +243,7 @@ impl VMArrayRef { None => None, }; store.gc_store_mut()?.write_gc_ref(&mut gc_ref, a.as_ref()); - let mut data = store.gc_store_mut()?.gc_object_data(self.as_gc_ref()); + let data = store.gc_store_mut()?.gc_object_data(self.as_gc_ref()); data.write_u32(offset, gc_ref.map_or(0, |r| r.as_raw_u32())); } diff --git a/crates/wasmtime/src/runtime/vm/gc/enabled/data.rs b/crates/wasmtime/src/runtime/vm/gc/enabled/data.rs index 96b4f0e90c..8528f82fa7 100644 --- a/crates/wasmtime/src/runtime/vm/gc/enabled/data.rs +++ b/crates/wasmtime/src/runtime/vm/gc/enabled/data.rs @@ -60,41 +60,64 @@ impl PodValType<{ mem::size_of::() }> for V128 { /// for preserving the memory safety of indexed GC heaps in the face of (for /// example) collector bugs, but the latter is just a defensive technique to /// catch bugs early and prevent action at a distance as much as possible. -pub struct VMGcObjectDataMut<'a> { - data: &'a mut [u8], +#[repr(transparent)] +pub struct VMGcObjectData { + data: [u8], } macro_rules! impl_pod_methods { - ( $( $t:ty, $read:ident, $write:ident; )* ) => { + ( $( $T:ty, $read:ident, $write:ident; )* ) => { $( /// Read a ` - #[doc = stringify!($t)] + #[doc = stringify!($T)] /// ` field this object. /// /// Panics on out-of-bounds accesses. #[inline] - pub fn $read(&self, offset: u32) -> $t { - self.read_pod::<{ mem::size_of::<$t>() }, $t>(offset) + pub fn $read(&self, offset: u32) -> $T + { + self.read_pod::<{ mem::size_of::<$T>() }, $T>(offset) } /// Write a ` - #[doc = stringify!($t)] + #[doc = stringify!($T)] /// ` into this object. /// /// Panics on out-of-bounds accesses. #[inline] - pub fn $write(&mut self, offset: u32, val: $t) { - self.write_pod::<{ mem::size_of::<$t>() }, $t>(offset, val); + pub fn $write(&mut self, offset: u32, val: $T) + { + self.write_pod::<{ mem::size_of::<$T>() }, $T>(offset, val); } )* }; } -impl<'a> VMGcObjectDataMut<'a> { - /// Construct a `VMStructDataMut` from the given slice of bytes. +impl<'a> From<&'a [u8]> for &'a VMGcObjectData { #[inline] - pub fn new(data: &'a mut [u8]) -> Self { - Self { data } + fn from(data: &'a [u8]) -> Self { + &VMGcObjectData::from_slice(data) + } +} + +impl<'a> From<&'a mut [u8]> for &'a mut VMGcObjectData { + #[inline] + fn from(data: &'a mut [u8]) -> Self { + VMGcObjectData::from_slice_mut(data) + } +} + +impl VMGcObjectData { + /// Construct a `VMGcObjectData` from the given slice of bytes. + #[inline] + pub fn from_slice(data: &[u8]) -> &Self { + unsafe { mem::transmute(data) } + } + + /// Construct a `VMGcObjectData` from the given slice of bytes. + #[inline] + pub fn from_slice_mut(data: &mut [u8]) -> &mut Self { + unsafe { mem::transmute(data) } } /// Read a POD field out of this object. @@ -133,7 +156,7 @@ impl<'a> VMGcObjectDataMut<'a> { Some(into) => into, None => panic!( "out of bounds field! field range = {offset:#x}..{end:#x}; object len = {:#x}", - self.data.len(), + self.data.as_mut().len(), ), }; val.write_le(into.try_into().unwrap()); @@ -141,6 +164,9 @@ impl<'a> VMGcObjectDataMut<'a> { /// Get a slice of this object's data. /// + /// Note that GC data is always stored in little-endian order, and this + /// method does not do any conversions to/from host endianness for you. + /// /// Panics on out-of-bounds accesses. #[inline] pub fn slice(&self, offset: u32, len: u32) -> &[u8] { @@ -152,6 +178,9 @@ impl<'a> VMGcObjectDataMut<'a> { /// Get a mutable slice of this object's data. /// + /// Note that GC data is always stored in little-endian order, and this + /// method does not do any conversions to/from host endianness for you. + /// /// Panics on out-of-bounds accesses. #[inline] pub fn slice_mut(&mut self, offset: u32, len: u32) -> &mut [u8] { @@ -163,6 +192,9 @@ impl<'a> VMGcObjectDataMut<'a> { /// Copy the given slice into this object's data at the given offset. /// + /// Note that GC data is always stored in little-endian order, and this + /// method does not do any conversions to/from host endianness for you. + /// /// Panics on out-of-bounds accesses. #[inline] pub fn copy_from_slice(&mut self, offset: u32, src: &[u8]) { diff --git a/crates/wasmtime/src/runtime/vm/gc/enabled/drc.rs b/crates/wasmtime/src/runtime/vm/gc/enabled/drc.rs index 3f1c19bc13..8f79d8a022 100644 --- a/crates/wasmtime/src/runtime/vm/gc/enabled/drc.rs +++ b/crates/wasmtime/src/runtime/vm/gc/enabled/drc.rs @@ -42,25 +42,31 @@ //! use super::free_list::FreeList; -use super::{VMArrayRef, VMGcObjectDataMut, VMStructRef}; +use super::{VMArrayRef, VMStructRef}; +use crate::hash_map::HashMap; use crate::hash_set::HashSet; -use crate::prelude::*; use crate::runtime::vm::{ mmap::AlignedLength, ExternRefHostDataId, ExternRefHostDataTable, GarbageCollection, GcHeap, GcHeapObject, GcProgress, GcRootsIter, GcRuntime, Mmap, TypedGcRef, VMExternRef, VMGcHeader, VMGcRef, }; -use core::ops::{Deref, DerefMut, Range}; +use crate::vm::SendSyncPtr; +use crate::{prelude::*, Engine, EngineWeak}; use core::{ alloc::Layout, any::Any, - cell::UnsafeCell, mem, num::NonZeroUsize, - ptr::{self, NonNull}, + ops::{Deref, DerefMut}, + ptr::NonNull, }; -use wasmtime_environ::drc::DrcTypeLayouts; -use wasmtime_environ::{GcArrayLayout, GcStructLayout, GcTypeLayouts, VMGcKind, VMSharedTypeIndex}; +use wasmtime_environ::drc::{DrcTypeLayouts, ARRAY_LENGTH_OFFSET}; +use wasmtime_environ::{ + GcArrayLayout, GcLayout, GcStructLayout, GcTypeLayouts, VMGcKind, VMSharedTypeIndex, +}; + +#[allow(clippy::cast_possible_truncation)] +const GC_REF_ARRAY_ELEMS_OFFSET: u32 = ARRAY_LENGTH_OFFSET + (mem::size_of::() as u32); /// The deferred reference-counting (DRC) collector. /// @@ -79,40 +85,95 @@ unsafe impl GcRuntime for DrcCollector { &self.layouts } - fn new_gc_heap(&self) -> Result> { - let heap = DrcHeap::new()?; + fn new_gc_heap(&self, engine: &Engine) -> Result> { + let heap = DrcHeap::new(engine)?; Ok(Box::new(heap) as _) } } +/// How to trace a GC object. +enum TraceInfo { + /// How to trace an array. + Array { + /// Whether this array type's elements are GC references, and need + /// tracing. + gc_ref_elems: bool, + }, + + /// How to trace a struct. + Struct { + /// The offsets of each GC reference field that needs tracing in + /// instances of this struct type. + gc_ref_offsets: Box<[u32]>, + }, +} + /// A deferred reference-counting (DRC) heap. struct DrcHeap { + engine: EngineWeak, + + /// For every type that we have allocated in this heap, how do we trace it? + trace_infos: HashMap, + + /// Count of how many no-gc scopes we are currently within. no_gc_count: u64, - // NB: this box shouldn't be strictly necessary, but it makes upholding the - // safety invariants of the `vmctx_gc_heap_data` more obviously correct. + + /// This heap's bump table for GC refs entering the Wasm stack. This is + /// mutated directly by Wasm and a pointer to it is stored inside the + /// `VMContext`. + /// + /// NB: this box isn't strictly necessary (because the `DrcHeap` is itself + /// boxed up) but it makes upholding the safety invariants of the + /// `vmctx_gc_heap_data` more-obviously correct without needing to reason + /// about less-local system properties. activations_table: Box, + + /// The storage for the GC heap itself. heap: Mmap, + + /// A free list describing which ranges of the heap are available for use. free_list: FreeList, + + /// An explicit stack to avoid recursion when deallocating one object needs + /// to dec-ref another object, which can then be deallocated and dec-refs + /// yet another object, etc... + /// + /// We store this stack here to reuse the storage and avoid repeated + /// allocations. + /// + /// Note that the `Option` is perhaps technically unnecessary (we could + /// remove the `Option` and, when we take the stack out of `self`, leave + /// behind an empty vec instead of `None`) but we keep it because it will + /// help us catch unexpected re-entry, similar to how a `RefCell` would. + dec_ref_stack: Option>, } impl DrcHeap { /// Construct a new, default DRC heap. - fn new() -> Result { - Self::with_capacity(super::DEFAULT_GC_HEAP_CAPACITY) + fn new(engine: &Engine) -> Result { + Self::with_capacity(engine, super::DEFAULT_GC_HEAP_CAPACITY) } /// Create a new DRC heap with the given capacity. - fn with_capacity(capacity: usize) -> Result { + fn with_capacity(engine: &Engine, capacity: usize) -> Result { + log::trace!("allocating new DRC heap with capacity {capacity:#x}"); let heap = Mmap::with_at_least(capacity)?; let free_list = FreeList::new(heap.len()); Ok(Self { + engine: engine.weak(), + trace_infos: HashMap::default(), no_gc_count: 0, activations_table: Box::new(VMGcRefActivationsTable::default()), heap, free_list, + dec_ref_stack: Some(vec![]), }) } + fn engine(&self) -> Engine { + self.engine.upgrade().unwrap() + } + fn dealloc(&mut self, gc_ref: VMGcRef) { let drc_ref = drc_ref(&gc_ref); let size = self.index(drc_ref).object_size(); @@ -121,16 +182,6 @@ impl DrcHeap { .dealloc(gc_ref.as_heap_index().unwrap(), layout); } - fn object_range(&self, gc_ref: &VMGcRef) -> Range { - let start = gc_ref.as_heap_index().unwrap().get(); - let start = usize::try_from(start).unwrap(); - let size = self - .index::(gc_ref.as_typed_unchecked()) - .object_size(); - let end = start.checked_add(size).unwrap(); - start..end - } - /// Increment the ref count for the associated object. fn inc_ref(&mut self, gc_ref: &VMGcRef) { if gc_ref.is_i31() { @@ -140,17 +191,12 @@ impl DrcHeap { let drc_ref = drc_ref(gc_ref); let header = self.index_mut(&drc_ref); debug_assert_ne!( - *header.ref_count.get_mut(), - 0, + header.ref_count, 0, "{:#p} is supposedly live; should have nonzero ref count", *gc_ref ); - *header.ref_count.get_mut() += 1; - log::trace!( - "increment {:#p} ref count -> {}", - *gc_ref, - header.ref_count.get_mut() - ); + header.ref_count += 1; + log::trace!("increment {:#p} ref count -> {}", *gc_ref, header.ref_count); } /// Decrement the ref count for the associated object. @@ -165,42 +211,138 @@ impl DrcHeap { let drc_ref = drc_ref(gc_ref); let header = self.index_mut(drc_ref); debug_assert_ne!( - *header.ref_count.get_mut(), - 0, + header.ref_count, 0, "{:#p} is supposedly live; should have nonzero ref count", *gc_ref ); - *header.ref_count.get_mut() -= 1; - log::trace!( - "decrement {:#p} ref count -> {}", - *gc_ref, - header.ref_count.get_mut() - ); - *header.ref_count.get_mut() == 0 + header.ref_count -= 1; + log::trace!("decrement {:#p} ref count -> {}", *gc_ref, header.ref_count); + header.ref_count == 0 } /// Decrement the ref count for the associated object. /// /// If the ref count reached zero, then deallocate the object and remove its /// associated entry from the `host_data_table` if necessary. + /// + /// This uses an explicit stack, rather than recursion, for the scenario + /// where dropping one object means that the ref count for another object + /// that it referenced reaches zero. fn dec_ref_and_maybe_dealloc( &mut self, host_data_table: &mut ExternRefHostDataTable, gc_ref: &VMGcRef, ) { - if self.dec_ref(gc_ref) { - // If this was an `externref`, remove its associated entry from - // the host data table. - if let Some(externref) = gc_ref.as_typed::(self) { - let host_data_id = self.index(externref).host_data; - host_data_table.dealloc(host_data_id); + let mut stack = self.dec_ref_stack.take().unwrap(); + debug_assert!(stack.is_empty()); + stack.push(gc_ref.unchecked_copy()); + + while let Some(gc_ref) = stack.pop() { + if self.dec_ref(&gc_ref) { + // The object's reference count reached zero. + // + // Enqueue any other objects it references for dec-ref'ing. + self.trace_gc_ref(&gc_ref, &mut stack); + + // If this object was an `externref`, remove its associated + // entry from the host-data table. + if let Some(externref) = gc_ref.as_typed::(self) { + let host_data_id = self.index(externref).host_data; + host_data_table.dealloc(host_data_id); + } + + // Deallocate this GC object! + self.dealloc(gc_ref.unchecked_copy()); } + } + + debug_assert!(stack.is_empty()); + debug_assert!(self.dec_ref_stack.is_none()); + self.dec_ref_stack = Some(stack); + } + + /// Ensure that we have tracing information for the given type. + fn ensure_trace_info(&mut self, ty: VMSharedTypeIndex) { + if self.trace_infos.contains_key(&ty) { + return; + } + + self.insert_new_trace_info(ty); + } + + fn insert_new_trace_info(&mut self, ty: VMSharedTypeIndex) { + debug_assert!(!self.trace_infos.contains_key(&ty)); + + let engine = self.engine(); + let gc_layout = engine + .signatures() + .layout(ty) + .unwrap_or_else(|| panic!("should have a GC layout for {ty:?}")); + + let info = match gc_layout { + GcLayout::Array(l) => { + if l.elems_are_gc_refs { + debug_assert_eq!( + l.elem_offset(0), + u32::try_from(GC_REF_ARRAY_ELEMS_OFFSET).unwrap() + ); + } + TraceInfo::Array { + gc_ref_elems: l.elems_are_gc_refs, + } + } + GcLayout::Struct(l) => TraceInfo::Struct { + gc_ref_offsets: l + .fields + .iter() + .filter_map(|f| if f.is_gc_ref { Some(f.offset) } else { None }) + .collect(), + }, + }; - // TODO: `dec_ref_and_maybe_dealloc` each `VMGcRef` inside this - // object. + let old_entry = self.trace_infos.insert(ty, info); + debug_assert!(old_entry.is_none()); + } + + /// Enumerate all of the given `VMGcRef`'s outgoing edges. + fn trace_gc_ref(&self, gc_ref: &VMGcRef, stack: &mut Vec) { + debug_assert!(!gc_ref.is_i31()); - // Deallocate this GC object. - self.dealloc(gc_ref.unchecked_copy()); + let header = self.header(gc_ref); + let Some(ty) = header.ty() else { + debug_assert!(header.kind().matches(VMGcKind::ExternRef)); + return; + }; + match self + .trace_infos + .get(&ty) + .expect("should have inserted trace info for every GC type allocated in this heap") + { + TraceInfo::Struct { gc_ref_offsets } => { + let data = self.gc_object_data(gc_ref); + for offset in gc_ref_offsets { + let raw = data.read_u32(*offset); + if let Some(gc_ref) = VMGcRef::from_raw_u32(raw) { + stack.push(gc_ref); + } + } + } + TraceInfo::Array { gc_ref_elems } => { + if !*gc_ref_elems { + return; + } + + let data = self.gc_object_data(gc_ref); + let len = self.array_len(gc_ref.as_arrayref_unchecked()); + for i in 0..len { + let elem_offset = GC_REF_ARRAY_ELEMS_OFFSET + + i * u32::try_from(mem::size_of::()).unwrap(); + let raw = data.read_u32(elem_offset); + if let Some(gc_ref) = VMGcRef::from_raw_u32(raw) { + stack.push(gc_ref); + } + } + } } } @@ -247,7 +389,7 @@ impl DrcHeap { } debug_assert_ne!( - *self.index_mut(drc_ref(&gc_ref)).ref_count.get_mut(), + self.index_mut(drc_ref(&gc_ref)).ref_count, 0, "{gc_ref:#p} is on the Wasm stack and therefore should be held \ by the activations table; should have nonzero ref count", @@ -271,10 +413,7 @@ impl DrcHeap { .chunk .iter_mut() .take(num_filled) - .map(|slot| { - let raw = *slot.get_mut(); - VMGcRef::from_raw_u32(raw).expect("non-null") - }) + .map(|slot| VMGcRef::from_raw_u32(*slot).expect("non-null")) } #[inline(never)] @@ -301,14 +440,14 @@ impl DrcHeap { // borrows. let mut alloc = mem::take(&mut self.activations_table.alloc); for slot in alloc.chunk.iter_mut().take(num_filled) { - let raw = mem::take(slot.get_mut()); + let raw = mem::take(slot); let gc_ref = VMGcRef::from_raw_u32(raw).expect("non-null"); f(self, gc_ref); - *slot.get_mut() = 0; + *slot = 0; } debug_assert!( - alloc.chunk.iter_mut().all(|slot| *slot.get_mut() == 0), + alloc.chunk.iter().all(|slot| *slot == 0), "after sweeping the bump chunk, all slots should be empty", ); @@ -409,15 +548,9 @@ fn externref_to_drc(externref: &VMExternRef) -> &TypedGcRef { #[repr(C)] struct VMDrcHeader { header: VMGcHeader, - ref_count: UnsafeCell, + ref_count: u64, } -// Although this contains an `UnsafeCell`, that is just for allowing the field -// to be written to by JIT code, and it is only read/modified when we have -// access to an appropriate borrow of the heap. -unsafe impl Send for VMDrcHeader {} -unsafe impl Sync for VMDrcHeader {} - unsafe impl GcHeapObject for VMDrcHeader { #[inline] fn is(_header: &VMGcHeader) -> bool { @@ -428,11 +561,8 @@ unsafe impl GcHeapObject for VMDrcHeader { impl VMDrcHeader { /// The size of this header's object. - /// - /// This is stored in the inner `VMGcHeader`'s reserved bits. fn object_size(&self) -> usize { - let size = self.header.reserved_u27(); - usize::try_from(size).unwrap() + usize::try_from(self.header.reserved_u27()).unwrap() } } @@ -540,32 +670,41 @@ unsafe impl GcHeap for DrcHeap { } fn object_size(&self, gc_ref: &VMGcRef) -> usize { - let size = self.header(gc_ref).reserved_u27(); - usize::try_from(size).unwrap() + self.index(drc_ref(gc_ref)).object_size() } fn alloc_raw(&mut self, mut header: VMGcHeader, layout: Layout) -> Result> { debug_assert!(layout.size() >= core::mem::size_of::()); debug_assert!(layout.align() >= core::mem::align_of::()); + debug_assert_eq!(header.reserved_u27(), 0); + + // We must have trace info for every GC type that we allocate in this + // heap. The only kinds of GC objects we allocate that do not have an + // associated `VMSharedTypeIndex` are `externref`s, and they don't have + // any GC edges. + if let Some(ty) = header.ty() { + self.ensure_trace_info(ty); + } else { + debug_assert_eq!(header.kind(), VMGcKind::ExternRef); + } + // The size must fit in the unused bits of the GC header. let size = u32::try_from(layout.size()).unwrap(); if !VMGcKind::value_fits_in_unused_bits(size) { return Err(crate::Trap::AllocationTooLarge.into()); } + header.set_reserved_u27(size); let gc_ref = match self.free_list.alloc(layout)? { None => return Ok(None), Some(index) => VMGcRef::from_heap_index(index).unwrap(), }; - debug_assert_eq!(header.reserved_u27(), 0); - header.set_reserved_u27(size); - *self.index_mut(drc_ref(&gc_ref)) = VMDrcHeader { header, - ref_count: UnsafeCell::new(1), + ref_count: 1, }; - log::trace!("increment {gc_ref:#p} ref count -> 1"); + log::trace!("new object: increment {gc_ref:#p} ref count -> 1"); Ok(Some(gc_ref)) } @@ -581,6 +720,7 @@ unsafe impl GcHeap for DrcHeap { None => return Ok(None), Some(gc_ref) => gc_ref, }; + Ok(Some(gc_ref.into_structref_unchecked())) } @@ -588,43 +728,6 @@ unsafe impl GcHeap for DrcHeap { self.dealloc(structref.into()); } - fn gc_object_data(&mut self, gc_ref: &VMGcRef) -> VMGcObjectDataMut<'_> { - let range = self.object_range(gc_ref); - let data = &mut self.heap_slice_mut()[range]; - VMGcObjectDataMut::new(data) - } - - fn gc_object_data_pair( - &mut self, - a: &VMGcRef, - b: &VMGcRef, - ) -> (VMGcObjectDataMut<'_>, VMGcObjectDataMut<'_>) { - assert_ne!(a, b); - - let a_range = self.object_range(a); - let b_range = self.object_range(b); - - // Assert that the two objects do not overlap. - assert!(a_range.start <= a_range.end); - assert!(b_range.start <= b_range.end); - assert!(a_range.end <= b_range.start || b_range.end <= a_range.start); - - let (a_data, b_data) = if a_range.start < b_range.start { - let (a_half, b_half) = self.heap_slice_mut().split_at_mut(b_range.start); - let b_len = b_range.end - b_range.start; - (&mut a_half[a_range], &mut b_half[..b_len]) - } else { - let (b_half, a_half) = self.heap_slice_mut().split_at_mut(a_range.start); - let a_len = a_range.end - a_range.start; - (&mut a_half[..a_len], &mut b_half[b_range]) - }; - - ( - VMGcObjectDataMut::new(a_data), - VMGcObjectDataMut::new(b_data), - ) - } - fn alloc_uninit_array( &mut self, ty: VMSharedTypeIndex, @@ -638,8 +741,10 @@ unsafe impl GcHeap for DrcHeap { None => return Ok(None), Some(gc_ref) => gc_ref, }; - self.index_mut::(gc_ref.as_typed_unchecked()) + + self.index_mut(gc_ref.as_typed_unchecked::()) .length = length; + Ok(Some(gc_ref.into_arrayref_unchecked())) } @@ -675,27 +780,33 @@ unsafe impl GcHeap for DrcHeap { #[cfg(feature = "pooling-allocator")] fn reset(&mut self) { let DrcHeap { + engine: _, no_gc_count, activations_table, free_list, + dec_ref_stack, heap: _, + + // NB: we will only ever be reused with the same engine, so no need + // to clear out our tracing info just to fill it back in with the + // same exact stuff. + trace_infos: _, } = self; *no_gc_count = 0; free_list.reset(); activations_table.reset(); + debug_assert!(dec_ref_stack.as_ref().is_some_and(|s| s.is_empty())); } - fn heap_slice(&self) -> &[UnsafeCell] { - let ptr = self.heap.as_ptr().cast(); + fn heap_slice(&self) -> &[u8] { let len = self.heap.len(); - unsafe { core::slice::from_raw_parts(ptr, len) } + unsafe { self.heap.slice(0..len) } } fn heap_slice_mut(&mut self) -> &mut [u8] { - let ptr = self.heap.as_mut_ptr(); let len = self.heap.len(); - unsafe { core::slice::from_raw_parts_mut(ptr, len) } + unsafe { self.heap.slice_mut(0..len) } } } @@ -737,7 +848,7 @@ impl<'a> GarbageCollection<'a> for DrcCollection<'a> { /// The type of `VMGcRefActivationsTable`'s bump region's elements. /// /// These are written to by Wasm. -type TableElem = UnsafeCell; +type TableElem = u32; /// A table that over-approximizes the set of `VMGcRef`s that any Wasm /// activation on this thread is currently using. @@ -780,15 +891,14 @@ struct VMGcRefActivationsTable { struct VMGcRefTableAlloc { /// Bump-allocation finger within the `chunk`. /// - /// NB: this is an `UnsafeCell` because it is written to by compiled Wasm - /// code. - next: UnsafeCell>, + /// NB: this is written to by compiled Wasm code. + next: SendSyncPtr, /// Pointer to just after the `chunk`. /// /// This is *not* within the current chunk and therefore is not a valid /// place to insert a reference! - end: NonNull, + end: SendSyncPtr, /// Bump allocation chunk that stores fast-path insertions. /// @@ -807,8 +917,8 @@ impl Default for VMGcRefTableAlloc { let next = chunk.as_mut_ptr(); let end = unsafe { next.add(chunk.len()) }; VMGcRefTableAlloc { - next: UnsafeCell::new(NonNull::new(next).unwrap()), - end: NonNull::new(end).unwrap(), + next: SendSyncPtr::new(NonNull::new(next).unwrap()), + end: SendSyncPtr::new(NonNull::new(end).unwrap()), chunk, } } @@ -821,24 +931,20 @@ impl VMGcRefTableAlloc { /// Force the lazy allocation of this bump region. fn force_allocation(&mut self) { assert!(self.chunk.is_empty()); - self.chunk = (0..Self::CHUNK_SIZE).map(|_| UnsafeCell::new(0)).collect(); + self.chunk = (0..Self::CHUNK_SIZE).map(|_| 0).collect(); self.reset(); } /// Reset this bump region, retaining any underlying allocation, but moving /// the bump pointer and limit to their default positions. fn reset(&mut self) { - self.next = UnsafeCell::new(NonNull::new(self.chunk.as_mut_ptr()).unwrap()); - self.end = NonNull::new(unsafe { self.chunk.as_mut_ptr().add(self.chunk.len()) }).unwrap(); + self.next = SendSyncPtr::new(NonNull::new(self.chunk.as_mut_ptr()).unwrap()); + self.end = SendSyncPtr::new( + NonNull::new(unsafe { self.chunk.as_mut_ptr().add(self.chunk.len()) }).unwrap(), + ); } } -// This gets around the usage of `UnsafeCell` throughout the internals of this -// allocator, but the storage should all be Send/Sync and synchronization isn't -// necessary since operations require `&mut self`. -unsafe impl Send for VMGcRefTableAlloc {} -unsafe impl Sync for VMGcRefTableAlloc {} - fn _assert_send_sync() { fn _assert() {} _assert::(); @@ -877,8 +983,8 @@ impl VMGcRefActivationsTable { #[inline] fn bump_capacity_remaining(&self) -> usize { let end = self.alloc.end.as_ptr() as usize; - let next = unsafe { *self.alloc.next.get() }; - end - next.as_ptr() as usize + let next = self.alloc.next.as_ptr() as usize; + end - next } /// Try and insert a `VMGcRef` into this table. @@ -893,21 +999,20 @@ impl VMGcRefActivationsTable { #[inline] fn try_insert(&mut self, gc_ref: VMGcRef) -> Result<(), VMGcRef> { unsafe { - let next = *self.alloc.next.get(); - if next == self.alloc.end { + if self.alloc.next == self.alloc.end { return Err(gc_ref); } debug_assert_eq!( - (*next.as_ref().get()), + self.alloc.next.as_non_null().read(), 0, "slots >= the `next` bump finger are always `None`" ); - ptr::write(next.as_ptr(), UnsafeCell::new(gc_ref.as_raw_u32())); + self.alloc.next.as_non_null().write(gc_ref.as_raw_u32()); - let next = NonNull::new_unchecked(next.as_ptr().add(1)); - debug_assert!(next <= self.alloc.end); - *self.alloc.next.get() = next; + let next = SendSyncPtr::new(NonNull::new(self.alloc.next.as_ptr().add(1)).unwrap()); + debug_assert!(next.as_ptr() <= self.alloc.end.as_ptr()); + self.alloc.next = next; Ok(()) } @@ -927,7 +1032,7 @@ impl VMGcRefActivationsTable { } fn num_filled_in_bump_chunk(&self) -> usize { - let next = unsafe { *self.alloc.next.get() }; + let next = self.alloc.next; let bytes_unused = (self.alloc.end.as_ptr() as usize) - (next.as_ptr() as usize); let slots_unused = bytes_unused / mem::size_of::(); self.alloc.chunk.len().saturating_sub(slots_unused) @@ -942,7 +1047,7 @@ impl VMGcRefActivationsTable { // filled-in slots. let num_filled = self.num_filled_in_bump_chunk(); for slot in self.alloc.chunk.iter().take(num_filled) { - if let Some(elem) = VMGcRef::from_raw_u32(unsafe { *slot.get() }) { + if let Some(elem) = VMGcRef::from_raw_u32(*slot) { f(&elem); } } @@ -1011,7 +1116,7 @@ mod tests { fn ref_count_is_at_correct_offset() { let extern_data = VMDrcHeader { header: VMGcHeader::externref(), - ref_count: UnsafeCell::new(0), + ref_count: 0, }; let extern_data_ptr = &extern_data as *const _; diff --git a/crates/wasmtime/src/runtime/vm/gc/enabled/free_list.rs b/crates/wasmtime/src/runtime/vm/gc/enabled/free_list.rs index e1d2a3f923..8794ec360d 100644 --- a/crates/wasmtime/src/runtime/vm/gc/enabled/free_list.rs +++ b/crates/wasmtime/src/runtime/vm/gc/enabled/free_list.rs @@ -13,13 +13,11 @@ pub(crate) struct FreeList { } /// Our minimum and maximum supported alignment. Every allocation is aligned to -/// this. -const ALIGN_U32: u32 = 8; +/// this. Additionally, this is the minimum allocation size, and every +/// allocation is rounded up to this size. +const ALIGN_U32: u32 = 16; const ALIGN_USIZE: usize = ALIGN_U32 as usize; -/// Our minimum allocation size. -const MIN_BLOCK_SIZE: u32 = 24; - impl FreeList { /// Create a new `Layout` from the given `size` with an alignment that is /// compatible with this free list. @@ -30,6 +28,7 @@ impl FreeList { /// Create a new `FreeList` for a contiguous region of memory of the given /// size. pub fn new(capacity: usize) -> Self { + log::trace!("FreeList::new({capacity})"); let mut free_list = FreeList { capacity, free_block_index_to_len: BTreeMap::new(), @@ -52,22 +51,33 @@ impl FreeList { layout.align(), ); - ensure!( - layout.size() <= self.max_size(), - "requested allocation's size of {} is greater than the max supported size of {}", - layout.size(), - self.max_size(), - ); + if layout.size() > self.max_size() { + let trap = crate::Trap::AllocationTooLarge; + let err = anyhow::Error::from(trap); + let err = err.context(format!( + "requested allocation's size of {} is greater than the max supported size of {}", + layout.size(), + self.max_size(), + )); + return Err(err); + } - let alloc_size = u32::try_from(layout.size()) - .context("requested allocation's size does not fit in a u32")?; + let alloc_size = u32::try_from(layout.size()).map_err(|e| { + let trap = crate::Trap::AllocationTooLarge; + let err = anyhow::Error::from(trap); + err.context(e) + .context("requested allocation's size does not fit in a u32") + })?; alloc_size .checked_next_multiple_of(ALIGN_U32) .ok_or_else(|| { - anyhow!( + let trap = crate::Trap::AllocationTooLarge; + let err = anyhow::Error::from(trap); + let err = err.context(format!( "failed to round allocation size of {alloc_size} up to next \ multiple of {ALIGN_USIZE}" - ) + )); + err }) } @@ -99,7 +109,7 @@ impl FreeList { debug_assert_eq!(block_index % ALIGN_U32, 0); debug_assert_eq!(block_len % ALIGN_U32, 0); - if block_len - alloc_size < MIN_BLOCK_SIZE { + if block_len - alloc_size < ALIGN_U32 { // The block is not large enough to split. return block_len; } @@ -130,6 +140,7 @@ impl FreeList { /// /// * `Err(_)`: pub fn alloc(&mut self, layout: Layout) -> Result> { + log::trace!("FreeList::alloc({layout:?})"); let alloc_size = self.check_layout(layout)?; debug_assert_eq!(alloc_size % ALIGN_U32, 0); @@ -150,11 +161,14 @@ impl FreeList { #[cfg(debug_assertions)] self.check_integrity(); + log::trace!("FreeList::alloc({layout:?}) -> {block_index:#x}"); Ok(Some(unsafe { NonZeroU32::new_unchecked(block_index) })) } /// Deallocate an object with the given layout. pub fn dealloc(&mut self, index: NonZeroU32, layout: Layout) { + log::trace!("FreeList::dealloc({index:#x}, {layout:?})"); + let index = index.get(); debug_assert_eq!(index % ALIGN_U32, 0); @@ -182,6 +196,12 @@ impl FreeList { if blocks_are_contiguous(prev_index, prev_len, index) && blocks_are_contiguous(index, alloc_size, next_index) => { + log::trace!( + "merging blocks {prev_index:#x}..{prev_len:#x}, {index:#x}..{index_end:#x}, {next_index:#x}..{next_end:#x}", + prev_len = prev_index + prev_len, + index_end = index + u32::try_from(layout.size()).unwrap(), + next_end = next_index + next_len, + ); self.free_block_index_to_len.remove(&next_index); let merged_block_len = next_index + next_len - prev_index; debug_assert_eq!(merged_block_len % ALIGN_U32, 0); @@ -192,6 +212,11 @@ impl FreeList { (Some((prev_index, prev_len)), _) if blocks_are_contiguous(prev_index, prev_len, index) => { + log::trace!( + "merging blocks {prev_index:#x}..{prev_len:#x}, {index:#x}..{index_end:#x}", + prev_len = prev_index + prev_len, + index_end = index + u32::try_from(layout.size()).unwrap(), + ); let merged_block_len = index + alloc_size - prev_index; debug_assert_eq!(merged_block_len % ALIGN_U32, 0); *self.free_block_index_to_len.get_mut(&prev_index).unwrap() = merged_block_len; @@ -201,6 +226,11 @@ impl FreeList { (_, Some((next_index, next_len))) if blocks_are_contiguous(index, alloc_size, next_index) => { + log::trace!( + "merging blocks {index:#x}..{index_end:#x}, {next_index:#x}..{next_end:#x}", + index_end = index + u32::try_from(layout.size()).unwrap(), + next_end = next_index + next_len, + ); self.free_block_index_to_len.remove(&next_index); let merged_block_len = next_index + next_len - index; debug_assert_eq!(merged_block_len % ALIGN_U32, 0); @@ -210,6 +240,7 @@ impl FreeList { // None of the blocks are contiguous: insert this block into the // free list. (_, _) => { + log::trace!("cannot merge blocks"); self.free_block_index_to_len.insert(index, alloc_size); } } @@ -271,7 +302,7 @@ impl FreeList { let len = round_u32_down_to_pow2(end.saturating_sub(start), ALIGN_U32); - let entire_range = if len >= MIN_BLOCK_SIZE { + let entire_range = if len >= ALIGN_U32 { Some((start, len)) } else { None @@ -290,9 +321,17 @@ fn blocks_are_contiguous(prev_index: u32, prev_len: u32, next_index: u32) -> boo // the size of the `Layout` given to us upon deallocation (aka `prev_len`) // is smaller than the actual size of the block we allocated. let end_of_prev = prev_index + prev_len; - debug_assert!(next_index >= end_of_prev); + debug_assert!( + next_index >= end_of_prev, + "overlapping blocks: \n\ + \t prev_index = {prev_index:#x}\n\ + \t prev_len = {prev_len:#x}\n\ + \tend_of_prev = {end_of_prev:#x}\n\ + \t next_index = {next_index:#x}\n\ + `next_index` should be >= `end_of_prev`" + ); let delta_to_next = next_index - end_of_prev; - delta_to_next < MIN_BLOCK_SIZE + delta_to_next < ALIGN_U32 } #[inline] @@ -479,21 +518,20 @@ mod tests { #[test] fn allocate_no_split() { // Create a free list with the capacity to allocate two blocks of size - // `MIN_BLOCK_SIZE`. - let mut free_list = - FreeList::new(ALIGN_USIZE + usize::try_from(MIN_BLOCK_SIZE).unwrap() * 2); + // `ALIGN_U32`. + let mut free_list = FreeList::new(ALIGN_USIZE + usize::try_from(ALIGN_U32).unwrap() * 2); assert_eq!(free_list.free_block_index_to_len.len(), 1); assert_eq!( free_list.max_size(), - usize::try_from(MIN_BLOCK_SIZE).unwrap() * 2 + usize::try_from(ALIGN_U32).unwrap() * 2 ); // Allocate a block such that the remainder is not worth splitting. free_list .alloc( Layout::from_size_align( - usize::try_from(MIN_BLOCK_SIZE).unwrap() + ALIGN_USIZE, + usize::try_from(ALIGN_U32).unwrap() + ALIGN_USIZE, ALIGN_USIZE, ) .unwrap(), @@ -508,21 +546,20 @@ mod tests { #[test] fn allocate_and_split() { // Create a free list with the capacity to allocate three blocks of size - // `MIN_BLOCK_SIZE`. - let mut free_list = - FreeList::new(ALIGN_USIZE + usize::try_from(MIN_BLOCK_SIZE).unwrap() * 3); + // `ALIGN_U32`. + let mut free_list = FreeList::new(ALIGN_USIZE + usize::try_from(ALIGN_U32).unwrap() * 3); assert_eq!(free_list.free_block_index_to_len.len(), 1); assert_eq!( free_list.max_size(), - usize::try_from(MIN_BLOCK_SIZE).unwrap() * 3 + usize::try_from(ALIGN_U32).unwrap() * 3 ); // Allocate a block such that the remainder is not worth splitting. free_list .alloc( Layout::from_size_align( - usize::try_from(MIN_BLOCK_SIZE).unwrap() + ALIGN_USIZE, + usize::try_from(ALIGN_U32).unwrap() + ALIGN_USIZE, ALIGN_USIZE, ) .unwrap(), @@ -537,10 +574,9 @@ mod tests { #[test] fn dealloc_merge_prev_and_next() { let layout = - Layout::from_size_align(usize::try_from(MIN_BLOCK_SIZE).unwrap(), ALIGN_USIZE).unwrap(); + Layout::from_size_align(usize::try_from(ALIGN_U32).unwrap(), ALIGN_USIZE).unwrap(); - let mut free_list = - FreeList::new(ALIGN_USIZE + usize::try_from(MIN_BLOCK_SIZE).unwrap() * 100); + let mut free_list = FreeList::new(ALIGN_USIZE + usize::try_from(ALIGN_U32).unwrap() * 100); assert_eq!( free_list.free_block_index_to_len.len(), 1, @@ -586,10 +622,9 @@ mod tests { #[test] fn dealloc_merge_with_prev_and_not_next() { let layout = - Layout::from_size_align(usize::try_from(MIN_BLOCK_SIZE).unwrap(), ALIGN_USIZE).unwrap(); + Layout::from_size_align(usize::try_from(ALIGN_U32).unwrap(), ALIGN_USIZE).unwrap(); - let mut free_list = - FreeList::new(ALIGN_USIZE + usize::try_from(MIN_BLOCK_SIZE).unwrap() * 100); + let mut free_list = FreeList::new(ALIGN_USIZE + usize::try_from(ALIGN_U32).unwrap() * 100); assert_eq!( free_list.free_block_index_to_len.len(), 1, @@ -635,10 +670,9 @@ mod tests { #[test] fn dealloc_merge_with_next_and_not_prev() { let layout = - Layout::from_size_align(usize::try_from(MIN_BLOCK_SIZE).unwrap(), ALIGN_USIZE).unwrap(); + Layout::from_size_align(usize::try_from(ALIGN_U32).unwrap(), ALIGN_USIZE).unwrap(); - let mut free_list = - FreeList::new(ALIGN_USIZE + usize::try_from(MIN_BLOCK_SIZE).unwrap() * 100); + let mut free_list = FreeList::new(ALIGN_USIZE + usize::try_from(ALIGN_U32).unwrap() * 100); assert_eq!( free_list.free_block_index_to_len.len(), 1, @@ -684,10 +718,9 @@ mod tests { #[test] fn dealloc_no_merge() { let layout = - Layout::from_size_align(usize::try_from(MIN_BLOCK_SIZE).unwrap(), ALIGN_USIZE).unwrap(); + Layout::from_size_align(usize::try_from(ALIGN_U32).unwrap(), ALIGN_USIZE).unwrap(); - let mut free_list = - FreeList::new(ALIGN_USIZE + usize::try_from(MIN_BLOCK_SIZE).unwrap() * 100); + let mut free_list = FreeList::new(ALIGN_USIZE + usize::try_from(ALIGN_U32).unwrap() * 100); assert_eq!( free_list.free_block_index_to_len.len(), 1, @@ -737,18 +770,17 @@ mod tests { #[test] fn alloc_size_too_large() { // Free list with room for 10 min-sized blocks. - let mut free_list = - FreeList::new(ALIGN_USIZE + usize::try_from(MIN_BLOCK_SIZE).unwrap() * 10); + let mut free_list = FreeList::new(ALIGN_USIZE + usize::try_from(ALIGN_U32).unwrap() * 10); assert_eq!( free_list.max_size(), - usize::try_from(MIN_BLOCK_SIZE).unwrap() * 10 + usize::try_from(ALIGN_U32).unwrap() * 10 ); // Attempt to allocate something that is 20 times the size of our // min-sized block. assert!(free_list .alloc( - Layout::from_size_align(usize::try_from(MIN_BLOCK_SIZE).unwrap() * 20, ALIGN_USIZE) + Layout::from_size_align(usize::try_from(ALIGN_U32).unwrap() * 20, ALIGN_USIZE) .unwrap(), ) .is_err()); @@ -757,20 +789,49 @@ mod tests { #[test] fn alloc_align_too_large() { // Free list with room for 10 min-sized blocks. - let mut free_list = - FreeList::new(ALIGN_USIZE + usize::try_from(MIN_BLOCK_SIZE).unwrap() * 10); + let mut free_list = FreeList::new(ALIGN_USIZE + usize::try_from(ALIGN_U32).unwrap() * 10); assert_eq!( free_list.max_size(), - usize::try_from(MIN_BLOCK_SIZE).unwrap() * 10 + usize::try_from(ALIGN_U32).unwrap() * 10 ); // Attempt to allocate something that requires larger alignment than // `FreeList` supports. assert!(free_list .alloc( - Layout::from_size_align(usize::try_from(MIN_BLOCK_SIZE).unwrap(), ALIGN_USIZE * 2) + Layout::from_size_align(usize::try_from(ALIGN_U32).unwrap(), ALIGN_USIZE * 2) .unwrap(), ) .is_err()); } + + #[test] + fn all_pairwise_alloc_dealloc_orderings() { + let tests: &[fn(&mut FreeList, Layout)] = &[ + |f, l| { + let a = f.alloc(l).unwrap().unwrap(); + let b = f.alloc(l).unwrap().unwrap(); + f.dealloc(a, l); + f.dealloc(b, l); + }, + |f, l| { + let a = f.alloc(l).unwrap().unwrap(); + let b = f.alloc(l).unwrap().unwrap(); + f.dealloc(b, l); + f.dealloc(a, l); + }, + |f, l| { + let a = f.alloc(l).unwrap().unwrap(); + f.dealloc(a, l); + let b = f.alloc(l).unwrap().unwrap(); + f.dealloc(b, l); + }, + ]; + + let l = Layout::from_size_align(16, 8).unwrap(); + for test in tests { + let mut f = FreeList::new(0x100); + test(&mut f, l); + } + } } diff --git a/crates/wasmtime/src/runtime/vm/gc/enabled/null.rs b/crates/wasmtime/src/runtime/vm/gc/enabled/null.rs index c76666fc9f..6efbb39767 100644 --- a/crates/wasmtime/src/runtime/vm/gc/enabled/null.rs +++ b/crates/wasmtime/src/runtime/vm/gc/enabled/null.rs @@ -12,13 +12,12 @@ use crate::{ GcHeap, GcHeapObject, GcProgress, GcRootsIter, GcRuntime, Mmap, SendSyncUnsafeCell, TypedGcRef, VMGcHeader, VMGcRef, }, - GcHeapOutOfMemory, + Engine, GcHeapOutOfMemory, }; use core::ptr::NonNull; use core::{ alloc::Layout, any::Any, - cell::UnsafeCell, num::{NonZeroU32, NonZeroUsize}, }; use wasmtime_environ::{ @@ -37,7 +36,7 @@ unsafe impl GcRuntime for NullCollector { &self.layouts } - fn new_gc_heap(&self) -> Result> { + fn new_gc_heap(&self, _: &Engine) -> Result> { let heap = NullHeap::new()?; Ok(Box::new(heap) as _) } @@ -202,8 +201,8 @@ unsafe impl GcHeap for NullHeap { self.no_gc_count -= 1; } - fn heap_slice(&self) -> &[UnsafeCell] { - let ptr = self.heap.as_ptr().cast(); + fn heap_slice(&self) -> &[u8] { + let ptr = self.heap.as_ptr(); let len = self.heap.len(); unsafe { core::slice::from_raw_parts(ptr, len) } } diff --git a/crates/wasmtime/src/runtime/vm/gc/enabled/structref.rs b/crates/wasmtime/src/runtime/vm/gc/enabled/structref.rs index 51a0249953..e15066733e 100644 --- a/crates/wasmtime/src/runtime/vm/gc/enabled/structref.rs +++ b/crates/wasmtime/src/runtime/vm/gc/enabled/structref.rs @@ -139,7 +139,7 @@ impl VMStructRef { ty: &StorageType, field: usize, ) -> Val { - let offset = layout.fields[field]; + let offset = layout.fields[field].offset; let data = store.unwrap_gc_store_mut().gc_object_data(self.as_gc_ref()); match ty { StorageType::I8 => Val::I32(data.read_u8(offset).into()), @@ -195,8 +195,8 @@ impl VMStructRef { ) -> Result<()> { debug_assert!(val._matches_ty(&store, &ty.unpack())?); - let offset = layout.fields[field]; - let mut data = store.gc_store_mut()?.gc_object_data(self.as_gc_ref()); + let offset = layout.fields[field].offset; + let data = store.gc_store_mut()?.gc_object_data(self.as_gc_ref()); match val { Val::I32(i) if ty.is_i8() => data.write_i8(offset, truncate_i32_to_i8(i)), Val::I32(i) if ty.is_i16() => data.write_i16(offset, truncate_i32_to_i16(i)), @@ -226,7 +226,7 @@ impl VMStructRef { None => None, }; store.gc_store_mut()?.write_gc_ref(&mut gc_ref, e.as_ref()); - let mut data = store.gc_store_mut()?.gc_object_data(self.as_gc_ref()); + let data = store.gc_store_mut()?.gc_object_data(self.as_gc_ref()); data.write_u32(offset, gc_ref.map_or(0, |r| r.as_raw_u32())); } Val::AnyRef(a) => { @@ -237,7 +237,7 @@ impl VMStructRef { None => None, }; store.gc_store_mut()?.write_gc_ref(&mut gc_ref, a.as_ref()); - let mut data = store.gc_store_mut()?.gc_object_data(self.as_gc_ref()); + let data = store.gc_store_mut()?.gc_object_data(self.as_gc_ref()); data.write_u32(offset, gc_ref.map_or(0, |r| r.as_raw_u32())); } @@ -286,7 +286,7 @@ impl VMStructRef { val: Val, ) -> Result<()> { debug_assert!(val._matches_ty(&store, &ty.unpack())?); - let offset = layout.fields[field]; + let offset = layout.fields[field].offset; match val { Val::I32(i) if ty.is_i8() => store .gc_store_mut()? diff --git a/crates/wasmtime/src/runtime/vm/gc/gc_ref.rs b/crates/wasmtime/src/runtime/vm/gc/gc_ref.rs index c1f3bf8998..39600d7d04 100644 --- a/crates/wasmtime/src/runtime/vm/gc/gc_ref.rs +++ b/crates/wasmtime/src/runtime/vm/gc/gc_ref.rs @@ -232,6 +232,14 @@ impl VMGcRef { VMGcRef(self.0) } + /// Copy this `i31` GC reference, which never requires any GC barriers. + /// + /// Panics if this is not an `i31`. + pub fn copy_i31(&self) -> Self { + assert!(self.is_i31()); + self.unchecked_copy() + } + /// Get this GC reference as a u32 index into its GC heap. /// /// Returns `None` for `i31ref`s. @@ -243,6 +251,12 @@ impl VMGcRef { } } + /// Get this GC reference as a raw, non-zero u32 value, regardless whether + /// it is actually a reference to a GC object or is an `i31ref`. + pub fn as_raw_non_zero_u32(&self) -> NonZeroU32 { + self.0 + } + /// Get this GC reference as a raw u32 value, regardless whether it is /// actually a reference to a GC object or is an `i31ref`. pub fn as_raw_u32(&self) -> u32 { diff --git a/crates/wasmtime/src/runtime/vm/gc/gc_runtime.rs b/crates/wasmtime/src/runtime/vm/gc/gc_runtime.rs index 95bfdeaaa9..f2c1d3a4a3 100644 --- a/crates/wasmtime/src/runtime/vm/gc/gc_runtime.rs +++ b/crates/wasmtime/src/runtime/vm/gc/gc_runtime.rs @@ -3,12 +3,10 @@ use crate::prelude::*; use crate::runtime::vm::{ ExternRefHostDataId, ExternRefHostDataTable, GcHeapObject, SendSyncPtr, TypedGcRef, VMArrayRef, - VMExternRef, VMGcHeader, VMGcObjectDataMut, VMGcRef, VMStructRef, + VMExternRef, VMGcHeader, VMGcObjectData, VMGcRef, VMStructRef, }; use core::ptr::NonNull; -use core::{ - alloc::Layout, any::Any, cell::UnsafeCell, marker, mem, num::NonZeroUsize, ops::Range, ptr, -}; +use core::{alloc::Layout, any::Any, marker, mem, num::NonZeroUsize, ops::Range, ptr}; use wasmtime_environ::{GcArrayLayout, GcStructLayout, GcTypeLayouts, VMSharedTypeIndex}; /// Trait for integrating a garbage collector with the runtime. @@ -38,7 +36,7 @@ pub unsafe trait GcRuntime: 'static + Send + Sync { /// Construct a new GC heap. #[cfg(feature = "gc")] - fn new_gc_heap(&self) -> Result>; + fn new_gc_heap(&self, engine: &crate::Engine) -> Result>; } /// A heap that manages garbage-collected objects. @@ -387,7 +385,7 @@ pub unsafe trait GcHeap: 'static + Send + Sync { /// The heap slice must be the GC heap region, and the region must remain /// valid (i.e. not moved or resized) for JIT code until `self` is dropped /// or `self.reset()` is called. - fn heap_slice(&self) -> &[UnsafeCell]; + fn heap_slice(&self) -> &[u8]; /// Get a mutable slice of the raw bytes of the GC heap. /// @@ -454,15 +452,26 @@ pub unsafe trait GcHeap: 'static + Send + Sync { start..end } - /// Get a mutable borrow of the the given object's data. + /// Get a mutable borrow of the given object's data. + /// + /// # Panics + /// + /// Panics on out-of-bounds accesses or if the `gc_ref` is an `i31ref`. + fn gc_object_data(&self, gc_ref: &VMGcRef) -> &VMGcObjectData { + let range = self.object_range(gc_ref); + let data = &self.heap_slice()[range]; + data.into() + } + + /// Get a mutable borrow of the given object's data. /// /// # Panics /// /// Panics on out-of-bounds accesses or if the `gc_ref` is an `i31ref`. - fn gc_object_data(&mut self, gc_ref: &VMGcRef) -> VMGcObjectDataMut<'_> { + fn gc_object_data_mut(&mut self, gc_ref: &VMGcRef) -> &mut VMGcObjectData { let range = self.object_range(gc_ref); let data = &mut self.heap_slice_mut()[range]; - VMGcObjectDataMut::new(data) + data.into() } /// Get a pair of mutable borrows of the given objects' data. @@ -475,7 +484,7 @@ pub unsafe trait GcHeap: 'static + Send + Sync { &mut self, a: &VMGcRef, b: &VMGcRef, - ) -> (VMGcObjectDataMut<'_>, VMGcObjectDataMut<'_>) { + ) -> (&mut VMGcObjectData, &mut VMGcObjectData) { assert_ne!(a, b); let a_range = self.object_range(a); @@ -496,10 +505,7 @@ pub unsafe trait GcHeap: 'static + Send + Sync { (&mut a_half[..a_len], &mut b_half[b_range]) }; - ( - VMGcObjectDataMut::new(a_data), - VMGcObjectDataMut::new(b_data), - ) + (a_data.into(), b_data.into()) } } diff --git a/crates/wasmtime/src/runtime/vm/imports.rs b/crates/wasmtime/src/runtime/vm/imports.rs index 61082b673b..96ee1dd49a 100644 --- a/crates/wasmtime/src/runtime/vm/imports.rs +++ b/crates/wasmtime/src/runtime/vm/imports.rs @@ -1,5 +1,5 @@ use crate::runtime::vm::vmcontext::{ - VMFunctionImport, VMGlobalImport, VMMemoryImport, VMTableImport, VMTagImport, + VMFunctionImport, VMGlobalImport, VMMemoryImport, VMTable, VMTagImport, }; /// Resolved import pointers. @@ -19,7 +19,7 @@ pub struct Imports<'a> { pub functions: &'a [VMFunctionImport], /// Resolved addresses for imported tables. - pub tables: &'a [VMTableImport], + pub tables: &'a [VMTable], /// Resolved addresses for imported memories. pub memories: &'a [VMMemoryImport], diff --git a/crates/wasmtime/src/runtime/vm/instance.rs b/crates/wasmtime/src/runtime/vm/instance.rs index a1f4590a1e..ddec77e50c 100644 --- a/crates/wasmtime/src/runtime/vm/instance.rs +++ b/crates/wasmtime/src/runtime/vm/instance.rs @@ -8,8 +8,8 @@ use crate::runtime::vm::memory::{Memory, RuntimeMemoryCreator}; use crate::runtime::vm::table::{Table, TableElement, TableElementType}; use crate::runtime::vm::vmcontext::{ VMBuiltinFunctionsArray, VMContext, VMFuncRef, VMFunctionImport, VMGlobalDefinition, - VMGlobalImport, VMMemoryDefinition, VMMemoryImport, VMOpaqueContext, VMStoreContext, - VMTableDefinition, VMTableImport, VMTagDefinition, VMTagImport, + VMGlobalImport, VMMemoryDefinition, VMMemoryImport, VMOpaqueContext, VMStoreContext, VMTable, + VMTableDefinition, VMTagDefinition, VMTagImport, }; use crate::runtime::vm::{ ExportFunction, ExportGlobal, ExportMemory, ExportTable, ExportTag, GcStore, Imports, @@ -171,7 +171,7 @@ impl InstanceAndStore { /// A type that roughly corresponds to a WebAssembly instance, but is also used /// for host-defined objects. /// -/// This structure is is never allocated directly but is instead managed through +/// This structure is never allocated directly but is instead managed through /// an `InstanceHandle`. This structure ends with a `VMContext` which has a /// dynamic size corresponding to the `module` configured within. Memory /// management of this structure is always externalized. @@ -428,8 +428,8 @@ impl Instance { unsafe { &*self.vmctx_plus_offset(self.offsets().vmctx_vmfunction_import(index)) } } - /// Return the index `VMTableImport`. - fn imported_table(&self, index: TableIndex) -> &VMTableImport { + /// Return the index `VMTable`. + fn imported_table(&self, index: TableIndex) -> &VMTable { unsafe { &*self.vmctx_plus_offset(self.offsets().vmctx_vmtable_import(index)) } } @@ -583,7 +583,7 @@ impl Instance { /// Return a pointer to the interrupts structure #[inline] pub fn vm_store_context(&mut self) -> NonNull>> { - unsafe { self.vmctx_plus_offset_mut(self.offsets().ptr.vmctx_runtime_limits()) } + unsafe { self.vmctx_plus_offset_mut(self.offsets().ptr.vmctx_store_context()) } } /// Return a pointer to the global epoch counter used by this instance. @@ -616,7 +616,15 @@ impl Instance { #[cfg(target_has_atomic = "64")] self.epoch_ptr() .write(Some(NonNull::from(store.engine().epoch_counter()).into())); - self.set_gc_heap(store.gc_store_mut().ok()); + + if self.env_module().needs_gc_heap { + self.set_gc_heap(Some(store.gc_store_mut().expect( + "if we need a GC heap, then `Instance::new_raw` should have already \ + allocated it for us", + ))); + } else { + self.set_gc_heap(None); + } } else { self.vm_store_context().write(None); #[cfg(target_has_atomic = "64")] diff --git a/crates/wasmtime/src/runtime/vm/instance/allocator.rs b/crates/wasmtime/src/runtime/vm/instance/allocator.rs index 3247c81bac..8c7c099e60 100644 --- a/crates/wasmtime/src/runtime/vm/instance/allocator.rs +++ b/crates/wasmtime/src/runtime/vm/instance/allocator.rs @@ -312,6 +312,7 @@ pub unsafe trait InstanceAllocatorImpl { #[cfg(feature = "gc")] fn allocate_gc_heap( &self, + engine: &crate::Engine, gc_runtime: &dyn GcRuntime, ) -> Result<(GcHeapAllocationIndex, Box)>; diff --git a/crates/wasmtime/src/runtime/vm/instance/allocator/on_demand.rs b/crates/wasmtime/src/runtime/vm/instance/allocator/on_demand.rs index a7b46a8f7b..5ced5352c7 100644 --- a/crates/wasmtime/src/runtime/vm/instance/allocator/on_demand.rs +++ b/crates/wasmtime/src/runtime/vm/instance/allocator/on_demand.rs @@ -216,9 +216,13 @@ unsafe impl InstanceAllocatorImpl for OnDemandInstanceAllocator { #[cfg(feature = "gc")] fn allocate_gc_heap( &self, + engine: &crate::Engine, gc_runtime: &dyn GcRuntime, ) -> Result<(GcHeapAllocationIndex, Box)> { - Ok((GcHeapAllocationIndex::default(), gc_runtime.new_gc_heap()?)) + Ok(( + GcHeapAllocationIndex::default(), + gc_runtime.new_gc_heap(engine)?, + )) } #[cfg(feature = "gc")] diff --git a/crates/wasmtime/src/runtime/vm/instance/allocator/pooling.rs b/crates/wasmtime/src/runtime/vm/instance/allocator/pooling.rs index 46fd7f08e9..b1a14529ec 100644 --- a/crates/wasmtime/src/runtime/vm/instance/allocator/pooling.rs +++ b/crates/wasmtime/src/runtime/vm/instance/allocator/pooling.rs @@ -147,19 +147,24 @@ pub struct InstanceLimits { impl Default for InstanceLimits { fn default() -> Self { + let total = if cfg!(target_pointer_width = "32") { + 100 + } else { + 1000 + }; // See doc comments for `wasmtime::PoolingAllocationConfig` for these // default values Self { - total_component_instances: 1000, + total_component_instances: total, component_instance_size: 1 << 20, // 1 MiB - total_core_instances: 1000, + total_core_instances: total, max_core_instances_per_component: u32::MAX, max_memories_per_component: u32::MAX, max_tables_per_component: u32::MAX, - total_memories: 1000, - total_tables: 1000, + total_memories: total, + total_tables: total, #[cfg(feature = "async")] - total_stacks: 1000, + total_stacks: total, core_instance_size: 1 << 20, // 1 MiB max_tables_per_module: 1, // NB: in #8504 it was seen that a C# module in debug module can @@ -169,9 +174,9 @@ impl Default for InstanceLimits { #[cfg(target_pointer_width = "64")] max_memory_size: 1 << 32, // 4G, #[cfg(target_pointer_width = "32")] - max_memory_size: usize::MAX, + max_memory_size: 10 << 20, // 10 MiB #[cfg(feature = "gc")] - total_gc_heaps: 1000, + total_gc_heaps: total, } } } @@ -497,7 +502,8 @@ unsafe impl InstanceAllocatorImpl for PoolingInstanceAllocator { offsets: &VMComponentOffsets, get_module: &'a dyn Fn(StaticModuleIndex) -> &'a Module, ) -> Result<()> { - self.validate_component_instance_size(offsets)?; + self.validate_component_instance_size(offsets) + .context("component instance size does not fit in pooling allocator requirements")?; let mut num_core_instances = 0; let mut num_memories = 0; @@ -521,6 +527,7 @@ unsafe impl InstanceAllocatorImpl for PoolingInstanceAllocator { } LowerImport { .. } | ExtractMemory(_) + | ExtractTable(_) | ExtractRealloc(_) | ExtractCallback(_) | ExtractPostReturn(_) @@ -533,7 +540,7 @@ unsafe impl InstanceAllocatorImpl for PoolingInstanceAllocator { { bail!( "The component transitively contains {num_core_instances} core module instances, \ - which exceeds the configured maximum of {}", + which exceeds the configured maximum of {} in the pooling allocator", self.limits.max_core_instances_per_component ); } @@ -541,7 +548,7 @@ unsafe impl InstanceAllocatorImpl for PoolingInstanceAllocator { if num_memories > usize::try_from(self.limits.max_memories_per_component).unwrap() { bail!( "The component transitively contains {num_memories} Wasm linear memories, which \ - exceeds the configured maximum of {}", + exceeds the configured maximum of {} in the pooling allocator", self.limits.max_memories_per_component ); } @@ -549,7 +556,7 @@ unsafe impl InstanceAllocatorImpl for PoolingInstanceAllocator { if num_tables > usize::try_from(self.limits.max_tables_per_component).unwrap() { bail!( "The component transitively contains {num_tables} tables, which exceeds the \ - configured maximum of {}", + configured maximum of {} in the pooling allocator", self.limits.max_tables_per_component ); } @@ -558,9 +565,12 @@ unsafe impl InstanceAllocatorImpl for PoolingInstanceAllocator { } fn validate_module_impl(&self, module: &Module, offsets: &VMOffsets) -> Result<()> { - self.validate_memory_plans(module)?; - self.validate_table_plans(module)?; - self.validate_core_instance_size(offsets)?; + self.validate_memory_plans(module) + .context("module memory does not fit in pooling allocator requirements")?; + self.validate_table_plans(module) + .context("module table does not fit in pooling allocator requirements")?; + self.validate_core_instance_size(offsets) + .context("module instance size does not fit in pooling allocator requirements")?; Ok(()) } @@ -687,9 +697,10 @@ unsafe impl InstanceAllocatorImpl for PoolingInstanceAllocator { #[cfg(feature = "gc")] fn allocate_gc_heap( &self, + engine: &crate::Engine, gc_runtime: &dyn GcRuntime, ) -> Result<(GcHeapAllocationIndex, Box)> { - self.gc_heaps.allocate(gc_runtime) + self.gc_heaps.allocate(engine, gc_runtime) } #[cfg(feature = "gc")] diff --git a/crates/wasmtime/src/runtime/vm/instance/allocator/pooling/gc_heap_pool.rs b/crates/wasmtime/src/runtime/vm/instance/allocator/pooling/gc_heap_pool.rs index 8d471384bb..5c69aa37ea 100644 --- a/crates/wasmtime/src/runtime/vm/instance/allocator/pooling/gc_heap_pool.rs +++ b/crates/wasmtime/src/runtime/vm/instance/allocator/pooling/gc_heap_pool.rs @@ -1,7 +1,7 @@ use super::index_allocator::{SimpleIndexAllocator, SlotId}; use super::GcHeapAllocationIndex; -use crate::prelude::*; use crate::runtime::vm::{GcHeap, GcRuntime, PoolingInstanceAllocatorConfig, Result}; +use crate::{prelude::*, Engine}; use std::sync::Mutex; /// A pool of reusable GC heaps. @@ -47,6 +47,7 @@ impl GcHeapPool { /// Allocate a single table for the given instance allocation request. pub fn allocate( &self, + engine: &Engine, gc_runtime: &dyn GcRuntime, ) -> Result<(GcHeapAllocationIndex, Box)> { let allocation_index = self @@ -69,7 +70,7 @@ impl GcHeapPool { Some(heap) => heap, // Otherwise, we haven't forced this slot's lazily allocated heap // yet. So do that now. - None => gc_runtime.new_gc_heap()?, + None => gc_runtime.new_gc_heap(engine)?, }; Ok((allocation_index, heap)) diff --git a/crates/wasmtime/src/runtime/vm/libcalls.rs b/crates/wasmtime/src/runtime/vm/libcalls.rs index 4f95771a1b..34a43ad860 100644 --- a/crates/wasmtime/src/runtime/vm/libcalls.rs +++ b/crates/wasmtime/src/runtime/vm/libcalls.rs @@ -270,7 +270,7 @@ unsafe fn table_fill_func_ref( match table.element_type() { TableElementType::Func => { let val = NonNull::new(val.cast::()); - table.fill(store.optional_gc_store_mut()?, dst, val.into(), len)?; + table.fill(store.optional_gc_store_mut(), dst, val.into(), len)?; Ok(()) } TableElementType::GcRef => unreachable!(), @@ -317,7 +317,7 @@ unsafe fn table_copy( // Lazy-initialize the whole range in the source table first. let src_range = src..(src.checked_add(len).unwrap_or(u64::MAX)); let src_table = instance.get_table_with_lazy_init(src_table_index, src_range); - let gc_store = store.optional_gc_store_mut()?; + let gc_store = store.optional_gc_store_mut(); Table::copy(gc_store, dst_table, src_table, dst, src, len)?; Ok(()) } @@ -460,18 +460,17 @@ unsafe fn gc(store: &mut dyn VMStore, _instance: &mut Instance, gc_ref: u32) -> // GC. let gc_store = store.store_opaque_mut().unwrap_gc_store_mut(); let gc_ref = gc_store.clone_gc_ref(gc_ref); - gc_store.expose_gc_ref_to_wasm(gc_ref); + let _ = gc_store.expose_gc_ref_to_wasm(gc_ref); } match store.maybe_async_gc(gc_ref)? { None => Ok(0), Some(r) => { - let raw = r.as_raw_u32(); - store + let raw = store .store_opaque_mut() .unwrap_gc_store_mut() .expose_gc_ref_to_wasm(r); - Ok(raw) + Ok(raw.get()) } } } @@ -483,16 +482,16 @@ unsafe fn gc(store: &mut dyn VMStore, _instance: &mut Instance, gc_ref: u32) -> unsafe fn gc_alloc_raw( store: &mut dyn VMStore, instance: &mut Instance, - kind: u32, + kind_and_reserved: u32, module_interned_type_index: u32, size: u32, align: u32, -) -> Result { +) -> Result { use crate::{vm::VMGcHeader, GcHeapOutOfMemory}; use core::alloc::Layout; use wasmtime_environ::{ModuleInternedTypeIndex, VMGcKind}; - let kind = VMGcKind::from_high_bits_of_u32(kind); + let kind = VMGcKind::from_high_bits_of_u32(kind_and_reserved); log::trace!("gc_alloc_raw(kind={kind:?}, size={size}, align={align})",); let module = instance @@ -505,11 +504,16 @@ unsafe fn gc_alloc_raw( .shared_type(module_interned_type_index) .expect("should have engine type index for module type index"); - let header = VMGcHeader::from_kind_and_index(kind, shared_type_index); + let mut header = VMGcHeader::from_kind_and_index(kind, shared_type_index); + header.set_reserved_u27(kind_and_reserved & VMGcKind::UNUSED_MASK); let size = usize::try_from(size).unwrap(); let align = usize::try_from(align).unwrap(); - let layout = Layout::from_size_align(size, align).unwrap(); + assert!(align.is_power_of_two()); + let layout = Layout::from_size_align(size, align).map_err(|e| { + let err = Error::from(crate::Trap::AllocationTooLarge); + err.context(e) + })?; let gc_ref = match store .store_opaque_mut() @@ -529,9 +533,7 @@ unsafe fn gc_alloc_raw( } }; - let raw = gc_ref.as_raw_u32(); - - store + let raw = store .store_opaque_mut() .unwrap_gc_store_mut() .expose_gc_ref_to_wasm(gc_ref); @@ -606,7 +608,7 @@ unsafe fn array_new_data( data_index: u32, src: u32, len: u32, -) -> Result { +) -> Result { use crate::{ArrayType, GcHeapOutOfMemory}; use wasmtime_environ::ModuleInternedTypeIndex; @@ -669,8 +671,7 @@ unsafe fn array_new_data( .copy_from_slice(array_layout.base_size, data); // Return the array to Wasm! - let raw = array_ref.as_gc_ref().as_raw_u32(); - store + let raw = store .store_opaque_mut() .unwrap_gc_store_mut() .expose_gc_ref_to_wasm(array_ref.into()); @@ -767,7 +768,7 @@ unsafe fn array_new_elem( elem_index: u32, src: u32, len: u32, -) -> Result { +) -> Result { use crate::{ store::AutoAssertNoGc, vm::const_expr::{ConstEvalContext, ConstExprEvaluator}, @@ -839,8 +840,7 @@ unsafe fn array_new_elem( let mut store = AutoAssertNoGc::new(store); let gc_ref = array.try_clone_gc_ref(&mut store)?; - let raw = gc_ref.as_raw_u32(); - store.unwrap_gc_store_mut().expose_gc_ref_to_wasm(gc_ref); + let raw = store.unwrap_gc_store_mut().expose_gc_ref_to_wasm(gc_ref); Ok(raw) }) } diff --git a/crates/wasmtime/src/runtime/vm/mmap_vec.rs b/crates/wasmtime/src/runtime/vm/mmap_vec.rs index 9cd2a1d917..47698056b5 100644 --- a/crates/wasmtime/src/runtime/vm/mmap_vec.rs +++ b/crates/wasmtime/src/runtime/vm/mmap_vec.rs @@ -1,5 +1,4 @@ use crate::prelude::*; -#[cfg(not(has_virtual_memory))] use crate::runtime::vm::send_sync_ptr::SendSyncPtr; #[cfg(has_virtual_memory)] use crate::runtime::vm::{mmap::UnalignedLength, Mmap}; @@ -7,7 +6,6 @@ use crate::runtime::vm::{mmap::UnalignedLength, Mmap}; use alloc::alloc::Layout; use alloc::sync::Arc; use core::ops::{Deref, Range}; -#[cfg(not(has_virtual_memory))] use core::ptr::NonNull; #[cfg(feature = "std")] use std::fs::File; @@ -40,6 +38,8 @@ pub enum MmapVec { layout: Layout, }, #[doc(hidden)] + ExternallyOwned { memory: SendSyncPtr<[u8]> }, + #[doc(hidden)] #[cfg(has_virtual_memory)] Mmap { mmap: Mmap, @@ -74,6 +74,11 @@ impl MmapVec { MmapVec::Alloc { base, layout } } + fn new_externally_owned(memory: NonNull<[u8]>) -> MmapVec { + let memory = SendSyncPtr::new(memory); + MmapVec::ExternallyOwned { memory } + } + /// Creates a new zero-initialized `MmapVec` with the given `size` /// and `alignment`. /// @@ -101,6 +106,25 @@ impl MmapVec { MmapVec::from_slice_with_alignment(slice, 1) } + /// Creates a new `MmapVec` from an existing memory region + /// + /// This method avoids the copy performed by [`Self::from_slice`] by + /// directly using the memory region provided. This must be done with + /// extreme care, however, as any concurrent modification of the provided + /// memory will cause undefined and likely very, very bad things to + /// happen. + /// + /// The memory provided is guaranteed to not be mutated by the runtime. + /// + /// # Safety + /// + /// As there is no copy here, the runtime will be making direct readonly use + /// of the provided memory. As such, outside writes to this memory region + /// will result in undefined and likely very undesirable behavior. + pub unsafe fn from_raw(memory: NonNull<[u8]>) -> Result { + Ok(MmapVec::new_externally_owned(memory)) + } + /// Creates a new `MmapVec` from the contents of an existing /// `slice`, with a minimum alignment. /// @@ -110,7 +134,7 @@ impl MmapVec { /// /// A new `MmapVec` is allocated to hold the contents of `slice` and then /// `slice` is copied into the new mmap. It's recommended to avoid this - /// method if possible to avoid the need to copy data around. pub + /// method if possible to avoid the need to copy data around. pub fn from_slice_with_alignment(slice: &[u8], align: usize) -> Result { let mut result = MmapVec::with_capacity_and_alignment(slice.len(), align)?; // SAFETY: The mmap hasn't been made readonly yet so this should be @@ -121,6 +145,37 @@ impl MmapVec { Ok(result) } + /// Return `true` if the `MmapVec` suport virtual memory operations + /// + /// In some cases, such as when using externally owned memory, the underlying + /// platform may support virtual memory but it still may not be legal + /// to perform virtual memory operations on this memory. + pub fn supports_virtual_memory(&self) -> bool { + match self { + #[cfg(has_virtual_memory)] + MmapVec::Mmap { .. } => true, + MmapVec::ExternallyOwned { .. } => false, + #[cfg(not(has_virtual_memory))] + MmapVec::Alloc { .. } => false, + } + } + + /// Return true if this `MmapVec` is always readonly + /// + /// Attempting to get access to mutate readonly memory via + /// [`MmapVec::as_mut`] will result in a panic. Note that this method + /// does not change with runtime changes to portions of the code memory + /// via `MmapVec::make_readonly` for platforms with virtual memory. + pub fn is_always_readonly(&self) -> bool { + match self { + #[cfg(has_virtual_memory)] + MmapVec::Mmap { .. } => false, + MmapVec::ExternallyOwned { .. } => true, + #[cfg(not(has_virtual_memory))] + MmapVec::Alloc { .. } => false, + } + } + /// Creates a new `MmapVec` which is the given `File` mmap'd into memory. /// /// This function will determine the file's size and map the full contents @@ -148,6 +203,9 @@ impl MmapVec { ) -> Result<()> { let (mmap, len) = match self { MmapVec::Mmap { mmap, len } => (mmap, *len), + MmapVec::ExternallyOwned { .. } => { + bail!("Unable to make externally owned memory executable"); + } }; assert!(range.start <= range.end); assert!(range.end <= len); @@ -159,6 +217,9 @@ impl MmapVec { pub unsafe fn make_readonly(&self, range: Range) -> Result<()> { let (mmap, len) = match self { MmapVec::Mmap { mmap, len } => (mmap, *len), + MmapVec::ExternallyOwned { .. } => { + bail!("Unable to make externally owned memory readonly"); + } }; assert!(range.start <= range.end); assert!(range.end <= len); @@ -171,6 +232,7 @@ impl MmapVec { match self { #[cfg(not(has_virtual_memory))] MmapVec::Alloc { .. } => None, + MmapVec::ExternallyOwned { .. } => None, #[cfg(has_virtual_memory)] MmapVec::Mmap { mmap, .. } => mmap.original_file(), } @@ -189,13 +251,21 @@ impl MmapVec { /// # Unsafety /// /// This method is only safe if `make_readonly` hasn't been called yet to - /// ensure that the memory is indeed writable + /// ensure that the memory is indeed writable. For a MmapVec created from + /// a raw pointer using this memory as mutable is only safe if there are + /// no outside reads or writes to the memory region. + /// + /// Externally owned code is implicitly considered to be readonly and this + /// code will panic if called on externally owned memory. pub unsafe fn as_mut_slice(&mut self) -> &mut [u8] { match self { #[cfg(not(has_virtual_memory))] MmapVec::Alloc { base, layout } => { core::slice::from_raw_parts_mut(base.as_mut(), layout.size()) } + MmapVec::ExternallyOwned { .. } => { + panic!("Mutating externally owned memory is prohibited"); + } #[cfg(has_virtual_memory)] MmapVec::Mmap { mmap, len } => mmap.slice_mut(0..*len), } @@ -212,6 +282,7 @@ impl Deref for MmapVec { MmapVec::Alloc { base, layout } => unsafe { core::slice::from_raw_parts(base.as_ptr(), layout.size()) }, + MmapVec::ExternallyOwned { memory } => unsafe { memory.as_ref() }, #[cfg(has_virtual_memory)] MmapVec::Mmap { mmap, len } => { // SAFETY: all bytes for this mmap, which is owned by @@ -229,6 +300,9 @@ impl Drop for MmapVec { MmapVec::Alloc { base, layout, .. } => unsafe { alloc::alloc::dealloc(base.as_mut(), layout.clone()); }, + MmapVec::ExternallyOwned { .. } => { + // Memory is allocated externally, nothing to do + } #[cfg(has_virtual_memory)] MmapVec::Mmap { .. } => { // Drop impl on the `mmap` takes care of this case. diff --git a/crates/wasmtime/src/runtime/vm/provenance.rs b/crates/wasmtime/src/runtime/vm/provenance.rs index 20ca54b59b..c10136c757 100644 --- a/crates/wasmtime/src/runtime/vm/provenance.rs +++ b/crates/wasmtime/src/runtime/vm/provenance.rs @@ -107,11 +107,7 @@ impl VmPtr { /// Similar to `as_send_sync`, but returns a `NonNull`. pub fn as_non_null(&self) -> NonNull { - #[cfg(has_provenance_apis)] let ptr = core::ptr::with_exposed_provenance_mut(self.ptr.get()); - #[cfg(not(has_provenance_apis))] - let ptr = self.ptr.get() as *mut T; - unsafe { NonNull::new_unchecked(ptr) } } @@ -141,10 +137,7 @@ impl fmt::Debug for VmPtr { impl From> for VmPtr { fn from(ptr: NonNull) -> VmPtr { VmPtr { - #[cfg(has_provenance_apis)] ptr: unsafe { NonZeroUsize::new_unchecked(ptr.as_ptr().expose_provenance()) }, - #[cfg(not(has_provenance_apis))] - ptr: unsafe { NonZeroUsize::new_unchecked(ptr.as_ptr() as usize) }, _marker: marker::PhantomData, } } diff --git a/crates/wasmtime/src/runtime/vm/table.rs b/crates/wasmtime/src/runtime/vm/table.rs index dc52dd32fe..76158d330a 100644 --- a/crates/wasmtime/src/runtime/vm/table.rs +++ b/crates/wasmtime/src/runtime/vm/table.rs @@ -533,7 +533,7 @@ impl Table { /// `gc_store.is_none()` and this is a table of GC references. pub fn fill( &mut self, - gc_store: Option<&mut GcStore>, + mut gc_store: Option<&mut GcStore>, dst: u64, val: TableElement, len: u64, @@ -554,18 +554,25 @@ impl Table { funcrefs[start..end].fill(TaggedFuncRef::from(f, lazy_init)); } TableElement::GcRef(r) => { - let gc_store = - gc_store.expect("must provide a GcStore for tables of GC references"); - // Clone the init GC reference into each table slot. for slot in &mut self.gc_refs_mut()[start..end] { - gc_store.write_gc_ref(slot, r.as_ref()); + match gc_store.as_deref_mut() { + Some(s) => s.write_gc_ref(slot, r.as_ref()), + None => { + debug_assert!(slot.as_ref().is_none_or(|x| x.is_i31())); + debug_assert!(r.as_ref().is_none_or(|r| r.is_i31())); + *slot = r.as_ref().map(|r| r.copy_i31()); + } + } } // Drop the init GC reference, since we aren't holding onto this // reference anymore, only the clones in the table. if let Some(r) = r { - gc_store.drop_gc_ref(r); + match gc_store { + Some(s) => s.drop_gc_ref(r), + None => debug_assert!(r.is_i31()), + } } } TableElement::UninitFunc => { @@ -669,7 +676,7 @@ impl Table { } self.fill( - store.store_opaque_mut().optional_gc_store_mut()?, + store.store_opaque_mut().optional_gc_store_mut(), u64::try_from(old_size).unwrap(), init_value, u64::try_from(delta).unwrap(), @@ -695,7 +702,11 @@ impl Table { .map(|e| e.into_table_element(lazy_init)) } TableElementType::GcRef => self.gc_refs().get(index).map(|r| { - let r = r.as_ref().map(|r| gc_store.unwrap().clone_gc_ref(r)); + let r = r.as_ref().map(|r| match gc_store { + Some(s) => s.clone_gc_ref(r), + None => r.copy_i31(), + }); + TableElement::GcRef(r) }), } diff --git a/crates/wasmtime/src/runtime/vm/traphandlers.rs b/crates/wasmtime/src/runtime/vm/traphandlers.rs index 257f6882f4..316cffec9b 100644 --- a/crates/wasmtime/src/runtime/vm/traphandlers.rs +++ b/crates/wasmtime/src/runtime/vm/traphandlers.rs @@ -22,6 +22,7 @@ use crate::runtime::vm::sys::traphandlers; use crate::runtime::vm::{Instance, InterpreterRef, VMContext, VMStoreContext}; use crate::{StoreContextMut, WasmBacktrace}; use core::cell::Cell; +use core::num::NonZeroU32; use core::ops::Range; use core::ptr::{self, NonNull}; @@ -269,6 +270,14 @@ unsafe impl HostResultHasUnwindSentinel for () { } } +unsafe impl HostResultHasUnwindSentinel for NonZeroU32 { + type Abi = u32; + const SENTINEL: Self::Abi = 0; + fn into_abi(self) -> Self::Abi { + self.get() + } +} + /// A 32-bit return value can be inflated to a 64-bit return value in the ABI. /// In this manner a successful result is a zero-extended 32-bit value and the /// failure sentinel is `u64::MAX` or -1 as a signed integer. @@ -362,7 +371,7 @@ where F: FnMut(NonNull, Option>) -> bool, { let caller = store.0.default_caller(); - let async_guard_range = store.async_guard_range(); + let async_guard_range = store.0.async_guard_range(); let result = CallThreadState::new(store.0, async_guard_range, caller).with(|cx| { match store.0.executor() { // In interpreted mode directly invoke the host closure since we won't diff --git a/crates/wasmtime/src/runtime/vm/vmcontext.rs b/crates/wasmtime/src/runtime/vm/vmcontext.rs index 9af40e983f..5d8ff598e7 100644 --- a/crates/wasmtime/src/runtime/vm/vmcontext.rs +++ b/crates/wasmtime/src/runtime/vm/vmcontext.rs @@ -144,7 +144,7 @@ mod test_vmfunction_body { /// imported from another instance. #[derive(Debug, Copy, Clone)] #[repr(C)] -pub struct VMTableImport { +pub struct VMTable { /// A pointer to the imported table description. pub from: VmPtr, @@ -153,30 +153,43 @@ pub struct VMTableImport { } // SAFETY: the above structure is repr(C) and only contains `VmSafe` fields. -unsafe impl VmSafe for VMTableImport {} +unsafe impl VmSafe for VMTable {} #[cfg(test)] -mod test_vmtable_import { - use super::VMTableImport; +mod test_vmtable { + use super::VMTable; use core::mem::offset_of; use std::mem::size_of; + use wasmtime_environ::component::{Component, VMComponentOffsets}; use wasmtime_environ::{HostPtr, Module, VMOffsets}; #[test] - fn check_vmtable_import_offsets() { + fn check_vmtable_offsets() { let module = Module::new(); let offsets = VMOffsets::new(HostPtr, &module); + assert_eq!(size_of::(), usize::from(offsets.size_of_vmtable())); assert_eq!( - size_of::(), - usize::from(offsets.size_of_vmtable_import()) + offset_of!(VMTable, from), + usize::from(offsets.vmtable_from()) ); assert_eq!( - offset_of!(VMTableImport, from), - usize::from(offsets.vmtable_import_from()) + offset_of!(VMTable, vmctx), + usize::from(offsets.vmtable_vmctx()) ); + } + + #[test] + fn ensure_sizes_match() { + // Because we use `VMTable` for recording tables used by components, we + // want to make sure that the size calculations between `VMOffsets` and + // `VMComponentOffsets` stay the same. + let module = Module::new(); + let vm_offsets = VMOffsets::new(HostPtr, &module); + let component = Component::default(); + let vm_component_offsets = VMComponentOffsets::new(HostPtr, &component); assert_eq!( - offset_of!(VMTableImport, vmctx), - usize::from(offsets.vmtable_import_vmctx()) + vm_offsets.size_of_vmtable(), + vm_component_offsets.size_of_vmtable() ); } } @@ -947,7 +960,6 @@ macro_rules! define_builtin_array { /// pointer is considered valid. pub fn expose_provenance(&self) -> NonNull{ $( - #[cfg(has_provenance_apis)] (self.$name as *mut u8).expose_provenance(); )* NonNull::from(self) diff --git a/crates/wasmtime/src/sync_nostd.rs b/crates/wasmtime/src/sync_nostd.rs index 4cdfba2fa9..7be02fff9d 100644 --- a/crates/wasmtime/src/sync_nostd.rs +++ b/crates/wasmtime/src/sync_nostd.rs @@ -1,6 +1,6 @@ //! Synchronization primitives for Wasmtime for `no_std`. //! -//! These primitives are intended for use in `no_std` contexts are are not as +//! These primitives are intended for use in `no_std` contexts are not as //! full-featured as the `std` brethren. Namely these panic and/or return an //! error on contention. This serves to continue to be correct in the face of //! actual multiple threads, but if a system actually has multiple threads then diff --git a/crates/wasmtime/tests/host_segfault.rs b/crates/wasmtime/tests/host_segfault.rs index 0f50c10195..7d9384cd0d 100644 --- a/crates/wasmtime/tests/host_segfault.rs +++ b/crates/wasmtime/tests/host_segfault.rs @@ -95,11 +95,7 @@ fn main() { // Skip this tests if it looks like we're in a cross-compiled situation and // we're emulating this test for a different platform. In that scenario // emulators (like QEMU) tend to not report signals the same way and such. - if std::env::vars() - .filter(|(k, _v)| k.starts_with("CARGO_TARGET") && k.ends_with("RUNNER")) - .count() - > 0 - { + if wasmtime_test_util::cargo_test_runner().is_some() { return; } diff --git a/crates/wast-util/Cargo.toml b/crates/wast-util/Cargo.toml deleted file mode 100644 index a69da0a6b7..0000000000 --- a/crates/wast-util/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "wasmtime-wast-util" -version.workspace = true -authors.workspace = true -edition.workspace = true -rust-version.workspace = true -publish = false -description = "Utilities for `*.wast` files and tests in Wasmtime" -license = "Apache-2.0 WITH LLVM-exception" -repository = "https://github.com/bytecodealliance/wasmtime" - -[dependencies] -anyhow = { workspace = true } -serde = { workspace = true } -serde_derive = { workspace = true } -toml = { workspace = true } - -[lints] -workspace = true diff --git a/crates/wast/Cargo.toml b/crates/wast/Cargo.toml index 07c4a4bac0..8d86b5f3ec 100644 --- a/crates/wast/Cargo.toml +++ b/crates/wast/Cargo.toml @@ -15,7 +15,7 @@ workspace = true [dependencies] anyhow = { workspace = true } -wasmtime = { workspace = true, features = ['cranelift', 'wat', 'runtime', 'gc'] } +wasmtime = { workspace = true, features = ['cranelift', 'wat', 'runtime', 'gc', 'async'] } wast = { workspace = true } log = { workspace = true } tokio = { workspace = true, features = ['rt'] } diff --git a/crates/wiggle/generate/Cargo.toml b/crates/wiggle/generate/Cargo.toml index 83444c410f..027a16605a 100644 --- a/crates/wiggle/generate/Cargo.toml +++ b/crates/wiggle/generate/Cargo.toml @@ -17,8 +17,8 @@ workspace = true [dependencies] witx = "0.9.1" -quote = "1.0" -proc-macro2 = "1.0" +quote = { workspace = true } +proc-macro2 = { workspace = true } heck = { workspace = true } anyhow = { workspace = true } syn = { workspace = true, features = ["full"] } diff --git a/crates/wiggle/macro/Cargo.toml b/crates/wiggle/macro/Cargo.toml index 6d10be2efa..390588ec94 100644 --- a/crates/wiggle/macro/Cargo.toml +++ b/crates/wiggle/macro/Cargo.toml @@ -20,9 +20,9 @@ doctest = false [dependencies] wiggle-generate = { workspace = true } -quote = "1.0" +quote = { workspace = true } syn = { workspace = true, features = ["full"] } -proc-macro2 = "1.0" +proc-macro2 = { workspace = true } [dev-dependencies] wiggle = { path = ".." } diff --git a/crates/winch/src/compiler.rs b/crates/winch/src/compiler.rs index 8ee12653aa..6f0e2ea882 100644 --- a/crates/winch/src/compiler.rs +++ b/crates/winch/src/compiler.rs @@ -7,9 +7,9 @@ use std::sync::Mutex; use wasmparser::FuncValidatorAllocations; use wasmtime_cranelift::{CompiledFunction, ModuleTextBuilder}; use wasmtime_environ::{ - AddressMapSection, BuiltinFunctionIndex, CompileError, DefinedFuncIndex, FunctionBodyData, - FunctionLoc, ModuleTranslation, ModuleTypesBuilder, PrimaryMap, RelocationTarget, - StaticModuleIndex, TrapEncodingBuilder, Tunables, VMOffsets, WasmFunctionInfo, + AddressMapSection, BuiltinFunctionIndex, CompileError, CompiledFunctionBody, DefinedFuncIndex, + FunctionBodyData, FunctionLoc, ModuleTranslation, ModuleTypesBuilder, PrimaryMap, + RelocationTarget, StaticModuleIndex, TrapEncodingBuilder, Tunables, VMOffsets, }; use winch_codegen::{BuiltinFunctions, CallingConvention, TargetIsa}; @@ -95,7 +95,7 @@ impl wasmtime_environ::Compiler for Compiler { index: DefinedFuncIndex, data: FunctionBodyData<'_>, types: &ModuleTypesBuilder, - ) -> Result<(WasmFunctionInfo, Box), CompileError> { + ) -> Result { let index = translation.module.func_index(index); let sig = translation.module.functions[index] .signature @@ -132,13 +132,11 @@ impl wasmtime_environ::Compiler for Compiler { self.emit_unwind_info(&mut func)?; } - Ok(( - WasmFunctionInfo { - start_srcloc: func.metadata().address_map.start_srcloc, - stack_maps: Box::new([]), - }, - Box::new(func), - )) + Ok(CompiledFunctionBody { + code: Box::new(func), + // TODO: Winch doesn't support GC objects and stack maps and all that yet. + needs_gc_heap: false, + }) } fn compile_array_to_wasm_trampoline( @@ -146,7 +144,7 @@ impl wasmtime_environ::Compiler for Compiler { translation: &ModuleTranslation<'_>, types: &ModuleTypesBuilder, index: DefinedFuncIndex, - ) -> Result, CompileError> { + ) -> Result { self.trampolines .compile_array_to_wasm_trampoline(translation, types, index) } @@ -154,7 +152,7 @@ impl wasmtime_environ::Compiler for Compiler { fn compile_wasm_to_array_trampoline( &self, wasm_func_ty: &wasmtime_environ::WasmFuncType, - ) -> Result, CompileError> { + ) -> Result { self.trampolines .compile_wasm_to_array_trampoline(wasm_func_ty) } @@ -236,7 +234,7 @@ impl wasmtime_environ::Compiler for Compiler { fn compile_wasm_to_builtin( &self, index: BuiltinFunctionIndex, - ) -> Result, CompileError> { + ) -> Result { self.trampolines.compile_wasm_to_builtin(index) } diff --git a/docs/book.toml b/docs/book.toml index c935c37021..47226af030 100644 --- a/docs/book.toml +++ b/docs/book.toml @@ -5,4 +5,7 @@ src = "." title = "Wasmtime" [output.html] +additional-js = ["js/moment.min.2.30.1.js", "js/mermaid.min.11.6.0.js", "js/index.js"] cname = "docs.wasmtime.dev" +git-repository-url = "https://github.com/bytecodealliance/wasmtime" +edit-url-template = "https://github.com/bytecodealliance/wasmtime/edit/main/docs/{path}" diff --git a/docs/cli-install.md b/docs/cli-install.md index ffd370f624..7a8aa80764 100644 --- a/docs/cli-install.md +++ b/docs/cli-install.md @@ -19,13 +19,13 @@ Windows users will want to visit our [releases page][releases] and can download the MSI installer (`wasmtime-dev-x86_64-windows.msi` for example) and use that to install. -[releases]: https://github.com/bytecodealliance/wasmtime/releases +[releases]: https://github.com/bytecodealliance/wasmtime/releases/latest You can confirm your installation works by executing: ```sh $ wasmtime -V -wasmtime 0.12.0 +wasmtime 30.0.0 (ede663c2a 2025-02-19) ``` And now you're off to the races! Be sure to check out the [various CLI @@ -56,9 +56,9 @@ the `dev` release) Each of these archives has a `wasmtime` binary placed inside which can be executed normally as the CLI would. -[wasmtime-dev-x86_64-linux.tar.xz`]: https://github.com/bytecodealliance/wasmtime/releases/download/dev/wasmtime-dev-x86_64-linux.tar.xz -[wasmtime-dev-x86_64-macos.tar.xz`]: https://github.com/bytecodealliance/wasmtime/releases/download/dev/wasmtime-dev-x86_64-macos.tar.xz -[wasmtime-dev-x86_64-windows.zip`]: https://github.com/bytecodealliance/wasmtime/releases/download/dev/wasmtime-dev-x86_64-windows.zip +[`wasmtime-dev-x86_64-linux.tar.xz`]: https://github.com/bytecodealliance/wasmtime/releases/download/dev/wasmtime-dev-x86_64-linux.tar.xz +[`wasmtime-dev-x86_64-macos.tar.xz`]: https://github.com/bytecodealliance/wasmtime/releases/download/dev/wasmtime-dev-x86_64-macos.tar.xz +[`wasmtime-dev-x86_64-windows.zip`]: https://github.com/bytecodealliance/wasmtime/releases/download/dev/wasmtime-dev-x86_64-windows.zip ## Compiling from Source diff --git a/docs/cli-options.md b/docs/cli-options.md index 07d059f306..c43f9ce68a 100644 --- a/docs/cli-options.md +++ b/docs/cli-options.md @@ -127,6 +127,57 @@ display what Cranelift settings are inferred for the host: $ wasmtime settings ``` +## `explore` + +This subcommand can be used to explore a `*.cwasm` file and see how it connects +to the original wasm file in a web browser. This will compile an input wasm +file and emit an HTML file that can be opened in a web browser: + +```sh +$ wasmtime explore foo.wasm +Exploration written to foo.explore.html +``` + +The output HTML file can be used to compare what WebAssembly instruction +compiles to what native instruction. Compilation options can be passed to +`wasmtime explore` to see the effect of compilation options on generated code. + +## `objdump` + +Primarily intended as a debugging utility the `objdump` subcommand can be used +to explore a `*.cwasm` file locally on your terminal. This is roughly modeled +after native `objdump` binaries themselves: + +```sh +$ wasmtime objdump foo.cwasm +wasm[0]::function[0]: + stp x29, x30, [sp, #-0x10]! + mov x29, sp + ldr x5, [x2, #0x50] + lsl w6, w4, #2 + ldr w2, [x5, w6, uxtw] + ldp x29, x30, [sp], #0x10 + ret +``` + +You can also pass various options to configure and annotate the output: + +```sh +$ wasmtime objdump foo.cwasm --addresses --bytes --addrma +00000000 wasm[0]::function[0]: + 0: fd 7b bf a9 stp x29, x30, [sp, #-0x10]! + 4: fd 03 00 91 mov x29, sp + 8: 45 28 40 f9 ldr x5, [x2, #0x50] + ╰─╼ addrmap: 0x23 + c: 86 74 1e 53 lsl w6, w4, #2 + ╰─╼ addrmap: 0x22 + 10: a2 48 66 b8 ldr w2, [x5, w6, uxtw] + ╰─╼ addrmap: 0x23 + 14: fd 7b c1 a8 ldp x29, x30, [sp], #0x10 + ╰─╼ addrmap: 0x26 + 18: c0 03 5f d6 ret +``` + # Additional options Many of the above subcommands also take additional options. For example, - run diff --git a/docs/contributing-architecture.md b/docs/contributing-architecture.md index a2d6bc2889..867de97b55 100644 --- a/docs/contributing-architecture.md +++ b/docs/contributing-architecture.md @@ -366,48 +366,84 @@ and generated code need to handle. First there are a number of properties about linear memory which can be configured: -* `wasmtime::Config::static_memory_maximum_size` -* `wasmtime::Config::static_memory_guard_size` -* `wasmtime::Config::dynamic_memory_guard_size` +* `wasmtime::Config::memory_reservation` +* `wasmtime::Config::memory_may_move` +* `wasmtime::Config::memory_guard_size` +* `wasmtime::Config::memory_reservation_for_growth` +* `wasmtime::Config::memory_init_cow` * `wasmtime::Config::guard_before_linear_memory` +* `wasmtime::Config::signals_based_traps` The methods on `Config` have a good bit of documentation to go over some -nitty-gritty, but the general gist is that Wasmtime has two modes of memory: -static and dynamic. Static memories represent an address space reservation that -never moves and pages are committed to represent memory growth. Dynamic -memories represent allocations where the committed portion exactly matches the -wasm memory's size and growth happens by allocating a bigger chunk of memory. - -The guard size configuration indicates the size of the guard region that -happens after linear memory. This guard size affects whether generated JIT code -emits bounds checks or not. Bounds checks are elided if out-of-bounds addresses -provably encounter the guard pages. - -The `guard_before_linear_memory` configuration additionally places guard pages -in front of linear memory as well as after linear memory (the same size on both -ends). This is only used to protect against possible Cranelift bugs and -otherwise serves no purpose. - -The defaults for Wasmtime on 64-bit platforms are: - -* 4GB static maximum size meaning all 32-bit memories are static and 64-bit - memories are dynamic. -* 2GB static guard size meaning all loads/stores with less than 2GB offset - don't need bounds checks with 32-bit memories. -* Guard pages before linear memory are enabled. - -Altogether this means that 32-bit linear memories result in an 8GB virtual -address space reservation by default in Wasmtime. With the pooling allocator -where we know that linear memories are contiguous this results in a 6GB -reservation per memory because the guard region after one memory is the guard -region before the next. - -Note that 64-bit memories (the memory64 proposal for WebAssembly) can be -configured to be static but will never be able to elide bounds checks at this -time. This configuration is possible through the `static_memory_forced` -configuration option. Additionally note that support for 64-bit memories in -Wasmtime is functional but not yet tuned at this time so there's probably still -some performance work and better defaults to manage. +nitty-gritty. Wasmtime also has some `#[cfg]` directives which are calculated by +`crates/wasmtime/build.rs` which affects the defaults of various strategies. For +example `has_native_signals` means that segfaults are allowed to happen at +runtime and are caught in a signal handler. Additionally `has_virtual_memory` +means that `mmap` is available and will be used (otherwise a fallback to +`malloc` is implemented). The matrix of all of these combinations is then used +to implement a linear memory for a WebAssembly instance. + +It's generally best to consult the documentation of `Config` for the most +up-to-date information. Additionally code comments throughout the codebase can +also be useful for understanding the impact of some of these options. Some +example scenarios though are: + +* **`(memory 1)` on 64-bit platforms** - by default this WebAssembly memory has + unlimited size, meaning it's only limited by its index type (`i32`) meaning it + can grow up to 4GiB if the host/embedder allows it. This is implemented with a + 8GiB virtual memory reservation -- 2GiB unmapped before linear memory, 4GiB + for linear memory itself (but only 1 wasm page, 64KiB, read/write at the + start), and 2GiB unmapped afterwards. The guard region before linear memory is + a defense-in-depth measure and should never be hit under any operation. The + guard region after linear memory is present to eliminate bounds checks in the + wasm module (WebAssembly addresses are effective 33-bit addresses when the + static `offset` is taken into account). + +* **`(memory i64 1)` on 64-bit platforms** - this WebAssembly memory uses 64-bit + indexes instead of 32-bit indexes. This means that the configuration looks + similar to `(memory 1)` above except that growth beyond 4GiB will copy all the + contents of linear memory to a new location. Embedders might want to raise + `Config::memory_reservation` in this situation. This configuration mode cannot + remove any bounds checks, but guard pages are still used to deduplicate bounds + checks where possible (so segfaults may still be caught at runtime for + out-of-bounds accesses). + +* **`(memory 1)` on 64-bit platforms with the pooling allocator** - the pooling + allocator has a few important differences than the default settings. First is + that the pooling allocator is able to "overlap" the before/after guard regions + meaning that the virtual memory cost per-linear-memory is 6GiB by default + instead of 8GiB. Additionally the pooling allocator cannot resize memory so if + `Config::memory_reservation` is less than 4GiB then that's a hard limit on the + size of linear memory rather than being able to copy to a new location. + +* **`(memory 1)` on 64-bit platforms with a smaller reservation** - if the + `Config::memory_reservation` option is configured less than the default (the + default is 4GiB) then the virtual memory allocated for all linear memories + will be less than the 8GiB default. This means that linear memories may move + over time if they grow beyond their initial limit (assuming such growth is + allowed) and additionally bounds checks will be required for memory accesses. + +* **`(memory 1)` on 32-bit platforms** - unlike 64-bit platforms this memory + cannot have a 4GiB virtual memory reservation. Instead the linear memory is + allocated with `Config::memory_reservation_for_growth` unmapped bytes after it + to amortize the reallocation overhead of copying bytes. Guard pages are still + used and signals are used where available to deduplicate bounds checks. + +* **`(memory 1 (pagesize 1))` on any platforms** - this WebAssembly linear + memory, with a page size of 1 byte, means that virtual memory cannot be used + to catch traps. Instead explicit bounds checks are always required on all + accesses. This is still allocated with virtual memory where possible, however. + +There's quite a few possible combinations for how all of these options interact +with each other. The high-level design goal of Wasmtime is such that each option +is independent from all the others and is a knob for just its behavior. In this +way it should be possible to customize the needs of embedders. Wasmtime +additionally has different default behavior across platforms, such as 32-bit and +64-bit platforms. Some platforms additionally don't have `mmap` by default and +Wasmtime will adapt to that as well. The intention, however, is that it should +be possible to mirror the default configuration on any platform into a +"full-featured" platform such as 64-bit to assist with testing, fuzzing, and +debugging. ## Tables and `externref` diff --git a/docs/contributing-release-process.md b/docs/contributing-release-process.md index e6e4b8aec5..2d790fccbb 100644 --- a/docs/contributing-release-process.md +++ b/docs/contributing-release-process.md @@ -73,6 +73,18 @@ carry on its way. ## Releasing a patch version +Wasmtime does not currently have a cadence for patch version nor a strict set +of criteria. It's done on an as-needed basis. Two requirements, however are: + +* All changes must land on `main` first (if applicable) and then get backported + to an older branch. Release branches should already exist from the above + major release steps. + +* When a patch release is made it must be applied to [all supported + versions](./stability-release.md#current-versions) that need the patch. + Wasmtime will not release a patch release until all versions have been + equally patched to ensure that releases remain consistent. + Making a patch release is somewhat more manual than a major version, but like before there's automation to help guide the process as well and take care of more mundane bits. @@ -82,9 +94,6 @@ Like above human interaction is indicated with **bold** text in these steps. 1. **Necessary changes are backported to the `release-2.0.0` branch from `main`** - * All changes must land on `main` first (if applicable) and then get - backported to an older branch. Release branches should already exist from - the above major release steps. * CI may not have been run in some time for release branches so it may be necessary to backport CI fixes and updates from `main` as well. * When merging backports maintainers need to double-check that the @@ -132,3 +141,15 @@ the repository. Management of this file looks like: This means that `RELEASES.md` only has release notes for the release branch that it is on. Historical release notes can be found through links at the bottom to previous copies of `RELEASES.md` + +## Keeping Old release branch CI up-to-date + +Over time CI configuration goes out of date and may need to be updated. The +Wasmtime repository has a cron job via GitHub Actions to run release CI on all +supported release branches on a weekly basis to try to weed out these problems. +If a release branch CI fails it'll open an issue and maintainers should resolve +it expediently. + +Where possible old release branch CI should not update software to fix CI. Try +to pin to older versions if something wasn't pinned already for example. +Sometimes though updates are inevitable and may be required. diff --git a/docs/examples-pulley.md b/docs/examples-pulley.md index 67ea9b1b1c..c71f24f6b5 100644 --- a/docs/examples-pulley.md +++ b/docs/examples-pulley.md @@ -155,15 +155,13 @@ doesn't happen the same in LLVM on all architectures). ### Inspecting Pulley Bytecode -When compiling to native the `*.cwasm` produced by `wasmtime compile` can be -inspected with `objdump -S`, but this doesn't work with Pulley. A small example -in the `pulley_interpreter` crate suffices for doing this though. You can -inspect compiled Pulley bytecode from the Wasmtime repository with: +Like when compiling to native the `wasmtime objdump` command can be used to +inspect compiled bytecode: ```sh -$ cargo run compile --target pulley64 foo.wat -$ cargo run -p pulley-interpreter --all-features --example objdump foo.cwasm -0x000000: : +$ wasmtime compile --target pulley64 foo.wat +$ wasmtime objdump foo.cwasm --addresses --bytes +0x000000: wasm[0]::function[20]: 0: 9f 10 00 08 00 push_frame_save 16, x19 5: 40 13 00 xmov x19, x0 8: 03 13 13 3f cb 89 00 call2 x19, x19, 0x89cb3f // target = 0x89cb47 @@ -174,10 +172,6 @@ $ cargo run -p pulley-interpreter --all-features --example objdump foo.cwasm ... ``` -The output is intended to look somewhat similar to `objdump` but otherwise -mainly provides the ability to inspect opcode selection, see the encoded bytes, -etc. - ### Profiling Pulley Profiling the Pulley interpreter can be done with native profiler such as `perf` diff --git a/docs/js/index.js b/docs/js/index.js new file mode 100644 index 0000000000..9f87f128cb --- /dev/null +++ b/docs/js/index.js @@ -0,0 +1,104 @@ +const WASMTIME_20 = moment.utc('2024-04-20'); +const DATE_FORMAT = 'MMMM D YYYY'; + +function releaseDate(version) { + return WASMTIME_20.clone().add(version - 20, 'months'); +} + +function eolDate(version) { + const release = releaseDate(version); + if (version % 12 == 0) + return release.add(2, 'year'); + return release.add(2, 'months'); +} + +function addReleases(table) { + const today = moment.utc(); + const monthsSince20 = Math.floor(today.diff(WASMTIME_20, 'months')); + const currentRelease = 20 + monthsSince20; + + // Add in some relevant releases, such as the current one, one future one, and + // two past ones. + let channels = []; + channels.push(currentRelease + 1); + channels.push(currentRelease); + channels.push(currentRelease - 1); + channels.push(currentRelease - 2); + + // Add in historical LTS channels. Start with the current release and go + // backwards looking for two LTS channels. + let lts = 0; + let cur = currentRelease; + for (let cur = currentRelease; cur > 20 && lts < 2; cur--) { + if (cur % 12 == 0) { + channels.push(cur); + lts += 1; + } + } + + // Add in a future LTS channel starting with the release after the current + // one. + for (let cur = currentRelease + 1; ; cur++) { + if (cur % 12 == 0) { + channels.push(cur); + break; + } + } + + // Deduplicate and sort everything. + channels = [...new Set(channels)]; + channels.sort(); + +let mermaid = ` +gantt + tickInterval 12month + title Release Schedule + dateFormat YYYY-MM +`; + + for (let channel of channels) { + const row = document.createElement('tr'); + const date = releaseDate(channel); + const eol = eolDate(channel); + + if (date <= today && today <= eol) + row.style.fontWeight = 'bold'; + + const version = document.createElement('td'); + version.innerText = channel + '.0.0'; + row.appendChild(version); + + const lts = document.createElement('td'); + if (channel % 12 == 0) + lts.innerText = '✅'; + row.appendChild(lts); + + const branch = document.createElement('td'); + branch.innerText = date.clone().add(-15, 'days').format(DATE_FORMAT); + row.appendChild(branch); + + const release = document.createElement('td'); + release.innerText = date.format(DATE_FORMAT); + row.appendChild(release); + + const eolRow = document.createElement('td'); + eolRow.innerText = eol.format(DATE_FORMAT); + row.appendChild(eolRow); + + dur = eol.diff(date, 'days') + mermaid += ` ${channel}.0.0 :a1, ${date.format('YYYY-MM-DD')}, ${dur}d\n`; + + table.appendChild(row); + } + + const gantt = document.createElement('pre'); + gantt.classList.add('mermaid'); + gantt.innerHTML = mermaid; + document.querySelector('#version-table').appendChild(gantt); +} + +const table = document.querySelector('#version-table table tbody'); +if (table) { + addReleases(table); + mermaid.initialize({ theme: 'dark' }); +} diff --git a/docs/js/mermaid.min.11.6.0.js b/docs/js/mermaid.min.11.6.0.js new file mode 100644 index 0000000000..6e12566eb7 --- /dev/null +++ b/docs/js/mermaid.min.11.6.0.js @@ -0,0 +1,2607 @@ +"use strict";var __esbuild_esm_mermaid=(()=>{var B2e=Object.create;var by=Object.defineProperty;var F2e=Object.getOwnPropertyDescriptor;var $2e=Object.getOwnPropertyNames;var z2e=Object.getPrototypeOf,G2e=Object.prototype.hasOwnProperty;var o=(t,e)=>by(t,"name",{value:e,configurable:!0});var N=(t,e)=>()=>(t&&(e=t(t=0)),e);var Mi=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),hr=(t,e)=>{for(var r in e)by(t,r,{get:e[r],enumerable:!0})},L4=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of $2e(e))!G2e.call(t,i)&&i!==r&&by(t,i,{get:()=>e[i],enumerable:!(n=F2e(e,i))||n.enumerable});return t},Sr=(t,e,r)=>(L4(t,e,"default"),r&&L4(r,e,"default")),Sa=(t,e,r)=>(r=t!=null?B2e(z2e(t)):{},L4(e||!t||!t.__esModule?by(r,"default",{value:t,enumerable:!0}):r,t)),V2e=t=>L4(by({},"__esModule",{value:!0}),t);var R4=Mi((EC,SC)=>{"use strict";(function(t,e){typeof EC=="object"&&typeof SC<"u"?SC.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs=e()})(EC,function(){"use strict";var t=1e3,e=6e4,r=36e5,n="millisecond",i="second",a="minute",s="hour",l="day",u="week",h="month",f="quarter",d="year",p="date",m="Invalid Date",g=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,v={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:o(function(k){var L=["th","st","nd","rd"],R=k%100;return"["+k+(L[(R-20)%10]||L[R]||L[0])+"]"},"ordinal")},x=o(function(k,L,R){var O=String(k);return!O||O.length>=L?k:""+Array(L+1-O.length).join(R)+k},"m"),b={s:x,z:o(function(k){var L=-k.utcOffset(),R=Math.abs(L),O=Math.floor(R/60),M=R%60;return(L<=0?"+":"-")+x(O,2,"0")+":"+x(M,2,"0")},"z"),m:o(function k(L,R){if(L.date()1)return k(F[0])}else{var P=L.name;C[P]=L,M=P}return!O&&M&&(w=M),M||!O&&w},"t"),S=o(function(k,L){if(E(k))return k.clone();var R=typeof L=="object"?L:{};return R.date=k,R.args=arguments,new I(R)},"O"),_=b;_.l=A,_.i=E,_.w=function(k,L){return S(k,{locale:L.$L,utc:L.$u,x:L.$x,$offset:L.$offset})};var I=function(){function k(R){this.$L=A(R.locale,null,!0),this.parse(R),this.$x=this.$x||R.x||{},this[T]=!0}o(k,"M");var L=k.prototype;return L.parse=function(R){this.$d=function(O){var M=O.date,B=O.utc;if(M===null)return new Date(NaN);if(_.u(M))return new Date;if(M instanceof Date)return new Date(M);if(typeof M=="string"&&!/Z$/i.test(M)){var F=M.match(g);if(F){var P=F[2]-1||0,z=(F[7]||"0").substring(0,3);return B?new Date(Date.UTC(F[1],P,F[3]||1,F[4]||0,F[5]||0,F[6]||0,z)):new Date(F[1],P,F[3]||1,F[4]||0,F[5]||0,F[6]||0,z)}}return new Date(M)}(R),this.init()},L.init=function(){var R=this.$d;this.$y=R.getFullYear(),this.$M=R.getMonth(),this.$D=R.getDate(),this.$W=R.getDay(),this.$H=R.getHours(),this.$m=R.getMinutes(),this.$s=R.getSeconds(),this.$ms=R.getMilliseconds()},L.$utils=function(){return _},L.isValid=function(){return this.$d.toString()!==m},L.isSame=function(R,O){var M=S(R);return this.startOf(O)<=M&&M<=this.endOf(O)},L.isAfter=function(R,O){return S(R){"use strict";CF=Sa(R4(),1),eu={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},Y={trace:o((...t)=>{},"trace"),debug:o((...t)=>{},"debug"),info:o((...t)=>{},"info"),warn:o((...t)=>{},"warn"),error:o((...t)=>{},"error"),fatal:o((...t)=>{},"fatal")},wy=o(function(t="fatal"){let e=eu.fatal;typeof t=="string"?t.toLowerCase()in eu&&(e=eu[t]):typeof t=="number"&&(e=t),Y.trace=()=>{},Y.debug=()=>{},Y.info=()=>{},Y.warn=()=>{},Y.error=()=>{},Y.fatal=()=>{},e<=eu.fatal&&(Y.fatal=console.error?console.error.bind(console,bo("FATAL"),"color: orange"):console.log.bind(console,"\x1B[35m",bo("FATAL"))),e<=eu.error&&(Y.error=console.error?console.error.bind(console,bo("ERROR"),"color: orange"):console.log.bind(console,"\x1B[31m",bo("ERROR"))),e<=eu.warn&&(Y.warn=console.warn?console.warn.bind(console,bo("WARN"),"color: orange"):console.log.bind(console,"\x1B[33m",bo("WARN"))),e<=eu.info&&(Y.info=console.info?console.info.bind(console,bo("INFO"),"color: lightblue"):console.log.bind(console,"\x1B[34m",bo("INFO"))),e<=eu.debug&&(Y.debug=console.debug?console.debug.bind(console,bo("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",bo("DEBUG"))),e<=eu.trace&&(Y.trace=console.debug?console.debug.bind(console,bo("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",bo("TRACE")))},"setLogLevel"),bo=o(t=>`%c${(0,CF.default)().format("ss.SSS")} : ${t} : `,"format")});var U2e,e0,CC,AF,N4=N(()=>{"use strict";U2e=Object.freeze({left:0,top:0,width:16,height:16}),e0=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),CC=Object.freeze({...U2e,...e0}),AF=Object.freeze({...CC,body:"",hidden:!1})});var H2e,_F,DF=N(()=>{"use strict";N4();H2e=Object.freeze({width:null,height:null}),_F=Object.freeze({...H2e,...e0})});var AC,M4,LF=N(()=>{"use strict";AC=o((t,e,r,n="")=>{let i=t.split(":");if(t.slice(0,1)==="@"){if(i.length<2||i.length>3)return null;n=i.shift().slice(1)}if(i.length>3||!i.length)return null;if(i.length>1){let l=i.pop(),u=i.pop(),h={provider:i.length>0?i[0]:n,prefix:u,name:l};return e&&!M4(h)?null:h}let a=i[0],s=a.split("-");if(s.length>1){let l={provider:n,prefix:s.shift(),name:s.join("-")};return e&&!M4(l)?null:l}if(r&&n===""){let l={provider:n,prefix:"",name:a};return e&&!M4(l,r)?null:l}return null},"stringToIcon"),M4=o((t,e)=>t?!!((e&&t.prefix===""||t.prefix)&&t.name):!1,"validateIconName")});function RF(t,e){let r={};!t.hFlip!=!e.hFlip&&(r.hFlip=!0),!t.vFlip!=!e.vFlip&&(r.vFlip=!0);let n=((t.rotate||0)+(e.rotate||0))%4;return n&&(r.rotate=n),r}var NF=N(()=>{"use strict";o(RF,"mergeIconTransformations")});function _C(t,e){let r=RF(t,e);for(let n in AF)n in e0?n in t&&!(n in r)&&(r[n]=e0[n]):n in e?r[n]=e[n]:n in t&&(r[n]=t[n]);return r}var MF=N(()=>{"use strict";N4();NF();o(_C,"mergeIconData")});function IF(t,e){let r=t.icons,n=t.aliases||Object.create(null),i=Object.create(null);function a(s){if(r[s])return i[s]=[];if(!(s in i)){i[s]=null;let l=n[s]&&n[s].parent,u=l&&a(l);u&&(i[s]=[l].concat(u))}return i[s]}return o(a,"resolve"),(e||Object.keys(r).concat(Object.keys(n))).forEach(a),i}var OF=N(()=>{"use strict";o(IF,"getIconsTree")});function PF(t,e,r){let n=t.icons,i=t.aliases||Object.create(null),a={};function s(l){a=_C(n[l]||i[l],a)}return o(s,"parse"),s(e),r.forEach(s),_C(t,a)}function DC(t,e){if(t.icons[e])return PF(t,e,[]);let r=IF(t,[e])[e];return r?PF(t,e,r):null}var BF=N(()=>{"use strict";MF();OF();o(PF,"internalGetIconData");o(DC,"getIconData")});function LC(t,e,r){if(e===1)return t;if(r=r||100,typeof t=="number")return Math.ceil(t*e*r)/r;if(typeof t!="string")return t;let n=t.split(W2e);if(n===null||!n.length)return t;let i=[],a=n.shift(),s=q2e.test(a);for(;;){if(s){let l=parseFloat(a);isNaN(l)?i.push(a):i.push(Math.ceil(l*e*r)/r)}else i.push(a);if(a=n.shift(),a===void 0)return i.join("");s=!s}}var W2e,q2e,FF=N(()=>{"use strict";W2e=/(-?[0-9.]*[0-9]+[0-9.]*)/g,q2e=/^-?[0-9.]*[0-9]+[0-9.]*$/g;o(LC,"calculateSize")});function Y2e(t,e="defs"){let r="",n=t.indexOf("<"+e);for(;n>=0;){let i=t.indexOf(">",n),a=t.indexOf("",a);if(s===-1)break;r+=t.slice(i+1,a).trim(),t=t.slice(0,n).trim()+t.slice(s+1)}return{defs:r,content:t}}function X2e(t,e){return t?""+t+""+e:e}function $F(t,e,r){let n=Y2e(t);return X2e(n.defs,e+n.content+r)}var zF=N(()=>{"use strict";o(Y2e,"splitSVGDefs");o(X2e,"mergeDefsAndContent");o($F,"wrapSVGContent")});function RC(t,e){let r={...CC,...t},n={..._F,...e},i={left:r.left,top:r.top,width:r.width,height:r.height},a=r.body;[r,n].forEach(y=>{let v=[],x=y.hFlip,b=y.vFlip,w=y.rotate;x?b?w+=2:(v.push("translate("+(i.width+i.left).toString()+" "+(0-i.top).toString()+")"),v.push("scale(-1 1)"),i.top=i.left=0):b&&(v.push("translate("+(0-i.left).toString()+" "+(i.height+i.top).toString()+")"),v.push("scale(1 -1)"),i.top=i.left=0);let C;switch(w<0&&(w-=Math.floor(w/4)*4),w=w%4,w){case 1:C=i.height/2+i.top,v.unshift("rotate(90 "+C.toString()+" "+C.toString()+")");break;case 2:v.unshift("rotate(180 "+(i.width/2+i.left).toString()+" "+(i.height/2+i.top).toString()+")");break;case 3:C=i.width/2+i.left,v.unshift("rotate(-90 "+C.toString()+" "+C.toString()+")");break}w%2===1&&(i.left!==i.top&&(C=i.left,i.left=i.top,i.top=C),i.width!==i.height&&(C=i.width,i.width=i.height,i.height=C)),v.length&&(a=$F(a,'',""))});let s=n.width,l=n.height,u=i.width,h=i.height,f,d;s===null?(d=l===null?"1em":l==="auto"?h:l,f=LC(d,u/h)):(f=s==="auto"?u:s,d=l===null?LC(f,h/u):l==="auto"?h:l);let p={},m=o((y,v)=>{j2e(v)||(p[y]=v.toString())},"setAttr");m("width",f),m("height",d);let g=[i.left,i.top,u,h];return p.viewBox=g.join(" "),{attributes:p,viewBox:g,body:a}}var j2e,GF=N(()=>{"use strict";N4();DF();FF();zF();j2e=o(t=>t==="unset"||t==="undefined"||t==="none","isUnsetKeyword");o(RC,"iconToSVG")});function NC(t,e=Q2e){let r=[],n;for(;n=K2e.exec(t);)r.push(n[1]);if(!r.length)return t;let i="suffix"+(Math.random()*16777216|Date.now()).toString(16);return r.forEach(a=>{let s=typeof e=="function"?e(a):e+(Z2e++).toString(),l=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp('([#;"])('+l+')([")]|\\.[a-z])',"g"),"$1"+s+i+"$3")}),t=t.replace(new RegExp(i,"g"),""),t}var K2e,Q2e,Z2e,VF=N(()=>{"use strict";K2e=/\sid="(\S+)"/g,Q2e="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16),Z2e=0;o(NC,"replaceIDs")});function MC(t,e){let r=t.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(let n in e)r+=" "+n+'="'+e[n]+'"';return'"+t+""}var UF=N(()=>{"use strict";o(MC,"iconToHTML")});var WF=Mi((iit,HF)=>{"use strict";var t0=1e3,r0=t0*60,n0=r0*60,Wf=n0*24,J2e=Wf*7,exe=Wf*365.25;HF.exports=function(t,e){e=e||{};var r=typeof t;if(r==="string"&&t.length>0)return txe(t);if(r==="number"&&isFinite(t))return e.long?nxe(t):rxe(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))};function txe(t){if(t=String(t),!(t.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(e){var r=parseFloat(e[1]),n=(e[2]||"ms").toLowerCase();switch(n){case"years":case"year":case"yrs":case"yr":case"y":return r*exe;case"weeks":case"week":case"w":return r*J2e;case"days":case"day":case"d":return r*Wf;case"hours":case"hour":case"hrs":case"hr":case"h":return r*n0;case"minutes":case"minute":case"mins":case"min":case"m":return r*r0;case"seconds":case"second":case"secs":case"sec":case"s":return r*t0;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}}}o(txe,"parse");function rxe(t){var e=Math.abs(t);return e>=Wf?Math.round(t/Wf)+"d":e>=n0?Math.round(t/n0)+"h":e>=r0?Math.round(t/r0)+"m":e>=t0?Math.round(t/t0)+"s":t+"ms"}o(rxe,"fmtShort");function nxe(t){var e=Math.abs(t);return e>=Wf?I4(t,e,Wf,"day"):e>=n0?I4(t,e,n0,"hour"):e>=r0?I4(t,e,r0,"minute"):e>=t0?I4(t,e,t0,"second"):t+" ms"}o(nxe,"fmtLong");function I4(t,e,r,n){var i=e>=r*1.5;return Math.round(t/r)+" "+n+(i?"s":"")}o(I4,"plural")});var YF=Mi((sit,qF)=>{"use strict";function ixe(t){r.debug=r,r.default=r,r.coerce=u,r.disable=s,r.enable=i,r.enabled=l,r.humanize=WF(),r.destroy=h,Object.keys(t).forEach(f=>{r[f]=t[f]}),r.names=[],r.skips=[],r.formatters={};function e(f){let d=0;for(let p=0;p{if(E==="%%")return"%";C++;let S=r.formatters[A];if(typeof S=="function"){let _=v[C];E=S.call(x,_),v.splice(C,1),C--}return E}),r.formatArgs.call(x,v),(x.log||r.log).apply(x,v)}return o(y,"debug"),y.namespace=f,y.useColors=r.useColors(),y.color=r.selectColor(f),y.extend=n,y.destroy=r.destroy,Object.defineProperty(y,"enabled",{enumerable:!0,configurable:!1,get:o(()=>p!==null?p:(m!==r.namespaces&&(m=r.namespaces,g=r.enabled(f)),g),"get"),set:o(v=>{p=v},"set")}),typeof r.init=="function"&&r.init(y),y}o(r,"createDebug");function n(f,d){let p=r(this.namespace+(typeof d>"u"?":":d)+f);return p.log=this.log,p}o(n,"extend");function i(f){r.save(f),r.namespaces=f,r.names=[],r.skips=[];let d=(typeof f=="string"?f:"").trim().replace(" ",",").split(",").filter(Boolean);for(let p of d)p[0]==="-"?r.skips.push(p.slice(1)):r.names.push(p)}o(i,"enable");function a(f,d){let p=0,m=0,g=-1,y=0;for(;p"-"+d)].join(",");return r.enable(""),f}o(s,"disable");function l(f){for(let d of r.skips)if(a(f,d))return!1;for(let d of r.names)if(a(f,d))return!0;return!1}o(l,"enabled");function u(f){return f instanceof Error?f.stack||f.message:f}o(u,"coerce");function h(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return o(h,"destroy"),r.enable(r.load()),r}o(ixe,"setup");qF.exports=ixe});var XF=Mi((qs,O4)=>{"use strict";qs.formatArgs=sxe;qs.save=oxe;qs.load=lxe;qs.useColors=axe;qs.storage=cxe();qs.destroy=(()=>{let t=!1;return()=>{t||(t=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();qs.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function axe(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let t;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(t=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(t[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}o(axe,"useColors");function sxe(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+O4.exports.humanize(this.diff),!this.useColors)return;let e="color: "+this.color;t.splice(1,0,e,"color: inherit");let r=0,n=0;t[0].replace(/%[a-zA-Z%]/g,i=>{i!=="%%"&&(r++,i==="%c"&&(n=r))}),t.splice(n,0,e)}o(sxe,"formatArgs");qs.log=console.debug||console.log||(()=>{});function oxe(t){try{t?qs.storage.setItem("debug",t):qs.storage.removeItem("debug")}catch{}}o(oxe,"save");function lxe(){let t;try{t=qs.storage.getItem("debug")}catch{}return!t&&typeof process<"u"&&"env"in process&&(t=process.env.DEBUG),t}o(lxe,"load");function cxe(){try{return localStorage}catch{}}o(cxe,"localstorage");O4.exports=YF()(qs);var{formatters:uxe}=O4.exports;uxe.j=function(t){try{return JSON.stringify(t)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var uit,jF=N(()=>{"use strict";LF();BF();GF();VF();UF();uit=Sa(XF(),1)});var OC,IC,KF,P4,hxe,wo,tu=N(()=>{"use strict";vt();jF();OC={body:'?',height:80,width:80},IC=new Map,KF=new Map,P4=o(t=>{for(let e of t){if(!e.name)throw new Error('Invalid icon loader. Must have a "name" property with non-empty string value.');if(Y.debug("Registering icon pack:",e.name),"loader"in e)KF.set(e.name,e.loader);else if("icons"in e)IC.set(e.name,e.icons);else throw Y.error("Invalid icon loader:",e),new Error('Invalid icon loader. Must have either "icons" or "loader" property.')}},"registerIconPacks"),hxe=o(async(t,e)=>{let r=AC(t,!0,e!==void 0);if(!r)throw new Error(`Invalid icon name: ${t}`);let n=r.prefix||e;if(!n)throw new Error(`Icon name must contain a prefix: ${t}`);let i=IC.get(n);if(!i){let s=KF.get(n);if(!s)throw new Error(`Icon set not found: ${r.prefix}`);try{i={...await s(),prefix:n},IC.set(n,i)}catch(l){throw Y.error(l),new Error(`Failed to load icon set: ${r.prefix}`)}}let a=DC(i,r.name);if(!a)throw new Error(`Icon not found: ${t}`);return a},"getRegisteredIconData"),wo=o(async(t,e)=>{let r;try{r=await hxe(t,e?.fallbackPrefix)}catch(a){Y.error(a),r=OC}let n=RC(r,e);return MC(NC(n.body),n.attributes)},"getIconSVG")});function B4(t){for(var e=[],r=1;r{"use strict";o(B4,"dedent")});var F4,qf,QF,$4=N(()=>{"use strict";F4=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s,qf=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,QF=/\s*%%.*\n/gm});var i0,BC=N(()=>{"use strict";i0=class extends Error{static{o(this,"UnknownDiagramError")}constructor(e){super(e),this.name="UnknownDiagramError"}}});var Yf,a0,z4,FC,ZF,Xf=N(()=>{"use strict";vt();$4();BC();Yf={},a0=o(function(t,e){t=t.replace(F4,"").replace(qf,"").replace(QF,` +`);for(let[r,{detector:n}]of Object.entries(Yf))if(n(t,e))return r;throw new i0(`No diagram type detected matching given configuration for text: ${t}`)},"detectType"),z4=o((...t)=>{for(let{id:e,detector:r,loader:n}of t)FC(e,r,n)},"registerLazyLoadedDiagrams"),FC=o((t,e,r)=>{Yf[t]&&Y.warn(`Detector with key ${t} already exists. Overwriting.`),Yf[t]={detector:e,loader:r},Y.debug(`Detector with key ${t} added${r?" with loader":""}`)},"addDetector"),ZF=o(t=>Yf[t].loader,"getDiagramLoader")});var Ty,JF,$C=N(()=>{"use strict";Ty=function(){var t=o(function($e,Re,Ie,be){for(Ie=Ie||{},be=$e.length;be--;Ie[$e[be]]=Re);return Ie},"o"),e=[1,24],r=[1,25],n=[1,26],i=[1,27],a=[1,28],s=[1,63],l=[1,64],u=[1,65],h=[1,66],f=[1,67],d=[1,68],p=[1,69],m=[1,29],g=[1,30],y=[1,31],v=[1,32],x=[1,33],b=[1,34],w=[1,35],C=[1,36],T=[1,37],E=[1,38],A=[1,39],S=[1,40],_=[1,41],I=[1,42],D=[1,43],k=[1,44],L=[1,45],R=[1,46],O=[1,47],M=[1,48],B=[1,50],F=[1,51],P=[1,52],z=[1,53],$=[1,54],H=[1,55],Q=[1,56],j=[1,57],ie=[1,58],ne=[1,59],le=[1,60],he=[14,42],K=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],X=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],te=[1,82],J=[1,83],se=[1,84],ue=[1,85],Z=[12,14,42],Se=[12,14,33,42],ce=[12,14,33,42,76,77,79,80],ae=[12,33],Oe=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],ge={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:o(function(Re,Ie,be,W,de,re,oe){var V=re.length-1;switch(de){case 3:W.setDirection("TB");break;case 4:W.setDirection("BT");break;case 5:W.setDirection("RL");break;case 6:W.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:W.setC4Type(re[V-3]);break;case 19:W.setTitle(re[V].substring(6)),this.$=re[V].substring(6);break;case 20:W.setAccDescription(re[V].substring(15)),this.$=re[V].substring(15);break;case 21:this.$=re[V].trim(),W.setTitle(this.$);break;case 22:case 23:this.$=re[V].trim(),W.setAccDescription(this.$);break;case 28:re[V].splice(2,0,"ENTERPRISE"),W.addPersonOrSystemBoundary(...re[V]),this.$=re[V];break;case 29:re[V].splice(2,0,"SYSTEM"),W.addPersonOrSystemBoundary(...re[V]),this.$=re[V];break;case 30:W.addPersonOrSystemBoundary(...re[V]),this.$=re[V];break;case 31:re[V].splice(2,0,"CONTAINER"),W.addContainerBoundary(...re[V]),this.$=re[V];break;case 32:W.addDeploymentNode("node",...re[V]),this.$=re[V];break;case 33:W.addDeploymentNode("nodeL",...re[V]),this.$=re[V];break;case 34:W.addDeploymentNode("nodeR",...re[V]),this.$=re[V];break;case 35:W.popBoundaryParseStack();break;case 39:W.addPersonOrSystem("person",...re[V]),this.$=re[V];break;case 40:W.addPersonOrSystem("external_person",...re[V]),this.$=re[V];break;case 41:W.addPersonOrSystem("system",...re[V]),this.$=re[V];break;case 42:W.addPersonOrSystem("system_db",...re[V]),this.$=re[V];break;case 43:W.addPersonOrSystem("system_queue",...re[V]),this.$=re[V];break;case 44:W.addPersonOrSystem("external_system",...re[V]),this.$=re[V];break;case 45:W.addPersonOrSystem("external_system_db",...re[V]),this.$=re[V];break;case 46:W.addPersonOrSystem("external_system_queue",...re[V]),this.$=re[V];break;case 47:W.addContainer("container",...re[V]),this.$=re[V];break;case 48:W.addContainer("container_db",...re[V]),this.$=re[V];break;case 49:W.addContainer("container_queue",...re[V]),this.$=re[V];break;case 50:W.addContainer("external_container",...re[V]),this.$=re[V];break;case 51:W.addContainer("external_container_db",...re[V]),this.$=re[V];break;case 52:W.addContainer("external_container_queue",...re[V]),this.$=re[V];break;case 53:W.addComponent("component",...re[V]),this.$=re[V];break;case 54:W.addComponent("component_db",...re[V]),this.$=re[V];break;case 55:W.addComponent("component_queue",...re[V]),this.$=re[V];break;case 56:W.addComponent("external_component",...re[V]),this.$=re[V];break;case 57:W.addComponent("external_component_db",...re[V]),this.$=re[V];break;case 58:W.addComponent("external_component_queue",...re[V]),this.$=re[V];break;case 60:W.addRel("rel",...re[V]),this.$=re[V];break;case 61:W.addRel("birel",...re[V]),this.$=re[V];break;case 62:W.addRel("rel_u",...re[V]),this.$=re[V];break;case 63:W.addRel("rel_d",...re[V]),this.$=re[V];break;case 64:W.addRel("rel_l",...re[V]),this.$=re[V];break;case 65:W.addRel("rel_r",...re[V]),this.$=re[V];break;case 66:W.addRel("rel_b",...re[V]),this.$=re[V];break;case 67:re[V].splice(0,1),W.addRel("rel",...re[V]),this.$=re[V];break;case 68:W.updateElStyle("update_el_style",...re[V]),this.$=re[V];break;case 69:W.updateRelStyle("update_rel_style",...re[V]),this.$=re[V];break;case 70:W.updateLayoutConfig("update_layout_config",...re[V]),this.$=re[V];break;case 71:this.$=[re[V]];break;case 72:re[V].unshift(re[V-1]),this.$=re[V];break;case 73:case 75:this.$=re[V].trim();break;case 74:let xe={};xe[re[V-1].trim()]=re[V].trim(),this.$=xe;break;case 76:this.$="";break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:C,52:T,53:E,54:A,55:S,56:_,57:I,58:D,59:k,60:L,61:R,62:O,63:M,64:B,65:F,66:P,67:z,68:$,69:H,70:Q,71:j,72:ie,73:ne,74:le},{13:70,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:C,52:T,53:E,54:A,55:S,56:_,57:I,58:D,59:k,60:L,61:R,62:O,63:M,64:B,65:F,66:P,67:z,68:$,69:H,70:Q,71:j,72:ie,73:ne,74:le},{13:71,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:C,52:T,53:E,54:A,55:S,56:_,57:I,58:D,59:k,60:L,61:R,62:O,63:M,64:B,65:F,66:P,67:z,68:$,69:H,70:Q,71:j,72:ie,73:ne,74:le},{13:72,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:C,52:T,53:E,54:A,55:S,56:_,57:I,58:D,59:k,60:L,61:R,62:O,63:M,64:B,65:F,66:P,67:z,68:$,69:H,70:Q,71:j,72:ie,73:ne,74:le},{13:73,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:C,52:T,53:E,54:A,55:S,56:_,57:I,58:D,59:k,60:L,61:R,62:O,63:M,64:B,65:F,66:P,67:z,68:$,69:H,70:Q,71:j,72:ie,73:ne,74:le},{14:[1,74]},t(he,[2,13],{43:23,29:49,30:61,32:62,20:75,34:s,36:l,37:u,38:h,39:f,40:d,41:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:C,52:T,53:E,54:A,55:S,56:_,57:I,58:D,59:k,60:L,61:R,62:O,63:M,64:B,65:F,66:P,67:z,68:$,69:H,70:Q,71:j,72:ie,73:ne,74:le}),t(he,[2,14]),t(K,[2,16],{12:[1,76]}),t(he,[2,36],{12:[1,77]}),t(X,[2,19]),t(X,[2,20]),{25:[1,78]},{27:[1,79]},t(X,[2,23]),{35:80,75:81,76:te,77:J,79:se,80:ue},{35:86,75:81,76:te,77:J,79:se,80:ue},{35:87,75:81,76:te,77:J,79:se,80:ue},{35:88,75:81,76:te,77:J,79:se,80:ue},{35:89,75:81,76:te,77:J,79:se,80:ue},{35:90,75:81,76:te,77:J,79:se,80:ue},{35:91,75:81,76:te,77:J,79:se,80:ue},{35:92,75:81,76:te,77:J,79:se,80:ue},{35:93,75:81,76:te,77:J,79:se,80:ue},{35:94,75:81,76:te,77:J,79:se,80:ue},{35:95,75:81,76:te,77:J,79:se,80:ue},{35:96,75:81,76:te,77:J,79:se,80:ue},{35:97,75:81,76:te,77:J,79:se,80:ue},{35:98,75:81,76:te,77:J,79:se,80:ue},{35:99,75:81,76:te,77:J,79:se,80:ue},{35:100,75:81,76:te,77:J,79:se,80:ue},{35:101,75:81,76:te,77:J,79:se,80:ue},{35:102,75:81,76:te,77:J,79:se,80:ue},{35:103,75:81,76:te,77:J,79:se,80:ue},{35:104,75:81,76:te,77:J,79:se,80:ue},t(Z,[2,59]),{35:105,75:81,76:te,77:J,79:se,80:ue},{35:106,75:81,76:te,77:J,79:se,80:ue},{35:107,75:81,76:te,77:J,79:se,80:ue},{35:108,75:81,76:te,77:J,79:se,80:ue},{35:109,75:81,76:te,77:J,79:se,80:ue},{35:110,75:81,76:te,77:J,79:se,80:ue},{35:111,75:81,76:te,77:J,79:se,80:ue},{35:112,75:81,76:te,77:J,79:se,80:ue},{35:113,75:81,76:te,77:J,79:se,80:ue},{35:114,75:81,76:te,77:J,79:se,80:ue},{35:115,75:81,76:te,77:J,79:se,80:ue},{20:116,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:C,52:T,53:E,54:A,55:S,56:_,57:I,58:D,59:k,60:L,61:R,62:O,63:M,64:B,65:F,66:P,67:z,68:$,69:H,70:Q,71:j,72:ie,73:ne,74:le},{12:[1,118],33:[1,117]},{35:119,75:81,76:te,77:J,79:se,80:ue},{35:120,75:81,76:te,77:J,79:se,80:ue},{35:121,75:81,76:te,77:J,79:se,80:ue},{35:122,75:81,76:te,77:J,79:se,80:ue},{35:123,75:81,76:te,77:J,79:se,80:ue},{35:124,75:81,76:te,77:J,79:se,80:ue},{35:125,75:81,76:te,77:J,79:se,80:ue},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},t(he,[2,15]),t(K,[2,17],{21:22,19:130,22:e,23:r,24:n,26:i,28:a}),t(he,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:e,23:r,24:n,26:i,28:a,34:s,36:l,37:u,38:h,39:f,40:d,41:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w,51:C,52:T,53:E,54:A,55:S,56:_,57:I,58:D,59:k,60:L,61:R,62:O,63:M,64:B,65:F,66:P,67:z,68:$,69:H,70:Q,71:j,72:ie,73:ne,74:le}),t(X,[2,21]),t(X,[2,22]),t(Z,[2,39]),t(Se,[2,71],{75:81,35:132,76:te,77:J,79:se,80:ue}),t(ce,[2,73]),{78:[1,133]},t(ce,[2,75]),t(ce,[2,76]),t(Z,[2,40]),t(Z,[2,41]),t(Z,[2,42]),t(Z,[2,43]),t(Z,[2,44]),t(Z,[2,45]),t(Z,[2,46]),t(Z,[2,47]),t(Z,[2,48]),t(Z,[2,49]),t(Z,[2,50]),t(Z,[2,51]),t(Z,[2,52]),t(Z,[2,53]),t(Z,[2,54]),t(Z,[2,55]),t(Z,[2,56]),t(Z,[2,57]),t(Z,[2,58]),t(Z,[2,60]),t(Z,[2,61]),t(Z,[2,62]),t(Z,[2,63]),t(Z,[2,64]),t(Z,[2,65]),t(Z,[2,66]),t(Z,[2,67]),t(Z,[2,68]),t(Z,[2,69]),t(Z,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},t(ae,[2,28]),t(ae,[2,29]),t(ae,[2,30]),t(ae,[2,31]),t(ae,[2,32]),t(ae,[2,33]),t(ae,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},t(K,[2,18]),t(he,[2,38]),t(Se,[2,72]),t(ce,[2,74]),t(Z,[2,24]),t(Z,[2,35]),t(Oe,[2,25]),t(Oe,[2,26],{12:[1,138]}),t(Oe,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:o(function(Re,Ie){if(Ie.recoverable)this.trace(Re);else{var be=new Error(Re);throw be.hash=Ie,be}},"parseError"),parse:o(function(Re){var Ie=this,be=[0],W=[],de=[null],re=[],oe=this.table,V="",xe=0,q=0,pe=0,ve=2,Pe=1,_e=re.slice.call(arguments,1),we=Object.create(this.lexer),Ve={yy:{}};for(var De in this.yy)Object.prototype.hasOwnProperty.call(this.yy,De)&&(Ve.yy[De]=this.yy[De]);we.setInput(Re,Ve.yy),Ve.yy.lexer=we,Ve.yy.parser=this,typeof we.yylloc>"u"&&(we.yylloc={});var qe=we.yylloc;re.push(qe);var at=we.options&&we.options.ranges;typeof Ve.yy.parseError=="function"?this.parseError=Ve.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Rt(nt){be.length=be.length-2*nt,de.length=de.length-nt,re.length=re.length-nt}o(Rt,"popStack");function st(){var nt;return nt=W.pop()||we.lex()||Pe,typeof nt!="number"&&(nt instanceof Array&&(W=nt,nt=W.pop()),nt=Ie.symbols_[nt]||nt),nt}o(st,"lex");for(var Ue,ct,We,ot,Yt,bt,Mt={},xt,ut,Et,ft;;){if(We=be[be.length-1],this.defaultActions[We]?ot=this.defaultActions[We]:((Ue===null||typeof Ue>"u")&&(Ue=st()),ot=oe[We]&&oe[We][Ue]),typeof ot>"u"||!ot.length||!ot[0]){var yt="";ft=[];for(xt in oe[We])this.terminals_[xt]&&xt>ve&&ft.push("'"+this.terminals_[xt]+"'");we.showPosition?yt="Parse error on line "+(xe+1)+`: +`+we.showPosition()+` +Expecting `+ft.join(", ")+", got '"+(this.terminals_[Ue]||Ue)+"'":yt="Parse error on line "+(xe+1)+": Unexpected "+(Ue==Pe?"end of input":"'"+(this.terminals_[Ue]||Ue)+"'"),this.parseError(yt,{text:we.match,token:this.terminals_[Ue]||Ue,line:we.yylineno,loc:qe,expected:ft})}if(ot[0]instanceof Array&&ot.length>1)throw new Error("Parse Error: multiple actions possible at state: "+We+", token: "+Ue);switch(ot[0]){case 1:be.push(Ue),de.push(we.yytext),re.push(we.yylloc),be.push(ot[1]),Ue=null,ct?(Ue=ct,ct=null):(q=we.yyleng,V=we.yytext,xe=we.yylineno,qe=we.yylloc,pe>0&&pe--);break;case 2:if(ut=this.productions_[ot[1]][1],Mt.$=de[de.length-ut],Mt._$={first_line:re[re.length-(ut||1)].first_line,last_line:re[re.length-1].last_line,first_column:re[re.length-(ut||1)].first_column,last_column:re[re.length-1].last_column},at&&(Mt._$.range=[re[re.length-(ut||1)].range[0],re[re.length-1].range[1]]),bt=this.performAction.apply(Mt,[V,q,xe,Ve.yy,ot[1],de,re].concat(_e)),typeof bt<"u")return bt;ut&&(be=be.slice(0,-1*ut*2),de=de.slice(0,-1*ut),re=re.slice(0,-1*ut)),be.push(this.productions_[ot[1]][0]),de.push(Mt.$),re.push(Mt._$),Et=oe[be[be.length-2]][be[be.length-1]],be.push(Et);break;case 3:return!0}}return!0},"parse")},ze=function(){var $e={EOF:1,parseError:o(function(Ie,be){if(this.yy.parser)this.yy.parser.parseError(Ie,be);else throw new Error(Ie)},"parseError"),setInput:o(function(Re,Ie){return this.yy=Ie||this.yy||{},this._input=Re,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var Re=this._input[0];this.yytext+=Re,this.yyleng++,this.offset++,this.match+=Re,this.matched+=Re;var Ie=Re.match(/(?:\r\n?|\n).*/g);return Ie?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Re},"input"),unput:o(function(Re){var Ie=Re.length,be=Re.split(/(?:\r\n?|\n)/g);this._input=Re+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ie),this.offset-=Ie;var W=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),be.length-1&&(this.yylineno-=be.length-1);var de=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:be?(be.length===W.length?this.yylloc.first_column:0)+W[W.length-be.length].length-be[0].length:this.yylloc.first_column-Ie},this.options.ranges&&(this.yylloc.range=[de[0],de[0]+this.yyleng-Ie]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(Re){this.unput(this.match.slice(Re))},"less"),pastInput:o(function(){var Re=this.matched.substr(0,this.matched.length-this.match.length);return(Re.length>20?"...":"")+Re.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var Re=this.match;return Re.length<20&&(Re+=this._input.substr(0,20-Re.length)),(Re.substr(0,20)+(Re.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var Re=this.pastInput(),Ie=new Array(Re.length+1).join("-");return Re+this.upcomingInput()+` +`+Ie+"^"},"showPosition"),test_match:o(function(Re,Ie){var be,W,de;if(this.options.backtrack_lexer&&(de={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(de.yylloc.range=this.yylloc.range.slice(0))),W=Re[0].match(/(?:\r\n?|\n).*/g),W&&(this.yylineno+=W.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:W?W[W.length-1].length-W[W.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Re[0].length},this.yytext+=Re[0],this.match+=Re[0],this.matches=Re,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Re[0].length),this.matched+=Re[0],be=this.performAction.call(this,this.yy,this,Ie,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),be)return be;if(this._backtrack){for(var re in de)this[re]=de[re];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Re,Ie,be,W;this._more||(this.yytext="",this.match="");for(var de=this._currentRules(),re=0;reIe[0].length)){if(Ie=be,W=re,this.options.backtrack_lexer){if(Re=this.test_match(be,de[re]),Re!==!1)return Re;if(this._backtrack){Ie=!1;continue}else return!1}else if(!this.options.flex)break}return Ie?(Re=this.test_match(Ie,de[W]),Re!==!1?Re:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Ie=this.next();return Ie||this.lex()},"lex"),begin:o(function(Ie){this.conditionStack.push(Ie)},"begin"),popState:o(function(){var Ie=this.conditionStack.length-1;return Ie>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Ie){return Ie=this.conditionStack.length-1-Math.abs(Ie||0),Ie>=0?this.conditionStack[Ie]:"INITIAL"},"topState"),pushState:o(function(Ie){this.begin(Ie)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(Ie,be,W,de){var re=de;switch(W){case 0:return 6;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 22;case 5:return 23;case 6:return this.begin("acc_title"),24;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),26;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:break;case 14:c;break;case 15:return 12;case 16:break;case 17:return 11;case 18:return 15;case 19:return 16;case 20:return 17;case 21:return 18;case 22:return this.begin("person_ext"),45;break;case 23:return this.begin("person"),44;break;case 24:return this.begin("system_ext_queue"),51;break;case 25:return this.begin("system_ext_db"),50;break;case 26:return this.begin("system_ext"),49;break;case 27:return this.begin("system_queue"),48;break;case 28:return this.begin("system_db"),47;break;case 29:return this.begin("system"),46;break;case 30:return this.begin("boundary"),37;break;case 31:return this.begin("enterprise_boundary"),34;break;case 32:return this.begin("system_boundary"),36;break;case 33:return this.begin("container_ext_queue"),57;break;case 34:return this.begin("container_ext_db"),56;break;case 35:return this.begin("container_ext"),55;break;case 36:return this.begin("container_queue"),54;break;case 37:return this.begin("container_db"),53;break;case 38:return this.begin("container"),52;break;case 39:return this.begin("container_boundary"),38;break;case 40:return this.begin("component_ext_queue"),63;break;case 41:return this.begin("component_ext_db"),62;break;case 42:return this.begin("component_ext"),61;break;case 43:return this.begin("component_queue"),60;break;case 44:return this.begin("component_db"),59;break;case 45:return this.begin("component"),58;break;case 46:return this.begin("node"),39;break;case 47:return this.begin("node"),39;break;case 48:return this.begin("node_l"),40;break;case 49:return this.begin("node_r"),41;break;case 50:return this.begin("rel"),64;break;case 51:return this.begin("birel"),65;break;case 52:return this.begin("rel_u"),66;break;case 53:return this.begin("rel_u"),66;break;case 54:return this.begin("rel_d"),67;break;case 55:return this.begin("rel_d"),67;break;case 56:return this.begin("rel_l"),68;break;case 57:return this.begin("rel_l"),68;break;case 58:return this.begin("rel_r"),69;break;case 59:return this.begin("rel_r"),69;break;case 60:return this.begin("rel_b"),70;break;case 61:return this.begin("rel_index"),71;break;case 62:return this.begin("update_el_style"),72;break;case 63:return this.begin("update_rel_style"),73;break;case 64:return this.begin("update_layout_config"),74;break;case 65:return"EOF_IN_STRUCT";case 66:return this.begin("attribute"),"ATTRIBUTE_EMPTY";break;case 67:this.begin("attribute");break;case 68:this.popState(),this.popState();break;case 69:return 80;case 70:break;case 71:return 80;case 72:this.begin("string");break;case 73:this.popState();break;case 74:return"STR";case 75:this.begin("string_kv");break;case 76:return this.begin("string_kv_key"),"STR_KEY";break;case 77:this.popState(),this.begin("string_kv_value");break;case 78:return"STR_VALUE";case 79:this.popState(),this.popState();break;case 80:return"STR";case 81:return"LBRACE";case 82:return"RBRACE";case 83:return"SPACE";case 84:return"EOL";case 85:return 14}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},string_kv_value:{rules:[78,79],inclusive:!1},string_kv_key:{rules:[77],inclusive:!1},string_kv:{rules:[76],inclusive:!1},string:{rules:[73,74],inclusive:!1},attribute:{rules:[68,69,70,71,72,75,80],inclusive:!1},update_layout_config:{rules:[65,66,67,68],inclusive:!1},update_rel_style:{rules:[65,66,67,68],inclusive:!1},update_el_style:{rules:[65,66,67,68],inclusive:!1},rel_b:{rules:[65,66,67,68],inclusive:!1},rel_r:{rules:[65,66,67,68],inclusive:!1},rel_l:{rules:[65,66,67,68],inclusive:!1},rel_d:{rules:[65,66,67,68],inclusive:!1},rel_u:{rules:[65,66,67,68],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[65,66,67,68],inclusive:!1},node_r:{rules:[65,66,67,68],inclusive:!1},node_l:{rules:[65,66,67,68],inclusive:!1},node:{rules:[65,66,67,68],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[65,66,67,68],inclusive:!1},component_ext_queue:{rules:[],inclusive:!1},component_ext_db:{rules:[65,66,67,68],inclusive:!1},component_ext:{rules:[65,66,67,68],inclusive:!1},component_queue:{rules:[65,66,67,68],inclusive:!1},component_db:{rules:[65,66,67,68],inclusive:!1},component:{rules:[65,66,67,68],inclusive:!1},container_boundary:{rules:[65,66,67,68],inclusive:!1},container_ext_queue:{rules:[65,66,67,68],inclusive:!1},container_ext_db:{rules:[65,66,67,68],inclusive:!1},container_ext:{rules:[65,66,67,68],inclusive:!1},container_queue:{rules:[65,66,67,68],inclusive:!1},container_db:{rules:[65,66,67,68],inclusive:!1},container:{rules:[65,66,67,68],inclusive:!1},birel:{rules:[65,66,67,68],inclusive:!1},system_boundary:{rules:[65,66,67,68],inclusive:!1},enterprise_boundary:{rules:[65,66,67,68],inclusive:!1},boundary:{rules:[65,66,67,68],inclusive:!1},system_ext_queue:{rules:[65,66,67,68],inclusive:!1},system_ext_db:{rules:[65,66,67,68],inclusive:!1},system_ext:{rules:[65,66,67,68],inclusive:!1},system_queue:{rules:[65,66,67,68],inclusive:!1},system_db:{rules:[65,66,67,68],inclusive:!1},system:{rules:[65,66,67,68],inclusive:!1},person_ext:{rules:[65,66,67,68],inclusive:!1},person:{rules:[65,66,67,68],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],inclusive:!0}}};return $e}();ge.lexer=ze;function He(){this.yy={}}return o(He,"Parser"),He.prototype=ge,ge.Parser=He,new He}();Ty.parser=Ty;JF=Ty});var zC,Gn,s0=N(()=>{"use strict";zC=o((t,e,{depth:r=2,clobber:n=!1}={})=>{let i={depth:r,clobber:n};return Array.isArray(e)&&!Array.isArray(t)?(e.forEach(a=>zC(t,a,i)),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach(a=>{t.includes(a)||t.push(a)}),t):t===void 0||r<=0?t!=null&&typeof t=="object"&&typeof e=="object"?Object.assign(t,e):e:(e!==void 0&&typeof t=="object"&&typeof e=="object"&&Object.keys(e).forEach(a=>{typeof e[a]=="object"&&(t[a]===void 0||typeof t[a]=="object")?(t[a]===void 0&&(t[a]=Array.isArray(e[a])?[]:{}),t[a]=zC(t[a],e[a],{depth:r-1,clobber:n})):(n||typeof t[a]!="object"&&typeof e[a]!="object")&&(t[a]=e[a])}),t)},"assignWithDepth"),Gn=zC});var G4,e$,t$=N(()=>{"use strict";G4={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:o(t=>t>=255?255:t<0?0:t,"r"),g:o(t=>t>=255?255:t<0?0:t,"g"),b:o(t=>t>=255?255:t<0?0:t,"b"),h:o(t=>t%360,"h"),s:o(t=>t>=100?100:t<0?0:t,"s"),l:o(t=>t>=100?100:t<0?0:t,"l"),a:o(t=>t>=1?1:t<0?0:t,"a")},toLinear:o(t=>{let e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},"toLinear"),hue2rgb:o((t,e,r)=>(r<0&&(r+=1),r>1&&(r-=1),r<.16666666666666666?t+(e-t)*6*r:r<.5?e:r<.6666666666666666?t+(e-t)*(.6666666666666666-r)*6:t),"hue2rgb"),hsl2rgb:o(({h:t,s:e,l:r},n)=>{if(!e)return r*2.55;t/=360,e/=100,r/=100;let i=r<.5?r*(1+e):r+e-r*e,a=2*r-i;switch(n){case"r":return G4.hue2rgb(a,i,t+.3333333333333333)*255;case"g":return G4.hue2rgb(a,i,t)*255;case"b":return G4.hue2rgb(a,i,t-.3333333333333333)*255}},"hsl2rgb"),rgb2hsl:o(({r:t,g:e,b:r},n)=>{t/=255,e/=255,r/=255;let i=Math.max(t,e,r),a=Math.min(t,e,r),s=(i+a)/2;if(n==="l")return s*100;if(i===a)return 0;let l=i-a,u=s>.5?l/(2-i-a):l/(i+a);if(n==="s")return u*100;switch(i){case t:return((e-r)/l+(e{"use strict";fxe={clamp:o((t,e,r)=>e>r?Math.min(e,Math.max(r,t)):Math.min(r,Math.max(e,t)),"clamp"),round:o(t=>Math.round(t*1e10)/1e10,"round")},r$=fxe});var dxe,i$,a$=N(()=>{"use strict";dxe={dec2hex:o(t=>{let e=Math.round(t).toString(16);return e.length>1?e:`0${e}`},"dec2hex")},i$=dxe});var pxe,jt,Wl=N(()=>{"use strict";t$();n$();a$();pxe={channel:e$,lang:r$,unit:i$},jt=pxe});var ru,Ii,ky=N(()=>{"use strict";Wl();ru={};for(let t=0;t<=255;t++)ru[t]=jt.unit.dec2hex(t);Ii={ALL:0,RGB:1,HSL:2}});var GC,s$,o$=N(()=>{"use strict";ky();GC=class{static{o(this,"Type")}constructor(){this.type=Ii.ALL}get(){return this.type}set(e){if(this.type&&this.type!==e)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=e}reset(){this.type=Ii.ALL}is(e){return this.type===e}},s$=GC});var VC,l$,c$=N(()=>{"use strict";Wl();o$();ky();VC=class{static{o(this,"Channels")}constructor(e,r){this.color=r,this.changed=!1,this.data=e,this.type=new s$}set(e,r){return this.color=r,this.changed=!1,this.data=e,this.type.type=Ii.ALL,this}_ensureHSL(){let e=this.data,{h:r,s:n,l:i}=e;r===void 0&&(e.h=jt.channel.rgb2hsl(e,"h")),n===void 0&&(e.s=jt.channel.rgb2hsl(e,"s")),i===void 0&&(e.l=jt.channel.rgb2hsl(e,"l"))}_ensureRGB(){let e=this.data,{r,g:n,b:i}=e;r===void 0&&(e.r=jt.channel.hsl2rgb(e,"r")),n===void 0&&(e.g=jt.channel.hsl2rgb(e,"g")),i===void 0&&(e.b=jt.channel.hsl2rgb(e,"b"))}get r(){let e=this.data,r=e.r;return!this.type.is(Ii.HSL)&&r!==void 0?r:(this._ensureHSL(),jt.channel.hsl2rgb(e,"r"))}get g(){let e=this.data,r=e.g;return!this.type.is(Ii.HSL)&&r!==void 0?r:(this._ensureHSL(),jt.channel.hsl2rgb(e,"g"))}get b(){let e=this.data,r=e.b;return!this.type.is(Ii.HSL)&&r!==void 0?r:(this._ensureHSL(),jt.channel.hsl2rgb(e,"b"))}get h(){let e=this.data,r=e.h;return!this.type.is(Ii.RGB)&&r!==void 0?r:(this._ensureRGB(),jt.channel.rgb2hsl(e,"h"))}get s(){let e=this.data,r=e.s;return!this.type.is(Ii.RGB)&&r!==void 0?r:(this._ensureRGB(),jt.channel.rgb2hsl(e,"s"))}get l(){let e=this.data,r=e.l;return!this.type.is(Ii.RGB)&&r!==void 0?r:(this._ensureRGB(),jt.channel.rgb2hsl(e,"l"))}get a(){return this.data.a}set r(e){this.type.set(Ii.RGB),this.changed=!0,this.data.r=e}set g(e){this.type.set(Ii.RGB),this.changed=!0,this.data.g=e}set b(e){this.type.set(Ii.RGB),this.changed=!0,this.data.b=e}set h(e){this.type.set(Ii.HSL),this.changed=!0,this.data.h=e}set s(e){this.type.set(Ii.HSL),this.changed=!0,this.data.s=e}set l(e){this.type.set(Ii.HSL),this.changed=!0,this.data.l=e}set a(e){this.changed=!0,this.data.a=e}},l$=VC});var mxe,ih,Ey=N(()=>{"use strict";c$();mxe=new l$({r:0,g:0,b:0,a:0},"transparent"),ih=mxe});var u$,jf,UC=N(()=>{"use strict";Ey();ky();u$={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:o(t=>{if(t.charCodeAt(0)!==35)return;let e=t.match(u$.re);if(!e)return;let r=e[1],n=parseInt(r,16),i=r.length,a=i%4===0,s=i>4,l=s?1:17,u=s?8:4,h=a?0:-1,f=s?255:15;return ih.set({r:(n>>u*(h+3)&f)*l,g:(n>>u*(h+2)&f)*l,b:(n>>u*(h+1)&f)*l,a:a?(n&f)*l/255:1},t)},"parse"),stringify:o(t=>{let{r:e,g:r,b:n,a:i}=t;return i<1?`#${ru[Math.round(e)]}${ru[Math.round(r)]}${ru[Math.round(n)]}${ru[Math.round(i*255)]}`:`#${ru[Math.round(e)]}${ru[Math.round(r)]}${ru[Math.round(n)]}`},"stringify")},jf=u$});var V4,Sy,h$=N(()=>{"use strict";Wl();Ey();V4={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:o(t=>{let e=t.match(V4.hueRe);if(e){let[,r,n]=e;switch(n){case"grad":return jt.channel.clamp.h(parseFloat(r)*.9);case"rad":return jt.channel.clamp.h(parseFloat(r)*180/Math.PI);case"turn":return jt.channel.clamp.h(parseFloat(r)*360)}}return jt.channel.clamp.h(parseFloat(t))},"_hue2deg"),parse:o(t=>{let e=t.charCodeAt(0);if(e!==104&&e!==72)return;let r=t.match(V4.re);if(!r)return;let[,n,i,a,s,l]=r;return ih.set({h:V4._hue2deg(n),s:jt.channel.clamp.s(parseFloat(i)),l:jt.channel.clamp.l(parseFloat(a)),a:s?jt.channel.clamp.a(l?parseFloat(s)/100:parseFloat(s)):1},t)},"parse"),stringify:o(t=>{let{h:e,s:r,l:n,a:i}=t;return i<1?`hsla(${jt.lang.round(e)}, ${jt.lang.round(r)}%, ${jt.lang.round(n)}%, ${i})`:`hsl(${jt.lang.round(e)}, ${jt.lang.round(r)}%, ${jt.lang.round(n)}%)`},"stringify")},Sy=V4});var U4,HC,f$=N(()=>{"use strict";UC();U4={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:o(t=>{t=t.toLowerCase();let e=U4.colors[t];if(e)return jf.parse(e)},"parse"),stringify:o(t=>{let e=jf.stringify(t);for(let r in U4.colors)if(U4.colors[r]===e)return r},"stringify")},HC=U4});var d$,Cy,p$=N(()=>{"use strict";Wl();Ey();d$={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:o(t=>{let e=t.charCodeAt(0);if(e!==114&&e!==82)return;let r=t.match(d$.re);if(!r)return;let[,n,i,a,s,l,u,h,f]=r;return ih.set({r:jt.channel.clamp.r(i?parseFloat(n)*2.55:parseFloat(n)),g:jt.channel.clamp.g(s?parseFloat(a)*2.55:parseFloat(a)),b:jt.channel.clamp.b(u?parseFloat(l)*2.55:parseFloat(l)),a:h?jt.channel.clamp.a(f?parseFloat(h)/100:parseFloat(h)):1},t)},"parse"),stringify:o(t=>{let{r:e,g:r,b:n,a:i}=t;return i<1?`rgba(${jt.lang.round(e)}, ${jt.lang.round(r)}, ${jt.lang.round(n)}, ${jt.lang.round(i)})`:`rgb(${jt.lang.round(e)}, ${jt.lang.round(r)}, ${jt.lang.round(n)})`},"stringify")},Cy=d$});var gxe,Oi,nu=N(()=>{"use strict";UC();h$();f$();p$();ky();gxe={format:{keyword:HC,hex:jf,rgb:Cy,rgba:Cy,hsl:Sy,hsla:Sy},parse:o(t=>{if(typeof t!="string")return t;let e=jf.parse(t)||Cy.parse(t)||Sy.parse(t)||HC.parse(t);if(e)return e;throw new Error(`Unsupported color format: "${t}"`)},"parse"),stringify:o(t=>!t.changed&&t.color?t.color:t.type.is(Ii.HSL)||t.data.r===void 0?Sy.stringify(t):t.a<1||!Number.isInteger(t.r)||!Number.isInteger(t.g)||!Number.isInteger(t.b)?Cy.stringify(t):jf.stringify(t),"stringify")},Oi=gxe});var yxe,H4,WC=N(()=>{"use strict";Wl();nu();yxe=o((t,e)=>{let r=Oi.parse(t);for(let n in e)r[n]=jt.channel.clamp[n](e[n]);return Oi.stringify(r)},"change"),H4=yxe});var vxe,qa,qC=N(()=>{"use strict";Wl();Ey();nu();WC();vxe=o((t,e,r=0,n=1)=>{if(typeof t!="number")return H4(t,{a:e});let i=ih.set({r:jt.channel.clamp.r(t),g:jt.channel.clamp.g(e),b:jt.channel.clamp.b(r),a:jt.channel.clamp.a(n)});return Oi.stringify(i)},"rgba"),qa=vxe});var xxe,Kf,m$=N(()=>{"use strict";Wl();nu();xxe=o((t,e)=>jt.lang.round(Oi.parse(t)[e]),"channel"),Kf=xxe});var bxe,g$,y$=N(()=>{"use strict";Wl();nu();bxe=o(t=>{let{r:e,g:r,b:n}=Oi.parse(t),i=.2126*jt.channel.toLinear(e)+.7152*jt.channel.toLinear(r)+.0722*jt.channel.toLinear(n);return jt.lang.round(i)},"luminance"),g$=bxe});var wxe,v$,x$=N(()=>{"use strict";y$();wxe=o(t=>g$(t)>=.5,"isLight"),v$=wxe});var Txe,ca,b$=N(()=>{"use strict";x$();Txe=o(t=>!v$(t),"isDark"),ca=Txe});var kxe,W4,YC=N(()=>{"use strict";Wl();nu();kxe=o((t,e,r)=>{let n=Oi.parse(t),i=n[e],a=jt.channel.clamp[e](i+r);return i!==a&&(n[e]=a),Oi.stringify(n)},"adjustChannel"),W4=kxe});var Exe,Dt,w$=N(()=>{"use strict";YC();Exe=o((t,e)=>W4(t,"l",e),"lighten"),Dt=Exe});var Sxe,Ot,T$=N(()=>{"use strict";YC();Sxe=o((t,e)=>W4(t,"l",-e),"darken"),Ot=Sxe});var Cxe,Me,k$=N(()=>{"use strict";nu();WC();Cxe=o((t,e)=>{let r=Oi.parse(t),n={};for(let i in e)e[i]&&(n[i]=r[i]+e[i]);return H4(t,n)},"adjust"),Me=Cxe});var Axe,E$,S$=N(()=>{"use strict";nu();qC();Axe=o((t,e,r=50)=>{let{r:n,g:i,b:a,a:s}=Oi.parse(t),{r:l,g:u,b:h,a:f}=Oi.parse(e),d=r/100,p=d*2-1,m=s-f,y=((p*m===-1?p:(p+m)/(1+p*m))+1)/2,v=1-y,x=n*y+l*v,b=i*y+u*v,w=a*y+h*v,C=s*d+f*(1-d);return qa(x,b,w,C)},"mix"),E$=Axe});var _xe,wt,C$=N(()=>{"use strict";nu();S$();_xe=o((t,e=100)=>{let r=Oi.parse(t);return r.r=255-r.r,r.g=255-r.g,r.b=255-r.b,E$(r,t,e)},"invert"),wt=_xe});var A$=N(()=>{"use strict";qC();m$();b$();w$();T$();k$();C$()});var Ys=N(()=>{"use strict";A$()});var ah,sh,Ay=N(()=>{"use strict";ah="#ffffff",sh="#f2f2f2"});var Ti,o0=N(()=>{"use strict";Ys();Ti=o((t,e)=>e?Me(t,{s:-40,l:10}):Me(t,{s:-40,l:-10}),"mkBorder")});var jC,_$,D$=N(()=>{"use strict";Ys();Ay();o0();jC=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||Me(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||Me(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||Ti(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||Ti(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||Ti(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||Ti(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||wt(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||wt(this.tertiaryColor),this.lineColor=this.lineColor||wt(this.background),this.arrowheadColor=this.arrowheadColor||wt(this.background),this.textColor=this.textColor||this.primaryTextColor,this.border2=this.border2||this.tertiaryBorderColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?Ot(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||this.actorBorder,this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||Ot(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||wt(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||Dt(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.darkMode?(this.rowOdd=this.rowOdd||Ot(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||Ot(this.mainBkg,10)):(this.rowOdd=this.rowOdd||Dt(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||Dt(this.mainBkg,5)),this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330}),this.darkMode)for(let r=0;r{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},_$=o(t=>{let e=new jC;return e.calculate(t),e},"getThemeVariables")});var KC,L$,R$=N(()=>{"use strict";Ys();o0();KC=class{static{o(this,"Theme")}constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=Dt(this.primaryColor,16),this.tertiaryColor=Me(this.primaryColor,{h:-160}),this.primaryBorderColor=wt(this.background),this.secondaryBorderColor=Ti(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Ti(this.tertiaryColor,this.darkMode),this.primaryTextColor=wt(this.primaryColor),this.secondaryTextColor=wt(this.secondaryColor),this.tertiaryTextColor=wt(this.tertiaryColor),this.lineColor=wt(this.background),this.textColor=wt(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=Dt(wt("#323D47"),10),this.lineColor="calculated",this.border1="#ccc",this.border2=qa(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=Ot("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.excludeBkgColor=Ot(this.sectionBkgColor,10),this.taskBorderColor=qa(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=qa(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||Dt(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||Ot(this.mainBkg,10),this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=Dt(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=Dt(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.actorBorder,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=Dt(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=this.darkTextColor,this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=Me(this.primaryColor,{h:64}),this.fillType3=Me(this.secondaryColor,{h:64}),this.fillType4=Me(this.primaryColor,{h:-64}),this.fillType5=Me(this.secondaryColor,{h:-64}),this.fillType6=Me(this.primaryColor,{h:128}),this.fillType7=Me(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330});for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},L$=o(t=>{let e=new KC;return e.calculate(t),e},"getThemeVariables")});var QC,oh,_y=N(()=>{"use strict";Ys();o0();Ay();QC=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=Me(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=Me(this.primaryColor,{h:-160}),this.primaryBorderColor=Ti(this.primaryColor,this.darkMode),this.secondaryBorderColor=Ti(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Ti(this.tertiaryColor,this.darkMode),this.primaryTextColor=wt(this.primaryColor),this.secondaryTextColor=wt(this.secondaryColor),this.tertiaryTextColor=wt(this.tertiaryColor),this.lineColor=wt(this.background),this.textColor=wt(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="rgba(232,232,232, 0.8)",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.sectionBkgColor=qa(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd="calculated",this.rowEven="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||Ot(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||Ot(this.tertiaryColor,40);for(let e=0;e{this[n]==="calculated"&&(this[n]=void 0)}),typeof e!="object"){this.updateColors();return}let r=Object.keys(e);r.forEach(n=>{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},oh=o(t=>{let e=new QC;return e.calculate(t),e},"getThemeVariables")});var ZC,N$,M$=N(()=>{"use strict";Ys();Ay();o0();ZC=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=Dt("#cde498",10),this.primaryBorderColor=Ti(this.primaryColor,this.darkMode),this.secondaryBorderColor=Ti(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Ti(this.tertiaryColor,this.darkMode),this.primaryTextColor=wt(this.primaryColor),this.secondaryTextColor=wt(this.secondaryColor),this.tertiaryTextColor=wt(this.primaryColor),this.lineColor=wt(this.background),this.textColor=wt(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.actorBorder=Ot(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.actorLineColor=this.actorBorder,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||Ot(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||Ot(this.tertiaryColor,40);for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},N$=o(t=>{let e=new ZC;return e.calculate(t),e},"getThemeVariables")});var JC,I$,O$=N(()=>{"use strict";Ys();o0();Ay();JC=class{static{o(this,"Theme")}constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=Dt(this.contrast,55),this.background="#ffffff",this.tertiaryColor=Me(this.primaryColor,{h:-160}),this.primaryBorderColor=Ti(this.primaryColor,this.darkMode),this.secondaryBorderColor=Ti(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Ti(this.tertiaryColor,this.darkMode),this.primaryTextColor=wt(this.primaryColor),this.secondaryTextColor=wt(this.secondaryColor),this.tertiaryTextColor=wt(this.tertiaryColor),this.lineColor=wt(this.background),this.textColor=wt(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor=this.actorBorder,this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||Dt(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||"#f4f4f4",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=Dt(this.contrast,55),this.border2=this.contrast,this.actorBorder=Dt(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.actorBorder,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},I$=o(t=>{let e=new JC;return e.calculate(t),e},"getThemeVariables")});var To,q4=N(()=>{"use strict";D$();R$();_y();M$();O$();To={base:{getThemeVariables:_$},dark:{getThemeVariables:L$},default:{getThemeVariables:oh},forest:{getThemeVariables:N$},neutral:{getThemeVariables:I$}}});var ql,P$=N(()=>{"use strict";ql={flowchart:{useMaxWidth:!0,titleTopMargin:25,subGraphTitleMargin:{top:0,bottom:0},diagramPadding:8,htmlLabels:!0,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,defaultRenderer:"dagre-wrapper",wrappingWidth:200},sequence:{useMaxWidth:!0,hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20},gantt:{useMaxWidth:!0,titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",topAxis:!1,displayMode:"",weekday:"sunday"},journey:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"]},class:{useMaxWidth:!0,titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,defaultRenderer:"dagre-wrapper",htmlLabels:!1,hideEmptyMembersBox:!1},state:{useMaxWidth:!0,titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,defaultRenderer:"dagre-wrapper"},er:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,nodeSpacing:140,rankSpacing:80,stroke:"gray",fill:"honeydew",fontSize:12},pie:{useMaxWidth:!0,textPosition:.75},quadrantChart:{useMaxWidth:!0,chartWidth:500,chartHeight:500,titleFontSize:20,titlePadding:10,quadrantPadding:5,xAxisLabelPadding:5,yAxisLabelPadding:5,xAxisLabelFontSize:16,yAxisLabelFontSize:16,quadrantLabelFontSize:16,quadrantTextTopPadding:5,pointTextPadding:5,pointLabelFontSize:12,pointRadius:5,xAxisPosition:"top",yAxisPosition:"left",quadrantInternalBorderStrokeWidth:1,quadrantExternalBorderStrokeWidth:2},xyChart:{useMaxWidth:!0,width:700,height:500,titleFontSize:20,titlePadding:10,showTitle:!0,xAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},yAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},chartOrientation:"vertical",plotReservedSpacePercent:50},requirement:{useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200},kanban:{useMaxWidth:!0,padding:8,sectionWidth:200,ticketBaseUrl:""},timeline:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},gitGraph:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0,parallelCommits:!1,arrowMarkerAbsolute:!1},c4:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},sankey:{useMaxWidth:!0,width:600,height:400,linkColor:"gradient",nodeAlignment:"justify",showValues:!0,prefix:"",suffix:""},block:{useMaxWidth:!0,padding:8},packet:{useMaxWidth:!0,rowHeight:32,bitWidth:32,bitsPerRow:32,showBits:!0,paddingX:5,paddingY:5},architecture:{useMaxWidth:!0,padding:40,iconSize:80,fontSize:16},radar:{useMaxWidth:!0,width:600,height:600,marginTop:50,marginRight:50,marginBottom:50,marginLeft:50,axisScaleFactor:1,axisLabelFactor:1.05,curveTension:.17},theme:"default",look:"classic",handDrawnSeed:0,layout:"dagre",maxTextSize:5e4,maxEdges:500,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize","suppressErrorRendering","maxEdges"],legacyMathML:!1,forceLegacyMathML:!1,deterministicIds:!1,fontSize:16,markdownAutoWrap:!0,suppressErrorRendering:!1}});var B$,F$,$$,or,Ya=N(()=>{"use strict";q4();P$();B$={...ql,deterministicIDSeed:void 0,elk:{mergeEdges:!1,nodePlacementStrategy:"BRANDES_KOEPF"},themeCSS:void 0,themeVariables:To.default.getThemeVariables(),sequence:{...ql.sequence,messageFont:o(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont"),noteFont:o(function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},"noteFont"),actorFont:o(function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}},"actorFont")},class:{hideEmptyMembersBox:!1},gantt:{...ql.gantt,tickInterval:void 0,useWidth:void 0},c4:{...ql.c4,useWidth:void 0,personFont:o(function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},"personFont"),external_personFont:o(function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},"external_personFont"),systemFont:o(function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},"systemFont"),external_systemFont:o(function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},"external_systemFont"),system_dbFont:o(function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},"system_dbFont"),external_system_dbFont:o(function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},"external_system_dbFont"),system_queueFont:o(function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},"system_queueFont"),external_system_queueFont:o(function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},"external_system_queueFont"),containerFont:o(function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},"containerFont"),external_containerFont:o(function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},"external_containerFont"),container_dbFont:o(function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},"container_dbFont"),external_container_dbFont:o(function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},"external_container_dbFont"),container_queueFont:o(function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},"container_queueFont"),external_container_queueFont:o(function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},"external_container_queueFont"),componentFont:o(function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},"componentFont"),external_componentFont:o(function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},"external_componentFont"),component_dbFont:o(function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},"component_dbFont"),external_component_dbFont:o(function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},"external_component_dbFont"),component_queueFont:o(function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},"component_queueFont"),external_component_queueFont:o(function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},"external_component_queueFont"),boundaryFont:o(function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},"boundaryFont"),messageFont:o(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont")},pie:{...ql.pie,useWidth:984},xyChart:{...ql.xyChart,useWidth:void 0},requirement:{...ql.requirement,useWidth:void 0},packet:{...ql.packet},radar:{...ql.radar}},F$=o((t,e="")=>Object.keys(t).reduce((r,n)=>Array.isArray(t[n])?r:typeof t[n]=="object"&&t[n]!==null?[...r,e+n,...F$(t[n],"")]:[...r,e+n],[]),"keyify"),$$=new Set(F$(B$,"")),or=B$});var l0,Dxe,e7=N(()=>{"use strict";Ya();vt();l0=o(t=>{if(Y.debug("sanitizeDirective called with",t),!(typeof t!="object"||t==null)){if(Array.isArray(t)){t.forEach(e=>l0(e));return}for(let e of Object.keys(t)){if(Y.debug("Checking key",e),e.startsWith("__")||e.includes("proto")||e.includes("constr")||!$$.has(e)||t[e]==null){Y.debug("sanitize deleting key: ",e),delete t[e];continue}if(typeof t[e]=="object"){Y.debug("sanitizing object",e),l0(t[e]);continue}let r=["themeCSS","fontFamily","altFontFamily"];for(let n of r)e.includes(n)&&(Y.debug("sanitizing css option",e),t[e]=Dxe(t[e]))}if(t.themeVariables)for(let e of Object.keys(t.themeVariables)){let r=t.themeVariables[e];r?.match&&!r.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[e]="")}Y.debug("After sanitization",t)}},"sanitizeDirective"),Dxe=o(t=>{let e=0,r=0;for(let n of t){if(e{"use strict";s0();vt();q4();Ya();e7();lh=Object.freeze(or),xs=Gn({},lh),c0=[],Dy=Gn({},lh),Y4=o((t,e)=>{let r=Gn({},t),n={};for(let i of e)H$(i),n=Gn(n,i);if(r=Gn(r,n),n.theme&&n.theme in To){let i=Gn({},G$),a=Gn(i.themeVariables||{},n.themeVariables);r.theme&&r.theme in To&&(r.themeVariables=To[r.theme].getThemeVariables(a))}return Dy=r,q$(Dy),Dy},"updateCurrentConfig"),t7=o(t=>(xs=Gn({},lh),xs=Gn(xs,t),t.theme&&To[t.theme]&&(xs.themeVariables=To[t.theme].getThemeVariables(t.themeVariables)),Y4(xs,c0),xs),"setSiteConfig"),V$=o(t=>{G$=Gn({},t)},"saveConfigFromInitialize"),U$=o(t=>(xs=Gn(xs,t),Y4(xs,c0),xs),"updateSiteConfig"),r7=o(()=>Gn({},xs),"getSiteConfig"),X4=o(t=>(q$(t),Gn(Dy,t),cr()),"setConfig"),cr=o(()=>Gn({},Dy),"getConfig"),H$=o(t=>{t&&(["secure",...xs.secure??[]].forEach(e=>{Object.hasOwn(t,e)&&(Y.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])}),Object.keys(t).forEach(e=>{e.startsWith("__")&&delete t[e]}),Object.keys(t).forEach(e=>{typeof t[e]=="string"&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],typeof t[e]=="object"&&H$(t[e])}))},"sanitize"),W$=o(t=>{l0(t),t.fontFamily&&!t.themeVariables?.fontFamily&&(t.themeVariables={...t.themeVariables,fontFamily:t.fontFamily}),c0.push(t),Y4(xs,c0)},"addDirective"),Ly=o((t=xs)=>{c0=[],Y4(t,c0)},"reset"),Lxe={LAZY_LOAD_DEPRECATED:"The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead."},z$={},Rxe=o(t=>{z$[t]||(Y.warn(Lxe[t]),z$[t]=!0)},"issueWarning"),q$=o(t=>{t&&(t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&&Rxe("LAZY_LOAD_DEPRECATED")},"checkConfig")});function Ka(t){return function(e){for(var r=arguments.length,n=new Array(r>1?r-1:0),i=1;i2&&arguments[2]!==void 0?arguments[2]:Q4;Y$&&Y$(t,null);let n=e.length;for(;n--;){let i=e[n];if(typeof i=="string"){let a=r(i);a!==i&&(Nxe(e)||(e[n]=a),i=a)}t[i]=!0}return t}function zxe(t){for(let e=0;e0&&arguments[0]!==void 0?arguments[0]:Qxe(),e=o(At=>sz(At),"DOMPurify");if(e.version="3.2.4",e.removed=[],!t||!t.document||t.document.nodeType!==Oy.document||!t.Element)return e.isSupported=!1,e;let{document:r}=t,n=r,i=n.currentScript,{DocumentFragment:a,HTMLTemplateElement:s,Node:l,Element:u,NodeFilter:h,NamedNodeMap:f=t.NamedNodeMap||t.MozNamedAttrMap,HTMLFormElement:d,DOMParser:p,trustedTypes:m}=t,g=u.prototype,y=Iy(g,"cloneNode"),v=Iy(g,"remove"),x=Iy(g,"nextSibling"),b=Iy(g,"childNodes"),w=Iy(g,"parentNode");if(typeof s=="function"){let At=r.createElement("template");At.content&&At.content.ownerDocument&&(r=At.content.ownerDocument)}let C,T="",{implementation:E,createNodeIterator:A,createDocumentFragment:S,getElementsByTagName:_}=r,{importNode:I}=n,D=tz();e.isSupported=typeof rz=="function"&&typeof w=="function"&&E&&E.createHTMLDocument!==void 0;let{MUSTACHE_EXPR:k,ERB_EXPR:L,TMPLIT_EXPR:R,DATA_ATTR:O,ARIA_ATTR:M,IS_SCRIPT_OR_DATA:B,ATTR_WHITESPACE:F,CUSTOM_ELEMENT:P}=ez,{IS_ALLOWED_URI:z}=ez,$=null,H=Cr({},[...K$,...i7,...a7,...s7,...Q$]),Q=null,j=Cr({},[...Z$,...o7,...J$,...K4]),ie=Object.seal(nz(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ne=null,le=null,he=!0,K=!0,X=!1,te=!0,J=!1,se=!0,ue=!1,Z=!1,Se=!1,ce=!1,ae=!1,Oe=!1,ge=!0,ze=!1,He="user-content-",$e=!0,Re=!1,Ie={},be=null,W=Cr({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),de=null,re=Cr({},["audio","video","img","source","image","track"]),oe=null,V=Cr({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),xe="http://www.w3.org/1998/Math/MathML",q="http://www.w3.org/2000/svg",pe="http://www.w3.org/1999/xhtml",ve=pe,Pe=!1,_e=null,we=Cr({},[xe,q,pe],n7),Ve=Cr({},["mi","mo","mn","ms","mtext"]),De=Cr({},["annotation-xml"]),qe=Cr({},["title","style","font","a","script"]),at=null,Rt=["application/xhtml+xml","text/html"],st="text/html",Ue=null,ct=null,We=r.createElement("form"),ot=o(function(Ce){return Ce instanceof RegExp||Ce instanceof Function},"isRegexOrFunction"),Yt=o(function(){let Ce=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(ct&&ct===Ce)){if((!Ce||typeof Ce!="object")&&(Ce={}),Ce=Qf(Ce),at=Rt.indexOf(Ce.PARSER_MEDIA_TYPE)===-1?st:Ce.PARSER_MEDIA_TYPE,Ue=at==="application/xhtml+xml"?n7:Q4,$=sl(Ce,"ALLOWED_TAGS")?Cr({},Ce.ALLOWED_TAGS,Ue):H,Q=sl(Ce,"ALLOWED_ATTR")?Cr({},Ce.ALLOWED_ATTR,Ue):j,_e=sl(Ce,"ALLOWED_NAMESPACES")?Cr({},Ce.ALLOWED_NAMESPACES,n7):we,oe=sl(Ce,"ADD_URI_SAFE_ATTR")?Cr(Qf(V),Ce.ADD_URI_SAFE_ATTR,Ue):V,de=sl(Ce,"ADD_DATA_URI_TAGS")?Cr(Qf(re),Ce.ADD_DATA_URI_TAGS,Ue):re,be=sl(Ce,"FORBID_CONTENTS")?Cr({},Ce.FORBID_CONTENTS,Ue):W,ne=sl(Ce,"FORBID_TAGS")?Cr({},Ce.FORBID_TAGS,Ue):{},le=sl(Ce,"FORBID_ATTR")?Cr({},Ce.FORBID_ATTR,Ue):{},Ie=sl(Ce,"USE_PROFILES")?Ce.USE_PROFILES:!1,he=Ce.ALLOW_ARIA_ATTR!==!1,K=Ce.ALLOW_DATA_ATTR!==!1,X=Ce.ALLOW_UNKNOWN_PROTOCOLS||!1,te=Ce.ALLOW_SELF_CLOSE_IN_ATTR!==!1,J=Ce.SAFE_FOR_TEMPLATES||!1,se=Ce.SAFE_FOR_XML!==!1,ue=Ce.WHOLE_DOCUMENT||!1,ce=Ce.RETURN_DOM||!1,ae=Ce.RETURN_DOM_FRAGMENT||!1,Oe=Ce.RETURN_TRUSTED_TYPE||!1,Se=Ce.FORCE_BODY||!1,ge=Ce.SANITIZE_DOM!==!1,ze=Ce.SANITIZE_NAMED_PROPS||!1,$e=Ce.KEEP_CONTENT!==!1,Re=Ce.IN_PLACE||!1,z=Ce.ALLOWED_URI_REGEXP||iz,ve=Ce.NAMESPACE||pe,Ve=Ce.MATHML_TEXT_INTEGRATION_POINTS||Ve,De=Ce.HTML_INTEGRATION_POINTS||De,ie=Ce.CUSTOM_ELEMENT_HANDLING||{},Ce.CUSTOM_ELEMENT_HANDLING&&ot(Ce.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(ie.tagNameCheck=Ce.CUSTOM_ELEMENT_HANDLING.tagNameCheck),Ce.CUSTOM_ELEMENT_HANDLING&&ot(Ce.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(ie.attributeNameCheck=Ce.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),Ce.CUSTOM_ELEMENT_HANDLING&&typeof Ce.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(ie.allowCustomizedBuiltInElements=Ce.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),J&&(K=!1),ae&&(ce=!0),Ie&&($=Cr({},Q$),Q=[],Ie.html===!0&&(Cr($,K$),Cr(Q,Z$)),Ie.svg===!0&&(Cr($,i7),Cr(Q,o7),Cr(Q,K4)),Ie.svgFilters===!0&&(Cr($,a7),Cr(Q,o7),Cr(Q,K4)),Ie.mathMl===!0&&(Cr($,s7),Cr(Q,J$),Cr(Q,K4))),Ce.ADD_TAGS&&($===H&&($=Qf($)),Cr($,Ce.ADD_TAGS,Ue)),Ce.ADD_ATTR&&(Q===j&&(Q=Qf(Q)),Cr(Q,Ce.ADD_ATTR,Ue)),Ce.ADD_URI_SAFE_ATTR&&Cr(oe,Ce.ADD_URI_SAFE_ATTR,Ue),Ce.FORBID_CONTENTS&&(be===W&&(be=Qf(be)),Cr(be,Ce.FORBID_CONTENTS,Ue)),$e&&($["#text"]=!0),ue&&Cr($,["html","head","body"]),$.table&&(Cr($,["tbody"]),delete ne.tbody),Ce.TRUSTED_TYPES_POLICY){if(typeof Ce.TRUSTED_TYPES_POLICY.createHTML!="function")throw My('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof Ce.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw My('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');C=Ce.TRUSTED_TYPES_POLICY,T=C.createHTML("")}else C===void 0&&(C=Zxe(m,i)),C!==null&&typeof T=="string"&&(T=C.createHTML(""));ja&&ja(Ce),ct=Ce}},"_parseConfig"),bt=Cr({},[...i7,...a7,...Gxe]),Mt=Cr({},[...s7,...Vxe]),xt=o(function(Ce){let tt=w(Ce);(!tt||!tt.tagName)&&(tt={namespaceURI:ve,tagName:"template"});let St=Q4(Ce.tagName),mr=Q4(tt.tagName);return _e[Ce.namespaceURI]?Ce.namespaceURI===q?tt.namespaceURI===pe?St==="svg":tt.namespaceURI===xe?St==="svg"&&(mr==="annotation-xml"||Ve[mr]):!!bt[St]:Ce.namespaceURI===xe?tt.namespaceURI===pe?St==="math":tt.namespaceURI===q?St==="math"&&De[mr]:!!Mt[St]:Ce.namespaceURI===pe?tt.namespaceURI===q&&!De[mr]||tt.namespaceURI===xe&&!Ve[mr]?!1:!Mt[St]&&(qe[St]||!bt[St]):!!(at==="application/xhtml+xml"&&_e[Ce.namespaceURI]):!1},"_checkValidNamespace"),ut=o(function(Ce){Ry(e.removed,{element:Ce});try{w(Ce).removeChild(Ce)}catch{v(Ce)}},"_forceRemove"),Et=o(function(Ce,tt){try{Ry(e.removed,{attribute:tt.getAttributeNode(Ce),from:tt})}catch{Ry(e.removed,{attribute:null,from:tt})}if(tt.removeAttribute(Ce),Ce==="is")if(ce||ae)try{ut(tt)}catch{}else try{tt.setAttribute(Ce,"")}catch{}},"_removeAttribute"),ft=o(function(Ce){let tt=null,St=null;if(Se)Ce=""+Ce;else{let gn=j$(Ce,/^[\r\n\t ]+/);St=gn&&gn[0]}at==="application/xhtml+xml"&&ve===pe&&(Ce=''+Ce+"");let mr=C?C.createHTML(Ce):Ce;if(ve===pe)try{tt=new p().parseFromString(mr,at)}catch{}if(!tt||!tt.documentElement){tt=E.createDocument(ve,"template",null);try{tt.documentElement.innerHTML=Pe?T:mr}catch{}}let rn=tt.body||tt.documentElement;return Ce&&St&&rn.insertBefore(r.createTextNode(St),rn.childNodes[0]||null),ve===pe?_.call(tt,ue?"html":"body")[0]:ue?tt.documentElement:rn},"_initDocument"),yt=o(function(Ce){return A.call(Ce.ownerDocument||Ce,Ce,h.SHOW_ELEMENT|h.SHOW_COMMENT|h.SHOW_TEXT|h.SHOW_PROCESSING_INSTRUCTION|h.SHOW_CDATA_SECTION,null)},"_createNodeIterator"),nt=o(function(Ce){return Ce instanceof d&&(typeof Ce.nodeName!="string"||typeof Ce.textContent!="string"||typeof Ce.removeChild!="function"||!(Ce.attributes instanceof f)||typeof Ce.removeAttribute!="function"||typeof Ce.setAttribute!="function"||typeof Ce.namespaceURI!="string"||typeof Ce.insertBefore!="function"||typeof Ce.hasChildNodes!="function")},"_isClobbered"),dn=o(function(Ce){return typeof l=="function"&&Ce instanceof l},"_isNode");function Tt(At,Ce,tt){j4(At,St=>{St.call(e,Ce,tt,ct)})}o(Tt,"_executeHooks");let On=o(function(Ce){let tt=null;if(Tt(D.beforeSanitizeElements,Ce,null),nt(Ce))return ut(Ce),!0;let St=Ue(Ce.nodeName);if(Tt(D.uponSanitizeElement,Ce,{tagName:St,allowedTags:$}),Ce.hasChildNodes()&&!dn(Ce.firstElementChild)&&Xa(/<[/\w]/g,Ce.innerHTML)&&Xa(/<[/\w]/g,Ce.textContent)||Ce.nodeType===Oy.progressingInstruction||se&&Ce.nodeType===Oy.comment&&Xa(/<[/\w]/g,Ce.data))return ut(Ce),!0;if(!$[St]||ne[St]){if(!ne[St]&&_r(St)&&(ie.tagNameCheck instanceof RegExp&&Xa(ie.tagNameCheck,St)||ie.tagNameCheck instanceof Function&&ie.tagNameCheck(St)))return!1;if($e&&!be[St]){let mr=w(Ce)||Ce.parentNode,rn=b(Ce)||Ce.childNodes;if(rn&&mr){let gn=rn.length;for(let Zr=gn-1;Zr>=0;--Zr){let Ni=y(rn[Zr],!0);Ni.__removalCount=(Ce.__removalCount||0)+1,mr.insertBefore(Ni,x(Ce))}}}return ut(Ce),!0}return Ce instanceof u&&!xt(Ce)||(St==="noscript"||St==="noembed"||St==="noframes")&&Xa(/<\/no(script|embed|frames)/i,Ce.innerHTML)?(ut(Ce),!0):(J&&Ce.nodeType===Oy.text&&(tt=Ce.textContent,j4([k,L,R],mr=>{tt=Ny(tt,mr," ")}),Ce.textContent!==tt&&(Ry(e.removed,{element:Ce.cloneNode()}),Ce.textContent=tt)),Tt(D.afterSanitizeElements,Ce,null),!1)},"_sanitizeElements"),tn=o(function(Ce,tt,St){if(ge&&(tt==="id"||tt==="name")&&(St in r||St in We))return!1;if(!(K&&!le[tt]&&Xa(O,tt))){if(!(he&&Xa(M,tt))){if(!Q[tt]||le[tt]){if(!(_r(Ce)&&(ie.tagNameCheck instanceof RegExp&&Xa(ie.tagNameCheck,Ce)||ie.tagNameCheck instanceof Function&&ie.tagNameCheck(Ce))&&(ie.attributeNameCheck instanceof RegExp&&Xa(ie.attributeNameCheck,tt)||ie.attributeNameCheck instanceof Function&&ie.attributeNameCheck(tt))||tt==="is"&&ie.allowCustomizedBuiltInElements&&(ie.tagNameCheck instanceof RegExp&&Xa(ie.tagNameCheck,St)||ie.tagNameCheck instanceof Function&&ie.tagNameCheck(St))))return!1}else if(!oe[tt]){if(!Xa(z,Ny(St,F,""))){if(!((tt==="src"||tt==="xlink:href"||tt==="href")&&Ce!=="script"&&Bxe(St,"data:")===0&&de[Ce])){if(!(X&&!Xa(B,Ny(St,F,"")))){if(St)return!1}}}}}}return!0},"_isValidAttribute"),_r=o(function(Ce){return Ce!=="annotation-xml"&&j$(Ce,P)},"_isBasicCustomElement"),Dr=o(function(Ce){Tt(D.beforeSanitizeAttributes,Ce,null);let{attributes:tt}=Ce;if(!tt||nt(Ce))return;let St={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Q,forceKeepAttr:void 0},mr=tt.length;for(;mr--;){let rn=tt[mr],{name:gn,namespaceURI:Zr,value:Ni}=rn,Zn=Ue(gn),Sn=gn==="value"?Ni:Fxe(Ni);if(St.attrName=Zn,St.attrValue=Sn,St.keepAttr=!0,St.forceKeepAttr=void 0,Tt(D.uponSanitizeAttribute,Ce,St),Sn=St.attrValue,ze&&(Zn==="id"||Zn==="name")&&(Et(gn,Ce),Sn=He+Sn),se&&Xa(/((--!?|])>)|<\/(style|title)/i,Sn)){Et(gn,Ce);continue}if(St.forceKeepAttr||(Et(gn,Ce),!St.keepAttr))continue;if(!te&&Xa(/\/>/i,Sn)){Et(gn,Ce);continue}J&&j4([k,L,R],et=>{Sn=Ny(Sn,et," ")});let Hr=Ue(Ce.nodeName);if(tn(Hr,Zn,Sn)){if(C&&typeof m=="object"&&typeof m.getAttributeType=="function"&&!Zr)switch(m.getAttributeType(Hr,Zn)){case"TrustedHTML":{Sn=C.createHTML(Sn);break}case"TrustedScriptURL":{Sn=C.createScriptURL(Sn);break}}try{Zr?Ce.setAttributeNS(Zr,gn,Sn):Ce.setAttribute(gn,Sn),nt(Ce)?ut(Ce):X$(e.removed)}catch{}}}Tt(D.afterSanitizeAttributes,Ce,null)},"_sanitizeAttributes"),Pn=o(function At(Ce){let tt=null,St=yt(Ce);for(Tt(D.beforeSanitizeShadowDOM,Ce,null);tt=St.nextNode();)Tt(D.uponSanitizeShadowNode,tt,null),On(tt),Dr(tt),tt.content instanceof a&&At(tt.content);Tt(D.afterSanitizeShadowDOM,Ce,null)},"_sanitizeShadowDOM");return e.sanitize=function(At){let Ce=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},tt=null,St=null,mr=null,rn=null;if(Pe=!At,Pe&&(At=""),typeof At!="string"&&!dn(At))if(typeof At.toString=="function"){if(At=At.toString(),typeof At!="string")throw My("dirty is not a string, aborting")}else throw My("toString is not a function");if(!e.isSupported)return At;if(Z||Yt(Ce),e.removed=[],typeof At=="string"&&(Re=!1),Re){if(At.nodeName){let Ni=Ue(At.nodeName);if(!$[Ni]||ne[Ni])throw My("root node is forbidden and cannot be sanitized in-place")}}else if(At instanceof l)tt=ft(""),St=tt.ownerDocument.importNode(At,!0),St.nodeType===Oy.element&&St.nodeName==="BODY"||St.nodeName==="HTML"?tt=St:tt.appendChild(St);else{if(!ce&&!J&&!ue&&At.indexOf("<")===-1)return C&&Oe?C.createHTML(At):At;if(tt=ft(At),!tt)return ce?null:Oe?T:""}tt&&Se&&ut(tt.firstChild);let gn=yt(Re?At:tt);for(;mr=gn.nextNode();)On(mr),Dr(mr),mr.content instanceof a&&Pn(mr.content);if(Re)return At;if(ce){if(ae)for(rn=S.call(tt.ownerDocument);tt.firstChild;)rn.appendChild(tt.firstChild);else rn=tt;return(Q.shadowroot||Q.shadowrootmode)&&(rn=I.call(n,rn,!0)),rn}let Zr=ue?tt.outerHTML:tt.innerHTML;return ue&&$["!doctype"]&&tt.ownerDocument&&tt.ownerDocument.doctype&&tt.ownerDocument.doctype.name&&Xa(az,tt.ownerDocument.doctype.name)&&(Zr=" +`+Zr),J&&j4([k,L,R],Ni=>{Zr=Ny(Zr,Ni," ")}),C&&Oe?C.createHTML(Zr):Zr},e.setConfig=function(){let At=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Yt(At),Z=!0},e.clearConfig=function(){ct=null,Z=!1},e.isValidAttribute=function(At,Ce,tt){ct||Yt({});let St=Ue(At),mr=Ue(Ce);return tn(St,mr,tt)},e.addHook=function(At,Ce){typeof Ce=="function"&&Ry(D[At],Ce)},e.removeHook=function(At,Ce){if(Ce!==void 0){let tt=Oxe(D[At],Ce);return tt===-1?void 0:Pxe(D[At],tt,1)[0]}return X$(D[At])},e.removeHooks=function(At){D[At]=[]},e.removeAllHooks=function(){D=tz()},e}var rz,Y$,Nxe,Mxe,Ixe,ja,ko,nz,l7,c7,j4,Oxe,X$,Ry,Pxe,Q4,n7,j$,Ny,Bxe,Fxe,sl,Xa,My,K$,i7,a7,Gxe,s7,Vxe,Q$,Z$,o7,J$,K4,Uxe,Hxe,Wxe,qxe,Yxe,iz,Xxe,jxe,az,Kxe,ez,Oy,Qxe,Zxe,tz,ch,u7=N(()=>{"use strict";({entries:rz,setPrototypeOf:Y$,isFrozen:Nxe,getPrototypeOf:Mxe,getOwnPropertyDescriptor:Ixe}=Object),{freeze:ja,seal:ko,create:nz}=Object,{apply:l7,construct:c7}=typeof Reflect<"u"&&Reflect;ja||(ja=o(function(e){return e},"freeze"));ko||(ko=o(function(e){return e},"seal"));l7||(l7=o(function(e,r,n){return e.apply(r,n)},"apply"));c7||(c7=o(function(e,r){return new e(...r)},"construct"));j4=Ka(Array.prototype.forEach),Oxe=Ka(Array.prototype.lastIndexOf),X$=Ka(Array.prototype.pop),Ry=Ka(Array.prototype.push),Pxe=Ka(Array.prototype.splice),Q4=Ka(String.prototype.toLowerCase),n7=Ka(String.prototype.toString),j$=Ka(String.prototype.match),Ny=Ka(String.prototype.replace),Bxe=Ka(String.prototype.indexOf),Fxe=Ka(String.prototype.trim),sl=Ka(Object.prototype.hasOwnProperty),Xa=Ka(RegExp.prototype.test),My=$xe(TypeError);o(Ka,"unapply");o($xe,"unconstruct");o(Cr,"addToSet");o(zxe,"cleanArray");o(Qf,"clone");o(Iy,"lookupGetter");K$=ja(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),i7=ja(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),a7=ja(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),Gxe=ja(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),s7=ja(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),Vxe=ja(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),Q$=ja(["#text"]),Z$=ja(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),o7=ja(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),J$=ja(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),K4=ja(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),Uxe=ko(/\{\{[\w\W]*|[\w\W]*\}\}/gm),Hxe=ko(/<%[\w\W]*|[\w\W]*%>/gm),Wxe=ko(/\$\{[\w\W]*/gm),qxe=ko(/^data-[\-\w.\u00B7-\uFFFF]+$/),Yxe=ko(/^aria-[\-\w]+$/),iz=ko(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Xxe=ko(/^(?:\w+script|data):/i),jxe=ko(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),az=ko(/^html$/i),Kxe=ko(/^[a-z][.\w]*(-[.\w]+)+$/i),ez=Object.freeze({__proto__:null,ARIA_ATTR:Yxe,ATTR_WHITESPACE:jxe,CUSTOM_ELEMENT:Kxe,DATA_ATTR:qxe,DOCTYPE_NAME:az,ERB_EXPR:Hxe,IS_ALLOWED_URI:iz,IS_SCRIPT_OR_DATA:Xxe,MUSTACHE_EXPR:Uxe,TMPLIT_EXPR:Wxe}),Oy={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},Qxe=o(function(){return typeof window>"u"?null:window},"getGlobal"),Zxe=o(function(e,r){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let n=null,i="data-tt-policy-suffix";r&&r.hasAttribute(i)&&(n=r.getAttribute(i));let a="dompurify"+(n?"#"+n:"");try{return e.createPolicy(a,{createHTML(s){return s},createScriptURL(s){return s}})}catch{return console.warn("TrustedTypes policy "+a+" could not be created."),null}},"_createTrustedTypesPolicy"),tz=o(function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},"_createHooksMap");o(sz,"createDOMPurify");ch=sz()});var MG={};hr(MG,{default:()=>q4e});function abe(t){return String(t).replace(ibe,e=>nbe[e])}function cbe(t){if(t.default)return t.default;var e=t.type,r=Array.isArray(e)?e[0]:e;if(typeof r!="string")return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}function gbe(t){for(var e=0;e=i[0]&&t<=i[1])return r.name}return null}function $z(t){for(var e=0;e=u3[e]&&t<=u3[e+1])return!0;return!1}function Abe(t,e){jl[t]=e}function P7(t,e,r){if(!jl[e])throw new Error("Font metrics not found for font: "+e+".");var n=t.charCodeAt(0),i=jl[e][n];if(!i&&t[0]in lz&&(n=lz[t[0]].charCodeAt(0),i=jl[e][n]),!i&&r==="text"&&$z(n)&&(i=jl[e][77]),i)return{depth:i[0],height:i[1],italic:i[2],skew:i[3],width:i[4]}}function _be(t){var e;if(t>=5?e=0:t>=3?e=1:e=2,!h7[e]){var r=h7[e]={cssEmPerMu:Z4.quad[e]/18};for(var n in Z4)Z4.hasOwnProperty(n)&&(r[n]=Z4[n][e])}return h7[e]}function hz(t){if(t instanceof Ts)return t;throw new Error("Expected symbolNode but got "+String(t)+".")}function Nbe(t){if(t instanceof td)return t;throw new Error("Expected span but got "+String(t)+".")}function G(t,e,r,n,i,a){An[t][i]={font:e,group:r,replace:n},a&&n&&(An[t][n]=An[t][i])}function Nt(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,l={type:e,numArgs:n.numArgs,argTypes:n.argTypes,allowedInArgument:!!n.allowedInArgument,allowedInText:!!n.allowedInText,allowedInMath:n.allowedInMath===void 0?!0:n.allowedInMath,numOptionalArgs:n.numOptionalArgs||0,infix:!!n.infix,primitive:!!n.primitive,handler:i},u=0;u0&&(a.push(a3(s,e)),s=[]),a.push(n[l]));s.length>0&&a.push(a3(s,e));var h;r?(h=a3(Pi(r,e,!0)),h.classes=["tag"],a.push(h)):i&&a.push(i);var f=lu(["katex-html"],a);if(f.setAttribute("aria-hidden","true"),h){var d=h.children[0];d.style.height=kt(f.height+f.depth),f.depth&&(d.style.verticalAlign=kt(-f.depth))}return f}function Qz(t){return new ed(t)}function gz(t,e,r,n,i){var a=ks(t,r),s;a.length===1&&a[0]instanceof ws&&Jt.contains(["mrow","mtable"],a[0].type)?s=a[0]:s=new dt.MathNode("mrow",a);var l=new dt.MathNode("annotation",[new dt.TextNode(e)]);l.setAttribute("encoding","application/x-tex");var u=new dt.MathNode("semantics",[s,l]),h=new dt.MathNode("math",[u]);h.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&h.setAttribute("display","block");var f=i?"katex":"katex-mathml";return Be.makeSpan([f],[h])}function xr(t,e){if(!t||t.type!==e)throw new Error("Expected node of type "+e+", but got "+(t?"node of type "+t.type:String(t)));return t}function z7(t){var e=w3(t);if(!e)throw new Error("Expected node of symbol group type, but got "+(t?"node of type "+t.type:String(t)));return e}function w3(t){return t&&(t.type==="atom"||Ibe.hasOwnProperty(t.type))?t:null}function tG(t,e){var r=Pi(t.body,e,!0);return u4e([t.mclass],r,e)}function rG(t,e){var r,n=ks(t.body,e);return t.mclass==="minner"?r=new dt.MathNode("mpadded",n):t.mclass==="mord"?t.isCharacterBox?(r=n[0],r.type="mi"):r=new dt.MathNode("mi",n):(t.isCharacterBox?(r=n[0],r.type="mo"):r=new dt.MathNode("mo",n),t.mclass==="mbin"?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):t.mclass==="mpunct"?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):t.mclass==="mopen"||t.mclass==="mclose"?(r.attributes.lspace="0em",r.attributes.rspace="0em"):t.mclass==="minner"&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em")),r}function d4e(t,e,r){var n=h4e[t];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[e[0]],[e[1]]);case"\\uparrow":case"\\downarrow":{var i=r.callFunction("\\\\cdleft",[e[0]],[]),a={type:"atom",text:n,mode:"math",family:"rel"},s=r.callFunction("\\Big",[a],[]),l=r.callFunction("\\\\cdright",[e[1]],[]),u={type:"ordgroup",mode:"math",body:[i,s,l]};return r.callFunction("\\\\cdparent",[u],[])}case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var h={type:"textord",text:"\\Vert",mode:"math"};return r.callFunction("\\Big",[h],[])}default:return{type:"textord",text:" ",mode:"math"}}}function p4e(t){var e=[];for(t.gullet.beginGroup(),t.gullet.macros.set("\\cr","\\\\\\relax"),t.gullet.beginGroup();;){e.push(t.parseExpression(!1,"\\\\")),t.gullet.endGroup(),t.gullet.beginGroup();var r=t.fetch().text;if(r==="&"||r==="\\\\")t.consume();else if(r==="\\end"){e[e.length-1].length===0&&e.pop();break}else throw new gt("Expected \\\\ or \\cr or \\end",t.nextToken)}for(var n=[],i=[n],a=0;a-1))if("<>AV".indexOf(h)>-1)for(var d=0;d<2;d++){for(var p=!0,m=u+1;mAV=|." after @',s[u]);var g=d4e(h,f,t),y={type:"styling",body:[g],mode:"math",style:"display"};n.push(y),l=yz()}a%2===0?n.push(l):n.shift(),n=[],i.push(n)}t.gullet.endGroup(),t.gullet.endGroup();var v=new Array(i[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:i,arraystretch:1,addJot:!0,rowGaps:[null],cols:v,colSeparationType:"CD",hLinesBeforeRow:new Array(i.length+1).fill([])}}function k3(t,e){var r=w3(t);if(r&&Jt.contains(A4e,r.text))return r;throw r?new gt("Invalid delimiter '"+r.text+"' after '"+e.funcName+"'",t):new gt("Invalid delimiter type '"+t.type+"'",t)}function bz(t){if(!t.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}function Ql(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,l={type:e,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:i},u=0;u1||!f)&&y.pop(),x.length{"use strict";Xs=class t{static{o(this,"SourceLocation")}constructor(e,r,n){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=e,this.start=r,this.end=n}static range(e,r){return r?!e||!e.loc||!r.loc||e.loc.lexer!==r.loc.lexer?null:new t(e.loc.lexer,e.loc.start,r.loc.end):e&&e.loc}},So=class t{static{o(this,"Token")}constructor(e,r){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=e,this.loc=r}range(e,r){return new t(r,Xs.range(this,e))}},gt=class t{static{o(this,"ParseError")}constructor(e,r){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;var n="KaTeX parse error: "+e,i,a,s=r&&r.loc;if(s&&s.start<=s.end){var l=s.lexer.input;i=s.start,a=s.end,i===l.length?n+=" at end of input: ":n+=" at position "+(i+1)+": ";var u=l.slice(i,a).replace(/[^]/g,"$&\u0332"),h;i>15?h="\u2026"+l.slice(i-15,i):h=l.slice(0,i);var f;a+15":">","<":"<",'"':""","'":"'"},ibe=/[&><"']/g;o(abe,"escape");Fz=o(function t(e){return e.type==="ordgroup"||e.type==="color"?e.body.length===1?t(e.body[0]):e:e.type==="font"?t(e.body):e},"getBaseElem"),sbe=o(function(e){var r=Fz(e);return r.type==="mathord"||r.type==="textord"||r.type==="atom"},"isCharacterBox"),obe=o(function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e},"assert"),lbe=o(function(e){var r=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return r?r[2]!==":"||!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(r[1])?null:r[1].toLowerCase():"_relative"},"protocolFromUrl"),Jt={contains:Jxe,deflt:ebe,escape:abe,hyphenate:rbe,getBaseElem:Fz,isCharacterBox:sbe,protocolFromUrl:lbe},c3={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:o(t=>"#"+t,"cliProcessor")},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:o((t,e)=>(e.push(t),e),"cliProcessor")},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:o(t=>Math.max(0,t),"processor"),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:o(t=>Math.max(0,t),"processor"),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:o(t=>Math.max(0,t),"processor"),cli:"-e, --max-expand ",cliProcessor:o(t=>t==="Infinity"?1/0:parseInt(t),"cliProcessor")},globalGroup:{type:"boolean",cli:!1}};o(cbe,"getDefaultValue");zy=class{static{o(this,"Settings")}constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(var r in c3)if(c3.hasOwnProperty(r)){var n=c3[r];this[r]=e[r]!==void 0?n.processor?n.processor(e[r]):e[r]:cbe(n)}}reportNonstrict(e,r,n){var i=this.strict;if(typeof i=="function"&&(i=i(e,r,n)),!(!i||i==="ignore")){if(i===!0||i==="error")throw new gt("LaTeX-incompatible input and strict mode is set to 'error': "+(r+" ["+e+"]"),n);i==="warn"?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]"))}}useStrictBehavior(e,r,n){var i=this.strict;if(typeof i=="function")try{i=i(e,r,n)}catch{i="error"}return!i||i==="ignore"?!1:i===!0||i==="error"?!0:i==="warn"?(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")),!1):(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]")),!1)}isTrusted(e){if(e.url&&!e.protocol){var r=Jt.protocolFromUrl(e.url);if(r==null)return!1;e.protocol=r}var n=typeof this.trust=="function"?this.trust(e):this.trust;return!!n}},Yl=class{static{o(this,"Style")}constructor(e,r,n){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=r,this.cramped=n}sup(){return Xl[ube[this.id]]}sub(){return Xl[hbe[this.id]]}fracNum(){return Xl[fbe[this.id]]}fracDen(){return Xl[dbe[this.id]]}cramp(){return Xl[pbe[this.id]]}text(){return Xl[mbe[this.id]]}isTight(){return this.size>=2}},O7=0,h3=1,f0=2,su=3,Gy=4,Eo=5,d0=6,Qa=7,Xl=[new Yl(O7,0,!1),new Yl(h3,0,!0),new Yl(f0,1,!1),new Yl(su,1,!0),new Yl(Gy,2,!1),new Yl(Eo,2,!0),new Yl(d0,3,!1),new Yl(Qa,3,!0)],ube=[Gy,Eo,Gy,Eo,d0,Qa,d0,Qa],hbe=[Eo,Eo,Eo,Eo,Qa,Qa,Qa,Qa],fbe=[f0,su,Gy,Eo,d0,Qa,d0,Qa],dbe=[su,su,Eo,Eo,Qa,Qa,Qa,Qa],pbe=[h3,h3,su,su,Eo,Eo,Qa,Qa],mbe=[O7,h3,f0,su,f0,su,f0,su],tr={DISPLAY:Xl[O7],TEXT:Xl[f0],SCRIPT:Xl[Gy],SCRIPTSCRIPT:Xl[d0]},k7=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];o(gbe,"scriptFromCodepoint");u3=[];k7.forEach(t=>t.blocks.forEach(e=>u3.push(...e)));o($z,"supportedCodepoint");h0=80,ybe=o(function(e,r){return"M95,"+(622+e+r)+` +c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14 +c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54 +c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10 +s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429 +c69,-144,104.5,-217.7,106.5,-221 +l`+e/2.075+" -"+e+` +c5.3,-9.3,12,-14,20,-14 +H400000v`+(40+e)+`H845.2724 +s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7 +c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z +M`+(834+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtMain"),vbe=o(function(e,r){return"M263,"+(601+e+r)+`c0.7,0,18,39.7,52,119 +c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120 +c340,-704.7,510.7,-1060.3,512,-1067 +l`+e/2.084+" -"+e+` +c4.7,-7.3,11,-11,19,-11 +H40000v`+(40+e)+`H1012.3 +s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232 +c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1 +s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26 +c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z +M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtSize1"),xbe=o(function(e,r){return"M983 "+(10+e+r)+` +l`+e/3.13+" -"+e+` +c4,-6.7,10,-10,18,-10 H400000v`+(40+e)+` +H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7 +s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744 +c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30 +c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722 +c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5 +c53.7,-170.3,84.5,-266.8,92.5,-289.5z +M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtSize2"),bbe=o(function(e,r){return"M424,"+(2398+e+r)+` +c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514 +c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20 +s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121 +s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081 +l`+e/4.223+" -"+e+`c4,-6.7,10,-10,18,-10 H400000 +v`+(40+e)+`H1014.6 +s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185 +c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2z M`+(1001+e)+" "+r+` +h400000v`+(40+e)+"h-400000z"},"sqrtSize3"),wbe=o(function(e,r){return"M473,"+(2713+e+r)+` +c339.3,-1799.3,509.3,-2700,510,-2702 l`+e/5.298+" -"+e+` +c3.3,-7.3,9.3,-11,18,-11 H400000v`+(40+e)+`H1017.7 +s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9 +c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200 +c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26 +s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104, +606zM`+(1001+e)+" "+r+"h400000v"+(40+e)+"H1017.7z"},"sqrtSize4"),Tbe=o(function(e){var r=e/2;return"M400000 "+e+" H0 L"+r+" 0 l65 45 L145 "+(e-80)+" H400000z"},"phasePath"),kbe=o(function(e,r,n){var i=n-54-r-e;return"M702 "+(e+r)+"H400000"+(40+e)+` +H742v`+i+`l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1 +h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170 +c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667 +219 661 l218 661zM702 `+r+"H400000v"+(40+e)+"H742z"},"sqrtTall"),Ebe=o(function(e,r,n){r=1e3*r;var i="";switch(e){case"sqrtMain":i=ybe(r,h0);break;case"sqrtSize1":i=vbe(r,h0);break;case"sqrtSize2":i=xbe(r,h0);break;case"sqrtSize3":i=bbe(r,h0);break;case"sqrtSize4":i=wbe(r,h0);break;case"sqrtTall":i=kbe(r,h0,n)}return i},"sqrtPath"),Sbe=o(function(e,r){switch(e){case"\u239C":return"M291 0 H417 V"+r+" H291z M291 0 H417 V"+r+" H291z";case"\u2223":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z";case"\u2225":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z"+("M367 0 H410 V"+r+" H367z M367 0 H410 V"+r+" H367z");case"\u239F":return"M457 0 H583 V"+r+" H457z M457 0 H583 V"+r+" H457z";case"\u23A2":return"M319 0 H403 V"+r+" H319z M319 0 H403 V"+r+" H319z";case"\u23A5":return"M263 0 H347 V"+r+" H263z M263 0 H347 V"+r+" H263z";case"\u23AA":return"M384 0 H504 V"+r+" H384z M384 0 H504 V"+r+" H384z";case"\u23D0":return"M312 0 H355 V"+r+" H312z M312 0 H355 V"+r+" H312z";case"\u2016":return"M257 0 H300 V"+r+" H257z M257 0 H300 V"+r+" H257z"+("M478 0 H521 V"+r+" H478z M478 0 H521 V"+r+" H478z");default:return""}},"innerPath"),oz={doubleleftarrow:`M262 157 +l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3 + 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28 + 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5 +c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5 + 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87 +-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7 +-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z +m8 0v40h399730v-40zm0 194v40h399730v-40z`,doublerightarrow:`M399738 392l +-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5 + 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88 +-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68 +-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18 +-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782 +c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3 +-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,leftarrow:`M400000 241H110l3-3c68.7-52.7 113.7-120 + 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8 +-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247 +c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208 + 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3 + 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202 + l-3-3h399890zM100 241v40h399900v-40z`,leftbrace:`M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117 +-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 + 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,leftbraceunder:`M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 + 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 + 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7 +-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,leftgroup:`M400000 80 +H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0 + 435 0h399565z`,leftgroupunder:`M400000 262 +H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219 + 435 219h399565z`,leftharpoon:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3 +-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5 +-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7 +-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,leftharpoonplus:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5 + 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3 +-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7 +-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z +m0 0v40h400000v-40z`,leftharpoondown:`M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333 + 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5 + 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667 +-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,leftharpoondownplus:`M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12 + 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7 +-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0 +v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,lefthook:`M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5 +-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3 +-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21 + 71.5 23h399859zM103 281v-40h399897v40z`,leftlinesegment:`M40 281 V428 H0 V94 H40 V241 H400000 v40z +M40 281 V428 H0 V94 H40 V241 H400000 v40z`,leftmapsto:`M40 281 V448H0V74H40V241H400000v40z +M40 281 V448H0V74H40V241H400000v40z`,leftToFrom:`M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23 +-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8 +c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3 + 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,longequal:`M0 50 h400000 v40H0z m0 194h40000v40H0z +M0 50 h400000 v40H0z m0 194h40000v40H0z`,midbrace:`M200428 334 +c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14 +-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 + 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 + 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,midbraceunder:`M199572 214 +c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 + 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 + 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0 +-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,oiintSize1:`M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6 +-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z +m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8 +60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,oiintSize2:`M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8 +-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z +m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2 +c0 110 84 276 504 276s502.4-166 502.4-276z`,oiiintSize1:`M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6 +-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z +m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0 +85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,oiiintSize2:`M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8 +-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z +m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1 +c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,rightarrow:`M0 241v40h399891c-47.3 35.3-84 78-110 128 +-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 + 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 + 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85 +-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 + 151.7 139 205zm0 0v40h399900v-40z`,rightbrace:`M400000 542l +-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5 +s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1 +c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,rightbraceunder:`M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 + 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237 +-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,rightgroup:`M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0 + 3-1 3-3v-38c-76-158-257-219-435-219H0z`,rightgroupunder:`M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18 + 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,rightharpoon:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3 +-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2 +-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 + 69.2 92 94.5zm0 0v40h399900v-40z`,rightharpoonplus:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11 +-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7 + 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z +m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,rightharpoondown:`M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8 + 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5 +-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95 +-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,rightharpoondownplus:`M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8 + 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 + 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3 +-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z +m0-194v40h400000v-40zm0 0v40h400000v-40z`,righthook:`M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3 + 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0 +-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21 + 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,rightlinesegment:`M399960 241 V94 h40 V428 h-40 V281 H0 v-40z +M399960 241 V94 h40 V428 h-40 V281 H0 v-40z`,rightToFrom:`M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23 + 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32 +-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142 +-167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,twoheadleftarrow:`M0 167c68 40 + 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69 +-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3 +-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19 +-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101 + 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,twoheadrightarrow:`M400000 167 +c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3 + 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42 + 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333 +-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70 + 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,tilde1:`M200 55.538c-77 0-168 73.953-177 73.953-3 0-7 +-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0 + 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0 + 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128 +-68.267.847-113-73.952-191-73.952z`,tilde2:`M344 55.266c-142 0-300.638 81.316-311.5 86.418 +-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9 + 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114 +c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751 + 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,tilde3:`M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457 +-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0 + 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697 + 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696 + -338 0-409-156.573-744-156.573z`,tilde4:`M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345 +-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409 + 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9 + 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409 + -175.236-744-175.236z`,vec:`M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 +3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 +10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 +-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 +-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 +H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 +c-16-25.333-24-45-24-59z`,widehat1:`M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22 +c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,widehat2:`M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat3:`M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat4:`M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10 +-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widecheck1:`M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1, +-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,widecheck2:`M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck3:`M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck4:`M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, +-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,baraboveleftarrow:`M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202 +c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5 +c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130 +s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47 +121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6 +s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11 +c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z +M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,rightarrowabovebar:`M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32 +-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 +13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39 +-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5 +-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 +-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 +151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,baraboveshortleftharpoon:`M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17 +c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21 +c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40 +c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z +M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,rightharpoonaboveshortbar:`M0,241 l0,40c399126,0,399993,0,399993,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,shortbaraboveleftharpoon:`M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 +c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9, +1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7, +-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z +M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,shortrightharpoonabovebar:`M53,241l0,40c398570,0,399437,0,399437,0 +c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, +-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 +c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z +M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`},Cbe=o(function(e,r){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v1759 h347 v-84 +H403z M403 1759 V0 H319 V1759 v`+r+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v1759 H0 v84 H347z +M347 1759 V0 H263 V1759 v`+r+" v1759 h84z";case"vert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+" v585 h43z";case"doublevert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+` v585 h43z +M367 15 v585 v`+r+` v585 c2.667,10,9.667,15,21,15 +c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 +c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v`+r+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+r+` v1715 h263 v84 H319z +MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+r+` v1799 H0 v-84 H319z +MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v602 h84z +M403 1759 V0 H319 V1759 v`+r+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v602 h84z +M347 1759 V0 h-84 V1759 v`+r+" v602 h84z";case"lparen":return`M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1 +c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349, +-36,557 l0,`+(r+84)+`c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210, +949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9 +c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5, +-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189 +l0,-`+(r+92)+`c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3, +-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;case"rparen":return`M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3, +63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5 +c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,`+(r+9)+` +c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664 +c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11 +c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17 +c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558 +l0,-`+(r+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7, +-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}},"tallDelim"),ed=class{static{o(this,"DocumentFragment")}constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return Jt.contains(this.classes,e)}toNode(){for(var e=document.createDocumentFragment(),r=0;rr.toText(),"toText");return this.children.map(e).join("")}},jl={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},Z4={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},lz={\u00C5:"A",\u00D0:"D",\u00DE:"o",\u00E5:"a",\u00F0:"d",\u00FE:"o",\u0410:"A",\u0411:"B",\u0412:"B",\u0413:"F",\u0414:"A",\u0415:"E",\u0416:"K",\u0417:"3",\u0418:"N",\u0419:"N",\u041A:"K",\u041B:"N",\u041C:"M",\u041D:"H",\u041E:"O",\u041F:"N",\u0420:"P",\u0421:"C",\u0422:"T",\u0423:"y",\u0424:"O",\u0425:"X",\u0426:"U",\u0427:"h",\u0428:"W",\u0429:"W",\u042A:"B",\u042B:"X",\u042C:"B",\u042D:"3",\u042E:"X",\u042F:"R",\u0430:"a",\u0431:"b",\u0432:"a",\u0433:"r",\u0434:"y",\u0435:"e",\u0436:"m",\u0437:"e",\u0438:"n",\u0439:"n",\u043A:"n",\u043B:"n",\u043C:"m",\u043D:"n",\u043E:"o",\u043F:"n",\u0440:"p",\u0441:"c",\u0442:"o",\u0443:"y",\u0444:"b",\u0445:"x",\u0446:"n",\u0447:"n",\u0448:"w",\u0449:"w",\u044A:"a",\u044B:"m",\u044C:"a",\u044D:"e",\u044E:"m",\u044F:"r"};o(Abe,"setFontMetrics");o(P7,"getCharacterMetrics");h7={};o(_be,"getGlobalMetrics");Dbe=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],cz=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],uz=o(function(e,r){return r.size<2?e:Dbe[e-1][r.size-1]},"sizeAtStyle"),f3=class t{static{o(this,"Options")}constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||t.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=cz[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(var n in e)e.hasOwnProperty(n)&&(r[n]=e[n]);return new t(r)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:uz(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:cz[e-1]})}havingBaseStyle(e){e=e||this.style.text();var r=uz(t.BASESIZE,e);return this.size===r&&this.textSize===t.BASESIZE&&this.style===e?this:this.extend({style:e,size:r})}havingBaseSizing(){var e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==t.BASESIZE?["sizing","reset-size"+this.size,"size"+t.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=_be(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}};f3.BASESIZE=6;E7={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:803/800,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:803/800},Lbe={ex:!0,em:!0,mu:!0},zz=o(function(e){return typeof e!="string"&&(e=e.unit),e in E7||e in Lbe||e==="ex"},"validUnit"),ti=o(function(e,r){var n;if(e.unit in E7)n=E7[e.unit]/r.fontMetrics().ptPerEm/r.sizeMultiplier;else if(e.unit==="mu")n=r.fontMetrics().cssEmPerMu;else{var i;if(r.style.isTight()?i=r.havingStyle(r.style.text()):i=r,e.unit==="ex")n=i.fontMetrics().xHeight;else if(e.unit==="em")n=i.fontMetrics().quad;else throw new gt("Invalid unit: '"+e.unit+"'");i!==r&&(n*=i.sizeMultiplier/r.sizeMultiplier)}return Math.min(e.number*n,r.maxSize)},"calculateSize"),kt=o(function(e){return+e.toFixed(4)+"em"},"makeEm"),fh=o(function(e){return e.filter(r=>r).join(" ")},"createClass"),Gz=o(function(e,r,n){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=n||{},r){r.style.isTight()&&this.classes.push("mtight");var i=r.getColor();i&&(this.style.color=i)}},"initNode"),Vz=o(function(e){var r=document.createElement(e);r.className=fh(this.classes);for(var n in this.style)this.style.hasOwnProperty(n)&&(r.style[n]=this.style[n]);for(var i in this.attributes)this.attributes.hasOwnProperty(i)&&r.setAttribute(i,this.attributes[i]);for(var a=0;a",r},"toMarkup"),td=class{static{o(this,"Span")}constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,Gz.call(this,e,n,i),this.children=r||[]}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return Jt.contains(this.classes,e)}toNode(){return Vz.call(this,"span")}toMarkup(){return Uz.call(this,"span")}},Vy=class{static{o(this,"Anchor")}constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,Gz.call(this,r,i),this.children=n||[],this.setAttribute("href",e)}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return Jt.contains(this.classes,e)}toNode(){return Vz.call(this,"a")}toMarkup(){return Uz.call(this,"a")}},S7=class{static{o(this,"Img")}constructor(e,r,n){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=r,this.src=e,this.classes=["mord"],this.style=n}hasClass(e){return Jt.contains(this.classes,e)}toNode(){var e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(var r in this.style)this.style.hasOwnProperty(r)&&(e.style[r]=this.style[r]);return e}toMarkup(){var e=''+Jt.escape(this.alt)+'0&&(r=document.createElement("span"),r.style.marginRight=kt(this.italic)),this.classes.length>0&&(r=r||document.createElement("span"),r.className=fh(this.classes));for(var n in this.style)this.style.hasOwnProperty(n)&&(r=r||document.createElement("span"),r.style[n]=this.style[n]);return r?(r.appendChild(e),r):e}toMarkup(){var e=!1,r="0&&(n+="margin-right:"+this.italic+"em;");for(var i in this.style)this.style.hasOwnProperty(i)&&(n+=Jt.hyphenate(i)+":"+this.style[i]+";");n&&(e=!0,r+=' style="'+Jt.escape(n)+'"');var a=Jt.escape(this.text);return e?(r+=">",r+=a,r+="",r):a}},ll=class{static{o(this,"SvgNode")}constructor(e,r){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=r||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"svg");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);for(var i=0;i':''}},Uy=class{static{o(this,"LineNode")}constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"line");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);return r}toMarkup(){var e="","\\gt",!0);G(U,ee,Ee,"\u2208","\\in",!0);G(U,ee,Ee,"\uE020","\\@not");G(U,ee,Ee,"\u2282","\\subset",!0);G(U,ee,Ee,"\u2283","\\supset",!0);G(U,ee,Ee,"\u2286","\\subseteq",!0);G(U,ee,Ee,"\u2287","\\supseteq",!0);G(U,ke,Ee,"\u2288","\\nsubseteq",!0);G(U,ke,Ee,"\u2289","\\nsupseteq",!0);G(U,ee,Ee,"\u22A8","\\models");G(U,ee,Ee,"\u2190","\\leftarrow",!0);G(U,ee,Ee,"\u2264","\\le");G(U,ee,Ee,"\u2264","\\leq",!0);G(U,ee,Ee,"<","\\lt",!0);G(U,ee,Ee,"\u2192","\\rightarrow",!0);G(U,ee,Ee,"\u2192","\\to");G(U,ke,Ee,"\u2271","\\ngeq",!0);G(U,ke,Ee,"\u2270","\\nleq",!0);G(U,ee,uu,"\xA0","\\ ");G(U,ee,uu,"\xA0","\\space");G(U,ee,uu,"\xA0","\\nobreakspace");G(it,ee,uu,"\xA0","\\ ");G(it,ee,uu,"\xA0"," ");G(it,ee,uu,"\xA0","\\space");G(it,ee,uu,"\xA0","\\nobreakspace");G(U,ee,uu,null,"\\nobreak");G(U,ee,uu,null,"\\allowbreak");G(U,ee,x3,",",",");G(U,ee,x3,";",";");G(U,ke,It,"\u22BC","\\barwedge",!0);G(U,ke,It,"\u22BB","\\veebar",!0);G(U,ee,It,"\u2299","\\odot",!0);G(U,ee,It,"\u2295","\\oplus",!0);G(U,ee,It,"\u2297","\\otimes",!0);G(U,ee,Le,"\u2202","\\partial",!0);G(U,ee,It,"\u2298","\\oslash",!0);G(U,ke,It,"\u229A","\\circledcirc",!0);G(U,ke,It,"\u22A1","\\boxdot",!0);G(U,ee,It,"\u25B3","\\bigtriangleup");G(U,ee,It,"\u25BD","\\bigtriangledown");G(U,ee,It,"\u2020","\\dagger");G(U,ee,It,"\u22C4","\\diamond");G(U,ee,It,"\u22C6","\\star");G(U,ee,It,"\u25C3","\\triangleleft");G(U,ee,It,"\u25B9","\\triangleright");G(U,ee,js,"{","\\{");G(it,ee,Le,"{","\\{");G(it,ee,Le,"{","\\textbraceleft");G(U,ee,Za,"}","\\}");G(it,ee,Le,"}","\\}");G(it,ee,Le,"}","\\textbraceright");G(U,ee,js,"{","\\lbrace");G(U,ee,Za,"}","\\rbrace");G(U,ee,js,"[","\\lbrack",!0);G(it,ee,Le,"[","\\lbrack",!0);G(U,ee,Za,"]","\\rbrack",!0);G(it,ee,Le,"]","\\rbrack",!0);G(U,ee,js,"(","\\lparen",!0);G(U,ee,Za,")","\\rparen",!0);G(it,ee,Le,"<","\\textless",!0);G(it,ee,Le,">","\\textgreater",!0);G(U,ee,js,"\u230A","\\lfloor",!0);G(U,ee,Za,"\u230B","\\rfloor",!0);G(U,ee,js,"\u2308","\\lceil",!0);G(U,ee,Za,"\u2309","\\rceil",!0);G(U,ee,Le,"\\","\\backslash");G(U,ee,Le,"\u2223","|");G(U,ee,Le,"\u2223","\\vert");G(it,ee,Le,"|","\\textbar",!0);G(U,ee,Le,"\u2225","\\|");G(U,ee,Le,"\u2225","\\Vert");G(it,ee,Le,"\u2225","\\textbardbl");G(it,ee,Le,"~","\\textasciitilde");G(it,ee,Le,"\\","\\textbackslash");G(it,ee,Le,"^","\\textasciicircum");G(U,ee,Ee,"\u2191","\\uparrow",!0);G(U,ee,Ee,"\u21D1","\\Uparrow",!0);G(U,ee,Ee,"\u2193","\\downarrow",!0);G(U,ee,Ee,"\u21D3","\\Downarrow",!0);G(U,ee,Ee,"\u2195","\\updownarrow",!0);G(U,ee,Ee,"\u21D5","\\Updownarrow",!0);G(U,ee,ki,"\u2210","\\coprod");G(U,ee,ki,"\u22C1","\\bigvee");G(U,ee,ki,"\u22C0","\\bigwedge");G(U,ee,ki,"\u2A04","\\biguplus");G(U,ee,ki,"\u22C2","\\bigcap");G(U,ee,ki,"\u22C3","\\bigcup");G(U,ee,ki,"\u222B","\\int");G(U,ee,ki,"\u222B","\\intop");G(U,ee,ki,"\u222C","\\iint");G(U,ee,ki,"\u222D","\\iiint");G(U,ee,ki,"\u220F","\\prod");G(U,ee,ki,"\u2211","\\sum");G(U,ee,ki,"\u2A02","\\bigotimes");G(U,ee,ki,"\u2A01","\\bigoplus");G(U,ee,ki,"\u2A00","\\bigodot");G(U,ee,ki,"\u222E","\\oint");G(U,ee,ki,"\u222F","\\oiint");G(U,ee,ki,"\u2230","\\oiiint");G(U,ee,ki,"\u2A06","\\bigsqcup");G(U,ee,ki,"\u222B","\\smallint");G(it,ee,p0,"\u2026","\\textellipsis");G(U,ee,p0,"\u2026","\\mathellipsis");G(it,ee,p0,"\u2026","\\ldots",!0);G(U,ee,p0,"\u2026","\\ldots",!0);G(U,ee,p0,"\u22EF","\\@cdots",!0);G(U,ee,p0,"\u22F1","\\ddots",!0);G(U,ee,Le,"\u22EE","\\varvdots");G(U,ee,Vn,"\u02CA","\\acute");G(U,ee,Vn,"\u02CB","\\grave");G(U,ee,Vn,"\xA8","\\ddot");G(U,ee,Vn,"~","\\tilde");G(U,ee,Vn,"\u02C9","\\bar");G(U,ee,Vn,"\u02D8","\\breve");G(U,ee,Vn,"\u02C7","\\check");G(U,ee,Vn,"^","\\hat");G(U,ee,Vn,"\u20D7","\\vec");G(U,ee,Vn,"\u02D9","\\dot");G(U,ee,Vn,"\u02DA","\\mathring");G(U,ee,er,"\uE131","\\@imath");G(U,ee,er,"\uE237","\\@jmath");G(U,ee,Le,"\u0131","\u0131");G(U,ee,Le,"\u0237","\u0237");G(it,ee,Le,"\u0131","\\i",!0);G(it,ee,Le,"\u0237","\\j",!0);G(it,ee,Le,"\xDF","\\ss",!0);G(it,ee,Le,"\xE6","\\ae",!0);G(it,ee,Le,"\u0153","\\oe",!0);G(it,ee,Le,"\xF8","\\o",!0);G(it,ee,Le,"\xC6","\\AE",!0);G(it,ee,Le,"\u0152","\\OE",!0);G(it,ee,Le,"\xD8","\\O",!0);G(it,ee,Vn,"\u02CA","\\'");G(it,ee,Vn,"\u02CB","\\`");G(it,ee,Vn,"\u02C6","\\^");G(it,ee,Vn,"\u02DC","\\~");G(it,ee,Vn,"\u02C9","\\=");G(it,ee,Vn,"\u02D8","\\u");G(it,ee,Vn,"\u02D9","\\.");G(it,ee,Vn,"\xB8","\\c");G(it,ee,Vn,"\u02DA","\\r");G(it,ee,Vn,"\u02C7","\\v");G(it,ee,Vn,"\xA8",'\\"');G(it,ee,Vn,"\u02DD","\\H");G(it,ee,Vn,"\u25EF","\\textcircled");Hz={"--":!0,"---":!0,"``":!0,"''":!0};G(it,ee,Le,"\u2013","--",!0);G(it,ee,Le,"\u2013","\\textendash");G(it,ee,Le,"\u2014","---",!0);G(it,ee,Le,"\u2014","\\textemdash");G(it,ee,Le,"\u2018","`",!0);G(it,ee,Le,"\u2018","\\textquoteleft");G(it,ee,Le,"\u2019","'",!0);G(it,ee,Le,"\u2019","\\textquoteright");G(it,ee,Le,"\u201C","``",!0);G(it,ee,Le,"\u201C","\\textquotedblleft");G(it,ee,Le,"\u201D","''",!0);G(it,ee,Le,"\u201D","\\textquotedblright");G(U,ee,Le,"\xB0","\\degree",!0);G(it,ee,Le,"\xB0","\\degree");G(it,ee,Le,"\xB0","\\textdegree",!0);G(U,ee,Le,"\xA3","\\pounds");G(U,ee,Le,"\xA3","\\mathsterling",!0);G(it,ee,Le,"\xA3","\\pounds");G(it,ee,Le,"\xA3","\\textsterling",!0);G(U,ke,Le,"\u2720","\\maltese");G(it,ke,Le,"\u2720","\\maltese");fz='0123456789/@."';for(J4=0;J40)return ol(a,h,i,r,s.concat(f));if(u){var d,p;if(u==="boldsymbol"){var m=Bbe(a,i,r,s,n);d=m.fontName,p=[m.fontClass]}else l?(d=Yz[u].fontName,p=[u]):(d=i3(u,r.fontWeight,r.fontShape),p=[u,r.fontWeight,r.fontShape]);if(b3(a,d,i).metrics)return ol(a,d,i,r,s.concat(p));if(Hz.hasOwnProperty(a)&&d.slice(0,10)==="Typewriter"){for(var g=[],y=0;y{if(fh(t.classes)!==fh(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;if(t.classes.length===1){var r=t.classes[0];if(r==="mbin"||r==="mord")return!1}for(var n in t.style)if(t.style.hasOwnProperty(n)&&t.style[n]!==e.style[n])return!1;for(var i in e.style)if(e.style.hasOwnProperty(i)&&t.style[i]!==e.style[i])return!1;return!0},"canCombine"),zbe=o(t=>{for(var e=0;er&&(r=s.height),s.depth>n&&(n=s.depth),s.maxFontSize>i&&(i=s.maxFontSize)}e.height=r,e.depth=n,e.maxFontSize=i},"sizeElementFromChildren"),bs=o(function(e,r,n,i){var a=new td(e,r,n,i);return B7(a),a},"makeSpan"),Wz=o((t,e,r,n)=>new td(t,e,r,n),"makeSvgSpan"),Gbe=o(function(e,r,n){var i=bs([e],[],r);return i.height=Math.max(n||r.fontMetrics().defaultRuleThickness,r.minRuleThickness),i.style.borderBottomWidth=kt(i.height),i.maxFontSize=1,i},"makeLineSpan"),Vbe=o(function(e,r,n,i){var a=new Vy(e,r,n,i);return B7(a),a},"makeAnchor"),qz=o(function(e){var r=new ed(e);return B7(r),r},"makeFragment"),Ube=o(function(e,r){return e instanceof ed?bs([],[e],r):e},"wrapFragment"),Hbe=o(function(e){if(e.positionType==="individualShift"){for(var r=e.children,n=[r[0]],i=-r[0].shift-r[0].elem.depth,a=i,s=1;s{var r=bs(["mspace"],[],e),n=ti(t,e);return r.style.marginRight=kt(n),r},"makeGlue"),i3=o(function(e,r,n){var i="";switch(e){case"amsrm":i="AMS";break;case"textrm":i="Main";break;case"textsf":i="SansSerif";break;case"texttt":i="Typewriter";break;default:i=e}var a;return r==="textbf"&&n==="textit"?a="BoldItalic":r==="textbf"?a="Bold":r==="textit"?a="Italic":a="Regular",i+"-"+a},"retrieveTextFontName"),Yz={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Xz={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Ybe=o(function(e,r){var[n,i,a]=Xz[e],s=new Kl(n),l=new ll([s],{width:kt(i),height:kt(a),style:"width:"+kt(i),viewBox:"0 0 "+1e3*i+" "+1e3*a,preserveAspectRatio:"xMinYMin"}),u=Wz(["overlay"],[l],r);return u.height=a,u.style.height=kt(a),u.style.width=kt(i),u},"staticSvg"),Be={fontMap:Yz,makeSymbol:ol,mathsym:Pbe,makeSpan:bs,makeSvgSpan:Wz,makeLineSpan:Gbe,makeAnchor:Vbe,makeFragment:qz,wrapFragment:Ube,makeVList:Wbe,makeOrd:Fbe,makeGlue:qbe,staticSvg:Ybe,svgData:Xz,tryCombineChars:zbe},ei={number:3,unit:"mu"},Zf={number:4,unit:"mu"},au={number:5,unit:"mu"},Xbe={mord:{mop:ei,mbin:Zf,mrel:au,minner:ei},mop:{mord:ei,mop:ei,mrel:au,minner:ei},mbin:{mord:Zf,mop:Zf,mopen:Zf,minner:Zf},mrel:{mord:au,mop:au,mopen:au,minner:au},mopen:{},mclose:{mop:ei,mbin:Zf,mrel:au,minner:ei},mpunct:{mord:ei,mop:ei,mrel:au,mopen:ei,mclose:ei,mpunct:ei,minner:ei},minner:{mord:ei,mop:ei,mbin:Zf,mrel:au,mopen:ei,mpunct:ei,minner:ei}},jbe={mord:{mop:ei},mop:{mord:ei,mop:ei},mbin:{},mrel:{},mopen:{},mclose:{mop:ei},mpunct:{},minner:{mop:ei}},jz={},p3={},m3={};o(Nt,"defineFunction");o(rd,"defineFunctionBuilders");g3=o(function(e){return e.type==="ordgroup"&&e.body.length===1?e.body[0]:e},"normalizeArgument"),di=o(function(e){return e.type==="ordgroup"?e.body:[e]},"ordargument"),lu=Be.makeSpan,Kbe=["leftmost","mbin","mopen","mrel","mop","mpunct"],Qbe=["rightmost","mrel","mclose","mpunct"],Zbe={display:tr.DISPLAY,text:tr.TEXT,script:tr.SCRIPT,scriptscript:tr.SCRIPTSCRIPT},Jbe={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},Pi=o(function(e,r,n,i){i===void 0&&(i=[null,null]);for(var a=[],s=0;s{var v=y.classes[0],x=g.classes[0];v==="mbin"&&Jt.contains(Qbe,x)?y.classes[0]="mord":x==="mbin"&&Jt.contains(Kbe,v)&&(g.classes[0]="mord")},{node:d},p,m),mz(a,(g,y)=>{var v=A7(y),x=A7(g),b=v&&x?g.hasClass("mtight")?jbe[v][x]:Xbe[v][x]:null;if(b)return Be.makeGlue(b,h)},{node:d},p,m),a},"buildExpression"),mz=o(function t(e,r,n,i,a){i&&e.push(i);for(var s=0;sp=>{e.splice(d+1,0,p),s++})(s)}i&&e.pop()},"traverseNonSpaceNodes"),Kz=o(function(e){return e instanceof ed||e instanceof Vy||e instanceof td&&e.hasClass("enclosing")?e:null},"checkPartialGroup"),e4e=o(function t(e,r){var n=Kz(e);if(n){var i=n.children;if(i.length){if(r==="right")return t(i[i.length-1],"right");if(r==="left")return t(i[0],"left")}}return e},"getOutermostNode"),A7=o(function(e,r){return e?(r&&(e=e4e(e,r)),Jbe[e.classes[0]]||null):null},"getTypeOfDomTree"),Hy=o(function(e,r){var n=["nulldelimiter"].concat(e.baseSizingClasses());return lu(r.concat(n))},"makeNullDelimiter"),Fr=o(function(e,r,n){if(!e)return lu();if(p3[e.type]){var i=p3[e.type](e,r);if(n&&r.size!==n.size){i=lu(r.sizingClasses(n),[i],r);var a=r.sizeMultiplier/n.sizeMultiplier;i.height*=a,i.depth*=a}return i}else throw new gt("Got group of unknown type: '"+e.type+"'")},"buildGroup");o(a3,"buildHTMLUnbreakable");o(_7,"buildHTML");o(Qz,"newDocumentFragment");ws=class{static{o(this,"MathNode")}constructor(e,r,n){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=r||[],this.classes=n||[]}setAttribute(e,r){this.attributes[e]=r}getAttribute(e){return this.attributes[e]}toNode(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var r in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,r)&&e.setAttribute(r,this.attributes[r]);this.classes.length>0&&(e.className=fh(this.classes));for(var n=0;n0&&(e+=' class ="'+Jt.escape(fh(this.classes))+'"'),e+=">";for(var n=0;n",e}toText(){return this.children.map(e=>e.toText()).join("")}},Jf=class{static{o(this,"TextNode")}constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return Jt.escape(this.toText())}toText(){return this.text}},D7=class{static{o(this,"SpaceNode")}constructor(e){this.width=void 0,this.character=void 0,this.width=e,e>=.05555&&e<=.05556?this.character="\u200A":e>=.1666&&e<=.1667?this.character="\u2009":e>=.2222&&e<=.2223?this.character="\u2005":e>=.2777&&e<=.2778?this.character="\u2005\u200A":e>=-.05556&&e<=-.05555?this.character="\u200A\u2063":e>=-.1667&&e<=-.1666?this.character="\u2009\u2063":e>=-.2223&&e<=-.2222?this.character="\u205F\u2063":e>=-.2778&&e<=-.2777?this.character="\u2005\u2063":this.character=null}toNode(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",kt(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},dt={MathNode:ws,TextNode:Jf,SpaceNode:D7,newDocumentFragment:Qz},Co=o(function(e,r,n){return An[r][e]&&An[r][e].replace&&e.charCodeAt(0)!==55349&&!(Hz.hasOwnProperty(e)&&n&&(n.fontFamily&&n.fontFamily.slice(4,6)==="tt"||n.font&&n.font.slice(4,6)==="tt"))&&(e=An[r][e].replace),new dt.TextNode(e)},"makeText"),F7=o(function(e){return e.length===1?e[0]:new dt.MathNode("mrow",e)},"makeRow"),$7=o(function(e,r){if(r.fontFamily==="texttt")return"monospace";if(r.fontFamily==="textsf")return r.fontShape==="textit"&&r.fontWeight==="textbf"?"sans-serif-bold-italic":r.fontShape==="textit"?"sans-serif-italic":r.fontWeight==="textbf"?"bold-sans-serif":"sans-serif";if(r.fontShape==="textit"&&r.fontWeight==="textbf")return"bold-italic";if(r.fontShape==="textit")return"italic";if(r.fontWeight==="textbf")return"bold";var n=r.font;if(!n||n==="mathnormal")return null;var i=e.mode;if(n==="mathit")return"italic";if(n==="boldsymbol")return e.type==="textord"?"bold":"bold-italic";if(n==="mathbf")return"bold";if(n==="mathbb")return"double-struck";if(n==="mathfrak")return"fraktur";if(n==="mathscr"||n==="mathcal")return"script";if(n==="mathsf")return"sans-serif";if(n==="mathtt")return"monospace";var a=e.text;if(Jt.contains(["\\imath","\\jmath"],a))return null;An[i][a]&&An[i][a].replace&&(a=An[i][a].replace);var s=Be.fontMap[n].fontName;return P7(a,s,i)?Be.fontMap[n].variant:null},"getVariant"),ks=o(function(e,r,n){if(e.length===1){var i=yn(e[0],r);return n&&i instanceof ws&&i.type==="mo"&&(i.setAttribute("lspace","0em"),i.setAttribute("rspace","0em")),[i]}for(var a=[],s,l=0;l0&&(d.text=d.text.slice(0,1)+"\u0338"+d.text.slice(1),a.pop())}}}a.push(u),s=u}return a},"buildExpression"),dh=o(function(e,r,n){return F7(ks(e,r,n))},"buildExpressionRow"),yn=o(function(e,r){if(!e)return new dt.MathNode("mrow");if(m3[e.type]){var n=m3[e.type](e,r);return n}else throw new gt("Got group of unknown type: '"+e.type+"'")},"buildGroup");o(gz,"buildMathML");Zz=o(function(e){return new f3({style:e.displayMode?tr.DISPLAY:tr.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},"optionsFromSettings"),Jz=o(function(e,r){if(r.displayMode){var n=["katex-display"];r.leqno&&n.push("leqno"),r.fleqn&&n.push("fleqn"),e=Be.makeSpan(n,[e])}return e},"displayWrap"),t4e=o(function(e,r,n){var i=Zz(n),a;if(n.output==="mathml")return gz(e,r,i,n.displayMode,!0);if(n.output==="html"){var s=_7(e,i);a=Be.makeSpan(["katex"],[s])}else{var l=gz(e,r,i,n.displayMode,!1),u=_7(e,i);a=Be.makeSpan(["katex"],[l,u])}return Jz(a,n)},"buildTree"),r4e=o(function(e,r,n){var i=Zz(n),a=_7(e,i),s=Be.makeSpan(["katex"],[a]);return Jz(s,n)},"buildHTMLTree"),n4e={widehat:"^",widecheck:"\u02C7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23DF",overbrace:"\u23DE",overgroup:"\u23E0",undergroup:"\u23E1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21D2",xRightarrow:"\u21D2",overleftharpoon:"\u21BC",xleftharpoonup:"\u21BC",overrightharpoon:"\u21C0",xrightharpoonup:"\u21C0",xLeftarrow:"\u21D0",xLeftrightarrow:"\u21D4",xhookleftarrow:"\u21A9",xhookrightarrow:"\u21AA",xmapsto:"\u21A6",xrightharpoondown:"\u21C1",xleftharpoondown:"\u21BD",xrightleftharpoons:"\u21CC",xleftrightharpoons:"\u21CB",xtwoheadleftarrow:"\u219E",xtwoheadrightarrow:"\u21A0",xlongequal:"=",xtofrom:"\u21C4",xrightleftarrows:"\u21C4",xrightequilibrium:"\u21CC",xleftequilibrium:"\u21CB","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},i4e=o(function(e){var r=new dt.MathNode("mo",[new dt.TextNode(n4e[e.replace(/^\\/,"")])]);return r.setAttribute("stretchy","true"),r},"mathMLnode"),a4e={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},s4e=o(function(e){return e.type==="ordgroup"?e.body.length:1},"groupLength"),o4e=o(function(e,r){function n(){var l=4e5,u=e.label.slice(1);if(Jt.contains(["widehat","widecheck","widetilde","utilde"],u)){var h=e,f=s4e(h.base),d,p,m;if(f>5)u==="widehat"||u==="widecheck"?(d=420,l=2364,m=.42,p=u+"4"):(d=312,l=2340,m=.34,p="tilde4");else{var g=[1,1,2,2,3,3][f];u==="widehat"||u==="widecheck"?(l=[0,1062,2364,2364,2364][g],d=[0,239,300,360,420][g],m=[0,.24,.3,.3,.36,.42][g],p=u+g):(l=[0,600,1033,2339,2340][g],d=[0,260,286,306,312][g],m=[0,.26,.286,.3,.306,.34][g],p="tilde"+g)}var y=new Kl(p),v=new ll([y],{width:"100%",height:kt(m),viewBox:"0 0 "+l+" "+d,preserveAspectRatio:"none"});return{span:Be.makeSvgSpan([],[v],r),minWidth:0,height:m}}else{var x=[],b=a4e[u],[w,C,T]=b,E=T/1e3,A=w.length,S,_;if(A===1){var I=b[3];S=["hide-tail"],_=[I]}else if(A===2)S=["halfarrow-left","halfarrow-right"],_=["xMinYMin","xMaxYMin"];else if(A===3)S=["brace-left","brace-center","brace-right"],_=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support + `+A+" children.");for(var D=0;D0&&(i.style.minWidth=kt(a)),i},"svgSpan"),l4e=o(function(e,r,n,i,a){var s,l=e.height+e.depth+n+i;if(/fbox|color|angl/.test(r)){if(s=Be.makeSpan(["stretchy",r],[],a),r==="fbox"){var u=a.color&&a.getColor();u&&(s.style.borderColor=u)}}else{var h=[];/^[bx]cancel$/.test(r)&&h.push(new Uy({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(r)&&h.push(new Uy({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var f=new ll(h,{width:"100%",height:kt(l)});s=Be.makeSvgSpan([],[f],a)}return s.height=l,s.style.height=kt(l),s},"encloseSpan"),cu={encloseSpan:l4e,mathMLnode:i4e,svgSpan:o4e};o(xr,"assertNodeType");o(z7,"assertSymbolNodeType");o(w3,"checkSymbolNodeType");G7=o((t,e)=>{var r,n,i;t&&t.type==="supsub"?(n=xr(t.base,"accent"),r=n.base,t.base=r,i=Nbe(Fr(t,e)),t.base=n):(n=xr(t,"accent"),r=n.base);var a=Fr(r,e.havingCrampedStyle()),s=n.isShifty&&Jt.isCharacterBox(r),l=0;if(s){var u=Jt.getBaseElem(r),h=Fr(u,e.havingCrampedStyle());l=hz(h).skew}var f=n.label==="\\c",d=f?a.height+a.depth:Math.min(a.height,e.fontMetrics().xHeight),p;if(n.isStretchy)p=cu.svgSpan(n,e),p=Be.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"elem",elem:p,wrapperClasses:["svg-align"],wrapperStyle:l>0?{width:"calc(100% - "+kt(2*l)+")",marginLeft:kt(2*l)}:void 0}]},e);else{var m,g;n.label==="\\vec"?(m=Be.staticSvg("vec",e),g=Be.svgData.vec[1]):(m=Be.makeOrd({mode:n.mode,text:n.label},e,"textord"),m=hz(m),m.italic=0,g=m.width,f&&(d+=m.depth)),p=Be.makeSpan(["accent-body"],[m]);var y=n.label==="\\textcircled";y&&(p.classes.push("accent-full"),d=a.height);var v=l;y||(v-=g/2),p.style.left=kt(v),n.label==="\\textcircled"&&(p.style.top=".2em"),p=Be.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:-d},{type:"elem",elem:p}]},e)}var x=Be.makeSpan(["mord","accent"],[p],e);return i?(i.children[0]=x,i.height=Math.max(x.height,i.height),i.classes[0]="mord",i):x},"htmlBuilder$a"),eG=o((t,e)=>{var r=t.isStretchy?cu.mathMLnode(t.label):new dt.MathNode("mo",[Co(t.label,t.mode)]),n=new dt.MathNode("mover",[yn(t.base,e),r]);return n.setAttribute("accent","true"),n},"mathmlBuilder$9"),c4e=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(t=>"\\"+t).join("|"));Nt({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:o((t,e)=>{var r=g3(e[0]),n=!c4e.test(t.funcName),i=!n||t.funcName==="\\widehat"||t.funcName==="\\widetilde"||t.funcName==="\\widecheck";return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:n,isShifty:i,base:r}},"handler"),htmlBuilder:G7,mathmlBuilder:eG});Nt({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:o((t,e)=>{var r=e[0],n=t.parser.mode;return n==="math"&&(t.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+t.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},"handler"),htmlBuilder:G7,mathmlBuilder:eG});Nt({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"accentUnder",mode:r.mode,label:n,base:i}},"handler"),htmlBuilder:o((t,e)=>{var r=Fr(t.base,e),n=cu.svgSpan(t,e),i=t.label==="\\utilde"?.12:0,a=Be.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:i},{type:"elem",elem:r}]},e);return Be.makeSpan(["mord","accentunder"],[a],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=cu.mathMLnode(t.label),n=new dt.MathNode("munder",[yn(t.base,e),r]);return n.setAttribute("accentunder","true"),n},"mathmlBuilder")});s3=o(t=>{var e=new dt.MathNode("mpadded",t?[t]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e},"paddedNode");Nt({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n,funcName:i}=t;return{type:"xArrow",mode:n.mode,label:i,body:e[0],below:r[0]}},htmlBuilder(t,e){var r=e.style,n=e.havingStyle(r.sup()),i=Be.wrapFragment(Fr(t.body,n,e),e),a=t.label.slice(0,2)==="\\x"?"x":"cd";i.classes.push(a+"-arrow-pad");var s;t.below&&(n=e.havingStyle(r.sub()),s=Be.wrapFragment(Fr(t.below,n,e),e),s.classes.push(a+"-arrow-pad"));var l=cu.svgSpan(t,e),u=-e.fontMetrics().axisHeight+.5*l.height,h=-e.fontMetrics().axisHeight-.5*l.height-.111;(i.depth>.25||t.label==="\\xleftequilibrium")&&(h-=i.depth);var f;if(s){var d=-e.fontMetrics().axisHeight+s.height+.5*l.height+.111;f=Be.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:l,shift:u},{type:"elem",elem:s,shift:d}]},e)}else f=Be.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:l,shift:u}]},e);return f.children[0].children[0].children[1].classes.push("svg-align"),Be.makeSpan(["mrel","x-arrow"],[f],e)},mathmlBuilder(t,e){var r=cu.mathMLnode(t.label);r.setAttribute("minsize",t.label.charAt(0)==="x"?"1.75em":"3.0em");var n;if(t.body){var i=s3(yn(t.body,e));if(t.below){var a=s3(yn(t.below,e));n=new dt.MathNode("munderover",[r,a,i])}else n=new dt.MathNode("mover",[r,i])}else if(t.below){var s=s3(yn(t.below,e));n=new dt.MathNode("munder",[r,s])}else n=s3(),n=new dt.MathNode("mover",[r,n]);return n}});u4e=Be.makeSpan;o(tG,"htmlBuilder$9");o(rG,"mathmlBuilder$8");Nt({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"mclass",mode:r.mode,mclass:"m"+n.slice(5),body:di(i),isCharacterBox:Jt.isCharacterBox(i)}},htmlBuilder:tG,mathmlBuilder:rG});T3=o(t=>{var e=t.type==="ordgroup"&&t.body.length?t.body[0]:t;return e.type==="atom"&&(e.family==="bin"||e.family==="rel")?"m"+e.family:"mord"},"binrelClass");Nt({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(t,e){var{parser:r}=t;return{type:"mclass",mode:r.mode,mclass:T3(e[0]),body:di(e[1]),isCharacterBox:Jt.isCharacterBox(e[1])}}});Nt({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(t,e){var{parser:r,funcName:n}=t,i=e[1],a=e[0],s;n!=="\\stackrel"?s=T3(i):s="mrel";var l={type:"op",mode:i.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:n!=="\\stackrel",body:di(i)},u={type:"supsub",mode:a.mode,base:l,sup:n==="\\underset"?null:a,sub:n==="\\underset"?a:null};return{type:"mclass",mode:r.mode,mclass:s,body:[u],isCharacterBox:Jt.isCharacterBox(u)}},htmlBuilder:tG,mathmlBuilder:rG});Nt({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"pmb",mode:r.mode,mclass:T3(e[0]),body:di(e[0])}},htmlBuilder(t,e){var r=Pi(t.body,e,!0),n=Be.makeSpan([t.mclass],r,e);return n.style.textShadow="0.02em 0.01em 0.04px",n},mathmlBuilder(t,e){var r=ks(t.body,e),n=new dt.MathNode("mstyle",r);return n.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),n}});h4e={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},yz=o(()=>({type:"styling",body:[],mode:"math",style:"display"}),"newCell"),vz=o(t=>t.type==="textord"&&t.text==="@","isStartOfArrow"),f4e=o((t,e)=>(t.type==="mathord"||t.type==="atom")&&t.text===e,"isLabelEnd");o(d4e,"cdArrow");o(p4e,"parseCD");Nt({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:e[0]}},htmlBuilder(t,e){var r=e.havingStyle(e.style.sup()),n=Be.wrapFragment(Fr(t.label,r,e),e);return n.classes.push("cd-label-"+t.side),n.style.bottom=kt(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder(t,e){var r=new dt.MathNode("mrow",[yn(t.label,e)]);return r=new dt.MathNode("mpadded",[r]),r.setAttribute("width","0"),t.side==="left"&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),r=new dt.MathNode("mstyle",[r]),r.setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}});Nt({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(t,e){var{parser:r}=t;return{type:"cdlabelparent",mode:r.mode,fragment:e[0]}},htmlBuilder(t,e){var r=Be.wrapFragment(Fr(t.fragment,e),e);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder(t,e){return new dt.MathNode("mrow",[yn(t.fragment,e)])}});Nt({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(t,e){for(var{parser:r}=t,n=xr(e[0],"ordgroup"),i=n.body,a="",s=0;s=1114111)throw new gt("\\@char with invalid code point "+a);return u<=65535?h=String.fromCharCode(u):(u-=65536,h=String.fromCharCode((u>>10)+55296,(u&1023)+56320)),{type:"textord",mode:r.mode,text:h}}});nG=o((t,e)=>{var r=Pi(t.body,e.withColor(t.color),!1);return Be.makeFragment(r)},"htmlBuilder$8"),iG=o((t,e)=>{var r=ks(t.body,e.withColor(t.color)),n=new dt.MathNode("mstyle",r);return n.setAttribute("mathcolor",t.color),n},"mathmlBuilder$7");Nt({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(t,e){var{parser:r}=t,n=xr(e[0],"color-token").color,i=e[1];return{type:"color",mode:r.mode,color:n,body:di(i)}},htmlBuilder:nG,mathmlBuilder:iG});Nt({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(t,e){var{parser:r,breakOnTokenText:n}=t,i=xr(e[0],"color-token").color;r.gullet.macros.set("\\current@color",i);var a=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:i,body:a}},htmlBuilder:nG,mathmlBuilder:iG});Nt({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(t,e,r){var{parser:n}=t,i=n.gullet.future().text==="["?n.parseSizeGroup(!0):null,a=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:a,size:i&&xr(i,"size").value}},htmlBuilder(t,e){var r=Be.makeSpan(["mspace"],[],e);return t.newLine&&(r.classes.push("newline"),t.size&&(r.style.marginTop=kt(ti(t.size,e)))),r},mathmlBuilder(t,e){var r=new dt.MathNode("mspace");return t.newLine&&(r.setAttribute("linebreak","newline"),t.size&&r.setAttribute("height",kt(ti(t.size,e)))),r}});L7={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},aG=o(t=>{var e=t.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new gt("Expected a control sequence",t);return e},"checkControlSequence"),m4e=o(t=>{var e=t.gullet.popToken();return e.text==="="&&(e=t.gullet.popToken(),e.text===" "&&(e=t.gullet.popToken())),e},"getRHS"),sG=o((t,e,r,n)=>{var i=t.gullet.macros.get(r.text);i==null&&(r.noexpand=!0,i={tokens:[r],numArgs:0,unexpandable:!t.gullet.isExpandable(r.text)}),t.gullet.macros.set(e,i,n)},"letCommand");Nt({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(t){var{parser:e,funcName:r}=t;e.consumeSpaces();var n=e.fetch();if(L7[n.text])return(r==="\\global"||r==="\\\\globallong")&&(n.text=L7[n.text]),xr(e.parseFunction(),"internal");throw new gt("Invalid token after macro prefix",n)}});Nt({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=e.gullet.popToken(),i=n.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(i))throw new gt("Expected a control sequence",n);for(var a=0,s,l=[[]];e.gullet.future().text!=="{";)if(n=e.gullet.popToken(),n.text==="#"){if(e.gullet.future().text==="{"){s=e.gullet.future(),l[a].push("{");break}if(n=e.gullet.popToken(),!/^[1-9]$/.test(n.text))throw new gt('Invalid argument number "'+n.text+'"');if(parseInt(n.text)!==a+1)throw new gt('Argument number "'+n.text+'" out of order');a++,l.push([])}else{if(n.text==="EOF")throw new gt("Expected a macro definition");l[a].push(n.text)}var{tokens:u}=e.gullet.consumeArg();return s&&u.unshift(s),(r==="\\edef"||r==="\\xdef")&&(u=e.gullet.expandTokens(u),u.reverse()),e.gullet.macros.set(i,{tokens:u,numArgs:a,delimiters:l},r===L7[r]),{type:"internal",mode:e.mode}}});Nt({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=aG(e.gullet.popToken());e.gullet.consumeSpaces();var i=m4e(e);return sG(e,n,i,r==="\\\\globallet"),{type:"internal",mode:e.mode}}});Nt({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=aG(e.gullet.popToken()),i=e.gullet.popToken(),a=e.gullet.popToken();return sG(e,n,a,r==="\\\\globalfuture"),e.gullet.pushToken(a),e.gullet.pushToken(i),{type:"internal",mode:e.mode}}});Fy=o(function(e,r,n){var i=An.math[e]&&An.math[e].replace,a=P7(i||e,r,n);if(!a)throw new Error("Unsupported symbol "+e+" and font size "+r+".");return a},"getMetrics"),V7=o(function(e,r,n,i){var a=n.havingBaseStyle(r),s=Be.makeSpan(i.concat(a.sizingClasses(n)),[e],n),l=a.sizeMultiplier/n.sizeMultiplier;return s.height*=l,s.depth*=l,s.maxFontSize=a.sizeMultiplier,s},"styleWrap"),oG=o(function(e,r,n){var i=r.havingBaseStyle(n),a=(1-r.sizeMultiplier/i.sizeMultiplier)*r.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=kt(a),e.height-=a,e.depth+=a},"centerSpan"),g4e=o(function(e,r,n,i,a,s){var l=Be.makeSymbol(e,"Main-Regular",a,i),u=V7(l,r,i,s);return n&&oG(u,i,r),u},"makeSmallDelim"),y4e=o(function(e,r,n,i){return Be.makeSymbol(e,"Size"+r+"-Regular",n,i)},"mathrmSize"),lG=o(function(e,r,n,i,a,s){var l=y4e(e,r,a,i),u=V7(Be.makeSpan(["delimsizing","size"+r],[l],i),tr.TEXT,i,s);return n&&oG(u,i,tr.TEXT),u},"makeLargeDelim"),p7=o(function(e,r,n){var i;r==="Size1-Regular"?i="delim-size1":i="delim-size4";var a=Be.makeSpan(["delimsizinginner",i],[Be.makeSpan([],[Be.makeSymbol(e,r,n)])]);return{type:"elem",elem:a}},"makeGlyphSpan"),m7=o(function(e,r,n){var i=jl["Size4-Regular"][e.charCodeAt(0)]?jl["Size4-Regular"][e.charCodeAt(0)][4]:jl["Size1-Regular"][e.charCodeAt(0)][4],a=new Kl("inner",Sbe(e,Math.round(1e3*r))),s=new ll([a],{width:kt(i),height:kt(r),style:"width:"+kt(i),viewBox:"0 0 "+1e3*i+" "+Math.round(1e3*r),preserveAspectRatio:"xMinYMin"}),l=Be.makeSvgSpan([],[s],n);return l.height=r,l.style.height=kt(r),l.style.width=kt(i),{type:"elem",elem:l}},"makeInner"),R7=.008,o3={type:"kern",size:-1*R7},v4e=["|","\\lvert","\\rvert","\\vert"],x4e=["\\|","\\lVert","\\rVert","\\Vert"],cG=o(function(e,r,n,i,a,s){var l,u,h,f,d="",p=0;l=h=f=e,u=null;var m="Size1-Regular";e==="\\uparrow"?h=f="\u23D0":e==="\\Uparrow"?h=f="\u2016":e==="\\downarrow"?l=h="\u23D0":e==="\\Downarrow"?l=h="\u2016":e==="\\updownarrow"?(l="\\uparrow",h="\u23D0",f="\\downarrow"):e==="\\Updownarrow"?(l="\\Uparrow",h="\u2016",f="\\Downarrow"):Jt.contains(v4e,e)?(h="\u2223",d="vert",p=333):Jt.contains(x4e,e)?(h="\u2225",d="doublevert",p=556):e==="["||e==="\\lbrack"?(l="\u23A1",h="\u23A2",f="\u23A3",m="Size4-Regular",d="lbrack",p=667):e==="]"||e==="\\rbrack"?(l="\u23A4",h="\u23A5",f="\u23A6",m="Size4-Regular",d="rbrack",p=667):e==="\\lfloor"||e==="\u230A"?(h=l="\u23A2",f="\u23A3",m="Size4-Regular",d="lfloor",p=667):e==="\\lceil"||e==="\u2308"?(l="\u23A1",h=f="\u23A2",m="Size4-Regular",d="lceil",p=667):e==="\\rfloor"||e==="\u230B"?(h=l="\u23A5",f="\u23A6",m="Size4-Regular",d="rfloor",p=667):e==="\\rceil"||e==="\u2309"?(l="\u23A4",h=f="\u23A5",m="Size4-Regular",d="rceil",p=667):e==="("||e==="\\lparen"?(l="\u239B",h="\u239C",f="\u239D",m="Size4-Regular",d="lparen",p=875):e===")"||e==="\\rparen"?(l="\u239E",h="\u239F",f="\u23A0",m="Size4-Regular",d="rparen",p=875):e==="\\{"||e==="\\lbrace"?(l="\u23A7",u="\u23A8",f="\u23A9",h="\u23AA",m="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(l="\u23AB",u="\u23AC",f="\u23AD",h="\u23AA",m="Size4-Regular"):e==="\\lgroup"||e==="\u27EE"?(l="\u23A7",f="\u23A9",h="\u23AA",m="Size4-Regular"):e==="\\rgroup"||e==="\u27EF"?(l="\u23AB",f="\u23AD",h="\u23AA",m="Size4-Regular"):e==="\\lmoustache"||e==="\u23B0"?(l="\u23A7",f="\u23AD",h="\u23AA",m="Size4-Regular"):(e==="\\rmoustache"||e==="\u23B1")&&(l="\u23AB",f="\u23A9",h="\u23AA",m="Size4-Regular");var g=Fy(l,m,a),y=g.height+g.depth,v=Fy(h,m,a),x=v.height+v.depth,b=Fy(f,m,a),w=b.height+b.depth,C=0,T=1;if(u!==null){var E=Fy(u,m,a);C=E.height+E.depth,T=2}var A=y+w+C,S=Math.max(0,Math.ceil((r-A)/(T*x))),_=A+S*T*x,I=i.fontMetrics().axisHeight;n&&(I*=i.sizeMultiplier);var D=_/2-I,k=[];if(d.length>0){var L=_-y-w,R=Math.round(_*1e3),O=Cbe(d,Math.round(L*1e3)),M=new Kl(d,O),B=(p/1e3).toFixed(3)+"em",F=(R/1e3).toFixed(3)+"em",P=new ll([M],{width:B,height:F,viewBox:"0 0 "+p+" "+R}),z=Be.makeSvgSpan([],[P],i);z.height=R/1e3,z.style.width=B,z.style.height=F,k.push({type:"elem",elem:z})}else{if(k.push(p7(f,m,a)),k.push(o3),u===null){var $=_-y-w+2*R7;k.push(m7(h,$,i))}else{var H=(_-y-w-C)/2+2*R7;k.push(m7(h,H,i)),k.push(o3),k.push(p7(u,m,a)),k.push(o3),k.push(m7(h,H,i))}k.push(o3),k.push(p7(l,m,a))}var Q=i.havingBaseStyle(tr.TEXT),j=Be.makeVList({positionType:"bottom",positionData:D,children:k},Q);return V7(Be.makeSpan(["delimsizing","mult"],[j],Q),tr.TEXT,i,s)},"makeStackedDelim"),g7=80,y7=.08,v7=o(function(e,r,n,i,a){var s=Ebe(e,i,n),l=new Kl(e,s),u=new ll([l],{width:"400em",height:kt(r),viewBox:"0 0 400000 "+n,preserveAspectRatio:"xMinYMin slice"});return Be.makeSvgSpan(["hide-tail"],[u],a)},"sqrtSvg"),b4e=o(function(e,r){var n=r.havingBaseSizing(),i=dG("\\surd",e*n.sizeMultiplier,fG,n),a=n.sizeMultiplier,s=Math.max(0,r.minRuleThickness-r.fontMetrics().sqrtRuleThickness),l,u=0,h=0,f=0,d;return i.type==="small"?(f=1e3+1e3*s+g7,e<1?a=1:e<1.4&&(a=.7),u=(1+s+y7)/a,h=(1+s)/a,l=v7("sqrtMain",u,f,s,r),l.style.minWidth="0.853em",d=.833/a):i.type==="large"?(f=(1e3+g7)*$y[i.size],h=($y[i.size]+s)/a,u=($y[i.size]+s+y7)/a,l=v7("sqrtSize"+i.size,u,f,s,r),l.style.minWidth="1.02em",d=1/a):(u=e+s+y7,h=e+s,f=Math.floor(1e3*e+s)+g7,l=v7("sqrtTall",u,f,s,r),l.style.minWidth="0.742em",d=1.056),l.height=h,l.style.height=kt(u),{span:l,advanceWidth:d,ruleWidth:(r.fontMetrics().sqrtRuleThickness+s)*a}},"makeSqrtImage"),uG=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","\\surd"],w4e=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1"],hG=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],$y=[0,1.2,1.8,2.4,3],T4e=o(function(e,r,n,i,a){if(e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle"),Jt.contains(uG,e)||Jt.contains(hG,e))return lG(e,r,!1,n,i,a);if(Jt.contains(w4e,e))return cG(e,$y[r],!1,n,i,a);throw new gt("Illegal delimiter: '"+e+"'")},"makeSizedDelim"),k4e=[{type:"small",style:tr.SCRIPTSCRIPT},{type:"small",style:tr.SCRIPT},{type:"small",style:tr.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],E4e=[{type:"small",style:tr.SCRIPTSCRIPT},{type:"small",style:tr.SCRIPT},{type:"small",style:tr.TEXT},{type:"stack"}],fG=[{type:"small",style:tr.SCRIPTSCRIPT},{type:"small",style:tr.SCRIPT},{type:"small",style:tr.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],S4e=o(function(e){if(e.type==="small")return"Main-Regular";if(e.type==="large")return"Size"+e.size+"-Regular";if(e.type==="stack")return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},"delimTypeToFont"),dG=o(function(e,r,n,i){for(var a=Math.min(2,3-i.style.size),s=a;sr)return n[s]}return n[n.length-1]},"traverseSequence"),pG=o(function(e,r,n,i,a,s){e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle");var l;Jt.contains(hG,e)?l=k4e:Jt.contains(uG,e)?l=fG:l=E4e;var u=dG(e,r,l,i);return u.type==="small"?g4e(e,u.style,n,i,a,s):u.type==="large"?lG(e,u.size,n,i,a,s):cG(e,r,n,i,a,s)},"makeCustomSizedDelim"),C4e=o(function(e,r,n,i,a,s){var l=i.fontMetrics().axisHeight*i.sizeMultiplier,u=901,h=5/i.fontMetrics().ptPerEm,f=Math.max(r-l,n+l),d=Math.max(f/500*u,2*f-h);return pG(e,d,!0,i,a,s)},"makeLeftRightDelim"),ou={sqrtImage:b4e,sizedDelim:T4e,sizeToMaxHeight:$y,customSizedDelim:pG,leftRightDelim:C4e},xz={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},A4e=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27E8","\\rangle","\u27E9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];o(k3,"checkDelimiter");Nt({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:o((t,e)=>{var r=k3(e[0],t);return{type:"delimsizing",mode:t.parser.mode,size:xz[t.funcName].size,mclass:xz[t.funcName].mclass,delim:r.text}},"handler"),htmlBuilder:o((t,e)=>t.delim==="."?Be.makeSpan([t.mclass]):ou.sizedDelim(t.delim,t.size,e,t.mode,[t.mclass]),"htmlBuilder"),mathmlBuilder:o(t=>{var e=[];t.delim!=="."&&e.push(Co(t.delim,t.mode));var r=new dt.MathNode("mo",e);t.mclass==="mopen"||t.mclass==="mclose"?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var n=kt(ou.sizeToMaxHeight[t.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r},"mathmlBuilder")});o(bz,"assertParsed");Nt({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=t.parser.gullet.macros.get("\\current@color");if(r&&typeof r!="string")throw new gt("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:t.parser.mode,delim:k3(e[0],t).text,color:r}},"handler")});Nt({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=k3(e[0],t),n=t.parser;++n.leftrightDepth;var i=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var a=xr(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:i,left:r.text,right:a.delim,rightColor:a.color}},"handler"),htmlBuilder:o((t,e)=>{bz(t);for(var r=Pi(t.body,e,!0,["mopen","mclose"]),n=0,i=0,a=!1,s=0;s{bz(t);var r=ks(t.body,e);if(t.left!=="."){var n=new dt.MathNode("mo",[Co(t.left,t.mode)]);n.setAttribute("fence","true"),r.unshift(n)}if(t.right!=="."){var i=new dt.MathNode("mo",[Co(t.right,t.mode)]);i.setAttribute("fence","true"),t.rightColor&&i.setAttribute("mathcolor",t.rightColor),r.push(i)}return F7(r)},"mathmlBuilder")});Nt({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=k3(e[0],t);if(!t.parser.leftrightDepth)throw new gt("\\middle without preceding \\left",r);return{type:"middle",mode:t.parser.mode,delim:r.text}},"handler"),htmlBuilder:o((t,e)=>{var r;if(t.delim===".")r=Hy(e,[]);else{r=ou.sizedDelim(t.delim,1,e,t.mode,[]);var n={delim:t.delim,options:e};r.isMiddle=n}return r},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=t.delim==="\\vert"||t.delim==="|"?Co("|","text"):Co(t.delim,t.mode),n=new dt.MathNode("mo",[r]);return n.setAttribute("fence","true"),n.setAttribute("lspace","0.05em"),n.setAttribute("rspace","0.05em"),n},"mathmlBuilder")});U7=o((t,e)=>{var r=Be.wrapFragment(Fr(t.body,e),e),n=t.label.slice(1),i=e.sizeMultiplier,a,s=0,l=Jt.isCharacterBox(t.body);if(n==="sout")a=Be.makeSpan(["stretchy","sout"]),a.height=e.fontMetrics().defaultRuleThickness/i,s=-.5*e.fontMetrics().xHeight;else if(n==="phase"){var u=ti({number:.6,unit:"pt"},e),h=ti({number:.35,unit:"ex"},e),f=e.havingBaseSizing();i=i/f.sizeMultiplier;var d=r.height+r.depth+u+h;r.style.paddingLeft=kt(d/2+u);var p=Math.floor(1e3*d*i),m=Tbe(p),g=new ll([new Kl("phase",m)],{width:"400em",height:kt(p/1e3),viewBox:"0 0 400000 "+p,preserveAspectRatio:"xMinYMin slice"});a=Be.makeSvgSpan(["hide-tail"],[g],e),a.style.height=kt(d),s=r.depth+u+h}else{/cancel/.test(n)?l||r.classes.push("cancel-pad"):n==="angl"?r.classes.push("anglpad"):r.classes.push("boxpad");var y=0,v=0,x=0;/box/.test(n)?(x=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),y=e.fontMetrics().fboxsep+(n==="colorbox"?0:x),v=y):n==="angl"?(x=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),y=4*x,v=Math.max(0,.25-r.depth)):(y=l?.2:0,v=y),a=cu.encloseSpan(r,n,y,v,e),/fbox|boxed|fcolorbox/.test(n)?(a.style.borderStyle="solid",a.style.borderWidth=kt(x)):n==="angl"&&x!==.049&&(a.style.borderTopWidth=kt(x),a.style.borderRightWidth=kt(x)),s=r.depth+v,t.backgroundColor&&(a.style.backgroundColor=t.backgroundColor,t.borderColor&&(a.style.borderColor=t.borderColor))}var b;if(t.backgroundColor)b=Be.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:s},{type:"elem",elem:r,shift:0}]},e);else{var w=/cancel|phase/.test(n)?["svg-align"]:[];b=Be.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:0},{type:"elem",elem:a,shift:s,wrapperClasses:w}]},e)}return/cancel/.test(n)&&(b.height=r.height,b.depth=r.depth),/cancel/.test(n)&&!l?Be.makeSpan(["mord","cancel-lap"],[b],e):Be.makeSpan(["mord"],[b],e)},"htmlBuilder$7"),H7=o((t,e)=>{var r=0,n=new dt.MathNode(t.label.indexOf("colorbox")>-1?"mpadded":"menclose",[yn(t.body,e)]);switch(t.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),t.label==="\\fcolorbox"){var i=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);n.setAttribute("style","border: "+i+"em solid "+String(t.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return t.backgroundColor&&n.setAttribute("mathbackground",t.backgroundColor),n},"mathmlBuilder$6");Nt({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=xr(e[0],"color-token").color,s=e[1];return{type:"enclose",mode:n.mode,label:i,backgroundColor:a,body:s}},htmlBuilder:U7,mathmlBuilder:H7});Nt({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=xr(e[0],"color-token").color,s=xr(e[1],"color-token").color,l=e[2];return{type:"enclose",mode:n.mode,label:i,backgroundColor:s,borderColor:a,body:l}},htmlBuilder:U7,mathmlBuilder:H7});Nt({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\fbox",body:e[0]}}});Nt({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"enclose",mode:r.mode,label:n,body:i}},htmlBuilder:U7,mathmlBuilder:H7});Nt({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\angl",body:e[0]}}});mG={};o(Ql,"defineEnvironment");gG={};o(fe,"defineMacro");o(wz,"getHLines");E3=o(t=>{var e=t.parser.settings;if(!e.displayMode)throw new gt("{"+t.envName+"} can be used only in display mode.")},"validateAmsEnvironmentContext");o(W7,"getAutoTag");o(ph,"parseArray");o(q7,"dCellStyle");Zl=o(function(e,r){var n,i,a=e.body.length,s=e.hLinesBeforeRow,l=0,u=new Array(a),h=[],f=Math.max(r.fontMetrics().arrayRuleWidth,r.minRuleThickness),d=1/r.fontMetrics().ptPerEm,p=5*d;if(e.colSeparationType&&e.colSeparationType==="small"){var m=r.havingStyle(tr.SCRIPT).sizeMultiplier;p=.2778*(m/r.sizeMultiplier)}var g=e.colSeparationType==="CD"?ti({number:3,unit:"ex"},r):12*d,y=3*d,v=e.arraystretch*g,x=.7*v,b=.3*v,w=0;function C(ae){for(var Oe=0;Oe0&&(w+=.25),h.push({pos:w,isDashed:ae[Oe]})}for(o(C,"setHLinePos"),C(s[0]),n=0;n0&&(D+=b,Aae))for(n=0;n=l)){var le=void 0;(i>0||e.hskipBeforeAndAfter)&&(le=Jt.deflt(H.pregap,p),le!==0&&(O=Be.makeSpan(["arraycolsep"],[]),O.style.width=kt(le),R.push(O)));var he=[];for(n=0;n0){for(var J=Be.makeLineSpan("hline",r,f),se=Be.makeLineSpan("hdashline",r,f),ue=[{type:"elem",elem:u,shift:0}];h.length>0;){var Z=h.pop(),Se=Z.pos-k;Z.isDashed?ue.push({type:"elem",elem:se,shift:Se}):ue.push({type:"elem",elem:J,shift:Se})}u=Be.makeVList({positionType:"individualShift",children:ue},r)}if(B.length===0)return Be.makeSpan(["mord"],[u],r);var ce=Be.makeVList({positionType:"individualShift",children:B},r);return ce=Be.makeSpan(["tag"],[ce],r),Be.makeFragment([u,ce])},"htmlBuilder"),_4e={c:"center ",l:"left ",r:"right "},Jl=o(function(e,r){for(var n=[],i=new dt.MathNode("mtd",[],["mtr-glue"]),a=new dt.MathNode("mtd",[],["mml-eqn-num"]),s=0;s0){var g=e.cols,y="",v=!1,x=0,b=g.length;g[0].type==="separator"&&(p+="top ",x=1),g[g.length-1].type==="separator"&&(p+="bottom ",b-=1);for(var w=x;w0?"left ":"",p+=S[S.length-1].length>0?"right ":"";for(var _=1;_-1?"alignat":"align",a=e.envName==="split",s=ph(e.parser,{cols:n,addJot:!0,autoTag:a?void 0:W7(e.envName),emptySingleRow:!0,colSeparationType:i,maxNumCols:a?2:void 0,leqno:e.parser.settings.leqno},"display"),l,u=0,h={type:"ordgroup",mode:e.mode,body:[]};if(r[0]&&r[0].type==="ordgroup"){for(var f="",d=0;d0&&m&&(v=1),n[g]={type:"align",align:y,pregap:v,postgap:0}}return s.colSeparationType=m?"align":"alignat",s},"alignedHandler");Ql({type:"array",names:["array","darray"],props:{numArgs:1},handler(t,e){var r=w3(e[0]),n=r?[e[0]]:xr(e[0],"ordgroup").body,i=n.map(function(s){var l=z7(s),u=l.text;if("lcr".indexOf(u)!==-1)return{type:"align",align:u};if(u==="|")return{type:"separator",separator:"|"};if(u===":")return{type:"separator",separator:":"};throw new gt("Unknown column alignment: "+u,s)}),a={cols:i,hskipBeforeAndAfter:!0,maxNumCols:i.length};return ph(t.parser,a,q7(t.envName))},htmlBuilder:Zl,mathmlBuilder:Jl});Ql({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(t){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[t.envName.replace("*","")],r="c",n={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if(t.envName.charAt(t.envName.length-1)==="*"){var i=t.parser;if(i.consumeSpaces(),i.fetch().text==="["){if(i.consume(),i.consumeSpaces(),r=i.fetch().text,"lcr".indexOf(r)===-1)throw new gt("Expected l or c or r",i.nextToken);i.consume(),i.consumeSpaces(),i.expect("]"),i.consume(),n.cols=[{type:"align",align:r}]}}var a=ph(t.parser,n,q7(t.envName)),s=Math.max(0,...a.body.map(l=>l.length));return a.cols=new Array(s).fill({type:"align",align:r}),e?{type:"leftright",mode:t.mode,body:[a],left:e[0],right:e[1],rightColor:void 0}:a},htmlBuilder:Zl,mathmlBuilder:Jl});Ql({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(t){var e={arraystretch:.5},r=ph(t.parser,e,"script");return r.colSeparationType="small",r},htmlBuilder:Zl,mathmlBuilder:Jl});Ql({type:"array",names:["subarray"],props:{numArgs:1},handler(t,e){var r=w3(e[0]),n=r?[e[0]]:xr(e[0],"ordgroup").body,i=n.map(function(s){var l=z7(s),u=l.text;if("lc".indexOf(u)!==-1)return{type:"align",align:u};throw new gt("Unknown column alignment: "+u,s)});if(i.length>1)throw new gt("{subarray} can contain only one column");var a={cols:i,hskipBeforeAndAfter:!1,arraystretch:.5};if(a=ph(t.parser,a,"script"),a.body.length>0&&a.body[0].length>1)throw new gt("{subarray} can contain only one column");return a},htmlBuilder:Zl,mathmlBuilder:Jl});Ql({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(t){var e={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},r=ph(t.parser,e,q7(t.envName));return{type:"leftright",mode:t.mode,body:[r],left:t.envName.indexOf("r")>-1?".":"\\{",right:t.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:Zl,mathmlBuilder:Jl});Ql({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:yG,htmlBuilder:Zl,mathmlBuilder:Jl});Ql({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(t){Jt.contains(["gather","gather*"],t.envName)&&E3(t);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:W7(t.envName),emptySingleRow:!0,leqno:t.parser.settings.leqno};return ph(t.parser,e,"display")},htmlBuilder:Zl,mathmlBuilder:Jl});Ql({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:yG,htmlBuilder:Zl,mathmlBuilder:Jl});Ql({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(t){E3(t);var e={autoTag:W7(t.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:t.parser.settings.leqno};return ph(t.parser,e,"display")},htmlBuilder:Zl,mathmlBuilder:Jl});Ql({type:"array",names:["CD"],props:{numArgs:0},handler(t){return E3(t),p4e(t.parser)},htmlBuilder:Zl,mathmlBuilder:Jl});fe("\\nonumber","\\gdef\\@eqnsw{0}");fe("\\notag","\\nonumber");Nt({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(t,e){throw new gt(t.funcName+" valid only within array environment")}});Tz=mG;Nt({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];if(i.type!=="ordgroup")throw new gt("Invalid environment name",i);for(var a="",s=0;s{var r=t.font,n=e.withFont(r);return Fr(t.body,n)},"htmlBuilder$5"),xG=o((t,e)=>{var r=t.font,n=e.withFont(r);return yn(t.body,n)},"mathmlBuilder$4"),kz={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};Nt({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=g3(e[0]),a=n;return a in kz&&(a=kz[a]),{type:"font",mode:r.mode,font:a.slice(1),body:i}},"handler"),htmlBuilder:vG,mathmlBuilder:xG});Nt({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r}=t,n=e[0],i=Jt.isCharacterBox(n);return{type:"mclass",mode:r.mode,mclass:T3(n),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:n}],isCharacterBox:i}},"handler")});Nt({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:o((t,e)=>{var{parser:r,funcName:n,breakOnTokenText:i}=t,{mode:a}=r,s=r.parseExpression(!0,i),l="math"+n.slice(1);return{type:"font",mode:a,font:l,body:{type:"ordgroup",mode:r.mode,body:s}}},"handler"),htmlBuilder:vG,mathmlBuilder:xG});bG=o((t,e)=>{var r=e;return t==="display"?r=r.id>=tr.SCRIPT.id?r.text():tr.DISPLAY:t==="text"&&r.size===tr.DISPLAY.size?r=tr.TEXT:t==="script"?r=tr.SCRIPT:t==="scriptscript"&&(r=tr.SCRIPTSCRIPT),r},"adjustStyle"),Y7=o((t,e)=>{var r=bG(t.size,e.style),n=r.fracNum(),i=r.fracDen(),a;a=e.havingStyle(n);var s=Fr(t.numer,a,e);if(t.continued){var l=8.5/e.fontMetrics().ptPerEm,u=3.5/e.fontMetrics().ptPerEm;s.height=s.height0?g=3*p:g=7*p,y=e.fontMetrics().denom1):(d>0?(m=e.fontMetrics().num2,g=p):(m=e.fontMetrics().num3,g=3*p),y=e.fontMetrics().denom2);var v;if(f){var b=e.fontMetrics().axisHeight;m-s.depth-(b+.5*d){var r=new dt.MathNode("mfrac",[yn(t.numer,e),yn(t.denom,e)]);if(!t.hasBarLine)r.setAttribute("linethickness","0px");else if(t.barSize){var n=ti(t.barSize,e);r.setAttribute("linethickness",kt(n))}var i=bG(t.size,e.style);if(i.size!==e.style.size){r=new dt.MathNode("mstyle",[r]);var a=i.size===tr.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",a),r.setAttribute("scriptlevel","0")}if(t.leftDelim!=null||t.rightDelim!=null){var s=[];if(t.leftDelim!=null){var l=new dt.MathNode("mo",[new dt.TextNode(t.leftDelim.replace("\\",""))]);l.setAttribute("fence","true"),s.push(l)}if(s.push(r),t.rightDelim!=null){var u=new dt.MathNode("mo",[new dt.TextNode(t.rightDelim.replace("\\",""))]);u.setAttribute("fence","true"),s.push(u)}return F7(s)}return r},"mathmlBuilder$3");Nt({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1],s,l=null,u=null,h="auto";switch(n){case"\\dfrac":case"\\frac":case"\\tfrac":s=!0;break;case"\\\\atopfrac":s=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":s=!1,l="(",u=")";break;case"\\\\bracefrac":s=!1,l="\\{",u="\\}";break;case"\\\\brackfrac":s=!1,l="[",u="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\dfrac":case"\\dbinom":h="display";break;case"\\tfrac":case"\\tbinom":h="text";break}return{type:"genfrac",mode:r.mode,continued:!1,numer:i,denom:a,hasBarLine:s,leftDelim:l,rightDelim:u,size:h,barSize:null}},"handler"),htmlBuilder:Y7,mathmlBuilder:X7});Nt({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1];return{type:"genfrac",mode:r.mode,continued:!0,numer:i,denom:a,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}},"handler")});Nt({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(t){var{parser:e,funcName:r,token:n}=t,i;switch(r){case"\\over":i="\\frac";break;case"\\choose":i="\\binom";break;case"\\atop":i="\\\\atopfrac";break;case"\\brace":i="\\\\bracefrac";break;case"\\brack":i="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:i,token:n}}});Ez=["display","text","script","scriptscript"],Sz=o(function(e){var r=null;return e.length>0&&(r=e,r=r==="."?null:r),r},"delimFromValue");Nt({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(t,e){var{parser:r}=t,n=e[4],i=e[5],a=g3(e[0]),s=a.type==="atom"&&a.family==="open"?Sz(a.text):null,l=g3(e[1]),u=l.type==="atom"&&l.family==="close"?Sz(l.text):null,h=xr(e[2],"size"),f,d=null;h.isBlank?f=!0:(d=h.value,f=d.number>0);var p="auto",m=e[3];if(m.type==="ordgroup"){if(m.body.length>0){var g=xr(m.body[0],"textord");p=Ez[Number(g.text)]}}else m=xr(m,"textord"),p=Ez[Number(m.text)];return{type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:f,barSize:d,leftDelim:s,rightDelim:u,size:p}},htmlBuilder:Y7,mathmlBuilder:X7});Nt({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(t,e){var{parser:r,funcName:n,token:i}=t;return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:xr(e[0],"size").value,token:i}}});Nt({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=obe(xr(e[1],"infix").size),s=e[2],l=a.number>0;return{type:"genfrac",mode:r.mode,numer:i,denom:s,continued:!1,hasBarLine:l,barSize:a,leftDelim:null,rightDelim:null,size:"auto"}},"handler"),htmlBuilder:Y7,mathmlBuilder:X7});wG=o((t,e)=>{var r=e.style,n,i;t.type==="supsub"?(n=t.sup?Fr(t.sup,e.havingStyle(r.sup()),e):Fr(t.sub,e.havingStyle(r.sub()),e),i=xr(t.base,"horizBrace")):i=xr(t,"horizBrace");var a=Fr(i.base,e.havingBaseStyle(tr.DISPLAY)),s=cu.svgSpan(i,e),l;if(i.isOver?(l=Be.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:.1},{type:"elem",elem:s}]},e),l.children[0].children[0].children[1].classes.push("svg-align")):(l=Be.makeVList({positionType:"bottom",positionData:a.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:a}]},e),l.children[0].children[0].children[0].classes.push("svg-align")),n){var u=Be.makeSpan(["mord",i.isOver?"mover":"munder"],[l],e);i.isOver?l=Be.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:u},{type:"kern",size:.2},{type:"elem",elem:n}]},e):l=Be.makeVList({positionType:"bottom",positionData:u.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:u}]},e)}return Be.makeSpan(["mord",i.isOver?"mover":"munder"],[l],e)},"htmlBuilder$3"),D4e=o((t,e)=>{var r=cu.mathMLnode(t.label);return new dt.MathNode(t.isOver?"mover":"munder",[yn(t.base,e),r])},"mathmlBuilder$2");Nt({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:e[0]}},htmlBuilder:wG,mathmlBuilder:D4e});Nt({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[1],i=xr(e[0],"url").url;return r.settings.isTrusted({command:"\\href",url:i})?{type:"href",mode:r.mode,href:i,body:di(n)}:r.formatUnsupportedCmd("\\href")},"handler"),htmlBuilder:o((t,e)=>{var r=Pi(t.body,e,!1);return Be.makeAnchor(t.href,[],r,e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=dh(t.body,e);return r instanceof ws||(r=new ws("mrow",[r])),r.setAttribute("href",t.href),r},"mathmlBuilder")});Nt({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=xr(e[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");for(var i=[],a=0;a{var{parser:r,funcName:n,token:i}=t,a=xr(e[0],"raw").string,s=e[1];r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var l,u={};switch(n){case"\\htmlClass":u.class=a,l={command:"\\htmlClass",class:a};break;case"\\htmlId":u.id=a,l={command:"\\htmlId",id:a};break;case"\\htmlStyle":u.style=a,l={command:"\\htmlStyle",style:a};break;case"\\htmlData":{for(var h=a.split(","),f=0;f{var r=Pi(t.body,e,!1),n=["enclosing"];t.attributes.class&&n.push(...t.attributes.class.trim().split(/\s+/));var i=Be.makeSpan(n,r,e);for(var a in t.attributes)a!=="class"&&t.attributes.hasOwnProperty(a)&&i.setAttribute(a,t.attributes[a]);return i},"htmlBuilder"),mathmlBuilder:o((t,e)=>dh(t.body,e),"mathmlBuilder")});Nt({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t;return{type:"htmlmathml",mode:r.mode,html:di(e[0]),mathml:di(e[1])}},"handler"),htmlBuilder:o((t,e)=>{var r=Pi(t.html,e,!1);return Be.makeFragment(r)},"htmlBuilder"),mathmlBuilder:o((t,e)=>dh(t.mathml,e),"mathmlBuilder")});x7=o(function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var r=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!r)throw new gt("Invalid size: '"+e+"' in \\includegraphics");var n={number:+(r[1]+r[2]),unit:r[3]};if(!zz(n))throw new gt("Invalid unit: '"+n.unit+"' in \\includegraphics.");return n},"sizeData");Nt({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:o((t,e,r)=>{var{parser:n}=t,i={number:0,unit:"em"},a={number:.9,unit:"em"},s={number:0,unit:"em"},l="";if(r[0])for(var u=xr(r[0],"raw").string,h=u.split(","),f=0;f{var r=ti(t.height,e),n=0;t.totalheight.number>0&&(n=ti(t.totalheight,e)-r);var i=0;t.width.number>0&&(i=ti(t.width,e));var a={height:kt(r+n)};i>0&&(a.width=kt(i)),n>0&&(a.verticalAlign=kt(-n));var s=new S7(t.src,t.alt,a);return s.height=r,s.depth=n,s},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=new dt.MathNode("mglyph",[]);r.setAttribute("alt",t.alt);var n=ti(t.height,e),i=0;if(t.totalheight.number>0&&(i=ti(t.totalheight,e)-n,r.setAttribute("valign",kt(-i))),r.setAttribute("height",kt(n+i)),t.width.number>0){var a=ti(t.width,e);r.setAttribute("width",kt(a))}return r.setAttribute("src",t.src),r},"mathmlBuilder")});Nt({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=xr(e[0],"size");if(r.settings.strict){var a=n[1]==="m",s=i.value.unit==="mu";a?(s||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, "+("not "+i.value.unit+" units")),r.mode!=="math"&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):s&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:i.value}},htmlBuilder(t,e){return Be.makeGlue(t.dimension,e)},mathmlBuilder(t,e){var r=ti(t.dimension,e);return new dt.SpaceNode(r)}});Nt({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:i}},"handler"),htmlBuilder:o((t,e)=>{var r;t.alignment==="clap"?(r=Be.makeSpan([],[Fr(t.body,e)]),r=Be.makeSpan(["inner"],[r],e)):r=Be.makeSpan(["inner"],[Fr(t.body,e)]);var n=Be.makeSpan(["fix"],[]),i=Be.makeSpan([t.alignment],[r,n],e),a=Be.makeSpan(["strut"]);return a.style.height=kt(i.height+i.depth),i.depth&&(a.style.verticalAlign=kt(-i.depth)),i.children.unshift(a),i=Be.makeSpan(["thinbox"],[i],e),Be.makeSpan(["mord","vbox"],[i],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=new dt.MathNode("mpadded",[yn(t.body,e)]);if(t.alignment!=="rlap"){var n=t.alignment==="llap"?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r},"mathmlBuilder")});Nt({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){var{funcName:r,parser:n}=t,i=n.mode;n.switchMode("math");var a=r==="\\("?"\\)":"$",s=n.parseExpression(!1,a);return n.expect(a),n.switchMode(i),{type:"styling",mode:n.mode,style:"text",body:s}}});Nt({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){throw new gt("Mismatched "+t.funcName)}});Cz=o((t,e)=>{switch(e.style.size){case tr.DISPLAY.size:return t.display;case tr.TEXT.size:return t.text;case tr.SCRIPT.size:return t.script;case tr.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}},"chooseMathStyle");Nt({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:o((t,e)=>{var{parser:r}=t;return{type:"mathchoice",mode:r.mode,display:di(e[0]),text:di(e[1]),script:di(e[2]),scriptscript:di(e[3])}},"handler"),htmlBuilder:o((t,e)=>{var r=Cz(t,e),n=Pi(r,e,!1);return Be.makeFragment(n)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=Cz(t,e);return dh(r,e)},"mathmlBuilder")});TG=o((t,e,r,n,i,a,s)=>{t=Be.makeSpan([],[t]);var l=r&&Jt.isCharacterBox(r),u,h;if(e){var f=Fr(e,n.havingStyle(i.sup()),n);h={elem:f,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-f.depth)}}if(r){var d=Fr(r,n.havingStyle(i.sub()),n);u={elem:d,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-d.height)}}var p;if(h&&u){var m=n.fontMetrics().bigOpSpacing5+u.elem.height+u.elem.depth+u.kern+t.depth+s;p=Be.makeVList({positionType:"bottom",positionData:m,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:u.elem,marginLeft:kt(-a)},{type:"kern",size:u.kern},{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:kt(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(u){var g=t.height-s;p=Be.makeVList({positionType:"top",positionData:g,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:u.elem,marginLeft:kt(-a)},{type:"kern",size:u.kern},{type:"elem",elem:t}]},n)}else if(h){var y=t.depth+s;p=Be.makeVList({positionType:"bottom",positionData:y,children:[{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:kt(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else return t;var v=[p];if(u&&a!==0&&!l){var x=Be.makeSpan(["mspace"],[],n);x.style.marginRight=kt(a),v.unshift(x)}return Be.makeSpan(["mop","op-limits"],v,n)},"assembleSupSub"),kG=["\\smallint"],m0=o((t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=xr(t.base,"op"),i=!0):a=xr(t,"op");var s=e.style,l=!1;s.size===tr.DISPLAY.size&&a.symbol&&!Jt.contains(kG,a.name)&&(l=!0);var u;if(a.symbol){var h=l?"Size2-Regular":"Size1-Regular",f="";if((a.name==="\\oiint"||a.name==="\\oiiint")&&(f=a.name.slice(1),a.name=f==="oiint"?"\\iint":"\\iiint"),u=Be.makeSymbol(a.name,h,"math",e,["mop","op-symbol",l?"large-op":"small-op"]),f.length>0){var d=u.italic,p=Be.staticSvg(f+"Size"+(l?"2":"1"),e);u=Be.makeVList({positionType:"individualShift",children:[{type:"elem",elem:u,shift:0},{type:"elem",elem:p,shift:l?.08:0}]},e),a.name="\\"+f,u.classes.unshift("mop"),u.italic=d}}else if(a.body){var m=Pi(a.body,e,!0);m.length===1&&m[0]instanceof Ts?(u=m[0],u.classes[0]="mop"):u=Be.makeSpan(["mop"],m,e)}else{for(var g=[],y=1;y{var r;if(t.symbol)r=new ws("mo",[Co(t.name,t.mode)]),Jt.contains(kG,t.name)&&r.setAttribute("largeop","false");else if(t.body)r=new ws("mo",ks(t.body,e));else{r=new ws("mi",[new Jf(t.name.slice(1))]);var n=new ws("mo",[Co("\u2061","text")]);t.parentIsSupSub?r=new ws("mrow",[r,n]):r=Qz([r,n])}return r},"mathmlBuilder$1"),L4e={"\u220F":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22C0":"\\bigwedge","\u22C1":"\\bigvee","\u22C2":"\\bigcap","\u22C3":"\\bigcup","\u2A00":"\\bigodot","\u2A01":"\\bigoplus","\u2A02":"\\bigotimes","\u2A04":"\\biguplus","\u2A06":"\\bigsqcup"};Nt({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220F","\u2210","\u2211","\u22C0","\u22C1","\u22C2","\u22C3","\u2A00","\u2A01","\u2A02","\u2A04","\u2A06"],props:{numArgs:0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=n;return i.length===1&&(i=L4e[i]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:i}},"handler"),htmlBuilder:m0,mathmlBuilder:Wy});Nt({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:di(n)}},"handler"),htmlBuilder:m0,mathmlBuilder:Wy});R4e={"\u222B":"\\int","\u222C":"\\iint","\u222D":"\\iiint","\u222E":"\\oint","\u222F":"\\oiint","\u2230":"\\oiiint"};Nt({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:m0,mathmlBuilder:Wy});Nt({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:m0,mathmlBuilder:Wy});Nt({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222B","\u222C","\u222D","\u222E","\u222F","\u2230"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t,n=r;return n.length===1&&(n=R4e[n]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:m0,mathmlBuilder:Wy});EG=o((t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=xr(t.base,"operatorname"),i=!0):a=xr(t,"operatorname");var s;if(a.body.length>0){for(var l=a.body.map(d=>{var p=d.text;return typeof p=="string"?{type:"textord",mode:d.mode,text:p}:d}),u=Pi(l,e.withFont("mathrm"),!0),h=0;h{for(var r=ks(t.body,e.withFont("mathrm")),n=!0,i=0;if.toText()).join("");r=[new dt.TextNode(l)]}var u=new dt.MathNode("mi",r);u.setAttribute("mathvariant","normal");var h=new dt.MathNode("mo",[Co("\u2061","text")]);return t.parentIsSupSub?new dt.MathNode("mrow",[u,h]):dt.newDocumentFragment([u,h])},"mathmlBuilder");Nt({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"operatorname",mode:r.mode,body:di(i),alwaysHandleSupSub:n==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},"handler"),htmlBuilder:EG,mathmlBuilder:N4e});fe("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");rd({type:"ordgroup",htmlBuilder(t,e){return t.semisimple?Be.makeFragment(Pi(t.body,e,!1)):Be.makeSpan(["mord"],Pi(t.body,e,!0),e)},mathmlBuilder(t,e){return dh(t.body,e,!0)}});Nt({type:"overline",names:["\\overline"],props:{numArgs:1},handler(t,e){var{parser:r}=t,n=e[0];return{type:"overline",mode:r.mode,body:n}},htmlBuilder(t,e){var r=Fr(t.body,e.havingCrampedStyle()),n=Be.makeLineSpan("overline-line",e),i=e.fontMetrics().defaultRuleThickness,a=Be.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*i},{type:"elem",elem:n},{type:"kern",size:i}]},e);return Be.makeSpan(["mord","overline"],[a],e)},mathmlBuilder(t,e){var r=new dt.MathNode("mo",[new dt.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new dt.MathNode("mover",[yn(t.body,e),r]);return n.setAttribute("accent","true"),n}});Nt({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"phantom",mode:r.mode,body:di(n)}},"handler"),htmlBuilder:o((t,e)=>{var r=Pi(t.body,e.withPhantom(),!1);return Be.makeFragment(r)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=ks(t.body,e);return new dt.MathNode("mphantom",r)},"mathmlBuilder")});Nt({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"hphantom",mode:r.mode,body:n}},"handler"),htmlBuilder:o((t,e)=>{var r=Be.makeSpan([],[Fr(t.body,e.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var n=0;n{var r=ks(di(t.body),e),n=new dt.MathNode("mphantom",r),i=new dt.MathNode("mpadded",[n]);return i.setAttribute("height","0px"),i.setAttribute("depth","0px"),i},"mathmlBuilder")});Nt({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"vphantom",mode:r.mode,body:n}},"handler"),htmlBuilder:o((t,e)=>{var r=Be.makeSpan(["inner"],[Fr(t.body,e.withPhantom())]),n=Be.makeSpan(["fix"],[]);return Be.makeSpan(["mord","rlap"],[r,n],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=ks(di(t.body),e),n=new dt.MathNode("mphantom",r),i=new dt.MathNode("mpadded",[n]);return i.setAttribute("width","0px"),i},"mathmlBuilder")});Nt({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t,n=xr(e[0],"size").value,i=e[1];return{type:"raisebox",mode:r.mode,dy:n,body:i}},htmlBuilder(t,e){var r=Fr(t.body,e),n=ti(t.dy,e);return Be.makeVList({positionType:"shift",positionData:-n,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){var r=new dt.MathNode("mpadded",[yn(t.body,e)]),n=t.dy.number+t.dy.unit;return r.setAttribute("voffset",n),r}});Nt({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0},handler(t){var{parser:e}=t;return{type:"internal",mode:e.mode}}});Nt({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},handler(t,e,r){var{parser:n}=t,i=r[0],a=xr(e[0],"size"),s=xr(e[1],"size");return{type:"rule",mode:n.mode,shift:i&&xr(i,"size").value,width:a.value,height:s.value}},htmlBuilder(t,e){var r=Be.makeSpan(["mord","rule"],[],e),n=ti(t.width,e),i=ti(t.height,e),a=t.shift?ti(t.shift,e):0;return r.style.borderRightWidth=kt(n),r.style.borderTopWidth=kt(i),r.style.bottom=kt(a),r.width=n,r.height=i+a,r.depth=-a,r.maxFontSize=i*1.125*e.sizeMultiplier,r},mathmlBuilder(t,e){var r=ti(t.width,e),n=ti(t.height,e),i=t.shift?ti(t.shift,e):0,a=e.color&&e.getColor()||"black",s=new dt.MathNode("mspace");s.setAttribute("mathbackground",a),s.setAttribute("width",kt(r)),s.setAttribute("height",kt(n));var l=new dt.MathNode("mpadded",[s]);return i>=0?l.setAttribute("height",kt(i)):(l.setAttribute("height",kt(i)),l.setAttribute("depth",kt(-i))),l.setAttribute("voffset",kt(i)),l}});o(SG,"sizingGroup");Az=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],M4e=o((t,e)=>{var r=e.havingSize(t.size);return SG(t.body,r,e)},"htmlBuilder");Nt({type:"sizing",names:Az,props:{numArgs:0,allowedInText:!0},handler:o((t,e)=>{var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!1,r);return{type:"sizing",mode:i.mode,size:Az.indexOf(n)+1,body:a}},"handler"),htmlBuilder:M4e,mathmlBuilder:o((t,e)=>{var r=e.havingSize(t.size),n=ks(t.body,r),i=new dt.MathNode("mstyle",n);return i.setAttribute("mathsize",kt(r.sizeMultiplier)),i},"mathmlBuilder")});Nt({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:o((t,e,r)=>{var{parser:n}=t,i=!1,a=!1,s=r[0]&&xr(r[0],"ordgroup");if(s)for(var l="",u=0;u{var r=Be.makeSpan([],[Fr(t.body,e)]);if(!t.smashHeight&&!t.smashDepth)return r;if(t.smashHeight&&(r.height=0,r.children))for(var n=0;n{var r=new dt.MathNode("mpadded",[yn(t.body,e)]);return t.smashHeight&&r.setAttribute("height","0px"),t.smashDepth&&r.setAttribute("depth","0px"),r},"mathmlBuilder")});Nt({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n}=t,i=r[0],a=e[0];return{type:"sqrt",mode:n.mode,body:a,index:i}},htmlBuilder(t,e){var r=Fr(t.body,e.havingCrampedStyle());r.height===0&&(r.height=e.fontMetrics().xHeight),r=Be.wrapFragment(r,e);var n=e.fontMetrics(),i=n.defaultRuleThickness,a=i;e.style.idr.height+r.depth+s&&(s=(s+d-r.height-r.depth)/2);var p=u.height-r.height-s-h;r.style.paddingLeft=kt(f);var m=Be.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+p)},{type:"elem",elem:u},{type:"kern",size:h}]},e);if(t.index){var g=e.havingStyle(tr.SCRIPTSCRIPT),y=Fr(t.index,g,e),v=.6*(m.height-m.depth),x=Be.makeVList({positionType:"shift",positionData:-v,children:[{type:"elem",elem:y}]},e),b=Be.makeSpan(["root"],[x]);return Be.makeSpan(["mord","sqrt"],[b,m],e)}else return Be.makeSpan(["mord","sqrt"],[m],e)},mathmlBuilder(t,e){var{body:r,index:n}=t;return n?new dt.MathNode("mroot",[yn(r,e),yn(n,e)]):new dt.MathNode("msqrt",[yn(r,e)])}});_z={display:tr.DISPLAY,text:tr.TEXT,script:tr.SCRIPT,scriptscript:tr.SCRIPTSCRIPT};Nt({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t,e){var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!0,r),s=n.slice(1,n.length-5);return{type:"styling",mode:i.mode,style:s,body:a}},htmlBuilder(t,e){var r=_z[t.style],n=e.havingStyle(r).withFont("");return SG(t.body,n,e)},mathmlBuilder(t,e){var r=_z[t.style],n=e.havingStyle(r),i=ks(t.body,n),a=new dt.MathNode("mstyle",i),s={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},l=s[t.style];return a.setAttribute("scriptlevel",l[0]),a.setAttribute("displaystyle",l[1]),a}});I4e=o(function(e,r){var n=e.base;if(n)if(n.type==="op"){var i=n.limits&&(r.style.size===tr.DISPLAY.size||n.alwaysHandleSupSub);return i?m0:null}else if(n.type==="operatorname"){var a=n.alwaysHandleSupSub&&(r.style.size===tr.DISPLAY.size||n.limits);return a?EG:null}else{if(n.type==="accent")return Jt.isCharacterBox(n.base)?G7:null;if(n.type==="horizBrace"){var s=!e.sub;return s===n.isOver?wG:null}else return null}else return null},"htmlBuilderDelegate");rd({type:"supsub",htmlBuilder(t,e){var r=I4e(t,e);if(r)return r(t,e);var{base:n,sup:i,sub:a}=t,s=Fr(n,e),l,u,h=e.fontMetrics(),f=0,d=0,p=n&&Jt.isCharacterBox(n);if(i){var m=e.havingStyle(e.style.sup());l=Fr(i,m,e),p||(f=s.height-m.fontMetrics().supDrop*m.sizeMultiplier/e.sizeMultiplier)}if(a){var g=e.havingStyle(e.style.sub());u=Fr(a,g,e),p||(d=s.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}var y;e.style===tr.DISPLAY?y=h.sup1:e.style.cramped?y=h.sup3:y=h.sup2;var v=e.sizeMultiplier,x=kt(.5/h.ptPerEm/v),b=null;if(u){var w=t.base&&t.base.type==="op"&&t.base.name&&(t.base.name==="\\oiint"||t.base.name==="\\oiiint");(s instanceof Ts||w)&&(b=kt(-s.italic))}var C;if(l&&u){f=Math.max(f,y,l.depth+.25*h.xHeight),d=Math.max(d,h.sub2);var T=h.defaultRuleThickness,E=4*T;if(f-l.depth-(u.height-d)0&&(f+=A,d-=A)}var S=[{type:"elem",elem:u,shift:d,marginRight:x,marginLeft:b},{type:"elem",elem:l,shift:-f,marginRight:x}];C=Be.makeVList({positionType:"individualShift",children:S},e)}else if(u){d=Math.max(d,h.sub1,u.height-.8*h.xHeight);var _=[{type:"elem",elem:u,marginLeft:b,marginRight:x}];C=Be.makeVList({positionType:"shift",positionData:d,children:_},e)}else if(l)f=Math.max(f,y,l.depth+.25*h.xHeight),C=Be.makeVList({positionType:"shift",positionData:-f,children:[{type:"elem",elem:l,marginRight:x}]},e);else throw new Error("supsub must have either sup or sub.");var I=A7(s,"right")||"mord";return Be.makeSpan([I],[s,Be.makeSpan(["msupsub"],[C])],e)},mathmlBuilder(t,e){var r=!1,n,i;t.base&&t.base.type==="horizBrace"&&(i=!!t.sup,i===t.base.isOver&&(r=!0,n=t.base.isOver)),t.base&&(t.base.type==="op"||t.base.type==="operatorname")&&(t.base.parentIsSupSub=!0);var a=[yn(t.base,e)];t.sub&&a.push(yn(t.sub,e)),t.sup&&a.push(yn(t.sup,e));var s;if(r)s=n?"mover":"munder";else if(t.sub)if(t.sup){var h=t.base;h&&h.type==="op"&&h.limits&&e.style===tr.DISPLAY||h&&h.type==="operatorname"&&h.alwaysHandleSupSub&&(e.style===tr.DISPLAY||h.limits)?s="munderover":s="msubsup"}else{var u=t.base;u&&u.type==="op"&&u.limits&&(e.style===tr.DISPLAY||u.alwaysHandleSupSub)||u&&u.type==="operatorname"&&u.alwaysHandleSupSub&&(u.limits||e.style===tr.DISPLAY)?s="munder":s="msub"}else{var l=t.base;l&&l.type==="op"&&l.limits&&(e.style===tr.DISPLAY||l.alwaysHandleSupSub)||l&&l.type==="operatorname"&&l.alwaysHandleSupSub&&(l.limits||e.style===tr.DISPLAY)?s="mover":s="msup"}return new dt.MathNode(s,a)}});rd({type:"atom",htmlBuilder(t,e){return Be.mathsym(t.text,t.mode,e,["m"+t.family])},mathmlBuilder(t,e){var r=new dt.MathNode("mo",[Co(t.text,t.mode)]);if(t.family==="bin"){var n=$7(t,e);n==="bold-italic"&&r.setAttribute("mathvariant",n)}else t.family==="punct"?r.setAttribute("separator","true"):(t.family==="open"||t.family==="close")&&r.setAttribute("stretchy","false");return r}});CG={mi:"italic",mn:"normal",mtext:"normal"};rd({type:"mathord",htmlBuilder(t,e){return Be.makeOrd(t,e,"mathord")},mathmlBuilder(t,e){var r=new dt.MathNode("mi",[Co(t.text,t.mode,e)]),n=$7(t,e)||"italic";return n!==CG[r.type]&&r.setAttribute("mathvariant",n),r}});rd({type:"textord",htmlBuilder(t,e){return Be.makeOrd(t,e,"textord")},mathmlBuilder(t,e){var r=Co(t.text,t.mode,e),n=$7(t,e)||"normal",i;return t.mode==="text"?i=new dt.MathNode("mtext",[r]):/[0-9]/.test(t.text)?i=new dt.MathNode("mn",[r]):t.text==="\\prime"?i=new dt.MathNode("mo",[r]):i=new dt.MathNode("mi",[r]),n!==CG[i.type]&&i.setAttribute("mathvariant",n),i}});b7={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},w7={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};rd({type:"spacing",htmlBuilder(t,e){if(w7.hasOwnProperty(t.text)){var r=w7[t.text].className||"";if(t.mode==="text"){var n=Be.makeOrd(t,e,"textord");return n.classes.push(r),n}else return Be.makeSpan(["mspace",r],[Be.mathsym(t.text,t.mode,e)],e)}else{if(b7.hasOwnProperty(t.text))return Be.makeSpan(["mspace",b7[t.text]],[],e);throw new gt('Unknown type of space "'+t.text+'"')}},mathmlBuilder(t,e){var r;if(w7.hasOwnProperty(t.text))r=new dt.MathNode("mtext",[new dt.TextNode("\xA0")]);else{if(b7.hasOwnProperty(t.text))return new dt.MathNode("mspace");throw new gt('Unknown type of space "'+t.text+'"')}return r}});Dz=o(()=>{var t=new dt.MathNode("mtd",[]);return t.setAttribute("width","50%"),t},"pad");rd({type:"tag",mathmlBuilder(t,e){var r=new dt.MathNode("mtable",[new dt.MathNode("mtr",[Dz(),new dt.MathNode("mtd",[dh(t.body,e)]),Dz(),new dt.MathNode("mtd",[dh(t.tag,e)])])]);return r.setAttribute("width","100%"),r}});Lz={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Rz={"\\textbf":"textbf","\\textmd":"textmd"},O4e={"\\textit":"textit","\\textup":"textup"},Nz=o((t,e)=>{var r=t.font;if(r){if(Lz[r])return e.withTextFontFamily(Lz[r]);if(Rz[r])return e.withTextFontWeight(Rz[r]);if(r==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(O4e[r])},"optionsWithFont");Nt({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"text",mode:r.mode,body:di(i),font:n}},htmlBuilder(t,e){var r=Nz(t,e),n=Pi(t.body,r,!0);return Be.makeSpan(["mord","text"],n,r)},mathmlBuilder(t,e){var r=Nz(t,e);return dh(t.body,r)}});Nt({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"underline",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=Fr(t.body,e),n=Be.makeLineSpan("underline-line",e),i=e.fontMetrics().defaultRuleThickness,a=Be.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:i},{type:"elem",elem:n},{type:"kern",size:3*i},{type:"elem",elem:r}]},e);return Be.makeSpan(["mord","underline"],[a],e)},mathmlBuilder(t,e){var r=new dt.MathNode("mo",[new dt.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new dt.MathNode("munder",[yn(t.body,e),r]);return n.setAttribute("accentunder","true"),n}});Nt({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"vcenter",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=Fr(t.body,e),n=e.fontMetrics().axisHeight,i=.5*(r.height-n-(r.depth+n));return Be.makeVList({positionType:"shift",positionData:i,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){return new dt.MathNode("mpadded",[yn(t.body,e)],["vcenter"])}});Nt({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(t,e,r){throw new gt("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(t,e){for(var r=Mz(t),n=[],i=e.havingStyle(e.style.text()),a=0;at.body.replace(/ /g,t.star?"\u2423":"\xA0"),"makeVerb"),hh=jz,AG=`[ \r + ]`,P4e="\\\\[a-zA-Z@]+",B4e="\\\\[^\uD800-\uDFFF]",F4e="("+P4e+")"+AG+"*",$4e=`\\\\( +|[ \r ]+ +?)[ \r ]*`,N7="[\u0300-\u036F]",z4e=new RegExp(N7+"+$"),G4e="("+AG+"+)|"+($4e+"|")+"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]"+(N7+"*")+"|[\uD800-\uDBFF][\uDC00-\uDFFF]"+(N7+"*")+"|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5"+("|"+F4e)+("|"+B4e+")"),y3=class{static{o(this,"Lexer")}constructor(e,r){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=r,this.tokenRegex=new RegExp(G4e,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,r){this.catcodes[e]=r}lex(){var e=this.input,r=this.tokenRegex.lastIndex;if(r===e.length)return new So("EOF",new Xs(this,r,r));var n=this.tokenRegex.exec(e);if(n===null||n.index!==r)throw new gt("Unexpected character: '"+e[r]+"'",new So(e[r],new Xs(this,r,r+1)));var i=n[6]||n[3]||(n[2]?"\\ ":" ");if(this.catcodes[i]===14){var a=e.indexOf(` +`,this.tokenRegex.lastIndex);return a===-1?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=a+1,this.lex()}return new So(i,new Xs(this,r,this.tokenRegex.lastIndex))}},M7=class{static{o(this,"Namespace")}constructor(e,r){e===void 0&&(e={}),r===void 0&&(r={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=r,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(this.undefStack.length===0)throw new gt("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var r in e)e.hasOwnProperty(r)&&(e[r]==null?delete this.current[r]:this.current[r]=e[r])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,r,n){if(n===void 0&&(n=!1),n){for(var i=0;i0&&(this.undefStack[this.undefStack.length-1][e]=r)}else{var a=this.undefStack[this.undefStack.length-1];a&&!a.hasOwnProperty(e)&&(a[e]=this.current[e])}r==null?delete this.current[e]:this.current[e]=r}},V4e=gG;fe("\\noexpand",function(t){var e=t.popToken();return t.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});fe("\\expandafter",function(t){var e=t.popToken();return t.expandOnce(!0),{tokens:[e],numArgs:0}});fe("\\@firstoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[0],numArgs:0}});fe("\\@secondoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[1],numArgs:0}});fe("\\@ifnextchar",function(t){var e=t.consumeArgs(3);t.consumeSpaces();var r=t.future();return e[0].length===1&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});fe("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");fe("\\TextOrMath",function(t){var e=t.consumeArgs(2);return t.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});Iz={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};fe("\\char",function(t){var e=t.popToken(),r,n="";if(e.text==="'")r=8,e=t.popToken();else if(e.text==='"')r=16,e=t.popToken();else if(e.text==="`")if(e=t.popToken(),e.text[0]==="\\")n=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new gt("\\char` missing argument");n=e.text.charCodeAt(0)}else r=10;if(r){if(n=Iz[e.text],n==null||n>=r)throw new gt("Invalid base-"+r+" digit "+e.text);for(var i;(i=Iz[t.future().text])!=null&&i{var n=t.consumeArg().tokens;if(n.length!==1)throw new gt("\\newcommand's first argument must be a macro name");var i=n[0].text,a=t.isDefined(i);if(a&&!e)throw new gt("\\newcommand{"+i+"} attempting to redefine "+(i+"; use \\renewcommand"));if(!a&&!r)throw new gt("\\renewcommand{"+i+"} when command "+i+" does not yet exist; use \\newcommand");var s=0;if(n=t.consumeArg().tokens,n.length===1&&n[0].text==="["){for(var l="",u=t.expandNextToken();u.text!=="]"&&u.text!=="EOF";)l+=u.text,u=t.expandNextToken();if(!l.match(/^\s*[0-9]+\s*$/))throw new gt("Invalid number of arguments: "+l);s=parseInt(l),n=t.consumeArg().tokens}return t.macros.set(i,{tokens:n,numArgs:s}),""},"newcommand");fe("\\newcommand",t=>j7(t,!1,!0));fe("\\renewcommand",t=>j7(t,!0,!1));fe("\\providecommand",t=>j7(t,!0,!0));fe("\\message",t=>{var e=t.consumeArgs(1)[0];return console.log(e.reverse().map(r=>r.text).join("")),""});fe("\\errmessage",t=>{var e=t.consumeArgs(1)[0];return console.error(e.reverse().map(r=>r.text).join("")),""});fe("\\show",t=>{var e=t.popToken(),r=e.text;return console.log(e,t.macros.get(r),hh[r],An.math[r],An.text[r]),""});fe("\\bgroup","{");fe("\\egroup","}");fe("~","\\nobreakspace");fe("\\lq","`");fe("\\rq","'");fe("\\aa","\\r a");fe("\\AA","\\r A");fe("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xA9}");fe("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");fe("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xAE}");fe("\u212C","\\mathscr{B}");fe("\u2130","\\mathscr{E}");fe("\u2131","\\mathscr{F}");fe("\u210B","\\mathscr{H}");fe("\u2110","\\mathscr{I}");fe("\u2112","\\mathscr{L}");fe("\u2133","\\mathscr{M}");fe("\u211B","\\mathscr{R}");fe("\u212D","\\mathfrak{C}");fe("\u210C","\\mathfrak{H}");fe("\u2128","\\mathfrak{Z}");fe("\\Bbbk","\\Bbb{k}");fe("\xB7","\\cdotp");fe("\\llap","\\mathllap{\\textrm{#1}}");fe("\\rlap","\\mathrlap{\\textrm{#1}}");fe("\\clap","\\mathclap{\\textrm{#1}}");fe("\\mathstrut","\\vphantom{(}");fe("\\underbar","\\underline{\\text{#1}}");fe("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}');fe("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}");fe("\\ne","\\neq");fe("\u2260","\\neq");fe("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}");fe("\u2209","\\notin");fe("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}");fe("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");fe("\u225A","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");fe("\u225B","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225B}}");fe("\u225D","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225D}}");fe("\u225E","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225E}}");fe("\u225F","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}");fe("\u27C2","\\perp");fe("\u203C","\\mathclose{!\\mkern-0.8mu!}");fe("\u220C","\\notni");fe("\u231C","\\ulcorner");fe("\u231D","\\urcorner");fe("\u231E","\\llcorner");fe("\u231F","\\lrcorner");fe("\xA9","\\copyright");fe("\xAE","\\textregistered");fe("\uFE0F","\\textregistered");fe("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');fe("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');fe("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');fe("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');fe("\\vdots","\\mathord{\\varvdots\\rule{0pt}{15pt}}");fe("\u22EE","\\vdots");fe("\\varGamma","\\mathit{\\Gamma}");fe("\\varDelta","\\mathit{\\Delta}");fe("\\varTheta","\\mathit{\\Theta}");fe("\\varLambda","\\mathit{\\Lambda}");fe("\\varXi","\\mathit{\\Xi}");fe("\\varPi","\\mathit{\\Pi}");fe("\\varSigma","\\mathit{\\Sigma}");fe("\\varUpsilon","\\mathit{\\Upsilon}");fe("\\varPhi","\\mathit{\\Phi}");fe("\\varPsi","\\mathit{\\Psi}");fe("\\varOmega","\\mathit{\\Omega}");fe("\\substack","\\begin{subarray}{c}#1\\end{subarray}");fe("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");fe("\\boxed","\\fbox{$\\displaystyle{#1}$}");fe("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");fe("\\implies","\\DOTSB\\;\\Longrightarrow\\;");fe("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");Oz={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};fe("\\dots",function(t){var e="\\dotso",r=t.expandAfterFuture().text;return r in Oz?e=Oz[r]:(r.slice(0,4)==="\\not"||r in An.math&&Jt.contains(["bin","rel"],An.math[r].group))&&(e="\\dotsb"),e});K7={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};fe("\\dotso",function(t){var e=t.future().text;return e in K7?"\\ldots\\,":"\\ldots"});fe("\\dotsc",function(t){var e=t.future().text;return e in K7&&e!==","?"\\ldots\\,":"\\ldots"});fe("\\cdots",function(t){var e=t.future().text;return e in K7?"\\@cdots\\,":"\\@cdots"});fe("\\dotsb","\\cdots");fe("\\dotsm","\\cdots");fe("\\dotsi","\\!\\cdots");fe("\\dotsx","\\ldots\\,");fe("\\DOTSI","\\relax");fe("\\DOTSB","\\relax");fe("\\DOTSX","\\relax");fe("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");fe("\\,","\\tmspace+{3mu}{.1667em}");fe("\\thinspace","\\,");fe("\\>","\\mskip{4mu}");fe("\\:","\\tmspace+{4mu}{.2222em}");fe("\\medspace","\\:");fe("\\;","\\tmspace+{5mu}{.2777em}");fe("\\thickspace","\\;");fe("\\!","\\tmspace-{3mu}{.1667em}");fe("\\negthinspace","\\!");fe("\\negmedspace","\\tmspace-{4mu}{.2222em}");fe("\\negthickspace","\\tmspace-{5mu}{.277em}");fe("\\enspace","\\kern.5em ");fe("\\enskip","\\hskip.5em\\relax");fe("\\quad","\\hskip1em\\relax");fe("\\qquad","\\hskip2em\\relax");fe("\\tag","\\@ifstar\\tag@literal\\tag@paren");fe("\\tag@paren","\\tag@literal{({#1})}");fe("\\tag@literal",t=>{if(t.macros.get("\\df@tag"))throw new gt("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});fe("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");fe("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");fe("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");fe("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");fe("\\newline","\\\\\\relax");fe("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");_G=kt(jl["Main-Regular"][84][1]-.7*jl["Main-Regular"][65][1]);fe("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+_G+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");fe("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+_G+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");fe("\\hspace","\\@ifstar\\@hspacer\\@hspace");fe("\\@hspace","\\hskip #1\\relax");fe("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");fe("\\ordinarycolon",":");fe("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");fe("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');fe("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');fe("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');fe("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');fe("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');fe("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');fe("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');fe("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');fe("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');fe("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');fe("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');fe("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');fe("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');fe("\u2237","\\dblcolon");fe("\u2239","\\eqcolon");fe("\u2254","\\coloneqq");fe("\u2255","\\eqqcolon");fe("\u2A74","\\Coloneqq");fe("\\ratio","\\vcentcolon");fe("\\coloncolon","\\dblcolon");fe("\\colonequals","\\coloneqq");fe("\\coloncolonequals","\\Coloneqq");fe("\\equalscolon","\\eqqcolon");fe("\\equalscoloncolon","\\Eqqcolon");fe("\\colonminus","\\coloneq");fe("\\coloncolonminus","\\Coloneq");fe("\\minuscolon","\\eqcolon");fe("\\minuscoloncolon","\\Eqcolon");fe("\\coloncolonapprox","\\Colonapprox");fe("\\coloncolonsim","\\Colonsim");fe("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");fe("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");fe("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");fe("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");fe("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");fe("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");fe("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");fe("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");fe("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");fe("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");fe("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");fe("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");fe("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");fe("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}");fe("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}");fe("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}");fe("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}");fe("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}");fe("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}");fe("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}");fe("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}");fe("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}");fe("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}");fe("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228A}");fe("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2ACB}");fe("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228B}");fe("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2ACC}");fe("\\imath","\\html@mathml{\\@imath}{\u0131}");fe("\\jmath","\\html@mathml{\\@jmath}{\u0237}");fe("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27E6}}");fe("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27E7}}");fe("\u27E6","\\llbracket");fe("\u27E7","\\rrbracket");fe("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}");fe("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}");fe("\u2983","\\lBrace");fe("\u2984","\\rBrace");fe("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29B5}}");fe("\u29B5","\\minuso");fe("\\darr","\\downarrow");fe("\\dArr","\\Downarrow");fe("\\Darr","\\Downarrow");fe("\\lang","\\langle");fe("\\rang","\\rangle");fe("\\uarr","\\uparrow");fe("\\uArr","\\Uparrow");fe("\\Uarr","\\Uparrow");fe("\\N","\\mathbb{N}");fe("\\R","\\mathbb{R}");fe("\\Z","\\mathbb{Z}");fe("\\alef","\\aleph");fe("\\alefsym","\\aleph");fe("\\Alpha","\\mathrm{A}");fe("\\Beta","\\mathrm{B}");fe("\\bull","\\bullet");fe("\\Chi","\\mathrm{X}");fe("\\clubs","\\clubsuit");fe("\\cnums","\\mathbb{C}");fe("\\Complex","\\mathbb{C}");fe("\\Dagger","\\ddagger");fe("\\diamonds","\\diamondsuit");fe("\\empty","\\emptyset");fe("\\Epsilon","\\mathrm{E}");fe("\\Eta","\\mathrm{H}");fe("\\exist","\\exists");fe("\\harr","\\leftrightarrow");fe("\\hArr","\\Leftrightarrow");fe("\\Harr","\\Leftrightarrow");fe("\\hearts","\\heartsuit");fe("\\image","\\Im");fe("\\infin","\\infty");fe("\\Iota","\\mathrm{I}");fe("\\isin","\\in");fe("\\Kappa","\\mathrm{K}");fe("\\larr","\\leftarrow");fe("\\lArr","\\Leftarrow");fe("\\Larr","\\Leftarrow");fe("\\lrarr","\\leftrightarrow");fe("\\lrArr","\\Leftrightarrow");fe("\\Lrarr","\\Leftrightarrow");fe("\\Mu","\\mathrm{M}");fe("\\natnums","\\mathbb{N}");fe("\\Nu","\\mathrm{N}");fe("\\Omicron","\\mathrm{O}");fe("\\plusmn","\\pm");fe("\\rarr","\\rightarrow");fe("\\rArr","\\Rightarrow");fe("\\Rarr","\\Rightarrow");fe("\\real","\\Re");fe("\\reals","\\mathbb{R}");fe("\\Reals","\\mathbb{R}");fe("\\Rho","\\mathrm{P}");fe("\\sdot","\\cdot");fe("\\sect","\\S");fe("\\spades","\\spadesuit");fe("\\sub","\\subset");fe("\\sube","\\subseteq");fe("\\supe","\\supseteq");fe("\\Tau","\\mathrm{T}");fe("\\thetasym","\\vartheta");fe("\\weierp","\\wp");fe("\\Zeta","\\mathrm{Z}");fe("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");fe("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");fe("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");fe("\\bra","\\mathinner{\\langle{#1}|}");fe("\\ket","\\mathinner{|{#1}\\rangle}");fe("\\braket","\\mathinner{\\langle{#1}\\rangle}");fe("\\Bra","\\left\\langle#1\\right|");fe("\\Ket","\\left|#1\\right\\rangle");DG=o(t=>e=>{var r=e.consumeArg().tokens,n=e.consumeArg().tokens,i=e.consumeArg().tokens,a=e.consumeArg().tokens,s=e.macros.get("|"),l=e.macros.get("\\|");e.macros.beginGroup();var u=o(d=>p=>{t&&(p.macros.set("|",s),i.length&&p.macros.set("\\|",l));var m=d;if(!d&&i.length){var g=p.future();g.text==="|"&&(p.popToken(),m=!0)}return{tokens:m?i:n,numArgs:0}},"midMacro");e.macros.set("|",u(!1)),i.length&&e.macros.set("\\|",u(!0));var h=e.consumeArg().tokens,f=e.expandTokens([...a,...h,...r]);return e.macros.endGroup(),{tokens:f.reverse(),numArgs:0}},"braketHelper");fe("\\bra@ket",DG(!1));fe("\\bra@set",DG(!0));fe("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");fe("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");fe("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");fe("\\angln","{\\angl n}");fe("\\blue","\\textcolor{##6495ed}{#1}");fe("\\orange","\\textcolor{##ffa500}{#1}");fe("\\pink","\\textcolor{##ff00af}{#1}");fe("\\red","\\textcolor{##df0030}{#1}");fe("\\green","\\textcolor{##28ae7b}{#1}");fe("\\gray","\\textcolor{gray}{#1}");fe("\\purple","\\textcolor{##9d38bd}{#1}");fe("\\blueA","\\textcolor{##ccfaff}{#1}");fe("\\blueB","\\textcolor{##80f6ff}{#1}");fe("\\blueC","\\textcolor{##63d9ea}{#1}");fe("\\blueD","\\textcolor{##11accd}{#1}");fe("\\blueE","\\textcolor{##0c7f99}{#1}");fe("\\tealA","\\textcolor{##94fff5}{#1}");fe("\\tealB","\\textcolor{##26edd5}{#1}");fe("\\tealC","\\textcolor{##01d1c1}{#1}");fe("\\tealD","\\textcolor{##01a995}{#1}");fe("\\tealE","\\textcolor{##208170}{#1}");fe("\\greenA","\\textcolor{##b6ffb0}{#1}");fe("\\greenB","\\textcolor{##8af281}{#1}");fe("\\greenC","\\textcolor{##74cf70}{#1}");fe("\\greenD","\\textcolor{##1fab54}{#1}");fe("\\greenE","\\textcolor{##0d923f}{#1}");fe("\\goldA","\\textcolor{##ffd0a9}{#1}");fe("\\goldB","\\textcolor{##ffbb71}{#1}");fe("\\goldC","\\textcolor{##ff9c39}{#1}");fe("\\goldD","\\textcolor{##e07d10}{#1}");fe("\\goldE","\\textcolor{##a75a05}{#1}");fe("\\redA","\\textcolor{##fca9a9}{#1}");fe("\\redB","\\textcolor{##ff8482}{#1}");fe("\\redC","\\textcolor{##f9685d}{#1}");fe("\\redD","\\textcolor{##e84d39}{#1}");fe("\\redE","\\textcolor{##bc2612}{#1}");fe("\\maroonA","\\textcolor{##ffbde0}{#1}");fe("\\maroonB","\\textcolor{##ff92c6}{#1}");fe("\\maroonC","\\textcolor{##ed5fa6}{#1}");fe("\\maroonD","\\textcolor{##ca337c}{#1}");fe("\\maroonE","\\textcolor{##9e034e}{#1}");fe("\\purpleA","\\textcolor{##ddd7ff}{#1}");fe("\\purpleB","\\textcolor{##c6b9fc}{#1}");fe("\\purpleC","\\textcolor{##aa87ff}{#1}");fe("\\purpleD","\\textcolor{##7854ab}{#1}");fe("\\purpleE","\\textcolor{##543b78}{#1}");fe("\\mintA","\\textcolor{##f5f9e8}{#1}");fe("\\mintB","\\textcolor{##edf2df}{#1}");fe("\\mintC","\\textcolor{##e0e5cc}{#1}");fe("\\grayA","\\textcolor{##f6f7f7}{#1}");fe("\\grayB","\\textcolor{##f0f1f2}{#1}");fe("\\grayC","\\textcolor{##e3e5e6}{#1}");fe("\\grayD","\\textcolor{##d6d8da}{#1}");fe("\\grayE","\\textcolor{##babec2}{#1}");fe("\\grayF","\\textcolor{##888d93}{#1}");fe("\\grayG","\\textcolor{##626569}{#1}");fe("\\grayH","\\textcolor{##3b3e40}{#1}");fe("\\grayI","\\textcolor{##21242c}{#1}");fe("\\kaBlue","\\textcolor{##314453}{#1}");fe("\\kaGreen","\\textcolor{##71B307}{#1}");LG={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},I7=class{static{o(this,"MacroExpander")}constructor(e,r,n){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=r,this.expansionCount=0,this.feed(e),this.macros=new M7(V4e,r.macros),this.mode=n,this.stack=[]}feed(e){this.lexer=new y3(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var r,n,i;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;r=this.popToken(),{tokens:i,end:n}=this.consumeArg(["]"])}else({tokens:i,start:r,end:n}=this.consumeArg());return this.pushToken(new So("EOF",n.loc)),this.pushTokens(i),r.range(n,"")}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var r=[],n=e&&e.length>0;n||this.consumeSpaces();var i=this.future(),a,s=0,l=0;do{if(a=this.popToken(),r.push(a),a.text==="{")++s;else if(a.text==="}"){if(--s,s===-1)throw new gt("Extra }",a)}else if(a.text==="EOF")throw new gt("Unexpected end of input in a macro argument, expected '"+(e&&n?e[l]:"}")+"'",a);if(e&&n)if((s===0||s===1&&e[l]==="{")&&a.text===e[l]){if(++l,l===e.length){r.splice(-l,l);break}}else l=0}while(s!==0||n);return i.text==="{"&&r[r.length-1].text==="}"&&(r.pop(),r.shift()),r.reverse(),{tokens:r,start:i,end:a}}consumeArgs(e,r){if(r){if(r.length!==e+1)throw new gt("The length of delimiters doesn't match the number of args!");for(var n=r[0],i=0;ithis.settings.maxExpand)throw new gt("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var r=this.popToken(),n=r.text,i=r.noexpand?null:this._getExpansion(n);if(i==null||e&&i.unexpandable){if(e&&i==null&&n[0]==="\\"&&!this.isDefined(n))throw new gt("Undefined control sequence: "+n);return this.pushToken(r),!1}this.countExpansion(1);var a=i.tokens,s=this.consumeArgs(i.numArgs,i.delimiters);if(i.numArgs){a=a.slice();for(var l=a.length-1;l>=0;--l){var u=a[l];if(u.text==="#"){if(l===0)throw new gt("Incomplete placeholder at end of macro body",u);if(u=a[--l],u.text==="#")a.splice(l+1,1);else if(/^[1-9]$/.test(u.text))a.splice(l,2,...s[+u.text-1]);else throw new gt("Not a valid argument number",u)}}}return this.pushTokens(a),a.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new So(e)]):void 0}expandTokens(e){var r=[],n=this.stack.length;for(this.pushTokens(e);this.stack.length>n;)if(this.expandOnce(!0)===!1){var i=this.stack.pop();i.treatAsRelax&&(i.noexpand=!1,i.treatAsRelax=!1),r.push(i)}return this.countExpansion(r.length),r}expandMacroAsText(e){var r=this.expandMacro(e);return r&&r.map(n=>n.text).join("")}_getExpansion(e){var r=this.macros.get(e);if(r==null)return r;if(e.length===1){var n=this.lexer.catcodes[e];if(n!=null&&n!==13)return}var i=typeof r=="function"?r(this):r;if(typeof i=="string"){var a=0;if(i.indexOf("#")!==-1)for(var s=i.replace(/##/g,"");s.indexOf("#"+(a+1))!==-1;)++a;for(var l=new y3(i,this.settings),u=[],h=l.lex();h.text!=="EOF";)u.push(h),h=l.lex();u.reverse();var f={tokens:u,numArgs:a};return f}return i}isDefined(e){return this.macros.has(e)||hh.hasOwnProperty(e)||An.math.hasOwnProperty(e)||An.text.hasOwnProperty(e)||LG.hasOwnProperty(e)}isExpandable(e){var r=this.macros.get(e);return r!=null?typeof r=="string"||typeof r=="function"||!r.unexpandable:hh.hasOwnProperty(e)&&!hh[e].primitive}},Pz=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,l3=Object.freeze({"\u208A":"+","\u208B":"-","\u208C":"=","\u208D":"(","\u208E":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1D62":"i","\u2C7C":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209A":"p","\u1D63":"r","\u209B":"s","\u209C":"t","\u1D64":"u","\u1D65":"v","\u2093":"x","\u1D66":"\u03B2","\u1D67":"\u03B3","\u1D68":"\u03C1","\u1D69":"\u03D5","\u1D6A":"\u03C7","\u207A":"+","\u207B":"-","\u207C":"=","\u207D":"(","\u207E":")","\u2070":"0","\xB9":"1","\xB2":"2","\xB3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1D2C":"A","\u1D2E":"B","\u1D30":"D","\u1D31":"E","\u1D33":"G","\u1D34":"H","\u1D35":"I","\u1D36":"J","\u1D37":"K","\u1D38":"L","\u1D39":"M","\u1D3A":"N","\u1D3C":"O","\u1D3E":"P","\u1D3F":"R","\u1D40":"T","\u1D41":"U","\u2C7D":"V","\u1D42":"W","\u1D43":"a","\u1D47":"b","\u1D9C":"c","\u1D48":"d","\u1D49":"e","\u1DA0":"f","\u1D4D":"g",\u02B0:"h","\u2071":"i",\u02B2:"j","\u1D4F":"k",\u02E1:"l","\u1D50":"m",\u207F:"n","\u1D52":"o","\u1D56":"p",\u02B3:"r",\u02E2:"s","\u1D57":"t","\u1D58":"u","\u1D5B":"v",\u02B7:"w",\u02E3:"x",\u02B8:"y","\u1DBB":"z","\u1D5D":"\u03B2","\u1D5E":"\u03B3","\u1D5F":"\u03B4","\u1D60":"\u03D5","\u1D61":"\u03C7","\u1DBF":"\u03B8"}),T7={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030C":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030A":{text:"\\r",math:"\\mathring"},"\u030B":{text:"\\H"},"\u0327":{text:"\\c"}},Bz={\u00E1:"a\u0301",\u00E0:"a\u0300",\u00E4:"a\u0308",\u01DF:"a\u0308\u0304",\u00E3:"a\u0303",\u0101:"a\u0304",\u0103:"a\u0306",\u1EAF:"a\u0306\u0301",\u1EB1:"a\u0306\u0300",\u1EB5:"a\u0306\u0303",\u01CE:"a\u030C",\u00E2:"a\u0302",\u1EA5:"a\u0302\u0301",\u1EA7:"a\u0302\u0300",\u1EAB:"a\u0302\u0303",\u0227:"a\u0307",\u01E1:"a\u0307\u0304",\u00E5:"a\u030A",\u01FB:"a\u030A\u0301",\u1E03:"b\u0307",\u0107:"c\u0301",\u1E09:"c\u0327\u0301",\u010D:"c\u030C",\u0109:"c\u0302",\u010B:"c\u0307",\u00E7:"c\u0327",\u010F:"d\u030C",\u1E0B:"d\u0307",\u1E11:"d\u0327",\u00E9:"e\u0301",\u00E8:"e\u0300",\u00EB:"e\u0308",\u1EBD:"e\u0303",\u0113:"e\u0304",\u1E17:"e\u0304\u0301",\u1E15:"e\u0304\u0300",\u0115:"e\u0306",\u1E1D:"e\u0327\u0306",\u011B:"e\u030C",\u00EA:"e\u0302",\u1EBF:"e\u0302\u0301",\u1EC1:"e\u0302\u0300",\u1EC5:"e\u0302\u0303",\u0117:"e\u0307",\u0229:"e\u0327",\u1E1F:"f\u0307",\u01F5:"g\u0301",\u1E21:"g\u0304",\u011F:"g\u0306",\u01E7:"g\u030C",\u011D:"g\u0302",\u0121:"g\u0307",\u0123:"g\u0327",\u1E27:"h\u0308",\u021F:"h\u030C",\u0125:"h\u0302",\u1E23:"h\u0307",\u1E29:"h\u0327",\u00ED:"i\u0301",\u00EC:"i\u0300",\u00EF:"i\u0308",\u1E2F:"i\u0308\u0301",\u0129:"i\u0303",\u012B:"i\u0304",\u012D:"i\u0306",\u01D0:"i\u030C",\u00EE:"i\u0302",\u01F0:"j\u030C",\u0135:"j\u0302",\u1E31:"k\u0301",\u01E9:"k\u030C",\u0137:"k\u0327",\u013A:"l\u0301",\u013E:"l\u030C",\u013C:"l\u0327",\u1E3F:"m\u0301",\u1E41:"m\u0307",\u0144:"n\u0301",\u01F9:"n\u0300",\u00F1:"n\u0303",\u0148:"n\u030C",\u1E45:"n\u0307",\u0146:"n\u0327",\u00F3:"o\u0301",\u00F2:"o\u0300",\u00F6:"o\u0308",\u022B:"o\u0308\u0304",\u00F5:"o\u0303",\u1E4D:"o\u0303\u0301",\u1E4F:"o\u0303\u0308",\u022D:"o\u0303\u0304",\u014D:"o\u0304",\u1E53:"o\u0304\u0301",\u1E51:"o\u0304\u0300",\u014F:"o\u0306",\u01D2:"o\u030C",\u00F4:"o\u0302",\u1ED1:"o\u0302\u0301",\u1ED3:"o\u0302\u0300",\u1ED7:"o\u0302\u0303",\u022F:"o\u0307",\u0231:"o\u0307\u0304",\u0151:"o\u030B",\u1E55:"p\u0301",\u1E57:"p\u0307",\u0155:"r\u0301",\u0159:"r\u030C",\u1E59:"r\u0307",\u0157:"r\u0327",\u015B:"s\u0301",\u1E65:"s\u0301\u0307",\u0161:"s\u030C",\u1E67:"s\u030C\u0307",\u015D:"s\u0302",\u1E61:"s\u0307",\u015F:"s\u0327",\u1E97:"t\u0308",\u0165:"t\u030C",\u1E6B:"t\u0307",\u0163:"t\u0327",\u00FA:"u\u0301",\u00F9:"u\u0300",\u00FC:"u\u0308",\u01D8:"u\u0308\u0301",\u01DC:"u\u0308\u0300",\u01D6:"u\u0308\u0304",\u01DA:"u\u0308\u030C",\u0169:"u\u0303",\u1E79:"u\u0303\u0301",\u016B:"u\u0304",\u1E7B:"u\u0304\u0308",\u016D:"u\u0306",\u01D4:"u\u030C",\u00FB:"u\u0302",\u016F:"u\u030A",\u0171:"u\u030B",\u1E7D:"v\u0303",\u1E83:"w\u0301",\u1E81:"w\u0300",\u1E85:"w\u0308",\u0175:"w\u0302",\u1E87:"w\u0307",\u1E98:"w\u030A",\u1E8D:"x\u0308",\u1E8B:"x\u0307",\u00FD:"y\u0301",\u1EF3:"y\u0300",\u00FF:"y\u0308",\u1EF9:"y\u0303",\u0233:"y\u0304",\u0177:"y\u0302",\u1E8F:"y\u0307",\u1E99:"y\u030A",\u017A:"z\u0301",\u017E:"z\u030C",\u1E91:"z\u0302",\u017C:"z\u0307",\u00C1:"A\u0301",\u00C0:"A\u0300",\u00C4:"A\u0308",\u01DE:"A\u0308\u0304",\u00C3:"A\u0303",\u0100:"A\u0304",\u0102:"A\u0306",\u1EAE:"A\u0306\u0301",\u1EB0:"A\u0306\u0300",\u1EB4:"A\u0306\u0303",\u01CD:"A\u030C",\u00C2:"A\u0302",\u1EA4:"A\u0302\u0301",\u1EA6:"A\u0302\u0300",\u1EAA:"A\u0302\u0303",\u0226:"A\u0307",\u01E0:"A\u0307\u0304",\u00C5:"A\u030A",\u01FA:"A\u030A\u0301",\u1E02:"B\u0307",\u0106:"C\u0301",\u1E08:"C\u0327\u0301",\u010C:"C\u030C",\u0108:"C\u0302",\u010A:"C\u0307",\u00C7:"C\u0327",\u010E:"D\u030C",\u1E0A:"D\u0307",\u1E10:"D\u0327",\u00C9:"E\u0301",\u00C8:"E\u0300",\u00CB:"E\u0308",\u1EBC:"E\u0303",\u0112:"E\u0304",\u1E16:"E\u0304\u0301",\u1E14:"E\u0304\u0300",\u0114:"E\u0306",\u1E1C:"E\u0327\u0306",\u011A:"E\u030C",\u00CA:"E\u0302",\u1EBE:"E\u0302\u0301",\u1EC0:"E\u0302\u0300",\u1EC4:"E\u0302\u0303",\u0116:"E\u0307",\u0228:"E\u0327",\u1E1E:"F\u0307",\u01F4:"G\u0301",\u1E20:"G\u0304",\u011E:"G\u0306",\u01E6:"G\u030C",\u011C:"G\u0302",\u0120:"G\u0307",\u0122:"G\u0327",\u1E26:"H\u0308",\u021E:"H\u030C",\u0124:"H\u0302",\u1E22:"H\u0307",\u1E28:"H\u0327",\u00CD:"I\u0301",\u00CC:"I\u0300",\u00CF:"I\u0308",\u1E2E:"I\u0308\u0301",\u0128:"I\u0303",\u012A:"I\u0304",\u012C:"I\u0306",\u01CF:"I\u030C",\u00CE:"I\u0302",\u0130:"I\u0307",\u0134:"J\u0302",\u1E30:"K\u0301",\u01E8:"K\u030C",\u0136:"K\u0327",\u0139:"L\u0301",\u013D:"L\u030C",\u013B:"L\u0327",\u1E3E:"M\u0301",\u1E40:"M\u0307",\u0143:"N\u0301",\u01F8:"N\u0300",\u00D1:"N\u0303",\u0147:"N\u030C",\u1E44:"N\u0307",\u0145:"N\u0327",\u00D3:"O\u0301",\u00D2:"O\u0300",\u00D6:"O\u0308",\u022A:"O\u0308\u0304",\u00D5:"O\u0303",\u1E4C:"O\u0303\u0301",\u1E4E:"O\u0303\u0308",\u022C:"O\u0303\u0304",\u014C:"O\u0304",\u1E52:"O\u0304\u0301",\u1E50:"O\u0304\u0300",\u014E:"O\u0306",\u01D1:"O\u030C",\u00D4:"O\u0302",\u1ED0:"O\u0302\u0301",\u1ED2:"O\u0302\u0300",\u1ED6:"O\u0302\u0303",\u022E:"O\u0307",\u0230:"O\u0307\u0304",\u0150:"O\u030B",\u1E54:"P\u0301",\u1E56:"P\u0307",\u0154:"R\u0301",\u0158:"R\u030C",\u1E58:"R\u0307",\u0156:"R\u0327",\u015A:"S\u0301",\u1E64:"S\u0301\u0307",\u0160:"S\u030C",\u1E66:"S\u030C\u0307",\u015C:"S\u0302",\u1E60:"S\u0307",\u015E:"S\u0327",\u0164:"T\u030C",\u1E6A:"T\u0307",\u0162:"T\u0327",\u00DA:"U\u0301",\u00D9:"U\u0300",\u00DC:"U\u0308",\u01D7:"U\u0308\u0301",\u01DB:"U\u0308\u0300",\u01D5:"U\u0308\u0304",\u01D9:"U\u0308\u030C",\u0168:"U\u0303",\u1E78:"U\u0303\u0301",\u016A:"U\u0304",\u1E7A:"U\u0304\u0308",\u016C:"U\u0306",\u01D3:"U\u030C",\u00DB:"U\u0302",\u016E:"U\u030A",\u0170:"U\u030B",\u1E7C:"V\u0303",\u1E82:"W\u0301",\u1E80:"W\u0300",\u1E84:"W\u0308",\u0174:"W\u0302",\u1E86:"W\u0307",\u1E8C:"X\u0308",\u1E8A:"X\u0307",\u00DD:"Y\u0301",\u1EF2:"Y\u0300",\u0178:"Y\u0308",\u1EF8:"Y\u0303",\u0232:"Y\u0304",\u0176:"Y\u0302",\u1E8E:"Y\u0307",\u0179:"Z\u0301",\u017D:"Z\u030C",\u1E90:"Z\u0302",\u017B:"Z\u0307",\u03AC:"\u03B1\u0301",\u1F70:"\u03B1\u0300",\u1FB1:"\u03B1\u0304",\u1FB0:"\u03B1\u0306",\u03AD:"\u03B5\u0301",\u1F72:"\u03B5\u0300",\u03AE:"\u03B7\u0301",\u1F74:"\u03B7\u0300",\u03AF:"\u03B9\u0301",\u1F76:"\u03B9\u0300",\u03CA:"\u03B9\u0308",\u0390:"\u03B9\u0308\u0301",\u1FD2:"\u03B9\u0308\u0300",\u1FD1:"\u03B9\u0304",\u1FD0:"\u03B9\u0306",\u03CC:"\u03BF\u0301",\u1F78:"\u03BF\u0300",\u03CD:"\u03C5\u0301",\u1F7A:"\u03C5\u0300",\u03CB:"\u03C5\u0308",\u03B0:"\u03C5\u0308\u0301",\u1FE2:"\u03C5\u0308\u0300",\u1FE1:"\u03C5\u0304",\u1FE0:"\u03C5\u0306",\u03CE:"\u03C9\u0301",\u1F7C:"\u03C9\u0300",\u038E:"\u03A5\u0301",\u1FEA:"\u03A5\u0300",\u03AB:"\u03A5\u0308",\u1FE9:"\u03A5\u0304",\u1FE8:"\u03A5\u0306",\u038F:"\u03A9\u0301",\u1FFA:"\u03A9\u0300"},v3=class t{static{o(this,"Parser")}constructor(e,r){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new I7(e,r,this.mode),this.settings=r,this.leftrightDepth=0}expect(e,r){if(r===void 0&&(r=!0),this.fetch().text!==e)throw new gt("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());r&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var r=this.nextToken;this.consume(),this.gullet.pushToken(new So("}")),this.gullet.pushTokens(e);var n=this.parseExpression(!1);return this.expect("}"),this.nextToken=r,n}parseExpression(e,r){for(var n=[];;){this.mode==="math"&&this.consumeSpaces();var i=this.fetch();if(t.endOfExpression.indexOf(i.text)!==-1||r&&i.text===r||e&&hh[i.text]&&hh[i.text].infix)break;var a=this.parseAtom(r);if(a){if(a.type==="internal")continue}else break;n.push(a)}return this.mode==="text"&&this.formLigatures(n),this.handleInfixNodes(n)}handleInfixNodes(e){for(var r=-1,n,i=0;i=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+r[0]+'" used in math mode',e);var l=An[this.mode][r].group,u=Xs.range(e),h;if(Mbe.hasOwnProperty(l)){var f=l;h={type:"atom",mode:this.mode,family:f,loc:u,text:r}}else h={type:l,mode:this.mode,loc:u,text:r};s=h}else if(r.charCodeAt(0)>=128)this.settings.strict&&($z(r.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+r[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+r[0]+'"'+(" ("+r.charCodeAt(0)+")"),e)),s={type:"textord",mode:"text",loc:Xs.range(e),text:r};else return null;if(this.consume(),a)for(var d=0;d{e instanceof Element&&e.tagName==="A"&&e.hasAttribute("target")&&e.setAttribute(t,e.getAttribute("target")??"")}),ch.addHook("afterSanitizeAttributes",e=>{e instanceof Element&&e.tagName==="A"&&e.hasAttribute(t)&&(e.setAttribute("target",e.getAttribute(t)??""),e.removeAttribute(t),e.getAttribute("target")==="_blank"&&e.setAttribute("rel","noopener"))})}var nd,Y4e,X4e,BG,OG,Tr,K4e,Q4e,Z4e,J4e,FG,e3e,fr,t3e,r3e,ec,J7,n3e,i3e,PG,eA,pi,id,mh,Ze,gr=N(()=>{"use strict";u7();nd=//gi,Y4e=o(t=>t?FG(t).replace(/\\n/g,"#br#").split("#br#"):[""],"getRows"),X4e=(()=>{let t=!1;return()=>{t||(j4e(),t=!0)}})();o(j4e,"setupDompurifyHooks");BG=o(t=>(X4e(),ch.sanitize(t)),"removeScript"),OG=o((t,e)=>{if(e.flowchart?.htmlLabels!==!1){let r=e.securityLevel;r==="antiscript"||r==="strict"?t=BG(t):r!=="loose"&&(t=FG(t),t=t.replace(//g,">"),t=t.replace(/=/g,"="),t=J4e(t))}return t},"sanitizeMore"),Tr=o((t,e)=>t&&(e.dompurifyConfig?t=ch.sanitize(OG(t,e),e.dompurifyConfig).toString():t=ch.sanitize(OG(t,e),{FORBID_TAGS:["style"]}).toString(),t),"sanitizeText"),K4e=o((t,e)=>typeof t=="string"?Tr(t,e):t.flat().map(r=>Tr(r,e)),"sanitizeTextOrArray"),Q4e=o(t=>nd.test(t),"hasBreaks"),Z4e=o(t=>t.split(nd),"splitBreaks"),J4e=o(t=>t.replace(/#br#/g,"
"),"placeholderToBreak"),FG=o(t=>t.replace(nd,"#br#"),"breakToPlaceholder"),e3e=o(t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=e.replaceAll(/\(/g,"\\("),e=e.replaceAll(/\)/g,"\\)")),e},"getUrl"),fr=o(t=>!(t===!1||["false","null","0"].includes(String(t).trim().toLowerCase())),"evaluate"),t3e=o(function(...t){let e=t.filter(r=>!isNaN(r));return Math.max(...e)},"getMax"),r3e=o(function(...t){let e=t.filter(r=>!isNaN(r));return Math.min(...e)},"getMin"),ec=o(function(t){let e=t.split(/(,)/),r=[];for(let n=0;n0&&n+1Math.max(0,t.split(e).length-1),"countOccurrence"),n3e=o((t,e)=>{let r=J7(t,"~"),n=J7(e,"~");return r===1&&n===1},"shouldCombineSets"),i3e=o(t=>{let e=J7(t,"~"),r=!1;if(e<=1)return t;e%2!==0&&t.startsWith("~")&&(t=t.substring(1),r=!0);let n=[...t],i=n.indexOf("~"),a=n.lastIndexOf("~");for(;i!==-1&&a!==-1&&i!==a;)n[i]="<",n[a]=">",i=n.indexOf("~"),a=n.lastIndexOf("~");return r&&n.unshift("~"),n.join("")},"processSet"),PG=o(()=>window.MathMLElement!==void 0,"isMathMLSupported"),eA=/\$\$(.*)\$\$/g,pi=o(t=>(t.match(eA)?.length??0)>0,"hasKatex"),id=o(async(t,e)=>{t=await mh(t,e);let r=document.createElement("div");r.innerHTML=t,r.id="katex-temp",r.style.visibility="hidden",r.style.position="absolute",r.style.top="0",document.querySelector("body")?.insertAdjacentElement("beforeend",r);let i={width:r.clientWidth,height:r.clientHeight};return r.remove(),i},"calculateMathMLDimensions"),mh=o(async(t,e)=>{if(!pi(t))return t;if(!(PG()||e.legacyMathML||e.forceLegacyMathML))return t.replace(eA,"MathML is unsupported in this environment.");let{default:r}=await Promise.resolve().then(()=>(IG(),MG)),n=e.forceLegacyMathML||!PG()&&e.legacyMathML?"htmlAndMathml":"mathml";return t.split(nd).map(i=>pi(i)?`
${i}
`:`
${i}
`).join("").replace(eA,(i,a)=>r.renderToString(a,{throwOnError:!0,displayMode:!0,output:n}).replace(/\n/g," ").replace(//g,""))},"renderKatex"),Ze={getRows:Y4e,sanitizeText:Tr,sanitizeTextOrArray:K4e,hasBreaks:Q4e,splitBreaks:Z4e,lineBreakRegex:nd,removeScript:BG,getUrl:e3e,evaluate:fr,getMax:t3e,getMin:r3e}});var a3e,s3e,vn,Ao,Ei=N(()=>{"use strict";vt();a3e=o(function(t,e){for(let r of e)t.attr(r[0],r[1])},"d3Attrs"),s3e=o(function(t,e,r){let n=new Map;return r?(n.set("width","100%"),n.set("style",`max-width: ${e}px;`)):(n.set("height",t),n.set("width",e)),n},"calculateSvgSizeAttrs"),vn=o(function(t,e,r,n){let i=s3e(e,r,n);a3e(t,i)},"configureSvgSize"),Ao=o(function(t,e,r,n){let i=e.node().getBBox(),a=i.width,s=i.height;Y.info(`SVG bounds: ${a}x${s}`,i);let l=0,u=0;Y.info(`Graph bounds: ${l}x${u}`,t),l=a+r*2,u=s+r*2,Y.info(`Calculated bounds: ${l}x${u}`),vn(e,u,l,n);let h=`${i.x-r} ${i.y-r} ${i.width+2*r} ${i.height+2*r}`;e.attr("viewBox",h)},"setupGraphViewbox")});var S3,o3e,$G,zG,tA=N(()=>{"use strict";vt();S3={},o3e=o((t,e,r)=>{let n="";return t in S3&&S3[t]?n=S3[t](r):Y.warn(`No theme found for ${t}`),` & { + font-family: ${r.fontFamily}; + font-size: ${r.fontSize}; + fill: ${r.textColor} + } + @keyframes edge-animation-frame { + from { + stroke-dashoffset: 0; + } + } + @keyframes dash { + to { + stroke-dashoffset: 0; + } + } + & .edge-animation-slow { + stroke-dasharray: 9,5 !important; + stroke-dashoffset: 900; + animation: dash 50s linear infinite; + stroke-linecap: round; + } + & .edge-animation-fast { + stroke-dasharray: 9,5 !important; + stroke-dashoffset: 900; + animation: dash 20s linear infinite; + stroke-linecap: round; + } + /* Classes common for multiple diagrams */ + + & .error-icon { + fill: ${r.errorBkgColor}; + } + & .error-text { + fill: ${r.errorTextColor}; + stroke: ${r.errorTextColor}; + } + + & .edge-thickness-normal { + stroke-width: 1px; + } + & .edge-thickness-thick { + stroke-width: 3.5px + } + & .edge-pattern-solid { + stroke-dasharray: 0; + } + & .edge-thickness-invisible { + stroke-width: 0; + fill: none; + } + & .edge-pattern-dashed{ + stroke-dasharray: 3; + } + .edge-pattern-dotted { + stroke-dasharray: 2; + } + + & .marker { + fill: ${r.lineColor}; + stroke: ${r.lineColor}; + } + & .marker.cross { + stroke: ${r.lineColor}; + } + + & svg { + font-family: ${r.fontFamily}; + font-size: ${r.fontSize}; + } + & p { + margin: 0 + } + + ${n} + + ${e} +`},"getStyles"),$G=o((t,e)=>{e!==void 0&&(S3[t]=e)},"addStylesForDiagram"),zG=o3e});var qy={};hr(qy,{clear:()=>Ar,getAccDescription:()=>Mr,getAccTitle:()=>Rr,getDiagramTitle:()=>Ir,setAccDescription:()=>Nr,setAccTitle:()=>Lr,setDiagramTitle:()=>$r});var rA,nA,iA,aA,Ar,Lr,Rr,Nr,Mr,$r,Ir,mi=N(()=>{"use strict";gr();ji();rA="",nA="",iA="",aA=o(t=>Tr(t,cr()),"sanitizeText"),Ar=o(()=>{rA="",iA="",nA=""},"clear"),Lr=o(t=>{rA=aA(t).replace(/^\s+/g,"")},"setAccTitle"),Rr=o(()=>rA,"getAccTitle"),Nr=o(t=>{iA=aA(t).replace(/\n\s+/g,` +`)},"setAccDescription"),Mr=o(()=>iA,"getAccDescription"),$r=o(t=>{nA=aA(t)},"setDiagramTitle"),Ir=o(()=>nA,"getDiagramTitle")});var GG,l3e,me,Yy,A3,Xy,oA,c3e,C3,ad,jy,sA,zt=N(()=>{"use strict";Xf();vt();ji();gr();Ei();tA();mi();GG=Y,l3e=wy,me=cr,Yy=X4,A3=lh,Xy=o(t=>Tr(t,me()),"sanitizeText"),oA=Ao,c3e=o(()=>qy,"getCommonDb"),C3={},ad=o((t,e,r)=>{C3[t]&&GG.warn(`Diagram with id ${t} already registered. Overwriting.`),C3[t]=e,r&&FC(t,r),$G(t,e.styles),e.injectUtils?.(GG,l3e,me,Xy,oA,c3e(),()=>{})},"registerDiagram"),jy=o(t=>{if(t in C3)return C3[t];throw new sA(t)},"getDiagram"),sA=class extends Error{static{o(this,"DiagramNotFoundError")}constructor(e){super(`Diagram ${e} not found.`)}}});var ul,gh,Ja,cl,tc,Ky,lA,cA,_3,D3,VG,u3e,h3e,f3e,d3e,p3e,m3e,g3e,y3e,v3e,x3e,b3e,w3e,T3e,k3e,E3e,S3e,C3e,UG,A3e,_3e,HG,D3e,L3e,R3e,N3e,yh,M3e,I3e,O3e,P3e,B3e,Qy,uA=N(()=>{"use strict";zt();gr();mi();ul=[],gh=[""],Ja="global",cl="",tc=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],Ky=[],lA="",cA=!1,_3=4,D3=2,u3e=o(function(){return VG},"getC4Type"),h3e=o(function(t){VG=Tr(t,me())},"setC4Type"),f3e=o(function(t,e,r,n,i,a,s,l,u){if(t==null||e===void 0||e===null||r===void 0||r===null||n===void 0||n===null)return;let h={},f=Ky.find(d=>d.from===e&&d.to===r);if(f?h=f:Ky.push(h),h.type=t,h.from=e,h.to=r,h.label={text:n},i==null)h.techn={text:""};else if(typeof i=="object"){let[d,p]=Object.entries(i)[0];h[d]={text:p}}else h.techn={text:i};if(a==null)h.descr={text:""};else if(typeof a=="object"){let[d,p]=Object.entries(a)[0];h[d]={text:p}}else h.descr={text:a};if(typeof s=="object"){let[d,p]=Object.entries(s)[0];h[d]=p}else h.sprite=s;if(typeof l=="object"){let[d,p]=Object.entries(l)[0];h[d]=p}else h.tags=l;if(typeof u=="object"){let[d,p]=Object.entries(u)[0];h[d]=p}else h.link=u;h.wrap=yh()},"addRel"),d3e=o(function(t,e,r,n,i,a,s){if(e===null||r===null)return;let l={},u=ul.find(h=>h.alias===e);if(u&&e===u.alias?l=u:(l.alias=e,ul.push(l)),r==null?l.label={text:""}:l.label={text:r},n==null)l.descr={text:""};else if(typeof n=="object"){let[h,f]=Object.entries(n)[0];l[h]={text:f}}else l.descr={text:n};if(typeof i=="object"){let[h,f]=Object.entries(i)[0];l[h]=f}else l.sprite=i;if(typeof a=="object"){let[h,f]=Object.entries(a)[0];l[h]=f}else l.tags=a;if(typeof s=="object"){let[h,f]=Object.entries(s)[0];l[h]=f}else l.link=s;l.typeC4Shape={text:t},l.parentBoundary=Ja,l.wrap=yh()},"addPersonOrSystem"),p3e=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=ul.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,ul.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.techn={text:""};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.techn={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof a=="object"){let[f,d]=Object.entries(a)[0];u[f]=d}else u.sprite=a;if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.wrap=yh(),u.typeC4Shape={text:t},u.parentBoundary=Ja},"addContainer"),m3e=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=ul.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,ul.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.techn={text:""};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.techn={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof a=="object"){let[f,d]=Object.entries(a)[0];u[f]=d}else u.sprite=a;if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.wrap=yh(),u.typeC4Shape={text:t},u.parentBoundary=Ja},"addComponent"),g3e=o(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=tc.find(l=>l.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,tc.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"system"};else if(typeof r=="object"){let[l,u]=Object.entries(r)[0];a[l]={text:u}}else a.type={text:r};if(typeof n=="object"){let[l,u]=Object.entries(n)[0];a[l]=u}else a.tags=n;if(typeof i=="object"){let[l,u]=Object.entries(i)[0];a[l]=u}else a.link=i;a.parentBoundary=Ja,a.wrap=yh(),cl=Ja,Ja=t,gh.push(cl)},"addPersonOrSystemBoundary"),y3e=o(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=tc.find(l=>l.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,tc.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"container"};else if(typeof r=="object"){let[l,u]=Object.entries(r)[0];a[l]={text:u}}else a.type={text:r};if(typeof n=="object"){let[l,u]=Object.entries(n)[0];a[l]=u}else a.tags=n;if(typeof i=="object"){let[l,u]=Object.entries(i)[0];a[l]=u}else a.link=i;a.parentBoundary=Ja,a.wrap=yh(),cl=Ja,Ja=t,gh.push(cl)},"addContainerBoundary"),v3e=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=tc.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,tc.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.type={text:"node"};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.type={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.nodeType=t,u.parentBoundary=Ja,u.wrap=yh(),cl=Ja,Ja=e,gh.push(cl)},"addDeploymentNode"),x3e=o(function(){Ja=cl,gh.pop(),cl=gh.pop(),gh.push(cl)},"popBoundaryParseStack"),b3e=o(function(t,e,r,n,i,a,s,l,u,h,f){let d=ul.find(p=>p.alias===e);if(!(d===void 0&&(d=tc.find(p=>p.alias===e),d===void 0))){if(r!=null)if(typeof r=="object"){let[p,m]=Object.entries(r)[0];d[p]=m}else d.bgColor=r;if(n!=null)if(typeof n=="object"){let[p,m]=Object.entries(n)[0];d[p]=m}else d.fontColor=n;if(i!=null)if(typeof i=="object"){let[p,m]=Object.entries(i)[0];d[p]=m}else d.borderColor=i;if(a!=null)if(typeof a=="object"){let[p,m]=Object.entries(a)[0];d[p]=m}else d.shadowing=a;if(s!=null)if(typeof s=="object"){let[p,m]=Object.entries(s)[0];d[p]=m}else d.shape=s;if(l!=null)if(typeof l=="object"){let[p,m]=Object.entries(l)[0];d[p]=m}else d.sprite=l;if(u!=null)if(typeof u=="object"){let[p,m]=Object.entries(u)[0];d[p]=m}else d.techn=u;if(h!=null)if(typeof h=="object"){let[p,m]=Object.entries(h)[0];d[p]=m}else d.legendText=h;if(f!=null)if(typeof f=="object"){let[p,m]=Object.entries(f)[0];d[p]=m}else d.legendSprite=f}},"updateElStyle"),w3e=o(function(t,e,r,n,i,a,s){let l=Ky.find(u=>u.from===e&&u.to===r);if(l!==void 0){if(n!=null)if(typeof n=="object"){let[u,h]=Object.entries(n)[0];l[u]=h}else l.textColor=n;if(i!=null)if(typeof i=="object"){let[u,h]=Object.entries(i)[0];l[u]=h}else l.lineColor=i;if(a!=null)if(typeof a=="object"){let[u,h]=Object.entries(a)[0];l[u]=parseInt(h)}else l.offsetX=parseInt(a);if(s!=null)if(typeof s=="object"){let[u,h]=Object.entries(s)[0];l[u]=parseInt(h)}else l.offsetY=parseInt(s)}},"updateRelStyle"),T3e=o(function(t,e,r){let n=_3,i=D3;if(typeof e=="object"){let a=Object.values(e)[0];n=parseInt(a)}else n=parseInt(e);if(typeof r=="object"){let a=Object.values(r)[0];i=parseInt(a)}else i=parseInt(r);n>=1&&(_3=n),i>=1&&(D3=i)},"updateLayoutConfig"),k3e=o(function(){return _3},"getC4ShapeInRow"),E3e=o(function(){return D3},"getC4BoundaryInRow"),S3e=o(function(){return Ja},"getCurrentBoundaryParse"),C3e=o(function(){return cl},"getParentBoundaryParse"),UG=o(function(t){return t==null?ul:ul.filter(e=>e.parentBoundary===t)},"getC4ShapeArray"),A3e=o(function(t){return ul.find(e=>e.alias===t)},"getC4Shape"),_3e=o(function(t){return Object.keys(UG(t))},"getC4ShapeKeys"),HG=o(function(t){return t==null?tc:tc.filter(e=>e.parentBoundary===t)},"getBoundaries"),D3e=HG,L3e=o(function(){return Ky},"getRels"),R3e=o(function(){return lA},"getTitle"),N3e=o(function(t){cA=t},"setWrap"),yh=o(function(){return cA},"autoWrap"),M3e=o(function(){ul=[],tc=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],cl="",Ja="global",gh=[""],Ky=[],gh=[""],lA="",cA=!1,_3=4,D3=2},"clear"),I3e={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},O3e={FILLED:0,OPEN:1},P3e={LEFTOF:0,RIGHTOF:1,OVER:2},B3e=o(function(t){lA=Tr(t,me())},"setTitle"),Qy={addPersonOrSystem:d3e,addPersonOrSystemBoundary:g3e,addContainer:p3e,addContainerBoundary:y3e,addComponent:m3e,addDeploymentNode:v3e,popBoundaryParseStack:x3e,addRel:f3e,updateElStyle:b3e,updateRelStyle:w3e,updateLayoutConfig:T3e,autoWrap:yh,setWrap:N3e,getC4ShapeArray:UG,getC4Shape:A3e,getC4ShapeKeys:_3e,getBoundaries:HG,getBoundarys:D3e,getCurrentBoundaryParse:S3e,getParentBoundaryParse:C3e,getRels:L3e,getTitle:R3e,getC4Type:u3e,getC4ShapeInRow:k3e,getC4BoundaryInRow:E3e,setAccTitle:Lr,getAccTitle:Rr,getAccDescription:Mr,setAccDescription:Nr,getConfig:o(()=>me().c4,"getConfig"),clear:M3e,LINETYPE:I3e,ARROWTYPE:O3e,PLACEMENT:P3e,setTitle:B3e,setC4Type:h3e}});function sd(t,e){return t==null||e==null?NaN:te?1:t>=e?0:NaN}var hA=N(()=>{"use strict";o(sd,"ascending")});function fA(t,e){return t==null||e==null?NaN:et?1:e>=t?0:NaN}var WG=N(()=>{"use strict";o(fA,"descending")});function od(t){let e,r,n;t.length!==2?(e=sd,r=o((l,u)=>sd(t(l),u),"compare2"),n=o((l,u)=>t(l)-u,"delta")):(e=t===sd||t===fA?t:F3e,r=t,n=t);function i(l,u,h=0,f=l.length){if(h>>1;r(l[d],u)<0?h=d+1:f=d}while(h>>1;r(l[d],u)<=0?h=d+1:f=d}while(hh&&n(l[d-1],u)>-n(l[d],u)?d-1:d}return o(s,"center"),{left:i,center:s,right:a}}function F3e(){return 0}var dA=N(()=>{"use strict";hA();WG();o(od,"bisector");o(F3e,"zero")});function pA(t){return t===null?NaN:+t}var qG=N(()=>{"use strict";o(pA,"number")});var YG,XG,$3e,z3e,mA,jG=N(()=>{"use strict";hA();dA();qG();YG=od(sd),XG=YG.right,$3e=YG.left,z3e=od(pA).center,mA=XG});function KG({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):r}function G3e({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):(t.set(n,r),r)}function V3e({_intern:t,_key:e},r){let n=e(r);return t.has(n)&&(r=t.get(n),t.delete(n)),r}function U3e(t){return t!==null&&typeof t=="object"?t.valueOf():t}var g0,QG=N(()=>{"use strict";g0=class extends Map{static{o(this,"InternMap")}constructor(e,r=U3e){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),e!=null)for(let[n,i]of e)this.set(n,i)}get(e){return super.get(KG(this,e))}has(e){return super.has(KG(this,e))}set(e,r){return super.set(G3e(this,e),r)}delete(e){return super.delete(V3e(this,e))}};o(KG,"intern_get");o(G3e,"intern_set");o(V3e,"intern_delete");o(U3e,"keyof")});function L3(t,e,r){let n=(e-t)/Math.max(0,r),i=Math.floor(Math.log10(n)),a=n/Math.pow(10,i),s=a>=H3e?10:a>=W3e?5:a>=q3e?2:1,l,u,h;return i<0?(h=Math.pow(10,-i)/s,l=Math.round(t*h),u=Math.round(e*h),l/he&&--u,h=-h):(h=Math.pow(10,i)*s,l=Math.round(t/h),u=Math.round(e/h),l*he&&--u),u0))return[];if(t===e)return[t];let n=e=i))return[];let l=a-i+1,u=new Array(l);if(n)if(s<0)for(let h=0;h{"use strict";H3e=Math.sqrt(50),W3e=Math.sqrt(10),q3e=Math.sqrt(2);o(L3,"tickSpec");o(R3,"ticks");o(Zy,"tickIncrement");o(y0,"tickStep")});function N3(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var JG=N(()=>{"use strict";o(N3,"max")});function M3(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var eV=N(()=>{"use strict";o(M3,"min")});function I3(t,e,r){t=+t,e=+e,r=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+r;for(var n=-1,i=Math.max(0,Math.ceil((e-t)/r))|0,a=new Array(i);++n{"use strict";o(I3,"range")});var vh=N(()=>{"use strict";jG();dA();JG();eV();tV();ZG();QG()});function gA(t){return t}var rV=N(()=>{"use strict";o(gA,"default")});function Y3e(t){return"translate("+t+",0)"}function X3e(t){return"translate(0,"+t+")"}function j3e(t){return e=>+t(e)}function K3e(t,e){return e=Math.max(0,t.bandwidth()-e*2)/2,t.round()&&(e=Math.round(e)),r=>+t(r)+e}function Q3e(){return!this.__axis}function iV(t,e){var r=[],n=null,i=null,a=6,s=6,l=3,u=typeof window<"u"&&window.devicePixelRatio>1?0:.5,h=t===P3||t===O3?-1:1,f=t===O3||t===yA?"x":"y",d=t===P3||t===vA?Y3e:X3e;function p(m){var g=n??(e.ticks?e.ticks.apply(e,r):e.domain()),y=i??(e.tickFormat?e.tickFormat.apply(e,r):gA),v=Math.max(a,0)+l,x=e.range(),b=+x[0]+u,w=+x[x.length-1]+u,C=(e.bandwidth?K3e:j3e)(e.copy(),u),T=m.selection?m.selection():m,E=T.selectAll(".domain").data([null]),A=T.selectAll(".tick").data(g,e).order(),S=A.exit(),_=A.enter().append("g").attr("class","tick"),I=A.select("line"),D=A.select("text");E=E.merge(E.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),A=A.merge(_),I=I.merge(_.append("line").attr("stroke","currentColor").attr(f+"2",h*a)),D=D.merge(_.append("text").attr("fill","currentColor").attr(f,h*v).attr("dy",t===P3?"0em":t===vA?"0.71em":"0.32em")),m!==T&&(E=E.transition(m),A=A.transition(m),I=I.transition(m),D=D.transition(m),S=S.transition(m).attr("opacity",nV).attr("transform",function(k){return isFinite(k=C(k))?d(k+u):this.getAttribute("transform")}),_.attr("opacity",nV).attr("transform",function(k){var L=this.parentNode.__axis;return d((L&&isFinite(L=L(k))?L:C(k))+u)})),S.remove(),E.attr("d",t===O3||t===yA?s?"M"+h*s+","+b+"H"+u+"V"+w+"H"+h*s:"M"+u+","+b+"V"+w:s?"M"+b+","+h*s+"V"+u+"H"+w+"V"+h*s:"M"+b+","+u+"H"+w),A.attr("opacity",1).attr("transform",function(k){return d(C(k)+u)}),I.attr(f+"2",h*a),D.attr(f,h*v).text(y),T.filter(Q3e).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===yA?"start":t===O3?"end":"middle"),T.each(function(){this.__axis=C})}return o(p,"axis"),p.scale=function(m){return arguments.length?(e=m,p):e},p.ticks=function(){return r=Array.from(arguments),p},p.tickArguments=function(m){return arguments.length?(r=m==null?[]:Array.from(m),p):r.slice()},p.tickValues=function(m){return arguments.length?(n=m==null?null:Array.from(m),p):n&&n.slice()},p.tickFormat=function(m){return arguments.length?(i=m,p):i},p.tickSize=function(m){return arguments.length?(a=s=+m,p):a},p.tickSizeInner=function(m){return arguments.length?(a=+m,p):a},p.tickSizeOuter=function(m){return arguments.length?(s=+m,p):s},p.tickPadding=function(m){return arguments.length?(l=+m,p):l},p.offset=function(m){return arguments.length?(u=+m,p):u},p}function xA(t){return iV(P3,t)}function bA(t){return iV(vA,t)}var P3,yA,vA,O3,nV,aV=N(()=>{"use strict";rV();P3=1,yA=2,vA=3,O3=4,nV=1e-6;o(Y3e,"translateX");o(X3e,"translateY");o(j3e,"number");o(K3e,"center");o(Q3e,"entering");o(iV,"axis");o(xA,"axisTop");o(bA,"axisBottom")});var sV=N(()=>{"use strict";aV()});function lV(){for(var t=0,e=arguments.length,r={},n;t=0&&(n=r.slice(i+1),r=r.slice(0,i)),r&&!e.hasOwnProperty(r))throw new Error("unknown type: "+r);return{type:r,name:n}})}function e5e(t,e){for(var r=0,n=t.length,i;r{"use strict";Z3e={value:o(()=>{},"value")};o(lV,"dispatch");o(B3,"Dispatch");o(J3e,"parseTypenames");B3.prototype=lV.prototype={constructor:B3,on:o(function(t,e){var r=this._,n=J3e(t+"",r),i,a=-1,s=n.length;if(arguments.length<2){for(;++a0)for(var r=new Array(i),n=0,i,a;n{"use strict";cV()});var F3,kA,EA=N(()=>{"use strict";F3="http://www.w3.org/1999/xhtml",kA={svg:"http://www.w3.org/2000/svg",xhtml:F3,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"}});function rc(t){var e=t+="",r=e.indexOf(":");return r>=0&&(e=t.slice(0,r))!=="xmlns"&&(t=t.slice(r+1)),kA.hasOwnProperty(e)?{space:kA[e],local:t}:t}var $3=N(()=>{"use strict";EA();o(rc,"default")});function t5e(t){return function(){var e=this.ownerDocument,r=this.namespaceURI;return r===F3&&e.documentElement.namespaceURI===F3?e.createElement(t):e.createElementNS(r,t)}}function r5e(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function Jy(t){var e=rc(t);return(e.local?r5e:t5e)(e)}var SA=N(()=>{"use strict";$3();EA();o(t5e,"creatorInherit");o(r5e,"creatorFixed");o(Jy,"default")});function n5e(){}function xh(t){return t==null?n5e:function(){return this.querySelector(t)}}var z3=N(()=>{"use strict";o(n5e,"none");o(xh,"default")});function CA(t){typeof t!="function"&&(t=xh(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";hl();z3();o(CA,"default")});function AA(t){return t==null?[]:Array.isArray(t)?t:Array.from(t)}var hV=N(()=>{"use strict";o(AA,"array")});function i5e(){return[]}function v0(t){return t==null?i5e:function(){return this.querySelectorAll(t)}}var _A=N(()=>{"use strict";o(i5e,"empty");o(v0,"default")});function a5e(t){return function(){return AA(t.apply(this,arguments))}}function DA(t){typeof t=="function"?t=a5e(t):t=v0(t);for(var e=this._groups,r=e.length,n=[],i=[],a=0;a{"use strict";hl();hV();_A();o(a5e,"arrayAll");o(DA,"default")});function x0(t){return function(){return this.matches(t)}}function G3(t){return function(e){return e.matches(t)}}var ev=N(()=>{"use strict";o(x0,"default");o(G3,"childMatcher")});function o5e(t){return function(){return s5e.call(this.children,t)}}function l5e(){return this.firstElementChild}function LA(t){return this.select(t==null?l5e:o5e(typeof t=="function"?t:G3(t)))}var s5e,dV=N(()=>{"use strict";ev();s5e=Array.prototype.find;o(o5e,"childFind");o(l5e,"childFirst");o(LA,"default")});function u5e(){return Array.from(this.children)}function h5e(t){return function(){return c5e.call(this.children,t)}}function RA(t){return this.selectAll(t==null?u5e:h5e(typeof t=="function"?t:G3(t)))}var c5e,pV=N(()=>{"use strict";ev();c5e=Array.prototype.filter;o(u5e,"children");o(h5e,"childrenFilter");o(RA,"default")});function NA(t){typeof t!="function"&&(t=x0(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";hl();ev();o(NA,"default")});function tv(t){return new Array(t.length)}var MA=N(()=>{"use strict";o(tv,"default")});function IA(){return new oi(this._enter||this._groups.map(tv),this._parents)}function rv(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}var OA=N(()=>{"use strict";MA();hl();o(IA,"default");o(rv,"EnterNode");rv.prototype={constructor:rv,appendChild:o(function(t){return this._parent.insertBefore(t,this._next)},"appendChild"),insertBefore:o(function(t,e){return this._parent.insertBefore(t,e)},"insertBefore"),querySelector:o(function(t){return this._parent.querySelector(t)},"querySelector"),querySelectorAll:o(function(t){return this._parent.querySelectorAll(t)},"querySelectorAll")}});function PA(t){return function(){return t}}var gV=N(()=>{"use strict";o(PA,"default")});function f5e(t,e,r,n,i,a){for(var s=0,l,u=e.length,h=a.length;s=w&&(w=b+1);!(T=v[w])&&++w{"use strict";hl();OA();gV();o(f5e,"bindIndex");o(d5e,"bindKey");o(p5e,"datum");o(BA,"default");o(m5e,"arraylike")});function FA(){return new oi(this._exit||this._groups.map(tv),this._parents)}var vV=N(()=>{"use strict";MA();hl();o(FA,"default")});function $A(t,e,r){var n=this.enter(),i=this,a=this.exit();return typeof t=="function"?(n=t(n),n&&(n=n.selection())):n=n.append(t+""),e!=null&&(i=e(i),i&&(i=i.selection())),r==null?a.remove():r(a),n&&i?n.merge(i).order():i}var xV=N(()=>{"use strict";o($A,"default")});function zA(t){for(var e=t.selection?t.selection():t,r=this._groups,n=e._groups,i=r.length,a=n.length,s=Math.min(i,a),l=new Array(i),u=0;u{"use strict";hl();o(zA,"default")});function GA(){for(var t=this._groups,e=-1,r=t.length;++e=0;)(s=n[i])&&(a&&s.compareDocumentPosition(a)^4&&a.parentNode.insertBefore(s,a),a=s);return this}var wV=N(()=>{"use strict";o(GA,"default")});function VA(t){t||(t=g5e);function e(d,p){return d&&p?t(d.__data__,p.__data__):!d-!p}o(e,"compareNode");for(var r=this._groups,n=r.length,i=new Array(n),a=0;ae?1:t>=e?0:NaN}var TV=N(()=>{"use strict";hl();o(VA,"default");o(g5e,"ascending")});function UA(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}var kV=N(()=>{"use strict";o(UA,"default")});function HA(){return Array.from(this)}var EV=N(()=>{"use strict";o(HA,"default")});function WA(){for(var t=this._groups,e=0,r=t.length;e{"use strict";o(WA,"default")});function qA(){let t=0;for(let e of this)++t;return t}var CV=N(()=>{"use strict";o(qA,"default")});function YA(){return!this.node()}var AV=N(()=>{"use strict";o(YA,"default")});function XA(t){for(var e=this._groups,r=0,n=e.length;r{"use strict";o(XA,"default")});function y5e(t){return function(){this.removeAttribute(t)}}function v5e(t){return function(){this.removeAttributeNS(t.space,t.local)}}function x5e(t,e){return function(){this.setAttribute(t,e)}}function b5e(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function w5e(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttribute(t):this.setAttribute(t,r)}}function T5e(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,r)}}function jA(t,e){var r=rc(t);if(arguments.length<2){var n=this.node();return r.local?n.getAttributeNS(r.space,r.local):n.getAttribute(r)}return this.each((e==null?r.local?v5e:y5e:typeof e=="function"?r.local?T5e:w5e:r.local?b5e:x5e)(r,e))}var DV=N(()=>{"use strict";$3();o(y5e,"attrRemove");o(v5e,"attrRemoveNS");o(x5e,"attrConstant");o(b5e,"attrConstantNS");o(w5e,"attrFunction");o(T5e,"attrFunctionNS");o(jA,"default")});function nv(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}var KA=N(()=>{"use strict";o(nv,"default")});function k5e(t){return function(){this.style.removeProperty(t)}}function E5e(t,e,r){return function(){this.style.setProperty(t,e,r)}}function S5e(t,e,r){return function(){var n=e.apply(this,arguments);n==null?this.style.removeProperty(t):this.style.setProperty(t,n,r)}}function QA(t,e,r){return arguments.length>1?this.each((e==null?k5e:typeof e=="function"?S5e:E5e)(t,e,r??"")):bh(this.node(),t)}function bh(t,e){return t.style.getPropertyValue(e)||nv(t).getComputedStyle(t,null).getPropertyValue(e)}var ZA=N(()=>{"use strict";KA();o(k5e,"styleRemove");o(E5e,"styleConstant");o(S5e,"styleFunction");o(QA,"default");o(bh,"styleValue")});function C5e(t){return function(){delete this[t]}}function A5e(t,e){return function(){this[t]=e}}function _5e(t,e){return function(){var r=e.apply(this,arguments);r==null?delete this[t]:this[t]=r}}function JA(t,e){return arguments.length>1?this.each((e==null?C5e:typeof e=="function"?_5e:A5e)(t,e)):this.node()[t]}var LV=N(()=>{"use strict";o(C5e,"propertyRemove");o(A5e,"propertyConstant");o(_5e,"propertyFunction");o(JA,"default")});function RV(t){return t.trim().split(/^|\s+/)}function e8(t){return t.classList||new NV(t)}function NV(t){this._node=t,this._names=RV(t.getAttribute("class")||"")}function MV(t,e){for(var r=e8(t),n=-1,i=e.length;++n{"use strict";o(RV,"classArray");o(e8,"classList");o(NV,"ClassList");NV.prototype={add:o(function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},"add"),remove:o(function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},"remove"),contains:o(function(t){return this._names.indexOf(t)>=0},"contains")};o(MV,"classedAdd");o(IV,"classedRemove");o(D5e,"classedTrue");o(L5e,"classedFalse");o(R5e,"classedFunction");o(t8,"default")});function N5e(){this.textContent=""}function M5e(t){return function(){this.textContent=t}}function I5e(t){return function(){var e=t.apply(this,arguments);this.textContent=e??""}}function r8(t){return arguments.length?this.each(t==null?N5e:(typeof t=="function"?I5e:M5e)(t)):this.node().textContent}var PV=N(()=>{"use strict";o(N5e,"textRemove");o(M5e,"textConstant");o(I5e,"textFunction");o(r8,"default")});function O5e(){this.innerHTML=""}function P5e(t){return function(){this.innerHTML=t}}function B5e(t){return function(){var e=t.apply(this,arguments);this.innerHTML=e??""}}function n8(t){return arguments.length?this.each(t==null?O5e:(typeof t=="function"?B5e:P5e)(t)):this.node().innerHTML}var BV=N(()=>{"use strict";o(O5e,"htmlRemove");o(P5e,"htmlConstant");o(B5e,"htmlFunction");o(n8,"default")});function F5e(){this.nextSibling&&this.parentNode.appendChild(this)}function i8(){return this.each(F5e)}var FV=N(()=>{"use strict";o(F5e,"raise");o(i8,"default")});function $5e(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function a8(){return this.each($5e)}var $V=N(()=>{"use strict";o($5e,"lower");o(a8,"default")});function s8(t){var e=typeof t=="function"?t:Jy(t);return this.select(function(){return this.appendChild(e.apply(this,arguments))})}var zV=N(()=>{"use strict";SA();o(s8,"default")});function z5e(){return null}function o8(t,e){var r=typeof t=="function"?t:Jy(t),n=e==null?z5e:typeof e=="function"?e:xh(e);return this.select(function(){return this.insertBefore(r.apply(this,arguments),n.apply(this,arguments)||null)})}var GV=N(()=>{"use strict";SA();z3();o(z5e,"constantNull");o(o8,"default")});function G5e(){var t=this.parentNode;t&&t.removeChild(this)}function l8(){return this.each(G5e)}var VV=N(()=>{"use strict";o(G5e,"remove");o(l8,"default")});function V5e(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function U5e(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function c8(t){return this.select(t?U5e:V5e)}var UV=N(()=>{"use strict";o(V5e,"selection_cloneShallow");o(U5e,"selection_cloneDeep");o(c8,"default")});function u8(t){return arguments.length?this.property("__data__",t):this.node().__data__}var HV=N(()=>{"use strict";o(u8,"default")});function H5e(t){return function(e){t.call(this,e,this.__data__)}}function W5e(t){return t.trim().split(/^|\s+/).map(function(e){var r="",n=e.indexOf(".");return n>=0&&(r=e.slice(n+1),e=e.slice(0,n)),{type:e,name:r}})}function q5e(t){return function(){var e=this.__on;if(e){for(var r=0,n=-1,i=e.length,a;r{"use strict";o(H5e,"contextListener");o(W5e,"parseTypenames");o(q5e,"onRemove");o(Y5e,"onAdd");o(h8,"default")});function qV(t,e,r){var n=nv(t),i=n.CustomEvent;typeof i=="function"?i=new i(e,r):(i=n.document.createEvent("Event"),r?(i.initEvent(e,r.bubbles,r.cancelable),i.detail=r.detail):i.initEvent(e,!1,!1)),t.dispatchEvent(i)}function X5e(t,e){return function(){return qV(this,t,e)}}function j5e(t,e){return function(){return qV(this,t,e.apply(this,arguments))}}function f8(t,e){return this.each((typeof e=="function"?j5e:X5e)(t,e))}var YV=N(()=>{"use strict";KA();o(qV,"dispatchEvent");o(X5e,"dispatchConstant");o(j5e,"dispatchFunction");o(f8,"default")});function*d8(){for(var t=this._groups,e=0,r=t.length;e{"use strict";o(d8,"default")});function oi(t,e){this._groups=t,this._parents=e}function jV(){return new oi([[document.documentElement]],p8)}function K5e(){return this}var p8,hu,hl=N(()=>{"use strict";uV();fV();dV();pV();mV();yV();OA();vV();xV();bV();wV();TV();kV();EV();SV();CV();AV();_V();DV();ZA();LV();OV();PV();BV();FV();$V();zV();GV();VV();UV();HV();WV();YV();XV();p8=[null];o(oi,"Selection");o(jV,"selection");o(K5e,"selection_selection");oi.prototype=jV.prototype={constructor:oi,select:CA,selectAll:DA,selectChild:LA,selectChildren:RA,filter:NA,data:BA,enter:IA,exit:FA,join:$A,merge:zA,selection:K5e,order:GA,sort:VA,call:UA,nodes:HA,node:WA,size:qA,empty:YA,each:XA,attr:jA,style:QA,property:JA,classed:t8,text:r8,html:n8,raise:i8,lower:a8,append:s8,insert:o8,remove:l8,clone:c8,datum:u8,on:h8,dispatch:f8,[Symbol.iterator]:d8};hu=jV});function Ge(t){return typeof t=="string"?new oi([[document.querySelector(t)]],[document.documentElement]):new oi([[t]],p8)}var KV=N(()=>{"use strict";hl();o(Ge,"default")});var fl=N(()=>{"use strict";ev();$3();KV();hl();z3();_A();ZA()});var QV=N(()=>{"use strict"});function wh(t,e,r){t.prototype=e.prototype=r,r.constructor=t}function b0(t,e){var r=Object.create(t.prototype);for(var n in e)r[n]=e[n];return r}var m8=N(()=>{"use strict";o(wh,"default");o(b0,"extend")});function Th(){}function JV(){return this.rgb().formatHex()}function iwe(){return this.rgb().formatHex8()}function awe(){return sU(this).formatHsl()}function eU(){return this.rgb().formatRgb()}function pl(t){var e,r;return t=(t+"").trim().toLowerCase(),(e=Q5e.exec(t))?(r=e[1].length,e=parseInt(e[1],16),r===6?tU(e):r===3?new ua(e>>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):r===8?V3(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):r===4?V3(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=Z5e.exec(t))?new ua(e[1],e[2],e[3],1):(e=J5e.exec(t))?new ua(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=ewe.exec(t))?V3(e[1],e[2],e[3],e[4]):(e=twe.exec(t))?V3(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=rwe.exec(t))?iU(e[1],e[2]/100,e[3]/100,1):(e=nwe.exec(t))?iU(e[1],e[2]/100,e[3]/100,e[4]):ZV.hasOwnProperty(t)?tU(ZV[t]):t==="transparent"?new ua(NaN,NaN,NaN,0):null}function tU(t){return new ua(t>>16&255,t>>8&255,t&255,1)}function V3(t,e,r,n){return n<=0&&(t=e=r=NaN),new ua(t,e,r,n)}function y8(t){return t instanceof Th||(t=pl(t)),t?(t=t.rgb(),new ua(t.r,t.g,t.b,t.opacity)):new ua}function T0(t,e,r,n){return arguments.length===1?y8(t):new ua(t,e,r,n??1)}function ua(t,e,r,n){this.r=+t,this.g=+e,this.b=+r,this.opacity=+n}function rU(){return`#${ld(this.r)}${ld(this.g)}${ld(this.b)}`}function swe(){return`#${ld(this.r)}${ld(this.g)}${ld(this.b)}${ld((isNaN(this.opacity)?1:this.opacity)*255)}`}function nU(){let t=W3(this.opacity);return`${t===1?"rgb(":"rgba("}${cd(this.r)}, ${cd(this.g)}, ${cd(this.b)}${t===1?")":`, ${t})`}`}function W3(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function cd(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function ld(t){return t=cd(t),(t<16?"0":"")+t.toString(16)}function iU(t,e,r,n){return n<=0?t=e=r=NaN:r<=0||r>=1?t=e=NaN:e<=0&&(t=NaN),new dl(t,e,r,n)}function sU(t){if(t instanceof dl)return new dl(t.h,t.s,t.l,t.opacity);if(t instanceof Th||(t=pl(t)),!t)return new dl;if(t instanceof dl)return t;t=t.rgb();var e=t.r/255,r=t.g/255,n=t.b/255,i=Math.min(e,r,n),a=Math.max(e,r,n),s=NaN,l=a-i,u=(a+i)/2;return l?(e===a?s=(r-n)/l+(r0&&u<1?0:s,new dl(s,l,u,t.opacity)}function oU(t,e,r,n){return arguments.length===1?sU(t):new dl(t,e,r,n??1)}function dl(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}function aU(t){return t=(t||0)%360,t<0?t+360:t}function U3(t){return Math.max(0,Math.min(1,t||0))}function g8(t,e,r){return(t<60?e+(r-e)*t/60:t<180?r:t<240?e+(r-e)*(240-t)/60:e)*255}var iv,H3,w0,av,nc,Q5e,Z5e,J5e,ewe,twe,rwe,nwe,ZV,v8=N(()=>{"use strict";m8();o(Th,"Color");iv=.7,H3=1/iv,w0="\\s*([+-]?\\d+)\\s*",av="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",nc="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",Q5e=/^#([0-9a-f]{3,8})$/,Z5e=new RegExp(`^rgb\\(${w0},${w0},${w0}\\)$`),J5e=new RegExp(`^rgb\\(${nc},${nc},${nc}\\)$`),ewe=new RegExp(`^rgba\\(${w0},${w0},${w0},${av}\\)$`),twe=new RegExp(`^rgba\\(${nc},${nc},${nc},${av}\\)$`),rwe=new RegExp(`^hsl\\(${av},${nc},${nc}\\)$`),nwe=new RegExp(`^hsla\\(${av},${nc},${nc},${av}\\)$`),ZV={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};wh(Th,pl,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:JV,formatHex:JV,formatHex8:iwe,formatHsl:awe,formatRgb:eU,toString:eU});o(JV,"color_formatHex");o(iwe,"color_formatHex8");o(awe,"color_formatHsl");o(eU,"color_formatRgb");o(pl,"color");o(tU,"rgbn");o(V3,"rgba");o(y8,"rgbConvert");o(T0,"rgb");o(ua,"Rgb");wh(ua,T0,b0(Th,{brighter(t){return t=t==null?H3:Math.pow(H3,t),new ua(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?iv:Math.pow(iv,t),new ua(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new ua(cd(this.r),cd(this.g),cd(this.b),W3(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:rU,formatHex:rU,formatHex8:swe,formatRgb:nU,toString:nU}));o(rU,"rgb_formatHex");o(swe,"rgb_formatHex8");o(nU,"rgb_formatRgb");o(W3,"clampa");o(cd,"clampi");o(ld,"hex");o(iU,"hsla");o(sU,"hslConvert");o(oU,"hsl");o(dl,"Hsl");wh(dl,oU,b0(Th,{brighter(t){return t=t==null?H3:Math.pow(H3,t),new dl(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?iv:Math.pow(iv,t),new dl(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*e,i=2*r-n;return new ua(g8(t>=240?t-240:t+120,i,n),g8(t,i,n),g8(t<120?t+240:t-120,i,n),this.opacity)},clamp(){return new dl(aU(this.h),U3(this.s),U3(this.l),W3(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=W3(this.opacity);return`${t===1?"hsl(":"hsla("}${aU(this.h)}, ${U3(this.s)*100}%, ${U3(this.l)*100}%${t===1?")":`, ${t})`}`}}));o(aU,"clamph");o(U3,"clampt");o(g8,"hsl2rgb")});var lU,cU,uU=N(()=>{"use strict";lU=Math.PI/180,cU=180/Math.PI});function gU(t){if(t instanceof ic)return new ic(t.l,t.a,t.b,t.opacity);if(t instanceof fu)return yU(t);t instanceof ua||(t=y8(t));var e=T8(t.r),r=T8(t.g),n=T8(t.b),i=x8((.2225045*e+.7168786*r+.0606169*n)/fU),a,s;return e===r&&r===n?a=s=i:(a=x8((.4360747*e+.3850649*r+.1430804*n)/hU),s=x8((.0139322*e+.0971045*r+.7141733*n)/dU)),new ic(116*i-16,500*(a-i),200*(i-s),t.opacity)}function k8(t,e,r,n){return arguments.length===1?gU(t):new ic(t,e,r,n??1)}function ic(t,e,r,n){this.l=+t,this.a=+e,this.b=+r,this.opacity=+n}function x8(t){return t>owe?Math.pow(t,1/3):t/mU+pU}function b8(t){return t>k0?t*t*t:mU*(t-pU)}function w8(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function T8(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function lwe(t){if(t instanceof fu)return new fu(t.h,t.c,t.l,t.opacity);if(t instanceof ic||(t=gU(t)),t.a===0&&t.b===0)return new fu(NaN,0{"use strict";m8();v8();uU();q3=18,hU=.96422,fU=1,dU=.82521,pU=4/29,k0=6/29,mU=3*k0*k0,owe=k0*k0*k0;o(gU,"labConvert");o(k8,"lab");o(ic,"Lab");wh(ic,k8,b0(Th,{brighter(t){return new ic(this.l+q3*(t??1),this.a,this.b,this.opacity)},darker(t){return new ic(this.l-q3*(t??1),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,r=isNaN(this.b)?t:t-this.b/200;return e=hU*b8(e),t=fU*b8(t),r=dU*b8(r),new ua(w8(3.1338561*e-1.6168667*t-.4906146*r),w8(-.9787684*e+1.9161415*t+.033454*r),w8(.0719453*e-.2289914*t+1.4052427*r),this.opacity)}}));o(x8,"xyz2lab");o(b8,"lab2xyz");o(w8,"lrgb2rgb");o(T8,"rgb2lrgb");o(lwe,"hclConvert");o(sv,"hcl");o(fu,"Hcl");o(yU,"hcl2lab");wh(fu,sv,b0(Th,{brighter(t){return new fu(this.h,this.c,this.l+q3*(t??1),this.opacity)},darker(t){return new fu(this.h,this.c,this.l-q3*(t??1),this.opacity)},rgb(){return yU(this).rgb()}}))});var E0=N(()=>{"use strict";v8();vU()});function E8(t,e,r,n,i){var a=t*t,s=a*t;return((1-3*t+3*a-s)*e+(4-6*a+3*s)*r+(1+3*t+3*a-3*s)*n+s*i)/6}function S8(t){var e=t.length-1;return function(r){var n=r<=0?r=0:r>=1?(r=1,e-1):Math.floor(r*e),i=t[n],a=t[n+1],s=n>0?t[n-1]:2*i-a,l=n{"use strict";o(E8,"basis");o(S8,"default")});function A8(t){var e=t.length;return function(r){var n=Math.floor(((r%=1)<0?++r:r)*e),i=t[(n+e-1)%e],a=t[n%e],s=t[(n+1)%e],l=t[(n+2)%e];return E8((r-n/e)*e,i,a,s,l)}}var xU=N(()=>{"use strict";C8();o(A8,"default")});var S0,_8=N(()=>{"use strict";S0=o(t=>()=>t,"default")});function bU(t,e){return function(r){return t+r*e}}function cwe(t,e,r){return t=Math.pow(t,r),e=Math.pow(e,r)-t,r=1/r,function(n){return Math.pow(t+n*e,r)}}function wU(t,e){var r=e-t;return r?bU(t,r>180||r<-180?r-360*Math.round(r/360):r):S0(isNaN(t)?e:t)}function TU(t){return(t=+t)==1?du:function(e,r){return r-e?cwe(e,r,t):S0(isNaN(e)?r:e)}}function du(t,e){var r=e-t;return r?bU(t,r):S0(isNaN(t)?e:t)}var D8=N(()=>{"use strict";_8();o(bU,"linear");o(cwe,"exponential");o(wU,"hue");o(TU,"gamma");o(du,"nogamma")});function kU(t){return function(e){var r=e.length,n=new Array(r),i=new Array(r),a=new Array(r),s,l;for(s=0;s{"use strict";E0();C8();xU();D8();ud=o(function t(e){var r=TU(e);function n(i,a){var s=r((i=T0(i)).r,(a=T0(a)).r),l=r(i.g,a.g),u=r(i.b,a.b),h=du(i.opacity,a.opacity);return function(f){return i.r=s(f),i.g=l(f),i.b=u(f),i.opacity=h(f),i+""}}return o(n,"rgb"),n.gamma=t,n},"rgbGamma")(1);o(kU,"rgbSpline");uwe=kU(S8),hwe=kU(A8)});function R8(t,e){e||(e=[]);var r=t?Math.min(e.length,t.length):0,n=e.slice(),i;return function(a){for(i=0;i{"use strict";o(R8,"default");o(EU,"isNumberArray")});function CU(t,e){var r=e?e.length:0,n=t?Math.min(r,t.length):0,i=new Array(n),a=new Array(r),s;for(s=0;s{"use strict";Y3();o(CU,"genericArray")});function N8(t,e){var r=new Date;return t=+t,e=+e,function(n){return r.setTime(t*(1-n)+e*n),r}}var _U=N(()=>{"use strict";o(N8,"default")});function Ki(t,e){return t=+t,e=+e,function(r){return t*(1-r)+e*r}}var ov=N(()=>{"use strict";o(Ki,"default")});function M8(t,e){var r={},n={},i;(t===null||typeof t!="object")&&(t={}),(e===null||typeof e!="object")&&(e={});for(i in e)i in t?r[i]=kh(t[i],e[i]):n[i]=e[i];return function(a){for(i in r)n[i]=r[i](a);return n}}var DU=N(()=>{"use strict";Y3();o(M8,"default")});function fwe(t){return function(){return t}}function dwe(t){return function(e){return t(e)+""}}function C0(t,e){var r=O8.lastIndex=I8.lastIndex=0,n,i,a,s=-1,l=[],u=[];for(t=t+"",e=e+"";(n=O8.exec(t))&&(i=I8.exec(e));)(a=i.index)>r&&(a=e.slice(r,a),l[s]?l[s]+=a:l[++s]=a),(n=n[0])===(i=i[0])?l[s]?l[s]+=i:l[++s]=i:(l[++s]=null,u.push({i:s,x:Ki(n,i)})),r=I8.lastIndex;return r{"use strict";ov();O8=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,I8=new RegExp(O8.source,"g");o(fwe,"zero");o(dwe,"one");o(C0,"default")});function kh(t,e){var r=typeof e,n;return e==null||r==="boolean"?S0(e):(r==="number"?Ki:r==="string"?(n=pl(e))?(e=n,ud):C0:e instanceof pl?ud:e instanceof Date?N8:EU(e)?R8:Array.isArray(e)?CU:typeof e.valueOf!="function"&&typeof e.toString!="function"||isNaN(e)?M8:Ki)(t,e)}var Y3=N(()=>{"use strict";E0();L8();AU();_U();ov();DU();P8();_8();SU();o(kh,"default")});function X3(t,e){return t=+t,e=+e,function(r){return Math.round(t*(1-r)+e*r)}}var LU=N(()=>{"use strict";o(X3,"default")});function K3(t,e,r,n,i,a){var s,l,u;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(u=t*r+e*n)&&(r-=t*u,n-=e*u),(l=Math.sqrt(r*r+n*n))&&(r/=l,n/=l,u/=l),t*n{"use strict";RU=180/Math.PI,j3={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};o(K3,"default")});function MU(t){let e=new(typeof DOMMatrix=="function"?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?j3:K3(e.a,e.b,e.c,e.d,e.e,e.f)}function IU(t){return t==null?j3:(Q3||(Q3=document.createElementNS("http://www.w3.org/2000/svg","g")),Q3.setAttribute("transform",t),(t=Q3.transform.baseVal.consolidate())?(t=t.matrix,K3(t.a,t.b,t.c,t.d,t.e,t.f)):j3)}var Q3,OU=N(()=>{"use strict";NU();o(MU,"parseCss");o(IU,"parseSvg")});function PU(t,e,r,n){function i(h){return h.length?h.pop()+" ":""}o(i,"pop");function a(h,f,d,p,m,g){if(h!==d||f!==p){var y=m.push("translate(",null,e,null,r);g.push({i:y-4,x:Ki(h,d)},{i:y-2,x:Ki(f,p)})}else(d||p)&&m.push("translate("+d+e+p+r)}o(a,"translate");function s(h,f,d,p){h!==f?(h-f>180?f+=360:f-h>180&&(h+=360),p.push({i:d.push(i(d)+"rotate(",null,n)-2,x:Ki(h,f)})):f&&d.push(i(d)+"rotate("+f+n)}o(s,"rotate");function l(h,f,d,p){h!==f?p.push({i:d.push(i(d)+"skewX(",null,n)-2,x:Ki(h,f)}):f&&d.push(i(d)+"skewX("+f+n)}o(l,"skewX");function u(h,f,d,p,m,g){if(h!==d||f!==p){var y=m.push(i(m)+"scale(",null,",",null,")");g.push({i:y-4,x:Ki(h,d)},{i:y-2,x:Ki(f,p)})}else(d!==1||p!==1)&&m.push(i(m)+"scale("+d+","+p+")")}return o(u,"scale"),function(h,f){var d=[],p=[];return h=t(h),f=t(f),a(h.translateX,h.translateY,f.translateX,f.translateY,d,p),s(h.rotate,f.rotate,d,p),l(h.skewX,f.skewX,d,p),u(h.scaleX,h.scaleY,f.scaleX,f.scaleY,d,p),h=f=null,function(m){for(var g=-1,y=p.length,v;++g{"use strict";ov();OU();o(PU,"interpolateTransform");B8=PU(MU,"px, ","px)","deg)"),F8=PU(IU,", ",")",")")});function FU(t){return function(e,r){var n=t((e=sv(e)).h,(r=sv(r)).h),i=du(e.c,r.c),a=du(e.l,r.l),s=du(e.opacity,r.opacity);return function(l){return e.h=n(l),e.c=i(l),e.l=a(l),e.opacity=s(l),e+""}}}var $8,pwe,$U=N(()=>{"use strict";E0();D8();o(FU,"hcl");$8=FU(wU),pwe=FU(du)});var A0=N(()=>{"use strict";Y3();ov();LU();P8();BU();L8();$U()});function dv(){return hd||(VU(mwe),hd=hv.now()+e5)}function mwe(){hd=0}function fv(){this._call=this._time=this._next=null}function t5(t,e,r){var n=new fv;return n.restart(t,e,r),n}function UU(){dv(),++_0;for(var t=Z3,e;t;)(e=hd-t._time)>=0&&t._call.call(void 0,e),t=t._next;--_0}function zU(){hd=(J3=hv.now())+e5,_0=cv=0;try{UU()}finally{_0=0,ywe(),hd=0}}function gwe(){var t=hv.now(),e=t-J3;e>GU&&(e5-=e,J3=t)}function ywe(){for(var t,e=Z3,r,n=1/0;e;)e._call?(n>e._time&&(n=e._time),t=e,e=e._next):(r=e._next,e._next=null,e=t?t._next=r:Z3=r);uv=t,z8(n)}function z8(t){if(!_0){cv&&(cv=clearTimeout(cv));var e=t-hd;e>24?(t<1/0&&(cv=setTimeout(zU,t-hv.now()-e5)),lv&&(lv=clearInterval(lv))):(lv||(J3=hv.now(),lv=setInterval(gwe,GU)),_0=1,VU(zU))}}var _0,cv,lv,GU,Z3,uv,J3,hd,e5,hv,VU,G8=N(()=>{"use strict";_0=0,cv=0,lv=0,GU=1e3,J3=0,hd=0,e5=0,hv=typeof performance=="object"&&performance.now?performance:Date,VU=typeof window=="object"&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};o(dv,"now");o(mwe,"clearNow");o(fv,"Timer");fv.prototype=t5.prototype={constructor:fv,restart:o(function(t,e,r){if(typeof t!="function")throw new TypeError("callback is not a function");r=(r==null?dv():+r)+(e==null?0:+e),!this._next&&uv!==this&&(uv?uv._next=this:Z3=this,uv=this),this._call=t,this._time=r,z8()},"restart"),stop:o(function(){this._call&&(this._call=null,this._time=1/0,z8())},"stop")};o(t5,"timer");o(UU,"timerFlush");o(zU,"wake");o(gwe,"poke");o(ywe,"nap");o(z8,"sleep")});function pv(t,e,r){var n=new fv;return e=e==null?0:+e,n.restart(i=>{n.stop(),t(i+e)},e,r),n}var HU=N(()=>{"use strict";G8();o(pv,"default")});var r5=N(()=>{"use strict";G8();HU()});function pu(t,e,r,n,i,a){var s=t.__transition;if(!s)t.__transition={};else if(r in s)return;bwe(t,r,{name:e,index:n,group:i,on:vwe,tween:xwe,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:YU})}function gv(t,e){var r=Bi(t,e);if(r.state>YU)throw new Error("too late; already scheduled");return r}function ha(t,e){var r=Bi(t,e);if(r.state>n5)throw new Error("too late; already running");return r}function Bi(t,e){var r=t.__transition;if(!r||!(r=r[e]))throw new Error("transition not found");return r}function bwe(t,e,r){var n=t.__transition,i;n[e]=r,r.timer=t5(a,0,r.time);function a(h){r.state=WU,r.timer.restart(s,r.delay,r.time),r.delay<=h&&s(h-r.delay)}o(a,"schedule");function s(h){var f,d,p,m;if(r.state!==WU)return u();for(f in n)if(m=n[f],m.name===r.name){if(m.state===n5)return pv(s);m.state===qU?(m.state=mv,m.timer.stop(),m.on.call("interrupt",t,t.__data__,m.index,m.group),delete n[f]):+f{"use strict";TA();r5();vwe=wA("start","end","cancel","interrupt"),xwe=[],YU=0,WU=1,i5=2,n5=3,qU=4,a5=5,mv=6;o(pu,"default");o(gv,"init");o(ha,"set");o(Bi,"get");o(bwe,"create")});function yv(t,e){var r=t.__transition,n,i,a=!0,s;if(r){e=e==null?null:e+"";for(s in r){if((n=r[s]).name!==e){a=!1;continue}i=n.state>i5&&n.state{"use strict";Es();o(yv,"default")});function V8(t){return this.each(function(){yv(this,t)})}var jU=N(()=>{"use strict";XU();o(V8,"default")});function wwe(t,e){var r,n;return function(){var i=ha(this,t),a=i.tween;if(a!==r){n=r=a;for(var s=0,l=n.length;s{"use strict";Es();o(wwe,"tweenRemove");o(Twe,"tweenFunction");o(U8,"default");o(D0,"tweenValue")});function xv(t,e){var r;return(typeof e=="number"?Ki:e instanceof pl?ud:(r=pl(e))?(e=r,ud):C0)(t,e)}var H8=N(()=>{"use strict";E0();A0();o(xv,"default")});function kwe(t){return function(){this.removeAttribute(t)}}function Ewe(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Swe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttribute(t);return s===i?null:s===n?a:a=e(n=s,r)}}function Cwe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttributeNS(t.space,t.local);return s===i?null:s===n?a:a=e(n=s,r)}}function Awe(t,e,r){var n,i,a;return function(){var s,l=r(this),u;return l==null?void this.removeAttribute(t):(s=this.getAttribute(t),u=l+"",s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l)))}}function _we(t,e,r){var n,i,a;return function(){var s,l=r(this),u;return l==null?void this.removeAttributeNS(t.space,t.local):(s=this.getAttributeNS(t.space,t.local),u=l+"",s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l)))}}function W8(t,e){var r=rc(t),n=r==="transform"?F8:xv;return this.attrTween(t,typeof e=="function"?(r.local?_we:Awe)(r,n,D0(this,"attr."+t,e)):e==null?(r.local?Ewe:kwe)(r):(r.local?Cwe:Swe)(r,n,e))}var KU=N(()=>{"use strict";A0();fl();vv();H8();o(kwe,"attrRemove");o(Ewe,"attrRemoveNS");o(Swe,"attrConstant");o(Cwe,"attrConstantNS");o(Awe,"attrFunction");o(_we,"attrFunctionNS");o(W8,"default")});function Dwe(t,e){return function(r){this.setAttribute(t,e.call(this,r))}}function Lwe(t,e){return function(r){this.setAttributeNS(t.space,t.local,e.call(this,r))}}function Rwe(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&Lwe(t,a)),r}return o(i,"tween"),i._value=e,i}function Nwe(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&Dwe(t,a)),r}return o(i,"tween"),i._value=e,i}function q8(t,e){var r="attr."+t;if(arguments.length<2)return(r=this.tween(r))&&r._value;if(e==null)return this.tween(r,null);if(typeof e!="function")throw new Error;var n=rc(t);return this.tween(r,(n.local?Rwe:Nwe)(n,e))}var QU=N(()=>{"use strict";fl();o(Dwe,"attrInterpolate");o(Lwe,"attrInterpolateNS");o(Rwe,"attrTweenNS");o(Nwe,"attrTween");o(q8,"default")});function Mwe(t,e){return function(){gv(this,t).delay=+e.apply(this,arguments)}}function Iwe(t,e){return e=+e,function(){gv(this,t).delay=e}}function Y8(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?Mwe:Iwe)(e,t)):Bi(this.node(),e).delay}var ZU=N(()=>{"use strict";Es();o(Mwe,"delayFunction");o(Iwe,"delayConstant");o(Y8,"default")});function Owe(t,e){return function(){ha(this,t).duration=+e.apply(this,arguments)}}function Pwe(t,e){return e=+e,function(){ha(this,t).duration=e}}function X8(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?Owe:Pwe)(e,t)):Bi(this.node(),e).duration}var JU=N(()=>{"use strict";Es();o(Owe,"durationFunction");o(Pwe,"durationConstant");o(X8,"default")});function Bwe(t,e){if(typeof e!="function")throw new Error;return function(){ha(this,t).ease=e}}function j8(t){var e=this._id;return arguments.length?this.each(Bwe(e,t)):Bi(this.node(),e).ease}var eH=N(()=>{"use strict";Es();o(Bwe,"easeConstant");o(j8,"default")});function Fwe(t,e){return function(){var r=e.apply(this,arguments);if(typeof r!="function")throw new Error;ha(this,t).ease=r}}function K8(t){if(typeof t!="function")throw new Error;return this.each(Fwe(this._id,t))}var tH=N(()=>{"use strict";Es();o(Fwe,"easeVarying");o(K8,"default")});function Q8(t){typeof t!="function"&&(t=x0(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";fl();fd();o(Q8,"default")});function Z8(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,r=t._groups,n=e.length,i=r.length,a=Math.min(n,i),s=new Array(n),l=0;l{"use strict";fd();o(Z8,"default")});function $we(t){return(t+"").trim().split(/^|\s+/).every(function(e){var r=e.indexOf(".");return r>=0&&(e=e.slice(0,r)),!e||e==="start"})}function zwe(t,e,r){var n,i,a=$we(e)?gv:ha;return function(){var s=a(this,t),l=s.on;l!==n&&(i=(n=l).copy()).on(e,r),s.on=i}}function J8(t,e){var r=this._id;return arguments.length<2?Bi(this.node(),r).on.on(t):this.each(zwe(r,t,e))}var iH=N(()=>{"use strict";Es();o($we,"start");o(zwe,"onFunction");o(J8,"default")});function Gwe(t){return function(){var e=this.parentNode;for(var r in this.__transition)if(+r!==t)return;e&&e.removeChild(this)}}function e_(){return this.on("end.remove",Gwe(this._id))}var aH=N(()=>{"use strict";o(Gwe,"removeFunction");o(e_,"default")});function t_(t){var e=this._name,r=this._id;typeof t!="function"&&(t=xh(t));for(var n=this._groups,i=n.length,a=new Array(i),s=0;s{"use strict";fl();fd();Es();o(t_,"default")});function r_(t){var e=this._name,r=this._id;typeof t!="function"&&(t=v0(t));for(var n=this._groups,i=n.length,a=[],s=[],l=0;l{"use strict";fl();fd();Es();o(r_,"default")});function n_(){return new Vwe(this._groups,this._parents)}var Vwe,lH=N(()=>{"use strict";fl();Vwe=hu.prototype.constructor;o(n_,"default")});function Uwe(t,e){var r,n,i;return function(){var a=bh(this,t),s=(this.style.removeProperty(t),bh(this,t));return a===s?null:a===r&&s===n?i:i=e(r=a,n=s)}}function cH(t){return function(){this.style.removeProperty(t)}}function Hwe(t,e,r){var n,i=r+"",a;return function(){var s=bh(this,t);return s===i?null:s===n?a:a=e(n=s,r)}}function Wwe(t,e,r){var n,i,a;return function(){var s=bh(this,t),l=r(this),u=l+"";return l==null&&(u=l=(this.style.removeProperty(t),bh(this,t))),s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l))}}function qwe(t,e){var r,n,i,a="style."+e,s="end."+a,l;return function(){var u=ha(this,t),h=u.on,f=u.value[a]==null?l||(l=cH(e)):void 0;(h!==r||i!==f)&&(n=(r=h).copy()).on(s,i=f),u.on=n}}function i_(t,e,r){var n=(t+="")=="transform"?B8:xv;return e==null?this.styleTween(t,Uwe(t,n)).on("end.style."+t,cH(t)):typeof e=="function"?this.styleTween(t,Wwe(t,n,D0(this,"style."+t,e))).each(qwe(this._id,t)):this.styleTween(t,Hwe(t,n,e),r).on("end.style."+t,null)}var uH=N(()=>{"use strict";A0();fl();Es();vv();H8();o(Uwe,"styleNull");o(cH,"styleRemove");o(Hwe,"styleConstant");o(Wwe,"styleFunction");o(qwe,"styleMaybeRemove");o(i_,"default")});function Ywe(t,e,r){return function(n){this.style.setProperty(t,e.call(this,n),r)}}function Xwe(t,e,r){var n,i;function a(){var s=e.apply(this,arguments);return s!==i&&(n=(i=s)&&Ywe(t,s,r)),n}return o(a,"tween"),a._value=e,a}function a_(t,e,r){var n="style."+(t+="");if(arguments.length<2)return(n=this.tween(n))&&n._value;if(e==null)return this.tween(n,null);if(typeof e!="function")throw new Error;return this.tween(n,Xwe(t,e,r??""))}var hH=N(()=>{"use strict";o(Ywe,"styleInterpolate");o(Xwe,"styleTween");o(a_,"default")});function jwe(t){return function(){this.textContent=t}}function Kwe(t){return function(){var e=t(this);this.textContent=e??""}}function s_(t){return this.tween("text",typeof t=="function"?Kwe(D0(this,"text",t)):jwe(t==null?"":t+""))}var fH=N(()=>{"use strict";vv();o(jwe,"textConstant");o(Kwe,"textFunction");o(s_,"default")});function Qwe(t){return function(e){this.textContent=t.call(this,e)}}function Zwe(t){var e,r;function n(){var i=t.apply(this,arguments);return i!==r&&(e=(r=i)&&Qwe(i)),e}return o(n,"tween"),n._value=t,n}function o_(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(t==null)return this.tween(e,null);if(typeof t!="function")throw new Error;return this.tween(e,Zwe(t))}var dH=N(()=>{"use strict";o(Qwe,"textInterpolate");o(Zwe,"textTween");o(o_,"default")});function l_(){for(var t=this._name,e=this._id,r=s5(),n=this._groups,i=n.length,a=0;a{"use strict";fd();Es();o(l_,"default")});function c_(){var t,e,r=this,n=r._id,i=r.size();return new Promise(function(a,s){var l={value:s},u={value:o(function(){--i===0&&a()},"value")};r.each(function(){var h=ha(this,n),f=h.on;f!==t&&(e=(t=f).copy(),e._.cancel.push(l),e._.interrupt.push(l),e._.end.push(u)),h.on=e}),i===0&&a()})}var mH=N(()=>{"use strict";Es();o(c_,"default")});function es(t,e,r,n){this._groups=t,this._parents=e,this._name=r,this._id=n}function gH(t){return hu().transition(t)}function s5(){return++Jwe}var Jwe,mu,fd=N(()=>{"use strict";fl();KU();QU();ZU();JU();eH();tH();rH();nH();iH();aH();sH();oH();lH();uH();hH();fH();dH();pH();vv();mH();Jwe=0;o(es,"Transition");o(gH,"transition");o(s5,"newId");mu=hu.prototype;es.prototype=gH.prototype={constructor:es,select:t_,selectAll:r_,selectChild:mu.selectChild,selectChildren:mu.selectChildren,filter:Q8,merge:Z8,selection:n_,transition:l_,call:mu.call,nodes:mu.nodes,node:mu.node,size:mu.size,empty:mu.empty,each:mu.each,on:J8,attr:W8,attrTween:q8,style:i_,styleTween:a_,text:s_,textTween:o_,remove:e_,tween:U8,delay:Y8,duration:X8,ease:j8,easeVarying:K8,end:c_,[Symbol.iterator]:mu[Symbol.iterator]}});function o5(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}var yH=N(()=>{"use strict";o(o5,"cubicInOut")});var u_=N(()=>{"use strict";yH()});function tTe(t,e){for(var r;!(r=t.__transition)||!(r=r[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return r}function h_(t){var e,r;t instanceof es?(e=t._id,t=t._name):(e=s5(),(r=eTe).time=dv(),t=t==null?null:t+"");for(var n=this._groups,i=n.length,a=0;a{"use strict";fd();Es();u_();r5();eTe={time:null,delay:0,duration:250,ease:o5};o(tTe,"inherit");o(h_,"default")});var xH=N(()=>{"use strict";fl();jU();vH();hu.prototype.interrupt=V8;hu.prototype.transition=h_});var l5=N(()=>{"use strict";xH()});var bH=N(()=>{"use strict"});var wH=N(()=>{"use strict"});var TH=N(()=>{"use strict"});function kH(t){return[+t[0],+t[1]]}function rTe(t){return[kH(t[0]),kH(t[1])]}function f_(t){return{type:t}}var Z0t,J0t,emt,tmt,rmt,nmt,EH=N(()=>{"use strict";l5();bH();wH();TH();({abs:Z0t,max:J0t,min:emt}=Math);o(kH,"number1");o(rTe,"number2");tmt={name:"x",handles:["w","e"].map(f_),input:o(function(t,e){return t==null?null:[[+t[0],e[0][1]],[+t[1],e[1][1]]]},"input"),output:o(function(t){return t&&[t[0][0],t[1][0]]},"output")},rmt={name:"y",handles:["n","s"].map(f_),input:o(function(t,e){return t==null?null:[[e[0][0],+t[0]],[e[1][0],+t[1]]]},"input"),output:o(function(t){return t&&[t[0][1],t[1][1]]},"output")},nmt={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(f_),input:o(function(t){return t==null?null:rTe(t)},"input"),output:o(function(t){return t},"output")};o(f_,"type")});var SH=N(()=>{"use strict";EH()});function CH(t){this._+=t[0];for(let e=1,r=t.length;e=0))throw new Error(`invalid digits: ${t}`);if(e>15)return CH;let r=10**e;return function(n){this._+=n[0];for(let i=1,a=n.length;i{"use strict";d_=Math.PI,p_=2*d_,dd=1e-6,nTe=p_-dd;o(CH,"append");o(iTe,"appendRound");pd=class{static{o(this,"Path")}constructor(e){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=e==null?CH:iTe(e)}moveTo(e,r){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(e,r){this._append`L${this._x1=+e},${this._y1=+r}`}quadraticCurveTo(e,r,n,i){this._append`Q${+e},${+r},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(e,r,n,i,a,s){this._append`C${+e},${+r},${+n},${+i},${this._x1=+a},${this._y1=+s}`}arcTo(e,r,n,i,a){if(e=+e,r=+r,n=+n,i=+i,a=+a,a<0)throw new Error(`negative radius: ${a}`);let s=this._x1,l=this._y1,u=n-e,h=i-r,f=s-e,d=l-r,p=f*f+d*d;if(this._x1===null)this._append`M${this._x1=e},${this._y1=r}`;else if(p>dd)if(!(Math.abs(d*u-h*f)>dd)||!a)this._append`L${this._x1=e},${this._y1=r}`;else{let m=n-s,g=i-l,y=u*u+h*h,v=m*m+g*g,x=Math.sqrt(y),b=Math.sqrt(p),w=a*Math.tan((d_-Math.acos((y+p-v)/(2*x*b)))/2),C=w/b,T=w/x;Math.abs(C-1)>dd&&this._append`L${e+C*f},${r+C*d}`,this._append`A${a},${a},0,0,${+(d*m>f*g)},${this._x1=e+T*u},${this._y1=r+T*h}`}}arc(e,r,n,i,a,s){if(e=+e,r=+r,n=+n,s=!!s,n<0)throw new Error(`negative radius: ${n}`);let l=n*Math.cos(i),u=n*Math.sin(i),h=e+l,f=r+u,d=1^s,p=s?i-a:a-i;this._x1===null?this._append`M${h},${f}`:(Math.abs(this._x1-h)>dd||Math.abs(this._y1-f)>dd)&&this._append`L${h},${f}`,n&&(p<0&&(p=p%p_+p_),p>nTe?this._append`A${n},${n},0,1,${d},${e-l},${r-u}A${n},${n},0,1,${d},${this._x1=h},${this._y1=f}`:p>dd&&this._append`A${n},${n},0,${+(p>=d_)},${d},${this._x1=e+n*Math.cos(a)},${this._y1=r+n*Math.sin(a)}`)}rect(e,r,n,i){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}};o(AH,"path");AH.prototype=pd.prototype});var m_=N(()=>{"use strict";_H()});var DH=N(()=>{"use strict"});var LH=N(()=>{"use strict"});var RH=N(()=>{"use strict"});var NH=N(()=>{"use strict"});var MH=N(()=>{"use strict"});var IH=N(()=>{"use strict"});var OH=N(()=>{"use strict"});function g_(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)}function md(t,e){if((r=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var r,n=t.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+t.slice(r+1)]}var bv=N(()=>{"use strict";o(g_,"default");o(md,"formatDecimalParts")});function ml(t){return t=md(Math.abs(t)),t?t[1]:NaN}var wv=N(()=>{"use strict";bv();o(ml,"default")});function y_(t,e){return function(r,n){for(var i=r.length,a=[],s=0,l=t[0],u=0;i>0&&l>0&&(u+l+1>n&&(l=Math.max(1,n-u)),a.push(r.substring(i-=l,i+l)),!((u+=l+1)>n));)l=t[s=(s+1)%t.length];return a.reverse().join(e)}}var PH=N(()=>{"use strict";o(y_,"default")});function v_(t){return function(e){return e.replace(/[0-9]/g,function(r){return t[+r]})}}var BH=N(()=>{"use strict";o(v_,"default")});function Eh(t){if(!(e=aTe.exec(t)))throw new Error("invalid format: "+t);var e;return new c5({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function c5(t){this.fill=t.fill===void 0?" ":t.fill+"",this.align=t.align===void 0?">":t.align+"",this.sign=t.sign===void 0?"-":t.sign+"",this.symbol=t.symbol===void 0?"":t.symbol+"",this.zero=!!t.zero,this.width=t.width===void 0?void 0:+t.width,this.comma=!!t.comma,this.precision=t.precision===void 0?void 0:+t.precision,this.trim=!!t.trim,this.type=t.type===void 0?"":t.type+""}var aTe,x_=N(()=>{"use strict";aTe=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;o(Eh,"formatSpecifier");Eh.prototype=c5.prototype;o(c5,"FormatSpecifier");c5.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type}});function b_(t){e:for(var e=t.length,r=1,n=-1,i;r0&&(n=0);break}return n>0?t.slice(0,n)+t.slice(i+1):t}var FH=N(()=>{"use strict";o(b_,"default")});function T_(t,e){var r=md(t,e);if(!r)return t+"";var n=r[0],i=r[1],a=i-(w_=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,s=n.length;return a===s?n:a>s?n+new Array(a-s+1).join("0"):a>0?n.slice(0,a)+"."+n.slice(a):"0."+new Array(1-a).join("0")+md(t,Math.max(0,e+a-1))[0]}var w_,k_=N(()=>{"use strict";bv();o(T_,"default")});function u5(t,e){var r=md(t,e);if(!r)return t+"";var n=r[0],i=r[1];return i<0?"0."+new Array(-i).join("0")+n:n.length>i+1?n.slice(0,i+1)+"."+n.slice(i+1):n+new Array(i-n.length+2).join("0")}var $H=N(()=>{"use strict";bv();o(u5,"default")});var E_,zH=N(()=>{"use strict";bv();k_();$H();E_={"%":o((t,e)=>(t*100).toFixed(e),"%"),b:o(t=>Math.round(t).toString(2),"b"),c:o(t=>t+"","c"),d:g_,e:o((t,e)=>t.toExponential(e),"e"),f:o((t,e)=>t.toFixed(e),"f"),g:o((t,e)=>t.toPrecision(e),"g"),o:o(t=>Math.round(t).toString(8),"o"),p:o((t,e)=>u5(t*100,e),"p"),r:u5,s:T_,X:o(t=>Math.round(t).toString(16).toUpperCase(),"X"),x:o(t=>Math.round(t).toString(16),"x")}});function h5(t){return t}var GH=N(()=>{"use strict";o(h5,"default")});function S_(t){var e=t.grouping===void 0||t.thousands===void 0?h5:y_(VH.call(t.grouping,Number),t.thousands+""),r=t.currency===void 0?"":t.currency[0]+"",n=t.currency===void 0?"":t.currency[1]+"",i=t.decimal===void 0?".":t.decimal+"",a=t.numerals===void 0?h5:v_(VH.call(t.numerals,String)),s=t.percent===void 0?"%":t.percent+"",l=t.minus===void 0?"\u2212":t.minus+"",u=t.nan===void 0?"NaN":t.nan+"";function h(d){d=Eh(d);var p=d.fill,m=d.align,g=d.sign,y=d.symbol,v=d.zero,x=d.width,b=d.comma,w=d.precision,C=d.trim,T=d.type;T==="n"?(b=!0,T="g"):E_[T]||(w===void 0&&(w=12),C=!0,T="g"),(v||p==="0"&&m==="=")&&(v=!0,p="0",m="=");var E=y==="$"?r:y==="#"&&/[boxX]/.test(T)?"0"+T.toLowerCase():"",A=y==="$"?n:/[%p]/.test(T)?s:"",S=E_[T],_=/[defgprs%]/.test(T);w=w===void 0?6:/[gprs]/.test(T)?Math.max(1,Math.min(21,w)):Math.max(0,Math.min(20,w));function I(D){var k=E,L=A,R,O,M;if(T==="c")L=S(D)+L,D="";else{D=+D;var B=D<0||1/D<0;if(D=isNaN(D)?u:S(Math.abs(D),w),C&&(D=b_(D)),B&&+D==0&&g!=="+"&&(B=!1),k=(B?g==="("?g:l:g==="-"||g==="("?"":g)+k,L=(T==="s"?UH[8+w_/3]:"")+L+(B&&g==="("?")":""),_){for(R=-1,O=D.length;++RM||M>57){L=(M===46?i+D.slice(R+1):D.slice(R))+L,D=D.slice(0,R);break}}}b&&!v&&(D=e(D,1/0));var F=k.length+D.length+L.length,P=F>1)+k+D+L+P.slice(F);break;default:D=P+k+D+L;break}return a(D)}return o(I,"format"),I.toString=function(){return d+""},I}o(h,"newFormat");function f(d,p){var m=h((d=Eh(d),d.type="f",d)),g=Math.max(-8,Math.min(8,Math.floor(ml(p)/3)))*3,y=Math.pow(10,-g),v=UH[8+g/3];return function(x){return m(y*x)+v}}return o(f,"formatPrefix"),{format:h,formatPrefix:f}}var VH,UH,HH=N(()=>{"use strict";wv();PH();BH();x_();FH();zH();k_();GH();VH=Array.prototype.map,UH=["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];o(S_,"default")});function C_(t){return f5=S_(t),d5=f5.format,p5=f5.formatPrefix,f5}var f5,d5,p5,WH=N(()=>{"use strict";HH();C_({thousands:",",grouping:[3],currency:["$",""]});o(C_,"defaultLocale")});function m5(t){return Math.max(0,-ml(Math.abs(t)))}var qH=N(()=>{"use strict";wv();o(m5,"default")});function g5(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(ml(e)/3)))*3-ml(Math.abs(t)))}var YH=N(()=>{"use strict";wv();o(g5,"default")});function y5(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,ml(e)-ml(t))+1}var XH=N(()=>{"use strict";wv();o(y5,"default")});var A_=N(()=>{"use strict";WH();x_();qH();YH();XH()});var jH=N(()=>{"use strict"});var KH=N(()=>{"use strict"});var QH=N(()=>{"use strict"});var ZH=N(()=>{"use strict"});function Sh(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t);break}return this}var Tv=N(()=>{"use strict";o(Sh,"initRange")});function gu(){var t=new g0,e=[],r=[],n=__;function i(a){let s=t.get(a);if(s===void 0){if(n!==__)return n;t.set(a,s=e.push(a)-1)}return r[s%r.length]}return o(i,"scale"),i.domain=function(a){if(!arguments.length)return e.slice();e=[],t=new g0;for(let s of a)t.has(s)||t.set(s,e.push(s)-1);return i},i.range=function(a){return arguments.length?(r=Array.from(a),i):r.slice()},i.unknown=function(a){return arguments.length?(n=a,i):n},i.copy=function(){return gu(e,r).unknown(n)},Sh.apply(i,arguments),i}var __,D_=N(()=>{"use strict";vh();Tv();__=Symbol("implicit");o(gu,"ordinal")});function L0(){var t=gu().unknown(void 0),e=t.domain,r=t.range,n=0,i=1,a,s,l=!1,u=0,h=0,f=.5;delete t.unknown;function d(){var p=e().length,m=i{"use strict";vh();Tv();D_();o(L0,"band")});function L_(t){return function(){return t}}var eW=N(()=>{"use strict";o(L_,"constants")});function R_(t){return+t}var tW=N(()=>{"use strict";o(R_,"number")});function R0(t){return t}function N_(t,e){return(e-=t=+t)?function(r){return(r-t)/e}:L_(isNaN(e)?NaN:.5)}function sTe(t,e){var r;return t>e&&(r=t,t=e,e=r),function(n){return Math.max(t,Math.min(e,n))}}function oTe(t,e,r){var n=t[0],i=t[1],a=e[0],s=e[1];return i2?lTe:oTe,u=h=null,d}o(f,"rescale");function d(p){return p==null||isNaN(p=+p)?a:(u||(u=l(t.map(n),e,r)))(n(s(p)))}return o(d,"scale"),d.invert=function(p){return s(i((h||(h=l(e,t.map(n),Ki)))(p)))},d.domain=function(p){return arguments.length?(t=Array.from(p,R_),f()):t.slice()},d.range=function(p){return arguments.length?(e=Array.from(p),f()):e.slice()},d.rangeRound=function(p){return e=Array.from(p),r=X3,f()},d.clamp=function(p){return arguments.length?(s=p?!0:R0,f()):s!==R0},d.interpolate=function(p){return arguments.length?(r=p,f()):r},d.unknown=function(p){return arguments.length?(a=p,d):a},function(p,m){return n=p,i=m,f()}}function kv(){return cTe()(R0,R0)}var rW,M_=N(()=>{"use strict";vh();A0();eW();tW();rW=[0,1];o(R0,"identity");o(N_,"normalize");o(sTe,"clamper");o(oTe,"bimap");o(lTe,"polymap");o(v5,"copy");o(cTe,"transformer");o(kv,"continuous")});function I_(t,e,r,n){var i=y0(t,e,r),a;switch(n=Eh(n??",f"),n.type){case"s":{var s=Math.max(Math.abs(t),Math.abs(e));return n.precision==null&&!isNaN(a=g5(i,s))&&(n.precision=a),p5(n,s)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(a=y5(i,Math.max(Math.abs(t),Math.abs(e))))&&(n.precision=a-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(a=m5(i))&&(n.precision=a-(n.type==="%")*2);break}}return d5(n)}var nW=N(()=>{"use strict";vh();A_();o(I_,"tickFormat")});function uTe(t){var e=t.domain;return t.ticks=function(r){var n=e();return R3(n[0],n[n.length-1],r??10)},t.tickFormat=function(r,n){var i=e();return I_(i[0],i[i.length-1],r??10,n)},t.nice=function(r){r==null&&(r=10);var n=e(),i=0,a=n.length-1,s=n[i],l=n[a],u,h,f=10;for(l0;){if(h=Zy(s,l,r),h===u)return n[i]=s,n[a]=l,e(n);if(h>0)s=Math.floor(s/h)*h,l=Math.ceil(l/h)*h;else if(h<0)s=Math.ceil(s*h)/h,l=Math.floor(l*h)/h;else break;u=h}return t},t}function gl(){var t=kv();return t.copy=function(){return v5(t,gl())},Sh.apply(t,arguments),uTe(t)}var iW=N(()=>{"use strict";vh();M_();Tv();nW();o(uTe,"linearish");o(gl,"linear")});function O_(t,e){t=t.slice();var r=0,n=t.length-1,i=t[r],a=t[n],s;return a{"use strict";o(O_,"nice")});function xn(t,e,r,n){function i(a){return t(a=arguments.length===0?new Date:new Date(+a)),a}return o(i,"interval"),i.floor=a=>(t(a=new Date(+a)),a),i.ceil=a=>(t(a=new Date(a-1)),e(a,1),t(a),a),i.round=a=>{let s=i(a),l=i.ceil(a);return a-s(e(a=new Date(+a),s==null?1:Math.floor(s)),a),i.range=(a,s,l)=>{let u=[];if(a=i.ceil(a),l=l==null?1:Math.floor(l),!(a0))return u;let h;do u.push(h=new Date(+a)),e(a,l),t(a);while(hxn(s=>{if(s>=s)for(;t(s),!a(s);)s.setTime(s-1)},(s,l)=>{if(s>=s)if(l<0)for(;++l<=0;)for(;e(s,-1),!a(s););else for(;--l>=0;)for(;e(s,1),!a(s););}),r&&(i.count=(a,s)=>(P_.setTime(+a),B_.setTime(+s),t(P_),t(B_),Math.floor(r(P_,B_))),i.every=a=>(a=Math.floor(a),!isFinite(a)||!(a>0)?null:a>1?i.filter(n?s=>n(s)%a===0:s=>i.count(0,s)%a===0):i)),i}var P_,B_,yu=N(()=>{"use strict";P_=new Date,B_=new Date;o(xn,"timeInterval")});var ac,sW,F_=N(()=>{"use strict";yu();ac=xn(()=>{},(t,e)=>{t.setTime(+t+e)},(t,e)=>e-t);ac.every=t=>(t=Math.floor(t),!isFinite(t)||!(t>0)?null:t>1?xn(e=>{e.setTime(Math.floor(e/t)*t)},(e,r)=>{e.setTime(+e+r*t)},(e,r)=>(r-e)/t):ac);sW=ac.range});var Ks,oW,$_=N(()=>{"use strict";yu();Ks=xn(t=>{t.setTime(t-t.getMilliseconds())},(t,e)=>{t.setTime(+t+e*1e3)},(t,e)=>(e-t)/1e3,t=>t.getUTCSeconds()),oW=Ks.range});var vu,hTe,x5,fTe,z_=N(()=>{"use strict";yu();vu=xn(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getMinutes()),hTe=vu.range,x5=xn(t=>{t.setUTCSeconds(0,0)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getUTCMinutes()),fTe=x5.range});var xu,dTe,b5,pTe,G_=N(()=>{"use strict";yu();xu=xn(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3-t.getMinutes()*6e4)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getHours()),dTe=xu.range,b5=xn(t=>{t.setUTCMinutes(0,0,0)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getUTCHours()),pTe=b5.range});var _o,mTe,Sv,gTe,w5,yTe,V_=N(()=>{"use strict";yu();_o=xn(t=>t.setHours(0,0,0,0),(t,e)=>t.setDate(t.getDate()+e),(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5,t=>t.getDate()-1),mTe=_o.range,Sv=xn(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>t.getUTCDate()-1),gTe=Sv.range,w5=xn(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>Math.floor(t/864e5)),yTe=w5.range});function vd(t){return xn(e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},(e,r)=>{e.setDate(e.getDate()+r*7)},(e,r)=>(r-e-(r.getTimezoneOffset()-e.getTimezoneOffset())*6e4)/6048e5)}function xd(t){return xn(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCDate(e.getUTCDate()+r*7)},(e,r)=>(r-e)/6048e5)}var yl,Ch,T5,k5,oc,E5,S5,cW,vTe,xTe,bTe,wTe,TTe,kTe,bd,N0,uW,hW,Ah,fW,dW,pW,ETe,STe,CTe,ATe,_Te,DTe,U_=N(()=>{"use strict";yu();o(vd,"timeWeekday");yl=vd(0),Ch=vd(1),T5=vd(2),k5=vd(3),oc=vd(4),E5=vd(5),S5=vd(6),cW=yl.range,vTe=Ch.range,xTe=T5.range,bTe=k5.range,wTe=oc.range,TTe=E5.range,kTe=S5.range;o(xd,"utcWeekday");bd=xd(0),N0=xd(1),uW=xd(2),hW=xd(3),Ah=xd(4),fW=xd(5),dW=xd(6),pW=bd.range,ETe=N0.range,STe=uW.range,CTe=hW.range,ATe=Ah.range,_Te=fW.range,DTe=dW.range});var bu,LTe,C5,RTe,H_=N(()=>{"use strict";yu();bu=xn(t=>{t.setDate(1),t.setHours(0,0,0,0)},(t,e)=>{t.setMonth(t.getMonth()+e)},(t,e)=>e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12,t=>t.getMonth()),LTe=bu.range,C5=xn(t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)},(t,e)=>e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12,t=>t.getUTCMonth()),RTe=C5.range});var Qs,NTe,vl,MTe,W_=N(()=>{"use strict";yu();Qs=xn(t=>{t.setMonth(0,1),t.setHours(0,0,0,0)},(t,e)=>{t.setFullYear(t.getFullYear()+e)},(t,e)=>e.getFullYear()-t.getFullYear(),t=>t.getFullYear());Qs.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:xn(e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,r)=>{e.setFullYear(e.getFullYear()+r*t)});NTe=Qs.range,vl=xn(t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)},(t,e)=>e.getUTCFullYear()-t.getUTCFullYear(),t=>t.getUTCFullYear());vl.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:xn(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCFullYear(e.getUTCFullYear()+r*t)});MTe=vl.range});function gW(t,e,r,n,i,a){let s=[[Ks,1,1e3],[Ks,5,5*1e3],[Ks,15,15*1e3],[Ks,30,30*1e3],[a,1,6e4],[a,5,5*6e4],[a,15,15*6e4],[a,30,30*6e4],[i,1,36e5],[i,3,3*36e5],[i,6,6*36e5],[i,12,12*36e5],[n,1,864e5],[n,2,2*864e5],[r,1,6048e5],[e,1,2592e6],[e,3,3*2592e6],[t,1,31536e6]];function l(h,f,d){let p=fv).right(s,p);if(m===s.length)return t.every(y0(h/31536e6,f/31536e6,d));if(m===0)return ac.every(Math.max(y0(h,f,d),1));let[g,y]=s[p/s[m-1][2]{"use strict";vh();F_();$_();z_();G_();V_();U_();H_();W_();o(gW,"ticker");[OTe,PTe]=gW(vl,C5,bd,w5,b5,x5),[q_,Y_]=gW(Qs,bu,yl,_o,xu,vu)});var A5=N(()=>{"use strict";F_();$_();z_();G_();V_();U_();H_();W_();yW()});function X_(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function j_(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function Cv(t,e,r){return{y:t,m:e,d:r,H:0,M:0,S:0,L:0}}function K_(t){var e=t.dateTime,r=t.date,n=t.time,i=t.periods,a=t.days,s=t.shortDays,l=t.months,u=t.shortMonths,h=Av(i),f=_v(i),d=Av(a),p=_v(a),m=Av(s),g=_v(s),y=Av(l),v=_v(l),x=Av(u),b=_v(u),w={a:B,A:F,b:P,B:z,c:null,d:kW,e:kW,f:ake,g:mke,G:yke,H:rke,I:nke,j:ike,L:_W,m:ske,M:oke,p:$,q:H,Q:CW,s:AW,S:lke,u:cke,U:uke,V:hke,w:fke,W:dke,x:null,X:null,y:pke,Y:gke,Z:vke,"%":SW},C={a:Q,A:j,b:ie,B:ne,c:null,d:EW,e:EW,f:Tke,g:Nke,G:Ike,H:xke,I:bke,j:wke,L:LW,m:kke,M:Eke,p:le,q:he,Q:CW,s:AW,S:Ske,u:Cke,U:Ake,V:_ke,w:Dke,W:Lke,x:null,X:null,y:Rke,Y:Mke,Z:Oke,"%":SW},T={a:I,A:D,b:k,B:L,c:R,d:wW,e:wW,f:ZTe,g:bW,G:xW,H:TW,I:TW,j:XTe,L:QTe,m:YTe,M:jTe,p:_,q:qTe,Q:eke,s:tke,S:KTe,u:GTe,U:VTe,V:UTe,w:zTe,W:HTe,x:O,X:M,y:bW,Y:xW,Z:WTe,"%":JTe};w.x=E(r,w),w.X=E(n,w),w.c=E(e,w),C.x=E(r,C),C.X=E(n,C),C.c=E(e,C);function E(K,X){return function(te){var J=[],se=-1,ue=0,Z=K.length,Se,ce,ae;for(te instanceof Date||(te=new Date(+te));++se53)return null;"w"in J||(J.w=1),"Z"in J?(ue=j_(Cv(J.y,0,1)),Z=ue.getUTCDay(),ue=Z>4||Z===0?N0.ceil(ue):N0(ue),ue=Sv.offset(ue,(J.V-1)*7),J.y=ue.getUTCFullYear(),J.m=ue.getUTCMonth(),J.d=ue.getUTCDate()+(J.w+6)%7):(ue=X_(Cv(J.y,0,1)),Z=ue.getDay(),ue=Z>4||Z===0?Ch.ceil(ue):Ch(ue),ue=_o.offset(ue,(J.V-1)*7),J.y=ue.getFullYear(),J.m=ue.getMonth(),J.d=ue.getDate()+(J.w+6)%7)}else("W"in J||"U"in J)&&("w"in J||(J.w="u"in J?J.u%7:"W"in J?1:0),Z="Z"in J?j_(Cv(J.y,0,1)).getUTCDay():X_(Cv(J.y,0,1)).getDay(),J.m=0,J.d="W"in J?(J.w+6)%7+J.W*7-(Z+5)%7:J.w+J.U*7-(Z+6)%7);return"Z"in J?(J.H+=J.Z/100|0,J.M+=J.Z%100,j_(J)):X_(J)}}o(A,"newParse");function S(K,X,te,J){for(var se=0,ue=X.length,Z=te.length,Se,ce;se=Z)return-1;if(Se=X.charCodeAt(se++),Se===37){if(Se=X.charAt(se++),ce=T[Se in vW?X.charAt(se++):Se],!ce||(J=ce(K,te,J))<0)return-1}else if(Se!=te.charCodeAt(J++))return-1}return J}o(S,"parseSpecifier");function _(K,X,te){var J=h.exec(X.slice(te));return J?(K.p=f.get(J[0].toLowerCase()),te+J[0].length):-1}o(_,"parsePeriod");function I(K,X,te){var J=m.exec(X.slice(te));return J?(K.w=g.get(J[0].toLowerCase()),te+J[0].length):-1}o(I,"parseShortWeekday");function D(K,X,te){var J=d.exec(X.slice(te));return J?(K.w=p.get(J[0].toLowerCase()),te+J[0].length):-1}o(D,"parseWeekday");function k(K,X,te){var J=x.exec(X.slice(te));return J?(K.m=b.get(J[0].toLowerCase()),te+J[0].length):-1}o(k,"parseShortMonth");function L(K,X,te){var J=y.exec(X.slice(te));return J?(K.m=v.get(J[0].toLowerCase()),te+J[0].length):-1}o(L,"parseMonth");function R(K,X,te){return S(K,e,X,te)}o(R,"parseLocaleDateTime");function O(K,X,te){return S(K,r,X,te)}o(O,"parseLocaleDate");function M(K,X,te){return S(K,n,X,te)}o(M,"parseLocaleTime");function B(K){return s[K.getDay()]}o(B,"formatShortWeekday");function F(K){return a[K.getDay()]}o(F,"formatWeekday");function P(K){return u[K.getMonth()]}o(P,"formatShortMonth");function z(K){return l[K.getMonth()]}o(z,"formatMonth");function $(K){return i[+(K.getHours()>=12)]}o($,"formatPeriod");function H(K){return 1+~~(K.getMonth()/3)}o(H,"formatQuarter");function Q(K){return s[K.getUTCDay()]}o(Q,"formatUTCShortWeekday");function j(K){return a[K.getUTCDay()]}o(j,"formatUTCWeekday");function ie(K){return u[K.getUTCMonth()]}o(ie,"formatUTCShortMonth");function ne(K){return l[K.getUTCMonth()]}o(ne,"formatUTCMonth");function le(K){return i[+(K.getUTCHours()>=12)]}o(le,"formatUTCPeriod");function he(K){return 1+~~(K.getUTCMonth()/3)}return o(he,"formatUTCQuarter"),{format:o(function(K){var X=E(K+="",w);return X.toString=function(){return K},X},"format"),parse:o(function(K){var X=A(K+="",!1);return X.toString=function(){return K},X},"parse"),utcFormat:o(function(K){var X=E(K+="",C);return X.toString=function(){return K},X},"utcFormat"),utcParse:o(function(K){var X=A(K+="",!0);return X.toString=function(){return K},X},"utcParse")}}function Wr(t,e,r){var n=t<0?"-":"",i=(n?-t:t)+"",a=i.length;return n+(a[e.toLowerCase(),r]))}function zTe(t,e,r){var n=Qi.exec(e.slice(r,r+1));return n?(t.w=+n[0],r+n[0].length):-1}function GTe(t,e,r){var n=Qi.exec(e.slice(r,r+1));return n?(t.u=+n[0],r+n[0].length):-1}function VTe(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.U=+n[0],r+n[0].length):-1}function UTe(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.V=+n[0],r+n[0].length):-1}function HTe(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.W=+n[0],r+n[0].length):-1}function xW(t,e,r){var n=Qi.exec(e.slice(r,r+4));return n?(t.y=+n[0],r+n[0].length):-1}function bW(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function WTe(t,e,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(r,r+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function qTe(t,e,r){var n=Qi.exec(e.slice(r,r+1));return n?(t.q=n[0]*3-3,r+n[0].length):-1}function YTe(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function wW(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function XTe(t,e,r){var n=Qi.exec(e.slice(r,r+3));return n?(t.m=0,t.d=+n[0],r+n[0].length):-1}function TW(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function jTe(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function KTe(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function QTe(t,e,r){var n=Qi.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function ZTe(t,e,r){var n=Qi.exec(e.slice(r,r+6));return n?(t.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function JTe(t,e,r){var n=BTe.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function eke(t,e,r){var n=Qi.exec(e.slice(r));return n?(t.Q=+n[0],r+n[0].length):-1}function tke(t,e,r){var n=Qi.exec(e.slice(r));return n?(t.s=+n[0],r+n[0].length):-1}function kW(t,e){return Wr(t.getDate(),e,2)}function rke(t,e){return Wr(t.getHours(),e,2)}function nke(t,e){return Wr(t.getHours()%12||12,e,2)}function ike(t,e){return Wr(1+_o.count(Qs(t),t),e,3)}function _W(t,e){return Wr(t.getMilliseconds(),e,3)}function ake(t,e){return _W(t,e)+"000"}function ske(t,e){return Wr(t.getMonth()+1,e,2)}function oke(t,e){return Wr(t.getMinutes(),e,2)}function lke(t,e){return Wr(t.getSeconds(),e,2)}function cke(t){var e=t.getDay();return e===0?7:e}function uke(t,e){return Wr(yl.count(Qs(t)-1,t),e,2)}function DW(t){var e=t.getDay();return e>=4||e===0?oc(t):oc.ceil(t)}function hke(t,e){return t=DW(t),Wr(oc.count(Qs(t),t)+(Qs(t).getDay()===4),e,2)}function fke(t){return t.getDay()}function dke(t,e){return Wr(Ch.count(Qs(t)-1,t),e,2)}function pke(t,e){return Wr(t.getFullYear()%100,e,2)}function mke(t,e){return t=DW(t),Wr(t.getFullYear()%100,e,2)}function gke(t,e){return Wr(t.getFullYear()%1e4,e,4)}function yke(t,e){var r=t.getDay();return t=r>=4||r===0?oc(t):oc.ceil(t),Wr(t.getFullYear()%1e4,e,4)}function vke(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+Wr(e/60|0,"0",2)+Wr(e%60,"0",2)}function EW(t,e){return Wr(t.getUTCDate(),e,2)}function xke(t,e){return Wr(t.getUTCHours(),e,2)}function bke(t,e){return Wr(t.getUTCHours()%12||12,e,2)}function wke(t,e){return Wr(1+Sv.count(vl(t),t),e,3)}function LW(t,e){return Wr(t.getUTCMilliseconds(),e,3)}function Tke(t,e){return LW(t,e)+"000"}function kke(t,e){return Wr(t.getUTCMonth()+1,e,2)}function Eke(t,e){return Wr(t.getUTCMinutes(),e,2)}function Ske(t,e){return Wr(t.getUTCSeconds(),e,2)}function Cke(t){var e=t.getUTCDay();return e===0?7:e}function Ake(t,e){return Wr(bd.count(vl(t)-1,t),e,2)}function RW(t){var e=t.getUTCDay();return e>=4||e===0?Ah(t):Ah.ceil(t)}function _ke(t,e){return t=RW(t),Wr(Ah.count(vl(t),t)+(vl(t).getUTCDay()===4),e,2)}function Dke(t){return t.getUTCDay()}function Lke(t,e){return Wr(N0.count(vl(t)-1,t),e,2)}function Rke(t,e){return Wr(t.getUTCFullYear()%100,e,2)}function Nke(t,e){return t=RW(t),Wr(t.getUTCFullYear()%100,e,2)}function Mke(t,e){return Wr(t.getUTCFullYear()%1e4,e,4)}function Ike(t,e){var r=t.getUTCDay();return t=r>=4||r===0?Ah(t):Ah.ceil(t),Wr(t.getUTCFullYear()%1e4,e,4)}function Oke(){return"+0000"}function SW(){return"%"}function CW(t){return+t}function AW(t){return Math.floor(+t/1e3)}var vW,Qi,BTe,FTe,NW=N(()=>{"use strict";A5();o(X_,"localDate");o(j_,"utcDate");o(Cv,"newDate");o(K_,"formatLocale");vW={"-":"",_:" ",0:"0"},Qi=/^\s*\d+/,BTe=/^%/,FTe=/[\\^$*+?|[\]().{}]/g;o(Wr,"pad");o($Te,"requote");o(Av,"formatRe");o(_v,"formatLookup");o(zTe,"parseWeekdayNumberSunday");o(GTe,"parseWeekdayNumberMonday");o(VTe,"parseWeekNumberSunday");o(UTe,"parseWeekNumberISO");o(HTe,"parseWeekNumberMonday");o(xW,"parseFullYear");o(bW,"parseYear");o(WTe,"parseZone");o(qTe,"parseQuarter");o(YTe,"parseMonthNumber");o(wW,"parseDayOfMonth");o(XTe,"parseDayOfYear");o(TW,"parseHour24");o(jTe,"parseMinutes");o(KTe,"parseSeconds");o(QTe,"parseMilliseconds");o(ZTe,"parseMicroseconds");o(JTe,"parseLiteralPercent");o(eke,"parseUnixTimestamp");o(tke,"parseUnixTimestampSeconds");o(kW,"formatDayOfMonth");o(rke,"formatHour24");o(nke,"formatHour12");o(ike,"formatDayOfYear");o(_W,"formatMilliseconds");o(ake,"formatMicroseconds");o(ske,"formatMonthNumber");o(oke,"formatMinutes");o(lke,"formatSeconds");o(cke,"formatWeekdayNumberMonday");o(uke,"formatWeekNumberSunday");o(DW,"dISO");o(hke,"formatWeekNumberISO");o(fke,"formatWeekdayNumberSunday");o(dke,"formatWeekNumberMonday");o(pke,"formatYear");o(mke,"formatYearISO");o(gke,"formatFullYear");o(yke,"formatFullYearISO");o(vke,"formatZone");o(EW,"formatUTCDayOfMonth");o(xke,"formatUTCHour24");o(bke,"formatUTCHour12");o(wke,"formatUTCDayOfYear");o(LW,"formatUTCMilliseconds");o(Tke,"formatUTCMicroseconds");o(kke,"formatUTCMonthNumber");o(Eke,"formatUTCMinutes");o(Ske,"formatUTCSeconds");o(Cke,"formatUTCWeekdayNumberMonday");o(Ake,"formatUTCWeekNumberSunday");o(RW,"UTCdISO");o(_ke,"formatUTCWeekNumberISO");o(Dke,"formatUTCWeekdayNumberSunday");o(Lke,"formatUTCWeekNumberMonday");o(Rke,"formatUTCYear");o(Nke,"formatUTCYearISO");o(Mke,"formatUTCFullYear");o(Ike,"formatUTCFullYearISO");o(Oke,"formatUTCZone");o(SW,"formatLiteralPercent");o(CW,"formatUnixTimestamp");o(AW,"formatUnixTimestampSeconds")});function Q_(t){return M0=K_(t),wd=M0.format,MW=M0.parse,IW=M0.utcFormat,OW=M0.utcParse,M0}var M0,wd,MW,IW,OW,PW=N(()=>{"use strict";NW();Q_({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});o(Q_,"defaultLocale")});var Z_=N(()=>{"use strict";PW()});function Pke(t){return new Date(t)}function Bke(t){return t instanceof Date?+t:+new Date(+t)}function BW(t,e,r,n,i,a,s,l,u,h){var f=kv(),d=f.invert,p=f.domain,m=h(".%L"),g=h(":%S"),y=h("%I:%M"),v=h("%I %p"),x=h("%a %d"),b=h("%b %d"),w=h("%B"),C=h("%Y");function T(E){return(u(E){"use strict";A5();Z_();M_();Tv();aW();o(Pke,"date");o(Bke,"number");o(BW,"calendar");o(_5,"time")});var $W=N(()=>{"use strict";JH();iW();D_();FW()});function J_(t){for(var e=t.length/6|0,r=new Array(e),n=0;n{"use strict";o(J_,"default")});var e9,GW=N(()=>{"use strict";zW();e9=J_("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab")});var VW=N(()=>{"use strict";GW()});function Bn(t){return o(function(){return t},"constant")}var D5=N(()=>{"use strict";o(Bn,"default")});function HW(t){return t>1?0:t<-1?I0:Math.acos(t)}function r9(t){return t>=1?Dv:t<=-1?-Dv:Math.asin(t)}var t9,fa,_h,UW,L5,xl,Td,Zi,I0,Dv,O0,R5=N(()=>{"use strict";t9=Math.abs,fa=Math.atan2,_h=Math.cos,UW=Math.max,L5=Math.min,xl=Math.sin,Td=Math.sqrt,Zi=1e-12,I0=Math.PI,Dv=I0/2,O0=2*I0;o(HW,"acos");o(r9,"asin")});function N5(t){let e=3;return t.digits=function(r){if(!arguments.length)return e;if(r==null)e=null;else{let n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);e=n}return t},()=>new pd(e)}var n9=N(()=>{"use strict";m_();o(N5,"withPath")});function Fke(t){return t.innerRadius}function $ke(t){return t.outerRadius}function zke(t){return t.startAngle}function Gke(t){return t.endAngle}function Vke(t){return t&&t.padAngle}function Uke(t,e,r,n,i,a,s,l){var u=r-t,h=n-e,f=s-i,d=l-a,p=d*u-f*h;if(!(p*pR*R+O*O&&(S=I,_=D),{cx:S,cy:_,x01:-f,y01:-d,x11:S*(i/T-1),y11:_*(i/T-1)}}function bl(){var t=Fke,e=$ke,r=Bn(0),n=null,i=zke,a=Gke,s=Vke,l=null,u=N5(h);function h(){var f,d,p=+t.apply(this,arguments),m=+e.apply(this,arguments),g=i.apply(this,arguments)-Dv,y=a.apply(this,arguments)-Dv,v=t9(y-g),x=y>g;if(l||(l=f=u()),mZi))l.moveTo(0,0);else if(v>O0-Zi)l.moveTo(m*_h(g),m*xl(g)),l.arc(0,0,m,g,y,!x),p>Zi&&(l.moveTo(p*_h(y),p*xl(y)),l.arc(0,0,p,y,g,x));else{var b=g,w=y,C=g,T=y,E=v,A=v,S=s.apply(this,arguments)/2,_=S>Zi&&(n?+n.apply(this,arguments):Td(p*p+m*m)),I=L5(t9(m-p)/2,+r.apply(this,arguments)),D=I,k=I,L,R;if(_>Zi){var O=r9(_/p*xl(S)),M=r9(_/m*xl(S));(E-=O*2)>Zi?(O*=x?1:-1,C+=O,T-=O):(E=0,C=T=(g+y)/2),(A-=M*2)>Zi?(M*=x?1:-1,b+=M,w-=M):(A=0,b=w=(g+y)/2)}var B=m*_h(b),F=m*xl(b),P=p*_h(T),z=p*xl(T);if(I>Zi){var $=m*_h(w),H=m*xl(w),Q=p*_h(C),j=p*xl(C),ie;if(vZi?k>Zi?(L=M5(Q,j,B,F,m,k,x),R=M5($,H,P,z,m,k,x),l.moveTo(L.cx+L.x01,L.cy+L.y01),kZi)||!(E>Zi)?l.lineTo(P,z):D>Zi?(L=M5(P,z,$,H,p,-D,x),R=M5(B,F,Q,j,p,-D,x),l.lineTo(L.cx+L.x01,L.cy+L.y01),D{"use strict";D5();R5();n9();o(Fke,"arcInnerRadius");o($ke,"arcOuterRadius");o(zke,"arcStartAngle");o(Gke,"arcEndAngle");o(Vke,"arcPadAngle");o(Uke,"intersect");o(M5,"cornerTangents");o(bl,"default")});function Lv(t){return typeof t=="object"&&"length"in t?t:Array.from(t)}var Nyt,i9=N(()=>{"use strict";Nyt=Array.prototype.slice;o(Lv,"default")});function qW(t){this._context=t}function wu(t){return new qW(t)}var a9=N(()=>{"use strict";o(qW,"Linear");qW.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e);break}},"point")};o(wu,"default")});function YW(t){return t[0]}function XW(t){return t[1]}var jW=N(()=>{"use strict";o(YW,"x");o(XW,"y")});function wl(t,e){var r=Bn(!0),n=null,i=wu,a=null,s=N5(l);t=typeof t=="function"?t:t===void 0?YW:Bn(t),e=typeof e=="function"?e:e===void 0?XW:Bn(e);function l(u){var h,f=(u=Lv(u)).length,d,p=!1,m;for(n==null&&(a=i(m=s())),h=0;h<=f;++h)!(h{"use strict";i9();D5();a9();n9();jW();o(wl,"default")});function s9(t,e){return et?1:e>=t?0:NaN}var QW=N(()=>{"use strict";o(s9,"default")});function o9(t){return t}var ZW=N(()=>{"use strict";o(o9,"default")});function I5(){var t=o9,e=s9,r=null,n=Bn(0),i=Bn(O0),a=Bn(0);function s(l){var u,h=(l=Lv(l)).length,f,d,p=0,m=new Array(h),g=new Array(h),y=+n.apply(this,arguments),v=Math.min(O0,Math.max(-O0,i.apply(this,arguments)-y)),x,b=Math.min(Math.abs(v)/h,a.apply(this,arguments)),w=b*(v<0?-1:1),C;for(u=0;u0&&(p+=C);for(e!=null?m.sort(function(T,E){return e(g[T],g[E])}):r!=null&&m.sort(function(T,E){return r(l[T],l[E])}),u=0,d=p?(v-h*w)/p:0;u0?C*d:0)+w,g[f]={data:l[f],index:u,value:C,startAngle:y,endAngle:x,padAngle:b};return g}return o(s,"pie"),s.value=function(l){return arguments.length?(t=typeof l=="function"?l:Bn(+l),s):t},s.sortValues=function(l){return arguments.length?(e=l,r=null,s):e},s.sort=function(l){return arguments.length?(r=l,e=null,s):r},s.startAngle=function(l){return arguments.length?(n=typeof l=="function"?l:Bn(+l),s):n},s.endAngle=function(l){return arguments.length?(i=typeof l=="function"?l:Bn(+l),s):i},s.padAngle=function(l){return arguments.length?(a=typeof l=="function"?l:Bn(+l),s):a},s}var JW=N(()=>{"use strict";i9();D5();QW();ZW();R5();o(I5,"default")});function Rv(t){return new O5(t,!0)}function Nv(t){return new O5(t,!1)}var O5,eq=N(()=>{"use strict";O5=class{static{o(this,"Bump")}constructor(e,r){this._context=e,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,r){switch(e=+e,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,r,e,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,e,this._y0,e,r);break}}this._x0=e,this._y0=r}};o(Rv,"bumpX");o(Nv,"bumpY")});function Zs(){}var Mv=N(()=>{"use strict";o(Zs,"default")});function P0(t,e,r){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+r)/6)}function Iv(t){this._context=t}function Do(t){return new Iv(t)}var Ov=N(()=>{"use strict";o(P0,"point");o(Iv,"Basis");Iv.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 3:P0(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:P0(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(Do,"default")});function tq(t){this._context=t}function P5(t){return new tq(t)}var rq=N(()=>{"use strict";Mv();Ov();o(tq,"BasisClosed");tq.prototype={areaStart:Zs,areaEnd:Zs,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:P0(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(P5,"default")});function nq(t){this._context=t}function B5(t){return new nq(t)}var iq=N(()=>{"use strict";Ov();o(nq,"BasisOpen");nq.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+t)/6,n=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:P0(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(B5,"default")});function aq(t,e){this._basis=new Iv(t),this._beta=e}var l9,sq=N(()=>{"use strict";Ov();o(aq,"Bundle");aq.prototype={lineStart:o(function(){this._x=[],this._y=[],this._basis.lineStart()},"lineStart"),lineEnd:o(function(){var t=this._x,e=this._y,r=t.length-1;if(r>0)for(var n=t[0],i=e[0],a=t[r]-n,s=e[r]-i,l=-1,u;++l<=r;)u=l/r,this._basis.point(this._beta*t[l]+(1-this._beta)*(n+u*a),this._beta*e[l]+(1-this._beta)*(i+u*s));this._x=this._y=null,this._basis.lineEnd()},"lineEnd"),point:o(function(t,e){this._x.push(+t),this._y.push(+e)},"point")};l9=o(function t(e){function r(n){return e===1?new Iv(n):new aq(n,e)}return o(r,"bundle"),r.beta=function(n){return t(+n)},r},"custom")(.85)});function B0(t,e,r){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-r),t._x2,t._y2)}function F5(t,e){this._context=t,this._k=(1-e)/6}var Pv,Bv=N(()=>{"use strict";o(B0,"point");o(F5,"Cardinal");F5.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:B0(this,this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:B0(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};Pv=o(function t(e){function r(n){return new F5(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r},"custom")(0)});function $5(t,e){this._context=t,this._k=(1-e)/6}var c9,u9=N(()=>{"use strict";Mv();Bv();o($5,"CardinalClosed");$5.prototype={areaStart:Zs,areaEnd:Zs,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:B0(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};c9=o(function t(e){function r(n){return new $5(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r},"custom")(0)});function z5(t,e){this._context=t,this._k=(1-e)/6}var h9,f9=N(()=>{"use strict";Bv();o(z5,"CardinalOpen");z5.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:B0(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};h9=o(function t(e){function r(n){return new z5(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r},"custom")(0)});function Fv(t,e,r){var n=t._x1,i=t._y1,a=t._x2,s=t._y2;if(t._l01_a>Zi){var l=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,u=3*t._l01_a*(t._l01_a+t._l12_a);n=(n*l-t._x0*t._l12_2a+t._x2*t._l01_2a)/u,i=(i*l-t._y0*t._l12_2a+t._y2*t._l01_2a)/u}if(t._l23_a>Zi){var h=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,f=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*h+t._x1*t._l23_2a-e*t._l12_2a)/f,s=(s*h+t._y1*t._l23_2a-r*t._l12_2a)/f}t._context.bezierCurveTo(n,i,a,s,t._x2,t._y2)}function oq(t,e){this._context=t,this._alpha=e}var $v,G5=N(()=>{"use strict";R5();Bv();o(Fv,"point");o(oq,"CatmullRom");oq.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:Fv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};$v=o(function t(e){function r(n){return e?new oq(n,e):new F5(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r},"custom")(.5)});function lq(t,e){this._context=t,this._alpha=e}var d9,cq=N(()=>{"use strict";u9();Mv();G5();o(lq,"CatmullRomClosed");lq.prototype={areaStart:Zs,areaEnd:Zs,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Fv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};d9=o(function t(e){function r(n){return e?new lq(n,e):new $5(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r},"custom")(.5)});function uq(t,e){this._context=t,this._alpha=e}var p9,hq=N(()=>{"use strict";f9();G5();o(uq,"CatmullRomOpen");uq.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Fv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};p9=o(function t(e){function r(n){return e?new uq(n,e):new z5(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r},"custom")(.5)});function fq(t){this._context=t}function V5(t){return new fq(t)}var dq=N(()=>{"use strict";Mv();o(fq,"LinearClosed");fq.prototype={areaStart:Zs,areaEnd:Zs,lineStart:o(function(){this._point=0},"lineStart"),lineEnd:o(function(){this._point&&this._context.closePath()},"lineEnd"),point:o(function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))},"point")};o(V5,"default")});function pq(t){return t<0?-1:1}function mq(t,e,r){var n=t._x1-t._x0,i=e-t._x1,a=(t._y1-t._y0)/(n||i<0&&-0),s=(r-t._y1)/(i||n<0&&-0),l=(a*i+s*n)/(n+i);return(pq(a)+pq(s))*Math.min(Math.abs(a),Math.abs(s),.5*Math.abs(l))||0}function gq(t,e){var r=t._x1-t._x0;return r?(3*(t._y1-t._y0)/r-e)/2:e}function m9(t,e,r){var n=t._x0,i=t._y0,a=t._x1,s=t._y1,l=(a-n)/3;t._context.bezierCurveTo(n+l,i+l*e,a-l,s-l*r,a,s)}function U5(t){this._context=t}function yq(t){this._context=new vq(t)}function vq(t){this._context=t}function zv(t){return new U5(t)}function Gv(t){return new yq(t)}var xq=N(()=>{"use strict";o(pq,"sign");o(mq,"slope3");o(gq,"slope2");o(m9,"point");o(U5,"MonotoneX");U5.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:m9(this,this._t0,gq(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){var r=NaN;if(t=+t,e=+e,!(t===this._x1&&e===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,m9(this,gq(this,r=mq(this,t,e)),r);break;default:m9(this,this._t0,r=mq(this,t,e));break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=r}},"point")};o(yq,"MonotoneY");(yq.prototype=Object.create(U5.prototype)).point=function(t,e){U5.prototype.point.call(this,e,t)};o(vq,"ReflectContext");vq.prototype={moveTo:o(function(t,e){this._context.moveTo(e,t)},"moveTo"),closePath:o(function(){this._context.closePath()},"closePath"),lineTo:o(function(t,e){this._context.lineTo(e,t)},"lineTo"),bezierCurveTo:o(function(t,e,r,n,i,a){this._context.bezierCurveTo(e,t,n,r,a,i)},"bezierCurveTo")};o(zv,"monotoneX");o(Gv,"monotoneY")});function wq(t){this._context=t}function bq(t){var e,r=t.length-1,n,i=new Array(r),a=new Array(r),s=new Array(r);for(i[0]=0,a[0]=2,s[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(s[e]-i[e+1])/a[e];for(a[r-1]=(t[r]+i[r-1])/2,e=0;e{"use strict";o(wq,"Natural");wq.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x=[],this._y=[]},"lineStart"),lineEnd:o(function(){var t=this._x,e=this._y,r=t.length;if(r)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),r===2)this._context.lineTo(t[1],e[1]);else for(var n=bq(t),i=bq(e),a=0,s=1;s{"use strict";o(H5,"Step");H5.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x=this._y=NaN,this._point=0},"lineStart"),lineEnd:o(function(){0=0&&(this._t=1-this._t,this._line=1-this._line)},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var r=this._x*(1-this._t)+t*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,e)}break}}this._x=t,this._y=e},"point")};o($0,"default");o(Vv,"stepBefore");o(Uv,"stepAfter")});var Eq=N(()=>{"use strict";WW();KW();JW();rq();iq();Ov();eq();sq();u9();f9();Bv();cq();hq();G5();dq();a9();xq();Tq();kq()});var Sq=N(()=>{"use strict"});var Cq=N(()=>{"use strict"});function Dh(t,e,r){this.k=t,this.x=e,this.y=r}function y9(t){for(;!t.__zoom;)if(!(t=t.parentNode))return g9;return t.__zoom}var g9,v9=N(()=>{"use strict";o(Dh,"Transform");Dh.prototype={constructor:Dh,scale:o(function(t){return t===1?this:new Dh(this.k*t,this.x,this.y)},"scale"),translate:o(function(t,e){return t===0&e===0?this:new Dh(this.k,this.x+this.k*t,this.y+this.k*e)},"translate"),apply:o(function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},"apply"),applyX:o(function(t){return t*this.k+this.x},"applyX"),applyY:o(function(t){return t*this.k+this.y},"applyY"),invert:o(function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},"invert"),invertX:o(function(t){return(t-this.x)/this.k},"invertX"),invertY:o(function(t){return(t-this.y)/this.k},"invertY"),rescaleX:o(function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},"rescaleX"),rescaleY:o(function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},"rescaleY"),toString:o(function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"},"toString")};g9=new Dh(1,0,0);y9.prototype=Dh.prototype;o(y9,"transform")});var Aq=N(()=>{"use strict"});var _q=N(()=>{"use strict";l5();Sq();Cq();v9();Aq()});var Dq=N(()=>{"use strict";_q();v9()});var dr=N(()=>{"use strict";vh();sV();SH();DH();E0();LH();RH();TA();QV();NH();u_();MH();OH();A_();jH();KH();A0();m_();QH();IH();ZH();$W();VW();fl();Eq();A5();Z_();r5();l5();Dq()});var Lq=Mi(Ji=>{"use strict";Object.defineProperty(Ji,"__esModule",{value:!0});Ji.BLANK_URL=Ji.relativeFirstCharacters=Ji.whitespaceEscapeCharsRegex=Ji.urlSchemeRegex=Ji.ctrlCharactersRegex=Ji.htmlCtrlEntityRegex=Ji.htmlEntitiesRegex=Ji.invalidProtocolRegex=void 0;Ji.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im;Ji.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g;Ji.htmlCtrlEntityRegex=/&(newline|tab);/gi;Ji.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim;Ji.urlSchemeRegex=/^.+(:|:)/gim;Ji.whitespaceEscapeCharsRegex=/(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g;Ji.relativeFirstCharacters=[".","/"];Ji.BLANK_URL="about:blank"});var z0=Mi(W5=>{"use strict";Object.defineProperty(W5,"__esModule",{value:!0});W5.sanitizeUrl=void 0;var Aa=Lq();function Hke(t){return Aa.relativeFirstCharacters.indexOf(t[0])>-1}o(Hke,"isRelativeUrlWithoutProtocol");function Wke(t){var e=t.replace(Aa.ctrlCharactersRegex,"");return e.replace(Aa.htmlEntitiesRegex,function(r,n){return String.fromCharCode(n)})}o(Wke,"decodeHtmlCharacters");function qke(t){return URL.canParse(t)}o(qke,"isValidUrl");function Rq(t){try{return decodeURIComponent(t)}catch{return t}}o(Rq,"decodeURI");function Yke(t){if(!t)return Aa.BLANK_URL;var e,r=Rq(t.trim());do r=Wke(r).replace(Aa.htmlCtrlEntityRegex,"").replace(Aa.ctrlCharactersRegex,"").replace(Aa.whitespaceEscapeCharsRegex,"").trim(),r=Rq(r),e=r.match(Aa.ctrlCharactersRegex)||r.match(Aa.htmlEntitiesRegex)||r.match(Aa.htmlCtrlEntityRegex)||r.match(Aa.whitespaceEscapeCharsRegex);while(e&&e.length>0);var n=r;if(!n)return Aa.BLANK_URL;if(Hke(n))return n;var i=n.trimStart(),a=i.match(Aa.urlSchemeRegex);if(!a)return n;var s=a[0].toLowerCase().trim();if(Aa.invalidProtocolRegex.test(s))return Aa.BLANK_URL;var l=i.replace(/\\/g,"/");if(s==="mailto:"||s.includes("://"))return l;if(s==="http:"||s==="https:"){if(!qke(l))return Aa.BLANK_URL;var u=new URL(l);return u.protocol=u.protocol.toLowerCase(),u.hostname=u.hostname.toLowerCase(),u.toString()}return l}o(Yke,"sanitizeUrl");W5.sanitizeUrl=Yke});var x9,kd,q5,Nq,Mq,Iq,Tl,Hv,Wv=N(()=>{"use strict";x9=Sa(z0(),1);gr();kd=o((t,e)=>{let r=t.append("rect");if(r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),e.name&&r.attr("name",e.name),e.rx&&r.attr("rx",e.rx),e.ry&&r.attr("ry",e.ry),e.attrs!==void 0)for(let n in e.attrs)r.attr(n,e.attrs[n]);return e.class&&r.attr("class",e.class),r},"drawRect"),q5=o((t,e)=>{let r={x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,stroke:e.stroke,class:"rect"};kd(t,r).lower()},"drawBackgroundRect"),Nq=o((t,e)=>{let r=e.text.replace(nd," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),Mq=o((t,e,r,n)=>{let i=t.append("image");i.attr("x",e),i.attr("y",r);let a=(0,x9.sanitizeUrl)(n);i.attr("xlink:href",a)},"drawImage"),Iq=o((t,e,r,n)=>{let i=t.append("use");i.attr("x",e),i.attr("y",r);let a=(0,x9.sanitizeUrl)(n);i.attr("xlink:href",`#${a}`)},"drawEmbeddedImage"),Tl=o(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),Hv=o(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj")});var Oq,b9,Pq,Xke,jke,Kke,Qke,Zke,Jke,eEe,tEe,rEe,nEe,iEe,aEe,Tu,kl,Bq=N(()=>{"use strict";gr();Wv();Oq=Sa(z0(),1),b9=o(function(t,e){return kd(t,e)},"drawRect"),Pq=o(function(t,e,r,n,i,a){let s=t.append("image");s.attr("width",e),s.attr("height",r),s.attr("x",n),s.attr("y",i);let l=a.startsWith("data:image/png;base64")?a:(0,Oq.sanitizeUrl)(a);s.attr("xlink:href",l)},"drawImage"),Xke=o((t,e,r)=>{let n=t.append("g"),i=0;for(let a of e){let s=a.textColor?a.textColor:"#444444",l=a.lineColor?a.lineColor:"#444444",u=a.offsetX?parseInt(a.offsetX):0,h=a.offsetY?parseInt(a.offsetY):0,f="";if(i===0){let p=n.append("line");p.attr("x1",a.startPoint.x),p.attr("y1",a.startPoint.y),p.attr("x2",a.endPoint.x),p.attr("y2",a.endPoint.y),p.attr("stroke-width","1"),p.attr("stroke",l),p.style("fill","none"),a.type!=="rel_b"&&p.attr("marker-end","url("+f+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+f+"#arrowend)"),i=-1}else{let p=n.append("path");p.attr("fill","none").attr("stroke-width","1").attr("stroke",l).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",a.startPoint.x).replaceAll("starty",a.startPoint.y).replaceAll("controlx",a.startPoint.x+(a.endPoint.x-a.startPoint.x)/2-(a.endPoint.x-a.startPoint.x)/4).replaceAll("controly",a.startPoint.y+(a.endPoint.y-a.startPoint.y)/2).replaceAll("stopx",a.endPoint.x).replaceAll("stopy",a.endPoint.y)),a.type!=="rel_b"&&p.attr("marker-end","url("+f+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+f+"#arrowend)")}let d=r.messageFont();Tu(r)(a.label.text,n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+u,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+h,a.label.width,a.label.height,{fill:s},d),a.techn&&a.techn.text!==""&&(d=r.messageFont(),Tu(r)("["+a.techn.text+"]",n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+u,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+r.messageFontSize+5+h,Math.max(a.label.width,a.techn.width),a.techn.height,{fill:s,"font-style":"italic"},d))}},"drawRels"),jke=o(function(t,e,r){let n=t.append("g"),i=e.bgColor?e.bgColor:"none",a=e.borderColor?e.borderColor:"#444444",s=e.fontColor?e.fontColor:"black",l={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};e.nodeType&&(l={"stroke-width":1});let u={x:e.x,y:e.y,fill:i,stroke:a,width:e.width,height:e.height,rx:2.5,ry:2.5,attrs:l};b9(n,u);let h=r.boundaryFont();h.fontWeight="bold",h.fontSize=h.fontSize+2,h.fontColor=s,Tu(r)(e.label.text,n,e.x,e.y+e.label.Y,e.width,e.height,{fill:"#444444"},h),e.type&&e.type.text!==""&&(h=r.boundaryFont(),h.fontColor=s,Tu(r)(e.type.text,n,e.x,e.y+e.type.Y,e.width,e.height,{fill:"#444444"},h)),e.descr&&e.descr.text!==""&&(h=r.boundaryFont(),h.fontSize=h.fontSize-2,h.fontColor=s,Tu(r)(e.descr.text,n,e.x,e.y+e.descr.Y,e.width,e.height,{fill:"#444444"},h))},"drawBoundary"),Kke=o(function(t,e,r){let n=e.bgColor?e.bgColor:r[e.typeC4Shape.text+"_bg_color"],i=e.borderColor?e.borderColor:r[e.typeC4Shape.text+"_border_color"],a=e.fontColor?e.fontColor:"#FFFFFF",s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(e.typeC4Shape.text){case"person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII=";break}let l=t.append("g");l.attr("class","person-man");let u=Tl();switch(e.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":u.x=e.x,u.y=e.y,u.fill=n,u.width=e.width,u.height=e.height,u.stroke=i,u.rx=2.5,u.ry=2.5,u.attrs={"stroke-width":.5},b9(l,u);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":l.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2).replaceAll("height",e.height)),l.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":l.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("width",e.width).replaceAll("half",e.height/2)),l.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",e.x+e.width).replaceAll("starty",e.y).replaceAll("half",e.height/2));break}let h=aEe(r,e.typeC4Shape.text);switch(l.append("text").attr("fill",a).attr("font-family",h.fontFamily).attr("font-size",h.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",e.typeC4Shape.width).attr("x",e.x+e.width/2-e.typeC4Shape.width/2).attr("y",e.y+e.typeC4Shape.Y).text("<<"+e.typeC4Shape.text+">>"),e.typeC4Shape.text){case"person":case"external_person":Pq(l,48,48,e.x+e.width/2-24,e.y+e.image.Y,s);break}let f=r[e.typeC4Shape.text+"Font"]();return f.fontWeight="bold",f.fontSize=f.fontSize+2,f.fontColor=a,Tu(r)(e.label.text,l,e.x,e.y+e.label.Y,e.width,e.height,{fill:a},f),f=r[e.typeC4Shape.text+"Font"](),f.fontColor=a,e.techn&&e.techn?.text!==""?Tu(r)(e.techn.text,l,e.x,e.y+e.techn.Y,e.width,e.height,{fill:a,"font-style":"italic"},f):e.type&&e.type.text!==""&&Tu(r)(e.type.text,l,e.x,e.y+e.type.Y,e.width,e.height,{fill:a,"font-style":"italic"},f),e.descr&&e.descr.text!==""&&(f=r.personFont(),f.fontColor=a,Tu(r)(e.descr.text,l,e.x,e.y+e.descr.Y,e.width,e.height,{fill:a},f)),e.height},"drawC4Shape"),Qke=o(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),Zke=o(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),Jke=o(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),eEe=o(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},"insertArrowHead"),tEe=o(function(t){t.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},"insertArrowEnd"),rEe=o(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),nEe=o(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertDynamicNumber"),iEe=o(function(t){let r=t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);r.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),r.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},"insertArrowCrossHead"),aEe=o((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"getC4ShapeFont"),Tu=function(){function t(i,a,s,l,u,h,f){let d=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("text-anchor","middle").text(i);n(d,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d){let{fontSize:p,fontFamily:m,fontWeight:g}=d,y=i.split(Ze.lineBreakRegex);for(let v=0;v{"use strict";sEe=typeof global=="object"&&global&&global.Object===Object&&global,X5=sEe});var oEe,lEe,li,Lo=N(()=>{"use strict";w9();oEe=typeof self=="object"&&self&&self.Object===Object&&self,lEe=X5||oEe||Function("return this")(),li=lEe});var cEe,ea,Ed=N(()=>{"use strict";Lo();cEe=li.Symbol,ea=cEe});function fEe(t){var e=uEe.call(t,qv),r=t[qv];try{t[qv]=void 0;var n=!0}catch{}var i=hEe.call(t);return n&&(e?t[qv]=r:delete t[qv]),i}var Fq,uEe,hEe,qv,$q,zq=N(()=>{"use strict";Ed();Fq=Object.prototype,uEe=Fq.hasOwnProperty,hEe=Fq.toString,qv=ea?ea.toStringTag:void 0;o(fEe,"getRawTag");$q=fEe});function mEe(t){return pEe.call(t)}var dEe,pEe,Gq,Vq=N(()=>{"use strict";dEe=Object.prototype,pEe=dEe.toString;o(mEe,"objectToString");Gq=mEe});function vEe(t){return t==null?t===void 0?yEe:gEe:Uq&&Uq in Object(t)?$q(t):Gq(t)}var gEe,yEe,Uq,da,ku=N(()=>{"use strict";Ed();zq();Vq();gEe="[object Null]",yEe="[object Undefined]",Uq=ea?ea.toStringTag:void 0;o(vEe,"baseGetTag");da=vEe});function xEe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}var bn,Js=N(()=>{"use strict";o(xEe,"isObject");bn=xEe});function EEe(t){if(!bn(t))return!1;var e=da(t);return e==wEe||e==TEe||e==bEe||e==kEe}var bEe,wEe,TEe,kEe,Si,Yv=N(()=>{"use strict";ku();Js();bEe="[object AsyncFunction]",wEe="[object Function]",TEe="[object GeneratorFunction]",kEe="[object Proxy]";o(EEe,"isFunction");Si=EEe});var SEe,j5,Hq=N(()=>{"use strict";Lo();SEe=li["__core-js_shared__"],j5=SEe});function CEe(t){return!!Wq&&Wq in t}var Wq,qq,Yq=N(()=>{"use strict";Hq();Wq=function(){var t=/[^.]+$/.exec(j5&&j5.keys&&j5.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();o(CEe,"isMasked");qq=CEe});function DEe(t){if(t!=null){try{return _Ee.call(t)}catch{}try{return t+""}catch{}}return""}var AEe,_Ee,Eu,T9=N(()=>{"use strict";AEe=Function.prototype,_Ee=AEe.toString;o(DEe,"toSource");Eu=DEe});function BEe(t){if(!bn(t)||qq(t))return!1;var e=Si(t)?PEe:REe;return e.test(Eu(t))}var LEe,REe,NEe,MEe,IEe,OEe,PEe,Xq,jq=N(()=>{"use strict";Yv();Yq();Js();T9();LEe=/[\\^$.*+?()[\]{}|]/g,REe=/^\[object .+?Constructor\]$/,NEe=Function.prototype,MEe=Object.prototype,IEe=NEe.toString,OEe=MEe.hasOwnProperty,PEe=RegExp("^"+IEe.call(OEe).replace(LEe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");o(BEe,"baseIsNative");Xq=BEe});function FEe(t,e){return t?.[e]}var Kq,Qq=N(()=>{"use strict";o(FEe,"getValue");Kq=FEe});function $Ee(t,e){var r=Kq(t,e);return Xq(r)?r:void 0}var Ss,Lh=N(()=>{"use strict";jq();Qq();o($Ee,"getNative");Ss=$Ee});var zEe,Su,Xv=N(()=>{"use strict";Lh();zEe=Ss(Object,"create"),Su=zEe});function GEe(){this.__data__=Su?Su(null):{},this.size=0}var Zq,Jq=N(()=>{"use strict";Xv();o(GEe,"hashClear");Zq=GEe});function VEe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}var eY,tY=N(()=>{"use strict";o(VEe,"hashDelete");eY=VEe});function qEe(t){var e=this.__data__;if(Su){var r=e[t];return r===UEe?void 0:r}return WEe.call(e,t)?e[t]:void 0}var UEe,HEe,WEe,rY,nY=N(()=>{"use strict";Xv();UEe="__lodash_hash_undefined__",HEe=Object.prototype,WEe=HEe.hasOwnProperty;o(qEe,"hashGet");rY=qEe});function jEe(t){var e=this.__data__;return Su?e[t]!==void 0:XEe.call(e,t)}var YEe,XEe,iY,aY=N(()=>{"use strict";Xv();YEe=Object.prototype,XEe=YEe.hasOwnProperty;o(jEe,"hashHas");iY=jEe});function QEe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=Su&&e===void 0?KEe:e,this}var KEe,sY,oY=N(()=>{"use strict";Xv();KEe="__lodash_hash_undefined__";o(QEe,"hashSet");sY=QEe});function G0(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";Jq();tY();nY();aY();oY();o(G0,"Hash");G0.prototype.clear=Zq;G0.prototype.delete=eY;G0.prototype.get=rY;G0.prototype.has=iY;G0.prototype.set=sY;k9=G0});function ZEe(){this.__data__=[],this.size=0}var cY,uY=N(()=>{"use strict";o(ZEe,"listCacheClear");cY=ZEe});function JEe(t,e){return t===e||t!==t&&e!==e}var Ro,Sd=N(()=>{"use strict";o(JEe,"eq");Ro=JEe});function e6e(t,e){for(var r=t.length;r--;)if(Ro(t[r][0],e))return r;return-1}var Rh,jv=N(()=>{"use strict";Sd();o(e6e,"assocIndexOf");Rh=e6e});function n6e(t){var e=this.__data__,r=Rh(e,t);if(r<0)return!1;var n=e.length-1;return r==n?e.pop():r6e.call(e,r,1),--this.size,!0}var t6e,r6e,hY,fY=N(()=>{"use strict";jv();t6e=Array.prototype,r6e=t6e.splice;o(n6e,"listCacheDelete");hY=n6e});function i6e(t){var e=this.__data__,r=Rh(e,t);return r<0?void 0:e[r][1]}var dY,pY=N(()=>{"use strict";jv();o(i6e,"listCacheGet");dY=i6e});function a6e(t){return Rh(this.__data__,t)>-1}var mY,gY=N(()=>{"use strict";jv();o(a6e,"listCacheHas");mY=a6e});function s6e(t,e){var r=this.__data__,n=Rh(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this}var yY,vY=N(()=>{"use strict";jv();o(s6e,"listCacheSet");yY=s6e});function V0(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";uY();fY();pY();gY();vY();o(V0,"ListCache");V0.prototype.clear=cY;V0.prototype.delete=hY;V0.prototype.get=dY;V0.prototype.has=mY;V0.prototype.set=yY;Nh=V0});var o6e,Mh,K5=N(()=>{"use strict";Lh();Lo();o6e=Ss(li,"Map"),Mh=o6e});function l6e(){this.size=0,this.__data__={hash:new k9,map:new(Mh||Nh),string:new k9}}var xY,bY=N(()=>{"use strict";lY();Kv();K5();o(l6e,"mapCacheClear");xY=l6e});function c6e(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}var wY,TY=N(()=>{"use strict";o(c6e,"isKeyable");wY=c6e});function u6e(t,e){var r=t.__data__;return wY(e)?r[typeof e=="string"?"string":"hash"]:r.map}var Ih,Qv=N(()=>{"use strict";TY();o(u6e,"getMapData");Ih=u6e});function h6e(t){var e=Ih(this,t).delete(t);return this.size-=e?1:0,e}var kY,EY=N(()=>{"use strict";Qv();o(h6e,"mapCacheDelete");kY=h6e});function f6e(t){return Ih(this,t).get(t)}var SY,CY=N(()=>{"use strict";Qv();o(f6e,"mapCacheGet");SY=f6e});function d6e(t){return Ih(this,t).has(t)}var AY,_Y=N(()=>{"use strict";Qv();o(d6e,"mapCacheHas");AY=d6e});function p6e(t,e){var r=Ih(this,t),n=r.size;return r.set(t,e),this.size+=r.size==n?0:1,this}var DY,LY=N(()=>{"use strict";Qv();o(p6e,"mapCacheSet");DY=p6e});function U0(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";bY();EY();CY();_Y();LY();o(U0,"MapCache");U0.prototype.clear=xY;U0.prototype.delete=kY;U0.prototype.get=SY;U0.prototype.has=AY;U0.prototype.set=DY;Cd=U0});function E9(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(m6e);var r=o(function(){var n=arguments,i=e?e.apply(this,n):n[0],a=r.cache;if(a.has(i))return a.get(i);var s=t.apply(this,n);return r.cache=a.set(i,s)||a,s},"memoized");return r.cache=new(E9.Cache||Cd),r}var m6e,H0,S9=N(()=>{"use strict";Q5();m6e="Expected a function";o(E9,"memoize");E9.Cache=Cd;H0=E9});function g6e(){this.__data__=new Nh,this.size=0}var RY,NY=N(()=>{"use strict";Kv();o(g6e,"stackClear");RY=g6e});function y6e(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}var MY,IY=N(()=>{"use strict";o(y6e,"stackDelete");MY=y6e});function v6e(t){return this.__data__.get(t)}var OY,PY=N(()=>{"use strict";o(v6e,"stackGet");OY=v6e});function x6e(t){return this.__data__.has(t)}var BY,FY=N(()=>{"use strict";o(x6e,"stackHas");BY=x6e});function w6e(t,e){var r=this.__data__;if(r instanceof Nh){var n=r.__data__;if(!Mh||n.length{"use strict";Kv();K5();Q5();b6e=200;o(w6e,"stackSet");$Y=w6e});function W0(t){var e=this.__data__=new Nh(t);this.size=e.size}var lc,Zv=N(()=>{"use strict";Kv();NY();IY();PY();FY();zY();o(W0,"Stack");W0.prototype.clear=RY;W0.prototype.delete=MY;W0.prototype.get=OY;W0.prototype.has=BY;W0.prototype.set=$Y;lc=W0});var T6e,q0,C9=N(()=>{"use strict";Lh();T6e=function(){try{var t=Ss(Object,"defineProperty");return t({},"",{}),t}catch{}}(),q0=T6e});function k6e(t,e,r){e=="__proto__"&&q0?q0(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}var cc,Y0=N(()=>{"use strict";C9();o(k6e,"baseAssignValue");cc=k6e});function E6e(t,e,r){(r!==void 0&&!Ro(t[e],r)||r===void 0&&!(e in t))&&cc(t,e,r)}var Jv,A9=N(()=>{"use strict";Y0();Sd();o(E6e,"assignMergeValue");Jv=E6e});function S6e(t){return function(e,r,n){for(var i=-1,a=Object(e),s=n(e),l=s.length;l--;){var u=s[t?l:++i];if(r(a[u],u,a)===!1)break}return e}}var GY,VY=N(()=>{"use strict";o(S6e,"createBaseFor");GY=S6e});var C6e,X0,Z5=N(()=>{"use strict";VY();C6e=GY(),X0=C6e});function _6e(t,e){if(e)return t.slice();var r=t.length,n=WY?WY(r):new t.constructor(r);return t.copy(n),n}var qY,UY,A6e,HY,WY,J5,_9=N(()=>{"use strict";Lo();qY=typeof exports=="object"&&exports&&!exports.nodeType&&exports,UY=qY&&typeof module=="object"&&module&&!module.nodeType&&module,A6e=UY&&UY.exports===qY,HY=A6e?li.Buffer:void 0,WY=HY?HY.allocUnsafe:void 0;o(_6e,"cloneBuffer");J5=_6e});var D6e,j0,D9=N(()=>{"use strict";Lo();D6e=li.Uint8Array,j0=D6e});function L6e(t){var e=new t.constructor(t.byteLength);return new j0(e).set(new j0(t)),e}var K0,ew=N(()=>{"use strict";D9();o(L6e,"cloneArrayBuffer");K0=L6e});function R6e(t,e){var r=e?K0(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}var tw,L9=N(()=>{"use strict";ew();o(R6e,"cloneTypedArray");tw=R6e});function N6e(t,e){var r=-1,n=t.length;for(e||(e=Array(n));++r{"use strict";o(N6e,"copyArray");rw=N6e});var YY,M6e,XY,jY=N(()=>{"use strict";Js();YY=Object.create,M6e=function(){function t(){}return o(t,"object"),function(e){if(!bn(e))return{};if(YY)return YY(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}(),XY=M6e});function I6e(t,e){return function(r){return t(e(r))}}var nw,N9=N(()=>{"use strict";o(I6e,"overArg");nw=I6e});var O6e,Q0,iw=N(()=>{"use strict";N9();O6e=nw(Object.getPrototypeOf,Object),Q0=O6e});function B6e(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||P6e;return t===r}var P6e,uc,Z0=N(()=>{"use strict";P6e=Object.prototype;o(B6e,"isPrototype");uc=B6e});function F6e(t){return typeof t.constructor=="function"&&!uc(t)?XY(Q0(t)):{}}var aw,M9=N(()=>{"use strict";jY();iw();Z0();o(F6e,"initCloneObject");aw=F6e});function $6e(t){return t!=null&&typeof t=="object"}var ri,No=N(()=>{"use strict";o($6e,"isObjectLike");ri=$6e});function G6e(t){return ri(t)&&da(t)==z6e}var z6e,I9,KY=N(()=>{"use strict";ku();No();z6e="[object Arguments]";o(G6e,"baseIsArguments");I9=G6e});var QY,V6e,U6e,H6e,El,J0=N(()=>{"use strict";KY();No();QY=Object.prototype,V6e=QY.hasOwnProperty,U6e=QY.propertyIsEnumerable,H6e=I9(function(){return arguments}())?I9:function(t){return ri(t)&&V6e.call(t,"callee")&&!U6e.call(t,"callee")},El=H6e});var W6e,Pt,Un=N(()=>{"use strict";W6e=Array.isArray,Pt=W6e});function Y6e(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=q6e}var q6e,em,sw=N(()=>{"use strict";q6e=9007199254740991;o(Y6e,"isLength");em=Y6e});function X6e(t){return t!=null&&em(t.length)&&!Si(t)}var ci,Mo=N(()=>{"use strict";Yv();sw();o(X6e,"isArrayLike");ci=X6e});function j6e(t){return ri(t)&&ci(t)}var Ad,ow=N(()=>{"use strict";Mo();No();o(j6e,"isArrayLikeObject");Ad=j6e});function K6e(){return!1}var ZY,JY=N(()=>{"use strict";o(K6e,"stubFalse");ZY=K6e});var rX,eX,Q6e,tX,Z6e,J6e,Sl,tm=N(()=>{"use strict";Lo();JY();rX=typeof exports=="object"&&exports&&!exports.nodeType&&exports,eX=rX&&typeof module=="object"&&module&&!module.nodeType&&module,Q6e=eX&&eX.exports===rX,tX=Q6e?li.Buffer:void 0,Z6e=tX?tX.isBuffer:void 0,J6e=Z6e||ZY,Sl=J6e});function aSe(t){if(!ri(t)||da(t)!=eSe)return!1;var e=Q0(t);if(e===null)return!0;var r=nSe.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&nX.call(r)==iSe}var eSe,tSe,rSe,nX,nSe,iSe,iX,aX=N(()=>{"use strict";ku();iw();No();eSe="[object Object]",tSe=Function.prototype,rSe=Object.prototype,nX=tSe.toString,nSe=rSe.hasOwnProperty,iSe=nX.call(Object);o(aSe,"isPlainObject");iX=aSe});function LSe(t){return ri(t)&&em(t.length)&&!!Fn[da(t)]}var sSe,oSe,lSe,cSe,uSe,hSe,fSe,dSe,pSe,mSe,gSe,ySe,vSe,xSe,bSe,wSe,TSe,kSe,ESe,SSe,CSe,ASe,_Se,DSe,Fn,sX,oX=N(()=>{"use strict";ku();sw();No();sSe="[object Arguments]",oSe="[object Array]",lSe="[object Boolean]",cSe="[object Date]",uSe="[object Error]",hSe="[object Function]",fSe="[object Map]",dSe="[object Number]",pSe="[object Object]",mSe="[object RegExp]",gSe="[object Set]",ySe="[object String]",vSe="[object WeakMap]",xSe="[object ArrayBuffer]",bSe="[object DataView]",wSe="[object Float32Array]",TSe="[object Float64Array]",kSe="[object Int8Array]",ESe="[object Int16Array]",SSe="[object Int32Array]",CSe="[object Uint8Array]",ASe="[object Uint8ClampedArray]",_Se="[object Uint16Array]",DSe="[object Uint32Array]",Fn={};Fn[wSe]=Fn[TSe]=Fn[kSe]=Fn[ESe]=Fn[SSe]=Fn[CSe]=Fn[ASe]=Fn[_Se]=Fn[DSe]=!0;Fn[sSe]=Fn[oSe]=Fn[xSe]=Fn[lSe]=Fn[bSe]=Fn[cSe]=Fn[uSe]=Fn[hSe]=Fn[fSe]=Fn[dSe]=Fn[pSe]=Fn[mSe]=Fn[gSe]=Fn[ySe]=Fn[vSe]=!1;o(LSe,"baseIsTypedArray");sX=LSe});function RSe(t){return function(e){return t(e)}}var Io,_d=N(()=>{"use strict";o(RSe,"baseUnary");Io=RSe});var lX,e2,NSe,O9,MSe,Oo,t2=N(()=>{"use strict";w9();lX=typeof exports=="object"&&exports&&!exports.nodeType&&exports,e2=lX&&typeof module=="object"&&module&&!module.nodeType&&module,NSe=e2&&e2.exports===lX,O9=NSe&&X5.process,MSe=function(){try{var t=e2&&e2.require&&e2.require("util").types;return t||O9&&O9.binding&&O9.binding("util")}catch{}}(),Oo=MSe});var cX,ISe,Oh,r2=N(()=>{"use strict";oX();_d();t2();cX=Oo&&Oo.isTypedArray,ISe=cX?Io(cX):sX,Oh=ISe});function OSe(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}var n2,P9=N(()=>{"use strict";o(OSe,"safeGet");n2=OSe});function FSe(t,e,r){var n=t[e];(!(BSe.call(t,e)&&Ro(n,r))||r===void 0&&!(e in t))&&cc(t,e,r)}var PSe,BSe,hc,rm=N(()=>{"use strict";Y0();Sd();PSe=Object.prototype,BSe=PSe.hasOwnProperty;o(FSe,"assignValue");hc=FSe});function $Se(t,e,r,n){var i=!r;r||(r={});for(var a=-1,s=e.length;++a{"use strict";rm();Y0();o($Se,"copyObject");Po=$Se});function zSe(t,e){for(var r=-1,n=Array(t);++r{"use strict";o(zSe,"baseTimes");uX=zSe});function USe(t,e){var r=typeof t;return e=e??GSe,!!e&&(r=="number"||r!="symbol"&&VSe.test(t))&&t>-1&&t%1==0&&t{"use strict";GSe=9007199254740991,VSe=/^(?:0|[1-9]\d*)$/;o(USe,"isIndex");Ph=USe});function qSe(t,e){var r=Pt(t),n=!r&&El(t),i=!r&&!n&&Sl(t),a=!r&&!n&&!i&&Oh(t),s=r||n||i||a,l=s?uX(t.length,String):[],u=l.length;for(var h in t)(e||WSe.call(t,h))&&!(s&&(h=="length"||i&&(h=="offset"||h=="parent")||a&&(h=="buffer"||h=="byteLength"||h=="byteOffset")||Ph(h,u)))&&l.push(h);return l}var HSe,WSe,lw,B9=N(()=>{"use strict";hX();J0();Un();tm();i2();r2();HSe=Object.prototype,WSe=HSe.hasOwnProperty;o(qSe,"arrayLikeKeys");lw=qSe});function YSe(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}var fX,dX=N(()=>{"use strict";o(YSe,"nativeKeysIn");fX=YSe});function KSe(t){if(!bn(t))return fX(t);var e=uc(t),r=[];for(var n in t)n=="constructor"&&(e||!jSe.call(t,n))||r.push(n);return r}var XSe,jSe,pX,mX=N(()=>{"use strict";Js();Z0();dX();XSe=Object.prototype,jSe=XSe.hasOwnProperty;o(KSe,"baseKeysIn");pX=KSe});function QSe(t){return ci(t)?lw(t,!0):pX(t)}var Cs,Bh=N(()=>{"use strict";B9();mX();Mo();o(QSe,"keysIn");Cs=QSe});function ZSe(t){return Po(t,Cs(t))}var gX,yX=N(()=>{"use strict";Dd();Bh();o(ZSe,"toPlainObject");gX=ZSe});function JSe(t,e,r,n,i,a,s){var l=n2(t,r),u=n2(e,r),h=s.get(u);if(h){Jv(t,r,h);return}var f=a?a(l,u,r+"",t,e,s):void 0,d=f===void 0;if(d){var p=Pt(u),m=!p&&Sl(u),g=!p&&!m&&Oh(u);f=u,p||m||g?Pt(l)?f=l:Ad(l)?f=rw(l):m?(d=!1,f=J5(u,!0)):g?(d=!1,f=tw(u,!0)):f=[]:iX(u)||El(u)?(f=l,El(l)?f=gX(l):(!bn(l)||Si(l))&&(f=aw(u))):d=!1}d&&(s.set(u,f),i(f,u,n,a,s),s.delete(u)),Jv(t,r,f)}var vX,xX=N(()=>{"use strict";A9();_9();L9();R9();M9();J0();Un();ow();tm();Yv();Js();aX();r2();P9();yX();o(JSe,"baseMergeDeep");vX=JSe});function bX(t,e,r,n,i){t!==e&&X0(e,function(a,s){if(i||(i=new lc),bn(a))vX(t,e,s,r,bX,n,i);else{var l=n?n(n2(t,s),a,s+"",t,e,i):void 0;l===void 0&&(l=a),Jv(t,s,l)}},Cs)}var wX,TX=N(()=>{"use strict";Zv();A9();Z5();xX();Js();Bh();P9();o(bX,"baseMerge");wX=bX});function eCe(t){return t}var ta,Cu=N(()=>{"use strict";o(eCe,"identity");ta=eCe});function tCe(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}var kX,EX=N(()=>{"use strict";o(tCe,"apply");kX=tCe});function rCe(t,e,r){return e=SX(e===void 0?t.length-1:e,0),function(){for(var n=arguments,i=-1,a=SX(n.length-e,0),s=Array(a);++i{"use strict";EX();SX=Math.max;o(rCe,"overRest");cw=rCe});function nCe(t){return function(){return t}}var As,$9=N(()=>{"use strict";o(nCe,"constant");As=nCe});var iCe,CX,AX=N(()=>{"use strict";$9();C9();Cu();iCe=q0?function(t,e){return q0(t,"toString",{configurable:!0,enumerable:!1,value:As(e),writable:!0})}:ta,CX=iCe});function lCe(t){var e=0,r=0;return function(){var n=oCe(),i=sCe-(n-r);if(r=n,i>0){if(++e>=aCe)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var aCe,sCe,oCe,_X,DX=N(()=>{"use strict";aCe=800,sCe=16,oCe=Date.now;o(lCe,"shortOut");_X=lCe});var cCe,uw,z9=N(()=>{"use strict";AX();DX();cCe=_X(CX),uw=cCe});function uCe(t,e){return uw(cw(t,e,ta),t+"")}var fc,nm=N(()=>{"use strict";Cu();F9();z9();o(uCe,"baseRest");fc=uCe});function hCe(t,e,r){if(!bn(r))return!1;var n=typeof e;return(n=="number"?ci(r)&&Ph(e,r.length):n=="string"&&e in r)?Ro(r[e],t):!1}var eo,Ld=N(()=>{"use strict";Sd();Mo();i2();Js();o(hCe,"isIterateeCall");eo=hCe});function fCe(t){return fc(function(e,r){var n=-1,i=r.length,a=i>1?r[i-1]:void 0,s=i>2?r[2]:void 0;for(a=t.length>3&&typeof a=="function"?(i--,a):void 0,s&&eo(r[0],r[1],s)&&(a=i<3?void 0:a,i=1),e=Object(e);++n{"use strict";nm();Ld();o(fCe,"createAssigner");hw=fCe});var dCe,Fh,V9=N(()=>{"use strict";TX();G9();dCe=hw(function(t,e,r){wX(t,e,r)}),Fh=dCe});function W9(t,e){if(!t)return e;let r=`curve${t.charAt(0).toUpperCase()+t.slice(1)}`;return pCe[r]??e}function vCe(t,e){let r=t.trim();if(r)return e.securityLevel!=="loose"?(0,NX.sanitizeUrl)(r):r}function OX(t,e){return!t||!e?0:Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function bCe(t){let e,r=0;t.forEach(i=>{r+=OX(i,e),e=i});let n=r/2;return q9(t,n)}function wCe(t){return t.length===1?t[0]:bCe(t)}function kCe(t,e,r){let n=structuredClone(r);Y.info("our points",n),e!=="start_left"&&e!=="start_right"&&n.reverse();let i=25+t,a=q9(n,i),s=10+t*.5,l=Math.atan2(n[0].y-a.y,n[0].x-a.x),u={x:0,y:0};return e==="start_left"?(u.x=Math.sin(l+Math.PI)*s+(n[0].x+a.x)/2,u.y=-Math.cos(l+Math.PI)*s+(n[0].y+a.y)/2):e==="end_right"?(u.x=Math.sin(l-Math.PI)*s+(n[0].x+a.x)/2-5,u.y=-Math.cos(l-Math.PI)*s+(n[0].y+a.y)/2-5):e==="end_left"?(u.x=Math.sin(l)*s+(n[0].x+a.x)/2-5,u.y=-Math.cos(l)*s+(n[0].y+a.y)/2-5):(u.x=Math.sin(l)*s+(n[0].x+a.x)/2,u.y=-Math.cos(l)*s+(n[0].y+a.y)/2),u}function Y9(t){let e="",r="";for(let n of t)n!==void 0&&(n.startsWith("color:")||n.startsWith("text-align:")?r=r+n+";":e=e+n+";");return{style:e,labelStyle:r}}function ECe(t){let e="",r="0123456789abcdef",n=r.length;for(let i=0;i{"use strict";NX=Sa(z0(),1);dr();gr();e7();vt();Xf();s0();S9();V9();$4();H9="\u200B",pCe={curveBasis:Do,curveBasisClosed:P5,curveBasisOpen:B5,curveBumpX:Rv,curveBumpY:Nv,curveBundle:l9,curveCardinalClosed:c9,curveCardinalOpen:h9,curveCardinal:Pv,curveCatmullRomClosed:d9,curveCatmullRomOpen:p9,curveCatmullRom:$v,curveLinear:wu,curveLinearClosed:V5,curveMonotoneX:zv,curveMonotoneY:Gv,curveNatural:F0,curveStep:$0,curveStepAfter:Uv,curveStepBefore:Vv},mCe=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,gCe=o(function(t,e){let r=MX(t,/(?:init\b)|(?:initialize\b)/),n={};if(Array.isArray(r)){let s=r.map(l=>l.args);l0(s),n=Gn(n,[...s])}else n=r.args;if(!n)return;let i=a0(t,e),a="config";return n[a]!==void 0&&(i==="flowchart-v2"&&(i="flowchart"),n[i]=n[a],delete n[a]),n},"detectInit"),MX=o(function(t,e=null){try{let r=new RegExp(`[%]{2}(?![{]${mCe.source})(?=[}][%]{2}).* +`,"ig");t=t.trim().replace(r,"").replace(/'/gm,'"'),Y.debug(`Detecting diagram directive${e!==null?" type:"+e:""} based on the text:${t}`);let n,i=[];for(;(n=qf.exec(t))!==null;)if(n.index===qf.lastIndex&&qf.lastIndex++,n&&!e||e&&n[1]?.match(e)||e&&n[2]?.match(e)){let a=n[1]?n[1]:n[2],s=n[3]?n[3].trim():n[4]?JSON.parse(n[4].trim()):null;i.push({type:a,args:s})}return i.length===0?{type:t,args:null}:i.length===1?i[0]:i}catch(r){return Y.error(`ERROR: ${r.message} - Unable to parse directive type: '${e}' based on the text: '${t}'`),{type:void 0,args:null}}},"detectDirective"),IX=o(function(t){return t.replace(qf,"")},"removeDirectives"),yCe=o(function(t,e){for(let[r,n]of e.entries())if(n.match(t))return r;return-1},"isSubstringInArray");o(W9,"interpolateToCurve");o(vCe,"formatUrl");xCe=o((t,...e)=>{let r=t.split("."),n=r.length-1,i=r[n],a=window;for(let s=0;s{let r=Math.pow(10,e);return Math.round(t*r)/r},"roundNumber"),q9=o((t,e)=>{let r,n=e;for(let i of t){if(r){let a=OX(i,r);if(a===0)return r;if(a=1)return{x:i.x,y:i.y};if(s>0&&s<1)return{x:LX((1-s)*r.x+s*i.x,5),y:LX((1-s)*r.y+s*i.y,5)}}}r=i}throw new Error("Could not find a suitable point for the given distance")},"calculatePoint"),TCe=o((t,e,r)=>{Y.info(`our points ${JSON.stringify(e)}`),e[0]!==r&&(e=e.reverse());let i=q9(e,25),a=t?10:5,s=Math.atan2(e[0].y-i.y,e[0].x-i.x),l={x:0,y:0};return l.x=Math.sin(s)*a+(e[0].x+i.x)/2,l.y=-Math.cos(s)*a+(e[0].y+i.y)/2,l},"calcCardinalityPosition");o(kCe,"calcTerminalLabelPosition");o(Y9,"getStylesFromArray");RX=0,X9=o(()=>(RX++,"id-"+Math.random().toString(36).substr(2,12)+"-"+RX),"generateId");o(ECe,"makeRandomHex");j9=o(t=>ECe(t.length),"random"),SCe=o(function(){return{x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0,text:""}},"getTextObj"),CCe=o(function(t,e){let r=e.text.replace(Ze.lineBreakRegex," "),[,n]=Bo(e.fontSize),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.style("text-anchor",e.anchor),i.style("font-family",e.fontFamily),i.style("font-size",n),i.style("font-weight",e.fontWeight),i.attr("fill",e.fill),e.class!==void 0&&i.attr("class",e.class);let a=i.append("tspan");return a.attr("x",e.x+e.textMargin*2),a.attr("fill",e.fill),a.text(r),i},"drawSimpleText"),K9=H0((t,e,r)=>{if(!t||(r=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"
"},r),Ze.lineBreakRegex.test(t)))return t;let n=t.split(" ").filter(Boolean),i=[],a="";return n.forEach((s,l)=>{let u=ra(`${s} `,r),h=ra(a,r);if(u>e){let{hyphenatedStrings:p,remainingWord:m}=ACe(s,e,"-",r);i.push(a,...p),a=m}else h+u>=e?(i.push(a),a=s):a=[a,s].filter(Boolean).join(" ");l+1===n.length&&i.push(a)}),i.filter(s=>s!=="").join(r.joinWith)},(t,e,r)=>`${t}${e}${r.fontSize}${r.fontWeight}${r.fontFamily}${r.joinWith}`),ACe=H0((t,e,r="-",n)=>{n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},n);let i=[...t],a=[],s="";return i.forEach((l,u)=>{let h=`${s}${l}`;if(ra(h,n)>=e){let d=u+1,p=i.length===d,m=`${h}${r}`;a.push(p?h:m),s=""}else s=h}),{hyphenatedStrings:a,remainingWord:s}},(t,e,r="-",n)=>`${t}${e}${r}${n.fontSize}${n.fontWeight}${n.fontFamily}`);o(dw,"calculateTextHeight");o(ra,"calculateTextWidth");Q9=H0((t,e)=>{let{fontSize:r=12,fontFamily:n="Arial",fontWeight:i=400}=e;if(!t)return{width:0,height:0};let[,a]=Bo(r),s=["sans-serif",n],l=t.split(Ze.lineBreakRegex),u=[],h=Ge("body");if(!h.remove)return{width:0,height:0,lineHeight:0};let f=h.append("svg");for(let p of s){let m=0,g={width:0,height:0,lineHeight:0};for(let y of l){let v=SCe();v.text=y||H9;let x=CCe(f,v).style("font-size",a).style("font-weight",i).style("font-family",p),b=(x._groups||x)[0][0].getBBox();if(b.width===0&&b.height===0)throw new Error("svg element not in render tree");g.width=Math.round(Math.max(g.width,b.width)),m=Math.round(b.height),g.height+=m,g.lineHeight=Math.round(Math.max(g.lineHeight,m))}u.push(g)}f.remove();let d=isNaN(u[1].height)||isNaN(u[1].width)||isNaN(u[1].lineHeight)||u[0].height>u[1].height&&u[0].width>u[1].width&&u[0].lineHeight>u[1].lineHeight?0:1;return u[d]},(t,e)=>`${t}${e.fontSize}${e.fontWeight}${e.fontFamily}`),U9=class{constructor(e=!1,r){this.count=0;this.count=r?r.length:0,this.next=e?()=>this.count++:()=>Date.now()}static{o(this,"InitIDGenerator")}},_Ce=o(function(t){return fw=fw||document.createElement("div"),t=escape(t).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),fw.innerHTML=t,unescape(fw.textContent)},"entityDecode");o(Z9,"isDetailedError");DCe=o((t,e,r,n)=>{if(!n)return;let i=t.node()?.getBBox();i&&t.append("text").text(n).attr("text-anchor","middle").attr("x",i.x+i.width/2).attr("y",-r).attr("class",e)},"insertTitle"),Bo=o(t=>{if(typeof t=="number")return[t,t+"px"];let e=parseInt(t??"",10);return Number.isNaN(e)?[void 0,void 0]:t===String(e)?[e,t+"px"]:[e,t]},"parseFontSize");o(Fi,"cleanAndMerge");Gt={assignWithDepth:Gn,wrapLabel:K9,calculateTextHeight:dw,calculateTextWidth:ra,calculateTextDimensions:Q9,cleanAndMerge:Fi,detectInit:gCe,detectDirective:MX,isSubstringInArray:yCe,interpolateToCurve:W9,calcLabelPosition:wCe,calcCardinalityPosition:TCe,calcTerminalLabelPosition:kCe,formatUrl:vCe,getStylesFromArray:Y9,generateId:X9,random:j9,runFunc:xCe,entityDecode:_Ce,insertTitle:DCe,parseFontSize:Bo,InitIDGenerator:U9},PX=o(function(t){let e=t;return e=e.replace(/style.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/classDef.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/#\w+;/g,function(r){let n=r.substring(1,r.length-1);return/^\+?\d+$/.test(n)?"\uFB02\xB0\xB0"+n+"\xB6\xDF":"\uFB02\xB0"+n+"\xB6\xDF"}),e},"encodeEntities"),na=o(function(t){return t.replace(/fl°°/g,"&#").replace(/fl°/g,"&").replace(/¶ß/g,";")},"decodeEntities"),$h=o((t,e,{counter:r=0,prefix:n,suffix:i},a)=>a||`${n?`${n}_`:""}${t}_${e}_${r}${i?`_${i}`:""}`,"getEdgeId");o($n,"handleUndefinedAttr")});function Cl(t,e,r,n,i){if(!e[t].width)if(r)e[t].text=K9(e[t].text,i,n),e[t].textLines=e[t].text.split(Ze.lineBreakRegex).length,e[t].width=i,e[t].height=dw(e[t].text,n);else{let a=e[t].text.split(Ze.lineBreakRegex);e[t].textLines=a.length;let s=0;e[t].height=0,e[t].width=0;for(let l of a)e[t].width=Math.max(ra(l,n),e[t].width),s=dw(l,n),e[t].height=e[t].height+s}}function GX(t,e,r,n,i){let a=new yw(i);a.data.widthLimit=r.data.widthLimit/Math.min(J9,n.length);for(let[s,l]of n.entries()){let u=0;l.image={width:0,height:0,Y:0},l.sprite&&(l.image.width=48,l.image.height=48,l.image.Y=u,u=l.image.Y+l.image.height);let h=l.wrap&&Vt.wrap,f=pw(Vt);if(f.fontSize=f.fontSize+2,f.fontWeight="bold",Cl("label",l,h,f,a.data.widthLimit),l.label.Y=u+8,u=l.label.Y+l.label.height,l.type&&l.type.text!==""){l.type.text="["+l.type.text+"]";let g=pw(Vt);Cl("type",l,h,g,a.data.widthLimit),l.type.Y=u+5,u=l.type.Y+l.type.height}if(l.descr&&l.descr.text!==""){let g=pw(Vt);g.fontSize=g.fontSize-2,Cl("descr",l,h,g,a.data.widthLimit),l.descr.Y=u+20,u=l.descr.Y+l.descr.height}if(s==0||s%J9===0){let g=r.data.startx+Vt.diagramMarginX,y=r.data.stopy+Vt.diagramMarginY+u;a.setData(g,g,y,y)}else{let g=a.data.stopx!==a.data.startx?a.data.stopx+Vt.diagramMarginX:a.data.startx,y=a.data.starty;a.setData(g,g,y,y)}a.name=l.alias;let d=i.db.getC4ShapeArray(l.alias),p=i.db.getC4ShapeKeys(l.alias);p.length>0&&zX(a,t,d,p),e=l.alias;let m=i.db.getBoundarys(e);m.length>0&&GX(t,e,a,m,i),l.alias!=="global"&&$X(t,l,a),r.data.stopy=Math.max(a.data.stopy+Vt.c4ShapeMargin,r.data.stopy),r.data.stopx=Math.max(a.data.stopx+Vt.c4ShapeMargin,r.data.stopx),mw=Math.max(mw,r.data.stopx),gw=Math.max(gw,r.data.stopy)}}var mw,gw,FX,J9,Vt,yw,eD,a2,pw,LCe,$X,zX,_s,BX,RCe,NCe,MCe,tD,VX=N(()=>{"use strict";dr();Bq();vt();$C();gr();uA();zt();s0();ir();Ei();mw=0,gw=0,FX=4,J9=2;Ty.yy=Qy;Vt={},yw=class{static{o(this,"Bounds")}constructor(e){this.name="",this.data={},this.data.startx=void 0,this.data.stopx=void 0,this.data.starty=void 0,this.data.stopy=void 0,this.data.widthLimit=void 0,this.nextData={},this.nextData.startx=void 0,this.nextData.stopx=void 0,this.nextData.starty=void 0,this.nextData.stopy=void 0,this.nextData.cnt=0,eD(e.db.getConfig())}setData(e,r,n,i){this.nextData.startx=this.data.startx=e,this.nextData.stopx=this.data.stopx=r,this.nextData.starty=this.data.starty=n,this.nextData.stopy=this.data.stopy=i}updateVal(e,r,n,i){e[r]===void 0?e[r]=n:e[r]=i(n,e[r])}insert(e){this.nextData.cnt=this.nextData.cnt+1;let r=this.nextData.startx===this.nextData.stopx?this.nextData.stopx+e.margin:this.nextData.stopx+e.margin*2,n=r+e.width,i=this.nextData.starty+e.margin*2,a=i+e.height;(r>=this.data.widthLimit||n>=this.data.widthLimit||this.nextData.cnt>FX)&&(r=this.nextData.startx+e.margin+Vt.nextLinePaddingX,i=this.nextData.stopy+e.margin*2,this.nextData.stopx=n=r+e.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=a=i+e.height,this.nextData.cnt=1),e.x=r,e.y=i,this.updateVal(this.data,"startx",r,Math.min),this.updateVal(this.data,"starty",i,Math.min),this.updateVal(this.data,"stopx",n,Math.max),this.updateVal(this.data,"stopy",a,Math.max),this.updateVal(this.nextData,"startx",r,Math.min),this.updateVal(this.nextData,"starty",i,Math.min),this.updateVal(this.nextData,"stopx",n,Math.max),this.updateVal(this.nextData,"stopy",a,Math.max)}init(e){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},eD(e.db.getConfig())}bumpLastMargin(e){this.data.stopx+=e,this.data.stopy+=e}},eD=o(function(t){Gn(Vt,t),t.fontFamily&&(Vt.personFontFamily=Vt.systemFontFamily=Vt.messageFontFamily=t.fontFamily),t.fontSize&&(Vt.personFontSize=Vt.systemFontSize=Vt.messageFontSize=t.fontSize),t.fontWeight&&(Vt.personFontWeight=Vt.systemFontWeight=Vt.messageFontWeight=t.fontWeight)},"setConf"),a2=o((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"c4ShapeFont"),pw=o(t=>({fontFamily:t.boundaryFontFamily,fontSize:t.boundaryFontSize,fontWeight:t.boundaryFontWeight}),"boundaryFont"),LCe=o(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont");o(Cl,"calcC4ShapeTextWH");$X=o(function(t,e,r){e.x=r.data.startx,e.y=r.data.starty,e.width=r.data.stopx-r.data.startx,e.height=r.data.stopy-r.data.starty,e.label.y=Vt.c4ShapeMargin-35;let n=e.wrap&&Vt.wrap,i=pw(Vt);i.fontSize=i.fontSize+2,i.fontWeight="bold";let a=ra(e.label.text,i);Cl("label",e,n,i,a),kl.drawBoundary(t,e,Vt)},"drawBoundary"),zX=o(function(t,e,r,n){let i=0;for(let a of n){i=0;let s=r[a],l=a2(Vt,s.typeC4Shape.text);switch(l.fontSize=l.fontSize-2,s.typeC4Shape.width=ra("\xAB"+s.typeC4Shape.text+"\xBB",l),s.typeC4Shape.height=l.fontSize+2,s.typeC4Shape.Y=Vt.c4ShapePadding,i=s.typeC4Shape.Y+s.typeC4Shape.height-4,s.image={width:0,height:0,Y:0},s.typeC4Shape.text){case"person":case"external_person":s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height;break}s.sprite&&(s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height);let u=s.wrap&&Vt.wrap,h=Vt.width-Vt.c4ShapePadding*2,f=a2(Vt,s.typeC4Shape.text);if(f.fontSize=f.fontSize+2,f.fontWeight="bold",Cl("label",s,u,f,h),s.label.Y=i+8,i=s.label.Y+s.label.height,s.type&&s.type.text!==""){s.type.text="["+s.type.text+"]";let m=a2(Vt,s.typeC4Shape.text);Cl("type",s,u,m,h),s.type.Y=i+5,i=s.type.Y+s.type.height}else if(s.techn&&s.techn.text!==""){s.techn.text="["+s.techn.text+"]";let m=a2(Vt,s.techn.text);Cl("techn",s,u,m,h),s.techn.Y=i+5,i=s.techn.Y+s.techn.height}let d=i,p=s.label.width;if(s.descr&&s.descr.text!==""){let m=a2(Vt,s.typeC4Shape.text);Cl("descr",s,u,m,h),s.descr.Y=i+20,i=s.descr.Y+s.descr.height,p=Math.max(s.label.width,s.descr.width),d=i-s.descr.textLines*5}p=p+Vt.c4ShapePadding,s.width=Math.max(s.width||Vt.width,p,Vt.width),s.height=Math.max(s.height||Vt.height,d,Vt.height),s.margin=s.margin||Vt.c4ShapeMargin,t.insert(s),kl.drawC4Shape(e,s,Vt)}t.bumpLastMargin(Vt.c4ShapeMargin)},"drawC4ShapeArray"),_s=class{static{o(this,"Point")}constructor(e,r){this.x=e,this.y=r}},BX=o(function(t,e){let r=t.x,n=t.y,i=e.x,a=e.y,s=r+t.width/2,l=n+t.height/2,u=Math.abs(r-i),h=Math.abs(n-a),f=h/u,d=t.height/t.width,p=null;return n==a&&ri?p=new _s(r,l):r==i&&na&&(p=new _s(s,n)),r>i&&n=f?p=new _s(r,l+f*t.width/2):p=new _s(s-u/h*t.height/2,n+t.height):r=f?p=new _s(r+t.width,l+f*t.width/2):p=new _s(s+u/h*t.height/2,n+t.height):ra?d>=f?p=new _s(r+t.width,l-f*t.width/2):p=new _s(s+t.height/2*u/h,n):r>i&&n>a&&(d>=f?p=new _s(r,l-t.width/2*f):p=new _s(s-t.height/2*u/h,n)),p},"getIntersectPoint"),RCe=o(function(t,e){let r={x:0,y:0};r.x=e.x+e.width/2,r.y=e.y+e.height/2;let n=BX(t,r);r.x=t.x+t.width/2,r.y=t.y+t.height/2;let i=BX(e,r);return{startPoint:n,endPoint:i}},"getIntersectPoints"),NCe=o(function(t,e,r,n){let i=0;for(let a of e){i=i+1;let s=a.wrap&&Vt.wrap,l=LCe(Vt);n.db.getC4Type()==="C4Dynamic"&&(a.label.text=i+": "+a.label.text);let h=ra(a.label.text,l);Cl("label",a,s,l,h),a.techn&&a.techn.text!==""&&(h=ra(a.techn.text,l),Cl("techn",a,s,l,h)),a.descr&&a.descr.text!==""&&(h=ra(a.descr.text,l),Cl("descr",a,s,l,h));let f=r(a.from),d=r(a.to),p=RCe(f,d);a.startPoint=p.startPoint,a.endPoint=p.endPoint}kl.drawRels(t,e,Vt)},"drawRels");o(GX,"drawInsideBoundary");MCe=o(function(t,e,r,n){Vt=me().c4;let i=me().securityLevel,a;i==="sandbox"&&(a=Ge("#i"+e));let s=i==="sandbox"?Ge(a.nodes()[0].contentDocument.body):Ge("body"),l=n.db;n.db.setWrap(Vt.wrap),FX=l.getC4ShapeInRow(),J9=l.getC4BoundaryInRow(),Y.debug(`C:${JSON.stringify(Vt,null,2)}`);let u=i==="sandbox"?s.select(`[id="${e}"]`):Ge(`[id="${e}"]`);kl.insertComputerIcon(u),kl.insertDatabaseIcon(u),kl.insertClockIcon(u);let h=new yw(n);h.setData(Vt.diagramMarginX,Vt.diagramMarginX,Vt.diagramMarginY,Vt.diagramMarginY),h.data.widthLimit=screen.availWidth,mw=Vt.diagramMarginX,gw=Vt.diagramMarginY;let f=n.db.getTitle(),d=n.db.getBoundarys("");GX(u,"",h,d,n),kl.insertArrowHead(u),kl.insertArrowEnd(u),kl.insertArrowCrossHead(u),kl.insertArrowFilledHead(u),NCe(u,n.db.getRels(),n.db.getC4Shape,n),h.data.stopx=mw,h.data.stopy=gw;let p=h.data,g=p.stopy-p.starty+2*Vt.diagramMarginY,v=p.stopx-p.startx+2*Vt.diagramMarginX;f&&u.append("text").text(f).attr("x",(p.stopx-p.startx)/2-4*Vt.diagramMarginX).attr("y",p.starty+Vt.diagramMarginY),vn(u,g,v,Vt.useMaxWidth);let x=f?60:0;u.attr("viewBox",p.startx-Vt.diagramMarginX+" -"+(Vt.diagramMarginY+x)+" "+v+" "+(g+x)),Y.debug("models:",p)},"draw"),tD={drawPersonOrSystemArray:zX,drawBoundary:$X,setConf:eD,draw:MCe}});var ICe,UX,HX=N(()=>{"use strict";ICe=o(t=>`.person { + stroke: ${t.personBorder}; + fill: ${t.personBkg}; + } +`,"getStyles"),UX=ICe});var WX={};hr(WX,{diagram:()=>OCe});var OCe,qX=N(()=>{"use strict";$C();uA();VX();HX();OCe={parser:JF,db:Qy,renderer:tD,styles:UX,init:o(({c4:t,wrap:e})=>{tD.setConf(t),Qy.setWrap(e)},"init")}});function uj(t){return typeof t>"u"||t===null}function $Ce(t){return typeof t=="object"&&t!==null}function zCe(t){return Array.isArray(t)?t:uj(t)?[]:[t]}function GCe(t,e){var r,n,i,a;if(e)for(a=Object.keys(e),r=0,n=a.length;rl&&(a=" ... ",e=n-l+a.length),r-n>l&&(s=" ...",r=n+l-s.length),{str:a+t.slice(e,r).replace(/\t/g,"\u2192")+s,pos:n-e+a.length}}function nD(t,e){return $i.repeat(" ",e-t.length)+t}function KCe(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),typeof e.indent!="number"&&(e.indent=1),typeof e.linesBefore!="number"&&(e.linesBefore=3),typeof e.linesAfter!="number"&&(e.linesAfter=2);for(var r=/\r?\n|\r|\0/g,n=[0],i=[],a,s=-1;a=r.exec(t.buffer);)i.push(a.index),n.push(a.index+a[0].length),t.position<=a.index&&s<0&&(s=n.length-2);s<0&&(s=n.length-1);var l="",u,h,f=Math.min(t.line+e.linesAfter,i.length).toString().length,d=e.maxLength-(e.indent+f+3);for(u=1;u<=e.linesBefore&&!(s-u<0);u++)h=rD(t.buffer,n[s-u],i[s-u],t.position-(n[s]-n[s-u]),d),l=$i.repeat(" ",e.indent)+nD((t.line-u+1).toString(),f)+" | "+h.str+` +`+l;for(h=rD(t.buffer,n[s],i[s],t.position,d),l+=$i.repeat(" ",e.indent)+nD((t.line+1).toString(),f)+" | "+h.str+` +`,l+=$i.repeat("-",e.indent+f+3+h.pos)+`^ +`,u=1;u<=e.linesAfter&&!(s+u>=i.length);u++)h=rD(t.buffer,n[s+u],i[s+u],t.position-(n[s]-n[s+u]),d),l+=$i.repeat(" ",e.indent)+nD((t.line+u+1).toString(),f)+" | "+h.str+` +`;return l.replace(/\n$/,"")}function e7e(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(n){e[String(n)]=r})}),e}function t7e(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(ZCe.indexOf(r)===-1)throw new Ds('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=e7e(e.styleAliases||null),JCe.indexOf(this.kind)===-1)throw new Ds('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}function jX(t,e){var r=[];return t[e].forEach(function(n){var i=r.length;r.forEach(function(a,s){a.tag===n.tag&&a.kind===n.kind&&a.multi===n.multi&&(i=s)}),r[i]=n}),r}function r7e(){var t={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},e,r;function n(i){i.multi?(t.multi[i.kind].push(i),t.multi.fallback.push(i)):t[i.kind][i.tag]=t.fallback[i.tag]=i}for(o(n,"collectType"),e=0,r=arguments.length;e=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:r*parseFloat(e,10)}function A7e(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if($i.isNegativeZero(t))return"-0.0";return r=t.toString(10),C7e.test(r)?r.replace("e",".e"):r}function _7e(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||$i.isNegativeZero(t))}function R7e(t){return t===null?!1:dj.exec(t)!==null||pj.exec(t)!==null}function N7e(t){var e,r,n,i,a,s,l,u=0,h=null,f,d,p;if(e=dj.exec(t),e===null&&(e=pj.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],n=+e[2]-1,i=+e[3],!e[4])return new Date(Date.UTC(r,n,i));if(a=+e[4],s=+e[5],l=+e[6],e[7]){for(u=e[7].slice(0,3);u.length<3;)u+="0";u=+u}return e[9]&&(f=+e[10],d=+(e[11]||0),h=(f*60+d)*6e4,e[9]==="-"&&(h=-h)),p=new Date(Date.UTC(r,n,i,a,s,l,u)),h&&p.setTime(p.getTime()-h),p}function M7e(t){return t.toISOString()}function O7e(t){return t==="<<"||t===null}function B7e(t){if(t===null)return!1;var e,r,n=0,i=t.length,a=uD;for(r=0;r64)){if(e<0)return!1;n+=6}return n%8===0}function F7e(t){var e,r,n=t.replace(/[\r\n=]/g,""),i=n.length,a=uD,s=0,l=[];for(e=0;e>16&255),l.push(s>>8&255),l.push(s&255)),s=s<<6|a.indexOf(n.charAt(e));return r=i%4*6,r===0?(l.push(s>>16&255),l.push(s>>8&255),l.push(s&255)):r===18?(l.push(s>>10&255),l.push(s>>2&255)):r===12&&l.push(s>>4&255),new Uint8Array(l)}function $7e(t){var e="",r=0,n,i,a=t.length,s=uD;for(n=0;n>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]),r=(r<<8)+t[n];return i=a%3,i===0?(e+=s[r>>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]):i===2?(e+=s[r>>10&63],e+=s[r>>4&63],e+=s[r<<2&63],e+=s[64]):i===1&&(e+=s[r>>2&63],e+=s[r<<4&63],e+=s[64],e+=s[64]),e}function z7e(t){return Object.prototype.toString.call(t)==="[object Uint8Array]"}function H7e(t){if(t===null)return!0;var e=[],r,n,i,a,s,l=t;for(r=0,n=l.length;r>10)+55296,(t-65536&1023)+56320)}function cAe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||mj,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function Tj(t,e){var r={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return r.snippet=QCe(r),new Ds(e,r)}function Qt(t,e){throw Tj(t,e)}function bw(t,e){t.onWarning&&t.onWarning.call(null,Tj(t,e))}function zh(t,e,r,n){var i,a,s,l;if(e1&&(t.result+=$i.repeat(` +`,e-1))}function uAe(t,e,r){var n,i,a,s,l,u,h,f,d=t.kind,p=t.result,m;if(m=t.input.charCodeAt(t.position),Ls(m)||am(m)||m===35||m===38||m===42||m===33||m===124||m===62||m===39||m===34||m===37||m===64||m===96||(m===63||m===45)&&(i=t.input.charCodeAt(t.position+1),Ls(i)||r&&am(i)))return!1;for(t.kind="scalar",t.result="",a=s=t.position,l=!1;m!==0;){if(m===58){if(i=t.input.charCodeAt(t.position+1),Ls(i)||r&&am(i))break}else if(m===35){if(n=t.input.charCodeAt(t.position-1),Ls(n))break}else{if(t.position===t.lineStart&&kw(t)||r&&am(m))break;if(dc(m))if(u=t.line,h=t.lineStart,f=t.lineIndent,Ci(t,!1,-1),t.lineIndent>=e){l=!0,m=t.input.charCodeAt(t.position);continue}else{t.position=s,t.line=u,t.lineStart=h,t.lineIndent=f;break}}l&&(zh(t,a,s,!1),fD(t,t.line-u),a=s=t.position,l=!1),Nd(m)||(s=t.position+1),m=t.input.charCodeAt(++t.position)}return zh(t,a,s,!1),t.result?!0:(t.kind=d,t.result=p,!1)}function hAe(t,e){var r,n,i;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,n=i=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(zh(t,n,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)n=t.position,t.position++,i=t.position;else return!0;else dc(r)?(zh(t,n,i,!0),fD(t,Ci(t,!1,e)),n=i=t.position):t.position===t.lineStart&&kw(t)?Qt(t,"unexpected end of the document within a single quoted scalar"):(t.position++,i=t.position);Qt(t,"unexpected end of the stream within a single quoted scalar")}function fAe(t,e){var r,n,i,a,s,l;if(l=t.input.charCodeAt(t.position),l!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=n=t.position;(l=t.input.charCodeAt(t.position))!==0;){if(l===34)return zh(t,r,t.position,!0),t.position++,!0;if(l===92){if(zh(t,r,t.position,!0),l=t.input.charCodeAt(++t.position),dc(l))Ci(t,!1,e);else if(l<256&&bj[l])t.result+=wj[l],t.position++;else if((s=sAe(l))>0){for(i=s,a=0;i>0;i--)l=t.input.charCodeAt(++t.position),(s=aAe(l))>=0?a=(a<<4)+s:Qt(t,"expected hexadecimal character");t.result+=lAe(a),t.position++}else Qt(t,"unknown escape sequence");r=n=t.position}else dc(l)?(zh(t,r,n,!0),fD(t,Ci(t,!1,e)),r=n=t.position):t.position===t.lineStart&&kw(t)?Qt(t,"unexpected end of the document within a double quoted scalar"):(t.position++,n=t.position)}Qt(t,"unexpected end of the stream within a double quoted scalar")}function dAe(t,e){var r=!0,n,i,a,s=t.tag,l,u=t.anchor,h,f,d,p,m,g=Object.create(null),y,v,x,b;if(b=t.input.charCodeAt(t.position),b===91)f=93,m=!1,l=[];else if(b===123)f=125,m=!0,l={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=l),b=t.input.charCodeAt(++t.position);b!==0;){if(Ci(t,!0,e),b=t.input.charCodeAt(t.position),b===f)return t.position++,t.tag=s,t.anchor=u,t.kind=m?"mapping":"sequence",t.result=l,!0;r?b===44&&Qt(t,"expected the node content, but found ','"):Qt(t,"missed comma between flow collection entries"),v=y=x=null,d=p=!1,b===63&&(h=t.input.charCodeAt(t.position+1),Ls(h)&&(d=p=!0,t.position++,Ci(t,!0,e))),n=t.line,i=t.lineStart,a=t.position,om(t,e,vw,!1,!0),v=t.tag,y=t.result,Ci(t,!0,e),b=t.input.charCodeAt(t.position),(p||t.line===n)&&b===58&&(d=!0,b=t.input.charCodeAt(++t.position),Ci(t,!0,e),om(t,e,vw,!1,!0),x=t.result),m?sm(t,l,g,v,y,x,n,i,a):d?l.push(sm(t,null,g,v,y,x,n,i,a)):l.push(y),Ci(t,!0,e),b=t.input.charCodeAt(t.position),b===44?(r=!0,b=t.input.charCodeAt(++t.position)):r=!1}Qt(t,"unexpected end of the stream within a flow collection")}function pAe(t,e){var r,n,i=iD,a=!1,s=!1,l=e,u=0,h=!1,f,d;if(d=t.input.charCodeAt(t.position),d===124)n=!1;else if(d===62)n=!0;else return!1;for(t.kind="scalar",t.result="";d!==0;)if(d=t.input.charCodeAt(++t.position),d===43||d===45)iD===i?i=d===43?KX:tAe:Qt(t,"repeat of a chomping mode identifier");else if((f=oAe(d))>=0)f===0?Qt(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):s?Qt(t,"repeat of an indentation width identifier"):(l=e+f-1,s=!0);else break;if(Nd(d)){do d=t.input.charCodeAt(++t.position);while(Nd(d));if(d===35)do d=t.input.charCodeAt(++t.position);while(!dc(d)&&d!==0)}for(;d!==0;){for(hD(t),t.lineIndent=0,d=t.input.charCodeAt(t.position);(!s||t.lineIndentl&&(l=t.lineIndent),dc(d)){u++;continue}if(t.lineIndente)&&u!==0)Qt(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(v&&(s=t.line,l=t.lineStart,u=t.position),om(t,e,xw,!0,i)&&(v?g=t.result:y=t.result),v||(sm(t,d,p,m,g,y,s,l,u),m=g=y=null),Ci(t,!0,-1),b=t.input.charCodeAt(t.position)),(t.line===a||t.lineIndent>e)&&b!==0)Qt(t,"bad indentation of a mapping entry");else if(t.lineIndente?u=1:t.lineIndent===e?u=0:t.lineIndente?u=1:t.lineIndent===e?u=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),d=0,p=t.implicitTypes.length;d"),t.result!==null&&g.kind!==t.kind&&Qt(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+g.kind+'", not "'+t.kind+'"'),g.resolve(t.result,t.tag)?(t.result=g.construct(t.result,t.tag),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Qt(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||f}function xAe(t){var e=t.position,r,n,i,a=!1,s;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);(s=t.input.charCodeAt(t.position))!==0&&(Ci(t,!0,-1),s=t.input.charCodeAt(t.position),!(t.lineIndent>0||s!==37));){for(a=!0,s=t.input.charCodeAt(++t.position),r=t.position;s!==0&&!Ls(s);)s=t.input.charCodeAt(++t.position);for(n=t.input.slice(r,t.position),i=[],n.length<1&&Qt(t,"directive name must not be less than one character in length");s!==0;){for(;Nd(s);)s=t.input.charCodeAt(++t.position);if(s===35){do s=t.input.charCodeAt(++t.position);while(s!==0&&!dc(s));break}if(dc(s))break;for(r=t.position;s!==0&&!Ls(s);)s=t.input.charCodeAt(++t.position);i.push(t.input.slice(r,t.position))}s!==0&&hD(t),Gh.call(JX,n)?JX[n](t,n,i):bw(t,'unknown document directive "'+n+'"')}if(Ci(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,Ci(t,!0,-1)):a&&Qt(t,"directives end mark is expected"),om(t,t.lineIndent-1,xw,!1,!0),Ci(t,!0,-1),t.checkLineBreaks&&nAe.test(t.input.slice(e,t.position))&&bw(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&kw(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,Ci(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var n=kj(t,r);if(typeof e!="function")return n;for(var i=0,a=n.length;i=55296&&r<=56319&&e+1=56320&&n<=57343)?(r-55296)*1024+n-56320+65536:r}function Nj(t){var e=/^\n* /;return e.test(t)}function jAe(t,e,r,n,i,a,s,l){var u,h=0,f=null,d=!1,p=!1,m=n!==-1,g=-1,y=YAe(s2(t,0))&&XAe(s2(t,t.length-1));if(e||s)for(u=0;u=65536?u+=2:u++){if(h=s2(t,u),!u2(h))return im;y=y&&ij(h,f,l),f=h}else{for(u=0;u=65536?u+=2:u++){if(h=s2(t,u),h===l2)d=!0,m&&(p=p||u-g-1>n&&t[g+1]!==" ",g=u);else if(!u2(h))return im;y=y&&ij(h,f,l),f=h}p=p||m&&u-g-1>n&&t[g+1]!==" "}return!d&&!p?y&&!s&&!i(t)?Mj:a===c2?im:lD:r>9&&Nj(t)?im:s?a===c2?im:lD:p?Oj:Ij}function KAe(t,e,r,n,i){t.dump=function(){if(e.length===0)return t.quotingType===c2?'""':"''";if(!t.noCompatMode&&(zAe.indexOf(e)!==-1||GAe.test(e)))return t.quotingType===c2?'"'+e+'"':"'"+e+"'";var a=t.indent*Math.max(1,r),s=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),l=n||t.flowLevel>-1&&r>=t.flowLevel;function u(h){return qAe(t,h)}switch(o(u,"testAmbiguity"),jAe(e,l,t.indent,s,u,t.quotingType,t.forceQuotes&&!n,i)){case Mj:return e;case lD:return"'"+e.replace(/'/g,"''")+"'";case Ij:return"|"+aj(e,t.indent)+sj(rj(e,a));case Oj:return">"+aj(e,t.indent)+sj(rj(QAe(e,s),a));case im:return'"'+ZAe(e)+'"';default:throw new Ds("impossible error: invalid scalar style")}}()}function aj(t,e){var r=Nj(t)?String(e):"",n=t[t.length-1]===` +`,i=n&&(t[t.length-2]===` +`||t===` +`),a=i?"+":n?"":"-";return r+a+` +`}function sj(t){return t[t.length-1]===` +`?t.slice(0,-1):t}function QAe(t,e){for(var r=/(\n+)([^\n]*)/g,n=function(){var h=t.indexOf(` +`);return h=h!==-1?h:t.length,r.lastIndex=h,oj(t.slice(0,h),e)}(),i=t[0]===` +`||t[0]===" ",a,s;s=r.exec(t);){var l=s[1],u=s[2];a=u[0]===" ",n+=l+(!i&&!a&&u!==""?` +`:"")+oj(u,e),i=a}return n}function oj(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,n,i=0,a,s=0,l=0,u="";n=r.exec(t);)l=n.index,l-i>e&&(a=s>i?s:l,u+=` +`+t.slice(i,a),i=a+1),s=l;return u+=` +`,t.length-i>e&&s>i?u+=t.slice(i,s)+` +`+t.slice(s+1):u+=t.slice(i),u.slice(1)}function ZAe(t){for(var e="",r=0,n,i=0;i=65536?i+=2:i++)r=s2(t,i),n=Da[r],!n&&u2(r)?(e+=t[i],r>=65536&&(e+=t[i+1])):e+=n||UAe(r);return e}function JAe(t,e,r){var n="",i=t.tag,a,s,l;for(a=0,s=r.length;a"u"&&Au(t,e,null,!1,!1))&&(n!==""&&(n+=","+(t.condenseFlow?"":" ")),n+=t.dump);t.tag=i,t.dump="["+n+"]"}function lj(t,e,r,n){var i="",a=t.tag,s,l,u;for(s=0,l=r.length;s"u"&&Au(t,e+1,null,!0,!0,!1,!0))&&((!n||i!=="")&&(i+=oD(t,e)),t.dump&&l2===t.dump.charCodeAt(0)?i+="-":i+="- ",i+=t.dump);t.tag=a,t.dump=i||"[]"}function e8e(t,e,r){var n="",i=t.tag,a=Object.keys(r),s,l,u,h,f;for(s=0,l=a.length;s1024&&(f+="? "),f+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),Au(t,e,h,!1,!1)&&(f+=t.dump,n+=f));t.tag=i,t.dump="{"+n+"}"}function t8e(t,e,r,n){var i="",a=t.tag,s=Object.keys(r),l,u,h,f,d,p;if(t.sortKeys===!0)s.sort();else if(typeof t.sortKeys=="function")s.sort(t.sortKeys);else if(t.sortKeys)throw new Ds("sortKeys must be a boolean or a function");for(l=0,u=s.length;l1024,d&&(t.dump&&l2===t.dump.charCodeAt(0)?p+="?":p+="? "),p+=t.dump,d&&(p+=oD(t,e)),Au(t,e+1,f,!0,d)&&(t.dump&&l2===t.dump.charCodeAt(0)?p+=":":p+=": ",p+=t.dump,i+=p));t.tag=a,t.dump=i||"{}"}function cj(t,e,r){var n,i,a,s,l,u;for(i=r?t.explicitTypes:t.implicitTypes,a=0,s=i.length;a tag resolver accepts not "'+u+'" style');t.dump=n}return!0}return!1}function Au(t,e,r,n,i,a,s){t.tag=null,t.dump=r,cj(t,r,!1)||cj(t,r,!0);var l=Sj.call(t.dump),u=n,h;n&&(n=t.flowLevel<0||t.flowLevel>e);var f=l==="[object Object]"||l==="[object Array]",d,p;if(f&&(d=t.duplicates.indexOf(r),p=d!==-1),(t.tag!==null&&t.tag!=="?"||p||t.indent!==2&&e>0)&&(i=!1),p&&t.usedDuplicates[d])t.dump="*ref_"+d;else{if(f&&p&&!t.usedDuplicates[d]&&(t.usedDuplicates[d]=!0),l==="[object Object]")n&&Object.keys(t.dump).length!==0?(t8e(t,e,t.dump,i),p&&(t.dump="&ref_"+d+t.dump)):(e8e(t,e,t.dump),p&&(t.dump="&ref_"+d+" "+t.dump));else if(l==="[object Array]")n&&t.dump.length!==0?(t.noArrayIndent&&!s&&e>0?lj(t,e-1,t.dump,i):lj(t,e,t.dump,i),p&&(t.dump="&ref_"+d+t.dump)):(JAe(t,e,t.dump),p&&(t.dump="&ref_"+d+" "+t.dump));else if(l==="[object String]")t.tag!=="?"&&KAe(t,t.dump,e,a,u);else{if(l==="[object Undefined]")return!1;if(t.skipInvalid)return!1;throw new Ds("unacceptable kind of an object to dump "+l)}t.tag!==null&&t.tag!=="?"&&(h=encodeURI(t.tag[0]==="!"?t.tag.slice(1):t.tag).replace(/!/g,"%21"),t.tag[0]==="!"?h="!"+h:h.slice(0,18)==="tag:yaml.org,2002:"?h="!!"+h.slice(18):h="!<"+h+">",t.dump=h+" "+t.dump)}return!0}function r8e(t,e){var r=[],n=[],i,a;for(cD(t,r,n),i=0,a=n.length;i{"use strict";o(uj,"isNothing");o($Ce,"isObject");o(zCe,"toArray");o(GCe,"extend");o(VCe,"repeat");o(UCe,"isNegativeZero");HCe=uj,WCe=$Ce,qCe=zCe,YCe=VCe,XCe=UCe,jCe=GCe,$i={isNothing:HCe,isObject:WCe,toArray:qCe,repeat:YCe,isNegativeZero:XCe,extend:jCe};o(hj,"formatError");o(o2,"YAMLException$1");o2.prototype=Object.create(Error.prototype);o2.prototype.constructor=o2;o2.prototype.toString=o(function(e){return this.name+": "+hj(this,e)},"toString");Ds=o2;o(rD,"getLine");o(nD,"padStart");o(KCe,"makeSnippet");QCe=KCe,ZCe=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],JCe=["scalar","sequence","mapping"];o(e7e,"compileStyleAliases");o(t7e,"Type$1");_a=t7e;o(jX,"compileList");o(r7e,"compileMap");o(aD,"Schema$1");aD.prototype.extend=o(function(e){var r=[],n=[];if(e instanceof _a)n.push(e);else if(Array.isArray(e))n=n.concat(e);else if(e&&(Array.isArray(e.implicit)||Array.isArray(e.explicit)))e.implicit&&(r=r.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit));else throw new Ds("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");r.forEach(function(a){if(!(a instanceof _a))throw new Ds("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(a.loadKind&&a.loadKind!=="scalar")throw new Ds("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(a.multi)throw new Ds("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),n.forEach(function(a){if(!(a instanceof _a))throw new Ds("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var i=Object.create(aD.prototype);return i.implicit=(this.implicit||[]).concat(r),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=jX(i,"implicit"),i.compiledExplicit=jX(i,"explicit"),i.compiledTypeMap=r7e(i.compiledImplicit,i.compiledExplicit),i},"extend");n7e=aD,i7e=new _a("tag:yaml.org,2002:str",{kind:"scalar",construct:o(function(t){return t!==null?t:""},"construct")}),a7e=new _a("tag:yaml.org,2002:seq",{kind:"sequence",construct:o(function(t){return t!==null?t:[]},"construct")}),s7e=new _a("tag:yaml.org,2002:map",{kind:"mapping",construct:o(function(t){return t!==null?t:{}},"construct")}),o7e=new n7e({explicit:[i7e,a7e,s7e]});o(l7e,"resolveYamlNull");o(c7e,"constructYamlNull");o(u7e,"isNull");h7e=new _a("tag:yaml.org,2002:null",{kind:"scalar",resolve:l7e,construct:c7e,predicate:u7e,represent:{canonical:o(function(){return"~"},"canonical"),lowercase:o(function(){return"null"},"lowercase"),uppercase:o(function(){return"NULL"},"uppercase"),camelcase:o(function(){return"Null"},"camelcase"),empty:o(function(){return""},"empty")},defaultStyle:"lowercase"});o(f7e,"resolveYamlBoolean");o(d7e,"constructYamlBoolean");o(p7e,"isBoolean");m7e=new _a("tag:yaml.org,2002:bool",{kind:"scalar",resolve:f7e,construct:d7e,predicate:p7e,represent:{lowercase:o(function(t){return t?"true":"false"},"lowercase"),uppercase:o(function(t){return t?"TRUE":"FALSE"},"uppercase"),camelcase:o(function(t){return t?"True":"False"},"camelcase")},defaultStyle:"lowercase"});o(g7e,"isHexCode");o(y7e,"isOctCode");o(v7e,"isDecCode");o(x7e,"resolveYamlInteger");o(b7e,"constructYamlInteger");o(w7e,"isInteger");T7e=new _a("tag:yaml.org,2002:int",{kind:"scalar",resolve:x7e,construct:b7e,predicate:w7e,represent:{binary:o(function(t){return t>=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},"binary"),octal:o(function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},"octal"),decimal:o(function(t){return t.toString(10)},"decimal"),hexadecimal:o(function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)},"hexadecimal")},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),k7e=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");o(E7e,"resolveYamlFloat");o(S7e,"constructYamlFloat");C7e=/^[-+]?[0-9]+e/;o(A7e,"representYamlFloat");o(_7e,"isFloat");D7e=new _a("tag:yaml.org,2002:float",{kind:"scalar",resolve:E7e,construct:S7e,predicate:_7e,represent:A7e,defaultStyle:"lowercase"}),fj=o7e.extend({implicit:[h7e,m7e,T7e,D7e]}),L7e=fj,dj=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),pj=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");o(R7e,"resolveYamlTimestamp");o(N7e,"constructYamlTimestamp");o(M7e,"representYamlTimestamp");I7e=new _a("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:R7e,construct:N7e,instanceOf:Date,represent:M7e});o(O7e,"resolveYamlMerge");P7e=new _a("tag:yaml.org,2002:merge",{kind:"scalar",resolve:O7e}),uD=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;o(B7e,"resolveYamlBinary");o(F7e,"constructYamlBinary");o($7e,"representYamlBinary");o(z7e,"isBinary");G7e=new _a("tag:yaml.org,2002:binary",{kind:"scalar",resolve:B7e,construct:F7e,predicate:z7e,represent:$7e}),V7e=Object.prototype.hasOwnProperty,U7e=Object.prototype.toString;o(H7e,"resolveYamlOmap");o(W7e,"constructYamlOmap");q7e=new _a("tag:yaml.org,2002:omap",{kind:"sequence",resolve:H7e,construct:W7e}),Y7e=Object.prototype.toString;o(X7e,"resolveYamlPairs");o(j7e,"constructYamlPairs");K7e=new _a("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:X7e,construct:j7e}),Q7e=Object.prototype.hasOwnProperty;o(Z7e,"resolveYamlSet");o(J7e,"constructYamlSet");eAe=new _a("tag:yaml.org,2002:set",{kind:"mapping",resolve:Z7e,construct:J7e}),mj=L7e.extend({implicit:[I7e,P7e],explicit:[G7e,q7e,K7e,eAe]}),Gh=Object.prototype.hasOwnProperty,vw=1,gj=2,yj=3,xw=4,iD=1,tAe=2,KX=3,rAe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,nAe=/[\x85\u2028\u2029]/,iAe=/[,\[\]\{\}]/,vj=/^(?:!|!!|![a-z\-]+!)$/i,xj=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;o(QX,"_class");o(dc,"is_EOL");o(Nd,"is_WHITE_SPACE");o(Ls,"is_WS_OR_EOL");o(am,"is_FLOW_INDICATOR");o(aAe,"fromHexCode");o(sAe,"escapedHexLen");o(oAe,"fromDecimalCode");o(ZX,"simpleEscapeSequence");o(lAe,"charFromCodepoint");bj=new Array(256),wj=new Array(256);for(Rd=0;Rd<256;Rd++)bj[Rd]=ZX(Rd)?1:0,wj[Rd]=ZX(Rd);o(cAe,"State$1");o(Tj,"generateError");o(Qt,"throwError");o(bw,"throwWarning");JX={YAML:o(function(e,r,n){var i,a,s;e.version!==null&&Qt(e,"duplication of %YAML directive"),n.length!==1&&Qt(e,"YAML directive accepts exactly one argument"),i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),i===null&&Qt(e,"ill-formed argument of the YAML directive"),a=parseInt(i[1],10),s=parseInt(i[2],10),a!==1&&Qt(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=s<2,s!==1&&s!==2&&bw(e,"unsupported YAML version of the document")},"handleYamlDirective"),TAG:o(function(e,r,n){var i,a;n.length!==2&&Qt(e,"TAG directive accepts exactly two arguments"),i=n[0],a=n[1],vj.test(i)||Qt(e,"ill-formed tag handle (first argument) of the TAG directive"),Gh.call(e.tagMap,i)&&Qt(e,'there is a previously declared suffix for "'+i+'" tag handle'),xj.test(a)||Qt(e,"ill-formed tag prefix (second argument) of the TAG directive");try{a=decodeURIComponent(a)}catch{Qt(e,"tag prefix is malformed: "+a)}e.tagMap[i]=a},"handleTagDirective")};o(zh,"captureSegment");o(ej,"mergeMappings");o(sm,"storeMappingPair");o(hD,"readLineBreak");o(Ci,"skipSeparationSpace");o(kw,"testDocumentSeparator");o(fD,"writeFoldedLines");o(uAe,"readPlainScalar");o(hAe,"readSingleQuotedScalar");o(fAe,"readDoubleQuotedScalar");o(dAe,"readFlowCollection");o(pAe,"readBlockScalar");o(tj,"readBlockSequence");o(mAe,"readBlockMapping");o(gAe,"readTagProperty");o(yAe,"readAnchorProperty");o(vAe,"readAlias");o(om,"composeNode");o(xAe,"readDocument");o(kj,"loadDocuments");o(bAe,"loadAll$1");o(wAe,"load$1");TAe=bAe,kAe=wAe,Ej={loadAll:TAe,load:kAe},Sj=Object.prototype.toString,Cj=Object.prototype.hasOwnProperty,dD=65279,EAe=9,l2=10,SAe=13,CAe=32,AAe=33,_Ae=34,sD=35,DAe=37,LAe=38,RAe=39,NAe=42,Aj=44,MAe=45,ww=58,IAe=61,OAe=62,PAe=63,BAe=64,_j=91,Dj=93,FAe=96,Lj=123,$Ae=124,Rj=125,Da={};Da[0]="\\0";Da[7]="\\a";Da[8]="\\b";Da[9]="\\t";Da[10]="\\n";Da[11]="\\v";Da[12]="\\f";Da[13]="\\r";Da[27]="\\e";Da[34]='\\"';Da[92]="\\\\";Da[133]="\\N";Da[160]="\\_";Da[8232]="\\L";Da[8233]="\\P";zAe=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],GAe=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;o(VAe,"compileStyleMap");o(UAe,"encodeHex");HAe=1,c2=2;o(WAe,"State");o(rj,"indentString");o(oD,"generateNextLine");o(qAe,"testImplicitResolving");o(Tw,"isWhitespace");o(u2,"isPrintable");o(nj,"isNsCharOrWhitespace");o(ij,"isPlainSafe");o(YAe,"isPlainSafeFirst");o(XAe,"isPlainSafeLast");o(s2,"codePointAt");o(Nj,"needIndentIndicator");Mj=1,lD=2,Ij=3,Oj=4,im=5;o(jAe,"chooseScalarStyle");o(KAe,"writeScalar");o(aj,"blockHeader");o(sj,"dropEndingNewline");o(QAe,"foldString");o(oj,"foldLine");o(ZAe,"escapeString");o(JAe,"writeFlowSequence");o(lj,"writeBlockSequence");o(e8e,"writeFlowMapping");o(t8e,"writeBlockMapping");o(cj,"detectType");o(Au,"writeNode");o(r8e,"getDuplicateReferences");o(cD,"inspectNode");o(n8e,"dump$1");i8e=n8e,a8e={dump:i8e};o(pD,"renamed");lm=fj,cm=Ej.load,okt=Ej.loadAll,lkt=a8e.dump,ckt=pD("safeLoad","load"),ukt=pD("safeLoadAll","loadAll"),hkt=pD("safeDump","dump")});function vD(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}function Gj(t){Id=t}function nn(t,e=""){let r=typeof t=="string"?t:t.source,n={replace:o((i,a)=>{let s=typeof a=="string"?a:a.source;return s=s.replace(ts.caret,"$1"),r=r.replace(i,s),n},"replace"),getRegex:o(()=>new RegExp(r,e),"getRegex")};return n}function pc(t,e){if(e){if(ts.escapeTest.test(t))return t.replace(ts.escapeReplace,Bj)}else if(ts.escapeTestNoEncode.test(t))return t.replace(ts.escapeReplaceNoEncode,Bj);return t}function Fj(t){try{t=encodeURI(t).replace(ts.percentDecode,"%")}catch{return null}return t}function $j(t,e){let r=t.replace(ts.findPipe,(a,s,l)=>{let u=!1,h=s;for(;--h>=0&&l[h]==="\\";)u=!u;return u?"|":" |"}),n=r.split(ts.splitPipe),i=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length{let s=a.match(r.other.beginningSpace);if(s===null)return a;let[l]=s;return l.length>=i.length?a.slice(i.length):a}).join(` +`)}function Jr(t,e){return Md.parse(t,e)}var Id,d2,ts,s8e,o8e,l8e,m2,c8e,xD,Vj,Uj,u8e,bD,h8e,wD,f8e,d8e,Aw,TD,p8e,Hj,m8e,kD,Pj,g8e,y8e,v8e,x8e,Wj,b8e,_w,ED,qj,w8e,Yj,T8e,k8e,E8e,Xj,S8e,C8e,jj,A8e,_8e,D8e,L8e,R8e,N8e,M8e,Cw,I8e,Kj,Qj,O8e,SD,P8e,gD,B8e,Sw,h2,F8e,Bj,hm,Al,fm,p2,_l,um,yD,Md,dkt,pkt,mkt,gkt,ykt,vkt,xkt,Zj=N(()=>{"use strict";o(vD,"_getDefaults");Id=vD();o(Gj,"changeDefaults");d2={exec:o(()=>null,"exec")};o(nn,"edit");ts={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:o(t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),"listItemRegex"),nextBulletRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),"nextBulletRegex"),hrRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),"hrRegex"),fencesBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),"fencesBeginRegex"),headingBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),"headingBeginRegex"),htmlBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i"),"htmlBeginRegex")},s8e=/^(?:[ \t]*(?:\n|$))+/,o8e=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,l8e=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,m2=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,c8e=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,xD=/(?:[*+-]|\d{1,9}[.)])/,Vj=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Uj=nn(Vj).replace(/bull/g,xD).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),u8e=nn(Vj).replace(/bull/g,xD).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),bD=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,h8e=/^[^\n]+/,wD=/(?!\s*\])(?:\\.|[^\[\]\\])+/,f8e=nn(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",wD).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),d8e=nn(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,xD).getRegex(),Aw="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",TD=/|$))/,p8e=nn("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",TD).replace("tag",Aw).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Hj=nn(bD).replace("hr",m2).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Aw).getRegex(),m8e=nn(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Hj).getRegex(),kD={blockquote:m8e,code:o8e,def:f8e,fences:l8e,heading:c8e,hr:m2,html:p8e,lheading:Uj,list:d8e,newline:s8e,paragraph:Hj,table:d2,text:h8e},Pj=nn("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",m2).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Aw).getRegex(),g8e={...kD,lheading:u8e,table:Pj,paragraph:nn(bD).replace("hr",m2).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",Pj).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Aw).getRegex()},y8e={...kD,html:nn(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",TD).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:d2,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:nn(bD).replace("hr",m2).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",Uj).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},v8e=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,x8e=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Wj=/^( {2,}|\\)\n(?!\s*$)/,b8e=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,Xj=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,S8e=nn(Xj,"u").replace(/punct/g,_w).getRegex(),C8e=nn(Xj,"u").replace(/punct/g,Yj).getRegex(),jj="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",A8e=nn(jj,"gu").replace(/notPunctSpace/g,qj).replace(/punctSpace/g,ED).replace(/punct/g,_w).getRegex(),_8e=nn(jj,"gu").replace(/notPunctSpace/g,k8e).replace(/punctSpace/g,T8e).replace(/punct/g,Yj).getRegex(),D8e=nn("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,qj).replace(/punctSpace/g,ED).replace(/punct/g,_w).getRegex(),L8e=nn(/\\(punct)/,"gu").replace(/punct/g,_w).getRegex(),R8e=nn(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),N8e=nn(TD).replace("(?:-->|$)","-->").getRegex(),M8e=nn("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",N8e).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Cw=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,I8e=nn(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label",Cw).replace("href",/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Kj=nn(/^!?\[(label)\]\[(ref)\]/).replace("label",Cw).replace("ref",wD).getRegex(),Qj=nn(/^!?\[(ref)\](?:\[\])?/).replace("ref",wD).getRegex(),O8e=nn("reflink|nolink(?!\\()","g").replace("reflink",Kj).replace("nolink",Qj).getRegex(),SD={_backpedal:d2,anyPunctuation:L8e,autolink:R8e,blockSkip:E8e,br:Wj,code:x8e,del:d2,emStrongLDelim:S8e,emStrongRDelimAst:A8e,emStrongRDelimUnd:D8e,escape:v8e,link:I8e,nolink:Qj,punctuation:w8e,reflink:Kj,reflinkSearch:O8e,tag:M8e,text:b8e,url:d2},P8e={...SD,link:nn(/^!?\[(label)\]\((.*?)\)/).replace("label",Cw).getRegex(),reflink:nn(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Cw).getRegex()},gD={...SD,emStrongRDelimAst:_8e,emStrongLDelim:C8e,url:nn(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},Bj=o(t=>F8e[t],"getEscapeReplacement");o(pc,"escape");o(Fj,"cleanUrl");o($j,"splitCells");o(f2,"rtrim");o($8e,"findClosingBracket");o(zj,"outputLink");o(z8e,"indentCodeCompensation");hm=class{static{o(this,"_Tokenizer")}options;rules;lexer;constructor(e){this.options=e||Id}space(e){let r=this.rules.block.newline.exec(e);if(r&&r[0].length>0)return{type:"space",raw:r[0]}}code(e){let r=this.rules.block.code.exec(e);if(r){let n=r[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:r[0],codeBlockStyle:"indented",text:this.options.pedantic?n:f2(n,` +`)}}}fences(e){let r=this.rules.block.fences.exec(e);if(r){let n=r[0],i=z8e(n,r[3]||"",this.rules);return{type:"code",raw:n,lang:r[2]?r[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):r[2],text:i}}}heading(e){let r=this.rules.block.heading.exec(e);if(r){let n=r[2].trim();if(this.rules.other.endingHash.test(n)){let i=f2(n,"#");(this.options.pedantic||!i||this.rules.other.endingSpaceChar.test(i))&&(n=i.trim())}return{type:"heading",raw:r[0],depth:r[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let r=this.rules.block.hr.exec(e);if(r)return{type:"hr",raw:f2(r[0],` +`)}}blockquote(e){let r=this.rules.block.blockquote.exec(e);if(r){let n=f2(r[0],` +`).split(` +`),i="",a="",s=[];for(;n.length>0;){let l=!1,u=[],h;for(h=0;h1,a={type:"list",raw:"",ordered:i,start:i?+n.slice(0,-1):"",loose:!1,items:[]};n=i?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=i?n:"[*+-]");let s=this.rules.other.listItemRegex(n),l=!1;for(;e;){let h=!1,f="",d="";if(!(r=s.exec(e))||this.rules.block.hr.test(e))break;f=r[0],e=e.substring(f.length);let p=r[2].split(` +`,1)[0].replace(this.rules.other.listReplaceTabs,b=>" ".repeat(3*b.length)),m=e.split(` +`,1)[0],g=!p.trim(),y=0;if(this.options.pedantic?(y=2,d=p.trimStart()):g?y=r[1].length+1:(y=r[2].search(this.rules.other.nonSpaceChar),y=y>4?1:y,d=p.slice(y),y+=r[1].length),g&&this.rules.other.blankLine.test(m)&&(f+=m+` +`,e=e.substring(m.length+1),h=!0),!h){let b=this.rules.other.nextBulletRegex(y),w=this.rules.other.hrRegex(y),C=this.rules.other.fencesBeginRegex(y),T=this.rules.other.headingBeginRegex(y),E=this.rules.other.htmlBeginRegex(y);for(;e;){let A=e.split(` +`,1)[0],S;if(m=A,this.options.pedantic?(m=m.replace(this.rules.other.listReplaceNesting," "),S=m):S=m.replace(this.rules.other.tabCharGlobal," "),C.test(m)||T.test(m)||E.test(m)||b.test(m)||w.test(m))break;if(S.search(this.rules.other.nonSpaceChar)>=y||!m.trim())d+=` +`+S.slice(y);else{if(g||p.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||C.test(p)||T.test(p)||w.test(p))break;d+=` +`+m}!g&&!m.trim()&&(g=!0),f+=A+` +`,e=e.substring(A.length+1),p=S.slice(y)}}a.loose||(l?a.loose=!0:this.rules.other.doubleBlankLine.test(f)&&(l=!0));let v=null,x;this.options.gfm&&(v=this.rules.other.listIsTask.exec(d),v&&(x=v[0]!=="[ ] ",d=d.replace(this.rules.other.listReplaceTask,""))),a.items.push({type:"list_item",raw:f,task:!!v,checked:x,loose:!1,text:d,tokens:[]}),a.raw+=f}let u=a.items.at(-1);if(u)u.raw=u.raw.trimEnd(),u.text=u.text.trimEnd();else return;a.raw=a.raw.trimEnd();for(let h=0;hp.type==="space"),d=f.length>0&&f.some(p=>this.rules.other.anyLine.test(p.raw));a.loose=d}if(a.loose)for(let h=0;h({text:u,tokens:this.lexer.inline(u),header:!1,align:s.align[h]})));return s}}lheading(e){let r=this.rules.block.lheading.exec(e);if(r)return{type:"heading",raw:r[0],depth:r[2].charAt(0)==="="?1:2,text:r[1],tokens:this.lexer.inline(r[1])}}paragraph(e){let r=this.rules.block.paragraph.exec(e);if(r){let n=r[1].charAt(r[1].length-1)===` +`?r[1].slice(0,-1):r[1];return{type:"paragraph",raw:r[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let r=this.rules.block.text.exec(e);if(r)return{type:"text",raw:r[0],text:r[0],tokens:this.lexer.inline(r[0])}}escape(e){let r=this.rules.inline.escape.exec(e);if(r)return{type:"escape",raw:r[0],text:r[1]}}tag(e){let r=this.rules.inline.tag.exec(e);if(r)return!this.lexer.state.inLink&&this.rules.other.startATag.test(r[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(r[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(r[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(r[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:r[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:r[0]}}link(e){let r=this.rules.inline.link.exec(e);if(r){let n=r[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let s=f2(n.slice(0,-1),"\\");if((n.length-s.length)%2===0)return}else{let s=$8e(r[2],"()");if(s>-1){let u=(r[0].indexOf("!")===0?5:4)+r[1].length+s;r[2]=r[2].substring(0,s),r[0]=r[0].substring(0,u).trim(),r[3]=""}}let i=r[2],a="";if(this.options.pedantic){let s=this.rules.other.pedanticHrefTitle.exec(i);s&&(i=s[1],a=s[3])}else a=r[3]?r[3].slice(1,-1):"";return i=i.trim(),this.rules.other.startAngleBracket.test(i)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?i=i.slice(1):i=i.slice(1,-1)),zj(r,{href:i&&i.replace(this.rules.inline.anyPunctuation,"$1"),title:a&&a.replace(this.rules.inline.anyPunctuation,"$1")},r[0],this.lexer,this.rules)}}reflink(e,r){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let i=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),a=r[i.toLowerCase()];if(!a){let s=n[0].charAt(0);return{type:"text",raw:s,text:s}}return zj(n,a,n[0],this.lexer,this.rules)}}emStrong(e,r,n=""){let i=this.rules.inline.emStrongLDelim.exec(e);if(!i||i[3]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(i[1]||i[2]||"")||!n||this.rules.inline.punctuation.exec(n)){let s=[...i[0]].length-1,l,u,h=s,f=0,d=i[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(d.lastIndex=0,r=r.slice(-1*e.length+s);(i=d.exec(r))!=null;){if(l=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!l)continue;if(u=[...l].length,i[3]||i[4]){h+=u;continue}else if((i[5]||i[6])&&s%3&&!((s+u)%3)){f+=u;continue}if(h-=u,h>0)continue;u=Math.min(u,u+h+f);let p=[...i[0]][0].length,m=e.slice(0,s+i.index+p+u);if(Math.min(s,u)%2){let y=m.slice(1,-1);return{type:"em",raw:m,text:y,tokens:this.lexer.inlineTokens(y)}}let g=m.slice(2,-2);return{type:"strong",raw:m,text:g,tokens:this.lexer.inlineTokens(g)}}}}codespan(e){let r=this.rules.inline.code.exec(e);if(r){let n=r[2].replace(this.rules.other.newLineCharGlobal," "),i=this.rules.other.nonSpaceChar.test(n),a=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return i&&a&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:r[0],text:n}}}br(e){let r=this.rules.inline.br.exec(e);if(r)return{type:"br",raw:r[0]}}del(e){let r=this.rules.inline.del.exec(e);if(r)return{type:"del",raw:r[0],text:r[2],tokens:this.lexer.inlineTokens(r[2])}}autolink(e){let r=this.rules.inline.autolink.exec(e);if(r){let n,i;return r[2]==="@"?(n=r[1],i="mailto:"+n):(n=r[1],i=n),{type:"link",raw:r[0],text:n,href:i,tokens:[{type:"text",raw:n,text:n}]}}}url(e){let r;if(r=this.rules.inline.url.exec(e)){let n,i;if(r[2]==="@")n=r[0],i="mailto:"+n;else{let a;do a=r[0],r[0]=this.rules.inline._backpedal.exec(r[0])?.[0]??"";while(a!==r[0]);n=r[0],r[1]==="www."?i="http://"+r[0]:i=r[0]}return{type:"link",raw:r[0],text:n,href:i,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(e){let r=this.rules.inline.text.exec(e);if(r){let n=this.lexer.state.inRawBlock;return{type:"text",raw:r[0],text:r[0],escaped:n}}}},Al=class t{static{o(this,"_Lexer")}tokens;options;state;tokenizer;inlineQueue;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||Id,this.options.tokenizer=this.options.tokenizer||new hm,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let r={other:ts,block:Sw.normal,inline:h2.normal};this.options.pedantic?(r.block=Sw.pedantic,r.inline=h2.pedantic):this.options.gfm&&(r.block=Sw.gfm,this.options.breaks?r.inline=h2.breaks:r.inline=h2.gfm),this.tokenizer.rules=r}static get rules(){return{block:Sw,inline:h2}}static lex(e,r){return new t(r).lex(e)}static lexInline(e,r){return new t(r).inlineTokens(e)}lex(e){e=e.replace(ts.carriageReturn,` +`),this.blockTokens(e,this.tokens);for(let r=0;r(i=s.call({lexer:this},e,r))?(e=e.substring(i.raw.length),r.push(i),!0):!1))continue;if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length);let s=r.at(-1);i.raw.length===1&&s!==void 0?s.raw+=` +`:r.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=` +`+i.raw,s.text+=` +`+i.text,this.inlineQueue.at(-1).src=s.text):r.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=` +`+i.raw,s.text+=` +`+i.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title});continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),r.push(i);continue}let a=e;if(this.options.extensions?.startBlock){let s=1/0,l=e.slice(1),u;this.options.extensions.startBlock.forEach(h=>{u=h.call({lexer:this},l),typeof u=="number"&&u>=0&&(s=Math.min(s,u))}),s<1/0&&s>=0&&(a=e.substring(0,s+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let s=r.at(-1);n&&s?.type==="paragraph"?(s.raw+=` +`+i.raw,s.text+=` +`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):r.push(i),n=a.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="text"?(s.raw+=` +`+i.raw,s.text+=` +`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):r.push(i);continue}if(e){let s="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,r}inline(e,r=[]){return this.inlineQueue.push({src:e,tokens:r}),r}inlineTokens(e,r=[]){let n=e,i=null;if(this.tokens.links){let l=Object.keys(this.tokens.links);if(l.length>0)for(;(i=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)l.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(n=n.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(i=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)n=n.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;(i=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,i.index)+"++"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let a=!1,s="";for(;e;){a||(s=""),a=!1;let l;if(this.options.extensions?.inline?.some(h=>(l=h.call({lexer:this},e,r))?(e=e.substring(l.raw.length),r.push(l),!0):!1))continue;if(l=this.tokenizer.escape(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.tag(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.link(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(l.raw.length);let h=r.at(-1);l.type==="text"&&h?.type==="text"?(h.raw+=l.raw,h.text+=l.text):r.push(l);continue}if(l=this.tokenizer.emStrong(e,n,s)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.codespan(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.br(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.del(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.autolink(e)){e=e.substring(l.raw.length),r.push(l);continue}if(!this.state.inLink&&(l=this.tokenizer.url(e))){e=e.substring(l.raw.length),r.push(l);continue}let u=e;if(this.options.extensions?.startInline){let h=1/0,f=e.slice(1),d;this.options.extensions.startInline.forEach(p=>{d=p.call({lexer:this},f),typeof d=="number"&&d>=0&&(h=Math.min(h,d))}),h<1/0&&h>=0&&(u=e.substring(0,h+1))}if(l=this.tokenizer.inlineText(u)){e=e.substring(l.raw.length),l.raw.slice(-1)!=="_"&&(s=l.raw.slice(-1)),a=!0;let h=r.at(-1);h?.type==="text"?(h.raw+=l.raw,h.text+=l.text):r.push(l);continue}if(e){let h="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(h);break}else throw new Error(h)}}return r}},fm=class{static{o(this,"_Renderer")}options;parser;constructor(e){this.options=e||Id}space(e){return""}code({text:e,lang:r,escaped:n}){let i=(r||"").match(ts.notSpaceStart)?.[0],a=e.replace(ts.endingNewline,"")+` +`;return i?'
'+(n?a:pc(a,!0))+`
+`:"
"+(n?a:pc(a,!0))+`
+`}blockquote({tokens:e}){return`
+${this.parser.parse(e)}
+`}html({text:e}){return e}heading({tokens:e,depth:r}){return`${this.parser.parseInline(e)} +`}hr(e){return`
+`}list(e){let r=e.ordered,n=e.start,i="";for(let l=0;l +`+i+" +`}listitem(e){let r="";if(e.task){let n=this.checkbox({checked:!!e.checked});e.loose?e.tokens[0]?.type==="paragraph"?(e.tokens[0].text=n+" "+e.tokens[0].text,e.tokens[0].tokens&&e.tokens[0].tokens.length>0&&e.tokens[0].tokens[0].type==="text"&&(e.tokens[0].tokens[0].text=n+" "+pc(e.tokens[0].tokens[0].text),e.tokens[0].tokens[0].escaped=!0)):e.tokens.unshift({type:"text",raw:n+" ",text:n+" ",escaped:!0}):r+=n+" "}return r+=this.parser.parse(e.tokens,!!e.loose),`
  • ${r}
  • +`}checkbox({checked:e}){return"'}paragraph({tokens:e}){return`

    ${this.parser.parseInline(e)}

    +`}table(e){let r="",n="";for(let a=0;a${i}`),`
    + +`+r+` +`+i+`
    +`}tablerow({text:e}){return` +${e} +`}tablecell(e){let r=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+r+` +`}strong({tokens:e}){return`${this.parser.parseInline(e)}`}em({tokens:e}){return`${this.parser.parseInline(e)}`}codespan({text:e}){return`${pc(e,!0)}`}br(e){return"
    "}del({tokens:e}){return`${this.parser.parseInline(e)}`}link({href:e,title:r,tokens:n}){let i=this.parser.parseInline(n),a=Fj(e);if(a===null)return i;e=a;let s='
    ",s}image({href:e,title:r,text:n}){let i=Fj(e);if(i===null)return pc(n);e=i;let a=`${n}{let l=a[s].flat(1/0);n=n.concat(this.walkTokens(l,r))}):a.tokens&&(n=n.concat(this.walkTokens(a.tokens,r)))}}return n}use(...e){let r=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let i={...n};if(i.async=this.defaults.async||i.async||!1,n.extensions&&(n.extensions.forEach(a=>{if(!a.name)throw new Error("extension name required");if("renderer"in a){let s=r.renderers[a.name];s?r.renderers[a.name]=function(...l){let u=a.renderer.apply(this,l);return u===!1&&(u=s.apply(this,l)),u}:r.renderers[a.name]=a.renderer}if("tokenizer"in a){if(!a.level||a.level!=="block"&&a.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let s=r[a.level];s?s.unshift(a.tokenizer):r[a.level]=[a.tokenizer],a.start&&(a.level==="block"?r.startBlock?r.startBlock.push(a.start):r.startBlock=[a.start]:a.level==="inline"&&(r.startInline?r.startInline.push(a.start):r.startInline=[a.start]))}"childTokens"in a&&a.childTokens&&(r.childTokens[a.name]=a.childTokens)}),i.extensions=r),n.renderer){let a=this.defaults.renderer||new fm(this.defaults);for(let s in n.renderer){if(!(s in a))throw new Error(`renderer '${s}' does not exist`);if(["options","parser"].includes(s))continue;let l=s,u=n.renderer[l],h=a[l];a[l]=(...f)=>{let d=u.apply(a,f);return d===!1&&(d=h.apply(a,f)),d||""}}i.renderer=a}if(n.tokenizer){let a=this.defaults.tokenizer||new hm(this.defaults);for(let s in n.tokenizer){if(!(s in a))throw new Error(`tokenizer '${s}' does not exist`);if(["options","rules","lexer"].includes(s))continue;let l=s,u=n.tokenizer[l],h=a[l];a[l]=(...f)=>{let d=u.apply(a,f);return d===!1&&(d=h.apply(a,f)),d}}i.tokenizer=a}if(n.hooks){let a=this.defaults.hooks||new um;for(let s in n.hooks){if(!(s in a))throw new Error(`hook '${s}' does not exist`);if(["options","block"].includes(s))continue;let l=s,u=n.hooks[l],h=a[l];um.passThroughHooks.has(s)?a[l]=f=>{if(this.defaults.async)return Promise.resolve(u.call(a,f)).then(p=>h.call(a,p));let d=u.call(a,f);return h.call(a,d)}:a[l]=(...f)=>{let d=u.apply(a,f);return d===!1&&(d=h.apply(a,f)),d}}i.hooks=a}if(n.walkTokens){let a=this.defaults.walkTokens,s=n.walkTokens;i.walkTokens=function(l){let u=[];return u.push(s.call(this,l)),a&&(u=u.concat(a.call(this,l))),u}}this.defaults={...this.defaults,...i}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,r){return Al.lex(e,r??this.defaults)}parser(e,r){return _l.parse(e,r??this.defaults)}parseMarkdown(e){return o((n,i)=>{let a={...i},s={...this.defaults,...a},l=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&a.async===!1)return l(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof n>"u"||n===null)return l(new Error("marked(): input parameter is undefined or null"));if(typeof n!="string")return l(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));s.hooks&&(s.hooks.options=s,s.hooks.block=e);let u=s.hooks?s.hooks.provideLexer():e?Al.lex:Al.lexInline,h=s.hooks?s.hooks.provideParser():e?_l.parse:_l.parseInline;if(s.async)return Promise.resolve(s.hooks?s.hooks.preprocess(n):n).then(f=>u(f,s)).then(f=>s.hooks?s.hooks.processAllTokens(f):f).then(f=>s.walkTokens?Promise.all(this.walkTokens(f,s.walkTokens)).then(()=>f):f).then(f=>h(f,s)).then(f=>s.hooks?s.hooks.postprocess(f):f).catch(l);try{s.hooks&&(n=s.hooks.preprocess(n));let f=u(n,s);s.hooks&&(f=s.hooks.processAllTokens(f)),s.walkTokens&&this.walkTokens(f,s.walkTokens);let d=h(f,s);return s.hooks&&(d=s.hooks.postprocess(d)),d}catch(f){return l(f)}},"parse")}onError(e,r){return n=>{if(n.message+=` +Please report this to https://github.com/markedjs/marked.`,e){let i="

    An error occurred:

    "+pc(n.message+"",!0)+"
    ";return r?Promise.resolve(i):i}if(r)return Promise.reject(n);throw n}}},Md=new yD;o(Jr,"marked");Jr.options=Jr.setOptions=function(t){return Md.setOptions(t),Jr.defaults=Md.defaults,Gj(Jr.defaults),Jr};Jr.getDefaults=vD;Jr.defaults=Id;Jr.use=function(...t){return Md.use(...t),Jr.defaults=Md.defaults,Gj(Jr.defaults),Jr};Jr.walkTokens=function(t,e){return Md.walkTokens(t,e)};Jr.parseInline=Md.parseInline;Jr.Parser=_l;Jr.parser=_l.parse;Jr.Renderer=fm;Jr.TextRenderer=p2;Jr.Lexer=Al;Jr.lexer=Al.lex;Jr.Tokenizer=hm;Jr.Hooks=um;Jr.parse=Jr;dkt=Jr.options,pkt=Jr.setOptions,mkt=Jr.use,gkt=Jr.walkTokens,ykt=Jr.parseInline,vkt=_l.parse,xkt=Al.lex});function G8e(t,{markdownAutoWrap:e}){let n=t.replace(//g,` +`).replace(/\n{2,}/g,` +`),i=B4(n);return e===!1?i.replace(/ /g," "):i}function Jj(t,e={}){let r=G8e(t,e),n=Jr.lexer(r),i=[[]],a=0;function s(l,u="normal"){l.type==="text"?l.text.split(` +`).forEach((f,d)=>{d!==0&&(a++,i.push([])),f.split(" ").forEach(p=>{p=p.replace(/'/g,"'"),p&&i[a].push({content:p,type:u})})}):l.type==="strong"||l.type==="em"?l.tokens.forEach(h=>{s(h,l.type)}):l.type==="html"&&i[a].push({content:l.text,type:"normal"})}return o(s,"processNode"),n.forEach(l=>{l.type==="paragraph"?l.tokens?.forEach(u=>{s(u)}):l.type==="html"&&i[a].push({content:l.text,type:"normal"})}),i}function eK(t,{markdownAutoWrap:e}={}){let r=Jr.lexer(t);function n(i){return i.type==="text"?e===!1?i.text.replace(/\n */g,"
    ").replace(/ /g," "):i.text.replace(/\n */g,"
    "):i.type==="strong"?`${i.tokens?.map(n).join("")}`:i.type==="em"?`${i.tokens?.map(n).join("")}`:i.type==="paragraph"?`

    ${i.tokens?.map(n).join("")}

    `:i.type==="space"?"":i.type==="html"?`${i.text}`:i.type==="escape"?i.text:`Unsupported markdown: ${i.type}`}return o(n,"output"),r.map(n).join("")}var tK=N(()=>{"use strict";Zj();PC();o(G8e,"preprocessMarkdown");o(Jj,"markdownToLines");o(eK,"markdownToHTML")});function V8e(t){return Intl.Segmenter?[...new Intl.Segmenter().segment(t)].map(e=>e.segment):[...t]}function U8e(t,e){let r=V8e(e.content);return rK(t,[],r,e.type)}function rK(t,e,r,n){if(r.length===0)return[{content:e.join(""),type:n},{content:"",type:n}];let[i,...a]=r,s=[...e,i];return t([{content:s.join(""),type:n}])?rK(t,s,a,n):(e.length===0&&i&&(e.push(i),r.shift()),[{content:e.join(""),type:n},{content:r.join(""),type:n}])}function nK(t,e){if(t.some(({content:r})=>r.includes(` +`)))throw new Error("splitLineToFitWidth does not support newlines in the line");return CD(t,e)}function CD(t,e,r=[],n=[]){if(t.length===0)return n.length>0&&r.push(n),r.length>0?r:[];let i="";t[0].content===" "&&(i=" ",t.shift());let a=t.shift()??{content:" ",type:"normal"},s=[...n];if(i!==""&&s.push({content:i,type:"normal"}),s.push(a),e(s))return CD(t,e,r,s);if(n.length>0)r.push(n),t.unshift(a);else if(a.content){let[l,u]=U8e(e,a);r.push([l]),u.content&&t.unshift(u)}return CD(t,e,r)}var iK=N(()=>{"use strict";o(V8e,"splitTextToChars");o(U8e,"splitWordToFitWidth");o(rK,"splitWordToFitWidthRecursion");o(nK,"splitLineToFitWidth");o(CD,"splitLineToFitWidthRecursion")});function aK(t,e){e&&t.attr("style",e)}async function H8e(t,e,r,n,i=!1){let a=t.append("foreignObject");a.attr("width",`${10*r}px`),a.attr("height",`${10*r}px`);let s=a.append("xhtml:div"),l=e.label;e.label&&pi(e.label)&&(l=await mh(e.label.replace(Ze.lineBreakRegex,` +`),me()));let u=e.isNode?"nodeLabel":"edgeLabel",h=s.append("span");h.html(l),aK(h,e.labelStyle),h.attr("class",`${u} ${n}`),aK(s,e.labelStyle),s.style("display","table-cell"),s.style("white-space","nowrap"),s.style("line-height","1.5"),s.style("max-width",r+"px"),s.style("text-align","center"),s.attr("xmlns","http://www.w3.org/1999/xhtml"),i&&s.attr("class","labelBkg");let f=s.node().getBoundingClientRect();return f.width===r&&(s.style("display","table"),s.style("white-space","break-spaces"),s.style("width",r+"px"),f=s.node().getBoundingClientRect()),a.node()}function AD(t,e,r){return t.append("tspan").attr("class","text-outer-tspan").attr("x",0).attr("y",e*r-.1+"em").attr("dy",r+"em")}function W8e(t,e,r){let n=t.append("text"),i=AD(n,1,e);_D(i,r);let a=i.node().getComputedTextLength();return n.remove(),a}function sK(t,e,r){let n=t.append("text"),i=AD(n,1,e);_D(i,[{content:r,type:"normal"}]);let a=i.node()?.getBoundingClientRect();return a&&n.remove(),a}function q8e(t,e,r,n=!1){let a=e.append("g"),s=a.insert("rect").attr("class","background").attr("style","stroke: none"),l=a.append("text").attr("y","-10.1"),u=0;for(let h of r){let f=o(p=>W8e(a,1.1,p)<=t,"checkWidth"),d=f(h)?[h]:nK(h,f);for(let p of d){let m=AD(l,u,1.1);_D(m,p),u++}}if(n){let h=l.node().getBBox(),f=2;return s.attr("x",h.x-f).attr("y",h.y-f).attr("width",h.width+2*f).attr("height",h.height+2*f),a.node()}else return l.node()}function _D(t,e){t.text(""),e.forEach((r,n)=>{let i=t.append("tspan").attr("font-style",r.type==="em"?"italic":"normal").attr("class","text-inner-tspan").attr("font-weight",r.type==="strong"?"bold":"normal");n===0?i.text(r.content):i.text(" "+r.content)})}function DD(t){return t.replace(/fa[bklrs]?:fa-[\w-]+/g,e=>``)}var Hn,to=N(()=>{"use strict";zt();gr();dr();vt();tK();ir();iK();o(aK,"applyStyle");o(H8e,"addHtmlSpan");o(AD,"createTspan");o(W8e,"computeWidthOfText");o(sK,"computeDimensionOfText");o(q8e,"createFormattedText");o(_D,"updateTextContentAndStyles");o(DD,"replaceIconSubstring");Hn=o(async(t,e="",{style:r="",isTitle:n=!1,classes:i="",useHtmlLabels:a=!0,isNode:s=!0,width:l=200,addSvgBackground:u=!1}={},h)=>{if(Y.debug("XYZ createText",e,r,n,i,a,s,"addSvgBackground: ",u),a){let f=eK(e,h),d=DD(na(f)),p=e.replace(/\\\\/g,"\\"),m={isNode:s,label:pi(e)?p:d,labelStyle:r.replace("fill:","color:")};return await H8e(t,m,l,i,u)}else{let f=e.replace(//g,"
    "),d=Jj(f.replace("
    ","
    "),h),p=q8e(l,t,d,e?u:!1);if(s){/stroke:/.exec(r)&&(r=r.replace("stroke:","lineColor:"));let m=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");Ge(p).attr("style",m)}else{let m=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/background:/g,"fill:");Ge(p).select("rect").attr("style",m.replace(/background:/g,"fill:"));let g=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");Ge(p).select("text").attr("style",g)}return p}},"createText")});function Xt(t){let e=t.map((r,n)=>`${n===0?"M":"L"}${r.x},${r.y}`);return e.push("Z"),e.join(" ")}function Fo(t,e,r,n,i,a){let s=[],u=r-t,h=n-e,f=u/a,d=2*Math.PI/f,p=e+h/2;for(let m=0;m<=50;m++){let g=m/50,y=t+g*u,v=p+i*Math.sin(d*(y-t));s.push({x:y,y:v})}return s}function Lw(t,e,r,n,i,a){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;d{"use strict";to();zt();dr();Ya();gr();ir();pt=o(async(t,e,r)=>{let n,i=e.useHtmlLabels||fr(me()?.htmlLabels);r?n=r:n="node default";let a=t.insert("g").attr("class",n).attr("id",e.domId||e.id),s=a.insert("g").attr("class","label").attr("style",$n(e.labelStyle)),l;e.label===void 0?l="":l=typeof e.label=="string"?e.label:e.label[0];let u=await Hn(s,Tr(na(l),me()),{useHtmlLabels:i,width:e.width||me().flowchart?.wrappingWidth,cssClasses:"markdown-node-label",style:e.labelStyle,addSvgBackground:!!e.icon||!!e.img}),h=u.getBBox(),f=(e?.padding??0)/2;if(i){let d=u.children[0],p=Ge(u),m=d.getElementsByTagName("img");if(m){let g=l.replace(/]*>/g,"").trim()==="";await Promise.all([...m].map(y=>new Promise(v=>{function x(){if(y.style.display="flex",y.style.flexDirection="column",g){let b=me().fontSize?me().fontSize:window.getComputedStyle(document.body).fontSize,w=5,[C=or.fontSize]=Bo(b),T=C*w+"px";y.style.minWidth=T,y.style.maxWidth=T}else y.style.width="100%";v(y)}o(x,"setupImage"),setTimeout(()=>{y.complete&&x()}),y.addEventListener("error",x),y.addEventListener("load",x)})))}h=d.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}return i?s.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"):s.attr("transform","translate(0, "+-h.height/2+")"),e.centerLabel&&s.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"),s.insert("rect",":first-child"),{shapeSvg:a,bbox:h,halfPadding:f,label:s}},"labelHelper"),Dw=o(async(t,e,r)=>{let n=r.useHtmlLabels||fr(me()?.flowchart?.htmlLabels),i=t.insert("g").attr("class","label").attr("style",r.labelStyle||""),a=await Hn(i,Tr(na(e),me()),{useHtmlLabels:n,width:r.width||me()?.flowchart?.wrappingWidth,style:r.labelStyle,addSvgBackground:!!r.icon||!!r.img}),s=a.getBBox(),l=r.padding/2;if(fr(me()?.flowchart?.htmlLabels)){let u=a.children[0],h=Ge(a);s=u.getBoundingClientRect(),h.attr("width",s.width),h.attr("height",s.height)}return n?i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"):i.attr("transform","translate(0, "+-s.height/2+")"),r.centerLabel&&i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.insert("rect",":first-child"),{shapeSvg:t,bbox:s,halfPadding:l,label:i}},"insertLabel"),je=o((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds"),ht=o((t,e)=>(t.look==="handDrawn"?"rough-node":"node")+" "+t.cssClasses+" "+(e||""),"getNodeClasses");o(Xt,"createPathFromPoints");o(Fo,"generateFullSineWavePoints");o(Lw,"generateCirclePoints")});function Y8e(t,e){return t.intersect(e)}var oK,lK=N(()=>{"use strict";o(Y8e,"intersectNode");oK=Y8e});function X8e(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,l=a-n.y,u=Math.sqrt(e*e*l*l+r*r*s*s),h=Math.abs(e*r*s/u);n.x{"use strict";o(X8e,"intersectEllipse");Rw=X8e});function j8e(t,e,r){return Rw(t,e,e,r)}var cK,uK=N(()=>{"use strict";LD();o(j8e,"intersectCircle");cK=j8e});function K8e(t,e,r,n){var i,a,s,l,u,h,f,d,p,m,g,y,v,x,b;if(i=e.y-t.y,s=t.x-e.x,u=e.x*t.y-t.x*e.y,p=i*r.x+s*r.y+u,m=i*n.x+s*n.y+u,!(p!==0&&m!==0&&hK(p,m))&&(a=n.y-r.y,l=r.x-n.x,h=n.x*r.y-r.x*n.y,f=a*t.x+l*t.y+h,d=a*e.x+l*e.y+h,!(f!==0&&d!==0&&hK(f,d))&&(g=i*l-a*s,g!==0)))return y=Math.abs(g/2),v=s*h-l*u,x=v<0?(v-y)/g:(v+y)/g,v=a*u-i*h,b=v<0?(v-y)/g:(v+y)/g,{x,y:b}}function hK(t,e){return t*e>0}var fK,dK=N(()=>{"use strict";o(K8e,"intersectLine");o(hK,"sameSign");fK=K8e});function Q8e(t,e,r){let n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(f){s=Math.min(s,f.x),l=Math.min(l,f.y)}):(s=Math.min(s,e.x),l=Math.min(l,e.y));let u=n-t.width/2-s,h=i-t.height/2-l;for(let f=0;f1&&a.sort(function(f,d){let p=f.x-r.x,m=f.y-r.y,g=Math.sqrt(p*p+m*m),y=d.x-r.x,v=d.y-r.y,x=Math.sqrt(y*y+v*v);return g{"use strict";dK();o(Q8e,"intersectPolygon");pK=Q8e});var Z8e,Vh,RD=N(()=>{"use strict";Z8e=o((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2,u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=a===0?0:l*i/a,h=l):(i<0&&(s=-s),u=s,h=i===0?0:s*a/i),{x:r+u,y:n+h}},"intersectRect"),Vh=Z8e});var Ye,Ht=N(()=>{"use strict";lK();uK();LD();mK();RD();Ye={node:oK,circle:cK,ellipse:Rw,polygon:pK,rect:Vh}});var gK,mc,J8e,ND,Qe,Ke,Ut=N(()=>{"use strict";zt();gK=o(t=>{let{handDrawnSeed:e}=me();return{fill:t,hachureAngle:120,hachureGap:4,fillWeight:2,roughness:.7,stroke:t,seed:e}},"solidStateFill"),mc=o(t=>{let e=J8e([...t.cssCompiledStyles||[],...t.cssStyles||[]]);return{stylesMap:e,stylesArray:[...e]}},"compileStyles"),J8e=o(t=>{let e=new Map;return t.forEach(r=>{let[n,i]=r.split(":");e.set(n.trim(),i?.trim())}),e},"styles2Map"),ND=o(t=>t==="color"||t==="font-size"||t==="font-family"||t==="font-weight"||t==="font-style"||t==="text-decoration"||t==="text-align"||t==="text-transform"||t==="line-height"||t==="letter-spacing"||t==="word-spacing"||t==="text-shadow"||t==="text-overflow"||t==="white-space"||t==="word-wrap"||t==="word-break"||t==="overflow-wrap"||t==="hyphens","isLabelStyle"),Qe=o(t=>{let{stylesArray:e}=mc(t),r=[],n=[],i=[],a=[];return e.forEach(s=>{let l=s[0];ND(l)?r.push(s.join(":")+" !important"):(n.push(s.join(":")+" !important"),l.includes("stroke")&&i.push(s.join(":")+" !important"),l==="fill"&&a.push(s.join(":")+" !important"))}),{labelStyles:r.join(";"),nodeStyles:n.join(";"),stylesArray:e,borderStyles:i,backgroundStyles:a}},"styles2String"),Ke=o((t,e)=>{let{themeVariables:r,handDrawnSeed:n}=me(),{nodeBorder:i,mainBkg:a}=r,{stylesMap:s}=mc(t);return Object.assign({roughness:.7,fill:s.get("fill")||a,fillStyle:"hachure",fillWeight:4,hachureGap:5.2,stroke:s.get("stroke")||i,seed:n,strokeWidth:s.get("stroke-width")?.replace("px","")||1.3,fillLineDash:[0,0]},e)},"userNodeOverrides")});function MD(t,e,r){if(t&&t.length){let[n,i]=e,a=Math.PI/180*r,s=Math.cos(a),l=Math.sin(a);for(let u of t){let[h,f]=u;u[0]=(h-n)*s-(f-i)*l+n,u[1]=(h-n)*l+(f-i)*s+i}}}function e_e(t,e){return t[0]===e[0]&&t[1]===e[1]}function t_e(t,e,r,n=1){let i=r,a=Math.max(e,.1),s=t[0]&&t[0][0]&&typeof t[0][0]=="number"?[t]:t,l=[0,0];if(i)for(let h of s)MD(h,l,i);let u=function(h,f,d){let p=[];for(let b of h){let w=[...b];e_e(w[0],w[w.length-1])||w.push([w[0][0],w[0][1]]),w.length>2&&p.push(w)}let m=[];f=Math.max(f,.1);let g=[];for(let b of p)for(let w=0;wb.yminw.ymin?1:b.xw.x?1:b.ymax===w.ymax?0:(b.ymax-w.ymax)/Math.abs(b.ymax-w.ymax)),!g.length)return m;let y=[],v=g[0].ymin,x=0;for(;y.length||g.length;){if(g.length){let b=-1;for(let w=0;wv);w++)b=w;g.splice(0,b+1).forEach(w=>{y.push({s:v,edge:w})})}if(y=y.filter(b=>!(b.edge.ymax<=v)),y.sort((b,w)=>b.edge.x===w.edge.x?0:(b.edge.x-w.edge.x)/Math.abs(b.edge.x-w.edge.x)),(d!==1||x%f==0)&&y.length>1)for(let b=0;b=y.length)break;let C=y[b].edge,T=y[w].edge;m.push([[Math.round(C.x),v],[Math.round(T.x),v]])}v+=d,y.forEach(b=>{b.edge.x=b.edge.x+d*b.edge.islope}),x++}return m}(s,a,n);if(i){for(let h of s)MD(h,l,-i);(function(h,f,d){let p=[];h.forEach(m=>p.push(...m)),MD(p,f,d)})(u,l,-i)}return u}function x2(t,e){var r;let n=e.hachureAngle+90,i=e.hachureGap;i<0&&(i=4*e.strokeWidth),i=Math.round(Math.max(i,.1));let a=1;return e.roughness>=1&&(((r=e.randomizer)===null||r===void 0?void 0:r.next())||Math.random())>.7&&(a=i),t_e(t,i,n,a||1)}function zw(t){let e=t[0],r=t[1];return Math.sqrt(Math.pow(e[0]-r[0],2)+Math.pow(e[1]-r[1],2))}function OD(t,e){return t.type===e}function jD(t){let e=[],r=function(s){let l=new Array;for(;s!=="";)if(s.match(/^([ \t\r\n,]+)/))s=s.substr(RegExp.$1.length);else if(s.match(/^([aAcChHlLmMqQsStTvVzZ])/))l[l.length]={type:r_e,text:RegExp.$1},s=s.substr(RegExp.$1.length);else{if(!s.match(/^(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)/))return[];l[l.length]={type:ID,text:`${parseFloat(RegExp.$1)}`},s=s.substr(RegExp.$1.length)}return l[l.length]={type:yK,text:""},l}(t),n="BOD",i=0,a=r[i];for(;!OD(a,yK);){let s=0,l=[];if(n==="BOD"){if(a.text!=="M"&&a.text!=="m")return jD("M0,0"+t);i++,s=Nw[a.text],n=a.text}else OD(a,ID)?s=Nw[n]:(i++,s=Nw[a.text],n=a.text);if(!(i+sf%2?h+r:h+e);a.push({key:"C",data:u}),e=u[4],r=u[5];break}case"Q":a.push({key:"Q",data:[...l]}),e=l[2],r=l[3];break;case"q":{let u=l.map((h,f)=>f%2?h+r:h+e);a.push({key:"Q",data:u}),e=u[2],r=u[3];break}case"A":a.push({key:"A",data:[...l]}),e=l[5],r=l[6];break;case"a":e+=l[5],r+=l[6],a.push({key:"A",data:[l[0],l[1],l[2],l[3],l[4],e,r]});break;case"H":a.push({key:"H",data:[...l]}),e=l[0];break;case"h":e+=l[0],a.push({key:"H",data:[e]});break;case"V":a.push({key:"V",data:[...l]}),r=l[0];break;case"v":r+=l[0],a.push({key:"V",data:[r]});break;case"S":a.push({key:"S",data:[...l]}),e=l[2],r=l[3];break;case"s":{let u=l.map((h,f)=>f%2?h+r:h+e);a.push({key:"S",data:u}),e=u[2],r=u[3];break}case"T":a.push({key:"T",data:[...l]}),e=l[0],r=l[1];break;case"t":e+=l[0],r+=l[1],a.push({key:"T",data:[e,r]});break;case"Z":case"z":a.push({key:"Z",data:[]}),e=n,r=i}return a}function CK(t){let e=[],r="",n=0,i=0,a=0,s=0,l=0,u=0;for(let{key:h,data:f}of t){switch(h){case"M":e.push({key:"M",data:[...f]}),[n,i]=f,[a,s]=f;break;case"C":e.push({key:"C",data:[...f]}),n=f[4],i=f[5],l=f[2],u=f[3];break;case"L":e.push({key:"L",data:[...f]}),[n,i]=f;break;case"H":n=f[0],e.push({key:"L",data:[n,i]});break;case"V":i=f[0],e.push({key:"L",data:[n,i]});break;case"S":{let d=0,p=0;r==="C"||r==="S"?(d=n+(n-l),p=i+(i-u)):(d=n,p=i),e.push({key:"C",data:[d,p,...f]}),l=f[0],u=f[1],n=f[2],i=f[3];break}case"T":{let[d,p]=f,m=0,g=0;r==="Q"||r==="T"?(m=n+(n-l),g=i+(i-u)):(m=n,g=i);let y=n+2*(m-n)/3,v=i+2*(g-i)/3,x=d+2*(m-d)/3,b=p+2*(g-p)/3;e.push({key:"C",data:[y,v,x,b,d,p]}),l=m,u=g,n=d,i=p;break}case"Q":{let[d,p,m,g]=f,y=n+2*(d-n)/3,v=i+2*(p-i)/3,x=m+2*(d-m)/3,b=g+2*(p-g)/3;e.push({key:"C",data:[y,v,x,b,m,g]}),l=d,u=p,n=m,i=g;break}case"A":{let d=Math.abs(f[0]),p=Math.abs(f[1]),m=f[2],g=f[3],y=f[4],v=f[5],x=f[6];d===0||p===0?(e.push({key:"C",data:[n,i,v,x,v,x]}),n=v,i=x):(n!==v||i!==x)&&(AK(n,i,v,x,d,p,m,g,y).forEach(function(b){e.push({key:"C",data:b})}),n=v,i=x);break}case"Z":e.push({key:"Z",data:[]}),n=a,i=s}r=h}return e}function g2(t,e,r){return[t*Math.cos(r)-e*Math.sin(r),t*Math.sin(r)+e*Math.cos(r)]}function AK(t,e,r,n,i,a,s,l,u,h){let f=(d=s,Math.PI*d/180);var d;let p=[],m=0,g=0,y=0,v=0;if(h)[m,g,y,v]=h;else{[t,e]=g2(t,e,-f),[r,n]=g2(r,n,-f);let L=(t-r)/2,R=(e-n)/2,O=L*L/(i*i)+R*R/(a*a);O>1&&(O=Math.sqrt(O),i*=O,a*=O);let M=i*i,B=a*a,F=M*B-M*R*R-B*L*L,P=M*R*R+B*L*L,z=(l===u?-1:1)*Math.sqrt(Math.abs(F/P));y=z*i*R/a+(t+r)/2,v=z*-a*L/i+(e+n)/2,m=Math.asin(parseFloat(((e-v)/a).toFixed(9))),g=Math.asin(parseFloat(((n-v)/a).toFixed(9))),tg&&(m-=2*Math.PI),!u&&g>m&&(g-=2*Math.PI)}let x=g-m;if(Math.abs(x)>120*Math.PI/180){let L=g,R=r,O=n;g=u&&g>m?m+120*Math.PI/180*1:m+120*Math.PI/180*-1,p=AK(r=y+i*Math.cos(g),n=v+a*Math.sin(g),R,O,i,a,s,0,u,[g,L,y,v])}x=g-m;let b=Math.cos(m),w=Math.sin(m),C=Math.cos(g),T=Math.sin(g),E=Math.tan(x/4),A=4/3*i*E,S=4/3*a*E,_=[t,e],I=[t+A*w,e-S*b],D=[r+A*T,n-S*C],k=[r,n];if(I[0]=2*_[0]-I[0],I[1]=2*_[1]-I[1],h)return[I,D,k].concat(p);{p=[I,D,k].concat(p);let L=[];for(let R=0;R2){let i=[];for(let a=0;a2*Math.PI&&(m=0,g=2*Math.PI);let y=2*Math.PI/u.curveStepCount,v=Math.min(y/2,(g-m)/2),x=kK(v,h,f,d,p,m,g,1,u);if(!u.disableMultiStroke){let b=kK(v,h,f,d,p,m,g,1.5,u);x.push(...b)}return s&&(l?x.push(...Uh(h,f,h+d*Math.cos(m),f+p*Math.sin(m),u),...Uh(h,f,h+d*Math.cos(g),f+p*Math.sin(g),u)):x.push({op:"lineTo",data:[h,f]},{op:"lineTo",data:[h+d*Math.cos(m),f+p*Math.sin(m)]})),{type:"path",ops:x}}function bK(t,e){let r=CK(SK(jD(t))),n=[],i=[0,0],a=[0,0];for(let{key:s,data:l}of r)switch(s){case"M":a=[l[0],l[1]],i=[l[0],l[1]];break;case"L":n.push(...Uh(a[0],a[1],l[0],l[1],e)),a=[l[0],l[1]];break;case"C":{let[u,h,f,d,p,m]=l;n.push(...a_e(u,h,f,d,p,m,a,e)),a=[p,m];break}case"Z":n.push(...Uh(a[0],a[1],i[0],i[1],e)),a=[i[0],i[1]]}return{type:"path",ops:n}}function PD(t,e){let r=[];for(let n of t)if(n.length){let i=e.maxRandomnessOffset||0,a=n.length;if(a>2){r.push({op:"move",data:[n[0][0]+nr(i,e),n[0][1]+nr(i,e)]});for(let s=1;s500?.4:-.0016668*u+1.233334;let f=i.maxRandomnessOffset||0;f*f*100>l&&(f=u/10);let d=f/2,p=.2+.2*LK(i),m=i.bowing*i.maxRandomnessOffset*(n-e)/200,g=i.bowing*i.maxRandomnessOffset*(t-r)/200;m=nr(m,i,h),g=nr(g,i,h);let y=[],v=o(()=>nr(d,i,h),"M"),x=o(()=>nr(f,i,h),"k"),b=i.preserveVertices;return a&&(s?y.push({op:"move",data:[t+(b?0:v()),e+(b?0:v())]}):y.push({op:"move",data:[t+(b?0:nr(f,i,h)),e+(b?0:nr(f,i,h))]})),s?y.push({op:"bcurveTo",data:[m+t+(r-t)*p+v(),g+e+(n-e)*p+v(),m+t+2*(r-t)*p+v(),g+e+2*(n-e)*p+v(),r+(b?0:v()),n+(b?0:v())]}):y.push({op:"bcurveTo",data:[m+t+(r-t)*p+x(),g+e+(n-e)*p+x(),m+t+2*(r-t)*p+x(),g+e+2*(n-e)*p+x(),r+(b?0:x()),n+(b?0:x())]}),y}function Mw(t,e,r){if(!t.length)return[];let n=[];n.push([t[0][0]+nr(e,r),t[0][1]+nr(e,r)]),n.push([t[0][0]+nr(e,r),t[0][1]+nr(e,r)]);for(let i=1;i3){let a=[],s=1-r.curveTightness;i.push({op:"move",data:[t[1][0],t[1][1]]});for(let l=1;l+21&&i.push(l)):i.push(l),i.push(t[e+3])}else{let u=t[e+0],h=t[e+1],f=t[e+2],d=t[e+3],p=Od(u,h,.5),m=Od(h,f,.5),g=Od(f,d,.5),y=Od(p,m,.5),v=Od(m,g,.5),x=Od(y,v,.5);qD([u,p,y,x],0,r,i),qD([x,v,g,d],0,r,i)}var a,s;return i}function o_e(t,e){return $w(t,0,t.length,e)}function $w(t,e,r,n,i){let a=i||[],s=t[e],l=t[r-1],u=0,h=1;for(let f=e+1;fu&&(u=d,h=f)}return Math.sqrt(u)>n?($w(t,e,h+1,n,a),$w(t,h,r,n,a)):(a.length||a.push(s),a.push(l)),a}function BD(t,e=.15,r){let n=[],i=(t.length-1)/3;for(let a=0;a0?$w(n,0,n.length,r):n}var v2,FD,$D,zD,GD,VD,Rs,UD,r_e,ID,yK,Nw,n_e,ro,pm,YD,Iw,XD,Xe,Wt=N(()=>{"use strict";o(MD,"t");o(e_e,"e");o(t_e,"s");o(x2,"n");v2=class{static{o(this,"o")}constructor(e){this.helper=e}fillPolygons(e,r){return this._fillPolygons(e,r)}_fillPolygons(e,r){let n=x2(e,r);return{type:"fillSketch",ops:this.renderLines(n,r)}}renderLines(e,r){let n=[];for(let i of e)n.push(...this.helper.doubleLineOps(i[0][0],i[0][1],i[1][0],i[1][1],r));return n}};o(zw,"a");FD=class extends v2{static{o(this,"h")}fillPolygons(e,r){let n=r.hachureGap;n<0&&(n=4*r.strokeWidth),n=Math.max(n,.1);let i=x2(e,Object.assign({},r,{hachureGap:n})),a=Math.PI/180*r.hachureAngle,s=[],l=.5*n*Math.cos(a),u=.5*n*Math.sin(a);for(let[h,f]of i)zw([h,f])&&s.push([[h[0]-l,h[1]+u],[...f]],[[h[0]+l,h[1]-u],[...f]]);return{type:"fillSketch",ops:this.renderLines(s,r)}}},$D=class extends v2{static{o(this,"r")}fillPolygons(e,r){let n=this._fillPolygons(e,r),i=Object.assign({},r,{hachureAngle:r.hachureAngle+90}),a=this._fillPolygons(e,i);return n.ops=n.ops.concat(a.ops),n}},zD=class{static{o(this,"i")}constructor(e){this.helper=e}fillPolygons(e,r){let n=x2(e,r=Object.assign({},r,{hachureAngle:0}));return this.dotsOnLines(n,r)}dotsOnLines(e,r){let n=[],i=r.hachureGap;i<0&&(i=4*r.strokeWidth),i=Math.max(i,.1);let a=r.fillWeight;a<0&&(a=r.strokeWidth/2);let s=i/4;for(let l of e){let u=zw(l),h=u/i,f=Math.ceil(h)-1,d=u-f*i,p=(l[0][0]+l[1][0])/2-i/4,m=Math.min(l[0][1],l[1][1]);for(let g=0;g{let l=zw(s),u=Math.floor(l/(n+i)),h=(l+i-u*(n+i))/2,f=s[0],d=s[1];f[0]>d[0]&&(f=s[1],d=s[0]);let p=Math.atan((d[1]-f[1])/(d[0]-f[0]));for(let m=0;m{let s=zw(a),l=Math.round(s/(2*r)),u=a[0],h=a[1];u[0]>h[0]&&(u=a[1],h=a[0]);let f=Math.atan((h[1]-u[1])/(h[0]-u[0]));for(let d=0;d2*Math.PI&&(A=0,S=2*Math.PI);let _=(S-A)/b.curveStepCount,I=[];for(let D=A;D<=S;D+=_)I.push([w+T*Math.cos(D),C+E*Math.sin(D)]);return I.push([w+T*Math.cos(S),C+E*Math.sin(S)]),I.push([w,C]),dm([I],b)}(e,r,n,i,a,s,h));return h.stroke!==ro&&f.push(d),this._d("arc",f,h)}curve(e,r){let n=this._o(r),i=[],a=vK(e,n);if(n.fill&&n.fill!==ro)if(n.fillStyle==="solid"){let s=vK(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(s.ops)})}else{let s=[],l=e;if(l.length){let u=typeof l[0][0]=="number"?[l]:l;for(let h of u)h.length<3?s.push(...h):h.length===3?s.push(...BD(EK([h[0],h[0],h[1],h[2]]),10,(1+n.roughness)/2)):s.push(...BD(EK(h),10,(1+n.roughness)/2))}s.length&&i.push(dm([s],n))}return n.stroke!==ro&&i.push(a),this._d("curve",i,n)}polygon(e,r){let n=this._o(r),i=[],a=Ow(e,!0,n);return n.fill&&(n.fillStyle==="solid"?i.push(PD([e],n)):i.push(dm([e],n))),n.stroke!==ro&&i.push(a),this._d("polygon",i,n)}path(e,r){let n=this._o(r),i=[];if(!e)return this._d("path",i,n);e=(e||"").replace(/\n/g," ").replace(/(-\s)/g,"-").replace("/(ss)/g"," ");let a=n.fill&&n.fill!=="transparent"&&n.fill!==ro,s=n.stroke!==ro,l=!!(n.simplification&&n.simplification<1),u=function(f,d,p){let m=CK(SK(jD(f))),g=[],y=[],v=[0,0],x=[],b=o(()=>{x.length>=4&&y.push(...BD(x,d)),x=[]},"i"),w=o(()=>{b(),y.length&&(g.push(y),y=[])},"c");for(let{key:T,data:E}of m)switch(T){case"M":w(),v=[E[0],E[1]],y.push(v);break;case"L":b(),y.push([E[0],E[1]]);break;case"C":if(!x.length){let A=y.length?y[y.length-1]:v;x.push([A[0],A[1]])}x.push([E[0],E[1]]),x.push([E[2],E[3]]),x.push([E[4],E[5]]);break;case"Z":b(),y.push([v[0],v[1]])}if(w(),!p)return g;let C=[];for(let T of g){let E=o_e(T,p);E.length&&C.push(E)}return C}(e,1,l?4-4*(n.simplification||1):(1+n.roughness)/2),h=bK(e,n);if(a)if(n.fillStyle==="solid")if(u.length===1){let f=bK(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(f.ops)})}else i.push(PD(u,n));else i.push(dm(u,n));return s&&(l?u.forEach(f=>{i.push(Ow(f,!1,n))}):i.push(h)),this._d("path",i,n)}opsToPath(e,r){let n="";for(let i of e.ops){let a=typeof r=="number"&&r>=0?i.data.map(s=>+s.toFixed(r)):i.data;switch(i.op){case"move":n+=`M${a[0]} ${a[1]} `;break;case"bcurveTo":n+=`C${a[0]} ${a[1]}, ${a[2]} ${a[3]}, ${a[4]} ${a[5]} `;break;case"lineTo":n+=`L${a[0]} ${a[1]} `}}return n.trim()}toPaths(e){let r=e.sets||[],n=e.options||this.defaultOptions,i=[];for(let a of r){let s=null;switch(a.type){case"path":s={d:this.opsToPath(a),stroke:n.stroke,strokeWidth:n.strokeWidth,fill:ro};break;case"fillPath":s={d:this.opsToPath(a),stroke:ro,strokeWidth:0,fill:n.fill||ro};break;case"fillSketch":s=this.fillSketch(a,n)}s&&i.push(s)}return i}fillSketch(e,r){let n=r.fillWeight;return n<0&&(n=r.strokeWidth/2),{d:this.opsToPath(e),stroke:r.fill||ro,strokeWidth:n,fill:ro}}_mergedShape(e){return e.filter((r,n)=>n===0||r.op!=="move")}},YD=class{static{o(this,"st")}constructor(e,r){this.canvas=e,this.ctx=this.canvas.getContext("2d"),this.gen=new pm(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.ctx,a=e.options.fixedDecimalPlaceDigits;for(let s of r)switch(s.type){case"path":i.save(),i.strokeStyle=n.stroke==="none"?"transparent":n.stroke,i.lineWidth=n.strokeWidth,n.strokeLineDash&&i.setLineDash(n.strokeLineDash),n.strokeLineDashOffset&&(i.lineDashOffset=n.strokeLineDashOffset),this._drawToContext(i,s,a),i.restore();break;case"fillPath":{i.save(),i.fillStyle=n.fill||"";let l=e.shape==="curve"||e.shape==="polygon"||e.shape==="path"?"evenodd":"nonzero";this._drawToContext(i,s,a,l),i.restore();break}case"fillSketch":this.fillSketch(i,s,n)}}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2),e.save(),n.fillLineDash&&e.setLineDash(n.fillLineDash),n.fillLineDashOffset&&(e.lineDashOffset=n.fillLineDashOffset),e.strokeStyle=n.fill||"",e.lineWidth=i,this._drawToContext(e,r,n.fixedDecimalPlaceDigits),e.restore()}_drawToContext(e,r,n,i="nonzero"){e.beginPath();for(let a of r.ops){let s=typeof n=="number"&&n>=0?a.data.map(l=>+l.toFixed(n)):a.data;switch(a.op){case"move":e.moveTo(s[0],s[1]);break;case"bcurveTo":e.bezierCurveTo(s[0],s[1],s[2],s[3],s[4],s[5]);break;case"lineTo":e.lineTo(s[0],s[1])}}r.type==="fillPath"?e.fill(i):e.stroke()}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s),s}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s),s}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s),s}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a),a}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n),n}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n),n}arc(e,r,n,i,a,s,l=!1,u){let h=this.gen.arc(e,r,n,i,a,s,l,u);return this.draw(h),h}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n),n}path(e,r){let n=this.gen.path(e,r);return this.draw(n),n}},Iw="http://www.w3.org/2000/svg",XD=class{static{o(this,"ot")}constructor(e,r){this.svg=e,this.gen=new pm(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.svg.ownerDocument||window.document,a=i.createElementNS(Iw,"g"),s=e.options.fixedDecimalPlaceDigits;for(let l of r){let u=null;switch(l.type){case"path":u=i.createElementNS(Iw,"path"),u.setAttribute("d",this.opsToPath(l,s)),u.setAttribute("stroke",n.stroke),u.setAttribute("stroke-width",n.strokeWidth+""),u.setAttribute("fill","none"),n.strokeLineDash&&u.setAttribute("stroke-dasharray",n.strokeLineDash.join(" ").trim()),n.strokeLineDashOffset&&u.setAttribute("stroke-dashoffset",`${n.strokeLineDashOffset}`);break;case"fillPath":u=i.createElementNS(Iw,"path"),u.setAttribute("d",this.opsToPath(l,s)),u.setAttribute("stroke","none"),u.setAttribute("stroke-width","0"),u.setAttribute("fill",n.fill||""),e.shape!=="curve"&&e.shape!=="polygon"||u.setAttribute("fill-rule","evenodd");break;case"fillSketch":u=this.fillSketch(i,l,n)}u&&a.appendChild(u)}return a}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2);let a=e.createElementNS(Iw,"path");return a.setAttribute("d",this.opsToPath(r,n.fixedDecimalPlaceDigits)),a.setAttribute("stroke",n.fill||""),a.setAttribute("stroke-width",i+""),a.setAttribute("fill","none"),n.fillLineDash&&a.setAttribute("stroke-dasharray",n.fillLineDash.join(" ").trim()),n.fillLineDashOffset&&a.setAttribute("stroke-dashoffset",`${n.fillLineDashOffset}`),a}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}opsToPath(e,r){return this.gen.opsToPath(e,r)}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s)}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s)}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s)}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a)}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n)}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n)}arc(e,r,n,i,a,s,l=!1,u){let h=this.gen.arc(e,r,n,i,a,s,l,u);return this.draw(h)}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n)}path(e,r){let n=this.gen.path(e,r);return this.draw(n)}},Xe={canvas:o((t,e)=>new YD(t,e),"canvas"),svg:o((t,e)=>new XD(t,e),"svg"),generator:o(t=>new pm(t),"generator"),newSeed:o(()=>pm.newSeed(),"newSeed")}});function RK(t,e){let{labelStyles:r}=Qe(e);e.labelStyle=r;let n=ht(e),i=n;n||(i="anchor");let a=t.insert("g").attr("class",i).attr("id",e.domId||e.id),s=1,{cssStyles:l}=e,u=Xe.svg(a),h=Ke(e,{fill:"black",stroke:"none",fillStyle:"solid"});e.look!=="handDrawn"&&(h.roughness=0);let f=u.circle(0,0,s*2,h),d=a.insert(()=>f,":first-child");return d.attr("class","anchor").attr("style",$n(l)),je(e,d),e.intersect=function(p){return Y.info("Circle intersect",e,s,p),Ye.circle(e,s,p)},a}var NK=N(()=>{"use strict";vt();Ft();Ht();Ut();Wt();ir();o(RK,"anchor")});function MK(t,e,r,n,i,a,s){let u=(t+r)/2,h=(e+n)/2,f=Math.atan2(n-e,r-t),d=(r-t)/2,p=(n-e)/2,m=d/i,g=p/a,y=Math.sqrt(m**2+g**2);if(y>1)throw new Error("The given radii are too small to create an arc between the points.");let v=Math.sqrt(1-y**2),x=u+v*a*Math.sin(f)*(s?-1:1),b=h-v*i*Math.cos(f)*(s?-1:1),w=Math.atan2((e-b)/a,(t-x)/i),T=Math.atan2((n-b)/a,(r-x)/i)-w;s&&T<0&&(T+=2*Math.PI),!s&&T>0&&(T-=2*Math.PI);let E=[];for(let A=0;A<20;A++){let S=A/19,_=w+S*T,I=x+i*Math.cos(_),D=b+a*Math.sin(_);E.push({x:I,y:D})}return E}async function IK(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=a.width+e.padding+20,l=a.height+e.padding,u=l/2,h=u/(2.5+l/50),{cssStyles:f}=e,d=[{x:s/2,y:-l/2},{x:-s/2,y:-l/2},...MK(-s/2,-l/2,-s/2,l/2,h,u,!1),{x:s/2,y:l/2},...MK(s/2,l/2,s/2,-l/2,h,u,!0)],p=Xe.svg(i),m=Ke(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=Xt(d),y=p.path(g,m),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",n),v.attr("transform",`translate(${h/2}, 0)`),je(e,v),e.intersect=function(x){return Ye.polygon(e,d,x)},i}var OK=N(()=>{"use strict";Ft();Ht();Ut();Wt();o(MK,"generateArcPoints");o(IK,"bowTieRect")});function La(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(i){return i.x+","+i.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}var _u=N(()=>{"use strict";o(La,"insertPolygonShape")});async function PK(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=a.height+e.padding,l=12,u=a.width+e.padding+l,h=0,f=u,d=-s,p=0,m=[{x:h+l,y:d},{x:f,y:d},{x:f,y:p},{x:h,y:p},{x:h,y:d+l},{x:h+l,y:d}],g,{cssStyles:y}=e;if(e.look==="handDrawn"){let v=Xe.svg(i),x=Ke(e,{}),b=Xt(m),w=v.path(b,x);g=i.insert(()=>w,":first-child").attr("transform",`translate(${-u/2}, ${s/2})`),y&&g.attr("style",y)}else g=La(i,u,s,m);return n&&g.attr("style",n),je(e,g),e.intersect=function(v){return Ye.polygon(e,m,v)},i}var BK=N(()=>{"use strict";Ft();Ht();Ut();Wt();_u();Ft();o(PK,"card")});function FK(t,e){let{nodeStyles:r}=Qe(e);e.label="";let n=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),{cssStyles:i}=e,a=Math.max(28,e.width??0),s=[{x:0,y:a/2},{x:a/2,y:0},{x:0,y:-a/2},{x:-a/2,y:0}],l=Xe.svg(n),u=Ke(e,{});e.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let h=Xt(s),f=l.path(h,u),d=n.insert(()=>f,":first-child");return i&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",i),r&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",r),e.width=28,e.height=28,e.intersect=function(p){return Ye.polygon(e,s,p)},n}var $K=N(()=>{"use strict";Ht();Wt();Ut();Ft();o(FK,"choice")});async function zK(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s}=await pt(t,e,ht(e)),l=a.width/2+s,u,{cssStyles:h}=e;if(e.look==="handDrawn"){let f=Xe.svg(i),d=Ke(e,{}),p=f.circle(0,0,l*2,d);u=i.insert(()=>p,":first-child"),u.attr("class","basic label-container").attr("style",$n(h))}else u=i.insert("circle",":first-child").attr("class","basic label-container").attr("style",n).attr("r",l).attr("cx",0).attr("cy",0);return je(e,u),e.intersect=function(f){return Y.info("Circle intersect",e,l,f),Ye.circle(e,l,f)},i}var GK=N(()=>{"use strict";vt();Ft();Ht();Ut();Wt();ir();o(zK,"circle")});function l_e(t){let e=Math.cos(Math.PI/4),r=Math.sin(Math.PI/4),n=t*2,i={x:n/2*e,y:n/2*r},a={x:-(n/2)*e,y:n/2*r},s={x:-(n/2)*e,y:-(n/2)*r},l={x:n/2*e,y:-(n/2)*r};return`M ${a.x},${a.y} L ${l.x},${l.y} + M ${i.x},${i.y} L ${s.x},${s.y}`}function VK(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r,e.label="";let i=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),a=Math.max(30,e?.width??0),{cssStyles:s}=e,l=Xe.svg(i),u=Ke(e,{});e.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let h=l.circle(0,0,a*2,u),f=l_e(a),d=l.path(f,u),p=i.insert(()=>h,":first-child");return p.insert(()=>d),s&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",s),n&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",n),je(e,p),e.intersect=function(m){return Y.info("crossedCircle intersect",e,{radius:a,point:m}),Ye.circle(e,a,m)},i}var UK=N(()=>{"use strict";vt();Ft();Ut();Wt();Ht();o(l_e,"createLine");o(VK,"crossedCircle")});function Hh(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dw,":first-child").attr("stroke-opacity",0),C.insert(()=>x,":first-child"),C.attr("class","text"),f&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",n),C.attr("transform",`translate(${h}, 0)`),s.attr("transform",`translate(${-l/2+h-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),je(e,C),e.intersect=function(T){return Ye.polygon(e,p,T)},i}var WK=N(()=>{"use strict";Ft();Ht();Ut();Wt();o(Hh,"generateCirclePoints");o(HK,"curlyBraceLeft")});function Wh(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dw,":first-child").attr("stroke-opacity",0),C.insert(()=>x,":first-child"),C.attr("class","text"),f&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",n),C.attr("transform",`translate(${-h}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),je(e,C),e.intersect=function(T){return Ye.polygon(e,p,T)},i}var YK=N(()=>{"use strict";Ft();Ht();Ut();Wt();o(Wh,"generateCirclePoints");o(qK,"curlyBraceRight")});function Ra(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dA,":first-child").attr("stroke-opacity",0),S.insert(()=>b,":first-child"),S.insert(()=>T,":first-child"),S.attr("class","text"),f&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(${h-h/4}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),je(e,S),e.intersect=function(_){return Ye.polygon(e,m,_)},i}var jK=N(()=>{"use strict";Ft();Ht();Ut();Wt();o(Ra,"generateCirclePoints");o(XK,"curlyBraces")});async function KK(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=80,l=20,u=Math.max(s,(a.width+(e.padding??0)*2)*1.25,e?.width??0),h=Math.max(l,a.height+(e.padding??0)*2,e?.height??0),f=h/2,{cssStyles:d}=e,p=Xe.svg(i),m=Ke(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=u,y=h,v=g-f,x=y/4,b=[{x:v,y:0},{x,y:0},{x:0,y:y/2},{x,y},{x:v,y},...Lw(-v,-y/2,f,50,270,90)],w=Xt(b),C=p.path(w,m),T=i.insert(()=>C,":first-child");return T.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&T.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&T.selectChildren("path").attr("style",n),T.attr("transform",`translate(${-u/2}, ${-h/2})`),je(e,T),e.intersect=function(E){return Ye.polygon(e,b,E)},i}var QK=N(()=>{"use strict";Ft();Ht();Ut();Wt();o(KK,"curvedTrapezoid")});async function ZK(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+e.padding,e.width??0),u=l/2,h=u/(2.5+l/50),f=Math.max(a.height+h+e.padding,e.height??0),d,{cssStyles:p}=e;if(e.look==="handDrawn"){let m=Xe.svg(i),g=u_e(0,0,l,f,u,h),y=h_e(0,h,l,f,u,h),v=m.path(g,Ke(e,{})),x=m.path(y,Ke(e,{fill:"none"}));d=i.insert(()=>x,":first-child"),d=i.insert(()=>v,":first-child"),d.attr("class","basic label-container"),p&&d.attr("style",p)}else{let m=c_e(0,0,l,f,u,h);d=i.insert("path",":first-child").attr("d",m).attr("class","basic label-container").attr("style",$n(p)).attr("style",n)}return d.attr("label-offset-y",h),d.attr("transform",`translate(${-l/2}, ${-(f/2+h)})`),je(e,d),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+(e.padding??0)/1.5-(a.y-(a.top??0))})`),e.intersect=function(m){let g=Ye.rect(e,m),y=g.x-(e.x??0);if(u!=0&&(Math.abs(y)<(e.width??0)/2||Math.abs(y)==(e.width??0)/2&&Math.abs(g.y-(e.y??0))>(e.height??0)/2-h)){let v=h*h*(1-y*y/(u*u));v>0&&(v=Math.sqrt(v)),v=h-v,m.y-(e.y??0)>0&&(v=-v),g.y+=v}return g},i}var c_e,u_e,h_e,JK=N(()=>{"use strict";Ft();Ht();Ut();Wt();ir();c_e=o((t,e,r,n,i,a)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createCylinderPathD"),u_e=o((t,e,r,n,i,a)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createOuterCylinderPathD"),h_e=o((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");o(ZK,"cylinder")});async function eQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=a.width+e.padding,u=a.height+e.padding,h=u*.2,f=-l/2,d=-u/2-h/2,{cssStyles:p}=e,m=Xe.svg(i),g=Ke(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:f,y:d+h},{x:-f,y:d+h},{x:-f,y:-d},{x:f,y:-d},{x:f,y:d},{x:-f,y:d},{x:-f,y:d+h}],v=m.polygon(y.map(b=>[b.x,b.y]),g),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${f+(e.padding??0)/2-(a.x-(a.left??0))}, ${d+h+(e.padding??0)/2-(a.y-(a.top??0))})`),je(e,x),e.intersect=function(b){return Ye.rect(e,b)},i}var tQ=N(()=>{"use strict";Ft();Ht();Ut();Wt();o(eQ,"dividedRectangle")});async function rQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s}=await pt(t,e,ht(e)),u=a.width/2+s+5,h=a.width/2+s,f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=Xe.svg(i),m=Ke(e,{roughness:.2,strokeWidth:2.5}),g=Ke(e,{roughness:.2,strokeWidth:1.5}),y=p.circle(0,0,u*2,m),v=p.circle(0,0,h*2,g);f=i.insert("g",":first-child"),f.attr("class",$n(e.cssClasses)).attr("style",$n(d)),f.node()?.appendChild(y),f.node()?.appendChild(v)}else{f=i.insert("g",":first-child");let p=f.insert("circle",":first-child"),m=f.insert("circle");f.attr("class","basic label-container").attr("style",n),p.attr("class","outer-circle").attr("style",n).attr("r",u).attr("cx",0).attr("cy",0),m.attr("class","inner-circle").attr("style",n).attr("r",h).attr("cx",0).attr("cy",0)}return je(e,f),e.intersect=function(p){return Y.info("DoubleCircle intersect",e,u,p),Ye.circle(e,u,p)},i}var nQ=N(()=>{"use strict";vt();Ft();Ht();Ut();Wt();ir();o(rQ,"doublecircle")});function iQ(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Qe(e);e.label="",e.labelStyle=n;let a=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),s=7,{cssStyles:l}=e,u=Xe.svg(a),{nodeBorder:h}=r,f=Ke(e,{fillStyle:"solid"});e.look!=="handDrawn"&&(f.roughness=0);let d=u.circle(0,0,s*2,f),p=a.insert(()=>d,":first-child");return p.selectAll("path").attr("style",`fill: ${h} !important;`),l&&l.length>0&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",l),i&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",i),je(e,p),e.intersect=function(m){return Y.info("filledCircle intersect",e,{radius:s,point:m}),Ye.circle(e,s,m)},a}var aQ=N(()=>{"use strict";Wt();vt();Ht();Ut();Ft();o(iQ,"filledCircle")});async function sQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=a.width+(e.padding??0),u=l+a.height,h=l+a.height,f=[{x:0,y:-u},{x:h,y:-u},{x:h/2,y:0}],{cssStyles:d}=e,p=Xe.svg(i),m=Ke(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=Xt(f),y=p.path(g,m),v=i.insert(()=>y,":first-child").attr("transform",`translate(${-u/2}, ${u/2})`);return d&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",n),e.width=l,e.height=u,je(e,v),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${-u/2+(e.padding??0)/2+(a.y-(a.top??0))})`),e.intersect=function(x){return Y.info("Triangle intersect",e,f,x),Ye.polygon(e,f,x)},i}var oQ=N(()=>{"use strict";vt();Ft();Ht();Ut();Wt();Ft();o(sQ,"flippedTriangle")});function lQ(t,e,{dir:r,config:{state:n,themeVariables:i}}){let{nodeStyles:a}=Qe(e);e.label="";let s=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),{cssStyles:l}=e,u=Math.max(70,e?.width??0),h=Math.max(10,e?.height??0);r==="LR"&&(u=Math.max(10,e?.width??0),h=Math.max(70,e?.height??0));let f=-1*u/2,d=-1*h/2,p=Xe.svg(s),m=Ke(e,{stroke:i.lineColor,fill:i.lineColor});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=p.rectangle(f,d,u,h,m),y=s.insert(()=>g,":first-child");l&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",l),a&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",a),je(e,y);let v=n?.padding??0;return e.width&&e.height&&(e.width+=v/2||0,e.height+=v/2||0),e.intersect=function(x){return Ye.rect(e,x)},s}var cQ=N(()=>{"use strict";Wt();Ht();Ut();Ft();o(lQ,"forkJoin")});async function uQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let i=80,a=50,{shapeSvg:s,bbox:l}=await pt(t,e,ht(e)),u=Math.max(i,l.width+(e.padding??0)*2,e?.width??0),h=Math.max(a,l.height+(e.padding??0)*2,e?.height??0),f=h/2,{cssStyles:d}=e,p=Xe.svg(s),m=Ke(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:-u/2,y:-h/2},{x:u/2-f,y:-h/2},...Lw(-u/2+f,0,f,50,90,270),{x:u/2-f,y:h/2},{x:-u/2,y:h/2}],y=Xt(g),v=p.path(y,m),x=s.insert(()=>v,":first-child");return x.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),je(e,x),e.intersect=function(b){return Y.info("Pill intersect",e,{radius:f,point:b}),Ye.polygon(e,g,b)},s}var hQ=N(()=>{"use strict";vt();Ft();Ht();Ut();Wt();o(uQ,"halfRoundedRectangle")});async function fQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=4,l=a.height+e.padding,u=l/s,h=a.width+2*u+e.padding,f=[{x:u,y:0},{x:h-u,y:0},{x:h,y:-l/2},{x:h-u,y:-l},{x:u,y:-l},{x:0,y:-l/2}],d,{cssStyles:p}=e;if(e.look==="handDrawn"){let m=Xe.svg(i),g=Ke(e,{}),y=f_e(0,0,h,l,u),v=m.path(y,g);d=i.insert(()=>v,":first-child").attr("transform",`translate(${-h/2}, ${l/2})`),p&&d.attr("style",p)}else d=La(i,h,l,f);return n&&d.attr("style",n),e.width=h,e.height=l,je(e,d),e.intersect=function(m){return Ye.polygon(e,f,m)},i}var f_e,dQ=N(()=>{"use strict";Ft();Ht();Ut();Wt();_u();f_e=o((t,e,r,n,i)=>[`M${t+i},${e}`,`L${t+r-i},${e}`,`L${t+r},${e-n/2}`,`L${t+r-i},${e-n}`,`L${t+i},${e-n}`,`L${t},${e-n/2}`,"Z"].join(" "),"createHexagonPathD");o(fQ,"hexagon")});async function pQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.label="",e.labelStyle=r;let{shapeSvg:i}=await pt(t,e,ht(e)),a=Math.max(30,e?.width??0),s=Math.max(30,e?.height??0),{cssStyles:l}=e,u=Xe.svg(i),h=Ke(e,{});e.look!=="handDrawn"&&(h.roughness=0,h.fillStyle="solid");let f=[{x:0,y:0},{x:a,y:0},{x:0,y:s},{x:a,y:s}],d=Xt(f),p=u.path(d,h),m=i.insert(()=>p,":first-child");return m.attr("class","basic label-container"),l&&e.look!=="handDrawn"&&m.selectChildren("path").attr("style",l),n&&e.look!=="handDrawn"&&m.selectChildren("path").attr("style",n),m.attr("transform",`translate(${-a/2}, ${-s/2})`),je(e,m),e.intersect=function(g){return Y.info("Pill intersect",e,{points:f}),Ye.polygon(e,f,g)},i}var mQ=N(()=>{"use strict";vt();Ft();Ht();Ut();Wt();o(pQ,"hourglass")});async function gQ(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Qe(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,label:d}=await pt(t,e,"icon-shape default"),p=e.pos==="t",m=l,g=l,{nodeBorder:y}=r,{stylesMap:v}=mc(e),x=-g/2,b=-m/2,w=e.label?8:0,C=Xe.svg(h),T=Ke(e,{stroke:"none",fill:"none"});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let E=C.rectangle(x,b,g,m,T),A=Math.max(g,f.width),S=m+f.height+w,_=C.rectangle(-A/2,-S/2,A,S,{...T,fill:"transparent",stroke:"none"}),I=h.insert(()=>E,":first-child"),D=h.insert(()=>_);if(e.icon){let k=h.append("g");k.html(`${await wo(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let L=k.node().getBBox(),R=L.width,O=L.height,M=L.x,B=L.y;k.attr("transform",`translate(${-R/2-M},${p?f.height/2+w/2-O/2-B:-f.height/2-w/2-O/2-B})`),k.attr("style",`color: ${v.get("stroke")??y};`)}return d.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${p?-S/2:S/2-f.height})`),I.attr("transform",`translate(0,${p?f.height/2+w/2:-f.height/2-w/2})`),je(e,D),e.intersect=function(k){if(Y.info("iconSquare intersect",e,k),!e.label)return Ye.rect(e,k);let L=e.x??0,R=e.y??0,O=e.height??0,M=[];return p?M=[{x:L-f.width/2,y:R-O/2},{x:L+f.width/2,y:R-O/2},{x:L+f.width/2,y:R-O/2+f.height+w},{x:L+g/2,y:R-O/2+f.height+w},{x:L+g/2,y:R+O/2},{x:L-g/2,y:R+O/2},{x:L-g/2,y:R-O/2+f.height+w},{x:L-f.width/2,y:R-O/2+f.height+w}]:M=[{x:L-g/2,y:R-O/2},{x:L+g/2,y:R-O/2},{x:L+g/2,y:R-O/2+m},{x:L+f.width/2,y:R-O/2+m},{x:L+f.width/2/2,y:R+O/2},{x:L-f.width/2,y:R+O/2},{x:L-f.width/2,y:R-O/2+m},{x:L-g/2,y:R-O/2+m}],Ye.polygon(e,M,k)},h}var yQ=N(()=>{"use strict";Wt();vt();tu();Ht();Ut();Ft();o(gQ,"icon")});async function vQ(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Qe(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,label:d}=await pt(t,e,"icon-shape default"),p=20,m=e.label?8:0,g=e.pos==="t",{nodeBorder:y,mainBkg:v}=r,{stylesMap:x}=mc(e),b=Xe.svg(h),w=Ke(e,{});e.look!=="handDrawn"&&(w.roughness=0,w.fillStyle="solid");let C=x.get("fill");w.stroke=C??v;let T=h.append("g");e.icon&&T.html(`${await wo(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let E=T.node().getBBox(),A=E.width,S=E.height,_=E.x,I=E.y,D=Math.max(A,S)*Math.SQRT2+p*2,k=b.circle(0,0,D,w),L=Math.max(D,f.width),R=D+f.height+m,O=b.rectangle(-L/2,-R/2,L,R,{...w,fill:"transparent",stroke:"none"}),M=h.insert(()=>k,":first-child"),B=h.insert(()=>O);return T.attr("transform",`translate(${-A/2-_},${g?f.height/2+m/2-S/2-I:-f.height/2-m/2-S/2-I})`),T.attr("style",`color: ${x.get("stroke")??y};`),d.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${g?-R/2:R/2-f.height})`),M.attr("transform",`translate(0,${g?f.height/2+m/2:-f.height/2-m/2})`),je(e,B),e.intersect=function(F){return Y.info("iconSquare intersect",e,F),Ye.rect(e,F)},h}var xQ=N(()=>{"use strict";Wt();vt();tu();Ht();Ut();Ft();o(vQ,"iconCircle")});var Na,qh=N(()=>{"use strict";Na=o((t,e,r,n,i)=>["M",t+i,e,"H",t+r-i,"A",i,i,0,0,1,t+r,e+i,"V",e+n-i,"A",i,i,0,0,1,t+r-i,e+n,"H",t+i,"A",i,i,0,0,1,t,e+n-i,"V",e+i,"A",i,i,0,0,1,t+i,e,"Z"].join(" "),"createRoundedRectPathD")});async function bQ(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Qe(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,halfPadding:d,label:p}=await pt(t,e,"icon-shape default"),m=e.pos==="t",g=l+d*2,y=l+d*2,{nodeBorder:v,mainBkg:x}=r,{stylesMap:b}=mc(e),w=-y/2,C=-g/2,T=e.label?8:0,E=Xe.svg(h),A=Ke(e,{});e.look!=="handDrawn"&&(A.roughness=0,A.fillStyle="solid");let S=b.get("fill");A.stroke=S??x;let _=E.path(Na(w,C,y,g,5),A),I=Math.max(y,f.width),D=g+f.height+T,k=E.rectangle(-I/2,-D/2,I,D,{...A,fill:"transparent",stroke:"none"}),L=h.insert(()=>_,":first-child").attr("class","icon-shape2"),R=h.insert(()=>k);if(e.icon){let O=h.append("g");O.html(`${await wo(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let M=O.node().getBBox(),B=M.width,F=M.height,P=M.x,z=M.y;O.attr("transform",`translate(${-B/2-P},${m?f.height/2+T/2-F/2-z:-f.height/2-T/2-F/2-z})`),O.attr("style",`color: ${b.get("stroke")??v};`)}return p.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${m?-D/2:D/2-f.height})`),L.attr("transform",`translate(0,${m?f.height/2+T/2:-f.height/2-T/2})`),je(e,R),e.intersect=function(O){if(Y.info("iconSquare intersect",e,O),!e.label)return Ye.rect(e,O);let M=e.x??0,B=e.y??0,F=e.height??0,P=[];return m?P=[{x:M-f.width/2,y:B-F/2},{x:M+f.width/2,y:B-F/2},{x:M+f.width/2,y:B-F/2+f.height+T},{x:M+y/2,y:B-F/2+f.height+T},{x:M+y/2,y:B+F/2},{x:M-y/2,y:B+F/2},{x:M-y/2,y:B-F/2+f.height+T},{x:M-f.width/2,y:B-F/2+f.height+T}]:P=[{x:M-y/2,y:B-F/2},{x:M+y/2,y:B-F/2},{x:M+y/2,y:B-F/2+g},{x:M+f.width/2,y:B-F/2+g},{x:M+f.width/2/2,y:B+F/2},{x:M-f.width/2,y:B+F/2},{x:M-f.width/2,y:B-F/2+g},{x:M-y/2,y:B-F/2+g}],Ye.polygon(e,P,O)},h}var wQ=N(()=>{"use strict";Wt();vt();tu();Ht();Ut();qh();Ft();o(bQ,"iconRounded")});async function TQ(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Qe(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,halfPadding:d,label:p}=await pt(t,e,"icon-shape default"),m=e.pos==="t",g=l+d*2,y=l+d*2,{nodeBorder:v,mainBkg:x}=r,{stylesMap:b}=mc(e),w=-y/2,C=-g/2,T=e.label?8:0,E=Xe.svg(h),A=Ke(e,{});e.look!=="handDrawn"&&(A.roughness=0,A.fillStyle="solid");let S=b.get("fill");A.stroke=S??x;let _=E.path(Na(w,C,y,g,.1),A),I=Math.max(y,f.width),D=g+f.height+T,k=E.rectangle(-I/2,-D/2,I,D,{...A,fill:"transparent",stroke:"none"}),L=h.insert(()=>_,":first-child"),R=h.insert(()=>k);if(e.icon){let O=h.append("g");O.html(`${await wo(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let M=O.node().getBBox(),B=M.width,F=M.height,P=M.x,z=M.y;O.attr("transform",`translate(${-B/2-P},${m?f.height/2+T/2-F/2-z:-f.height/2-T/2-F/2-z})`),O.attr("style",`color: ${b.get("stroke")??v};`)}return p.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${m?-D/2:D/2-f.height})`),L.attr("transform",`translate(0,${m?f.height/2+T/2:-f.height/2-T/2})`),je(e,R),e.intersect=function(O){if(Y.info("iconSquare intersect",e,O),!e.label)return Ye.rect(e,O);let M=e.x??0,B=e.y??0,F=e.height??0,P=[];return m?P=[{x:M-f.width/2,y:B-F/2},{x:M+f.width/2,y:B-F/2},{x:M+f.width/2,y:B-F/2+f.height+T},{x:M+y/2,y:B-F/2+f.height+T},{x:M+y/2,y:B+F/2},{x:M-y/2,y:B+F/2},{x:M-y/2,y:B-F/2+f.height+T},{x:M-f.width/2,y:B-F/2+f.height+T}]:P=[{x:M-y/2,y:B-F/2},{x:M+y/2,y:B-F/2},{x:M+y/2,y:B-F/2+g},{x:M+f.width/2,y:B-F/2+g},{x:M+f.width/2/2,y:B+F/2},{x:M-f.width/2,y:B+F/2},{x:M-f.width/2,y:B-F/2+g},{x:M-y/2,y:B-F/2+g}],Ye.polygon(e,P,O)},h}var kQ=N(()=>{"use strict";Wt();vt();tu();Ht();qh();Ut();Ft();o(TQ,"iconSquare")});async function EQ(t,e,{config:{flowchart:r}}){let n=new Image;n.src=e?.img??"",await n.decode();let i=Number(n.naturalWidth.toString().replace("px","")),a=Number(n.naturalHeight.toString().replace("px",""));e.imageAspectRatio=i/a;let{labelStyles:s}=Qe(e);e.labelStyle=s;let l=r?.wrappingWidth;e.defaultWidth=r?.wrappingWidth;let u=Math.max(e.label?l??0:0,e?.assetWidth??i),h=e.constraint==="on"&&e?.assetHeight?e.assetHeight*e.imageAspectRatio:u,f=e.constraint==="on"?h/e.imageAspectRatio:e?.assetHeight??a;e.width=Math.max(h,l??0);let{shapeSvg:d,bbox:p,label:m}=await pt(t,e,"image-shape default"),g=e.pos==="t",y=-h/2,v=-f/2,x=e.label?8:0,b=Xe.svg(d),w=Ke(e,{});e.look!=="handDrawn"&&(w.roughness=0,w.fillStyle="solid");let C=b.rectangle(y,v,h,f,w),T=Math.max(h,p.width),E=f+p.height+x,A=b.rectangle(-T/2,-E/2,T,E,{...w,fill:"none",stroke:"none"}),S=d.insert(()=>C,":first-child"),_=d.insert(()=>A);if(e.img){let I=d.append("image");I.attr("href",e.img),I.attr("width",h),I.attr("height",f),I.attr("preserveAspectRatio","none"),I.attr("transform",`translate(${-h/2},${g?E/2-f:-E/2})`)}return m.attr("transform",`translate(${-p.width/2-(p.x-(p.left??0))},${g?-f/2-p.height/2-x/2:f/2-p.height/2+x/2})`),S.attr("transform",`translate(0,${g?p.height/2+x/2:-p.height/2-x/2})`),je(e,_),e.intersect=function(I){if(Y.info("iconSquare intersect",e,I),!e.label)return Ye.rect(e,I);let D=e.x??0,k=e.y??0,L=e.height??0,R=[];return g?R=[{x:D-p.width/2,y:k-L/2},{x:D+p.width/2,y:k-L/2},{x:D+p.width/2,y:k-L/2+p.height+x},{x:D+h/2,y:k-L/2+p.height+x},{x:D+h/2,y:k+L/2},{x:D-h/2,y:k+L/2},{x:D-h/2,y:k-L/2+p.height+x},{x:D-p.width/2,y:k-L/2+p.height+x}]:R=[{x:D-h/2,y:k-L/2},{x:D+h/2,y:k-L/2},{x:D+h/2,y:k-L/2+f},{x:D+p.width/2,y:k-L/2+f},{x:D+p.width/2/2,y:k+L/2},{x:D-p.width/2,y:k+L/2},{x:D-p.width/2,y:k-L/2+f},{x:D-h/2,y:k-L/2+f}],Ye.polygon(e,R,I)},d}var SQ=N(()=>{"use strict";Wt();vt();Ht();Ut();Ft();o(EQ,"imageSquare")});async function CQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=[{x:0,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:-3*l/6,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Xe.svg(i),p=Ke(e,{}),m=Xt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=La(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,je(e,h),e.intersect=function(d){return Ye.polygon(e,u,d)},i}var AQ=N(()=>{"use strict";Ft();Ht();Ut();Wt();_u();o(CQ,"inv_trapezoid")});async function Du(t,e,r){let{labelStyles:n,nodeStyles:i}=Qe(e);e.labelStyle=n;let{shapeSvg:a,bbox:s}=await pt(t,e,ht(e)),l=Math.max(s.width+r.labelPaddingX*2,e?.width||0),u=Math.max(s.height+r.labelPaddingY*2,e?.height||0),h=-l/2,f=-u/2,d,{rx:p,ry:m}=e,{cssStyles:g}=e;if(r?.rx&&r.ry&&(p=r.rx,m=r.ry),e.look==="handDrawn"){let y=Xe.svg(a),v=Ke(e,{}),x=p||m?y.path(Na(h,f,l,u,p||0),v):y.rectangle(h,f,l,u,v);d=a.insert(()=>x,":first-child"),d.attr("class","basic label-container").attr("style",$n(g))}else d=a.insert("rect",":first-child"),d.attr("class","basic label-container").attr("style",i).attr("rx",$n(p)).attr("ry",$n(m)).attr("x",h).attr("y",f).attr("width",l).attr("height",u);return je(e,d),e.intersect=function(y){return Ye.rect(e,y)},a}var mm=N(()=>{"use strict";Ft();Ht();qh();Ut();Wt();ir();o(Du,"drawRect")});async function _Q(t,e){let{shapeSvg:r,bbox:n,label:i}=await pt(t,e,"label"),a=r.insert("rect",":first-child");return a.attr("width",.1).attr("height",.1),r.attr("class","label edgeLabel"),i.attr("transform",`translate(${-(n.width/2)-(n.x-(n.left??0))}, ${-(n.height/2)-(n.y-(n.top??0))})`),je(e,a),e.intersect=function(u){return Ye.rect(e,u)},r}var DQ=N(()=>{"use strict";mm();Ft();Ht();o(_Q,"labelRect")});async function LQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),l=Math.max(a.height+(e.padding??0),e?.height??0),u=[{x:0,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:-(3*l)/6,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Xe.svg(i),p=Ke(e,{}),m=Xt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=La(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,je(e,h),e.intersect=function(d){return Ye.polygon(e,u,d)},i}var RQ=N(()=>{"use strict";Ft();Ht();Ut();Wt();_u();o(LQ,"lean_left")});async function NQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),l=Math.max(a.height+(e.padding??0),e?.height??0),u=[{x:-3*l/6,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:0,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Xe.svg(i),p=Ke(e,{}),m=Xt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=La(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,je(e,h),e.intersect=function(d){return Ye.polygon(e,u,d)},i}var MQ=N(()=>{"use strict";Ft();Ht();Ut();Wt();_u();o(NQ,"lean_right")});function IQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.label="",e.labelStyle=r;let i=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),{cssStyles:a}=e,s=Math.max(35,e?.width??0),l=Math.max(35,e?.height??0),u=7,h=[{x:s,y:0},{x:0,y:l+u/2},{x:s-2*u,y:l+u/2},{x:0,y:2*l},{x:s,y:l-u/2},{x:2*u,y:l-u/2}],f=Xe.svg(i),d=Ke(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=Xt(h),m=f.path(p,d),g=i.insert(()=>m,":first-child");return a&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",a),n&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",n),g.attr("transform",`translate(-${s/2},${-l})`),je(e,g),e.intersect=function(y){return Y.info("lightningBolt intersect",e,y),Ye.polygon(e,h,y)},i}var OQ=N(()=>{"use strict";vt();Ft();Ut();Wt();Ht();Ft();o(IQ,"lightningBolt")});async function PQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0),e.width??0),u=l/2,h=u/(2.5+l/50),f=Math.max(a.height+h+(e.padding??0),e.height??0),d=f*.1,p,{cssStyles:m}=e;if(e.look==="handDrawn"){let g=Xe.svg(i),y=p_e(0,0,l,f,u,h,d),v=m_e(0,h,l,f,u,h),x=Ke(e,{}),b=g.path(y,x),w=g.path(v,x);i.insert(()=>w,":first-child").attr("class","line"),p=i.insert(()=>b,":first-child"),p.attr("class","basic label-container"),m&&p.attr("style",m)}else{let g=d_e(0,0,l,f,u,h,d);p=i.insert("path",":first-child").attr("d",g).attr("class","basic label-container").attr("style",$n(m)).attr("style",n)}return p.attr("label-offset-y",h),p.attr("transform",`translate(${-l/2}, ${-(f/2+h)})`),je(e,p),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+h-(a.y-(a.top??0))})`),e.intersect=function(g){let y=Ye.rect(e,g),v=y.x-(e.x??0);if(u!=0&&(Math.abs(v)<(e.width??0)/2||Math.abs(v)==(e.width??0)/2&&Math.abs(y.y-(e.y??0))>(e.height??0)/2-h)){let x=h*h*(1-v*v/(u*u));x>0&&(x=Math.sqrt(x)),x=h-x,g.y-(e.y??0)>0&&(x=-x),y.y+=x}return y},i}var d_e,p_e,m_e,BQ=N(()=>{"use strict";Ft();Ht();Ut();Wt();ir();d_e=o((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createCylinderPathD"),p_e=o((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createOuterCylinderPathD"),m_e=o((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");o(PQ,"linedCylinder")});async function FQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=u+h,{cssStyles:d}=e,p=Xe.svg(i),m=Ke(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:-l/2-l/2*.1,y:-f/2},{x:-l/2-l/2*.1,y:f/2},...Fo(-l/2-l/2*.1,f/2,l/2+l/2*.1,f/2,h,.8),{x:l/2+l/2*.1,y:-f/2},{x:-l/2-l/2*.1,y:-f/2},{x:-l/2,y:-f/2},{x:-l/2,y:f/2*1.1},{x:-l/2,y:-f/2}],y=p.polygon(g.map(x=>[x.x,x.y]),m),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",n),v.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)+l/2*.1/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h/2-(a.y-(a.top??0))})`),je(e,v),e.intersect=function(x){return Ye.polygon(e,g,x)},i}var $Q=N(()=>{"use strict";Ft();Ht();Wt();Ut();o(FQ,"linedWaveEdgedRect")});async function zQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=5,f=-l/2,d=-u/2,{cssStyles:p}=e,m=Xe.svg(i),g=Ke(e,{}),y=[{x:f-h,y:d+h},{x:f-h,y:d+u+h},{x:f+l-h,y:d+u+h},{x:f+l-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d+u-h},{x:f+l+h,y:d+u-h},{x:f+l+h,y:d-h},{x:f+h,y:d-h},{x:f+h,y:d},{x:f,y:d},{x:f,y:d+h}],v=[{x:f,y:d+h},{x:f+l-h,y:d+h},{x:f+l-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d},{x:f,y:d}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=Xt(y),b=m.path(x,g),w=Xt(v),C=m.path(w,{...g,fill:"none"}),T=i.insert(()=>C,":first-child");return T.insert(()=>b,":first-child"),T.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&T.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&T.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)-h-(a.x-(a.left??0))}, ${-(a.height/2)+h-(a.y-(a.top??0))})`),je(e,T),e.intersect=function(E){return Ye.polygon(e,y,E)},i}var GQ=N(()=>{"use strict";Ft();Ut();Wt();Ht();o(zQ,"multiRect")});async function VQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=u+h,d=-l/2,p=-f/2,m=5,{cssStyles:g}=e,y=Fo(d-m,p+f+m,d+l-m,p+f+m,h,.8),v=y?.[y.length-1],x=[{x:d-m,y:p+m},{x:d-m,y:p+f+m},...y,{x:d+l-m,y:v.y-m},{x:d+l,y:v.y-m},{x:d+l,y:v.y-2*m},{x:d+l+m,y:v.y-2*m},{x:d+l+m,y:p-m},{x:d+m,y:p-m},{x:d+m,y:p},{x:d,y:p},{x:d,y:p+m}],b=[{x:d,y:p+m},{x:d+l-m,y:p+m},{x:d+l-m,y:v.y-m},{x:d+l,y:v.y-m},{x:d+l,y:p},{x:d,y:p}],w=Xe.svg(i),C=Ke(e,{});e.look!=="handDrawn"&&(C.roughness=0,C.fillStyle="solid");let T=Xt(x),E=w.path(T,C),A=Xt(b),S=w.path(A,C),_=i.insert(()=>E,":first-child");return _.insert(()=>S),_.attr("class","basic label-container"),g&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",g),n&&e.look!=="handDrawn"&&_.selectAll("path").attr("style",n),_.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-(a.width/2)-m-(a.x-(a.left??0))}, ${-(a.height/2)+m-h/2-(a.y-(a.top??0))})`),je(e,_),e.intersect=function(I){return Ye.polygon(e,x,I)},i}var UQ=N(()=>{"use strict";Ft();Ht();Wt();Ut();o(VQ,"multiWaveEdgedRectangle")});async function HQ(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Qe(e);e.labelStyle=n,e.useHtmlLabels||cr().flowchart?.htmlLabels!==!1||(e.centerLabel=!0);let{shapeSvg:s,bbox:l}=await pt(t,e,ht(e)),u=Math.max(l.width+(e.padding??0)*2,e?.width??0),h=Math.max(l.height+(e.padding??0)*2,e?.height??0),f=-u/2,d=-h/2,{cssStyles:p}=e,m=Xe.svg(s),g=Ke(e,{fill:r.noteBkgColor,stroke:r.noteBorderColor});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=m.rectangle(f,d,u,h,g),v=s.insert(()=>y,":first-child");return v.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",p),i&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",i),je(e,v),e.intersect=function(x){return Ye.rect(e,x)},s}var WQ=N(()=>{"use strict";Wt();Ht();Ut();Ft();ji();o(HQ,"note")});async function qQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=a.width+e.padding,l=a.height+e.padding,u=s+l,h=[{x:u/2,y:0},{x:u,y:-u/2},{x:u/2,y:-u},{x:0,y:-u/2}],f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=Xe.svg(i),m=Ke(e,{}),g=g_e(0,0,u),y=p.path(g,m);f=i.insert(()=>y,":first-child").attr("transform",`translate(${-u/2}, ${u/2})`),d&&f.attr("style",d)}else f=La(i,u,u,h);return n&&f.attr("style",n),je(e,f),e.intersect=function(p){return Y.debug(`APA12 Intersect called SPLIT +point:`,p,` +node: +`,e,` +res:`,Ye.polygon(e,h,p)),Ye.polygon(e,h,p)},i}var g_e,YQ=N(()=>{"use strict";vt();Ft();Ht();Ut();Wt();_u();g_e=o((t,e,r)=>[`M${t+r/2},${e}`,`L${t+r},${e-r/2}`,`L${t+r/2},${e-r}`,`L${t},${e-r/2}`,"Z"].join(" "),"createDecisionBoxPathD");o(qQ,"question")});async function XQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0),e?.width??0),u=Math.max(a.height+(e.padding??0),e?.height??0),h=-l/2,f=-u/2,d=f/2,p=[{x:h+d,y:f},{x:h,y:0},{x:h+d,y:-f},{x:-h,y:-f},{x:-h,y:f}],{cssStyles:m}=e,g=Xe.svg(i),y=Ke(e,{});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=Xt(p),x=g.path(v,y),b=i.insert(()=>x,":first-child");return b.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",m),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),b.attr("transform",`translate(${-d/2},0)`),s.attr("transform",`translate(${-d/2-a.width/2-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),je(e,b),e.intersect=function(w){return Ye.polygon(e,p,w)},i}var jQ=N(()=>{"use strict";Ft();Ht();Ut();Wt();o(XQ,"rect_left_inv_arrow")});function y_e(t,e){e&&t.attr("style",e)}async function v_e(t){let e=Ge(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),r=e.append("xhtml:div"),n=t.label;t.label&&pi(t.label)&&(n=await mh(t.label.replace(Ze.lineBreakRegex,` +`),me()));let i=t.isNode?"nodeLabel":"edgeLabel";return r.html('"+n+""),y_e(r,t.labelStyle),r.style("display","inline-block"),r.style("padding-right","1px"),r.style("white-space","nowrap"),r.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}var x_e,gc,Gw=N(()=>{"use strict";dr();vt();zt();gr();ir();o(y_e,"applyStyle");o(v_e,"addHtmlLabel");x_e=o(async(t,e,r,n)=>{let i=t||"";if(typeof i=="object"&&(i=i[0]),fr(me().flowchart.htmlLabels)){i=i.replace(/\\n|\n/g,"
    "),Y.info("vertexText"+i);let a={isNode:n,label:na(i).replace(/fa[blrs]?:fa-[\w-]+/g,l=>``),labelStyle:e&&e.replace("fill:","color:")};return await v_e(a)}else{let a=document.createElementNS("http://www.w3.org/2000/svg","text");a.setAttribute("style",e.replace("color:","fill:"));let s=[];typeof i=="string"?s=i.split(/\\n|\n|/gi):Array.isArray(i)?s=i:s=[];for(let l of s){let u=document.createElementNS("http://www.w3.org/2000/svg","tspan");u.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),u.setAttribute("dy","1em"),u.setAttribute("x","0"),r?u.setAttribute("class","title-row"):u.setAttribute("class","row"),u.textContent=l.trim(),a.appendChild(u)}return a}},"createLabel"),gc=x_e});async function KQ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let i;e.cssClasses?i="node "+e.cssClasses:i="node default";let a=t.insert("g").attr("class",i).attr("id",e.domId||e.id),s=a.insert("g"),l=a.insert("g").attr("class","label").attr("style",n),u=e.description,h=e.label,f=l.node().appendChild(await gc(h,e.labelStyle,!0,!0)),d={width:0,height:0};if(fr(me()?.flowchart?.htmlLabels)){let S=f.children[0],_=Ge(f);d=S.getBoundingClientRect(),_.attr("width",d.width),_.attr("height",d.height)}Y.info("Text 2",u);let p=u||[],m=f.getBBox(),g=l.node().appendChild(await gc(p.join?p.join("
    "):p,e.labelStyle,!0,!0)),y=g.children[0],v=Ge(g);d=y.getBoundingClientRect(),v.attr("width",d.width),v.attr("height",d.height);let x=(e.padding||0)/2;Ge(g).attr("transform","translate( "+(d.width>m.width?0:(m.width-d.width)/2)+", "+(m.height+x+5)+")"),Ge(f).attr("transform","translate( "+(d.width(Y.debug("Rough node insert CXC",I),D),":first-child"),E=a.insert(()=>(Y.debug("Rough node insert CXC",I),I),":first-child")}else E=s.insert("rect",":first-child"),A=s.insert("line"),E.attr("class","outer title-state").attr("style",n).attr("x",-d.width/2-x).attr("y",-d.height/2-x).attr("width",d.width+(e.padding||0)).attr("height",d.height+(e.padding||0)),A.attr("class","divider").attr("x1",-d.width/2-x).attr("x2",d.width/2+x).attr("y1",-d.height/2-x+m.height+x).attr("y2",-d.height/2-x+m.height+x);return je(e,E),e.intersect=function(S){return Ye.rect(e,S)},a}var QQ=N(()=>{"use strict";dr();gr();Ft();Gw();Ht();Ut();Wt();zt();qh();vt();o(KQ,"rectWithTitle")});async function ZQ(t,e){let r={rx:5,ry:5,classes:"",labelPaddingX:(e?.padding||0)*1,labelPaddingY:(e?.padding||0)*1};return Du(t,e,r)}var JQ=N(()=>{"use strict";mm();o(ZQ,"roundedRect")});async function eZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=e?.padding??0,u=Math.max(a.width+(e.padding??0)*2,e?.width??0),h=Math.max(a.height+(e.padding??0)*2,e?.height??0),f=-a.width/2-l,d=-a.height/2-l,{cssStyles:p}=e,m=Xe.svg(i),g=Ke(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:f,y:d},{x:f+u+8,y:d},{x:f+u+8,y:d+h},{x:f-8,y:d+h},{x:f-8,y:d},{x:f,y:d},{x:f,y:d+h}],v=m.polygon(y.map(b=>[b.x,b.y]),g),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container").attr("style",$n(p)),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),p&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${-u/2+4+(e.padding??0)-(a.x-(a.left??0))},${-h/2+(e.padding??0)-(a.y-(a.top??0))})`),je(e,x),e.intersect=function(b){return Ye.rect(e,b)},i}var tZ=N(()=>{"use strict";Ft();Ht();Ut();Wt();ir();o(eZ,"shadedProcess")});async function rZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=-l/2,f=-u/2,{cssStyles:d}=e,p=Xe.svg(i),m=Ke(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:h,y:f},{x:h,y:f+u},{x:h+l,y:f+u},{x:h+l,y:f-u/2}],y=Xt(g),v=p.path(y,m),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),x.attr("transform",`translate(0, ${u/4})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))}, ${-u/4+(e.padding??0)-(a.y-(a.top??0))})`),je(e,x),e.intersect=function(b){return Ye.polygon(e,g,b)},i}var nZ=N(()=>{"use strict";Ft();Ht();Ut();Wt();o(rZ,"slopedRect")});async function iZ(t,e){let r={rx:0,ry:0,classes:"",labelPaddingX:(e?.padding||0)*2,labelPaddingY:(e?.padding||0)*1};return Du(t,e,r)}var aZ=N(()=>{"use strict";mm();o(iZ,"squareRect")});async function sZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=a.height+e.padding,l=a.width+s/4+e.padding,u,{cssStyles:h}=e;if(e.look==="handDrawn"){let f=Xe.svg(i),d=Ke(e,{}),p=Na(-l/2,-s/2,l,s,s/2),m=f.path(p,d);u=i.insert(()=>m,":first-child"),u.attr("class","basic label-container").attr("style",$n(h))}else u=i.insert("rect",":first-child"),u.attr("class","basic label-container").attr("style",n).attr("rx",s/2).attr("ry",s/2).attr("x",-l/2).attr("y",-s/2).attr("width",l).attr("height",s);return je(e,u),e.intersect=function(f){return Ye.rect(e,f)},i}var oZ=N(()=>{"use strict";Ft();Ht();Ut();Wt();qh();ir();o(sZ,"stadium")});async function lZ(t,e){return Du(t,e,{rx:5,ry:5,classes:"flowchart-node"})}var cZ=N(()=>{"use strict";mm();o(lZ,"state")});function uZ(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Qe(e);e.labelStyle=n;let{cssStyles:a}=e,{lineColor:s,stateBorder:l,nodeBorder:u}=r,h=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),f=Xe.svg(h),d=Ke(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=f.circle(0,0,14,{...d,stroke:s,strokeWidth:2}),m=l??u,g=f.circle(0,0,5,{...d,fill:m,stroke:m,strokeWidth:2,fillStyle:"solid"}),y=h.insert(()=>p,":first-child");return y.insert(()=>g),a&&y.selectAll("path").attr("style",a),i&&y.selectAll("path").attr("style",i),je(e,y),e.intersect=function(v){return Ye.circle(e,7,v)},h}var hZ=N(()=>{"use strict";Wt();Ht();Ut();Ft();o(uZ,"stateEnd")});function fZ(t,e,{config:{themeVariables:r}}){let{lineColor:n}=r,i=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),a;if(e.look==="handDrawn"){let l=Xe.svg(i).circle(0,0,14,gK(n));a=i.insert(()=>l),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14)}else a=i.insert("circle",":first-child"),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14);return je(e,a),e.intersect=function(s){return Ye.circle(e,7,s)},i}var dZ=N(()=>{"use strict";Wt();Ht();Ut();Ft();o(fZ,"stateStart")});async function pZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=(e?.padding||0)/2,l=a.width+e.padding,u=a.height+e.padding,h=-a.width/2-s,f=-a.height/2-s,d=[{x:0,y:0},{x:l,y:0},{x:l,y:-u},{x:0,y:-u},{x:0,y:0},{x:-8,y:0},{x:l+8,y:0},{x:l+8,y:-u},{x:-8,y:-u},{x:-8,y:0}];if(e.look==="handDrawn"){let p=Xe.svg(i),m=Ke(e,{}),g=p.rectangle(h-8,f,l+16,u,m),y=p.line(h,f,h,f+u,m),v=p.line(h+l,f,h+l,f+u,m);i.insert(()=>y,":first-child"),i.insert(()=>v,":first-child");let x=i.insert(()=>g,":first-child"),{cssStyles:b}=e;x.attr("class","basic label-container").attr("style",$n(b)),je(e,x)}else{let p=La(i,l,u,d);n&&p.attr("style",n),je(e,p)}return e.intersect=function(p){return Ye.polygon(e,d,p)},i}var mZ=N(()=>{"use strict";Ft();Ht();Ut();Wt();_u();ir();o(pZ,"subroutine")});async function gZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=-s/2,h=-l/2,f=.2*l,d=.2*l,{cssStyles:p}=e,m=Xe.svg(i),g=Ke(e,{}),y=[{x:u-f/2,y:h},{x:u+s+f/2,y:h},{x:u+s+f/2,y:h+l},{x:u-f/2,y:h+l}],v=[{x:u+s-f/2,y:h+l},{x:u+s+f/2,y:h+l},{x:u+s+f/2,y:h+l-d}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=Xt(y),b=m.path(x,g),w=Xt(v),C=m.path(w,{...g,fillStyle:"solid"}),T=i.insert(()=>C,":first-child");return T.insert(()=>b,":first-child"),T.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&T.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&T.selectAll("path").attr("style",n),je(e,T),e.intersect=function(E){return Ye.polygon(e,y,E)},i}var yZ=N(()=>{"use strict";Ft();Ut();Wt();Ht();o(gZ,"taggedRect")});async function vZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=.2*l,d=.2*u,p=u+h,{cssStyles:m}=e,g=Xe.svg(i),y=Ke(e,{});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=[{x:-l/2-l/2*.1,y:p/2},...Fo(-l/2-l/2*.1,p/2,l/2+l/2*.1,p/2,h,.8),{x:l/2+l/2*.1,y:-p/2},{x:-l/2-l/2*.1,y:-p/2}],x=-l/2+l/2*.1,b=-p/2-d*.4,w=[{x:x+l-f,y:(b+u)*1.4},{x:x+l,y:b+u-d},{x:x+l,y:(b+u)*.9},...Fo(x+l,(b+u)*1.3,x+l-f,(b+u)*1.5,-u*.03,.5)],C=Xt(v),T=g.path(C,y),E=Xt(w),A=g.path(E,{...y,fillStyle:"solid"}),S=i.insert(()=>A,":first-child");return S.insert(()=>T,":first-child"),S.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",m),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h/2-(a.y-(a.top??0))})`),je(e,S),e.intersect=function(_){return Ye.polygon(e,v,_)},i}var xZ=N(()=>{"use strict";Ft();Ht();Wt();Ut();o(vZ,"taggedWaveEdgedRectangle")});async function bZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=Math.max(a.width+e.padding,e?.width||0),l=Math.max(a.height+e.padding,e?.height||0),u=-s/2,h=-l/2,f=i.insert("rect",":first-child");return f.attr("class","text").attr("style",n).attr("rx",0).attr("ry",0).attr("x",u).attr("y",h).attr("width",s).attr("height",l),je(e,f),e.intersect=function(d){return Ye.rect(e,d)},i}var wZ=N(()=>{"use strict";Ft();Ht();Ut();o(bZ,"text")});async function TZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s,halfPadding:l}=await pt(t,e,ht(e)),u=e.look==="neo"?l*2:l,h=a.height+u,f=h/2,d=f/(2.5+h/50),p=a.width+d+u,{cssStyles:m}=e,g;if(e.look==="handDrawn"){let y=Xe.svg(i),v=w_e(0,0,p,h,d,f),x=T_e(0,0,p,h,d,f),b=y.path(v,Ke(e,{})),w=y.path(x,Ke(e,{fill:"none"}));g=i.insert(()=>w,":first-child"),g=i.insert(()=>b,":first-child"),g.attr("class","basic label-container"),m&&g.attr("style",m)}else{let y=b_e(0,0,p,h,d,f);g=i.insert("path",":first-child").attr("d",y).attr("class","basic label-container").attr("style",$n(m)).attr("style",n),g.attr("class","basic label-container"),m&&g.selectAll("path").attr("style",m),n&&g.selectAll("path").attr("style",n)}return g.attr("label-offset-x",d),g.attr("transform",`translate(${-p/2}, ${h/2} )`),s.attr("transform",`translate(${-(a.width/2)-d-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),je(e,g),e.intersect=function(y){let v=Ye.rect(e,y),x=v.y-(e.y??0);if(f!=0&&(Math.abs(x)<(e.height??0)/2||Math.abs(x)==(e.height??0)/2&&Math.abs(v.x-(e.x??0))>(e.width??0)/2-d)){let b=d*d*(1-x*x/(f*f));b!=0&&(b=Math.sqrt(Math.abs(b))),b=d-b,y.x-(e.x??0)>0&&(b=-b),v.x+=b}return v},i}var b_e,w_e,T_e,kZ=N(()=>{"use strict";Ft();Ut();Wt();Ht();ir();b_e=o((t,e,r,n,i,a)=>`M${t},${e} + a${i},${a} 0,0,1 0,${-n} + l${r},0 + a${i},${a} 0,0,1 0,${n} + M${r},${-n} + a${i},${a} 0,0,0 0,${n} + l${-r},0`,"createCylinderPathD"),w_e=o((t,e,r,n,i,a)=>[`M${t},${e}`,`M${t+r},${e}`,`a${i},${a} 0,0,0 0,${-n}`,`l${-r},0`,`a${i},${a} 0,0,0 0,${n}`,`l${r},0`].join(" "),"createOuterCylinderPathD"),T_e=o((t,e,r,n,i,a)=>[`M${t+r/2},${-n/2}`,`a${i},${a} 0,0,0 0,${n}`].join(" "),"createInnerCylinderPathD");o(TZ,"tiltedCylinder")});async function EZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=a.width+e.padding,l=a.height+e.padding,u=[{x:-3*l/6,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:0,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=Xe.svg(i),p=Ke(e,{}),m=Xt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=La(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,je(e,h),e.intersect=function(d){return Ye.polygon(e,u,d)},i}var SZ=N(()=>{"use strict";Ft();Ht();Ut();Wt();_u();o(EZ,"trapezoid")});async function CZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=60,l=20,u=Math.max(s,a.width+(e.padding??0)*2,e?.width??0),h=Math.max(l,a.height+(e.padding??0)*2,e?.height??0),{cssStyles:f}=e,d=Xe.svg(i),p=Ke(e,{});e.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let m=[{x:-u/2*.8,y:-h/2},{x:u/2*.8,y:-h/2},{x:u/2,y:-h/2*.6},{x:u/2,y:h/2},{x:-u/2,y:h/2},{x:-u/2,y:-h/2*.6}],g=Xt(m),y=d.path(g,p),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",f),n&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",n),je(e,v),e.intersect=function(x){return Ye.polygon(e,m,x)},i}var AZ=N(()=>{"use strict";Ft();Ht();Ut();Wt();o(CZ,"trapezoidalPentagon")});async function _Z(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=fr(me().flowchart?.htmlLabels),u=a.width+(e.padding??0),h=u+a.height,f=u+a.height,d=[{x:0,y:0},{x:f,y:0},{x:f/2,y:-h}],{cssStyles:p}=e,m=Xe.svg(i),g=Ke(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=Xt(d),v=m.path(y,g),x=i.insert(()=>v,":first-child").attr("transform",`translate(${-h/2}, ${h/2})`);return p&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",p),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),e.width=u,e.height=h,je(e,x),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${h/2-(a.height+(e.padding??0)/(l?2:1)-(a.y-(a.top??0)))})`),e.intersect=function(b){return Y.info("Triangle intersect",e,d,b),Ye.polygon(e,d,b)},i}var DZ=N(()=>{"use strict";vt();Ft();Ht();Ut();Wt();Ft();gr();zt();o(_Z,"triangle")});async function LZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/8,f=u+h,{cssStyles:d}=e,m=70-l,g=m>0?m/2:0,y=Xe.svg(i),v=Ke(e,{});e.look!=="handDrawn"&&(v.roughness=0,v.fillStyle="solid");let x=[{x:-l/2-g,y:f/2},...Fo(-l/2-g,f/2,l/2+g,f/2,h,.8),{x:l/2+g,y:-f/2},{x:-l/2-g,y:-f/2}],b=Xt(x),w=y.path(b,v),C=i.insert(()=>w,":first-child");return C.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",n),C.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h-(a.y-(a.top??0))})`),je(e,C),e.intersect=function(T){return Ye.polygon(e,x,T)},i}var RZ=N(()=>{"use strict";Ft();Ht();Wt();Ut();o(LZ,"waveEdgedRectangle")});async function NZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await pt(t,e,ht(e)),s=100,l=50,u=Math.max(a.width+(e.padding??0)*2,e?.width??0),h=Math.max(a.height+(e.padding??0)*2,e?.height??0),f=u/h,d=u,p=h;d>p*f?p=d/f:d=p*f,d=Math.max(d,s),p=Math.max(p,l);let m=Math.min(p*.2,p/4),g=p+m*2,{cssStyles:y}=e,v=Xe.svg(i),x=Ke(e,{});e.look!=="handDrawn"&&(x.roughness=0,x.fillStyle="solid");let b=[{x:-d/2,y:g/2},...Fo(-d/2,g/2,d/2,g/2,m,1),{x:d/2,y:-g/2},...Fo(d/2,-g/2,-d/2,-g/2,m,-1)],w=Xt(b),C=v.path(w,x),T=i.insert(()=>C,":first-child");return T.attr("class","basic label-container"),y&&e.look!=="handDrawn"&&T.selectAll("path").attr("style",y),n&&e.look!=="handDrawn"&&T.selectAll("path").attr("style",n),je(e,T),e.intersect=function(E){return Ye.polygon(e,b,E)},i}var MZ=N(()=>{"use strict";Ft();Ht();Ut();Wt();o(NZ,"waveRectangle")});async function IZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await pt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=5,f=-l/2,d=-u/2,{cssStyles:p}=e,m=Xe.svg(i),g=Ke(e,{}),y=[{x:f-h,y:d-h},{x:f-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d-h}],v=`M${f-h},${d-h} L${f+l},${d-h} L${f+l},${d+u} L${f-h},${d+u} L${f-h},${d-h} + M${f-h},${d} L${f+l},${d} + M${f},${d-h} L${f},${d+u}`;e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=m.path(v,g),b=i.insert(()=>x,":first-child");return b.attr("transform",`translate(${h/2}, ${h/2})`),b.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)+h/2-(a.x-(a.left??0))}, ${-(a.height/2)+h/2-(a.y-(a.top??0))})`),je(e,b),e.intersect=function(w){return Ye.polygon(e,y,w)},i}var OZ=N(()=>{"use strict";Ft();Ut();Wt();Ht();o(IZ,"windowPane")});async function KD(t,e){let r=e;if(r.alias&&(e.label=r.alias),e.look==="handDrawn"){let{themeVariables:P}=cr(),{background:z}=P,$={...e,id:e.id+"-background",look:"default",cssStyles:["stroke: none",`fill: ${z}`]};await KD(t,$)}let n=cr();e.useHtmlLabels=n.htmlLabels;let i=n.er?.diagramPadding??10,a=n.er?.entityPadding??6,{cssStyles:s}=e,{labelStyles:l}=Qe(e);if(r.attributes.length===0&&e.label){let P={rx:0,ry:0,labelPaddingX:i,labelPaddingY:i*1.5,classes:""};ra(e.label,n)+P.labelPaddingX*20){let P=f.width+i*2-(m+g+y+v);m+=P/w,g+=P/w,y>0&&(y+=P/w),v>0&&(v+=P/w)}let T=m+g+y+v,E=Xe.svg(h),A=Ke(e,{});e.look!=="handDrawn"&&(A.roughness=0,A.fillStyle="solid");let S=Math.max(C.width+i*2,e?.width||0,T),_=Math.max(C.height+(p[0]||d)+a,e?.height||0),I=-S/2,D=-_/2;h.selectAll("g:not(:first-child)").each((P,z,$)=>{let H=Ge($[z]),Q=H.attr("transform"),j=0,ie=0;if(Q){let le=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(Q);le&&(j=parseFloat(le[1]),ie=parseFloat(le[2]),H.attr("class").includes("attribute-name")?j+=m:H.attr("class").includes("attribute-keys")?j+=m+g:H.attr("class").includes("attribute-comment")&&(j+=m+g+y))}H.attr("transform",`translate(${I+i/2+j}, ${ie+D+f.height+a/2})`)}),h.select(".name").attr("transform","translate("+-f.width/2+", "+(D+a/2)+")");let k=E.rectangle(I,D,S,_,A),L=h.insert(()=>k,":first-child").attr("style",s.join("")),{themeVariables:R}=cr(),{rowEven:O,rowOdd:M,nodeBorder:B}=R;p.push(0);for(let[P,z]of p.entries()){if(P===0&&p.length>1)continue;let $=P%2===0&&z!==0,H=E.rectangle(I,f.height+D+z,S,f.height,{...A,fill:$?O:M,stroke:B});h.insert(()=>H,"g.label").attr("style",s.join("")).attr("class",`row-rect-${P%2===0?"even":"odd"}`)}let F=E.line(I,f.height+D,S+I,f.height+D,A);h.insert(()=>F).attr("class","divider"),F=E.line(m+I,f.height+D,m+I,_+D,A),h.insert(()=>F).attr("class","divider"),x&&(F=E.line(m+g+I,f.height+D,m+g+I,_+D,A),h.insert(()=>F).attr("class","divider")),b&&(F=E.line(m+g+y+I,f.height+D,m+g+y+I,_+D,A),h.insert(()=>F).attr("class","divider"));for(let P of p)F=E.line(I,f.height+D+P,S+I,f.height+D+P,A),h.insert(()=>F).attr("class","divider");return je(e,L),e.intersect=function(P){return Ye.rect(e,P)},h}async function b2(t,e,r,n=0,i=0,a=[],s=""){let l=t.insert("g").attr("class",`label ${a.join(" ")}`).attr("transform",`translate(${n}, ${i})`).attr("style",s);e!==ec(e)&&(e=ec(e),e=e.replaceAll("<","<").replaceAll(">",">"));let u=l.node().appendChild(await Hn(l,e,{width:ra(e,r)+100,style:s,useHtmlLabels:r.htmlLabels},r));if(e.includes("<")||e.includes(">")){let f=u.children[0];for(f.textContent=f.textContent.replaceAll("<","<").replaceAll(">",">");f.childNodes[0];)f=f.childNodes[0],f.textContent=f.textContent.replaceAll("<","<").replaceAll(">",">")}let h=u.getBBox();if(fr(r.htmlLabels)){let f=u.children[0];f.style.textAlign="start";let d=Ge(u);h=f.getBoundingClientRect(),d.attr("width",h.width),d.attr("height",h.height)}return h}var PZ=N(()=>{"use strict";Ft();Ht();Ut();Wt();mm();ji();to();gr();dr();ir();o(KD,"erBox");o(b2,"addText")});async function BZ(t,e,r,n,i=r.class.padding??12){let a=n?0:3,s=t.insert("g").attr("class",ht(e)).attr("id",e.domId||e.id),l=null,u=null,h=null,f=null,d=0,p=0,m=0;if(l=s.insert("g").attr("class","annotation-group text"),e.annotations.length>0){let b=e.annotations[0];await Vw(l,{text:`\xAB${b}\xBB`},0),d=l.node().getBBox().height}u=s.insert("g").attr("class","label-group text"),await Vw(u,e,0,["font-weight: bolder"]);let g=u.node().getBBox();p=g.height,h=s.insert("g").attr("class","members-group text");let y=0;for(let b of e.members){let w=await Vw(h,b,y,[b.parseClassifier()]);y+=w+a}m=h.node().getBBox().height,m<=0&&(m=i/2),f=s.insert("g").attr("class","methods-group text");let v=0;for(let b of e.methods){let w=await Vw(f,b,v,[b.parseClassifier()]);v+=w+a}let x=s.node().getBBox();if(l!==null){let b=l.node().getBBox();l.attr("transform",`translate(${-b.width/2})`)}return u.attr("transform",`translate(${-g.width/2}, ${d})`),x=s.node().getBBox(),h.attr("transform",`translate(0, ${d+p+i*2})`),x=s.node().getBBox(),f.attr("transform",`translate(0, ${d+p+(m?m+i*4:i*2)})`),x=s.node().getBBox(),{shapeSvg:s,bbox:x}}async function Vw(t,e,r,n=[]){let i=t.insert("g").attr("class","label").attr("style",n.join("; ")),a=cr(),s="useHtmlLabels"in e?e.useHtmlLabels:fr(a.htmlLabels)??!0,l="";"text"in e?l=e.text:l=e.label,!s&&l.startsWith("\\")&&(l=l.substring(1)),pi(l)&&(s=!0);let u=await Hn(i,Xy(na(l)),{width:ra(l,a)+50,classes:"markdown-node-label",useHtmlLabels:s},a),h,f=1;if(s){let d=u.children[0],p=Ge(u);f=d.innerHTML.split("
    ").length,d.innerHTML.includes("")&&(f+=d.innerHTML.split("").length-1);let m=d.getElementsByTagName("img");if(m){let g=l.replace(/]*>/g,"").trim()==="";await Promise.all([...m].map(y=>new Promise(v=>{function x(){if(y.style.display="flex",y.style.flexDirection="column",g){let b=a.fontSize?.toString()??window.getComputedStyle(document.body).fontSize,C=parseInt(b,10)*5+"px";y.style.minWidth=C,y.style.maxWidth=C}else y.style.width="100%";v(y)}o(x,"setupImage"),setTimeout(()=>{y.complete&&x()}),y.addEventListener("error",x),y.addEventListener("load",x)})))}h=d.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}else{n.includes("font-weight: bolder")&&Ge(u).selectAll("tspan").attr("font-weight",""),f=u.children.length;let d=u.children[0];(u.textContent===""||u.textContent.includes(">"))&&(d.textContent=l[0]+l.substring(1).replaceAll(">",">").replaceAll("<","<").trim(),l[1]===" "&&(d.textContent=d.textContent[0]+" "+d.textContent.substring(1))),d.textContent==="undefined"&&(d.textContent=""),h=u.getBBox()}return i.attr("transform","translate(0,"+(-h.height/(2*f)+r)+")"),h.height}var FZ=N(()=>{"use strict";dr();ji();Ft();ir();zt();to();gr();o(BZ,"textHelper");o(Vw,"addText")});async function $Z(t,e){let r=me(),n=r.class.padding??12,i=n,a=e.useHtmlLabels??fr(r.htmlLabels)??!0,s=e;s.annotations=s.annotations??[],s.members=s.members??[],s.methods=s.methods??[];let{shapeSvg:l,bbox:u}=await BZ(t,e,r,a,i),{labelStyles:h,nodeStyles:f}=Qe(e);e.labelStyle=h,e.cssStyles=s.styles||"";let d=s.styles?.join(";")||f||"";e.cssStyles||(e.cssStyles=d.replaceAll("!important","").split(";"));let p=s.members.length===0&&s.methods.length===0&&!r.class?.hideEmptyMembersBox,m=Xe.svg(l),g=Ke(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=u.width,v=u.height;s.members.length===0&&s.methods.length===0?v+=i:s.members.length>0&&s.methods.length===0&&(v+=i*2);let x=-y/2,b=-v/2,w=m.rectangle(x-n,b-n-(p?n:s.members.length===0&&s.methods.length===0?-n/2:0),y+2*n,v+2*n+(p?n*2:s.members.length===0&&s.methods.length===0?-n:0),g),C=l.insert(()=>w,":first-child");C.attr("class","basic label-container");let T=C.node().getBBox();l.selectAll(".text").each((_,I,D)=>{let k=Ge(D[I]),L=k.attr("transform"),R=0;if(L){let F=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(L);F&&(R=parseFloat(F[2]))}let O=R+b+n-(p?n:s.members.length===0&&s.methods.length===0?-n/2:0);a||(O-=4);let M=x;(k.attr("class").includes("label-group")||k.attr("class").includes("annotation-group"))&&(M=-k.node()?.getBBox().width/2||0,l.selectAll("text").each(function(B,F,P){window.getComputedStyle(P[F]).textAnchor==="middle"&&(M=0)})),k.attr("transform",`translate(${M}, ${O})`)});let E=l.select(".annotation-group").node().getBBox().height-(p?n/2:0)||0,A=l.select(".label-group").node().getBBox().height-(p?n/2:0)||0,S=l.select(".members-group").node().getBBox().height-(p?n/2:0)||0;if(s.members.length>0||s.methods.length>0||p){let _=m.line(T.x,E+A+b+n,T.x+T.width,E+A+b+n,g);l.insert(()=>_).attr("class","divider").attr("style",d)}if(p||s.members.length>0||s.methods.length>0){let _=m.line(T.x,E+A+S+b+i*2+n,T.x+T.width,E+A+S+b+n+i*2,g);l.insert(()=>_).attr("class","divider").attr("style",d)}if(s.look!=="handDrawn"&&l.selectAll("path").attr("style",d),C.select(":nth-child(2)").attr("style",d),l.selectAll(".divider").select("path").attr("style",d),e.labelStyle?l.selectAll("span").attr("style",e.labelStyle):l.selectAll("span").attr("style",d),!a){let _=RegExp(/color\s*:\s*([^;]*)/),I=_.exec(d);if(I){let D=I[0].replace("color","fill");l.selectAll("tspan").attr("style",D)}else if(h){let D=_.exec(h);if(D){let k=D[0].replace("color","fill");l.selectAll("tspan").attr("style",k)}}}return je(e,C),e.intersect=function(_){return Ye.rect(e,_)},l}var zZ=N(()=>{"use strict";Ft();zt();dr();Wt();Ut();Ht();FZ();gr();o($Z,"classBox")});async function GZ(t,e){let{labelStyles:r,nodeStyles:n}=Qe(e);e.labelStyle=r;let i=e,a=e,s=20,l=20,u="verifyMethod"in e,h=ht(e),f=t.insert("g").attr("class",h).attr("id",e.domId??e.id),d;u?d=await Lu(f,`<<${i.type}>>`,0,e.labelStyle):d=await Lu(f,"<<Element>>",0,e.labelStyle);let p=d,m=await Lu(f,i.name,p,e.labelStyle+"; font-weight: bold;");if(p+=m+l,u){let E=await Lu(f,`${i.requirementId?`Id: ${i.requirementId}`:""}`,p,e.labelStyle);p+=E;let A=await Lu(f,`${i.text?`Text: ${i.text}`:""}`,p,e.labelStyle);p+=A;let S=await Lu(f,`${i.risk?`Risk: ${i.risk}`:""}`,p,e.labelStyle);p+=S,await Lu(f,`${i.verifyMethod?`Verification: ${i.verifyMethod}`:""}`,p,e.labelStyle)}else{let E=await Lu(f,`${a.type?`Type: ${a.type}`:""}`,p,e.labelStyle);p+=E,await Lu(f,`${a.docRef?`Doc Ref: ${a.docRef}`:""}`,p,e.labelStyle)}let g=(f.node()?.getBBox().width??200)+s,y=(f.node()?.getBBox().height??200)+s,v=-g/2,x=-y/2,b=Xe.svg(f),w=Ke(e,{});e.look!=="handDrawn"&&(w.roughness=0,w.fillStyle="solid");let C=b.rectangle(v,x,g,y,w),T=f.insert(()=>C,":first-child");if(T.attr("class","basic label-container").attr("style",n),f.selectAll(".label").each((E,A,S)=>{let _=Ge(S[A]),I=_.attr("transform"),D=0,k=0;if(I){let M=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(I);M&&(D=parseFloat(M[1]),k=parseFloat(M[2]))}let L=k-y/2,R=v+s/2;(A===0||A===1)&&(R=D),_.attr("transform",`translate(${R}, ${L+s})`)}),p>d+m+l){let E=b.line(v,x+d+m+l,v+g,x+d+m+l,w);f.insert(()=>E).attr("style",n)}return je(e,T),e.intersect=function(E){return Ye.rect(e,E)},f}async function Lu(t,e,r,n=""){if(e==="")return 0;let i=t.insert("g").attr("class","label").attr("style",n),a=me(),s=a.htmlLabels??!0,l=await Hn(i,Xy(na(e)),{width:ra(e,a)+50,classes:"markdown-node-label",useHtmlLabels:s,style:n},a),u;if(s){let h=l.children[0],f=Ge(l);u=h.getBoundingClientRect(),f.attr("width",u.width),f.attr("height",u.height)}else{let h=l.children[0];for(let f of h.children)f.textContent=f.textContent.replaceAll(">",">").replaceAll("<","<"),n&&f.setAttribute("style",n);u=l.getBBox(),u.height+=6}return i.attr("transform",`translate(${-u.width/2},${-u.height/2+r})`),u.height}var VZ=N(()=>{"use strict";Ft();Ht();Ut();Wt();ir();zt();to();dr();o(GZ,"requirementBox");o(Lu,"addText")});async function UZ(t,e,{config:r}){let{labelStyles:n,nodeStyles:i}=Qe(e);e.labelStyle=n||"";let a=10,s=e.width;e.width=(e.width??200)-10;let{shapeSvg:l,bbox:u,label:h}=await pt(t,e,ht(e)),f=e.padding||10,d="",p;"ticket"in e&&e.ticket&&r?.kanban?.ticketBaseUrl&&(d=r?.kanban?.ticketBaseUrl.replace("#TICKET#",e.ticket),p=l.insert("svg:a",":first-child").attr("class","kanban-ticket-link").attr("xlink:href",d).attr("target","_blank"));let m={useHtmlLabels:e.useHtmlLabels,labelStyle:e.labelStyle||"",width:e.width,img:e.img,padding:e.padding||8,centerLabel:!1},g,y;p?{label:g,bbox:y}=await Dw(p,"ticket"in e&&e.ticket||"",m):{label:g,bbox:y}=await Dw(l,"ticket"in e&&e.ticket||"",m);let{label:v,bbox:x}=await Dw(l,"assigned"in e&&e.assigned||"",m);e.width=s;let b=10,w=e?.width||0,C=Math.max(y.height,x.height)/2,T=Math.max(u.height+b*2,e?.height||0)+C,E=-w/2,A=-T/2;h.attr("transform","translate("+(f-w/2)+", "+(-C-u.height/2)+")"),g.attr("transform","translate("+(f-w/2)+", "+(-C+u.height/2)+")"),v.attr("transform","translate("+(f+w/2-x.width-2*a)+", "+(-C+u.height/2)+")");let S,{rx:_,ry:I}=e,{cssStyles:D}=e;if(e.look==="handDrawn"){let k=Xe.svg(l),L=Ke(e,{}),R=_||I?k.path(Na(E,A,w,T,_||0),L):k.rectangle(E,A,w,T,L);S=l.insert(()=>R,":first-child"),S.attr("class","basic label-container").attr("style",D||null)}else{S=l.insert("rect",":first-child"),S.attr("class","basic label-container __APA__").attr("style",i).attr("rx",_??5).attr("ry",I??5).attr("x",E).attr("y",A).attr("width",w).attr("height",T);let k="priority"in e&&e.priority;if(k){let L=l.append("line"),R=E+2,O=A+Math.floor((_??0)/2),M=A+T-Math.floor((_??0)/2);L.attr("x1",R).attr("y1",O).attr("x2",R).attr("y2",M).attr("stroke-width","4").attr("stroke",k_e(k))}}return je(e,S),e.height=T,e.intersect=function(k){return Ye.rect(e,k)},l}var k_e,HZ=N(()=>{"use strict";Ft();Ht();qh();Ut();Wt();k_e=o(t=>{switch(t){case"Very High":return"red";case"High":return"orange";case"Medium":return null;case"Low":return"blue";case"Very Low":return"lightblue"}},"colorFromPriority");o(UZ,"kanbanItem")});function WZ(t){return t in QD}var E_e,S_e,QD,ZD=N(()=>{"use strict";NK();OK();BK();$K();GK();UK();WK();YK();jK();QK();JK();tQ();nQ();aQ();oQ();cQ();hQ();dQ();mQ();yQ();xQ();wQ();kQ();SQ();AQ();DQ();RQ();MQ();OQ();BQ();$Q();GQ();UQ();WQ();YQ();jQ();QQ();JQ();tZ();nZ();aZ();oZ();cZ();hZ();dZ();mZ();yZ();xZ();wZ();kZ();SZ();AZ();DZ();RZ();MZ();OZ();PZ();zZ();VZ();HZ();E_e=[{semanticName:"Process",name:"Rectangle",shortName:"rect",description:"Standard process shape",aliases:["proc","process","rectangle"],internalAliases:["squareRect"],handler:iZ},{semanticName:"Event",name:"Rounded Rectangle",shortName:"rounded",description:"Represents an event",aliases:["event"],internalAliases:["roundedRect"],handler:ZQ},{semanticName:"Terminal Point",name:"Stadium",shortName:"stadium",description:"Terminal point",aliases:["terminal","pill"],handler:sZ},{semanticName:"Subprocess",name:"Framed Rectangle",shortName:"fr-rect",description:"Subprocess",aliases:["subprocess","subproc","framed-rectangle","subroutine"],handler:pZ},{semanticName:"Database",name:"Cylinder",shortName:"cyl",description:"Database storage",aliases:["db","database","cylinder"],handler:ZK},{semanticName:"Start",name:"Circle",shortName:"circle",description:"Starting point",aliases:["circ"],handler:zK},{semanticName:"Decision",name:"Diamond",shortName:"diam",description:"Decision-making step",aliases:["decision","diamond","question"],handler:qQ},{semanticName:"Prepare Conditional",name:"Hexagon",shortName:"hex",description:"Preparation or condition step",aliases:["hexagon","prepare"],handler:fQ},{semanticName:"Data Input/Output",name:"Lean Right",shortName:"lean-r",description:"Represents input or output",aliases:["lean-right","in-out"],internalAliases:["lean_right"],handler:NQ},{semanticName:"Data Input/Output",name:"Lean Left",shortName:"lean-l",description:"Represents output or input",aliases:["lean-left","out-in"],internalAliases:["lean_left"],handler:LQ},{semanticName:"Priority Action",name:"Trapezoid Base Bottom",shortName:"trap-b",description:"Priority action",aliases:["priority","trapezoid-bottom","trapezoid"],handler:EZ},{semanticName:"Manual Operation",name:"Trapezoid Base Top",shortName:"trap-t",description:"Represents a manual task",aliases:["manual","trapezoid-top","inv-trapezoid"],internalAliases:["inv_trapezoid"],handler:CQ},{semanticName:"Stop",name:"Double Circle",shortName:"dbl-circ",description:"Represents a stop point",aliases:["double-circle"],internalAliases:["doublecircle"],handler:rQ},{semanticName:"Text Block",name:"Text Block",shortName:"text",description:"Text block",handler:bZ},{semanticName:"Card",name:"Notched Rectangle",shortName:"notch-rect",description:"Represents a card",aliases:["card","notched-rectangle"],handler:PK},{semanticName:"Lined/Shaded Process",name:"Lined Rectangle",shortName:"lin-rect",description:"Lined process shape",aliases:["lined-rectangle","lined-process","lin-proc","shaded-process"],handler:eZ},{semanticName:"Start",name:"Small Circle",shortName:"sm-circ",description:"Small starting point",aliases:["start","small-circle"],internalAliases:["stateStart"],handler:fZ},{semanticName:"Stop",name:"Framed Circle",shortName:"fr-circ",description:"Stop point",aliases:["stop","framed-circle"],internalAliases:["stateEnd"],handler:uZ},{semanticName:"Fork/Join",name:"Filled Rectangle",shortName:"fork",description:"Fork or join in process flow",aliases:["join"],internalAliases:["forkJoin"],handler:lQ},{semanticName:"Collate",name:"Hourglass",shortName:"hourglass",description:"Represents a collate operation",aliases:["hourglass","collate"],handler:pQ},{semanticName:"Comment",name:"Curly Brace",shortName:"brace",description:"Adds a comment",aliases:["comment","brace-l"],handler:HK},{semanticName:"Comment Right",name:"Curly Brace",shortName:"brace-r",description:"Adds a comment",handler:qK},{semanticName:"Comment with braces on both sides",name:"Curly Braces",shortName:"braces",description:"Adds a comment",handler:XK},{semanticName:"Com Link",name:"Lightning Bolt",shortName:"bolt",description:"Communication link",aliases:["com-link","lightning-bolt"],handler:IQ},{semanticName:"Document",name:"Document",shortName:"doc",description:"Represents a document",aliases:["doc","document"],handler:LZ},{semanticName:"Delay",name:"Half-Rounded Rectangle",shortName:"delay",description:"Represents a delay",aliases:["half-rounded-rectangle"],handler:uQ},{semanticName:"Direct Access Storage",name:"Horizontal Cylinder",shortName:"h-cyl",description:"Direct access storage",aliases:["das","horizontal-cylinder"],handler:TZ},{semanticName:"Disk Storage",name:"Lined Cylinder",shortName:"lin-cyl",description:"Disk storage",aliases:["disk","lined-cylinder"],handler:PQ},{semanticName:"Display",name:"Curved Trapezoid",shortName:"curv-trap",description:"Represents a display",aliases:["curved-trapezoid","display"],handler:KK},{semanticName:"Divided Process",name:"Divided Rectangle",shortName:"div-rect",description:"Divided process shape",aliases:["div-proc","divided-rectangle","divided-process"],handler:eQ},{semanticName:"Extract",name:"Triangle",shortName:"tri",description:"Extraction process",aliases:["extract","triangle"],handler:_Z},{semanticName:"Internal Storage",name:"Window Pane",shortName:"win-pane",description:"Internal storage",aliases:["internal-storage","window-pane"],handler:IZ},{semanticName:"Junction",name:"Filled Circle",shortName:"f-circ",description:"Junction point",aliases:["junction","filled-circle"],handler:iQ},{semanticName:"Loop Limit",name:"Trapezoidal Pentagon",shortName:"notch-pent",description:"Loop limit step",aliases:["loop-limit","notched-pentagon"],handler:CZ},{semanticName:"Manual File",name:"Flipped Triangle",shortName:"flip-tri",description:"Manual file operation",aliases:["manual-file","flipped-triangle"],handler:sQ},{semanticName:"Manual Input",name:"Sloped Rectangle",shortName:"sl-rect",description:"Manual input step",aliases:["manual-input","sloped-rectangle"],handler:rZ},{semanticName:"Multi-Document",name:"Stacked Document",shortName:"docs",description:"Multiple documents",aliases:["documents","st-doc","stacked-document"],handler:VQ},{semanticName:"Multi-Process",name:"Stacked Rectangle",shortName:"st-rect",description:"Multiple processes",aliases:["procs","processes","stacked-rectangle"],handler:zQ},{semanticName:"Stored Data",name:"Bow Tie Rectangle",shortName:"bow-rect",description:"Stored data",aliases:["stored-data","bow-tie-rectangle"],handler:IK},{semanticName:"Summary",name:"Crossed Circle",shortName:"cross-circ",description:"Summary",aliases:["summary","crossed-circle"],handler:VK},{semanticName:"Tagged Document",name:"Tagged Document",shortName:"tag-doc",description:"Tagged document",aliases:["tag-doc","tagged-document"],handler:vZ},{semanticName:"Tagged Process",name:"Tagged Rectangle",shortName:"tag-rect",description:"Tagged process",aliases:["tagged-rectangle","tag-proc","tagged-process"],handler:gZ},{semanticName:"Paper Tape",name:"Flag",shortName:"flag",description:"Paper tape",aliases:["paper-tape"],handler:NZ},{semanticName:"Odd",name:"Odd",shortName:"odd",description:"Odd shape",internalAliases:["rect_left_inv_arrow"],handler:XQ},{semanticName:"Lined Document",name:"Lined Document",shortName:"lin-doc",description:"Lined document",aliases:["lined-document"],handler:FQ}],S_e=o(()=>{let e=[...Object.entries({state:lZ,choice:FK,note:HQ,rectWithTitle:KQ,labelRect:_Q,iconSquare:TQ,iconCircle:vQ,icon:gQ,iconRounded:bQ,imageSquare:EQ,anchor:RK,kanbanItem:UZ,classBox:$Z,erBox:KD,requirementBox:GZ}),...E_e.flatMap(r=>[r.shortName,..."aliases"in r?r.aliases:[],..."internalAliases"in r?r.internalAliases:[]].map(i=>[i,r.handler]))];return Object.fromEntries(e)},"generateShapeMap"),QD=S_e();o(WZ,"isValidShape")});var C_e,Uw,qZ=N(()=>{"use strict";dr();Ew();zt();vt();ZD();ir();gr();mi();C_e="flowchart-",Uw=class{constructor(){this.vertexCounter=0;this.config=me();this.vertices=new Map;this.edges=[];this.classes=new Map;this.subGraphs=[];this.subGraphLookup=new Map;this.tooltips=new Map;this.subCount=0;this.firstGraphFlag=!0;this.secCount=-1;this.posCrossRef=[];this.funs=[];this.setAccTitle=Lr;this.setAccDescription=Nr;this.setDiagramTitle=$r;this.getAccTitle=Rr;this.getAccDescription=Mr;this.getDiagramTitle=Ir;this.funs.push(this.setupToolTips.bind(this)),this.addVertex=this.addVertex.bind(this),this.firstGraph=this.firstGraph.bind(this),this.setDirection=this.setDirection.bind(this),this.addSubGraph=this.addSubGraph.bind(this),this.addLink=this.addLink.bind(this),this.setLink=this.setLink.bind(this),this.updateLink=this.updateLink.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.destructLink=this.destructLink.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setTooltip=this.setTooltip.bind(this),this.updateLinkInterpolate=this.updateLinkInterpolate.bind(this),this.setClickFun=this.setClickFun.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.lex={firstGraph:this.firstGraph.bind(this)},this.clear(),this.setGen("gen-2")}static{o(this,"FlowDB")}sanitizeText(e){return Ze.sanitizeText(e,this.config)}lookUpDomId(e){for(let r of this.vertices.values())if(r.id===e)return r.domId;return e}addVertex(e,r,n,i,a,s,l={},u){if(!e||e.trim().length===0)return;let h;if(u!==void 0){let m;u.includes(` +`)?m=u+` +`:m=`{ +`+u+` +}`,h=cm(m,{schema:lm})}let f=this.edges.find(m=>m.id===e);if(f){let m=h;m?.animate!==void 0&&(f.animate=m.animate),m?.animation!==void 0&&(f.animation=m.animation);return}let d,p=this.vertices.get(e);if(p===void 0&&(p={id:e,labelType:"text",domId:C_e+e+"-"+this.vertexCounter,styles:[],classes:[]},this.vertices.set(e,p)),this.vertexCounter++,r!==void 0?(this.config=me(),d=this.sanitizeText(r.text.trim()),p.labelType=r.type,d.startsWith('"')&&d.endsWith('"')&&(d=d.substring(1,d.length-1)),p.text=d):p.text===void 0&&(p.text=e),n!==void 0&&(p.type=n),i?.forEach(m=>{p.styles.push(m)}),a?.forEach(m=>{p.classes.push(m)}),s!==void 0&&(p.dir=s),p.props===void 0?p.props=l:l!==void 0&&Object.assign(p.props,l),h!==void 0){if(h.shape){if(h.shape!==h.shape.toLowerCase()||h.shape.includes("_"))throw new Error(`No such shape: ${h.shape}. Shape names should be lowercase.`);if(!WZ(h.shape))throw new Error(`No such shape: ${h.shape}.`);p.type=h?.shape}h?.label&&(p.text=h?.label),h?.icon&&(p.icon=h?.icon,!h.label?.trim()&&p.text===e&&(p.text="")),h?.form&&(p.form=h?.form),h?.pos&&(p.pos=h?.pos),h?.img&&(p.img=h?.img,!h.label?.trim()&&p.text===e&&(p.text="")),h?.constraint&&(p.constraint=h.constraint),h.w&&(p.assetWidth=Number(h.w)),h.h&&(p.assetHeight=Number(h.h))}}addSingleLink(e,r,n,i){let l={start:e,end:r,type:void 0,text:"",labelType:"text",classes:[],isUserDefinedId:!1,interpolate:this.edges.defaultInterpolate};Y.info("abc78 Got edge...",l);let u=n.text;if(u!==void 0&&(l.text=this.sanitizeText(u.text.trim()),l.text.startsWith('"')&&l.text.endsWith('"')&&(l.text=l.text.substring(1,l.text.length-1)),l.labelType=u.type),n!==void 0&&(l.type=n.type,l.stroke=n.stroke,l.length=n.length>10?10:n.length),i&&!this.edges.some(h=>h.id===i))l.id=i,l.isUserDefinedId=!0;else{let h=this.edges.filter(f=>f.start===l.start&&f.end===l.end);h.length===0?l.id=$h(l.start,l.end,{counter:0,prefix:"L"}):l.id=$h(l.start,l.end,{counter:h.length+1,prefix:"L"})}if(this.edges.length<(this.config.maxEdges??500))Y.info("Pushing edge..."),this.edges.push(l);else throw new Error(`Edge limit exceeded. ${this.edges.length} edges found, but the limit is ${this.config.maxEdges}. + +Initialize mermaid with maxEdges set to a higher number to allow more edges. +You cannot set this config via configuration inside the diagram as it is a secure config. +You have to call mermaid.initialize.`)}isLinkData(e){return e!==null&&typeof e=="object"&&"id"in e&&typeof e.id=="string"}addLink(e,r,n){let i=this.isLinkData(n)?n.id.replace("@",""):void 0;Y.info("addLink",e,r,i);for(let a of e)for(let s of r){let l=a===e[e.length-1],u=s===r[0];l&&u?this.addSingleLink(a,s,n,i):this.addSingleLink(a,s,n,void 0)}}updateLinkInterpolate(e,r){e.forEach(n=>{n==="default"?this.edges.defaultInterpolate=r:this.edges[n].interpolate=r})}updateLink(e,r){e.forEach(n=>{if(typeof n=="number"&&n>=this.edges.length)throw new Error(`The index ${n} for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and ${this.edges.length-1}. (Help: Ensure that the index is within the range of existing edges.)`);n==="default"?this.edges.defaultStyle=r:(this.edges[n].style=r,(this.edges[n]?.style?.length??0)>0&&!this.edges[n]?.style?.some(i=>i?.startsWith("fill"))&&this.edges[n]?.style?.push("fill:none"))})}addClass(e,r){let n=r.join().replace(/\\,/g,"\xA7\xA7\xA7").replace(/,/g,";").replace(/§§§/g,",").split(";");e.split(",").forEach(i=>{let a=this.classes.get(i);a===void 0&&(a={id:i,styles:[],textStyles:[]},this.classes.set(i,a)),n?.forEach(s=>{if(/color/.exec(s)){let l=s.replace("fill","bgFill");a.textStyles.push(l)}a.styles.push(s)})})}setDirection(e){this.direction=e,/.*/.exec(this.direction)&&(this.direction="LR"),/.*v/.exec(this.direction)&&(this.direction="TB"),this.direction==="TD"&&(this.direction="TB")}setClass(e,r){for(let n of e.split(",")){let i=this.vertices.get(n);i&&i.classes.push(r);let a=this.edges.find(l=>l.id===n);a&&a.classes.push(r);let s=this.subGraphLookup.get(n);s&&s.classes.push(r)}}setTooltip(e,r){if(r!==void 0){r=this.sanitizeText(r);for(let n of e.split(","))this.tooltips.set(this.version==="gen-1"?this.lookUpDomId(n):n,r)}}setClickFun(e,r,n){let i=this.lookUpDomId(e);if(me().securityLevel!=="loose"||r===void 0)return;let a=[];if(typeof n=="string"){a=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let l=0;l{let l=document.querySelector(`[id="${i}"]`);l!==null&&l.addEventListener("click",()=>{Gt.runFunc(r,...a)},!1)}))}setLink(e,r,n){e.split(",").forEach(i=>{let a=this.vertices.get(i);a!==void 0&&(a.link=Gt.formatUrl(r,this.config),a.linkTarget=n)}),this.setClass(e,"clickable")}getTooltip(e){return this.tooltips.get(e)}setClickEvent(e,r,n){e.split(",").forEach(i=>{this.setClickFun(i,r,n)}),this.setClass(e,"clickable")}bindFunctions(e){this.funs.forEach(r=>{r(e)})}getDirection(){return this.direction?.trim()}getVertices(){return this.vertices}getEdges(){return this.edges}getClasses(){return this.classes}setupToolTips(e){let r=Ge(".mermaidTooltip");(r._groups||r)[0][0]===null&&(r=Ge("body").append("div").attr("class","mermaidTooltip").style("opacity",0)),Ge(e).select("svg").selectAll("g.node").on("mouseover",a=>{let s=Ge(a.currentTarget);if(s.attr("title")===null)return;let u=a.currentTarget?.getBoundingClientRect();r.transition().duration(200).style("opacity",".9"),r.text(s.attr("title")).style("left",window.scrollX+u.left+(u.right-u.left)/2+"px").style("top",window.scrollY+u.bottom+"px"),r.html(r.html().replace(/<br\/>/g,"
    ")),s.classed("hover",!0)}).on("mouseout",a=>{r.transition().duration(500).style("opacity",0),Ge(a.currentTarget).classed("hover",!1)})}clear(e="gen-2"){this.vertices=new Map,this.classes=new Map,this.edges=[],this.funs=[this.setupToolTips.bind(this)],this.subGraphs=[],this.subGraphLookup=new Map,this.subCount=0,this.tooltips=new Map,this.firstGraphFlag=!0,this.version=e,this.config=me(),Ar()}setGen(e){this.version=e||"gen-2"}defaultStyle(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"}addSubGraph(e,r,n){let i=e.text.trim(),a=n.text;e===n&&/\s/.exec(n.text)&&(i=void 0);let s=o(f=>{let d={boolean:{},number:{},string:{}},p=[],m;return{nodeList:f.filter(function(y){let v=typeof y;return y.stmt&&y.stmt==="dir"?(m=y.value,!1):y.trim()===""?!1:v in d?d[v].hasOwnProperty(y)?!1:d[v][y]=!0:p.includes(y)?!1:p.push(y)}),dir:m}},"uniq"),{nodeList:l,dir:u}=s(r.flat());if(this.version==="gen-1")for(let f=0;f2e3)return{result:!1,count:0};if(this.posCrossRef[this.secCount]=r,this.subGraphs[r].id===e)return{result:!0,count:0};let i=0,a=1;for(;i=0){let l=this.indexNodes2(e,s);if(l.result)return{result:!0,count:a+l.count};a=a+l.count}i=i+1}return{result:!1,count:a}}getDepthFirstPos(e){return this.posCrossRef[e]}indexNodes(){this.secCount=-1,this.subGraphs.length>0&&this.indexNodes2("none",this.subGraphs.length-1)}getSubGraphs(){return this.subGraphs}firstGraph(){return this.firstGraphFlag?(this.firstGraphFlag=!1,!0):!1}destructStartLink(e){let r=e.trim(),n="arrow_open";switch(r[0]){case"<":n="arrow_point",r=r.slice(1);break;case"x":n="arrow_cross",r=r.slice(1);break;case"o":n="arrow_circle",r=r.slice(1);break}let i="normal";return r.includes("=")&&(i="thick"),r.includes(".")&&(i="dotted"),{type:n,stroke:i}}countChar(e,r){let n=r.length,i=0;for(let a=0;a":i="arrow_point",r.startsWith("<")&&(i="double_"+i,n=n.slice(1));break;case"o":i="arrow_circle",r.startsWith("o")&&(i="double_"+i,n=n.slice(1));break}let a="normal",s=n.length-1;n.startsWith("=")&&(a="thick"),n.startsWith("~")&&(a="invisible");let l=this.countChar(".",n);return l&&(a="dotted",s=l),{type:i,stroke:a,length:s}}destructLink(e,r){let n=this.destructEndLink(e),i;if(r){if(i=this.destructStartLink(r),i.stroke!==n.stroke)return{type:"INVALID",stroke:"INVALID"};if(i.type==="arrow_open")i.type=n.type;else{if(i.type!==n.type)return{type:"INVALID",stroke:"INVALID"};i.type="double_"+i.type}return i.type==="double_arrow"&&(i.type="double_arrow_point"),i.length=n.length,i}return n}exists(e,r){for(let n of e)if(n.nodes.includes(r))return!0;return!1}makeUniq(e,r){let n=[];return e.nodes.forEach((i,a)=>{this.exists(r,i)||n.push(e.nodes[a])}),{nodes:n}}getTypeFromVertex(e){if(e.img)return"imageSquare";if(e.icon)return e.form==="circle"?"iconCircle":e.form==="square"?"iconSquare":e.form==="rounded"?"iconRounded":"icon";switch(e.type){case"square":case void 0:return"squareRect";case"round":return"roundedRect";case"ellipse":return"ellipse";default:return e.type}}findNode(e,r){return e.find(n=>n.id===r)}destructEdgeType(e){let r="none",n="arrow_point";switch(e){case"arrow_point":case"arrow_circle":case"arrow_cross":n=e;break;case"double_arrow_point":case"double_arrow_circle":case"double_arrow_cross":r=e.replace("double_",""),n=r;break}return{arrowTypeStart:r,arrowTypeEnd:n}}addNodeFromVertex(e,r,n,i,a,s){let l=n.get(e.id),u=i.get(e.id)??!1,h=this.findNode(r,e.id);if(h)h.cssStyles=e.styles,h.cssCompiledStyles=this.getCompiledStyles(e.classes),h.cssClasses=e.classes.join(" ");else{let f={id:e.id,label:e.text,labelStyle:"",parentId:l,padding:a.flowchart?.padding||8,cssStyles:e.styles,cssCompiledStyles:this.getCompiledStyles(["default","node",...e.classes]),cssClasses:"default "+e.classes.join(" "),dir:e.dir,domId:e.domId,look:s,link:e.link,linkTarget:e.linkTarget,tooltip:this.getTooltip(e.id),icon:e.icon,pos:e.pos,img:e.img,assetWidth:e.assetWidth,assetHeight:e.assetHeight,constraint:e.constraint};u?r.push({...f,isGroup:!0,shape:"rect"}):r.push({...f,isGroup:!1,shape:this.getTypeFromVertex(e)})}}getCompiledStyles(e){let r=[];for(let n of e){let i=this.classes.get(n);i?.styles&&(r=[...r,...i.styles??[]].map(a=>a.trim())),i?.textStyles&&(r=[...r,...i.textStyles??[]].map(a=>a.trim()))}return r}getData(){let e=me(),r=[],n=[],i=this.getSubGraphs(),a=new Map,s=new Map;for(let h=i.length-1;h>=0;h--){let f=i[h];f.nodes.length>0&&s.set(f.id,!0);for(let d of f.nodes)a.set(d,f.id)}for(let h=i.length-1;h>=0;h--){let f=i[h];r.push({id:f.id,label:f.title,labelStyle:"",parentId:a.get(f.id),padding:8,cssCompiledStyles:this.getCompiledStyles(f.classes),cssClasses:f.classes.join(" "),shape:"rect",dir:f.dir,isGroup:!0,look:e.look})}this.getVertices().forEach(h=>{this.addNodeFromVertex(h,r,a,s,e,e.look||"classic")});let u=this.getEdges();return u.forEach((h,f)=>{let{arrowTypeStart:d,arrowTypeEnd:p}=this.destructEdgeType(h.type),m=[...u.defaultStyle??[]];h.style&&m.push(...h.style);let g={id:$h(h.start,h.end,{counter:f,prefix:"L"},h.id),isUserDefinedId:h.isUserDefinedId,start:h.start,end:h.end,type:h.type??"normal",label:h.text,labelpos:"c",thickness:h.stroke,minlen:h.length,classes:h?.stroke==="invisible"?"":"edge-thickness-normal edge-pattern-solid flowchart-link",arrowTypeStart:h?.stroke==="invisible"||h?.type==="arrow_open"?"none":d,arrowTypeEnd:h?.stroke==="invisible"||h?.type==="arrow_open"?"none":p,arrowheadStyle:"fill: #333",cssCompiledStyles:this.getCompiledStyles(h.classes),labelStyle:m,style:m,pattern:h.stroke,look:e.look,animate:h.animate,animation:h.animation,curve:h.interpolate||this.edges.defaultInterpolate||e.flowchart?.curve};n.push(g)}),{nodes:r,edges:n,other:{},config:e}}defaultConfig(){return A3.flowchart}}});var yc,gm=N(()=>{"use strict";dr();yc=o((t,e)=>{let r;return e==="sandbox"&&(r=Ge("#i"+t)),(e==="sandbox"?Ge(r.nodes()[0].contentDocument.body):Ge("body")).select(`[id="${t}"]`)},"getDiagramElement")});var Ru,w2=N(()=>{"use strict";Ru=o(({flowchart:t})=>{let e=t?.subGraphTitleMargin?.top??0,r=t?.subGraphTitleMargin?.bottom??0,n=e+r;return{subGraphTitleTopMargin:e,subGraphTitleBottomMargin:r,subGraphTitleTotalMargin:n}},"getSubGraphTitleMargins")});var YZ,A_e,__e,D_e,L_e,R_e,N_e,XZ,ym,jZ,Hw=N(()=>{"use strict";zt();gr();vt();w2();dr();Wt();to();RD();Gw();qh();Ut();YZ=o(async(t,e)=>{Y.info("Creating subgraph rect for ",e.id,e);let r=me(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:l,nodeStyles:u,borderStyles:h,backgroundStyles:f}=Qe(e),d=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),p=fr(r.flowchart.htmlLabels),m=d.insert("g").attr("class","cluster-label "),g=await Hn(m,e.label,{style:e.labelStyle,useHtmlLabels:p,isNode:!0}),y=g.getBBox();if(fr(r.flowchart.htmlLabels)){let A=g.children[0],S=Ge(g);y=A.getBoundingClientRect(),S.attr("width",y.width),S.attr("height",y.height)}let v=e.width<=y.width+e.padding?y.width+e.padding:e.width;e.width<=y.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-v/2,w=e.y-x/2;Y.trace("Data ",e,JSON.stringify(e));let C;if(e.look==="handDrawn"){let A=Xe.svg(d),S=Ke(e,{roughness:.7,fill:a,stroke:s,fillWeight:3,seed:i}),_=A.path(Na(b,w,v,x,0),S);C=d.insert(()=>(Y.debug("Rough node insert CXC",_),_),":first-child"),C.select("path:nth-child(2)").attr("style",h.join(";")),C.select("path").attr("style",f.join(";").replace("fill","stroke"))}else C=d.insert("rect",":first-child"),C.attr("style",u).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",w).attr("width",v).attr("height",x);let{subGraphTitleTopMargin:T}=Ru(r);if(m.attr("transform",`translate(${e.x-y.width/2}, ${e.y-e.height/2+T})`),l){let A=m.select("span");A&&A.attr("style",l)}let E=C.node().getBBox();return e.offsetX=0,e.width=E.width,e.height=E.height,e.offsetY=y.height-e.padding/2,e.intersect=function(A){return Vh(e,A)},{cluster:d,labelBBox:y}},"rect"),A_e=o((t,e)=>{let r=t.insert("g").attr("class","note-cluster").attr("id",e.id),n=r.insert("rect",":first-child"),i=0*e.padding,a=i/2;n.attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2-a).attr("width",e.width+i).attr("height",e.height+i).attr("fill","none");let s=n.node().getBBox();return e.width=s.width,e.height=s.height,e.intersect=function(l){return Vh(e,l)},{cluster:r,labelBBox:{width:0,height:0}}},"noteGroup"),__e=o(async(t,e)=>{let r=me(),{themeVariables:n,handDrawnSeed:i}=r,{altBackground:a,compositeBackground:s,compositeTitleBackground:l,nodeBorder:u}=n,h=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-id",e.id).attr("data-look",e.look),f=h.insert("g",":first-child"),d=h.insert("g").attr("class","cluster-label"),p=h.append("rect"),m=d.node().appendChild(await gc(e.label,e.labelStyle,void 0,!0)),g=m.getBBox();if(fr(r.flowchart.htmlLabels)){let _=m.children[0],I=Ge(m);g=_.getBoundingClientRect(),I.attr("width",g.width),I.attr("height",g.height)}let y=0*e.padding,v=y/2,x=(e.width<=g.width+e.padding?g.width+e.padding:e.width)+y;e.width<=g.width+e.padding?e.diff=(x-e.width)/2-e.padding:e.diff=-e.padding;let b=e.height+y,w=e.height+y-g.height-6,C=e.x-x/2,T=e.y-b/2;e.width=x;let E=e.y-e.height/2-v+g.height+2,A;if(e.look==="handDrawn"){let _=e.cssClasses.includes("statediagram-cluster-alt"),I=Xe.svg(h),D=e.rx||e.ry?I.path(Na(C,T,x,b,10),{roughness:.7,fill:l,fillStyle:"solid",stroke:u,seed:i}):I.rectangle(C,T,x,b,{seed:i});A=h.insert(()=>D,":first-child");let k=I.rectangle(C,E,x,w,{fill:_?a:s,fillStyle:_?"hachure":"solid",stroke:u,seed:i});A=h.insert(()=>D,":first-child"),p=h.insert(()=>k)}else A=f.insert("rect",":first-child"),A.attr("class","outer").attr("x",C).attr("y",T).attr("width",x).attr("height",b).attr("data-look",e.look),p.attr("class","inner").attr("x",C).attr("y",E).attr("width",x).attr("height",w);d.attr("transform",`translate(${e.x-g.width/2}, ${T+1-(fr(r.flowchart.htmlLabels)?0:3)})`);let S=A.node().getBBox();return e.height=S.height,e.offsetX=0,e.offsetY=g.height-e.padding/2,e.labelBBox=g,e.intersect=function(_){return Vh(e,_)},{cluster:h,labelBBox:g}},"roundedWithTitle"),D_e=o(async(t,e)=>{Y.info("Creating subgraph rect for ",e.id,e);let r=me(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:l,nodeStyles:u,borderStyles:h,backgroundStyles:f}=Qe(e),d=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),p=fr(r.flowchart.htmlLabels),m=d.insert("g").attr("class","cluster-label "),g=await Hn(m,e.label,{style:e.labelStyle,useHtmlLabels:p,isNode:!0,width:e.width}),y=g.getBBox();if(fr(r.flowchart.htmlLabels)){let A=g.children[0],S=Ge(g);y=A.getBoundingClientRect(),S.attr("width",y.width),S.attr("height",y.height)}let v=e.width<=y.width+e.padding?y.width+e.padding:e.width;e.width<=y.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-v/2,w=e.y-x/2;Y.trace("Data ",e,JSON.stringify(e));let C;if(e.look==="handDrawn"){let A=Xe.svg(d),S=Ke(e,{roughness:.7,fill:a,stroke:s,fillWeight:4,seed:i}),_=A.path(Na(b,w,v,x,e.rx),S);C=d.insert(()=>(Y.debug("Rough node insert CXC",_),_),":first-child"),C.select("path:nth-child(2)").attr("style",h.join(";")),C.select("path").attr("style",f.join(";").replace("fill","stroke"))}else C=d.insert("rect",":first-child"),C.attr("style",u).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",w).attr("width",v).attr("height",x);let{subGraphTitleTopMargin:T}=Ru(r);if(m.attr("transform",`translate(${e.x-y.width/2}, ${e.y-e.height/2+T})`),l){let A=m.select("span");A&&A.attr("style",l)}let E=C.node().getBBox();return e.offsetX=0,e.width=E.width,e.height=E.height,e.offsetY=y.height-e.padding/2,e.intersect=function(A){return Vh(e,A)},{cluster:d,labelBBox:y}},"kanbanSection"),L_e=o((t,e)=>{let r=me(),{themeVariables:n,handDrawnSeed:i}=r,{nodeBorder:a}=n,s=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-look",e.look),l=s.insert("g",":first-child"),u=0*e.padding,h=e.width+u;e.diff=-e.padding;let f=e.height+u,d=e.x-h/2,p=e.y-f/2;e.width=h;let m;if(e.look==="handDrawn"){let v=Xe.svg(s).rectangle(d,p,h,f,{fill:"lightgrey",roughness:.5,strokeLineDash:[5],stroke:a,seed:i});m=s.insert(()=>v,":first-child")}else m=l.insert("rect",":first-child"),m.attr("class","divider").attr("x",d).attr("y",p).attr("width",h).attr("height",f).attr("data-look",e.look);let g=m.node().getBBox();return e.height=g.height,e.offsetX=0,e.offsetY=0,e.intersect=function(y){return Vh(e,y)},{cluster:s,labelBBox:{}}},"divider"),R_e=YZ,N_e={rect:YZ,squareRect:R_e,roundedWithTitle:__e,noteGroup:A_e,divider:L_e,kanbanSection:D_e},XZ=new Map,ym=o(async(t,e)=>{let r=e.shape||"rect",n=await N_e[r](t,e);return XZ.set(e.id,n),n},"insertCluster"),jZ=o(()=>{XZ=new Map},"clear")});function Ww(t,e){if(t===void 0||e===void 0)return{angle:0,deltaX:0,deltaY:0};t=Wn(t),e=Wn(e);let[r,n]=[t.x,t.y],[i,a]=[e.x,e.y],s=i-r,l=a-n;return{angle:Math.atan(l/s),deltaX:s,deltaY:l}}var $o,Wn,qw,JD=N(()=>{"use strict";$o={aggregation:18,extension:18,composition:18,dependency:6,lollipop:13.5,arrow_point:4};o(Ww,"calculateDeltaAndAngle");Wn=o(t=>Array.isArray(t)?{x:t[0],y:t[1]}:t,"pointTransformer"),qw=o(t=>({x:o(function(e,r,n){let i=0,a=Wn(n[0]).x=0?1:-1)}else if(r===n.length-1&&Object.hasOwn($o,t.arrowTypeEnd)){let{angle:m,deltaX:g}=Ww(n[n.length-1],n[n.length-2]);i=$o[t.arrowTypeEnd]*Math.cos(m)*(g>=0?1:-1)}let s=Math.abs(Wn(e).x-Wn(n[n.length-1]).x),l=Math.abs(Wn(e).y-Wn(n[n.length-1]).y),u=Math.abs(Wn(e).x-Wn(n[0]).x),h=Math.abs(Wn(e).y-Wn(n[0]).y),f=$o[t.arrowTypeStart],d=$o[t.arrowTypeEnd],p=1;if(s0&&l0&&h=0?1:-1)}else if(r===n.length-1&&Object.hasOwn($o,t.arrowTypeEnd)){let{angle:m,deltaY:g}=Ww(n[n.length-1],n[n.length-2]);i=$o[t.arrowTypeEnd]*Math.abs(Math.sin(m))*(g>=0?1:-1)}let s=Math.abs(Wn(e).y-Wn(n[n.length-1]).y),l=Math.abs(Wn(e).x-Wn(n[n.length-1]).x),u=Math.abs(Wn(e).y-Wn(n[0]).y),h=Math.abs(Wn(e).x-Wn(n[0]).x),f=$o[t.arrowTypeStart],d=$o[t.arrowTypeEnd],p=1;if(s0&&l0&&h{"use strict";vt();QZ=o((t,e,r,n,i,a)=>{e.arrowTypeStart&&KZ(t,"start",e.arrowTypeStart,r,n,i,a),e.arrowTypeEnd&&KZ(t,"end",e.arrowTypeEnd,r,n,i,a)},"addEdgeMarkers"),M_e={arrow_cross:{type:"cross",fill:!1},arrow_point:{type:"point",fill:!0},arrow_barb:{type:"barb",fill:!0},arrow_circle:{type:"circle",fill:!1},aggregation:{type:"aggregation",fill:!1},extension:{type:"extension",fill:!1},composition:{type:"composition",fill:!0},dependency:{type:"dependency",fill:!0},lollipop:{type:"lollipop",fill:!1},only_one:{type:"onlyOne",fill:!1},zero_or_one:{type:"zeroOrOne",fill:!1},one_or_more:{type:"oneOrMore",fill:!1},zero_or_more:{type:"zeroOrMore",fill:!1},requirement_arrow:{type:"requirement_arrow",fill:!1},requirement_contains:{type:"requirement_contains",fill:!1}},KZ=o((t,e,r,n,i,a,s)=>{let l=M_e[r];if(!l){Y.warn(`Unknown arrow type: ${r}`);return}let u=l.type,f=`${i}_${a}-${u}${e==="start"?"Start":"End"}`;if(s&&s.trim()!==""){let d=s.replace(/[^\dA-Za-z]/g,"_"),p=`${f}_${d}`;if(!document.getElementById(p)){let m=document.getElementById(f);if(m){let g=m.cloneNode(!0);g.id=p,g.querySelectorAll("path, circle, line").forEach(v=>{v.setAttribute("stroke",s),l.fill&&v.setAttribute("fill",s)}),m.parentNode?.appendChild(g)}}t.attr(`marker-${e}`,`url(${n}#${p})`)}else t.attr(`marker-${e}`,`url(${n}#${f})`)},"addEdgeMarker")});function Yw(t,e){me().flowchart.htmlLabels&&t&&(t.style.width=e.length*9+"px",t.style.height="12px")}function P_e(t){let e=[],r=[];for(let n=1;n5&&Math.abs(a.y-i.y)>5||i.y===a.y&&a.x===s.x&&Math.abs(a.x-i.x)>5&&Math.abs(a.y-s.y)>5)&&(e.push(a),r.push(n))}return{cornerPoints:e,cornerPointPositions:r}}var Xw,pa,tJ,T2,jw,Kw,I_e,O_e,JZ,eJ,B_e,Qw,eL=N(()=>{"use strict";zt();gr();vt();to();ir();JD();w2();dr();Wt();Gw();ZZ();Ut();Xw=new Map,pa=new Map,tJ=o(()=>{Xw.clear(),pa.clear()},"clear"),T2=o(t=>t?t.reduce((r,n)=>r+";"+n,""):"","getLabelStyles"),jw=o(async(t,e)=>{let r=fr(me().flowchart.htmlLabels),n=await Hn(t,e.label,{style:T2(e.labelStyle),useHtmlLabels:r,addSvgBackground:!0,isNode:!1});Y.info("abc82",e,e.labelType);let i=t.insert("g").attr("class","edgeLabel"),a=i.insert("g").attr("class","label");a.node().appendChild(n);let s=n.getBBox();if(r){let u=n.children[0],h=Ge(n);s=u.getBoundingClientRect(),h.attr("width",s.width),h.attr("height",s.height)}a.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),Xw.set(e.id,i),e.width=s.width,e.height=s.height;let l;if(e.startLabelLeft){let u=await gc(e.startLabelLeft,T2(e.labelStyle)),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),pa.get(e.id)||pa.set(e.id,{}),pa.get(e.id).startLeft=h,Yw(l,e.startLabelLeft)}if(e.startLabelRight){let u=await gc(e.startLabelRight,T2(e.labelStyle)),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=h.node().appendChild(u),f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),pa.get(e.id)||pa.set(e.id,{}),pa.get(e.id).startRight=h,Yw(l,e.startLabelRight)}if(e.endLabelLeft){let u=await gc(e.endLabelLeft,T2(e.labelStyle)),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),h.node().appendChild(u),pa.get(e.id)||pa.set(e.id,{}),pa.get(e.id).endLeft=h,Yw(l,e.endLabelLeft)}if(e.endLabelRight){let u=await gc(e.endLabelRight,T2(e.labelStyle)),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),h.node().appendChild(u),pa.get(e.id)||pa.set(e.id,{}),pa.get(e.id).endRight=h,Yw(l,e.endLabelRight)}return n},"insertEdgeLabel");o(Yw,"setTerminalWidth");Kw=o((t,e)=>{Y.debug("Moving label abc88 ",t.id,t.label,Xw.get(t.id),e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=me(),{subGraphTitleTotalMargin:i}=Ru(n);if(t.label){let a=Xw.get(t.id),s=t.x,l=t.y;if(r){let u=Gt.calcLabelPosition(r);Y.debug("Moving label "+t.label+" from (",s,",",l,") to (",u.x,",",u.y,") abc88"),e.updatedPath&&(s=u.x,l=u.y)}a.attr("transform",`translate(${s}, ${l+i/2})`)}if(t.startLabelLeft){let a=pa.get(t.id).startLeft,s=t.x,l=t.y;if(r){let u=Gt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.startLabelRight){let a=pa.get(t.id).startRight,s=t.x,l=t.y;if(r){let u=Gt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelLeft){let a=pa.get(t.id).endLeft,s=t.x,l=t.y;if(r){let u=Gt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelRight){let a=pa.get(t.id).endRight,s=t.x,l=t.y;if(r){let u=Gt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}},"positionEdgeLabel"),I_e=o((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,l=t.height/2;return i>=s||a>=l},"outsideNode"),O_e=o((t,e,r)=>{Y.debug(`intersection calc abc89: + outsidePoint: ${JSON.stringify(e)} + insidePoint : ${JSON.stringify(r)} + node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,l=r.xMath.abs(n-e.x)*u){let d=r.y{Y.warn("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(Y.info("abc88 checking point",a,e),!I_e(e,a)&&!i){let s=O_e(e,n,a);Y.debug("abc88 inside",a,n,s),Y.debug("abc88 intersection",s,e);let l=!1;r.forEach(u=>{l=l||u.x===s.x&&u.y===s.y}),r.some(u=>u.x===s.x&&u.y===s.y)?Y.warn("abc88 no intersect",s,r):r.push(s),i=!0}else Y.warn("abc88 outside",a,n),n=a,i||r.push(a)}),Y.debug("returning points",r),r},"cutPathAtIntersect");o(P_e,"extractCornerPoints");eJ=o(function(t,e,r){let n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),s=r/a;return{x:e.x-s*n,y:e.y-s*i}},"findAdjacentPoint"),B_e=o(function(t){let{cornerPointPositions:e}=P_e(t),r=[];for(let n=0;n10&&Math.abs(a.y-i.y)>=10){Y.debug("Corner point fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));let m=5;s.x===l.x?p={x:h<0?l.x-m+d:l.x+m-d,y:f<0?l.y-d:l.y+d}:p={x:h<0?l.x-d:l.x+d,y:f<0?l.y-m+d:l.y+m-d}}else Y.debug("Corner point skipping fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));r.push(p,u)}else r.push(t[n]);return r},"fixCorners"),Qw=o(function(t,e,r,n,i,a,s){let{handDrawnSeed:l}=me(),u=e.points,h=!1,f=i;var d=a;let p=[];for(let _ in e.cssCompiledStyles)ND(_)||p.push(e.cssCompiledStyles[_]);d.intersect&&f.intersect&&(u=u.slice(1,e.points.length-1),u.unshift(f.intersect(u[0])),Y.debug("Last point APA12",e.start,"-->",e.end,u[u.length-1],d,d.intersect(u[u.length-1])),u.push(d.intersect(u[u.length-1]))),e.toCluster&&(Y.info("to cluster abc88",r.get(e.toCluster)),u=JZ(e.points,r.get(e.toCluster).node),h=!0),e.fromCluster&&(Y.debug("from cluster abc88",r.get(e.fromCluster),JSON.stringify(u,null,2)),u=JZ(u.reverse(),r.get(e.fromCluster).node).reverse(),h=!0);let m=u.filter(_=>!Number.isNaN(_.y));m=B_e(m);let g=Do;switch(g=wu,e.curve){case"linear":g=wu;break;case"basis":g=Do;break;case"cardinal":g=Pv;break;case"bumpX":g=Rv;break;case"bumpY":g=Nv;break;case"catmullRom":g=$v;break;case"monotoneX":g=zv;break;case"monotoneY":g=Gv;break;case"natural":g=F0;break;case"step":g=$0;break;case"stepAfter":g=Uv;break;case"stepBefore":g=Vv;break;default:g=Do}let{x:y,y:v}=qw(e),x=wl().x(y).y(v).curve(g),b;switch(e.thickness){case"normal":b="edge-thickness-normal";break;case"thick":b="edge-thickness-thick";break;case"invisible":b="edge-thickness-invisible";break;default:b="edge-thickness-normal"}switch(e.pattern){case"solid":b+=" edge-pattern-solid";break;case"dotted":b+=" edge-pattern-dotted";break;case"dashed":b+=" edge-pattern-dashed";break;default:b+=" edge-pattern-solid"}let w,C=x(m),T=Array.isArray(e.style)?e.style:[e.style],E=T.find(_=>_?.startsWith("stroke:"));if(e.look==="handDrawn"){let _=Xe.svg(t);Object.assign([],m);let I=_.path(C,{roughness:.3,seed:l});b+=" transition",w=Ge(I).select("path").attr("id",e.id).attr("class"," "+b+(e.classes?" "+e.classes:"")).attr("style",T?T.reduce((k,L)=>k+";"+L,""):"");let D=w.attr("d");w.attr("d",D),t.node().appendChild(w.node())}else{let _=p.join(";"),I=T?T.reduce((L,R)=>L+R+";",""):"",D="";e.animate&&(D=" edge-animation-fast"),e.animation&&(D=" edge-animation-"+e.animation);let k=_?_+";"+I+";":I;w=t.append("path").attr("d",C).attr("id",e.id).attr("class"," "+b+(e.classes?" "+e.classes:"")+(D??"")).attr("style",k),E=k.match(/stroke:([^;]+)/)?.[1]}let A="";(me().flowchart.arrowMarkerAbsolute||me().state.arrowMarkerAbsolute)&&(A=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,A=A.replace(/\(/g,"\\(").replace(/\)/g,"\\)")),Y.info("arrowTypeStart",e.arrowTypeStart),Y.info("arrowTypeEnd",e.arrowTypeEnd),QZ(w,e,A,s,n,E);let S={};return h&&(S.updatedPath=u),S.originalPath=e.points,S},"insertEdge")});var F_e,$_e,z_e,G_e,V_e,U_e,H_e,W_e,q_e,Y_e,X_e,j_e,K_e,Q_e,Z_e,J_e,e9e,Zw,tL=N(()=>{"use strict";vt();F_e=o((t,e,r,n)=>{e.forEach(i=>{e9e[i](t,r,n)})},"insertMarkers"),$_e=o((t,e,r)=>{Y.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),z_e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),G_e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),V_e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),U_e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),H_e=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),W_e=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),q_e=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),Y_e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","userSpaceOnUse").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),X_e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-onlyOneStart").attr("class","marker onlyOne "+e).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M9,0 L9,18 M15,0 L15,18"),t.append("defs").append("marker").attr("id",r+"_"+e+"-onlyOneEnd").attr("class","marker onlyOne "+e).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M3,0 L3,18 M9,0 L9,18")},"only_one"),j_e=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrOneStart").attr("class","marker zeroOrOne "+e).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),n.append("path").attr("d","M9,0 L9,18");let i=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrOneEnd").attr("class","marker zeroOrOne "+e).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),i.append("path").attr("d","M21,0 L21,18")},"zero_or_one"),K_e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-oneOrMoreStart").attr("class","marker oneOrMore "+e).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),t.append("defs").append("marker").attr("id",r+"_"+e+"-oneOrMoreEnd").attr("class","marker oneOrMore "+e).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18")},"one_or_more"),Q_e=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrMoreStart").attr("class","marker zeroOrMore "+e).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),n.append("path").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18");let i=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrMoreEnd").attr("class","marker zeroOrMore "+e).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),i.append("path").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},"zero_or_more"),Z_e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-requirement_arrowEnd").attr("refX",20).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("path").attr("d",`M0,0 + L20,10 + M20,10 + L0,20`)},"requirement_arrow"),J_e=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-requirement_containsStart").attr("refX",0).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("g");n.append("circle").attr("cx",10).attr("cy",10).attr("r",9).attr("fill","none"),n.append("line").attr("x1",1).attr("x2",19).attr("y1",10).attr("y2",10),n.append("line").attr("y1",1).attr("y2",19).attr("x1",10).attr("x2",10)},"requirement_contains"),e9e={extension:$_e,composition:z_e,aggregation:G_e,dependency:V_e,lollipop:U_e,point:H_e,circle:W_e,cross:q_e,barb:Y_e,only_one:X_e,zero_or_one:j_e,one_or_more:K_e,zero_or_more:Q_e,requirement_arrow:Z_e,requirement_contains:J_e},Zw=F_e});async function vm(t,e,r){let n,i;e.shape==="rect"&&(e.rx&&e.ry?e.shape="roundedRect":e.shape="squareRect");let a=e.shape?QD[e.shape]:void 0;if(!a)throw new Error(`No such shape: ${e.shape}. Please check your syntax.`);if(e.link){let s;r.config.securityLevel==="sandbox"?s="_top":e.linkTarget&&(s=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",s??null),i=await a(n,e,r)}else i=await a(t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),Jw.set(e.id,n),e.haveCallback&&n.attr("class",n.attr("class")+" clickable"),n}var Jw,rJ,nJ,k2,eT=N(()=>{"use strict";vt();ZD();Jw=new Map;o(vm,"insertNode");rJ=o((t,e)=>{Jw.set(e.id,t)},"setNodeElem"),nJ=o(()=>{Jw.clear()},"clear"),k2=o(t=>{let e=Jw.get(t.id);Y.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode")});var iJ,aJ=N(()=>{"use strict";ji();gr();vt();Hw();eL();tL();eT();Ft();ir();iJ={common:Ze,getConfig:cr,insertCluster:ym,insertEdge:Qw,insertEdgeLabel:jw,insertMarkers:Zw,insertNode:vm,interpolateToCurve:W9,labelHelper:pt,log:Y,positionEdgeLabel:Kw}});function r9e(t){return typeof t=="symbol"||ri(t)&&da(t)==t9e}var t9e,no,Pd=N(()=>{"use strict";ku();No();t9e="[object Symbol]";o(r9e,"isSymbol");no=r9e});function n9e(t,e){for(var r=-1,n=t==null?0:t.length,i=Array(n);++r{"use strict";o(n9e,"arrayMap");Ns=n9e});function lJ(t){if(typeof t=="string")return t;if(Pt(t))return Ns(t,lJ)+"";if(no(t))return oJ?oJ.call(t):"";var e=t+"";return e=="0"&&1/t==-i9e?"-0":e}var i9e,sJ,oJ,cJ,uJ=N(()=>{"use strict";Ed();Bd();Un();Pd();i9e=1/0,sJ=ea?ea.prototype:void 0,oJ=sJ?sJ.toString:void 0;o(lJ,"baseToString");cJ=lJ});function s9e(t){for(var e=t.length;e--&&a9e.test(t.charAt(e)););return e}var a9e,hJ,fJ=N(()=>{"use strict";a9e=/\s/;o(s9e,"trimmedEndIndex");hJ=s9e});function l9e(t){return t&&t.slice(0,hJ(t)+1).replace(o9e,"")}var o9e,dJ,pJ=N(()=>{"use strict";fJ();o9e=/^\s+/;o(l9e,"baseTrim");dJ=l9e});function d9e(t){if(typeof t=="number")return t;if(no(t))return mJ;if(bn(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=bn(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=dJ(t);var r=u9e.test(t);return r||h9e.test(t)?f9e(t.slice(2),r?2:8):c9e.test(t)?mJ:+t}var mJ,c9e,u9e,h9e,f9e,gJ,yJ=N(()=>{"use strict";pJ();Js();Pd();mJ=NaN,c9e=/^[-+]0x[0-9a-f]+$/i,u9e=/^0b[01]+$/i,h9e=/^0o[0-7]+$/i,f9e=parseInt;o(d9e,"toNumber");gJ=d9e});function m9e(t){if(!t)return t===0?t:0;if(t=gJ(t),t===vJ||t===-vJ){var e=t<0?-1:1;return e*p9e}return t===t?t:0}var vJ,p9e,xm,rL=N(()=>{"use strict";yJ();vJ=1/0,p9e=17976931348623157e292;o(m9e,"toFinite");xm=m9e});function g9e(t){var e=xm(t),r=e%1;return e===e?r?e-r:e:0}var vc,bm=N(()=>{"use strict";rL();o(g9e,"toInteger");vc=g9e});var y9e,tT,xJ=N(()=>{"use strict";Lh();Lo();y9e=Ss(li,"WeakMap"),tT=y9e});function v9e(){}var ni,nL=N(()=>{"use strict";o(v9e,"noop");ni=v9e});function x9e(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(x9e,"arrayEach");rT=x9e});function b9e(t,e,r,n){for(var i=t.length,a=r+(n?1:-1);n?a--:++a{"use strict";o(b9e,"baseFindIndex");nT=b9e});function w9e(t){return t!==t}var bJ,wJ=N(()=>{"use strict";o(w9e,"baseIsNaN");bJ=w9e});function T9e(t,e,r){for(var n=r-1,i=t.length;++n{"use strict";o(T9e,"strictIndexOf");TJ=T9e});function k9e(t,e,r){return e===e?TJ(t,e,r):nT(t,bJ,r)}var wm,iT=N(()=>{"use strict";aL();wJ();kJ();o(k9e,"baseIndexOf");wm=k9e});function E9e(t,e){var r=t==null?0:t.length;return!!r&&wm(t,e,0)>-1}var aT,sL=N(()=>{"use strict";iT();o(E9e,"arrayIncludes");aT=E9e});var S9e,EJ,SJ=N(()=>{"use strict";N9();S9e=nw(Object.keys,Object),EJ=S9e});function _9e(t){if(!uc(t))return EJ(t);var e=[];for(var r in Object(t))A9e.call(t,r)&&r!="constructor"&&e.push(r);return e}var C9e,A9e,Tm,sT=N(()=>{"use strict";Z0();SJ();C9e=Object.prototype,A9e=C9e.hasOwnProperty;o(_9e,"baseKeys");Tm=_9e});function D9e(t){return ci(t)?lw(t):Tm(t)}var zr,xc=N(()=>{"use strict";B9();sT();Mo();o(D9e,"keys");zr=D9e});var L9e,R9e,N9e,ma,CJ=N(()=>{"use strict";rm();Dd();G9();Mo();Z0();xc();L9e=Object.prototype,R9e=L9e.hasOwnProperty,N9e=hw(function(t,e){if(uc(e)||ci(e)){Po(e,zr(e),t);return}for(var r in e)R9e.call(e,r)&&hc(t,r,e[r])}),ma=N9e});function O9e(t,e){if(Pt(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||no(t)?!0:I9e.test(t)||!M9e.test(t)||e!=null&&t in Object(e)}var M9e,I9e,km,oT=N(()=>{"use strict";Un();Pd();M9e=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,I9e=/^\w*$/;o(O9e,"isKey");km=O9e});function B9e(t){var e=H0(t,function(n){return r.size===P9e&&r.clear(),n}),r=e.cache;return e}var P9e,AJ,_J=N(()=>{"use strict";S9();P9e=500;o(B9e,"memoizeCapped");AJ=B9e});var F9e,$9e,z9e,DJ,LJ=N(()=>{"use strict";_J();F9e=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,$9e=/\\(\\)?/g,z9e=AJ(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(F9e,function(r,n,i,a){e.push(i?a.replace($9e,"$1"):n||r)}),e}),DJ=z9e});function G9e(t){return t==null?"":cJ(t)}var lT,oL=N(()=>{"use strict";uJ();o(G9e,"toString");lT=G9e});function V9e(t,e){return Pt(t)?t:km(t,e)?[t]:DJ(lT(t))}var Yh,E2=N(()=>{"use strict";Un();oT();LJ();oL();o(V9e,"castPath");Yh=V9e});function H9e(t){if(typeof t=="string"||no(t))return t;var e=t+"";return e=="0"&&1/t==-U9e?"-0":e}var U9e,bc,Em=N(()=>{"use strict";Pd();U9e=1/0;o(H9e,"toKey");bc=H9e});function W9e(t,e){e=Yh(e,t);for(var r=0,n=e.length;t!=null&&r{"use strict";E2();Em();o(W9e,"baseGet");Xh=W9e});function q9e(t,e,r){var n=t==null?void 0:Xh(t,e);return n===void 0?r:n}var RJ,NJ=N(()=>{"use strict";S2();o(q9e,"get");RJ=q9e});function Y9e(t,e){for(var r=-1,n=e.length,i=t.length;++r{"use strict";o(Y9e,"arrayPush");Sm=Y9e});function X9e(t){return Pt(t)||El(t)||!!(MJ&&t&&t[MJ])}var MJ,IJ,OJ=N(()=>{"use strict";Ed();J0();Un();MJ=ea?ea.isConcatSpreadable:void 0;o(X9e,"isFlattenable");IJ=X9e});function PJ(t,e,r,n,i){var a=-1,s=t.length;for(r||(r=IJ),i||(i=[]);++a0&&r(l)?e>1?PJ(l,e-1,r,n,i):Sm(i,l):n||(i[i.length]=l)}return i}var wc,Cm=N(()=>{"use strict";cT();OJ();o(PJ,"baseFlatten");wc=PJ});function j9e(t){var e=t==null?0:t.length;return e?wc(t,1):[]}var qr,uT=N(()=>{"use strict";Cm();o(j9e,"flatten");qr=j9e});function K9e(t){return uw(cw(t,void 0,qr),t+"")}var BJ,FJ=N(()=>{"use strict";uT();F9();z9();o(K9e,"flatRest");BJ=K9e});function Q9e(t,e,r){var n=-1,i=t.length;e<0&&(e=-e>i?0:i+e),r=r>i?i:r,r<0&&(r+=i),i=e>r?0:r-e>>>0,e>>>=0;for(var a=Array(i);++n{"use strict";o(Q9e,"baseSlice");hT=Q9e});function sDe(t){return aDe.test(t)}var Z9e,J9e,eDe,tDe,rDe,nDe,iDe,aDe,$J,zJ=N(()=>{"use strict";Z9e="\\ud800-\\udfff",J9e="\\u0300-\\u036f",eDe="\\ufe20-\\ufe2f",tDe="\\u20d0-\\u20ff",rDe=J9e+eDe+tDe,nDe="\\ufe0e\\ufe0f",iDe="\\u200d",aDe=RegExp("["+iDe+Z9e+rDe+nDe+"]");o(sDe,"hasUnicode");$J=sDe});function oDe(t,e,r,n){var i=-1,a=t==null?0:t.length;for(n&&a&&(r=t[++i]);++i{"use strict";o(oDe,"arrayReduce");GJ=oDe});function lDe(t,e){return t&&Po(e,zr(e),t)}var UJ,HJ=N(()=>{"use strict";Dd();xc();o(lDe,"baseAssign");UJ=lDe});function cDe(t,e){return t&&Po(e,Cs(e),t)}var WJ,qJ=N(()=>{"use strict";Dd();Bh();o(cDe,"baseAssignIn");WJ=cDe});function uDe(t,e){for(var r=-1,n=t==null?0:t.length,i=0,a=[];++r{"use strict";o(uDe,"arrayFilter");Am=uDe});function hDe(){return[]}var dT,cL=N(()=>{"use strict";o(hDe,"stubArray");dT=hDe});var fDe,dDe,YJ,pDe,_m,pT=N(()=>{"use strict";fT();cL();fDe=Object.prototype,dDe=fDe.propertyIsEnumerable,YJ=Object.getOwnPropertySymbols,pDe=YJ?function(t){return t==null?[]:(t=Object(t),Am(YJ(t),function(e){return dDe.call(t,e)}))}:dT,_m=pDe});function mDe(t,e){return Po(t,_m(t),e)}var XJ,jJ=N(()=>{"use strict";Dd();pT();o(mDe,"copySymbols");XJ=mDe});var gDe,yDe,mT,uL=N(()=>{"use strict";cT();iw();pT();cL();gDe=Object.getOwnPropertySymbols,yDe=gDe?function(t){for(var e=[];t;)Sm(e,_m(t)),t=Q0(t);return e}:dT,mT=yDe});function vDe(t,e){return Po(t,mT(t),e)}var KJ,QJ=N(()=>{"use strict";Dd();uL();o(vDe,"copySymbolsIn");KJ=vDe});function xDe(t,e,r){var n=e(t);return Pt(t)?n:Sm(n,r(t))}var gT,hL=N(()=>{"use strict";cT();Un();o(xDe,"baseGetAllKeys");gT=xDe});function bDe(t){return gT(t,zr,_m)}var C2,fL=N(()=>{"use strict";hL();pT();xc();o(bDe,"getAllKeys");C2=bDe});function wDe(t){return gT(t,Cs,mT)}var yT,dL=N(()=>{"use strict";hL();uL();Bh();o(wDe,"getAllKeysIn");yT=wDe});var TDe,vT,ZJ=N(()=>{"use strict";Lh();Lo();TDe=Ss(li,"DataView"),vT=TDe});var kDe,xT,JJ=N(()=>{"use strict";Lh();Lo();kDe=Ss(li,"Promise"),xT=kDe});var EDe,jh,pL=N(()=>{"use strict";Lh();Lo();EDe=Ss(li,"Set"),jh=EDe});var eee,SDe,tee,ree,nee,iee,CDe,ADe,_De,DDe,LDe,Fd,io,$d=N(()=>{"use strict";ZJ();K5();JJ();pL();xJ();ku();T9();eee="[object Map]",SDe="[object Object]",tee="[object Promise]",ree="[object Set]",nee="[object WeakMap]",iee="[object DataView]",CDe=Eu(vT),ADe=Eu(Mh),_De=Eu(xT),DDe=Eu(jh),LDe=Eu(tT),Fd=da;(vT&&Fd(new vT(new ArrayBuffer(1)))!=iee||Mh&&Fd(new Mh)!=eee||xT&&Fd(xT.resolve())!=tee||jh&&Fd(new jh)!=ree||tT&&Fd(new tT)!=nee)&&(Fd=o(function(t){var e=da(t),r=e==SDe?t.constructor:void 0,n=r?Eu(r):"";if(n)switch(n){case CDe:return iee;case ADe:return eee;case _De:return tee;case DDe:return ree;case LDe:return nee}return e},"getTag"));io=Fd});function MDe(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&NDe.call(t,"index")&&(r.index=t.index,r.input=t.input),r}var RDe,NDe,aee,see=N(()=>{"use strict";RDe=Object.prototype,NDe=RDe.hasOwnProperty;o(MDe,"initCloneArray");aee=MDe});function IDe(t,e){var r=e?K0(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}var oee,lee=N(()=>{"use strict";ew();o(IDe,"cloneDataView");oee=IDe});function PDe(t){var e=new t.constructor(t.source,ODe.exec(t));return e.lastIndex=t.lastIndex,e}var ODe,cee,uee=N(()=>{"use strict";ODe=/\w*$/;o(PDe,"cloneRegExp");cee=PDe});function BDe(t){return fee?Object(fee.call(t)):{}}var hee,fee,dee,pee=N(()=>{"use strict";Ed();hee=ea?ea.prototype:void 0,fee=hee?hee.valueOf:void 0;o(BDe,"cloneSymbol");dee=BDe});function nLe(t,e,r){var n=t.constructor;switch(e){case qDe:return K0(t);case FDe:case $De:return new n(+t);case YDe:return oee(t,r);case XDe:case jDe:case KDe:case QDe:case ZDe:case JDe:case eLe:case tLe:case rLe:return tw(t,r);case zDe:return new n;case GDe:case HDe:return new n(t);case VDe:return cee(t);case UDe:return new n;case WDe:return dee(t)}}var FDe,$De,zDe,GDe,VDe,UDe,HDe,WDe,qDe,YDe,XDe,jDe,KDe,QDe,ZDe,JDe,eLe,tLe,rLe,mee,gee=N(()=>{"use strict";ew();lee();uee();pee();L9();FDe="[object Boolean]",$De="[object Date]",zDe="[object Map]",GDe="[object Number]",VDe="[object RegExp]",UDe="[object Set]",HDe="[object String]",WDe="[object Symbol]",qDe="[object ArrayBuffer]",YDe="[object DataView]",XDe="[object Float32Array]",jDe="[object Float64Array]",KDe="[object Int8Array]",QDe="[object Int16Array]",ZDe="[object Int32Array]",JDe="[object Uint8Array]",eLe="[object Uint8ClampedArray]",tLe="[object Uint16Array]",rLe="[object Uint32Array]";o(nLe,"initCloneByTag");mee=nLe});function aLe(t){return ri(t)&&io(t)==iLe}var iLe,yee,vee=N(()=>{"use strict";$d();No();iLe="[object Map]";o(aLe,"baseIsMap");yee=aLe});var xee,sLe,bee,wee=N(()=>{"use strict";vee();_d();t2();xee=Oo&&Oo.isMap,sLe=xee?Io(xee):yee,bee=sLe});function lLe(t){return ri(t)&&io(t)==oLe}var oLe,Tee,kee=N(()=>{"use strict";$d();No();oLe="[object Set]";o(lLe,"baseIsSet");Tee=lLe});var Eee,cLe,See,Cee=N(()=>{"use strict";kee();_d();t2();Eee=Oo&&Oo.isSet,cLe=Eee?Io(Eee):Tee,See=cLe});function bT(t,e,r,n,i,a){var s,l=e&uLe,u=e&hLe,h=e&fLe;if(r&&(s=i?r(t,n,i,a):r(t)),s!==void 0)return s;if(!bn(t))return t;var f=Pt(t);if(f){if(s=aee(t),!l)return rw(t,s)}else{var d=io(t),p=d==_ee||d==yLe;if(Sl(t))return J5(t,l);if(d==Dee||d==Aee||p&&!i){if(s=u||p?{}:aw(t),!l)return u?KJ(t,WJ(s,t)):XJ(t,UJ(s,t))}else{if(!_n[d])return i?t:{};s=mee(t,d,l)}}a||(a=new lc);var m=a.get(t);if(m)return m;a.set(t,s),See(t)?t.forEach(function(v){s.add(bT(v,e,r,v,t,a))}):bee(t)&&t.forEach(function(v,x){s.set(x,bT(v,e,r,x,t,a))});var g=h?u?yT:C2:u?Cs:zr,y=f?void 0:g(t);return rT(y||t,function(v,x){y&&(x=v,v=t[x]),hc(s,x,bT(v,e,r,x,t,a))}),s}var uLe,hLe,fLe,Aee,dLe,pLe,mLe,gLe,_ee,yLe,vLe,xLe,Dee,bLe,wLe,TLe,kLe,ELe,SLe,CLe,ALe,_Le,DLe,LLe,RLe,NLe,MLe,ILe,OLe,_n,wT,mL=N(()=>{"use strict";Zv();iL();rm();HJ();qJ();_9();R9();jJ();QJ();fL();dL();$d();see();gee();M9();Un();tm();wee();Js();Cee();xc();Bh();uLe=1,hLe=2,fLe=4,Aee="[object Arguments]",dLe="[object Array]",pLe="[object Boolean]",mLe="[object Date]",gLe="[object Error]",_ee="[object Function]",yLe="[object GeneratorFunction]",vLe="[object Map]",xLe="[object Number]",Dee="[object Object]",bLe="[object RegExp]",wLe="[object Set]",TLe="[object String]",kLe="[object Symbol]",ELe="[object WeakMap]",SLe="[object ArrayBuffer]",CLe="[object DataView]",ALe="[object Float32Array]",_Le="[object Float64Array]",DLe="[object Int8Array]",LLe="[object Int16Array]",RLe="[object Int32Array]",NLe="[object Uint8Array]",MLe="[object Uint8ClampedArray]",ILe="[object Uint16Array]",OLe="[object Uint32Array]",_n={};_n[Aee]=_n[dLe]=_n[SLe]=_n[CLe]=_n[pLe]=_n[mLe]=_n[ALe]=_n[_Le]=_n[DLe]=_n[LLe]=_n[RLe]=_n[vLe]=_n[xLe]=_n[Dee]=_n[bLe]=_n[wLe]=_n[TLe]=_n[kLe]=_n[NLe]=_n[MLe]=_n[ILe]=_n[OLe]=!0;_n[gLe]=_n[_ee]=_n[ELe]=!1;o(bT,"baseClone");wT=bT});function BLe(t){return wT(t,PLe)}var PLe,an,gL=N(()=>{"use strict";mL();PLe=4;o(BLe,"clone");an=BLe});function zLe(t){return wT(t,FLe|$Le)}var FLe,$Le,yL,Lee=N(()=>{"use strict";mL();FLe=1,$Le=4;o(zLe,"cloneDeep");yL=zLe});function GLe(t){for(var e=-1,r=t==null?0:t.length,n=0,i=[];++e{"use strict";o(GLe,"compact");Tc=GLe});function ULe(t){return this.__data__.set(t,VLe),this}var VLe,Nee,Mee=N(()=>{"use strict";VLe="__lodash_hash_undefined__";o(ULe,"setCacheAdd");Nee=ULe});function HLe(t){return this.__data__.has(t)}var Iee,Oee=N(()=>{"use strict";o(HLe,"setCacheHas");Iee=HLe});function TT(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new Cd;++e{"use strict";Q5();Mee();Oee();o(TT,"SetCache");TT.prototype.add=TT.prototype.push=Nee;TT.prototype.has=Iee;Dm=TT});function WLe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(WLe,"arraySome");ET=WLe});function qLe(t,e){return t.has(e)}var Lm,ST=N(()=>{"use strict";o(qLe,"cacheHas");Lm=qLe});function jLe(t,e,r,n,i,a){var s=r&YLe,l=t.length,u=e.length;if(l!=u&&!(s&&u>l))return!1;var h=a.get(t),f=a.get(e);if(h&&f)return h==e&&f==t;var d=-1,p=!0,m=r&XLe?new Dm:void 0;for(a.set(t,e),a.set(e,t);++d{"use strict";kT();vL();ST();YLe=1,XLe=2;o(jLe,"equalArrays");CT=jLe});function KLe(t){var e=-1,r=Array(t.size);return t.forEach(function(n,i){r[++e]=[i,n]}),r}var Pee,Bee=N(()=>{"use strict";o(KLe,"mapToArray");Pee=KLe});function QLe(t){var e=-1,r=Array(t.size);return t.forEach(function(n){r[++e]=n}),r}var Rm,AT=N(()=>{"use strict";o(QLe,"setToArray");Rm=QLe});function hRe(t,e,r,n,i,a,s){switch(r){case uRe:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case cRe:return!(t.byteLength!=e.byteLength||!a(new j0(t),new j0(e)));case eRe:case tRe:case iRe:return Ro(+t,+e);case rRe:return t.name==e.name&&t.message==e.message;case aRe:case oRe:return t==e+"";case nRe:var l=Pee;case sRe:var u=n&ZLe;if(l||(l=Rm),t.size!=e.size&&!u)return!1;var h=s.get(t);if(h)return h==e;n|=JLe,s.set(t,e);var f=CT(l(t),l(e),n,i,a,s);return s.delete(t),f;case lRe:if(bL)return bL.call(t)==bL.call(e)}return!1}var ZLe,JLe,eRe,tRe,rRe,nRe,iRe,aRe,sRe,oRe,lRe,cRe,uRe,Fee,bL,$ee,zee=N(()=>{"use strict";Ed();D9();Sd();xL();Bee();AT();ZLe=1,JLe=2,eRe="[object Boolean]",tRe="[object Date]",rRe="[object Error]",nRe="[object Map]",iRe="[object Number]",aRe="[object RegExp]",sRe="[object Set]",oRe="[object String]",lRe="[object Symbol]",cRe="[object ArrayBuffer]",uRe="[object DataView]",Fee=ea?ea.prototype:void 0,bL=Fee?Fee.valueOf:void 0;o(hRe,"equalByTag");$ee=hRe});function mRe(t,e,r,n,i,a){var s=r&fRe,l=C2(t),u=l.length,h=C2(e),f=h.length;if(u!=f&&!s)return!1;for(var d=u;d--;){var p=l[d];if(!(s?p in e:pRe.call(e,p)))return!1}var m=a.get(t),g=a.get(e);if(m&&g)return m==e&&g==t;var y=!0;a.set(t,e),a.set(e,t);for(var v=s;++d{"use strict";fL();fRe=1,dRe=Object.prototype,pRe=dRe.hasOwnProperty;o(mRe,"equalObjects");Gee=mRe});function vRe(t,e,r,n,i,a){var s=Pt(t),l=Pt(e),u=s?Hee:io(t),h=l?Hee:io(e);u=u==Uee?_T:u,h=h==Uee?_T:h;var f=u==_T,d=h==_T,p=u==h;if(p&&Sl(t)){if(!Sl(e))return!1;s=!0,f=!1}if(p&&!f)return a||(a=new lc),s||Oh(t)?CT(t,e,r,n,i,a):$ee(t,e,u,r,n,i,a);if(!(r&gRe)){var m=f&&Wee.call(t,"__wrapped__"),g=d&&Wee.call(e,"__wrapped__");if(m||g){var y=m?t.value():t,v=g?e.value():e;return a||(a=new lc),i(y,v,r,n,a)}}return p?(a||(a=new lc),Gee(t,e,r,n,i,a)):!1}var gRe,Uee,Hee,_T,yRe,Wee,qee,Yee=N(()=>{"use strict";Zv();xL();zee();Vee();$d();Un();tm();r2();gRe=1,Uee="[object Arguments]",Hee="[object Array]",_T="[object Object]",yRe=Object.prototype,Wee=yRe.hasOwnProperty;o(vRe,"baseIsEqualDeep");qee=vRe});function Xee(t,e,r,n,i){return t===e?!0:t==null||e==null||!ri(t)&&!ri(e)?t!==t&&e!==e:qee(t,e,r,n,Xee,i)}var DT,wL=N(()=>{"use strict";Yee();No();o(Xee,"baseIsEqual");DT=Xee});function wRe(t,e,r,n){var i=r.length,a=i,s=!n;if(t==null)return!a;for(t=Object(t);i--;){var l=r[i];if(s&&l[2]?l[1]!==t[l[0]]:!(l[0]in t))return!1}for(;++i{"use strict";Zv();wL();xRe=1,bRe=2;o(wRe,"baseIsMatch");jee=wRe});function TRe(t){return t===t&&!bn(t)}var LT,TL=N(()=>{"use strict";Js();o(TRe,"isStrictComparable");LT=TRe});function kRe(t){for(var e=zr(t),r=e.length;r--;){var n=e[r],i=t[n];e[r]=[n,i,LT(i)]}return e}var Qee,Zee=N(()=>{"use strict";TL();xc();o(kRe,"getMatchData");Qee=kRe});function ERe(t,e){return function(r){return r==null?!1:r[t]===e&&(e!==void 0||t in Object(r))}}var RT,kL=N(()=>{"use strict";o(ERe,"matchesStrictComparable");RT=ERe});function SRe(t){var e=Qee(t);return e.length==1&&e[0][2]?RT(e[0][0],e[0][1]):function(r){return r===t||jee(r,t,e)}}var Jee,ete=N(()=>{"use strict";Kee();Zee();kL();o(SRe,"baseMatches");Jee=SRe});function CRe(t,e){return t!=null&&e in Object(t)}var tte,rte=N(()=>{"use strict";o(CRe,"baseHasIn");tte=CRe});function ARe(t,e,r){e=Yh(e,t);for(var n=-1,i=e.length,a=!1;++n{"use strict";E2();J0();Un();i2();sw();Em();o(ARe,"hasPath");NT=ARe});function _Re(t,e){return t!=null&&NT(t,e,tte)}var MT,SL=N(()=>{"use strict";rte();EL();o(_Re,"hasIn");MT=_Re});function RRe(t,e){return km(t)&<(e)?RT(bc(t),e):function(r){var n=RJ(r,t);return n===void 0&&n===e?MT(r,t):DT(e,n,DRe|LRe)}}var DRe,LRe,nte,ite=N(()=>{"use strict";wL();NJ();SL();oT();TL();kL();Em();DRe=1,LRe=2;o(RRe,"baseMatchesProperty");nte=RRe});function NRe(t){return function(e){return e?.[t]}}var IT,CL=N(()=>{"use strict";o(NRe,"baseProperty");IT=NRe});function MRe(t){return function(e){return Xh(e,t)}}var ate,ste=N(()=>{"use strict";S2();o(MRe,"basePropertyDeep");ate=MRe});function IRe(t){return km(t)?IT(bc(t)):ate(t)}var ote,lte=N(()=>{"use strict";CL();ste();oT();Em();o(IRe,"property");ote=IRe});function ORe(t){return typeof t=="function"?t:t==null?ta:typeof t=="object"?Pt(t)?nte(t[0],t[1]):Jee(t):ote(t)}var pn,rs=N(()=>{"use strict";ete();ite();Cu();Un();lte();o(ORe,"baseIteratee");pn=ORe});function PRe(t,e,r,n){for(var i=-1,a=t==null?0:t.length;++i{"use strict";o(PRe,"arrayAggregator");cte=PRe});function BRe(t,e){return t&&X0(t,e,zr)}var Nm,OT=N(()=>{"use strict";Z5();xc();o(BRe,"baseForOwn");Nm=BRe});function FRe(t,e){return function(r,n){if(r==null)return r;if(!ci(r))return t(r,n);for(var i=r.length,a=e?i:-1,s=Object(r);(e?a--:++a{"use strict";Mo();o(FRe,"createBaseEach");hte=FRe});var $Re,Ms,Kh=N(()=>{"use strict";OT();fte();$Re=hte(Nm),Ms=$Re});function zRe(t,e,r,n){return Ms(t,function(i,a,s){e(n,i,r(i),s)}),n}var dte,pte=N(()=>{"use strict";Kh();o(zRe,"baseAggregator");dte=zRe});function GRe(t,e){return function(r,n){var i=Pt(r)?cte:dte,a=e?e():{};return i(r,t,pn(n,2),a)}}var mte,gte=N(()=>{"use strict";ute();pte();rs();Un();o(GRe,"createAggregator");mte=GRe});var VRe,PT,yte=N(()=>{"use strict";Lo();VRe=o(function(){return li.Date.now()},"now"),PT=VRe});var vte,URe,HRe,Qh,xte=N(()=>{"use strict";nm();Sd();Ld();Bh();vte=Object.prototype,URe=vte.hasOwnProperty,HRe=fc(function(t,e){t=Object(t);var r=-1,n=e.length,i=n>2?e[2]:void 0;for(i&&eo(e[0],e[1],i)&&(n=1);++r{"use strict";o(WRe,"arrayIncludesWith");BT=WRe});function YRe(t,e,r,n){var i=-1,a=aT,s=!0,l=t.length,u=[],h=e.length;if(!l)return u;r&&(e=Ns(e,Io(r))),n?(a=BT,s=!1):e.length>=qRe&&(a=Lm,s=!1,e=new Dm(e));e:for(;++i{"use strict";kT();sL();AL();Bd();_d();ST();qRe=200;o(YRe,"baseDifference");bte=YRe});var XRe,Zh,Tte=N(()=>{"use strict";wte();Cm();nm();ow();XRe=fc(function(t,e){return Ad(t)?bte(t,wc(e,1,Ad,!0)):[]}),Zh=XRe});function jRe(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}var ga,kte=N(()=>{"use strict";o(jRe,"last");ga=jRe});function KRe(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:vc(e),hT(t,e<0?0:e,n)):[]}var gi,Ete=N(()=>{"use strict";lL();bm();o(KRe,"drop");gi=KRe});function QRe(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:vc(e),e=n-e,hT(t,0,e<0?0:e)):[]}var Nu,Ste=N(()=>{"use strict";lL();bm();o(QRe,"dropRight");Nu=QRe});function ZRe(t){return typeof t=="function"?t:ta}var Mm,FT=N(()=>{"use strict";Cu();o(ZRe,"castFunction");Mm=ZRe});function JRe(t,e){var r=Pt(t)?rT:Ms;return r(t,Mm(e))}var Ae,$T=N(()=>{"use strict";iL();Kh();FT();Un();o(JRe,"forEach");Ae=JRe});var Cte=N(()=>{"use strict";$T()});function eNe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(eNe,"arrayEvery");Ate=eNe});function tNe(t,e){var r=!0;return Ms(t,function(n,i,a){return r=!!e(n,i,a),r}),r}var Dte,Lte=N(()=>{"use strict";Kh();o(tNe,"baseEvery");Dte=tNe});function rNe(t,e,r){var n=Pt(t)?Ate:Dte;return r&&eo(t,e,r)&&(e=void 0),n(t,pn(e,3))}var Ma,Rte=N(()=>{"use strict";_te();Lte();rs();Un();Ld();o(rNe,"every");Ma=rNe});function nNe(t,e){var r=[];return Ms(t,function(n,i,a){e(n,i,a)&&r.push(n)}),r}var zT,_L=N(()=>{"use strict";Kh();o(nNe,"baseFilter");zT=nNe});function iNe(t,e){var r=Pt(t)?Am:zT;return r(t,pn(e,3))}var Yr,DL=N(()=>{"use strict";fT();_L();rs();Un();o(iNe,"filter");Yr=iNe});function aNe(t){return function(e,r,n){var i=Object(e);if(!ci(e)){var a=pn(r,3);e=zr(e),r=o(function(l){return a(i[l],l,i)},"predicate")}var s=t(e,r,n);return s>-1?i[a?e[s]:s]:void 0}}var Nte,Mte=N(()=>{"use strict";rs();Mo();xc();o(aNe,"createFind");Nte=aNe});function oNe(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:vc(r);return i<0&&(i=sNe(n+i,0)),nT(t,pn(e,3),i)}var sNe,Ite,Ote=N(()=>{"use strict";aL();rs();bm();sNe=Math.max;o(oNe,"findIndex");Ite=oNe});var lNe,ns,Pte=N(()=>{"use strict";Mte();Ote();lNe=Nte(Ite),ns=lNe});function cNe(t){return t&&t.length?t[0]:void 0}var ia,Bte=N(()=>{"use strict";o(cNe,"head");ia=cNe});var Fte=N(()=>{"use strict";Bte()});function uNe(t,e){var r=-1,n=ci(t)?Array(t.length):[];return Ms(t,function(i,a,s){n[++r]=e(i,a,s)}),n}var GT,LL=N(()=>{"use strict";Kh();Mo();o(uNe,"baseMap");GT=uNe});function hNe(t,e){var r=Pt(t)?Ns:GT;return r(t,pn(e,3))}var Je,Im=N(()=>{"use strict";Bd();rs();LL();Un();o(hNe,"map");Je=hNe});function fNe(t,e){return wc(Je(t,e),1)}var ya,RL=N(()=>{"use strict";Cm();Im();o(fNe,"flatMap");ya=fNe});function dNe(t,e){return t==null?t:X0(t,Mm(e),Cs)}var NL,$te=N(()=>{"use strict";Z5();FT();Bh();o(dNe,"forIn");NL=dNe});function pNe(t,e){return t&&Nm(t,Mm(e))}var ML,zte=N(()=>{"use strict";OT();FT();o(pNe,"forOwn");ML=pNe});var mNe,gNe,yNe,IL,Gte=N(()=>{"use strict";Y0();gte();mNe=Object.prototype,gNe=mNe.hasOwnProperty,yNe=mte(function(t,e,r){gNe.call(t,r)?t[r].push(e):cc(t,r,[e])}),IL=yNe});function vNe(t,e){return t>e}var Vte,Ute=N(()=>{"use strict";o(vNe,"baseGt");Vte=vNe});function wNe(t,e){return t!=null&&bNe.call(t,e)}var xNe,bNe,Hte,Wte=N(()=>{"use strict";xNe=Object.prototype,bNe=xNe.hasOwnProperty;o(wNe,"baseHas");Hte=wNe});function TNe(t,e){return t!=null&&NT(t,e,Hte)}var Bt,qte=N(()=>{"use strict";Wte();EL();o(TNe,"has");Bt=TNe});function ENe(t){return typeof t=="string"||!Pt(t)&&ri(t)&&da(t)==kNe}var kNe,yi,VT=N(()=>{"use strict";ku();Un();No();kNe="[object String]";o(ENe,"isString");yi=ENe});function SNe(t,e){return Ns(e,function(r){return t[r]})}var Yte,Xte=N(()=>{"use strict";Bd();o(SNe,"baseValues");Yte=SNe});function CNe(t){return t==null?[]:Yte(t,zr(t))}var br,OL=N(()=>{"use strict";Xte();xc();o(CNe,"values");br=CNe});function _Ne(t,e,r,n){t=ci(t)?t:br(t),r=r&&!n?vc(r):0;var i=t.length;return r<0&&(r=ANe(i+r,0)),yi(t)?r<=i&&t.indexOf(e,r)>-1:!!i&&wm(t,e,r)>-1}var ANe,qn,jte=N(()=>{"use strict";iT();Mo();VT();bm();OL();ANe=Math.max;o(_Ne,"includes");qn=_Ne});function LNe(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:vc(r);return i<0&&(i=DNe(n+i,0)),wm(t,e,i)}var DNe,UT,Kte=N(()=>{"use strict";iT();bm();DNe=Math.max;o(LNe,"indexOf");UT=LNe});function ONe(t){if(t==null)return!0;if(ci(t)&&(Pt(t)||typeof t=="string"||typeof t.splice=="function"||Sl(t)||Oh(t)||El(t)))return!t.length;var e=io(t);if(e==RNe||e==NNe)return!t.size;if(uc(t))return!Tm(t).length;for(var r in t)if(INe.call(t,r))return!1;return!0}var RNe,NNe,MNe,INe,ur,HT=N(()=>{"use strict";sT();$d();J0();Un();Mo();tm();Z0();r2();RNe="[object Map]",NNe="[object Set]",MNe=Object.prototype,INe=MNe.hasOwnProperty;o(ONe,"isEmpty");ur=ONe});function BNe(t){return ri(t)&&da(t)==PNe}var PNe,Qte,Zte=N(()=>{"use strict";ku();No();PNe="[object RegExp]";o(BNe,"baseIsRegExp");Qte=BNe});var Jte,FNe,zo,ere=N(()=>{"use strict";Zte();_d();t2();Jte=Oo&&Oo.isRegExp,FNe=Jte?Io(Jte):Qte,zo=FNe});function $Ne(t){return t===void 0}var pr,tre=N(()=>{"use strict";o($Ne,"isUndefined");pr=$Ne});function zNe(t,e){return t{"use strict";o(zNe,"baseLt");WT=zNe});function GNe(t,e){var r={};return e=pn(e,3),Nm(t,function(n,i,a){cc(r,i,e(n,i,a))}),r}var zd,rre=N(()=>{"use strict";Y0();OT();rs();o(GNe,"mapValues");zd=GNe});function VNe(t,e,r){for(var n=-1,i=t.length;++n{"use strict";Pd();o(VNe,"baseExtremum");Om=VNe});function UNe(t){return t&&t.length?Om(t,ta,Vte):void 0}var Is,nre=N(()=>{"use strict";qT();Ute();Cu();o(UNe,"max");Is=UNe});function HNe(t){return t&&t.length?Om(t,ta,WT):void 0}var Dl,BL=N(()=>{"use strict";qT();PL();Cu();o(HNe,"min");Dl=HNe});function WNe(t,e){return t&&t.length?Om(t,pn(e,2),WT):void 0}var Gd,ire=N(()=>{"use strict";qT();rs();PL();o(WNe,"minBy");Gd=WNe});function YNe(t){if(typeof t!="function")throw new TypeError(qNe);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}var qNe,are,sre=N(()=>{"use strict";qNe="Expected a function";o(YNe,"negate");are=YNe});function XNe(t,e,r,n){if(!bn(t))return t;e=Yh(e,t);for(var i=-1,a=e.length,s=a-1,l=t;l!=null&&++i{"use strict";rm();E2();i2();Js();Em();o(XNe,"baseSet");ore=XNe});function jNe(t,e,r){for(var n=-1,i=e.length,a={};++n{"use strict";S2();lre();E2();o(jNe,"basePickBy");YT=jNe});function KNe(t,e){if(t==null)return{};var r=Ns(yT(t),function(n){return[n]});return e=pn(e),YT(t,r,function(n,i){return e(n,i[0])})}var Os,cre=N(()=>{"use strict";Bd();rs();FL();dL();o(KNe,"pickBy");Os=KNe});function QNe(t,e){var r=t.length;for(t.sort(e);r--;)t[r]=t[r].value;return t}var ure,hre=N(()=>{"use strict";o(QNe,"baseSortBy");ure=QNe});function ZNe(t,e){if(t!==e){var r=t!==void 0,n=t===null,i=t===t,a=no(t),s=e!==void 0,l=e===null,u=e===e,h=no(e);if(!l&&!h&&!a&&t>e||a&&s&&u&&!l&&!h||n&&s&&u||!r&&u||!i)return 1;if(!n&&!a&&!h&&t{"use strict";Pd();o(ZNe,"compareAscending");fre=ZNe});function JNe(t,e,r){for(var n=-1,i=t.criteria,a=e.criteria,s=i.length,l=r.length;++n=l)return u;var h=r[n];return u*(h=="desc"?-1:1)}}return t.index-e.index}var pre,mre=N(()=>{"use strict";dre();o(JNe,"compareMultiple");pre=JNe});function eMe(t,e,r){e.length?e=Ns(e,function(a){return Pt(a)?function(s){return Xh(s,a.length===1?a[0]:a)}:a}):e=[ta];var n=-1;e=Ns(e,Io(pn));var i=GT(t,function(a,s,l){var u=Ns(e,function(h){return h(a)});return{criteria:u,index:++n,value:a}});return ure(i,function(a,s){return pre(a,s,r)})}var gre,yre=N(()=>{"use strict";Bd();S2();rs();LL();hre();_d();mre();Cu();Un();o(eMe,"baseOrderBy");gre=eMe});var tMe,vre,xre=N(()=>{"use strict";CL();tMe=IT("length"),vre=tMe});function dMe(t){for(var e=bre.lastIndex=0;bre.test(t);)++e;return e}var wre,rMe,nMe,iMe,aMe,sMe,oMe,$L,zL,lMe,Tre,kre,Ere,cMe,Sre,Cre,uMe,hMe,fMe,bre,Are,_re=N(()=>{"use strict";wre="\\ud800-\\udfff",rMe="\\u0300-\\u036f",nMe="\\ufe20-\\ufe2f",iMe="\\u20d0-\\u20ff",aMe=rMe+nMe+iMe,sMe="\\ufe0e\\ufe0f",oMe="["+wre+"]",$L="["+aMe+"]",zL="\\ud83c[\\udffb-\\udfff]",lMe="(?:"+$L+"|"+zL+")",Tre="[^"+wre+"]",kre="(?:\\ud83c[\\udde6-\\uddff]){2}",Ere="[\\ud800-\\udbff][\\udc00-\\udfff]",cMe="\\u200d",Sre=lMe+"?",Cre="["+sMe+"]?",uMe="(?:"+cMe+"(?:"+[Tre,kre,Ere].join("|")+")"+Cre+Sre+")*",hMe=Cre+Sre+uMe,fMe="(?:"+[Tre+$L+"?",$L,kre,Ere,oMe].join("|")+")",bre=RegExp(zL+"(?="+zL+")|"+fMe+hMe,"g");o(dMe,"unicodeSize");Are=dMe});function pMe(t){return $J(t)?Are(t):vre(t)}var Dre,Lre=N(()=>{"use strict";xre();zJ();_re();o(pMe,"stringSize");Dre=pMe});function mMe(t,e){return YT(t,e,function(r,n){return MT(t,n)})}var Rre,Nre=N(()=>{"use strict";FL();SL();o(mMe,"basePick");Rre=mMe});var gMe,Vd,Mre=N(()=>{"use strict";Nre();FJ();gMe=BJ(function(t,e){return t==null?{}:Rre(t,e)}),Vd=gMe});function xMe(t,e,r,n){for(var i=-1,a=vMe(yMe((e-t)/(r||1)),0),s=Array(a);a--;)s[n?a:++i]=t,t+=r;return s}var yMe,vMe,Ire,Ore=N(()=>{"use strict";yMe=Math.ceil,vMe=Math.max;o(xMe,"baseRange");Ire=xMe});function bMe(t){return function(e,r,n){return n&&typeof n!="number"&&eo(e,r,n)&&(r=n=void 0),e=xm(e),r===void 0?(r=e,e=0):r=xm(r),n=n===void 0?e{"use strict";Ore();Ld();rL();o(bMe,"createRange");Pre=bMe});var wMe,Go,Fre=N(()=>{"use strict";Bre();wMe=Pre(),Go=wMe});function TMe(t,e,r,n,i){return i(t,function(a,s,l){r=n?(n=!1,a):e(r,a,s,l)}),r}var $re,zre=N(()=>{"use strict";o(TMe,"baseReduce");$re=TMe});function kMe(t,e,r){var n=Pt(t)?GJ:$re,i=arguments.length<3;return n(t,pn(e,4),r,i,Ms)}var Xr,GL=N(()=>{"use strict";VJ();Kh();rs();zre();Un();o(kMe,"reduce");Xr=kMe});function EMe(t,e){var r=Pt(t)?Am:zT;return r(t,are(pn(e,3)))}var Jh,Gre=N(()=>{"use strict";fT();_L();rs();Un();sre();o(EMe,"reject");Jh=EMe});function AMe(t){if(t==null)return 0;if(ci(t))return yi(t)?Dre(t):t.length;var e=io(t);return e==SMe||e==CMe?t.size:Tm(t).length}var SMe,CMe,VL,Vre=N(()=>{"use strict";sT();$d();Mo();VT();Lre();SMe="[object Map]",CMe="[object Set]";o(AMe,"size");VL=AMe});function _Me(t,e){var r;return Ms(t,function(n,i,a){return r=e(n,i,a),!r}),!!r}var Ure,Hre=N(()=>{"use strict";Kh();o(_Me,"baseSome");Ure=_Me});function DMe(t,e,r){var n=Pt(t)?ET:Ure;return r&&eo(t,e,r)&&(e=void 0),n(t,pn(e,3))}var A2,Wre=N(()=>{"use strict";vL();rs();Hre();Un();Ld();o(DMe,"some");A2=DMe});var LMe,kc,qre=N(()=>{"use strict";Cm();yre();nm();Ld();LMe=fc(function(t,e){if(t==null)return[];var r=e.length;return r>1&&eo(t,e[0],e[1])?e=[]:r>2&&eo(e[0],e[1],e[2])&&(e=[e[0]]),gre(t,wc(e,1),[])}),kc=LMe});var RMe,NMe,Yre,Xre=N(()=>{"use strict";pL();nL();AT();RMe=1/0,NMe=jh&&1/Rm(new jh([,-0]))[1]==RMe?function(t){return new jh(t)}:ni,Yre=NMe});function IMe(t,e,r){var n=-1,i=aT,a=t.length,s=!0,l=[],u=l;if(r)s=!1,i=BT;else if(a>=MMe){var h=e?null:Yre(t);if(h)return Rm(h);s=!1,i=Lm,u=new Dm}else u=e?[]:l;e:for(;++n{"use strict";kT();sL();AL();ST();Xre();AT();MMe=200;o(IMe,"baseUniq");Pm=IMe});var OMe,UL,jre=N(()=>{"use strict";Cm();nm();XT();ow();OMe=fc(function(t){return Pm(wc(t,1,Ad,!0))}),UL=OMe});function PMe(t){return t&&t.length?Pm(t):[]}var Bm,Kre=N(()=>{"use strict";XT();o(PMe,"uniq");Bm=PMe});function BMe(t,e){return t&&t.length?Pm(t,pn(e,2)):[]}var Qre,Zre=N(()=>{"use strict";rs();XT();o(BMe,"uniqBy");Qre=BMe});function $Me(t){var e=++FMe;return lT(t)+e}var FMe,Ud,Jre=N(()=>{"use strict";oL();FMe=0;o($Me,"uniqueId");Ud=$Me});function zMe(t,e,r){for(var n=-1,i=t.length,a=e.length,s={};++n{"use strict";o(zMe,"baseZipObject");ene=zMe});function GMe(t,e){return ene(t||[],e||[],hc)}var jT,rne=N(()=>{"use strict";rm();tne();o(GMe,"zipObject");jT=GMe});var qt=N(()=>{"use strict";CJ();gL();Lee();Ree();$9();xte();Tte();Ete();Ste();Cte();Rte();DL();Pte();Fte();RL();uT();$T();$te();zte();Gte();qte();Cu();jte();Kte();Un();HT();Yv();Js();ere();VT();tre();xc();kte();Im();rre();nre();V9();BL();ire();nL();yte();Mre();cre();Fre();GL();Gre();Vre();Wre();qre();jre();Kre();Jre();OL();rne();});function ine(t,e){t[e]?t[e]++:t[e]=1}function ane(t,e){--t[e]||delete t[e]}function _2(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}return i+nne+a+nne+(pr(n)?VMe:n)}function UMe(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}var l={v:i,w:a};return n&&(l.name=n),l}function HL(t,e){return _2(t,e.v,e.w,e.name)}var VMe,Hd,nne,sn,KT=N(()=>{"use strict";qt();VMe="\0",Hd="\0",nne="",sn=class{static{o(this,"Graph")}constructor(e={}){this._isDirected=Object.prototype.hasOwnProperty.call(e,"directed")?e.directed:!0,this._isMultigraph=Object.prototype.hasOwnProperty.call(e,"multigraph")?e.multigraph:!1,this._isCompound=Object.prototype.hasOwnProperty.call(e,"compound")?e.compound:!1,this._label=void 0,this._defaultNodeLabelFn=As(void 0),this._defaultEdgeLabelFn=As(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[Hd]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(e){return this._label=e,this}graph(){return this._label}setDefaultNodeLabel(e){return Si(e)||(e=As(e)),this._defaultNodeLabelFn=e,this}nodeCount(){return this._nodeCount}nodes(){return zr(this._nodes)}sources(){var e=this;return Yr(this.nodes(),function(r){return ur(e._in[r])})}sinks(){var e=this;return Yr(this.nodes(),function(r){return ur(e._out[r])})}setNodes(e,r){var n=arguments,i=this;return Ae(e,function(a){n.length>1?i.setNode(a,r):i.setNode(a)}),this}setNode(e,r){return Object.prototype.hasOwnProperty.call(this._nodes,e)?(arguments.length>1&&(this._nodes[e]=r),this):(this._nodes[e]=arguments.length>1?r:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]=Hd,this._children[e]={},this._children[Hd][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)}node(e){return this._nodes[e]}hasNode(e){return Object.prototype.hasOwnProperty.call(this._nodes,e)}removeNode(e){if(Object.prototype.hasOwnProperty.call(this._nodes,e)){var r=o(n=>this.removeEdge(this._edgeObjs[n]),"removeEdge");delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],Ae(this.children(e),n=>{this.setParent(n)}),delete this._children[e]),Ae(zr(this._in[e]),r),delete this._in[e],delete this._preds[e],Ae(zr(this._out[e]),r),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this}setParent(e,r){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(pr(r))r=Hd;else{r+="";for(var n=r;!pr(n);n=this.parent(n))if(n===e)throw new Error("Setting "+r+" as parent of "+e+" would create a cycle");this.setNode(r)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=r,this._children[r][e]=!0,this}_removeFromParentsChildList(e){delete this._children[this._parent[e]][e]}parent(e){if(this._isCompound){var r=this._parent[e];if(r!==Hd)return r}}children(e){if(pr(e)&&(e=Hd),this._isCompound){var r=this._children[e];if(r)return zr(r)}else{if(e===Hd)return this.nodes();if(this.hasNode(e))return[]}}predecessors(e){var r=this._preds[e];if(r)return zr(r)}successors(e){var r=this._sucs[e];if(r)return zr(r)}neighbors(e){var r=this.predecessors(e);if(r)return UL(r,this.successors(e))}isLeaf(e){var r;return this.isDirected()?r=this.successors(e):r=this.neighbors(e),r.length===0}filterNodes(e){var r=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});r.setGraph(this.graph());var n=this;Ae(this._nodes,function(s,l){e(l)&&r.setNode(l,s)}),Ae(this._edgeObjs,function(s){r.hasNode(s.v)&&r.hasNode(s.w)&&r.setEdge(s,n.edge(s))});var i={};function a(s){var l=n.parent(s);return l===void 0||r.hasNode(l)?(i[s]=l,l):l in i?i[l]:a(l)}return o(a,"findParent"),this._isCompound&&Ae(r.nodes(),function(s){r.setParent(s,a(s))}),r}setDefaultEdgeLabel(e){return Si(e)||(e=As(e)),this._defaultEdgeLabelFn=e,this}edgeCount(){return this._edgeCount}edges(){return br(this._edgeObjs)}setPath(e,r){var n=this,i=arguments;return Xr(e,function(a,s){return i.length>1?n.setEdge(a,s,r):n.setEdge(a,s),s}),this}setEdge(){var e,r,n,i,a=!1,s=arguments[0];typeof s=="object"&&s!==null&&"v"in s?(e=s.v,r=s.w,n=s.name,arguments.length===2&&(i=arguments[1],a=!0)):(e=s,r=arguments[1],n=arguments[3],arguments.length>2&&(i=arguments[2],a=!0)),e=""+e,r=""+r,pr(n)||(n=""+n);var l=_2(this._isDirected,e,r,n);if(Object.prototype.hasOwnProperty.call(this._edgeLabels,l))return a&&(this._edgeLabels[l]=i),this;if(!pr(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(e),this.setNode(r),this._edgeLabels[l]=a?i:this._defaultEdgeLabelFn(e,r,n);var u=UMe(this._isDirected,e,r,n);return e=u.v,r=u.w,Object.freeze(u),this._edgeObjs[l]=u,ine(this._preds[r],e),ine(this._sucs[e],r),this._in[r][l]=u,this._out[e][l]=u,this._edgeCount++,this}edge(e,r,n){var i=arguments.length===1?HL(this._isDirected,arguments[0]):_2(this._isDirected,e,r,n);return this._edgeLabels[i]}hasEdge(e,r,n){var i=arguments.length===1?HL(this._isDirected,arguments[0]):_2(this._isDirected,e,r,n);return Object.prototype.hasOwnProperty.call(this._edgeLabels,i)}removeEdge(e,r,n){var i=arguments.length===1?HL(this._isDirected,arguments[0]):_2(this._isDirected,e,r,n),a=this._edgeObjs[i];return a&&(e=a.v,r=a.w,delete this._edgeLabels[i],delete this._edgeObjs[i],ane(this._preds[r],e),ane(this._sucs[e],r),delete this._in[r][i],delete this._out[e][i],this._edgeCount--),this}inEdges(e,r){var n=this._in[e];if(n){var i=br(n);return r?Yr(i,function(a){return a.v===r}):i}}outEdges(e,r){var n=this._out[e];if(n){var i=br(n);return r?Yr(i,function(a){return a.w===r}):i}}nodeEdges(e,r){var n=this.inEdges(e,r);if(n)return n.concat(this.outEdges(e,r))}};sn.prototype._nodeCount=0;sn.prototype._edgeCount=0;o(ine,"incrementOrInitEntry");o(ane,"decrementOrRemoveEntry");o(_2,"edgeArgsToId");o(UMe,"edgeArgsToObj");o(HL,"edgeObjToId")});var Vo=N(()=>{"use strict";KT()});function sne(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function HMe(t,e){if(t!=="_next"&&t!=="_prev")return e}var ZT,one=N(()=>{"use strict";ZT=class{static{o(this,"List")}constructor(){var e={};e._next=e._prev=e,this._sentinel=e}dequeue(){var e=this._sentinel,r=e._prev;if(r!==e)return sne(r),r}enqueue(e){var r=this._sentinel;e._prev&&e._next&&sne(e),e._next=r._next,r._next._prev=e,r._next=e,e._prev=r}toString(){for(var e=[],r=this._sentinel,n=r._prev;n!==r;)e.push(JSON.stringify(n,HMe)),n=n._prev;return"["+e.join(", ")+"]"}};o(sne,"unlink");o(HMe,"filterOutLinks")});function lne(t,e){if(t.nodeCount()<=1)return[];var r=YMe(t,e||WMe),n=qMe(r.graph,r.buckets,r.zeroIdx);return qr(Je(n,function(i){return t.outEdges(i.v,i.w)}))}function qMe(t,e,r){for(var n=[],i=e[e.length-1],a=e[0],s;t.nodeCount();){for(;s=a.dequeue();)WL(t,e,r,s);for(;s=i.dequeue();)WL(t,e,r,s);if(t.nodeCount()){for(var l=e.length-2;l>0;--l)if(s=e[l].dequeue(),s){n=n.concat(WL(t,e,r,s,!0));break}}}return n}function WL(t,e,r,n,i){var a=i?[]:void 0;return Ae(t.inEdges(n.v),function(s){var l=t.edge(s),u=t.node(s.v);i&&a.push({v:s.v,w:s.w}),u.out-=l,qL(e,r,u)}),Ae(t.outEdges(n.v),function(s){var l=t.edge(s),u=s.w,h=t.node(u);h.in-=l,qL(e,r,h)}),t.removeNode(n.v),a}function YMe(t,e){var r=new sn,n=0,i=0;Ae(t.nodes(),function(l){r.setNode(l,{v:l,in:0,out:0})}),Ae(t.edges(),function(l){var u=r.edge(l.v,l.w)||0,h=e(l),f=u+h;r.setEdge(l.v,l.w,f),i=Math.max(i,r.node(l.v).out+=h),n=Math.max(n,r.node(l.w).in+=h)});var a=Go(i+n+3).map(function(){return new ZT}),s=n+1;return Ae(r.nodes(),function(l){qL(a,s,r.node(l))}),{graph:r,buckets:a,zeroIdx:s}}function qL(t,e,r){r.out?r.in?t[r.out-r.in+e].enqueue(r):t[t.length-1].enqueue(r):t[0].enqueue(r)}var WMe,cne=N(()=>{"use strict";qt();Vo();one();WMe=As(1);o(lne,"greedyFAS");o(qMe,"doGreedyFAS");o(WL,"removeNode");o(YMe,"buildState");o(qL,"assignBucket")});function une(t){var e=t.graph().acyclicer==="greedy"?lne(t,r(t)):XMe(t);Ae(e,function(n){var i=t.edge(n);t.removeEdge(n),i.forwardName=n.name,i.reversed=!0,t.setEdge(n.w,n.v,i,Ud("rev"))});function r(n){return function(i){return n.edge(i).weight}}o(r,"weightFn")}function XMe(t){var e=[],r={},n={};function i(a){Object.prototype.hasOwnProperty.call(n,a)||(n[a]=!0,r[a]=!0,Ae(t.outEdges(a),function(s){Object.prototype.hasOwnProperty.call(r,s.w)?e.push(s):i(s.w)}),delete r[a])}return o(i,"dfs"),Ae(t.nodes(),i),e}function hne(t){Ae(t.edges(),function(e){var r=t.edge(e);if(r.reversed){t.removeEdge(e);var n=r.forwardName;delete r.reversed,delete r.forwardName,t.setEdge(e.w,e.v,r,n)}})}var YL=N(()=>{"use strict";qt();cne();o(une,"run");o(XMe,"dfsFAS");o(hne,"undo")});function Ec(t,e,r,n){var i;do i=Ud(n);while(t.hasNode(i));return r.dummy=e,t.setNode(i,r),i}function dne(t){var e=new sn().setGraph(t.graph());return Ae(t.nodes(),function(r){e.setNode(r,t.node(r))}),Ae(t.edges(),function(r){var n=e.edge(r.v,r.w)||{weight:0,minlen:1},i=t.edge(r);e.setEdge(r.v,r.w,{weight:n.weight+i.weight,minlen:Math.max(n.minlen,i.minlen)})}),e}function JT(t){var e=new sn({multigraph:t.isMultigraph()}).setGraph(t.graph());return Ae(t.nodes(),function(r){t.children(r).length||e.setNode(r,t.node(r))}),Ae(t.edges(),function(r){e.setEdge(r,t.edge(r))}),e}function XL(t,e){var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2;if(!i&&!a)throw new Error("Not possible to find intersection inside of the rectangle");var u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=l*i/a,h=l):(i<0&&(s=-s),u=s,h=s*a/i),{x:r+u,y:n+h}}function ef(t){var e=Je(Go(KL(t)+1),function(){return[]});return Ae(t.nodes(),function(r){var n=t.node(r),i=n.rank;pr(i)||(e[i][n.order]=r)}),e}function pne(t){var e=Dl(Je(t.nodes(),function(r){return t.node(r).rank}));Ae(t.nodes(),function(r){var n=t.node(r);Bt(n,"rank")&&(n.rank-=e)})}function mne(t){var e=Dl(Je(t.nodes(),function(a){return t.node(a).rank})),r=[];Ae(t.nodes(),function(a){var s=t.node(a).rank-e;r[s]||(r[s]=[]),r[s].push(a)});var n=0,i=t.graph().nodeRankFactor;Ae(r,function(a,s){pr(a)&&s%i!==0?--n:n&&Ae(a,function(l){t.node(l).rank+=n})})}function jL(t,e,r,n){var i={width:0,height:0};return arguments.length>=4&&(i.rank=r,i.order=n),Ec(t,"border",i,e)}function KL(t){return Is(Je(t.nodes(),function(e){var r=t.node(e).rank;if(!pr(r))return r}))}function gne(t,e){var r={lhs:[],rhs:[]};return Ae(t,function(n){e(n)?r.lhs.push(n):r.rhs.push(n)}),r}function yne(t,e){var r=PT();try{return e()}finally{console.log(t+" time: "+(PT()-r)+"ms")}}function vne(t,e){return e()}var Sc=N(()=>{"use strict";qt();Vo();o(Ec,"addDummyNode");o(dne,"simplify");o(JT,"asNonCompoundGraph");o(XL,"intersectRect");o(ef,"buildLayerMatrix");o(pne,"normalizeRanks");o(mne,"removeEmptyRanks");o(jL,"addBorderNode");o(KL,"maxRank");o(gne,"partition");o(yne,"time");o(vne,"notime")});function bne(t){function e(r){var n=t.children(r),i=t.node(r);if(n.length&&Ae(n,e),Object.prototype.hasOwnProperty.call(i,"minRank")){i.borderLeft=[],i.borderRight=[];for(var a=i.minRank,s=i.maxRank+1;a{"use strict";qt();Sc();o(bne,"addBorderSegments");o(xne,"addBorderNode")});function kne(t){var e=t.graph().rankdir.toLowerCase();(e==="lr"||e==="rl")&&Sne(t)}function Ene(t){var e=t.graph().rankdir.toLowerCase();(e==="bt"||e==="rl")&&jMe(t),(e==="lr"||e==="rl")&&(KMe(t),Sne(t))}function Sne(t){Ae(t.nodes(),function(e){Tne(t.node(e))}),Ae(t.edges(),function(e){Tne(t.edge(e))})}function Tne(t){var e=t.width;t.width=t.height,t.height=e}function jMe(t){Ae(t.nodes(),function(e){QL(t.node(e))}),Ae(t.edges(),function(e){var r=t.edge(e);Ae(r.points,QL),Object.prototype.hasOwnProperty.call(r,"y")&&QL(r)})}function QL(t){t.y=-t.y}function KMe(t){Ae(t.nodes(),function(e){ZL(t.node(e))}),Ae(t.edges(),function(e){var r=t.edge(e);Ae(r.points,ZL),Object.prototype.hasOwnProperty.call(r,"x")&&ZL(r)})}function ZL(t){var e=t.x;t.x=t.y,t.y=e}var Cne=N(()=>{"use strict";qt();o(kne,"adjust");o(Ene,"undo");o(Sne,"swapWidthHeight");o(Tne,"swapWidthHeightOne");o(jMe,"reverseY");o(QL,"reverseYOne");o(KMe,"swapXY");o(ZL,"swapXYOne")});function Ane(t){t.graph().dummyChains=[],Ae(t.edges(),function(e){ZMe(t,e)})}function ZMe(t,e){var r=e.v,n=t.node(r).rank,i=e.w,a=t.node(i).rank,s=e.name,l=t.edge(e),u=l.labelRank;if(a!==n+1){t.removeEdge(e);var h=void 0,f,d;for(d=0,++n;n{"use strict";qt();Sc();o(Ane,"run");o(ZMe,"normalizeEdge");o(_ne,"undo")});function D2(t){var e={};function r(n){var i=t.node(n);if(Object.prototype.hasOwnProperty.call(e,n))return i.rank;e[n]=!0;var a=Dl(Je(t.outEdges(n),function(s){return r(s.w)-t.edge(s).minlen}));return(a===Number.POSITIVE_INFINITY||a===void 0||a===null)&&(a=0),i.rank=a}o(r,"dfs"),Ae(t.sources(),r)}function Wd(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}var ek=N(()=>{"use strict";qt();o(D2,"longestPath");o(Wd,"slack")});function tk(t){var e=new sn({directed:!1}),r=t.nodes()[0],n=t.nodeCount();e.setNode(r,{});for(var i,a;JMe(e,t){"use strict";qt();Vo();ek();o(tk,"feasibleTree");o(JMe,"tightTree");o(eIe,"findMinSlackEdge");o(tIe,"shiftRanks")});var Lne=N(()=>{"use strict"});var tR=N(()=>{"use strict"});var cWt,rR=N(()=>{"use strict";qt();tR();cWt=As(1)});var Rne=N(()=>{"use strict";rR()});var nR=N(()=>{"use strict"});var Nne=N(()=>{"use strict";nR()});var bWt,Mne=N(()=>{"use strict";qt();bWt=As(1)});function iR(t){var e={},r={},n=[];function i(a){if(Object.prototype.hasOwnProperty.call(r,a))throw new L2;Object.prototype.hasOwnProperty.call(e,a)||(r[a]=!0,e[a]=!0,Ae(t.predecessors(a),i),delete r[a],n.push(a))}if(o(i,"visit"),Ae(t.sinks(),i),VL(e)!==t.nodeCount())throw new L2;return n}function L2(){}var aR=N(()=>{"use strict";qt();iR.CycleException=L2;o(iR,"topsort");o(L2,"CycleException");L2.prototype=new Error});var Ine=N(()=>{"use strict";aR()});function rk(t,e,r){Pt(e)||(e=[e]);var n=(t.isDirected()?t.successors:t.neighbors).bind(t),i=[],a={};return Ae(e,function(s){if(!t.hasNode(s))throw new Error("Graph does not have node: "+s);One(t,s,r==="post",a,n,i)}),i}function One(t,e,r,n,i,a){Object.prototype.hasOwnProperty.call(n,e)||(n[e]=!0,r||a.push(e),Ae(i(e),function(s){One(t,s,r,n,i,a)}),r&&a.push(e))}var sR=N(()=>{"use strict";qt();o(rk,"dfs");o(One,"doDfs")});function oR(t,e){return rk(t,e,"post")}var Pne=N(()=>{"use strict";sR();o(oR,"postorder")});function lR(t,e){return rk(t,e,"pre")}var Bne=N(()=>{"use strict";sR();o(lR,"preorder")});var Fne=N(()=>{"use strict";tR();KT()});var $ne=N(()=>{"use strict";Lne();rR();Rne();Nne();Mne();Ine();Pne();Bne();Fne();nR();aR()});function rf(t){t=dne(t),D2(t);var e=tk(t);uR(e),cR(e,t);for(var r,n;r=Une(e);)n=Hne(e,t,r),Wne(e,t,r,n)}function cR(t,e){var r=oR(t,t.nodes());r=r.slice(0,r.length-1),Ae(r,function(n){sIe(t,e,n)})}function sIe(t,e,r){var n=t.node(r),i=n.parent;t.edge(r,i).cutvalue=Gne(t,e,r)}function Gne(t,e,r){var n=t.node(r),i=n.parent,a=!0,s=e.edge(r,i),l=0;return s||(a=!1,s=e.edge(i,r)),l=s.weight,Ae(e.nodeEdges(r),function(u){var h=u.v===r,f=h?u.w:u.v;if(f!==i){var d=h===a,p=e.edge(u).weight;if(l+=d?p:-p,lIe(t,r,f)){var m=t.edge(r,f).cutvalue;l+=d?-m:m}}}),l}function uR(t,e){arguments.length<2&&(e=t.nodes()[0]),Vne(t,{},1,e)}function Vne(t,e,r,n,i){var a=r,s=t.node(n);return e[n]=!0,Ae(t.neighbors(n),function(l){Object.prototype.hasOwnProperty.call(e,l)||(r=Vne(t,e,r,l,n))}),s.low=a,s.lim=r++,i?s.parent=i:delete s.parent,r}function Une(t){return ns(t.edges(),function(e){return t.edge(e).cutvalue<0})}function Hne(t,e,r){var n=r.v,i=r.w;e.hasEdge(n,i)||(n=r.w,i=r.v);var a=t.node(n),s=t.node(i),l=a,u=!1;a.lim>s.lim&&(l=s,u=!0);var h=Yr(e.edges(),function(f){return u===zne(t,t.node(f.v),l)&&u!==zne(t,t.node(f.w),l)});return Gd(h,function(f){return Wd(e,f)})}function Wne(t,e,r,n){var i=r.v,a=r.w;t.removeEdge(i,a),t.setEdge(n.v,n.w,{}),uR(t),cR(t,e),oIe(t,e)}function oIe(t,e){var r=ns(t.nodes(),function(i){return!e.node(i).parent}),n=lR(t,r);n=n.slice(1),Ae(n,function(i){var a=t.node(i).parent,s=e.edge(i,a),l=!1;s||(s=e.edge(a,i),l=!0),e.node(i).rank=e.node(a).rank+(l?s.minlen:-s.minlen)})}function lIe(t,e,r){return t.hasEdge(e,r)}function zne(t,e,r){return r.low<=e.lim&&e.lim<=r.lim}var qne=N(()=>{"use strict";qt();$ne();Sc();eR();ek();rf.initLowLimValues=uR;rf.initCutValues=cR;rf.calcCutValue=Gne;rf.leaveEdge=Une;rf.enterEdge=Hne;rf.exchangeEdges=Wne;o(rf,"networkSimplex");o(cR,"initCutValues");o(sIe,"assignCutValue");o(Gne,"calcCutValue");o(uR,"initLowLimValues");o(Vne,"dfsAssignLowLim");o(Une,"leaveEdge");o(Hne,"enterEdge");o(Wne,"exchangeEdges");o(oIe,"updateRanks");o(lIe,"isTreeEdge");o(zne,"isDescendant")});function hR(t){switch(t.graph().ranker){case"network-simplex":Yne(t);break;case"tight-tree":uIe(t);break;case"longest-path":cIe(t);break;default:Yne(t)}}function uIe(t){D2(t),tk(t)}function Yne(t){rf(t)}var cIe,fR=N(()=>{"use strict";eR();qne();ek();o(hR,"rank");cIe=D2;o(uIe,"tightTreeRanker");o(Yne,"networkSimplexRanker")});function Xne(t){var e=Ec(t,"root",{},"_root"),r=hIe(t),n=Is(br(r))-1,i=2*n+1;t.graph().nestingRoot=e,Ae(t.edges(),function(s){t.edge(s).minlen*=i});var a=fIe(t)+1;Ae(t.children(),function(s){jne(t,e,i,a,n,r,s)}),t.graph().nodeRankFactor=i}function jne(t,e,r,n,i,a,s){var l=t.children(s);if(!l.length){s!==e&&t.setEdge(e,s,{weight:0,minlen:r});return}var u=jL(t,"_bt"),h=jL(t,"_bb"),f=t.node(s);t.setParent(u,s),f.borderTop=u,t.setParent(h,s),f.borderBottom=h,Ae(l,function(d){jne(t,e,r,n,i,a,d);var p=t.node(d),m=p.borderTop?p.borderTop:d,g=p.borderBottom?p.borderBottom:d,y=p.borderTop?n:2*n,v=m!==g?1:i-a[s]+1;t.setEdge(u,m,{weight:y,minlen:v,nestingEdge:!0}),t.setEdge(g,h,{weight:y,minlen:v,nestingEdge:!0})}),t.parent(s)||t.setEdge(e,u,{weight:0,minlen:i+a[s]})}function hIe(t){var e={};function r(n,i){var a=t.children(n);a&&a.length&&Ae(a,function(s){r(s,i+1)}),e[n]=i}return o(r,"dfs"),Ae(t.children(),function(n){r(n,1)}),e}function fIe(t){return Xr(t.edges(),function(e,r){return e+t.edge(r).weight},0)}function Kne(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,Ae(t.edges(),function(r){var n=t.edge(r);n.nestingEdge&&t.removeEdge(r)})}var Qne=N(()=>{"use strict";qt();Sc();o(Xne,"run");o(jne,"dfs");o(hIe,"treeDepths");o(fIe,"sumWeights");o(Kne,"cleanup")});function Zne(t,e,r){var n={},i;Ae(r,function(a){for(var s=t.parent(a),l,u;s;){if(l=t.parent(s),l?(u=n[l],n[l]=s):(u=i,i=s),u&&u!==s){e.setEdge(u,s);return}s=l}})}var Jne=N(()=>{"use strict";qt();o(Zne,"addSubgraphConstraints")});function eie(t,e,r){var n=pIe(t),i=new sn({compound:!0}).setGraph({root:n}).setDefaultNodeLabel(function(a){return t.node(a)});return Ae(t.nodes(),function(a){var s=t.node(a),l=t.parent(a);(s.rank===e||s.minRank<=e&&e<=s.maxRank)&&(i.setNode(a),i.setParent(a,l||n),Ae(t[r](a),function(u){var h=u.v===a?u.w:u.v,f=i.edge(h,a),d=pr(f)?0:f.weight;i.setEdge(h,a,{weight:t.edge(u).weight+d})}),Object.prototype.hasOwnProperty.call(s,"minRank")&&i.setNode(a,{borderLeft:s.borderLeft[e],borderRight:s.borderRight[e]}))}),i}function pIe(t){for(var e;t.hasNode(e=Ud("_root")););return e}var tie=N(()=>{"use strict";qt();Vo();o(eie,"buildLayerGraph");o(pIe,"createRootNode")});function rie(t,e){for(var r=0,n=1;n0;)f%2&&(d+=l[f+1]),f=f-1>>1,l[f]+=h.weight;u+=h.weight*d})),u}var nie=N(()=>{"use strict";qt();o(rie,"crossCount");o(mIe,"twoLayerCrossCount")});function iie(t){var e={},r=Yr(t.nodes(),function(l){return!t.children(l).length}),n=Is(Je(r,function(l){return t.node(l).rank})),i=Je(Go(n+1),function(){return[]});function a(l){if(!Bt(e,l)){e[l]=!0;var u=t.node(l);i[u.rank].push(l),Ae(t.successors(l),a)}}o(a,"dfs");var s=kc(r,function(l){return t.node(l).rank});return Ae(s,a),i}var aie=N(()=>{"use strict";qt();o(iie,"initOrder")});function sie(t,e){return Je(e,function(r){var n=t.inEdges(r);if(n.length){var i=Xr(n,function(a,s){var l=t.edge(s),u=t.node(s.v);return{sum:a.sum+l.weight*u.order,weight:a.weight+l.weight}},{sum:0,weight:0});return{v:r,barycenter:i.sum/i.weight,weight:i.weight}}else return{v:r}})}var oie=N(()=>{"use strict";qt();o(sie,"barycenter")});function lie(t,e){var r={};Ae(t,function(i,a){var s=r[i.v]={indegree:0,in:[],out:[],vs:[i.v],i:a};pr(i.barycenter)||(s.barycenter=i.barycenter,s.weight=i.weight)}),Ae(e.edges(),function(i){var a=r[i.v],s=r[i.w];!pr(a)&&!pr(s)&&(s.indegree++,a.out.push(r[i.w]))});var n=Yr(r,function(i){return!i.indegree});return gIe(n)}function gIe(t){var e=[];function r(a){return function(s){s.merged||(pr(s.barycenter)||pr(a.barycenter)||s.barycenter>=a.barycenter)&&yIe(a,s)}}o(r,"handleIn");function n(a){return function(s){s.in.push(a),--s.indegree===0&&t.push(s)}}for(o(n,"handleOut");t.length;){var i=t.pop();e.push(i),Ae(i.in.reverse(),r(i)),Ae(i.out,n(i))}return Je(Yr(e,function(a){return!a.merged}),function(a){return Vd(a,["vs","i","barycenter","weight"])})}function yIe(t,e){var r=0,n=0;t.weight&&(r+=t.barycenter*t.weight,n+=t.weight),e.weight&&(r+=e.barycenter*e.weight,n+=e.weight),t.vs=e.vs.concat(t.vs),t.barycenter=r/n,t.weight=n,t.i=Math.min(e.i,t.i),e.merged=!0}var cie=N(()=>{"use strict";qt();o(lie,"resolveConflicts");o(gIe,"doResolveConflicts");o(yIe,"mergeEntries")});function hie(t,e){var r=gne(t,function(f){return Object.prototype.hasOwnProperty.call(f,"barycenter")}),n=r.lhs,i=kc(r.rhs,function(f){return-f.i}),a=[],s=0,l=0,u=0;n.sort(vIe(!!e)),u=uie(a,i,u),Ae(n,function(f){u+=f.vs.length,a.push(f.vs),s+=f.barycenter*f.weight,l+=f.weight,u=uie(a,i,u)});var h={vs:qr(a)};return l&&(h.barycenter=s/l,h.weight=l),h}function uie(t,e,r){for(var n;e.length&&(n=ga(e)).i<=r;)e.pop(),t.push(n.vs),r++;return r}function vIe(t){return function(e,r){return e.barycenterr.barycenter?1:t?r.i-e.i:e.i-r.i}}var fie=N(()=>{"use strict";qt();Sc();o(hie,"sort");o(uie,"consumeUnsortable");o(vIe,"compareWithBias")});function dR(t,e,r,n){var i=t.children(e),a=t.node(e),s=a?a.borderLeft:void 0,l=a?a.borderRight:void 0,u={};s&&(i=Yr(i,function(g){return g!==s&&g!==l}));var h=sie(t,i);Ae(h,function(g){if(t.children(g.v).length){var y=dR(t,g.v,r,n);u[g.v]=y,Object.prototype.hasOwnProperty.call(y,"barycenter")&&bIe(g,y)}});var f=lie(h,r);xIe(f,u);var d=hie(f,n);if(s&&(d.vs=qr([s,d.vs,l]),t.predecessors(s).length)){var p=t.node(t.predecessors(s)[0]),m=t.node(t.predecessors(l)[0]);Object.prototype.hasOwnProperty.call(d,"barycenter")||(d.barycenter=0,d.weight=0),d.barycenter=(d.barycenter*d.weight+p.order+m.order)/(d.weight+2),d.weight+=2}return d}function xIe(t,e){Ae(t,function(r){r.vs=qr(r.vs.map(function(n){return e[n]?e[n].vs:n}))})}function bIe(t,e){pr(t.barycenter)?(t.barycenter=e.barycenter,t.weight=e.weight):(t.barycenter=(t.barycenter*t.weight+e.barycenter*e.weight)/(t.weight+e.weight),t.weight+=e.weight)}var die=N(()=>{"use strict";qt();oie();cie();fie();o(dR,"sortSubgraph");o(xIe,"expandSubgraphs");o(bIe,"mergeBarycenters")});function gie(t){var e=KL(t),r=pie(t,Go(1,e+1),"inEdges"),n=pie(t,Go(e-1,-1,-1),"outEdges"),i=iie(t);mie(t,i);for(var a=Number.POSITIVE_INFINITY,s,l=0,u=0;u<4;++l,++u){wIe(l%2?r:n,l%4>=2),i=ef(t);var h=rie(t,i);h{"use strict";qt();Vo();Sc();Jne();tie();nie();aie();die();o(gie,"order");o(pie,"buildLayerGraphs");o(wIe,"sweepLayerGraphs");o(mie,"assignOrder")});function vie(t){var e=kIe(t);Ae(t.graph().dummyChains,function(r){for(var n=t.node(r),i=n.edgeObj,a=TIe(t,e,i.v,i.w),s=a.path,l=a.lca,u=0,h=s[u],f=!0;r!==i.w;){if(n=t.node(r),f){for(;(h=s[u])!==l&&t.node(h).maxRanks||l>e[u].lim));for(h=u,u=n;(u=t.parent(u))!==h;)a.push(u);return{path:i.concat(a.reverse()),lca:h}}function kIe(t){var e={},r=0;function n(i){var a=r;Ae(t.children(i),n),e[i]={low:a,lim:r++}}return o(n,"dfs"),Ae(t.children(),n),e}var xie=N(()=>{"use strict";qt();o(vie,"parentDummyChains");o(TIe,"findPath");o(kIe,"postorder")});function EIe(t,e){var r={};function n(i,a){var s=0,l=0,u=i.length,h=ga(a);return Ae(a,function(f,d){var p=CIe(t,f),m=p?t.node(p).order:u;(p||f===h)&&(Ae(a.slice(l,d+1),function(g){Ae(t.predecessors(g),function(y){var v=t.node(y),x=v.order;(xh)&&bie(r,p,f)})})}o(n,"scan");function i(a,s){var l=-1,u,h=0;return Ae(s,function(f,d){if(t.node(f).dummy==="border"){var p=t.predecessors(f);p.length&&(u=t.node(p[0]).order,n(s,h,d,l,u),h=d,l=u)}n(s,h,s.length,u,a.length)}),s}return o(i,"visitLayer"),Xr(e,i),r}function CIe(t,e){if(t.node(e).dummy)return ns(t.predecessors(e),function(r){return t.node(r).dummy})}function bie(t,e,r){if(e>r){var n=e;e=r,r=n}var i=t[e];i||(t[e]=i={}),i[r]=!0}function AIe(t,e,r){if(e>r){var n=e;e=r,r=n}return!!t[e]&&Object.prototype.hasOwnProperty.call(t[e],r)}function _Ie(t,e,r,n){var i={},a={},s={};return Ae(e,function(l){Ae(l,function(u,h){i[u]=u,a[u]=u,s[u]=h})}),Ae(e,function(l){var u=-1;Ae(l,function(h){var f=n(h);if(f.length){f=kc(f,function(y){return s[y]});for(var d=(f.length-1)/2,p=Math.floor(d),m=Math.ceil(d);p<=m;++p){var g=f[p];a[h]===h&&u{"use strict";qt();Vo();Sc();o(EIe,"findType1Conflicts");o(SIe,"findType2Conflicts");o(CIe,"findOtherInnerSegmentNode");o(bie,"addConflict");o(AIe,"hasConflict");o(_Ie,"verticalAlignment");o(DIe,"horizontalCompaction");o(LIe,"buildBlockGraph");o(RIe,"findSmallestWidthAlignment");o(NIe,"alignCoordinates");o(MIe,"balance");o(wie,"positionX");o(IIe,"sep");o(OIe,"width")});function kie(t){t=JT(t),PIe(t),ML(wie(t),function(e,r){t.node(r).x=e})}function PIe(t){var e=ef(t),r=t.graph().ranksep,n=0;Ae(e,function(i){var a=Is(Je(i,function(s){return t.node(s).height}));Ae(i,function(s){t.node(s).y=n+a/2}),n+=a+r})}var Eie=N(()=>{"use strict";qt();Sc();Tie();o(kie,"position");o(PIe,"positionY")});function R2(t,e){var r=e&&e.debugTiming?yne:vne;r("layout",()=>{var n=r(" buildLayoutGraph",()=>YIe(t));r(" runLayout",()=>BIe(n,r)),r(" updateInputGraph",()=>FIe(t,n))})}function BIe(t,e){e(" makeSpaceForEdgeLabels",()=>XIe(t)),e(" removeSelfEdges",()=>nOe(t)),e(" acyclic",()=>une(t)),e(" nestingGraph.run",()=>Xne(t)),e(" rank",()=>hR(JT(t))),e(" injectEdgeLabelProxies",()=>jIe(t)),e(" removeEmptyRanks",()=>mne(t)),e(" nestingGraph.cleanup",()=>Kne(t)),e(" normalizeRanks",()=>pne(t)),e(" assignRankMinMax",()=>KIe(t)),e(" removeEdgeLabelProxies",()=>QIe(t)),e(" normalize.run",()=>Ane(t)),e(" parentDummyChains",()=>vie(t)),e(" addBorderSegments",()=>bne(t)),e(" order",()=>gie(t)),e(" insertSelfEdges",()=>iOe(t)),e(" adjustCoordinateSystem",()=>kne(t)),e(" position",()=>kie(t)),e(" positionSelfEdges",()=>aOe(t)),e(" removeBorderNodes",()=>rOe(t)),e(" normalize.undo",()=>_ne(t)),e(" fixupEdgeLabelCoords",()=>eOe(t)),e(" undoCoordinateSystem",()=>Ene(t)),e(" translateGraph",()=>ZIe(t)),e(" assignNodeIntersects",()=>JIe(t)),e(" reversePoints",()=>tOe(t)),e(" acyclic.undo",()=>hne(t))}function FIe(t,e){Ae(t.nodes(),function(r){var n=t.node(r),i=e.node(r);n&&(n.x=i.x,n.y=i.y,e.children(r).length&&(n.width=i.width,n.height=i.height))}),Ae(t.edges(),function(r){var n=t.edge(r),i=e.edge(r);n.points=i.points,Object.prototype.hasOwnProperty.call(i,"x")&&(n.x=i.x,n.y=i.y)}),t.graph().width=e.graph().width,t.graph().height=e.graph().height}function YIe(t){var e=new sn({multigraph:!0,compound:!0}),r=mR(t.graph());return e.setGraph(Fh({},zIe,pR(r,$Ie),Vd(r,GIe))),Ae(t.nodes(),function(n){var i=mR(t.node(n));e.setNode(n,Qh(pR(i,VIe),UIe)),e.setParent(n,t.parent(n))}),Ae(t.edges(),function(n){var i=mR(t.edge(n));e.setEdge(n,Fh({},WIe,pR(i,HIe),Vd(i,qIe)))}),e}function XIe(t){var e=t.graph();e.ranksep/=2,Ae(t.edges(),function(r){var n=t.edge(r);n.minlen*=2,n.labelpos.toLowerCase()!=="c"&&(e.rankdir==="TB"||e.rankdir==="BT"?n.width+=n.labeloffset:n.height+=n.labeloffset)})}function jIe(t){Ae(t.edges(),function(e){var r=t.edge(e);if(r.width&&r.height){var n=t.node(e.v),i=t.node(e.w),a={rank:(i.rank-n.rank)/2+n.rank,e};Ec(t,"edge-proxy",a,"_ep")}})}function KIe(t){var e=0;Ae(t.nodes(),function(r){var n=t.node(r);n.borderTop&&(n.minRank=t.node(n.borderTop).rank,n.maxRank=t.node(n.borderBottom).rank,e=Is(e,n.maxRank))}),t.graph().maxRank=e}function QIe(t){Ae(t.nodes(),function(e){var r=t.node(e);r.dummy==="edge-proxy"&&(t.edge(r.e).labelRank=r.rank,t.removeNode(e))})}function ZIe(t){var e=Number.POSITIVE_INFINITY,r=0,n=Number.POSITIVE_INFINITY,i=0,a=t.graph(),s=a.marginx||0,l=a.marginy||0;function u(h){var f=h.x,d=h.y,p=h.width,m=h.height;e=Math.min(e,f-p/2),r=Math.max(r,f+p/2),n=Math.min(n,d-m/2),i=Math.max(i,d+m/2)}o(u,"getExtremes"),Ae(t.nodes(),function(h){u(t.node(h))}),Ae(t.edges(),function(h){var f=t.edge(h);Object.prototype.hasOwnProperty.call(f,"x")&&u(f)}),e-=s,n-=l,Ae(t.nodes(),function(h){var f=t.node(h);f.x-=e,f.y-=n}),Ae(t.edges(),function(h){var f=t.edge(h);Ae(f.points,function(d){d.x-=e,d.y-=n}),Object.prototype.hasOwnProperty.call(f,"x")&&(f.x-=e),Object.prototype.hasOwnProperty.call(f,"y")&&(f.y-=n)}),a.width=r-e+s,a.height=i-n+l}function JIe(t){Ae(t.edges(),function(e){var r=t.edge(e),n=t.node(e.v),i=t.node(e.w),a,s;r.points?(a=r.points[0],s=r.points[r.points.length-1]):(r.points=[],a=i,s=n),r.points.unshift(XL(n,a)),r.points.push(XL(i,s))})}function eOe(t){Ae(t.edges(),function(e){var r=t.edge(e);if(Object.prototype.hasOwnProperty.call(r,"x"))switch((r.labelpos==="l"||r.labelpos==="r")&&(r.width-=r.labeloffset),r.labelpos){case"l":r.x-=r.width/2+r.labeloffset;break;case"r":r.x+=r.width/2+r.labeloffset;break}})}function tOe(t){Ae(t.edges(),function(e){var r=t.edge(e);r.reversed&&r.points.reverse()})}function rOe(t){Ae(t.nodes(),function(e){if(t.children(e).length){var r=t.node(e),n=t.node(r.borderTop),i=t.node(r.borderBottom),a=t.node(ga(r.borderLeft)),s=t.node(ga(r.borderRight));r.width=Math.abs(s.x-a.x),r.height=Math.abs(i.y-n.y),r.x=a.x+r.width/2,r.y=n.y+r.height/2}}),Ae(t.nodes(),function(e){t.node(e).dummy==="border"&&t.removeNode(e)})}function nOe(t){Ae(t.edges(),function(e){if(e.v===e.w){var r=t.node(e.v);r.selfEdges||(r.selfEdges=[]),r.selfEdges.push({e,label:t.edge(e)}),t.removeEdge(e)}})}function iOe(t){var e=ef(t);Ae(e,function(r){var n=0;Ae(r,function(i,a){var s=t.node(i);s.order=a+n,Ae(s.selfEdges,function(l){Ec(t,"selfedge",{width:l.label.width,height:l.label.height,rank:s.rank,order:a+ ++n,e:l.e,label:l.label},"_se")}),delete s.selfEdges})})}function aOe(t){Ae(t.nodes(),function(e){var r=t.node(e);if(r.dummy==="selfedge"){var n=t.node(r.e.v),i=n.x+n.width/2,a=n.y,s=r.x-i,l=n.height/2;t.setEdge(r.e,r.label),t.removeNode(e),r.label.points=[{x:i+2*s/3,y:a-l},{x:i+5*s/6,y:a-l},{x:i+s,y:a},{x:i+5*s/6,y:a+l},{x:i+2*s/3,y:a+l}],r.label.x=r.x,r.label.y=r.y}})}function pR(t,e){return zd(Vd(t,e),Number)}function mR(t){var e={};return Ae(t,function(r,n){e[n.toLowerCase()]=r}),e}var $Ie,zIe,GIe,VIe,UIe,HIe,WIe,qIe,Sie=N(()=>{"use strict";qt();Vo();wne();Cne();YL();JL();fR();Qne();yie();xie();Eie();Sc();o(R2,"layout");o(BIe,"runLayout");o(FIe,"updateInputGraph");$Ie=["nodesep","edgesep","ranksep","marginx","marginy"],zIe={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},GIe=["acyclicer","ranker","rankdir","align"],VIe=["width","height"],UIe={width:0,height:0},HIe=["minlen","weight","width","height","labeloffset"],WIe={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},qIe=["labelpos"];o(YIe,"buildLayoutGraph");o(XIe,"makeSpaceForEdgeLabels");o(jIe,"injectEdgeLabelProxies");o(KIe,"assignRankMinMax");o(QIe,"removeEdgeLabelProxies");o(ZIe,"translateGraph");o(JIe,"assignNodeIntersects");o(eOe,"fixupEdgeLabelCoords");o(tOe,"reversePointsForReversedEdges");o(rOe,"removeBorderNodes");o(nOe,"removeSelfEdges");o(iOe,"insertSelfEdges");o(aOe,"positionSelfEdges");o(pR,"selectNumberAttrs");o(mR,"canonicalize")});var gR=N(()=>{"use strict";YL();Sie();JL();fR()});function Uo(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:sOe(t),edges:oOe(t)};return pr(t.graph())||(e.value=an(t.graph())),e}function sOe(t){return Je(t.nodes(),function(e){var r=t.node(e),n=t.parent(e),i={v:e};return pr(r)||(i.value=r),pr(n)||(i.parent=n),i})}function oOe(t){return Je(t.edges(),function(e){var r=t.edge(e),n={v:e.v,w:e.w};return pr(e.name)||(n.name=e.name),pr(r)||(n.value=r),n})}var yR=N(()=>{"use strict";qt();KT();o(Uo,"write");o(sOe,"writeNodes");o(oOe,"writeEdges")});var wr,qd,_ie,Die,nk,lOe,Lie,Rie,cOe,Fm,Aie,Nie,Mie,Iie,Oie,Pie=N(()=>{"use strict";vt();Vo();yR();wr=new Map,qd=new Map,_ie=new Map,Die=o(()=>{qd.clear(),_ie.clear(),wr.clear()},"clear"),nk=o((t,e)=>{let r=qd.get(e)||[];return Y.trace("In isDescendant",e," ",t," = ",r.includes(t)),r.includes(t)},"isDescendant"),lOe=o((t,e)=>{let r=qd.get(e)||[];return Y.info("Descendants of ",e," is ",r),Y.info("Edge is ",t),t.v===e||t.w===e?!1:r?r.includes(t.v)||nk(t.v,e)||nk(t.w,e)||r.includes(t.w):(Y.debug("Tilt, ",e,",not in descendants"),!1)},"edgeInCluster"),Lie=o((t,e,r,n)=>{Y.warn("Copying children of ",t,"root",n,"data",e.node(t),n);let i=e.children(t)||[];t!==n&&i.push(t),Y.warn("Copying (nodes) clusterId",t,"nodes",i),i.forEach(a=>{if(e.children(a).length>0)Lie(a,e,r,n);else{let s=e.node(a);Y.info("cp ",a," to ",n," with parent ",t),r.setNode(a,s),n!==e.parent(a)&&(Y.warn("Setting parent",a,e.parent(a)),r.setParent(a,e.parent(a))),t!==n&&a!==t?(Y.debug("Setting parent",a,t),r.setParent(a,t)):(Y.info("In copy ",t,"root",n,"data",e.node(t),n),Y.debug("Not Setting parent for node=",a,"cluster!==rootId",t!==n,"node!==clusterId",a!==t));let l=e.edges(a);Y.debug("Copying Edges",l),l.forEach(u=>{Y.info("Edge",u);let h=e.edge(u.v,u.w,u.name);Y.info("Edge data",h,n);try{lOe(u,n)?(Y.info("Copying as ",u.v,u.w,h,u.name),r.setEdge(u.v,u.w,h,u.name),Y.info("newGraph edges ",r.edges(),r.edge(r.edges()[0]))):Y.info("Skipping copy of edge ",u.v,"-->",u.w," rootId: ",n," clusterId:",t)}catch(f){Y.error(f)}})}Y.debug("Removing node",a),e.removeNode(a)})},"copy"),Rie=o((t,e)=>{let r=e.children(t),n=[...r];for(let i of r)_ie.set(i,t),n=[...n,...Rie(i,e)];return n},"extractDescendants"),cOe=o((t,e,r)=>{let n=t.edges().filter(u=>u.v===e||u.w===e),i=t.edges().filter(u=>u.v===r||u.w===r),a=n.map(u=>({v:u.v===e?r:u.v,w:u.w===e?e:u.w})),s=i.map(u=>({v:u.v,w:u.w}));return a.filter(u=>s.some(h=>u.v===h.v&&u.w===h.w))},"findCommonEdges"),Fm=o((t,e,r)=>{let n=e.children(t);if(Y.trace("Searching children of id ",t,n),n.length<1)return t;let i;for(let a of n){let s=Fm(a,e,r),l=cOe(e,r,s);if(s)if(l.length>0)i=s;else return s}return i},"findNonClusterChild"),Aie=o(t=>!wr.has(t)||!wr.get(t).externalConnections?t:wr.has(t)?wr.get(t).id:t,"getAnchorId"),Nie=o((t,e)=>{if(!t||e>10){Y.debug("Opting out, no graph ");return}else Y.debug("Opting in, graph ");t.nodes().forEach(function(r){t.children(r).length>0&&(Y.warn("Cluster identified",r," Replacement id in edges: ",Fm(r,t,r)),qd.set(r,Rie(r,t)),wr.set(r,{id:Fm(r,t,r),clusterData:t.node(r)}))}),t.nodes().forEach(function(r){let n=t.children(r),i=t.edges();n.length>0?(Y.debug("Cluster identified",r,qd),i.forEach(a=>{let s=nk(a.v,r),l=nk(a.w,r);s^l&&(Y.warn("Edge: ",a," leaves cluster ",r),Y.warn("Descendants of XXX ",r,": ",qd.get(r)),wr.get(r).externalConnections=!0)})):Y.debug("Not a cluster ",r,qd)});for(let r of wr.keys()){let n=wr.get(r).id,i=t.parent(n);i!==r&&wr.has(i)&&!wr.get(i).externalConnections&&(wr.get(r).id=i)}t.edges().forEach(function(r){let n=t.edge(r);Y.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(r)),Y.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(t.edge(r)));let i=r.v,a=r.w;if(Y.warn("Fix XXX",wr,"ids:",r.v,r.w,"Translating: ",wr.get(r.v)," --- ",wr.get(r.w)),wr.get(r.v)||wr.get(r.w)){if(Y.warn("Fixing and trying - removing XXX",r.v,r.w,r.name),i=Aie(r.v),a=Aie(r.w),t.removeEdge(r.v,r.w,r.name),i!==r.v){let s=t.parent(i);wr.get(s).externalConnections=!0,n.fromCluster=r.v}if(a!==r.w){let s=t.parent(a);wr.get(s).externalConnections=!0,n.toCluster=r.w}Y.warn("Fix Replacing with XXX",i,a,r.name),t.setEdge(i,a,n,r.name)}}),Y.warn("Adjusted Graph",Uo(t)),Mie(t,0),Y.trace(wr)},"adjustClustersAndEdges"),Mie=o((t,e)=>{if(Y.warn("extractor - ",e,Uo(t),t.children("D")),e>10){Y.error("Bailing out");return}let r=t.nodes(),n=!1;for(let i of r){let a=t.children(i);n=n||a.length>0}if(!n){Y.debug("Done, no node has children",t.nodes());return}Y.debug("Nodes = ",r,e);for(let i of r)if(Y.debug("Extracting node",i,wr,wr.has(i)&&!wr.get(i).externalConnections,!t.parent(i),t.node(i),t.children("D")," Depth ",e),!wr.has(i))Y.debug("Not a cluster",i,e);else if(!wr.get(i).externalConnections&&t.children(i)&&t.children(i).length>0){Y.warn("Cluster without external connections, without a parent and with children",i,e);let s=t.graph().rankdir==="TB"?"LR":"TB";wr.get(i)?.clusterData?.dir&&(s=wr.get(i).clusterData.dir,Y.warn("Fixing dir",wr.get(i).clusterData.dir,s));let l=new sn({multigraph:!0,compound:!0}).setGraph({rankdir:s,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});Y.warn("Old graph before copy",Uo(t)),Lie(i,t,l,i),t.setNode(i,{clusterNode:!0,id:i,clusterData:wr.get(i).clusterData,label:wr.get(i).label,graph:l}),Y.warn("New graph after copy node: (",i,")",Uo(l)),Y.debug("Old graph after copy",Uo(t))}else Y.warn("Cluster ** ",i," **not meeting the criteria !externalConnections:",!wr.get(i).externalConnections," no parent: ",!t.parent(i)," children ",t.children(i)&&t.children(i).length>0,t.children("D"),e),Y.debug(wr);r=t.nodes(),Y.warn("New list of nodes",r);for(let i of r){let a=t.node(i);Y.warn(" Now next level",i,a),a?.clusterNode&&Mie(a.graph,e+1)}},"extractor"),Iie=o((t,e)=>{if(e.length===0)return[];let r=Object.assign([],e);return e.forEach(n=>{let i=t.children(n),a=Iie(t,i);r=[...r,...a]}),r},"sorter"),Oie=o(t=>Iie(t,t.children()),"sortNodesByHierarchy")});var Fie={};hr(Fie,{render:()=>uOe});var Bie,uOe,$ie=N(()=>{"use strict";gR();yR();Vo();tL();Ft();Pie();eT();Hw();eL();vt();w2();zt();Bie=o(async(t,e,r,n,i,a)=>{Y.warn("Graph in recursive render:XAX",Uo(e),i);let s=e.graph().rankdir;Y.trace("Dir in recursive render - dir:",s);let l=t.insert("g").attr("class","root");e.nodes()?Y.info("Recursive render XXX",e.nodes()):Y.info("No nodes found for",e),e.edges().length>0&&Y.info("Recursive edges",e.edge(e.edges()[0]));let u=l.insert("g").attr("class","clusters"),h=l.insert("g").attr("class","edgePaths"),f=l.insert("g").attr("class","edgeLabels"),d=l.insert("g").attr("class","nodes");await Promise.all(e.nodes().map(async function(y){let v=e.node(y);if(i!==void 0){let x=JSON.parse(JSON.stringify(i.clusterData));Y.trace(`Setting data for parent cluster XXX + Node.id = `,y,` + data=`,x.height,` +Parent cluster`,i.height),e.setNode(i.id,x),e.parent(y)||(Y.trace("Setting parent",y,i.id),e.setParent(y,i.id,x))}if(Y.info("(Insert) Node XXX"+y+": "+JSON.stringify(e.node(y))),v?.clusterNode){Y.info("Cluster identified XBX",y,v.width,e.node(y));let{ranksep:x,nodesep:b}=e.graph();v.graph.setGraph({...v.graph.graph(),ranksep:x+25,nodesep:b});let w=await Bie(d,v.graph,r,n,e.node(y),a),C=w.elem;je(v,C),v.diff=w.diff||0,Y.info("New compound node after recursive render XAX",y,"width",v.width,"height",v.height),rJ(C,v)}else e.children(y).length>0?(Y.trace("Cluster - the non recursive path XBX",y,v.id,v,v.width,"Graph:",e),Y.trace(Fm(v.id,e)),wr.set(v.id,{id:Fm(v.id,e),node:v})):(Y.trace("Node - the non recursive path XAX",y,d,e.node(y),s),await vm(d,e.node(y),{config:a,dir:s}))})),await o(async()=>{let y=e.edges().map(async function(v){let x=e.edge(v.v,v.w,v.name);Y.info("Edge "+v.v+" -> "+v.w+": "+JSON.stringify(v)),Y.info("Edge "+v.v+" -> "+v.w+": ",v," ",JSON.stringify(e.edge(v))),Y.info("Fix",wr,"ids:",v.v,v.w,"Translating: ",wr.get(v.v),wr.get(v.w)),await jw(f,x)});await Promise.all(y)},"processEdges")(),Y.info("Graph before layout:",JSON.stringify(Uo(e))),Y.info("############################################# XXX"),Y.info("### Layout ### XXX"),Y.info("############################################# XXX"),R2(e),Y.info("Graph after layout:",JSON.stringify(Uo(e)));let m=0,{subGraphTitleTotalMargin:g}=Ru(a);return await Promise.all(Oie(e).map(async function(y){let v=e.node(y);if(Y.info("Position XBX => "+y+": ("+v.x,","+v.y,") width: ",v.width," height: ",v.height),v?.clusterNode)v.y+=g,Y.info("A tainted cluster node XBX1",y,v.id,v.width,v.height,v.x,v.y,e.parent(y)),wr.get(v.id).node=v,k2(v);else if(e.children(y).length>0){Y.info("A pure cluster node XBX1",y,v.id,v.x,v.y,v.width,v.height,e.parent(y)),v.height+=g,e.node(v.parentId);let x=v?.padding/2||0,b=v?.labelBBox?.height||0,w=b-x||0;Y.debug("OffsetY",w,"labelHeight",b,"halfPadding",x),await ym(u,v),wr.get(v.id).node=v}else{let x=e.node(v.parentId);v.y+=g/2,Y.info("A regular node XBX1 - using the padding",v.id,"parent",v.parentId,v.width,v.height,v.x,v.y,"offsetY",v.offsetY,"parent",x,x?.offsetY,v),k2(v)}})),e.edges().forEach(function(y){let v=e.edge(y);Y.info("Edge "+y.v+" -> "+y.w+": "+JSON.stringify(v),v),v.points.forEach(C=>C.y+=g/2);let x=e.node(y.v);var b=e.node(y.w);let w=Qw(h,v,wr,r,x,b,n);Kw(v,w)}),e.nodes().forEach(function(y){let v=e.node(y);Y.info(y,v.type,v.diff),v.isGroup&&(m=v.diff)}),Y.warn("Returning from recursive render XAX",l,m),{elem:l,diff:m}},"recursiveRender"),uOe=o(async(t,e)=>{let r=new sn({multigraph:!0,compound:!0}).setGraph({rankdir:t.direction,nodesep:t.config?.nodeSpacing||t.config?.flowchart?.nodeSpacing||t.nodeSpacing,ranksep:t.config?.rankSpacing||t.config?.flowchart?.rankSpacing||t.rankSpacing,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}}),n=e.select("g");Zw(n,t.markers,t.type,t.diagramId),nJ(),tJ(),jZ(),Die(),t.nodes.forEach(a=>{r.setNode(a.id,{...a}),a.parentId&&r.setParent(a.id,a.parentId)}),Y.debug("Edges:",t.edges),t.edges.forEach(a=>{if(a.start===a.end){let s=a.start,l=s+"---"+s+"---1",u=s+"---"+s+"---2",h=r.node(s);r.setNode(l,{domId:l,id:l,parentId:h.parentId,labelStyle:"",label:"",padding:0,shape:"labelRect",style:"",width:10,height:10}),r.setParent(l,h.parentId),r.setNode(u,{domId:u,id:u,parentId:h.parentId,labelStyle:"",padding:0,shape:"labelRect",label:"",style:"",width:10,height:10}),r.setParent(u,h.parentId);let f=structuredClone(a),d=structuredClone(a),p=structuredClone(a);f.label="",f.arrowTypeEnd="none",f.id=s+"-cyclic-special-1",d.arrowTypeStart="none",d.arrowTypeEnd="none",d.id=s+"-cyclic-special-mid",p.label="",h.isGroup&&(f.fromCluster=s,p.toCluster=s),p.id=s+"-cyclic-special-2",p.arrowTypeStart="none",r.setEdge(s,l,f,s+"-cyclic-special-0"),r.setEdge(l,u,d,s+"-cyclic-special-1"),r.setEdge(u,s,p,s+"-cyc{"use strict";aJ();vt();N2={},vR=o(t=>{for(let e of t)N2[e.name]=e},"registerLayoutLoaders"),hOe=o(()=>{vR([{name:"dagre",loader:o(async()=>await Promise.resolve().then(()=>($ie(),Fie)),"loader")}])},"registerDefaultLayoutLoaders");hOe();Cc=o(async(t,e)=>{if(!(t.layoutAlgorithm in N2))throw new Error(`Unknown layout algorithm: ${t.layoutAlgorithm}`);let r=N2[t.layoutAlgorithm];return(await r.loader()).render(t,e,iJ,{algorithm:r.algorithm})},"render"),nf=o((t="",{fallback:e="dagre"}={})=>{if(t in N2)return t;if(e in N2)return Y.warn(`Layout algorithm ${t} is not registered. Using ${e} as fallback.`),e;throw new Error(`Both layout algorithms ${t} and ${e} are not registered.`)},"getRegisteredLayoutAlgorithm")});var Ac,fOe,dOe,$m=N(()=>{"use strict";Ei();vt();Ac=o((t,e,r,n)=>{t.attr("class",r);let{width:i,height:a,x:s,y:l}=fOe(t,e);vn(t,a,i,n);let u=dOe(s,l,i,a,e);t.attr("viewBox",u),Y.debug(`viewBox configured: ${u} with padding: ${e}`)},"setupViewPortForSVG"),fOe=o((t,e)=>{let r=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:r.width+e*2,height:r.height+e*2,x:r.x,y:r.y}},"calculateDimensionsWithPadding"),dOe=o((t,e,r,n,i)=>`${t-i} ${e-i} ${r} ${n}`,"createViewBox")});var pOe,mOe,zie,Gie=N(()=>{"use strict";dr();zt();vt();gm();Yd();$m();ir();pOe=o(function(t,e){return e.db.getClasses()},"getClasses"),mOe=o(async function(t,e,r,n){Y.info("REF0:"),Y.info("Drawing state diagram (v2)",e);let{securityLevel:i,flowchart:a,layout:s}=me(),l;i==="sandbox"&&(l=Ge("#i"+e));let u=i==="sandbox"?l.nodes()[0].contentDocument:document;Y.debug("Before getData: ");let h=n.db.getData();Y.debug("Data: ",h);let f=yc(e,i),d=n.db.getDirection();h.type=n.type,h.layoutAlgorithm=nf(s),h.layoutAlgorithm==="dagre"&&s==="elk"&&Y.warn("flowchart-elk was moved to an external package in Mermaid v11. Please refer [release notes](https://github.com/mermaid-js/mermaid/releases/tag/v11.0.0) for more details. This diagram will be rendered using `dagre` layout as a fallback."),h.direction=d,h.nodeSpacing=a?.nodeSpacing||50,h.rankSpacing=a?.rankSpacing||50,h.markers=["point","circle","cross"],h.diagramId=e,Y.debug("REF1:",h),await Cc(h,f);let p=h.config.flowchart?.diagramPadding??8;Gt.insertTitle(f,"flowchartTitleText",a?.titleTopMargin||0,n.db.getDiagramTitle()),Ac(f,p,"flowchart",a?.useMaxWidth||!1);for(let m of h.nodes){let g=Ge(`#${e} [id="${m.id}"]`);if(!g||!m.link)continue;let y=u.createElementNS("http://www.w3.org/2000/svg","a");y.setAttributeNS("http://www.w3.org/2000/svg","class",m.cssClasses),y.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),i==="sandbox"?y.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):m.linkTarget&&y.setAttributeNS("http://www.w3.org/2000/svg","target",m.linkTarget);let v=g.insert(function(){return y},":first-child"),x=g.select(".label-container");x&&v.append(function(){return x.node()});let b=g.select(".label");b&&v.append(function(){return b.node()})}},"draw"),zie={getClasses:pOe,draw:mOe}});var xR,bR,Vie=N(()=>{"use strict";xR=function(){var t=o(function(Hr,et,mt,Kt){for(mt=mt||{},Kt=Hr.length;Kt--;mt[Hr[Kt]]=et);return mt},"o"),e=[1,4],r=[1,3],n=[1,5],i=[1,8,9,10,11,27,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],a=[2,2],s=[1,13],l=[1,14],u=[1,15],h=[1,16],f=[1,23],d=[1,25],p=[1,26],m=[1,27],g=[1,49],y=[1,48],v=[1,29],x=[1,30],b=[1,31],w=[1,32],C=[1,33],T=[1,44],E=[1,46],A=[1,42],S=[1,47],_=[1,43],I=[1,50],D=[1,45],k=[1,51],L=[1,52],R=[1,34],O=[1,35],M=[1,36],B=[1,37],F=[1,57],P=[1,8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],z=[1,61],$=[1,60],H=[1,62],Q=[8,9,11,75,77,78],j=[1,78],ie=[1,91],ne=[1,96],le=[1,95],he=[1,92],K=[1,88],X=[1,94],te=[1,90],J=[1,97],se=[1,93],ue=[1,98],Z=[1,89],Se=[8,9,10,11,40,75,77,78],ce=[8,9,10,11,40,46,75,77,78],ae=[8,9,10,11,29,40,44,46,48,50,52,54,56,58,60,63,65,67,68,70,75,77,78,89,102,105,106,109,111,114,115,116],Oe=[8,9,11,44,60,75,77,78,89,102,105,106,109,111,114,115,116],ge=[44,60,89,102,105,106,109,111,114,115,116],ze=[1,121],He=[1,122],$e=[1,124],Re=[1,123],Ie=[44,60,62,74,89,102,105,106,109,111,114,115,116],be=[1,133],W=[1,147],de=[1,148],re=[1,149],oe=[1,150],V=[1,135],xe=[1,137],q=[1,141],pe=[1,142],ve=[1,143],Pe=[1,144],_e=[1,145],we=[1,146],Ve=[1,151],De=[1,152],qe=[1,131],at=[1,132],Rt=[1,139],st=[1,134],Ue=[1,138],ct=[1,136],We=[8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],ot=[1,154],Yt=[1,156],bt=[8,9,11],Mt=[8,9,10,11,14,44,60,89,105,106,109,111,114,115,116],xt=[1,176],ut=[1,172],Et=[1,173],ft=[1,177],yt=[1,174],nt=[1,175],dn=[77,116,119],Tt=[8,9,10,11,12,14,27,29,32,44,60,75,84,85,86,87,88,89,90,105,109,111,114,115,116],On=[10,106],tn=[31,49,51,53,55,57,62,64,66,67,69,71,116,117,118],_r=[1,247],Dr=[1,245],Pn=[1,249],At=[1,243],Ce=[1,244],tt=[1,246],St=[1,248],mr=[1,250],rn=[1,268],gn=[8,9,11,106],Zr=[8,9,10,11,60,84,105,106,109,110,111,112],Ni={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,graphConfig:4,document:5,line:6,statement:7,SEMI:8,NEWLINE:9,SPACE:10,EOF:11,GRAPH:12,NODIR:13,DIR:14,FirstStmtSeparator:15,ending:16,endToken:17,spaceList:18,spaceListNewline:19,vertexStatement:20,separator:21,styleStatement:22,linkStyleStatement:23,classDefStatement:24,classStatement:25,clickStatement:26,subgraph:27,textNoTags:28,SQS:29,text:30,SQE:31,end:32,direction:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,shapeData:39,SHAPE_DATA:40,link:41,node:42,styledVertex:43,AMP:44,vertex:45,STYLE_SEPARATOR:46,idString:47,DOUBLECIRCLESTART:48,DOUBLECIRCLEEND:49,PS:50,PE:51,"(-":52,"-)":53,STADIUMSTART:54,STADIUMEND:55,SUBROUTINESTART:56,SUBROUTINEEND:57,VERTEX_WITH_PROPS_START:58,"NODE_STRING[field]":59,COLON:60,"NODE_STRING[value]":61,PIPE:62,CYLINDERSTART:63,CYLINDEREND:64,DIAMOND_START:65,DIAMOND_STOP:66,TAGEND:67,TRAPSTART:68,TRAPEND:69,INVTRAPSTART:70,INVTRAPEND:71,linkStatement:72,arrowText:73,TESTSTR:74,START_LINK:75,edgeText:76,LINK:77,LINK_ID:78,edgeTextToken:79,STR:80,MD_STR:81,textToken:82,keywords:83,STYLE:84,LINKSTYLE:85,CLASSDEF:86,CLASS:87,CLICK:88,DOWN:89,UP:90,textNoTagsToken:91,stylesOpt:92,"idString[vertex]":93,"idString[class]":94,CALLBACKNAME:95,CALLBACKARGS:96,HREF:97,LINK_TARGET:98,"STR[link]":99,"STR[tooltip]":100,alphaNum:101,DEFAULT:102,numList:103,INTERPOLATE:104,NUM:105,COMMA:106,style:107,styleComponent:108,NODE_STRING:109,UNIT:110,BRKT:111,PCT:112,idStringToken:113,MINUS:114,MULT:115,UNICODE_TEXT:116,TEXT:117,TAGSTART:118,EDGE_TEXT:119,alphaNumToken:120,direction_tb:121,direction_bt:122,direction_rl:123,direction_lr:124,$accept:0,$end:1},terminals_:{2:"error",8:"SEMI",9:"NEWLINE",10:"SPACE",11:"EOF",12:"GRAPH",13:"NODIR",14:"DIR",27:"subgraph",29:"SQS",31:"SQE",32:"end",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",40:"SHAPE_DATA",44:"AMP",46:"STYLE_SEPARATOR",48:"DOUBLECIRCLESTART",49:"DOUBLECIRCLEEND",50:"PS",51:"PE",52:"(-",53:"-)",54:"STADIUMSTART",55:"STADIUMEND",56:"SUBROUTINESTART",57:"SUBROUTINEEND",58:"VERTEX_WITH_PROPS_START",59:"NODE_STRING[field]",60:"COLON",61:"NODE_STRING[value]",62:"PIPE",63:"CYLINDERSTART",64:"CYLINDEREND",65:"DIAMOND_START",66:"DIAMOND_STOP",67:"TAGEND",68:"TRAPSTART",69:"TRAPEND",70:"INVTRAPSTART",71:"INVTRAPEND",74:"TESTSTR",75:"START_LINK",77:"LINK",78:"LINK_ID",80:"STR",81:"MD_STR",84:"STYLE",85:"LINKSTYLE",86:"CLASSDEF",87:"CLASS",88:"CLICK",89:"DOWN",90:"UP",93:"idString[vertex]",94:"idString[class]",95:"CALLBACKNAME",96:"CALLBACKARGS",97:"HREF",98:"LINK_TARGET",99:"STR[link]",100:"STR[tooltip]",102:"DEFAULT",104:"INTERPOLATE",105:"NUM",106:"COMMA",109:"NODE_STRING",110:"UNIT",111:"BRKT",112:"PCT",114:"MINUS",115:"MULT",116:"UNICODE_TEXT",117:"TEXT",118:"TAGSTART",119:"EDGE_TEXT",121:"direction_tb",122:"direction_bt",123:"direction_rl",124:"direction_lr"},productions_:[0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,2],[4,3],[16,2],[16,1],[17,1],[17,1],[17,1],[15,1],[15,1],[15,2],[19,2],[19,2],[19,1],[19,1],[18,2],[18,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,9],[7,6],[7,4],[7,1],[7,2],[7,2],[7,1],[21,1],[21,1],[21,1],[39,2],[39,1],[20,4],[20,3],[20,4],[20,2],[20,2],[20,1],[42,1],[42,6],[42,5],[43,1],[43,3],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,8],[45,4],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,1],[41,2],[41,3],[41,3],[41,1],[41,3],[41,4],[76,1],[76,2],[76,1],[76,1],[72,1],[72,2],[73,3],[30,1],[30,2],[30,1],[30,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[28,1],[28,2],[28,1],[28,1],[24,5],[25,5],[26,2],[26,4],[26,3],[26,5],[26,3],[26,5],[26,5],[26,7],[26,2],[26,4],[26,2],[26,4],[26,4],[26,6],[22,5],[23,5],[23,5],[23,9],[23,9],[23,7],[23,7],[103,1],[103,3],[92,1],[92,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[82,1],[82,1],[82,1],[82,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[79,1],[79,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[47,1],[47,2],[101,1],[101,2],[33,1],[33,1],[33,1],[33,1]],performAction:o(function(et,mt,Kt,lt,Cn,ye,Vf){var Te=ye.length-1;switch(Cn){case 2:this.$=[];break;case 3:(!Array.isArray(ye[Te])||ye[Te].length>0)&&ye[Te-1].push(ye[Te]),this.$=ye[Te-1];break;case 4:case 183:this.$=ye[Te];break;case 11:lt.setDirection("TB"),this.$="TB";break;case 12:lt.setDirection(ye[Te-1]),this.$=ye[Te-1];break;case 27:this.$=ye[Te-1].nodes;break;case 28:case 29:case 30:case 31:case 32:this.$=[];break;case 33:this.$=lt.addSubGraph(ye[Te-6],ye[Te-1],ye[Te-4]);break;case 34:this.$=lt.addSubGraph(ye[Te-3],ye[Te-1],ye[Te-3]);break;case 35:this.$=lt.addSubGraph(void 0,ye[Te-1],void 0);break;case 37:this.$=ye[Te].trim(),lt.setAccTitle(this.$);break;case 38:case 39:this.$=ye[Te].trim(),lt.setAccDescription(this.$);break;case 43:this.$=ye[Te-1]+ye[Te];break;case 44:this.$=ye[Te];break;case 45:lt.addVertex(ye[Te-1][ye[Te-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,ye[Te]),lt.addLink(ye[Te-3].stmt,ye[Te-1],ye[Te-2]),this.$={stmt:ye[Te-1],nodes:ye[Te-1].concat(ye[Te-3].nodes)};break;case 46:lt.addLink(ye[Te-2].stmt,ye[Te],ye[Te-1]),this.$={stmt:ye[Te],nodes:ye[Te].concat(ye[Te-2].nodes)};break;case 47:lt.addLink(ye[Te-3].stmt,ye[Te-1],ye[Te-2]),this.$={stmt:ye[Te-1],nodes:ye[Te-1].concat(ye[Te-3].nodes)};break;case 48:this.$={stmt:ye[Te-1],nodes:ye[Te-1]};break;case 49:lt.addVertex(ye[Te-1][ye[Te-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,ye[Te]),this.$={stmt:ye[Te-1],nodes:ye[Te-1],shapeData:ye[Te]};break;case 50:this.$={stmt:ye[Te],nodes:ye[Te]};break;case 51:this.$=[ye[Te]];break;case 52:lt.addVertex(ye[Te-5][ye[Te-5].length-1],void 0,void 0,void 0,void 0,void 0,void 0,ye[Te-4]),this.$=ye[Te-5].concat(ye[Te]);break;case 53:this.$=ye[Te-4].concat(ye[Te]);break;case 54:this.$=ye[Te];break;case 55:this.$=ye[Te-2],lt.setClass(ye[Te-2],ye[Te]);break;case 56:this.$=ye[Te-3],lt.addVertex(ye[Te-3],ye[Te-1],"square");break;case 57:this.$=ye[Te-3],lt.addVertex(ye[Te-3],ye[Te-1],"doublecircle");break;case 58:this.$=ye[Te-5],lt.addVertex(ye[Te-5],ye[Te-2],"circle");break;case 59:this.$=ye[Te-3],lt.addVertex(ye[Te-3],ye[Te-1],"ellipse");break;case 60:this.$=ye[Te-3],lt.addVertex(ye[Te-3],ye[Te-1],"stadium");break;case 61:this.$=ye[Te-3],lt.addVertex(ye[Te-3],ye[Te-1],"subroutine");break;case 62:this.$=ye[Te-7],lt.addVertex(ye[Te-7],ye[Te-1],"rect",void 0,void 0,void 0,Object.fromEntries([[ye[Te-5],ye[Te-3]]]));break;case 63:this.$=ye[Te-3],lt.addVertex(ye[Te-3],ye[Te-1],"cylinder");break;case 64:this.$=ye[Te-3],lt.addVertex(ye[Te-3],ye[Te-1],"round");break;case 65:this.$=ye[Te-3],lt.addVertex(ye[Te-3],ye[Te-1],"diamond");break;case 66:this.$=ye[Te-5],lt.addVertex(ye[Te-5],ye[Te-2],"hexagon");break;case 67:this.$=ye[Te-3],lt.addVertex(ye[Te-3],ye[Te-1],"odd");break;case 68:this.$=ye[Te-3],lt.addVertex(ye[Te-3],ye[Te-1],"trapezoid");break;case 69:this.$=ye[Te-3],lt.addVertex(ye[Te-3],ye[Te-1],"inv_trapezoid");break;case 70:this.$=ye[Te-3],lt.addVertex(ye[Te-3],ye[Te-1],"lean_right");break;case 71:this.$=ye[Te-3],lt.addVertex(ye[Te-3],ye[Te-1],"lean_left");break;case 72:this.$=ye[Te],lt.addVertex(ye[Te]);break;case 73:ye[Te-1].text=ye[Te],this.$=ye[Te-1];break;case 74:case 75:ye[Te-2].text=ye[Te-1],this.$=ye[Te-2];break;case 76:this.$=ye[Te];break;case 77:var wi=lt.destructLink(ye[Te],ye[Te-2]);this.$={type:wi.type,stroke:wi.stroke,length:wi.length,text:ye[Te-1]};break;case 78:var wi=lt.destructLink(ye[Te],ye[Te-2]);this.$={type:wi.type,stroke:wi.stroke,length:wi.length,text:ye[Te-1],id:ye[Te-3]};break;case 79:this.$={text:ye[Te],type:"text"};break;case 80:this.$={text:ye[Te-1].text+""+ye[Te],type:ye[Te-1].type};break;case 81:this.$={text:ye[Te],type:"string"};break;case 82:this.$={text:ye[Te],type:"markdown"};break;case 83:var wi=lt.destructLink(ye[Te]);this.$={type:wi.type,stroke:wi.stroke,length:wi.length};break;case 84:var wi=lt.destructLink(ye[Te]);this.$={type:wi.type,stroke:wi.stroke,length:wi.length,id:ye[Te-1]};break;case 85:this.$=ye[Te-1];break;case 86:this.$={text:ye[Te],type:"text"};break;case 87:this.$={text:ye[Te-1].text+""+ye[Te],type:ye[Te-1].type};break;case 88:this.$={text:ye[Te],type:"string"};break;case 89:case 104:this.$={text:ye[Te],type:"markdown"};break;case 101:this.$={text:ye[Te],type:"text"};break;case 102:this.$={text:ye[Te-1].text+""+ye[Te],type:ye[Te-1].type};break;case 103:this.$={text:ye[Te],type:"text"};break;case 105:this.$=ye[Te-4],lt.addClass(ye[Te-2],ye[Te]);break;case 106:this.$=ye[Te-4],lt.setClass(ye[Te-2],ye[Te]);break;case 107:case 115:this.$=ye[Te-1],lt.setClickEvent(ye[Te-1],ye[Te]);break;case 108:case 116:this.$=ye[Te-3],lt.setClickEvent(ye[Te-3],ye[Te-2]),lt.setTooltip(ye[Te-3],ye[Te]);break;case 109:this.$=ye[Te-2],lt.setClickEvent(ye[Te-2],ye[Te-1],ye[Te]);break;case 110:this.$=ye[Te-4],lt.setClickEvent(ye[Te-4],ye[Te-3],ye[Te-2]),lt.setTooltip(ye[Te-4],ye[Te]);break;case 111:this.$=ye[Te-2],lt.setLink(ye[Te-2],ye[Te]);break;case 112:this.$=ye[Te-4],lt.setLink(ye[Te-4],ye[Te-2]),lt.setTooltip(ye[Te-4],ye[Te]);break;case 113:this.$=ye[Te-4],lt.setLink(ye[Te-4],ye[Te-2],ye[Te]);break;case 114:this.$=ye[Te-6],lt.setLink(ye[Te-6],ye[Te-4],ye[Te]),lt.setTooltip(ye[Te-6],ye[Te-2]);break;case 117:this.$=ye[Te-1],lt.setLink(ye[Te-1],ye[Te]);break;case 118:this.$=ye[Te-3],lt.setLink(ye[Te-3],ye[Te-2]),lt.setTooltip(ye[Te-3],ye[Te]);break;case 119:this.$=ye[Te-3],lt.setLink(ye[Te-3],ye[Te-2],ye[Te]);break;case 120:this.$=ye[Te-5],lt.setLink(ye[Te-5],ye[Te-4],ye[Te]),lt.setTooltip(ye[Te-5],ye[Te-2]);break;case 121:this.$=ye[Te-4],lt.addVertex(ye[Te-2],void 0,void 0,ye[Te]);break;case 122:this.$=ye[Te-4],lt.updateLink([ye[Te-2]],ye[Te]);break;case 123:this.$=ye[Te-4],lt.updateLink(ye[Te-2],ye[Te]);break;case 124:this.$=ye[Te-8],lt.updateLinkInterpolate([ye[Te-6]],ye[Te-2]),lt.updateLink([ye[Te-6]],ye[Te]);break;case 125:this.$=ye[Te-8],lt.updateLinkInterpolate(ye[Te-6],ye[Te-2]),lt.updateLink(ye[Te-6],ye[Te]);break;case 126:this.$=ye[Te-6],lt.updateLinkInterpolate([ye[Te-4]],ye[Te]);break;case 127:this.$=ye[Te-6],lt.updateLinkInterpolate(ye[Te-4],ye[Te]);break;case 128:case 130:this.$=[ye[Te]];break;case 129:case 131:ye[Te-2].push(ye[Te]),this.$=ye[Te-2];break;case 133:this.$=ye[Te-1]+ye[Te];break;case 181:this.$=ye[Te];break;case 182:this.$=ye[Te-1]+""+ye[Te];break;case 184:this.$=ye[Te-1]+""+ye[Te];break;case 185:this.$={stmt:"dir",value:"TB"};break;case 186:this.$={stmt:"dir",value:"BT"};break;case 187:this.$={stmt:"dir",value:"RL"};break;case 188:this.$={stmt:"dir",value:"LR"};break}},"anonymous"),table:[{3:1,4:2,9:e,10:r,12:n},{1:[3]},t(i,a,{5:6}),{4:7,9:e,10:r,12:n},{4:8,9:e,10:r,12:n},{13:[1,9],14:[1,10]},{1:[2,1],6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:w,88:C,89:T,102:E,105:A,106:S,109:_,111:I,113:41,114:D,115:k,116:L,121:R,122:O,123:M,124:B},t(i,[2,9]),t(i,[2,10]),t(i,[2,11]),{8:[1,54],9:[1,55],10:F,15:53,18:56},t(P,[2,3]),t(P,[2,4]),t(P,[2,5]),t(P,[2,6]),t(P,[2,7]),t(P,[2,8]),{8:z,9:$,11:H,21:58,41:59,72:63,75:[1,64],77:[1,66],78:[1,65]},{8:z,9:$,11:H,21:67},{8:z,9:$,11:H,21:68},{8:z,9:$,11:H,21:69},{8:z,9:$,11:H,21:70},{8:z,9:$,11:H,21:71},{8:z,9:$,10:[1,72],11:H,21:73},t(P,[2,36]),{35:[1,74]},{37:[1,75]},t(P,[2,39]),t(Q,[2,50],{18:76,39:77,10:F,40:j}),{10:[1,79]},{10:[1,80]},{10:[1,81]},{10:[1,82]},{14:ie,44:ne,60:le,80:[1,86],89:he,95:[1,83],97:[1,84],101:85,105:K,106:X,109:te,111:J,114:se,115:ue,116:Z,120:87},t(P,[2,185]),t(P,[2,186]),t(P,[2,187]),t(P,[2,188]),t(Se,[2,51]),t(Se,[2,54],{46:[1,99]}),t(ce,[2,72],{113:112,29:[1,100],44:g,48:[1,101],50:[1,102],52:[1,103],54:[1,104],56:[1,105],58:[1,106],60:y,63:[1,107],65:[1,108],67:[1,109],68:[1,110],70:[1,111],89:T,102:E,105:A,106:S,109:_,111:I,114:D,115:k,116:L}),t(ae,[2,181]),t(ae,[2,142]),t(ae,[2,143]),t(ae,[2,144]),t(ae,[2,145]),t(ae,[2,146]),t(ae,[2,147]),t(ae,[2,148]),t(ae,[2,149]),t(ae,[2,150]),t(ae,[2,151]),t(ae,[2,152]),t(i,[2,12]),t(i,[2,18]),t(i,[2,19]),{9:[1,113]},t(Oe,[2,26],{18:114,10:F}),t(P,[2,27]),{42:115,43:38,44:g,45:39,47:40,60:y,89:T,102:E,105:A,106:S,109:_,111:I,113:41,114:D,115:k,116:L},t(P,[2,40]),t(P,[2,41]),t(P,[2,42]),t(ge,[2,76],{73:116,62:[1,118],74:[1,117]}),{76:119,79:120,80:ze,81:He,116:$e,119:Re},{75:[1,125],77:[1,126]},t(Ie,[2,83]),t(P,[2,28]),t(P,[2,29]),t(P,[2,30]),t(P,[2,31]),t(P,[2,32]),{10:be,12:W,14:de,27:re,28:127,32:oe,44:V,60:xe,75:q,80:[1,129],81:[1,130],83:140,84:pe,85:ve,86:Pe,87:_e,88:we,89:Ve,90:De,91:128,105:qe,109:at,111:Rt,114:st,115:Ue,116:ct},t(We,a,{5:153}),t(P,[2,37]),t(P,[2,38]),t(Q,[2,48],{44:ot}),t(Q,[2,49],{18:155,10:F,40:Yt}),t(Se,[2,44]),{44:g,47:157,60:y,89:T,102:E,105:A,106:S,109:_,111:I,113:41,114:D,115:k,116:L},{102:[1,158],103:159,105:[1,160]},{44:g,47:161,60:y,89:T,102:E,105:A,106:S,109:_,111:I,113:41,114:D,115:k,116:L},{44:g,47:162,60:y,89:T,102:E,105:A,106:S,109:_,111:I,113:41,114:D,115:k,116:L},t(bt,[2,107],{10:[1,163],96:[1,164]}),{80:[1,165]},t(bt,[2,115],{120:167,10:[1,166],14:ie,44:ne,60:le,89:he,105:K,106:X,109:te,111:J,114:se,115:ue,116:Z}),t(bt,[2,117],{10:[1,168]}),t(Mt,[2,183]),t(Mt,[2,170]),t(Mt,[2,171]),t(Mt,[2,172]),t(Mt,[2,173]),t(Mt,[2,174]),t(Mt,[2,175]),t(Mt,[2,176]),t(Mt,[2,177]),t(Mt,[2,178]),t(Mt,[2,179]),t(Mt,[2,180]),{44:g,47:169,60:y,89:T,102:E,105:A,106:S,109:_,111:I,113:41,114:D,115:k,116:L},{30:170,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},{30:178,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},{30:180,50:[1,179],67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},{30:181,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},{30:182,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},{30:183,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},{109:[1,184]},{30:185,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},{30:186,65:[1,187],67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},{30:188,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},{30:189,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},{30:190,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},t(ae,[2,182]),t(i,[2,20]),t(Oe,[2,25]),t(Q,[2,46],{39:191,18:192,10:F,40:j}),t(ge,[2,73],{10:[1,193]}),{10:[1,194]},{30:195,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},{77:[1,196],79:197,116:$e,119:Re},t(dn,[2,79]),t(dn,[2,81]),t(dn,[2,82]),t(dn,[2,168]),t(dn,[2,169]),{76:198,79:120,80:ze,81:He,116:$e,119:Re},t(Ie,[2,84]),{8:z,9:$,10:be,11:H,12:W,14:de,21:200,27:re,29:[1,199],32:oe,44:V,60:xe,75:q,83:140,84:pe,85:ve,86:Pe,87:_e,88:we,89:Ve,90:De,91:201,105:qe,109:at,111:Rt,114:st,115:Ue,116:ct},t(Tt,[2,101]),t(Tt,[2,103]),t(Tt,[2,104]),t(Tt,[2,157]),t(Tt,[2,158]),t(Tt,[2,159]),t(Tt,[2,160]),t(Tt,[2,161]),t(Tt,[2,162]),t(Tt,[2,163]),t(Tt,[2,164]),t(Tt,[2,165]),t(Tt,[2,166]),t(Tt,[2,167]),t(Tt,[2,90]),t(Tt,[2,91]),t(Tt,[2,92]),t(Tt,[2,93]),t(Tt,[2,94]),t(Tt,[2,95]),t(Tt,[2,96]),t(Tt,[2,97]),t(Tt,[2,98]),t(Tt,[2,99]),t(Tt,[2,100]),{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,202],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:w,88:C,89:T,102:E,105:A,106:S,109:_,111:I,113:41,114:D,115:k,116:L,121:R,122:O,123:M,124:B},{10:F,18:203},{44:[1,204]},t(Se,[2,43]),{10:[1,205],44:g,60:y,89:T,102:E,105:A,106:S,109:_,111:I,113:112,114:D,115:k,116:L},{10:[1,206]},{10:[1,207],106:[1,208]},t(On,[2,128]),{10:[1,209],44:g,60:y,89:T,102:E,105:A,106:S,109:_,111:I,113:112,114:D,115:k,116:L},{10:[1,210],44:g,60:y,89:T,102:E,105:A,106:S,109:_,111:I,113:112,114:D,115:k,116:L},{80:[1,211]},t(bt,[2,109],{10:[1,212]}),t(bt,[2,111],{10:[1,213]}),{80:[1,214]},t(Mt,[2,184]),{80:[1,215],98:[1,216]},t(Se,[2,55],{113:112,44:g,60:y,89:T,102:E,105:A,106:S,109:_,111:I,114:D,115:k,116:L}),{31:[1,217],67:xt,82:218,116:ft,117:yt,118:nt},t(tn,[2,86]),t(tn,[2,88]),t(tn,[2,89]),t(tn,[2,153]),t(tn,[2,154]),t(tn,[2,155]),t(tn,[2,156]),{49:[1,219],67:xt,82:218,116:ft,117:yt,118:nt},{30:220,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},{51:[1,221],67:xt,82:218,116:ft,117:yt,118:nt},{53:[1,222],67:xt,82:218,116:ft,117:yt,118:nt},{55:[1,223],67:xt,82:218,116:ft,117:yt,118:nt},{57:[1,224],67:xt,82:218,116:ft,117:yt,118:nt},{60:[1,225]},{64:[1,226],67:xt,82:218,116:ft,117:yt,118:nt},{66:[1,227],67:xt,82:218,116:ft,117:yt,118:nt},{30:228,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},{31:[1,229],67:xt,82:218,116:ft,117:yt,118:nt},{67:xt,69:[1,230],71:[1,231],82:218,116:ft,117:yt,118:nt},{67:xt,69:[1,233],71:[1,232],82:218,116:ft,117:yt,118:nt},t(Q,[2,45],{18:155,10:F,40:Yt}),t(Q,[2,47],{44:ot}),t(ge,[2,75]),t(ge,[2,74]),{62:[1,234],67:xt,82:218,116:ft,117:yt,118:nt},t(ge,[2,77]),t(dn,[2,80]),{77:[1,235],79:197,116:$e,119:Re},{30:236,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},t(We,a,{5:237}),t(Tt,[2,102]),t(P,[2,35]),{43:238,44:g,45:39,47:40,60:y,89:T,102:E,105:A,106:S,109:_,111:I,113:41,114:D,115:k,116:L},{10:F,18:239},{10:_r,60:Dr,84:Pn,92:240,105:At,107:241,108:242,109:Ce,110:tt,111:St,112:mr},{10:_r,60:Dr,84:Pn,92:251,104:[1,252],105:At,107:241,108:242,109:Ce,110:tt,111:St,112:mr},{10:_r,60:Dr,84:Pn,92:253,104:[1,254],105:At,107:241,108:242,109:Ce,110:tt,111:St,112:mr},{105:[1,255]},{10:_r,60:Dr,84:Pn,92:256,105:At,107:241,108:242,109:Ce,110:tt,111:St,112:mr},{44:g,47:257,60:y,89:T,102:E,105:A,106:S,109:_,111:I,113:41,114:D,115:k,116:L},t(bt,[2,108]),{80:[1,258]},{80:[1,259],98:[1,260]},t(bt,[2,116]),t(bt,[2,118],{10:[1,261]}),t(bt,[2,119]),t(ce,[2,56]),t(tn,[2,87]),t(ce,[2,57]),{51:[1,262],67:xt,82:218,116:ft,117:yt,118:nt},t(ce,[2,64]),t(ce,[2,59]),t(ce,[2,60]),t(ce,[2,61]),{109:[1,263]},t(ce,[2,63]),t(ce,[2,65]),{66:[1,264],67:xt,82:218,116:ft,117:yt,118:nt},t(ce,[2,67]),t(ce,[2,68]),t(ce,[2,70]),t(ce,[2,69]),t(ce,[2,71]),t([10,44,60,89,102,105,106,109,111,114,115,116],[2,85]),t(ge,[2,78]),{31:[1,265],67:xt,82:218,116:ft,117:yt,118:nt},{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,266],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:w,88:C,89:T,102:E,105:A,106:S,109:_,111:I,113:41,114:D,115:k,116:L,121:R,122:O,123:M,124:B},t(Se,[2,53]),{43:267,44:g,45:39,47:40,60:y,89:T,102:E,105:A,106:S,109:_,111:I,113:41,114:D,115:k,116:L},t(bt,[2,121],{106:rn}),t(gn,[2,130],{108:269,10:_r,60:Dr,84:Pn,105:At,109:Ce,110:tt,111:St,112:mr}),t(Zr,[2,132]),t(Zr,[2,134]),t(Zr,[2,135]),t(Zr,[2,136]),t(Zr,[2,137]),t(Zr,[2,138]),t(Zr,[2,139]),t(Zr,[2,140]),t(Zr,[2,141]),t(bt,[2,122],{106:rn}),{10:[1,270]},t(bt,[2,123],{106:rn}),{10:[1,271]},t(On,[2,129]),t(bt,[2,105],{106:rn}),t(bt,[2,106],{113:112,44:g,60:y,89:T,102:E,105:A,106:S,109:_,111:I,114:D,115:k,116:L}),t(bt,[2,110]),t(bt,[2,112],{10:[1,272]}),t(bt,[2,113]),{98:[1,273]},{51:[1,274]},{62:[1,275]},{66:[1,276]},{8:z,9:$,11:H,21:277},t(P,[2,34]),t(Se,[2,52]),{10:_r,60:Dr,84:Pn,105:At,107:278,108:242,109:Ce,110:tt,111:St,112:mr},t(Zr,[2,133]),{14:ie,44:ne,60:le,89:he,101:279,105:K,106:X,109:te,111:J,114:se,115:ue,116:Z,120:87},{14:ie,44:ne,60:le,89:he,101:280,105:K,106:X,109:te,111:J,114:se,115:ue,116:Z,120:87},{98:[1,281]},t(bt,[2,120]),t(ce,[2,58]),{30:282,67:xt,80:ut,81:Et,82:171,116:ft,117:yt,118:nt},t(ce,[2,66]),t(We,a,{5:283}),t(gn,[2,131],{108:269,10:_r,60:Dr,84:Pn,105:At,109:Ce,110:tt,111:St,112:mr}),t(bt,[2,126],{120:167,10:[1,284],14:ie,44:ne,60:le,89:he,105:K,106:X,109:te,111:J,114:se,115:ue,116:Z}),t(bt,[2,127],{120:167,10:[1,285],14:ie,44:ne,60:le,89:he,105:K,106:X,109:te,111:J,114:se,115:ue,116:Z}),t(bt,[2,114]),{31:[1,286],67:xt,82:218,116:ft,117:yt,118:nt},{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,287],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:w,88:C,89:T,102:E,105:A,106:S,109:_,111:I,113:41,114:D,115:k,116:L,121:R,122:O,123:M,124:B},{10:_r,60:Dr,84:Pn,92:288,105:At,107:241,108:242,109:Ce,110:tt,111:St,112:mr},{10:_r,60:Dr,84:Pn,92:289,105:At,107:241,108:242,109:Ce,110:tt,111:St,112:mr},t(ce,[2,62]),t(P,[2,33]),t(bt,[2,124],{106:rn}),t(bt,[2,125],{106:rn})],defaultActions:{},parseError:o(function(et,mt){if(mt.recoverable)this.trace(et);else{var Kt=new Error(et);throw Kt.hash=mt,Kt}},"parseError"),parse:o(function(et){var mt=this,Kt=[0],lt=[],Cn=[null],ye=[],Vf=this.table,Te="",wi=0,TF=0,kF=0,M2e=2,EF=1,I2e=ye.slice.call(arguments,1),Xi=Object.create(this.lexer),Uf={yy:{}};for(var xC in this.yy)Object.prototype.hasOwnProperty.call(this.yy,xC)&&(Uf.yy[xC]=this.yy[xC]);Xi.setInput(et,Uf.yy),Uf.yy.lexer=Xi,Uf.yy.parser=this,typeof Xi.yylloc>"u"&&(Xi.yylloc={});var bC=Xi.yylloc;ye.push(bC);var O2e=Xi.options&&Xi.options.ranges;typeof Uf.yy.parseError=="function"?this.parseError=Uf.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function wnt(Ws){Kt.length=Kt.length-2*Ws,Cn.length=Cn.length-Ws,ye.length=ye.length-Ws}o(wnt,"popStack");function P2e(){var Ws;return Ws=lt.pop()||Xi.lex()||EF,typeof Ws!="number"&&(Ws instanceof Array&&(lt=Ws,Ws=lt.pop()),Ws=mt.symbols_[Ws]||Ws),Ws}o(P2e,"lex");for(var Wa,wC,Hf,xo,Tnt,TC,Jp={},_4,Jc,SF,D4;;){if(Hf=Kt[Kt.length-1],this.defaultActions[Hf]?xo=this.defaultActions[Hf]:((Wa===null||typeof Wa>"u")&&(Wa=P2e()),xo=Vf[Hf]&&Vf[Hf][Wa]),typeof xo>"u"||!xo.length||!xo[0]){var kC="";D4=[];for(_4 in Vf[Hf])this.terminals_[_4]&&_4>M2e&&D4.push("'"+this.terminals_[_4]+"'");Xi.showPosition?kC="Parse error on line "+(wi+1)+`: +`+Xi.showPosition()+` +Expecting `+D4.join(", ")+", got '"+(this.terminals_[Wa]||Wa)+"'":kC="Parse error on line "+(wi+1)+": Unexpected "+(Wa==EF?"end of input":"'"+(this.terminals_[Wa]||Wa)+"'"),this.parseError(kC,{text:Xi.match,token:this.terminals_[Wa]||Wa,line:Xi.yylineno,loc:bC,expected:D4})}if(xo[0]instanceof Array&&xo.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Hf+", token: "+Wa);switch(xo[0]){case 1:Kt.push(Wa),Cn.push(Xi.yytext),ye.push(Xi.yylloc),Kt.push(xo[1]),Wa=null,wC?(Wa=wC,wC=null):(TF=Xi.yyleng,Te=Xi.yytext,wi=Xi.yylineno,bC=Xi.yylloc,kF>0&&kF--);break;case 2:if(Jc=this.productions_[xo[1]][1],Jp.$=Cn[Cn.length-Jc],Jp._$={first_line:ye[ye.length-(Jc||1)].first_line,last_line:ye[ye.length-1].last_line,first_column:ye[ye.length-(Jc||1)].first_column,last_column:ye[ye.length-1].last_column},O2e&&(Jp._$.range=[ye[ye.length-(Jc||1)].range[0],ye[ye.length-1].range[1]]),TC=this.performAction.apply(Jp,[Te,TF,wi,Uf.yy,xo[1],Cn,ye].concat(I2e)),typeof TC<"u")return TC;Jc&&(Kt=Kt.slice(0,-1*Jc*2),Cn=Cn.slice(0,-1*Jc),ye=ye.slice(0,-1*Jc)),Kt.push(this.productions_[xo[1]][0]),Cn.push(Jp.$),ye.push(Jp._$),SF=Vf[Kt[Kt.length-2]][Kt[Kt.length-1]],Kt.push(SF);break;case 3:return!0}}return!0},"parse")},Zn=function(){var Hr={EOF:1,parseError:o(function(mt,Kt){if(this.yy.parser)this.yy.parser.parseError(mt,Kt);else throw new Error(mt)},"parseError"),setInput:o(function(et,mt){return this.yy=mt||this.yy||{},this._input=et,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var et=this._input[0];this.yytext+=et,this.yyleng++,this.offset++,this.match+=et,this.matched+=et;var mt=et.match(/(?:\r\n?|\n).*/g);return mt?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),et},"input"),unput:o(function(et){var mt=et.length,Kt=et.split(/(?:\r\n?|\n)/g);this._input=et+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-mt),this.offset-=mt;var lt=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Kt.length-1&&(this.yylineno-=Kt.length-1);var Cn=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Kt?(Kt.length===lt.length?this.yylloc.first_column:0)+lt[lt.length-Kt.length].length-Kt[0].length:this.yylloc.first_column-mt},this.options.ranges&&(this.yylloc.range=[Cn[0],Cn[0]+this.yyleng-mt]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(et){this.unput(this.match.slice(et))},"less"),pastInput:o(function(){var et=this.matched.substr(0,this.matched.length-this.match.length);return(et.length>20?"...":"")+et.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var et=this.match;return et.length<20&&(et+=this._input.substr(0,20-et.length)),(et.substr(0,20)+(et.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var et=this.pastInput(),mt=new Array(et.length+1).join("-");return et+this.upcomingInput()+` +`+mt+"^"},"showPosition"),test_match:o(function(et,mt){var Kt,lt,Cn;if(this.options.backtrack_lexer&&(Cn={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Cn.yylloc.range=this.yylloc.range.slice(0))),lt=et[0].match(/(?:\r\n?|\n).*/g),lt&&(this.yylineno+=lt.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:lt?lt[lt.length-1].length-lt[lt.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+et[0].length},this.yytext+=et[0],this.match+=et[0],this.matches=et,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(et[0].length),this.matched+=et[0],Kt=this.performAction.call(this,this.yy,this,mt,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Kt)return Kt;if(this._backtrack){for(var ye in Cn)this[ye]=Cn[ye];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var et,mt,Kt,lt;this._more||(this.yytext="",this.match="");for(var Cn=this._currentRules(),ye=0;yemt[0].length)){if(mt=Kt,lt=ye,this.options.backtrack_lexer){if(et=this.test_match(Kt,Cn[ye]),et!==!1)return et;if(this._backtrack){mt=!1;continue}else return!1}else if(!this.options.flex)break}return mt?(et=this.test_match(mt,Cn[lt]),et!==!1?et:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var mt=this.next();return mt||this.lex()},"lex"),begin:o(function(mt){this.conditionStack.push(mt)},"begin"),popState:o(function(){var mt=this.conditionStack.length-1;return mt>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(mt){return mt=this.conditionStack.length-1-Math.abs(mt||0),mt>=0?this.conditionStack[mt]:"INITIAL"},"topState"),pushState:o(function(mt){this.begin(mt)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(mt,Kt,lt,Cn){var ye=Cn;switch(lt){case 0:return this.begin("acc_title"),34;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),36;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.pushState("shapeData"),Kt.yytext="",40;break;case 8:return this.pushState("shapeDataStr"),40;break;case 9:return this.popState(),40;break;case 10:let Vf=/\n\s*/g;return Kt.yytext=Kt.yytext.replace(Vf,"
    "),40;break;case 11:return 40;case 12:this.popState();break;case 13:this.begin("callbackname");break;case 14:this.popState();break;case 15:this.popState(),this.begin("callbackargs");break;case 16:return 95;case 17:this.popState();break;case 18:return 96;case 19:return"MD_STR";case 20:this.popState();break;case 21:this.begin("md_string");break;case 22:return"STR";case 23:this.popState();break;case 24:this.pushState("string");break;case 25:return 84;case 26:return 102;case 27:return 85;case 28:return 104;case 29:return 86;case 30:return 87;case 31:return 97;case 32:this.begin("click");break;case 33:this.popState();break;case 34:return 88;case 35:return mt.lex.firstGraph()&&this.begin("dir"),12;break;case 36:return mt.lex.firstGraph()&&this.begin("dir"),12;break;case 37:return mt.lex.firstGraph()&&this.begin("dir"),12;break;case 38:return 27;case 39:return 32;case 40:return 98;case 41:return 98;case 42:return 98;case 43:return 98;case 44:return this.popState(),13;break;case 45:return this.popState(),14;break;case 46:return this.popState(),14;break;case 47:return this.popState(),14;break;case 48:return this.popState(),14;break;case 49:return this.popState(),14;break;case 50:return this.popState(),14;break;case 51:return this.popState(),14;break;case 52:return this.popState(),14;break;case 53:return this.popState(),14;break;case 54:return this.popState(),14;break;case 55:return 121;case 56:return 122;case 57:return 123;case 58:return 124;case 59:return 78;case 60:return 105;case 61:return 111;case 62:return 46;case 63:return 60;case 64:return 44;case 65:return 8;case 66:return 106;case 67:return 115;case 68:return this.popState(),77;break;case 69:return this.pushState("edgeText"),75;break;case 70:return 119;case 71:return this.popState(),77;break;case 72:return this.pushState("thickEdgeText"),75;break;case 73:return 119;case 74:return this.popState(),77;break;case 75:return this.pushState("dottedEdgeText"),75;break;case 76:return 119;case 77:return 77;case 78:return this.popState(),53;break;case 79:return"TEXT";case 80:return this.pushState("ellipseText"),52;break;case 81:return this.popState(),55;break;case 82:return this.pushState("text"),54;break;case 83:return this.popState(),57;break;case 84:return this.pushState("text"),56;break;case 85:return 58;case 86:return this.pushState("text"),67;break;case 87:return this.popState(),64;break;case 88:return this.pushState("text"),63;break;case 89:return this.popState(),49;break;case 90:return this.pushState("text"),48;break;case 91:return this.popState(),69;break;case 92:return this.popState(),71;break;case 93:return 117;case 94:return this.pushState("trapText"),68;break;case 95:return this.pushState("trapText"),70;break;case 96:return 118;case 97:return 67;case 98:return 90;case 99:return"SEP";case 100:return 89;case 101:return 115;case 102:return 111;case 103:return 44;case 104:return 109;case 105:return 114;case 106:return 116;case 107:return this.popState(),62;break;case 108:return this.pushState("text"),62;break;case 109:return this.popState(),51;break;case 110:return this.pushState("text"),50;break;case 111:return this.popState(),31;break;case 112:return this.pushState("text"),29;break;case 113:return this.popState(),66;break;case 114:return this.pushState("text"),65;break;case 115:return"TEXT";case 116:return"QUOTE";case 117:return 9;case 118:return 10;case 119:return 11}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:@\{)/,/^(?:["])/,/^(?:["])/,/^(?:[^\"]+)/,/^(?:[^}^"]+)/,/^(?:\})/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["][`])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:["])/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s])/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:flowchart-elk\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[^\s\"]+@(?=[^\{\"]))/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:[^-]|-(?!-)+)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:[^=]|=(?!))/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:[^\.]|\.(?!))/,/^(?:\s*~~[\~]+\s*)/,/^(?:[-/\)][\)])/,/^(?:[^\(\)\[\]\{\}]|!\)+)/,/^(?:\(-)/,/^(?:\]\))/,/^(?:\(\[)/,/^(?:\]\])/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:>)/,/^(?:\)\])/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\(\(\()/,/^(?:[\\(?=\])][\]])/,/^(?:\/(?=\])\])/,/^(?:\/(?!\])|\\(?!\])|[^\\\[\]\(\)\{\}\/]+)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:\*)/,/^(?:#)/,/^(?:&)/,/^(?:([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|-(?=[^\>\-\.])|(?!))+)/,/^(?:-)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\|)/,/^(?:\))/,/^(?:\()/,/^(?:\])/,/^(?:\[)/,/^(?:(\}))/,/^(?:\{)/,/^(?:[^\[\]\(\)\{\}\|\"]+)/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{shapeDataEndBracket:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},shapeDataStr:{rules:[9,10,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},shapeData:{rules:[8,11,12,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},callbackargs:{rules:[17,18,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},callbackname:{rules:[14,15,16,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},href:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},click:{rules:[21,24,33,34,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},dottedEdgeText:{rules:[21,24,74,76,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},thickEdgeText:{rules:[21,24,71,73,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},edgeText:{rules:[21,24,68,70,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},trapText:{rules:[21,24,77,80,82,84,88,90,91,92,93,94,95,108,110,112,114],inclusive:!1},ellipseText:{rules:[21,24,77,78,79,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},text:{rules:[21,24,77,80,81,82,83,84,87,88,89,90,94,95,107,108,109,110,111,112,113,114,115],inclusive:!1},vertex:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},dir:{rules:[21,24,44,45,46,47,48,49,50,51,52,53,54,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_descr_multiline:{rules:[5,6,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_descr:{rules:[3,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_title:{rules:[1,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},md_string:{rules:[19,20,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},string:{rules:[21,22,23,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},INITIAL:{rules:[0,2,4,7,13,21,24,25,26,27,28,29,30,31,32,35,36,37,38,39,40,41,42,43,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,71,72,74,75,77,80,82,84,85,86,88,90,94,95,96,97,98,99,100,101,102,103,104,105,106,108,110,112,114,116,117,118,119],inclusive:!0}}};return Hr}();Ni.lexer=Zn;function Sn(){this.yy={}}return o(Sn,"Parser"),Sn.prototype=Ni,Ni.Parser=Sn,new Sn}();xR.parser=xR;bR=xR});var Uie,Hie,Wie=N(()=>{"use strict";Vie();Uie=Object.assign({},bR);Uie.parse=t=>{let e=t.replace(/}\s*\n/g,`} +`);return bR.parse(e)};Hie=Uie});var gOe,yOe,qie,Yie=N(()=>{"use strict";Ys();gOe=o((t,e)=>{let r=Kf,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return qa(n,i,a,e)},"fade"),yOe=o(t=>`.label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + .cluster-label text { + fill: ${t.titleColor}; + } + .cluster-label span { + color: ${t.titleColor}; + } + .cluster-label span p { + background-color: transparent; + } + + .label text,span { + fill: ${t.nodeTextColor||t.textColor}; + color: ${t.nodeTextColor||t.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + .rough-node .label text , .node .label text, .image-shape .label, .icon-shape .label { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .katex path { + fill: #000; + stroke: #000; + stroke-width: 1px; + } + + .rough-node .label,.node .label, .image-shape .label, .icon-shape .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + + .root .anchor path { + fill: ${t.lineColor} !important; + stroke-width: 0; + stroke: ${t.lineColor}; + } + + .arrowheadPath { + fill: ${t.arrowheadColor}; + } + + .edgePath .path { + stroke: ${t.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${t.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + p { + background-color: ${t.edgeLabelBackground}; + } + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${gOe(t.edgeLabelBackground,.5)}; + // background-color: + } + + .cluster rect { + fill: ${t.clusterBkg}; + stroke: ${t.clusterBorder}; + stroke-width: 1px; + } + + .cluster text { + fill: ${t.titleColor}; + } + + .cluster span { + color: ${t.titleColor}; + } + /* .cluster div { + color: ${t.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${t.fontFamily}; + font-size: 12px; + background: ${t.tertiaryColor}; + border: 1px solid ${t.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; + } + + rect.text { + fill: none; + stroke-width: 0; + } + + .icon-shape, .image-shape { + background-color: ${t.edgeLabelBackground}; + p { + background-color: ${t.edgeLabelBackground}; + padding: 2px; + } + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; + } +`,"getStyles"),qie=yOe});var ik={};hr(ik,{diagram:()=>vOe});var vOe,ak=N(()=>{"use strict";zt();qZ();Gie();Wie();Yie();vOe={parser:Hie,get db(){return new Uw},renderer:zie,styles:qie,init:o(t=>{t.flowchart||(t.flowchart={}),t.layout&&Yy({layout:t.layout}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,Yy({flowchart:{arrowMarkerAbsolute:t.arrowMarkerAbsolute}})},"init")}});var wR,Zie,Jie=N(()=>{"use strict";wR=function(){var t=o(function(J,se,ue,Z){for(ue=ue||{},Z=J.length;Z--;ue[J[Z]]=se);return ue},"o"),e=[6,8,10,22,24,26,28,33,34,35,36,37,40,43,44,50],r=[1,10],n=[1,11],i=[1,12],a=[1,13],s=[1,20],l=[1,21],u=[1,22],h=[1,23],f=[1,24],d=[1,19],p=[1,25],m=[1,26],g=[1,18],y=[1,33],v=[1,34],x=[1,35],b=[1,36],w=[1,37],C=[6,8,10,13,15,17,20,21,22,24,26,28,33,34,35,36,37,40,43,44,50,63,64,65,66,67],T=[1,42],E=[1,43],A=[1,52],S=[40,50,68,69],_=[1,63],I=[1,61],D=[1,58],k=[1,62],L=[1,64],R=[6,8,10,13,17,22,24,26,28,33,34,35,36,37,40,41,42,43,44,48,49,50,63,64,65,66,67],O=[63,64,65,66,67],M=[1,81],B=[1,80],F=[1,78],P=[1,79],z=[6,10,42,47],$=[6,10,13,41,42,47,48,49],H=[1,89],Q=[1,88],j=[1,87],ie=[19,56],ne=[1,98],le=[1,97],he=[19,56,58,60],K={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,entityName:11,relSpec:12,COLON:13,role:14,STYLE_SEPARATOR:15,idList:16,BLOCK_START:17,attributes:18,BLOCK_STOP:19,SQS:20,SQE:21,title:22,title_value:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,direction:29,classDefStatement:30,classStatement:31,styleStatement:32,direction_tb:33,direction_bt:34,direction_rl:35,direction_lr:36,CLASSDEF:37,stylesOpt:38,separator:39,UNICODE_TEXT:40,STYLE_TEXT:41,COMMA:42,CLASS:43,STYLE:44,style:45,styleComponent:46,SEMI:47,NUM:48,BRKT:49,ENTITY_NAME:50,attribute:51,attributeType:52,attributeName:53,attributeKeyTypeList:54,attributeComment:55,ATTRIBUTE_WORD:56,attributeKeyType:57,",":58,ATTRIBUTE_KEY:59,COMMENT:60,cardinality:61,relType:62,ZERO_OR_ONE:63,ZERO_OR_MORE:64,ONE_OR_MORE:65,ONLY_ONE:66,MD_PARENT:67,NON_IDENTIFYING:68,IDENTIFYING:69,WORD:70,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",8:"SPACE",10:"NEWLINE",13:"COLON",15:"STYLE_SEPARATOR",17:"BLOCK_START",19:"BLOCK_STOP",20:"SQS",21:"SQE",22:"title",23:"title_value",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"direction_tb",34:"direction_bt",35:"direction_rl",36:"direction_lr",37:"CLASSDEF",40:"UNICODE_TEXT",41:"STYLE_TEXT",42:"COMMA",43:"CLASS",44:"STYLE",47:"SEMI",48:"NUM",49:"BRKT",50:"ENTITY_NAME",56:"ATTRIBUTE_WORD",58:",",59:"ATTRIBUTE_KEY",60:"COMMENT",63:"ZERO_OR_ONE",64:"ZERO_OR_MORE",65:"ONE_OR_MORE",66:"ONLY_ONE",67:"MD_PARENT",68:"NON_IDENTIFYING",69:"IDENTIFYING",70:"WORD"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,5],[9,9],[9,7],[9,7],[9,4],[9,6],[9,3],[9,5],[9,1],[9,3],[9,7],[9,9],[9,6],[9,8],[9,4],[9,6],[9,2],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[9,1],[29,1],[29,1],[29,1],[29,1],[30,4],[16,1],[16,1],[16,3],[16,3],[31,3],[32,4],[38,1],[38,3],[45,1],[45,2],[39,1],[39,1],[39,1],[46,1],[46,1],[46,1],[46,1],[11,1],[11,1],[18,1],[18,2],[51,2],[51,3],[51,3],[51,4],[52,1],[53,1],[54,1],[54,3],[57,1],[55,1],[12,3],[61,1],[61,1],[61,1],[61,1],[61,1],[62,1],[62,1],[14,1],[14,1],[14,1]],performAction:o(function(se,ue,Z,Se,ce,ae,Oe){var ge=ae.length-1;switch(ce){case 1:break;case 2:this.$=[];break;case 3:ae[ge-1].push(ae[ge]),this.$=ae[ge-1];break;case 4:case 5:this.$=ae[ge];break;case 6:case 7:this.$=[];break;case 8:Se.addEntity(ae[ge-4]),Se.addEntity(ae[ge-2]),Se.addRelationship(ae[ge-4],ae[ge],ae[ge-2],ae[ge-3]);break;case 9:Se.addEntity(ae[ge-8]),Se.addEntity(ae[ge-4]),Se.addRelationship(ae[ge-8],ae[ge],ae[ge-4],ae[ge-5]),Se.setClass([ae[ge-8]],ae[ge-6]),Se.setClass([ae[ge-4]],ae[ge-2]);break;case 10:Se.addEntity(ae[ge-6]),Se.addEntity(ae[ge-2]),Se.addRelationship(ae[ge-6],ae[ge],ae[ge-2],ae[ge-3]),Se.setClass([ae[ge-6]],ae[ge-4]);break;case 11:Se.addEntity(ae[ge-6]),Se.addEntity(ae[ge-4]),Se.addRelationship(ae[ge-6],ae[ge],ae[ge-4],ae[ge-5]),Se.setClass([ae[ge-4]],ae[ge-2]);break;case 12:Se.addEntity(ae[ge-3]),Se.addAttributes(ae[ge-3],ae[ge-1]);break;case 13:Se.addEntity(ae[ge-5]),Se.addAttributes(ae[ge-5],ae[ge-1]),Se.setClass([ae[ge-5]],ae[ge-3]);break;case 14:Se.addEntity(ae[ge-2]);break;case 15:Se.addEntity(ae[ge-4]),Se.setClass([ae[ge-4]],ae[ge-2]);break;case 16:Se.addEntity(ae[ge]);break;case 17:Se.addEntity(ae[ge-2]),Se.setClass([ae[ge-2]],ae[ge]);break;case 18:Se.addEntity(ae[ge-6],ae[ge-4]),Se.addAttributes(ae[ge-6],ae[ge-1]);break;case 19:Se.addEntity(ae[ge-8],ae[ge-6]),Se.addAttributes(ae[ge-8],ae[ge-1]),Se.setClass([ae[ge-8]],ae[ge-3]);break;case 20:Se.addEntity(ae[ge-5],ae[ge-3]);break;case 21:Se.addEntity(ae[ge-7],ae[ge-5]),Se.setClass([ae[ge-7]],ae[ge-2]);break;case 22:Se.addEntity(ae[ge-3],ae[ge-1]);break;case 23:Se.addEntity(ae[ge-5],ae[ge-3]),Se.setClass([ae[ge-5]],ae[ge]);break;case 24:case 25:this.$=ae[ge].trim(),Se.setAccTitle(this.$);break;case 26:case 27:this.$=ae[ge].trim(),Se.setAccDescription(this.$);break;case 32:Se.setDirection("TB");break;case 33:Se.setDirection("BT");break;case 34:Se.setDirection("RL");break;case 35:Se.setDirection("LR");break;case 36:this.$=ae[ge-3],Se.addClass(ae[ge-2],ae[ge-1]);break;case 37:case 38:case 56:case 64:this.$=[ae[ge]];break;case 39:case 40:this.$=ae[ge-2].concat([ae[ge]]);break;case 41:this.$=ae[ge-2],Se.setClass(ae[ge-1],ae[ge]);break;case 42:this.$=ae[ge-3],Se.addCssStyles(ae[ge-2],ae[ge-1]);break;case 43:this.$=[ae[ge]];break;case 44:ae[ge-2].push(ae[ge]),this.$=ae[ge-2];break;case 46:this.$=ae[ge-1]+ae[ge];break;case 54:case 76:case 77:this.$=ae[ge].replace(/"/g,"");break;case 55:case 78:this.$=ae[ge];break;case 57:ae[ge].push(ae[ge-1]),this.$=ae[ge];break;case 58:this.$={type:ae[ge-1],name:ae[ge]};break;case 59:this.$={type:ae[ge-2],name:ae[ge-1],keys:ae[ge]};break;case 60:this.$={type:ae[ge-2],name:ae[ge-1],comment:ae[ge]};break;case 61:this.$={type:ae[ge-3],name:ae[ge-2],keys:ae[ge-1],comment:ae[ge]};break;case 62:case 63:case 66:this.$=ae[ge];break;case 65:ae[ge-2].push(ae[ge]),this.$=ae[ge-2];break;case 67:this.$=ae[ge].replace(/"/g,"");break;case 68:this.$={cardA:ae[ge],relType:ae[ge-1],cardB:ae[ge-2]};break;case 69:this.$=Se.Cardinality.ZERO_OR_ONE;break;case 70:this.$=Se.Cardinality.ZERO_OR_MORE;break;case 71:this.$=Se.Cardinality.ONE_OR_MORE;break;case 72:this.$=Se.Cardinality.ONLY_ONE;break;case 73:this.$=Se.Cardinality.MD_PARENT;break;case 74:this.$=Se.Identification.NON_IDENTIFYING;break;case 75:this.$=Se.Identification.IDENTIFYING;break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:9,22:r,24:n,26:i,28:a,29:14,30:15,31:16,32:17,33:s,34:l,35:u,36:h,37:f,40:d,43:p,44:m,50:g},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:27,11:9,22:r,24:n,26:i,28:a,29:14,30:15,31:16,32:17,33:s,34:l,35:u,36:h,37:f,40:d,43:p,44:m,50:g},t(e,[2,5]),t(e,[2,6]),t(e,[2,16],{12:28,61:32,15:[1,29],17:[1,30],20:[1,31],63:y,64:v,65:x,66:b,67:w}),{23:[1,38]},{25:[1,39]},{27:[1,40]},t(e,[2,27]),t(e,[2,28]),t(e,[2,29]),t(e,[2,30]),t(e,[2,31]),t(C,[2,54]),t(C,[2,55]),t(e,[2,32]),t(e,[2,33]),t(e,[2,34]),t(e,[2,35]),{16:41,40:T,41:E},{16:44,40:T,41:E},{16:45,40:T,41:E},t(e,[2,4]),{11:46,40:d,50:g},{16:47,40:T,41:E},{18:48,19:[1,49],51:50,52:51,56:A},{11:53,40:d,50:g},{62:54,68:[1,55],69:[1,56]},t(S,[2,69]),t(S,[2,70]),t(S,[2,71]),t(S,[2,72]),t(S,[2,73]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),{13:_,38:57,41:I,42:D,45:59,46:60,48:k,49:L},t(R,[2,37]),t(R,[2,38]),{16:65,40:T,41:E,42:D},{13:_,38:66,41:I,42:D,45:59,46:60,48:k,49:L},{13:[1,67],15:[1,68]},t(e,[2,17],{61:32,12:69,17:[1,70],42:D,63:y,64:v,65:x,66:b,67:w}),{19:[1,71]},t(e,[2,14]),{18:72,19:[2,56],51:50,52:51,56:A},{53:73,56:[1,74]},{56:[2,62]},{21:[1,75]},{61:76,63:y,64:v,65:x,66:b,67:w},t(O,[2,74]),t(O,[2,75]),{6:M,10:B,39:77,42:F,47:P},{40:[1,82],41:[1,83]},t(z,[2,43],{46:84,13:_,41:I,48:k,49:L}),t($,[2,45]),t($,[2,50]),t($,[2,51]),t($,[2,52]),t($,[2,53]),t(e,[2,41],{42:D}),{6:M,10:B,39:85,42:F,47:P},{14:86,40:H,50:Q,70:j},{16:90,40:T,41:E},{11:91,40:d,50:g},{18:92,19:[1,93],51:50,52:51,56:A},t(e,[2,12]),{19:[2,57]},t(ie,[2,58],{54:94,55:95,57:96,59:ne,60:le}),t([19,56,59,60],[2,63]),t(e,[2,22],{15:[1,100],17:[1,99]}),t([40,50],[2,68]),t(e,[2,36]),{13:_,41:I,45:101,46:60,48:k,49:L},t(e,[2,47]),t(e,[2,48]),t(e,[2,49]),t(R,[2,39]),t(R,[2,40]),t($,[2,46]),t(e,[2,42]),t(e,[2,8]),t(e,[2,76]),t(e,[2,77]),t(e,[2,78]),{13:[1,102],42:D},{13:[1,104],15:[1,103]},{19:[1,105]},t(e,[2,15]),t(ie,[2,59],{55:106,58:[1,107],60:le}),t(ie,[2,60]),t(he,[2,64]),t(ie,[2,67]),t(he,[2,66]),{18:108,19:[1,109],51:50,52:51,56:A},{16:110,40:T,41:E},t(z,[2,44],{46:84,13:_,41:I,48:k,49:L}),{14:111,40:H,50:Q,70:j},{16:112,40:T,41:E},{14:113,40:H,50:Q,70:j},t(e,[2,13]),t(ie,[2,61]),{57:114,59:ne},{19:[1,115]},t(e,[2,20]),t(e,[2,23],{17:[1,116],42:D}),t(e,[2,11]),{13:[1,117],42:D},t(e,[2,10]),t(he,[2,65]),t(e,[2,18]),{18:118,19:[1,119],51:50,52:51,56:A},{14:120,40:H,50:Q,70:j},{19:[1,121]},t(e,[2,21]),t(e,[2,9]),t(e,[2,19])],defaultActions:{52:[2,62],72:[2,57]},parseError:o(function(se,ue){if(ue.recoverable)this.trace(se);else{var Z=new Error(se);throw Z.hash=ue,Z}},"parseError"),parse:o(function(se){var ue=this,Z=[0],Se=[],ce=[null],ae=[],Oe=this.table,ge="",ze=0,He=0,$e=0,Re=2,Ie=1,be=ae.slice.call(arguments,1),W=Object.create(this.lexer),de={yy:{}};for(var re in this.yy)Object.prototype.hasOwnProperty.call(this.yy,re)&&(de.yy[re]=this.yy[re]);W.setInput(se,de.yy),de.yy.lexer=W,de.yy.parser=this,typeof W.yylloc>"u"&&(W.yylloc={});var oe=W.yylloc;ae.push(oe);var V=W.options&&W.options.ranges;typeof de.yy.parseError=="function"?this.parseError=de.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function xe(ct){Z.length=Z.length-2*ct,ce.length=ce.length-ct,ae.length=ae.length-ct}o(xe,"popStack");function q(){var ct;return ct=Se.pop()||W.lex()||Ie,typeof ct!="number"&&(ct instanceof Array&&(Se=ct,ct=Se.pop()),ct=ue.symbols_[ct]||ct),ct}o(q,"lex");for(var pe,ve,Pe,_e,we,Ve,De={},qe,at,Rt,st;;){if(Pe=Z[Z.length-1],this.defaultActions[Pe]?_e=this.defaultActions[Pe]:((pe===null||typeof pe>"u")&&(pe=q()),_e=Oe[Pe]&&Oe[Pe][pe]),typeof _e>"u"||!_e.length||!_e[0]){var Ue="";st=[];for(qe in Oe[Pe])this.terminals_[qe]&&qe>Re&&st.push("'"+this.terminals_[qe]+"'");W.showPosition?Ue="Parse error on line "+(ze+1)+`: +`+W.showPosition()+` +Expecting `+st.join(", ")+", got '"+(this.terminals_[pe]||pe)+"'":Ue="Parse error on line "+(ze+1)+": Unexpected "+(pe==Ie?"end of input":"'"+(this.terminals_[pe]||pe)+"'"),this.parseError(Ue,{text:W.match,token:this.terminals_[pe]||pe,line:W.yylineno,loc:oe,expected:st})}if(_e[0]instanceof Array&&_e.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Pe+", token: "+pe);switch(_e[0]){case 1:Z.push(pe),ce.push(W.yytext),ae.push(W.yylloc),Z.push(_e[1]),pe=null,ve?(pe=ve,ve=null):(He=W.yyleng,ge=W.yytext,ze=W.yylineno,oe=W.yylloc,$e>0&&$e--);break;case 2:if(at=this.productions_[_e[1]][1],De.$=ce[ce.length-at],De._$={first_line:ae[ae.length-(at||1)].first_line,last_line:ae[ae.length-1].last_line,first_column:ae[ae.length-(at||1)].first_column,last_column:ae[ae.length-1].last_column},V&&(De._$.range=[ae[ae.length-(at||1)].range[0],ae[ae.length-1].range[1]]),Ve=this.performAction.apply(De,[ge,He,ze,de.yy,_e[1],ce,ae].concat(be)),typeof Ve<"u")return Ve;at&&(Z=Z.slice(0,-1*at*2),ce=ce.slice(0,-1*at),ae=ae.slice(0,-1*at)),Z.push(this.productions_[_e[1]][0]),ce.push(De.$),ae.push(De._$),Rt=Oe[Z[Z.length-2]][Z[Z.length-1]],Z.push(Rt);break;case 3:return!0}}return!0},"parse")},X=function(){var J={EOF:1,parseError:o(function(ue,Z){if(this.yy.parser)this.yy.parser.parseError(ue,Z);else throw new Error(ue)},"parseError"),setInput:o(function(se,ue){return this.yy=ue||this.yy||{},this._input=se,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var se=this._input[0];this.yytext+=se,this.yyleng++,this.offset++,this.match+=se,this.matched+=se;var ue=se.match(/(?:\r\n?|\n).*/g);return ue?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),se},"input"),unput:o(function(se){var ue=se.length,Z=se.split(/(?:\r\n?|\n)/g);this._input=se+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-ue),this.offset-=ue;var Se=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Z.length-1&&(this.yylineno-=Z.length-1);var ce=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Z?(Z.length===Se.length?this.yylloc.first_column:0)+Se[Se.length-Z.length].length-Z[0].length:this.yylloc.first_column-ue},this.options.ranges&&(this.yylloc.range=[ce[0],ce[0]+this.yyleng-ue]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(se){this.unput(this.match.slice(se))},"less"),pastInput:o(function(){var se=this.matched.substr(0,this.matched.length-this.match.length);return(se.length>20?"...":"")+se.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var se=this.match;return se.length<20&&(se+=this._input.substr(0,20-se.length)),(se.substr(0,20)+(se.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var se=this.pastInput(),ue=new Array(se.length+1).join("-");return se+this.upcomingInput()+` +`+ue+"^"},"showPosition"),test_match:o(function(se,ue){var Z,Se,ce;if(this.options.backtrack_lexer&&(ce={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(ce.yylloc.range=this.yylloc.range.slice(0))),Se=se[0].match(/(?:\r\n?|\n).*/g),Se&&(this.yylineno+=Se.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Se?Se[Se.length-1].length-Se[Se.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+se[0].length},this.yytext+=se[0],this.match+=se[0],this.matches=se,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(se[0].length),this.matched+=se[0],Z=this.performAction.call(this,this.yy,this,ue,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Z)return Z;if(this._backtrack){for(var ae in ce)this[ae]=ce[ae];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var se,ue,Z,Se;this._more||(this.yytext="",this.match="");for(var ce=this._currentRules(),ae=0;aeue[0].length)){if(ue=Z,Se=ae,this.options.backtrack_lexer){if(se=this.test_match(Z,ce[ae]),se!==!1)return se;if(this._backtrack){ue=!1;continue}else return!1}else if(!this.options.flex)break}return ue?(se=this.test_match(ue,ce[Se]),se!==!1?se:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var ue=this.next();return ue||this.lex()},"lex"),begin:o(function(ue){this.conditionStack.push(ue)},"begin"),popState:o(function(){var ue=this.conditionStack.length-1;return ue>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(ue){return ue=this.conditionStack.length-1-Math.abs(ue||0),ue>=0?this.conditionStack[ue]:"INITIAL"},"topState"),pushState:o(function(ue){this.begin(ue)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(ue,Z,Se,ce){var ae=ce;switch(Se){case 0:return this.begin("acc_title"),24;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),26;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return 33;case 8:return 34;case 9:return 35;case 10:return 36;case 11:return 10;case 12:break;case 13:return 8;case 14:return 50;case 15:return 70;case 16:return 4;case 17:return this.begin("block"),17;break;case 18:return 49;case 19:return 49;case 20:return 42;case 21:return 15;case 22:return 13;case 23:break;case 24:return 59;case 25:return 56;case 26:return 56;case 27:return 60;case 28:break;case 29:return this.popState(),19;break;case 30:return Z.yytext[0];case 31:return 20;case 32:return 21;case 33:return this.begin("style"),44;break;case 34:return this.popState(),10;break;case 35:break;case 36:return 13;case 37:return 42;case 38:return 49;case 39:return this.begin("style"),37;break;case 40:return 43;case 41:return 63;case 42:return 65;case 43:return 65;case 44:return 65;case 45:return 63;case 46:return 63;case 47:return 64;case 48:return 64;case 49:return 64;case 50:return 64;case 51:return 64;case 52:return 65;case 53:return 64;case 54:return 65;case 55:return 66;case 56:return 66;case 57:return 66;case 58:return 66;case 59:return 63;case 60:return 64;case 61:return 65;case 62:return 67;case 63:return 68;case 64:return 69;case 65:return 69;case 66:return 68;case 67:return 68;case 68:return 68;case 69:return 41;case 70:return 47;case 71:return 40;case 72:return 48;case 73:return Z.yytext[0];case 74:return 6}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:#)/i,/^(?:#)/i,/^(?:,)/i,/^(?::::)/i,/^(?::)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:([^\s]*)[~].*[~]([^\s]*))/i,/^(?:([\*A-Za-z_\u00C0-\uFFFF][A-Za-z0-9\-\_\[\]\(\)\u00C0-\uFFFF\*]*))/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:style\b)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?::)/i,/^(?:,)/i,/^(?:#)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:1\b)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\s*u\b)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:;)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:[0-9])/i,/^(?:.)/i,/^(?:$)/i],conditions:{style:{rules:[34,35,36,37,38,69,70],inclusive:!1},acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},block:{rules:[23,24,25,26,27,28,29,30],inclusive:!1},INITIAL:{rules:[0,2,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,31,32,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,71,72,73,74],inclusive:!0}}};return J}();K.lexer=X;function te(){this.yy={}}return o(te,"Parser"),te.prototype=K,K.Parser=te,new te}();wR.parser=wR;Zie=wR});var sk,eae=N(()=>{"use strict";vt();zt();mi();ir();sk=class{constructor(){this.entities=new Map;this.relationships=[];this.classes=new Map;this.direction="TB";this.Cardinality={ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE",MD_PARENT:"MD_PARENT"};this.Identification={NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"};this.setAccTitle=Lr;this.getAccTitle=Rr;this.setAccDescription=Nr;this.getAccDescription=Mr;this.setDiagramTitle=$r;this.getDiagramTitle=Ir;this.getConfig=o(()=>me().er,"getConfig");this.clear(),this.addEntity=this.addEntity.bind(this),this.addAttributes=this.addAttributes.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setDirection=this.setDirection.bind(this),this.addCssStyles=this.addCssStyles.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{o(this,"ErDB")}addEntity(e,r=""){return this.entities.has(e)?!this.entities.get(e)?.alias&&r&&(this.entities.get(e).alias=r,Y.info(`Add alias '${r}' to entity '${e}'`)):(this.entities.set(e,{id:`entity-${e}-${this.entities.size}`,label:e,attributes:[],alias:r,shape:"erBox",look:me().look??"default",cssClasses:"default",cssStyles:[]}),Y.info("Added new entity :",e)),this.entities.get(e)}getEntity(e){return this.entities.get(e)}getEntities(){return this.entities}getClasses(){return this.classes}addAttributes(e,r){let n=this.addEntity(e),i;for(i=r.length-1;i>=0;i--)r[i].keys||(r[i].keys=[]),r[i].comment||(r[i].comment=""),n.attributes.push(r[i]),Y.debug("Added attribute ",r[i].name)}addRelationship(e,r,n,i){let a=this.entities.get(e),s=this.entities.get(n);if(!a||!s)return;let l={entityA:a.id,roleA:r,entityB:s.id,relSpec:i};this.relationships.push(l),Y.debug("Added new relationship :",l)}getRelationships(){return this.relationships}getDirection(){return this.direction}setDirection(e){this.direction=e}getCompiledStyles(e){let r=[];for(let n of e){let i=this.classes.get(n);i?.styles&&(r=[...r,...i.styles??[]].map(a=>a.trim())),i?.textStyles&&(r=[...r,...i.textStyles??[]].map(a=>a.trim()))}return r}addCssStyles(e,r){for(let n of e){let i=this.entities.get(n);if(!r||!i)return;for(let a of r)i.cssStyles.push(a)}}addClass(e,r){e.forEach(n=>{let i=this.classes.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.classes.set(n,i)),r&&r.forEach(function(a){if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)})})}setClass(e,r){for(let n of e){let i=this.entities.get(n);if(i)for(let a of r)i.cssClasses+=" "+a}}clear(){this.entities=new Map,this.classes=new Map,this.relationships=[],Ar()}getData(){let e=[],r=[],n=me();for(let a of this.entities.keys()){let s=this.entities.get(a);s&&(s.cssCompiledStyles=this.getCompiledStyles(s.cssClasses.split(" ")),e.push(s))}let i=0;for(let a of this.relationships){let s={id:$h(a.entityA,a.entityB,{prefix:"id",counter:i++}),type:"normal",curve:"basis",start:a.entityA,end:a.entityB,label:a.roleA,labelpos:"c",thickness:"normal",classes:"relationshipLine",arrowTypeStart:a.relSpec.cardB.toLowerCase(),arrowTypeEnd:a.relSpec.cardA.toLowerCase(),pattern:a.relSpec.relType=="IDENTIFYING"?"solid":"dashed",look:n.look};r.push(s)}return{nodes:e,edges:r,other:{},config:n,direction:"TB"}}}});var TR={};hr(TR,{draw:()=>SOe});var SOe,tae=N(()=>{"use strict";zt();vt();gm();Yd();$m();ir();dr();SOe=o(async function(t,e,r,n){Y.info("REF0:"),Y.info("Drawing er diagram (unified)",e);let{securityLevel:i,er:a,layout:s}=me(),l=n.db.getData(),u=yc(e,i);l.type=n.type,l.layoutAlgorithm=nf(s),l.config.flowchart.nodeSpacing=a?.nodeSpacing||140,l.config.flowchart.rankSpacing=a?.rankSpacing||80,l.direction=n.db.getDirection(),l.markers=["only_one","zero_or_one","one_or_more","zero_or_more"],l.diagramId=e,await Cc(l,u),l.layoutAlgorithm==="elk"&&u.select(".edges").lower();let h=u.selectAll('[id*="-background"]');Array.from(h).length>0&&h.each(function(){let d=Ge(this),m=d.attr("id").replace("-background",""),g=u.select(`#${CSS.escape(m)}`);if(!g.empty()){let y=g.attr("transform");d.attr("transform",y)}});let f=8;Gt.insertTitle(u,"erDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Ac(u,f,"erDiagram",a?.useMaxWidth??!0)},"draw")});var COe,AOe,rae,nae=N(()=>{"use strict";Ys();COe=o((t,e)=>{let r=Kf,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return qa(n,i,a,e)},"fade"),AOe=o(t=>` + .entityBox { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + } + + .relationshipLabelBox { + fill: ${t.tertiaryColor}; + opacity: 0.7; + background-color: ${t.tertiaryColor}; + rect { + opacity: 0.5; + } + } + + .labelBkg { + background-color: ${COe(t.tertiaryColor,.5)}; + } + + .edgeLabel .label { + fill: ${t.nodeBorder}; + font-size: 14px; + } + + .label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + + .edge-pattern-dashed { + stroke-dasharray: 8,8; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon + { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + + .relationshipLine { + stroke: ${t.lineColor}; + stroke-width: 1; + fill: none; + } + + .marker { + fill: none !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; + } +`,"getStyles"),rae=AOe});var iae={};hr(iae,{diagram:()=>_Oe});var _Oe,aae=N(()=>{"use strict";Jie();eae();tae();nae();_Oe={parser:Zie,get db(){return new sk},renderer:TR,styles:rae}});function ii(t){return typeof t=="object"&&t!==null&&typeof t.$type=="string"}function va(t){return typeof t=="object"&&t!==null&&typeof t.$refText=="string"}function kR(t){return typeof t=="object"&&t!==null&&typeof t.name=="string"&&typeof t.type=="string"&&typeof t.path=="string"}function jd(t){return typeof t=="object"&&t!==null&&ii(t.container)&&va(t.reference)&&typeof t.message=="string"}function Ll(t){return typeof t=="object"&&t!==null&&Array.isArray(t.content)}function af(t){return typeof t=="object"&&t!==null&&typeof t.tokenType=="object"}function M2(t){return Ll(t)&&typeof t.fullText=="string"}var Xd,Rl=N(()=>{"use strict";o(ii,"isAstNode");o(va,"isReference");o(kR,"isAstNodeDescription");o(jd,"isLinkingError");Xd=class{static{o(this,"AbstractAstReflection")}constructor(){this.subtypes={},this.allSubtypes={}}isInstance(e,r){return ii(e)&&this.isSubtype(e.$type,r)}isSubtype(e,r){if(e===r)return!0;let n=this.subtypes[e];n||(n=this.subtypes[e]={});let i=n[r];if(i!==void 0)return i;{let a=this.computeIsSubtype(e,r);return n[r]=a,a}}getAllSubTypes(e){let r=this.allSubtypes[e];if(r)return r;{let n=this.getAllTypes(),i=[];for(let a of n)this.isSubtype(a,e)&&i.push(a);return this.allSubtypes[e]=i,i}}};o(Ll,"isCompositeCstNode");o(af,"isLeafCstNode");o(M2,"isRootCstNode")});function NOe(t){return typeof t=="string"?t:typeof t>"u"?"undefined":typeof t.toString=="function"?t.toString():Object.prototype.toString.call(t)}function ok(t){return!!t&&typeof t[Symbol.iterator]=="function"}function en(...t){if(t.length===1){let e=t[0];if(e instanceof ao)return e;if(ok(e))return new ao(()=>e[Symbol.iterator](),r=>r.next());if(typeof e.length=="number")return new ao(()=>({index:0}),r=>r.index1?new ao(()=>({collIndex:0,arrIndex:0}),e=>{do{if(e.iterator){let r=e.iterator.next();if(!r.done)return r;e.iterator=void 0}if(e.array){if(e.arrIndex{"use strict";ao=class t{static{o(this,"StreamImpl")}constructor(e,r){this.startFn=e,this.nextFn=r}iterator(){let e={state:this.startFn(),next:o(()=>this.nextFn(e.state),"next"),[Symbol.iterator]:()=>e};return e}[Symbol.iterator](){return this.iterator()}isEmpty(){return!!this.iterator().next().done}count(){let e=this.iterator(),r=0,n=e.next();for(;!n.done;)r++,n=e.next();return r}toArray(){let e=[],r=this.iterator(),n;do n=r.next(),n.value!==void 0&&e.push(n.value);while(!n.done);return e}toSet(){return new Set(this)}toMap(e,r){let n=this.map(i=>[e?e(i):i,r?r(i):i]);return new Map(n)}toString(){return this.join()}concat(e){return new t(()=>({first:this.startFn(),firstDone:!1,iterator:e[Symbol.iterator]()}),r=>{let n;if(!r.firstDone){do if(n=this.nextFn(r.first),!n.done)return n;while(!n.done);r.firstDone=!0}do if(n=r.iterator.next(),!n.done)return n;while(!n.done);return Ia})}join(e=","){let r=this.iterator(),n="",i,a=!1;do i=r.next(),i.done||(a&&(n+=e),n+=NOe(i.value)),a=!0;while(!i.done);return n}indexOf(e,r=0){let n=this.iterator(),i=0,a=n.next();for(;!a.done;){if(i>=r&&a.value===e)return i;a=n.next(),i++}return-1}every(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(!e(n.value))return!1;n=r.next()}return!0}some(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return!0;n=r.next()}return!1}forEach(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;)e(i.value,n),i=r.next(),n++}map(e){return new t(this.startFn,r=>{let{done:n,value:i}=this.nextFn(r);return n?Ia:{done:!1,value:e(i)}})}filter(e){return new t(this.startFn,r=>{let n;do if(n=this.nextFn(r),!n.done&&e(n.value))return n;while(!n.done);return Ia})}nonNullable(){return this.filter(e=>e!=null)}reduce(e,r){let n=this.iterator(),i=r,a=n.next();for(;!a.done;)i===void 0?i=a.value:i=e(i,a.value),a=n.next();return i}reduceRight(e,r){return this.recursiveReduce(this.iterator(),e,r)}recursiveReduce(e,r,n){let i=e.next();if(i.done)return n;let a=this.recursiveReduce(e,r,n);return a===void 0?i.value:r(a,i.value)}find(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return n.value;n=r.next()}}findIndex(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;){if(e(i.value))return n;i=r.next(),n++}return-1}includes(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(n.value===e)return!0;n=r.next()}return!1}flatMap(e){return new t(()=>({this:this.startFn()}),r=>{do{if(r.iterator){let a=r.iterator.next();if(a.done)r.iterator=void 0;else return a}let{done:n,value:i}=this.nextFn(r.this);if(!n){let a=e(i);if(ok(a))r.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}}while(r.iterator);return Ia})}flat(e){if(e===void 0&&(e=1),e<=0)return this;let r=e>1?this.flat(e-1):this;return new t(()=>({this:r.startFn()}),n=>{do{if(n.iterator){let s=n.iterator.next();if(s.done)n.iterator=void 0;else return s}let{done:i,value:a}=r.nextFn(n.this);if(!i)if(ok(a))n.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}while(n.iterator);return Ia})}head(){let r=this.iterator().next();if(!r.done)return r.value}tail(e=1){return new t(()=>{let r=this.startFn();for(let n=0;n({size:0,state:this.startFn()}),r=>(r.size++,r.size>e?Ia:this.nextFn(r.state)))}distinct(e){return new t(()=>({set:new Set,internalState:this.startFn()}),r=>{let n;do if(n=this.nextFn(r.internalState),!n.done){let i=e?e(n.value):n.value;if(!r.set.has(i))return r.set.add(i),n}while(!n.done);return Ia})}exclude(e,r){let n=new Set;for(let i of e){let a=r?r(i):i;n.add(a)}return this.filter(i=>{let a=r?r(i):i;return!n.has(a)})}};o(NOe,"toString");o(ok,"isIterable");I2=new ao(()=>{},()=>Ia),Ia=Object.freeze({done:!0,value:void 0});o(en,"stream");_c=class extends ao{static{o(this,"TreeStreamImpl")}constructor(e,r,n){super(()=>({iterators:n?.includeRoot?[[e][Symbol.iterator]()]:[r(e)[Symbol.iterator]()],pruned:!1}),i=>{for(i.pruned&&(i.iterators.pop(),i.pruned=!1);i.iterators.length>0;){let s=i.iterators[i.iterators.length-1].next();if(s.done)i.iterators.pop();else return i.iterators.push(r(s.value)[Symbol.iterator]()),s}return Ia})}iterator(){let e={state:this.startFn(),next:o(()=>this.nextFn(e.state),"next"),prune:o(()=>{e.state.pruned=!0},"prune"),[Symbol.iterator]:()=>e};return e}};(function(t){function e(a){return a.reduce((s,l)=>s+l,0)}o(e,"sum"),t.sum=e;function r(a){return a.reduce((s,l)=>s*l,0)}o(r,"product"),t.product=r;function n(a){return a.reduce((s,l)=>Math.min(s,l))}o(n,"min"),t.min=n;function i(a){return a.reduce((s,l)=>Math.max(s,l))}o(i,"max"),t.max=i})(zm||(zm={}))});var ck={};hr(ck,{DefaultNameRegexp:()=>lk,RangeComparison:()=>Dc,compareRange:()=>cae,findCommentNode:()=>AR,findDeclarationNodeAtOffset:()=>IOe,findLeafNodeAtOffset:()=>_R,findLeafNodeBeforeOffset:()=>uae,flattenCst:()=>MOe,getInteriorNodes:()=>BOe,getNextNode:()=>OOe,getPreviousNode:()=>fae,getStartlineNode:()=>POe,inRange:()=>CR,isChildNode:()=>SR,isCommentNode:()=>ER,streamCst:()=>Kd,toDocumentSegment:()=>Qd,tokenToRange:()=>Gm});function Kd(t){return new _c(t,e=>Ll(e)?e.content:[],{includeRoot:!0})}function MOe(t){return Kd(t).filter(af)}function SR(t,e){for(;t.container;)if(t=t.container,t===e)return!0;return!1}function Gm(t){return{start:{character:t.startColumn-1,line:t.startLine-1},end:{character:t.endColumn,line:t.endLine-1}}}function Qd(t){if(!t)return;let{offset:e,end:r,range:n}=t;return{range:n,offset:e,end:r,length:r-e}}function cae(t,e){if(t.end.linee.end.line||t.start.line===e.end.line&&t.start.character>=e.end.character)return Dc.After;let r=t.start.line>e.start.line||t.start.line===e.start.line&&t.start.character>=e.start.character,n=t.end.lineDc.After}function IOe(t,e,r=lk){if(t){if(e>0){let n=e-t.offset,i=t.text.charAt(n);r.test(i)||e--}return _R(t,e)}}function AR(t,e){if(t){let r=fae(t,!0);if(r&&ER(r,e))return r;if(M2(t)){let n=t.content.findIndex(i=>!i.hidden);for(let i=n-1;i>=0;i--){let a=t.content[i];if(ER(a,e))return a}}}}function ER(t,e){return af(t)&&e.includes(t.tokenType.name)}function _R(t,e){if(af(t))return t;if(Ll(t)){let r=hae(t,e,!1);if(r)return _R(r,e)}}function uae(t,e){if(af(t))return t;if(Ll(t)){let r=hae(t,e,!0);if(r)return uae(r,e)}}function hae(t,e,r){let n=0,i=t.content.length-1,a;for(;n<=i;){let s=Math.floor((n+i)/2),l=t.content[s];if(l.offset<=e&&l.end>e)return l;l.end<=e?(a=r?l:void 0,n=s+1):i=s-1}return a}function fae(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t);for(;n>0;){n--;let i=r.content[n];if(e||!i.hidden)return i}t=r}}function OOe(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t),i=r.content.length-1;for(;n{"use strict";Rl();Ps();o(Kd,"streamCst");o(MOe,"flattenCst");o(SR,"isChildNode");o(Gm,"tokenToRange");o(Qd,"toDocumentSegment");(function(t){t[t.Before=0]="Before",t[t.After=1]="After",t[t.OverlapFront=2]="OverlapFront",t[t.OverlapBack=3]="OverlapBack",t[t.Inside=4]="Inside",t[t.Outside=5]="Outside"})(Dc||(Dc={}));o(cae,"compareRange");o(CR,"inRange");lk=/^[\w\p{L}]$/u;o(IOe,"findDeclarationNodeAtOffset");o(AR,"findCommentNode");o(ER,"isCommentNode");o(_R,"findLeafNodeAtOffset");o(uae,"findLeafNodeBeforeOffset");o(hae,"binarySearch");o(fae,"getPreviousNode");o(OOe,"getNextNode");o(POe,"getStartlineNode");o(BOe,"getInteriorNodes");o(FOe,"getCommonParent");o(lae,"getParentChain")});function Lc(t){throw new Error("Error! The input value was not handled.")}var Zd,uk=N(()=>{"use strict";Zd=class extends Error{static{o(this,"ErrorWithLocation")}constructor(e,r){super(e?`${r} at ${e.range.start.line}:${e.range.start.character}`:r)}};o(Lc,"assertUnreachable")});var U2={};hr(U2,{AbstractElement:()=>Hm,AbstractRule:()=>Vm,AbstractType:()=>Um,Action:()=>cg,Alternatives:()=>ug,ArrayLiteral:()=>Wm,ArrayType:()=>qm,Assignment:()=>hg,BooleanLiteral:()=>Ym,CharacterRange:()=>fg,Condition:()=>O2,Conjunction:()=>Xm,CrossReference:()=>dg,Disjunction:()=>jm,EndOfFile:()=>pg,Grammar:()=>Km,GrammarImport:()=>B2,Group:()=>mg,InferredType:()=>Qm,Interface:()=>Zm,Keyword:()=>gg,LangiumGrammarAstReflection:()=>Cg,LangiumGrammarTerminals:()=>$Oe,NamedArgument:()=>F2,NegatedToken:()=>yg,Negation:()=>Jm,NumberLiteral:()=>eg,Parameter:()=>tg,ParameterReference:()=>rg,ParserRule:()=>ng,ReferenceType:()=>ig,RegexToken:()=>vg,ReturnType:()=>$2,RuleCall:()=>xg,SimpleType:()=>ag,StringLiteral:()=>sg,TerminalAlternatives:()=>bg,TerminalGroup:()=>wg,TerminalRule:()=>Jd,TerminalRuleCall:()=>Tg,Type:()=>og,TypeAttribute:()=>z2,TypeDefinition:()=>hk,UnionType:()=>lg,UnorderedGroup:()=>kg,UntilToken:()=>Eg,ValueLiteral:()=>P2,Wildcard:()=>Sg,isAbstractElement:()=>G2,isAbstractRule:()=>zOe,isAbstractType:()=>GOe,isAction:()=>Mu,isAlternatives:()=>mk,isArrayLiteral:()=>qOe,isArrayType:()=>DR,isAssignment:()=>Ml,isBooleanLiteral:()=>LR,isCharacterRange:()=>FR,isCondition:()=>VOe,isConjunction:()=>RR,isCrossReference:()=>ep,isDisjunction:()=>NR,isEndOfFile:()=>$R,isFeatureName:()=>UOe,isGrammar:()=>YOe,isGrammarImport:()=>XOe,isGroup:()=>sf,isInferredType:()=>fk,isInterface:()=>dk,isKeyword:()=>Ho,isNamedArgument:()=>jOe,isNegatedToken:()=>zR,isNegation:()=>MR,isNumberLiteral:()=>KOe,isParameter:()=>QOe,isParameterReference:()=>IR,isParserRule:()=>Oa,isPrimitiveType:()=>dae,isReferenceType:()=>OR,isRegexToken:()=>GR,isReturnType:()=>PR,isRuleCall:()=>Il,isSimpleType:()=>pk,isStringLiteral:()=>ZOe,isTerminalAlternatives:()=>VR,isTerminalGroup:()=>UR,isTerminalRule:()=>so,isTerminalRuleCall:()=>gk,isType:()=>V2,isTypeAttribute:()=>JOe,isTypeDefinition:()=>HOe,isUnionType:()=>BR,isUnorderedGroup:()=>yk,isUntilToken:()=>HR,isValueLiteral:()=>WOe,isWildcard:()=>WR,reflection:()=>lr});function zOe(t){return lr.isInstance(t,Vm)}function GOe(t){return lr.isInstance(t,Um)}function VOe(t){return lr.isInstance(t,O2)}function UOe(t){return dae(t)||t==="current"||t==="entry"||t==="extends"||t==="false"||t==="fragment"||t==="grammar"||t==="hidden"||t==="import"||t==="interface"||t==="returns"||t==="terminal"||t==="true"||t==="type"||t==="infer"||t==="infers"||t==="with"||typeof t=="string"&&/\^?[_a-zA-Z][\w_]*/.test(t)}function dae(t){return t==="string"||t==="number"||t==="boolean"||t==="Date"||t==="bigint"}function HOe(t){return lr.isInstance(t,hk)}function WOe(t){return lr.isInstance(t,P2)}function G2(t){return lr.isInstance(t,Hm)}function qOe(t){return lr.isInstance(t,Wm)}function DR(t){return lr.isInstance(t,qm)}function LR(t){return lr.isInstance(t,Ym)}function RR(t){return lr.isInstance(t,Xm)}function NR(t){return lr.isInstance(t,jm)}function YOe(t){return lr.isInstance(t,Km)}function XOe(t){return lr.isInstance(t,B2)}function fk(t){return lr.isInstance(t,Qm)}function dk(t){return lr.isInstance(t,Zm)}function jOe(t){return lr.isInstance(t,F2)}function MR(t){return lr.isInstance(t,Jm)}function KOe(t){return lr.isInstance(t,eg)}function QOe(t){return lr.isInstance(t,tg)}function IR(t){return lr.isInstance(t,rg)}function Oa(t){return lr.isInstance(t,ng)}function OR(t){return lr.isInstance(t,ig)}function PR(t){return lr.isInstance(t,$2)}function pk(t){return lr.isInstance(t,ag)}function ZOe(t){return lr.isInstance(t,sg)}function so(t){return lr.isInstance(t,Jd)}function V2(t){return lr.isInstance(t,og)}function JOe(t){return lr.isInstance(t,z2)}function BR(t){return lr.isInstance(t,lg)}function Mu(t){return lr.isInstance(t,cg)}function mk(t){return lr.isInstance(t,ug)}function Ml(t){return lr.isInstance(t,hg)}function FR(t){return lr.isInstance(t,fg)}function ep(t){return lr.isInstance(t,dg)}function $R(t){return lr.isInstance(t,pg)}function sf(t){return lr.isInstance(t,mg)}function Ho(t){return lr.isInstance(t,gg)}function zR(t){return lr.isInstance(t,yg)}function GR(t){return lr.isInstance(t,vg)}function Il(t){return lr.isInstance(t,xg)}function VR(t){return lr.isInstance(t,bg)}function UR(t){return lr.isInstance(t,wg)}function gk(t){return lr.isInstance(t,Tg)}function yk(t){return lr.isInstance(t,kg)}function HR(t){return lr.isInstance(t,Eg)}function WR(t){return lr.isInstance(t,Sg)}var $Oe,Vm,Um,O2,hk,P2,Hm,Wm,qm,Ym,Xm,jm,Km,B2,Qm,Zm,F2,Jm,eg,tg,rg,ng,ig,$2,ag,sg,Jd,og,z2,lg,cg,ug,hg,fg,dg,pg,mg,gg,yg,vg,xg,bg,wg,Tg,kg,Eg,Sg,Cg,lr,Rc=N(()=>{"use strict";Rl();$Oe={ID:/\^?[_a-zA-Z][\w_]*/,STRING:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,NUMBER:/NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity)/,RegexLiteral:/\/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+\/[a-z]*/,WS:/\s+/,ML_COMMENT:/\/\*[\s\S]*?\*\//,SL_COMMENT:/\/\/[^\n\r]*/},Vm="AbstractRule";o(zOe,"isAbstractRule");Um="AbstractType";o(GOe,"isAbstractType");O2="Condition";o(VOe,"isCondition");o(UOe,"isFeatureName");o(dae,"isPrimitiveType");hk="TypeDefinition";o(HOe,"isTypeDefinition");P2="ValueLiteral";o(WOe,"isValueLiteral");Hm="AbstractElement";o(G2,"isAbstractElement");Wm="ArrayLiteral";o(qOe,"isArrayLiteral");qm="ArrayType";o(DR,"isArrayType");Ym="BooleanLiteral";o(LR,"isBooleanLiteral");Xm="Conjunction";o(RR,"isConjunction");jm="Disjunction";o(NR,"isDisjunction");Km="Grammar";o(YOe,"isGrammar");B2="GrammarImport";o(XOe,"isGrammarImport");Qm="InferredType";o(fk,"isInferredType");Zm="Interface";o(dk,"isInterface");F2="NamedArgument";o(jOe,"isNamedArgument");Jm="Negation";o(MR,"isNegation");eg="NumberLiteral";o(KOe,"isNumberLiteral");tg="Parameter";o(QOe,"isParameter");rg="ParameterReference";o(IR,"isParameterReference");ng="ParserRule";o(Oa,"isParserRule");ig="ReferenceType";o(OR,"isReferenceType");$2="ReturnType";o(PR,"isReturnType");ag="SimpleType";o(pk,"isSimpleType");sg="StringLiteral";o(ZOe,"isStringLiteral");Jd="TerminalRule";o(so,"isTerminalRule");og="Type";o(V2,"isType");z2="TypeAttribute";o(JOe,"isTypeAttribute");lg="UnionType";o(BR,"isUnionType");cg="Action";o(Mu,"isAction");ug="Alternatives";o(mk,"isAlternatives");hg="Assignment";o(Ml,"isAssignment");fg="CharacterRange";o(FR,"isCharacterRange");dg="CrossReference";o(ep,"isCrossReference");pg="EndOfFile";o($R,"isEndOfFile");mg="Group";o(sf,"isGroup");gg="Keyword";o(Ho,"isKeyword");yg="NegatedToken";o(zR,"isNegatedToken");vg="RegexToken";o(GR,"isRegexToken");xg="RuleCall";o(Il,"isRuleCall");bg="TerminalAlternatives";o(VR,"isTerminalAlternatives");wg="TerminalGroup";o(UR,"isTerminalGroup");Tg="TerminalRuleCall";o(gk,"isTerminalRuleCall");kg="UnorderedGroup";o(yk,"isUnorderedGroup");Eg="UntilToken";o(HR,"isUntilToken");Sg="Wildcard";o(WR,"isWildcard");Cg=class extends Xd{static{o(this,"LangiumGrammarAstReflection")}getAllTypes(){return[Hm,Vm,Um,cg,ug,Wm,qm,hg,Ym,fg,O2,Xm,dg,jm,pg,Km,B2,mg,Qm,Zm,gg,F2,yg,Jm,eg,tg,rg,ng,ig,vg,$2,xg,ag,sg,bg,wg,Jd,Tg,og,z2,hk,lg,kg,Eg,P2,Sg]}computeIsSubtype(e,r){switch(e){case cg:case ug:case hg:case fg:case dg:case pg:case mg:case gg:case yg:case vg:case xg:case bg:case wg:case Tg:case kg:case Eg:case Sg:return this.isSubtype(Hm,r);case Wm:case eg:case sg:return this.isSubtype(P2,r);case qm:case ig:case ag:case lg:return this.isSubtype(hk,r);case Ym:return this.isSubtype(O2,r)||this.isSubtype(P2,r);case Xm:case jm:case Jm:case rg:return this.isSubtype(O2,r);case Qm:case Zm:case og:return this.isSubtype(Um,r);case ng:return this.isSubtype(Vm,r)||this.isSubtype(Um,r);case Jd:return this.isSubtype(Vm,r);default:return!1}}getReferenceType(e){let r=`${e.container.$type}:${e.property}`;switch(r){case"Action:type":case"CrossReference:type":case"Interface:superTypes":case"ParserRule:returnType":case"SimpleType:typeRef":return Um;case"Grammar:hiddenTokens":case"ParserRule:hiddenTokens":case"RuleCall:rule":return Vm;case"Grammar:usedGrammars":return Km;case"NamedArgument:parameter":case"ParameterReference:parameter":return tg;case"TerminalRuleCall:rule":return Jd;default:throw new Error(`${r} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case Hm:return{name:Hm,properties:[{name:"cardinality"},{name:"lookahead"}]};case Wm:return{name:Wm,properties:[{name:"elements",defaultValue:[]}]};case qm:return{name:qm,properties:[{name:"elementType"}]};case Ym:return{name:Ym,properties:[{name:"true",defaultValue:!1}]};case Xm:return{name:Xm,properties:[{name:"left"},{name:"right"}]};case jm:return{name:jm,properties:[{name:"left"},{name:"right"}]};case Km:return{name:Km,properties:[{name:"definesHiddenTokens",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"imports",defaultValue:[]},{name:"interfaces",defaultValue:[]},{name:"isDeclared",defaultValue:!1},{name:"name"},{name:"rules",defaultValue:[]},{name:"types",defaultValue:[]},{name:"usedGrammars",defaultValue:[]}]};case B2:return{name:B2,properties:[{name:"path"}]};case Qm:return{name:Qm,properties:[{name:"name"}]};case Zm:return{name:Zm,properties:[{name:"attributes",defaultValue:[]},{name:"name"},{name:"superTypes",defaultValue:[]}]};case F2:return{name:F2,properties:[{name:"calledByName",defaultValue:!1},{name:"parameter"},{name:"value"}]};case Jm:return{name:Jm,properties:[{name:"value"}]};case eg:return{name:eg,properties:[{name:"value"}]};case tg:return{name:tg,properties:[{name:"name"}]};case rg:return{name:rg,properties:[{name:"parameter"}]};case ng:return{name:ng,properties:[{name:"dataType"},{name:"definesHiddenTokens",defaultValue:!1},{name:"definition"},{name:"entry",defaultValue:!1},{name:"fragment",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"inferredType"},{name:"name"},{name:"parameters",defaultValue:[]},{name:"returnType"},{name:"wildcard",defaultValue:!1}]};case ig:return{name:ig,properties:[{name:"referenceType"}]};case $2:return{name:$2,properties:[{name:"name"}]};case ag:return{name:ag,properties:[{name:"primitiveType"},{name:"stringType"},{name:"typeRef"}]};case sg:return{name:sg,properties:[{name:"value"}]};case Jd:return{name:Jd,properties:[{name:"definition"},{name:"fragment",defaultValue:!1},{name:"hidden",defaultValue:!1},{name:"name"},{name:"type"}]};case og:return{name:og,properties:[{name:"name"},{name:"type"}]};case z2:return{name:z2,properties:[{name:"defaultValue"},{name:"isOptional",defaultValue:!1},{name:"name"},{name:"type"}]};case lg:return{name:lg,properties:[{name:"types",defaultValue:[]}]};case cg:return{name:cg,properties:[{name:"cardinality"},{name:"feature"},{name:"inferredType"},{name:"lookahead"},{name:"operator"},{name:"type"}]};case ug:return{name:ug,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case hg:return{name:hg,properties:[{name:"cardinality"},{name:"feature"},{name:"lookahead"},{name:"operator"},{name:"terminal"}]};case fg:return{name:fg,properties:[{name:"cardinality"},{name:"left"},{name:"lookahead"},{name:"right"}]};case dg:return{name:dg,properties:[{name:"cardinality"},{name:"deprecatedSyntax",defaultValue:!1},{name:"lookahead"},{name:"terminal"},{name:"type"}]};case pg:return{name:pg,properties:[{name:"cardinality"},{name:"lookahead"}]};case mg:return{name:mg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"guardCondition"},{name:"lookahead"}]};case gg:return{name:gg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"value"}]};case yg:return{name:yg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case vg:return{name:vg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"regex"}]};case xg:return{name:xg,properties:[{name:"arguments",defaultValue:[]},{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case bg:return{name:bg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case wg:return{name:wg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case Tg:return{name:Tg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case kg:return{name:kg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case Eg:return{name:Eg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case Sg:return{name:Sg,properties:[{name:"cardinality"},{name:"lookahead"}]};default:return{name:e,properties:[]}}}},lr=new Cg});var xk={};hr(xk,{assignMandatoryProperties:()=>XR,copyAstNode:()=>YR,findLocalReferences:()=>tPe,findRootNode:()=>H2,getContainerOfType:()=>tp,getDocument:()=>Pa,hasContainerOfType:()=>ePe,linkContentToContainer:()=>vk,streamAllContents:()=>Nc,streamAst:()=>Wo,streamContents:()=>W2,streamReferences:()=>Ag});function vk(t){for(let[e,r]of Object.entries(t))e.startsWith("$")||(Array.isArray(r)?r.forEach((n,i)=>{ii(n)&&(n.$container=t,n.$containerProperty=e,n.$containerIndex=i)}):ii(r)&&(r.$container=t,r.$containerProperty=e))}function tp(t,e){let r=t;for(;r;){if(e(r))return r;r=r.$container}}function ePe(t,e){let r=t;for(;r;){if(e(r))return!0;r=r.$container}return!1}function Pa(t){let r=H2(t).$document;if(!r)throw new Error("AST node has no document.");return r}function H2(t){for(;t.$container;)t=t.$container;return t}function W2(t,e){if(!t)throw new Error("Node must be an AstNode.");let r=e?.range;return new ao(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),n=>{for(;n.keyIndexW2(r,e))}function Wo(t,e){if(t){if(e?.range&&!qR(t,e.range))return new _c(t,()=>[])}else throw new Error("Root node must be an AstNode.");return new _c(t,r=>W2(r,e),{includeRoot:!0})}function qR(t,e){var r;if(!e)return!0;let n=(r=t.$cstNode)===null||r===void 0?void 0:r.range;return n?CR(n,e):!1}function Ag(t){return new ao(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),e=>{for(;e.keyIndex{Ag(n).forEach(i=>{i.reference.ref===t&&r.push(i.reference)})}),en(r)}function XR(t,e){let r=t.getTypeMetaData(e.$type),n=e;for(let i of r.properties)i.defaultValue!==void 0&&n[i.name]===void 0&&(n[i.name]=pae(i.defaultValue))}function pae(t){return Array.isArray(t)?[...t.map(pae)]:t}function YR(t,e){let r={$type:t.$type};for(let[n,i]of Object.entries(t))if(!n.startsWith("$"))if(ii(i))r[n]=YR(i,e);else if(va(i))r[n]=e(r,n,i.$refNode,i.$refText);else if(Array.isArray(i)){let a=[];for(let s of i)ii(s)?a.push(YR(s,e)):va(s)?a.push(e(r,n,s.$refNode,s.$refText)):a.push(s);r[n]=a}else r[n]=i;return vk(r),r}var is=N(()=>{"use strict";Rl();Ps();Nl();o(vk,"linkContentToContainer");o(tp,"getContainerOfType");o(ePe,"hasContainerOfType");o(Pa,"getDocument");o(H2,"findRootNode");o(W2,"streamContents");o(Nc,"streamAllContents");o(Wo,"streamAst");o(qR,"isAstNodeInRange");o(Ag,"streamReferences");o(tPe,"findLocalReferences");o(XR,"assignMandatoryProperties");o(pae,"copyDefaultValue");o(YR,"copyAstNode")});function ar(t){return t.charCodeAt(0)}function bk(t,e){Array.isArray(t)?t.forEach(function(r){e.push(r)}):e.push(t)}function _g(t,e){if(t[e]===!0)throw"duplicate flag "+e;let r=t[e];t[e]=!0}function rp(t){if(t===void 0)throw Error("Internal Error - Should never get here!");return!0}function q2(){throw Error("Internal Error - Should never get here!")}function jR(t){return t.type==="Character"}var KR=N(()=>{"use strict";o(ar,"cc");o(bk,"insertToSet");o(_g,"addFlag");o(rp,"ASSERT_EXISTS");o(q2,"ASSERT_NEVER_REACH_HERE");o(jR,"isCharacter")});var Y2,X2,QR,mae=N(()=>{"use strict";KR();Y2=[];for(let t=ar("0");t<=ar("9");t++)Y2.push(t);X2=[ar("_")].concat(Y2);for(let t=ar("a");t<=ar("z");t++)X2.push(t);for(let t=ar("A");t<=ar("Z");t++)X2.push(t);QR=[ar(" "),ar("\f"),ar(` +`),ar("\r"),ar(" "),ar("\v"),ar(" "),ar("\xA0"),ar("\u1680"),ar("\u2000"),ar("\u2001"),ar("\u2002"),ar("\u2003"),ar("\u2004"),ar("\u2005"),ar("\u2006"),ar("\u2007"),ar("\u2008"),ar("\u2009"),ar("\u200A"),ar("\u2028"),ar("\u2029"),ar("\u202F"),ar("\u205F"),ar("\u3000"),ar("\uFEFF")]});var rPe,wk,nPe,np,gae=N(()=>{"use strict";KR();mae();rPe=/[0-9a-fA-F]/,wk=/[0-9]/,nPe=/[1-9]/,np=class{static{o(this,"RegExpParser")}constructor(){this.idx=0,this.input="",this.groupIdx=0}saveState(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}}restoreState(e){this.idx=e.idx,this.input=e.input,this.groupIdx=e.groupIdx}pattern(e){this.idx=0,this.input=e,this.groupIdx=0,this.consumeChar("/");let r=this.disjunction();this.consumeChar("/");let n={type:"Flags",loc:{begin:this.idx,end:e.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};for(;this.isRegExpFlag();)switch(this.popChar()){case"g":_g(n,"global");break;case"i":_g(n,"ignoreCase");break;case"m":_g(n,"multiLine");break;case"u":_g(n,"unicode");break;case"y":_g(n,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:r,loc:this.loc(0)}}disjunction(){let e=[],r=this.idx;for(e.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),e.push(this.alternative());return{type:"Disjunction",value:e,loc:this.loc(r)}}alternative(){let e=[],r=this.idx;for(;this.isTerm();)e.push(this.term());return{type:"Alternative",value:e,loc:this.loc(r)}}term(){return this.isAssertion()?this.assertion():this.atom()}assertion(){let e=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(e)};case"$":return{type:"EndAnchor",loc:this.loc(e)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(e)};case"B":return{type:"NonWordBoundary",loc:this.loc(e)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");let r;switch(this.popChar()){case"=":r="Lookahead";break;case"!":r="NegativeLookahead";break}rp(r);let n=this.disjunction();return this.consumeChar(")"),{type:r,value:n,loc:this.loc(e)}}return q2()}quantifier(e=!1){let r,n=this.idx;switch(this.popChar()){case"*":r={atLeast:0,atMost:1/0};break;case"+":r={atLeast:1,atMost:1/0};break;case"?":r={atLeast:0,atMost:1};break;case"{":let i=this.integerIncludingZero();switch(this.popChar()){case"}":r={atLeast:i,atMost:i};break;case",":let a;this.isDigit()?(a=this.integerIncludingZero(),r={atLeast:i,atMost:a}):r={atLeast:i,atMost:1/0},this.consumeChar("}");break}if(e===!0&&r===void 0)return;rp(r);break}if(!(e===!0&&r===void 0)&&rp(r))return this.peekChar(0)==="?"?(this.consumeChar("?"),r.greedy=!1):r.greedy=!0,r.type="Quantifier",r.loc=this.loc(n),r}atom(){let e,r=this.idx;switch(this.peekChar()){case".":e=this.dotAll();break;case"\\":e=this.atomEscape();break;case"[":e=this.characterClass();break;case"(":e=this.group();break}return e===void 0&&this.isPatternCharacter()&&(e=this.patternCharacter()),rp(e)?(e.loc=this.loc(r),this.isQuantifier()&&(e.quantifier=this.quantifier()),e):q2()}dotAll(){return this.consumeChar("."),{type:"Set",complement:!0,value:[ar(` +`),ar("\r"),ar("\u2028"),ar("\u2029")]}}atomEscape(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}}decimalEscapeAtom(){return{type:"GroupBackReference",value:this.positiveInteger()}}characterClassEscape(){let e,r=!1;switch(this.popChar()){case"d":e=Y2;break;case"D":e=Y2,r=!0;break;case"s":e=QR;break;case"S":e=QR,r=!0;break;case"w":e=X2;break;case"W":e=X2,r=!0;break}return rp(e)?{type:"Set",value:e,complement:r}:q2()}controlEscapeAtom(){let e;switch(this.popChar()){case"f":e=ar("\f");break;case"n":e=ar(` +`);break;case"r":e=ar("\r");break;case"t":e=ar(" ");break;case"v":e=ar("\v");break}return rp(e)?{type:"Character",value:e}:q2()}controlLetterEscapeAtom(){this.consumeChar("c");let e=this.popChar();if(/[a-zA-Z]/.test(e)===!1)throw Error("Invalid ");return{type:"Character",value:e.toUpperCase().charCodeAt(0)-64}}nulCharacterAtom(){return this.consumeChar("0"),{type:"Character",value:ar("\0")}}hexEscapeSequenceAtom(){return this.consumeChar("x"),this.parseHexDigits(2)}regExpUnicodeEscapeSequenceAtom(){return this.consumeChar("u"),this.parseHexDigits(4)}identityEscapeAtom(){let e=this.popChar();return{type:"Character",value:ar(e)}}classPatternCharacterAtom(){switch(this.peekChar()){case` +`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:let e=this.popChar();return{type:"Character",value:ar(e)}}}characterClass(){let e=[],r=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),r=!0);this.isClassAtom();){let n=this.classAtom(),i=n.type==="Character";if(jR(n)&&this.isRangeDash()){this.consumeChar("-");let a=this.classAtom(),s=a.type==="Character";if(jR(a)){if(a.value=this.input.length)throw Error("Unexpected end of input");this.idx++}loc(e){return{begin:e,end:this.idx}}}});var Mc,yae=N(()=>{"use strict";Mc=class{static{o(this,"BaseRegExpVisitor")}visitChildren(e){for(let r in e){let n=e[r];e.hasOwnProperty(r)&&(n.type!==void 0?this.visit(n):Array.isArray(n)&&n.forEach(i=>{this.visit(i)},this))}}visit(e){switch(e.type){case"Pattern":this.visitPattern(e);break;case"Flags":this.visitFlags(e);break;case"Disjunction":this.visitDisjunction(e);break;case"Alternative":this.visitAlternative(e);break;case"StartAnchor":this.visitStartAnchor(e);break;case"EndAnchor":this.visitEndAnchor(e);break;case"WordBoundary":this.visitWordBoundary(e);break;case"NonWordBoundary":this.visitNonWordBoundary(e);break;case"Lookahead":this.visitLookahead(e);break;case"NegativeLookahead":this.visitNegativeLookahead(e);break;case"Character":this.visitCharacter(e);break;case"Set":this.visitSet(e);break;case"Group":this.visitGroup(e);break;case"GroupBackReference":this.visitGroupBackReference(e);break;case"Quantifier":this.visitQuantifier(e);break}this.visitChildren(e)}visitPattern(e){}visitFlags(e){}visitDisjunction(e){}visitAlternative(e){}visitStartAnchor(e){}visitEndAnchor(e){}visitWordBoundary(e){}visitNonWordBoundary(e){}visitLookahead(e){}visitNegativeLookahead(e){}visitCharacter(e){}visitSet(e){}visitGroup(e){}visitGroupBackReference(e){}visitQuantifier(e){}}});var j2=N(()=>{"use strict";gae();yae()});var Tk={};hr(Tk,{NEWLINE_REGEXP:()=>JR,escapeRegExp:()=>ap,getCaseInsensitivePattern:()=>tN,getTerminalParts:()=>iPe,isMultilineComment:()=>eN,isWhitespace:()=>Dg,partialMatches:()=>rN,partialRegExp:()=>bae,whitespaceCharacters:()=>xae});function iPe(t){try{typeof t!="string"&&(t=t.source),t=`/${t}/`;let e=vae.pattern(t),r=[];for(let n of e.value.value)ip.reset(t),ip.visit(n),r.push({start:ip.startRegexp,end:ip.endRegex});return r}catch{return[]}}function eN(t){try{return typeof t=="string"&&(t=new RegExp(t)),t=t.toString(),ip.reset(t),ip.visit(vae.pattern(t)),ip.multiline}catch{return!1}}function Dg(t){let e=typeof t=="string"?new RegExp(t):t;return xae.some(r=>e.test(r))}function ap(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function tN(t){return Array.prototype.map.call(t,e=>/\w/.test(e)?`[${e.toLowerCase()}${e.toUpperCase()}]`:ap(e)).join("")}function rN(t,e){let r=bae(t),n=e.match(r);return!!n&&n[0].length>0}function bae(t){typeof t=="string"&&(t=new RegExp(t));let e=t,r=t.source,n=0;function i(){let a="",s;function l(h){a+=r.substr(n,h),n+=h}o(l,"appendRaw");function u(h){a+="(?:"+r.substr(n,h)+"|$)",n+=h}for(o(u,"appendOptional");n",n)-n+1);break;default:u(2);break}break;case"[":s=/\[(?:\\.|.)*?\]/g,s.lastIndex=n,s=s.exec(r)||[],u(s[0].length);break;case"|":case"^":case"$":case"*":case"+":case"?":l(1);break;case"{":s=/\{\d+,?\d*\}/g,s.lastIndex=n,s=s.exec(r),s?l(s[0].length):u(1);break;case"(":if(r[n+1]==="?")switch(r[n+2]){case":":a+="(?:",n+=3,a+=i()+"|$)";break;case"=":a+="(?=",n+=3,a+=i()+")";break;case"!":s=n,n+=3,i(),a+=r.substr(s,n-s);break;case"<":switch(r[n+3]){case"=":case"!":s=n,n+=4,i(),a+=r.substr(s,n-s);break;default:l(r.indexOf(">",n)-n+1),a+=i()+"|$)";break}break}else l(1),a+=i()+"|$)";break;case")":return++n,a;default:u(1);break}return a}return o(i,"process"),new RegExp(i(),t.flags)}var JR,vae,ZR,ip,xae,Lg=N(()=>{"use strict";j2();JR=/\r?\n/gm,vae=new np,ZR=class extends Mc{static{o(this,"TerminalRegExpVisitor")}constructor(){super(...arguments),this.isStarting=!0,this.endRegexpStack=[],this.multiline=!1}get endRegex(){return this.endRegexpStack.join("")}reset(e){this.multiline=!1,this.regex=e,this.startRegexp="",this.isStarting=!0,this.endRegexpStack=[]}visitGroup(e){e.quantifier&&(this.isStarting=!1,this.endRegexpStack=[])}visitCharacter(e){let r=String.fromCharCode(e.value);if(!this.multiline&&r===` +`&&(this.multiline=!0),e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let n=ap(r);this.endRegexpStack.push(n),this.isStarting&&(this.startRegexp+=n)}}visitSet(e){if(!this.multiline){let r=this.regex.substring(e.loc.begin,e.loc.end),n=new RegExp(r);this.multiline=!!` +`.match(n)}if(e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let r=this.regex.substring(e.loc.begin,e.loc.end);this.endRegexpStack.push(r),this.isStarting&&(this.startRegexp+=r)}}visitChildren(e){e.type==="Group"&&e.quantifier||super.visitChildren(e)}},ip=new ZR;o(iPe,"getTerminalParts");o(eN,"isMultilineComment");xae=`\f +\r \v \xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF`.split("");o(Dg,"isWhitespace");o(ap,"escapeRegExp");o(tN,"getCaseInsensitivePattern");o(rN,"partialMatches");o(bae,"partialRegExp")});var Ek={};hr(Ek,{findAssignment:()=>hN,findNameAssignment:()=>kk,findNodeForKeyword:()=>cN,findNodeForProperty:()=>Q2,findNodesForKeyword:()=>aPe,findNodesForKeywordInternal:()=>uN,findNodesForProperty:()=>oN,getActionAtElement:()=>Sae,getActionType:()=>Aae,getAllReachableRules:()=>K2,getCrossReferenceTerminal:()=>aN,getEntryRule:()=>wae,getExplicitRuleType:()=>Rg,getHiddenRules:()=>Tae,getRuleType:()=>fN,getRuleTypeName:()=>uPe,getTypeName:()=>J2,isArrayCardinality:()=>oPe,isArrayOperator:()=>lPe,isCommentTerminal:()=>sN,isDataType:()=>cPe,isDataTypeRule:()=>Z2,isOptionalCardinality:()=>sPe,terminalRegex:()=>Ng});function wae(t){return t.rules.find(e=>Oa(e)&&e.entry)}function Tae(t){return t.rules.filter(e=>so(e)&&e.hidden)}function K2(t,e){let r=new Set,n=wae(t);if(!n)return new Set(t.rules);let i=[n].concat(Tae(t));for(let s of i)kae(s,r,e);let a=new Set;for(let s of t.rules)(r.has(s.name)||so(s)&&s.hidden)&&a.add(s);return a}function kae(t,e,r){e.add(t.name),Nc(t).forEach(n=>{if(Il(n)||r&&gk(n)){let i=n.rule.ref;i&&!e.has(i.name)&&kae(i,e,r)}})}function aN(t){if(t.terminal)return t.terminal;if(t.type.ref){let e=kk(t.type.ref);return e?.terminal}}function sN(t){return t.hidden&&!Dg(Ng(t))}function oN(t,e){return!t||!e?[]:lN(t,e,t.astNode,!0)}function Q2(t,e,r){if(!t||!e)return;let n=lN(t,e,t.astNode,!0);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function lN(t,e,r,n){if(!n){let i=tp(t.grammarSource,Ml);if(i&&i.feature===e)return[t]}return Ll(t)&&t.astNode===r?t.content.flatMap(i=>lN(i,e,r,!1)):[]}function aPe(t,e){return t?uN(t,e,t?.astNode):[]}function cN(t,e,r){if(!t)return;let n=uN(t,e,t?.astNode);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function uN(t,e,r){if(t.astNode!==r)return[];if(Ho(t.grammarSource)&&t.grammarSource.value===e)return[t];let n=Kd(t).iterator(),i,a=[];do if(i=n.next(),!i.done){let s=i.value;s.astNode===r?Ho(s.grammarSource)&&s.grammarSource.value===e&&a.push(s):n.prune()}while(!i.done);return a}function hN(t){var e;let r=t.astNode;for(;r===((e=t.container)===null||e===void 0?void 0:e.astNode);){let n=tp(t.grammarSource,Ml);if(n)return n;t=t.container}}function kk(t){let e=t;return fk(e)&&(Mu(e.$container)?e=e.$container.$container:Oa(e.$container)?e=e.$container:Lc(e.$container)),Eae(t,e,new Map)}function Eae(t,e,r){var n;function i(a,s){let l;return tp(a,Ml)||(l=Eae(s,s,r)),r.set(t,l),l}if(o(i,"go"),r.has(t))return r.get(t);r.set(t,void 0);for(let a of Nc(e)){if(Ml(a)&&a.feature.toLowerCase()==="name")return r.set(t,a),a;if(Il(a)&&Oa(a.rule.ref))return i(a,a.rule.ref);if(pk(a)&&(!((n=a.typeRef)===null||n===void 0)&&n.ref))return i(a,a.typeRef.ref)}}function Sae(t){let e=t.$container;if(sf(e)){let r=e.elements,n=r.indexOf(t);for(let i=n-1;i>=0;i--){let a=r[i];if(Mu(a))return a;{let s=Nc(r[i]).find(Mu);if(s)return s}}}if(G2(e))return Sae(e)}function sPe(t,e){return t==="?"||t==="*"||sf(e)&&!!e.guardCondition}function oPe(t){return t==="*"||t==="+"}function lPe(t){return t==="+="}function Z2(t){return Cae(t,new Set)}function Cae(t,e){if(e.has(t))return!0;e.add(t);for(let r of Nc(t))if(Il(r)){if(!r.rule.ref||Oa(r.rule.ref)&&!Cae(r.rule.ref,e))return!1}else{if(Ml(r))return!1;if(Mu(r))return!1}return!!t.definition}function cPe(t){return iN(t.type,new Set)}function iN(t,e){if(e.has(t))return!0;if(e.add(t),DR(t))return!1;if(OR(t))return!1;if(BR(t))return t.types.every(r=>iN(r,e));if(pk(t)){if(t.primitiveType!==void 0)return!0;if(t.stringType!==void 0)return!0;if(t.typeRef!==void 0){let r=t.typeRef.ref;return V2(r)?iN(r.type,e):!1}else return!1}else return!1}function Rg(t){if(t.inferredType)return t.inferredType.name;if(t.dataType)return t.dataType;if(t.returnType){let e=t.returnType.ref;if(e){if(Oa(e))return e.name;if(dk(e)||V2(e))return e.name}}}function J2(t){var e;if(Oa(t))return Z2(t)?t.name:(e=Rg(t))!==null&&e!==void 0?e:t.name;if(dk(t)||V2(t)||PR(t))return t.name;if(Mu(t)){let r=Aae(t);if(r)return r}else if(fk(t))return t.name;throw new Error("Cannot get name of Unknown Type")}function Aae(t){var e;if(t.inferredType)return t.inferredType.name;if(!((e=t.type)===null||e===void 0)&&e.ref)return J2(t.type.ref)}function uPe(t){var e,r,n;return so(t)?(r=(e=t.type)===null||e===void 0?void 0:e.name)!==null&&r!==void 0?r:"string":Z2(t)?t.name:(n=Rg(t))!==null&&n!==void 0?n:t.name}function fN(t){var e,r,n;return so(t)?(r=(e=t.type)===null||e===void 0?void 0:e.name)!==null&&r!==void 0?r:"string":(n=Rg(t))!==null&&n!==void 0?n:t.name}function Ng(t){let e={s:!1,i:!1,u:!1},r=Mg(t.definition,e),n=Object.entries(e).filter(([,i])=>i).map(([i])=>i).join("");return new RegExp(r,n)}function Mg(t,e){if(VR(t))return hPe(t);if(UR(t))return fPe(t);if(FR(t))return mPe(t);if(gk(t)){let r=t.rule.ref;if(!r)throw new Error("Missing rule reference.");return Iu(Mg(r.definition),{cardinality:t.cardinality,lookahead:t.lookahead})}else{if(zR(t))return pPe(t);if(HR(t))return dPe(t);if(GR(t)){let r=t.regex.lastIndexOf("/"),n=t.regex.substring(1,r),i=t.regex.substring(r+1);return e&&(e.i=i.includes("i"),e.s=i.includes("s"),e.u=i.includes("u")),Iu(n,{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1})}else{if(WR(t))return Iu(dN,{cardinality:t.cardinality,lookahead:t.lookahead});throw new Error(`Invalid terminal element: ${t?.$type}`)}}}function hPe(t){return Iu(t.elements.map(e=>Mg(e)).join("|"),{cardinality:t.cardinality,lookahead:t.lookahead})}function fPe(t){return Iu(t.elements.map(e=>Mg(e)).join(""),{cardinality:t.cardinality,lookahead:t.lookahead})}function dPe(t){return Iu(`${dN}*?${Mg(t.terminal)}`,{cardinality:t.cardinality,lookahead:t.lookahead})}function pPe(t){return Iu(`(?!${Mg(t.terminal)})${dN}*?`,{cardinality:t.cardinality,lookahead:t.lookahead})}function mPe(t){return t.right?Iu(`[${nN(t.left)}-${nN(t.right)}]`,{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1}):Iu(nN(t.left),{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1})}function nN(t){return ap(t.value)}function Iu(t,e){var r;return(e.wrap!==!1||e.lookahead)&&(t=`(${(r=e.lookahead)!==null&&r!==void 0?r:""}${t})`),e.cardinality?`${t}${e.cardinality}`:t}var dN,Ol=N(()=>{"use strict";uk();Rc();Rl();is();Nl();Lg();o(wae,"getEntryRule");o(Tae,"getHiddenRules");o(K2,"getAllReachableRules");o(kae,"ruleDfs");o(aN,"getCrossReferenceTerminal");o(sN,"isCommentTerminal");o(oN,"findNodesForProperty");o(Q2,"findNodeForProperty");o(lN,"findNodesForPropertyInternal");o(aPe,"findNodesForKeyword");o(cN,"findNodeForKeyword");o(uN,"findNodesForKeywordInternal");o(hN,"findAssignment");o(kk,"findNameAssignment");o(Eae,"findNameAssignmentInternal");o(Sae,"getActionAtElement");o(sPe,"isOptionalCardinality");o(oPe,"isArrayCardinality");o(lPe,"isArrayOperator");o(Z2,"isDataTypeRule");o(Cae,"isDataTypeRuleInternal");o(cPe,"isDataType");o(iN,"isDataTypeInternal");o(Rg,"getExplicitRuleType");o(J2,"getTypeName");o(Aae,"getActionType");o(uPe,"getRuleTypeName");o(fN,"getRuleType");o(Ng,"terminalRegex");dN=/[\s\S]/.source;o(Mg,"abstractElementToRegex");o(hPe,"terminalAlternativesToRegex");o(fPe,"terminalGroupToRegex");o(dPe,"untilTokenToRegex");o(pPe,"negateTokenToRegex");o(mPe,"characterRangeToRegex");o(nN,"keywordToRegex");o(Iu,"withCardinality")});function pN(t){let e=[],r=t.Grammar;for(let n of r.rules)so(n)&&sN(n)&&eN(Ng(n))&&e.push(n.name);return{multilineCommentRules:e,nameRegexp:lk}}var mN=N(()=>{"use strict";Nl();Ol();Lg();Rc();o(pN,"createGrammarConfig")});var gN=N(()=>{"use strict"});function Ig(t){console&&console.error&&console.error(`Error: ${t}`)}function ex(t){console&&console.warn&&console.warn(`Warning: ${t}`)}var _ae=N(()=>{"use strict";o(Ig,"PRINT_ERROR");o(ex,"PRINT_WARNING")});function tx(t){let e=new Date().getTime(),r=t();return{time:new Date().getTime()-e,value:r}}var Dae=N(()=>{"use strict";o(tx,"timer")});function rx(t){function e(){}o(e,"FakeConstructor"),e.prototype=t;let r=new e;function n(){return typeof r.bar}return o(n,"fakeAccess"),n(),n(),t;(0,eval)(t)}var Lae=N(()=>{"use strict";o(rx,"toFastProperties")});var Og=N(()=>{"use strict";_ae();Dae();Lae()});function gPe(t){return yPe(t)?t.LABEL:t.name}function yPe(t){return yi(t.LABEL)&&t.LABEL!==""}function Sk(t){return Je(t,Pg)}function Pg(t){function e(r){return Je(r,Pg)}if(o(e,"convertDefinition"),t instanceof on){let r={type:"NonTerminal",name:t.nonTerminalName,idx:t.idx};return yi(t.label)&&(r.label=t.label),r}else{if(t instanceof Dn)return{type:"Alternative",definition:e(t.definition)};if(t instanceof ln)return{type:"Option",idx:t.idx,definition:e(t.definition)};if(t instanceof Ln)return{type:"RepetitionMandatory",idx:t.idx,definition:e(t.definition)};if(t instanceof Rn)return{type:"RepetitionMandatoryWithSeparator",idx:t.idx,separator:Pg(new kr({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof wn)return{type:"RepetitionWithSeparator",idx:t.idx,separator:Pg(new kr({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof Or)return{type:"Repetition",idx:t.idx,definition:e(t.definition)};if(t instanceof Tn)return{type:"Alternation",idx:t.idx,definition:e(t.definition)};if(t instanceof kr){let r={type:"Terminal",name:t.terminalType.name,label:gPe(t.terminalType),idx:t.idx};yi(t.label)&&(r.terminalLabel=t.label);let n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(r.pattern=zo(n)?n.source:n),r}else{if(t instanceof as)return{type:"Rule",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error("non exhaustive match")}}}var oo,on,as,Dn,ln,Ln,Rn,Or,wn,Tn,kr,Ck=N(()=>{"use strict";qt();o(gPe,"tokenLabel");o(yPe,"hasTokenLabel");oo=class{static{o(this,"AbstractProduction")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){this._definition=e}accept(e){e.visit(this),Ae(this.definition,r=>{r.accept(e)})}},on=class extends oo{static{o(this,"NonTerminal")}constructor(e){super([]),this.idx=1,ma(this,Os(e,r=>r!==void 0))}set definition(e){}get definition(){return this.referencedRule!==void 0?this.referencedRule.definition:[]}accept(e){e.visit(this)}},as=class extends oo{static{o(this,"Rule")}constructor(e){super(e.definition),this.orgText="",ma(this,Os(e,r=>r!==void 0))}},Dn=class extends oo{static{o(this,"Alternative")}constructor(e){super(e.definition),this.ignoreAmbiguities=!1,ma(this,Os(e,r=>r!==void 0))}},ln=class extends oo{static{o(this,"Option")}constructor(e){super(e.definition),this.idx=1,ma(this,Os(e,r=>r!==void 0))}},Ln=class extends oo{static{o(this,"RepetitionMandatory")}constructor(e){super(e.definition),this.idx=1,ma(this,Os(e,r=>r!==void 0))}},Rn=class extends oo{static{o(this,"RepetitionMandatoryWithSeparator")}constructor(e){super(e.definition),this.idx=1,ma(this,Os(e,r=>r!==void 0))}},Or=class extends oo{static{o(this,"Repetition")}constructor(e){super(e.definition),this.idx=1,ma(this,Os(e,r=>r!==void 0))}},wn=class extends oo{static{o(this,"RepetitionWithSeparator")}constructor(e){super(e.definition),this.idx=1,ma(this,Os(e,r=>r!==void 0))}},Tn=class extends oo{static{o(this,"Alternation")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){super(e.definition),this.idx=1,this.ignoreAmbiguities=!1,this.hasPredicates=!1,ma(this,Os(e,r=>r!==void 0))}},kr=class{static{o(this,"Terminal")}constructor(e){this.idx=1,ma(this,Os(e,r=>r!==void 0))}accept(e){e.visit(this)}};o(Sk,"serializeGrammar");o(Pg,"serializeProduction")});var ss,Rae=N(()=>{"use strict";Ck();ss=class{static{o(this,"GAstVisitor")}visit(e){let r=e;switch(r.constructor){case on:return this.visitNonTerminal(r);case Dn:return this.visitAlternative(r);case ln:return this.visitOption(r);case Ln:return this.visitRepetitionMandatory(r);case Rn:return this.visitRepetitionMandatoryWithSeparator(r);case wn:return this.visitRepetitionWithSeparator(r);case Or:return this.visitRepetition(r);case Tn:return this.visitAlternation(r);case kr:return this.visitTerminal(r);case as:return this.visitRule(r);default:throw Error("non exhaustive match")}}visitNonTerminal(e){}visitAlternative(e){}visitOption(e){}visitRepetition(e){}visitRepetitionMandatory(e){}visitRepetitionMandatoryWithSeparator(e){}visitRepetitionWithSeparator(e){}visitAlternation(e){}visitTerminal(e){}visitRule(e){}}});function yN(t){return t instanceof Dn||t instanceof ln||t instanceof Or||t instanceof Ln||t instanceof Rn||t instanceof wn||t instanceof kr||t instanceof as}function sp(t,e=[]){return t instanceof ln||t instanceof Or||t instanceof wn?!0:t instanceof Tn?A2(t.definition,n=>sp(n,e)):t instanceof on&&qn(e,t)?!1:t instanceof oo?(t instanceof on&&e.push(t),Ma(t.definition,n=>sp(n,e))):!1}function vN(t){return t instanceof Tn}function Bs(t){if(t instanceof on)return"SUBRULE";if(t instanceof ln)return"OPTION";if(t instanceof Tn)return"OR";if(t instanceof Ln)return"AT_LEAST_ONE";if(t instanceof Rn)return"AT_LEAST_ONE_SEP";if(t instanceof wn)return"MANY_SEP";if(t instanceof Or)return"MANY";if(t instanceof kr)return"CONSUME";throw Error("non exhaustive match")}var Nae=N(()=>{"use strict";qt();Ck();o(yN,"isSequenceProd");o(sp,"isOptionalProd");o(vN,"isBranchingProd");o(Bs,"getProductionDslName")});var os=N(()=>{"use strict";Ck();Rae();Nae()});function Mae(t,e,r){return[new ln({definition:[new kr({terminalType:t.separator})].concat(t.definition)})].concat(e,r)}var Ou,Ak=N(()=>{"use strict";qt();os();Ou=class{static{o(this,"RestWalker")}walk(e,r=[]){Ae(e.definition,(n,i)=>{let a=gi(e.definition,i+1);if(n instanceof on)this.walkProdRef(n,a,r);else if(n instanceof kr)this.walkTerminal(n,a,r);else if(n instanceof Dn)this.walkFlat(n,a,r);else if(n instanceof ln)this.walkOption(n,a,r);else if(n instanceof Ln)this.walkAtLeastOne(n,a,r);else if(n instanceof Rn)this.walkAtLeastOneSep(n,a,r);else if(n instanceof wn)this.walkManySep(n,a,r);else if(n instanceof Or)this.walkMany(n,a,r);else if(n instanceof Tn)this.walkOr(n,a,r);else throw Error("non exhaustive match")})}walkTerminal(e,r,n){}walkProdRef(e,r,n){}walkFlat(e,r,n){let i=r.concat(n);this.walk(e,i)}walkOption(e,r,n){let i=r.concat(n);this.walk(e,i)}walkAtLeastOne(e,r,n){let i=[new ln({definition:e.definition})].concat(r,n);this.walk(e,i)}walkAtLeastOneSep(e,r,n){let i=Mae(e,r,n);this.walk(e,i)}walkMany(e,r,n){let i=[new ln({definition:e.definition})].concat(r,n);this.walk(e,i)}walkManySep(e,r,n){let i=Mae(e,r,n);this.walk(e,i)}walkOr(e,r,n){let i=r.concat(n);Ae(e.definition,a=>{let s=new Dn({definition:[a]});this.walk(s,i)})}};o(Mae,"restForRepetitionWithSeparator")});function op(t){if(t instanceof on)return op(t.referencedRule);if(t instanceof kr)return bPe(t);if(yN(t))return vPe(t);if(vN(t))return xPe(t);throw Error("non exhaustive match")}function vPe(t){let e=[],r=t.definition,n=0,i=r.length>n,a,s=!0;for(;i&&s;)a=r[n],s=sp(a),e=e.concat(op(a)),n=n+1,i=r.length>n;return Bm(e)}function xPe(t){let e=Je(t.definition,r=>op(r));return Bm(qr(e))}function bPe(t){return[t.terminalType]}var xN=N(()=>{"use strict";qt();os();o(op,"first");o(vPe,"firstForSequence");o(xPe,"firstForBranching");o(bPe,"firstForTerminal")});var _k,bN=N(()=>{"use strict";_k="_~IN~_"});function Iae(t){let e={};return Ae(t,r=>{let n=new wN(r).startWalking();ma(e,n)}),e}function wPe(t,e){return t.name+e+_k}var wN,Oae=N(()=>{"use strict";Ak();xN();qt();bN();os();wN=class extends Ou{static{o(this,"ResyncFollowsWalker")}constructor(e){super(),this.topProd=e,this.follows={}}startWalking(){return this.walk(this.topProd),this.follows}walkTerminal(e,r,n){}walkProdRef(e,r,n){let i=wPe(e.referencedRule,e.idx)+this.topProd.name,a=r.concat(n),s=new Dn({definition:a}),l=op(s);this.follows[i]=l}};o(Iae,"computeAllProdsFollows");o(wPe,"buildBetweenProdsFollowPrefix")});function Bg(t){let e=t.toString();if(Dk.hasOwnProperty(e))return Dk[e];{let r=TPe.pattern(e);return Dk[e]=r,r}}function Pae(){Dk={}}var Dk,TPe,Lk=N(()=>{"use strict";j2();Dk={},TPe=new np;o(Bg,"getRegExpAst");o(Pae,"clearRegExpParserCache")});function $ae(t,e=!1){try{let r=Bg(t);return TN(r.value,{},r.flags.ignoreCase)}catch(r){if(r.message===Fae)e&&ex(`${nx} Unable to optimize: < ${t.toString()} > + Complement Sets cannot be automatically optimized. + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{let n="";e&&(n=` + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),Ig(`${nx} + Failed parsing: < ${t.toString()} > + Using the @chevrotain/regexp-to-ast library + Please open an issue at: https://github.com/chevrotain/chevrotain/issues`+n)}}return[]}function TN(t,e,r){switch(t.type){case"Disjunction":for(let i=0;i{if(typeof u=="number")Rk(u,e,r);else{let h=u;if(r===!0)for(let f=h.from;f<=h.to;f++)Rk(f,e,r);else{for(let f=h.from;f<=h.to&&f=Fg){let f=h.from>=Fg?h.from:Fg,d=h.to,p=Ic(f),m=Ic(d);for(let g=p;g<=m;g++)e[g]=g}}}});break;case"Group":TN(s.value,e,r);break;default:throw Error("Non Exhaustive Match")}let l=s.quantifier!==void 0&&s.quantifier.atLeast===0;if(s.type==="Group"&&kN(s)===!1||s.type!=="Group"&&l===!1)break}break;default:throw Error("non exhaustive match!")}return br(e)}function Rk(t,e,r){let n=Ic(t);e[n]=n,r===!0&&kPe(t,e)}function kPe(t,e){let r=String.fromCharCode(t),n=r.toUpperCase();if(n!==r){let i=Ic(n.charCodeAt(0));e[i]=i}else{let i=r.toLowerCase();if(i!==r){let a=Ic(i.charCodeAt(0));e[a]=a}}}function Bae(t,e){return ns(t.value,r=>{if(typeof r=="number")return qn(e,r);{let n=r;return ns(e,i=>n.from<=i&&i<=n.to)!==void 0}})}function kN(t){let e=t.quantifier;return e&&e.atLeast===0?!0:t.value?Pt(t.value)?Ma(t.value,kN):kN(t.value):!1}function Nk(t,e){if(e instanceof RegExp){let r=Bg(e),n=new EN(t);return n.visit(r),n.found}else return ns(e,r=>qn(t,r.charCodeAt(0)))!==void 0}var Fae,nx,EN,zae=N(()=>{"use strict";j2();qt();Og();Lk();SN();Fae="Complement Sets are not supported for first char optimization",nx=`Unable to use "first char" lexer optimizations: +`;o($ae,"getOptimizedStartCodesIndices");o(TN,"firstCharOptimizedIndices");o(Rk,"addOptimizedIdxToResult");o(kPe,"handleIgnoreCase");o(Bae,"findCode");o(kN,"isWholeOptional");EN=class extends Mc{static{o(this,"CharCodeFinder")}constructor(e){super(),this.targetCharCodes=e,this.found=!1}visitChildren(e){if(this.found!==!0){switch(e.type){case"Lookahead":this.visitLookahead(e);return;case"NegativeLookahead":this.visitNegativeLookahead(e);return}super.visitChildren(e)}}visitCharacter(e){qn(this.targetCharCodes,e.value)&&(this.found=!0)}visitSet(e){e.complement?Bae(e,this.targetCharCodes)===void 0&&(this.found=!0):Bae(e,this.targetCharCodes)!==void 0&&(this.found=!0)}};o(Nk,"canMatchCharCode")});function Uae(t,e){e=Qh(e,{useSticky:AN,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` +`],tracer:o((b,w)=>w(),"tracer")});let r=e.tracer;r("initCharCodeToOptimizedIndexMap",()=>{GPe()});let n;r("Reject Lexer.NA",()=>{n=Jh(t,b=>b[lp]===Xn.NA)});let i=!1,a;r("Transform Patterns",()=>{i=!1,a=Je(n,b=>{let w=b[lp];if(zo(w)){let C=w.source;return C.length===1&&C!=="^"&&C!=="$"&&C!=="."&&!w.ignoreCase?C:C.length===2&&C[0]==="\\"&&!qn(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],C[1])?C[1]:e.useSticky?Vae(w):Gae(w)}else{if(Si(w))return i=!0,{exec:w};if(typeof w=="object")return i=!0,w;if(typeof w=="string"){if(w.length===1)return w;{let C=w.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),T=new RegExp(C);return e.useSticky?Vae(T):Gae(T)}}else throw Error("non exhaustive match")}})});let s,l,u,h,f;r("misc mapping",()=>{s=Je(n,b=>b.tokenTypeIdx),l=Je(n,b=>{let w=b.GROUP;if(w!==Xn.SKIPPED){if(yi(w))return w;if(pr(w))return!1;throw Error("non exhaustive match")}}),u=Je(n,b=>{let w=b.LONGER_ALT;if(w)return Pt(w)?Je(w,T=>UT(n,T)):[UT(n,w)]}),h=Je(n,b=>b.PUSH_MODE),f=Je(n,b=>Bt(b,"POP_MODE"))});let d;r("Line Terminator Handling",()=>{let b=Qae(e.lineTerminatorCharacters);d=Je(n,w=>!1),e.positionTracking!=="onlyOffset"&&(d=Je(n,w=>Bt(w,"LINE_BREAKS")?!!w.LINE_BREAKS:Kae(w,b)===!1&&Nk(b,w.PATTERN)))});let p,m,g,y;r("Misc Mapping #2",()=>{p=Je(n,Xae),m=Je(a,$Pe),g=Xr(n,(b,w)=>{let C=w.GROUP;return yi(C)&&C!==Xn.SKIPPED&&(b[C]=[]),b},{}),y=Je(a,(b,w)=>({pattern:a[w],longerAlt:u[w],canLineTerminator:d[w],isCustom:p[w],short:m[w],group:l[w],push:h[w],pop:f[w],tokenTypeIdx:s[w],tokenType:n[w]}))});let v=!0,x=[];return e.safeMode||r("First Char Optimization",()=>{x=Xr(n,(b,w,C)=>{if(typeof w.PATTERN=="string"){let T=w.PATTERN.charCodeAt(0),E=Ic(T);CN(b,E,y[C])}else if(Pt(w.START_CHARS_HINT)){let T;Ae(w.START_CHARS_HINT,E=>{let A=typeof E=="string"?E.charCodeAt(0):E,S=Ic(A);T!==S&&(T=S,CN(b,S,y[C]))})}else if(zo(w.PATTERN))if(w.PATTERN.unicode)v=!1,e.ensureOptimizations&&Ig(`${nx} Unable to analyze < ${w.PATTERN.toString()} > pattern. + The regexp unicode flag is not currently supported by the regexp-to-ast library. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{let T=$ae(w.PATTERN,e.ensureOptimizations);ur(T)&&(v=!1),Ae(T,E=>{CN(b,E,y[C])})}else e.ensureOptimizations&&Ig(`${nx} TokenType: <${w.name}> is using a custom token pattern without providing parameter. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),v=!1;return b},[])}),{emptyGroups:g,patternIdxToConfig:y,charCodeToPatternIdxToConfig:x,hasCustom:i,canBeOptimized:v}}function Hae(t,e){let r=[],n=SPe(t);r=r.concat(n.errors);let i=CPe(n.valid),a=i.valid;return r=r.concat(i.errors),r=r.concat(EPe(a)),r=r.concat(IPe(a)),r=r.concat(OPe(a,e)),r=r.concat(PPe(a)),r}function EPe(t){let e=[],r=Yr(t,n=>zo(n[lp]));return e=e.concat(_Pe(r)),e=e.concat(RPe(r)),e=e.concat(NPe(r)),e=e.concat(MPe(r)),e=e.concat(DPe(r)),e}function SPe(t){let e=Yr(t,i=>!Bt(i,lp)),r=Je(e,i=>({message:"Token Type: ->"+i.name+"<- missing static 'PATTERN' property",type:Yn.MISSING_PATTERN,tokenTypes:[i]})),n=Zh(t,e);return{errors:r,valid:n}}function CPe(t){let e=Yr(t,i=>{let a=i[lp];return!zo(a)&&!Si(a)&&!Bt(a,"exec")&&!yi(a)}),r=Je(e,i=>({message:"Token Type: ->"+i.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:Yn.INVALID_PATTERN,tokenTypes:[i]})),n=Zh(t,e);return{errors:r,valid:n}}function _Pe(t){class e extends Mc{static{o(this,"EndAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitEndAnchor(a){this.found=!0}}let r=Yr(t,i=>{let a=i.PATTERN;try{let s=Bg(a),l=new e;return l.visit(s),l.found}catch{return APe.test(a.source)}});return Je(r,i=>({message:`Unexpected RegExp Anchor Error: + Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain end of input anchor '$' + See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Yn.EOI_ANCHOR_FOUND,tokenTypes:[i]}))}function DPe(t){let e=Yr(t,n=>n.PATTERN.test(""));return Je(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' must not match an empty string",type:Yn.EMPTY_MATCH_PATTERN,tokenTypes:[n]}))}function RPe(t){class e extends Mc{static{o(this,"StartAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitStartAnchor(a){this.found=!0}}let r=Yr(t,i=>{let a=i.PATTERN;try{let s=Bg(a),l=new e;return l.visit(s),l.found}catch{return LPe.test(a.source)}});return Je(r,i=>({message:`Unexpected RegExp Anchor Error: + Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain start of input anchor '^' + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:Yn.SOI_ANCHOR_FOUND,tokenTypes:[i]}))}function NPe(t){let e=Yr(t,n=>{let i=n[lp];return i instanceof RegExp&&(i.multiline||i.global)});return Je(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:Yn.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[n]}))}function MPe(t){let e=[],r=Je(t,a=>Xr(t,(s,l)=>(a.PATTERN.source===l.PATTERN.source&&!qn(e,l)&&l.PATTERN!==Xn.NA&&(e.push(l),s.push(l)),s),[]));r=Tc(r);let n=Yr(r,a=>a.length>1);return Je(n,a=>{let s=Je(a,u=>u.name);return{message:`The same RegExp pattern ->${ia(a).PATTERN}<-has been used in all of the following Token Types: ${s.join(", ")} <-`,type:Yn.DUPLICATE_PATTERNS_FOUND,tokenTypes:a}})}function IPe(t){let e=Yr(t,n=>{if(!Bt(n,"GROUP"))return!1;let i=n.GROUP;return i!==Xn.SKIPPED&&i!==Xn.NA&&!yi(i)});return Je(e,n=>({message:"Token Type: ->"+n.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:Yn.INVALID_GROUP_TYPE_FOUND,tokenTypes:[n]}))}function OPe(t,e){let r=Yr(t,i=>i.PUSH_MODE!==void 0&&!qn(e,i.PUSH_MODE));return Je(r,i=>({message:`Token Type: ->${i.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${i.PUSH_MODE}<-which does not exist`,type:Yn.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[i]}))}function PPe(t){let e=[],r=Xr(t,(n,i,a)=>{let s=i.PATTERN;return s===Xn.NA||(yi(s)?n.push({str:s,idx:a,tokenType:i}):zo(s)&&FPe(s)&&n.push({str:s.source,idx:a,tokenType:i})),n},[]);return Ae(t,(n,i)=>{Ae(r,({str:a,idx:s,tokenType:l})=>{if(i${l.name}<- can never be matched. +Because it appears AFTER the Token Type ->${n.name}<-in the lexer's definition. +See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:u,type:Yn.UNREACHABLE_PATTERN,tokenTypes:[n,l]})}})}),e}function BPe(t,e){if(zo(e)){let r=e.exec(t);return r!==null&&r.index===0}else{if(Si(e))return e(t,0,[],{});if(Bt(e,"exec"))return e.exec(t,0,[],{});if(typeof e=="string")return e===t;throw Error("non exhaustive match")}}function FPe(t){return ns([".","\\","[","]","|","^","$","(",")","?","*","+","{"],r=>t.source.indexOf(r)!==-1)===void 0}function Gae(t){let e=t.ignoreCase?"i":"";return new RegExp(`^(?:${t.source})`,e)}function Vae(t){let e=t.ignoreCase?"iy":"y";return new RegExp(`${t.source}`,e)}function Wae(t,e,r){let n=[];return Bt(t,$g)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+$g+`> property in its definition +`,type:Yn.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),Bt(t,Mk)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+Mk+`> property in its definition +`,type:Yn.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),Bt(t,Mk)&&Bt(t,$g)&&!Bt(t.modes,t.defaultMode)&&n.push({message:`A MultiMode Lexer cannot be initialized with a ${$g}: <${t.defaultMode}>which does not exist +`,type:Yn.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),Bt(t,Mk)&&Ae(t.modes,(i,a)=>{Ae(i,(s,l)=>{if(pr(s))n.push({message:`A Lexer cannot be initialized using an undefined Token Type. Mode:<${a}> at index: <${l}> +`,type:Yn.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if(Bt(s,"LONGER_ALT")){let u=Pt(s.LONGER_ALT)?s.LONGER_ALT:[s.LONGER_ALT];Ae(u,h=>{!pr(h)&&!qn(i,h)&&n.push({message:`A MultiMode Lexer cannot be initialized with a longer_alt <${h.name}> on token <${s.name}> outside of mode <${a}> +`,type:Yn.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),n}function qae(t,e,r){let n=[],i=!1,a=Tc(qr(br(t.modes))),s=Jh(a,u=>u[lp]===Xn.NA),l=Qae(r);return e&&Ae(s,u=>{let h=Kae(u,l);if(h!==!1){let d={message:zPe(u,h),type:h.issue,tokenType:u};n.push(d)}else Bt(u,"LINE_BREAKS")?u.LINE_BREAKS===!0&&(i=!0):Nk(l,u.PATTERN)&&(i=!0)}),e&&!i&&n.push({message:`Warning: No LINE_BREAKS Found. + This Lexer has been defined to track line and column information, + But none of the Token Types can be identified as matching a line terminator. + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS + for details.`,type:Yn.NO_LINE_BREAKS_FLAGS}),n}function Yae(t){let e={},r=zr(t);return Ae(r,n=>{let i=t[n];if(Pt(i))e[n]=[];else throw Error("non exhaustive match")}),e}function Xae(t){let e=t.PATTERN;if(zo(e))return!1;if(Si(e))return!0;if(Bt(e,"exec"))return!0;if(yi(e))return!1;throw Error("non exhaustive match")}function $Pe(t){return yi(t)&&t.length===1?t.charCodeAt(0):!1}function Kae(t,e){if(Bt(t,"LINE_BREAKS"))return!1;if(zo(t.PATTERN)){try{Nk(e,t.PATTERN)}catch(r){return{issue:Yn.IDENTIFY_TERMINATOR,errMsg:r.message}}return!1}else{if(yi(t.PATTERN))return!1;if(Xae(t))return{issue:Yn.CUSTOM_LINE_BREAK};throw Error("non exhaustive match")}}function zPe(t,e){if(e.issue===Yn.IDENTIFY_TERMINATOR)return`Warning: unable to identify line terminator usage in pattern. + The problem is in the <${t.name}> Token Type + Root cause: ${e.errMsg}. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR`;if(e.issue===Yn.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. + The problem is in the <${t.name}> Token Type + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK`;throw Error("non exhaustive match")}function Qae(t){return Je(t,r=>yi(r)?r.charCodeAt(0):r)}function CN(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}function Ic(t){return t255?255+~~(t/255):t}}var lp,$g,Mk,AN,APe,LPe,jae,Fg,Ik,SN=N(()=>{"use strict";j2();ix();qt();Og();zae();Lk();lp="PATTERN",$g="defaultMode",Mk="modes",AN=typeof new RegExp("(?:)").sticky=="boolean";o(Uae,"analyzeTokenTypes");o(Hae,"validatePatterns");o(EPe,"validateRegExpPattern");o(SPe,"findMissingPatterns");o(CPe,"findInvalidPatterns");APe=/[^\\][$]/;o(_Pe,"findEndOfInputAnchor");o(DPe,"findEmptyMatchRegExps");LPe=/[^\\[][\^]|^\^/;o(RPe,"findStartOfInputAnchor");o(NPe,"findUnsupportedFlags");o(MPe,"findDuplicatePatterns");o(IPe,"findInvalidGroupType");o(OPe,"findModesThatDoNotExist");o(PPe,"findUnreachablePatterns");o(BPe,"testTokenType");o(FPe,"noMetaChar");o(Gae,"addStartOfInput");o(Vae,"addStickyFlag");o(Wae,"performRuntimeChecks");o(qae,"performWarningRuntimeChecks");o(Yae,"cloneEmptyGroups");o(Xae,"isCustomPattern");o($Pe,"isShortPattern");jae={test:o(function(t){let e=t.length;for(let r=this.lastIndex;r{r.isParent=r.categoryMatches.length>0})}function VPe(t){let e=an(t),r=t,n=!0;for(;n;){r=Tc(qr(Je(r,a=>a.CATEGORIES)));let i=Zh(r,e);e=e.concat(i),ur(i)?n=!1:r=i}return e}function UPe(t){Ae(t,e=>{_N(e)||(ese[Zae]=e,e.tokenTypeIdx=Zae++),Jae(e)&&!Pt(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Jae(e)||(e.CATEGORIES=[]),qPe(e)||(e.categoryMatches=[]),YPe(e)||(e.categoryMatchesMap={})})}function HPe(t){Ae(t,e=>{e.categoryMatches=[],Ae(e.categoryMatchesMap,(r,n)=>{e.categoryMatches.push(ese[n].tokenTypeIdx)})})}function WPe(t){Ae(t,e=>{tse([],e)})}function tse(t,e){Ae(t,r=>{e.categoryMatchesMap[r.tokenTypeIdx]=!0}),Ae(e.CATEGORIES,r=>{let n=t.concat(e);qn(n,r)||tse(n,r)})}function _N(t){return Bt(t,"tokenTypeIdx")}function Jae(t){return Bt(t,"CATEGORIES")}function qPe(t){return Bt(t,"categoryMatches")}function YPe(t){return Bt(t,"categoryMatchesMap")}function rse(t){return Bt(t,"tokenTypeIdx")}var Zae,ese,cp=N(()=>{"use strict";qt();o(Pu,"tokenStructuredMatcher");o(zg,"tokenStructuredMatcherNoCategories");Zae=1,ese={};o(Bu,"augmentTokenTypes");o(VPe,"expandCategories");o(UPe,"assignTokenDefaultProps");o(HPe,"assignCategoriesTokensProp");o(WPe,"assignCategoriesMapProp");o(tse,"singleAssignCategoriesToksMap");o(_N,"hasShortKeyProperty");o(Jae,"hasCategoriesProperty");o(qPe,"hasExtendingTokensTypesProperty");o(YPe,"hasExtendingTokensTypesMapProperty");o(rse,"isTokenType")});var Gg,DN=N(()=>{"use strict";Gg={buildUnableToPopLexerModeMessage(t){return`Unable to pop Lexer Mode after encountering Token ->${t.image}<- The Mode Stack is empty`},buildUnexpectedCharactersMessage(t,e,r,n,i){return`unexpected character: ->${t.charAt(e)}<- at offset: ${e}, skipped ${r} characters.`}}});var Yn,ax,Xn,ix=N(()=>{"use strict";SN();qt();Og();cp();DN();Lk();(function(t){t[t.MISSING_PATTERN=0]="MISSING_PATTERN",t[t.INVALID_PATTERN=1]="INVALID_PATTERN",t[t.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",t[t.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",t[t.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",t[t.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",t[t.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",t[t.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",t[t.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",t[t.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",t[t.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",t[t.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",t[t.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",t[t.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE"})(Yn||(Yn={}));ax={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` +`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:Gg,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(ax);Xn=class{static{o(this,"Lexer")}constructor(e,r=ax){if(this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=(i,a)=>{if(this.traceInitPerf===!0){this.traceInitIndent++;let s=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${i}>`);let{time:l,value:u}=tx(a),h=l>10?console.warn:console.log;return this.traceInitIndent time: ${l}ms`),this.traceInitIndent--,u}else return a()},typeof r=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. +a boolean 2nd argument is no longer supported`);this.config=ma({},ax,r);let n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",()=>{let i,a=!0;this.TRACE_INIT("Lexer Config handling",()=>{if(this.config.lineTerminatorsPattern===ax.lineTerminatorsPattern)this.config.lineTerminatorsPattern=jae;else if(this.config.lineTerminatorCharacters===ax.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(r.safeMode&&r.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');this.trackStartLines=/full|onlyStart/i.test(this.config.positionTracking),this.trackEndLines=/full/i.test(this.config.positionTracking),Pt(e)?i={modes:{defaultMode:an(e)},defaultMode:$g}:(a=!1,i=an(e))}),this.config.skipValidations===!1&&(this.TRACE_INIT("performRuntimeChecks",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(Wae(i,this.trackStartLines,this.config.lineTerminatorCharacters))}),this.TRACE_INIT("performWarningRuntimeChecks",()=>{this.lexerDefinitionWarning=this.lexerDefinitionWarning.concat(qae(i,this.trackStartLines,this.config.lineTerminatorCharacters))})),i.modes=i.modes?i.modes:{},Ae(i.modes,(l,u)=>{i.modes[u]=Jh(l,h=>pr(h))});let s=zr(i.modes);if(Ae(i.modes,(l,u)=>{this.TRACE_INIT(`Mode: <${u}> processing`,()=>{if(this.modes.push(u),this.config.skipValidations===!1&&this.TRACE_INIT("validatePatterns",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(Hae(l,s))}),ur(this.lexerDefinitionErrors)){Bu(l);let h;this.TRACE_INIT("analyzeTokenTypes",()=>{h=Uae(l,{lineTerminatorCharacters:this.config.lineTerminatorCharacters,positionTracking:r.positionTracking,ensureOptimizations:r.ensureOptimizations,safeMode:r.safeMode,tracer:this.TRACE_INIT})}),this.patternIdxToConfig[u]=h.patternIdxToConfig,this.charCodeToPatternIdxToConfig[u]=h.charCodeToPatternIdxToConfig,this.emptyGroups=ma({},this.emptyGroups,h.emptyGroups),this.hasCustom=h.hasCustom||this.hasCustom,this.canModeBeOptimized[u]=h.canBeOptimized}})}),this.defaultMode=i.defaultMode,!ur(this.lexerDefinitionErrors)&&!this.config.deferDefinitionErrorsHandling){let u=Je(this.lexerDefinitionErrors,h=>h.message).join(`----------------------- +`);throw new Error(`Errors detected in definition of Lexer: +`+u)}Ae(this.lexerDefinitionWarning,l=>{ex(l.message)}),this.TRACE_INIT("Choosing sub-methods implementations",()=>{if(AN?(this.chopInput=ta,this.match=this.matchWithTest):(this.updateLastIndex=ni,this.match=this.matchWithExec),a&&(this.handleModes=ni),this.trackStartLines===!1&&(this.computeNewColumn=ta),this.trackEndLines===!1&&(this.updateTokenEndLineColumnLocation=ni),/full/i.test(this.config.positionTracking))this.createTokenInstance=this.createFullToken;else if(/onlyStart/i.test(this.config.positionTracking))this.createTokenInstance=this.createStartOnlyToken;else if(/onlyOffset/i.test(this.config.positionTracking))this.createTokenInstance=this.createOffsetOnlyToken;else throw Error(`Invalid config option: "${this.config.positionTracking}"`);this.hasCustom?(this.addToken=this.addTokenUsingPush,this.handlePayload=this.handlePayloadWithCustom):(this.addToken=this.addTokenUsingMemberAccess,this.handlePayload=this.handlePayloadNoCustom)}),this.TRACE_INIT("Failed Optimization Warnings",()=>{let l=Xr(this.canModeBeOptimized,(u,h,f)=>(h===!1&&u.push(f),u),[]);if(r.ensureOptimizations&&!ur(l))throw Error(`Lexer Modes: < ${l.join(", ")} > cannot be optimized. + Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. + Or inspect the console log for details on how to resolve these issues.`)}),this.TRACE_INIT("clearRegExpParserCache",()=>{Pae()}),this.TRACE_INIT("toFastProperties",()=>{rx(this)})})}tokenize(e,r=this.defaultMode){if(!ur(this.lexerDefinitionErrors)){let i=Je(this.lexerDefinitionErrors,a=>a.message).join(`----------------------- +`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: +`+i)}return this.tokenizeInternal(e,r)}tokenizeInternal(e,r){let n,i,a,s,l,u,h,f,d,p,m,g,y,v,x,b,w=e,C=w.length,T=0,E=0,A=this.hasCustom?0:Math.floor(e.length/10),S=new Array(A),_=[],I=this.trackStartLines?1:void 0,D=this.trackStartLines?1:void 0,k=Yae(this.emptyGroups),L=this.trackStartLines,R=this.config.lineTerminatorsPattern,O=0,M=[],B=[],F=[],P=[];Object.freeze(P);let z;function $(){return M}o($,"getPossiblePatternsSlow");function H(le){let he=Ic(le),K=B[he];return K===void 0?P:K}o(H,"getPossiblePatternsOptimized");let Q=o(le=>{if(F.length===1&&le.tokenType.PUSH_MODE===void 0){let he=this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(le);_.push({offset:le.startOffset,line:le.startLine,column:le.startColumn,length:le.image.length,message:he})}else{F.pop();let he=ga(F);M=this.patternIdxToConfig[he],B=this.charCodeToPatternIdxToConfig[he],O=M.length;let K=this.canModeBeOptimized[he]&&this.config.safeMode===!1;B&&K?z=H:z=$}},"pop_mode");function j(le){F.push(le),B=this.charCodeToPatternIdxToConfig[le],M=this.patternIdxToConfig[le],O=M.length,O=M.length;let he=this.canModeBeOptimized[le]&&this.config.safeMode===!1;B&&he?z=H:z=$}o(j,"push_mode"),j.call(this,r);let ie,ne=this.config.recoveryEnabled;for(;Tu.length){u=s,h=f,ie=se;break}}}break}}if(u!==null){if(d=u.length,p=ie.group,p!==void 0&&(m=ie.tokenTypeIdx,g=this.createTokenInstance(u,T,m,ie.tokenType,I,D,d),this.handlePayload(g,h),p===!1?E=this.addToken(S,E,g):k[p].push(g)),e=this.chopInput(e,d),T=T+d,D=this.computeNewColumn(D,d),L===!0&&ie.canLineTerminator===!0){let X=0,te,J;R.lastIndex=0;do te=R.test(u),te===!0&&(J=R.lastIndex-1,X++);while(te===!0);X!==0&&(I=I+X,D=d-J,this.updateTokenEndLineColumnLocation(g,p,J,X,I,D,d))}this.handleModes(ie,Q,j,g)}else{let X=T,te=I,J=D,se=ne===!1;for(;se===!1&&T{"use strict";qt();ix();cp();o(Fu,"tokenLabel");o(LN,"hasTokenLabel");XPe="parent",nse="categories",ise="label",ase="group",sse="push_mode",ose="pop_mode",lse="longer_alt",cse="line_breaks",use="start_chars_hint";o(of,"createToken");o(jPe,"createTokenInternal");lo=of({name:"EOF",pattern:Xn.NA});Bu([lo]);o($u,"createTokenInstance");o(sx,"tokenMatcher")});var zu,hse,Pl,Vg=N(()=>{"use strict";up();qt();os();zu={buildMismatchTokenMessage({expected:t,actual:e,previous:r,ruleName:n}){return`Expecting ${LN(t)?`--> ${Fu(t)} <--`:`token of type --> ${t.name} <--`} but found --> '${e.image}' <--`},buildNotAllInputParsedMessage({firstRedundant:t,ruleName:e}){return"Redundant input, expecting EOF but found: "+t.image},buildNoViableAltMessage({expectedPathsPerAlt:t,actual:e,previous:r,customUserDescription:n,ruleName:i}){let a="Expecting: ",l=` +but found: '`+ia(e).image+"'";if(n)return a+n+l;{let u=Xr(t,(p,m)=>p.concat(m),[]),h=Je(u,p=>`[${Je(p,m=>Fu(m)).join(", ")}]`),d=`one of these possible Token sequences: +${Je(h,(p,m)=>` ${m+1}. ${p}`).join(` +`)}`;return a+d+l}},buildEarlyExitMessage({expectedIterationPaths:t,actual:e,customUserDescription:r,ruleName:n}){let i="Expecting: ",s=` +but found: '`+ia(e).image+"'";if(r)return i+r+s;{let u=`expecting at least one iteration which starts with one of these possible Token sequences:: + <${Je(t,h=>`[${Je(h,f=>Fu(f)).join(",")}]`).join(" ,")}>`;return i+u+s}}};Object.freeze(zu);hse={buildRuleNotFoundError(t,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- +inside top level rule: ->`+t.name+"<-"}},Pl={buildDuplicateFoundError(t,e){function r(f){return f instanceof kr?f.terminalType.name:f instanceof on?f.nonTerminalName:""}o(r,"getExtraProductionArgument");let n=t.name,i=ia(e),a=i.idx,s=Bs(i),l=r(i),u=a>0,h=`->${s}${u?a:""}<- ${l?`with argument: ->${l}<-`:""} + appears more than once (${e.length} times) in the top level rule: ->${n}<-. + For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES + `;return h=h.replace(/[ \t]+/g," "),h=h.replace(/\s\s+/g,` +`),h},buildNamespaceConflictError(t){return`Namespace conflict found in grammar. +The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${t.name}>. +To resolve this make sure each Terminal and Non-Terminal names are unique +This is easy to accomplish by using the convention that Terminal names start with an uppercase letter +and Non-Terminal names start with a lower case letter.`},buildAlternationPrefixAmbiguityError(t){let e=Je(t.prefixPath,i=>Fu(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx;return`Ambiguous alternatives: <${t.ambiguityIndices.join(" ,")}> due to common lookahead prefix +in inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX +For Further details.`},buildAlternationAmbiguityError(t){let e=Je(t.prefixPath,i=>Fu(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(" ,")}> in inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,n},buildEmptyRepetitionError(t){let e=Bs(t.repetition);return t.repetition.idx!==0&&(e+=t.repetition.idx),`The repetition <${e}> within Rule <${t.topLevelRule.name}> can never consume any tokens. +This could lead to an infinite loop.`},buildTokenNameError(t){return"deprecated"},buildEmptyAlternationError(t){return`Ambiguous empty alternative: <${t.emptyChoiceIdx+1}> in inside <${t.topLevelRule.name}> Rule. +Only the last alternative may be an empty alternative.`},buildTooManyAlternativesError(t){return`An Alternation cannot have more than 256 alternatives: + inside <${t.topLevelRule.name}> Rule. + has ${t.alternation.definition.length+1} alternatives.`},buildLeftRecursionError(t){let e=t.topLevelRule.name,r=Je(t.leftRecursionPath,a=>a.name),n=`${e} --> ${r.concat([e]).join(" --> ")}`;return`Left Recursion found in grammar. +rule: <${e}> can be invoked from itself (directly or indirectly) +without consuming any Tokens. The grammar path that causes this is: + ${n} + To fix this refactor your grammar to remove the left recursion. +see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`},buildInvalidRuleNameError(t){return"deprecated"},buildDuplicateRuleNameError(t){let e;return t.topLevelRule instanceof as?e=t.topLevelRule.name:e=t.topLevelRule,`Duplicate definition, rule: ->${e}<- is already defined in the grammar: ->${t.grammarName}<-`}}});function fse(t,e){let r=new RN(t,e);return r.resolveRefs(),r.errors}var RN,dse=N(()=>{"use strict";Fs();qt();os();o(fse,"resolveGrammar");RN=class extends ss{static{o(this,"GastRefResolverVisitor")}constructor(e,r){super(),this.nameToTopRule=e,this.errMsgProvider=r,this.errors=[]}resolveRefs(){Ae(br(this.nameToTopRule),e=>{this.currTopLevel=e,e.accept(this)})}visitNonTerminal(e){let r=this.nameToTopRule[e.nonTerminalName];if(r)e.referencedRule=r;else{let n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,e);this.errors.push({message:n,type:zi.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:e.nonTerminalName})}}}});function Fk(t,e,r=[]){r=an(r);let n=[],i=0;function a(l){return l.concat(gi(t,i+1))}o(a,"remainingPathWith");function s(l){let u=Fk(a(l),e,r);return n.concat(u)}for(o(s,"getAlternativesForProd");r.length{ur(u.definition)===!1&&(n=s(u.definition))}),n;if(l instanceof kr)r.push(l.terminalType);else throw Error("non exhaustive match")}i++}return n.push({partialPath:r,suffixDef:gi(t,i)}),n}function $k(t,e,r,n){let i="EXIT_NONE_TERMINAL",a=[i],s="EXIT_ALTERNATIVE",l=!1,u=e.length,h=u-n-1,f=[],d=[];for(d.push({idx:-1,def:t,ruleStack:[],occurrenceStack:[]});!ur(d);){let p=d.pop();if(p===s){l&&ga(d).idx<=h&&d.pop();continue}let m=p.def,g=p.idx,y=p.ruleStack,v=p.occurrenceStack;if(ur(m))continue;let x=m[0];if(x===i){let b={idx:g,def:gi(m),ruleStack:Nu(y),occurrenceStack:Nu(v)};d.push(b)}else if(x instanceof kr)if(g=0;b--){let w=x.definition[b],C={idx:g,def:w.definition.concat(gi(m)),ruleStack:y,occurrenceStack:v};d.push(C),d.push(s)}else if(x instanceof Dn)d.push({idx:g,def:x.definition.concat(gi(m)),ruleStack:y,occurrenceStack:v});else if(x instanceof as)d.push(KPe(x,g,y,v));else throw Error("non exhaustive match")}return f}function KPe(t,e,r,n){let i=an(r);i.push(t.name);let a=an(n);return a.push(1),{idx:e,def:t.definition,ruleStack:i,occurrenceStack:a}}var NN,Ok,Ug,Pk,ox,Bk,lx,cx=N(()=>{"use strict";qt();xN();Ak();os();NN=class extends Ou{static{o(this,"AbstractNextPossibleTokensWalker")}constructor(e,r){super(),this.topProd=e,this.path=r,this.possibleTokTypes=[],this.nextProductionName="",this.nextProductionOccurrence=0,this.found=!1,this.isAtEndOfPath=!1}startWalking(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=an(this.path.ruleStack).reverse(),this.occurrenceStack=an(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes}walk(e,r=[]){this.found||super.walk(e,r)}walkProdRef(e,r,n){if(e.referencedRule.name===this.nextProductionName&&e.idx===this.nextProductionOccurrence){let i=r.concat(n);this.updateExpectedNext(),this.walk(e.referencedRule,i)}}updateExpectedNext(){ur(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())}},Ok=class extends NN{static{o(this,"NextAfterTokenWalker")}constructor(e,r){super(e,r),this.path=r,this.nextTerminalName="",this.nextTerminalOccurrence=0,this.nextTerminalName=this.path.lastTok.name,this.nextTerminalOccurrence=this.path.lastTokOccurrence}walkTerminal(e,r,n){if(this.isAtEndOfPath&&e.terminalType.name===this.nextTerminalName&&e.idx===this.nextTerminalOccurrence&&!this.found){let i=r.concat(n),a=new Dn({definition:i});this.possibleTokTypes=op(a),this.found=!0}}},Ug=class extends Ou{static{o(this,"AbstractNextTerminalAfterProductionWalker")}constructor(e,r){super(),this.topRule=e,this.occurrence=r,this.result={token:void 0,occurrence:void 0,isEndOfRule:void 0}}startWalking(){return this.walk(this.topRule),this.result}},Pk=class extends Ug{static{o(this,"NextTerminalAfterManyWalker")}walkMany(e,r,n){if(e.idx===this.occurrence){let i=ia(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof kr&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkMany(e,r,n)}},ox=class extends Ug{static{o(this,"NextTerminalAfterManySepWalker")}walkManySep(e,r,n){if(e.idx===this.occurrence){let i=ia(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof kr&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkManySep(e,r,n)}},Bk=class extends Ug{static{o(this,"NextTerminalAfterAtLeastOneWalker")}walkAtLeastOne(e,r,n){if(e.idx===this.occurrence){let i=ia(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof kr&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOne(e,r,n)}},lx=class extends Ug{static{o(this,"NextTerminalAfterAtLeastOneSepWalker")}walkAtLeastOneSep(e,r,n){if(e.idx===this.occurrence){let i=ia(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof kr&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOneSep(e,r,n)}};o(Fk,"possiblePathsFrom");o($k,"nextPossibleTokensAfter");o(KPe,"expandTopLevelRule")});function ux(t){if(t instanceof ln||t==="Option")return jn.OPTION;if(t instanceof Or||t==="Repetition")return jn.REPETITION;if(t instanceof Ln||t==="RepetitionMandatory")return jn.REPETITION_MANDATORY;if(t instanceof Rn||t==="RepetitionMandatoryWithSeparator")return jn.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof wn||t==="RepetitionWithSeparator")return jn.REPETITION_WITH_SEPARATOR;if(t instanceof Tn||t==="Alternation")return jn.ALTERNATION;throw Error("non exhaustive match")}function Gk(t){let{occurrence:e,rule:r,prodType:n,maxLookahead:i}=t,a=ux(n);return a===jn.ALTERNATION?Hg(e,r,i):Wg(e,r,a,i)}function mse(t,e,r,n,i,a){let s=Hg(t,e,r),l=wse(s)?zg:Pu;return a(s,n,l,i)}function gse(t,e,r,n,i,a){let s=Wg(t,e,i,r),l=wse(s)?zg:Pu;return a(s[0],l,n)}function yse(t,e,r,n){let i=t.length,a=Ma(t,s=>Ma(s,l=>l.length===1));if(e)return function(s){let l=Je(s,u=>u.GATE);for(let u=0;uqr(u)),l=Xr(s,(u,h,f)=>(Ae(h,d=>{Bt(u,d.tokenTypeIdx)||(u[d.tokenTypeIdx]=f),Ae(d.categoryMatches,p=>{Bt(u,p)||(u[p]=f)})}),u),{});return function(){let u=this.LA(1);return l[u.tokenTypeIdx]}}else return function(){for(let s=0;sa.length===1),i=t.length;if(n&&!r){let a=qr(t);if(a.length===1&&ur(a[0].categoryMatches)){let l=a[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===l}}else{let s=Xr(a,(l,u,h)=>(l[u.tokenTypeIdx]=!0,Ae(u.categoryMatches,f=>{l[f]=!0}),l),[]);return function(){let l=this.LA(1);return s[l.tokenTypeIdx]===!0}}}else return function(){e:for(let a=0;aFk([s],1)),n=pse(r.length),i=Je(r,s=>{let l={};return Ae(s,u=>{let h=MN(u.partialPath);Ae(h,f=>{l[f]=!0})}),l}),a=r;for(let s=1;s<=e;s++){let l=a;a=pse(l.length);for(let u=0;u{let x=MN(v.partialPath);Ae(x,b=>{i[u][b]=!0})})}}}}return n}function Hg(t,e,r,n){let i=new zk(t,jn.ALTERNATION,n);return e.accept(i),xse(i.result,r)}function Wg(t,e,r,n){let i=new zk(t,r);e.accept(i);let a=i.result,l=new IN(e,t,r).startWalking(),u=new Dn({definition:a}),h=new Dn({definition:l});return xse([u,h],n)}function Vk(t,e){e:for(let r=0;r{let i=e[n];return r===i||i.categoryMatchesMap[r.tokenTypeIdx]})}function wse(t){return Ma(t,e=>Ma(e,r=>Ma(r,n=>ur(n.categoryMatches))))}var jn,IN,zk,qg=N(()=>{"use strict";qt();cx();Ak();cp();os();(function(t){t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION"})(jn||(jn={}));o(ux,"getProdType");o(Gk,"getLookaheadPaths");o(mse,"buildLookaheadFuncForOr");o(gse,"buildLookaheadFuncForOptionalProd");o(yse,"buildAlternativesLookAheadFunc");o(vse,"buildSingleAlternativeLookaheadFunction");IN=class extends Ou{static{o(this,"RestDefinitionFinderWalker")}constructor(e,r,n){super(),this.topProd=e,this.targetOccurrence=r,this.targetProdType=n}startWalking(){return this.walk(this.topProd),this.restDef}checkIsTarget(e,r,n,i){return e.idx===this.targetOccurrence&&this.targetProdType===r?(this.restDef=n.concat(i),!0):!1}walkOption(e,r,n){this.checkIsTarget(e,jn.OPTION,r,n)||super.walkOption(e,r,n)}walkAtLeastOne(e,r,n){this.checkIsTarget(e,jn.REPETITION_MANDATORY,r,n)||super.walkOption(e,r,n)}walkAtLeastOneSep(e,r,n){this.checkIsTarget(e,jn.REPETITION_MANDATORY_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}walkMany(e,r,n){this.checkIsTarget(e,jn.REPETITION,r,n)||super.walkOption(e,r,n)}walkManySep(e,r,n){this.checkIsTarget(e,jn.REPETITION_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}},zk=class extends ss{static{o(this,"InsideDefinitionFinderVisitor")}constructor(e,r,n){super(),this.targetOccurrence=e,this.targetProdType=r,this.targetRef=n,this.result=[]}checkIsTarget(e,r){e.idx===this.targetOccurrence&&this.targetProdType===r&&(this.targetRef===void 0||e===this.targetRef)&&(this.result=e.definition)}visitOption(e){this.checkIsTarget(e,jn.OPTION)}visitRepetition(e){this.checkIsTarget(e,jn.REPETITION)}visitRepetitionMandatory(e){this.checkIsTarget(e,jn.REPETITION_MANDATORY)}visitRepetitionMandatoryWithSeparator(e){this.checkIsTarget(e,jn.REPETITION_MANDATORY_WITH_SEPARATOR)}visitRepetitionWithSeparator(e){this.checkIsTarget(e,jn.REPETITION_WITH_SEPARATOR)}visitAlternation(e){this.checkIsTarget(e,jn.ALTERNATION)}};o(pse,"initializeArrayOfArrays");o(MN,"pathToHashKeys");o(QPe,"isUniquePrefixHash");o(xse,"lookAheadSequenceFromAlternatives");o(Hg,"getLookaheadPathsForOr");o(Wg,"getLookaheadPathsForOptionalProd");o(Vk,"containsPath");o(bse,"isStrictPrefixOfPath");o(wse,"areTokenCategoriesNotUsed")});function Tse(t){let e=t.lookaheadStrategy.validate({rules:t.rules,tokenTypes:t.tokenTypes,grammarName:t.grammarName});return Je(e,r=>Object.assign({type:zi.CUSTOM_LOOKAHEAD_VALIDATION},r))}function kse(t,e,r,n){let i=ya(t,u=>ZPe(u,r)),a=iBe(t,e,r),s=ya(t,u=>tBe(u,r)),l=ya(t,u=>eBe(u,t,n,r));return i.concat(a,s,l)}function ZPe(t,e){let r=new ON;t.accept(r);let n=r.allProductions,i=IL(n,JPe),a=Os(i,l=>l.length>1);return Je(br(a),l=>{let u=ia(l),h=e.buildDuplicateFoundError(t,l),f=Bs(u),d={message:h,type:zi.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:f,occurrence:u.idx},p=Ese(u);return p&&(d.parameter=p),d})}function JPe(t){return`${Bs(t)}_#_${t.idx}_#_${Ese(t)}`}function Ese(t){return t instanceof kr?t.terminalType.name:t instanceof on?t.nonTerminalName:""}function eBe(t,e,r,n){let i=[];if(Xr(e,(s,l)=>l.name===t.name?s+1:s,0)>1){let s=n.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});i.push({message:s,type:zi.DUPLICATE_RULE_NAME,ruleName:t.name})}return i}function Sse(t,e,r){let n=[],i;return qn(e,t)||(i=`Invalid rule override, rule: ->${t}<- cannot be overridden in the grammar: ->${r}<-as it is not defined in any of the super grammars `,n.push({message:i,type:zi.INVALID_RULE_OVERRIDE,ruleName:t})),n}function BN(t,e,r,n=[]){let i=[],a=Uk(e.definition);if(ur(a))return[];{let s=t.name;qn(a,t)&&i.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:n}),type:zi.LEFT_RECURSION,ruleName:s});let u=Zh(a,n.concat([t])),h=ya(u,f=>{let d=an(n);return d.push(f),BN(t,f,r,d)});return i.concat(h)}}function Uk(t){let e=[];if(ur(t))return e;let r=ia(t);if(r instanceof on)e.push(r.referencedRule);else if(r instanceof Dn||r instanceof ln||r instanceof Ln||r instanceof Rn||r instanceof wn||r instanceof Or)e=e.concat(Uk(r.definition));else if(r instanceof Tn)e=qr(Je(r.definition,a=>Uk(a.definition)));else if(!(r instanceof kr))throw Error("non exhaustive match");let n=sp(r),i=t.length>1;if(n&&i){let a=gi(t);return e.concat(Uk(a))}else return e}function Cse(t,e){let r=new hx;t.accept(r);let n=r.alternations;return ya(n,a=>{let s=Nu(a.definition);return ya(s,(l,u)=>{let h=$k([l],[],Pu,1);return ur(h)?[{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:a,emptyChoiceIdx:u}),type:zi.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:a.idx,alternative:u+1}]:[]})})}function Ase(t,e,r){let n=new hx;t.accept(n);let i=n.alternations;return i=Jh(i,s=>s.ignoreAmbiguities===!0),ya(i,s=>{let l=s.idx,u=s.maxLookahead||e,h=Hg(l,t,u,s),f=rBe(h,s,t,r),d=nBe(h,s,t,r);return f.concat(d)})}function tBe(t,e){let r=new hx;t.accept(r);let n=r.alternations;return ya(n,a=>a.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:a}),type:zi.TOO_MANY_ALTS,ruleName:t.name,occurrence:a.idx}]:[])}function _se(t,e,r){let n=[];return Ae(t,i=>{let a=new PN;i.accept(a);let s=a.allProductions;Ae(s,l=>{let u=ux(l),h=l.maxLookahead||e,f=l.idx,p=Wg(f,i,u,h)[0];if(ur(qr(p))){let m=r.buildEmptyRepetitionError({topLevelRule:i,repetition:l});n.push({message:m,type:zi.NO_NON_EMPTY_LOOKAHEAD,ruleName:i.name})}})}),n}function rBe(t,e,r,n){let i=[],a=Xr(t,(l,u,h)=>(e.definition[h].ignoreAmbiguities===!0||Ae(u,f=>{let d=[h];Ae(t,(p,m)=>{h!==m&&Vk(p,f)&&e.definition[m].ignoreAmbiguities!==!0&&d.push(m)}),d.length>1&&!Vk(i,f)&&(i.push(f),l.push({alts:d,path:f}))}),l),[]);return Je(a,l=>{let u=Je(l.alts,f=>f+1);return{message:n.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:u,prefixPath:l.path}),type:zi.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:l.alts}})}function nBe(t,e,r,n){let i=Xr(t,(s,l,u)=>{let h=Je(l,f=>({idx:u,path:f}));return s.concat(h)},[]);return Tc(ya(i,s=>{if(e.definition[s.idx].ignoreAmbiguities===!0)return[];let u=s.idx,h=s.path,f=Yr(i,p=>e.definition[p.idx].ignoreAmbiguities!==!0&&p.idx{let m=[p.idx+1,u+1],g=e.idx===0?"":e.idx;return{message:n.buildAlternationPrefixAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:m,prefixPath:p.path}),type:zi.AMBIGUOUS_PREFIX_ALTS,ruleName:r.name,occurrence:g,alternatives:m}})}))}function iBe(t,e,r){let n=[],i=Je(e,a=>a.name);return Ae(t,a=>{let s=a.name;if(qn(i,s)){let l=r.buildNamespaceConflictError(a);n.push({message:l,type:zi.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:s})}}),n}var ON,hx,PN,fx=N(()=>{"use strict";qt();Fs();os();qg();cx();cp();o(Tse,"validateLookahead");o(kse,"validateGrammar");o(ZPe,"validateDuplicateProductions");o(JPe,"identifyProductionForDuplicates");o(Ese,"getExtraProductionArgument");ON=class extends ss{static{o(this,"OccurrenceValidationCollector")}constructor(){super(...arguments),this.allProductions=[]}visitNonTerminal(e){this.allProductions.push(e)}visitOption(e){this.allProductions.push(e)}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}visitAlternation(e){this.allProductions.push(e)}visitTerminal(e){this.allProductions.push(e)}};o(eBe,"validateRuleDoesNotAlreadyExist");o(Sse,"validateRuleIsOverridden");o(BN,"validateNoLeftRecursion");o(Uk,"getFirstNoneTerminal");hx=class extends ss{static{o(this,"OrCollector")}constructor(){super(...arguments),this.alternations=[]}visitAlternation(e){this.alternations.push(e)}};o(Cse,"validateEmptyOrAlternative");o(Ase,"validateAmbiguousAlternationAlternatives");PN=class extends ss{static{o(this,"RepetitionCollector")}constructor(){super(...arguments),this.allProductions=[]}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}};o(tBe,"validateTooManyAlts");o(_se,"validateSomeNonEmptyLookaheadPath");o(rBe,"checkAlternativesAmbiguities");o(nBe,"checkPrefixAlternativesAmbiguities");o(iBe,"checkTerminalAndNoneTerminalsNameSpace")});function Dse(t){let e=Qh(t,{errMsgProvider:hse}),r={};return Ae(t.rules,n=>{r[n.name]=n}),fse(r,e.errMsgProvider)}function Lse(t){return t=Qh(t,{errMsgProvider:Pl}),kse(t.rules,t.tokenTypes,t.errMsgProvider,t.grammarName)}var Rse=N(()=>{"use strict";qt();dse();fx();Vg();o(Dse,"resolveGrammar");o(Lse,"validateGrammar")});function lf(t){return qn(Pse,t.name)}var Nse,Mse,Ise,Ose,Pse,Yg,hp,dx,px,mx,Xg=N(()=>{"use strict";qt();Nse="MismatchedTokenException",Mse="NoViableAltException",Ise="EarlyExitException",Ose="NotAllInputParsedException",Pse=[Nse,Mse,Ise,Ose];Object.freeze(Pse);o(lf,"isRecognitionException");Yg=class extends Error{static{o(this,"RecognitionException")}constructor(e,r){super(e),this.token=r,this.resyncedTokens=[],Object.setPrototypeOf(this,new.target.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},hp=class extends Yg{static{o(this,"MismatchedTokenException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=Nse}},dx=class extends Yg{static{o(this,"NoViableAltException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=Mse}},px=class extends Yg{static{o(this,"NotAllInputParsedException")}constructor(e,r){super(e,r),this.name=Ose}},mx=class extends Yg{static{o(this,"EarlyExitException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=Ise}}});function aBe(t,e,r,n,i,a,s){let l=this.getKeyForAutomaticLookahead(n,i),u=this.firstAfterRepMap[l];if(u===void 0){let p=this.getCurrRuleFullName(),m=this.getGAstProductions()[p];u=new a(m,i).startWalking(),this.firstAfterRepMap[l]=u}let h=u.token,f=u.occurrence,d=u.isEndOfRule;this.RULE_STACK.length===1&&d&&h===void 0&&(h=lo,f=1),!(h===void 0||f===void 0)&&this.shouldInRepetitionRecoveryBeTried(h,f,s)&&this.tryInRepetitionRecovery(t,e,r,h)}var FN,zN,$N,Hk,GN=N(()=>{"use strict";up();qt();Xg();bN();Fs();FN={},zN="InRuleRecoveryException",$N=class extends Error{static{o(this,"InRuleRecoveryException")}constructor(e){super(e),this.name=zN}},Hk=class{static{o(this,"Recoverable")}initRecoverable(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=Bt(e,"recoveryEnabled")?e.recoveryEnabled:ls.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=aBe)}getTokenToInsert(e){let r=$u(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r}canTokenTypeBeInsertedInRecovery(e){return!0}canTokenTypeBeDeletedInRecovery(e){return!0}tryInRepetitionRecovery(e,r,n,i){let a=this.findReSyncTokenType(),s=this.exportLexerState(),l=[],u=!1,h=this.LA(1),f=this.LA(1),d=o(()=>{let p=this.LA(0),m=this.errorMessageProvider.buildMismatchTokenMessage({expected:i,actual:h,previous:p,ruleName:this.getCurrRuleFullName()}),g=new hp(m,h,this.LA(0));g.resyncedTokens=Nu(l),this.SAVE_ERROR(g)},"generateErrorMessage");for(;!u;)if(this.tokenMatcher(f,i)){d();return}else if(n.call(this)){d(),e.apply(this,r);return}else this.tokenMatcher(f,a)?u=!0:(f=this.SKIP_TOKEN(),this.addToResyncTokens(f,l));this.importLexerState(s)}shouldInRepetitionRecoveryBeTried(e,r,n){return!(n===!1||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))}getFollowsForInRuleRecovery(e,r){let n=this.getCurrentGrammarPath(e,r);return this.getNextPossibleTokenTypes(n)}tryInRuleRecovery(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r))return this.getTokenToInsert(e);if(this.canRecoverWithSingleTokenDeletion(e)){let n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new $N("sad sad panda")}canPerformInRuleRecovery(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)}canRecoverWithSingleTokenInsertion(e,r){if(!this.canTokenTypeBeInsertedInRecovery(e)||ur(r))return!1;let n=this.LA(1);return ns(r,a=>this.tokenMatcher(n,a))!==void 0}canRecoverWithSingleTokenDeletion(e){return this.canTokenTypeBeDeletedInRecovery(e)?this.tokenMatcher(this.LA(2),e):!1}isInCurrentRuleReSyncSet(e){let r=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(r);return qn(n,e)}findReSyncTokenType(){let e=this.flattenFollowSet(),r=this.LA(1),n=2;for(;;){let i=ns(e,a=>sx(r,a));if(i!==void 0)return i;r=this.LA(n),n++}}getCurrFollowKey(){if(this.RULE_STACK.length===1)return FN;let e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(n)}}buildFullFollowKeyStack(){let e=this.RULE_STACK,r=this.RULE_OCCURRENCE_STACK;return Je(e,(n,i)=>i===0?FN:{ruleName:this.shortRuleNameToFullName(n),idxInCallingRule:r[i],inRule:this.shortRuleNameToFullName(e[i-1])})}flattenFollowSet(){let e=Je(this.buildFullFollowKeyStack(),r=>this.getFollowSetFromFollowKey(r));return qr(e)}getFollowSetFromFollowKey(e){if(e===FN)return[lo];let r=e.ruleName+e.idxInCallingRule+_k+e.inRule;return this.resyncFollows[r]}addToResyncTokens(e,r){return this.tokenMatcher(e,lo)||r.push(e),r}reSyncTo(e){let r=[],n=this.LA(1);for(;this.tokenMatcher(n,e)===!1;)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,r);return Nu(r)}attemptInRepetitionRecovery(e,r,n,i,a,s,l){}getCurrentGrammarPath(e,r){let n=this.getHumanReadableRuleStack(),i=an(this.RULE_OCCURRENCE_STACK);return{ruleStack:n,occurrenceStack:i,lastTok:e,lastTokOccurrence:r}}getHumanReadableRuleStack(){return Je(this.RULE_STACK,e=>this.shortRuleNameToFullName(e))}};o(aBe,"attemptInRepetitionRecovery")});function Wk(t,e,r){return r|e|t}var qk=N(()=>{"use strict";o(Wk,"getKeyForAutomaticLookahead")});var Gu,VN=N(()=>{"use strict";qt();Vg();Fs();fx();qg();Gu=class{static{o(this,"LLkLookaheadStrategy")}constructor(e){var r;this.maxLookahead=(r=e?.maxLookahead)!==null&&r!==void 0?r:ls.maxLookahead}validate(e){let r=this.validateNoLeftRecursion(e.rules);if(ur(r)){let n=this.validateEmptyOrAlternatives(e.rules),i=this.validateAmbiguousAlternationAlternatives(e.rules,this.maxLookahead),a=this.validateSomeNonEmptyLookaheadPath(e.rules,this.maxLookahead);return[...r,...n,...i,...a]}return r}validateNoLeftRecursion(e){return ya(e,r=>BN(r,r,Pl))}validateEmptyOrAlternatives(e){return ya(e,r=>Cse(r,Pl))}validateAmbiguousAlternationAlternatives(e,r){return ya(e,n=>Ase(n,r,Pl))}validateSomeNonEmptyLookaheadPath(e,r){return _se(e,r,Pl)}buildLookaheadForAlternation(e){return mse(e.prodOccurrence,e.rule,e.maxLookahead,e.hasPredicates,e.dynamicTokensEnabled,yse)}buildLookaheadForOptional(e){return gse(e.prodOccurrence,e.rule,e.maxLookahead,e.dynamicTokensEnabled,ux(e.prodType),vse)}}});function sBe(t){Yk.reset(),t.accept(Yk);let e=Yk.dslMethods;return Yk.reset(),e}var Xk,UN,Yk,Bse=N(()=>{"use strict";qt();Fs();qk();os();VN();Xk=class{static{o(this,"LooksAhead")}initLooksAhead(e){this.dynamicTokensEnabled=Bt(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:ls.dynamicTokensEnabled,this.maxLookahead=Bt(e,"maxLookahead")?e.maxLookahead:ls.maxLookahead,this.lookaheadStrategy=Bt(e,"lookaheadStrategy")?e.lookaheadStrategy:new Gu({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map}preComputeLookaheadFunctions(e){Ae(e,r=>{this.TRACE_INIT(`${r.name} Rule Lookahead`,()=>{let{alternation:n,repetition:i,option:a,repetitionMandatory:s,repetitionMandatoryWithSeparator:l,repetitionWithSeparator:u}=sBe(r);Ae(n,h=>{let f=h.idx===0?"":h.idx;this.TRACE_INIT(`${Bs(h)}${f}`,()=>{let d=this.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:h.idx,rule:r,maxLookahead:h.maxLookahead||this.maxLookahead,hasPredicates:h.hasPredicates,dynamicTokensEnabled:this.dynamicTokensEnabled}),p=Wk(this.fullRuleNameToShort[r.name],256,h.idx);this.setLaFuncCache(p,d)})}),Ae(i,h=>{this.computeLookaheadFunc(r,h.idx,768,"Repetition",h.maxLookahead,Bs(h))}),Ae(a,h=>{this.computeLookaheadFunc(r,h.idx,512,"Option",h.maxLookahead,Bs(h))}),Ae(s,h=>{this.computeLookaheadFunc(r,h.idx,1024,"RepetitionMandatory",h.maxLookahead,Bs(h))}),Ae(l,h=>{this.computeLookaheadFunc(r,h.idx,1536,"RepetitionMandatoryWithSeparator",h.maxLookahead,Bs(h))}),Ae(u,h=>{this.computeLookaheadFunc(r,h.idx,1280,"RepetitionWithSeparator",h.maxLookahead,Bs(h))})})})}computeLookaheadFunc(e,r,n,i,a,s){this.TRACE_INIT(`${s}${r===0?"":r}`,()=>{let l=this.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:r,rule:e,maxLookahead:a||this.maxLookahead,dynamicTokensEnabled:this.dynamicTokensEnabled,prodType:i}),u=Wk(this.fullRuleNameToShort[e.name],n,r);this.setLaFuncCache(u,l)})}getKeyForAutomaticLookahead(e,r){let n=this.getLastExplicitRuleShortName();return Wk(n,e,r)}getLaFuncFromCache(e){return this.lookAheadFuncsCache.get(e)}setLaFuncCache(e,r){this.lookAheadFuncsCache.set(e,r)}},UN=class extends ss{static{o(this,"DslMethodsCollectorVisitor")}constructor(){super(...arguments),this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}reset(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}visitOption(e){this.dslMethods.option.push(e)}visitRepetitionWithSeparator(e){this.dslMethods.repetitionWithSeparator.push(e)}visitRepetitionMandatory(e){this.dslMethods.repetitionMandatory.push(e)}visitRepetitionMandatoryWithSeparator(e){this.dslMethods.repetitionMandatoryWithSeparator.push(e)}visitRepetition(e){this.dslMethods.repetition.push(e)}visitAlternation(e){this.dslMethods.alternation.push(e)}},Yk=new UN;o(sBe,"collectMethods")});function qN(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffset{"use strict";o(qN,"setNodeLocationOnlyOffset");o(YN,"setNodeLocationFull");o(Fse,"addTerminalToCst");o($se,"addNoneTerminalToCst")});function XN(t,e){Object.defineProperty(t,oBe,{enumerable:!1,configurable:!0,writable:!1,value:e})}var oBe,Gse=N(()=>{"use strict";oBe="name";o(XN,"defineNameProp")});function lBe(t,e){let r=zr(t),n=r.length;for(let i=0;is.msg);throw Error(`Errors Detected in CST Visitor <${this.constructor.name}>: + ${a.join(` + +`).replace(/\n/g,` + `)}`)}},"validateVisitor")};return r.prototype=n,r.prototype.constructor=r,r._RULE_NAMES=e,r}function Use(t,e,r){let n=o(function(){},"derivedConstructor");XN(n,t+"BaseSemanticsWithDefaults");let i=Object.create(r.prototype);return Ae(e,a=>{i[a]=lBe}),n.prototype=i,n.prototype.constructor=n,n}function cBe(t,e){return uBe(t,e)}function uBe(t,e){let r=Yr(e,i=>Si(t[i])===!1),n=Je(r,i=>({msg:`Missing visitor method: <${i}> on ${t.constructor.name} CST Visitor.`,type:jN.MISSING_METHOD,methodName:i}));return Tc(n)}var jN,Hse=N(()=>{"use strict";qt();Gse();o(lBe,"defaultVisit");o(Vse,"createBaseSemanticVisitorConstructor");o(Use,"createBaseVisitorConstructorWithDefaults");(function(t){t[t.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",t[t.MISSING_METHOD=1]="MISSING_METHOD"})(jN||(jN={}));o(cBe,"validateVisitor");o(uBe,"validateMissingCstMethods")});var Zk,Wse=N(()=>{"use strict";zse();qt();Hse();Fs();Zk=class{static{o(this,"TreeBuilder")}initTreeBuilder(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=Bt(e,"nodeLocationTracking")?e.nodeLocationTracking:ls.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=ni,this.cstFinallyStateUpdate=ni,this.cstPostTerminal=ni,this.cstPostNonTerminal=ni,this.cstPostRule=ni;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=YN,this.setNodeLocationFromNode=YN,this.cstPostRule=ni,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=ni,this.setNodeLocationFromNode=ni,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=qN,this.setNodeLocationFromNode=qN,this.cstPostRule=ni,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=ni,this.setNodeLocationFromNode=ni,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=ni,this.setNodeLocationFromNode=ni,this.cstPostRule=ni,this.setInitialNodeLocation=ni;else throw Error(`Invalid config option: "${e.nodeLocationTracking}"`)}setInitialNodeLocationOnlyOffsetRecovery(e){e.location={startOffset:NaN,endOffset:NaN}}setInitialNodeLocationOnlyOffsetRegular(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}}setInitialNodeLocationFullRecovery(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}}setInitialNodeLocationFullRegular(e){let r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}}cstInvocationStateUpdate(e){let r={name:e,children:Object.create(null)};this.setInitialNodeLocation(r),this.CST_STACK.push(r)}cstFinallyStateUpdate(){this.CST_STACK.pop()}cstPostRuleFull(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?(n.endOffset=r.endOffset,n.endLine=r.endLine,n.endColumn=r.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)}cstPostRuleOnlyOffset(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?n.endOffset=r.endOffset:n.startOffset=NaN}cstPostTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];Fse(n,r,e),this.setNodeLocationFromToken(n.location,r)}cstPostNonTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];$se(n,r,e),this.setNodeLocationFromNode(n.location,e.location)}getBaseCstVisitorConstructor(){if(pr(this.baseCstVisitorConstructor)){let e=Vse(this.className,zr(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor}getBaseCstVisitorConstructorWithDefaults(){if(pr(this.baseCstVisitorWithDefaultsConstructor)){let e=Use(this.className,zr(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor}getLastExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-1]}getPreviousExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-2]}getLastExplicitRuleOccurrenceIndex(){let e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]}}});var Jk,qse=N(()=>{"use strict";Fs();Jk=class{static{o(this,"LexerAdapter")}initLexerAdapter(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1}set input(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length}get input(){return this.tokVector}SKIP_TOKEN(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):jg}LA(e){let r=this.currIdx+e;return r<0||this.tokVectorLength<=r?jg:this.tokVector[r]}consumeToken(){this.currIdx++}exportLexerState(){return this.currIdx}importLexerState(e){this.currIdx=e}resetLexerState(){this.currIdx=-1}moveToTerminatedState(){this.currIdx=this.tokVector.length-1}getLexerPosition(){return this.exportLexerState()}}});var eE,Yse=N(()=>{"use strict";qt();Xg();Fs();Vg();fx();os();eE=class{static{o(this,"RecognizerApi")}ACTION(e){return e.call(this)}consume(e,r,n){return this.consumeInternal(r,e,n)}subrule(e,r,n){return this.subruleInternal(r,e,n)}option(e,r){return this.optionInternal(r,e)}or(e,r){return this.orInternal(r,e)}many(e,r){return this.manyInternal(e,r)}atLeastOne(e,r){return this.atLeastOneInternal(e,r)}CONSUME(e,r){return this.consumeInternal(e,0,r)}CONSUME1(e,r){return this.consumeInternal(e,1,r)}CONSUME2(e,r){return this.consumeInternal(e,2,r)}CONSUME3(e,r){return this.consumeInternal(e,3,r)}CONSUME4(e,r){return this.consumeInternal(e,4,r)}CONSUME5(e,r){return this.consumeInternal(e,5,r)}CONSUME6(e,r){return this.consumeInternal(e,6,r)}CONSUME7(e,r){return this.consumeInternal(e,7,r)}CONSUME8(e,r){return this.consumeInternal(e,8,r)}CONSUME9(e,r){return this.consumeInternal(e,9,r)}SUBRULE(e,r){return this.subruleInternal(e,0,r)}SUBRULE1(e,r){return this.subruleInternal(e,1,r)}SUBRULE2(e,r){return this.subruleInternal(e,2,r)}SUBRULE3(e,r){return this.subruleInternal(e,3,r)}SUBRULE4(e,r){return this.subruleInternal(e,4,r)}SUBRULE5(e,r){return this.subruleInternal(e,5,r)}SUBRULE6(e,r){return this.subruleInternal(e,6,r)}SUBRULE7(e,r){return this.subruleInternal(e,7,r)}SUBRULE8(e,r){return this.subruleInternal(e,8,r)}SUBRULE9(e,r){return this.subruleInternal(e,9,r)}OPTION(e){return this.optionInternal(e,0)}OPTION1(e){return this.optionInternal(e,1)}OPTION2(e){return this.optionInternal(e,2)}OPTION3(e){return this.optionInternal(e,3)}OPTION4(e){return this.optionInternal(e,4)}OPTION5(e){return this.optionInternal(e,5)}OPTION6(e){return this.optionInternal(e,6)}OPTION7(e){return this.optionInternal(e,7)}OPTION8(e){return this.optionInternal(e,8)}OPTION9(e){return this.optionInternal(e,9)}OR(e){return this.orInternal(e,0)}OR1(e){return this.orInternal(e,1)}OR2(e){return this.orInternal(e,2)}OR3(e){return this.orInternal(e,3)}OR4(e){return this.orInternal(e,4)}OR5(e){return this.orInternal(e,5)}OR6(e){return this.orInternal(e,6)}OR7(e){return this.orInternal(e,7)}OR8(e){return this.orInternal(e,8)}OR9(e){return this.orInternal(e,9)}MANY(e){this.manyInternal(0,e)}MANY1(e){this.manyInternal(1,e)}MANY2(e){this.manyInternal(2,e)}MANY3(e){this.manyInternal(3,e)}MANY4(e){this.manyInternal(4,e)}MANY5(e){this.manyInternal(5,e)}MANY6(e){this.manyInternal(6,e)}MANY7(e){this.manyInternal(7,e)}MANY8(e){this.manyInternal(8,e)}MANY9(e){this.manyInternal(9,e)}MANY_SEP(e){this.manySepFirstInternal(0,e)}MANY_SEP1(e){this.manySepFirstInternal(1,e)}MANY_SEP2(e){this.manySepFirstInternal(2,e)}MANY_SEP3(e){this.manySepFirstInternal(3,e)}MANY_SEP4(e){this.manySepFirstInternal(4,e)}MANY_SEP5(e){this.manySepFirstInternal(5,e)}MANY_SEP6(e){this.manySepFirstInternal(6,e)}MANY_SEP7(e){this.manySepFirstInternal(7,e)}MANY_SEP8(e){this.manySepFirstInternal(8,e)}MANY_SEP9(e){this.manySepFirstInternal(9,e)}AT_LEAST_ONE(e){this.atLeastOneInternal(0,e)}AT_LEAST_ONE1(e){return this.atLeastOneInternal(1,e)}AT_LEAST_ONE2(e){this.atLeastOneInternal(2,e)}AT_LEAST_ONE3(e){this.atLeastOneInternal(3,e)}AT_LEAST_ONE4(e){this.atLeastOneInternal(4,e)}AT_LEAST_ONE5(e){this.atLeastOneInternal(5,e)}AT_LEAST_ONE6(e){this.atLeastOneInternal(6,e)}AT_LEAST_ONE7(e){this.atLeastOneInternal(7,e)}AT_LEAST_ONE8(e){this.atLeastOneInternal(8,e)}AT_LEAST_ONE9(e){this.atLeastOneInternal(9,e)}AT_LEAST_ONE_SEP(e){this.atLeastOneSepFirstInternal(0,e)}AT_LEAST_ONE_SEP1(e){this.atLeastOneSepFirstInternal(1,e)}AT_LEAST_ONE_SEP2(e){this.atLeastOneSepFirstInternal(2,e)}AT_LEAST_ONE_SEP3(e){this.atLeastOneSepFirstInternal(3,e)}AT_LEAST_ONE_SEP4(e){this.atLeastOneSepFirstInternal(4,e)}AT_LEAST_ONE_SEP5(e){this.atLeastOneSepFirstInternal(5,e)}AT_LEAST_ONE_SEP6(e){this.atLeastOneSepFirstInternal(6,e)}AT_LEAST_ONE_SEP7(e){this.atLeastOneSepFirstInternal(7,e)}AT_LEAST_ONE_SEP8(e){this.atLeastOneSepFirstInternal(8,e)}AT_LEAST_ONE_SEP9(e){this.atLeastOneSepFirstInternal(9,e)}RULE(e,r,n=Kg){if(qn(this.definedRulesNames,e)){let s={message:Pl.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),type:zi.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);let i=this.defineRule(e,r,n);return this[e]=i,i}OVERRIDE_RULE(e,r,n=Kg){let i=Sse(e,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(i);let a=this.defineRule(e,r,n);return this[e]=a,a}BACKTRACK(e,r){return function(){this.isBackTrackingStack.push(1);let n=this.saveRecogState();try{return e.apply(this,r),!0}catch(i){if(lf(i))return!1;throw i}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}}getGAstProductions(){return this.gastProductionsCache}getSerializedGastProductions(){return Sk(br(this.gastProductionsCache))}}});var tE,Xse=N(()=>{"use strict";qt();qk();Xg();qg();cx();Fs();GN();up();cp();tE=class{static{o(this,"RecognizerEngine")}initRecognizerEngine(e,r){if(this.className=this.constructor.name,this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=zg,this.subruleIdx=0,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},Bt(r,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 + For Further details.`);if(Pt(e)){if(ur(e))throw Error(`A Token Vocabulary cannot be empty. + Note that the first argument for the parser constructor + is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 + For Further details.`)}if(Pt(e))this.tokensMap=Xr(e,(a,s)=>(a[s.name]=s,a),{});else if(Bt(e,"modes")&&Ma(qr(br(e.modes)),rse)){let a=qr(br(e.modes)),s=Bm(a);this.tokensMap=Xr(s,(l,u)=>(l[u.name]=u,l),{})}else if(bn(e))this.tokensMap=an(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=lo;let n=Bt(e,"modes")?qr(br(e.modes)):br(e),i=Ma(n,a=>ur(a.categoryMatches));this.tokenMatcher=i?zg:Pu,Bu(br(this.tokensMap))}defineRule(e,r,n){if(this.selfAnalysisDone)throw Error(`Grammar rule <${e}> may not be defined after the 'performSelfAnalysis' method has been called' +Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);let i=Bt(n,"resyncEnabled")?n.resyncEnabled:Kg.resyncEnabled,a=Bt(n,"recoveryValueFunc")?n.recoveryValueFunc:Kg.recoveryValueFunc,s=this.ruleShortNameIdx<<12;this.ruleShortNameIdx++,this.shortRuleNameToFull[s]=e,this.fullRuleNameToShort[e]=s;let l;return this.outputCst===!0?l=o(function(...f){try{this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,f);let d=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(d),d}catch(d){return this.invokeRuleCatch(d,i,a)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTry"):l=o(function(...f){try{return this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,f)}catch(d){return this.invokeRuleCatch(d,i,a)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTryCst"),Object.assign(l,{ruleName:e,originalGrammarAction:r})}invokeRuleCatch(e,r,n){let i=this.RULE_STACK.length===1,a=r&&!this.isBackTracking()&&this.recoveryEnabled;if(lf(e)){let s=e;if(a){let l=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(l))if(s.resyncedTokens=this.reSyncTo(l),this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];return u.recoveredNode=!0,u}else return n(e);else{if(this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];u.recoveredNode=!0,s.partialCstResult=u}throw s}}else{if(i)return this.moveToTerminatedState(),n(e);throw s}}else throw e}optionInternal(e,r){let n=this.getKeyForAutomaticLookahead(512,r);return this.optionInternalLogic(e,r,n)}optionInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof e!="function"){a=e.DEF;let s=e.GATE;if(s!==void 0){let l=i;i=o(()=>s.call(this)&&l.call(this),"lookAheadFunc")}}else a=e;if(i.call(this)===!0)return a.call(this)}atLeastOneInternal(e,r){let n=this.getKeyForAutomaticLookahead(1024,e);return this.atLeastOneInternalLogic(e,r,n)}atLeastOneInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let s=r.GATE;if(s!==void 0){let l=i;i=o(()=>s.call(this)&&l.call(this),"lookAheadFunc")}}else a=r;if(i.call(this)===!0){let s=this.doSingleRepetition(a);for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a)}else throw this.raiseEarlyExitException(e,jn.REPETITION_MANDATORY,r.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,r],i,1024,e,Bk)}atLeastOneSepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1536,e);this.atLeastOneSepFirstInternalLogic(e,r,n)}atLeastOneSepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=o(()=>this.tokenMatcher(this.LA(1),a),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,l,i,lx],l,1536,e,lx)}else throw this.raiseEarlyExitException(e,jn.REPETITION_MANDATORY_WITH_SEPARATOR,r.ERR_MSG)}manyInternal(e,r){let n=this.getKeyForAutomaticLookahead(768,e);return this.manyInternalLogic(e,r,n)}manyInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let l=r.GATE;if(l!==void 0){let u=i;i=o(()=>l.call(this)&&u.call(this),"lookaheadFunction")}}else a=r;let s=!0;for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a);this.attemptInRepetitionRecovery(this.manyInternal,[e,r],i,768,e,Pk,s)}manySepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1280,e);this.manySepFirstInternalLogic(e,r,n)}manySepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=o(()=>this.tokenMatcher(this.LA(1),a),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,l,i,ox],l,1280,e,ox)}}repetitionSepSecondInternal(e,r,n,i,a){for(;n();)this.CONSUME(r),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,r,n,i,a],n,1536,e,a)}doSingleRepetition(e){let r=this.getLexerPosition();return e.call(this),this.getLexerPosition()>r}orInternal(e,r){let n=this.getKeyForAutomaticLookahead(256,r),i=Pt(e)?e:e.DEF,s=this.getLaFuncFromCache(n).call(this,i);if(s!==void 0)return i[s].ALT.call(this);this.raiseNoAltException(r,e.ERR_MSG)}ruleFinallyStateUpdate(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){let e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new px(r,e))}}subruleInternal(e,r,n){let i;try{let a=n!==void 0?n.ARGS:void 0;return this.subruleIdx=r,i=e.apply(this,a),this.cstPostNonTerminal(i,n!==void 0&&n.LABEL!==void 0?n.LABEL:e.ruleName),i}catch(a){throw this.subruleInternalError(a,n,e.ruleName)}}subruleInternalError(e,r,n){throw lf(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:n),delete e.partialCstResult),e}consumeInternal(e,r,n){let i;try{let a=this.LA(1);this.tokenMatcher(a,e)===!0?(this.consumeToken(),i=a):this.consumeInternalError(e,a,n)}catch(a){i=this.consumeInternalRecovery(e,r,a)}return this.cstPostTerminal(n!==void 0&&n.LABEL!==void 0?n.LABEL:e.name,i),i}consumeInternalError(e,r,n){let i,a=this.LA(0);throw n!==void 0&&n.ERR_MSG?i=n.ERR_MSG:i=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:a,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new hp(i,r,a))}consumeInternalRecovery(e,r,n){if(this.recoveryEnabled&&n.name==="MismatchedTokenException"&&!this.isBackTracking()){let i=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,i)}catch(a){throw a.name===zN?n:a}}else throw n}saveRecogState(){let e=this.errors,r=an(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}}reloadRecogState(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK}ruleInvocationStateUpdate(e,r,n){this.RULE_OCCURRENCE_STACK.push(n),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r)}isBackTracking(){return this.isBackTrackingStack.length!==0}getCurrRuleFullName(){let e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]}shortRuleNameToFullName(e){return this.shortRuleNameToFull[e]}isAtEndOfInput(){return this.tokenMatcher(this.LA(1),lo)}reset(){this.resetLexerState(),this.subruleIdx=0,this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]}}});var rE,jse=N(()=>{"use strict";Xg();qt();qg();Fs();rE=class{static{o(this,"ErrorHandler")}initErrorHandler(e){this._errors=[],this.errorMessageProvider=Bt(e,"errorMessageProvider")?e.errorMessageProvider:ls.errorMessageProvider}SAVE_ERROR(e){if(lf(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:an(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")}get errors(){return an(this._errors)}set errors(e){this._errors=e}raiseEarlyExitException(e,r,n){let i=this.getCurrRuleFullName(),a=this.getGAstProductions()[i],l=Wg(e,a,r,this.maxLookahead)[0],u=[];for(let f=1;f<=this.maxLookahead;f++)u.push(this.LA(f));let h=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:l,actual:u,previous:this.LA(0),customUserDescription:n,ruleName:i});throw this.SAVE_ERROR(new mx(h,this.LA(1),this.LA(0)))}raiseNoAltException(e,r){let n=this.getCurrRuleFullName(),i=this.getGAstProductions()[n],a=Hg(e,i,this.maxLookahead),s=[];for(let h=1;h<=this.maxLookahead;h++)s.push(this.LA(h));let l=this.LA(0),u=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:a,actual:s,previous:l,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new dx(u,this.LA(1),l))}}});var nE,Kse=N(()=>{"use strict";cx();qt();nE=class{static{o(this,"ContentAssist")}initContentAssist(){}computeContentAssist(e,r){let n=this.gastProductionsCache[e];if(pr(n))throw Error(`Rule ->${e}<- does not exist in this grammar.`);return $k([n],r,this.tokenMatcher,this.maxLookahead)}getNextPossibleTokenTypes(e){let r=ia(e.ruleStack),i=this.getGAstProductions()[r];return new Ok(i,e).startWalking()}}});function yx(t,e,r,n=!1){aE(r);let i=ga(this.recordingProdStack),a=Si(e)?e:e.DEF,s=new t({definition:[],idx:r});return n&&(s.separator=e.SEP),Bt(e,"MAX_LOOKAHEAD")&&(s.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(s),a.call(this),i.definition.push(s),this.recordingProdStack.pop(),sE}function dBe(t,e){aE(e);let r=ga(this.recordingProdStack),n=Pt(t)===!1,i=n===!1?t:t.DEF,a=new Tn({definition:[],idx:e,ignoreAmbiguities:n&&t.IGNORE_AMBIGUITIES===!0});Bt(t,"MAX_LOOKAHEAD")&&(a.maxLookahead=t.MAX_LOOKAHEAD);let s=A2(i,l=>Si(l.GATE));return a.hasPredicates=s,r.definition.push(a),Ae(i,l=>{let u=new Dn({definition:[]});a.definition.push(u),Bt(l,"IGNORE_AMBIGUITIES")?u.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:Bt(l,"GATE")&&(u.ignoreAmbiguities=!0),this.recordingProdStack.push(u),l.ALT.call(this),this.recordingProdStack.pop()}),sE}function Jse(t){return t===0?"":`${t}`}function aE(t){if(t<0||t>Zse){let e=new Error(`Invalid DSL Method idx value: <${t}> + Idx value must be a none negative value smaller than ${Zse+1}`);throw e.KNOWN_RECORDER_ERROR=!0,e}}var sE,Qse,Zse,eoe,toe,fBe,iE,roe=N(()=>{"use strict";qt();os();ix();cp();up();Fs();qk();sE={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(sE);Qse=!0,Zse=Math.pow(2,8)-1,eoe=of({name:"RECORDING_PHASE_TOKEN",pattern:Xn.NA});Bu([eoe]);toe=$u(eoe,`This IToken indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(toe);fBe={name:`This CSTNode indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},iE=class{static{o(this,"GastRecorder")}initGastRecorder(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1}enableRecording(){this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",()=>{for(let e=0;e<10;e++){let r=e>0?e:"";this[`CONSUME${r}`]=function(n,i){return this.consumeInternalRecord(n,e,i)},this[`SUBRULE${r}`]=function(n,i){return this.subruleInternalRecord(n,e,i)},this[`OPTION${r}`]=function(n){return this.optionInternalRecord(n,e)},this[`OR${r}`]=function(n){return this.orInternalRecord(n,e)},this[`MANY${r}`]=function(n){this.manyInternalRecord(e,n)},this[`MANY_SEP${r}`]=function(n){this.manySepFirstInternalRecord(e,n)},this[`AT_LEAST_ONE${r}`]=function(n){this.atLeastOneInternalRecord(e,n)},this[`AT_LEAST_ONE_SEP${r}`]=function(n){this.atLeastOneSepFirstInternalRecord(e,n)}}this.consume=function(e,r,n){return this.consumeInternalRecord(r,e,n)},this.subrule=function(e,r,n){return this.subruleInternalRecord(r,e,n)},this.option=function(e,r){return this.optionInternalRecord(r,e)},this.or=function(e,r){return this.orInternalRecord(r,e)},this.many=function(e,r){this.manyInternalRecord(e,r)},this.atLeastOne=function(e,r){this.atLeastOneInternalRecord(e,r)},this.ACTION=this.ACTION_RECORD,this.BACKTRACK=this.BACKTRACK_RECORD,this.LA=this.LA_RECORD})}disableRecording(){this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",()=>{let e=this;for(let r=0;r<10;r++){let n=r>0?r:"";delete e[`CONSUME${n}`],delete e[`SUBRULE${n}`],delete e[`OPTION${n}`],delete e[`OR${n}`],delete e[`MANY${n}`],delete e[`MANY_SEP${n}`],delete e[`AT_LEAST_ONE${n}`],delete e[`AT_LEAST_ONE_SEP${n}`]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})}ACTION_RECORD(e){}BACKTRACK_RECORD(e,r){return()=>!0}LA_RECORD(e){return jg}topLevelRuleRecord(e,r){try{let n=new as({definition:[],name:e});return n.name=e,this.recordingProdStack.push(n),r.call(this),this.recordingProdStack.pop(),n}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` + This error was thrown during the "grammar recording phase" For more info see: + https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}}optionInternalRecord(e,r){return yx.call(this,ln,e,r)}atLeastOneInternalRecord(e,r){yx.call(this,Ln,r,e)}atLeastOneSepFirstInternalRecord(e,r){yx.call(this,Rn,r,e,Qse)}manyInternalRecord(e,r){yx.call(this,Or,r,e)}manySepFirstInternalRecord(e,r){yx.call(this,wn,r,e,Qse)}orInternalRecord(e,r){return dBe.call(this,e,r)}subruleInternalRecord(e,r,n){if(aE(r),!e||Bt(e,"ruleName")===!1){let l=new Error(` argument is invalid expecting a Parser method reference but got: <${JSON.stringify(e)}> + inside top level rule: <${this.recordingProdStack[0].name}>`);throw l.KNOWN_RECORDER_ERROR=!0,l}let i=ga(this.recordingProdStack),a=e.ruleName,s=new on({idx:r,nonTerminalName:a,label:n?.LABEL,referencedRule:void 0});return i.definition.push(s),this.outputCst?fBe:sE}consumeInternalRecord(e,r,n){if(aE(r),!_N(e)){let s=new Error(` argument is invalid expecting a TokenType reference but got: <${JSON.stringify(e)}> + inside top level rule: <${this.recordingProdStack[0].name}>`);throw s.KNOWN_RECORDER_ERROR=!0,s}let i=ga(this.recordingProdStack),a=new kr({idx:r,terminalType:e,label:n?.LABEL});return i.definition.push(a),toe}};o(yx,"recordProd");o(dBe,"recordOrProd");o(Jse,"getIdxSuffix");o(aE,"assertMethodIdxIsValid")});var oE,noe=N(()=>{"use strict";qt();Og();Fs();oE=class{static{o(this,"PerformanceTracer")}initPerformanceTracer(e){if(Bt(e,"traceInitPerf")){let r=e.traceInitPerf,n=typeof r=="number";this.traceInitMaxIdent=n?r:1/0,this.traceInitPerf=n?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=ls.traceInitPerf;this.traceInitIndent=-1}TRACE_INIT(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;let n=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${e}>`);let{time:i,value:a}=tx(r),s=i>10?console.warn:console.log;return this.traceInitIndent time: ${i}ms`),this.traceInitIndent--,a}else return r()}}});function ioe(t,e){e.forEach(r=>{let n=r.prototype;Object.getOwnPropertyNames(n).forEach(i=>{if(i==="constructor")return;let a=Object.getOwnPropertyDescriptor(n,i);a&&(a.get||a.set)?Object.defineProperty(t.prototype,i,a):t.prototype[i]=r.prototype[i]})})}var aoe=N(()=>{"use strict";o(ioe,"applyMixins")});function lE(t=void 0){return function(){return t}}var jg,ls,Kg,zi,vx,xx,Fs=N(()=>{"use strict";qt();Og();Oae();up();Vg();Rse();GN();Bse();Wse();qse();Yse();Xse();jse();Kse();roe();noe();aoe();fx();jg=$u(lo,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(jg);ls=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:zu,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1}),Kg=Object.freeze({recoveryValueFunc:o(()=>{},"recoveryValueFunc"),resyncEnabled:!0});(function(t){t[t.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",t[t.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",t[t.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",t[t.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",t[t.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",t[t.LEFT_RECURSION=5]="LEFT_RECURSION",t[t.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",t[t.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",t[t.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",t[t.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",t[t.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",t[t.TOO_MANY_ALTS=12]="TOO_MANY_ALTS",t[t.CUSTOM_LOOKAHEAD_VALIDATION=13]="CUSTOM_LOOKAHEAD_VALIDATION"})(zi||(zi={}));o(lE,"EMPTY_ALT");vx=class t{static{o(this,"Parser")}static performSelfAnalysis(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")}performSelfAnalysis(){this.TRACE_INIT("performSelfAnalysis",()=>{let e;this.selfAnalysisDone=!0;let r=this.className;this.TRACE_INIT("toFastProps",()=>{rx(this)}),this.TRACE_INIT("Grammar Recording",()=>{try{this.enableRecording(),Ae(this.definedRulesNames,i=>{let s=this[i].originalGrammarAction,l;this.TRACE_INIT(`${i} Rule`,()=>{l=this.topLevelRuleRecord(i,s)}),this.gastProductionsCache[i]=l})}finally{this.disableRecording()}});let n=[];if(this.TRACE_INIT("Grammar Resolving",()=>{n=Dse({rules:br(this.gastProductionsCache)}),this.definitionErrors=this.definitionErrors.concat(n)}),this.TRACE_INIT("Grammar Validations",()=>{if(ur(n)&&this.skipValidations===!1){let i=Lse({rules:br(this.gastProductionsCache),tokenTypes:br(this.tokensMap),errMsgProvider:Pl,grammarName:r}),a=Tse({lookaheadStrategy:this.lookaheadStrategy,rules:br(this.gastProductionsCache),tokenTypes:br(this.tokensMap),grammarName:r});this.definitionErrors=this.definitionErrors.concat(i,a)}}),ur(this.definitionErrors)&&(this.recoveryEnabled&&this.TRACE_INIT("computeAllProdsFollows",()=>{let i=Iae(br(this.gastProductionsCache));this.resyncFollows=i}),this.TRACE_INIT("ComputeLookaheadFunctions",()=>{var i,a;(a=(i=this.lookaheadStrategy).initialize)===null||a===void 0||a.call(i,{rules:br(this.gastProductionsCache)}),this.preComputeLookaheadFunctions(br(this.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!ur(this.definitionErrors))throw e=Je(this.definitionErrors,i=>i.message),new Error(`Parser Definition Errors detected: + ${e.join(` +------------------------------- +`)}`)})}constructor(e,r){this.definitionErrors=[],this.selfAnalysisDone=!1;let n=this;if(n.initErrorHandler(r),n.initLexerAdapter(),n.initLooksAhead(r),n.initRecognizerEngine(e,r),n.initRecoverable(r),n.initTreeBuilder(r),n.initContentAssist(),n.initGastRecorder(r),n.initPerformanceTracer(r),Bt(r,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. + Please use the flag on the relevant DSL method instead. + See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES + For further details.`);this.skipValidations=Bt(r,"skipValidations")?r.skipValidations:ls.skipValidations}};vx.DEFER_DEFINITION_ERRORS_HANDLING=!1;ioe(vx,[Hk,Xk,Zk,Jk,tE,eE,rE,nE,iE,oE]);xx=class extends vx{static{o(this,"EmbeddedActionsParser")}constructor(e,r=ls){let n=an(r);n.outputCst=!1,super(e,n)}}});var soe=N(()=>{"use strict";os()});var ooe=N(()=>{"use strict"});var loe=N(()=>{"use strict";soe();ooe()});var coe=N(()=>{"use strict";gN()});var cf=N(()=>{"use strict";gN();Fs();ix();up();qg();VN();Vg();Xg();DN();os();os();loe();coe()});function fp(t,e,r){return`${t.name}_${e}_${r}`}function doe(t){let e={decisionMap:{},decisionStates:[],ruleToStartState:new Map,ruleToStopState:new Map,states:[]};bBe(e,t);let r=t.length;for(let n=0;npoe(t,e,s));return e1(t,e,n,r,...i)}function CBe(t,e,r){let n=aa(t,e,r,{type:uf});hf(t,n);let i=e1(t,e,n,r,dp(t,e,r));return ABe(t,e,r,i)}function dp(t,e,r){let n=Yr(Je(r.definition,i=>poe(t,e,i)),i=>i!==void 0);return n.length===1?n[0]:n.length===0?void 0:DBe(t,n)}function moe(t,e,r,n,i){let a=n.left,s=n.right,l=aa(t,e,r,{type:xBe});hf(t,l);let u=aa(t,e,r,{type:foe});return a.loopback=l,u.loopback=l,t.decisionMap[fp(e,i?"RepetitionMandatoryWithSeparator":"RepetitionMandatory",r.idx)]=l,Ai(s,l),i===void 0?(Ai(l,a),Ai(l,u)):(Ai(l,u),Ai(l,i.left),Ai(i.right,a)),{left:a,right:u}}function goe(t,e,r,n,i){let a=n.left,s=n.right,l=aa(t,e,r,{type:vBe});hf(t,l);let u=aa(t,e,r,{type:foe}),h=aa(t,e,r,{type:yBe});return l.loopback=h,u.loopback=h,Ai(l,a),Ai(l,u),Ai(s,h),i!==void 0?(Ai(h,u),Ai(h,i.left),Ai(i.right,a)):Ai(h,l),t.decisionMap[fp(e,i?"RepetitionWithSeparator":"Repetition",r.idx)]=l,{left:l,right:u}}function ABe(t,e,r,n){let i=n.left,a=n.right;return Ai(i,a),t.decisionMap[fp(e,"Option",r.idx)]=i,n}function hf(t,e){return t.decisionStates.push(e),e.decision=t.decisionStates.length-1,e.decision}function e1(t,e,r,n,...i){let a=aa(t,e,n,{type:gBe,start:r});r.end=a;for(let l of i)l!==void 0?(Ai(r,l.left),Ai(l.right,a)):Ai(r,a);let s={left:r,right:a};return t.decisionMap[fp(e,_Be(n),n.idx)]=r,s}function _Be(t){if(t instanceof Tn)return"Alternation";if(t instanceof ln)return"Option";if(t instanceof Or)return"Repetition";if(t instanceof wn)return"RepetitionWithSeparator";if(t instanceof Ln)return"RepetitionMandatory";if(t instanceof Rn)return"RepetitionMandatoryWithSeparator";throw new Error("Invalid production type encountered")}function DBe(t,e){let r=e.length;for(let a=0;a{"use strict";Im();DL();cf();o(fp,"buildATNKey");uf=1,mBe=2,uoe=4,hoe=5,Jg=7,gBe=8,yBe=9,vBe=10,xBe=11,foe=12,bx=class{static{o(this,"AbstractTransition")}constructor(e){this.target=e}isEpsilon(){return!1}},Qg=class extends bx{static{o(this,"AtomTransition")}constructor(e,r){super(e),this.tokenType=r}},wx=class extends bx{static{o(this,"EpsilonTransition")}constructor(e){super(e)}isEpsilon(){return!0}},Zg=class extends bx{static{o(this,"RuleTransition")}constructor(e,r,n){super(e),this.rule=r,this.followState=n}isEpsilon(){return!0}};o(doe,"createATN");o(bBe,"createRuleStartAndStopATNStates");o(poe,"atom");o(wBe,"repetition");o(TBe,"repetitionSep");o(kBe,"repetitionMandatory");o(EBe,"repetitionMandatorySep");o(SBe,"alternation");o(CBe,"option");o(dp,"block");o(moe,"plus");o(goe,"star");o(ABe,"optional");o(hf,"defineDecisionState");o(e1,"makeAlts");o(_Be,"getProdType");o(DBe,"makeBlock");o(QN,"tokenRef");o(LBe,"ruleRef");o(RBe,"buildRuleHandle");o(Ai,"epsilon");o(aa,"newState");o(ZN,"addTransition");o(NBe,"removeState")});function JN(t,e=!0){return`${e?`a${t.alt}`:""}s${t.state.stateNumber}:${t.stack.map(r=>r.stateNumber.toString()).join("_")}`}var Tx,t1,voe=N(()=>{"use strict";Im();Tx={},t1=class{static{o(this,"ATNConfigSet")}constructor(){this.map={},this.configs=[]}get size(){return this.configs.length}finalize(){this.map={}}add(e){let r=JN(e);r in this.map||(this.map[r]=this.configs.length,this.configs.push(e))}get elements(){return this.configs}get alts(){return Je(this.configs,e=>e.alt)}get key(){let e="";for(let r in this.map)e+=r+":";return e}};o(JN,"getATNConfigKey")});function MBe(t,e){let r={};return n=>{let i=n.toString(),a=r[i];return a!==void 0||(a={atnStartState:t,decision:e,states:{}},r[i]=a),a}}function boe(t,e=!0){let r=new Set;for(let n of t){let i=new Set;for(let a of n){if(a===void 0){if(e)break;return!1}let s=[a.tokenTypeIdx].concat(a.categoryMatches);for(let l of s)if(r.has(l)){if(!i.has(l))return!1}else r.add(l),i.add(l)}}return!0}function IBe(t){let e=t.decisionStates.length,r=Array(e);for(let n=0;nFu(i)).join(", "),r=t.production.idx===0?"":t.production.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(", ")}> in <${$Be(t.production)}${r}> inside <${t.topLevelRule.name}> Rule, +<${e}> may appears as a prefix path in all these alternatives. +`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,n}function $Be(t){if(t instanceof on)return"SUBRULE";if(t instanceof ln)return"OPTION";if(t instanceof Tn)return"OR";if(t instanceof Ln)return"AT_LEAST_ONE";if(t instanceof Rn)return"AT_LEAST_ONE_SEP";if(t instanceof wn)return"MANY_SEP";if(t instanceof Or)return"MANY";if(t instanceof kr)return"CONSUME";throw Error("non exhaustive match")}function zBe(t,e,r){let n=ya(e.configs.elements,a=>a.state.transitions),i=Qre(n.filter(a=>a instanceof Qg).map(a=>a.tokenType),a=>a.tokenTypeIdx);return{actualToken:r,possibleTokenTypes:i,tokenPath:t}}function GBe(t,e){return t.edges[e.tokenTypeIdx]}function VBe(t,e,r){let n=new t1,i=[];for(let s of t.elements){if(r.is(s.alt)===!1)continue;if(s.state.type===Jg){i.push(s);continue}let l=s.state.transitions.length;for(let u=0;u0&&!YBe(a))for(let s of i)a.add(s);return a}function UBe(t,e){if(t instanceof Qg&&sx(e,t.tokenType))return t.target}function HBe(t,e){let r;for(let n of t.elements)if(e.is(n.alt)===!0){if(r===void 0)r=n.alt;else if(r!==n.alt)return}return r}function Toe(t){return{configs:t,edges:{},isAcceptState:!1,prediction:-1}}function woe(t,e,r,n){return n=koe(t,n),e.edges[r.tokenTypeIdx]=n,n}function koe(t,e){if(e===Tx)return e;let r=e.configs.key,n=t.states[r];return n!==void 0?n:(e.configs.finalize(),t.states[r]=e,e)}function WBe(t){let e=new t1,r=t.transitions.length;for(let n=0;n0){let i=[...t.stack],s={state:i.pop(),alt:t.alt,stack:i};uE(s,e)}else e.add(t);return}r.epsilonOnlyTransitions||e.add(t);let n=r.transitions.length;for(let i=0;i1)return!0;return!1}function ZBe(t){for(let e of Array.from(t.values()))if(Object.keys(e).length===1)return!0;return!1}var cE,xoe,kx,Eoe=N(()=>{"use strict";cf();yoe();voe();BL();RL();Zre();Im();uT();$T();HT();GL();o(MBe,"createDFACache");cE=class{static{o(this,"PredicateSet")}constructor(){this.predicates=[]}is(e){return e>=this.predicates.length||this.predicates[e]}set(e,r){this.predicates[e]=r}toString(){let e="",r=this.predicates.length;for(let n=0;nconsole.log(n)}initialize(e){this.atn=doe(e.rules),this.dfas=IBe(this.atn)}validateAmbiguousAlternationAlternatives(){return[]}validateEmptyOrAlternatives(){return[]}buildLookaheadForAlternation(e){let{prodOccurrence:r,rule:n,hasPredicates:i,dynamicTokensEnabled:a}=e,s=this.dfas,l=this.logging,u=fp(n,"Alternation",r),f=this.atn.decisionMap[u].decision,d=Je(Gk({maxLookahead:1,occurrence:r,prodType:"Alternation",rule:n}),p=>Je(p,m=>m[0]));if(boe(d,!1)&&!a){let p=Xr(d,(m,g,y)=>(Ae(g,v=>{v&&(m[v.tokenTypeIdx]=y,Ae(v.categoryMatches,x=>{m[x]=y}))}),m),{});return i?function(m){var g;let y=this.LA(1),v=p[y.tokenTypeIdx];if(m!==void 0&&v!==void 0){let x=(g=m[v])===null||g===void 0?void 0:g.GATE;if(x!==void 0&&x.call(this)===!1)return}return v}:function(){let m=this.LA(1);return p[m.tokenTypeIdx]}}else return i?function(p){let m=new cE,g=p===void 0?0:p.length;for(let v=0;vJe(p,m=>m[0]));if(boe(d)&&d[0][0]&&!a){let p=d[0],m=qr(p);if(m.length===1&&ur(m[0].categoryMatches)){let y=m[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===y}}else{let g=Xr(m,(y,v)=>(v!==void 0&&(y[v.tokenTypeIdx]=!0,Ae(v.categoryMatches,x=>{y[x]=!0})),y),{});return function(){let y=this.LA(1);return g[y.tokenTypeIdx]===!0}}}return function(){let p=eM.call(this,s,f,xoe,l);return typeof p=="object"?!1:p===0}}};o(boe,"isLL1Sequence");o(IBe,"initATNSimulator");o(eM,"adaptivePredict");o(OBe,"performLookahead");o(PBe,"computeLookaheadTarget");o(BBe,"reportLookaheadAmbiguity");o(FBe,"buildAmbiguityError");o($Be,"getProductionDslName");o(zBe,"buildAdaptivePredictError");o(GBe,"getExistingTargetState");o(VBe,"computeReachSet");o(UBe,"getReachableTarget");o(HBe,"getUniqueAlt");o(Toe,"newDFAState");o(woe,"addDFAEdge");o(koe,"addDFAState");o(WBe,"computeStartState");o(uE,"closure");o(qBe,"getEpsilonTarget");o(YBe,"hasConfigInRuleStopState");o(XBe,"allConfigsInRuleStopStates");o(jBe,"hasConflictTerminatingPrediction");o(KBe,"getConflictingAltSets");o(QBe,"hasConflictingAltSet");o(ZBe,"hasStateAssociatedWithOneAlt")});var Soe=N(()=>{"use strict";Eoe()});var Coe,tM,Aoe,hE,jr,Pr,fE,_oe,rM,Doe,Loe,Roe,Noe,nM,Moe,Ioe,Ooe,dE,r1,n1,iM,i1,Poe,aM,sM,oM,lM,cM,Boe,Foe,uM,$oe,hM,Ex,zoe,Goe,Voe,Uoe,Hoe,Woe,qoe,Yoe,pE,Xoe,joe,Koe,Qoe,Zoe,Joe,ele,tle,rle,nle,ile,mE,ale,sle,ole,lle,cle,ule,hle,fle,dle,ple,mle,gle,yle,fM,dM,vle,xle,ble,wle,Tle,kle,Ele,Sle,Cle,pM,Fe,mM=N(()=>{"use strict";(function(t){function e(r){return typeof r=="string"}o(e,"is"),t.is=e})(Coe||(Coe={}));(function(t){function e(r){return typeof r=="string"}o(e,"is"),t.is=e})(tM||(tM={}));(function(t){t.MIN_VALUE=-2147483648,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}o(e,"is"),t.is=e})(Aoe||(Aoe={}));(function(t){t.MIN_VALUE=0,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}o(e,"is"),t.is=e})(hE||(hE={}));(function(t){function e(n,i){return n===Number.MAX_VALUE&&(n=hE.MAX_VALUE),i===Number.MAX_VALUE&&(i=hE.MAX_VALUE),{line:n,character:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.objectLiteral(i)&&Fe.uinteger(i.line)&&Fe.uinteger(i.character)}o(r,"is"),t.is=r})(jr||(jr={}));(function(t){function e(n,i,a,s){if(Fe.uinteger(n)&&Fe.uinteger(i)&&Fe.uinteger(a)&&Fe.uinteger(s))return{start:jr.create(n,i),end:jr.create(a,s)};if(jr.is(n)&&jr.is(i))return{start:n,end:i};throw new Error(`Range#create called with invalid arguments[${n}, ${i}, ${a}, ${s}]`)}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.objectLiteral(i)&&jr.is(i.start)&&jr.is(i.end)}o(r,"is"),t.is=r})(Pr||(Pr={}));(function(t){function e(n,i){return{uri:n,range:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.objectLiteral(i)&&Pr.is(i.range)&&(Fe.string(i.uri)||Fe.undefined(i.uri))}o(r,"is"),t.is=r})(fE||(fE={}));(function(t){function e(n,i,a,s){return{targetUri:n,targetRange:i,targetSelectionRange:a,originSelectionRange:s}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.objectLiteral(i)&&Pr.is(i.targetRange)&&Fe.string(i.targetUri)&&Pr.is(i.targetSelectionRange)&&(Pr.is(i.originSelectionRange)||Fe.undefined(i.originSelectionRange))}o(r,"is"),t.is=r})(_oe||(_oe={}));(function(t){function e(n,i,a,s){return{red:n,green:i,blue:a,alpha:s}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.objectLiteral(i)&&Fe.numberRange(i.red,0,1)&&Fe.numberRange(i.green,0,1)&&Fe.numberRange(i.blue,0,1)&&Fe.numberRange(i.alpha,0,1)}o(r,"is"),t.is=r})(rM||(rM={}));(function(t){function e(n,i){return{range:n,color:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.objectLiteral(i)&&Pr.is(i.range)&&rM.is(i.color)}o(r,"is"),t.is=r})(Doe||(Doe={}));(function(t){function e(n,i,a){return{label:n,textEdit:i,additionalTextEdits:a}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.objectLiteral(i)&&Fe.string(i.label)&&(Fe.undefined(i.textEdit)||n1.is(i))&&(Fe.undefined(i.additionalTextEdits)||Fe.typedArray(i.additionalTextEdits,n1.is))}o(r,"is"),t.is=r})(Loe||(Loe={}));(function(t){t.Comment="comment",t.Imports="imports",t.Region="region"})(Roe||(Roe={}));(function(t){function e(n,i,a,s,l,u){let h={startLine:n,endLine:i};return Fe.defined(a)&&(h.startCharacter=a),Fe.defined(s)&&(h.endCharacter=s),Fe.defined(l)&&(h.kind=l),Fe.defined(u)&&(h.collapsedText=u),h}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.objectLiteral(i)&&Fe.uinteger(i.startLine)&&Fe.uinteger(i.startLine)&&(Fe.undefined(i.startCharacter)||Fe.uinteger(i.startCharacter))&&(Fe.undefined(i.endCharacter)||Fe.uinteger(i.endCharacter))&&(Fe.undefined(i.kind)||Fe.string(i.kind))}o(r,"is"),t.is=r})(Noe||(Noe={}));(function(t){function e(n,i){return{location:n,message:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.defined(i)&&fE.is(i.location)&&Fe.string(i.message)}o(r,"is"),t.is=r})(nM||(nM={}));(function(t){t.Error=1,t.Warning=2,t.Information=3,t.Hint=4})(Moe||(Moe={}));(function(t){t.Unnecessary=1,t.Deprecated=2})(Ioe||(Ioe={}));(function(t){function e(r){let n=r;return Fe.objectLiteral(n)&&Fe.string(n.href)}o(e,"is"),t.is=e})(Ooe||(Ooe={}));(function(t){function e(n,i,a,s,l,u){let h={range:n,message:i};return Fe.defined(a)&&(h.severity=a),Fe.defined(s)&&(h.code=s),Fe.defined(l)&&(h.source=l),Fe.defined(u)&&(h.relatedInformation=u),h}o(e,"create"),t.create=e;function r(n){var i;let a=n;return Fe.defined(a)&&Pr.is(a.range)&&Fe.string(a.message)&&(Fe.number(a.severity)||Fe.undefined(a.severity))&&(Fe.integer(a.code)||Fe.string(a.code)||Fe.undefined(a.code))&&(Fe.undefined(a.codeDescription)||Fe.string((i=a.codeDescription)===null||i===void 0?void 0:i.href))&&(Fe.string(a.source)||Fe.undefined(a.source))&&(Fe.undefined(a.relatedInformation)||Fe.typedArray(a.relatedInformation,nM.is))}o(r,"is"),t.is=r})(dE||(dE={}));(function(t){function e(n,i,...a){let s={title:n,command:i};return Fe.defined(a)&&a.length>0&&(s.arguments=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.defined(i)&&Fe.string(i.title)&&Fe.string(i.command)}o(r,"is"),t.is=r})(r1||(r1={}));(function(t){function e(a,s){return{range:a,newText:s}}o(e,"replace"),t.replace=e;function r(a,s){return{range:{start:a,end:a},newText:s}}o(r,"insert"),t.insert=r;function n(a){return{range:a,newText:""}}o(n,"del"),t.del=n;function i(a){let s=a;return Fe.objectLiteral(s)&&Fe.string(s.newText)&&Pr.is(s.range)}o(i,"is"),t.is=i})(n1||(n1={}));(function(t){function e(n,i,a){let s={label:n};return i!==void 0&&(s.needsConfirmation=i),a!==void 0&&(s.description=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.objectLiteral(i)&&Fe.string(i.label)&&(Fe.boolean(i.needsConfirmation)||i.needsConfirmation===void 0)&&(Fe.string(i.description)||i.description===void 0)}o(r,"is"),t.is=r})(iM||(iM={}));(function(t){function e(r){let n=r;return Fe.string(n)}o(e,"is"),t.is=e})(i1||(i1={}));(function(t){function e(a,s,l){return{range:a,newText:s,annotationId:l}}o(e,"replace"),t.replace=e;function r(a,s,l){return{range:{start:a,end:a},newText:s,annotationId:l}}o(r,"insert"),t.insert=r;function n(a,s){return{range:a,newText:"",annotationId:s}}o(n,"del"),t.del=n;function i(a){let s=a;return n1.is(s)&&(iM.is(s.annotationId)||i1.is(s.annotationId))}o(i,"is"),t.is=i})(Poe||(Poe={}));(function(t){function e(n,i){return{textDocument:n,edits:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.defined(i)&&uM.is(i.textDocument)&&Array.isArray(i.edits)}o(r,"is"),t.is=r})(aM||(aM={}));(function(t){function e(n,i,a){let s={kind:"create",uri:n};return i!==void 0&&(i.overwrite!==void 0||i.ignoreIfExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="create"&&Fe.string(i.uri)&&(i.options===void 0||(i.options.overwrite===void 0||Fe.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||Fe.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||i1.is(i.annotationId))}o(r,"is"),t.is=r})(sM||(sM={}));(function(t){function e(n,i,a,s){let l={kind:"rename",oldUri:n,newUri:i};return a!==void 0&&(a.overwrite!==void 0||a.ignoreIfExists!==void 0)&&(l.options=a),s!==void 0&&(l.annotationId=s),l}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="rename"&&Fe.string(i.oldUri)&&Fe.string(i.newUri)&&(i.options===void 0||(i.options.overwrite===void 0||Fe.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||Fe.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||i1.is(i.annotationId))}o(r,"is"),t.is=r})(oM||(oM={}));(function(t){function e(n,i,a){let s={kind:"delete",uri:n};return i!==void 0&&(i.recursive!==void 0||i.ignoreIfNotExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="delete"&&Fe.string(i.uri)&&(i.options===void 0||(i.options.recursive===void 0||Fe.boolean(i.options.recursive))&&(i.options.ignoreIfNotExists===void 0||Fe.boolean(i.options.ignoreIfNotExists)))&&(i.annotationId===void 0||i1.is(i.annotationId))}o(r,"is"),t.is=r})(lM||(lM={}));(function(t){function e(r){let n=r;return n&&(n.changes!==void 0||n.documentChanges!==void 0)&&(n.documentChanges===void 0||n.documentChanges.every(i=>Fe.string(i.kind)?sM.is(i)||oM.is(i)||lM.is(i):aM.is(i)))}o(e,"is"),t.is=e})(cM||(cM={}));(function(t){function e(n){return{uri:n}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.defined(i)&&Fe.string(i.uri)}o(r,"is"),t.is=r})(Boe||(Boe={}));(function(t){function e(n,i){return{uri:n,version:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.defined(i)&&Fe.string(i.uri)&&Fe.integer(i.version)}o(r,"is"),t.is=r})(Foe||(Foe={}));(function(t){function e(n,i){return{uri:n,version:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.defined(i)&&Fe.string(i.uri)&&(i.version===null||Fe.integer(i.version))}o(r,"is"),t.is=r})(uM||(uM={}));(function(t){function e(n,i,a,s){return{uri:n,languageId:i,version:a,text:s}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.defined(i)&&Fe.string(i.uri)&&Fe.string(i.languageId)&&Fe.integer(i.version)&&Fe.string(i.text)}o(r,"is"),t.is=r})($oe||($oe={}));(function(t){t.PlainText="plaintext",t.Markdown="markdown";function e(r){let n=r;return n===t.PlainText||n===t.Markdown}o(e,"is"),t.is=e})(hM||(hM={}));(function(t){function e(r){let n=r;return Fe.objectLiteral(r)&&hM.is(n.kind)&&Fe.string(n.value)}o(e,"is"),t.is=e})(Ex||(Ex={}));(function(t){t.Text=1,t.Method=2,t.Function=3,t.Constructor=4,t.Field=5,t.Variable=6,t.Class=7,t.Interface=8,t.Module=9,t.Property=10,t.Unit=11,t.Value=12,t.Enum=13,t.Keyword=14,t.Snippet=15,t.Color=16,t.File=17,t.Reference=18,t.Folder=19,t.EnumMember=20,t.Constant=21,t.Struct=22,t.Event=23,t.Operator=24,t.TypeParameter=25})(zoe||(zoe={}));(function(t){t.PlainText=1,t.Snippet=2})(Goe||(Goe={}));(function(t){t.Deprecated=1})(Voe||(Voe={}));(function(t){function e(n,i,a){return{newText:n,insert:i,replace:a}}o(e,"create"),t.create=e;function r(n){let i=n;return i&&Fe.string(i.newText)&&Pr.is(i.insert)&&Pr.is(i.replace)}o(r,"is"),t.is=r})(Uoe||(Uoe={}));(function(t){t.asIs=1,t.adjustIndentation=2})(Hoe||(Hoe={}));(function(t){function e(r){let n=r;return n&&(Fe.string(n.detail)||n.detail===void 0)&&(Fe.string(n.description)||n.description===void 0)}o(e,"is"),t.is=e})(Woe||(Woe={}));(function(t){function e(r){return{label:r}}o(e,"create"),t.create=e})(qoe||(qoe={}));(function(t){function e(r,n){return{items:r||[],isIncomplete:!!n}}o(e,"create"),t.create=e})(Yoe||(Yoe={}));(function(t){function e(n){return n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}o(e,"fromPlainText"),t.fromPlainText=e;function r(n){let i=n;return Fe.string(i)||Fe.objectLiteral(i)&&Fe.string(i.language)&&Fe.string(i.value)}o(r,"is"),t.is=r})(pE||(pE={}));(function(t){function e(r){let n=r;return!!n&&Fe.objectLiteral(n)&&(Ex.is(n.contents)||pE.is(n.contents)||Fe.typedArray(n.contents,pE.is))&&(r.range===void 0||Pr.is(r.range))}o(e,"is"),t.is=e})(Xoe||(Xoe={}));(function(t){function e(r,n){return n?{label:r,documentation:n}:{label:r}}o(e,"create"),t.create=e})(joe||(joe={}));(function(t){function e(r,n,...i){let a={label:r};return Fe.defined(n)&&(a.documentation=n),Fe.defined(i)?a.parameters=i:a.parameters=[],a}o(e,"create"),t.create=e})(Koe||(Koe={}));(function(t){t.Text=1,t.Read=2,t.Write=3})(Qoe||(Qoe={}));(function(t){function e(r,n){let i={range:r};return Fe.number(n)&&(i.kind=n),i}o(e,"create"),t.create=e})(Zoe||(Zoe={}));(function(t){t.File=1,t.Module=2,t.Namespace=3,t.Package=4,t.Class=5,t.Method=6,t.Property=7,t.Field=8,t.Constructor=9,t.Enum=10,t.Interface=11,t.Function=12,t.Variable=13,t.Constant=14,t.String=15,t.Number=16,t.Boolean=17,t.Array=18,t.Object=19,t.Key=20,t.Null=21,t.EnumMember=22,t.Struct=23,t.Event=24,t.Operator=25,t.TypeParameter=26})(Joe||(Joe={}));(function(t){t.Deprecated=1})(ele||(ele={}));(function(t){function e(r,n,i,a,s){let l={name:r,kind:n,location:{uri:a,range:i}};return s&&(l.containerName=s),l}o(e,"create"),t.create=e})(tle||(tle={}));(function(t){function e(r,n,i,a){return a!==void 0?{name:r,kind:n,location:{uri:i,range:a}}:{name:r,kind:n,location:{uri:i}}}o(e,"create"),t.create=e})(rle||(rle={}));(function(t){function e(n,i,a,s,l,u){let h={name:n,detail:i,kind:a,range:s,selectionRange:l};return u!==void 0&&(h.children=u),h}o(e,"create"),t.create=e;function r(n){let i=n;return i&&Fe.string(i.name)&&Fe.number(i.kind)&&Pr.is(i.range)&&Pr.is(i.selectionRange)&&(i.detail===void 0||Fe.string(i.detail))&&(i.deprecated===void 0||Fe.boolean(i.deprecated))&&(i.children===void 0||Array.isArray(i.children))&&(i.tags===void 0||Array.isArray(i.tags))}o(r,"is"),t.is=r})(nle||(nle={}));(function(t){t.Empty="",t.QuickFix="quickfix",t.Refactor="refactor",t.RefactorExtract="refactor.extract",t.RefactorInline="refactor.inline",t.RefactorRewrite="refactor.rewrite",t.Source="source",t.SourceOrganizeImports="source.organizeImports",t.SourceFixAll="source.fixAll"})(ile||(ile={}));(function(t){t.Invoked=1,t.Automatic=2})(mE||(mE={}));(function(t){function e(n,i,a){let s={diagnostics:n};return i!=null&&(s.only=i),a!=null&&(s.triggerKind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.defined(i)&&Fe.typedArray(i.diagnostics,dE.is)&&(i.only===void 0||Fe.typedArray(i.only,Fe.string))&&(i.triggerKind===void 0||i.triggerKind===mE.Invoked||i.triggerKind===mE.Automatic)}o(r,"is"),t.is=r})(ale||(ale={}));(function(t){function e(n,i,a){let s={title:n},l=!0;return typeof i=="string"?(l=!1,s.kind=i):r1.is(i)?s.command=i:s.edit=i,l&&a!==void 0&&(s.kind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&Fe.string(i.title)&&(i.diagnostics===void 0||Fe.typedArray(i.diagnostics,dE.is))&&(i.kind===void 0||Fe.string(i.kind))&&(i.edit!==void 0||i.command!==void 0)&&(i.command===void 0||r1.is(i.command))&&(i.isPreferred===void 0||Fe.boolean(i.isPreferred))&&(i.edit===void 0||cM.is(i.edit))}o(r,"is"),t.is=r})(sle||(sle={}));(function(t){function e(n,i){let a={range:n};return Fe.defined(i)&&(a.data=i),a}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.defined(i)&&Pr.is(i.range)&&(Fe.undefined(i.command)||r1.is(i.command))}o(r,"is"),t.is=r})(ole||(ole={}));(function(t){function e(n,i){return{tabSize:n,insertSpaces:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.defined(i)&&Fe.uinteger(i.tabSize)&&Fe.boolean(i.insertSpaces)}o(r,"is"),t.is=r})(lle||(lle={}));(function(t){function e(n,i,a){return{range:n,target:i,data:a}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.defined(i)&&Pr.is(i.range)&&(Fe.undefined(i.target)||Fe.string(i.target))}o(r,"is"),t.is=r})(cle||(cle={}));(function(t){function e(n,i){return{range:n,parent:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.objectLiteral(i)&&Pr.is(i.range)&&(i.parent===void 0||t.is(i.parent))}o(r,"is"),t.is=r})(ule||(ule={}));(function(t){t.namespace="namespace",t.type="type",t.class="class",t.enum="enum",t.interface="interface",t.struct="struct",t.typeParameter="typeParameter",t.parameter="parameter",t.variable="variable",t.property="property",t.enumMember="enumMember",t.event="event",t.function="function",t.method="method",t.macro="macro",t.keyword="keyword",t.modifier="modifier",t.comment="comment",t.string="string",t.number="number",t.regexp="regexp",t.operator="operator",t.decorator="decorator"})(hle||(hle={}));(function(t){t.declaration="declaration",t.definition="definition",t.readonly="readonly",t.static="static",t.deprecated="deprecated",t.abstract="abstract",t.async="async",t.modification="modification",t.documentation="documentation",t.defaultLibrary="defaultLibrary"})(fle||(fle={}));(function(t){function e(r){let n=r;return Fe.objectLiteral(n)&&(n.resultId===void 0||typeof n.resultId=="string")&&Array.isArray(n.data)&&(n.data.length===0||typeof n.data[0]=="number")}o(e,"is"),t.is=e})(dle||(dle={}));(function(t){function e(n,i){return{range:n,text:i}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Pr.is(i.range)&&Fe.string(i.text)}o(r,"is"),t.is=r})(ple||(ple={}));(function(t){function e(n,i,a){return{range:n,variableName:i,caseSensitiveLookup:a}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Pr.is(i.range)&&Fe.boolean(i.caseSensitiveLookup)&&(Fe.string(i.variableName)||i.variableName===void 0)}o(r,"is"),t.is=r})(mle||(mle={}));(function(t){function e(n,i){return{range:n,expression:i}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Pr.is(i.range)&&(Fe.string(i.expression)||i.expression===void 0)}o(r,"is"),t.is=r})(gle||(gle={}));(function(t){function e(n,i){return{frameId:n,stoppedLocation:i}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.defined(i)&&Pr.is(n.stoppedLocation)}o(r,"is"),t.is=r})(yle||(yle={}));(function(t){t.Type=1,t.Parameter=2;function e(r){return r===1||r===2}o(e,"is"),t.is=e})(fM||(fM={}));(function(t){function e(n){return{value:n}}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.objectLiteral(i)&&(i.tooltip===void 0||Fe.string(i.tooltip)||Ex.is(i.tooltip))&&(i.location===void 0||fE.is(i.location))&&(i.command===void 0||r1.is(i.command))}o(r,"is"),t.is=r})(dM||(dM={}));(function(t){function e(n,i,a){let s={position:n,label:i};return a!==void 0&&(s.kind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return Fe.objectLiteral(i)&&jr.is(i.position)&&(Fe.string(i.label)||Fe.typedArray(i.label,dM.is))&&(i.kind===void 0||fM.is(i.kind))&&i.textEdits===void 0||Fe.typedArray(i.textEdits,n1.is)&&(i.tooltip===void 0||Fe.string(i.tooltip)||Ex.is(i.tooltip))&&(i.paddingLeft===void 0||Fe.boolean(i.paddingLeft))&&(i.paddingRight===void 0||Fe.boolean(i.paddingRight))}o(r,"is"),t.is=r})(vle||(vle={}));(function(t){function e(r){return{kind:"snippet",value:r}}o(e,"createSnippet"),t.createSnippet=e})(xle||(xle={}));(function(t){function e(r,n,i,a){return{insertText:r,filterText:n,range:i,command:a}}o(e,"create"),t.create=e})(ble||(ble={}));(function(t){function e(r){return{items:r}}o(e,"create"),t.create=e})(wle||(wle={}));(function(t){t.Invoked=0,t.Automatic=1})(Tle||(Tle={}));(function(t){function e(r,n){return{range:r,text:n}}o(e,"create"),t.create=e})(kle||(kle={}));(function(t){function e(r,n){return{triggerKind:r,selectedCompletionInfo:n}}o(e,"create"),t.create=e})(Ele||(Ele={}));(function(t){function e(r){let n=r;return Fe.objectLiteral(n)&&tM.is(n.uri)&&Fe.string(n.name)}o(e,"is"),t.is=e})(Sle||(Sle={}));(function(t){function e(a,s,l,u){return new pM(a,s,l,u)}o(e,"create"),t.create=e;function r(a){let s=a;return!!(Fe.defined(s)&&Fe.string(s.uri)&&(Fe.undefined(s.languageId)||Fe.string(s.languageId))&&Fe.uinteger(s.lineCount)&&Fe.func(s.getText)&&Fe.func(s.positionAt)&&Fe.func(s.offsetAt))}o(r,"is"),t.is=r;function n(a,s){let l=a.getText(),u=i(s,(f,d)=>{let p=f.range.start.line-d.range.start.line;return p===0?f.range.start.character-d.range.start.character:p}),h=l.length;for(let f=u.length-1;f>=0;f--){let d=u[f],p=a.offsetAt(d.range.start),m=a.offsetAt(d.range.end);if(m<=h)l=l.substring(0,p)+d.newText+l.substring(m,l.length);else throw new Error("Overlapping edit");h=p}return l}o(n,"applyEdits"),t.applyEdits=n;function i(a,s){if(a.length<=1)return a;let l=a.length/2|0,u=a.slice(0,l),h=a.slice(l);i(u,s),i(h,s);let f=0,d=0,p=0;for(;f0&&e.push(r.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let r=this.getLineOffsets(),n=0,i=r.length;if(i===0)return jr.create(0,e);for(;ne?i=s:n=s+1}let a=n-1;return jr.create(a,e-r[a])}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line],i=e.line+1"u"}o(n,"undefined"),t.undefined=n;function i(m){return m===!0||m===!1}o(i,"boolean"),t.boolean=i;function a(m){return e.call(m)==="[object String]"}o(a,"string"),t.string=a;function s(m){return e.call(m)==="[object Number]"}o(s,"number"),t.number=s;function l(m,g,y){return e.call(m)==="[object Number]"&&g<=m&&m<=y}o(l,"numberRange"),t.numberRange=l;function u(m){return e.call(m)==="[object Number]"&&-2147483648<=m&&m<=2147483647}o(u,"integer"),t.integer=u;function h(m){return e.call(m)==="[object Number]"&&0<=m&&m<=2147483647}o(h,"uinteger"),t.uinteger=h;function f(m){return e.call(m)==="[object Function]"}o(f,"func"),t.func=f;function d(m){return m!==null&&typeof m=="object"}o(d,"objectLiteral"),t.objectLiteral=d;function p(m,g){return Array.isArray(m)&&m.every(g)}o(p,"typedArray"),t.typedArray=p})(Fe||(Fe={}))});var Sx,Cx,pp,mp,gM,a1,gE=N(()=>{"use strict";mM();Nl();Sx=class{static{o(this,"CstNodeBuilder")}constructor(){this.nodeStack=[]}get current(){var e;return(e=this.nodeStack[this.nodeStack.length-1])!==null&&e!==void 0?e:this.rootNode}buildRootNode(e){return this.rootNode=new a1(e),this.rootNode.root=this.rootNode,this.nodeStack=[this.rootNode],this.rootNode}buildCompositeNode(e){let r=new mp;return r.grammarSource=e,r.root=this.rootNode,this.current.content.push(r),this.nodeStack.push(r),r}buildLeafNode(e,r){let n=new pp(e.startOffset,e.image.length,Gm(e),e.tokenType,!r);return n.grammarSource=r,n.root=this.rootNode,this.current.content.push(n),n}removeNode(e){let r=e.container;if(r){let n=r.content.indexOf(e);n>=0&&r.content.splice(n,1)}}addHiddenNodes(e){let r=[];for(let a of e){let s=new pp(a.startOffset,a.image.length,Gm(a),a.tokenType,!0);s.root=this.rootNode,r.push(s)}let n=this.current,i=!1;if(n.content.length>0){n.content.push(...r);return}for(;n.container;){let a=n.container.content.indexOf(n);if(a>0){n.container.content.splice(a,0,...r),i=!0;break}n=n.container}i||this.rootNode.content.unshift(...r)}construct(e){let r=this.current;typeof e.$type=="string"&&(this.current.astNode=e),e.$cstNode=r;let n=this.nodeStack.pop();n?.content.length===0&&this.removeNode(n)}},Cx=class{static{o(this,"AbstractCstNode")}get parent(){return this.container}get feature(){return this.grammarSource}get hidden(){return!1}get astNode(){var e,r;let n=typeof((e=this._astNode)===null||e===void 0?void 0:e.$type)=="string"?this._astNode:(r=this.container)===null||r===void 0?void 0:r.astNode;if(!n)throw new Error("This node has no associated AST element");return n}set astNode(e){this._astNode=e}get element(){return this.astNode}get text(){return this.root.fullText.substring(this.offset,this.end)}},pp=class extends Cx{static{o(this,"LeafCstNodeImpl")}get offset(){return this._offset}get length(){return this._length}get end(){return this._offset+this._length}get hidden(){return this._hidden}get tokenType(){return this._tokenType}get range(){return this._range}constructor(e,r,n,i,a=!1){super(),this._hidden=a,this._offset=e,this._tokenType=i,this._length=r,this._range=n}},mp=class extends Cx{static{o(this,"CompositeCstNodeImpl")}constructor(){super(...arguments),this.content=new gM(this)}get children(){return this.content}get offset(){var e,r;return(r=(e=this.firstNonHiddenNode)===null||e===void 0?void 0:e.offset)!==null&&r!==void 0?r:0}get length(){return this.end-this.offset}get end(){var e,r;return(r=(e=this.lastNonHiddenNode)===null||e===void 0?void 0:e.end)!==null&&r!==void 0?r:0}get range(){let e=this.firstNonHiddenNode,r=this.lastNonHiddenNode;if(e&&r){if(this._rangeCache===void 0){let{range:n}=e,{range:i}=r;this._rangeCache={start:n.start,end:i.end.line=0;e--){let r=this.content[e];if(!r.hidden)return r}return this.content[this.content.length-1]}},gM=class t extends Array{static{o(this,"CstNodeContainer")}constructor(e){super(),this.parent=e,Object.setPrototypeOf(this,t.prototype)}push(...e){return this.addParents(e),super.push(...e)}unshift(...e){return this.addParents(e),super.unshift(...e)}splice(e,r,...n){return this.addParents(n),super.splice(e,r,...n)}addParents(e){for(let r of e)r.container=this.parent}},a1=class extends mp{static{o(this,"RootCstNodeImpl")}get text(){return this._text.substring(this.offset,this.end)}get fullText(){return this._text}constructor(e){super(),this._text="",this._text=e??""}}});function yM(t){return t.$type===yE}var yE,Ale,_le,Ax,_x,vE,s1,Dx,JBe,vM,Lx=N(()=>{"use strict";cf();Soe();Rc();Ol();is();gE();yE=Symbol("Datatype");o(yM,"isDataTypeNode");Ale="\u200B",_le=o(t=>t.endsWith(Ale)?t:t+Ale,"withRuleSuffix"),Ax=class{static{o(this,"AbstractLangiumParser")}constructor(e){this._unorderedGroups=new Map,this.allRules=new Map,this.lexer=e.parser.Lexer;let r=this.lexer.definition,n=e.LanguageMetaData.mode==="production";this.wrapper=new vM(r,Object.assign(Object.assign({},e.parser.ParserConfig),{skipValidations:n,errorMessageProvider:e.parser.ParserErrorMessageProvider}))}alternatives(e,r){this.wrapper.wrapOr(e,r)}optional(e,r){this.wrapper.wrapOption(e,r)}many(e,r){this.wrapper.wrapMany(e,r)}atLeastOne(e,r){this.wrapper.wrapAtLeastOne(e,r)}getRule(e){return this.allRules.get(e)}isRecording(){return this.wrapper.IS_RECORDING}get unorderedGroups(){return this._unorderedGroups}getRuleStack(){return this.wrapper.RULE_STACK}finalize(){this.wrapper.wrapSelfAnalysis()}},_x=class extends Ax{static{o(this,"LangiumParser")}get current(){return this.stack[this.stack.length-1]}constructor(e){super(e),this.nodeBuilder=new Sx,this.stack=[],this.assignmentMap=new Map,this.linker=e.references.Linker,this.converter=e.parser.ValueConverter,this.astReflection=e.shared.AstReflection}rule(e,r){let n=this.computeRuleType(e),i=this.wrapper.DEFINE_RULE(_le(e.name),this.startImplementation(n,r).bind(this));return this.allRules.set(e.name,i),e.entry&&(this.mainRule=i),i}computeRuleType(e){if(!e.fragment){if(Z2(e))return yE;{let r=Rg(e);return r??e.name}}}parse(e,r={}){this.nodeBuilder.buildRootNode(e);let n=this.lexerResult=this.lexer.tokenize(e);this.wrapper.input=n.tokens;let i=r.rule?this.allRules.get(r.rule):this.mainRule;if(!i)throw new Error(r.rule?`No rule found with name '${r.rule}'`:"No main rule available.");let a=i.call(this.wrapper,{});return this.nodeBuilder.addHiddenNodes(n.hidden),this.unorderedGroups.clear(),this.lexerResult=void 0,{value:a,lexerErrors:n.errors,lexerReport:n.report,parserErrors:this.wrapper.errors}}startImplementation(e,r){return n=>{let i=!this.isRecording()&&e!==void 0;if(i){let s={$type:e};this.stack.push(s),e===yE&&(s.value="")}let a;try{a=r(n)}catch{a=void 0}return a===void 0&&i&&(a=this.construct()),a}}extractHiddenTokens(e){let r=this.lexerResult.hidden;if(!r.length)return[];let n=e.startOffset;for(let i=0;in)return r.splice(0,i);return r.splice(0,r.length)}consume(e,r,n){let i=this.wrapper.wrapConsume(e,r);if(!this.isRecording()&&this.isValidToken(i)){let a=this.extractHiddenTokens(i);this.nodeBuilder.addHiddenNodes(a);let s=this.nodeBuilder.buildLeafNode(i,n),{assignment:l,isCrossRef:u}=this.getAssignment(n),h=this.current;if(l){let f=Ho(n)?i.image:this.converter.convert(i.image,s);this.assign(l.operator,l.feature,f,s,u)}else if(yM(h)){let f=i.image;Ho(n)||(f=this.converter.convert(f,s).toString()),h.value+=f}}}isValidToken(e){return!e.isInsertedInRecovery&&!isNaN(e.startOffset)&&typeof e.endOffset=="number"&&!isNaN(e.endOffset)}subrule(e,r,n,i,a){let s;!this.isRecording()&&!n&&(s=this.nodeBuilder.buildCompositeNode(i));let l=this.wrapper.wrapSubrule(e,r,a);!this.isRecording()&&s&&s.length>0&&this.performSubruleAssignment(l,i,s)}performSubruleAssignment(e,r,n){let{assignment:i,isCrossRef:a}=this.getAssignment(r);if(i)this.assign(i.operator,i.feature,e,n,a);else if(!i){let s=this.current;if(yM(s))s.value+=e.toString();else if(typeof e=="object"&&e){let u=this.assignWithoutOverride(e,s);this.stack.pop(),this.stack.push(u)}}}action(e,r){if(!this.isRecording()){let n=this.current;if(r.feature&&r.operator){n=this.construct(),this.nodeBuilder.removeNode(n.$cstNode),this.nodeBuilder.buildCompositeNode(r).content.push(n.$cstNode);let a={$type:e};this.stack.push(a),this.assign(r.operator,r.feature,n,n.$cstNode,!1)}else n.$type=e}}construct(){if(this.isRecording())return;let e=this.current;return vk(e),this.nodeBuilder.construct(e),this.stack.pop(),yM(e)?this.converter.convert(e.value,e.$cstNode):(XR(this.astReflection,e),e)}getAssignment(e){if(!this.assignmentMap.has(e)){let r=tp(e,Ml);this.assignmentMap.set(e,{assignment:r,isCrossRef:r?ep(r.terminal):!1})}return this.assignmentMap.get(e)}assign(e,r,n,i,a){let s=this.current,l;switch(a&&typeof n=="string"?l=this.linker.buildReference(s,r,i,n):l=n,e){case"=":{s[r]=l;break}case"?=":{s[r]=!0;break}case"+=":Array.isArray(s[r])||(s[r]=[]),s[r].push(l)}}assignWithoutOverride(e,r){for(let[i,a]of Object.entries(r)){let s=e[i];s===void 0?e[i]=a:Array.isArray(s)&&Array.isArray(a)&&(a.push(...s),e[i]=a)}let n=e.$cstNode;return n&&(n.astNode=void 0,e.$cstNode=void 0),e}get definitionErrors(){return this.wrapper.definitionErrors}},vE=class{static{o(this,"AbstractParserErrorMessageProvider")}buildMismatchTokenMessage(e){return zu.buildMismatchTokenMessage(e)}buildNotAllInputParsedMessage(e){return zu.buildNotAllInputParsedMessage(e)}buildNoViableAltMessage(e){return zu.buildNoViableAltMessage(e)}buildEarlyExitMessage(e){return zu.buildEarlyExitMessage(e)}},s1=class extends vE{static{o(this,"LangiumParserErrorMessageProvider")}buildMismatchTokenMessage({expected:e,actual:r}){return`Expecting ${e.LABEL?"`"+e.LABEL+"`":e.name.endsWith(":KW")?`keyword '${e.name.substring(0,e.name.length-3)}'`:`token of type '${e.name}'`} but found \`${r.image}\`.`}buildNotAllInputParsedMessage({firstRedundant:e}){return`Expecting end of file but found \`${e.image}\`.`}},Dx=class extends Ax{static{o(this,"LangiumCompletionParser")}constructor(){super(...arguments),this.tokens=[],this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}action(){}construct(){}parse(e){this.resetState();let r=this.lexer.tokenize(e,{mode:"partial"});return this.tokens=r.tokens,this.wrapper.input=[...this.tokens],this.mainRule.call(this.wrapper,{}),this.unorderedGroups.clear(),{tokens:this.tokens,elementStack:[...this.lastElementStack],tokenIndex:this.nextTokenIndex}}rule(e,r){let n=this.wrapper.DEFINE_RULE(_le(e.name),this.startImplementation(r).bind(this));return this.allRules.set(e.name,n),e.entry&&(this.mainRule=n),n}resetState(){this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}startImplementation(e){return r=>{let n=this.keepStackSize();try{e(r)}finally{this.resetStackSize(n)}}}removeUnexpectedElements(){this.elementStack.splice(this.stackSize)}keepStackSize(){let e=this.elementStack.length;return this.stackSize=e,e}resetStackSize(e){this.removeUnexpectedElements(),this.stackSize=e}consume(e,r,n){this.wrapper.wrapConsume(e,r),this.isRecording()||(this.lastElementStack=[...this.elementStack,n],this.nextTokenIndex=this.currIdx+1)}subrule(e,r,n,i,a){this.before(i),this.wrapper.wrapSubrule(e,r,a),this.after(i)}before(e){this.isRecording()||this.elementStack.push(e)}after(e){if(!this.isRecording()){let r=this.elementStack.lastIndexOf(e);r>=0&&this.elementStack.splice(r)}}get currIdx(){return this.wrapper.currIdx}},JBe={recoveryEnabled:!0,nodeLocationTracking:"full",skipValidations:!0,errorMessageProvider:new s1},vM=class extends xx{static{o(this,"ChevrotainWrapper")}constructor(e,r){let n=r&&"maxLookahead"in r;super(e,Object.assign(Object.assign(Object.assign({},JBe),{lookaheadStrategy:n?new Gu({maxLookahead:r.maxLookahead}):new kx({logging:r.skipValidations?()=>{}:void 0})}),r))}get IS_RECORDING(){return this.RECORDING_PHASE}DEFINE_RULE(e,r){return this.RULE(e,r)}wrapSelfAnalysis(){this.performSelfAnalysis()}wrapConsume(e,r){return this.consume(e,r)}wrapSubrule(e,r,n){return this.subrule(e,r,{ARGS:[n]})}wrapOr(e,r){this.or(e,r)}wrapOption(e,r){this.option(e,r)}wrapMany(e,r){this.many(e,r)}wrapAtLeastOne(e,r){this.atLeastOne(e,r)}}});function Rx(t,e,r){return eFe({parser:e,tokens:r,ruleNames:new Map},t),e}function eFe(t,e){let r=K2(e,!1),n=en(e.rules).filter(Oa).filter(i=>r.has(i));for(let i of n){let a=Object.assign(Object.assign({},t),{consume:1,optional:1,subrule:1,many:1,or:1});t.parser.rule(i,gp(a,i.definition))}}function gp(t,e,r=!1){let n;if(Ho(e))n=oFe(t,e);else if(Mu(e))n=tFe(t,e);else if(Ml(e))n=gp(t,e.terminal);else if(ep(e))n=Dle(t,e);else if(Il(e))n=rFe(t,e);else if(mk(e))n=iFe(t,e);else if(yk(e))n=aFe(t,e);else if(sf(e))n=sFe(t,e);else if($R(e)){let i=t.consume++;n=o(()=>t.parser.consume(i,lo,e),"method")}else throw new Zd(e.$cstNode,`Unexpected element type: ${e.$type}`);return Lle(t,r?void 0:xE(e),n,e.cardinality)}function tFe(t,e){let r=J2(e);return()=>t.parser.action(r,e)}function rFe(t,e){let r=e.rule.ref;if(Oa(r)){let n=t.subrule++,i=r.fragment,a=e.arguments.length>0?nFe(r,e.arguments):()=>({});return s=>t.parser.subrule(n,Rle(t,r),i,e,a(s))}else if(so(r)){let n=t.consume++,i=xM(t,r.name);return()=>t.parser.consume(n,i,e)}else if(r)Lc(r);else throw new Zd(e.$cstNode,`Undefined rule: ${e.rule.$refText}`)}function nFe(t,e){let r=e.map(n=>Vu(n.value));return n=>{let i={};for(let a=0;ae(n)||r(n)}else if(RR(t)){let e=Vu(t.left),r=Vu(t.right);return n=>e(n)&&r(n)}else if(MR(t)){let e=Vu(t.value);return r=>!e(r)}else if(IR(t)){let e=t.parameter.ref.name;return r=>r!==void 0&&r[e]===!0}else if(LR(t)){let e=!!t.true;return()=>e}Lc(t)}function iFe(t,e){if(e.elements.length===1)return gp(t,e.elements[0]);{let r=[];for(let i of e.elements){let a={ALT:gp(t,i,!0)},s=xE(i);s&&(a.GATE=Vu(s)),r.push(a)}let n=t.or++;return i=>t.parser.alternatives(n,r.map(a=>{let s={ALT:o(()=>a.ALT(i),"ALT")},l=a.GATE;return l&&(s.GATE=()=>l(i)),s}))}}function aFe(t,e){if(e.elements.length===1)return gp(t,e.elements[0]);let r=[];for(let l of e.elements){let u={ALT:gp(t,l,!0)},h=xE(l);h&&(u.GATE=Vu(h)),r.push(u)}let n=t.or++,i=o((l,u)=>{let h=u.getRuleStack().join("-");return`uGroup_${l}_${h}`},"idFunc"),a=o(l=>t.parser.alternatives(n,r.map((u,h)=>{let f={ALT:o(()=>!0,"ALT")},d=t.parser;f.ALT=()=>{if(u.ALT(l),!d.isRecording()){let m=i(n,d);d.unorderedGroups.get(m)||d.unorderedGroups.set(m,[]);let g=d.unorderedGroups.get(m);typeof g?.[h]>"u"&&(g[h]=!0)}};let p=u.GATE;return p?f.GATE=()=>p(l):f.GATE=()=>{let m=d.unorderedGroups.get(i(n,d));return!m?.[h]},f})),"alternatives"),s=Lle(t,xE(e),a,"*");return l=>{s(l),t.parser.isRecording()||t.parser.unorderedGroups.delete(i(n,t.parser))}}function sFe(t,e){let r=e.elements.map(n=>gp(t,n));return n=>r.forEach(i=>i(n))}function xE(t){if(sf(t))return t.guardCondition}function Dle(t,e,r=e.terminal){if(r)if(Il(r)&&Oa(r.rule.ref)){let n=r.rule.ref,i=t.subrule++;return a=>t.parser.subrule(i,Rle(t,n),!1,e,a)}else if(Il(r)&&so(r.rule.ref)){let n=t.consume++,i=xM(t,r.rule.ref.name);return()=>t.parser.consume(n,i,e)}else if(Ho(r)){let n=t.consume++,i=xM(t,r.value);return()=>t.parser.consume(n,i,e)}else throw new Error("Could not build cross reference parser");else{if(!e.type.ref)throw new Error("Could not resolve reference to type: "+e.type.$refText);let n=kk(e.type.ref),i=n?.terminal;if(!i)throw new Error("Could not find name assignment for type: "+J2(e.type.ref));return Dle(t,e,i)}}function oFe(t,e){let r=t.consume++,n=t.tokens[e.value];if(!n)throw new Error("Could not find token for keyword: "+e.value);return()=>t.parser.consume(r,n,e)}function Lle(t,e,r,n){let i=e&&Vu(e);if(!n)if(i){let a=t.or++;return s=>t.parser.alternatives(a,[{ALT:o(()=>r(s),"ALT"),GATE:o(()=>i(s),"GATE")},{ALT:lE(),GATE:o(()=>!i(s),"GATE")}])}else return r;if(n==="*"){let a=t.many++;return s=>t.parser.many(a,{DEF:o(()=>r(s),"DEF"),GATE:i?()=>i(s):void 0})}else if(n==="+"){let a=t.many++;if(i){let s=t.or++;return l=>t.parser.alternatives(s,[{ALT:o(()=>t.parser.atLeastOne(a,{DEF:o(()=>r(l),"DEF")}),"ALT"),GATE:o(()=>i(l),"GATE")},{ALT:lE(),GATE:o(()=>!i(l),"GATE")}])}else return s=>t.parser.atLeastOne(a,{DEF:o(()=>r(s),"DEF")})}else if(n==="?"){let a=t.optional++;return s=>t.parser.optional(a,{DEF:o(()=>r(s),"DEF"),GATE:i?()=>i(s):void 0})}else Lc(n)}function Rle(t,e){let r=lFe(t,e),n=t.parser.getRule(r);if(!n)throw new Error(`Rule "${r}" not found."`);return n}function lFe(t,e){if(Oa(e))return e.name;if(t.ruleNames.has(e))return t.ruleNames.get(e);{let r=e,n=r.$container,i=e.$type;for(;!Oa(n);)(sf(n)||mk(n)||yk(n))&&(i=n.elements.indexOf(r).toString()+":"+i),r=n,n=n.$container;return i=n.name+":"+i,t.ruleNames.set(e,i),i}}function xM(t,e){let r=t.tokens[e];if(!r)throw new Error(`Token "${e}" not found."`);return r}var bE=N(()=>{"use strict";cf();Rc();uk();Ps();Ol();o(Rx,"createParser");o(eFe,"buildRules");o(gp,"buildElement");o(tFe,"buildAction");o(rFe,"buildRuleCall");o(nFe,"buildRuleCallPredicate");o(Vu,"buildPredicate");o(iFe,"buildAlternatives");o(aFe,"buildUnorderedGroup");o(sFe,"buildGroup");o(xE,"getGuardCondition");o(Dle,"buildCrossReference");o(oFe,"buildKeyword");o(Lle,"wrap");o(Rle,"getRule");o(lFe,"getRuleName");o(xM,"getToken")});function bM(t){let e=t.Grammar,r=t.parser.Lexer,n=new Dx(t);return Rx(e,n,r.definition),n.finalize(),n}var wM=N(()=>{"use strict";Lx();bE();o(bM,"createCompletionParser")});function TM(t){let e=Nle(t);return e.finalize(),e}function Nle(t){let e=t.Grammar,r=t.parser.Lexer,n=new _x(t);return Rx(e,n,r.definition)}var kM=N(()=>{"use strict";Lx();bE();o(TM,"createLangiumParser");o(Nle,"prepareLangiumParser")});var Uu,wE=N(()=>{"use strict";cf();Rc();is();Ol();Lg();Ps();Uu=class{static{o(this,"DefaultTokenBuilder")}constructor(){this.diagnostics=[]}buildTokens(e,r){let n=en(K2(e,!1)),i=this.buildTerminalTokens(n),a=this.buildKeywordTokens(n,i,r);return i.forEach(s=>{let l=s.PATTERN;typeof l=="object"&&l&&"test"in l&&Dg(l)?a.unshift(s):a.push(s)}),a}flushLexingReport(e){return{diagnostics:this.popDiagnostics()}}popDiagnostics(){let e=[...this.diagnostics];return this.diagnostics=[],e}buildTerminalTokens(e){return e.filter(so).filter(r=>!r.fragment).map(r=>this.buildTerminalToken(r)).toArray()}buildTerminalToken(e){let r=Ng(e),n=this.requiresCustomPattern(r)?this.regexPatternFunction(r):r,i={name:e.name,PATTERN:n};return typeof n=="function"&&(i.LINE_BREAKS=!0),e.hidden&&(i.GROUP=Dg(r)?Xn.SKIPPED:"hidden"),i}requiresCustomPattern(e){return e.flags.includes("u")||e.flags.includes("s")?!0:!!(e.source.includes("?<=")||e.source.includes("?(r.lastIndex=i,r.exec(n))}buildKeywordTokens(e,r,n){return e.filter(Oa).flatMap(i=>Nc(i).filter(Ho)).distinct(i=>i.value).toArray().sort((i,a)=>a.value.length-i.value.length).map(i=>this.buildKeywordToken(i,r,!!n?.caseInsensitive))}buildKeywordToken(e,r,n){let i=this.buildKeywordPattern(e,n),a={name:e.value,PATTERN:i,LONGER_ALT:this.findLongerAlt(e,r)};return typeof i=="function"&&(a.LINE_BREAKS=!0),a}buildKeywordPattern(e,r){return r?new RegExp(tN(e.value)):e.value}findLongerAlt(e,r){return r.reduce((n,i)=>{let a=i?.PATTERN;return a?.source&&rN("^"+a.source+"$",e.value)&&n.push(i),n},[])}}});var yp,Oc,EM=N(()=>{"use strict";Rc();Ol();yp=class{static{o(this,"DefaultValueConverter")}convert(e,r){let n=r.grammarSource;if(ep(n)&&(n=aN(n)),Il(n)){let i=n.rule.ref;if(!i)throw new Error("This cst node was not parsed by a rule.");return this.runConverter(i,e,r)}return e}runConverter(e,r,n){var i;switch(e.name.toUpperCase()){case"INT":return Oc.convertInt(r);case"STRING":return Oc.convertString(r);case"ID":return Oc.convertID(r)}switch((i=fN(e))===null||i===void 0?void 0:i.toLowerCase()){case"number":return Oc.convertNumber(r);case"boolean":return Oc.convertBoolean(r);case"bigint":return Oc.convertBigint(r);case"date":return Oc.convertDate(r);default:return r}}};(function(t){function e(h){let f="";for(let d=1;d{"use strict";Object.defineProperty(AM,"__esModule",{value:!0});var SM;function CM(){if(SM===void 0)throw new Error("No runtime abstraction layer installed");return SM}o(CM,"RAL");(function(t){function e(r){if(r===void 0)throw new Error("No runtime abstraction layer provided");SM=r}o(e,"install"),t.install=e})(CM||(CM={}));AM.default=CM});var Ole=Mi(Ba=>{"use strict";Object.defineProperty(Ba,"__esModule",{value:!0});Ba.stringArray=Ba.array=Ba.func=Ba.error=Ba.number=Ba.string=Ba.boolean=void 0;function cFe(t){return t===!0||t===!1}o(cFe,"boolean");Ba.boolean=cFe;function Mle(t){return typeof t=="string"||t instanceof String}o(Mle,"string");Ba.string=Mle;function uFe(t){return typeof t=="number"||t instanceof Number}o(uFe,"number");Ba.number=uFe;function hFe(t){return t instanceof Error}o(hFe,"error");Ba.error=hFe;function fFe(t){return typeof t=="function"}o(fFe,"func");Ba.func=fFe;function Ile(t){return Array.isArray(t)}o(Ile,"array");Ba.array=Ile;function dFe(t){return Ile(t)&&t.every(e=>Mle(e))}o(dFe,"stringArray");Ba.stringArray=dFe});var LM=Mi(o1=>{"use strict";Object.defineProperty(o1,"__esModule",{value:!0});o1.Emitter=o1.Event=void 0;var pFe=_M(),Ple;(function(t){let e={dispose(){}};t.None=function(){return e}})(Ple||(o1.Event=Ple={}));var DM=class{static{o(this,"CallbackList")}add(e,r=null,n){this._callbacks||(this._callbacks=[],this._contexts=[]),this._callbacks.push(e),this._contexts.push(r),Array.isArray(n)&&n.push({dispose:o(()=>this.remove(e,r),"dispose")})}remove(e,r=null){if(!this._callbacks)return;let n=!1;for(let i=0,a=this._callbacks.length;i{this._callbacks||(this._callbacks=new DM),this._options&&this._options.onFirstListenerAdd&&this._callbacks.isEmpty()&&this._options.onFirstListenerAdd(this),this._callbacks.add(e,r);let i={dispose:o(()=>{this._callbacks&&(this._callbacks.remove(e,r),i.dispose=t._noop,this._options&&this._options.onLastListenerRemove&&this._callbacks.isEmpty()&&this._options.onLastListenerRemove(this))},"dispose")};return Array.isArray(n)&&n.push(i),i}),this._event}fire(e){this._callbacks&&this._callbacks.invoke.call(this._callbacks,e)}dispose(){this._callbacks&&(this._callbacks.dispose(),this._callbacks=void 0)}};o1.Emitter=TE;TE._noop=function(){}});var Ble=Mi(l1=>{"use strict";Object.defineProperty(l1,"__esModule",{value:!0});l1.CancellationTokenSource=l1.CancellationToken=void 0;var mFe=_M(),gFe=Ole(),RM=LM(),kE;(function(t){t.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:RM.Event.None}),t.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:RM.Event.None});function e(r){let n=r;return n&&(n===t.None||n===t.Cancelled||gFe.boolean(n.isCancellationRequested)&&!!n.onCancellationRequested)}o(e,"is"),t.is=e})(kE||(l1.CancellationToken=kE={}));var yFe=Object.freeze(function(t,e){let r=(0,mFe.default)().timer.setTimeout(t.bind(e),0);return{dispose(){r.dispose()}}}),EE=class{static{o(this,"MutableToken")}constructor(){this._isCancelled=!1}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?yFe:(this._emitter||(this._emitter=new RM.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=void 0)}},NM=class{static{o(this,"CancellationTokenSource")}get token(){return this._token||(this._token=new EE),this._token}cancel(){this._token?this._token.cancel():this._token=kE.Cancelled}dispose(){this._token?this._token instanceof EE&&this._token.dispose():this._token=kE.None}};l1.CancellationTokenSource=NM});var yr={};var qo=N(()=>{"use strict";Sr(yr,Sa(Ble(),1))});function MM(){return new Promise(t=>{typeof setImmediate>"u"?setTimeout(t,0):setImmediate(t)})}function CE(){return SE=performance.now(),new yr.CancellationTokenSource}function $le(t){Fle=t}function Bc(t){return t===Pc}async function xi(t){if(t===yr.CancellationToken.None)return;let e=performance.now();if(e-SE>=Fle&&(SE=e,await MM(),SE=performance.now()),t.isCancellationRequested)throw Pc}var SE,Fle,Pc,cs,Yo=N(()=>{"use strict";qo();o(MM,"delayNextTick");SE=0,Fle=10;o(CE,"startCancelableOperation");o($le,"setInterruptionPeriod");Pc=Symbol("OperationCancelled");o(Bc,"isOperationCancelled");o(xi,"interruptAndCheck");cs=class{static{o(this,"Deferred")}constructor(){this.promise=new Promise((e,r)=>{this.resolve=n=>(e(n),this),this.reject=n=>(r(n),this)})}}});function IM(t,e){if(t.length<=1)return t;let r=t.length/2|0,n=t.slice(0,r),i=t.slice(r);IM(n,e),IM(i,e);let a=0,s=0,l=0;for(;ar.line||e.line===r.line&&e.character>r.character?{start:r,end:e}:t}function vFe(t){let e=Vle(t.range);return e!==t.range?{newText:t.newText,range:e}:t}var AE,c1,Ule=N(()=>{"use strict";AE=class t{static{o(this,"FullTextDocument")}constructor(e,r,n,i){this._uri=e,this._languageId=r,this._version=n,this._content=i,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let r=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(r,n)}return this._content}update(e,r){for(let n of e)if(t.isIncremental(n)){let i=Vle(n.range),a=this.offsetAt(i.start),s=this.offsetAt(i.end);this._content=this._content.substring(0,a)+n.text+this._content.substring(s,this._content.length);let l=Math.max(i.start.line,0),u=Math.max(i.end.line,0),h=this._lineOffsets,f=zle(n.text,!1,a);if(u-l===f.length)for(let p=0,m=f.length;pe?i=s:n=s+1}let a=n-1;return e=this.ensureBeforeEOL(e,r[a]),{line:a,character:e-r[a]}}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line];if(e.character<=0)return n;let i=e.line+1r&&Gle(this._content.charCodeAt(e-1));)e--;return e}get lineCount(){return this.getLineOffsets().length}static isIncremental(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range!==void 0&&(r.rangeLength===void 0||typeof r.rangeLength=="number")}static isFull(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range===void 0&&r.rangeLength===void 0}};(function(t){function e(i,a,s,l){return new AE(i,a,s,l)}o(e,"create"),t.create=e;function r(i,a,s){if(i instanceof AE)return i.update(a,s),i;throw new Error("TextDocument.update: document must be created by TextDocument.create")}o(r,"update"),t.update=r;function n(i,a){let s=i.getText(),l=IM(a.map(vFe),(f,d)=>{let p=f.range.start.line-d.range.start.line;return p===0?f.range.start.character-d.range.start.character:p}),u=0,h=[];for(let f of l){let d=i.offsetAt(f.range.start);if(du&&h.push(s.substring(u,d)),f.newText.length&&h.push(f.newText),u=i.offsetAt(f.range.end)}return h.push(s.substr(u)),h.join("")}o(n,"applyEdits"),t.applyEdits=n})(c1||(c1={}));o(IM,"mergeSort");o(zle,"computeLineOffsets");o(Gle,"isEOL");o(Vle,"getWellformedRange");o(vFe,"getWellformedEdit")});var Hle,us,u1,OM=N(()=>{"use strict";(()=>{"use strict";var t={470:i=>{function a(u){if(typeof u!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(u))}o(a,"e");function s(u,h){for(var f,d="",p=0,m=-1,g=0,y=0;y<=u.length;++y){if(y2){var v=d.lastIndexOf("/");if(v!==d.length-1){v===-1?(d="",p=0):p=(d=d.slice(0,v)).length-1-d.lastIndexOf("/"),m=y,g=0;continue}}else if(d.length===2||d.length===1){d="",p=0,m=y,g=0;continue}}h&&(d.length>0?d+="/..":d="..",p=2)}else d.length>0?d+="/"+u.slice(m+1,y):d=u.slice(m+1,y),p=y-m-1;m=y,g=0}else f===46&&g!==-1?++g:g=-1}return d}o(s,"r");var l={resolve:o(function(){for(var u,h="",f=!1,d=arguments.length-1;d>=-1&&!f;d--){var p;d>=0?p=arguments[d]:(u===void 0&&(u=process.cwd()),p=u),a(p),p.length!==0&&(h=p+"/"+h,f=p.charCodeAt(0)===47)}return h=s(h,!f),f?h.length>0?"/"+h:"/":h.length>0?h:"."},"resolve"),normalize:o(function(u){if(a(u),u.length===0)return".";var h=u.charCodeAt(0)===47,f=u.charCodeAt(u.length-1)===47;return(u=s(u,!h)).length!==0||h||(u="."),u.length>0&&f&&(u+="/"),h?"/"+u:u},"normalize"),isAbsolute:o(function(u){return a(u),u.length>0&&u.charCodeAt(0)===47},"isAbsolute"),join:o(function(){if(arguments.length===0)return".";for(var u,h=0;h0&&(u===void 0?u=f:u+="/"+f)}return u===void 0?".":l.normalize(u)},"join"),relative:o(function(u,h){if(a(u),a(h),u===h||(u=l.resolve(u))===(h=l.resolve(h)))return"";for(var f=1;fy){if(h.charCodeAt(m+x)===47)return h.slice(m+x+1);if(x===0)return h.slice(m+x)}else p>y&&(u.charCodeAt(f+x)===47?v=x:x===0&&(v=0));break}var b=u.charCodeAt(f+x);if(b!==h.charCodeAt(m+x))break;b===47&&(v=x)}var w="";for(x=f+v+1;x<=d;++x)x!==d&&u.charCodeAt(x)!==47||(w.length===0?w+="..":w+="/..");return w.length>0?w+h.slice(m+v):(m+=v,h.charCodeAt(m)===47&&++m,h.slice(m))},"relative"),_makeLong:o(function(u){return u},"_makeLong"),dirname:o(function(u){if(a(u),u.length===0)return".";for(var h=u.charCodeAt(0),f=h===47,d=-1,p=!0,m=u.length-1;m>=1;--m)if((h=u.charCodeAt(m))===47){if(!p){d=m;break}}else p=!1;return d===-1?f?"/":".":f&&d===1?"//":u.slice(0,d)},"dirname"),basename:o(function(u,h){if(h!==void 0&&typeof h!="string")throw new TypeError('"ext" argument must be a string');a(u);var f,d=0,p=-1,m=!0;if(h!==void 0&&h.length>0&&h.length<=u.length){if(h.length===u.length&&h===u)return"";var g=h.length-1,y=-1;for(f=u.length-1;f>=0;--f){var v=u.charCodeAt(f);if(v===47){if(!m){d=f+1;break}}else y===-1&&(m=!1,y=f+1),g>=0&&(v===h.charCodeAt(g)?--g==-1&&(p=f):(g=-1,p=y))}return d===p?p=y:p===-1&&(p=u.length),u.slice(d,p)}for(f=u.length-1;f>=0;--f)if(u.charCodeAt(f)===47){if(!m){d=f+1;break}}else p===-1&&(m=!1,p=f+1);return p===-1?"":u.slice(d,p)},"basename"),extname:o(function(u){a(u);for(var h=-1,f=0,d=-1,p=!0,m=0,g=u.length-1;g>=0;--g){var y=u.charCodeAt(g);if(y!==47)d===-1&&(p=!1,d=g+1),y===46?h===-1?h=g:m!==1&&(m=1):h!==-1&&(m=-1);else if(!p){f=g+1;break}}return h===-1||d===-1||m===0||m===1&&h===d-1&&h===f+1?"":u.slice(h,d)},"extname"),format:o(function(u){if(u===null||typeof u!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof u);return function(h,f){var d=f.dir||f.root,p=f.base||(f.name||"")+(f.ext||"");return d?d===f.root?d+p:d+"/"+p:p}(0,u)},"format"),parse:o(function(u){a(u);var h={root:"",dir:"",base:"",ext:"",name:""};if(u.length===0)return h;var f,d=u.charCodeAt(0),p=d===47;p?(h.root="/",f=1):f=0;for(var m=-1,g=0,y=-1,v=!0,x=u.length-1,b=0;x>=f;--x)if((d=u.charCodeAt(x))!==47)y===-1&&(v=!1,y=x+1),d===46?m===-1?m=x:b!==1&&(b=1):m!==-1&&(b=-1);else if(!v){g=x+1;break}return m===-1||y===-1||b===0||b===1&&m===y-1&&m===g+1?y!==-1&&(h.base=h.name=g===0&&p?u.slice(1,y):u.slice(g,y)):(g===0&&p?(h.name=u.slice(1,m),h.base=u.slice(1,y)):(h.name=u.slice(g,m),h.base=u.slice(g,y)),h.ext=u.slice(m,y)),g>0?h.dir=u.slice(0,g-1):p&&(h.dir="/"),h},"parse"),sep:"/",delimiter:":",win32:null,posix:null};l.posix=l,i.exports=l}},e={};function r(i){var a=e[i];if(a!==void 0)return a.exports;var s=e[i]={exports:{}};return t[i](s,s.exports,r),s.exports}o(r,"r"),r.d=(i,a)=>{for(var s in a)r.o(a,s)&&!r.o(i,s)&&Object.defineProperty(i,s,{enumerable:!0,get:a[s]})},r.o=(i,a)=>Object.prototype.hasOwnProperty.call(i,a),r.r=i=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(i,"__esModule",{value:!0})};var n={};(()=>{let i;r.r(n),r.d(n,{URI:o(()=>p,"URI"),Utils:o(()=>I,"Utils")}),typeof process=="object"?i=process.platform==="win32":typeof navigator=="object"&&(i=navigator.userAgent.indexOf("Windows")>=0);let a=/^\w[\w\d+.-]*$/,s=/^\//,l=/^\/\//;function u(D,k){if(!D.scheme&&k)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${D.authority}", path: "${D.path}", query: "${D.query}", fragment: "${D.fragment}"}`);if(D.scheme&&!a.test(D.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(D.path){if(D.authority){if(!s.test(D.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(l.test(D.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}o(u,"s");let h="",f="/",d=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class p{static{o(this,"f")}static isUri(k){return k instanceof p||!!k&&typeof k.authority=="string"&&typeof k.fragment=="string"&&typeof k.path=="string"&&typeof k.query=="string"&&typeof k.scheme=="string"&&typeof k.fsPath=="string"&&typeof k.with=="function"&&typeof k.toString=="function"}scheme;authority;path;query;fragment;constructor(k,L,R,O,M,B=!1){typeof k=="object"?(this.scheme=k.scheme||h,this.authority=k.authority||h,this.path=k.path||h,this.query=k.query||h,this.fragment=k.fragment||h):(this.scheme=function(F,P){return F||P?F:"file"}(k,B),this.authority=L||h,this.path=function(F,P){switch(F){case"https":case"http":case"file":P?P[0]!==f&&(P=f+P):P=f}return P}(this.scheme,R||h),this.query=O||h,this.fragment=M||h,u(this,B))}get fsPath(){return b(this,!1)}with(k){if(!k)return this;let{scheme:L,authority:R,path:O,query:M,fragment:B}=k;return L===void 0?L=this.scheme:L===null&&(L=h),R===void 0?R=this.authority:R===null&&(R=h),O===void 0?O=this.path:O===null&&(O=h),M===void 0?M=this.query:M===null&&(M=h),B===void 0?B=this.fragment:B===null&&(B=h),L===this.scheme&&R===this.authority&&O===this.path&&M===this.query&&B===this.fragment?this:new g(L,R,O,M,B)}static parse(k,L=!1){let R=d.exec(k);return R?new g(R[2]||h,E(R[4]||h),E(R[5]||h),E(R[7]||h),E(R[9]||h),L):new g(h,h,h,h,h)}static file(k){let L=h;if(i&&(k=k.replace(/\\/g,f)),k[0]===f&&k[1]===f){let R=k.indexOf(f,2);R===-1?(L=k.substring(2),k=f):(L=k.substring(2,R),k=k.substring(R)||f)}return new g("file",L,k,h,h)}static from(k){let L=new g(k.scheme,k.authority,k.path,k.query,k.fragment);return u(L,!0),L}toString(k=!1){return w(this,k)}toJSON(){return this}static revive(k){if(k){if(k instanceof p)return k;{let L=new g(k);return L._formatted=k.external,L._fsPath=k._sep===m?k.fsPath:null,L}}return k}}let m=i?1:void 0;class g extends p{static{o(this,"l")}_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=b(this,!1)),this._fsPath}toString(k=!1){return k?w(this,!0):(this._formatted||(this._formatted=w(this,!1)),this._formatted)}toJSON(){let k={$mid:1};return this._fsPath&&(k.fsPath=this._fsPath,k._sep=m),this._formatted&&(k.external=this._formatted),this.path&&(k.path=this.path),this.scheme&&(k.scheme=this.scheme),this.authority&&(k.authority=this.authority),this.query&&(k.query=this.query),this.fragment&&(k.fragment=this.fragment),k}}let y={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function v(D,k,L){let R,O=-1;for(let M=0;M=97&&B<=122||B>=65&&B<=90||B>=48&&B<=57||B===45||B===46||B===95||B===126||k&&B===47||L&&B===91||L&&B===93||L&&B===58)O!==-1&&(R+=encodeURIComponent(D.substring(O,M)),O=-1),R!==void 0&&(R+=D.charAt(M));else{R===void 0&&(R=D.substr(0,M));let F=y[B];F!==void 0?(O!==-1&&(R+=encodeURIComponent(D.substring(O,M)),O=-1),R+=F):O===-1&&(O=M)}}return O!==-1&&(R+=encodeURIComponent(D.substring(O))),R!==void 0?R:D}o(v,"d");function x(D){let k;for(let L=0;L1&&D.scheme==="file"?`//${D.authority}${D.path}`:D.path.charCodeAt(0)===47&&(D.path.charCodeAt(1)>=65&&D.path.charCodeAt(1)<=90||D.path.charCodeAt(1)>=97&&D.path.charCodeAt(1)<=122)&&D.path.charCodeAt(2)===58?k?D.path.substr(1):D.path[1].toLowerCase()+D.path.substr(2):D.path,i&&(L=L.replace(/\//g,"\\")),L}o(b,"m");function w(D,k){let L=k?x:v,R="",{scheme:O,authority:M,path:B,query:F,fragment:P}=D;if(O&&(R+=O,R+=":"),(M||O==="file")&&(R+=f,R+=f),M){let z=M.indexOf("@");if(z!==-1){let $=M.substr(0,z);M=M.substr(z+1),z=$.lastIndexOf(":"),z===-1?R+=L($,!1,!1):(R+=L($.substr(0,z),!1,!1),R+=":",R+=L($.substr(z+1),!1,!0)),R+="@"}M=M.toLowerCase(),z=M.lastIndexOf(":"),z===-1?R+=L(M,!1,!0):(R+=L(M.substr(0,z),!1,!0),R+=M.substr(z))}if(B){if(B.length>=3&&B.charCodeAt(0)===47&&B.charCodeAt(2)===58){let z=B.charCodeAt(1);z>=65&&z<=90&&(B=`/${String.fromCharCode(z+32)}:${B.substr(3)}`)}else if(B.length>=2&&B.charCodeAt(1)===58){let z=B.charCodeAt(0);z>=65&&z<=90&&(B=`${String.fromCharCode(z+32)}:${B.substr(2)}`)}R+=L(B,!0,!1)}return F&&(R+="?",R+=L(F,!1,!1)),P&&(R+="#",R+=k?P:v(P,!1,!1)),R}o(w,"y");function C(D){try{return decodeURIComponent(D)}catch{return D.length>3?D.substr(0,3)+C(D.substr(3)):D}}o(C,"v");let T=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function E(D){return D.match(T)?D.replace(T,k=>C(k)):D}o(E,"C");var A=r(470);let S=A.posix||A,_="/";var I;(function(D){D.joinPath=function(k,...L){return k.with({path:S.join(k.path,...L)})},D.resolvePath=function(k,...L){let R=k.path,O=!1;R[0]!==_&&(R=_+R,O=!0);let M=S.resolve(R,...L);return O&&M[0]===_&&!k.authority&&(M=M.substring(1)),k.with({path:M})},D.dirname=function(k){if(k.path.length===0||k.path===_)return k;let L=S.dirname(k.path);return L.length===1&&L.charCodeAt(0)===46&&(L=""),k.with({path:L})},D.basename=function(k){return S.basename(k.path)},D.extname=function(k){return S.extname(k.path)}})(I||(I={}))})(),Hle=n})();({URI:us,Utils:u1}=Hle)});var hs,Fc=N(()=>{"use strict";OM();(function(t){t.basename=u1.basename,t.dirname=u1.dirname,t.extname=u1.extname,t.joinPath=u1.joinPath,t.resolvePath=u1.resolvePath;function e(i,a){return i?.toString()===a?.toString()}o(e,"equals"),t.equals=e;function r(i,a){let s=typeof i=="string"?i:i.path,l=typeof a=="string"?a:a.path,u=s.split("/").filter(m=>m.length>0),h=l.split("/").filter(m=>m.length>0),f=0;for(;f{"use strict";Ule();h1();qo();Ps();Fc();(function(t){t[t.Changed=0]="Changed",t[t.Parsed=1]="Parsed",t[t.IndexedContent=2]="IndexedContent",t[t.ComputedScopes=3]="ComputedScopes",t[t.Linked=4]="Linked",t[t.IndexedReferences=5]="IndexedReferences",t[t.Validated=6]="Validated"})(kn||(kn={}));Nx=class{static{o(this,"DefaultLangiumDocumentFactory")}constructor(e){this.serviceRegistry=e.ServiceRegistry,this.textDocuments=e.workspace.TextDocuments,this.fileSystemProvider=e.workspace.FileSystemProvider}async fromUri(e,r=yr.CancellationToken.None){let n=await this.fileSystemProvider.readFile(e);return this.createAsync(e,n,r)}fromTextDocument(e,r,n){return r=r??us.parse(e.uri),yr.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromString(e,r,n){return yr.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromModel(e,r){return this.create(r,{$model:e})}create(e,r,n){if(typeof r=="string"){let i=this.parse(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else if("$model"in r){let i={value:r.$model,parserErrors:[],lexerErrors:[]};return this.createLangiumDocument(i,e)}else{let i=this.parse(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}async createAsync(e,r,n){if(typeof r=="string"){let i=await this.parseAsync(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else{let i=await this.parseAsync(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}createLangiumDocument(e,r,n,i){let a;if(n)a={parseResult:e,uri:r,state:kn.Parsed,references:[],textDocument:n};else{let s=this.createTextDocumentGetter(r,i);a={parseResult:e,uri:r,state:kn.Parsed,references:[],get textDocument(){return s()}}}return e.value.$document=a,a}async update(e,r){var n,i;let a=(n=e.parseResult.value.$cstNode)===null||n===void 0?void 0:n.root.fullText,s=(i=this.textDocuments)===null||i===void 0?void 0:i.get(e.uri.toString()),l=s?s.getText():await this.fileSystemProvider.readFile(e.uri);if(s)Object.defineProperty(e,"textDocument",{value:s});else{let u=this.createTextDocumentGetter(e.uri,l);Object.defineProperty(e,"textDocument",{get:u})}return a!==l&&(e.parseResult=await this.parseAsync(e.uri,l,r),e.parseResult.value.$document=e),e.state=kn.Parsed,e}parse(e,r,n){return this.serviceRegistry.getServices(e).parser.LangiumParser.parse(r,n)}parseAsync(e,r,n){return this.serviceRegistry.getServices(e).parser.AsyncParser.parse(r,n)}createTextDocumentGetter(e,r){let n=this.serviceRegistry,i;return()=>i??(i=c1.create(e.toString(),n.getServices(e).LanguageMetaData.languageId,0,r??""))}},Mx=class{static{o(this,"DefaultLangiumDocuments")}constructor(e){this.documentMap=new Map,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.serviceRegistry=e.ServiceRegistry}get all(){return en(this.documentMap.values())}addDocument(e){let r=e.uri.toString();if(this.documentMap.has(r))throw new Error(`A document with the URI '${r}' is already present.`);this.documentMap.set(r,e)}getDocument(e){let r=e.toString();return this.documentMap.get(r)}async getOrCreateDocument(e,r){let n=this.getDocument(e);return n||(n=await this.langiumDocumentFactory.fromUri(e,r),this.addDocument(n),n)}createDocument(e,r,n){if(n)return this.langiumDocumentFactory.fromString(r,e,n).then(i=>(this.addDocument(i),i));{let i=this.langiumDocumentFactory.fromString(r,e);return this.addDocument(i),i}}hasDocument(e){return this.documentMap.has(e.toString())}invalidateDocument(e){let r=e.toString(),n=this.documentMap.get(r);return n&&(this.serviceRegistry.getServices(e).references.Linker.unlink(n),n.state=kn.Changed,n.precomputedScopes=void 0,n.diagnostics=void 0),n}deleteDocument(e){let r=e.toString(),n=this.documentMap.get(r);return n&&(n.state=kn.Changed,this.documentMap.delete(r)),n}}});var PM,Ix,BM=N(()=>{"use strict";qo();Rl();is();Yo();h1();PM=Symbol("ref_resolving"),Ix=class{static{o(this,"DefaultLinker")}constructor(e){this.reflection=e.shared.AstReflection,this.langiumDocuments=()=>e.shared.workspace.LangiumDocuments,this.scopeProvider=e.references.ScopeProvider,this.astNodeLocator=e.workspace.AstNodeLocator}async link(e,r=yr.CancellationToken.None){for(let n of Wo(e.parseResult.value))await xi(r),Ag(n).forEach(i=>this.doLink(i,e))}doLink(e,r){var n;let i=e.reference;if(i._ref===void 0){i._ref=PM;try{let a=this.getCandidate(e);if(jd(a))i._ref=a;else if(i._nodeDescription=a,this.langiumDocuments().hasDocument(a.documentUri)){let s=this.loadAstNode(a);i._ref=s??this.createLinkingError(e,a)}else i._ref=void 0}catch(a){console.error(`An error occurred while resolving reference to '${i.$refText}':`,a);let s=(n=a.message)!==null&&n!==void 0?n:String(a);i._ref=Object.assign(Object.assign({},e),{message:`An error occurred while resolving reference to '${i.$refText}': ${s}`})}r.references.push(i)}}unlink(e){for(let r of e.references)delete r._ref,delete r._nodeDescription;e.references=[]}getCandidate(e){let n=this.scopeProvider.getScope(e).getElement(e.reference.$refText);return n??this.createLinkingError(e)}buildReference(e,r,n,i){let a=this,s={$refNode:n,$refText:i,get ref(){var l;if(ii(this._ref))return this._ref;if(kR(this._nodeDescription)){let u=a.loadAstNode(this._nodeDescription);this._ref=u??a.createLinkingError({reference:s,container:e,property:r},this._nodeDescription)}else if(this._ref===void 0){this._ref=PM;let u=H2(e).$document,h=a.getLinkedNode({reference:s,container:e,property:r});if(h.error&&u&&u.state{"use strict";Ol();o(Wle,"isNamed");Ox=class{static{o(this,"DefaultNameProvider")}getName(e){if(Wle(e))return e.name}getNameNode(e){return Q2(e.$cstNode,"name")}}});var Px,$M=N(()=>{"use strict";Ol();Rl();is();Nl();Ps();Fc();Px=class{static{o(this,"DefaultReferences")}constructor(e){this.nameProvider=e.references.NameProvider,this.index=e.shared.workspace.IndexManager,this.nodeLocator=e.workspace.AstNodeLocator}findDeclaration(e){if(e){let r=hN(e),n=e.astNode;if(r&&n){let i=n[r.feature];if(va(i))return i.ref;if(Array.isArray(i)){for(let a of i)if(va(a)&&a.$refNode&&a.$refNode.offset<=e.offset&&a.$refNode.end>=e.end)return a.ref}}if(n){let i=this.nameProvider.getNameNode(n);if(i&&(i===e||SR(e,i)))return n}}}findDeclarationNode(e){let r=this.findDeclaration(e);if(r?.$cstNode){let n=this.nameProvider.getNameNode(r);return n??r.$cstNode}}findReferences(e,r){let n=[];if(r.includeDeclaration){let a=this.getReferenceToSelf(e);a&&n.push(a)}let i=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e));return r.documentUri&&(i=i.filter(a=>hs.equals(a.sourceUri,r.documentUri))),n.push(...i),en(n)}getReferenceToSelf(e){let r=this.nameProvider.getNameNode(e);if(r){let n=Pa(e),i=this.nodeLocator.getAstNodePath(e);return{sourceUri:n.uri,sourcePath:i,targetUri:n.uri,targetPath:i,segment:Qd(r),local:!0}}}}});var Bl,vp,f1=N(()=>{"use strict";Ps();Bl=class{static{o(this,"MultiMap")}constructor(e){if(this.map=new Map,e)for(let[r,n]of e)this.add(r,n)}get size(){return zm.sum(en(this.map.values()).map(e=>e.length))}clear(){this.map.clear()}delete(e,r){if(r===void 0)return this.map.delete(e);{let n=this.map.get(e);if(n){let i=n.indexOf(r);if(i>=0)return n.length===1?this.map.delete(e):n.splice(i,1),!0}return!1}}get(e){var r;return(r=this.map.get(e))!==null&&r!==void 0?r:[]}has(e,r){if(r===void 0)return this.map.has(e);{let n=this.map.get(e);return n?n.indexOf(r)>=0:!1}}add(e,r){return this.map.has(e)?this.map.get(e).push(r):this.map.set(e,[r]),this}addAll(e,r){return this.map.has(e)?this.map.get(e).push(...r):this.map.set(e,Array.from(r)),this}forEach(e){this.map.forEach((r,n)=>r.forEach(i=>e(i,n,this)))}[Symbol.iterator](){return this.entries().iterator()}entries(){return en(this.map.entries()).flatMap(([e,r])=>r.map(n=>[e,n]))}keys(){return en(this.map.keys())}values(){return en(this.map.values()).flat()}entriesGroupedByKey(){return en(this.map.entries())}},vp=class{static{o(this,"BiMap")}get size(){return this.map.size}constructor(e){if(this.map=new Map,this.inverse=new Map,e)for(let[r,n]of e)this.set(r,n)}clear(){this.map.clear(),this.inverse.clear()}set(e,r){return this.map.set(e,r),this.inverse.set(r,e),this}get(e){return this.map.get(e)}getKey(e){return this.inverse.get(e)}delete(e){let r=this.map.get(e);return r!==void 0?(this.map.delete(e),this.inverse.delete(r),!0):!1}}});var Bx,zM=N(()=>{"use strict";qo();is();f1();Yo();Bx=class{static{o(this,"DefaultScopeComputation")}constructor(e){this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider}async computeExports(e,r=yr.CancellationToken.None){return this.computeExportsForNode(e.parseResult.value,e,void 0,r)}async computeExportsForNode(e,r,n=W2,i=yr.CancellationToken.None){let a=[];this.exportNode(e,a,r);for(let s of n(e))await xi(i),this.exportNode(s,a,r);return a}exportNode(e,r,n){let i=this.nameProvider.getName(e);i&&r.push(this.descriptions.createDescription(e,i,n))}async computeLocalScopes(e,r=yr.CancellationToken.None){let n=e.parseResult.value,i=new Bl;for(let a of Nc(n))await xi(r),this.processNode(a,e,i);return i}processNode(e,r,n){let i=e.$container;if(i){let a=this.nameProvider.getName(e);a&&n.add(i,this.descriptions.createDescription(e,a,r))}}}});var d1,Fx,xFe,GM=N(()=>{"use strict";Ps();d1=class{static{o(this,"StreamScope")}constructor(e,r,n){var i;this.elements=e,this.outerScope=r,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1}getAllElements(){return this.outerScope?this.elements.concat(this.outerScope.getAllElements()):this.elements}getElement(e){let r=this.caseInsensitive?this.elements.find(n=>n.name.toLowerCase()===e.toLowerCase()):this.elements.find(n=>n.name===e);if(r)return r;if(this.outerScope)return this.outerScope.getElement(e)}},Fx=class{static{o(this,"MapScope")}constructor(e,r,n){var i;this.elements=new Map,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1;for(let a of e){let s=this.caseInsensitive?a.name.toLowerCase():a.name;this.elements.set(s,a)}this.outerScope=r}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r);if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getAllElements(){let e=en(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}},xFe={getElement(){},getAllElements(){return I2}}});var p1,$x,xp,_E,m1,DE=N(()=>{"use strict";p1=class{static{o(this,"DisposableCache")}constructor(){this.toDispose=[],this.isDisposed=!1}onDispose(e){this.toDispose.push(e)}dispose(){this.throwIfDisposed(),this.clear(),this.isDisposed=!0,this.toDispose.forEach(e=>e.dispose())}throwIfDisposed(){if(this.isDisposed)throw new Error("This cache has already been disposed")}},$x=class extends p1{static{o(this,"SimpleCache")}constructor(){super(...arguments),this.cache=new Map}has(e){return this.throwIfDisposed(),this.cache.has(e)}set(e,r){this.throwIfDisposed(),this.cache.set(e,r)}get(e,r){if(this.throwIfDisposed(),this.cache.has(e))return this.cache.get(e);if(r){let n=r();return this.cache.set(e,n),n}else return}delete(e){return this.throwIfDisposed(),this.cache.delete(e)}clear(){this.throwIfDisposed(),this.cache.clear()}},xp=class extends p1{static{o(this,"ContextCache")}constructor(e){super(),this.cache=new Map,this.converter=e??(r=>r)}has(e,r){return this.throwIfDisposed(),this.cacheForContext(e).has(r)}set(e,r,n){this.throwIfDisposed(),this.cacheForContext(e).set(r,n)}get(e,r,n){this.throwIfDisposed();let i=this.cacheForContext(e);if(i.has(r))return i.get(r);if(n){let a=n();return i.set(r,a),a}else return}delete(e,r){return this.throwIfDisposed(),this.cacheForContext(e).delete(r)}clear(e){if(this.throwIfDisposed(),e){let r=this.converter(e);this.cache.delete(r)}else this.cache.clear()}cacheForContext(e){let r=this.converter(e),n=this.cache.get(r);return n||(n=new Map,this.cache.set(r,n)),n}},_E=class extends xp{static{o(this,"DocumentCache")}constructor(e,r){super(n=>n.toString()),r?(this.toDispose.push(e.workspace.DocumentBuilder.onDocumentPhase(r,n=>{this.clear(n.uri.toString())})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{for(let a of i)this.clear(a)}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{let a=n.concat(i);for(let s of a)this.clear(s)}))}},m1=class extends $x{static{o(this,"WorkspaceCache")}constructor(e,r){super(),r?(this.toDispose.push(e.workspace.DocumentBuilder.onBuildPhase(r,()=>{this.clear()})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{i.length>0&&this.clear()}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate(()=>{this.clear()}))}}});var zx,VM=N(()=>{"use strict";GM();is();Ps();DE();zx=class{static{o(this,"DefaultScopeProvider")}constructor(e){this.reflection=e.shared.AstReflection,this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider,this.indexManager=e.shared.workspace.IndexManager,this.globalScopeCache=new m1(e.shared)}getScope(e){let r=[],n=this.reflection.getReferenceType(e),i=Pa(e.container).precomputedScopes;if(i){let s=e.container;do{let l=i.get(s);l.length>0&&r.push(en(l).filter(u=>this.reflection.isSubtype(u.type,n))),s=s.$container}while(s)}let a=this.getGlobalScope(n,e);for(let s=r.length-1;s>=0;s--)a=this.createScope(r[s],a);return a}createScope(e,r,n){return new d1(en(e),r,n)}createScopeForNodes(e,r,n){let i=en(e).map(a=>{let s=this.nameProvider.getName(a);if(s)return this.descriptions.createDescription(a,s)}).nonNullable();return new d1(i,r,n)}getGlobalScope(e,r){return this.globalScopeCache.get(e,()=>new Fx(this.indexManager.allElements(e)))}}});function UM(t){return typeof t.$comment=="string"}function qle(t){return typeof t=="object"&&!!t&&("$ref"in t||"$error"in t)}var Gx,LE=N(()=>{"use strict";OM();Rl();is();Ol();o(UM,"isAstNodeWithComment");o(qle,"isIntermediateReference");Gx=class{static{o(this,"DefaultJsonSerializer")}constructor(e){this.ignoreProperties=new Set(["$container","$containerProperty","$containerIndex","$document","$cstNode"]),this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider,this.commentProvider=e.documentation.CommentProvider}serialize(e,r){let n=r??{},i=r?.replacer,a=o((l,u)=>this.replacer(l,u,n),"defaultReplacer"),s=i?(l,u)=>i(l,u,a):a;try{return this.currentDocument=Pa(e),JSON.stringify(e,s,r?.space)}finally{this.currentDocument=void 0}}deserialize(e,r){let n=r??{},i=JSON.parse(e);return this.linkNode(i,i,n),i}replacer(e,r,{refText:n,sourceText:i,textRegions:a,comments:s,uriConverter:l}){var u,h,f,d;if(!this.ignoreProperties.has(e))if(va(r)){let p=r.ref,m=n?r.$refText:void 0;if(p){let g=Pa(p),y="";this.currentDocument&&this.currentDocument!==g&&(l?y=l(g.uri,r):y=g.uri.toString());let v=this.astNodeLocator.getAstNodePath(p);return{$ref:`${y}#${v}`,$refText:m}}else return{$error:(h=(u=r.error)===null||u===void 0?void 0:u.message)!==null&&h!==void 0?h:"Could not resolve reference",$refText:m}}else if(ii(r)){let p;if(a&&(p=this.addAstNodeRegionWithAssignmentsTo(Object.assign({},r)),(!e||r.$document)&&p?.$textRegion&&(p.$textRegion.documentURI=(f=this.currentDocument)===null||f===void 0?void 0:f.uri.toString())),i&&!e&&(p??(p=Object.assign({},r)),p.$sourceText=(d=r.$cstNode)===null||d===void 0?void 0:d.text),s){p??(p=Object.assign({},r));let m=this.commentProvider.getComment(r);m&&(p.$comment=m.replace(/\r/g,""))}return p??r}else return r}addAstNodeRegionWithAssignmentsTo(e){let r=o(n=>({offset:n.offset,end:n.end,length:n.length,range:n.range}),"createDocumentSegment");if(e.$cstNode){let n=e.$textRegion=r(e.$cstNode),i=n.assignments={};return Object.keys(e).filter(a=>!a.startsWith("$")).forEach(a=>{let s=oN(e.$cstNode,a).map(r);s.length!==0&&(i[a]=s)}),e}}linkNode(e,r,n,i,a,s){for(let[u,h]of Object.entries(e))if(Array.isArray(h))for(let f=0;f{"use strict";Fc();Vx=class{static{o(this,"DefaultServiceRegistry")}get map(){return this.fileExtensionMap}constructor(e){this.languageIdMap=new Map,this.fileExtensionMap=new Map,this.textDocuments=e?.workspace.TextDocuments}register(e){let r=e.LanguageMetaData;for(let n of r.fileExtensions)this.fileExtensionMap.has(n)&&console.warn(`The file extension ${n} is used by multiple languages. It is now assigned to '${r.languageId}'.`),this.fileExtensionMap.set(n,e);this.languageIdMap.set(r.languageId,e),this.languageIdMap.size===1?this.singleton=e:this.singleton=void 0}getServices(e){var r,n;if(this.singleton!==void 0)return this.singleton;if(this.languageIdMap.size===0)throw new Error("The service registry is empty. Use `register` to register the services of a language.");let i=(n=(r=this.textDocuments)===null||r===void 0?void 0:r.get(e))===null||n===void 0?void 0:n.languageId;if(i!==void 0){let l=this.languageIdMap.get(i);if(l)return l}let a=hs.extname(e),s=this.fileExtensionMap.get(a);if(!s)throw i?new Error(`The service registry contains no services for the extension '${a}' for language '${i}'.`):new Error(`The service registry contains no services for the extension '${a}'.`);return s}hasServices(e){try{return this.getServices(e),!0}catch{return!1}}get all(){return Array.from(this.languageIdMap.values())}}});function bp(t){return{code:t}}var g1,Ux,Hx=N(()=>{"use strict";Xo();f1();Yo();Ps();o(bp,"diagnosticData");(function(t){t.all=["fast","slow","built-in"]})(g1||(g1={}));Ux=class{static{o(this,"ValidationRegistry")}constructor(e){this.entries=new Bl,this.entriesBefore=[],this.entriesAfter=[],this.reflection=e.shared.AstReflection}register(e,r=this,n="fast"){if(n==="built-in")throw new Error("The 'built-in' category is reserved for lexer, parser, and linker errors.");for(let[i,a]of Object.entries(e)){let s=a;if(Array.isArray(s))for(let l of s){let u={check:this.wrapValidationException(l,r),category:n};this.addEntry(i,u)}else if(typeof s=="function"){let l={check:this.wrapValidationException(s,r),category:n};this.addEntry(i,l)}else Lc(s)}}wrapValidationException(e,r){return async(n,i,a)=>{await this.handleException(()=>e.call(r,n,i,a),"An error occurred during validation",i,n)}}async handleException(e,r,n,i){try{await e()}catch(a){if(Bc(a))throw a;console.error(`${r}:`,a),a instanceof Error&&a.stack&&console.error(a.stack);let s=a instanceof Error?a.message:String(a);n("error",`${r}: ${s}`,{node:i})}}addEntry(e,r){if(e==="AstNode"){this.entries.add("AstNode",r);return}for(let n of this.reflection.getAllSubTypes(e))this.entries.add(n,r)}getChecks(e,r){let n=en(this.entries.get(e)).concat(this.entries.get("AstNode"));return r&&(n=n.filter(i=>r.includes(i.category))),n.map(i=>i.check)}registerBeforeDocument(e,r=this){this.entriesBefore.push(this.wrapPreparationException(e,"An error occurred during set-up of the validation",r))}registerAfterDocument(e,r=this){this.entriesAfter.push(this.wrapPreparationException(e,"An error occurred during tear-down of the validation",r))}wrapPreparationException(e,r,n){return async(i,a,s,l)=>{await this.handleException(()=>e.call(n,i,a,s,l),r,a,i)}}get checksBefore(){return this.entriesBefore}get checksAfter(){return this.entriesAfter}}});function Yle(t){if(t.range)return t.range;let e;return typeof t.property=="string"?e=Q2(t.node.$cstNode,t.property,t.index):typeof t.keyword=="string"&&(e=cN(t.node.$cstNode,t.keyword,t.index)),e??(e=t.node.$cstNode),e?e.range:{start:{line:0,character:0},end:{line:0,character:0}}}function RE(t){switch(t){case"error":return 1;case"warning":return 2;case"info":return 3;case"hint":return 4;default:throw new Error("Invalid diagnostic severity: "+t)}}function Xle(t){switch(t){case"error":return bp(jo.LexingError);case"warning":return bp(jo.LexingWarning);case"info":return bp(jo.LexingInfo);case"hint":return bp(jo.LexingHint);default:throw new Error("Invalid diagnostic severity: "+t)}}var Wx,jo,WM=N(()=>{"use strict";qo();Ol();is();Nl();Yo();Hx();Wx=class{static{o(this,"DefaultDocumentValidator")}constructor(e){this.validationRegistry=e.validation.ValidationRegistry,this.metadata=e.LanguageMetaData}async validateDocument(e,r={},n=yr.CancellationToken.None){let i=e.parseResult,a=[];if(await xi(n),(!r.categories||r.categories.includes("built-in"))&&(this.processLexingErrors(i,a,r),r.stopAfterLexingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===jo.LexingError})||(this.processParsingErrors(i,a,r),r.stopAfterParsingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===jo.ParsingError}))||(this.processLinkingErrors(e,a,r),r.stopAfterLinkingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===jo.LinkingError}))))return a;try{a.push(...await this.validateAst(i.value,r,n))}catch(s){if(Bc(s))throw s;console.error("An error occurred during validation:",s)}return await xi(n),a}processLexingErrors(e,r,n){var i,a,s;let l=[...e.lexerErrors,...(a=(i=e.lexerReport)===null||i===void 0?void 0:i.diagnostics)!==null&&a!==void 0?a:[]];for(let u of l){let h=(s=u.severity)!==null&&s!==void 0?s:"error",f={severity:RE(h),range:{start:{line:u.line-1,character:u.column-1},end:{line:u.line-1,character:u.column+u.length-1}},message:u.message,data:Xle(h),source:this.getSource()};r.push(f)}}processParsingErrors(e,r,n){for(let i of e.parserErrors){let a;if(isNaN(i.token.startOffset)){if("previousToken"in i){let s=i.previousToken;if(isNaN(s.startOffset)){let l={line:0,character:0};a={start:l,end:l}}else{let l={line:s.endLine-1,character:s.endColumn};a={start:l,end:l}}}}else a=Gm(i.token);if(a){let s={severity:RE("error"),range:a,message:i.message,data:bp(jo.ParsingError),source:this.getSource()};r.push(s)}}}processLinkingErrors(e,r,n){for(let i of e.references){let a=i.error;if(a){let s={node:a.container,property:a.property,index:a.index,data:{code:jo.LinkingError,containerType:a.container.$type,property:a.property,refText:a.reference.$refText}};r.push(this.toDiagnostic("error",a.message,s))}}}async validateAst(e,r,n=yr.CancellationToken.None){let i=[],a=o((s,l,u)=>{i.push(this.toDiagnostic(s,l,u))},"acceptor");return await this.validateAstBefore(e,r,a,n),await this.validateAstNodes(e,r,a,n),await this.validateAstAfter(e,r,a,n),i}async validateAstBefore(e,r,n,i=yr.CancellationToken.None){var a;let s=this.validationRegistry.checksBefore;for(let l of s)await xi(i),await l(e,n,(a=r.categories)!==null&&a!==void 0?a:[],i)}async validateAstNodes(e,r,n,i=yr.CancellationToken.None){await Promise.all(Wo(e).map(async a=>{await xi(i);let s=this.validationRegistry.getChecks(a.$type,r.categories);for(let l of s)await l(a,n,i)}))}async validateAstAfter(e,r,n,i=yr.CancellationToken.None){var a;let s=this.validationRegistry.checksAfter;for(let l of s)await xi(i),await l(e,n,(a=r.categories)!==null&&a!==void 0?a:[],i)}toDiagnostic(e,r,n){return{message:r,range:Yle(n),severity:RE(e),code:n.code,codeDescription:n.codeDescription,tags:n.tags,relatedInformation:n.relatedInformation,data:n.data,source:this.getSource()}}getSource(){return this.metadata.languageId}};o(Yle,"getDiagnosticRange");o(RE,"toDiagnosticSeverity");o(Xle,"toDiagnosticData");(function(t){t.LexingError="lexing-error",t.LexingWarning="lexing-warning",t.LexingInfo="lexing-info",t.LexingHint="lexing-hint",t.ParsingError="parsing-error",t.LinkingError="linking-error"})(jo||(jo={}))});var qx,Yx,qM=N(()=>{"use strict";qo();Rl();is();Nl();Yo();Fc();qx=class{static{o(this,"DefaultAstNodeDescriptionProvider")}constructor(e){this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider}createDescription(e,r,n){let i=n??Pa(e);r??(r=this.nameProvider.getName(e));let a=this.astNodeLocator.getAstNodePath(e);if(!r)throw new Error(`Node at path ${a} has no name.`);let s,l=o(()=>{var u;return s??(s=Qd((u=this.nameProvider.getNameNode(e))!==null&&u!==void 0?u:e.$cstNode))},"nameSegmentGetter");return{node:e,name:r,get nameSegment(){return l()},selectionSegment:Qd(e.$cstNode),type:e.$type,documentUri:i.uri,path:a}}},Yx=class{static{o(this,"DefaultReferenceDescriptionProvider")}constructor(e){this.nodeLocator=e.workspace.AstNodeLocator}async createDescriptions(e,r=yr.CancellationToken.None){let n=[],i=e.parseResult.value;for(let a of Wo(i))await xi(r),Ag(a).filter(s=>!jd(s)).forEach(s=>{let l=this.createDescription(s);l&&n.push(l)});return n}createDescription(e){let r=e.reference.$nodeDescription,n=e.reference.$refNode;if(!r||!n)return;let i=Pa(e.container).uri;return{sourceUri:i,sourcePath:this.nodeLocator.getAstNodePath(e.container),targetUri:r.documentUri,targetPath:r.path,segment:Qd(n),local:hs.equals(r.documentUri,i)}}}});var Xx,YM=N(()=>{"use strict";Xx=class{static{o(this,"DefaultAstNodeLocator")}constructor(){this.segmentSeparator="/",this.indexSeparator="@"}getAstNodePath(e){if(e.$container){let r=this.getAstNodePath(e.$container),n=this.getPathSegment(e);return r+this.segmentSeparator+n}return""}getPathSegment({$containerProperty:e,$containerIndex:r}){if(!e)throw new Error("Missing '$containerProperty' in AST node.");return r!==void 0?e+this.indexSeparator+r:e}getAstNode(e,r){return r.split(this.segmentSeparator).reduce((i,a)=>{if(!i||a.length===0)return i;let s=a.indexOf(this.indexSeparator);if(s>0){let l=a.substring(0,s),u=parseInt(a.substring(s+1)),h=i[l];return h?.[u]}return i[a]},e)}}});var Kn={};var NE=N(()=>{"use strict";Sr(Kn,Sa(LM(),1))});var jx,XM=N(()=>{"use strict";NE();Yo();jx=class{static{o(this,"DefaultConfigurationProvider")}constructor(e){this._ready=new cs,this.settings={},this.workspaceConfig=!1,this.onConfigurationSectionUpdateEmitter=new Kn.Emitter,this.serviceRegistry=e.ServiceRegistry}get ready(){return this._ready.promise}initialize(e){var r,n;this.workspaceConfig=(n=(r=e.capabilities.workspace)===null||r===void 0?void 0:r.configuration)!==null&&n!==void 0?n:!1}async initialized(e){if(this.workspaceConfig){if(e.register){let r=this.serviceRegistry.all;e.register({section:r.map(n=>this.toSectionName(n.LanguageMetaData.languageId))})}if(e.fetchConfiguration){let r=this.serviceRegistry.all.map(i=>({section:this.toSectionName(i.LanguageMetaData.languageId)})),n=await e.fetchConfiguration(r);r.forEach((i,a)=>{this.updateSectionConfiguration(i.section,n[a])})}}this._ready.resolve()}updateConfiguration(e){e.settings&&Object.keys(e.settings).forEach(r=>{let n=e.settings[r];this.updateSectionConfiguration(r,n),this.onConfigurationSectionUpdateEmitter.fire({section:r,configuration:n})})}updateSectionConfiguration(e,r){this.settings[e]=r}async getConfiguration(e,r){await this.ready;let n=this.toSectionName(e);if(this.settings[n])return this.settings[n][r]}toSectionName(e){return`${e}`}get onConfigurationSectionUpdate(){return this.onConfigurationSectionUpdateEmitter.event}}});var ff,jM=N(()=>{"use strict";(function(t){function e(r){return{dispose:o(async()=>await r(),"dispose")}}o(e,"create"),t.create=e})(ff||(ff={}))});var Kx,KM=N(()=>{"use strict";qo();jM();f1();Yo();Ps();Hx();h1();Kx=class{static{o(this,"DefaultDocumentBuilder")}constructor(e){this.updateBuildOptions={validation:{categories:["built-in","fast"]}},this.updateListeners=[],this.buildPhaseListeners=new Bl,this.documentPhaseListeners=new Bl,this.buildState=new Map,this.documentBuildWaiters=new Map,this.currentState=kn.Changed,this.langiumDocuments=e.workspace.LangiumDocuments,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.textDocuments=e.workspace.TextDocuments,this.indexManager=e.workspace.IndexManager,this.serviceRegistry=e.ServiceRegistry}async build(e,r={},n=yr.CancellationToken.None){var i,a;for(let s of e){let l=s.uri.toString();if(s.state===kn.Validated){if(typeof r.validation=="boolean"&&r.validation)s.state=kn.IndexedReferences,s.diagnostics=void 0,this.buildState.delete(l);else if(typeof r.validation=="object"){let u=this.buildState.get(l),h=(i=u?.result)===null||i===void 0?void 0:i.validationChecks;if(h){let d=((a=r.validation.categories)!==null&&a!==void 0?a:g1.all).filter(p=>!h.includes(p));d.length>0&&(this.buildState.set(l,{completed:!1,options:{validation:Object.assign(Object.assign({},r.validation),{categories:d})},result:u.result}),s.state=kn.IndexedReferences)}}}else this.buildState.delete(l)}this.currentState=kn.Changed,await this.emitUpdate(e.map(s=>s.uri),[]),await this.buildDocuments(e,r,n)}async update(e,r,n=yr.CancellationToken.None){this.currentState=kn.Changed;for(let s of r)this.langiumDocuments.deleteDocument(s),this.buildState.delete(s.toString()),this.indexManager.remove(s);for(let s of e){if(!this.langiumDocuments.invalidateDocument(s)){let u=this.langiumDocumentFactory.fromModel({$type:"INVALID"},s);u.state=kn.Changed,this.langiumDocuments.addDocument(u)}this.buildState.delete(s.toString())}let i=en(e).concat(r).map(s=>s.toString()).toSet();this.langiumDocuments.all.filter(s=>!i.has(s.uri.toString())&&this.shouldRelink(s,i)).forEach(s=>{this.serviceRegistry.getServices(s.uri).references.Linker.unlink(s),s.state=Math.min(s.state,kn.ComputedScopes),s.diagnostics=void 0}),await this.emitUpdate(e,r),await xi(n);let a=this.sortDocuments(this.langiumDocuments.all.filter(s=>{var l;return s.staten(e,r)))}sortDocuments(e){let r=0,n=e.length-1;for(;r=0&&!this.hasTextDocument(e[n]);)n--;rn.error!==void 0)?!0:this.indexManager.isAffected(e,r)}onUpdate(e){return this.updateListeners.push(e),ff.create(()=>{let r=this.updateListeners.indexOf(e);r>=0&&this.updateListeners.splice(r,1)})}async buildDocuments(e,r,n){this.prepareBuild(e,r),await this.runCancelable(e,kn.Parsed,n,a=>this.langiumDocumentFactory.update(a,n)),await this.runCancelable(e,kn.IndexedContent,n,a=>this.indexManager.updateContent(a,n)),await this.runCancelable(e,kn.ComputedScopes,n,async a=>{let s=this.serviceRegistry.getServices(a.uri).references.ScopeComputation;a.precomputedScopes=await s.computeLocalScopes(a,n)}),await this.runCancelable(e,kn.Linked,n,a=>this.serviceRegistry.getServices(a.uri).references.Linker.link(a,n)),await this.runCancelable(e,kn.IndexedReferences,n,a=>this.indexManager.updateReferences(a,n));let i=e.filter(a=>this.shouldValidate(a));await this.runCancelable(i,kn.Validated,n,a=>this.validate(a,n));for(let a of e){let s=this.buildState.get(a.uri.toString());s&&(s.completed=!0)}}prepareBuild(e,r){for(let n of e){let i=n.uri.toString(),a=this.buildState.get(i);(!a||a.completed)&&this.buildState.set(i,{completed:!1,options:r,result:a?.result})}}async runCancelable(e,r,n,i){let a=e.filter(l=>l.statel.state===r);await this.notifyBuildPhase(s,r,n),this.currentState=r}onBuildPhase(e,r){return this.buildPhaseListeners.add(e,r),ff.create(()=>{this.buildPhaseListeners.delete(e,r)})}onDocumentPhase(e,r){return this.documentPhaseListeners.add(e,r),ff.create(()=>{this.documentPhaseListeners.delete(e,r)})}waitUntil(e,r,n){let i;if(r&&"path"in r?i=r:n=r,n??(n=yr.CancellationToken.None),i){let a=this.langiumDocuments.getDocument(i);if(a&&a.state>e)return Promise.resolve(i)}return this.currentState>=e?Promise.resolve(void 0):n.isCancellationRequested?Promise.reject(Pc):new Promise((a,s)=>{let l=this.onBuildPhase(e,()=>{if(l.dispose(),u.dispose(),i){let h=this.langiumDocuments.getDocument(i);a(h?.uri)}else a(void 0)}),u=n.onCancellationRequested(()=>{l.dispose(),u.dispose(),s(Pc)})})}async notifyDocumentPhase(e,r,n){let a=this.documentPhaseListeners.get(r).slice();for(let s of a)try{await s(e,n)}catch(l){if(!Bc(l))throw l}}async notifyBuildPhase(e,r,n){if(e.length===0)return;let a=this.buildPhaseListeners.get(r).slice();for(let s of a)await xi(n),await s(e,n)}shouldValidate(e){return!!this.getBuildOptions(e).validation}async validate(e,r){var n,i;let a=this.serviceRegistry.getServices(e.uri).validation.DocumentValidator,s=this.getBuildOptions(e).validation,l=typeof s=="object"?s:void 0,u=await a.validateDocument(e,l,r);e.diagnostics?e.diagnostics.push(...u):e.diagnostics=u;let h=this.buildState.get(e.uri.toString());if(h){(n=h.result)!==null&&n!==void 0||(h.result={});let f=(i=l?.categories)!==null&&i!==void 0?i:g1.all;h.result.validationChecks?h.result.validationChecks.push(...f):h.result.validationChecks=[...f]}}getBuildOptions(e){var r,n;return(n=(r=this.buildState.get(e.uri.toString()))===null||r===void 0?void 0:r.options)!==null&&n!==void 0?n:{}}}});var Qx,QM=N(()=>{"use strict";is();DE();qo();Ps();Fc();Qx=class{static{o(this,"DefaultIndexManager")}constructor(e){this.symbolIndex=new Map,this.symbolByTypeIndex=new xp,this.referenceIndex=new Map,this.documents=e.workspace.LangiumDocuments,this.serviceRegistry=e.ServiceRegistry,this.astReflection=e.AstReflection}findAllReferences(e,r){let n=Pa(e).uri,i=[];return this.referenceIndex.forEach(a=>{a.forEach(s=>{hs.equals(s.targetUri,n)&&s.targetPath===r&&i.push(s)})}),en(i)}allElements(e,r){let n=en(this.symbolIndex.keys());return r&&(n=n.filter(i=>!r||r.has(i))),n.map(i=>this.getFileDescriptions(i,e)).flat()}getFileDescriptions(e,r){var n;return r?this.symbolByTypeIndex.get(e,r,()=>{var a;return((a=this.symbolIndex.get(e))!==null&&a!==void 0?a:[]).filter(l=>this.astReflection.isSubtype(l.type,r))}):(n=this.symbolIndex.get(e))!==null&&n!==void 0?n:[]}remove(e){let r=e.toString();this.symbolIndex.delete(r),this.symbolByTypeIndex.clear(r),this.referenceIndex.delete(r)}async updateContent(e,r=yr.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).references.ScopeComputation.computeExports(e,r),a=e.uri.toString();this.symbolIndex.set(a,i),this.symbolByTypeIndex.clear(a)}async updateReferences(e,r=yr.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).workspace.ReferenceDescriptionProvider.createDescriptions(e,r);this.referenceIndex.set(e.uri.toString(),i)}isAffected(e,r){let n=this.referenceIndex.get(e.uri.toString());return n?n.some(i=>!i.local&&r.has(i.targetUri.toString())):!1}}});var Zx,ZM=N(()=>{"use strict";qo();Yo();Fc();Zx=class{static{o(this,"DefaultWorkspaceManager")}constructor(e){this.initialBuildOptions={},this._ready=new cs,this.serviceRegistry=e.ServiceRegistry,this.langiumDocuments=e.workspace.LangiumDocuments,this.documentBuilder=e.workspace.DocumentBuilder,this.fileSystemProvider=e.workspace.FileSystemProvider,this.mutex=e.workspace.WorkspaceLock}get ready(){return this._ready.promise}get workspaceFolders(){return this.folders}initialize(e){var r;this.folders=(r=e.workspaceFolders)!==null&&r!==void 0?r:void 0}initialized(e){return this.mutex.write(r=>{var n;return this.initializeWorkspace((n=this.folders)!==null&&n!==void 0?n:[],r)})}async initializeWorkspace(e,r=yr.CancellationToken.None){let n=await this.performStartup(e);await xi(r),await this.documentBuilder.build(n,this.initialBuildOptions,r)}async performStartup(e){let r=this.serviceRegistry.all.flatMap(a=>a.LanguageMetaData.fileExtensions),n=[],i=o(a=>{n.push(a),this.langiumDocuments.hasDocument(a.uri)||this.langiumDocuments.addDocument(a)},"collector");return await this.loadAdditionalDocuments(e,i),await Promise.all(e.map(a=>[a,this.getRootFolder(a)]).map(async a=>this.traverseFolder(...a,r,i))),this._ready.resolve(),n}loadAdditionalDocuments(e,r){return Promise.resolve()}getRootFolder(e){return us.parse(e.uri)}async traverseFolder(e,r,n,i){let a=await this.fileSystemProvider.readDirectory(r);await Promise.all(a.map(async s=>{if(this.includeEntry(e,s,n)){if(s.isDirectory)await this.traverseFolder(e,s.uri,n,i);else if(s.isFile){let l=await this.langiumDocuments.getOrCreateDocument(s.uri);i(l)}}}))}includeEntry(e,r,n){let i=hs.basename(r.uri);if(i.startsWith("."))return!1;if(r.isDirectory)return i!=="node_modules"&&i!=="out";if(r.isFile){let a=hs.extname(r.uri);return n.includes(a)}return!1}}});function IE(t){return Array.isArray(t)&&(t.length===0||"name"in t[0])}function eI(t){return t&&"modes"in t&&"defaultMode"in t}function JM(t){return!IE(t)&&!eI(t)}var Jx,ME,wp,OE=N(()=>{"use strict";cf();Jx=class{static{o(this,"DefaultLexerErrorMessageProvider")}buildUnexpectedCharactersMessage(e,r,n,i,a){return Gg.buildUnexpectedCharactersMessage(e,r,n,i,a)}buildUnableToPopLexerModeMessage(e){return Gg.buildUnableToPopLexerModeMessage(e)}},ME={mode:"full"},wp=class{static{o(this,"DefaultLexer")}constructor(e){this.errorMessageProvider=e.parser.LexerErrorMessageProvider,this.tokenBuilder=e.parser.TokenBuilder;let r=this.tokenBuilder.buildTokens(e.Grammar,{caseInsensitive:e.LanguageMetaData.caseInsensitive});this.tokenTypes=this.toTokenTypeDictionary(r);let n=JM(r)?Object.values(r):r,i=e.LanguageMetaData.mode==="production";this.chevrotainLexer=new Xn(n,{positionTracking:"full",skipValidations:i,errorMessageProvider:this.errorMessageProvider})}get definition(){return this.tokenTypes}tokenize(e,r=ME){var n,i,a;let s=this.chevrotainLexer.tokenize(e);return{tokens:s.tokens,errors:s.errors,hidden:(n=s.groups.hidden)!==null&&n!==void 0?n:[],report:(a=(i=this.tokenBuilder).flushLexingReport)===null||a===void 0?void 0:a.call(i,e)}}toTokenTypeDictionary(e){if(JM(e))return e;let r=eI(e)?Object.values(e.modes).flat():e,n={};return r.forEach(i=>n[i.name]=i),n}};o(IE,"isTokenTypeArray");o(eI,"isIMultiModeLexerDefinition");o(JM,"isTokenTypeDictionary")});function nI(t,e,r){let n,i;typeof t=="string"?(i=e,n=r):(i=t.range.start,n=e),i||(i=jr.create(0,0));let a=Qle(t),s=aI(n),l=wFe({lines:a,position:i,options:s});return CFe({index:0,tokens:l,position:i})}function iI(t,e){let r=aI(e),n=Qle(t);if(n.length===0)return!1;let i=n[0],a=n[n.length-1],s=r.start,l=r.end;return!!s?.exec(i)&&!!l?.exec(a)}function Qle(t){let e="";return typeof t=="string"?e=t:e=t.text,e.split(JR)}function wFe(t){var e,r,n;let i=[],a=t.position.line,s=t.position.character;for(let l=0;l=f.length){if(i.length>0){let m=jr.create(a,s);i.push({type:"break",content:"",range:Pr.create(m,m)})}}else{jle.lastIndex=d;let m=jle.exec(f);if(m){let g=m[0],y=m[1],v=jr.create(a,s+d),x=jr.create(a,s+d+g.length);i.push({type:"tag",content:y,range:Pr.create(v,x)}),d+=g.length,d=rI(f,d)}if(d0&&i[i.length-1].type==="break"?i.slice(0,-1):i}function TFe(t,e,r,n){let i=[];if(t.length===0){let a=jr.create(r,n),s=jr.create(r,n+e.length);i.push({type:"text",content:e,range:Pr.create(a,s)})}else{let a=0;for(let l of t){let u=l.index,h=e.substring(a,u);h.length>0&&i.push({type:"text",content:e.substring(a,u),range:Pr.create(jr.create(r,a+n),jr.create(r,u+n))});let f=h.length+1,d=l[1];if(i.push({type:"inline-tag",content:d,range:Pr.create(jr.create(r,a+f+n),jr.create(r,a+f+d.length+n))}),f+=d.length,l.length===4){f+=l[2].length;let p=l[3];i.push({type:"text",content:p,range:Pr.create(jr.create(r,a+f+n),jr.create(r,a+f+p.length+n))})}else i.push({type:"text",content:"",range:Pr.create(jr.create(r,a+f+n),jr.create(r,a+f+n))});a=u+l[0].length}let s=e.substring(a);s.length>0&&i.push({type:"text",content:s,range:Pr.create(jr.create(r,a+n),jr.create(r,a+n+s.length))})}return i}function rI(t,e){let r=t.substring(e).match(kFe);return r?e+r.index:t.length}function SFe(t){let e=t.match(EFe);if(e&&typeof e.index=="number")return e.index}function CFe(t){var e,r,n,i;let a=jr.create(t.position.line,t.position.character);if(t.tokens.length===0)return new PE([],Pr.create(a,a));let s=[];for(;t.index0){let u=rI(e,a);s=e.substring(u),e=e.substring(0,a)}return(t==="linkcode"||t==="link"&&r.link==="code")&&(s=`\`${s}\``),(i=(n=r.renderLink)===null||n===void 0?void 0:n.call(r,e,s))!==null&&i!==void 0?i:RFe(e,s)}}function RFe(t,e){try{return us.parse(t,!0),`[${e}](${t})`}catch{return t}}function Kle(t){return t.endsWith(` +`)?` +`:` + +`}var jle,bFe,kFe,EFe,PE,eb,tb,BE,sI=N(()=>{"use strict";mM();Lg();Fc();o(nI,"parseJSDoc");o(iI,"isJSDoc");o(Qle,"getLines");jle=/\s*(@([\p{L}][\p{L}\p{N}]*)?)/uy,bFe=/\{(@[\p{L}][\p{L}\p{N}]*)(\s*)([^\r\n}]+)?\}/gu;o(wFe,"tokenize");o(TFe,"buildInlineTokens");kFe=/\S/,EFe=/\s*$/;o(rI,"skipWhitespace");o(SFe,"lastCharacter");o(CFe,"parseJSDocComment");o(AFe,"parseJSDocElement");o(_Fe,"appendEmptyLine");o(Zle,"parseJSDocText");o(DFe,"parseJSDocInline");o(Jle,"parseJSDocTag");o(ece,"parseJSDocLine");o(aI,"normalizeOptions");o(tI,"normalizeOption");PE=class{static{o(this,"JSDocCommentImpl")}constructor(e,r){this.elements=e,this.range=r}getTag(e){return this.getAllTags().find(r=>r.name===e)}getTags(e){return this.getAllTags().filter(r=>r.name===e)}getAllTags(){return this.elements.filter(e=>"name"in e)}toString(){let e="";for(let r of this.elements)if(e.length===0)e=r.toString();else{let n=r.toString();e+=Kle(e)+n}return e.trim()}toMarkdown(e){let r="";for(let n of this.elements)if(r.length===0)r=n.toMarkdown(e);else{let i=n.toMarkdown(e);r+=Kle(r)+i}return r.trim()}},eb=class{static{o(this,"JSDocTagImpl")}constructor(e,r,n,i){this.name=e,this.content=r,this.inline=n,this.range=i}toString(){let e=`@${this.name}`,r=this.content.toString();return this.content.inlines.length===1?e=`${e} ${r}`:this.content.inlines.length>1&&(e=`${e} +${r}`),this.inline?`{${e}}`:e}toMarkdown(e){var r,n;return(n=(r=e?.renderTag)===null||r===void 0?void 0:r.call(e,this))!==null&&n!==void 0?n:this.toMarkdownDefault(e)}toMarkdownDefault(e){let r=this.content.toMarkdown(e);if(this.inline){let a=LFe(this.name,r,e??{});if(typeof a=="string")return a}let n="";e?.tag==="italic"||e?.tag===void 0?n="*":e?.tag==="bold"?n="**":e?.tag==="bold-italic"&&(n="***");let i=`${n}@${this.name}${n}`;return this.content.inlines.length===1?i=`${i} \u2014 ${r}`:this.content.inlines.length>1&&(i=`${i} +${r}`),this.inline?`{${i}}`:i}};o(LFe,"renderInlineTag");o(RFe,"renderLinkDefault");tb=class{static{o(this,"JSDocTextImpl")}constructor(e,r){this.inlines=e,this.range=r}toString(){let e="";for(let r=0;rn.range.start.line&&(e+=` +`)}return e}toMarkdown(e){let r="";for(let n=0;ni.range.start.line&&(r+=` +`)}return r}},BE=class{static{o(this,"JSDocLineImpl")}constructor(e,r){this.text=e,this.range=r}toString(){return this.text}toMarkdown(){return this.text}};o(Kle,"fillNewlines")});var rb,oI=N(()=>{"use strict";is();sI();rb=class{static{o(this,"JSDocDocumentationProvider")}constructor(e){this.indexManager=e.shared.workspace.IndexManager,this.commentProvider=e.documentation.CommentProvider}getDocumentation(e){let r=this.commentProvider.getComment(e);if(r&&iI(r))return nI(r).toMarkdown({renderLink:o((i,a)=>this.documentationLinkRenderer(e,i,a),"renderLink"),renderTag:o(i=>this.documentationTagRenderer(e,i),"renderTag")})}documentationLinkRenderer(e,r,n){var i;let a=(i=this.findNameInPrecomputedScopes(e,r))!==null&&i!==void 0?i:this.findNameInGlobalScope(e,r);if(a&&a.nameSegment){let s=a.nameSegment.range.start.line+1,l=a.nameSegment.range.start.character+1,u=a.documentUri.with({fragment:`L${s},${l}`});return`[${n}](${u.toString()})`}else return}documentationTagRenderer(e,r){}findNameInPrecomputedScopes(e,r){let i=Pa(e).precomputedScopes;if(!i)return;let a=e;do{let l=i.get(a).find(u=>u.name===r);if(l)return l;a=a.$container}while(a)}findNameInGlobalScope(e,r){return this.indexManager.allElements().find(i=>i.name===r)}}});var nb,lI=N(()=>{"use strict";LE();Nl();nb=class{static{o(this,"DefaultCommentProvider")}constructor(e){this.grammarConfig=()=>e.parser.GrammarConfig}getComment(e){var r;return UM(e)?e.$comment:(r=AR(e.$cstNode,this.grammarConfig().multilineCommentRules))===null||r===void 0?void 0:r.text}}});var ib,cI,uI,hI=N(()=>{"use strict";Yo();NE();ib=class{static{o(this,"DefaultAsyncParser")}constructor(e){this.syncParser=e.parser.LangiumParser}parse(e,r){return Promise.resolve(this.syncParser.parse(e))}},cI=class{static{o(this,"AbstractThreadedAsyncParser")}constructor(e){this.threadCount=8,this.terminationDelay=200,this.workerPool=[],this.queue=[],this.hydrator=e.serializer.Hydrator}initializeWorkers(){for(;this.workerPool.length{if(this.queue.length>0){let r=this.queue.shift();r&&(e.lock(),r.resolve(e))}}),this.workerPool.push(e)}}async parse(e,r){let n=await this.acquireParserWorker(r),i=new cs,a,s=r.onCancellationRequested(()=>{a=setTimeout(()=>{this.terminateWorker(n)},this.terminationDelay)});return n.parse(e).then(l=>{let u=this.hydrator.hydrate(l);i.resolve(u)}).catch(l=>{i.reject(l)}).finally(()=>{s.dispose(),clearTimeout(a)}),i.promise}terminateWorker(e){e.terminate();let r=this.workerPool.indexOf(e);r>=0&&this.workerPool.splice(r,1)}async acquireParserWorker(e){this.initializeWorkers();for(let n of this.workerPool)if(n.ready)return n.lock(),n;let r=new cs;return e.onCancellationRequested(()=>{let n=this.queue.indexOf(r);n>=0&&this.queue.splice(n,1),r.reject(Pc)}),this.queue.push(r),r.promise}},uI=class{static{o(this,"ParserWorker")}get ready(){return this._ready}get onReady(){return this.onReadyEmitter.event}constructor(e,r,n,i){this.onReadyEmitter=new Kn.Emitter,this.deferred=new cs,this._ready=!0,this._parsing=!1,this.sendMessage=e,this._terminate=i,r(a=>{let s=a;this.deferred.resolve(s),this.unlock()}),n(a=>{this.deferred.reject(a),this.unlock()})}terminate(){this.deferred.reject(Pc),this._terminate()}lock(){this._ready=!1}unlock(){this._parsing=!1,this._ready=!0,this.onReadyEmitter.fire()}parse(e){if(this._parsing)throw new Error("Parser worker is busy");return this._parsing=!0,this.deferred=new cs,this.sendMessage(e),this.deferred.promise}}});var ab,fI=N(()=>{"use strict";qo();Yo();ab=class{static{o(this,"DefaultWorkspaceLock")}constructor(){this.previousTokenSource=new yr.CancellationTokenSource,this.writeQueue=[],this.readQueue=[],this.done=!0}write(e){this.cancelWrite();let r=CE();return this.previousTokenSource=r,this.enqueue(this.writeQueue,e,r.token)}read(e){return this.enqueue(this.readQueue,e)}enqueue(e,r,n=yr.CancellationToken.None){let i=new cs,a={action:r,deferred:i,cancellationToken:n};return e.push(a),this.performNextOperation(),i.promise}async performNextOperation(){if(!this.done)return;let e=[];if(this.writeQueue.length>0)e.push(this.writeQueue.shift());else if(this.readQueue.length>0)e.push(...this.readQueue.splice(0,this.readQueue.length));else return;this.done=!1,await Promise.all(e.map(async({action:r,deferred:n,cancellationToken:i})=>{try{let a=await Promise.resolve().then(()=>r(i));n.resolve(a)}catch(a){Bc(a)?n.resolve(void 0):n.reject(a)}})),this.done=!0,this.performNextOperation()}cancelWrite(){this.previousTokenSource.cancel()}}});var sb,dI=N(()=>{"use strict";gE();Rc();Rl();is();f1();Nl();sb=class{static{o(this,"DefaultHydrator")}constructor(e){this.grammarElementIdMap=new vp,this.tokenTypeIdMap=new vp,this.grammar=e.Grammar,this.lexer=e.parser.Lexer,this.linker=e.references.Linker}dehydrate(e){return{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport?this.dehydrateLexerReport(e.lexerReport):void 0,parserErrors:e.parserErrors.map(r=>Object.assign(Object.assign({},r),{message:r.message})),value:this.dehydrateAstNode(e.value,this.createDehyrationContext(e.value))}}dehydrateLexerReport(e){return e}createDehyrationContext(e){let r=new Map,n=new Map;for(let i of Wo(e))r.set(i,{});if(e.$cstNode)for(let i of Kd(e.$cstNode))n.set(i,{});return{astNodes:r,cstNodes:n}}dehydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode!==void 0&&(n.$cstNode=this.dehydrateCstNode(e.$cstNode,r));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let l of a)ii(l)?s.push(this.dehydrateAstNode(l,r)):va(l)?s.push(this.dehydrateReference(l,r)):s.push(l)}else ii(a)?n[i]=this.dehydrateAstNode(a,r):va(a)?n[i]=this.dehydrateReference(a,r):a!==void 0&&(n[i]=a);return n}dehydrateReference(e,r){let n={};return n.$refText=e.$refText,e.$refNode&&(n.$refNode=r.cstNodes.get(e.$refNode)),n}dehydrateCstNode(e,r){let n=r.cstNodes.get(e);return M2(e)?n.fullText=e.fullText:n.grammarSource=this.getGrammarElementId(e.grammarSource),n.hidden=e.hidden,n.astNode=r.astNodes.get(e.astNode),Ll(e)?n.content=e.content.map(i=>this.dehydrateCstNode(i,r)):af(e)&&(n.tokenType=e.tokenType.name,n.offset=e.offset,n.length=e.length,n.startLine=e.range.start.line,n.startColumn=e.range.start.character,n.endLine=e.range.end.line,n.endColumn=e.range.end.character),n}hydrate(e){let r=e.value,n=this.createHydrationContext(r);return"$cstNode"in r&&this.hydrateCstNode(r.$cstNode,n),{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport,parserErrors:e.parserErrors,value:this.hydrateAstNode(r,n)}}createHydrationContext(e){let r=new Map,n=new Map;for(let a of Wo(e))r.set(a,{});let i;if(e.$cstNode)for(let a of Kd(e.$cstNode)){let s;"fullText"in a?(s=new a1(a.fullText),i=s):"content"in a?s=new mp:"tokenType"in a&&(s=this.hydrateCstLeafNode(a)),s&&(n.set(a,s),s.root=i)}return{astNodes:r,cstNodes:n}}hydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode&&(n.$cstNode=r.cstNodes.get(e.$cstNode));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let l of a)ii(l)?s.push(this.setParent(this.hydrateAstNode(l,r),n)):va(l)?s.push(this.hydrateReference(l,n,i,r)):s.push(l)}else ii(a)?n[i]=this.setParent(this.hydrateAstNode(a,r),n):va(a)?n[i]=this.hydrateReference(a,n,i,r):a!==void 0&&(n[i]=a);return n}setParent(e,r){return e.$container=r,e}hydrateReference(e,r,n,i){return this.linker.buildReference(r,n,i.cstNodes.get(e.$refNode),e.$refText)}hydrateCstNode(e,r,n=0){let i=r.cstNodes.get(e);if(typeof e.grammarSource=="number"&&(i.grammarSource=this.getGrammarElement(e.grammarSource)),i.astNode=r.astNodes.get(e.astNode),Ll(i))for(let a of e.content){let s=this.hydrateCstNode(a,r,n++);i.content.push(s)}return i}hydrateCstLeafNode(e){let r=this.getTokenType(e.tokenType),n=e.offset,i=e.length,a=e.startLine,s=e.startColumn,l=e.endLine,u=e.endColumn,h=e.hidden;return new pp(n,i,{start:{line:a,character:s},end:{line:l,character:u}},r,h)}getTokenType(e){return this.lexer.definition[e]}getGrammarElementId(e){if(e)return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.get(e)}getGrammarElement(e){return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.getKey(e)}createGrammarElementIdMap(){let e=0;for(let r of Wo(this.grammar))G2(r)&&this.grammarElementIdMap.set(r,e++)}}});function fs(t){return{documentation:{CommentProvider:o(e=>new nb(e),"CommentProvider"),DocumentationProvider:o(e=>new rb(e),"DocumentationProvider")},parser:{AsyncParser:o(e=>new ib(e),"AsyncParser"),GrammarConfig:o(e=>pN(e),"GrammarConfig"),LangiumParser:o(e=>TM(e),"LangiumParser"),CompletionParser:o(e=>bM(e),"CompletionParser"),ValueConverter:o(()=>new yp,"ValueConverter"),TokenBuilder:o(()=>new Uu,"TokenBuilder"),Lexer:o(e=>new wp(e),"Lexer"),ParserErrorMessageProvider:o(()=>new s1,"ParserErrorMessageProvider"),LexerErrorMessageProvider:o(()=>new Jx,"LexerErrorMessageProvider")},workspace:{AstNodeLocator:o(()=>new Xx,"AstNodeLocator"),AstNodeDescriptionProvider:o(e=>new qx(e),"AstNodeDescriptionProvider"),ReferenceDescriptionProvider:o(e=>new Yx(e),"ReferenceDescriptionProvider")},references:{Linker:o(e=>new Ix(e),"Linker"),NameProvider:o(()=>new Ox,"NameProvider"),ScopeProvider:o(e=>new zx(e),"ScopeProvider"),ScopeComputation:o(e=>new Bx(e),"ScopeComputation"),References:o(e=>new Px(e),"References")},serializer:{Hydrator:o(e=>new sb(e),"Hydrator"),JsonSerializer:o(e=>new Gx(e),"JsonSerializer")},validation:{DocumentValidator:o(e=>new Wx(e),"DocumentValidator"),ValidationRegistry:o(e=>new Ux(e),"ValidationRegistry")},shared:o(()=>t.shared,"shared")}}function ds(t){return{ServiceRegistry:o(e=>new Vx(e),"ServiceRegistry"),workspace:{LangiumDocuments:o(e=>new Mx(e),"LangiumDocuments"),LangiumDocumentFactory:o(e=>new Nx(e),"LangiumDocumentFactory"),DocumentBuilder:o(e=>new Kx(e),"DocumentBuilder"),IndexManager:o(e=>new Qx(e),"IndexManager"),WorkspaceManager:o(e=>new Zx(e),"WorkspaceManager"),FileSystemProvider:o(e=>t.fileSystemProvider(e),"FileSystemProvider"),WorkspaceLock:o(()=>new ab,"WorkspaceLock"),ConfigurationProvider:o(e=>new jx(e),"ConfigurationProvider")}}}var pI=N(()=>{"use strict";mN();wM();kM();wE();EM();BM();FM();$M();zM();VM();LE();HM();WM();Hx();qM();YM();XM();KM();h1();QM();ZM();OE();oI();lI();Lx();hI();fI();dI();o(fs,"createDefaultCoreModule");o(ds,"createDefaultSharedCoreModule")});function ui(t,e,r,n,i,a,s,l,u){let h=[t,e,r,n,i,a,s,l,u].reduce(FE,{});return ace(h)}function ice(t){if(t&&t[nce])for(let e of Object.values(t))ice(e);return t}function ace(t,e){let r=new Proxy({},{deleteProperty:o(()=>!1,"deleteProperty"),set:o(()=>{throw new Error("Cannot set property on injected service container")},"set"),get:o((n,i)=>i===nce?!0:rce(n,i,t,e||r),"get"),getOwnPropertyDescriptor:o((n,i)=>(rce(n,i,t,e||r),Object.getOwnPropertyDescriptor(n,i)),"getOwnPropertyDescriptor"),has:o((n,i)=>i in t,"has"),ownKeys:o(()=>[...Object.getOwnPropertyNames(t)],"ownKeys")});return r}function rce(t,e,r,n){if(e in t){if(t[e]instanceof Error)throw new Error("Construction failure. Please make sure that your dependencies are constructable.",{cause:t[e]});if(t[e]===tce)throw new Error('Cycle detected. Please make "'+String(e)+'" lazy. Visit https://langium.org/docs/reference/configuration-services/#resolving-cyclic-dependencies');return t[e]}else if(e in r){let i=r[e];t[e]=tce;try{t[e]=typeof i=="function"?i(n):ace(i,n)}catch(a){throw t[e]=a instanceof Error?a:void 0,a}return t[e]}else return}function FE(t,e){if(e){for(let[r,n]of Object.entries(e))if(n!==void 0){let i=t[r];i!==null&&n!==null&&typeof i=="object"&&typeof n=="object"?t[r]=FE(i,n):t[r]=n}}return t}var mI,nce,tce,gI=N(()=>{"use strict";(function(t){t.merge=(e,r)=>FE(FE({},e),r)})(mI||(mI={}));o(ui,"inject");nce=Symbol("isProxy");o(ice,"eagerLoad");o(ace,"_inject");tce=Symbol();o(rce,"_resolve");o(FE,"_merge")});var sce=N(()=>{"use strict"});var oce=N(()=>{"use strict";lI();oI();sI()});var lce=N(()=>{"use strict"});var cce=N(()=>{"use strict";mN();lce()});var yI,Tp,$E,vI,uce=N(()=>{"use strict";cf();wE();OE();yI={indentTokenName:"INDENT",dedentTokenName:"DEDENT",whitespaceTokenName:"WS",ignoreIndentationDelimiters:[]};(function(t){t.REGULAR="indentation-sensitive",t.IGNORE_INDENTATION="ignore-indentation"})(Tp||(Tp={}));$E=class extends Uu{static{o(this,"IndentationAwareTokenBuilder")}constructor(e=yI){super(),this.indentationStack=[0],this.whitespaceRegExp=/[ \t]+/y,this.options=Object.assign(Object.assign({},yI),e),this.indentTokenType=of({name:this.options.indentTokenName,pattern:this.indentMatcher.bind(this),line_breaks:!1}),this.dedentTokenType=of({name:this.options.dedentTokenName,pattern:this.dedentMatcher.bind(this),line_breaks:!1})}buildTokens(e,r){let n=super.buildTokens(e,r);if(!IE(n))throw new Error("Invalid tokens built by default builder");let{indentTokenName:i,dedentTokenName:a,whitespaceTokenName:s,ignoreIndentationDelimiters:l}=this.options,u,h,f,d=[];for(let p of n){for(let[m,g]of l)p.name===m?p.PUSH_MODE=Tp.IGNORE_INDENTATION:p.name===g&&(p.POP_MODE=!0);p.name===a?u=p:p.name===i?h=p:p.name===s?f=p:d.push(p)}if(!u||!h||!f)throw new Error("Some indentation/whitespace tokens not found!");return l.length>0?{modes:{[Tp.REGULAR]:[u,h,...d,f],[Tp.IGNORE_INDENTATION]:[...d,f]},defaultMode:Tp.REGULAR}:[u,h,f,...d]}flushLexingReport(e){let r=super.flushLexingReport(e);return Object.assign(Object.assign({},r),{remainingDedents:this.flushRemainingDedents(e)})}isStartOfLine(e,r){return r===0||`\r +`.includes(e[r-1])}matchWhitespace(e,r,n,i){var a;this.whitespaceRegExp.lastIndex=r;let s=this.whitespaceRegExp.exec(e);return{currIndentLevel:(a=s?.[0].length)!==null&&a!==void 0?a:0,prevIndentLevel:this.indentationStack.at(-1),match:s}}createIndentationTokenInstance(e,r,n,i){let a=this.getLineNumber(r,i);return $u(e,n,i,i+n.length,a,a,1,n.length)}getLineNumber(e,r){return e.substring(0,r).split(/\r\n|\r|\n/).length}indentMatcher(e,r,n,i){if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:a,prevIndentLevel:s,match:l}=this.matchWhitespace(e,r,n,i);return a<=s?null:(this.indentationStack.push(a),l)}dedentMatcher(e,r,n,i){var a,s,l,u;if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:h,prevIndentLevel:f,match:d}=this.matchWhitespace(e,r,n,i);if(h>=f)return null;let p=this.indentationStack.lastIndexOf(h);if(p===-1)return this.diagnostics.push({severity:"error",message:`Invalid dedent level ${h} at offset: ${r}. Current indentation stack: ${this.indentationStack}`,offset:r,length:(s=(a=d?.[0])===null||a===void 0?void 0:a.length)!==null&&s!==void 0?s:0,line:this.getLineNumber(e,r),column:1}),null;let m=this.indentationStack.length-p-1,g=(u=(l=e.substring(0,r).match(/[\r\n]+$/))===null||l===void 0?void 0:l[0].length)!==null&&u!==void 0?u:1;for(let y=0;y1;)r.push(this.createIndentationTokenInstance(this.dedentTokenType,e,"",e.length)),this.indentationStack.pop();return this.indentationStack=[0],r}},vI=class extends wp{static{o(this,"IndentationAwareLexer")}constructor(e){if(super(e),e.parser.TokenBuilder instanceof $E)this.indentationTokenBuilder=e.parser.TokenBuilder;else throw new Error("IndentationAwareLexer requires an accompanying IndentationAwareTokenBuilder")}tokenize(e,r=ME){let n=super.tokenize(e),i=n.report;r?.mode==="full"&&n.tokens.push(...i.remainingDedents),i.remainingDedents=[];let{indentTokenType:a,dedentTokenType:s}=this.indentationTokenBuilder,l=a.tokenTypeIdx,u=s.tokenTypeIdx,h=[],f=n.tokens.length-1;for(let d=0;d=0&&h.push(n.tokens[f]),n.tokens=h,n}}});var hce=N(()=>{"use strict"});var fce=N(()=>{"use strict";hI();wM();gE();uce();kM();Lx();OE();bE();hce();wE();EM()});var dce=N(()=>{"use strict";BM();FM();$M();GM();zM();VM()});var pce=N(()=>{"use strict";dI();LE()});var zE,ps,xI=N(()=>{"use strict";zE=class{static{o(this,"EmptyFileSystemProvider")}readFile(){throw new Error("No file system is available.")}async readDirectory(){return[]}},ps={fileSystemProvider:o(()=>new zE,"fileSystemProvider")}});function IFe(){let t=ui(ds(ps),MFe),e=ui(fs({shared:t}),NFe);return t.ServiceRegistry.register(e),e}function Hu(t){var e;let r=IFe(),n=r.serializer.JsonSerializer.deserialize(t);return r.shared.workspace.LangiumDocumentFactory.fromModel(n,us.parse(`memory://${(e=n.name)!==null&&e!==void 0?e:"grammar"}.langium`)),n}var NFe,MFe,mce=N(()=>{"use strict";pI();gI();Rc();xI();Fc();NFe={Grammar:o(()=>{},"Grammar"),LanguageMetaData:o(()=>({caseInsensitive:!1,fileExtensions:[".langium"],languageId:"langium"}),"LanguageMetaData")},MFe={AstReflection:o(()=>new Cg,"AstReflection")};o(IFe,"createMinimalGrammarServices");o(Hu,"loadGrammarFromJson")});var Gr={};hr(Gr,{AstUtils:()=>xk,BiMap:()=>vp,Cancellation:()=>yr,ContextCache:()=>xp,CstUtils:()=>ck,DONE_RESULT:()=>Ia,Deferred:()=>cs,Disposable:()=>ff,DisposableCache:()=>p1,DocumentCache:()=>_E,EMPTY_STREAM:()=>I2,ErrorWithLocation:()=>Zd,GrammarUtils:()=>Ek,MultiMap:()=>Bl,OperationCancelled:()=>Pc,Reduction:()=>zm,RegExpUtils:()=>Tk,SimpleCache:()=>$x,StreamImpl:()=>ao,TreeStreamImpl:()=>_c,URI:()=>us,UriUtils:()=>hs,WorkspaceCache:()=>m1,assertUnreachable:()=>Lc,delayNextTick:()=>MM,interruptAndCheck:()=>xi,isOperationCancelled:()=>Bc,loadGrammarFromJson:()=>Hu,setInterruptionPeriod:()=>$le,startCancelableOperation:()=>CE,stream:()=>en});var gce=N(()=>{"use strict";DE();NE();Sr(Gr,Kn);f1();jM();uk();mce();Yo();Ps();Fc();is();qo();Nl();Ol();Lg()});var yce=N(()=>{"use strict";WM();Hx()});var vce=N(()=>{"use strict";qM();YM();XM();KM();h1();xI();QM();fI();ZM()});var xa={};hr(xa,{AbstractAstReflection:()=>Xd,AbstractCstNode:()=>Cx,AbstractLangiumParser:()=>Ax,AbstractParserErrorMessageProvider:()=>vE,AbstractThreadedAsyncParser:()=>cI,AstUtils:()=>xk,BiMap:()=>vp,Cancellation:()=>yr,CompositeCstNodeImpl:()=>mp,ContextCache:()=>xp,CstNodeBuilder:()=>Sx,CstUtils:()=>ck,DEFAULT_TOKENIZE_OPTIONS:()=>ME,DONE_RESULT:()=>Ia,DatatypeSymbol:()=>yE,DefaultAstNodeDescriptionProvider:()=>qx,DefaultAstNodeLocator:()=>Xx,DefaultAsyncParser:()=>ib,DefaultCommentProvider:()=>nb,DefaultConfigurationProvider:()=>jx,DefaultDocumentBuilder:()=>Kx,DefaultDocumentValidator:()=>Wx,DefaultHydrator:()=>sb,DefaultIndexManager:()=>Qx,DefaultJsonSerializer:()=>Gx,DefaultLangiumDocumentFactory:()=>Nx,DefaultLangiumDocuments:()=>Mx,DefaultLexer:()=>wp,DefaultLexerErrorMessageProvider:()=>Jx,DefaultLinker:()=>Ix,DefaultNameProvider:()=>Ox,DefaultReferenceDescriptionProvider:()=>Yx,DefaultReferences:()=>Px,DefaultScopeComputation:()=>Bx,DefaultScopeProvider:()=>zx,DefaultServiceRegistry:()=>Vx,DefaultTokenBuilder:()=>Uu,DefaultValueConverter:()=>yp,DefaultWorkspaceLock:()=>ab,DefaultWorkspaceManager:()=>Zx,Deferred:()=>cs,Disposable:()=>ff,DisposableCache:()=>p1,DocumentCache:()=>_E,DocumentState:()=>kn,DocumentValidator:()=>jo,EMPTY_SCOPE:()=>xFe,EMPTY_STREAM:()=>I2,EmptyFileSystem:()=>ps,EmptyFileSystemProvider:()=>zE,ErrorWithLocation:()=>Zd,GrammarAST:()=>U2,GrammarUtils:()=>Ek,IndentationAwareLexer:()=>vI,IndentationAwareTokenBuilder:()=>$E,JSDocDocumentationProvider:()=>rb,LangiumCompletionParser:()=>Dx,LangiumParser:()=>_x,LangiumParserErrorMessageProvider:()=>s1,LeafCstNodeImpl:()=>pp,LexingMode:()=>Tp,MapScope:()=>Fx,Module:()=>mI,MultiMap:()=>Bl,OperationCancelled:()=>Pc,ParserWorker:()=>uI,Reduction:()=>zm,RegExpUtils:()=>Tk,RootCstNodeImpl:()=>a1,SimpleCache:()=>$x,StreamImpl:()=>ao,StreamScope:()=>d1,TextDocument:()=>c1,TreeStreamImpl:()=>_c,URI:()=>us,UriUtils:()=>hs,ValidationCategory:()=>g1,ValidationRegistry:()=>Ux,ValueConverter:()=>Oc,WorkspaceCache:()=>m1,assertUnreachable:()=>Lc,createCompletionParser:()=>bM,createDefaultCoreModule:()=>fs,createDefaultSharedCoreModule:()=>ds,createGrammarConfig:()=>pN,createLangiumParser:()=>TM,createParser:()=>Rx,delayNextTick:()=>MM,diagnosticData:()=>bp,eagerLoad:()=>ice,getDiagnosticRange:()=>Yle,indentationBuilderDefaultOptions:()=>yI,inject:()=>ui,interruptAndCheck:()=>xi,isAstNode:()=>ii,isAstNodeDescription:()=>kR,isAstNodeWithComment:()=>UM,isCompositeCstNode:()=>Ll,isIMultiModeLexerDefinition:()=>eI,isJSDoc:()=>iI,isLeafCstNode:()=>af,isLinkingError:()=>jd,isNamed:()=>Wle,isOperationCancelled:()=>Bc,isReference:()=>va,isRootCstNode:()=>M2,isTokenTypeArray:()=>IE,isTokenTypeDictionary:()=>JM,loadGrammarFromJson:()=>Hu,parseJSDoc:()=>nI,prepareLangiumParser:()=>Nle,setInterruptionPeriod:()=>$le,startCancelableOperation:()=>CE,stream:()=>en,toDiagnosticData:()=>Xle,toDiagnosticSeverity:()=>RE});var Xo=N(()=>{"use strict";pI();gI();HM();sce();Rl();oce();cce();fce();dce();pce();gce();Sr(xa,Gr);yce();vce();Rc()});function Sce(t){return Fl.isInstance(t,ob)}function Cce(t){return Fl.isInstance(t,y1)}function Ace(t){return Fl.isInstance(t,v1)}function _ce(t){return Fl.isInstance(t,WE)}function Dce(t){return Fl.isInstance(t,x1)}function Lce(t){return Fl.isInstance(t,lb)}function Rce(t){return Fl.isInstance(t,b1)}function Nce(t){return Fl.isInstance(t,cb)}function Mce(t){return Fl.isInstance(t,ub)}function Ice(t){return Fl.isInstance(t,hb)}function Oce(t){return Fl.isInstance(t,fb)}var OFe,Lt,AI,ob,GE,y1,VE,UE,v1,WE,bI,wI,TI,x1,kI,lb,EI,b1,SI,cb,ub,hb,fb,qE,CI,HE,Pce,Fl,xce,PFe,bce,BFe,wce,FFe,Tce,$Fe,kce,zFe,Ece,GFe,VFe,UFe,HFe,WFe,qFe,YFe,co,_I,DI,LI,RI,NI,MI,XFe,jFe,KFe,QFe,w1,Wu,$s,ZFe,zs=N(()=>{"use strict";Xo();Xo();Xo();Xo();OFe=Object.defineProperty,Lt=o((t,e)=>OFe(t,"name",{value:e,configurable:!0}),"__name"),AI="Statement",ob="Architecture";o(Sce,"isArchitecture");Lt(Sce,"isArchitecture");GE="Axis",y1="Branch";o(Cce,"isBranch");Lt(Cce,"isBranch");VE="Checkout",UE="CherryPicking",v1="Commit";o(Ace,"isCommit");Lt(Ace,"isCommit");WE="Common";o(_ce,"isCommon");Lt(_ce,"isCommon");bI="Curve",wI="Edge",TI="Entry",x1="GitGraph";o(Dce,"isGitGraph");Lt(Dce,"isGitGraph");kI="Group",lb="Info";o(Lce,"isInfo");Lt(Lce,"isInfo");EI="Junction",b1="Merge";o(Rce,"isMerge");Lt(Rce,"isMerge");SI="Option",cb="Packet";o(Nce,"isPacket");Lt(Nce,"isPacket");ub="PacketBlock";o(Mce,"isPacketBlock");Lt(Mce,"isPacketBlock");hb="Pie";o(Ice,"isPie");Lt(Ice,"isPie");fb="PieSection";o(Oce,"isPieSection");Lt(Oce,"isPieSection");qE="Radar",CI="Service",HE="Direction",Pce=class extends Xd{static{o(this,"MermaidAstReflection")}static{Lt(this,"MermaidAstReflection")}getAllTypes(){return[ob,GE,y1,VE,UE,v1,WE,bI,HE,wI,TI,x1,kI,lb,EI,b1,SI,cb,ub,hb,fb,qE,CI,AI]}computeIsSubtype(t,e){switch(t){case y1:case VE:case UE:case v1:case b1:return this.isSubtype(AI,e);case HE:return this.isSubtype(x1,e);default:return!1}}getReferenceType(t){let e=`${t.container.$type}:${t.property}`;switch(e){case"Entry:axis":return GE;default:throw new Error(`${e} is not a valid reference id.`)}}getTypeMetaData(t){switch(t){case ob:return{name:ob,properties:[{name:"accDescr"},{name:"accTitle"},{name:"edges",defaultValue:[]},{name:"groups",defaultValue:[]},{name:"junctions",defaultValue:[]},{name:"services",defaultValue:[]},{name:"title"}]};case GE:return{name:GE,properties:[{name:"label"},{name:"name"}]};case y1:return{name:y1,properties:[{name:"name"},{name:"order"}]};case VE:return{name:VE,properties:[{name:"branch"}]};case UE:return{name:UE,properties:[{name:"id"},{name:"parent"},{name:"tags",defaultValue:[]}]};case v1:return{name:v1,properties:[{name:"id"},{name:"message"},{name:"tags",defaultValue:[]},{name:"type"}]};case WE:return{name:WE,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"}]};case bI:return{name:bI,properties:[{name:"entries",defaultValue:[]},{name:"label"},{name:"name"}]};case wI:return{name:wI,properties:[{name:"lhsDir"},{name:"lhsGroup",defaultValue:!1},{name:"lhsId"},{name:"lhsInto",defaultValue:!1},{name:"rhsDir"},{name:"rhsGroup",defaultValue:!1},{name:"rhsId"},{name:"rhsInto",defaultValue:!1},{name:"title"}]};case TI:return{name:TI,properties:[{name:"axis"},{name:"value"}]};case x1:return{name:x1,properties:[{name:"accDescr"},{name:"accTitle"},{name:"statements",defaultValue:[]},{name:"title"}]};case kI:return{name:kI,properties:[{name:"icon"},{name:"id"},{name:"in"},{name:"title"}]};case lb:return{name:lb,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"}]};case EI:return{name:EI,properties:[{name:"id"},{name:"in"}]};case b1:return{name:b1,properties:[{name:"branch"},{name:"id"},{name:"tags",defaultValue:[]},{name:"type"}]};case SI:return{name:SI,properties:[{name:"name"},{name:"value",defaultValue:!1}]};case cb:return{name:cb,properties:[{name:"accDescr"},{name:"accTitle"},{name:"blocks",defaultValue:[]},{name:"title"}]};case ub:return{name:ub,properties:[{name:"end"},{name:"label"},{name:"start"}]};case hb:return{name:hb,properties:[{name:"accDescr"},{name:"accTitle"},{name:"sections",defaultValue:[]},{name:"showData",defaultValue:!1},{name:"title"}]};case fb:return{name:fb,properties:[{name:"label"},{name:"value"}]};case qE:return{name:qE,properties:[{name:"accDescr"},{name:"accTitle"},{name:"axes",defaultValue:[]},{name:"curves",defaultValue:[]},{name:"options",defaultValue:[]},{name:"title"}]};case CI:return{name:CI,properties:[{name:"icon"},{name:"iconText"},{name:"id"},{name:"in"},{name:"title"}]};case HE:return{name:HE,properties:[{name:"accDescr"},{name:"accTitle"},{name:"dir"},{name:"statements",defaultValue:[]},{name:"title"}]};default:return{name:t,properties:[]}}}},Fl=new Pce,PFe=Lt(()=>xce??(xce=Hu('{"$type":"Grammar","isDeclared":true,"name":"Info","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Info","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"info"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"Keyword","value":"showInfo"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"*"}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}')),"InfoGrammar"),BFe=Lt(()=>bce??(bce=Hu(`{"$type":"Grammar","isDeclared":true,"name":"Packet","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Packet","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"packet-beta"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"+"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PacketBlock","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"start","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"end","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}}],"cardinality":"?"},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/"},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}`)),"PacketGrammar"),FFe=Lt(()=>wce??(wce=Hu('{"$type":"Grammar","isDeclared":true,"name":"Pie","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Pie","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"pie"},{"$type":"Assignment","feature":"showData","operator":"?=","terminal":{"$type":"Keyword","value":"showData"},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"+"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PieSection","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"PIE_SECTION_LABEL","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]+\\"/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"PIE_SECTION_VALUE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/(0|[1-9][0-9]*)(\\\\.[0-9]+)?/"},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}')),"PieGrammar"),$Fe=Lt(()=>Tce??(Tce=Hu('{"$type":"Grammar","isDeclared":true,"name":"Architecture","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Architecture","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"architecture-beta"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"groups","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"services","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"junctions","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"edges","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"LeftPort","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"lhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"RightPort","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"rhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Keyword","value":":"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Arrow","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Assignment","feature":"lhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"--"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Keyword","value":"-"}]}]},{"$type":"Assignment","feature":"rhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Group","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Service","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"service"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"iconText","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}}],"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Junction","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"junction"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Edge","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"lhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Assignment","feature":"lhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"rhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Assignment","feature":"rhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"ARROW_DIRECTION","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"L"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"R"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"T"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"B"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_ID","definition":{"$type":"RegexToken","regex":"/[\\\\w]+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TEXT_ICON","definition":{"$type":"RegexToken","regex":"/\\\\(\\"[^\\"]+\\"\\\\)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_ICON","definition":{"$type":"RegexToken","regex":"/\\\\([\\\\w-:]+\\\\)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TITLE","definition":{"$type":"RegexToken","regex":"/\\\\[[\\\\w ]+\\\\]/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_GROUP","definition":{"$type":"RegexToken","regex":"/\\\\{group\\\\}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_INTO","definition":{"$type":"RegexToken","regex":"/<|>/"},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}')),"ArchitectureGrammar"),zFe=Lt(()=>kce??(kce=Hu(`{"$type":"Grammar","isDeclared":true,"name":"GitGraph","interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"rules":[{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"ParserRule","entry":true,"name":"GitGraph","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Keyword","value":":"}]},{"$type":"Keyword","value":"gitGraph:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]},{"$type":"Keyword","value":":"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Assignment","feature":"statements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Direction","definition":{"$type":"Assignment","feature":"dir","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"LR"},{"$type":"Keyword","value":"TB"},{"$type":"Keyword","value":"BT"}]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Commit","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"commit"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"msg:","cardinality":"?"},{"$type":"Assignment","feature":"message","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Branch","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"branch"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"order:"},{"$type":"Assignment","feature":"order","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Merge","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"merge"},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]}},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Checkout","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"checkout"},{"$type":"Keyword","value":"switch"}]},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CherryPicking","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"cherry-pick"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"parent:"},{"$type":"Assignment","feature":"parent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+(?=\\\\s)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\\\w([-\\\\./\\\\w]*[-\\\\w])?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"types":[],"usedGrammars":[]}`)),"GitGraphGrammar"),GFe=Lt(()=>Ece??(Ece=Hu(`{"$type":"Grammar","isDeclared":true,"name":"Radar","interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]},{"$type":"Interface","name":"Entry","attributes":[{"$type":"TypeAttribute","name":"axis","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@12"}}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}],"superTypes":[]}],"rules":[{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"ParserRule","entry":true,"name":"Radar","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":"radar-beta:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":":"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Keyword","value":"axis"},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"curve"},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Label","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Axis","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Curve","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[],"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Entries","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DetailedEntry","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"axis","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@12"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NumberEntry","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Option","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"showLegend"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"ticks"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"max"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"min"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"graticule"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/(0|[1-9][0-9]*)(\\\\.[0-9]+)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"GRATICULE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"circle"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"polygon"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[a-zA-Z_][a-zA-Z0-9\\\\-_]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"types":[],"usedGrammars":[]}`)),"RadarGrammar"),VFe={languageId:"info",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},UFe={languageId:"packet",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},HFe={languageId:"pie",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},WFe={languageId:"architecture",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},qFe={languageId:"gitGraph",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},YFe={languageId:"radar",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},co={AstReflection:Lt(()=>new Pce,"AstReflection")},_I={Grammar:Lt(()=>PFe(),"Grammar"),LanguageMetaData:Lt(()=>VFe,"LanguageMetaData"),parser:{}},DI={Grammar:Lt(()=>BFe(),"Grammar"),LanguageMetaData:Lt(()=>UFe,"LanguageMetaData"),parser:{}},LI={Grammar:Lt(()=>FFe(),"Grammar"),LanguageMetaData:Lt(()=>HFe,"LanguageMetaData"),parser:{}},RI={Grammar:Lt(()=>$Fe(),"Grammar"),LanguageMetaData:Lt(()=>WFe,"LanguageMetaData"),parser:{}},NI={Grammar:Lt(()=>zFe(),"Grammar"),LanguageMetaData:Lt(()=>qFe,"LanguageMetaData"),parser:{}},MI={Grammar:Lt(()=>GFe(),"Grammar"),LanguageMetaData:Lt(()=>YFe,"LanguageMetaData"),parser:{}},XFe=/accDescr(?:[\t ]*:([^\n\r]*)|\s*{([^}]*)})/,jFe=/accTitle[\t ]*:([^\n\r]*)/,KFe=/title([\t ][^\n\r]*|)/,QFe={ACC_DESCR:XFe,ACC_TITLE:jFe,TITLE:KFe},w1=class extends yp{static{o(this,"AbstractMermaidValueConverter")}static{Lt(this,"AbstractMermaidValueConverter")}runConverter(t,e,r){let n=this.runCommonConverter(t,e,r);return n===void 0&&(n=this.runCustomConverter(t,e,r)),n===void 0?super.runConverter(t,e,r):n}runCommonConverter(t,e,r){let n=QFe[t.name];if(n===void 0)return;let i=n.exec(e);if(i!==null){if(i[1]!==void 0)return i[1].trim().replace(/[\t ]{2,}/gm," ");if(i[2]!==void 0)return i[2].replace(/^\s*/gm,"").replace(/\s+$/gm,"").replace(/[\t ]{2,}/gm," ").replace(/[\n\r]{2,}/gm,` +`)}}},Wu=class extends w1{static{o(this,"CommonValueConverter")}static{Lt(this,"CommonValueConverter")}runCustomConverter(t,e,r){}},$s=class extends Uu{static{o(this,"AbstractMermaidTokenBuilder")}static{Lt(this,"AbstractMermaidTokenBuilder")}constructor(t){super(),this.keywords=new Set(t)}buildKeywordTokens(t,e,r){let n=super.buildKeywordTokens(t,e,r);return n.forEach(i=>{this.keywords.has(i.name)&&i.PATTERN!==void 0&&(i.PATTERN=new RegExp(i.PATTERN.toString()+"(?:(?=%%)|(?!\\S))"))}),n}},ZFe=class extends $s{static{o(this,"CommonTokenBuilder")}static{Lt(this,"CommonTokenBuilder")}}});function XE(t=ps){let e=ui(ds(t),co),r=ui(fs({shared:e}),NI,YE);return e.ServiceRegistry.register(r),{shared:e,GitGraph:r}}var JFe,YE,II=N(()=>{"use strict";zs();Xo();JFe=class extends $s{static{o(this,"GitGraphTokenBuilder")}static{Lt(this,"GitGraphTokenBuilder")}constructor(){super(["gitGraph"])}},YE={parser:{TokenBuilder:Lt(()=>new JFe,"TokenBuilder"),ValueConverter:Lt(()=>new Wu,"ValueConverter")}};o(XE,"createGitGraphServices");Lt(XE,"createGitGraphServices")});function KE(t=ps){let e=ui(ds(t),co),r=ui(fs({shared:e}),_I,jE);return e.ServiceRegistry.register(r),{shared:e,Info:r}}var e$e,jE,OI=N(()=>{"use strict";zs();Xo();e$e=class extends $s{static{o(this,"InfoTokenBuilder")}static{Lt(this,"InfoTokenBuilder")}constructor(){super(["info","showInfo"])}},jE={parser:{TokenBuilder:Lt(()=>new e$e,"TokenBuilder"),ValueConverter:Lt(()=>new Wu,"ValueConverter")}};o(KE,"createInfoServices");Lt(KE,"createInfoServices")});function ZE(t=ps){let e=ui(ds(t),co),r=ui(fs({shared:e}),DI,QE);return e.ServiceRegistry.register(r),{shared:e,Packet:r}}var t$e,QE,PI=N(()=>{"use strict";zs();Xo();t$e=class extends $s{static{o(this,"PacketTokenBuilder")}static{Lt(this,"PacketTokenBuilder")}constructor(){super(["packet-beta"])}},QE={parser:{TokenBuilder:Lt(()=>new t$e,"TokenBuilder"),ValueConverter:Lt(()=>new Wu,"ValueConverter")}};o(ZE,"createPacketServices");Lt(ZE,"createPacketServices")});function e6(t=ps){let e=ui(ds(t),co),r=ui(fs({shared:e}),LI,JE);return e.ServiceRegistry.register(r),{shared:e,Pie:r}}var r$e,n$e,JE,BI=N(()=>{"use strict";zs();Xo();r$e=class extends $s{static{o(this,"PieTokenBuilder")}static{Lt(this,"PieTokenBuilder")}constructor(){super(["pie","showData"])}},n$e=class extends w1{static{o(this,"PieValueConverter")}static{Lt(this,"PieValueConverter")}runCustomConverter(t,e,r){if(t.name==="PIE_SECTION_LABEL")return e.replace(/"/g,"").trim()}},JE={parser:{TokenBuilder:Lt(()=>new r$e,"TokenBuilder"),ValueConverter:Lt(()=>new n$e,"ValueConverter")}};o(e6,"createPieServices");Lt(e6,"createPieServices")});function r6(t=ps){let e=ui(ds(t),co),r=ui(fs({shared:e}),RI,t6);return e.ServiceRegistry.register(r),{shared:e,Architecture:r}}var i$e,a$e,t6,FI=N(()=>{"use strict";zs();Xo();i$e=class extends $s{static{o(this,"ArchitectureTokenBuilder")}static{Lt(this,"ArchitectureTokenBuilder")}constructor(){super(["architecture"])}},a$e=class extends w1{static{o(this,"ArchitectureValueConverter")}static{Lt(this,"ArchitectureValueConverter")}runCustomConverter(t,e,r){if(t.name==="ARCH_ICON")return e.replace(/[()]/g,"").trim();if(t.name==="ARCH_TEXT_ICON")return e.replace(/["()]/g,"");if(t.name==="ARCH_TITLE")return e.replace(/[[\]]/g,"").trim()}},t6={parser:{TokenBuilder:Lt(()=>new i$e,"TokenBuilder"),ValueConverter:Lt(()=>new a$e,"ValueConverter")}};o(r6,"createArchitectureServices");Lt(r6,"createArchitectureServices")});function i6(t=ps){let e=ui(ds(t),co),r=ui(fs({shared:e}),MI,n6);return e.ServiceRegistry.register(r),{shared:e,Radar:r}}var s$e,n6,$I=N(()=>{"use strict";zs();Xo();s$e=class extends $s{static{o(this,"RadarTokenBuilder")}static{Lt(this,"RadarTokenBuilder")}constructor(){super(["radar-beta"])}},n6={parser:{TokenBuilder:Lt(()=>new s$e,"TokenBuilder"),ValueConverter:Lt(()=>new Wu,"ValueConverter")}};o(i6,"createRadarServices");Lt(i6,"createRadarServices")});var Bce={};hr(Bce,{InfoModule:()=>jE,createInfoServices:()=>KE});var Fce=N(()=>{"use strict";OI();zs()});var $ce={};hr($ce,{PacketModule:()=>QE,createPacketServices:()=>ZE});var zce=N(()=>{"use strict";PI();zs()});var Gce={};hr(Gce,{PieModule:()=>JE,createPieServices:()=>e6});var Vce=N(()=>{"use strict";BI();zs()});var Uce={};hr(Uce,{ArchitectureModule:()=>t6,createArchitectureServices:()=>r6});var Hce=N(()=>{"use strict";FI();zs()});var Wce={};hr(Wce,{GitGraphModule:()=>YE,createGitGraphServices:()=>XE});var qce=N(()=>{"use strict";II();zs()});var Yce={};hr(Yce,{RadarModule:()=>n6,createRadarServices:()=>i6});var Xce=N(()=>{"use strict";$I();zs()});async function uo(t,e){let r=o$e[t];if(!r)throw new Error(`Unknown diagram type: ${t}`);df[t]||await r();let i=df[t].parse(e);if(i.lexerErrors.length>0||i.parserErrors.length>0)throw new l$e(i);return i.value}var df,o$e,l$e,kp=N(()=>{"use strict";II();OI();PI();BI();FI();$I();zs();df={},o$e={info:Lt(async()=>{let{createInfoServices:t}=await Promise.resolve().then(()=>(Fce(),Bce)),e=t().Info.parser.LangiumParser;df.info=e},"info"),packet:Lt(async()=>{let{createPacketServices:t}=await Promise.resolve().then(()=>(zce(),$ce)),e=t().Packet.parser.LangiumParser;df.packet=e},"packet"),pie:Lt(async()=>{let{createPieServices:t}=await Promise.resolve().then(()=>(Vce(),Gce)),e=t().Pie.parser.LangiumParser;df.pie=e},"pie"),architecture:Lt(async()=>{let{createArchitectureServices:t}=await Promise.resolve().then(()=>(Hce(),Uce)),e=t().Architecture.parser.LangiumParser;df.architecture=e},"architecture"),gitGraph:Lt(async()=>{let{createGitGraphServices:t}=await Promise.resolve().then(()=>(qce(),Wce)),e=t().GitGraph.parser.LangiumParser;df.gitGraph=e},"gitGraph"),radar:Lt(async()=>{let{createRadarServices:t}=await Promise.resolve().then(()=>(Xce(),Yce)),e=t().Radar.parser.LangiumParser;df.radar=e},"radar")};o(uo,"parse");Lt(uo,"parse");l$e=class extends Error{static{o(this,"MermaidParseError")}constructor(t){let e=t.lexerErrors.map(n=>n.message).join(` +`),r=t.parserErrors.map(n=>n.message).join(` +`);super(`Parsing failed: ${e} ${r}`),this.result=t}static{Lt(this,"MermaidParseError")}}});function $c(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}var T1=N(()=>{"use strict";o($c,"populateCommonDb")});var Kr,a6=N(()=>{"use strict";Kr={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4}});var pf,s6=N(()=>{"use strict";pf=class{constructor(e){this.init=e;this.records=this.init()}static{o(this,"ImperativeState")}reset(){this.records=this.init()}}});function zI(){return j9({length:7})}function u$e(t,e){let r=Object.create(null);return t.reduce((n,i)=>{let a=e(i);return r[a]||(r[a]=!0,n.push(i)),n},[])}function jce(t,e,r){let n=t.indexOf(e);n===-1?t.push(r):t.splice(n,1,r)}function Qce(t){let e=t.reduce((i,a)=>i.seq>a.seq?i:a,t[0]),r="";t.forEach(function(i){i===e?r+=" *":r+=" |"});let n=[r,e.id,e.seq];for(let i in _t.records.branches)_t.records.branches.get(i)===e.id&&n.push(i);if(Y.debug(n.join(" ")),e.parents&&e.parents.length==2&&e.parents[0]&&e.parents[1]){let i=_t.records.commits.get(e.parents[0]);jce(t,e,i),e.parents[1]&&t.push(_t.records.commits.get(e.parents[1]))}else{if(e.parents.length==0)return;if(e.parents[0]){let i=_t.records.commits.get(e.parents[0]);jce(t,e,i)}}t=u$e(t,i=>i.id),Qce(t)}var c$e,Ep,_t,h$e,f$e,d$e,p$e,m$e,g$e,y$e,Kce,v$e,x$e,b$e,w$e,T$e,Zce,k$e,E$e,S$e,o6,GI=N(()=>{"use strict";vt();ir();ji();gr();mi();a6();s6();Ya();c$e=or.gitGraph,Ep=o(()=>Fi({...c$e,...cr().gitGraph}),"getConfig"),_t=new pf(()=>{let t=Ep(),e=t.mainBranchName,r=t.mainBranchOrder;return{mainBranchName:e,commits:new Map,head:null,branchConfig:new Map([[e,{name:e,order:r}]]),branches:new Map([[e,null]]),currBranch:e,direction:"LR",seq:0,options:{}}});o(zI,"getID");o(u$e,"uniqBy");h$e=o(function(t){_t.records.direction=t},"setDirection"),f$e=o(function(t){Y.debug("options str",t),t=t?.trim(),t=t||"{}";try{_t.records.options=JSON.parse(t)}catch(e){Y.error("error while parsing gitGraph options",e.message)}},"setOptions"),d$e=o(function(){return _t.records.options},"getOptions"),p$e=o(function(t){let e=t.msg,r=t.id,n=t.type,i=t.tags;Y.info("commit",e,r,n,i),Y.debug("Entering commit:",e,r,n,i);let a=Ep();r=Ze.sanitizeText(r,a),e=Ze.sanitizeText(e,a),i=i?.map(l=>Ze.sanitizeText(l,a));let s={id:r||_t.records.seq+"-"+zI(),message:e,seq:_t.records.seq++,type:n??Kr.NORMAL,tags:i??[],parents:_t.records.head==null?[]:[_t.records.head.id],branch:_t.records.currBranch};_t.records.head=s,Y.info("main branch",a.mainBranchName),_t.records.commits.set(s.id,s),_t.records.branches.set(_t.records.currBranch,s.id),Y.debug("in pushCommit "+s.id)},"commit"),m$e=o(function(t){let e=t.name,r=t.order;if(e=Ze.sanitizeText(e,Ep()),_t.records.branches.has(e))throw new Error(`Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout ${e}")`);_t.records.branches.set(e,_t.records.head!=null?_t.records.head.id:null),_t.records.branchConfig.set(e,{name:e,order:r}),Kce(e),Y.debug("in createBranch")},"branch"),g$e=o(t=>{let e=t.branch,r=t.id,n=t.type,i=t.tags,a=Ep();e=Ze.sanitizeText(e,a),r&&(r=Ze.sanitizeText(r,a));let s=_t.records.branches.get(_t.records.currBranch),l=_t.records.branches.get(e),u=s?_t.records.commits.get(s):void 0,h=l?_t.records.commits.get(l):void 0;if(u&&h&&u.branch===e)throw new Error(`Cannot merge branch '${e}' into itself.`);if(_t.records.currBranch===e){let p=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},p}if(u===void 0||!u){let p=new Error(`Incorrect usage of "merge". Current branch (${_t.records.currBranch})has no commits`);throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["commit"]},p}if(!_t.records.branches.has(e)){let p=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") does not exist");throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:[`branch ${e}`]},p}if(h===void 0||!h){let p=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") has no commits");throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:['"commit"']},p}if(u===h){let p=new Error('Incorrect usage of "merge". Both branches have same head');throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},p}if(r&&_t.records.commits.has(r)){let p=new Error('Incorrect usage of "merge". Commit with id:'+r+" already exists, use different custom Id");throw p.hash={text:`merge ${e} ${r} ${n} ${i?.join(" ")}`,token:`merge ${e} ${r} ${n} ${i?.join(" ")}`,expected:[`merge ${e} ${r}_UNIQUE ${n} ${i?.join(" ")}`]},p}let f=l||"",d={id:r||`${_t.records.seq}-${zI()}`,message:`merged branch ${e} into ${_t.records.currBranch}`,seq:_t.records.seq++,parents:_t.records.head==null?[]:[_t.records.head.id,f],branch:_t.records.currBranch,type:Kr.MERGE,customType:n,customId:!!r,tags:i??[]};_t.records.head=d,_t.records.commits.set(d.id,d),_t.records.branches.set(_t.records.currBranch,d.id),Y.debug(_t.records.branches),Y.debug("in mergeBranch")},"merge"),y$e=o(function(t){let e=t.id,r=t.targetId,n=t.tags,i=t.parent;Y.debug("Entering cherryPick:",e,r,n);let a=Ep();if(e=Ze.sanitizeText(e,a),r=Ze.sanitizeText(r,a),n=n?.map(u=>Ze.sanitizeText(u,a)),i=Ze.sanitizeText(i,a),!e||!_t.records.commits.has(e)){let u=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw u.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},u}let s=_t.records.commits.get(e);if(s===void 0||!s)throw new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');if(i&&!(Array.isArray(s.parents)&&s.parents.includes(i)))throw new Error("Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.");let l=s.branch;if(s.type===Kr.MERGE&&!i)throw new Error("Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.");if(!r||!_t.records.commits.has(r)){if(l===_t.records.currBranch){let d=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let u=_t.records.branches.get(_t.records.currBranch);if(u===void 0||!u){let d=new Error(`Incorrect usage of "cherry-pick". Current branch (${_t.records.currBranch})has no commits`);throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let h=_t.records.commits.get(u);if(h===void 0||!h){let d=new Error(`Incorrect usage of "cherry-pick". Current branch (${_t.records.currBranch})has no commits`);throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let f={id:_t.records.seq+"-"+zI(),message:`cherry-picked ${s?.message} into ${_t.records.currBranch}`,seq:_t.records.seq++,parents:_t.records.head==null?[]:[_t.records.head.id,s.id],branch:_t.records.currBranch,type:Kr.CHERRY_PICK,tags:n?n.filter(Boolean):[`cherry-pick:${s.id}${s.type===Kr.MERGE?`|parent:${i}`:""}`]};_t.records.head=f,_t.records.commits.set(f.id,f),_t.records.branches.set(_t.records.currBranch,f.id),Y.debug(_t.records.branches),Y.debug("in cherryPick")}},"cherryPick"),Kce=o(function(t){if(t=Ze.sanitizeText(t,Ep()),_t.records.branches.has(t)){_t.records.currBranch=t;let e=_t.records.branches.get(_t.records.currBranch);e===void 0||!e?_t.records.head=null:_t.records.head=_t.records.commits.get(e)??null}else{let e=new Error(`Trying to checkout branch which is not yet created. (Help try using "branch ${t}")`);throw e.hash={text:`checkout ${t}`,token:`checkout ${t}`,expected:[`branch ${t}`]},e}},"checkout");o(jce,"upsert");o(Qce,"prettyPrintCommitHistory");v$e=o(function(){Y.debug(_t.records.commits);let t=Zce()[0];Qce([t])},"prettyPrint"),x$e=o(function(){_t.reset(),Ar()},"clear"),b$e=o(function(){return[..._t.records.branchConfig.values()].map((e,r)=>e.order!==null&&e.order!==void 0?e:{...e,order:parseFloat(`0.${r}`)}).sort((e,r)=>(e.order??0)-(r.order??0)).map(({name:e})=>({name:e}))},"getBranchesAsObjArray"),w$e=o(function(){return _t.records.branches},"getBranches"),T$e=o(function(){return _t.records.commits},"getCommits"),Zce=o(function(){let t=[..._t.records.commits.values()];return t.forEach(function(e){Y.debug(e.id)}),t.sort((e,r)=>e.seq-r.seq),t},"getCommitsArray"),k$e=o(function(){return _t.records.currBranch},"getCurrentBranch"),E$e=o(function(){return _t.records.direction},"getDirection"),S$e=o(function(){return _t.records.head},"getHead"),o6={commitType:Kr,getConfig:Ep,setDirection:h$e,setOptions:f$e,getOptions:d$e,commit:p$e,branch:m$e,merge:g$e,cherryPick:y$e,checkout:Kce,prettyPrint:v$e,clear:x$e,getBranchesAsObjArray:b$e,getBranches:w$e,getCommits:T$e,getCommitsArray:Zce,getCurrentBranch:k$e,getDirection:E$e,getHead:S$e,setAccTitle:Lr,getAccTitle:Rr,getAccDescription:Mr,setAccDescription:Nr,setDiagramTitle:$r,getDiagramTitle:Ir}});var C$e,A$e,_$e,D$e,L$e,R$e,N$e,Jce,eue=N(()=>{"use strict";kp();vt();T1();GI();a6();C$e=o((t,e)=>{$c(t,e),t.dir&&e.setDirection(t.dir);for(let r of t.statements)A$e(r,e)},"populate"),A$e=o((t,e)=>{let n={Commit:o(i=>e.commit(_$e(i)),"Commit"),Branch:o(i=>e.branch(D$e(i)),"Branch"),Merge:o(i=>e.merge(L$e(i)),"Merge"),Checkout:o(i=>e.checkout(R$e(i)),"Checkout"),CherryPicking:o(i=>e.cherryPick(N$e(i)),"CherryPicking")}[t.$type];n?n(t):Y.error(`Unknown statement type: ${t.$type}`)},"parseStatement"),_$e=o(t=>({id:t.id,msg:t.message??"",type:t.type!==void 0?Kr[t.type]:Kr.NORMAL,tags:t.tags??void 0}),"parseCommit"),D$e=o(t=>({name:t.name,order:t.order??0}),"parseBranch"),L$e=o(t=>({branch:t.branch,id:t.id??"",type:t.type!==void 0?Kr[t.type]:void 0,tags:t.tags??void 0}),"parseMerge"),R$e=o(t=>t.branch,"parseCheckout"),N$e=o(t=>({id:t.id,targetId:"",tags:t.tags?.length===0?void 0:t.tags,parent:t.parent}),"parseCherryPicking"),Jce={parse:o(async t=>{let e=await uo("gitGraph",t);Y.debug(e),C$e(e,o6)},"parse")}});var M$e,Ko,gf,yf,zc,qu,Sp,Gs,Vs,l6,db,c6,mf,Br,I$e,rue,nue,O$e,P$e,B$e,F$e,$$e,z$e,G$e,V$e,U$e,H$e,W$e,q$e,tue,Y$e,pb,X$e,j$e,K$e,Q$e,Z$e,iue,aue=N(()=>{"use strict";dr();zt();vt();ir();a6();M$e=me(),Ko=M$e?.gitGraph,gf=10,yf=40,zc=4,qu=2,Sp=8,Gs=new Map,Vs=new Map,l6=30,db=new Map,c6=[],mf=0,Br="LR",I$e=o(()=>{Gs.clear(),Vs.clear(),db.clear(),mf=0,c6=[],Br="LR"},"clear"),rue=o(t=>{let e=document.createElementNS("http://www.w3.org/2000/svg","text");return(typeof t=="string"?t.split(/\\n|\n|/gi):t).forEach(n=>{let i=document.createElementNS("http://www.w3.org/2000/svg","tspan");i.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),i.setAttribute("dy","1em"),i.setAttribute("x","0"),i.setAttribute("class","row"),i.textContent=n.trim(),e.appendChild(i)}),e},"drawText"),nue=o(t=>{let e,r,n;return Br==="BT"?(r=o((i,a)=>i<=a,"comparisonFunc"),n=1/0):(r=o((i,a)=>i>=a,"comparisonFunc"),n=0),t.forEach(i=>{let a=Br==="TB"||Br=="BT"?Vs.get(i)?.y:Vs.get(i)?.x;a!==void 0&&r(a,n)&&(e=i,n=a)}),e},"findClosestParent"),O$e=o(t=>{let e="",r=1/0;return t.forEach(n=>{let i=Vs.get(n).y;i<=r&&(e=n,r=i)}),e||void 0},"findClosestParentBT"),P$e=o((t,e,r)=>{let n=r,i=r,a=[];t.forEach(s=>{let l=e.get(s);if(!l)throw new Error(`Commit not found for key ${s}`);l.parents.length?(n=F$e(l),i=Math.max(n,i)):a.push(l),$$e(l,n)}),n=i,a.forEach(s=>{z$e(s,n,r)}),t.forEach(s=>{let l=e.get(s);if(l?.parents.length){let u=O$e(l.parents);n=Vs.get(u).y-yf,n<=i&&(i=n);let h=Gs.get(l.branch).pos,f=n-gf;Vs.set(l.id,{x:h,y:f})}})},"setParallelBTPos"),B$e=o(t=>{let e=nue(t.parents.filter(n=>n!==null));if(!e)throw new Error(`Closest parent not found for commit ${t.id}`);let r=Vs.get(e)?.y;if(r===void 0)throw new Error(`Closest parent position not found for commit ${t.id}`);return r},"findClosestParentPos"),F$e=o(t=>B$e(t)+yf,"calculateCommitPosition"),$$e=o((t,e)=>{let r=Gs.get(t.branch);if(!r)throw new Error(`Branch not found for commit ${t.id}`);let n=r.pos,i=e+gf;return Vs.set(t.id,{x:n,y:i}),{x:n,y:i}},"setCommitPosition"),z$e=o((t,e,r)=>{let n=Gs.get(t.branch);if(!n)throw new Error(`Branch not found for commit ${t.id}`);let i=e+r,a=n.pos;Vs.set(t.id,{x:a,y:i})},"setRootPosition"),G$e=o((t,e,r,n,i,a)=>{if(a===Kr.HIGHLIGHT)t.append("rect").attr("x",r.x-10).attr("y",r.y-10).attr("width",20).attr("height",20).attr("class",`commit ${e.id} commit-highlight${i%Sp} ${n}-outer`),t.append("rect").attr("x",r.x-6).attr("y",r.y-6).attr("width",12).attr("height",12).attr("class",`commit ${e.id} commit${i%Sp} ${n}-inner`);else if(a===Kr.CHERRY_PICK)t.append("circle").attr("cx",r.x).attr("cy",r.y).attr("r",10).attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x-3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x+3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x+3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x-3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`);else{let s=t.append("circle");if(s.attr("cx",r.x),s.attr("cy",r.y),s.attr("r",e.type===Kr.MERGE?9:10),s.attr("class",`commit ${e.id} commit${i%Sp}`),a===Kr.MERGE){let l=t.append("circle");l.attr("cx",r.x),l.attr("cy",r.y),l.attr("r",6),l.attr("class",`commit ${n} ${e.id} commit${i%Sp}`)}a===Kr.REVERSE&&t.append("path").attr("d",`M ${r.x-5},${r.y-5}L${r.x+5},${r.y+5}M${r.x-5},${r.y+5}L${r.x+5},${r.y-5}`).attr("class",`commit ${n} ${e.id} commit${i%Sp}`)}},"drawCommitBullet"),V$e=o((t,e,r,n)=>{if(e.type!==Kr.CHERRY_PICK&&(e.customId&&e.type===Kr.MERGE||e.type!==Kr.MERGE)&&Ko?.showCommitLabel){let i=t.append("g"),a=i.insert("rect").attr("class","commit-label-bkg"),s=i.append("text").attr("x",n).attr("y",r.y+25).attr("class","commit-label").text(e.id),l=s.node()?.getBBox();if(l&&(a.attr("x",r.posWithOffset-l.width/2-qu).attr("y",r.y+13.5).attr("width",l.width+2*qu).attr("height",l.height+2*qu),Br==="TB"||Br==="BT"?(a.attr("x",r.x-(l.width+4*zc+5)).attr("y",r.y-12),s.attr("x",r.x-(l.width+4*zc)).attr("y",r.y+l.height-12)):s.attr("x",r.posWithOffset-l.width/2),Ko.rotateCommitLabel))if(Br==="TB"||Br==="BT")s.attr("transform","rotate(-45, "+r.x+", "+r.y+")"),a.attr("transform","rotate(-45, "+r.x+", "+r.y+")");else{let u=-7.5-(l.width+10)/25*9.5,h=10+l.width/25*8.5;i.attr("transform","translate("+u+", "+h+") rotate(-45, "+n+", "+r.y+")")}}},"drawCommitLabel"),U$e=o((t,e,r,n)=>{if(e.tags.length>0){let i=0,a=0,s=0,l=[];for(let u of e.tags.reverse()){let h=t.insert("polygon"),f=t.append("circle"),d=t.append("text").attr("y",r.y-16-i).attr("class","tag-label").text(u),p=d.node()?.getBBox();if(!p)throw new Error("Tag bbox not found");a=Math.max(a,p.width),s=Math.max(s,p.height),d.attr("x",r.posWithOffset-p.width/2),l.push({tag:d,hole:f,rect:h,yOffset:i}),i+=20}for(let{tag:u,hole:h,rect:f,yOffset:d}of l){let p=s/2,m=r.y-19.2-d;if(f.attr("class","tag-label-bkg").attr("points",` + ${n-a/2-zc/2},${m+qu} + ${n-a/2-zc/2},${m-qu} + ${r.posWithOffset-a/2-zc},${m-p-qu} + ${r.posWithOffset+a/2+zc},${m-p-qu} + ${r.posWithOffset+a/2+zc},${m+p+qu} + ${r.posWithOffset-a/2-zc},${m+p+qu}`),h.attr("cy",m).attr("cx",n-a/2+zc/2).attr("r",1.5).attr("class","tag-hole"),Br==="TB"||Br==="BT"){let g=n+d;f.attr("class","tag-label-bkg").attr("points",` + ${r.x},${g+2} + ${r.x},${g-2} + ${r.x+gf},${g-p-2} + ${r.x+gf+a+4},${g-p-2} + ${r.x+gf+a+4},${g+p+2} + ${r.x+gf},${g+p+2}`).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),h.attr("cx",r.x+zc/2).attr("cy",g).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),u.attr("x",r.x+5).attr("y",g+3).attr("transform","translate(14,14) rotate(45, "+r.x+","+n+")")}}}},"drawCommitTags"),H$e=o(t=>{switch(t.customType??t.type){case Kr.NORMAL:return"commit-normal";case Kr.REVERSE:return"commit-reverse";case Kr.HIGHLIGHT:return"commit-highlight";case Kr.MERGE:return"commit-merge";case Kr.CHERRY_PICK:return"commit-cherry-pick";default:return"commit-normal"}},"getCommitClassType"),W$e=o((t,e,r,n)=>{let i={x:0,y:0};if(t.parents.length>0){let a=nue(t.parents);if(a){let s=n.get(a)??i;return e==="TB"?s.y+yf:e==="BT"?(n.get(t.id)??i).y-yf:s.x+yf}}else return e==="TB"?l6:e==="BT"?(n.get(t.id)??i).y-yf:0;return 0},"calculatePosition"),q$e=o((t,e,r)=>{let n=Br==="BT"&&r?e:e+gf,i=Br==="TB"||Br==="BT"?n:Gs.get(t.branch)?.pos,a=Br==="TB"||Br==="BT"?Gs.get(t.branch)?.pos:n;if(a===void 0||i===void 0)throw new Error(`Position were undefined for commit ${t.id}`);return{x:a,y:i,posWithOffset:n}},"getCommitPosition"),tue=o((t,e,r)=>{if(!Ko)throw new Error("GitGraph config not found");let n=t.append("g").attr("class","commit-bullets"),i=t.append("g").attr("class","commit-labels"),a=Br==="TB"||Br==="BT"?l6:0,s=[...e.keys()],l=Ko?.parallelCommits??!1,u=o((f,d)=>{let p=e.get(f)?.seq,m=e.get(d)?.seq;return p!==void 0&&m!==void 0?p-m:0},"sortKeys"),h=s.sort(u);Br==="BT"&&(l&&P$e(h,e,a),h=h.reverse()),h.forEach(f=>{let d=e.get(f);if(!d)throw new Error(`Commit not found for key ${f}`);l&&(a=W$e(d,Br,a,Vs));let p=q$e(d,a,l);if(r){let m=H$e(d),g=d.customType??d.type,y=Gs.get(d.branch)?.index??0;G$e(n,d,p,m,y,g),V$e(i,d,p,a),U$e(i,d,p,a)}Br==="TB"||Br==="BT"?Vs.set(d.id,{x:p.x,y:p.posWithOffset}):Vs.set(d.id,{x:p.posWithOffset,y:p.y}),a=Br==="BT"&&l?a+yf:a+yf+gf,a>mf&&(mf=a)})},"drawCommits"),Y$e=o((t,e,r,n,i)=>{let s=(Br==="TB"||Br==="BT"?r.xh.branch===s,"isOnBranchToGetCurve"),u=o(h=>h.seq>t.seq&&h.sequ(h)&&l(h))},"shouldRerouteArrow"),pb=o((t,e,r=0)=>{let n=t+Math.abs(t-e)/2;if(r>5)return n;if(c6.every(s=>Math.abs(s-n)>=10))return c6.push(n),n;let a=Math.abs(t-e);return pb(t,e-a/5,r+1)},"findLane"),X$e=o((t,e,r,n)=>{let i=Vs.get(e.id),a=Vs.get(r.id);if(i===void 0||a===void 0)throw new Error(`Commit positions not found for commits ${e.id} and ${r.id}`);let s=Y$e(e,r,i,a,n),l="",u="",h=0,f=0,d=Gs.get(r.branch)?.index;r.type===Kr.MERGE&&e.id!==r.parents[0]&&(d=Gs.get(e.branch)?.index);let p;if(s){l="A 10 10, 0, 0, 0,",u="A 10 10, 0, 0, 1,",h=10,f=10;let m=i.ya.x&&(l="A 20 20, 0, 0, 0,",u="A 20 20, 0, 0, 1,",h=20,f=20,r.type===Kr.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${i.x} ${a.y-h} ${u} ${i.x-f} ${a.y} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${a.x+h} ${i.y} ${l} ${a.x} ${i.y+f} L ${a.x} ${a.y}`),i.x===a.x&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):Br==="BT"?(i.xa.x&&(l="A 20 20, 0, 0, 0,",u="A 20 20, 0, 0, 1,",h=20,f=20,r.type===Kr.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${i.x} ${a.y+h} ${l} ${i.x-f} ${a.y} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${a.x-h} ${i.y} ${l} ${a.x} ${i.y-f} L ${a.x} ${a.y}`),i.x===a.x&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):(i.ya.y&&(r.type===Kr.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${a.x-h} ${i.y} ${l} ${a.x} ${i.y-f} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${i.x} ${a.y+h} ${u} ${i.x+f} ${a.y} L ${a.x} ${a.y}`),i.y===a.y&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`));if(p===void 0)throw new Error("Line definition not found");t.append("path").attr("d",p).attr("class","arrow arrow"+d%Sp)},"drawArrow"),j$e=o((t,e)=>{let r=t.append("g").attr("class","commit-arrows");[...e.keys()].forEach(n=>{let i=e.get(n);i.parents&&i.parents.length>0&&i.parents.forEach(a=>{X$e(r,e.get(a),i,e)})})},"drawArrows"),K$e=o((t,e)=>{let r=t.append("g");e.forEach((n,i)=>{let a=i%Sp,s=Gs.get(n.name)?.pos;if(s===void 0)throw new Error(`Position not found for branch ${n.name}`);let l=r.append("line");l.attr("x1",0),l.attr("y1",s),l.attr("x2",mf),l.attr("y2",s),l.attr("class","branch branch"+a),Br==="TB"?(l.attr("y1",l6),l.attr("x1",s),l.attr("y2",mf),l.attr("x2",s)):Br==="BT"&&(l.attr("y1",mf),l.attr("x1",s),l.attr("y2",l6),l.attr("x2",s)),c6.push(s);let u=n.name,h=rue(u),f=r.insert("rect"),p=r.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+a);p.node().appendChild(h);let m=h.getBBox();f.attr("class","branchLabelBkg label"+a).attr("rx",4).attr("ry",4).attr("x",-m.width-4-(Ko?.rotateCommitLabel===!0?30:0)).attr("y",-m.height/2+8).attr("width",m.width+18).attr("height",m.height+4),p.attr("transform","translate("+(-m.width-14-(Ko?.rotateCommitLabel===!0?30:0))+", "+(s-m.height/2-1)+")"),Br==="TB"?(f.attr("x",s-m.width/2-10).attr("y",0),p.attr("transform","translate("+(s-m.width/2-5)+", 0)")):Br==="BT"?(f.attr("x",s-m.width/2-10).attr("y",mf),p.attr("transform","translate("+(s-m.width/2-5)+", "+mf+")")):f.attr("transform","translate(-19, "+(s-m.height/2)+")")})},"drawBranches"),Q$e=o(function(t,e,r,n,i){return Gs.set(t,{pos:e,index:r}),e+=50+(i?40:0)+(Br==="TB"||Br==="BT"?n.width/2:0),e},"setBranchPosition"),Z$e=o(function(t,e,r,n){if(I$e(),Y.debug("in gitgraph renderer",t+` +`,"id:",e,r),!Ko)throw new Error("GitGraph config not found");let i=Ko.rotateCommitLabel??!1,a=n.db;db=a.getCommits();let s=a.getBranchesAsObjArray();Br=a.getDirection();let l=Ge(`[id="${e}"]`),u=0;s.forEach((h,f)=>{let d=rue(h.name),p=l.append("g"),m=p.insert("g").attr("class","branchLabel"),g=m.insert("g").attr("class","label branch-label");g.node()?.appendChild(d);let y=d.getBBox();u=Q$e(h.name,u,f,y,i),g.remove(),m.remove(),p.remove()}),tue(l,db,!1),Ko.showBranches&&K$e(l,s),j$e(l,db),tue(l,db,!0),Gt.insertTitle(l,"gitTitleText",Ko.titleTopMargin??0,a.getDiagramTitle()),oA(void 0,l,Ko.diagramPadding,Ko.useMaxWidth)},"draw"),iue={draw:Z$e}});var J$e,sue,oue=N(()=>{"use strict";J$e=o(t=>` + .commit-id, + .commit-msg, + .branch-label { + fill: lightgrey; + color: lightgrey; + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + } + ${[0,1,2,3,4,5,6,7].map(e=>` + .branch-label${e} { fill: ${t["gitBranchLabel"+e]}; } + .commit${e} { stroke: ${t["git"+e]}; fill: ${t["git"+e]}; } + .commit-highlight${e} { stroke: ${t["gitInv"+e]}; fill: ${t["gitInv"+e]}; } + .label${e} { fill: ${t["git"+e]}; } + .arrow${e} { stroke: ${t["git"+e]}; } + `).join(` +`)} + + .branch { + stroke-width: 1; + stroke: ${t.lineColor}; + stroke-dasharray: 2; + } + .commit-label { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelColor};} + .commit-label-bkg { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelBackground}; opacity: 0.5; } + .tag-label { font-size: ${t.tagLabelFontSize}; fill: ${t.tagLabelColor};} + .tag-label-bkg { fill: ${t.tagLabelBackground}; stroke: ${t.tagLabelBorder}; } + .tag-hole { fill: ${t.textColor}; } + + .commit-merge { + stroke: ${t.primaryColor}; + fill: ${t.primaryColor}; + } + .commit-reverse { + stroke: ${t.primaryColor}; + fill: ${t.primaryColor}; + stroke-width: 3; + } + .commit-highlight-outer { + } + .commit-highlight-inner { + stroke: ${t.primaryColor}; + fill: ${t.primaryColor}; + } + + .arrow { stroke-width: 8; stroke-linecap: round; fill: none} + .gitTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; + } +`,"getStyles"),sue=J$e});var lue={};hr(lue,{diagram:()=>eze});var eze,cue=N(()=>{"use strict";eue();GI();aue();oue();eze={parser:Jce,db:o6,renderer:iue,styles:sue}});var VI,fue,due=N(()=>{"use strict";VI=function(){var t=o(function(L,R,O,M){for(O=O||{},M=L.length;M--;O[L[M]]=R);return O},"o"),e=[6,8,10,12,13,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30,31,33,35,36,38,40],r=[1,26],n=[1,27],i=[1,28],a=[1,29],s=[1,30],l=[1,31],u=[1,32],h=[1,33],f=[1,34],d=[1,9],p=[1,10],m=[1,11],g=[1,12],y=[1,13],v=[1,14],x=[1,15],b=[1,16],w=[1,19],C=[1,20],T=[1,21],E=[1,22],A=[1,23],S=[1,25],_=[1,35],I={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,gantt:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NL:10,weekday:11,weekday_monday:12,weekday_tuesday:13,weekday_wednesday:14,weekday_thursday:15,weekday_friday:16,weekday_saturday:17,weekday_sunday:18,weekend:19,weekend_friday:20,weekend_saturday:21,dateFormat:22,inclusiveEndDates:23,topAxis:24,axisFormat:25,tickInterval:26,excludes:27,includes:28,todayMarker:29,title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,section:36,clickStatement:37,taskTxt:38,taskData:39,click:40,callbackname:41,callbackargs:42,href:43,clickStatementDebug:44,$accept:0,$end:1},terminals_:{2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",12:"weekday_monday",13:"weekday_tuesday",14:"weekday_wednesday",15:"weekday_thursday",16:"weekday_friday",17:"weekday_saturday",18:"weekday_sunday",20:"weekend_friday",21:"weekend_saturday",22:"dateFormat",23:"inclusiveEndDates",24:"topAxis",25:"axisFormat",26:"tickInterval",27:"excludes",28:"includes",29:"todayMarker",30:"title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"section",38:"taskTxt",39:"taskData",40:"click",41:"callbackname",42:"callbackargs",43:"href"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[19,1],[19,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,2],[37,2],[37,3],[37,3],[37,4],[37,3],[37,4],[37,2],[44,2],[44,3],[44,3],[44,4],[44,3],[44,4],[44,2]],performAction:o(function(R,O,M,B,F,P,z){var $=P.length-1;switch(F){case 1:return P[$-1];case 2:this.$=[];break;case 3:P[$-1].push(P[$]),this.$=P[$-1];break;case 4:case 5:this.$=P[$];break;case 6:case 7:this.$=[];break;case 8:B.setWeekday("monday");break;case 9:B.setWeekday("tuesday");break;case 10:B.setWeekday("wednesday");break;case 11:B.setWeekday("thursday");break;case 12:B.setWeekday("friday");break;case 13:B.setWeekday("saturday");break;case 14:B.setWeekday("sunday");break;case 15:B.setWeekend("friday");break;case 16:B.setWeekend("saturday");break;case 17:B.setDateFormat(P[$].substr(11)),this.$=P[$].substr(11);break;case 18:B.enableInclusiveEndDates(),this.$=P[$].substr(18);break;case 19:B.TopAxis(),this.$=P[$].substr(8);break;case 20:B.setAxisFormat(P[$].substr(11)),this.$=P[$].substr(11);break;case 21:B.setTickInterval(P[$].substr(13)),this.$=P[$].substr(13);break;case 22:B.setExcludes(P[$].substr(9)),this.$=P[$].substr(9);break;case 23:B.setIncludes(P[$].substr(9)),this.$=P[$].substr(9);break;case 24:B.setTodayMarker(P[$].substr(12)),this.$=P[$].substr(12);break;case 27:B.setDiagramTitle(P[$].substr(6)),this.$=P[$].substr(6);break;case 28:this.$=P[$].trim(),B.setAccTitle(this.$);break;case 29:case 30:this.$=P[$].trim(),B.setAccDescription(this.$);break;case 31:B.addSection(P[$].substr(8)),this.$=P[$].substr(8);break;case 33:B.addTask(P[$-1],P[$]),this.$="task";break;case 34:this.$=P[$-1],B.setClickEvent(P[$-1],P[$],null);break;case 35:this.$=P[$-2],B.setClickEvent(P[$-2],P[$-1],P[$]);break;case 36:this.$=P[$-2],B.setClickEvent(P[$-2],P[$-1],null),B.setLink(P[$-2],P[$]);break;case 37:this.$=P[$-3],B.setClickEvent(P[$-3],P[$-2],P[$-1]),B.setLink(P[$-3],P[$]);break;case 38:this.$=P[$-2],B.setClickEvent(P[$-2],P[$],null),B.setLink(P[$-2],P[$-1]);break;case 39:this.$=P[$-3],B.setClickEvent(P[$-3],P[$-1],P[$]),B.setLink(P[$-3],P[$-2]);break;case 40:this.$=P[$-1],B.setLink(P[$-1],P[$]);break;case 41:case 47:this.$=P[$-1]+" "+P[$];break;case 42:case 43:case 45:this.$=P[$-2]+" "+P[$-1]+" "+P[$];break;case 44:case 46:this.$=P[$-3]+" "+P[$-2]+" "+P[$-1]+" "+P[$];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:17,12:r,13:n,14:i,15:a,16:s,17:l,18:u,19:18,20:h,21:f,22:d,23:p,24:m,25:g,26:y,27:v,28:x,29:b,30:w,31:C,33:T,35:E,36:A,37:24,38:S,40:_},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:36,11:17,12:r,13:n,14:i,15:a,16:s,17:l,18:u,19:18,20:h,21:f,22:d,23:p,24:m,25:g,26:y,27:v,28:x,29:b,30:w,31:C,33:T,35:E,36:A,37:24,38:S,40:_},t(e,[2,5]),t(e,[2,6]),t(e,[2,17]),t(e,[2,18]),t(e,[2,19]),t(e,[2,20]),t(e,[2,21]),t(e,[2,22]),t(e,[2,23]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),t(e,[2,27]),{32:[1,37]},{34:[1,38]},t(e,[2,30]),t(e,[2,31]),t(e,[2,32]),{39:[1,39]},t(e,[2,8]),t(e,[2,9]),t(e,[2,10]),t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),{41:[1,40],43:[1,41]},t(e,[2,4]),t(e,[2,28]),t(e,[2,29]),t(e,[2,33]),t(e,[2,34],{42:[1,42],43:[1,43]}),t(e,[2,40],{41:[1,44]}),t(e,[2,35],{43:[1,45]}),t(e,[2,36]),t(e,[2,38],{42:[1,46]}),t(e,[2,37]),t(e,[2,39])],defaultActions:{},parseError:o(function(R,O){if(O.recoverable)this.trace(R);else{var M=new Error(R);throw M.hash=O,M}},"parseError"),parse:o(function(R){var O=this,M=[0],B=[],F=[null],P=[],z=this.table,$="",H=0,Q=0,j=0,ie=2,ne=1,le=P.slice.call(arguments,1),he=Object.create(this.lexer),K={yy:{}};for(var X in this.yy)Object.prototype.hasOwnProperty.call(this.yy,X)&&(K.yy[X]=this.yy[X]);he.setInput(R,K.yy),K.yy.lexer=he,K.yy.parser=this,typeof he.yylloc>"u"&&(he.yylloc={});var te=he.yylloc;P.push(te);var J=he.options&&he.options.ranges;typeof K.yy.parseError=="function"?this.parseError=K.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function se(W){M.length=M.length-2*W,F.length=F.length-W,P.length=P.length-W}o(se,"popStack");function ue(){var W;return W=B.pop()||he.lex()||ne,typeof W!="number"&&(W instanceof Array&&(B=W,W=B.pop()),W=O.symbols_[W]||W),W}o(ue,"lex");for(var Z,Se,ce,ae,Oe,ge,ze={},He,$e,Re,Ie;;){if(ce=M[M.length-1],this.defaultActions[ce]?ae=this.defaultActions[ce]:((Z===null||typeof Z>"u")&&(Z=ue()),ae=z[ce]&&z[ce][Z]),typeof ae>"u"||!ae.length||!ae[0]){var be="";Ie=[];for(He in z[ce])this.terminals_[He]&&He>ie&&Ie.push("'"+this.terminals_[He]+"'");he.showPosition?be="Parse error on line "+(H+1)+`: +`+he.showPosition()+` +Expecting `+Ie.join(", ")+", got '"+(this.terminals_[Z]||Z)+"'":be="Parse error on line "+(H+1)+": Unexpected "+(Z==ne?"end of input":"'"+(this.terminals_[Z]||Z)+"'"),this.parseError(be,{text:he.match,token:this.terminals_[Z]||Z,line:he.yylineno,loc:te,expected:Ie})}if(ae[0]instanceof Array&&ae.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ce+", token: "+Z);switch(ae[0]){case 1:M.push(Z),F.push(he.yytext),P.push(he.yylloc),M.push(ae[1]),Z=null,Se?(Z=Se,Se=null):(Q=he.yyleng,$=he.yytext,H=he.yylineno,te=he.yylloc,j>0&&j--);break;case 2:if($e=this.productions_[ae[1]][1],ze.$=F[F.length-$e],ze._$={first_line:P[P.length-($e||1)].first_line,last_line:P[P.length-1].last_line,first_column:P[P.length-($e||1)].first_column,last_column:P[P.length-1].last_column},J&&(ze._$.range=[P[P.length-($e||1)].range[0],P[P.length-1].range[1]]),ge=this.performAction.apply(ze,[$,Q,H,K.yy,ae[1],F,P].concat(le)),typeof ge<"u")return ge;$e&&(M=M.slice(0,-1*$e*2),F=F.slice(0,-1*$e),P=P.slice(0,-1*$e)),M.push(this.productions_[ae[1]][0]),F.push(ze.$),P.push(ze._$),Re=z[M[M.length-2]][M[M.length-1]],M.push(Re);break;case 3:return!0}}return!0},"parse")},D=function(){var L={EOF:1,parseError:o(function(O,M){if(this.yy.parser)this.yy.parser.parseError(O,M);else throw new Error(O)},"parseError"),setInput:o(function(R,O){return this.yy=O||this.yy||{},this._input=R,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var R=this._input[0];this.yytext+=R,this.yyleng++,this.offset++,this.match+=R,this.matched+=R;var O=R.match(/(?:\r\n?|\n).*/g);return O?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),R},"input"),unput:o(function(R){var O=R.length,M=R.split(/(?:\r\n?|\n)/g);this._input=R+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-O),this.offset-=O;var B=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),M.length-1&&(this.yylineno-=M.length-1);var F=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:M?(M.length===B.length?this.yylloc.first_column:0)+B[B.length-M.length].length-M[0].length:this.yylloc.first_column-O},this.options.ranges&&(this.yylloc.range=[F[0],F[0]+this.yyleng-O]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(R){this.unput(this.match.slice(R))},"less"),pastInput:o(function(){var R=this.matched.substr(0,this.matched.length-this.match.length);return(R.length>20?"...":"")+R.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var R=this.match;return R.length<20&&(R+=this._input.substr(0,20-R.length)),(R.substr(0,20)+(R.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var R=this.pastInput(),O=new Array(R.length+1).join("-");return R+this.upcomingInput()+` +`+O+"^"},"showPosition"),test_match:o(function(R,O){var M,B,F;if(this.options.backtrack_lexer&&(F={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(F.yylloc.range=this.yylloc.range.slice(0))),B=R[0].match(/(?:\r\n?|\n).*/g),B&&(this.yylineno+=B.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:B?B[B.length-1].length-B[B.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+R[0].length},this.yytext+=R[0],this.match+=R[0],this.matches=R,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(R[0].length),this.matched+=R[0],M=this.performAction.call(this,this.yy,this,O,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),M)return M;if(this._backtrack){for(var P in F)this[P]=F[P];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var R,O,M,B;this._more||(this.yytext="",this.match="");for(var F=this._currentRules(),P=0;PO[0].length)){if(O=M,B=P,this.options.backtrack_lexer){if(R=this.test_match(M,F[P]),R!==!1)return R;if(this._backtrack){O=!1;continue}else return!1}else if(!this.options.flex)break}return O?(R=this.test_match(O,F[B]),R!==!1?R:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var O=this.next();return O||this.lex()},"lex"),begin:o(function(O){this.conditionStack.push(O)},"begin"),popState:o(function(){var O=this.conditionStack.length-1;return O>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(O){return O=this.conditionStack.length-1-Math.abs(O||0),O>=0?this.conditionStack[O]:"INITIAL"},"topState"),pushState:o(function(O){this.begin(O)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(O,M,B,F){var P=F;switch(B){case 0:return this.begin("open_directive"),"open_directive";break;case 1:return this.begin("acc_title"),31;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),33;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:break;case 9:break;case 10:break;case 11:return 10;case 12:break;case 13:break;case 14:this.begin("href");break;case 15:this.popState();break;case 16:return 43;case 17:this.begin("callbackname");break;case 18:this.popState();break;case 19:this.popState(),this.begin("callbackargs");break;case 20:return 41;case 21:this.popState();break;case 22:return 42;case 23:this.begin("click");break;case 24:this.popState();break;case 25:return 40;case 26:return 4;case 27:return 22;case 28:return 23;case 29:return 24;case 30:return 25;case 31:return 26;case 32:return 28;case 33:return 27;case 34:return 29;case 35:return 12;case 36:return 13;case 37:return 14;case 38:return 15;case 39:return 16;case 40:return 17;case 41:return 18;case 42:return 20;case 43:return 21;case 44:return"date";case 45:return 30;case 46:return"accDescription";case 47:return 36;case 48:return 38;case 49:return 39;case 50:return":";case 51:return 6;case 52:return"INVALID"}},"anonymous"),rules:[/^(?:%%\{)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:weekday\s+monday\b)/i,/^(?:weekday\s+tuesday\b)/i,/^(?:weekday\s+wednesday\b)/i,/^(?:weekday\s+thursday\b)/i,/^(?:weekday\s+friday\b)/i,/^(?:weekday\s+saturday\b)/i,/^(?:weekday\s+sunday\b)/i,/^(?:weekend\s+friday\b)/i,/^(?:weekend\s+saturday\b)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^\n]+)/i,/^(?:[^:\n]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},callbackargs:{rules:[21,22],inclusive:!1},callbackname:{rules:[18,19,20],inclusive:!1},href:{rules:[15,16],inclusive:!1},click:{rules:[24,25],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,17,23,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],inclusive:!0}}};return L}();I.lexer=D;function k(){this.yy={}}return o(k,"Parser"),k.prototype=I,I.Parser=k,new k}();VI.parser=VI;fue=VI});var pue=Mi((UI,HI)=>{"use strict";(function(t,e){typeof UI=="object"&&typeof HI<"u"?HI.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_isoWeek=e()})(UI,function(){"use strict";var t="day";return function(e,r,n){var i=o(function(l){return l.add(4-l.isoWeekday(),t)},"a"),a=r.prototype;a.isoWeekYear=function(){return i(this).year()},a.isoWeek=function(l){if(!this.$utils().u(l))return this.add(7*(l-this.isoWeek()),t);var u,h,f,d,p=i(this),m=(u=this.isoWeekYear(),h=this.$u,f=(h?n.utc:n)().year(u).startOf("year"),d=4-f.isoWeekday(),f.isoWeekday()>4&&(d+=7),f.add(d,t));return p.diff(m,"week")+1},a.isoWeekday=function(l){return this.$utils().u(l)?this.day()||7:this.day(this.day()%7?l:l-7)};var s=a.startOf;a.startOf=function(l,u){var h=this.$utils(),f=!!h.u(u)||u;return h.p(l)==="isoweek"?f?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):s.bind(this)(l,u)}}})});var mue=Mi((WI,qI)=>{"use strict";(function(t,e){typeof WI=="object"&&typeof qI<"u"?qI.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_customParseFormat=e()})(WI,function(){"use strict";var t={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},e=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,r=/\d/,n=/\d\d/,i=/\d\d?/,a=/\d*[^-_:/,()\s\d]+/,s={},l=o(function(g){return(g=+g)+(g>68?1900:2e3)},"a"),u=o(function(g){return function(y){this[g]=+y}},"f"),h=[/[+-]\d\d:?(\d\d)?|Z/,function(g){(this.zone||(this.zone={})).offset=function(y){if(!y||y==="Z")return 0;var v=y.match(/([+-]|\d\d)/g),x=60*v[1]+(+v[2]||0);return x===0?0:v[0]==="+"?-x:x}(g)}],f=o(function(g){var y=s[g];return y&&(y.indexOf?y:y.s.concat(y.f))},"u"),d=o(function(g,y){var v,x=s.meridiem;if(x){for(var b=1;b<=24;b+=1)if(g.indexOf(x(b,0,y))>-1){v=b>12;break}}else v=g===(y?"pm":"PM");return v},"d"),p={A:[a,function(g){this.afternoon=d(g,!1)}],a:[a,function(g){this.afternoon=d(g,!0)}],Q:[r,function(g){this.month=3*(g-1)+1}],S:[r,function(g){this.milliseconds=100*+g}],SS:[n,function(g){this.milliseconds=10*+g}],SSS:[/\d{3}/,function(g){this.milliseconds=+g}],s:[i,u("seconds")],ss:[i,u("seconds")],m:[i,u("minutes")],mm:[i,u("minutes")],H:[i,u("hours")],h:[i,u("hours")],HH:[i,u("hours")],hh:[i,u("hours")],D:[i,u("day")],DD:[n,u("day")],Do:[a,function(g){var y=s.ordinal,v=g.match(/\d+/);if(this.day=v[0],y)for(var x=1;x<=31;x+=1)y(x).replace(/\[|\]/g,"")===g&&(this.day=x)}],w:[i,u("week")],ww:[n,u("week")],M:[i,u("month")],MM:[n,u("month")],MMM:[a,function(g){var y=f("months"),v=(f("monthsShort")||y.map(function(x){return x.slice(0,3)})).indexOf(g)+1;if(v<1)throw new Error;this.month=v%12||v}],MMMM:[a,function(g){var y=f("months").indexOf(g)+1;if(y<1)throw new Error;this.month=y%12||y}],Y:[/[+-]?\d+/,u("year")],YY:[n,function(g){this.year=l(g)}],YYYY:[/\d{4}/,u("year")],Z:h,ZZ:h};function m(g){var y,v;y=g,v=s&&s.formats;for(var x=(g=y.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,function(S,_,I){var D=I&&I.toUpperCase();return _||v[I]||t[I]||v[D].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(k,L,R){return L||R.slice(1)})})).match(e),b=x.length,w=0;w-1)return new Date((M==="X"?1e3:1)*O);var P=m(M)(O),z=P.year,$=P.month,H=P.day,Q=P.hours,j=P.minutes,ie=P.seconds,ne=P.milliseconds,le=P.zone,he=P.week,K=new Date,X=H||(z||$?1:K.getDate()),te=z||K.getFullYear(),J=0;z&&!$||(J=$>0?$-1:K.getMonth());var se,ue=Q||0,Z=j||0,Se=ie||0,ce=ne||0;return le?new Date(Date.UTC(te,J,X,ue,Z,Se,ce+60*le.offset*1e3)):B?new Date(Date.UTC(te,J,X,ue,Z,Se,ce)):(se=new Date(te,J,X,ue,Z,Se,ce),he&&(se=F(se).week(he).toDate()),se)}catch{return new Date("")}}(C,A,T,v),this.init(),D&&D!==!0&&(this.$L=this.locale(D).$L),I&&C!=this.format(A)&&(this.$d=new Date("")),s={}}else if(A instanceof Array)for(var k=A.length,L=1;L<=k;L+=1){E[1]=A[L-1];var R=v.apply(this,E);if(R.isValid()){this.$d=R.$d,this.$L=R.$L,this.init();break}L===k&&(this.$d=new Date(""))}else b.call(this,w)}}})});var gue=Mi((YI,XI)=>{"use strict";(function(t,e){typeof YI=="object"&&typeof XI<"u"?XI.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_advancedFormat=e()})(YI,function(){"use strict";return function(t,e){var r=e.prototype,n=r.format;r.format=function(i){var a=this,s=this.$locale();if(!this.isValid())return n.bind(this)(i);var l=this.$utils(),u=(i||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(h){switch(h){case"Q":return Math.ceil((a.$M+1)/3);case"Do":return s.ordinal(a.$D);case"gggg":return a.weekYear();case"GGGG":return a.isoWeekYear();case"wo":return s.ordinal(a.week(),"W");case"w":case"ww":return l.s(a.week(),h==="w"?1:2,"0");case"W":case"WW":return l.s(a.isoWeek(),h==="W"?1:2,"0");case"k":case"kk":return l.s(String(a.$H===0?24:a.$H),h==="k"?1:2,"0");case"X":return Math.floor(a.$d.getTime()/1e3);case"x":return a.$d.getTime();case"z":return"["+a.offsetName()+"]";case"zzz":return"["+a.offsetName("long")+"]";default:return h}});return n.bind(this)(u)}}})});function Nue(t,e,r){let n=!0;for(;n;)n=!1,r.forEach(function(i){let a="^\\s*"+i+"\\s*$",s=new RegExp(a);t[0].match(s)&&(e[i]=!0,t.shift(1),n=!0)})}var xue,ho,bue,wue,Tue,yue,Gc,ZI,JI,eO,mb,gb,tO,rO,f6,E1,nO,kue,iO,yb,aO,sO,d6,jI,ize,aze,sze,oze,lze,cze,uze,hze,fze,dze,pze,mze,gze,yze,vze,xze,bze,wze,Tze,kze,Eze,Sze,Cze,Eue,Aze,_ze,Dze,Sue,Lze,KI,Cue,Aue,u6,k1,Rze,Nze,QI,h6,Gi,_ue,Mze,Cp,Ize,vue,Oze,Due,Pze,Lue,Bze,Fze,Rue,Mue=N(()=>{"use strict";xue=Sa(z0(),1),ho=Sa(R4(),1),bue=Sa(pue(),1),wue=Sa(mue(),1),Tue=Sa(gue(),1);vt();zt();ir();mi();ho.default.extend(bue.default);ho.default.extend(wue.default);ho.default.extend(Tue.default);yue={friday:5,saturday:6},Gc="",ZI="",eO="",mb=[],gb=[],tO=new Map,rO=[],f6=[],E1="",nO="",kue=["active","done","crit","milestone"],iO=[],yb=!1,aO=!1,sO="sunday",d6="saturday",jI=0,ize=o(function(){rO=[],f6=[],E1="",iO=[],u6=0,QI=void 0,h6=void 0,Gi=[],Gc="",ZI="",nO="",JI=void 0,eO="",mb=[],gb=[],yb=!1,aO=!1,jI=0,tO=new Map,Ar(),sO="sunday",d6="saturday"},"clear"),aze=o(function(t){ZI=t},"setAxisFormat"),sze=o(function(){return ZI},"getAxisFormat"),oze=o(function(t){JI=t},"setTickInterval"),lze=o(function(){return JI},"getTickInterval"),cze=o(function(t){eO=t},"setTodayMarker"),uze=o(function(){return eO},"getTodayMarker"),hze=o(function(t){Gc=t},"setDateFormat"),fze=o(function(){yb=!0},"enableInclusiveEndDates"),dze=o(function(){return yb},"endDatesAreInclusive"),pze=o(function(){aO=!0},"enableTopAxis"),mze=o(function(){return aO},"topAxisEnabled"),gze=o(function(t){nO=t},"setDisplayMode"),yze=o(function(){return nO},"getDisplayMode"),vze=o(function(){return Gc},"getDateFormat"),xze=o(function(t){mb=t.toLowerCase().split(/[\s,]+/)},"setIncludes"),bze=o(function(){return mb},"getIncludes"),wze=o(function(t){gb=t.toLowerCase().split(/[\s,]+/)},"setExcludes"),Tze=o(function(){return gb},"getExcludes"),kze=o(function(){return tO},"getLinks"),Eze=o(function(t){E1=t,rO.push(t)},"addSection"),Sze=o(function(){return rO},"getSections"),Cze=o(function(){let t=vue(),e=10,r=0;for(;!t&&r[\d\w- ]+)/.exec(r);if(i!==null){let s=null;for(let u of i.groups.ids.split(" ")){let h=Cp(u);h!==void 0&&(!s||h.endTime>s.endTime)&&(s=h)}if(s)return s.endTime;let l=new Date;return l.setHours(0,0,0,0),l}let a=(0,ho.default)(r,e.trim(),!0);if(a.isValid())return a.toDate();{Y.debug("Invalid date:"+r),Y.debug("With date format:"+e.trim());let s=new Date(r);if(s===void 0||isNaN(s.getTime())||s.getFullYear()<-1e4||s.getFullYear()>1e4)throw new Error("Invalid date:"+r);return s}},"getStartDate"),Cue=o(function(t){let e=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return e!==null?[Number.parseFloat(e[1]),e[2]]:[NaN,"ms"]},"parseDuration"),Aue=o(function(t,e,r,n=!1){r=r.trim();let a=/^until\s+(?[\d\w- ]+)/.exec(r);if(a!==null){let f=null;for(let p of a.groups.ids.split(" ")){let m=Cp(p);m!==void 0&&(!f||m.startTime{window.open(r,"_self")}),tO.set(n,r))}),Due(t,"clickable")},"setLink"),Due=o(function(t,e){t.split(",").forEach(function(r){let n=Cp(r);n!==void 0&&n.classes.push(e)})},"setClass"),Pze=o(function(t,e,r){if(me().securityLevel!=="loose"||e===void 0)return;let n=[];if(typeof r=="string"){n=r.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let a=0;a{Gt.runFunc(e,...n)})},"setClickFun"),Lue=o(function(t,e){iO.push(function(){let r=document.querySelector(`[id="${t}"]`);r!==null&&r.addEventListener("click",function(){e()})},function(){let r=document.querySelector(`[id="${t}-text"]`);r!==null&&r.addEventListener("click",function(){e()})})},"pushFun"),Bze=o(function(t,e,r){t.split(",").forEach(function(n){Pze(n,e,r)}),Due(t,"clickable")},"setClickEvent"),Fze=o(function(t){iO.forEach(function(e){e(t)})},"bindFunctions"),Rue={getConfig:o(()=>me().gantt,"getConfig"),clear:ize,setDateFormat:hze,getDateFormat:vze,enableInclusiveEndDates:fze,endDatesAreInclusive:dze,enableTopAxis:pze,topAxisEnabled:mze,setAxisFormat:aze,getAxisFormat:sze,setTickInterval:oze,getTickInterval:lze,setTodayMarker:cze,getTodayMarker:uze,setAccTitle:Lr,getAccTitle:Rr,setDiagramTitle:$r,getDiagramTitle:Ir,setDisplayMode:gze,getDisplayMode:yze,setAccDescription:Nr,getAccDescription:Mr,addSection:Eze,getSections:Sze,getTasks:Cze,addTask:Mze,findTaskById:Cp,addTaskOrg:Ize,setIncludes:xze,getIncludes:bze,setExcludes:wze,getExcludes:Tze,setClickEvent:Bze,setLink:Oze,getLinks:kze,bindFunctions:Fze,parseDuration:Cue,isInvalidDate:Eue,setWeekday:Aze,getWeekday:_ze,setWeekend:Dze};o(Nue,"getTaskTags")});var p6,$ze,Iue,zze,Yu,Gze,Oue,Pue=N(()=>{"use strict";p6=Sa(R4(),1);vt();dr();gr();zt();Ei();$ze=o(function(){Y.debug("Something is calling, setConf, remove the call")},"setConf"),Iue={monday:Ch,tuesday:T5,wednesday:k5,thursday:oc,friday:E5,saturday:S5,sunday:yl},zze=o((t,e)=>{let r=[...t].map(()=>-1/0),n=[...t].sort((a,s)=>a.startTime-s.startTime||a.order-s.order),i=0;for(let a of n)for(let s=0;s=r[s]){r[s]=a.endTime,a.order=s+e,s>i&&(i=s);break}return i},"getMaxIntersections"),Gze=o(function(t,e,r,n){let i=me().gantt,a=me().securityLevel,s;a==="sandbox"&&(s=Ge("#i"+e));let l=a==="sandbox"?Ge(s.nodes()[0].contentDocument.body):Ge("body"),u=a==="sandbox"?s.nodes()[0].contentDocument:document,h=u.getElementById(e);Yu=h.parentElement.offsetWidth,Yu===void 0&&(Yu=1200),i.useWidth!==void 0&&(Yu=i.useWidth);let f=n.db.getTasks(),d=[];for(let S of f)d.push(S.type);d=A(d);let p={},m=2*i.topPadding;if(n.db.getDisplayMode()==="compact"||i.displayMode==="compact"){let S={};for(let I of f)S[I.section]===void 0?S[I.section]=[I]:S[I.section].push(I);let _=0;for(let I of Object.keys(S)){let D=zze(S[I],_)+1;_+=D,m+=D*(i.barHeight+i.barGap),p[I]=D}}else{m+=f.length*(i.barHeight+i.barGap);for(let S of d)p[S]=f.filter(_=>_.type===S).length}h.setAttribute("viewBox","0 0 "+Yu+" "+m);let g=l.select(`[id="${e}"]`),y=_5().domain([M3(f,function(S){return S.startTime}),N3(f,function(S){return S.endTime})]).rangeRound([0,Yu-i.leftPadding-i.rightPadding]);function v(S,_){let I=S.startTime,D=_.startTime,k=0;return I>D?k=1:Iz.order))].map(z=>S.find($=>$.order===z));g.append("g").selectAll("rect").data(M).enter().append("rect").attr("x",0).attr("y",function(z,$){return $=z.order,$*_+I-2}).attr("width",function(){return R-i.rightPadding/2}).attr("height",_).attr("class",function(z){for(let[$,H]of d.entries())if(z.type===H)return"section section"+$%i.numberSectionStyles;return"section section0"});let B=g.append("g").selectAll("rect").data(S).enter(),F=n.db.getLinks();if(B.append("rect").attr("id",function(z){return z.id}).attr("rx",3).attr("ry",3).attr("x",function(z){return z.milestone?y(z.startTime)+D+.5*(y(z.endTime)-y(z.startTime))-.5*k:y(z.startTime)+D}).attr("y",function(z,$){return $=z.order,$*_+I}).attr("width",function(z){return z.milestone?k:y(z.renderEndTime||z.endTime)-y(z.startTime)}).attr("height",k).attr("transform-origin",function(z,$){return $=z.order,(y(z.startTime)+D+.5*(y(z.endTime)-y(z.startTime))).toString()+"px "+($*_+I+.5*k).toString()+"px"}).attr("class",function(z){let $="task",H="";z.classes.length>0&&(H=z.classes.join(" "));let Q=0;for(let[ie,ne]of d.entries())z.type===ne&&(Q=ie%i.numberSectionStyles);let j="";return z.active?z.crit?j+=" activeCrit":j=" active":z.done?z.crit?j=" doneCrit":j=" done":z.crit&&(j+=" crit"),j.length===0&&(j=" task"),z.milestone&&(j=" milestone "+j),j+=Q,j+=" "+H,$+j}),B.append("text").attr("id",function(z){return z.id+"-text"}).text(function(z){return z.task}).attr("font-size",i.fontSize).attr("x",function(z){let $=y(z.startTime),H=y(z.renderEndTime||z.endTime);z.milestone&&($+=.5*(y(z.endTime)-y(z.startTime))-.5*k),z.milestone&&(H=$+k);let Q=this.getBBox().width;return Q>H-$?H+Q+1.5*i.leftPadding>R?$+D-5:H+D+5:(H-$)/2+$+D}).attr("y",function(z,$){return $=z.order,$*_+i.barHeight/2+(i.fontSize/2-2)+I}).attr("text-height",k).attr("class",function(z){let $=y(z.startTime),H=y(z.endTime);z.milestone&&(H=$+k);let Q=this.getBBox().width,j="";z.classes.length>0&&(j=z.classes.join(" "));let ie=0;for(let[le,he]of d.entries())z.type===he&&(ie=le%i.numberSectionStyles);let ne="";return z.active&&(z.crit?ne="activeCritText"+ie:ne="activeText"+ie),z.done?z.crit?ne=ne+" doneCritText"+ie:ne=ne+" doneText"+ie:z.crit&&(ne=ne+" critText"+ie),z.milestone&&(ne+=" milestoneText"),Q>H-$?H+Q+1.5*i.leftPadding>R?j+" taskTextOutsideLeft taskTextOutside"+ie+" "+ne:j+" taskTextOutsideRight taskTextOutside"+ie+" "+ne+" width-"+Q:j+" taskText taskText"+ie+" "+ne+" width-"+Q}),me().securityLevel==="sandbox"){let z;z=Ge("#i"+e);let $=z.nodes()[0].contentDocument;B.filter(function(H){return F.has(H.id)}).each(function(H){var Q=$.querySelector("#"+H.id),j=$.querySelector("#"+H.id+"-text");let ie=Q.parentNode;var ne=$.createElement("a");ne.setAttribute("xlink:href",F.get(H.id)),ne.setAttribute("target","_top"),ie.appendChild(ne),ne.appendChild(Q),ne.appendChild(j)})}}o(b,"drawRects");function w(S,_,I,D,k,L,R,O){if(R.length===0&&O.length===0)return;let M,B;for(let{startTime:Q,endTime:j}of L)(M===void 0||QB)&&(B=j);if(!M||!B)return;if((0,p6.default)(B).diff((0,p6.default)(M),"year")>5){Y.warn("The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days.");return}let F=n.db.getDateFormat(),P=[],z=null,$=(0,p6.default)(M);for(;$.valueOf()<=B;)n.db.isInvalidDate($,F,R,O)?z?z.end=$:z={start:$,end:$}:z&&(P.push(z),z=null),$=$.add(1,"d");g.append("g").selectAll("rect").data(P).enter().append("rect").attr("id",function(Q){return"exclude-"+Q.start.format("YYYY-MM-DD")}).attr("x",function(Q){return y(Q.start)+I}).attr("y",i.gridLineStartPadding).attr("width",function(Q){let j=Q.end.add(1,"day");return y(j)-y(Q.start)}).attr("height",k-_-i.gridLineStartPadding).attr("transform-origin",function(Q,j){return(y(Q.start)+I+.5*(y(Q.end)-y(Q.start))).toString()+"px "+(j*S+.5*k).toString()+"px"}).attr("class","exclude-range")}o(w,"drawExcludeDays");function C(S,_,I,D){let k=bA(y).tickSize(-D+_+i.gridLineStartPadding).tickFormat(wd(n.db.getAxisFormat()||i.axisFormat||"%Y-%m-%d")),R=/^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/.exec(n.db.getTickInterval()||i.tickInterval);if(R!==null){let O=R[1],M=R[2],B=n.db.getWeekday()||i.weekday;switch(M){case"millisecond":k.ticks(ac.every(O));break;case"second":k.ticks(Ks.every(O));break;case"minute":k.ticks(vu.every(O));break;case"hour":k.ticks(xu.every(O));break;case"day":k.ticks(_o.every(O));break;case"week":k.ticks(Iue[B].every(O));break;case"month":k.ticks(bu.every(O));break}}if(g.append("g").attr("class","grid").attr("transform","translate("+S+", "+(D-50)+")").call(k).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),n.db.topAxisEnabled()||i.topAxis){let O=xA(y).tickSize(-D+_+i.gridLineStartPadding).tickFormat(wd(n.db.getAxisFormat()||i.axisFormat||"%Y-%m-%d"));if(R!==null){let M=R[1],B=R[2],F=n.db.getWeekday()||i.weekday;switch(B){case"millisecond":O.ticks(ac.every(M));break;case"second":O.ticks(Ks.every(M));break;case"minute":O.ticks(vu.every(M));break;case"hour":O.ticks(xu.every(M));break;case"day":O.ticks(_o.every(M));break;case"week":O.ticks(Iue[F].every(M));break;case"month":O.ticks(bu.every(M));break}}g.append("g").attr("class","grid").attr("transform","translate("+S+", "+_+")").call(O).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}o(C,"makeGrid");function T(S,_){let I=0,D=Object.keys(p).map(k=>[k,p[k]]);g.append("g").selectAll("text").data(D).enter().append(function(k){let L=k[0].split(Ze.lineBreakRegex),R=-(L.length-1)/2,O=u.createElementNS("http://www.w3.org/2000/svg","text");O.setAttribute("dy",R+"em");for(let[M,B]of L.entries()){let F=u.createElementNS("http://www.w3.org/2000/svg","tspan");F.setAttribute("alignment-baseline","central"),F.setAttribute("x","10"),M>0&&F.setAttribute("dy","1em"),F.textContent=B,O.appendChild(F)}return O}).attr("x",10).attr("y",function(k,L){if(L>0)for(let R=0;R{"use strict";Vze=o(t=>` + .mermaid-main-font { + font-family: ${t.fontFamily}; + } + + .exclude-range { + fill: ${t.excludeBkgColor}; + } + + .section { + stroke: none; + opacity: 0.2; + } + + .section0 { + fill: ${t.sectionBkgColor}; + } + + .section2 { + fill: ${t.sectionBkgColor2}; + } + + .section1, + .section3 { + fill: ${t.altSectionBkgColor}; + opacity: 0.2; + } + + .sectionTitle0 { + fill: ${t.titleColor}; + } + + .sectionTitle1 { + fill: ${t.titleColor}; + } + + .sectionTitle2 { + fill: ${t.titleColor}; + } + + .sectionTitle3 { + fill: ${t.titleColor}; + } + + .sectionTitle { + text-anchor: start; + font-family: ${t.fontFamily}; + } + + + /* Grid and axis */ + + .grid .tick { + stroke: ${t.gridColor}; + opacity: 0.8; + shape-rendering: crispEdges; + } + + .grid .tick text { + font-family: ${t.fontFamily}; + fill: ${t.textColor}; + } + + .grid path { + stroke-width: 0; + } + + + /* Today line */ + + .today { + fill: none; + stroke: ${t.todayLineColor}; + stroke-width: 2px; + } + + + /* Task styling */ + + /* Default task */ + + .task { + stroke-width: 2; + } + + .taskText { + text-anchor: middle; + font-family: ${t.fontFamily}; + } + + .taskTextOutsideRight { + fill: ${t.taskTextDarkColor}; + text-anchor: start; + font-family: ${t.fontFamily}; + } + + .taskTextOutsideLeft { + fill: ${t.taskTextDarkColor}; + text-anchor: end; + } + + + /* Special case clickable */ + + .task.clickable { + cursor: pointer; + } + + .taskText.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideLeft.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideRight.clickable { + cursor: pointer; + fill: ${t.taskTextClickableColor} !important; + font-weight: bold; + } + + + /* Specific task settings for the sections*/ + + .taskText0, + .taskText1, + .taskText2, + .taskText3 { + fill: ${t.taskTextColor}; + } + + .task0, + .task1, + .task2, + .task3 { + fill: ${t.taskBkgColor}; + stroke: ${t.taskBorderColor}; + } + + .taskTextOutside0, + .taskTextOutside2 + { + fill: ${t.taskTextOutsideColor}; + } + + .taskTextOutside1, + .taskTextOutside3 { + fill: ${t.taskTextOutsideColor}; + } + + + /* Active task */ + + .active0, + .active1, + .active2, + .active3 { + fill: ${t.activeTaskBkgColor}; + stroke: ${t.activeTaskBorderColor}; + } + + .activeText0, + .activeText1, + .activeText2, + .activeText3 { + fill: ${t.taskTextDarkColor} !important; + } + + + /* Completed task */ + + .done0, + .done1, + .done2, + .done3 { + stroke: ${t.doneTaskBorderColor}; + fill: ${t.doneTaskBkgColor}; + stroke-width: 2; + } + + .doneText0, + .doneText1, + .doneText2, + .doneText3 { + fill: ${t.taskTextDarkColor} !important; + } + + + /* Tasks on the critical line */ + + .crit0, + .crit1, + .crit2, + .crit3 { + stroke: ${t.critBorderColor}; + fill: ${t.critBkgColor}; + stroke-width: 2; + } + + .activeCrit0, + .activeCrit1, + .activeCrit2, + .activeCrit3 { + stroke: ${t.critBorderColor}; + fill: ${t.activeTaskBkgColor}; + stroke-width: 2; + } + + .doneCrit0, + .doneCrit1, + .doneCrit2, + .doneCrit3 { + stroke: ${t.critBorderColor}; + fill: ${t.doneTaskBkgColor}; + stroke-width: 2; + cursor: pointer; + shape-rendering: crispEdges; + } + + .milestone { + transform: rotate(45deg) scale(0.8,0.8); + } + + .milestoneText { + font-style: italic; + } + .doneCritText0, + .doneCritText1, + .doneCritText2, + .doneCritText3 { + fill: ${t.taskTextDarkColor} !important; + } + + .activeCritText0, + .activeCritText1, + .activeCritText2, + .activeCritText3 { + fill: ${t.taskTextDarkColor} !important; + } + + .titleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.titleColor||t.textColor}; + font-family: ${t.fontFamily}; + } +`,"getStyles"),Bue=Vze});var $ue={};hr($ue,{diagram:()=>Uze});var Uze,zue=N(()=>{"use strict";due();Mue();Pue();Fue();Uze={parser:fue,db:Rue,renderer:Oue,styles:Bue}});var Uue,Hue=N(()=>{"use strict";kp();vt();Uue={parse:o(async t=>{let e=await uo("info",t);Y.debug(e)},"parse")}});var vb,oO=N(()=>{vb={name:"mermaid",version:"11.6.0",description:"Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.",type:"module",module:"./dist/mermaid.core.mjs",types:"./dist/mermaid.d.ts",exports:{".":{types:"./dist/mermaid.d.ts",import:"./dist/mermaid.core.mjs",default:"./dist/mermaid.core.mjs"},"./*":"./*"},keywords:["diagram","markdown","flowchart","sequence diagram","gantt","class diagram","git graph","mindmap","packet diagram","c4 diagram","er diagram","pie chart","pie diagram","quadrant chart","requirement diagram","graph"],scripts:{clean:"rimraf dist",dev:"pnpm -w dev","docs:code":"typedoc src/defaultConfig.ts src/config.ts src/mermaid.ts && prettier --write ./src/docs/config/setup","docs:build":"rimraf ../../docs && pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts","docs:verify":"pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts --verify","docs:pre:vitepress":"pnpm --filter ./src/docs prefetch && rimraf src/vitepress && pnpm docs:code && tsx scripts/docs.cli.mts --vitepress && pnpm --filter ./src/vitepress install --no-frozen-lockfile --ignore-scripts","docs:build:vitepress":"pnpm docs:pre:vitepress && (cd src/vitepress && pnpm run build) && cpy --flat src/docs/landing/ ./src/vitepress/.vitepress/dist/landing","docs:dev":'pnpm docs:pre:vitepress && concurrently "pnpm --filter ./src/vitepress dev" "tsx scripts/docs.cli.mts --watch --vitepress"',"docs:dev:docker":'pnpm docs:pre:vitepress && concurrently "pnpm --filter ./src/vitepress dev:docker" "tsx scripts/docs.cli.mts --watch --vitepress"',"docs:serve":"pnpm docs:build:vitepress && vitepress serve src/vitepress","docs:spellcheck":'cspell "src/docs/**/*.md"',"docs:release-version":"tsx scripts/update-release-version.mts","docs:verify-version":"tsx scripts/update-release-version.mts --verify","types:build-config":"tsx scripts/create-types-from-json-schema.mts","types:verify-config":"tsx scripts/create-types-from-json-schema.mts --verify",checkCircle:"npx madge --circular ./src",prepublishOnly:"pnpm docs:verify-version"},repository:{type:"git",url:"https://github.com/mermaid-js/mermaid"},author:"Knut Sveidqvist",license:"MIT",standard:{ignore:["**/parser/*.js","dist/**/*.js","cypress/**/*.js"],globals:["page"]},dependencies:{"@braintree/sanitize-url":"^7.0.4","@iconify/utils":"^2.1.33","@mermaid-js/parser":"workspace:^","@types/d3":"^7.4.3",cytoscape:"^3.29.3","cytoscape-cose-bilkent":"^4.1.0","cytoscape-fcose":"^2.2.0",d3:"^7.9.0","d3-sankey":"^0.12.3","dagre-d3-es":"7.0.11",dayjs:"^1.11.13",dompurify:"^3.2.4",katex:"^0.16.9",khroma:"^2.1.0","lodash-es":"^4.17.21",marked:"^15.0.7",roughjs:"^4.6.6",stylis:"^4.3.6","ts-dedent":"^2.2.0",uuid:"^11.1.0"},devDependencies:{"@adobe/jsonschema2md":"^8.0.2","@iconify/types":"^2.0.0","@types/cytoscape":"^3.21.9","@types/cytoscape-fcose":"^2.2.4","@types/d3-sankey":"^0.12.4","@types/d3-scale":"^4.0.9","@types/d3-scale-chromatic":"^3.1.0","@types/d3-selection":"^3.0.11","@types/d3-shape":"^3.1.7","@types/jsdom":"^21.1.7","@types/katex":"^0.16.7","@types/lodash-es":"^4.17.12","@types/micromatch":"^4.0.9","@types/stylis":"^4.2.7","@types/uuid":"^10.0.0",ajv:"^8.17.1",chokidar:"^4.0.3",concurrently:"^9.1.2","csstree-validator":"^4.0.1",globby:"^14.0.2",jison:"^0.4.18","js-base64":"^3.7.7",jsdom:"^26.0.0","json-schema-to-typescript":"^15.0.4",micromatch:"^4.0.8","path-browserify":"^1.0.1",prettier:"^3.5.2",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-gfm":"^4.0.1",rimraf:"^6.0.1","start-server-and-test":"^2.0.10","type-fest":"^4.35.0",typedoc:"^0.27.8","typedoc-plugin-markdown":"^4.4.2",typescript:"~5.7.3","unist-util-flatmap":"^1.0.0","unist-util-visit":"^5.0.0",vitepress:"^1.0.2","vitepress-plugin-search":"1.0.4-alpha.22"},files:["dist/","README.md"],publishConfig:{access:"public"}}});var Xze,jze,Wue,que=N(()=>{"use strict";oO();Xze={version:vb.version},jze=o(()=>Xze.version,"getVersion"),Wue={getVersion:jze}});var sa,Vc=N(()=>{"use strict";dr();zt();sa=o(t=>{let{securityLevel:e}=me(),r=Ge("body");if(e==="sandbox"){let a=Ge(`#i${t}`).node()?.contentDocument??document;r=Ge(a.body)}return r.select(`#${t}`)},"selectSvgElement")});var Kze,Yue,Xue=N(()=>{"use strict";vt();Vc();Ei();Kze=o((t,e,r)=>{Y.debug(`rendering info diagram +`+t);let n=sa(e);vn(n,100,400,!0),n.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${r}`)},"draw"),Yue={draw:Kze}});var jue={};hr(jue,{diagram:()=>Qze});var Qze,Kue=N(()=>{"use strict";Hue();que();Xue();Qze={parser:Uue,db:Wue,renderer:Yue}});var Jue,lO,m6,cO,eGe,tGe,rGe,nGe,iGe,aGe,sGe,g6,uO=N(()=>{"use strict";vt();mi();Ya();Jue=or.pie,lO={sections:new Map,showData:!1,config:Jue},m6=lO.sections,cO=lO.showData,eGe=structuredClone(Jue),tGe=o(()=>structuredClone(eGe),"getConfig"),rGe=o(()=>{m6=new Map,cO=lO.showData,Ar()},"clear"),nGe=o(({label:t,value:e})=>{m6.has(t)||(m6.set(t,e),Y.debug(`added new section: ${t}, with value: ${e}`))},"addSection"),iGe=o(()=>m6,"getSections"),aGe=o(t=>{cO=t},"setShowData"),sGe=o(()=>cO,"getShowData"),g6={getConfig:tGe,clear:rGe,setDiagramTitle:$r,getDiagramTitle:Ir,setAccTitle:Lr,getAccTitle:Rr,setAccDescription:Nr,getAccDescription:Mr,addSection:nGe,getSections:iGe,setShowData:aGe,getShowData:sGe}});var oGe,ehe,the=N(()=>{"use strict";kp();vt();T1();uO();oGe=o((t,e)=>{$c(t,e),e.setShowData(t.showData),t.sections.map(e.addSection)},"populateDb"),ehe={parse:o(async t=>{let e=await uo("pie",t);Y.debug(e),oGe(e,g6)},"parse")}});var lGe,rhe,nhe=N(()=>{"use strict";lGe=o(t=>` + .pieCircle{ + stroke: ${t.pieStrokeColor}; + stroke-width : ${t.pieStrokeWidth}; + opacity : ${t.pieOpacity}; + } + .pieOuterCircle{ + stroke: ${t.pieOuterStrokeColor}; + stroke-width: ${t.pieOuterStrokeWidth}; + fill: none; + } + .pieTitleText { + text-anchor: middle; + font-size: ${t.pieTitleTextSize}; + fill: ${t.pieTitleTextColor}; + font-family: ${t.fontFamily}; + } + .slice { + font-family: ${t.fontFamily}; + fill: ${t.pieSectionTextColor}; + font-size:${t.pieSectionTextSize}; + // fill: white; + } + .legend text { + fill: ${t.pieLegendTextColor}; + font-family: ${t.fontFamily}; + font-size: ${t.pieLegendTextSize}; + } +`,"getStyles"),rhe=lGe});var cGe,uGe,ihe,ahe=N(()=>{"use strict";dr();zt();vt();Vc();Ei();ir();cGe=o(t=>{let e=[...t.entries()].map(n=>({label:n[0],value:n[1]})).sort((n,i)=>i.value-n.value);return I5().value(n=>n.value)(e)},"createPieArcs"),uGe=o((t,e,r,n)=>{Y.debug(`rendering pie chart +`+t);let i=n.db,a=me(),s=Fi(i.getConfig(),a.pie),l=40,u=18,h=4,f=450,d=f,p=sa(e),m=p.append("g");m.attr("transform","translate("+d/2+","+f/2+")");let{themeVariables:g}=a,[y]=Bo(g.pieOuterStrokeWidth);y??=2;let v=s.textPosition,x=Math.min(d,f)/2-l,b=bl().innerRadius(0).outerRadius(x),w=bl().innerRadius(x*v).outerRadius(x*v);m.append("circle").attr("cx",0).attr("cy",0).attr("r",x+y/2).attr("class","pieOuterCircle");let C=i.getSections(),T=cGe(C),E=[g.pie1,g.pie2,g.pie3,g.pie4,g.pie5,g.pie6,g.pie7,g.pie8,g.pie9,g.pie10,g.pie11,g.pie12],A=gu(E);m.selectAll("mySlices").data(T).enter().append("path").attr("d",b).attr("fill",k=>A(k.data.label)).attr("class","pieCircle");let S=0;C.forEach(k=>{S+=k}),m.selectAll("mySlices").data(T).enter().append("text").text(k=>(k.data.value/S*100).toFixed(0)+"%").attr("transform",k=>"translate("+w.centroid(k)+")").style("text-anchor","middle").attr("class","slice"),m.append("text").text(i.getDiagramTitle()).attr("x",0).attr("y",-(f-50)/2).attr("class","pieTitleText");let _=m.selectAll(".legend").data(A.domain()).enter().append("g").attr("class","legend").attr("transform",(k,L)=>{let R=u+h,O=R*A.domain().length/2,M=12*u,B=L*R-O;return"translate("+M+","+B+")"});_.append("rect").attr("width",u).attr("height",u).style("fill",A).style("stroke",A),_.data(T).append("text").attr("x",u+h).attr("y",u-h).text(k=>{let{label:L,value:R}=k.data;return i.getShowData()?`${L} [${R}]`:L});let I=Math.max(..._.selectAll("text").nodes().map(k=>k?.getBoundingClientRect().width??0)),D=d+l+u+h+I;p.attr("viewBox",`0 0 ${D} ${f}`),vn(p,f,D,s.useMaxWidth)},"draw"),ihe={draw:uGe}});var she={};hr(she,{diagram:()=>hGe});var hGe,ohe=N(()=>{"use strict";the();uO();nhe();ahe();hGe={parser:ehe,db:g6,renderer:ihe,styles:rhe}});var hO,uhe,hhe=N(()=>{"use strict";hO=function(){var t=o(function(xe,q,pe,ve){for(pe=pe||{},ve=xe.length;ve--;pe[xe[ve]]=q);return pe},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[1,7],s=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],l=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],u=[55,56,57],h=[2,36],f=[1,37],d=[1,36],p=[1,38],m=[1,35],g=[1,43],y=[1,41],v=[1,14],x=[1,23],b=[1,18],w=[1,19],C=[1,20],T=[1,21],E=[1,22],A=[1,24],S=[1,25],_=[1,26],I=[1,27],D=[1,28],k=[1,29],L=[1,32],R=[1,33],O=[1,34],M=[1,39],B=[1,40],F=[1,42],P=[1,44],z=[1,62],$=[1,61],H=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],Q=[1,65],j=[1,66],ie=[1,67],ne=[1,68],le=[1,69],he=[1,70],K=[1,71],X=[1,72],te=[1,73],J=[1,74],se=[1,75],ue=[1,76],Z=[4,5,6,7,8,9,10,11,12,13,14,15,18],Se=[1,90],ce=[1,91],ae=[1,92],Oe=[1,99],ge=[1,93],ze=[1,96],He=[1,94],$e=[1,95],Re=[1,97],Ie=[1,98],be=[1,102],W=[10,55,56,57],de=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],re={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,idStringToken:3,ALPHA:4,NUM:5,NODE_STRING:6,DOWN:7,MINUS:8,DEFAULT:9,COMMA:10,COLON:11,AMP:12,BRKT:13,MULT:14,UNICODE_TEXT:15,styleComponent:16,UNIT:17,SPACE:18,STYLE:19,PCT:20,idString:21,style:22,stylesOpt:23,classDefStatement:24,CLASSDEF:25,start:26,eol:27,QUADRANT:28,document:29,line:30,statement:31,axisDetails:32,quadrantDetails:33,points:34,title:35,title_value:36,acc_title:37,acc_title_value:38,acc_descr:39,acc_descr_value:40,acc_descr_multiline_value:41,section:42,text:43,point_start:44,point_x:45,point_y:46,class_name:47,"X-AXIS":48,"AXIS-TEXT-DELIMITER":49,"Y-AXIS":50,QUADRANT_1:51,QUADRANT_2:52,QUADRANT_3:53,QUADRANT_4:54,NEWLINE:55,SEMI:56,EOF:57,alphaNumToken:58,textNoTagsToken:59,STR:60,MD_STR:61,alphaNum:62,PUNCTUATION:63,PLUS:64,EQUALS:65,DOT:66,UNDERSCORE:67,$accept:0,$end:1},terminals_:{2:"error",4:"ALPHA",5:"NUM",6:"NODE_STRING",7:"DOWN",8:"MINUS",9:"DEFAULT",10:"COMMA",11:"COLON",12:"AMP",13:"BRKT",14:"MULT",15:"UNICODE_TEXT",17:"UNIT",18:"SPACE",19:"STYLE",20:"PCT",25:"CLASSDEF",28:"QUADRANT",35:"title",36:"title_value",37:"acc_title",38:"acc_title_value",39:"acc_descr",40:"acc_descr_value",41:"acc_descr_multiline_value",42:"section",44:"point_start",45:"point_x",46:"point_y",47:"class_name",48:"X-AXIS",49:"AXIS-TEXT-DELIMITER",50:"Y-AXIS",51:"QUADRANT_1",52:"QUADRANT_2",53:"QUADRANT_3",54:"QUADRANT_4",55:"NEWLINE",56:"SEMI",57:"EOF",60:"STR",61:"MD_STR",63:"PUNCTUATION",64:"PLUS",65:"EQUALS",66:"DOT",67:"UNDERSCORE"},productions_:[0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],performAction:o(function(q,pe,ve,Pe,_e,we,Ve){var De=we.length-1;switch(_e){case 23:this.$=we[De];break;case 24:this.$=we[De-1]+""+we[De];break;case 26:this.$=we[De-1]+we[De];break;case 27:this.$=[we[De].trim()];break;case 28:we[De-2].push(we[De].trim()),this.$=we[De-2];break;case 29:this.$=we[De-4],Pe.addClass(we[De-2],we[De]);break;case 37:this.$=[];break;case 42:this.$=we[De].trim(),Pe.setDiagramTitle(this.$);break;case 43:this.$=we[De].trim(),Pe.setAccTitle(this.$);break;case 44:case 45:this.$=we[De].trim(),Pe.setAccDescription(this.$);break;case 46:Pe.addSection(we[De].substr(8)),this.$=we[De].substr(8);break;case 47:Pe.addPoint(we[De-3],"",we[De-1],we[De],[]);break;case 48:Pe.addPoint(we[De-4],we[De-3],we[De-1],we[De],[]);break;case 49:Pe.addPoint(we[De-4],"",we[De-2],we[De-1],we[De]);break;case 50:Pe.addPoint(we[De-5],we[De-4],we[De-2],we[De-1],we[De]);break;case 51:Pe.setXAxisLeftText(we[De-2]),Pe.setXAxisRightText(we[De]);break;case 52:we[De-1].text+=" \u27F6 ",Pe.setXAxisLeftText(we[De-1]);break;case 53:Pe.setXAxisLeftText(we[De]);break;case 54:Pe.setYAxisBottomText(we[De-2]),Pe.setYAxisTopText(we[De]);break;case 55:we[De-1].text+=" \u27F6 ",Pe.setYAxisBottomText(we[De-1]);break;case 56:Pe.setYAxisBottomText(we[De]);break;case 57:Pe.setQuadrant1Text(we[De]);break;case 58:Pe.setQuadrant2Text(we[De]);break;case 59:Pe.setQuadrant3Text(we[De]);break;case 60:Pe.setQuadrant4Text(we[De]);break;case 64:this.$={text:we[De],type:"text"};break;case 65:this.$={text:we[De-1].text+""+we[De],type:we[De-1].type};break;case 66:this.$={text:we[De],type:"text"};break;case 67:this.$={text:we[De],type:"markdown"};break;case 68:this.$=we[De];break;case 69:this.$=we[De-1]+""+we[De];break}},"anonymous"),table:[{18:e,26:1,27:2,28:r,55:n,56:i,57:a},{1:[3]},{18:e,26:8,27:2,28:r,55:n,56:i,57:a},{18:e,26:9,27:2,28:r,55:n,56:i,57:a},t(s,[2,33],{29:10}),t(l,[2,61]),t(l,[2,62]),t(l,[2,63]),{1:[2,30]},{1:[2,31]},t(u,h,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:f,5:d,10:p,12:m,13:g,14:y,18:v,25:x,35:b,37:w,39:C,41:T,42:E,48:A,50:S,51:_,52:I,53:D,54:k,60:L,61:R,63:O,64:M,65:B,66:F,67:P}),t(s,[2,34]),{27:45,55:n,56:i,57:a},t(u,[2,37]),t(u,h,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:f,5:d,10:p,12:m,13:g,14:y,18:v,25:x,35:b,37:w,39:C,41:T,42:E,48:A,50:S,51:_,52:I,53:D,54:k,60:L,61:R,63:O,64:M,65:B,66:F,67:P}),t(u,[2,39]),t(u,[2,40]),t(u,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(u,[2,45]),t(u,[2,46]),{18:[1,50]},{4:f,5:d,10:p,12:m,13:g,14:y,43:51,58:31,60:L,61:R,63:O,64:M,65:B,66:F,67:P},{4:f,5:d,10:p,12:m,13:g,14:y,43:52,58:31,60:L,61:R,63:O,64:M,65:B,66:F,67:P},{4:f,5:d,10:p,12:m,13:g,14:y,43:53,58:31,60:L,61:R,63:O,64:M,65:B,66:F,67:P},{4:f,5:d,10:p,12:m,13:g,14:y,43:54,58:31,60:L,61:R,63:O,64:M,65:B,66:F,67:P},{4:f,5:d,10:p,12:m,13:g,14:y,43:55,58:31,60:L,61:R,63:O,64:M,65:B,66:F,67:P},{4:f,5:d,10:p,12:m,13:g,14:y,43:56,58:31,60:L,61:R,63:O,64:M,65:B,66:F,67:P},{4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,44:[1,57],47:[1,58],58:60,59:59,63:O,64:M,65:B,66:F,67:P},t(H,[2,64]),t(H,[2,66]),t(H,[2,67]),t(H,[2,70]),t(H,[2,71]),t(H,[2,72]),t(H,[2,73]),t(H,[2,74]),t(H,[2,75]),t(H,[2,76]),t(H,[2,77]),t(H,[2,78]),t(H,[2,79]),t(H,[2,80]),t(s,[2,35]),t(u,[2,38]),t(u,[2,42]),t(u,[2,43]),t(u,[2,44]),{3:64,4:Q,5:j,6:ie,7:ne,8:le,9:he,10:K,11:X,12:te,13:J,14:se,15:ue,21:63},t(u,[2,53],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,49:[1,77],63:O,64:M,65:B,66:F,67:P}),t(u,[2,56],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,49:[1,78],63:O,64:M,65:B,66:F,67:P}),t(u,[2,57],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:B,66:F,67:P}),t(u,[2,58],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:B,66:F,67:P}),t(u,[2,59],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:B,66:F,67:P}),t(u,[2,60],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:B,66:F,67:P}),{45:[1,79]},{44:[1,80]},t(H,[2,65]),t(H,[2,81]),t(H,[2,82]),t(H,[2,83]),{3:82,4:Q,5:j,6:ie,7:ne,8:le,9:he,10:K,11:X,12:te,13:J,14:se,15:ue,18:[1,81]},t(Z,[2,23]),t(Z,[2,1]),t(Z,[2,2]),t(Z,[2,3]),t(Z,[2,4]),t(Z,[2,5]),t(Z,[2,6]),t(Z,[2,7]),t(Z,[2,8]),t(Z,[2,9]),t(Z,[2,10]),t(Z,[2,11]),t(Z,[2,12]),t(u,[2,52],{58:31,43:83,4:f,5:d,10:p,12:m,13:g,14:y,60:L,61:R,63:O,64:M,65:B,66:F,67:P}),t(u,[2,55],{58:31,43:84,4:f,5:d,10:p,12:m,13:g,14:y,60:L,61:R,63:O,64:M,65:B,66:F,67:P}),{46:[1,85]},{45:[1,86]},{4:Se,5:ce,6:ae,8:Oe,11:ge,13:ze,16:89,17:He,18:$e,19:Re,20:Ie,22:88,23:87},t(Z,[2,24]),t(u,[2,51],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:B,66:F,67:P}),t(u,[2,54],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,63:O,64:M,65:B,66:F,67:P}),t(u,[2,47],{22:88,16:89,23:100,4:Se,5:ce,6:ae,8:Oe,11:ge,13:ze,17:He,18:$e,19:Re,20:Ie}),{46:[1,101]},t(u,[2,29],{10:be}),t(W,[2,27],{16:103,4:Se,5:ce,6:ae,8:Oe,11:ge,13:ze,17:He,18:$e,19:Re,20:Ie}),t(de,[2,25]),t(de,[2,13]),t(de,[2,14]),t(de,[2,15]),t(de,[2,16]),t(de,[2,17]),t(de,[2,18]),t(de,[2,19]),t(de,[2,20]),t(de,[2,21]),t(de,[2,22]),t(u,[2,49],{10:be}),t(u,[2,48],{22:88,16:89,23:104,4:Se,5:ce,6:ae,8:Oe,11:ge,13:ze,17:He,18:$e,19:Re,20:Ie}),{4:Se,5:ce,6:ae,8:Oe,11:ge,13:ze,16:89,17:He,18:$e,19:Re,20:Ie,22:105},t(de,[2,26]),t(u,[2,50],{10:be}),t(W,[2,28],{16:103,4:Se,5:ce,6:ae,8:Oe,11:ge,13:ze,17:He,18:$e,19:Re,20:Ie})],defaultActions:{8:[2,30],9:[2,31]},parseError:o(function(q,pe){if(pe.recoverable)this.trace(q);else{var ve=new Error(q);throw ve.hash=pe,ve}},"parseError"),parse:o(function(q){var pe=this,ve=[0],Pe=[],_e=[null],we=[],Ve=this.table,De="",qe=0,at=0,Rt=0,st=2,Ue=1,ct=we.slice.call(arguments,1),We=Object.create(this.lexer),ot={yy:{}};for(var Yt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Yt)&&(ot.yy[Yt]=this.yy[Yt]);We.setInput(q,ot.yy),ot.yy.lexer=We,ot.yy.parser=this,typeof We.yylloc>"u"&&(We.yylloc={});var bt=We.yylloc;we.push(bt);var Mt=We.options&&We.options.ranges;typeof ot.yy.parseError=="function"?this.parseError=ot.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function xt(Ce){ve.length=ve.length-2*Ce,_e.length=_e.length-Ce,we.length=we.length-Ce}o(xt,"popStack");function ut(){var Ce;return Ce=Pe.pop()||We.lex()||Ue,typeof Ce!="number"&&(Ce instanceof Array&&(Pe=Ce,Ce=Pe.pop()),Ce=pe.symbols_[Ce]||Ce),Ce}o(ut,"lex");for(var Et,ft,yt,nt,dn,Tt,On={},tn,_r,Dr,Pn;;){if(yt=ve[ve.length-1],this.defaultActions[yt]?nt=this.defaultActions[yt]:((Et===null||typeof Et>"u")&&(Et=ut()),nt=Ve[yt]&&Ve[yt][Et]),typeof nt>"u"||!nt.length||!nt[0]){var At="";Pn=[];for(tn in Ve[yt])this.terminals_[tn]&&tn>st&&Pn.push("'"+this.terminals_[tn]+"'");We.showPosition?At="Parse error on line "+(qe+1)+`: +`+We.showPosition()+` +Expecting `+Pn.join(", ")+", got '"+(this.terminals_[Et]||Et)+"'":At="Parse error on line "+(qe+1)+": Unexpected "+(Et==Ue?"end of input":"'"+(this.terminals_[Et]||Et)+"'"),this.parseError(At,{text:We.match,token:this.terminals_[Et]||Et,line:We.yylineno,loc:bt,expected:Pn})}if(nt[0]instanceof Array&&nt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+yt+", token: "+Et);switch(nt[0]){case 1:ve.push(Et),_e.push(We.yytext),we.push(We.yylloc),ve.push(nt[1]),Et=null,ft?(Et=ft,ft=null):(at=We.yyleng,De=We.yytext,qe=We.yylineno,bt=We.yylloc,Rt>0&&Rt--);break;case 2:if(_r=this.productions_[nt[1]][1],On.$=_e[_e.length-_r],On._$={first_line:we[we.length-(_r||1)].first_line,last_line:we[we.length-1].last_line,first_column:we[we.length-(_r||1)].first_column,last_column:we[we.length-1].last_column},Mt&&(On._$.range=[we[we.length-(_r||1)].range[0],we[we.length-1].range[1]]),Tt=this.performAction.apply(On,[De,at,qe,ot.yy,nt[1],_e,we].concat(ct)),typeof Tt<"u")return Tt;_r&&(ve=ve.slice(0,-1*_r*2),_e=_e.slice(0,-1*_r),we=we.slice(0,-1*_r)),ve.push(this.productions_[nt[1]][0]),_e.push(On.$),we.push(On._$),Dr=Ve[ve[ve.length-2]][ve[ve.length-1]],ve.push(Dr);break;case 3:return!0}}return!0},"parse")},oe=function(){var xe={EOF:1,parseError:o(function(pe,ve){if(this.yy.parser)this.yy.parser.parseError(pe,ve);else throw new Error(pe)},"parseError"),setInput:o(function(q,pe){return this.yy=pe||this.yy||{},this._input=q,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var q=this._input[0];this.yytext+=q,this.yyleng++,this.offset++,this.match+=q,this.matched+=q;var pe=q.match(/(?:\r\n?|\n).*/g);return pe?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),q},"input"),unput:o(function(q){var pe=q.length,ve=q.split(/(?:\r\n?|\n)/g);this._input=q+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-pe),this.offset-=pe;var Pe=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),ve.length-1&&(this.yylineno-=ve.length-1);var _e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:ve?(ve.length===Pe.length?this.yylloc.first_column:0)+Pe[Pe.length-ve.length].length-ve[0].length:this.yylloc.first_column-pe},this.options.ranges&&(this.yylloc.range=[_e[0],_e[0]+this.yyleng-pe]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(q){this.unput(this.match.slice(q))},"less"),pastInput:o(function(){var q=this.matched.substr(0,this.matched.length-this.match.length);return(q.length>20?"...":"")+q.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var q=this.match;return q.length<20&&(q+=this._input.substr(0,20-q.length)),(q.substr(0,20)+(q.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var q=this.pastInput(),pe=new Array(q.length+1).join("-");return q+this.upcomingInput()+` +`+pe+"^"},"showPosition"),test_match:o(function(q,pe){var ve,Pe,_e;if(this.options.backtrack_lexer&&(_e={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(_e.yylloc.range=this.yylloc.range.slice(0))),Pe=q[0].match(/(?:\r\n?|\n).*/g),Pe&&(this.yylineno+=Pe.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Pe?Pe[Pe.length-1].length-Pe[Pe.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+q[0].length},this.yytext+=q[0],this.match+=q[0],this.matches=q,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(q[0].length),this.matched+=q[0],ve=this.performAction.call(this,this.yy,this,pe,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),ve)return ve;if(this._backtrack){for(var we in _e)this[we]=_e[we];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var q,pe,ve,Pe;this._more||(this.yytext="",this.match="");for(var _e=this._currentRules(),we=0;we<_e.length;we++)if(ve=this._input.match(this.rules[_e[we]]),ve&&(!pe||ve[0].length>pe[0].length)){if(pe=ve,Pe=we,this.options.backtrack_lexer){if(q=this.test_match(ve,_e[we]),q!==!1)return q;if(this._backtrack){pe=!1;continue}else return!1}else if(!this.options.flex)break}return pe?(q=this.test_match(pe,_e[Pe]),q!==!1?q:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var pe=this.next();return pe||this.lex()},"lex"),begin:o(function(pe){this.conditionStack.push(pe)},"begin"),popState:o(function(){var pe=this.conditionStack.length-1;return pe>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(pe){return pe=this.conditionStack.length-1-Math.abs(pe||0),pe>=0?this.conditionStack[pe]:"INITIAL"},"topState"),pushState:o(function(pe){this.begin(pe)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(pe,ve,Pe,_e){var we=_e;switch(Pe){case 0:break;case 1:break;case 2:return 55;case 3:break;case 4:return this.begin("title"),35;break;case 5:return this.popState(),"title_value";break;case 6:return this.begin("acc_title"),37;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),39;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 48;case 14:return 50;case 15:return 49;case 16:return 51;case 17:return 52;case 18:return 53;case 19:return 54;case 20:return 25;case 21:this.begin("md_string");break;case 22:return"MD_STR";case 23:this.popState();break;case 24:this.begin("string");break;case 25:this.popState();break;case 26:return"STR";case 27:this.begin("class_name");break;case 28:return this.popState(),47;break;case 29:return this.begin("point_start"),44;break;case 30:return this.begin("point_x"),45;break;case 31:this.popState();break;case 32:this.popState(),this.begin("point_y");break;case 33:return this.popState(),46;break;case 34:return 28;case 35:return 4;case 36:return 11;case 37:return 64;case 38:return 10;case 39:return 65;case 40:return 65;case 41:return 14;case 42:return 13;case 43:return 67;case 44:return 66;case 45:return 12;case 46:return 8;case 47:return 5;case 48:return 18;case 49:return 56;case 50:return 63;case 51:return 57}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:classDef\b)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?::::)/i,/^(?:^\w+)/i,/^(?:\s*:\s*\[\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?:\s*\] *)/i,/^(?:\s*,\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s)/i,/^(?:;)/i,/^(?:[!"#$%&'*+,-.`?\\_/])/i,/^(?:$)/i],conditions:{class_name:{rules:[28],inclusive:!1},point_y:{rules:[33],inclusive:!1},point_x:{rules:[32],inclusive:!1},point_start:{rules:[30,31],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[22,23],inclusive:!1},string:{rules:[25,26],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,21,24,27,29,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],inclusive:!0}}};return xe}();re.lexer=oe;function V(){this.yy={}}return o(V,"Parser"),V.prototype=re,re.Parser=V,new V}();hO.parser=hO;uhe=hO});var ms,y6,fhe=N(()=>{"use strict";dr();Ya();vt();_y();ms=oh(),y6=class{constructor(){this.classes=new Map;this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}static{o(this,"QuadrantBuilder")}getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:or.quadrantChart?.chartWidth||500,chartWidth:or.quadrantChart?.chartHeight||500,titlePadding:or.quadrantChart?.titlePadding||10,titleFontSize:or.quadrantChart?.titleFontSize||20,quadrantPadding:or.quadrantChart?.quadrantPadding||5,xAxisLabelPadding:or.quadrantChart?.xAxisLabelPadding||5,yAxisLabelPadding:or.quadrantChart?.yAxisLabelPadding||5,xAxisLabelFontSize:or.quadrantChart?.xAxisLabelFontSize||16,yAxisLabelFontSize:or.quadrantChart?.yAxisLabelFontSize||16,quadrantLabelFontSize:or.quadrantChart?.quadrantLabelFontSize||16,quadrantTextTopPadding:or.quadrantChart?.quadrantTextTopPadding||5,pointTextPadding:or.quadrantChart?.pointTextPadding||5,pointLabelFontSize:or.quadrantChart?.pointLabelFontSize||12,pointRadius:or.quadrantChart?.pointRadius||5,xAxisPosition:or.quadrantChart?.xAxisPosition||"top",yAxisPosition:or.quadrantChart?.yAxisPosition||"left",quadrantInternalBorderStrokeWidth:or.quadrantChart?.quadrantInternalBorderStrokeWidth||1,quadrantExternalBorderStrokeWidth:or.quadrantChart?.quadrantExternalBorderStrokeWidth||2}}getDefaultThemeConfig(){return{quadrant1Fill:ms.quadrant1Fill,quadrant2Fill:ms.quadrant2Fill,quadrant3Fill:ms.quadrant3Fill,quadrant4Fill:ms.quadrant4Fill,quadrant1TextFill:ms.quadrant1TextFill,quadrant2TextFill:ms.quadrant2TextFill,quadrant3TextFill:ms.quadrant3TextFill,quadrant4TextFill:ms.quadrant4TextFill,quadrantPointFill:ms.quadrantPointFill,quadrantPointTextFill:ms.quadrantPointTextFill,quadrantXAxisTextFill:ms.quadrantXAxisTextFill,quadrantYAxisTextFill:ms.quadrantYAxisTextFill,quadrantTitleFill:ms.quadrantTitleFill,quadrantInternalBorderStrokeFill:ms.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:ms.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),this.classes=new Map,Y.info("clear called")}setData(e){this.data={...this.data,...e}}addPoints(e){this.data.points=[...e,...this.data.points]}addClass(e,r){this.classes.set(e,r)}setConfig(e){Y.trace("setConfig called with: ",e),this.config={...this.config,...e}}setThemeConfig(e){Y.trace("setThemeConfig called with: ",e),this.themeConfig={...this.themeConfig,...e}}calculateSpace(e,r,n,i){let a=this.config.xAxisLabelPadding*2+this.config.xAxisLabelFontSize,s={top:e==="top"&&r?a:0,bottom:e==="bottom"&&r?a:0},l=this.config.yAxisLabelPadding*2+this.config.yAxisLabelFontSize,u={left:this.config.yAxisPosition==="left"&&n?l:0,right:this.config.yAxisPosition==="right"&&n?l:0},h=this.config.titleFontSize+this.config.titlePadding*2,f={top:i?h:0},d=this.config.quadrantPadding+u.left,p=this.config.quadrantPadding+s.top+f.top,m=this.config.chartWidth-this.config.quadrantPadding*2-u.left-u.right,g=this.config.chartHeight-this.config.quadrantPadding*2-s.top-s.bottom-f.top,y=m/2,v=g/2;return{xAxisSpace:s,yAxisSpace:u,titleSpace:f,quadrantSpace:{quadrantLeft:d,quadrantTop:p,quadrantWidth:m,quadrantHalfWidth:y,quadrantHeight:g,quadrantHalfHeight:v}}}getAxisLabels(e,r,n,i){let{quadrantSpace:a,titleSpace:s}=i,{quadrantHalfHeight:l,quadrantHeight:u,quadrantLeft:h,quadrantHalfWidth:f,quadrantTop:d,quadrantWidth:p}=a,m=!!this.data.xAxisRightText,g=!!this.data.yAxisTopText,y=[];return this.data.xAxisLeftText&&r&&y.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:h+(m?f/2:0),y:e==="top"?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+d+u+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:m?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&r&&y.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:h+f+(m?f/2:0),y:e==="top"?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+d+u+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:m?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&n&&y.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+h+p+this.config.quadrantPadding,y:d+u-(g?l/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:g?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&n&&y.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+h+p+this.config.quadrantPadding,y:d+l-(g?l/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:g?"center":"left",horizontalPos:"top",rotation:-90}),y}getQuadrants(e){let{quadrantSpace:r}=e,{quadrantHalfHeight:n,quadrantLeft:i,quadrantHalfWidth:a,quadrantTop:s}=r,l=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i+a,y:s,width:a,height:n,fill:this.themeConfig.quadrant1Fill},{text:{text:this.data.quadrant2Text,fill:this.themeConfig.quadrant2TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i,y:s,width:a,height:n,fill:this.themeConfig.quadrant2Fill},{text:{text:this.data.quadrant3Text,fill:this.themeConfig.quadrant3TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i,y:s+n,width:a,height:n,fill:this.themeConfig.quadrant3Fill},{text:{text:this.data.quadrant4Text,fill:this.themeConfig.quadrant4TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i+a,y:s+n,width:a,height:n,fill:this.themeConfig.quadrant4Fill}];for(let u of l)u.text.x=u.x+u.width/2,this.data.points.length===0?(u.text.y=u.y+u.height/2,u.text.horizontalPos="middle"):(u.text.y=u.y+this.config.quadrantTextTopPadding,u.text.horizontalPos="top");return l}getQuadrantPoints(e){let{quadrantSpace:r}=e,{quadrantHeight:n,quadrantLeft:i,quadrantTop:a,quadrantWidth:s}=r,l=gl().domain([0,1]).range([i,s+i]),u=gl().domain([0,1]).range([n+a,a]);return this.data.points.map(f=>{let d=this.classes.get(f.className);return d&&(f={...d,...f}),{x:l(f.x),y:u(f.y),fill:f.color??this.themeConfig.quadrantPointFill,radius:f.radius??this.config.pointRadius,text:{text:f.text,fill:this.themeConfig.quadrantPointTextFill,x:l(f.x),y:u(f.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0},strokeColor:f.strokeColor??this.themeConfig.quadrantPointFill,strokeWidth:f.strokeWidth??"0px"}})}getBorders(e){let r=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:n}=e,{quadrantHalfHeight:i,quadrantHeight:a,quadrantLeft:s,quadrantHalfWidth:l,quadrantTop:u,quadrantWidth:h}=n;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-r,y1:u,x2:s+h+r,y2:u},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s+h,y1:u+r,x2:s+h,y2:u+a-r},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-r,y1:u+a,x2:s+h+r,y2:u+a},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s,y1:u+r,x2:s,y2:u+a-r},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+l,y1:u+r,x2:s+l,y2:u+a-r},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+r,y1:u+i,x2:s+h-r,y2:u+i}]}getTitle(e){if(e)return{text:this.data.titleText,fill:this.themeConfig.quadrantTitleFill,fontSize:this.config.titleFontSize,horizontalPos:"top",verticalPos:"center",rotation:0,y:this.config.titlePadding,x:this.config.chartWidth/2}}build(){let e=this.config.showXAxis&&!!(this.data.xAxisLeftText||this.data.xAxisRightText),r=this.config.showYAxis&&!!(this.data.yAxisTopText||this.data.yAxisBottomText),n=this.config.showTitle&&!!this.data.titleText,i=this.data.points.length>0?"bottom":this.config.xAxisPosition,a=this.calculateSpace(i,e,r,n);return{points:this.getQuadrantPoints(a),quadrants:this.getQuadrants(a),axisLabels:this.getAxisLabels(i,e,r,a),borderLines:this.getBorders(a),title:this.getTitle(n)}}}});function fO(t){return!/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(t)}function dhe(t){return!/^\d+$/.test(t)}function phe(t){return!/^\d+px$/.test(t)}var Ap,mhe=N(()=>{"use strict";Ap=class extends Error{static{o(this,"InvalidStyleError")}constructor(e,r,n){super(`value for ${e} ${r} is invalid, please use a valid ${n}`),this.name="InvalidStyleError"}};o(fO,"validateHexCode");o(dhe,"validateNumber");o(phe,"validateSizeInPixels")});function Xu(t){return Tr(t.trim(),pGe)}function mGe(t){ba.setData({quadrant1Text:Xu(t.text)})}function gGe(t){ba.setData({quadrant2Text:Xu(t.text)})}function yGe(t){ba.setData({quadrant3Text:Xu(t.text)})}function vGe(t){ba.setData({quadrant4Text:Xu(t.text)})}function xGe(t){ba.setData({xAxisLeftText:Xu(t.text)})}function bGe(t){ba.setData({xAxisRightText:Xu(t.text)})}function wGe(t){ba.setData({yAxisTopText:Xu(t.text)})}function TGe(t){ba.setData({yAxisBottomText:Xu(t.text)})}function dO(t){let e={};for(let r of t){let[n,i]=r.trim().split(/\s*:\s*/);if(n==="radius"){if(dhe(i))throw new Ap(n,i,"number");e.radius=parseInt(i)}else if(n==="color"){if(fO(i))throw new Ap(n,i,"hex code");e.color=i}else if(n==="stroke-color"){if(fO(i))throw new Ap(n,i,"hex code");e.strokeColor=i}else if(n==="stroke-width"){if(phe(i))throw new Ap(n,i,"number of pixels (eg. 10px)");e.strokeWidth=i}else throw new Error(`style named ${n} is not supported.`)}return e}function kGe(t,e,r,n,i){let a=dO(i);ba.addPoints([{x:r,y:n,text:Xu(t.text),className:e,...a}])}function EGe(t,e){ba.addClass(t,dO(e))}function SGe(t){ba.setConfig({chartWidth:t})}function CGe(t){ba.setConfig({chartHeight:t})}function AGe(){let t=me(),{themeVariables:e,quadrantChart:r}=t;return r&&ba.setConfig(r),ba.setThemeConfig({quadrant1Fill:e.quadrant1Fill,quadrant2Fill:e.quadrant2Fill,quadrant3Fill:e.quadrant3Fill,quadrant4Fill:e.quadrant4Fill,quadrant1TextFill:e.quadrant1TextFill,quadrant2TextFill:e.quadrant2TextFill,quadrant3TextFill:e.quadrant3TextFill,quadrant4TextFill:e.quadrant4TextFill,quadrantPointFill:e.quadrantPointFill,quadrantPointTextFill:e.quadrantPointTextFill,quadrantXAxisTextFill:e.quadrantXAxisTextFill,quadrantYAxisTextFill:e.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:e.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:e.quadrantInternalBorderStrokeFill,quadrantTitleFill:e.quadrantTitleFill}),ba.setData({titleText:Ir()}),ba.build()}var pGe,ba,_Ge,ghe,yhe=N(()=>{"use strict";zt();gr();mi();fhe();mhe();pGe=me();o(Xu,"textSanitizer");ba=new y6;o(mGe,"setQuadrant1Text");o(gGe,"setQuadrant2Text");o(yGe,"setQuadrant3Text");o(vGe,"setQuadrant4Text");o(xGe,"setXAxisLeftText");o(bGe,"setXAxisRightText");o(wGe,"setYAxisTopText");o(TGe,"setYAxisBottomText");o(dO,"parseStyles");o(kGe,"addPoint");o(EGe,"addClass");o(SGe,"setWidth");o(CGe,"setHeight");o(AGe,"getQuadrantData");_Ge=o(function(){ba.clear(),Ar()},"clear"),ghe={setWidth:SGe,setHeight:CGe,setQuadrant1Text:mGe,setQuadrant2Text:gGe,setQuadrant3Text:yGe,setQuadrant4Text:vGe,setXAxisLeftText:xGe,setXAxisRightText:bGe,setYAxisTopText:wGe,setYAxisBottomText:TGe,parseStyles:dO,addPoint:kGe,addClass:EGe,getQuadrantData:AGe,clear:_Ge,setAccTitle:Lr,getAccTitle:Rr,setDiagramTitle:$r,getDiagramTitle:Ir,getAccDescription:Mr,setAccDescription:Nr}});var DGe,vhe,xhe=N(()=>{"use strict";dr();zt();vt();Ei();DGe=o((t,e,r,n)=>{function i(S){return S==="top"?"hanging":"middle"}o(i,"getDominantBaseLine");function a(S){return S==="left"?"start":"middle"}o(a,"getTextAnchor");function s(S){return`translate(${S.x}, ${S.y}) rotate(${S.rotation||0})`}o(s,"getTransformation");let l=me();Y.debug(`Rendering quadrant chart +`+t);let u=l.securityLevel,h;u==="sandbox"&&(h=Ge("#i"+e));let d=(u==="sandbox"?Ge(h.nodes()[0].contentDocument.body):Ge("body")).select(`[id="${e}"]`),p=d.append("g").attr("class","main"),m=l.quadrantChart?.chartWidth??500,g=l.quadrantChart?.chartHeight??500;vn(d,g,m,l.quadrantChart?.useMaxWidth??!0),d.attr("viewBox","0 0 "+m+" "+g),n.db.setHeight(g),n.db.setWidth(m);let y=n.db.getQuadrantData(),v=p.append("g").attr("class","quadrants"),x=p.append("g").attr("class","border"),b=p.append("g").attr("class","data-points"),w=p.append("g").attr("class","labels"),C=p.append("g").attr("class","title");y.title&&C.append("text").attr("x",0).attr("y",0).attr("fill",y.title.fill).attr("font-size",y.title.fontSize).attr("dominant-baseline",i(y.title.horizontalPos)).attr("text-anchor",a(y.title.verticalPos)).attr("transform",s(y.title)).text(y.title.text),y.borderLines&&x.selectAll("line").data(y.borderLines).enter().append("line").attr("x1",S=>S.x1).attr("y1",S=>S.y1).attr("x2",S=>S.x2).attr("y2",S=>S.y2).style("stroke",S=>S.strokeFill).style("stroke-width",S=>S.strokeWidth);let T=v.selectAll("g.quadrant").data(y.quadrants).enter().append("g").attr("class","quadrant");T.append("rect").attr("x",S=>S.x).attr("y",S=>S.y).attr("width",S=>S.width).attr("height",S=>S.height).attr("fill",S=>S.fill),T.append("text").attr("x",0).attr("y",0).attr("fill",S=>S.text.fill).attr("font-size",S=>S.text.fontSize).attr("dominant-baseline",S=>i(S.text.horizontalPos)).attr("text-anchor",S=>a(S.text.verticalPos)).attr("transform",S=>s(S.text)).text(S=>S.text.text),w.selectAll("g.label").data(y.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text(S=>S.text).attr("fill",S=>S.fill).attr("font-size",S=>S.fontSize).attr("dominant-baseline",S=>i(S.horizontalPos)).attr("text-anchor",S=>a(S.verticalPos)).attr("transform",S=>s(S));let A=b.selectAll("g.data-point").data(y.points).enter().append("g").attr("class","data-point");A.append("circle").attr("cx",S=>S.x).attr("cy",S=>S.y).attr("r",S=>S.radius).attr("fill",S=>S.fill).attr("stroke",S=>S.strokeColor).attr("stroke-width",S=>S.strokeWidth),A.append("text").attr("x",0).attr("y",0).text(S=>S.text.text).attr("fill",S=>S.text.fill).attr("font-size",S=>S.text.fontSize).attr("dominant-baseline",S=>i(S.text.horizontalPos)).attr("text-anchor",S=>a(S.text.verticalPos)).attr("transform",S=>s(S.text))},"draw"),vhe={draw:DGe}});var bhe={};hr(bhe,{diagram:()=>LGe});var LGe,whe=N(()=>{"use strict";hhe();yhe();xhe();LGe={parser:uhe,db:ghe,renderer:vhe,styles:o(()=>"","styles")}});var pO,Ehe,She=N(()=>{"use strict";pO=function(){var t=o(function(O,M,B,F){for(B=B||{},F=O.length;F--;B[O[F]]=M);return B},"o"),e=[1,10,12,14,16,18,19,21,23],r=[2,6],n=[1,3],i=[1,5],a=[1,6],s=[1,7],l=[1,5,10,12,14,16,18,19,21,23,34,35,36],u=[1,25],h=[1,26],f=[1,28],d=[1,29],p=[1,30],m=[1,31],g=[1,32],y=[1,33],v=[1,34],x=[1,35],b=[1,36],w=[1,37],C=[1,43],T=[1,42],E=[1,47],A=[1,50],S=[1,10,12,14,16,18,19,21,23,34,35,36],_=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],I=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],D=[1,64],k={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:o(function(M,B,F,P,z,$,H){var Q=$.length-1;switch(z){case 5:P.setOrientation($[Q]);break;case 9:P.setDiagramTitle($[Q].text.trim());break;case 12:P.setLineData({text:"",type:"text"},$[Q]);break;case 13:P.setLineData($[Q-1],$[Q]);break;case 14:P.setBarData({text:"",type:"text"},$[Q]);break;case 15:P.setBarData($[Q-1],$[Q]);break;case 16:this.$=$[Q].trim(),P.setAccTitle(this.$);break;case 17:case 18:this.$=$[Q].trim(),P.setAccDescription(this.$);break;case 19:this.$=$[Q-1];break;case 20:this.$=[Number($[Q-2]),...$[Q]];break;case 21:this.$=[Number($[Q])];break;case 22:P.setXAxisTitle($[Q]);break;case 23:P.setXAxisTitle($[Q-1]);break;case 24:P.setXAxisTitle({type:"text",text:""});break;case 25:P.setXAxisBand($[Q]);break;case 26:P.setXAxisRangeData(Number($[Q-2]),Number($[Q]));break;case 27:this.$=$[Q-1];break;case 28:this.$=[$[Q-2],...$[Q]];break;case 29:this.$=[$[Q]];break;case 30:P.setYAxisTitle($[Q]);break;case 31:P.setYAxisTitle($[Q-1]);break;case 32:P.setYAxisTitle({type:"text",text:""});break;case 33:P.setYAxisRangeData(Number($[Q-2]),Number($[Q]));break;case 37:this.$={text:$[Q],type:"text"};break;case 38:this.$={text:$[Q],type:"text"};break;case 39:this.$={text:$[Q],type:"markdown"};break;case 40:this.$=$[Q];break;case 41:this.$=$[Q-1]+""+$[Q];break}},"anonymous"),table:[t(e,r,{3:1,4:2,7:4,5:n,34:i,35:a,36:s}),{1:[3]},t(e,r,{4:2,7:4,3:8,5:n,34:i,35:a,36:s}),t(e,r,{4:2,7:4,6:9,3:10,5:n,8:[1,11],34:i,35:a,36:s}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(l,[2,34]),t(l,[2,35]),t(l,[2,36]),{1:[2,1]},t(e,r,{4:2,7:4,3:21,5:n,34:i,35:a,36:s}),{1:[2,3]},t(l,[2,5]),t(e,[2,7],{4:22,34:i,35:a,36:s}),{11:23,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},{11:39,13:38,24:C,27:T,29:40,30:41,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},{11:45,15:44,27:E,33:46,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},{11:49,17:48,24:A,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},{11:52,17:51,24:A,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},{20:[1,53]},{22:[1,54]},t(S,[2,18]),{1:[2,2]},t(S,[2,8]),t(S,[2,9]),t(_,[2,37],{40:55,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w}),t(_,[2,38]),t(_,[2,39]),t(I,[2,40]),t(I,[2,42]),t(I,[2,43]),t(I,[2,44]),t(I,[2,45]),t(I,[2,46]),t(I,[2,47]),t(I,[2,48]),t(I,[2,49]),t(I,[2,50]),t(I,[2,51]),t(S,[2,10]),t(S,[2,22],{30:41,29:56,24:C,27:T}),t(S,[2,24]),t(S,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},t(S,[2,11]),t(S,[2,30],{33:60,27:E}),t(S,[2,32]),{31:[1,61]},t(S,[2,12]),{17:62,24:A},{25:63,27:D},t(S,[2,14]),{17:65,24:A},t(S,[2,16]),t(S,[2,17]),t(I,[2,41]),t(S,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(S,[2,31]),{27:[1,69]},t(S,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(S,[2,15]),t(S,[2,26]),t(S,[2,27]),{11:59,32:72,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:w},t(S,[2,33]),t(S,[2,19]),{25:73,27:D},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:o(function(M,B){if(B.recoverable)this.trace(M);else{var F=new Error(M);throw F.hash=B,F}},"parseError"),parse:o(function(M){var B=this,F=[0],P=[],z=[null],$=[],H=this.table,Q="",j=0,ie=0,ne=0,le=2,he=1,K=$.slice.call(arguments,1),X=Object.create(this.lexer),te={yy:{}};for(var J in this.yy)Object.prototype.hasOwnProperty.call(this.yy,J)&&(te.yy[J]=this.yy[J]);X.setInput(M,te.yy),te.yy.lexer=X,te.yy.parser=this,typeof X.yylloc>"u"&&(X.yylloc={});var se=X.yylloc;$.push(se);var ue=X.options&&X.options.ranges;typeof te.yy.parseError=="function"?this.parseError=te.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Z(re){F.length=F.length-2*re,z.length=z.length-re,$.length=$.length-re}o(Z,"popStack");function Se(){var re;return re=P.pop()||X.lex()||he,typeof re!="number"&&(re instanceof Array&&(P=re,re=P.pop()),re=B.symbols_[re]||re),re}o(Se,"lex");for(var ce,ae,Oe,ge,ze,He,$e={},Re,Ie,be,W;;){if(Oe=F[F.length-1],this.defaultActions[Oe]?ge=this.defaultActions[Oe]:((ce===null||typeof ce>"u")&&(ce=Se()),ge=H[Oe]&&H[Oe][ce]),typeof ge>"u"||!ge.length||!ge[0]){var de="";W=[];for(Re in H[Oe])this.terminals_[Re]&&Re>le&&W.push("'"+this.terminals_[Re]+"'");X.showPosition?de="Parse error on line "+(j+1)+`: +`+X.showPosition()+` +Expecting `+W.join(", ")+", got '"+(this.terminals_[ce]||ce)+"'":de="Parse error on line "+(j+1)+": Unexpected "+(ce==he?"end of input":"'"+(this.terminals_[ce]||ce)+"'"),this.parseError(de,{text:X.match,token:this.terminals_[ce]||ce,line:X.yylineno,loc:se,expected:W})}if(ge[0]instanceof Array&&ge.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Oe+", token: "+ce);switch(ge[0]){case 1:F.push(ce),z.push(X.yytext),$.push(X.yylloc),F.push(ge[1]),ce=null,ae?(ce=ae,ae=null):(ie=X.yyleng,Q=X.yytext,j=X.yylineno,se=X.yylloc,ne>0&&ne--);break;case 2:if(Ie=this.productions_[ge[1]][1],$e.$=z[z.length-Ie],$e._$={first_line:$[$.length-(Ie||1)].first_line,last_line:$[$.length-1].last_line,first_column:$[$.length-(Ie||1)].first_column,last_column:$[$.length-1].last_column},ue&&($e._$.range=[$[$.length-(Ie||1)].range[0],$[$.length-1].range[1]]),He=this.performAction.apply($e,[Q,ie,j,te.yy,ge[1],z,$].concat(K)),typeof He<"u")return He;Ie&&(F=F.slice(0,-1*Ie*2),z=z.slice(0,-1*Ie),$=$.slice(0,-1*Ie)),F.push(this.productions_[ge[1]][0]),z.push($e.$),$.push($e._$),be=H[F[F.length-2]][F[F.length-1]],F.push(be);break;case 3:return!0}}return!0},"parse")},L=function(){var O={EOF:1,parseError:o(function(B,F){if(this.yy.parser)this.yy.parser.parseError(B,F);else throw new Error(B)},"parseError"),setInput:o(function(M,B){return this.yy=B||this.yy||{},this._input=M,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var M=this._input[0];this.yytext+=M,this.yyleng++,this.offset++,this.match+=M,this.matched+=M;var B=M.match(/(?:\r\n?|\n).*/g);return B?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),M},"input"),unput:o(function(M){var B=M.length,F=M.split(/(?:\r\n?|\n)/g);this._input=M+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-B),this.offset-=B;var P=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),F.length-1&&(this.yylineno-=F.length-1);var z=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:F?(F.length===P.length?this.yylloc.first_column:0)+P[P.length-F.length].length-F[0].length:this.yylloc.first_column-B},this.options.ranges&&(this.yylloc.range=[z[0],z[0]+this.yyleng-B]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(M){this.unput(this.match.slice(M))},"less"),pastInput:o(function(){var M=this.matched.substr(0,this.matched.length-this.match.length);return(M.length>20?"...":"")+M.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var M=this.match;return M.length<20&&(M+=this._input.substr(0,20-M.length)),(M.substr(0,20)+(M.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var M=this.pastInput(),B=new Array(M.length+1).join("-");return M+this.upcomingInput()+` +`+B+"^"},"showPosition"),test_match:o(function(M,B){var F,P,z;if(this.options.backtrack_lexer&&(z={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(z.yylloc.range=this.yylloc.range.slice(0))),P=M[0].match(/(?:\r\n?|\n).*/g),P&&(this.yylineno+=P.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:P?P[P.length-1].length-P[P.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+M[0].length},this.yytext+=M[0],this.match+=M[0],this.matches=M,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(M[0].length),this.matched+=M[0],F=this.performAction.call(this,this.yy,this,B,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),F)return F;if(this._backtrack){for(var $ in z)this[$]=z[$];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var M,B,F,P;this._more||(this.yytext="",this.match="");for(var z=this._currentRules(),$=0;$B[0].length)){if(B=F,P=$,this.options.backtrack_lexer){if(M=this.test_match(F,z[$]),M!==!1)return M;if(this._backtrack){B=!1;continue}else return!1}else if(!this.options.flex)break}return B?(M=this.test_match(B,z[P]),M!==!1?M:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var B=this.next();return B||this.lex()},"lex"),begin:o(function(B){this.conditionStack.push(B)},"begin"),popState:o(function(){var B=this.conditionStack.length-1;return B>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(B){return B=this.conditionStack.length-1-Math.abs(B||0),B>=0?this.conditionStack[B]:"INITIAL"},"topState"),pushState:o(function(B){this.begin(B)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(B,F,P,z){var $=z;switch(P){case 0:break;case 1:break;case 2:return this.popState(),34;break;case 3:return this.popState(),34;break;case 4:return 34;case 5:break;case 6:return 10;case 7:return this.pushState("acc_title"),19;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.pushState("acc_descr"),21;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.pushState("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 5;case 15:return 8;case 16:return this.pushState("axis_data"),"X_AXIS";break;case 17:return this.pushState("axis_data"),"Y_AXIS";break;case 18:return this.pushState("axis_band_data"),24;break;case 19:return 31;case 20:return this.pushState("data"),16;break;case 21:return this.pushState("data"),18;break;case 22:return this.pushState("data_inner"),24;break;case 23:return 27;case 24:return this.popState(),26;break;case 25:this.popState();break;case 26:this.pushState("string");break;case 27:this.popState();break;case 28:return"STR";case 29:return 24;case 30:return 26;case 31:return 43;case 32:return"COLON";case 33:return 44;case 34:return 28;case 35:return 45;case 36:return 46;case 37:return 48;case 38:return 50;case 39:return 47;case 40:return 41;case 41:return 49;case 42:return 42;case 43:break;case 44:return 35;case 45:return 36}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:(\r?\n))/i,/^(?:(\r?\n))/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:\{)/i,/^(?:[^\}]*)/i,/^(?:xychart-beta\b)/i,/^(?:(?:vertical|horizontal))/i,/^(?:x-axis\b)/i,/^(?:y-axis\b)/i,/^(?:\[)/i,/^(?:-->)/i,/^(?:line\b)/i,/^(?:bar\b)/i,/^(?:\[)/i,/^(?:[+-]?(?:\d+(?:\.\d+)?|\.\d+))/i,/^(?:\])/i,/^(?:(?:`\) \{ this\.pushState\(md_string\); \}\n\(\?:\(\?!`"\)\.\)\+ \{ return MD_STR; \}\n\(\?:`))/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s+)/i,/^(?:;)/i,/^(?:$)/i],conditions:{data_inner:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,23,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},data:{rules:[0,1,3,4,5,6,7,9,11,14,15,16,17,20,21,22,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_band_data:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_data:{rules:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,23,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[],inclusive:!1},md_string:{rules:[],inclusive:!1},string:{rules:[27,28],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0}}};return O}();k.lexer=L;function R(){this.yy={}}return o(R,"Parser"),R.prototype=k,k.Parser=R,new R}();pO.parser=pO;Ehe=pO});function mO(t){return t.type==="bar"}function v6(t){return t.type==="band"}function S1(t){return t.type==="linear"}var x6=N(()=>{"use strict";o(mO,"isBarPlot");o(v6,"isBandAxisData");o(S1,"isLinearAxisData")});var C1,gO=N(()=>{"use strict";to();C1=class{constructor(e){this.parentGroup=e}static{o(this,"TextDimensionCalculatorWithFont")}getMaxDimension(e,r){if(!this.parentGroup)return{width:e.reduce((a,s)=>Math.max(s.length,a),0)*r,height:r};let n={width:0,height:0},i=this.parentGroup.append("g").attr("visibility","hidden").attr("font-size",r);for(let a of e){let s=sK(i,1,a),l=s?s.width:a.length*r,u=s?s.height:r;n.width=Math.max(n.width,l),n.height=Math.max(n.height,u)}return i.remove(),n}}});var A1,yO=N(()=>{"use strict";A1=class{constructor(e,r,n,i){this.axisConfig=e;this.title=r;this.textDimensionCalculator=n;this.axisThemeConfig=i;this.boundingRect={x:0,y:0,width:0,height:0};this.axisPosition="left";this.showTitle=!1;this.showLabel=!1;this.showTick=!1;this.showAxisLine=!1;this.outerPadding=0;this.titleTextHeight=0;this.labelTextHeight=0;this.range=[0,10],this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left"}static{o(this,"BaseAxis")}setRange(e){this.range=e,this.axisPosition==="left"||this.axisPosition==="right"?this.boundingRect.height=e[1]-e[0]:this.boundingRect.width=e[1]-e[0],this.recalculateScale()}getRange(){return[this.range[0]+this.outerPadding,this.range[1]-this.outerPadding]}setAxisPosition(e){this.axisPosition=e,this.setRange(this.range)}getTickDistance(){let e=this.getRange();return Math.abs(e[0]-e[1])/this.getTickValues().length}getAxisOuterPadding(){return this.outerPadding}getLabelDimension(){return this.textDimensionCalculator.getMaxDimension(this.getTickValues().map(e=>e.toString()),this.axisConfig.labelFontSize)}recalculateOuterPaddingToDrawBar(){.7*this.getTickDistance()>this.outerPadding*2&&(this.outerPadding=Math.floor(.7*this.getTickDistance()/2)),this.recalculateScale()}calculateSpaceIfDrawnHorizontally(e){let r=e.height;if(this.axisConfig.showAxisLine&&r>this.axisConfig.axisLineWidth&&(r-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),i=.2*e.width;this.outerPadding=Math.min(n.width/2,i);let a=n.height+this.axisConfig.labelPadding*2;this.labelTextHeight=n.height,a<=r&&(r-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&r>=this.axisConfig.tickLength&&(this.showTick=!0,r-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let n=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),i=n.height+this.axisConfig.titlePadding*2;this.titleTextHeight=n.height,i<=r&&(r-=i,this.showTitle=!0)}this.boundingRect.width=e.width,this.boundingRect.height=e.height-r}calculateSpaceIfDrawnVertical(e){let r=e.width;if(this.axisConfig.showAxisLine&&r>this.axisConfig.axisLineWidth&&(r-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),i=.2*e.height;this.outerPadding=Math.min(n.height/2,i);let a=n.width+this.axisConfig.labelPadding*2;a<=r&&(r-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&r>=this.axisConfig.tickLength&&(this.showTick=!0,r-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let n=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),i=n.height+this.axisConfig.titlePadding*2;this.titleTextHeight=n.height,i<=r&&(r-=i,this.showTitle=!0)}this.boundingRect.width=e.width-r,this.boundingRect.height=e.height}calculateSpace(e){return this.axisPosition==="left"||this.axisPosition==="right"?this.calculateSpaceIfDrawnVertical(e):this.calculateSpaceIfDrawnHorizontally(e),this.recalculateScale(),{width:this.boundingRect.width,height:this.boundingRect.height}}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}getDrawableElementsForLeftAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.x+this.boundingRect.width-this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["left-axis","axisl-line"],data:[{path:`M ${r},${this.boundingRect.y} L ${r},${this.boundingRect.y+this.boundingRect.height} `,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["left-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.boundingRect.x+this.boundingRect.width-(this.showLabel?this.axisConfig.labelPadding:0)-(this.showTick?this.axisConfig.tickLength:0)-(this.showAxisLine?this.axisConfig.axisLineWidth:0),y:this.getScaleValue(r),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"middle",horizontalPos:"right"}))}),this.showTick){let r=this.boundingRect.x+this.boundingRect.width-(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:"path",groupTexts:["left-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${r},${this.getScaleValue(n)} L ${r-this.axisConfig.tickLength},${this.getScaleValue(n)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["left-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.axisConfig.titlePadding,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:270,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElementsForBottomAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.y+this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["bottom-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${r} L ${this.boundingRect.x+this.boundingRect.width},${r}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["bottom-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.getScaleValue(r),y:this.boundingRect.y+this.axisConfig.labelPadding+(this.showTick?this.axisConfig.tickLength:0)+(this.showAxisLine?this.axisConfig.axisLineWidth:0),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let r=this.boundingRect.y+(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:"path",groupTexts:["bottom-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${this.getScaleValue(n)},${r} L ${this.getScaleValue(n)},${r+this.axisConfig.tickLength}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["bottom-axis","title"],data:[{text:this.title,x:this.range[0]+(this.range[1]-this.range[0])/2,y:this.boundingRect.y+this.boundingRect.height-this.axisConfig.titlePadding-this.titleTextHeight,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElementsForTopAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.y+this.boundingRect.height-this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["top-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${r} L ${this.boundingRect.x+this.boundingRect.width},${r}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["top-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.getScaleValue(r),y:this.boundingRect.y+(this.showTitle?this.titleTextHeight+this.axisConfig.titlePadding*2:0)+this.axisConfig.labelPadding,fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let r=this.boundingRect.y;e.push({type:"path",groupTexts:["top-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${this.getScaleValue(n)},${r+this.boundingRect.height-(this.showAxisLine?this.axisConfig.axisLineWidth:0)} L ${this.getScaleValue(n)},${r+this.boundingRect.height-this.axisConfig.tickLength-(this.showAxisLine?this.axisConfig.axisLineWidth:0)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["top-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.axisConfig.titlePadding,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElements(){if(this.axisPosition==="left")return this.getDrawableElementsForLeftAxis();if(this.axisPosition==="right")throw Error("Drawing of right axis is not implemented");return this.axisPosition==="bottom"?this.getDrawableElementsForBottomAxis():this.axisPosition==="top"?this.getDrawableElementsForTopAxis():[]}}});var b6,Che=N(()=>{"use strict";dr();vt();yO();b6=class extends A1{static{o(this,"BandAxis")}constructor(e,r,n,i,a){super(e,i,a,r),this.categories=n,this.scale=L0().domain(this.categories).range(this.getRange())}setRange(e){super.setRange(e)}recalculateScale(){this.scale=L0().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(.5),Y.trace("BandAxis axis final categories, range: ",this.categories,this.getRange())}getTickValues(){return this.categories}getScaleValue(e){return this.scale(e)??this.getRange()[0]}}});var w6,Ahe=N(()=>{"use strict";dr();yO();w6=class extends A1{static{o(this,"LinearAxis")}constructor(e,r,n,i,a){super(e,i,a,r),this.domain=n,this.scale=gl().domain(this.domain).range(this.getRange())}getTickValues(){return this.scale.ticks()}recalculateScale(){let e=[...this.domain];this.axisPosition==="left"&&e.reverse(),this.scale=gl().domain(e).range(this.getRange())}getScaleValue(e){return this.scale(e)}}});function vO(t,e,r,n){let i=new C1(n);return v6(t)?new b6(e,r,t.categories,t.title,i):new w6(e,r,[t.min,t.max],t.title,i)}var _he=N(()=>{"use strict";x6();gO();Che();Ahe();o(vO,"getAxis")});function Dhe(t,e,r,n){let i=new C1(n);return new xO(i,t,e,r)}var xO,Lhe=N(()=>{"use strict";gO();xO=class{constructor(e,r,n,i){this.textDimensionCalculator=e;this.chartConfig=r;this.chartData=n;this.chartThemeConfig=i;this.boundingRect={x:0,y:0,width:0,height:0},this.showChartTitle=!1}static{o(this,"ChartTitle")}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){let r=this.textDimensionCalculator.getMaxDimension([this.chartData.title],this.chartConfig.titleFontSize),n=Math.max(r.width,e.width),i=r.height+2*this.chartConfig.titlePadding;return r.width<=n&&r.height<=i&&this.chartConfig.showTitle&&this.chartData.title&&(this.boundingRect.width=n,this.boundingRect.height=i,this.showChartTitle=!0),{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){let e=[];return this.showChartTitle&&e.push({groupTexts:["chart-title"],type:"text",data:[{fontSize:this.chartConfig.titleFontSize,text:this.chartData.title,verticalPos:"middle",horizontalPos:"center",x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.chartThemeConfig.titleColor,rotation:0}]}),e}};o(Dhe,"getChartTitleComponent")});var T6,Rhe=N(()=>{"use strict";dr();T6=class{constructor(e,r,n,i,a){this.plotData=e;this.xAxis=r;this.yAxis=n;this.orientation=i;this.plotIndex=a}static{o(this,"LinePlot")}getDrawableElement(){let e=this.plotData.data.map(n=>[this.xAxis.getScaleValue(n[0]),this.yAxis.getScaleValue(n[1])]),r;return this.orientation==="horizontal"?r=wl().y(n=>n[0]).x(n=>n[1])(e):r=wl().x(n=>n[0]).y(n=>n[1])(e),r?[{groupTexts:["plot",`line-plot-${this.plotIndex}`],type:"path",data:[{path:r,strokeFill:this.plotData.strokeFill,strokeWidth:this.plotData.strokeWidth}]}]:[]}}});var k6,Nhe=N(()=>{"use strict";k6=class{constructor(e,r,n,i,a,s){this.barData=e;this.boundingRect=r;this.xAxis=n;this.yAxis=i;this.orientation=a;this.plotIndex=s}static{o(this,"BarPlot")}getDrawableElement(){let e=this.barData.data.map(a=>[this.xAxis.getScaleValue(a[0]),this.yAxis.getScaleValue(a[1])]),n=Math.min(this.xAxis.getAxisOuterPadding()*2,this.xAxis.getTickDistance())*(1-.05),i=n/2;return this.orientation==="horizontal"?[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:e.map(a=>({x:this.boundingRect.x,y:a[0]-i,height:n,width:a[1]-this.boundingRect.x,fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]:[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:e.map(a=>({x:a[0]-i,y:a[1],width:n,height:this.boundingRect.y+this.boundingRect.height-a[1],fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]}}});function Mhe(t,e,r){return new bO(t,e,r)}var bO,Ihe=N(()=>{"use strict";Rhe();Nhe();bO=class{constructor(e,r,n){this.chartConfig=e;this.chartData=r;this.chartThemeConfig=n;this.boundingRect={x:0,y:0,width:0,height:0}}static{o(this,"BasePlot")}setAxes(e,r){this.xAxis=e,this.yAxis=r}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){return this.boundingRect.width=e.width,this.boundingRect.height=e.height,{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(!(this.xAxis&&this.yAxis))throw Error("Axes must be passed to render Plots");let e=[];for(let[r,n]of this.chartData.plots.entries())switch(n.type){case"line":{let i=new T6(n,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,r);e.push(...i.getDrawableElement())}break;case"bar":{let i=new k6(n,this.boundingRect,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,r);e.push(...i.getDrawableElement())}break}return e}};o(Mhe,"getPlotComponent")});var E6,Ohe=N(()=>{"use strict";_he();Lhe();Ihe();x6();E6=class{constructor(e,r,n,i){this.chartConfig=e;this.chartData=r;this.componentStore={title:Dhe(e,r,n,i),plot:Mhe(e,r,n),xAxis:vO(r.xAxis,e.xAxis,{titleColor:n.xAxisTitleColor,labelColor:n.xAxisLabelColor,tickColor:n.xAxisTickColor,axisLineColor:n.xAxisLineColor},i),yAxis:vO(r.yAxis,e.yAxis,{titleColor:n.yAxisTitleColor,labelColor:n.yAxisLabelColor,tickColor:n.yAxisTickColor,axisLineColor:n.yAxisLineColor},i)}}static{o(this,"Orchestrator")}calculateVerticalSpace(){let e=this.chartConfig.width,r=this.chartConfig.height,n=0,i=0,a=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),s=Math.floor(r*this.chartConfig.plotReservedSpacePercent/100),l=this.componentStore.plot.calculateSpace({width:a,height:s});e-=l.width,r-=l.height,l=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:r}),i=l.height,r-=l.height,this.componentStore.xAxis.setAxisPosition("bottom"),l=this.componentStore.xAxis.calculateSpace({width:e,height:r}),r-=l.height,this.componentStore.yAxis.setAxisPosition("left"),l=this.componentStore.yAxis.calculateSpace({width:e,height:r}),n=l.width,e-=l.width,e>0&&(a+=e,e=0),r>0&&(s+=r,r=0),this.componentStore.plot.calculateSpace({width:a,height:s}),this.componentStore.plot.setBoundingBoxXY({x:n,y:i}),this.componentStore.xAxis.setRange([n,n+a]),this.componentStore.xAxis.setBoundingBoxXY({x:n,y:i+s}),this.componentStore.yAxis.setRange([i,i+s]),this.componentStore.yAxis.setBoundingBoxXY({x:0,y:i}),this.chartData.plots.some(u=>mO(u))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateHorizontalSpace(){let e=this.chartConfig.width,r=this.chartConfig.height,n=0,i=0,a=0,s=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),l=Math.floor(r*this.chartConfig.plotReservedSpacePercent/100),u=this.componentStore.plot.calculateSpace({width:s,height:l});e-=u.width,r-=u.height,u=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:r}),n=u.height,r-=u.height,this.componentStore.xAxis.setAxisPosition("left"),u=this.componentStore.xAxis.calculateSpace({width:e,height:r}),e-=u.width,i=u.width,this.componentStore.yAxis.setAxisPosition("top"),u=this.componentStore.yAxis.calculateSpace({width:e,height:r}),r-=u.height,a=n+u.height,e>0&&(s+=e,e=0),r>0&&(l+=r,r=0),this.componentStore.plot.calculateSpace({width:s,height:l}),this.componentStore.plot.setBoundingBoxXY({x:i,y:a}),this.componentStore.yAxis.setRange([i,i+s]),this.componentStore.yAxis.setBoundingBoxXY({x:i,y:n}),this.componentStore.xAxis.setRange([a,a+l]),this.componentStore.xAxis.setBoundingBoxXY({x:0,y:a}),this.chartData.plots.some(h=>mO(h))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateSpace(){this.chartConfig.chartOrientation==="horizontal"?this.calculateHorizontalSpace():this.calculateVerticalSpace()}getDrawableElement(){this.calculateSpace();let e=[];this.componentStore.plot.setAxes(this.componentStore.xAxis,this.componentStore.yAxis);for(let r of Object.values(this.componentStore))e.push(...r.getDrawableElements());return e}}});var S6,Phe=N(()=>{"use strict";Ohe();S6=class{static{o(this,"XYChartBuilder")}static build(e,r,n,i){return new E6(e,r,n,i).getDrawableElement()}}});function Fhe(){let t=oh(),e=cr();return Fi(t.xyChart,e.themeVariables.xyChart)}function $he(){let t=cr();return Fi(or.xyChart,t.xyChart)}function zhe(){return{yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]}}function kO(t){let e=cr();return Tr(t.trim(),e)}function IGe(t){Bhe=t}function OGe(t){t==="horizontal"?bb.chartOrientation="horizontal":bb.chartOrientation="vertical"}function PGe(t){fn.xAxis.title=kO(t.text)}function Ghe(t,e){fn.xAxis={type:"linear",title:fn.xAxis.title,min:t,max:e},C6=!0}function BGe(t){fn.xAxis={type:"band",title:fn.xAxis.title,categories:t.map(e=>kO(e.text))},C6=!0}function FGe(t){fn.yAxis.title=kO(t.text)}function $Ge(t,e){fn.yAxis={type:"linear",title:fn.yAxis.title,min:t,max:e},TO=!0}function zGe(t){let e=Math.min(...t),r=Math.max(...t),n=S1(fn.yAxis)?fn.yAxis.min:1/0,i=S1(fn.yAxis)?fn.yAxis.max:-1/0;fn.yAxis={type:"linear",title:fn.yAxis.title,min:Math.min(n,e),max:Math.max(i,r)}}function Vhe(t){let e=[];if(t.length===0)return e;if(!C6){let r=S1(fn.xAxis)?fn.xAxis.min:1/0,n=S1(fn.xAxis)?fn.xAxis.max:-1/0;Ghe(Math.min(r,1),Math.max(n,t.length))}if(TO||zGe(t),v6(fn.xAxis)&&(e=fn.xAxis.categories.map((r,n)=>[r,t[n]])),S1(fn.xAxis)){let r=fn.xAxis.min,n=fn.xAxis.max,i=(n-r)/(t.length-1),a=[];for(let s=r;s<=n;s+=i)a.push(`${s}`);e=a.map((s,l)=>[s,t[l]])}return e}function Uhe(t){return wO[t===0?0:t%wO.length]}function GGe(t,e){let r=Vhe(e);fn.plots.push({type:"line",strokeFill:Uhe(xb),strokeWidth:2,data:r}),xb++}function VGe(t,e){let r=Vhe(e);fn.plots.push({type:"bar",fill:Uhe(xb),data:r}),xb++}function UGe(){if(fn.plots.length===0)throw Error("No Plot to render, please provide a plot with some data");return fn.title=Ir(),S6.build(bb,fn,wb,Bhe)}function HGe(){return wb}function WGe(){return bb}var xb,Bhe,bb,wb,fn,wO,C6,TO,qGe,Hhe,Whe=N(()=>{"use strict";ji();Ya();_y();ir();gr();mi();Phe();x6();xb=0,bb=$he(),wb=Fhe(),fn=zhe(),wO=wb.plotColorPalette.split(",").map(t=>t.trim()),C6=!1,TO=!1;o(Fhe,"getChartDefaultThemeConfig");o($he,"getChartDefaultConfig");o(zhe,"getChartDefaultData");o(kO,"textSanitizer");o(IGe,"setTmpSVGG");o(OGe,"setOrientation");o(PGe,"setXAxisTitle");o(Ghe,"setXAxisRangeData");o(BGe,"setXAxisBand");o(FGe,"setYAxisTitle");o($Ge,"setYAxisRangeData");o(zGe,"setYAxisRangeFromPlotData");o(Vhe,"transformDataWithoutCategory");o(Uhe,"getPlotColorFromPalette");o(GGe,"setLineData");o(VGe,"setBarData");o(UGe,"getDrawableElem");o(HGe,"getChartThemeConfig");o(WGe,"getChartConfig");qGe=o(function(){Ar(),xb=0,bb=$he(),fn=zhe(),wb=Fhe(),wO=wb.plotColorPalette.split(",").map(t=>t.trim()),C6=!1,TO=!1},"clear"),Hhe={getDrawableElem:UGe,clear:qGe,setAccTitle:Lr,getAccTitle:Rr,setDiagramTitle:$r,getDiagramTitle:Ir,getAccDescription:Mr,setAccDescription:Nr,setOrientation:OGe,setXAxisTitle:PGe,setXAxisRangeData:Ghe,setXAxisBand:BGe,setYAxisTitle:FGe,setYAxisRangeData:$Ge,setLineData:GGe,setBarData:VGe,setTmpSVGG:IGe,getChartThemeConfig:HGe,getChartConfig:WGe}});var YGe,qhe,Yhe=N(()=>{"use strict";vt();Vc();Ei();YGe=o((t,e,r,n)=>{let i=n.db,a=i.getChartThemeConfig(),s=i.getChartConfig();function l(v){return v==="top"?"text-before-edge":"middle"}o(l,"getDominantBaseLine");function u(v){return v==="left"?"start":v==="right"?"end":"middle"}o(u,"getTextAnchor");function h(v){return`translate(${v.x}, ${v.y}) rotate(${v.rotation||0})`}o(h,"getTextTransformation"),Y.debug(`Rendering xychart chart +`+t);let f=sa(e),d=f.append("g").attr("class","main"),p=d.append("rect").attr("width",s.width).attr("height",s.height).attr("class","background");vn(f,s.height,s.width,!0),f.attr("viewBox",`0 0 ${s.width} ${s.height}`),p.attr("fill",a.backgroundColor),i.setTmpSVGG(f.append("g").attr("class","mermaid-tmp-group"));let m=i.getDrawableElem(),g={};function y(v){let x=d,b="";for(let[w]of v.entries()){let C=d;w>0&&g[b]&&(C=g[b]),b+=v[w],x=g[b],x||(x=g[b]=C.append("g").attr("class",v[w]))}return x}o(y,"getGroup");for(let v of m){if(v.data.length===0)continue;let x=y(v.groupTexts);switch(v.type){case"rect":x.selectAll("rect").data(v.data).enter().append("rect").attr("x",b=>b.x).attr("y",b=>b.y).attr("width",b=>b.width).attr("height",b=>b.height).attr("fill",b=>b.fill).attr("stroke",b=>b.strokeFill).attr("stroke-width",b=>b.strokeWidth);break;case"text":x.selectAll("text").data(v.data).enter().append("text").attr("x",0).attr("y",0).attr("fill",b=>b.fill).attr("font-size",b=>b.fontSize).attr("dominant-baseline",b=>l(b.verticalPos)).attr("text-anchor",b=>u(b.horizontalPos)).attr("transform",b=>h(b)).text(b=>b.text);break;case"path":x.selectAll("path").data(v.data).enter().append("path").attr("d",b=>b.path).attr("fill",b=>b.fill?b.fill:"none").attr("stroke",b=>b.strokeFill).attr("stroke-width",b=>b.strokeWidth);break}}},"draw"),qhe={draw:YGe}});var Xhe={};hr(Xhe,{diagram:()=>XGe});var XGe,jhe=N(()=>{"use strict";She();Whe();Yhe();XGe={parser:Ehe,db:Hhe,renderer:qhe}});var EO,Zhe,Jhe=N(()=>{"use strict";EO=function(){var t=o(function(re,oe,V,xe){for(V=V||{},xe=re.length;xe--;V[re[xe]]=oe);return V},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[5,6,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],s=[1,22],l=[2,7],u=[1,26],h=[1,27],f=[1,28],d=[1,29],p=[1,33],m=[1,34],g=[1,35],y=[1,36],v=[1,37],x=[1,38],b=[1,24],w=[1,31],C=[1,32],T=[1,30],E=[1,39],A=[1,40],S=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],_=[1,61],I=[89,90],D=[5,8,9,11,13,21,22,23,24,27,29,41,42,43,44,45,46,54,61,63,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],k=[27,29],L=[1,70],R=[1,71],O=[1,72],M=[1,73],B=[1,74],F=[1,75],P=[1,76],z=[1,83],$=[1,80],H=[1,84],Q=[1,85],j=[1,86],ie=[1,87],ne=[1,88],le=[1,89],he=[1,90],K=[1,91],X=[1,92],te=[5,8,9,11,13,21,22,23,24,27,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],J=[63,64],se=[1,101],ue=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,76,77,89,90],Z=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],Se=[1,110],ce=[1,106],ae=[1,107],Oe=[1,108],ge=[1,109],ze=[1,111],He=[1,116],$e=[1,117],Re=[1,114],Ie=[1,115],be={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,acc_title:9,acc_title_value:10,acc_descr:11,acc_descr_value:12,acc_descr_multiline_value:13,requirementDef:14,elementDef:15,relationshipDef:16,direction:17,styleStatement:18,classDefStatement:19,classStatement:20,direction_tb:21,direction_bt:22,direction_rl:23,direction_lr:24,requirementType:25,requirementName:26,STRUCT_START:27,requirementBody:28,STYLE_SEPARATOR:29,idList:30,ID:31,COLONSEP:32,id:33,TEXT:34,text:35,RISK:36,riskLevel:37,VERIFYMTHD:38,verifyType:39,STRUCT_STOP:40,REQUIREMENT:41,FUNCTIONAL_REQUIREMENT:42,INTERFACE_REQUIREMENT:43,PERFORMANCE_REQUIREMENT:44,PHYSICAL_REQUIREMENT:45,DESIGN_CONSTRAINT:46,LOW_RISK:47,MED_RISK:48,HIGH_RISK:49,VERIFY_ANALYSIS:50,VERIFY_DEMONSTRATION:51,VERIFY_INSPECTION:52,VERIFY_TEST:53,ELEMENT:54,elementName:55,elementBody:56,TYPE:57,type:58,DOCREF:59,ref:60,END_ARROW_L:61,relationship:62,LINE:63,END_ARROW_R:64,CONTAINS:65,COPIES:66,DERIVES:67,SATISFIES:68,VERIFIES:69,REFINES:70,TRACES:71,CLASSDEF:72,stylesOpt:73,CLASS:74,ALPHA:75,COMMA:76,STYLE:77,style:78,styleComponent:79,NUM:80,COLON:81,UNIT:82,SPACE:83,BRKT:84,PCT:85,MINUS:86,LABEL:87,SEMICOLON:88,unqString:89,qString:90,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",9:"acc_title",10:"acc_title_value",11:"acc_descr",12:"acc_descr_value",13:"acc_descr_multiline_value",21:"direction_tb",22:"direction_bt",23:"direction_rl",24:"direction_lr",27:"STRUCT_START",29:"STYLE_SEPARATOR",31:"ID",32:"COLONSEP",34:"TEXT",36:"RISK",38:"VERIFYMTHD",40:"STRUCT_STOP",41:"REQUIREMENT",42:"FUNCTIONAL_REQUIREMENT",43:"INTERFACE_REQUIREMENT",44:"PERFORMANCE_REQUIREMENT",45:"PHYSICAL_REQUIREMENT",46:"DESIGN_CONSTRAINT",47:"LOW_RISK",48:"MED_RISK",49:"HIGH_RISK",50:"VERIFY_ANALYSIS",51:"VERIFY_DEMONSTRATION",52:"VERIFY_INSPECTION",53:"VERIFY_TEST",54:"ELEMENT",57:"TYPE",59:"DOCREF",61:"END_ARROW_L",63:"LINE",64:"END_ARROW_R",65:"CONTAINS",66:"COPIES",67:"DERIVES",68:"SATISFIES",69:"VERIFIES",70:"REFINES",71:"TRACES",72:"CLASSDEF",74:"CLASS",75:"ALPHA",76:"COMMA",77:"STYLE",80:"NUM",81:"COLON",82:"UNIT",83:"SPACE",84:"BRKT",85:"PCT",86:"MINUS",87:"LABEL",88:"SEMICOLON",89:"unqString",90:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,2],[4,2],[4,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[17,1],[17,1],[17,1],[17,1],[14,5],[14,7],[28,5],[28,5],[28,5],[28,5],[28,2],[28,1],[25,1],[25,1],[25,1],[25,1],[25,1],[25,1],[37,1],[37,1],[37,1],[39,1],[39,1],[39,1],[39,1],[15,5],[15,7],[56,5],[56,5],[56,2],[56,1],[16,5],[16,5],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[19,3],[20,3],[20,3],[30,1],[30,3],[30,1],[30,3],[18,3],[73,1],[73,3],[78,1],[78,2],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[26,1],[26,1],[33,1],[33,1],[35,1],[35,1],[55,1],[55,1],[58,1],[58,1],[60,1],[60,1]],performAction:o(function(oe,V,xe,q,pe,ve,Pe){var _e=ve.length-1;switch(pe){case 4:this.$=ve[_e].trim(),q.setAccTitle(this.$);break;case 5:case 6:this.$=ve[_e].trim(),q.setAccDescription(this.$);break;case 7:this.$=[];break;case 17:q.setDirection("TB");break;case 18:q.setDirection("BT");break;case 19:q.setDirection("RL");break;case 20:q.setDirection("LR");break;case 21:q.addRequirement(ve[_e-3],ve[_e-4]);break;case 22:q.addRequirement(ve[_e-5],ve[_e-6]),q.setClass([ve[_e-5]],ve[_e-3]);break;case 23:q.setNewReqId(ve[_e-2]);break;case 24:q.setNewReqText(ve[_e-2]);break;case 25:q.setNewReqRisk(ve[_e-2]);break;case 26:q.setNewReqVerifyMethod(ve[_e-2]);break;case 29:this.$=q.RequirementType.REQUIREMENT;break;case 30:this.$=q.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 31:this.$=q.RequirementType.INTERFACE_REQUIREMENT;break;case 32:this.$=q.RequirementType.PERFORMANCE_REQUIREMENT;break;case 33:this.$=q.RequirementType.PHYSICAL_REQUIREMENT;break;case 34:this.$=q.RequirementType.DESIGN_CONSTRAINT;break;case 35:this.$=q.RiskLevel.LOW_RISK;break;case 36:this.$=q.RiskLevel.MED_RISK;break;case 37:this.$=q.RiskLevel.HIGH_RISK;break;case 38:this.$=q.VerifyType.VERIFY_ANALYSIS;break;case 39:this.$=q.VerifyType.VERIFY_DEMONSTRATION;break;case 40:this.$=q.VerifyType.VERIFY_INSPECTION;break;case 41:this.$=q.VerifyType.VERIFY_TEST;break;case 42:q.addElement(ve[_e-3]);break;case 43:q.addElement(ve[_e-5]),q.setClass([ve[_e-5]],ve[_e-3]);break;case 44:q.setNewElementType(ve[_e-2]);break;case 45:q.setNewElementDocRef(ve[_e-2]);break;case 48:q.addRelationship(ve[_e-2],ve[_e],ve[_e-4]);break;case 49:q.addRelationship(ve[_e-2],ve[_e-4],ve[_e]);break;case 50:this.$=q.Relationships.CONTAINS;break;case 51:this.$=q.Relationships.COPIES;break;case 52:this.$=q.Relationships.DERIVES;break;case 53:this.$=q.Relationships.SATISFIES;break;case 54:this.$=q.Relationships.VERIFIES;break;case 55:this.$=q.Relationships.REFINES;break;case 56:this.$=q.Relationships.TRACES;break;case 57:this.$=ve[_e-2],q.defineClass(ve[_e-1],ve[_e]);break;case 58:q.setClass(ve[_e-1],ve[_e]);break;case 59:q.setClass([ve[_e-2]],ve[_e]);break;case 60:case 62:this.$=[ve[_e]];break;case 61:case 63:this.$=ve[_e-2].concat([ve[_e]]);break;case 64:this.$=ve[_e-2],q.setCssStyle(ve[_e-1],ve[_e]);break;case 65:this.$=[ve[_e]];break;case 66:ve[_e-2].push(ve[_e]),this.$=ve[_e-2];break;case 68:this.$=ve[_e-1]+ve[_e];break}},"anonymous"),table:[{3:1,4:2,6:e,9:r,11:n,13:i},{1:[3]},{3:8,4:2,5:[1,7],6:e,9:r,11:n,13:i},{5:[1,9]},{10:[1,10]},{12:[1,11]},t(a,[2,6]),{3:12,4:2,6:e,9:r,11:n,13:i},{1:[2,2]},{4:17,5:s,7:13,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:w,74:C,77:T,89:E,90:A},t(a,[2,4]),t(a,[2,5]),{1:[2,1]},{8:[1,41]},{4:17,5:s,7:42,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:w,74:C,77:T,89:E,90:A},{4:17,5:s,7:43,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:w,74:C,77:T,89:E,90:A},{4:17,5:s,7:44,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:w,74:C,77:T,89:E,90:A},{4:17,5:s,7:45,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:w,74:C,77:T,89:E,90:A},{4:17,5:s,7:46,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:w,74:C,77:T,89:E,90:A},{4:17,5:s,7:47,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:w,74:C,77:T,89:E,90:A},{4:17,5:s,7:48,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:w,74:C,77:T,89:E,90:A},{4:17,5:s,7:49,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:w,74:C,77:T,89:E,90:A},{4:17,5:s,7:50,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:w,74:C,77:T,89:E,90:A},{26:51,89:[1,52],90:[1,53]},{55:54,89:[1,55],90:[1,56]},{29:[1,59],61:[1,57],63:[1,58]},t(S,[2,17]),t(S,[2,18]),t(S,[2,19]),t(S,[2,20]),{30:60,33:62,75:_,89:E,90:A},{30:63,33:62,75:_,89:E,90:A},{30:64,33:62,75:_,89:E,90:A},t(I,[2,29]),t(I,[2,30]),t(I,[2,31]),t(I,[2,32]),t(I,[2,33]),t(I,[2,34]),t(D,[2,81]),t(D,[2,82]),{1:[2,3]},{8:[2,8]},{8:[2,9]},{8:[2,10]},{8:[2,11]},{8:[2,12]},{8:[2,13]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{27:[1,65],29:[1,66]},t(k,[2,79]),t(k,[2,80]),{27:[1,67],29:[1,68]},t(k,[2,85]),t(k,[2,86]),{62:69,65:L,66:R,67:O,68:M,69:B,70:F,71:P},{62:77,65:L,66:R,67:O,68:M,69:B,70:F,71:P},{30:78,33:62,75:_,89:E,90:A},{73:79,75:z,76:$,78:81,79:82,80:H,81:Q,82:j,83:ie,84:ne,85:le,86:he,87:K,88:X},t(te,[2,60]),t(te,[2,62]),{73:93,75:z,76:$,78:81,79:82,80:H,81:Q,82:j,83:ie,84:ne,85:le,86:he,87:K,88:X},{30:94,33:62,75:_,76:$,89:E,90:A},{5:[1,95]},{30:96,33:62,75:_,89:E,90:A},{5:[1,97]},{30:98,33:62,75:_,89:E,90:A},{63:[1,99]},t(J,[2,50]),t(J,[2,51]),t(J,[2,52]),t(J,[2,53]),t(J,[2,54]),t(J,[2,55]),t(J,[2,56]),{64:[1,100]},t(S,[2,59],{76:$}),t(S,[2,64],{76:se}),{33:103,75:[1,102],89:E,90:A},t(ue,[2,65],{79:104,75:z,80:H,81:Q,82:j,83:ie,84:ne,85:le,86:he,87:K,88:X}),t(Z,[2,67]),t(Z,[2,69]),t(Z,[2,70]),t(Z,[2,71]),t(Z,[2,72]),t(Z,[2,73]),t(Z,[2,74]),t(Z,[2,75]),t(Z,[2,76]),t(Z,[2,77]),t(Z,[2,78]),t(S,[2,57],{76:se}),t(S,[2,58],{76:$}),{5:Se,28:105,31:ce,34:ae,36:Oe,38:ge,40:ze},{27:[1,112],76:$},{5:He,40:$e,56:113,57:Re,59:Ie},{27:[1,118],76:$},{33:119,89:E,90:A},{33:120,89:E,90:A},{75:z,78:121,79:82,80:H,81:Q,82:j,83:ie,84:ne,85:le,86:he,87:K,88:X},t(te,[2,61]),t(te,[2,63]),t(Z,[2,68]),t(S,[2,21]),{32:[1,122]},{32:[1,123]},{32:[1,124]},{32:[1,125]},{5:Se,28:126,31:ce,34:ae,36:Oe,38:ge,40:ze},t(S,[2,28]),{5:[1,127]},t(S,[2,42]),{32:[1,128]},{32:[1,129]},{5:He,40:$e,56:130,57:Re,59:Ie},t(S,[2,47]),{5:[1,131]},t(S,[2,48]),t(S,[2,49]),t(ue,[2,66],{79:104,75:z,80:H,81:Q,82:j,83:ie,84:ne,85:le,86:he,87:K,88:X}),{33:132,89:E,90:A},{35:133,89:[1,134],90:[1,135]},{37:136,47:[1,137],48:[1,138],49:[1,139]},{39:140,50:[1,141],51:[1,142],52:[1,143],53:[1,144]},t(S,[2,27]),{5:Se,28:145,31:ce,34:ae,36:Oe,38:ge,40:ze},{58:146,89:[1,147],90:[1,148]},{60:149,89:[1,150],90:[1,151]},t(S,[2,46]),{5:He,40:$e,56:152,57:Re,59:Ie},{5:[1,153]},{5:[1,154]},{5:[2,83]},{5:[2,84]},{5:[1,155]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[1,156]},{5:[2,38]},{5:[2,39]},{5:[2,40]},{5:[2,41]},t(S,[2,22]),{5:[1,157]},{5:[2,87]},{5:[2,88]},{5:[1,158]},{5:[2,89]},{5:[2,90]},t(S,[2,43]),{5:Se,28:159,31:ce,34:ae,36:Oe,38:ge,40:ze},{5:Se,28:160,31:ce,34:ae,36:Oe,38:ge,40:ze},{5:Se,28:161,31:ce,34:ae,36:Oe,38:ge,40:ze},{5:Se,28:162,31:ce,34:ae,36:Oe,38:ge,40:ze},{5:He,40:$e,56:163,57:Re,59:Ie},{5:He,40:$e,56:164,57:Re,59:Ie},t(S,[2,23]),t(S,[2,24]),t(S,[2,25]),t(S,[2,26]),t(S,[2,44]),t(S,[2,45])],defaultActions:{8:[2,2],12:[2,1],41:[2,3],42:[2,8],43:[2,9],44:[2,10],45:[2,11],46:[2,12],47:[2,13],48:[2,14],49:[2,15],50:[2,16],134:[2,83],135:[2,84],137:[2,35],138:[2,36],139:[2,37],141:[2,38],142:[2,39],143:[2,40],144:[2,41],147:[2,87],148:[2,88],150:[2,89],151:[2,90]},parseError:o(function(oe,V){if(V.recoverable)this.trace(oe);else{var xe=new Error(oe);throw xe.hash=V,xe}},"parseError"),parse:o(function(oe){var V=this,xe=[0],q=[],pe=[null],ve=[],Pe=this.table,_e="",we=0,Ve=0,De=0,qe=2,at=1,Rt=ve.slice.call(arguments,1),st=Object.create(this.lexer),Ue={yy:{}};for(var ct in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ct)&&(Ue.yy[ct]=this.yy[ct]);st.setInput(oe,Ue.yy),Ue.yy.lexer=st,Ue.yy.parser=this,typeof st.yylloc>"u"&&(st.yylloc={});var We=st.yylloc;ve.push(We);var ot=st.options&&st.options.ranges;typeof Ue.yy.parseError=="function"?this.parseError=Ue.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Yt(Dr){xe.length=xe.length-2*Dr,pe.length=pe.length-Dr,ve.length=ve.length-Dr}o(Yt,"popStack");function bt(){var Dr;return Dr=q.pop()||st.lex()||at,typeof Dr!="number"&&(Dr instanceof Array&&(q=Dr,Dr=q.pop()),Dr=V.symbols_[Dr]||Dr),Dr}o(bt,"lex");for(var Mt,xt,ut,Et,ft,yt,nt={},dn,Tt,On,tn;;){if(ut=xe[xe.length-1],this.defaultActions[ut]?Et=this.defaultActions[ut]:((Mt===null||typeof Mt>"u")&&(Mt=bt()),Et=Pe[ut]&&Pe[ut][Mt]),typeof Et>"u"||!Et.length||!Et[0]){var _r="";tn=[];for(dn in Pe[ut])this.terminals_[dn]&&dn>qe&&tn.push("'"+this.terminals_[dn]+"'");st.showPosition?_r="Parse error on line "+(we+1)+`: +`+st.showPosition()+` +Expecting `+tn.join(", ")+", got '"+(this.terminals_[Mt]||Mt)+"'":_r="Parse error on line "+(we+1)+": Unexpected "+(Mt==at?"end of input":"'"+(this.terminals_[Mt]||Mt)+"'"),this.parseError(_r,{text:st.match,token:this.terminals_[Mt]||Mt,line:st.yylineno,loc:We,expected:tn})}if(Et[0]instanceof Array&&Et.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ut+", token: "+Mt);switch(Et[0]){case 1:xe.push(Mt),pe.push(st.yytext),ve.push(st.yylloc),xe.push(Et[1]),Mt=null,xt?(Mt=xt,xt=null):(Ve=st.yyleng,_e=st.yytext,we=st.yylineno,We=st.yylloc,De>0&&De--);break;case 2:if(Tt=this.productions_[Et[1]][1],nt.$=pe[pe.length-Tt],nt._$={first_line:ve[ve.length-(Tt||1)].first_line,last_line:ve[ve.length-1].last_line,first_column:ve[ve.length-(Tt||1)].first_column,last_column:ve[ve.length-1].last_column},ot&&(nt._$.range=[ve[ve.length-(Tt||1)].range[0],ve[ve.length-1].range[1]]),yt=this.performAction.apply(nt,[_e,Ve,we,Ue.yy,Et[1],pe,ve].concat(Rt)),typeof yt<"u")return yt;Tt&&(xe=xe.slice(0,-1*Tt*2),pe=pe.slice(0,-1*Tt),ve=ve.slice(0,-1*Tt)),xe.push(this.productions_[Et[1]][0]),pe.push(nt.$),ve.push(nt._$),On=Pe[xe[xe.length-2]][xe[xe.length-1]],xe.push(On);break;case 3:return!0}}return!0},"parse")},W=function(){var re={EOF:1,parseError:o(function(V,xe){if(this.yy.parser)this.yy.parser.parseError(V,xe);else throw new Error(V)},"parseError"),setInput:o(function(oe,V){return this.yy=V||this.yy||{},this._input=oe,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var oe=this._input[0];this.yytext+=oe,this.yyleng++,this.offset++,this.match+=oe,this.matched+=oe;var V=oe.match(/(?:\r\n?|\n).*/g);return V?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),oe},"input"),unput:o(function(oe){var V=oe.length,xe=oe.split(/(?:\r\n?|\n)/g);this._input=oe+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-V),this.offset-=V;var q=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),xe.length-1&&(this.yylineno-=xe.length-1);var pe=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:xe?(xe.length===q.length?this.yylloc.first_column:0)+q[q.length-xe.length].length-xe[0].length:this.yylloc.first_column-V},this.options.ranges&&(this.yylloc.range=[pe[0],pe[0]+this.yyleng-V]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(oe){this.unput(this.match.slice(oe))},"less"),pastInput:o(function(){var oe=this.matched.substr(0,this.matched.length-this.match.length);return(oe.length>20?"...":"")+oe.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var oe=this.match;return oe.length<20&&(oe+=this._input.substr(0,20-oe.length)),(oe.substr(0,20)+(oe.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var oe=this.pastInput(),V=new Array(oe.length+1).join("-");return oe+this.upcomingInput()+` +`+V+"^"},"showPosition"),test_match:o(function(oe,V){var xe,q,pe;if(this.options.backtrack_lexer&&(pe={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(pe.yylloc.range=this.yylloc.range.slice(0))),q=oe[0].match(/(?:\r\n?|\n).*/g),q&&(this.yylineno+=q.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:q?q[q.length-1].length-q[q.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+oe[0].length},this.yytext+=oe[0],this.match+=oe[0],this.matches=oe,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(oe[0].length),this.matched+=oe[0],xe=this.performAction.call(this,this.yy,this,V,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),xe)return xe;if(this._backtrack){for(var ve in pe)this[ve]=pe[ve];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var oe,V,xe,q;this._more||(this.yytext="",this.match="");for(var pe=this._currentRules(),ve=0;veV[0].length)){if(V=xe,q=ve,this.options.backtrack_lexer){if(oe=this.test_match(xe,pe[ve]),oe!==!1)return oe;if(this._backtrack){V=!1;continue}else return!1}else if(!this.options.flex)break}return V?(oe=this.test_match(V,pe[q]),oe!==!1?oe:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var V=this.next();return V||this.lex()},"lex"),begin:o(function(V){this.conditionStack.push(V)},"begin"),popState:o(function(){var V=this.conditionStack.length-1;return V>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(V){return V=this.conditionStack.length-1-Math.abs(V||0),V>=0?this.conditionStack[V]:"INITIAL"},"topState"),pushState:o(function(V){this.begin(V)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(V,xe,q,pe){var ve=pe;switch(q){case 0:return"title";case 1:return this.begin("acc_title"),9;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),11;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:return 21;case 9:return 22;case 10:return 23;case 11:return 24;case 12:return 5;case 13:break;case 14:break;case 15:break;case 16:return 8;case 17:return 6;case 18:return 27;case 19:return 40;case 20:return 29;case 21:return 32;case 22:return 31;case 23:return 34;case 24:return 36;case 25:return 38;case 26:return 41;case 27:return 42;case 28:return 43;case 29:return 44;case 30:return 45;case 31:return 46;case 32:return 47;case 33:return 48;case 34:return 49;case 35:return 50;case 36:return 51;case 37:return 52;case 38:return 53;case 39:return 54;case 40:return 65;case 41:return 66;case 42:return 67;case 43:return 68;case 44:return 69;case 45:return 70;case 46:return 71;case 47:return 57;case 48:return 59;case 49:return this.begin("style"),77;break;case 50:return 75;case 51:return 81;case 52:return 88;case 53:return"PERCENT";case 54:return 86;case 55:return 84;case 56:break;case 57:this.begin("string");break;case 58:this.popState();break;case 59:return this.begin("style"),72;break;case 60:return this.begin("style"),74;break;case 61:return 61;case 62:return 64;case 63:return 63;case 64:this.begin("string");break;case 65:this.popState();break;case 66:return"qString";case 67:return xe.yytext=xe.yytext.trim(),89;break;case 68:return 75;case 69:return 80;case 70:return 76}},"anonymous"),rules:[/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::{3})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:style\b)/i,/^(?:\w+)/i,/^(?::)/i,/^(?:;)/i,/^(?:%)/i,/^(?:-)/i,/^(?:#)/i,/^(?: )/i,/^(?:["])/i,/^(?:\n)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^:,\r\n\{\<\>\-\=]*)/i,/^(?:\w+)/i,/^(?:[0-9]+)/i,/^(?:,)/i],conditions:{acc_descr_multiline:{rules:[6,7,68,69,70],inclusive:!1},acc_descr:{rules:[4,68,69,70],inclusive:!1},acc_title:{rules:[2,68,69,70],inclusive:!1},style:{rules:[50,51,52,53,54,55,56,57,58,68,69,70],inclusive:!1},unqString:{rules:[68,69,70],inclusive:!1},token:{rules:[68,69,70],inclusive:!1},string:{rules:[65,66,68,69,70],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,59,60,61,62,63,64,67,68,69,70],inclusive:!0}}};return re}();be.lexer=W;function de(){this.yy={}}return o(de,"Parser"),de.prototype=be,be.Parser=de,new de}();EO.parser=EO;Zhe=EO});var A6,efe=N(()=>{"use strict";zt();vt();mi();A6=class{constructor(){this.relations=[];this.latestRequirement=this.getInitialRequirement();this.requirements=new Map;this.latestElement=this.getInitialElement();this.elements=new Map;this.classes=new Map;this.direction="TB";this.RequirementType={REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"};this.RiskLevel={LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"};this.VerifyType={VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"};this.Relationships={CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"};this.setAccTitle=Lr;this.getAccTitle=Rr;this.setAccDescription=Nr;this.getAccDescription=Mr;this.setDiagramTitle=$r;this.getDiagramTitle=Ir;this.getConfig=o(()=>me().requirement,"getConfig");this.clear(),this.setDirection=this.setDirection.bind(this),this.addRequirement=this.addRequirement.bind(this),this.setNewReqId=this.setNewReqId.bind(this),this.setNewReqRisk=this.setNewReqRisk.bind(this),this.setNewReqText=this.setNewReqText.bind(this),this.setNewReqVerifyMethod=this.setNewReqVerifyMethod.bind(this),this.addElement=this.addElement.bind(this),this.setNewElementType=this.setNewElementType.bind(this),this.setNewElementDocRef=this.setNewElementDocRef.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setCssStyle=this.setCssStyle.bind(this),this.setClass=this.setClass.bind(this),this.defineClass=this.defineClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{o(this,"RequirementDB")}getDirection(){return this.direction}setDirection(e){this.direction=e}resetLatestRequirement(){this.latestRequirement=this.getInitialRequirement()}resetLatestElement(){this.latestElement=this.getInitialElement()}getInitialRequirement(){return{requirementId:"",text:"",risk:"",verifyMethod:"",name:"",type:"",cssStyles:[],classes:["default"]}}getInitialElement(){return{name:"",type:"",docRef:"",cssStyles:[],classes:["default"]}}addRequirement(e,r){return this.requirements.has(e)||this.requirements.set(e,{name:e,type:r,requirementId:this.latestRequirement.requirementId,text:this.latestRequirement.text,risk:this.latestRequirement.risk,verifyMethod:this.latestRequirement.verifyMethod,cssStyles:[],classes:["default"]}),this.resetLatestRequirement(),this.requirements.get(e)}getRequirements(){return this.requirements}setNewReqId(e){this.latestRequirement!==void 0&&(this.latestRequirement.requirementId=e)}setNewReqText(e){this.latestRequirement!==void 0&&(this.latestRequirement.text=e)}setNewReqRisk(e){this.latestRequirement!==void 0&&(this.latestRequirement.risk=e)}setNewReqVerifyMethod(e){this.latestRequirement!==void 0&&(this.latestRequirement.verifyMethod=e)}addElement(e){return this.elements.has(e)||(this.elements.set(e,{name:e,type:this.latestElement.type,docRef:this.latestElement.docRef,cssStyles:[],classes:["default"]}),Y.info("Added new element: ",e)),this.resetLatestElement(),this.elements.get(e)}getElements(){return this.elements}setNewElementType(e){this.latestElement!==void 0&&(this.latestElement.type=e)}setNewElementDocRef(e){this.latestElement!==void 0&&(this.latestElement.docRef=e)}addRelationship(e,r,n){this.relations.push({type:e,src:r,dst:n})}getRelationships(){return this.relations}clear(){this.relations=[],this.resetLatestRequirement(),this.requirements=new Map,this.resetLatestElement(),this.elements=new Map,this.classes=new Map,Ar()}setCssStyle(e,r){for(let n of e){let i=this.requirements.get(n)??this.elements.get(n);if(!r||!i)return;for(let a of r)a.includes(",")?i.cssStyles.push(...a.split(",")):i.cssStyles.push(a)}}setClass(e,r){for(let n of e){let i=this.requirements.get(n)??this.elements.get(n);if(i)for(let a of r){i.classes.push(a);let s=this.classes.get(a)?.styles;s&&i.cssStyles.push(...s)}}}defineClass(e,r){for(let n of e){let i=this.classes.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.classes.set(n,i)),r&&r.forEach(function(a){if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)}),this.requirements.forEach(a=>{a.classes.includes(n)&&a.cssStyles.push(...r.flatMap(s=>s.split(",")))}),this.elements.forEach(a=>{a.classes.includes(n)&&a.cssStyles.push(...r.flatMap(s=>s.split(",")))})}}getClasses(){return this.classes}getData(){let e=me(),r=[],n=[];for(let i of this.requirements.values()){let a=i;a.id=i.name,a.cssStyles=i.cssStyles,a.cssClasses=i.classes.join(" "),a.shape="requirementBox",a.look=e.look,r.push(a)}for(let i of this.elements.values()){let a=i;a.shape="requirementBox",a.look=e.look,a.id=i.name,a.cssStyles=i.cssStyles,a.cssClasses=i.classes.join(" "),r.push(a)}for(let i of this.relations){let a=0,s=i.type===this.Relationships.CONTAINS,l={id:`${i.src}-${i.dst}-${a}`,start:this.requirements.get(i.src)?.name??this.elements.get(i.src)?.name,end:this.requirements.get(i.dst)?.name??this.elements.get(i.dst)?.name,label:`<<${i.type}>>`,classes:"relationshipLine",style:["fill:none",s?"":"stroke-dasharray: 10,7"],labelpos:"c",thickness:"normal",type:"normal",pattern:s?"normal":"dashed",arrowTypeStart:s?"requirement_contains":"",arrowTypeEnd:s?"":"requirement_arrow",look:e.look};n.push(l),a++}return{nodes:r,edges:n,other:{},config:e,direction:this.getDirection()}}}});var ZGe,tfe,rfe=N(()=>{"use strict";ZGe=o(t=>` + + marker { + fill: ${t.relationColor}; + stroke: ${t.relationColor}; + } + + marker.cross { + stroke: ${t.lineColor}; + } + + svg { + font-family: ${t.fontFamily}; + font-size: ${t.fontSize}; + } + + .reqBox { + fill: ${t.requirementBackground}; + fill-opacity: 1.0; + stroke: ${t.requirementBorderColor}; + stroke-width: ${t.requirementBorderSize}; + } + + .reqTitle, .reqLabel{ + fill: ${t.requirementTextColor}; + } + .reqLabelBox { + fill: ${t.relationLabelBackground}; + fill-opacity: 1.0; + } + + .req-title-line { + stroke: ${t.requirementBorderColor}; + stroke-width: ${t.requirementBorderSize}; + } + .relationshipLine { + stroke: ${t.relationColor}; + stroke-width: 1; + } + .relationshipLabel { + fill: ${t.relationLabelColor}; + } + .divider { + stroke: ${t.nodeBorder}; + stroke-width: 1; + } + .label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + .label text,span { + fill: ${t.nodeTextColor||t.textColor}; + color: ${t.nodeTextColor||t.textColor}; + } + .labelBkg { + background-color: ${t.edgeLabelBackground}; + } + +`,"getStyles"),tfe=ZGe});var SO={};hr(SO,{draw:()=>JGe});var JGe,nfe=N(()=>{"use strict";zt();vt();gm();Yd();$m();ir();JGe=o(async function(t,e,r,n){Y.info("REF0:"),Y.info("Drawing requirement diagram (unified)",e);let{securityLevel:i,state:a,layout:s}=me(),l=n.db.getData(),u=yc(e,i);l.type=n.type,l.layoutAlgorithm=nf(s),l.nodeSpacing=a?.nodeSpacing??50,l.rankSpacing=a?.rankSpacing??50,l.markers=["requirement_contains","requirement_arrow"],l.diagramId=e,await Cc(l,u);let h=8;Gt.insertTitle(u,"requirementDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Ac(u,h,"requirementDiagram",a?.useMaxWidth??!0)},"draw")});var ife={};hr(ife,{diagram:()=>eVe});var eVe,afe=N(()=>{"use strict";Jhe();efe();rfe();nfe();eVe={parser:Zhe,get db(){return new A6},renderer:SO,styles:tfe}});var CO,lfe,cfe=N(()=>{"use strict";CO=function(){var t=o(function(K,X,te,J){for(te=te||{},J=K.length;J--;te[K[J]]=X);return te},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],l=[1,13],u=[1,14],h=[1,16],f=[1,17],d=[1,18],p=[1,24],m=[1,25],g=[1,26],y=[1,27],v=[1,28],x=[1,29],b=[1,30],w=[1,31],C=[1,32],T=[1,33],E=[1,34],A=[1,35],S=[1,36],_=[1,37],I=[1,38],D=[1,39],k=[1,41],L=[1,42],R=[1,43],O=[1,44],M=[1,45],B=[1,46],F=[1,4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,48,49,50,52,53,54,59,60,61,62,70],P=[4,5,16,50,52,53],z=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],$=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,49,50,52,53,54,59,60,61,62,70],H=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,48,50,52,53,54,59,60,61,62,70],Q=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,50,52,53,54,59,60,61,62,70],j=[68,69,70],ie=[1,122],ne={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,SD:6,document:7,line:8,statement:9,box_section:10,box_line:11,participant_statement:12,create:13,box:14,restOfLine:15,end:16,signal:17,autonumber:18,NUM:19,off:20,activate:21,actor:22,deactivate:23,note_statement:24,links_statement:25,link_statement:26,properties_statement:27,details_statement:28,title:29,legacy_title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,loop:36,rect:37,opt:38,alt:39,else_sections:40,par:41,par_sections:42,par_over:43,critical:44,option_sections:45,break:46,option:47,and:48,else:49,participant:50,AS:51,participant_actor:52,destroy:53,note:54,placement:55,text2:56,over:57,actor_pair:58,links:59,link:60,properties:61,details:62,spaceList:63,",":64,left_of:65,right_of:66,signaltype:67,"+":68,"-":69,ACTOR:70,SOLID_OPEN_ARROW:71,DOTTED_OPEN_ARROW:72,SOLID_ARROW:73,BIDIRECTIONAL_SOLID_ARROW:74,DOTTED_ARROW:75,BIDIRECTIONAL_DOTTED_ARROW:76,SOLID_CROSS:77,DOTTED_CROSS:78,SOLID_POINT:79,DOTTED_POINT:80,TXT:81,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",6:"SD",13:"create",14:"box",15:"restOfLine",16:"end",18:"autonumber",19:"NUM",20:"off",21:"activate",23:"deactivate",29:"title",30:"legacy_title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"loop",37:"rect",38:"opt",39:"alt",41:"par",43:"par_over",44:"critical",46:"break",47:"option",48:"and",49:"else",50:"participant",51:"AS",52:"participant_actor",53:"destroy",54:"note",57:"over",59:"links",60:"link",61:"properties",62:"details",64:",",65:"left_of",66:"right_of",68:"+",69:"-",70:"ACTOR",71:"SOLID_OPEN_ARROW",72:"DOTTED_OPEN_ARROW",73:"SOLID_ARROW",74:"BIDIRECTIONAL_SOLID_ARROW",75:"DOTTED_ARROW",76:"BIDIRECTIONAL_DOTTED_ARROW",77:"SOLID_CROSS",78:"DOTTED_CROSS",79:"SOLID_POINT",80:"DOTTED_POINT",81:"TXT"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[10,0],[10,2],[11,2],[11,1],[11,1],[9,1],[9,2],[9,4],[9,2],[9,4],[9,3],[9,3],[9,2],[9,3],[9,3],[9,2],[9,2],[9,2],[9,2],[9,2],[9,1],[9,1],[9,2],[9,2],[9,1],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[45,1],[45,4],[42,1],[42,4],[40,1],[40,4],[12,5],[12,3],[12,5],[12,3],[12,3],[24,4],[24,4],[25,3],[26,3],[27,3],[28,3],[63,2],[63,1],[58,3],[58,1],[55,1],[55,1],[17,5],[17,5],[17,4],[22,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[56,1]],performAction:o(function(X,te,J,se,ue,Z,Se){var ce=Z.length-1;switch(ue){case 3:return se.apply(Z[ce]),Z[ce];break;case 4:case 9:this.$=[];break;case 5:case 10:Z[ce-1].push(Z[ce]),this.$=Z[ce-1];break;case 6:case 7:case 11:case 12:this.$=Z[ce];break;case 8:case 13:this.$=[];break;case 15:Z[ce].type="createParticipant",this.$=Z[ce];break;case 16:Z[ce-1].unshift({type:"boxStart",boxData:se.parseBoxData(Z[ce-2])}),Z[ce-1].push({type:"boxEnd",boxText:Z[ce-2]}),this.$=Z[ce-1];break;case 18:this.$={type:"sequenceIndex",sequenceIndex:Number(Z[ce-2]),sequenceIndexStep:Number(Z[ce-1]),sequenceVisible:!0,signalType:se.LINETYPE.AUTONUMBER};break;case 19:this.$={type:"sequenceIndex",sequenceIndex:Number(Z[ce-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:se.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:se.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:se.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"activeStart",signalType:se.LINETYPE.ACTIVE_START,actor:Z[ce-1].actor};break;case 23:this.$={type:"activeEnd",signalType:se.LINETYPE.ACTIVE_END,actor:Z[ce-1].actor};break;case 29:se.setDiagramTitle(Z[ce].substring(6)),this.$=Z[ce].substring(6);break;case 30:se.setDiagramTitle(Z[ce].substring(7)),this.$=Z[ce].substring(7);break;case 31:this.$=Z[ce].trim(),se.setAccTitle(this.$);break;case 32:case 33:this.$=Z[ce].trim(),se.setAccDescription(this.$);break;case 34:Z[ce-1].unshift({type:"loopStart",loopText:se.parseMessage(Z[ce-2]),signalType:se.LINETYPE.LOOP_START}),Z[ce-1].push({type:"loopEnd",loopText:Z[ce-2],signalType:se.LINETYPE.LOOP_END}),this.$=Z[ce-1];break;case 35:Z[ce-1].unshift({type:"rectStart",color:se.parseMessage(Z[ce-2]),signalType:se.LINETYPE.RECT_START}),Z[ce-1].push({type:"rectEnd",color:se.parseMessage(Z[ce-2]),signalType:se.LINETYPE.RECT_END}),this.$=Z[ce-1];break;case 36:Z[ce-1].unshift({type:"optStart",optText:se.parseMessage(Z[ce-2]),signalType:se.LINETYPE.OPT_START}),Z[ce-1].push({type:"optEnd",optText:se.parseMessage(Z[ce-2]),signalType:se.LINETYPE.OPT_END}),this.$=Z[ce-1];break;case 37:Z[ce-1].unshift({type:"altStart",altText:se.parseMessage(Z[ce-2]),signalType:se.LINETYPE.ALT_START}),Z[ce-1].push({type:"altEnd",signalType:se.LINETYPE.ALT_END}),this.$=Z[ce-1];break;case 38:Z[ce-1].unshift({type:"parStart",parText:se.parseMessage(Z[ce-2]),signalType:se.LINETYPE.PAR_START}),Z[ce-1].push({type:"parEnd",signalType:se.LINETYPE.PAR_END}),this.$=Z[ce-1];break;case 39:Z[ce-1].unshift({type:"parStart",parText:se.parseMessage(Z[ce-2]),signalType:se.LINETYPE.PAR_OVER_START}),Z[ce-1].push({type:"parEnd",signalType:se.LINETYPE.PAR_END}),this.$=Z[ce-1];break;case 40:Z[ce-1].unshift({type:"criticalStart",criticalText:se.parseMessage(Z[ce-2]),signalType:se.LINETYPE.CRITICAL_START}),Z[ce-1].push({type:"criticalEnd",signalType:se.LINETYPE.CRITICAL_END}),this.$=Z[ce-1];break;case 41:Z[ce-1].unshift({type:"breakStart",breakText:se.parseMessage(Z[ce-2]),signalType:se.LINETYPE.BREAK_START}),Z[ce-1].push({type:"breakEnd",optText:se.parseMessage(Z[ce-2]),signalType:se.LINETYPE.BREAK_END}),this.$=Z[ce-1];break;case 43:this.$=Z[ce-3].concat([{type:"option",optionText:se.parseMessage(Z[ce-1]),signalType:se.LINETYPE.CRITICAL_OPTION},Z[ce]]);break;case 45:this.$=Z[ce-3].concat([{type:"and",parText:se.parseMessage(Z[ce-1]),signalType:se.LINETYPE.PAR_AND},Z[ce]]);break;case 47:this.$=Z[ce-3].concat([{type:"else",altText:se.parseMessage(Z[ce-1]),signalType:se.LINETYPE.ALT_ELSE},Z[ce]]);break;case 48:Z[ce-3].draw="participant",Z[ce-3].type="addParticipant",Z[ce-3].description=se.parseMessage(Z[ce-1]),this.$=Z[ce-3];break;case 49:Z[ce-1].draw="participant",Z[ce-1].type="addParticipant",this.$=Z[ce-1];break;case 50:Z[ce-3].draw="actor",Z[ce-3].type="addParticipant",Z[ce-3].description=se.parseMessage(Z[ce-1]),this.$=Z[ce-3];break;case 51:Z[ce-1].draw="actor",Z[ce-1].type="addParticipant",this.$=Z[ce-1];break;case 52:Z[ce-1].type="destroyParticipant",this.$=Z[ce-1];break;case 53:this.$=[Z[ce-1],{type:"addNote",placement:Z[ce-2],actor:Z[ce-1].actor,text:Z[ce]}];break;case 54:Z[ce-2]=[].concat(Z[ce-1],Z[ce-1]).slice(0,2),Z[ce-2][0]=Z[ce-2][0].actor,Z[ce-2][1]=Z[ce-2][1].actor,this.$=[Z[ce-1],{type:"addNote",placement:se.PLACEMENT.OVER,actor:Z[ce-2].slice(0,2),text:Z[ce]}];break;case 55:this.$=[Z[ce-1],{type:"addLinks",actor:Z[ce-1].actor,text:Z[ce]}];break;case 56:this.$=[Z[ce-1],{type:"addALink",actor:Z[ce-1].actor,text:Z[ce]}];break;case 57:this.$=[Z[ce-1],{type:"addProperties",actor:Z[ce-1].actor,text:Z[ce]}];break;case 58:this.$=[Z[ce-1],{type:"addDetails",actor:Z[ce-1].actor,text:Z[ce]}];break;case 61:this.$=[Z[ce-2],Z[ce]];break;case 62:this.$=Z[ce];break;case 63:this.$=se.PLACEMENT.LEFTOF;break;case 64:this.$=se.PLACEMENT.RIGHTOF;break;case 65:this.$=[Z[ce-4],Z[ce-1],{type:"addMessage",from:Z[ce-4].actor,to:Z[ce-1].actor,signalType:Z[ce-3],msg:Z[ce],activate:!0},{type:"activeStart",signalType:se.LINETYPE.ACTIVE_START,actor:Z[ce-1].actor}];break;case 66:this.$=[Z[ce-4],Z[ce-1],{type:"addMessage",from:Z[ce-4].actor,to:Z[ce-1].actor,signalType:Z[ce-3],msg:Z[ce]},{type:"activeEnd",signalType:se.LINETYPE.ACTIVE_END,actor:Z[ce-4].actor}];break;case 67:this.$=[Z[ce-3],Z[ce-1],{type:"addMessage",from:Z[ce-3].actor,to:Z[ce-1].actor,signalType:Z[ce-2],msg:Z[ce]}];break;case 68:this.$={type:"addParticipant",actor:Z[ce]};break;case 69:this.$=se.LINETYPE.SOLID_OPEN;break;case 70:this.$=se.LINETYPE.DOTTED_OPEN;break;case 71:this.$=se.LINETYPE.SOLID;break;case 72:this.$=se.LINETYPE.BIDIRECTIONAL_SOLID;break;case 73:this.$=se.LINETYPE.DOTTED;break;case 74:this.$=se.LINETYPE.BIDIRECTIONAL_DOTTED;break;case 75:this.$=se.LINETYPE.SOLID_CROSS;break;case 76:this.$=se.LINETYPE.DOTTED_CROSS;break;case 77:this.$=se.LINETYPE.SOLID_POINT;break;case 78:this.$=se.LINETYPE.DOTTED_POINT;break;case 79:this.$=se.parseMessage(Z[ce].trim().substring(1));break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,13,14,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,12:12,13:l,14:u,17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:C,41:T,43:E,44:A,46:S,50:_,52:I,53:D,54:k,59:L,60:R,61:O,62:M,70:B},t(F,[2,5]),{9:47,12:12,13:l,14:u,17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:C,41:T,43:E,44:A,46:S,50:_,52:I,53:D,54:k,59:L,60:R,61:O,62:M,70:B},t(F,[2,7]),t(F,[2,8]),t(F,[2,14]),{12:48,50:_,52:I,53:D},{15:[1,49]},{5:[1,50]},{5:[1,53],19:[1,51],20:[1,52]},{22:54,70:B},{22:55,70:B},{5:[1,56]},{5:[1,57]},{5:[1,58]},{5:[1,59]},{5:[1,60]},t(F,[2,29]),t(F,[2,30]),{32:[1,61]},{34:[1,62]},t(F,[2,33]),{15:[1,63]},{15:[1,64]},{15:[1,65]},{15:[1,66]},{15:[1,67]},{15:[1,68]},{15:[1,69]},{15:[1,70]},{22:71,70:B},{22:72,70:B},{22:73,70:B},{67:74,71:[1,75],72:[1,76],73:[1,77],74:[1,78],75:[1,79],76:[1,80],77:[1,81],78:[1,82],79:[1,83],80:[1,84]},{55:85,57:[1,86],65:[1,87],66:[1,88]},{22:89,70:B},{22:90,70:B},{22:91,70:B},{22:92,70:B},t([5,51,64,71,72,73,74,75,76,77,78,79,80,81],[2,68]),t(F,[2,6]),t(F,[2,15]),t(P,[2,9],{10:93}),t(F,[2,17]),{5:[1,95],19:[1,94]},{5:[1,96]},t(F,[2,21]),{5:[1,97]},{5:[1,98]},t(F,[2,24]),t(F,[2,25]),t(F,[2,26]),t(F,[2,27]),t(F,[2,28]),t(F,[2,31]),t(F,[2,32]),t(z,i,{7:99}),t(z,i,{7:100}),t(z,i,{7:101}),t($,i,{40:102,7:103}),t(H,i,{42:104,7:105}),t(H,i,{7:105,42:106}),t(Q,i,{45:107,7:108}),t(z,i,{7:109}),{5:[1,111],51:[1,110]},{5:[1,113],51:[1,112]},{5:[1,114]},{22:117,68:[1,115],69:[1,116],70:B},t(j,[2,69]),t(j,[2,70]),t(j,[2,71]),t(j,[2,72]),t(j,[2,73]),t(j,[2,74]),t(j,[2,75]),t(j,[2,76]),t(j,[2,77]),t(j,[2,78]),{22:118,70:B},{22:120,58:119,70:B},{70:[2,63]},{70:[2,64]},{56:121,81:ie},{56:123,81:ie},{56:124,81:ie},{56:125,81:ie},{4:[1,128],5:[1,130],11:127,12:129,16:[1,126],50:_,52:I,53:D},{5:[1,131]},t(F,[2,19]),t(F,[2,20]),t(F,[2,22]),t(F,[2,23]),{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,132],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:C,41:T,43:E,44:A,46:S,50:_,52:I,53:D,54:k,59:L,60:R,61:O,62:M,70:B},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,133],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:C,41:T,43:E,44:A,46:S,50:_,52:I,53:D,54:k,59:L,60:R,61:O,62:M,70:B},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,134],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:C,41:T,43:E,44:A,46:S,50:_,52:I,53:D,54:k,59:L,60:R,61:O,62:M,70:B},{16:[1,135]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,46],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:C,41:T,43:E,44:A,46:S,49:[1,136],50:_,52:I,53:D,54:k,59:L,60:R,61:O,62:M,70:B},{16:[1,137]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,44],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:C,41:T,43:E,44:A,46:S,48:[1,138],50:_,52:I,53:D,54:k,59:L,60:R,61:O,62:M,70:B},{16:[1,139]},{16:[1,140]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,42],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:C,41:T,43:E,44:A,46:S,47:[1,141],50:_,52:I,53:D,54:k,59:L,60:R,61:O,62:M,70:B},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,142],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:w,39:C,41:T,43:E,44:A,46:S,50:_,52:I,53:D,54:k,59:L,60:R,61:O,62:M,70:B},{15:[1,143]},t(F,[2,49]),{15:[1,144]},t(F,[2,51]),t(F,[2,52]),{22:145,70:B},{22:146,70:B},{56:147,81:ie},{56:148,81:ie},{56:149,81:ie},{64:[1,150],81:[2,62]},{5:[2,55]},{5:[2,79]},{5:[2,56]},{5:[2,57]},{5:[2,58]},t(F,[2,16]),t(P,[2,10]),{12:151,50:_,52:I,53:D},t(P,[2,12]),t(P,[2,13]),t(F,[2,18]),t(F,[2,34]),t(F,[2,35]),t(F,[2,36]),t(F,[2,37]),{15:[1,152]},t(F,[2,38]),{15:[1,153]},t(F,[2,39]),t(F,[2,40]),{15:[1,154]},t(F,[2,41]),{5:[1,155]},{5:[1,156]},{56:157,81:ie},{56:158,81:ie},{5:[2,67]},{5:[2,53]},{5:[2,54]},{22:159,70:B},t(P,[2,11]),t($,i,{7:103,40:160}),t(H,i,{7:105,42:161}),t(Q,i,{7:108,45:162}),t(F,[2,48]),t(F,[2,50]),{5:[2,65]},{5:[2,66]},{81:[2,61]},{16:[2,47]},{16:[2,45]},{16:[2,43]}],defaultActions:{5:[2,1],6:[2,2],87:[2,63],88:[2,64],121:[2,55],122:[2,79],123:[2,56],124:[2,57],125:[2,58],147:[2,67],148:[2,53],149:[2,54],157:[2,65],158:[2,66],159:[2,61],160:[2,47],161:[2,45],162:[2,43]},parseError:o(function(X,te){if(te.recoverable)this.trace(X);else{var J=new Error(X);throw J.hash=te,J}},"parseError"),parse:o(function(X){var te=this,J=[0],se=[],ue=[null],Z=[],Se=this.table,ce="",ae=0,Oe=0,ge=0,ze=2,He=1,$e=Z.slice.call(arguments,1),Re=Object.create(this.lexer),Ie={yy:{}};for(var be in this.yy)Object.prototype.hasOwnProperty.call(this.yy,be)&&(Ie.yy[be]=this.yy[be]);Re.setInput(X,Ie.yy),Ie.yy.lexer=Re,Ie.yy.parser=this,typeof Re.yylloc>"u"&&(Re.yylloc={});var W=Re.yylloc;Z.push(W);var de=Re.options&&Re.options.ranges;typeof Ie.yy.parseError=="function"?this.parseError=Ie.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function re(Rt){J.length=J.length-2*Rt,ue.length=ue.length-Rt,Z.length=Z.length-Rt}o(re,"popStack");function oe(){var Rt;return Rt=se.pop()||Re.lex()||He,typeof Rt!="number"&&(Rt instanceof Array&&(se=Rt,Rt=se.pop()),Rt=te.symbols_[Rt]||Rt),Rt}o(oe,"lex");for(var V,xe,q,pe,ve,Pe,_e={},we,Ve,De,qe;;){if(q=J[J.length-1],this.defaultActions[q]?pe=this.defaultActions[q]:((V===null||typeof V>"u")&&(V=oe()),pe=Se[q]&&Se[q][V]),typeof pe>"u"||!pe.length||!pe[0]){var at="";qe=[];for(we in Se[q])this.terminals_[we]&&we>ze&&qe.push("'"+this.terminals_[we]+"'");Re.showPosition?at="Parse error on line "+(ae+1)+`: +`+Re.showPosition()+` +Expecting `+qe.join(", ")+", got '"+(this.terminals_[V]||V)+"'":at="Parse error on line "+(ae+1)+": Unexpected "+(V==He?"end of input":"'"+(this.terminals_[V]||V)+"'"),this.parseError(at,{text:Re.match,token:this.terminals_[V]||V,line:Re.yylineno,loc:W,expected:qe})}if(pe[0]instanceof Array&&pe.length>1)throw new Error("Parse Error: multiple actions possible at state: "+q+", token: "+V);switch(pe[0]){case 1:J.push(V),ue.push(Re.yytext),Z.push(Re.yylloc),J.push(pe[1]),V=null,xe?(V=xe,xe=null):(Oe=Re.yyleng,ce=Re.yytext,ae=Re.yylineno,W=Re.yylloc,ge>0&&ge--);break;case 2:if(Ve=this.productions_[pe[1]][1],_e.$=ue[ue.length-Ve],_e._$={first_line:Z[Z.length-(Ve||1)].first_line,last_line:Z[Z.length-1].last_line,first_column:Z[Z.length-(Ve||1)].first_column,last_column:Z[Z.length-1].last_column},de&&(_e._$.range=[Z[Z.length-(Ve||1)].range[0],Z[Z.length-1].range[1]]),Pe=this.performAction.apply(_e,[ce,Oe,ae,Ie.yy,pe[1],ue,Z].concat($e)),typeof Pe<"u")return Pe;Ve&&(J=J.slice(0,-1*Ve*2),ue=ue.slice(0,-1*Ve),Z=Z.slice(0,-1*Ve)),J.push(this.productions_[pe[1]][0]),ue.push(_e.$),Z.push(_e._$),De=Se[J[J.length-2]][J[J.length-1]],J.push(De);break;case 3:return!0}}return!0},"parse")},le=function(){var K={EOF:1,parseError:o(function(te,J){if(this.yy.parser)this.yy.parser.parseError(te,J);else throw new Error(te)},"parseError"),setInput:o(function(X,te){return this.yy=te||this.yy||{},this._input=X,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var X=this._input[0];this.yytext+=X,this.yyleng++,this.offset++,this.match+=X,this.matched+=X;var te=X.match(/(?:\r\n?|\n).*/g);return te?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),X},"input"),unput:o(function(X){var te=X.length,J=X.split(/(?:\r\n?|\n)/g);this._input=X+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-te),this.offset-=te;var se=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),J.length-1&&(this.yylineno-=J.length-1);var ue=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:J?(J.length===se.length?this.yylloc.first_column:0)+se[se.length-J.length].length-J[0].length:this.yylloc.first_column-te},this.options.ranges&&(this.yylloc.range=[ue[0],ue[0]+this.yyleng-te]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(X){this.unput(this.match.slice(X))},"less"),pastInput:o(function(){var X=this.matched.substr(0,this.matched.length-this.match.length);return(X.length>20?"...":"")+X.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var X=this.match;return X.length<20&&(X+=this._input.substr(0,20-X.length)),(X.substr(0,20)+(X.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var X=this.pastInput(),te=new Array(X.length+1).join("-");return X+this.upcomingInput()+` +`+te+"^"},"showPosition"),test_match:o(function(X,te){var J,se,ue;if(this.options.backtrack_lexer&&(ue={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(ue.yylloc.range=this.yylloc.range.slice(0))),se=X[0].match(/(?:\r\n?|\n).*/g),se&&(this.yylineno+=se.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:se?se[se.length-1].length-se[se.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+X[0].length},this.yytext+=X[0],this.match+=X[0],this.matches=X,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(X[0].length),this.matched+=X[0],J=this.performAction.call(this,this.yy,this,te,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),J)return J;if(this._backtrack){for(var Z in ue)this[Z]=ue[Z];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var X,te,J,se;this._more||(this.yytext="",this.match="");for(var ue=this._currentRules(),Z=0;Zte[0].length)){if(te=J,se=Z,this.options.backtrack_lexer){if(X=this.test_match(J,ue[Z]),X!==!1)return X;if(this._backtrack){te=!1;continue}else return!1}else if(!this.options.flex)break}return te?(X=this.test_match(te,ue[se]),X!==!1?X:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var te=this.next();return te||this.lex()},"lex"),begin:o(function(te){this.conditionStack.push(te)},"begin"),popState:o(function(){var te=this.conditionStack.length-1;return te>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(te){return te=this.conditionStack.length-1-Math.abs(te||0),te>=0?this.conditionStack[te]:"INITIAL"},"topState"),pushState:o(function(te){this.begin(te)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(te,J,se,ue){var Z=ue;switch(se){case 0:return 5;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:return 19;case 7:return this.begin("LINE"),14;break;case 8:return this.begin("ID"),50;break;case 9:return this.begin("ID"),52;break;case 10:return 13;case 11:return this.begin("ID"),53;break;case 12:return J.yytext=J.yytext.trim(),this.begin("ALIAS"),70;break;case 13:return this.popState(),this.popState(),this.begin("LINE"),51;break;case 14:return this.popState(),this.popState(),5;break;case 15:return this.begin("LINE"),36;break;case 16:return this.begin("LINE"),37;break;case 17:return this.begin("LINE"),38;break;case 18:return this.begin("LINE"),39;break;case 19:return this.begin("LINE"),49;break;case 20:return this.begin("LINE"),41;break;case 21:return this.begin("LINE"),43;break;case 22:return this.begin("LINE"),48;break;case 23:return this.begin("LINE"),44;break;case 24:return this.begin("LINE"),47;break;case 25:return this.begin("LINE"),46;break;case 26:return this.popState(),15;break;case 27:return 16;case 28:return 65;case 29:return 66;case 30:return 59;case 31:return 60;case 32:return 61;case 33:return 62;case 34:return 57;case 35:return 54;case 36:return this.begin("ID"),21;break;case 37:return this.begin("ID"),23;break;case 38:return 29;case 39:return 30;case 40:return this.begin("acc_title"),31;break;case 41:return this.popState(),"acc_title_value";break;case 42:return this.begin("acc_descr"),33;break;case 43:return this.popState(),"acc_descr_value";break;case 44:this.begin("acc_descr_multiline");break;case 45:this.popState();break;case 46:return"acc_descr_multiline_value";case 47:return 6;case 48:return 18;case 49:return 20;case 50:return 64;case 51:return 5;case 52:return J.yytext=J.yytext.trim(),70;break;case 53:return 73;case 54:return 74;case 55:return 75;case 56:return 76;case 57:return 71;case 58:return 72;case 59:return 77;case 60:return 78;case 61:return 79;case 62:return 80;case 63:return 81;case 64:return 68;case 65:return 69;case 66:return 5;case 67:return"INVALID"}},"anonymous"),rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:box\b)/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:create\b)/i,/^(?:destroy\b)/i,/^(?:[^\<->\->:\n,;]+?([\-]*[^\<->\->:\n,;]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:par_over\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\<->\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+\<->\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:<<->>)/i,/^(?:-->>)/i,/^(?:<<-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[45,46],inclusive:!1},acc_descr:{rules:[43],inclusive:!1},acc_title:{rules:[41],inclusive:!1},ID:{rules:[2,3,12],inclusive:!1},ALIAS:{rules:[2,3,13,14],inclusive:!1},LINE:{rules:[2,3,26],inclusive:!1},INITIAL:{rules:[0,1,3,4,5,6,7,8,9,10,11,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36,37,38,39,40,42,44,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67],inclusive:!0}}};return K}();ne.lexer=le;function he(){this.yy={}}return o(he,"Parser"),he.prototype=ne,ne.Parser=he,new he}();CO.parser=CO;lfe=CO});var iVe,aVe,sVe,_6,ufe=N(()=>{"use strict";zt();vt();s6();gr();mi();iVe={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31,PAR_OVER_START:32,BIDIRECTIONAL_SOLID:33,BIDIRECTIONAL_DOTTED:34},aVe={FILLED:0,OPEN:1},sVe={LEFTOF:0,RIGHTOF:1,OVER:2},_6=class{constructor(){this.state=new pf(()=>({prevActor:void 0,actors:new Map,createdActors:new Map,destroyedActors:new Map,boxes:[],messages:[],notes:[],sequenceNumbersEnabled:!1,wrapEnabled:void 0,currentBox:void 0,lastCreated:void 0,lastDestroyed:void 0}));this.setAccTitle=Lr;this.setAccDescription=Nr;this.setDiagramTitle=$r;this.getAccTitle=Rr;this.getAccDescription=Mr;this.getDiagramTitle=Ir;this.apply=this.apply.bind(this),this.parseBoxData=this.parseBoxData.bind(this),this.parseMessage=this.parseMessage.bind(this),this.clear(),this.setWrap(me().wrap),this.LINETYPE=iVe,this.ARROWTYPE=aVe,this.PLACEMENT=sVe}static{o(this,"SequenceDB")}addBox(e){this.state.records.boxes.push({name:e.text,wrap:e.wrap??this.autoWrap(),fill:e.color,actorKeys:[]}),this.state.records.currentBox=this.state.records.boxes.slice(-1)[0]}addActor(e,r,n,i){let a=this.state.records.currentBox,s=this.state.records.actors.get(e);if(s){if(this.state.records.currentBox&&s.box&&this.state.records.currentBox!==s.box)throw new Error(`A same participant should only be defined in one Box: ${s.name} can't be in '${s.box.name}' and in '${this.state.records.currentBox.name}' at the same time.`);if(a=s.box?s.box:this.state.records.currentBox,s.box=a,s&&r===s.name&&n==null)return}if(n?.text==null&&(n={text:r,type:i}),(i==null||n.text==null)&&(n={text:r,type:i}),this.state.records.actors.set(e,{box:a,name:r,description:n.text,wrap:n.wrap??this.autoWrap(),prevActor:this.state.records.prevActor,links:{},properties:{},actorCnt:null,rectData:null,type:i??"participant"}),this.state.records.prevActor){let l=this.state.records.actors.get(this.state.records.prevActor);l&&(l.nextActor=e)}this.state.records.currentBox&&this.state.records.currentBox.actorKeys.push(e),this.state.records.prevActor=e}activationCount(e){let r,n=0;if(!e)return 0;for(r=0;r>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},l}return this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:e,to:r,message:n?.text??"",wrap:n?.wrap??this.autoWrap(),type:i,activate:a}),!0}hasAtLeastOneBox(){return this.state.records.boxes.length>0}hasAtLeastOneBoxWithTitle(){return this.state.records.boxes.some(e=>e.name)}getMessages(){return this.state.records.messages}getBoxes(){return this.state.records.boxes}getActors(){return this.state.records.actors}getCreatedActors(){return this.state.records.createdActors}getDestroyedActors(){return this.state.records.destroyedActors}getActor(e){return this.state.records.actors.get(e)}getActorKeys(){return[...this.state.records.actors.keys()]}enableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!0}disableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!1}showSequenceNumbers(){return this.state.records.sequenceNumbersEnabled}setWrap(e){this.state.records.wrapEnabled=e}extractWrap(e){if(e===void 0)return{};e=e.trim();let r=/^:?wrap:/.exec(e)!==null?!0:/^:?nowrap:/.exec(e)!==null?!1:void 0;return{cleanedText:(r===void 0?e:e.replace(/^:?(?:no)?wrap:/,"")).trim(),wrap:r}}autoWrap(){return this.state.records.wrapEnabled!==void 0?this.state.records.wrapEnabled:me().sequence?.wrap??!1}clear(){this.state.reset(),Ar()}parseMessage(e){let r=e.trim(),{wrap:n,cleanedText:i}=this.extractWrap(r),a={text:i,wrap:n};return Y.debug(`parseMessage: ${JSON.stringify(a)}`),a}parseBoxData(e){let r=/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/.exec(e),n=r?.[1]?r[1].trim():"transparent",i=r?.[2]?r[2].trim():void 0;if(window?.CSS)window.CSS.supports("color",n)||(n="transparent",i=e.trim());else{let l=new Option().style;l.color=n,l.color!==n&&(n="transparent",i=e.trim())}let{wrap:a,cleanedText:s}=this.extractWrap(i);return{text:s?Tr(s,me()):void 0,color:n,wrap:a}}addNote(e,r,n){let i={actor:e,placement:r,message:n.text,wrap:n.wrap??this.autoWrap()},a=[].concat(e,e);this.state.records.notes.push(i),this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:a[0],to:a[1],message:n.text,wrap:n.wrap??this.autoWrap(),type:this.LINETYPE.NOTE,placement:r})}addLinks(e,r){let n=this.getActor(e);try{let i=Tr(r.text,me());i=i.replace(/=/g,"="),i=i.replace(/&/g,"&");let a=JSON.parse(i);this.insertLinks(n,a)}catch(i){Y.error("error while parsing actor link text",i)}}addALink(e,r){let n=this.getActor(e);try{let i={},a=Tr(r.text,me()),s=a.indexOf("@");a=a.replace(/=/g,"="),a=a.replace(/&/g,"&");let l=a.slice(0,s-1).trim(),u=a.slice(s+1).trim();i[l]=u,this.insertLinks(n,i)}catch(i){Y.error("error while parsing actor link text",i)}}insertLinks(e,r){if(e.links==null)e.links=r;else for(let n in r)e.links[n]=r[n]}addProperties(e,r){let n=this.getActor(e);try{let i=Tr(r.text,me()),a=JSON.parse(i);this.insertProperties(n,a)}catch(i){Y.error("error while parsing actor properties text",i)}}insertProperties(e,r){if(e.properties==null)e.properties=r;else for(let n in r)e.properties[n]=r[n]}boxEnd(){this.state.records.currentBox=void 0}addDetails(e,r){let n=this.getActor(e),i=document.getElementById(r.text);try{let a=i.innerHTML,s=JSON.parse(a);s.properties&&this.insertProperties(n,s.properties),s.links&&this.insertLinks(n,s.links)}catch(a){Y.error("error while parsing actor details text",a)}}getActorProperty(e,r){if(e?.properties!==void 0)return e.properties[r]}apply(e){if(Array.isArray(e))e.forEach(r=>{this.apply(r)});else switch(e.type){case"sequenceIndex":this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:void 0,to:void 0,message:{start:e.sequenceIndex,step:e.sequenceIndexStep,visible:e.sequenceVisible},wrap:!1,type:e.signalType});break;case"addParticipant":this.addActor(e.actor,e.actor,e.description,e.draw);break;case"createParticipant":if(this.state.records.actors.has(e.actor))throw new Error("It is not possible to have actors with the same id, even if one is destroyed before the next is created. Use 'AS' aliases to simulate the behavior");this.state.records.lastCreated=e.actor,this.addActor(e.actor,e.actor,e.description,e.draw),this.state.records.createdActors.set(e.actor,this.state.records.messages.length);break;case"destroyParticipant":this.state.records.lastDestroyed=e.actor,this.state.records.destroyedActors.set(e.actor,this.state.records.messages.length);break;case"activeStart":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"activeEnd":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"addNote":this.addNote(e.actor,e.placement,e.text);break;case"addLinks":this.addLinks(e.actor,e.text);break;case"addALink":this.addALink(e.actor,e.text);break;case"addProperties":this.addProperties(e.actor,e.text);break;case"addDetails":this.addDetails(e.actor,e.text);break;case"addMessage":if(this.state.records.lastCreated){if(e.to!==this.state.records.lastCreated)throw new Error("The created participant "+this.state.records.lastCreated.name+" does not have an associated creating message after its declaration. Please check the sequence diagram.");this.state.records.lastCreated=void 0}else if(this.state.records.lastDestroyed){if(e.to!==this.state.records.lastDestroyed&&e.from!==this.state.records.lastDestroyed)throw new Error("The destroyed participant "+this.state.records.lastDestroyed.name+" does not have an associated destroying message after its declaration. Please check the sequence diagram.");this.state.records.lastDestroyed=void 0}this.addSignal(e.from,e.to,e.msg,e.signalType,e.activate);break;case"boxStart":this.addBox(e.boxData);break;case"boxEnd":this.boxEnd();break;case"loopStart":this.addSignal(void 0,void 0,e.loopText,e.signalType);break;case"loopEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"rectStart":this.addSignal(void 0,void 0,e.color,e.signalType);break;case"rectEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"optStart":this.addSignal(void 0,void 0,e.optText,e.signalType);break;case"optEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"altStart":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"else":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"altEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"setAccTitle":Lr(e.text);break;case"parStart":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"and":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"parEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"criticalStart":this.addSignal(void 0,void 0,e.criticalText,e.signalType);break;case"option":this.addSignal(void 0,void 0,e.optionText,e.signalType);break;case"criticalEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"breakStart":this.addSignal(void 0,void 0,e.breakText,e.signalType);break;case"breakEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break}}getConfig(){return me().sequence}}});var oVe,hfe,ffe=N(()=>{"use strict";oVe=o(t=>`.actor { + stroke: ${t.actorBorder}; + fill: ${t.actorBkg}; + } + + text.actor > tspan { + fill: ${t.actorTextColor}; + stroke: none; + } + + .actor-line { + stroke: ${t.actorLineColor}; + } + + .messageLine0 { + stroke-width: 1.5; + stroke-dasharray: none; + stroke: ${t.signalColor}; + } + + .messageLine1 { + stroke-width: 1.5; + stroke-dasharray: 2, 2; + stroke: ${t.signalColor}; + } + + #arrowhead path { + fill: ${t.signalColor}; + stroke: ${t.signalColor}; + } + + .sequenceNumber { + fill: ${t.sequenceNumberColor}; + } + + #sequencenumber { + fill: ${t.signalColor}; + } + + #crosshead path { + fill: ${t.signalColor}; + stroke: ${t.signalColor}; + } + + .messageText { + fill: ${t.signalTextColor}; + stroke: none; + } + + .labelBox { + stroke: ${t.labelBoxBorderColor}; + fill: ${t.labelBoxBkgColor}; + } + + .labelText, .labelText > tspan { + fill: ${t.labelTextColor}; + stroke: none; + } + + .loopText, .loopText > tspan { + fill: ${t.loopTextColor}; + stroke: none; + } + + .loopLine { + stroke-width: 2px; + stroke-dasharray: 2, 2; + stroke: ${t.labelBoxBorderColor}; + fill: ${t.labelBoxBorderColor}; + } + + .note { + //stroke: #decc93; + stroke: ${t.noteBorderColor}; + fill: ${t.noteBkgColor}; + } + + .noteText, .noteText > tspan { + fill: ${t.noteTextColor}; + stroke: none; + } + + .activation0 { + fill: ${t.activationBkgColor}; + stroke: ${t.activationBorderColor}; + } + + .activation1 { + fill: ${t.activationBkgColor}; + stroke: ${t.activationBorderColor}; + } + + .activation2 { + fill: ${t.activationBkgColor}; + stroke: ${t.activationBorderColor}; + } + + .actorPopupMenu { + position: absolute; + } + + .actorPopupMenuPanel { + position: absolute; + fill: ${t.actorBkg}; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4)); +} + .actor-man line { + stroke: ${t.actorBorder}; + fill: ${t.actorBkg}; + } + .actor-man circle, line { + stroke: ${t.actorBorder}; + fill: ${t.actorBkg}; + stroke-width: 2px; + } +`,"getStyles"),hfe=oVe});var AO,vf,pfe,mfe,lVe,dfe,_O,cVe,uVe,Tb,_p,gfe,Uc,DO,hVe,fVe,dVe,pVe,mVe,gVe,yVe,yfe,vVe,xVe,bVe,wVe,TVe,kVe,EVe,vfe,SVe,LO,CVe,hi,xfe=N(()=>{"use strict";gr();Wv();ir();AO=Sa(z0(),1);ji();vf=18*2,pfe="actor-top",mfe="actor-bottom",lVe="actor-box",dfe="actor-man",_O=o(function(t,e){return kd(t,e)},"drawRect"),cVe=o(function(t,e,r,n,i){if(e.links===void 0||e.links===null||Object.keys(e.links).length===0)return{height:0,width:0};let a=e.links,s=e.actorCnt,l=e.rectData;var u="none";i&&(u="block !important");let h=t.append("g");h.attr("id","actor"+s+"_popup"),h.attr("class","actorPopupMenu"),h.attr("display",u);var f="";l.class!==void 0&&(f=" "+l.class);let d=l.width>r?l.width:r,p=h.append("rect");if(p.attr("class","actorPopupMenuPanel"+f),p.attr("x",l.x),p.attr("y",l.height),p.attr("fill",l.fill),p.attr("stroke",l.stroke),p.attr("width",d),p.attr("height",l.height),p.attr("rx",l.rx),p.attr("ry",l.ry),a!=null){var m=20;for(let v in a){var g=h.append("a"),y=(0,AO.sanitizeUrl)(a[v]);g.attr("xlink:href",y),g.attr("target","_blank"),CVe(n)(v,g,l.x+10,l.height+m,d,20,{class:"actor"},n),m+=30}}return p.attr("height",m),{height:l.height+m,width:d}},"drawPopup"),uVe=o(function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }"},"popupMenuToggle"),Tb=o(async function(t,e,r=null){let n=t.append("foreignObject"),i=await mh(e.text,cr()),s=n.append("xhtml:div").attr("style","width: fit-content;").attr("xmlns","http://www.w3.org/1999/xhtml").html(i).node().getBoundingClientRect();if(n.attr("height",Math.round(s.height)).attr("width",Math.round(s.width)),e.class==="noteText"){let l=t.node().firstChild;l.setAttribute("height",s.height+2*e.textMargin);let u=l.getBBox();n.attr("x",Math.round(u.x+u.width/2-s.width/2)).attr("y",Math.round(u.y+u.height/2-s.height/2))}else if(r){let{startx:l,stopx:u,starty:h}=r;if(l>u){let f=l;l=u,u=f}n.attr("x",Math.round(l+Math.abs(l-u)/2-s.width/2)),e.class==="loopText"?n.attr("y",Math.round(h)):n.attr("y",Math.round(h-s.height))}return[n]},"drawKatex"),_p=o(function(t,e){let r=0,n=0,i=e.text.split(Ze.lineBreakRegex),[a,s]=Bo(e.fontSize),l=[],u=0,h=o(()=>e.y,"yfunc");if(e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0)switch(e.valign){case"top":case"start":h=o(()=>Math.round(e.y+e.textMargin),"yfunc");break;case"middle":case"center":h=o(()=>Math.round(e.y+(r+n+e.textMargin)/2),"yfunc");break;case"bottom":case"end":h=o(()=>Math.round(e.y+(r+n+2*e.textMargin)-e.textMargin),"yfunc");break}if(e.anchor!==void 0&&e.textMargin!==void 0&&e.width!==void 0)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="middle",e.alignmentBaseline="middle";break}for(let[f,d]of i.entries()){e.textMargin!==void 0&&e.textMargin===0&&a!==void 0&&(u=f*a);let p=t.append("text");p.attr("x",e.x),p.attr("y",h()),e.anchor!==void 0&&p.attr("text-anchor",e.anchor).attr("dominant-baseline",e.dominantBaseline).attr("alignment-baseline",e.alignmentBaseline),e.fontFamily!==void 0&&p.style("font-family",e.fontFamily),s!==void 0&&p.style("font-size",s),e.fontWeight!==void 0&&p.style("font-weight",e.fontWeight),e.fill!==void 0&&p.attr("fill",e.fill),e.class!==void 0&&p.attr("class",e.class),e.dy!==void 0?p.attr("dy",e.dy):u!==0&&p.attr("dy",u);let m=d||H9;if(e.tspan){let g=p.append("tspan");g.attr("x",e.x),e.fill!==void 0&&g.attr("fill",e.fill),g.text(m)}else p.text(m);e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0&&(n+=(p._groups||p)[0][0].getBBox().height,r=n),l.push(p)}return l},"drawText"),gfe=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");return n.attr("points",r(e.x,e.y,e.width,e.height,7)),n.attr("class","labelBox"),e.y=e.y+e.height/2,_p(t,e),n},"drawLabel"),Uc=-1,DO=o((t,e,r,n)=>{t.select&&r.forEach(i=>{let a=e.get(i),s=t.select("#actor"+a.actorCnt);!n.mirrorActors&&a.stopy?s.attr("y2",a.stopy+a.height/2):n.mirrorActors&&s.attr("y2",a.stopy)})},"fixLifeLineHeights"),hVe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height,l=t.append("g").lower();var u=l;n||(Uc++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",uVe(`actor${Uc}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Uc).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Uc,e.links!=null&&u.attr("id","root-"+Uc));let h=Tl();var f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${mfe}`:f+=` ${pfe}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.rx=3,h.ry=3,h.name=e.name;let d=_O(u,h);if(e.rectData=h,e.properties?.icon){let m=e.properties.icon.trim();m.charAt(0)==="@"?Iq(u,h.x+h.width-20,h.y+10,m.substr(1)):Mq(u,h.x+h.width-20,h.y+10,m)}LO(r,pi(e.description))(e.description,u,h.x,h.y,h.width,h.height,{class:`actor ${lVe}`},r);let p=e.height;if(d.node){let m=d.node().getBBox();e.height=m.height,p=m.height}return p},"drawActorTypeParticipant"),fVe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+80,l=t.append("g").lower();n||(Uc++,l.append("line").attr("id","actor"+Uc).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Uc);let u=t.append("g"),h=dfe;n?h+=` ${mfe}`:h+=` ${pfe}`,u.attr("class",h),u.attr("name",e.name);let f=Tl();f.x=e.x,f.y=i,f.fill="#eaeaea",f.width=e.width,f.height=e.height,f.class="actor",f.rx=3,f.ry=3,u.append("line").attr("id","actor-man-torso"+Uc).attr("x1",a).attr("y1",i+25).attr("x2",a).attr("y2",i+45),u.append("line").attr("id","actor-man-arms"+Uc).attr("x1",a-vf/2).attr("y1",i+33).attr("x2",a+vf/2).attr("y2",i+33),u.append("line").attr("x1",a-vf/2).attr("y1",i+60).attr("x2",a).attr("y2",i+45),u.append("line").attr("x1",a).attr("y1",i+45).attr("x2",a+vf/2-2).attr("y2",i+60);let d=u.append("circle");d.attr("cx",e.x+e.width/2),d.attr("cy",i+10),d.attr("r",15),d.attr("width",e.width),d.attr("height",e.height);let p=u.node().getBBox();return e.height=p.height,LO(r,pi(e.description))(e.description,u,f.x,f.y+35,f.width,f.height,{class:`actor ${dfe}`},r),e.height},"drawActorTypeActor"),dVe=o(async function(t,e,r,n){switch(e.type){case"actor":return await fVe(t,e,r,n);case"participant":return await hVe(t,e,r,n)}},"drawActor"),pVe=o(function(t,e,r){let i=t.append("g");yfe(i,e),e.name&&LO(r)(e.name,i,e.x,e.y+(e.textMaxHeight||0)/2,e.width,0,{class:"text"},r),i.lower()},"drawBox"),mVe=o(function(t){return t.append("g")},"anchorElement"),gVe=o(function(t,e,r,n,i){let a=Tl(),s=e.anchored;a.x=e.startx,a.y=e.starty,a.class="activation"+i%3,a.width=e.stopx-e.startx,a.height=r-e.starty,_O(s,a)},"drawActivation"),yVe=o(async function(t,e,r,n){let{boxMargin:i,boxTextMargin:a,labelBoxHeight:s,labelBoxWidth:l,messageFontFamily:u,messageFontSize:h,messageFontWeight:f}=n,d=t.append("g"),p=o(function(y,v,x,b){return d.append("line").attr("x1",y).attr("y1",v).attr("x2",x).attr("y2",b).attr("class","loopLine")},"drawLoopLine");p(e.startx,e.starty,e.stopx,e.starty),p(e.stopx,e.starty,e.stopx,e.stopy),p(e.startx,e.stopy,e.stopx,e.stopy),p(e.startx,e.starty,e.startx,e.stopy),e.sections!==void 0&&e.sections.forEach(function(y){p(e.startx,y.y,e.stopx,y.y).style("stroke-dasharray","3, 3")});let m=Hv();m.text=r,m.x=e.startx,m.y=e.starty,m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.anchor="middle",m.valign="middle",m.tspan=!1,m.width=l||50,m.height=s||20,m.textMargin=a,m.class="labelText",gfe(d,m),m=vfe(),m.text=e.title,m.x=e.startx+l/2+(e.stopx-e.startx)/2,m.y=e.starty+i+a,m.anchor="middle",m.valign="middle",m.textMargin=a,m.class="loopText",m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.wrap=!0;let g=pi(m.text)?await Tb(d,m,e):_p(d,m);if(e.sectionTitles!==void 0){for(let[y,v]of Object.entries(e.sectionTitles))if(v.message){m.text=v.message,m.x=e.startx+(e.stopx-e.startx)/2,m.y=e.sections[y].y+i+a,m.class="loopText",m.anchor="middle",m.valign="middle",m.tspan=!1,m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.wrap=e.wrap,pi(m.text)?(e.starty=e.sections[y].y,await Tb(d,m,e)):_p(d,m);let x=Math.round(g.map(b=>(b._groups||b)[0][0].getBBox().height).reduce((b,w)=>b+w));e.sections[y].height+=x-(i+a)}}return e.height=Math.round(e.stopy-e.starty),d},"drawLoop"),yfe=o(function(t,e){q5(t,e)},"drawBackgroundRect"),vVe=o(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),xVe=o(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),bVe=o(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),wVe=o(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",7.9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto-start-reverse").append("path").attr("d","M -1 0 L 10 5 L 0 10 z")},"insertArrowHead"),TVe=o(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",15.5).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),kVe=o(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertSequenceNumber"),EVe=o(function(t){t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",4.5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},"insertArrowCrossHead"),vfe=o(function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},"getTextObj"),SVe=o(function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),LO=function(){function t(a,s,l,u,h,f,d){let p=s.append("text").attr("x",l+h/2).attr("y",u+f/2+5).style("text-anchor","middle").text(a);i(p,d)}o(t,"byText");function e(a,s,l,u,h,f,d,p){let{actorFontSize:m,actorFontFamily:g,actorFontWeight:y}=p,[v,x]=Bo(m),b=a.split(Ze.lineBreakRegex);for(let w=0;w{let s=Dp(Ne),l=a.actorKeys.reduce((f,d)=>f+=t.get(d).width+(t.get(d).margin||0),0);l-=2*Ne.boxTextMargin,a.wrap&&(a.name=Gt.wrapLabel(a.name,l-2*Ne.wrapPadding,s));let u=Gt.calculateTextDimensions(a.name,s);i=Ze.getMax(u.height,i);let h=Ze.getMax(l,u.width+2*Ne.wrapPadding);if(a.margin=Ne.boxTextMargin,la.textMaxHeight=i),Ze.getMax(n,Ne.height)}var Ne,rt,AVe,Dp,_1,RO,DVe,LVe,NO,wfe,Tfe,D6,bfe,NVe,IVe,PVe,BVe,FVe,kfe,Efe=N(()=>{"use strict";dr();xfe();vt();gr();Wv();zt();s0();ir();Ei();Ne={},rt={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],activations:[],models:{getHeight:o(function(){return Math.max.apply(null,this.actors.length===0?[0]:this.actors.map(t=>t.height||0))+(this.loops.length===0?0:this.loops.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.messages.length===0?0:this.messages.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.notes.length===0?0:this.notes.map(t=>t.height||0).reduce((t,e)=>t+e))},"getHeight"),clear:o(function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]},"clear"),addBox:o(function(t){this.boxes.push(t)},"addBox"),addActor:o(function(t){this.actors.push(t)},"addActor"),addLoop:o(function(t){this.loops.push(t)},"addLoop"),addMessage:o(function(t){this.messages.push(t)},"addMessage"),addNote:o(function(t){this.notes.push(t)},"addNote"),lastActor:o(function(){return this.actors[this.actors.length-1]},"lastActor"),lastLoop:o(function(){return this.loops[this.loops.length-1]},"lastLoop"),lastMessage:o(function(){return this.messages[this.messages.length-1]},"lastMessage"),lastNote:o(function(){return this.notes[this.notes.length-1]},"lastNote"),actors:[],boxes:[],loops:[],messages:[],notes:[]},init:o(function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,Tfe(me())},"init"),updateVal:o(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:o(function(t,e,r,n){let i=this,a=0;function s(l){return o(function(h){a++;let f=i.sequenceItems.length-a+1;i.updateVal(h,"starty",e-f*Ne.boxMargin,Math.min),i.updateVal(h,"stopy",n+f*Ne.boxMargin,Math.max),i.updateVal(rt.data,"startx",t-f*Ne.boxMargin,Math.min),i.updateVal(rt.data,"stopx",r+f*Ne.boxMargin,Math.max),l!=="activation"&&(i.updateVal(h,"startx",t-f*Ne.boxMargin,Math.min),i.updateVal(h,"stopx",r+f*Ne.boxMargin,Math.max),i.updateVal(rt.data,"starty",e-f*Ne.boxMargin,Math.min),i.updateVal(rt.data,"stopy",n+f*Ne.boxMargin,Math.max))},"updateItemBounds")}o(s,"updateFn"),this.sequenceItems.forEach(s()),this.activations.forEach(s("activation"))},"updateBounds"),insert:o(function(t,e,r,n){let i=Ze.getMin(t,r),a=Ze.getMax(t,r),s=Ze.getMin(e,n),l=Ze.getMax(e,n);this.updateVal(rt.data,"startx",i,Math.min),this.updateVal(rt.data,"starty",s,Math.min),this.updateVal(rt.data,"stopx",a,Math.max),this.updateVal(rt.data,"stopy",l,Math.max),this.updateBounds(i,s,a,l)},"insert"),newActivation:o(function(t,e,r){let n=r.get(t.from),i=D6(t.from).length||0,a=n.x+n.width/2+(i-1)*Ne.activationWidth/2;this.activations.push({startx:a,starty:this.verticalPos+2,stopx:a+Ne.activationWidth,stopy:void 0,actor:t.from,anchored:hi.anchorElement(e)})},"newActivation"),endActivation:o(function(t){let e=this.activations.map(function(r){return r.actor}).lastIndexOf(t.from);return this.activations.splice(e,1)[0]},"endActivation"),createLoop:o(function(t={message:void 0,wrap:!1,width:void 0},e){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}},"createLoop"),newLoop:o(function(t={message:void 0,wrap:!1,width:void 0},e){this.sequenceItems.push(this.createLoop(t,e))},"newLoop"),endLoop:o(function(){return this.sequenceItems.pop()},"endLoop"),isLoopOverlap:o(function(){return this.sequenceItems.length?this.sequenceItems[this.sequenceItems.length-1].overlap:!1},"isLoopOverlap"),addSectionToLoop:o(function(t){let e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:rt.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)},"addSectionToLoop"),saveVerticalPos:o(function(){this.isLoopOverlap()&&(this.savedVerticalPos=this.verticalPos)},"saveVerticalPos"),resetVerticalPos:o(function(){this.isLoopOverlap()&&(this.verticalPos=this.savedVerticalPos)},"resetVerticalPos"),bumpVerticalPos:o(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=Ze.getMax(this.data.stopy,this.verticalPos)},"bumpVerticalPos"),getVerticalPos:o(function(){return this.verticalPos},"getVerticalPos"),getBounds:o(function(){return{bounds:this.data,models:this.models}},"getBounds")},AVe=o(async function(t,e){rt.bumpVerticalPos(Ne.boxMargin),e.height=Ne.boxMargin,e.starty=rt.getVerticalPos();let r=Tl();r.x=e.startx,r.y=e.starty,r.width=e.width||Ne.width,r.class="note";let n=t.append("g"),i=hi.drawRect(n,r),a=Hv();a.x=e.startx,a.y=e.starty,a.width=r.width,a.dy="1em",a.text=e.message,a.class="noteText",a.fontFamily=Ne.noteFontFamily,a.fontSize=Ne.noteFontSize,a.fontWeight=Ne.noteFontWeight,a.anchor=Ne.noteAlign,a.textMargin=Ne.noteMargin,a.valign="center";let s=pi(a.text)?await Tb(n,a):_p(n,a),l=Math.round(s.map(u=>(u._groups||u)[0][0].getBBox().height).reduce((u,h)=>u+h));i.attr("height",l+2*Ne.noteMargin),e.height+=l+2*Ne.noteMargin,rt.bumpVerticalPos(l+2*Ne.noteMargin),e.stopy=e.starty+l+2*Ne.noteMargin,e.stopx=e.startx+r.width,rt.insert(e.startx,e.starty,e.stopx,e.stopy),rt.models.addNote(e)},"drawNote"),Dp=o(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont"),_1=o(t=>({fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight}),"noteFont"),RO=o(t=>({fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight}),"actorFont");o(_Ve,"boundMessage");DVe=o(async function(t,e,r,n){let{startx:i,stopx:a,starty:s,message:l,type:u,sequenceIndex:h,sequenceVisible:f}=e,d=Gt.calculateTextDimensions(l,Dp(Ne)),p=Hv();p.x=i,p.y=s+10,p.width=a-i,p.class="messageText",p.dy="1em",p.text=l,p.fontFamily=Ne.messageFontFamily,p.fontSize=Ne.messageFontSize,p.fontWeight=Ne.messageFontWeight,p.anchor=Ne.messageAlign,p.valign="center",p.textMargin=Ne.wrapPadding,p.tspan=!1,pi(p.text)?await Tb(t,p,{startx:i,stopx:a,starty:r}):_p(t,p);let m=d.width,g;i===a?Ne.rightAngles?g=t.append("path").attr("d",`M ${i},${r} H ${i+Ze.getMax(Ne.width/2,m/2)} V ${r+25} H ${i}`):g=t.append("path").attr("d","M "+i+","+r+" C "+(i+60)+","+(r-10)+" "+(i+60)+","+(r+30)+" "+i+","+(r+20)):(g=t.append("line"),g.attr("x1",i),g.attr("y1",r),g.attr("x2",a),g.attr("y2",r)),u===n.db.LINETYPE.DOTTED||u===n.db.LINETYPE.DOTTED_CROSS||u===n.db.LINETYPE.DOTTED_POINT||u===n.db.LINETYPE.DOTTED_OPEN||u===n.db.LINETYPE.BIDIRECTIONAL_DOTTED?(g.style("stroke-dasharray","3, 3"),g.attr("class","messageLine1")):g.attr("class","messageLine0");let y="";Ne.arrowMarkerAbsolute&&(y=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,y=y.replace(/\(/g,"\\("),y=y.replace(/\)/g,"\\)")),g.attr("stroke-width",2),g.attr("stroke","none"),g.style("fill","none"),(u===n.db.LINETYPE.SOLID||u===n.db.LINETYPE.DOTTED)&&g.attr("marker-end","url("+y+"#arrowhead)"),(u===n.db.LINETYPE.BIDIRECTIONAL_SOLID||u===n.db.LINETYPE.BIDIRECTIONAL_DOTTED)&&(g.attr("marker-start","url("+y+"#arrowhead)"),g.attr("marker-end","url("+y+"#arrowhead)")),(u===n.db.LINETYPE.SOLID_POINT||u===n.db.LINETYPE.DOTTED_POINT)&&g.attr("marker-end","url("+y+"#filled-head)"),(u===n.db.LINETYPE.SOLID_CROSS||u===n.db.LINETYPE.DOTTED_CROSS)&&g.attr("marker-end","url("+y+"#crosshead)"),(f||Ne.showSequenceNumbers)&&(g.attr("marker-start","url("+y+"#sequencenumber)"),t.append("text").attr("x",i).attr("y",r+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(h))},"drawMessage"),LVe=o(function(t,e,r,n,i,a,s){let l=0,u=0,h,f=0;for(let d of n){let p=e.get(d),m=p.box;h&&h!=m&&(s||rt.models.addBox(h),u+=Ne.boxMargin+h.margin),m&&m!=h&&(s||(m.x=l+u,m.y=i),u+=m.margin),p.width=p.width||Ne.width,p.height=Ze.getMax(p.height||Ne.height,Ne.height),p.margin=p.margin||Ne.actorMargin,f=Ze.getMax(f,p.height),r.get(p.name)&&(u+=p.width/2),p.x=l+u,p.starty=rt.getVerticalPos(),rt.insert(p.x,i,p.x+p.width,p.height),l+=p.width+u,p.box&&(p.box.width=l+m.margin-p.box.x),u=p.margin,h=p.box,rt.models.addActor(p)}h&&!s&&rt.models.addBox(h),rt.bumpVerticalPos(f)},"addActorRenderingData"),NO=o(async function(t,e,r,n){if(n){let i=0;rt.bumpVerticalPos(Ne.boxMargin*2);for(let a of r){let s=e.get(a);s.stopy||(s.stopy=rt.getVerticalPos());let l=await hi.drawActor(t,s,Ne,!0);i=Ze.getMax(i,l)}rt.bumpVerticalPos(i+Ne.boxMargin)}else for(let i of r){let a=e.get(i);await hi.drawActor(t,a,Ne,!1)}},"drawActors"),wfe=o(function(t,e,r,n){let i=0,a=0;for(let s of r){let l=e.get(s),u=IVe(l),h=hi.drawPopup(t,l,u,Ne,Ne.forceMenus,n);h.height>i&&(i=h.height),h.width+l.x>a&&(a=h.width+l.x)}return{maxHeight:i,maxWidth:a}},"drawActorsPopup"),Tfe=o(function(t){Gn(Ne,t),t.fontFamily&&(Ne.actorFontFamily=Ne.noteFontFamily=Ne.messageFontFamily=t.fontFamily),t.fontSize&&(Ne.actorFontSize=Ne.noteFontSize=Ne.messageFontSize=t.fontSize),t.fontWeight&&(Ne.actorFontWeight=Ne.noteFontWeight=Ne.messageFontWeight=t.fontWeight)},"setConf"),D6=o(function(t){return rt.activations.filter(function(e){return e.actor===t})},"actorActivations"),bfe=o(function(t,e){let r=e.get(t),n=D6(t),i=n.reduce(function(s,l){return Ze.getMin(s,l.startx)},r.x+r.width/2-1),a=n.reduce(function(s,l){return Ze.getMax(s,l.stopx)},r.x+r.width/2+1);return[i,a]},"activationBounds");o(Hc,"adjustLoopHeightForWrap");o(RVe,"adjustCreatedDestroyedData");NVe=o(async function(t,e,r,n){let{securityLevel:i,sequence:a}=me();Ne=a;let s;i==="sandbox"&&(s=Ge("#i"+e));let l=i==="sandbox"?Ge(s.nodes()[0].contentDocument.body):Ge("body"),u=i==="sandbox"?s.nodes()[0].contentDocument:document;rt.init(),Y.debug(n.db);let h=i==="sandbox"?l.select(`[id="${e}"]`):Ge(`[id="${e}"]`),f=n.db.getActors(),d=n.db.getCreatedActors(),p=n.db.getDestroyedActors(),m=n.db.getBoxes(),g=n.db.getActorKeys(),y=n.db.getMessages(),v=n.db.getDiagramTitle(),x=n.db.hasAtLeastOneBox(),b=n.db.hasAtLeastOneBoxWithTitle(),w=await MVe(f,y,n);if(Ne.height=await OVe(f,w,m),hi.insertComputerIcon(h),hi.insertDatabaseIcon(h),hi.insertClockIcon(h),x&&(rt.bumpVerticalPos(Ne.boxMargin),b&&rt.bumpVerticalPos(m[0].textMaxHeight)),Ne.hideUnusedParticipants===!0){let F=new Set;y.forEach(P=>{F.add(P.from),F.add(P.to)}),g=g.filter(P=>F.has(P))}LVe(h,f,d,g,0,y,!1);let C=await FVe(y,f,w,n);hi.insertArrowHead(h),hi.insertArrowCrossHead(h),hi.insertArrowFilledHead(h),hi.insertSequenceNumber(h);function T(F,P){let z=rt.endActivation(F);z.starty+18>P&&(z.starty=P-6,P+=12),hi.drawActivation(h,z,P,Ne,D6(F.from).length),rt.insert(z.startx,P-10,z.stopx,P)}o(T,"activeEnd");let E=1,A=1,S=[],_=[],I=0;for(let F of y){let P,z,$;switch(F.type){case n.db.LINETYPE.NOTE:rt.resetVerticalPos(),z=F.noteModel,await AVe(h,z);break;case n.db.LINETYPE.ACTIVE_START:rt.newActivation(F,h,f);break;case n.db.LINETYPE.ACTIVE_END:T(F,rt.getVerticalPos());break;case n.db.LINETYPE.LOOP_START:Hc(C,F,Ne.boxMargin,Ne.boxMargin+Ne.boxTextMargin,H=>rt.newLoop(H));break;case n.db.LINETYPE.LOOP_END:P=rt.endLoop(),await hi.drawLoop(h,P,"loop",Ne),rt.bumpVerticalPos(P.stopy-rt.getVerticalPos()),rt.models.addLoop(P);break;case n.db.LINETYPE.RECT_START:Hc(C,F,Ne.boxMargin,Ne.boxMargin,H=>rt.newLoop(void 0,H.message));break;case n.db.LINETYPE.RECT_END:P=rt.endLoop(),_.push(P),rt.models.addLoop(P),rt.bumpVerticalPos(P.stopy-rt.getVerticalPos());break;case n.db.LINETYPE.OPT_START:Hc(C,F,Ne.boxMargin,Ne.boxMargin+Ne.boxTextMargin,H=>rt.newLoop(H));break;case n.db.LINETYPE.OPT_END:P=rt.endLoop(),await hi.drawLoop(h,P,"opt",Ne),rt.bumpVerticalPos(P.stopy-rt.getVerticalPos()),rt.models.addLoop(P);break;case n.db.LINETYPE.ALT_START:Hc(C,F,Ne.boxMargin,Ne.boxMargin+Ne.boxTextMargin,H=>rt.newLoop(H));break;case n.db.LINETYPE.ALT_ELSE:Hc(C,F,Ne.boxMargin+Ne.boxTextMargin,Ne.boxMargin,H=>rt.addSectionToLoop(H));break;case n.db.LINETYPE.ALT_END:P=rt.endLoop(),await hi.drawLoop(h,P,"alt",Ne),rt.bumpVerticalPos(P.stopy-rt.getVerticalPos()),rt.models.addLoop(P);break;case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:Hc(C,F,Ne.boxMargin,Ne.boxMargin+Ne.boxTextMargin,H=>rt.newLoop(H)),rt.saveVerticalPos();break;case n.db.LINETYPE.PAR_AND:Hc(C,F,Ne.boxMargin+Ne.boxTextMargin,Ne.boxMargin,H=>rt.addSectionToLoop(H));break;case n.db.LINETYPE.PAR_END:P=rt.endLoop(),await hi.drawLoop(h,P,"par",Ne),rt.bumpVerticalPos(P.stopy-rt.getVerticalPos()),rt.models.addLoop(P);break;case n.db.LINETYPE.AUTONUMBER:E=F.message.start||E,A=F.message.step||A,F.message.visible?n.db.enableSequenceNumbers():n.db.disableSequenceNumbers();break;case n.db.LINETYPE.CRITICAL_START:Hc(C,F,Ne.boxMargin,Ne.boxMargin+Ne.boxTextMargin,H=>rt.newLoop(H));break;case n.db.LINETYPE.CRITICAL_OPTION:Hc(C,F,Ne.boxMargin+Ne.boxTextMargin,Ne.boxMargin,H=>rt.addSectionToLoop(H));break;case n.db.LINETYPE.CRITICAL_END:P=rt.endLoop(),await hi.drawLoop(h,P,"critical",Ne),rt.bumpVerticalPos(P.stopy-rt.getVerticalPos()),rt.models.addLoop(P);break;case n.db.LINETYPE.BREAK_START:Hc(C,F,Ne.boxMargin,Ne.boxMargin+Ne.boxTextMargin,H=>rt.newLoop(H));break;case n.db.LINETYPE.BREAK_END:P=rt.endLoop(),await hi.drawLoop(h,P,"break",Ne),rt.bumpVerticalPos(P.stopy-rt.getVerticalPos()),rt.models.addLoop(P);break;default:try{$=F.msgModel,$.starty=rt.getVerticalPos(),$.sequenceIndex=E,$.sequenceVisible=n.db.showSequenceNumbers();let H=await _Ve(h,$);RVe(F,$,H,I,f,d,p),S.push({messageModel:$,lineStartY:H}),rt.models.addMessage($)}catch(H){Y.error("error while drawing message",H)}}[n.db.LINETYPE.SOLID_OPEN,n.db.LINETYPE.DOTTED_OPEN,n.db.LINETYPE.SOLID,n.db.LINETYPE.DOTTED,n.db.LINETYPE.SOLID_CROSS,n.db.LINETYPE.DOTTED_CROSS,n.db.LINETYPE.SOLID_POINT,n.db.LINETYPE.DOTTED_POINT,n.db.LINETYPE.BIDIRECTIONAL_SOLID,n.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(F.type)&&(E=E+A),I++}Y.debug("createdActors",d),Y.debug("destroyedActors",p),await NO(h,f,g,!1);for(let F of S)await DVe(h,F.messageModel,F.lineStartY,n);Ne.mirrorActors&&await NO(h,f,g,!0),_.forEach(F=>hi.drawBackgroundRect(h,F)),DO(h,f,g,Ne);for(let F of rt.models.boxes)F.height=rt.getVerticalPos()-F.y,rt.insert(F.x,F.y,F.x+F.width,F.height),F.startx=F.x,F.starty=F.y,F.stopx=F.startx+F.width,F.stopy=F.starty+F.height,F.stroke="rgb(0,0,0, 0.5)",hi.drawBox(h,F,Ne);x&&rt.bumpVerticalPos(Ne.boxMargin);let D=wfe(h,f,g,u),{bounds:k}=rt.getBounds();k.startx===void 0&&(k.startx=0),k.starty===void 0&&(k.starty=0),k.stopx===void 0&&(k.stopx=0),k.stopy===void 0&&(k.stopy=0);let L=k.stopy-k.starty;L2,d=o(y=>l?-y:y,"adjustValue");t.from===t.to?h=u:(t.activate&&!f&&(h+=d(Ne.activationWidth/2-1)),[r.db.LINETYPE.SOLID_OPEN,r.db.LINETYPE.DOTTED_OPEN].includes(t.type)||(h+=d(3)),[r.db.LINETYPE.BIDIRECTIONAL_SOLID,r.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(t.type)&&(u-=d(3)));let p=[n,i,a,s],m=Math.abs(u-h);t.wrap&&t.message&&(t.message=Gt.wrapLabel(t.message,Ze.getMax(m+2*Ne.wrapPadding,Ne.width),Dp(Ne)));let g=Gt.calculateTextDimensions(t.message,Dp(Ne));return{width:Ze.getMax(t.wrap?0:g.width+2*Ne.wrapPadding,m+2*Ne.wrapPadding,Ne.width),height:0,startx:u,stopx:h,starty:0,stopy:0,message:t.message,type:t.type,wrap:t.wrap,fromBounds:Math.min.apply(null,p),toBounds:Math.max.apply(null,p)}},"buildMessageModel"),FVe=o(async function(t,e,r,n){let i={},a=[],s,l,u;for(let h of t){switch(h.type){case n.db.LINETYPE.LOOP_START:case n.db.LINETYPE.ALT_START:case n.db.LINETYPE.OPT_START:case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:case n.db.LINETYPE.CRITICAL_START:case n.db.LINETYPE.BREAK_START:a.push({id:h.id,msg:h.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case n.db.LINETYPE.ALT_ELSE:case n.db.LINETYPE.PAR_AND:case n.db.LINETYPE.CRITICAL_OPTION:h.message&&(s=a.pop(),i[s.id]=s,i[h.id]=s,a.push(s));break;case n.db.LINETYPE.LOOP_END:case n.db.LINETYPE.ALT_END:case n.db.LINETYPE.OPT_END:case n.db.LINETYPE.PAR_END:case n.db.LINETYPE.CRITICAL_END:case n.db.LINETYPE.BREAK_END:s=a.pop(),i[s.id]=s;break;case n.db.LINETYPE.ACTIVE_START:{let d=e.get(h.from?h.from:h.to.actor),p=D6(h.from?h.from:h.to.actor).length,m=d.x+d.width/2+(p-1)*Ne.activationWidth/2,g={startx:m,stopx:m+Ne.activationWidth,actor:h.from,enabled:!0};rt.activations.push(g)}break;case n.db.LINETYPE.ACTIVE_END:{let d=rt.activations.map(p=>p.actor).lastIndexOf(h.from);rt.activations.splice(d,1).splice(0,1)}break}h.placement!==void 0?(l=await PVe(h,e,n),h.noteModel=l,a.forEach(d=>{s=d,s.from=Ze.getMin(s.from,l.startx),s.to=Ze.getMax(s.to,l.startx+l.width),s.width=Ze.getMax(s.width,Math.abs(s.from-s.to))-Ne.labelBoxWidth})):(u=BVe(h,e,n),h.msgModel=u,u.startx&&u.stopx&&a.length>0&&a.forEach(d=>{if(s=d,u.startx===u.stopx){let p=e.get(h.from),m=e.get(h.to);s.from=Ze.getMin(p.x-u.width/2,p.x-p.width/2,s.from),s.to=Ze.getMax(m.x+u.width/2,m.x+p.width/2,s.to),s.width=Ze.getMax(s.width,Math.abs(s.to-s.from))-Ne.labelBoxWidth}else s.from=Ze.getMin(u.startx,s.from),s.to=Ze.getMax(u.stopx,s.to),s.width=Ze.getMax(s.width,u.width)-Ne.labelBoxWidth}))}return rt.activations=[],Y.debug("Loop type widths:",i),i},"calculateLoopBounds"),kfe={bounds:rt,drawActors:NO,drawActorsPopup:wfe,setConf:Tfe,draw:NVe}});var Sfe={};hr(Sfe,{diagram:()=>$Ve});var $Ve,Cfe=N(()=>{"use strict";cfe();ufe();ffe();zt();Efe();$Ve={parser:lfe,get db(){return new _6},renderer:kfe,styles:hfe,init:o(t=>{t.sequence||(t.sequence={}),t.wrap&&(t.sequence.wrap=t.wrap,Yy({sequence:{wrap:t.wrap}}))},"init")}});var MO,L6,IO=N(()=>{"use strict";MO=function(){var t=o(function(Ie,be,W,de){for(W=W||{},de=Ie.length;de--;W[Ie[de]]=be);return W},"o"),e=[1,18],r=[1,19],n=[1,20],i=[1,41],a=[1,42],s=[1,26],l=[1,24],u=[1,25],h=[1,32],f=[1,33],d=[1,34],p=[1,45],m=[1,35],g=[1,36],y=[1,37],v=[1,38],x=[1,27],b=[1,28],w=[1,29],C=[1,30],T=[1,31],E=[1,44],A=[1,46],S=[1,43],_=[1,47],I=[1,9],D=[1,8,9],k=[1,58],L=[1,59],R=[1,60],O=[1,61],M=[1,62],B=[1,63],F=[1,64],P=[1,8,9,41],z=[1,76],$=[1,8,9,12,13,22,39,41,44,66,67,68,69,70,71,72,77,79],H=[1,8,9,12,13,17,20,22,39,41,44,48,58,66,67,68,69,70,71,72,77,79,84,99,101,102],Q=[13,58,84,99,101,102],j=[13,58,71,72,84,99,101,102],ie=[13,58,66,67,68,69,70,84,99,101,102],ne=[1,98],le=[1,115],he=[1,107],K=[1,113],X=[1,108],te=[1,109],J=[1,110],se=[1,111],ue=[1,112],Z=[1,114],Se=[22,58,59,80,84,85,86,87,88,89],ce=[1,8,9,39,41,44],ae=[1,8,9,22],Oe=[1,143],ge=[1,8,9,59],ze=[1,8,9,22,58,59,80,84,85,86,87,88,89],He={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statements:5,graphConfig:6,CLASS_DIAGRAM:7,NEWLINE:8,EOF:9,statement:10,classLabel:11,SQS:12,STR:13,SQE:14,namespaceName:15,alphaNumToken:16,DOT:17,className:18,classLiteralName:19,GENERICTYPE:20,relationStatement:21,LABEL:22,namespaceStatement:23,classStatement:24,memberStatement:25,annotationStatement:26,clickStatement:27,styleStatement:28,cssClassStatement:29,noteStatement:30,classDefStatement:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,namespaceIdentifier:38,STRUCT_START:39,classStatements:40,STRUCT_STOP:41,NAMESPACE:42,classIdentifier:43,STYLE_SEPARATOR:44,members:45,CLASS:46,ANNOTATION_START:47,ANNOTATION_END:48,MEMBER:49,SEPARATOR:50,relation:51,NOTE_FOR:52,noteText:53,NOTE:54,CLASSDEF:55,classList:56,stylesOpt:57,ALPHA:58,COMMA:59,direction_tb:60,direction_bt:61,direction_rl:62,direction_lr:63,relationType:64,lineType:65,AGGREGATION:66,EXTENSION:67,COMPOSITION:68,DEPENDENCY:69,LOLLIPOP:70,LINE:71,DOTTED_LINE:72,CALLBACK:73,LINK:74,LINK_TARGET:75,CLICK:76,CALLBACK_NAME:77,CALLBACK_ARGS:78,HREF:79,STYLE:80,CSSCLASS:81,style:82,styleComponent:83,NUM:84,COLON:85,UNIT:86,SPACE:87,BRKT:88,PCT:89,commentToken:90,textToken:91,graphCodeTokens:92,textNoTagsToken:93,TAGSTART:94,TAGEND:95,"==":96,"--":97,DEFAULT:98,MINUS:99,keywords:100,UNICODE_TEXT:101,BQUOTE_STR:102,$accept:0,$end:1},terminals_:{2:"error",7:"CLASS_DIAGRAM",8:"NEWLINE",9:"EOF",12:"SQS",13:"STR",14:"SQE",17:"DOT",20:"GENERICTYPE",22:"LABEL",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",39:"STRUCT_START",41:"STRUCT_STOP",42:"NAMESPACE",44:"STYLE_SEPARATOR",46:"CLASS",47:"ANNOTATION_START",48:"ANNOTATION_END",49:"MEMBER",50:"SEPARATOR",52:"NOTE_FOR",54:"NOTE",55:"CLASSDEF",58:"ALPHA",59:"COMMA",60:"direction_tb",61:"direction_bt",62:"direction_rl",63:"direction_lr",66:"AGGREGATION",67:"EXTENSION",68:"COMPOSITION",69:"DEPENDENCY",70:"LOLLIPOP",71:"LINE",72:"DOTTED_LINE",73:"CALLBACK",74:"LINK",75:"LINK_TARGET",76:"CLICK",77:"CALLBACK_NAME",78:"CALLBACK_ARGS",79:"HREF",80:"STYLE",81:"CSSCLASS",84:"NUM",85:"COLON",86:"UNIT",87:"SPACE",88:"BRKT",89:"PCT",92:"graphCodeTokens",94:"TAGSTART",95:"TAGEND",96:"==",97:"--",98:"DEFAULT",99:"MINUS",100:"keywords",101:"UNICODE_TEXT",102:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[4,1],[6,4],[5,1],[5,2],[5,3],[11,3],[15,1],[15,3],[15,2],[18,1],[18,3],[18,1],[18,2],[18,2],[18,2],[10,1],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[23,4],[23,5],[38,2],[40,1],[40,2],[40,3],[24,1],[24,3],[24,4],[24,6],[43,2],[43,3],[26,4],[45,1],[45,2],[25,1],[25,2],[25,1],[25,1],[21,3],[21,4],[21,4],[21,5],[30,3],[30,2],[31,3],[56,1],[56,3],[32,1],[32,1],[32,1],[32,1],[51,3],[51,2],[51,2],[51,1],[64,1],[64,1],[64,1],[64,1],[64,1],[65,1],[65,1],[27,3],[27,4],[27,3],[27,4],[27,4],[27,5],[27,3],[27,4],[27,4],[27,5],[27,4],[27,5],[27,5],[27,6],[28,3],[29,3],[57,1],[57,3],[82,1],[82,2],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[90,1],[90,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[93,1],[93,1],[93,1],[93,1],[16,1],[16,1],[16,1],[16,1],[19,1],[53,1]],performAction:o(function(be,W,de,re,oe,V,xe){var q=V.length-1;switch(oe){case 8:this.$=V[q-1];break;case 9:case 12:case 14:this.$=V[q];break;case 10:case 13:this.$=V[q-2]+"."+V[q];break;case 11:case 15:this.$=V[q-1]+V[q];break;case 16:case 17:this.$=V[q-1]+"~"+V[q]+"~";break;case 18:re.addRelation(V[q]);break;case 19:V[q-1].title=re.cleanupLabel(V[q]),re.addRelation(V[q-1]);break;case 30:this.$=V[q].trim(),re.setAccTitle(this.$);break;case 31:case 32:this.$=V[q].trim(),re.setAccDescription(this.$);break;case 33:re.addClassesToNamespace(V[q-3],V[q-1]);break;case 34:re.addClassesToNamespace(V[q-4],V[q-1]);break;case 35:this.$=V[q],re.addNamespace(V[q]);break;case 36:this.$=[V[q]];break;case 37:this.$=[V[q-1]];break;case 38:V[q].unshift(V[q-2]),this.$=V[q];break;case 40:re.setCssClass(V[q-2],V[q]);break;case 41:re.addMembers(V[q-3],V[q-1]);break;case 42:re.setCssClass(V[q-5],V[q-3]),re.addMembers(V[q-5],V[q-1]);break;case 43:this.$=V[q],re.addClass(V[q]);break;case 44:this.$=V[q-1],re.addClass(V[q-1]),re.setClassLabel(V[q-1],V[q]);break;case 45:re.addAnnotation(V[q],V[q-2]);break;case 46:case 59:this.$=[V[q]];break;case 47:V[q].push(V[q-1]),this.$=V[q];break;case 48:break;case 49:re.addMember(V[q-1],re.cleanupLabel(V[q]));break;case 50:break;case 51:break;case 52:this.$={id1:V[q-2],id2:V[q],relation:V[q-1],relationTitle1:"none",relationTitle2:"none"};break;case 53:this.$={id1:V[q-3],id2:V[q],relation:V[q-1],relationTitle1:V[q-2],relationTitle2:"none"};break;case 54:this.$={id1:V[q-3],id2:V[q],relation:V[q-2],relationTitle1:"none",relationTitle2:V[q-1]};break;case 55:this.$={id1:V[q-4],id2:V[q],relation:V[q-2],relationTitle1:V[q-3],relationTitle2:V[q-1]};break;case 56:re.addNote(V[q],V[q-1]);break;case 57:re.addNote(V[q]);break;case 58:this.$=V[q-2],re.defineClass(V[q-1],V[q]);break;case 60:this.$=V[q-2].concat([V[q]]);break;case 61:re.setDirection("TB");break;case 62:re.setDirection("BT");break;case 63:re.setDirection("RL");break;case 64:re.setDirection("LR");break;case 65:this.$={type1:V[q-2],type2:V[q],lineType:V[q-1]};break;case 66:this.$={type1:"none",type2:V[q],lineType:V[q-1]};break;case 67:this.$={type1:V[q-1],type2:"none",lineType:V[q]};break;case 68:this.$={type1:"none",type2:"none",lineType:V[q]};break;case 69:this.$=re.relationType.AGGREGATION;break;case 70:this.$=re.relationType.EXTENSION;break;case 71:this.$=re.relationType.COMPOSITION;break;case 72:this.$=re.relationType.DEPENDENCY;break;case 73:this.$=re.relationType.LOLLIPOP;break;case 74:this.$=re.lineType.LINE;break;case 75:this.$=re.lineType.DOTTED_LINE;break;case 76:case 82:this.$=V[q-2],re.setClickEvent(V[q-1],V[q]);break;case 77:case 83:this.$=V[q-3],re.setClickEvent(V[q-2],V[q-1]),re.setTooltip(V[q-2],V[q]);break;case 78:this.$=V[q-2],re.setLink(V[q-1],V[q]);break;case 79:this.$=V[q-3],re.setLink(V[q-2],V[q-1],V[q]);break;case 80:this.$=V[q-3],re.setLink(V[q-2],V[q-1]),re.setTooltip(V[q-2],V[q]);break;case 81:this.$=V[q-4],re.setLink(V[q-3],V[q-2],V[q]),re.setTooltip(V[q-3],V[q-1]);break;case 84:this.$=V[q-3],re.setClickEvent(V[q-2],V[q-1],V[q]);break;case 85:this.$=V[q-4],re.setClickEvent(V[q-3],V[q-2],V[q-1]),re.setTooltip(V[q-3],V[q]);break;case 86:this.$=V[q-3],re.setLink(V[q-2],V[q]);break;case 87:this.$=V[q-4],re.setLink(V[q-3],V[q-1],V[q]);break;case 88:this.$=V[q-4],re.setLink(V[q-3],V[q-1]),re.setTooltip(V[q-3],V[q]);break;case 89:this.$=V[q-5],re.setLink(V[q-4],V[q-2],V[q]),re.setTooltip(V[q-4],V[q-1]);break;case 90:this.$=V[q-2],re.setCssStyle(V[q-1],V[q]);break;case 91:re.setCssClass(V[q-1],V[q]);break;case 92:this.$=[V[q]];break;case 93:V[q-2].push(V[q]),this.$=V[q-2];break;case 95:this.$=V[q-1]+V[q];break}},"anonymous"),table:[{3:1,4:2,5:3,6:4,7:[1,6],10:5,16:39,18:21,19:40,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,47:s,49:l,50:u,52:h,54:f,55:d,58:p,60:m,61:g,62:y,63:v,73:x,74:b,76:w,80:C,81:T,84:E,99:A,101:S,102:_},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},t(I,[2,5],{8:[1,48]}),{8:[1,49]},t(D,[2,18],{22:[1,50]}),t(D,[2,20]),t(D,[2,21]),t(D,[2,22]),t(D,[2,23]),t(D,[2,24]),t(D,[2,25]),t(D,[2,26]),t(D,[2,27]),t(D,[2,28]),t(D,[2,29]),{34:[1,51]},{36:[1,52]},t(D,[2,32]),t(D,[2,48],{51:53,64:56,65:57,13:[1,54],22:[1,55],66:k,67:L,68:R,69:O,70:M,71:B,72:F}),{39:[1,65]},t(P,[2,39],{39:[1,67],44:[1,66]}),t(D,[2,50]),t(D,[2,51]),{16:68,58:p,84:E,99:A,101:S},{16:39,18:69,19:40,58:p,84:E,99:A,101:S,102:_},{16:39,18:70,19:40,58:p,84:E,99:A,101:S,102:_},{16:39,18:71,19:40,58:p,84:E,99:A,101:S,102:_},{58:[1,72]},{13:[1,73]},{16:39,18:74,19:40,58:p,84:E,99:A,101:S,102:_},{13:z,53:75},{56:77,58:[1,78]},t(D,[2,61]),t(D,[2,62]),t(D,[2,63]),t(D,[2,64]),t($,[2,12],{16:39,19:40,18:80,17:[1,79],20:[1,81],58:p,84:E,99:A,101:S,102:_}),t($,[2,14],{20:[1,82]}),{15:83,16:84,58:p,84:E,99:A,101:S},{16:39,18:85,19:40,58:p,84:E,99:A,101:S,102:_},t(H,[2,118]),t(H,[2,119]),t(H,[2,120]),t(H,[2,121]),t([1,8,9,12,13,20,22,39,41,44,66,67,68,69,70,71,72,77,79],[2,122]),t(I,[2,6],{10:5,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,18:21,38:22,43:23,16:39,19:40,5:86,33:e,35:r,37:n,42:i,46:a,47:s,49:l,50:u,52:h,54:f,55:d,58:p,60:m,61:g,62:y,63:v,73:x,74:b,76:w,80:C,81:T,84:E,99:A,101:S,102:_}),{5:87,10:5,16:39,18:21,19:40,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,47:s,49:l,50:u,52:h,54:f,55:d,58:p,60:m,61:g,62:y,63:v,73:x,74:b,76:w,80:C,81:T,84:E,99:A,101:S,102:_},t(D,[2,19]),t(D,[2,30]),t(D,[2,31]),{13:[1,89],16:39,18:88,19:40,58:p,84:E,99:A,101:S,102:_},{51:90,64:56,65:57,66:k,67:L,68:R,69:O,70:M,71:B,72:F},t(D,[2,49]),{65:91,71:B,72:F},t(Q,[2,68],{64:92,66:k,67:L,68:R,69:O,70:M}),t(j,[2,69]),t(j,[2,70]),t(j,[2,71]),t(j,[2,72]),t(j,[2,73]),t(ie,[2,74]),t(ie,[2,75]),{8:[1,94],24:95,40:93,43:23,46:a},{16:96,58:p,84:E,99:A,101:S},{45:97,49:ne},{48:[1,99]},{13:[1,100]},{13:[1,101]},{77:[1,102],79:[1,103]},{22:le,57:104,58:he,80:K,82:105,83:106,84:X,85:te,86:J,87:se,88:ue,89:Z},{58:[1,116]},{13:z,53:117},t(D,[2,57]),t(D,[2,123]),{22:le,57:118,58:he,59:[1,119],80:K,82:105,83:106,84:X,85:te,86:J,87:se,88:ue,89:Z},t(Se,[2,59]),{16:39,18:120,19:40,58:p,84:E,99:A,101:S,102:_},t($,[2,15]),t($,[2,16]),t($,[2,17]),{39:[2,35]},{15:122,16:84,17:[1,121],39:[2,9],58:p,84:E,99:A,101:S},t(ce,[2,43],{11:123,12:[1,124]}),t(I,[2,7]),{9:[1,125]},t(ae,[2,52]),{16:39,18:126,19:40,58:p,84:E,99:A,101:S,102:_},{13:[1,128],16:39,18:127,19:40,58:p,84:E,99:A,101:S,102:_},t(Q,[2,67],{64:129,66:k,67:L,68:R,69:O,70:M}),t(Q,[2,66]),{41:[1,130]},{24:95,40:131,43:23,46:a},{8:[1,132],41:[2,36]},t(P,[2,40],{39:[1,133]}),{41:[1,134]},{41:[2,46],45:135,49:ne},{16:39,18:136,19:40,58:p,84:E,99:A,101:S,102:_},t(D,[2,76],{13:[1,137]}),t(D,[2,78],{13:[1,139],75:[1,138]}),t(D,[2,82],{13:[1,140],78:[1,141]}),{13:[1,142]},t(D,[2,90],{59:Oe}),t(ge,[2,92],{83:144,22:le,58:he,80:K,84:X,85:te,86:J,87:se,88:ue,89:Z}),t(ze,[2,94]),t(ze,[2,96]),t(ze,[2,97]),t(ze,[2,98]),t(ze,[2,99]),t(ze,[2,100]),t(ze,[2,101]),t(ze,[2,102]),t(ze,[2,103]),t(ze,[2,104]),t(D,[2,91]),t(D,[2,56]),t(D,[2,58],{59:Oe}),{58:[1,145]},t($,[2,13]),{15:146,16:84,58:p,84:E,99:A,101:S},{39:[2,11]},t(ce,[2,44]),{13:[1,147]},{1:[2,4]},t(ae,[2,54]),t(ae,[2,53]),{16:39,18:148,19:40,58:p,84:E,99:A,101:S,102:_},t(Q,[2,65]),t(D,[2,33]),{41:[1,149]},{24:95,40:150,41:[2,37],43:23,46:a},{45:151,49:ne},t(P,[2,41]),{41:[2,47]},t(D,[2,45]),t(D,[2,77]),t(D,[2,79]),t(D,[2,80],{75:[1,152]}),t(D,[2,83]),t(D,[2,84],{13:[1,153]}),t(D,[2,86],{13:[1,155],75:[1,154]}),{22:le,58:he,80:K,82:156,83:106,84:X,85:te,86:J,87:se,88:ue,89:Z},t(ze,[2,95]),t(Se,[2,60]),{39:[2,10]},{14:[1,157]},t(ae,[2,55]),t(D,[2,34]),{41:[2,38]},{41:[1,158]},t(D,[2,81]),t(D,[2,85]),t(D,[2,87]),t(D,[2,88],{75:[1,159]}),t(ge,[2,93],{83:144,22:le,58:he,80:K,84:X,85:te,86:J,87:se,88:ue,89:Z}),t(ce,[2,8]),t(P,[2,42]),t(D,[2,89])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],83:[2,35],122:[2,11],125:[2,4],135:[2,47],146:[2,10],150:[2,38]},parseError:o(function(be,W){if(W.recoverable)this.trace(be);else{var de=new Error(be);throw de.hash=W,de}},"parseError"),parse:o(function(be){var W=this,de=[0],re=[],oe=[null],V=[],xe=this.table,q="",pe=0,ve=0,Pe=0,_e=2,we=1,Ve=V.slice.call(arguments,1),De=Object.create(this.lexer),qe={yy:{}};for(var at in this.yy)Object.prototype.hasOwnProperty.call(this.yy,at)&&(qe.yy[at]=this.yy[at]);De.setInput(be,qe.yy),qe.yy.lexer=De,qe.yy.parser=this,typeof De.yylloc>"u"&&(De.yylloc={});var Rt=De.yylloc;V.push(Rt);var st=De.options&&De.options.ranges;typeof qe.yy.parseError=="function"?this.parseError=qe.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Ue(Tt){de.length=de.length-2*Tt,oe.length=oe.length-Tt,V.length=V.length-Tt}o(Ue,"popStack");function ct(){var Tt;return Tt=re.pop()||De.lex()||we,typeof Tt!="number"&&(Tt instanceof Array&&(re=Tt,Tt=re.pop()),Tt=W.symbols_[Tt]||Tt),Tt}o(ct,"lex");for(var We,ot,Yt,bt,Mt,xt,ut={},Et,ft,yt,nt;;){if(Yt=de[de.length-1],this.defaultActions[Yt]?bt=this.defaultActions[Yt]:((We===null||typeof We>"u")&&(We=ct()),bt=xe[Yt]&&xe[Yt][We]),typeof bt>"u"||!bt.length||!bt[0]){var dn="";nt=[];for(Et in xe[Yt])this.terminals_[Et]&&Et>_e&&nt.push("'"+this.terminals_[Et]+"'");De.showPosition?dn="Parse error on line "+(pe+1)+`: +`+De.showPosition()+` +Expecting `+nt.join(", ")+", got '"+(this.terminals_[We]||We)+"'":dn="Parse error on line "+(pe+1)+": Unexpected "+(We==we?"end of input":"'"+(this.terminals_[We]||We)+"'"),this.parseError(dn,{text:De.match,token:this.terminals_[We]||We,line:De.yylineno,loc:Rt,expected:nt})}if(bt[0]instanceof Array&&bt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Yt+", token: "+We);switch(bt[0]){case 1:de.push(We),oe.push(De.yytext),V.push(De.yylloc),de.push(bt[1]),We=null,ot?(We=ot,ot=null):(ve=De.yyleng,q=De.yytext,pe=De.yylineno,Rt=De.yylloc,Pe>0&&Pe--);break;case 2:if(ft=this.productions_[bt[1]][1],ut.$=oe[oe.length-ft],ut._$={first_line:V[V.length-(ft||1)].first_line,last_line:V[V.length-1].last_line,first_column:V[V.length-(ft||1)].first_column,last_column:V[V.length-1].last_column},st&&(ut._$.range=[V[V.length-(ft||1)].range[0],V[V.length-1].range[1]]),xt=this.performAction.apply(ut,[q,ve,pe,qe.yy,bt[1],oe,V].concat(Ve)),typeof xt<"u")return xt;ft&&(de=de.slice(0,-1*ft*2),oe=oe.slice(0,-1*ft),V=V.slice(0,-1*ft)),de.push(this.productions_[bt[1]][0]),oe.push(ut.$),V.push(ut._$),yt=xe[de[de.length-2]][de[de.length-1]],de.push(yt);break;case 3:return!0}}return!0},"parse")},$e=function(){var Ie={EOF:1,parseError:o(function(W,de){if(this.yy.parser)this.yy.parser.parseError(W,de);else throw new Error(W)},"parseError"),setInput:o(function(be,W){return this.yy=W||this.yy||{},this._input=be,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var be=this._input[0];this.yytext+=be,this.yyleng++,this.offset++,this.match+=be,this.matched+=be;var W=be.match(/(?:\r\n?|\n).*/g);return W?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),be},"input"),unput:o(function(be){var W=be.length,de=be.split(/(?:\r\n?|\n)/g);this._input=be+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-W),this.offset-=W;var re=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),de.length-1&&(this.yylineno-=de.length-1);var oe=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:de?(de.length===re.length?this.yylloc.first_column:0)+re[re.length-de.length].length-de[0].length:this.yylloc.first_column-W},this.options.ranges&&(this.yylloc.range=[oe[0],oe[0]+this.yyleng-W]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(be){this.unput(this.match.slice(be))},"less"),pastInput:o(function(){var be=this.matched.substr(0,this.matched.length-this.match.length);return(be.length>20?"...":"")+be.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var be=this.match;return be.length<20&&(be+=this._input.substr(0,20-be.length)),(be.substr(0,20)+(be.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var be=this.pastInput(),W=new Array(be.length+1).join("-");return be+this.upcomingInput()+` +`+W+"^"},"showPosition"),test_match:o(function(be,W){var de,re,oe;if(this.options.backtrack_lexer&&(oe={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(oe.yylloc.range=this.yylloc.range.slice(0))),re=be[0].match(/(?:\r\n?|\n).*/g),re&&(this.yylineno+=re.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:re?re[re.length-1].length-re[re.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+be[0].length},this.yytext+=be[0],this.match+=be[0],this.matches=be,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(be[0].length),this.matched+=be[0],de=this.performAction.call(this,this.yy,this,W,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),de)return de;if(this._backtrack){for(var V in oe)this[V]=oe[V];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var be,W,de,re;this._more||(this.yytext="",this.match="");for(var oe=this._currentRules(),V=0;VW[0].length)){if(W=de,re=V,this.options.backtrack_lexer){if(be=this.test_match(de,oe[V]),be!==!1)return be;if(this._backtrack){W=!1;continue}else return!1}else if(!this.options.flex)break}return W?(be=this.test_match(W,oe[re]),be!==!1?be:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var W=this.next();return W||this.lex()},"lex"),begin:o(function(W){this.conditionStack.push(W)},"begin"),popState:o(function(){var W=this.conditionStack.length-1;return W>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(W){return W=this.conditionStack.length-1-Math.abs(W||0),W>=0?this.conditionStack[W]:"INITIAL"},"topState"),pushState:o(function(W){this.begin(W)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(W,de,re,oe){var V=oe;switch(re){case 0:return 60;case 1:return 61;case 2:return 62;case 3:return 63;case 4:break;case 5:break;case 6:return this.begin("acc_title"),33;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),35;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 8;case 14:break;case 15:return 7;case 16:return 7;case 17:return"EDGE_STATE";case 18:this.begin("callback_name");break;case 19:this.popState();break;case 20:this.popState(),this.begin("callback_args");break;case 21:return 77;case 22:this.popState();break;case 23:return 78;case 24:this.popState();break;case 25:return"STR";case 26:this.begin("string");break;case 27:return 80;case 28:return 55;case 29:return this.begin("namespace"),42;break;case 30:return this.popState(),8;break;case 31:break;case 32:return this.begin("namespace-body"),39;break;case 33:return this.popState(),41;break;case 34:return"EOF_IN_STRUCT";case 35:return 8;case 36:break;case 37:return"EDGE_STATE";case 38:return this.begin("class"),46;break;case 39:return this.popState(),8;break;case 40:break;case 41:return this.popState(),this.popState(),41;break;case 42:return this.begin("class-body"),39;break;case 43:return this.popState(),41;break;case 44:return"EOF_IN_STRUCT";case 45:return"EDGE_STATE";case 46:return"OPEN_IN_STRUCT";case 47:break;case 48:return"MEMBER";case 49:return 81;case 50:return 73;case 51:return 74;case 52:return 76;case 53:return 52;case 54:return 54;case 55:return 47;case 56:return 48;case 57:return 79;case 58:this.popState();break;case 59:return"GENERICTYPE";case 60:this.begin("generic");break;case 61:this.popState();break;case 62:return"BQUOTE_STR";case 63:this.begin("bqstring");break;case 64:return 75;case 65:return 75;case 66:return 75;case 67:return 75;case 68:return 67;case 69:return 67;case 70:return 69;case 71:return 69;case 72:return 68;case 73:return 66;case 74:return 70;case 75:return 71;case 76:return 72;case 77:return 22;case 78:return 44;case 79:return 99;case 80:return 17;case 81:return"PLUS";case 82:return 85;case 83:return 59;case 84:return 88;case 85:return 88;case 86:return 89;case 87:return"EQUALS";case 88:return"EQUALS";case 89:return 58;case 90:return 12;case 91:return 14;case 92:return"PUNCTUATION";case 93:return 84;case 94:return 101;case 95:return 87;case 96:return 87;case 97:return 9}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:\[\*\])/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:["])/,/^(?:[^"]*)/,/^(?:["])/,/^(?:style\b)/,/^(?:classDef\b)/,/^(?:namespace\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:\[\*\])/,/^(?:class\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[}])/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\[\*\])/,/^(?:[{])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:href\b)/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:~)/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:[`])/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?::)/,/^(?:,)/,/^(?:#)/,/^(?:#)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:\[)/,/^(?:\])/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:\s)/,/^(?:$)/],conditions:{"namespace-body":{rules:[26,33,34,35,36,37,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},namespace:{rules:[26,29,30,31,32,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},"class-body":{rules:[26,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},class:{rules:[26,39,40,41,42,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr_multiline:{rules:[11,12,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr:{rules:[9,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_title:{rules:[7,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_args:{rules:[22,23,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_name:{rules:[19,20,21,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},href:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},struct:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},generic:{rules:[26,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},bqstring:{rules:[26,49,50,51,52,53,54,55,56,57,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},string:{rules:[24,25,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,26,27,28,29,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97],inclusive:!0}}};return Ie}();He.lexer=$e;function Re(){this.yy={}}return o(Re,"Parser"),Re.prototype=He,He.Parser=Re,new Re}();MO.parser=MO;L6=MO});var Dfe,kb,Lfe=N(()=>{"use strict";zt();gr();Dfe=["#","+","~","-",""],kb=class{static{o(this,"ClassMember")}constructor(e,r){this.memberType=r,this.visibility="",this.classifier="",this.text="";let n=Tr(e,me());this.parseMember(n)}getDisplayDetails(){let e=this.visibility+ec(this.id);this.memberType==="method"&&(e+=`(${ec(this.parameters.trim())})`,this.returnType&&(e+=" : "+ec(this.returnType))),e=e.trim();let r=this.parseClassifier();return{displayText:e,cssStyle:r}}parseMember(e){let r="";if(this.memberType==="method"){let a=/([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/.exec(e);if(a){let s=a[1]?a[1].trim():"";if(Dfe.includes(s)&&(this.visibility=s),this.id=a[2],this.parameters=a[3]?a[3].trim():"",r=a[4]?a[4].trim():"",this.returnType=a[5]?a[5].trim():"",r===""){let l=this.returnType.substring(this.returnType.length-1);/[$*]/.exec(l)&&(r=l,this.returnType=this.returnType.substring(0,this.returnType.length-1))}}}else{let i=e.length,a=e.substring(0,1),s=e.substring(i-1);Dfe.includes(a)&&(this.visibility=a),/[$*]/.exec(s)&&(r=s),this.id=e.substring(this.visibility===""?0:1,r===""?i:i-1)}this.classifier=r,this.id=this.id.startsWith(" ")?" "+this.id.trim():this.id.trim();let n=`${this.visibility?"\\"+this.visibility:""}${ec(this.id)}${this.memberType==="method"?`(${ec(this.parameters)})${this.returnType?" : "+ec(this.returnType):""}`:""}`;this.text=n.replaceAll("<","<").replaceAll(">",">"),this.text.startsWith("\\<")&&(this.text=this.text.replace("\\<","~"))}parseClassifier(){switch(this.classifier){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}}}});var R6,Rfe,Lp,D1,OO=N(()=>{"use strict";dr();vt();zt();gr();ir();mi();Lfe();R6="classId-",Rfe=0,Lp=o(t=>Ze.sanitizeText(t,me()),"sanitizeText"),D1=class{constructor(){this.relations=[];this.classes=new Map;this.styleClasses=new Map;this.notes=[];this.interfaces=[];this.namespaces=new Map;this.namespaceCounter=0;this.functions=[];this.lineType={LINE:0,DOTTED_LINE:1};this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3,LOLLIPOP:4};this.setupToolTips=o(e=>{let r=Ge(".mermaidTooltip");(r._groups||r)[0][0]===null&&(r=Ge("body").append("div").attr("class","mermaidTooltip").style("opacity",0)),Ge(e).select("svg").selectAll("g.node").on("mouseover",a=>{let s=Ge(a.currentTarget);if(s.attr("title")===null)return;let u=this.getBoundingClientRect();r.transition().duration(200).style("opacity",".9"),r.text(s.attr("title")).style("left",window.scrollX+u.left+(u.right-u.left)/2+"px").style("top",window.scrollY+u.top-14+document.body.scrollTop+"px"),r.html(r.html().replace(/<br\/>/g,"
    ")),s.classed("hover",!0)}).on("mouseout",a=>{r.transition().duration(500).style("opacity",0),Ge(a.currentTarget).classed("hover",!1)})},"setupToolTips");this.direction="TB";this.setAccTitle=Lr;this.getAccTitle=Rr;this.setAccDescription=Nr;this.getAccDescription=Mr;this.setDiagramTitle=$r;this.getDiagramTitle=Ir;this.getConfig=o(()=>me().class,"getConfig");this.functions.push(this.setupToolTips.bind(this)),this.clear(),this.addRelation=this.addRelation.bind(this),this.addClassesToNamespace=this.addClassesToNamespace.bind(this),this.addNamespace=this.addNamespace.bind(this),this.setCssClass=this.setCssClass.bind(this),this.addMembers=this.addMembers.bind(this),this.addClass=this.addClass.bind(this),this.setClassLabel=this.setClassLabel.bind(this),this.addAnnotation=this.addAnnotation.bind(this),this.addMember=this.addMember.bind(this),this.cleanupLabel=this.cleanupLabel.bind(this),this.addNote=this.addNote.bind(this),this.defineClass=this.defineClass.bind(this),this.setDirection=this.setDirection.bind(this),this.setLink=this.setLink.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.clear=this.clear.bind(this),this.setTooltip=this.setTooltip.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setCssStyle=this.setCssStyle.bind(this)}static{o(this,"ClassDB")}splitClassNameAndType(e){let r=Ze.sanitizeText(e,me()),n="",i=r;if(r.indexOf("~")>0){let a=r.split("~");i=Lp(a[0]),n=Lp(a[1])}return{className:i,type:n}}setClassLabel(e,r){let n=Ze.sanitizeText(e,me());r&&(r=Lp(r));let{className:i}=this.splitClassNameAndType(n);this.classes.get(i).label=r,this.classes.get(i).text=`${r}${this.classes.get(i).type?`<${this.classes.get(i).type}>`:""}`}addClass(e){let r=Ze.sanitizeText(e,me()),{className:n,type:i}=this.splitClassNameAndType(r);if(this.classes.has(n))return;let a=Ze.sanitizeText(n,me());this.classes.set(a,{id:a,type:i,label:a,text:`${a}${i?`<${i}>`:""}`,shape:"classBox",cssClasses:"default",methods:[],members:[],annotations:[],styles:[],domId:R6+a+"-"+Rfe}),Rfe++}addInterface(e,r){let n={id:`interface${this.interfaces.length}`,label:e,classId:r};this.interfaces.push(n)}lookUpDomId(e){let r=Ze.sanitizeText(e,me());if(this.classes.has(r))return this.classes.get(r).domId;throw new Error("Class not found: "+r)}clear(){this.relations=[],this.classes=new Map,this.notes=[],this.interfaces=[],this.functions=[],this.functions.push(this.setupToolTips.bind(this)),this.namespaces=new Map,this.namespaceCounter=0,this.direction="TB",Ar()}getClass(e){return this.classes.get(e)}getClasses(){return this.classes}getRelations(){return this.relations}getNotes(){return this.notes}addRelation(e){Y.debug("Adding relation: "+JSON.stringify(e));let r=[this.relationType.LOLLIPOP,this.relationType.AGGREGATION,this.relationType.COMPOSITION,this.relationType.DEPENDENCY,this.relationType.EXTENSION];e.relation.type1===this.relationType.LOLLIPOP&&!r.includes(e.relation.type2)?(this.addClass(e.id2),this.addInterface(e.id1,e.id2),e.id1=`interface${this.interfaces.length-1}`):e.relation.type2===this.relationType.LOLLIPOP&&!r.includes(e.relation.type1)?(this.addClass(e.id1),this.addInterface(e.id2,e.id1),e.id2=`interface${this.interfaces.length-1}`):(this.addClass(e.id1),this.addClass(e.id2)),e.id1=this.splitClassNameAndType(e.id1).className,e.id2=this.splitClassNameAndType(e.id2).className,e.relationTitle1=Ze.sanitizeText(e.relationTitle1.trim(),me()),e.relationTitle2=Ze.sanitizeText(e.relationTitle2.trim(),me()),this.relations.push(e)}addAnnotation(e,r){let n=this.splitClassNameAndType(e).className;this.classes.get(n).annotations.push(r)}addMember(e,r){this.addClass(e);let n=this.splitClassNameAndType(e).className,i=this.classes.get(n);if(typeof r=="string"){let a=r.trim();a.startsWith("<<")&&a.endsWith(">>")?i.annotations.push(Lp(a.substring(2,a.length-2))):a.indexOf(")")>0?i.methods.push(new kb(a,"method")):a&&i.members.push(new kb(a,"attribute"))}}addMembers(e,r){Array.isArray(r)&&(r.reverse(),r.forEach(n=>this.addMember(e,n)))}addNote(e,r){let n={id:`note${this.notes.length}`,class:r,text:e};this.notes.push(n)}cleanupLabel(e){return e.startsWith(":")&&(e=e.substring(1)),Lp(e.trim())}setCssClass(e,r){e.split(",").forEach(n=>{let i=n;/\d/.exec(n[0])&&(i=R6+i);let a=this.classes.get(i);a&&(a.cssClasses+=" "+r)})}defineClass(e,r){for(let n of e){let i=this.styleClasses.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.styleClasses.set(n,i)),r&&r.forEach(a=>{if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)}),this.classes.forEach(a=>{a.cssClasses.includes(n)&&a.styles.push(...r.flatMap(s=>s.split(",")))})}}setTooltip(e,r){e.split(",").forEach(n=>{r!==void 0&&(this.classes.get(n).tooltip=Lp(r))})}getTooltip(e,r){return r&&this.namespaces.has(r)?this.namespaces.get(r).classes.get(e).tooltip:this.classes.get(e).tooltip}setLink(e,r,n){let i=me();e.split(",").forEach(a=>{let s=a;/\d/.exec(a[0])&&(s=R6+s);let l=this.classes.get(s);l&&(l.link=Gt.formatUrl(r,i),i.securityLevel==="sandbox"?l.linkTarget="_top":typeof n=="string"?l.linkTarget=Lp(n):l.linkTarget="_blank")}),this.setCssClass(e,"clickable")}setClickEvent(e,r,n){e.split(",").forEach(i=>{this.setClickFunc(i,r,n),this.classes.get(i).haveCallback=!0}),this.setCssClass(e,"clickable")}setClickFunc(e,r,n){let i=Ze.sanitizeText(e,me());if(me().securityLevel!=="loose"||r===void 0)return;let s=i;if(this.classes.has(s)){let l=this.lookUpDomId(s),u=[];if(typeof n=="string"){u=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let h=0;h{let h=document.querySelector(`[id="${l}"]`);h!==null&&h.addEventListener("click",()=>{Gt.runFunc(r,...u)},!1)})}}bindFunctions(e){this.functions.forEach(r=>{r(e)})}getDirection(){return this.direction}setDirection(e){this.direction=e}addNamespace(e){this.namespaces.has(e)||(this.namespaces.set(e,{id:e,classes:new Map,children:{},domId:R6+e+"-"+this.namespaceCounter}),this.namespaceCounter++)}getNamespace(e){return this.namespaces.get(e)}getNamespaces(){return this.namespaces}addClassesToNamespace(e,r){if(this.namespaces.has(e))for(let n of r){let{className:i}=this.splitClassNameAndType(n);this.classes.get(i).parent=e,this.namespaces.get(e).classes.set(i,this.classes.get(i))}}setCssStyle(e,r){let n=this.classes.get(e);if(!(!r||!n))for(let i of r)i.includes(",")?n.styles.push(...i.split(",")):n.styles.push(i)}getArrowMarker(e){let r;switch(e){case 0:r="aggregation";break;case 1:r="extension";break;case 2:r="composition";break;case 3:r="dependency";break;case 4:r="lollipop";break;default:r="none"}return r}getData(){let e=[],r=[],n=me();for(let a of this.namespaces.keys()){let s=this.namespaces.get(a);if(s){let l={id:s.id,label:s.id,isGroup:!0,padding:n.class.padding??16,shape:"rect",cssStyles:["fill: none","stroke: black"],look:n.look};e.push(l)}}for(let a of this.classes.keys()){let s=this.classes.get(a);if(s){let l=s;l.parentId=s.parent,l.look=n.look,e.push(l)}}let i=0;for(let a of this.notes){i++;let s={id:a.id,label:a.text,isGroup:!1,shape:"note",padding:n.class.padding??6,cssStyles:["text-align: left","white-space: nowrap",`fill: ${n.themeVariables.noteBkgColor}`,`stroke: ${n.themeVariables.noteBorderColor}`],look:n.look};e.push(s);let l=this.classes.get(a.class)?.id??"";if(l){let u={id:`edgeNote${i}`,start:a.id,end:l,type:"normal",thickness:"normal",classes:"relation",arrowTypeStart:"none",arrowTypeEnd:"none",arrowheadStyle:"",labelStyle:[""],style:["fill: none"],pattern:"dotted",look:n.look};r.push(u)}}for(let a of this.interfaces){let s={id:a.id,label:a.label,isGroup:!1,shape:"rect",cssStyles:["opacity: 0;"],look:n.look};e.push(s)}i=0;for(let a of this.relations){i++;let s={id:$h(a.id1,a.id2,{prefix:"id",counter:i}),start:a.id1,end:a.id2,type:"normal",label:a.title,labelpos:"c",thickness:"normal",classes:"relation",arrowTypeStart:this.getArrowMarker(a.relation.type1),arrowTypeEnd:this.getArrowMarker(a.relation.type2),startLabelRight:a.relationTitle1==="none"?"":a.relationTitle1,endLabelLeft:a.relationTitle2==="none"?"":a.relationTitle2,arrowheadStyle:"",labelStyle:["display: inline-block"],style:a.style||"",pattern:a.relation.lineType==1?"dashed":"solid",look:n.look};r.push(s)}return{nodes:e,edges:r,other:{},config:n,direction:this.getDirection()}}}});var UVe,N6,PO=N(()=>{"use strict";UVe=o(t=>`g.classGroup text { + fill: ${t.nodeBorder||t.classText}; + stroke: none; + font-family: ${t.fontFamily}; + font-size: 10px; + + .title { + font-weight: bolder; + } + +} + +.nodeLabel, .edgeLabel { + color: ${t.classText}; +} +.edgeLabel .label rect { + fill: ${t.mainBkg}; +} +.label text { + fill: ${t.classText}; +} + +.labelBkg { + background: ${t.mainBkg}; +} +.edgeLabel .label span { + background: ${t.mainBkg}; +} + +.classTitle { + font-weight: bolder; +} +.node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + + +.divider { + stroke: ${t.nodeBorder}; + stroke-width: 1; +} + +g.clickable { + cursor: pointer; +} + +g.classGroup rect { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; +} + +g.classGroup line { + stroke: ${t.nodeBorder}; + stroke-width: 1; +} + +.classLabel .box { + stroke: none; + stroke-width: 0; + fill: ${t.mainBkg}; + opacity: 0.5; +} + +.classLabel .label { + fill: ${t.nodeBorder}; + font-size: 10px; +} + +.relation { + stroke: ${t.lineColor}; + stroke-width: 1; + fill: none; +} + +.dashed-line{ + stroke-dasharray: 3; +} + +.dotted-line{ + stroke-dasharray: 1 2; +} + +#compositionStart, .composition { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#compositionEnd, .composition { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${t.lineColor} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#extensionStart, .extension { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#extensionEnd, .extension { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#aggregationStart, .aggregation { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#aggregationEnd, .aggregation { + fill: transparent !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#lollipopStart, .lollipop { + fill: ${t.mainBkg} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +#lollipopEnd, .lollipop { + fill: ${t.mainBkg} !important; + stroke: ${t.lineColor} !important; + stroke-width: 1; +} + +.edgeTerminals { + font-size: 11px; + line-height: initial; +} + +.classTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; +} +`,"getStyles"),N6=UVe});var HVe,WVe,qVe,M6,BO=N(()=>{"use strict";zt();vt();gm();Yd();$m();ir();HVe=o((t,e="TB")=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),WVe=o(function(t,e){return e.db.getClasses()},"getClasses"),qVe=o(async function(t,e,r,n){Y.info("REF0:"),Y.info("Drawing class diagram (v3)",e);let{securityLevel:i,state:a,layout:s}=me(),l=n.db.getData(),u=yc(e,i);l.type=n.type,l.layoutAlgorithm=nf(s),l.nodeSpacing=a?.nodeSpacing||50,l.rankSpacing=a?.rankSpacing||50,l.markers=["aggregation","extension","composition","dependency","lollipop"],l.diagramId=e,await Cc(l,u);let h=8;Gt.insertTitle(u,"classDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Ac(u,h,"classDiagram",a?.useMaxWidth??!0)},"draw"),M6={getClasses:WVe,draw:qVe,getDir:HVe}});var Nfe={};hr(Nfe,{diagram:()=>YVe});var YVe,Mfe=N(()=>{"use strict";IO();OO();PO();BO();YVe={parser:L6,get db(){return new D1},renderer:M6,styles:N6,init:o(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var Pfe={};hr(Pfe,{diagram:()=>QVe});var QVe,Bfe=N(()=>{"use strict";IO();OO();PO();BO();QVe={parser:L6,get db(){return new D1},renderer:M6,styles:N6,init:o(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var FO,I6,$O=N(()=>{"use strict";FO=function(){var t=o(function(F,P,z,$){for(z=z||{},$=F.length;$--;z[F[$]]=P);return z},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],l=[1,16],u=[1,17],h=[1,18],f=[1,19],d=[1,32],p=[1,20],m=[1,21],g=[1,22],y=[1,23],v=[1,24],x=[1,26],b=[1,27],w=[1,28],C=[1,29],T=[1,30],E=[1,31],A=[1,34],S=[1,35],_=[1,36],I=[1,37],D=[1,33],k=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],L=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],R=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],O={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,SD:6,document:7,line:8,statement:9,classDefStatement:10,styleStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"-->":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,classDef:38,CLASSDEF_ID:39,CLASSDEF_STYLEOPTS:40,DEFAULT:41,style:42,STYLE_IDS:43,STYLEDEF_STYLEOPTS:44,class:45,CLASSENTITY_IDS:46,STYLECLASS:47,direction_tb:48,direction_bt:49,direction_rl:50,direction_lr:51,eol:52,";":53,EDGE_STATE:54,STYLE_SEPARATOR:55,left_of:56,right_of:57,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",6:"SD",14:"DESCR",15:"-->",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"classDef",39:"CLASSDEF_ID",40:"CLASSDEF_STYLEOPTS",41:"DEFAULT",42:"style",43:"STYLE_IDS",44:"STYLEDEF_STYLEOPTS",45:"class",46:"CLASSENTITY_IDS",47:"STYLECLASS",48:"direction_tb",49:"direction_bt",50:"direction_rl",51:"direction_lr",53:";",54:"EDGE_STATE",55:"STYLE_SEPARATOR",56:"left_of",57:"right_of"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,1],[9,4],[9,4],[9,1],[9,2],[9,2],[9,1],[10,3],[10,3],[11,3],[12,3],[32,1],[32,1],[32,1],[32,1],[52,1],[52,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1]],performAction:o(function(P,z,$,H,Q,j,ie){var ne=j.length-1;switch(Q){case 3:return H.setRootDoc(j[ne]),j[ne];break;case 4:this.$=[];break;case 5:j[ne]!="nl"&&(j[ne-1].push(j[ne]),this.$=j[ne-1]);break;case 6:case 7:this.$=j[ne];break;case 8:this.$="nl";break;case 12:this.$=j[ne];break;case 13:let X=j[ne-1];X.description=H.trimColon(j[ne]),this.$=X;break;case 14:this.$={stmt:"relation",state1:j[ne-2],state2:j[ne]};break;case 15:let te=H.trimColon(j[ne]);this.$={stmt:"relation",state1:j[ne-3],state2:j[ne-1],description:te};break;case 19:this.$={stmt:"state",id:j[ne-3],type:"default",description:"",doc:j[ne-1]};break;case 20:var le=j[ne],he=j[ne-2].trim();if(j[ne].match(":")){var K=j[ne].split(":");le=K[0],he=[he,K[1]]}this.$={stmt:"state",id:le,type:"default",description:he};break;case 21:this.$={stmt:"state",id:j[ne-3],type:"default",description:j[ne-5],doc:j[ne-1]};break;case 22:this.$={stmt:"state",id:j[ne],type:"fork"};break;case 23:this.$={stmt:"state",id:j[ne],type:"join"};break;case 24:this.$={stmt:"state",id:j[ne],type:"choice"};break;case 25:this.$={stmt:"state",id:H.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:j[ne-1].trim(),note:{position:j[ne-2].trim(),text:j[ne].trim()}};break;case 29:this.$=j[ne].trim(),H.setAccTitle(this.$);break;case 30:case 31:this.$=j[ne].trim(),H.setAccDescription(this.$);break;case 32:case 33:this.$={stmt:"classDef",id:j[ne-1].trim(),classes:j[ne].trim()};break;case 34:this.$={stmt:"style",id:j[ne-1].trim(),styleClass:j[ne].trim()};break;case 35:this.$={stmt:"applyClass",id:j[ne-1].trim(),styleClass:j[ne].trim()};break;case 36:H.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 37:H.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 38:H.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 39:H.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 42:case 43:this.$={stmt:"state",id:j[ne].trim(),type:"default",description:""};break;case 44:this.$={stmt:"state",id:j[ne-2].trim(),classes:[j[ne].trim()],type:"default",description:""};break;case 45:this.$={stmt:"state",id:j[ne-2].trim(),classes:[j[ne].trim()],type:"default",description:""};break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:w,38:C,42:T,45:E,48:A,49:S,50:_,51:I,54:D},t(k,[2,5]),{9:38,10:12,11:13,12:14,13:15,16:l,17:u,19:h,22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:w,38:C,42:T,45:E,48:A,49:S,50:_,51:I,54:D},t(k,[2,7]),t(k,[2,8]),t(k,[2,9]),t(k,[2,10]),t(k,[2,11]),t(k,[2,12],{14:[1,39],15:[1,40]}),t(k,[2,16]),{18:[1,41]},t(k,[2,18],{20:[1,42]}),{23:[1,43]},t(k,[2,22]),t(k,[2,23]),t(k,[2,24]),t(k,[2,25]),{30:44,31:[1,45],56:[1,46],57:[1,47]},t(k,[2,28]),{34:[1,48]},{36:[1,49]},t(k,[2,31]),{39:[1,50],41:[1,51]},{43:[1,52]},{46:[1,53]},t(L,[2,42],{55:[1,54]}),t(L,[2,43],{55:[1,55]}),t(k,[2,36]),t(k,[2,37]),t(k,[2,38]),t(k,[2,39]),t(k,[2,6]),t(k,[2,13]),{13:56,24:d,54:D},t(k,[2,17]),t(R,i,{7:57}),{24:[1,58]},{24:[1,59]},{23:[1,60]},{24:[2,46]},{24:[2,47]},t(k,[2,29]),t(k,[2,30]),{40:[1,61]},{40:[1,62]},{44:[1,63]},{47:[1,64]},{24:[1,65]},{24:[1,66]},t(k,[2,14],{14:[1,67]}),{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,21:[1,68],22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:w,38:C,42:T,45:E,48:A,49:S,50:_,51:I,54:D},t(k,[2,20],{20:[1,69]}),{31:[1,70]},{24:[1,71]},t(k,[2,32]),t(k,[2,33]),t(k,[2,34]),t(k,[2,35]),t(L,[2,44]),t(L,[2,45]),t(k,[2,15]),t(k,[2,19]),t(R,i,{7:72}),t(k,[2,26]),t(k,[2,27]),{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,21:[1,73],22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:w,38:C,42:T,45:E,48:A,49:S,50:_,51:I,54:D},t(k,[2,21])],defaultActions:{5:[2,1],6:[2,2],46:[2,46],47:[2,47]},parseError:o(function(P,z){if(z.recoverable)this.trace(P);else{var $=new Error(P);throw $.hash=z,$}},"parseError"),parse:o(function(P){var z=this,$=[0],H=[],Q=[null],j=[],ie=this.table,ne="",le=0,he=0,K=0,X=2,te=1,J=j.slice.call(arguments,1),se=Object.create(this.lexer),ue={yy:{}};for(var Z in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Z)&&(ue.yy[Z]=this.yy[Z]);se.setInput(P,ue.yy),ue.yy.lexer=se,ue.yy.parser=this,typeof se.yylloc>"u"&&(se.yylloc={});var Se=se.yylloc;j.push(Se);var ce=se.options&&se.options.ranges;typeof ue.yy.parseError=="function"?this.parseError=ue.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ae(xe){$.length=$.length-2*xe,Q.length=Q.length-xe,j.length=j.length-xe}o(ae,"popStack");function Oe(){var xe;return xe=H.pop()||se.lex()||te,typeof xe!="number"&&(xe instanceof Array&&(H=xe,xe=H.pop()),xe=z.symbols_[xe]||xe),xe}o(Oe,"lex");for(var ge,ze,He,$e,Re,Ie,be={},W,de,re,oe;;){if(He=$[$.length-1],this.defaultActions[He]?$e=this.defaultActions[He]:((ge===null||typeof ge>"u")&&(ge=Oe()),$e=ie[He]&&ie[He][ge]),typeof $e>"u"||!$e.length||!$e[0]){var V="";oe=[];for(W in ie[He])this.terminals_[W]&&W>X&&oe.push("'"+this.terminals_[W]+"'");se.showPosition?V="Parse error on line "+(le+1)+`: +`+se.showPosition()+` +Expecting `+oe.join(", ")+", got '"+(this.terminals_[ge]||ge)+"'":V="Parse error on line "+(le+1)+": Unexpected "+(ge==te?"end of input":"'"+(this.terminals_[ge]||ge)+"'"),this.parseError(V,{text:se.match,token:this.terminals_[ge]||ge,line:se.yylineno,loc:Se,expected:oe})}if($e[0]instanceof Array&&$e.length>1)throw new Error("Parse Error: multiple actions possible at state: "+He+", token: "+ge);switch($e[0]){case 1:$.push(ge),Q.push(se.yytext),j.push(se.yylloc),$.push($e[1]),ge=null,ze?(ge=ze,ze=null):(he=se.yyleng,ne=se.yytext,le=se.yylineno,Se=se.yylloc,K>0&&K--);break;case 2:if(de=this.productions_[$e[1]][1],be.$=Q[Q.length-de],be._$={first_line:j[j.length-(de||1)].first_line,last_line:j[j.length-1].last_line,first_column:j[j.length-(de||1)].first_column,last_column:j[j.length-1].last_column},ce&&(be._$.range=[j[j.length-(de||1)].range[0],j[j.length-1].range[1]]),Ie=this.performAction.apply(be,[ne,he,le,ue.yy,$e[1],Q,j].concat(J)),typeof Ie<"u")return Ie;de&&($=$.slice(0,-1*de*2),Q=Q.slice(0,-1*de),j=j.slice(0,-1*de)),$.push(this.productions_[$e[1]][0]),Q.push(be.$),j.push(be._$),re=ie[$[$.length-2]][$[$.length-1]],$.push(re);break;case 3:return!0}}return!0},"parse")},M=function(){var F={EOF:1,parseError:o(function(z,$){if(this.yy.parser)this.yy.parser.parseError(z,$);else throw new Error(z)},"parseError"),setInput:o(function(P,z){return this.yy=z||this.yy||{},this._input=P,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var P=this._input[0];this.yytext+=P,this.yyleng++,this.offset++,this.match+=P,this.matched+=P;var z=P.match(/(?:\r\n?|\n).*/g);return z?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),P},"input"),unput:o(function(P){var z=P.length,$=P.split(/(?:\r\n?|\n)/g);this._input=P+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-z),this.offset-=z;var H=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),$.length-1&&(this.yylineno-=$.length-1);var Q=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:$?($.length===H.length?this.yylloc.first_column:0)+H[H.length-$.length].length-$[0].length:this.yylloc.first_column-z},this.options.ranges&&(this.yylloc.range=[Q[0],Q[0]+this.yyleng-z]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(P){this.unput(this.match.slice(P))},"less"),pastInput:o(function(){var P=this.matched.substr(0,this.matched.length-this.match.length);return(P.length>20?"...":"")+P.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var P=this.match;return P.length<20&&(P+=this._input.substr(0,20-P.length)),(P.substr(0,20)+(P.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var P=this.pastInput(),z=new Array(P.length+1).join("-");return P+this.upcomingInput()+` +`+z+"^"},"showPosition"),test_match:o(function(P,z){var $,H,Q;if(this.options.backtrack_lexer&&(Q={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Q.yylloc.range=this.yylloc.range.slice(0))),H=P[0].match(/(?:\r\n?|\n).*/g),H&&(this.yylineno+=H.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:H?H[H.length-1].length-H[H.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+P[0].length},this.yytext+=P[0],this.match+=P[0],this.matches=P,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(P[0].length),this.matched+=P[0],$=this.performAction.call(this,this.yy,this,z,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),$)return $;if(this._backtrack){for(var j in Q)this[j]=Q[j];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var P,z,$,H;this._more||(this.yytext="",this.match="");for(var Q=this._currentRules(),j=0;jz[0].length)){if(z=$,H=j,this.options.backtrack_lexer){if(P=this.test_match($,Q[j]),P!==!1)return P;if(this._backtrack){z=!1;continue}else return!1}else if(!this.options.flex)break}return z?(P=this.test_match(z,Q[H]),P!==!1?P:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var z=this.next();return z||this.lex()},"lex"),begin:o(function(z){this.conditionStack.push(z)},"begin"),popState:o(function(){var z=this.conditionStack.length-1;return z>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(z){return z=this.conditionStack.length-1-Math.abs(z||0),z>=0?this.conditionStack[z]:"INITIAL"},"topState"),pushState:o(function(z){this.begin(z)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(z,$,H,Q){var j=Q;switch(H){case 0:return 41;case 1:return 48;case 2:return 49;case 3:return 50;case 4:return 51;case 5:break;case 6:break;case 7:return 5;case 8:break;case 9:break;case 10:break;case 11:break;case 12:return this.pushState("SCALE"),17;break;case 13:return 18;case 14:this.popState();break;case 15:return this.begin("acc_title"),33;break;case 16:return this.popState(),"acc_title_value";break;case 17:return this.begin("acc_descr"),35;break;case 18:return this.popState(),"acc_descr_value";break;case 19:this.begin("acc_descr_multiline");break;case 20:this.popState();break;case 21:return"acc_descr_multiline_value";case 22:return this.pushState("CLASSDEF"),38;break;case 23:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 24:return this.popState(),this.pushState("CLASSDEFID"),39;break;case 25:return this.popState(),40;break;case 26:return this.pushState("CLASS"),45;break;case 27:return this.popState(),this.pushState("CLASS_STYLE"),46;break;case 28:return this.popState(),47;break;case 29:return this.pushState("STYLE"),42;break;case 30:return this.popState(),this.pushState("STYLEDEF_STYLES"),43;break;case 31:return this.popState(),44;break;case 32:return this.pushState("SCALE"),17;break;case 33:return 18;case 34:this.popState();break;case 35:this.pushState("STATE");break;case 36:return this.popState(),$.yytext=$.yytext.slice(0,-8).trim(),25;break;case 37:return this.popState(),$.yytext=$.yytext.slice(0,-8).trim(),26;break;case 38:return this.popState(),$.yytext=$.yytext.slice(0,-10).trim(),27;break;case 39:return this.popState(),$.yytext=$.yytext.slice(0,-8).trim(),25;break;case 40:return this.popState(),$.yytext=$.yytext.slice(0,-8).trim(),26;break;case 41:return this.popState(),$.yytext=$.yytext.slice(0,-10).trim(),27;break;case 42:return 48;case 43:return 49;case 44:return 50;case 45:return 51;case 46:this.pushState("STATE_STRING");break;case 47:return this.pushState("STATE_ID"),"AS";break;case 48:return this.popState(),"ID";break;case 49:this.popState();break;case 50:return"STATE_DESCR";case 51:return 19;case 52:this.popState();break;case 53:return this.popState(),this.pushState("struct"),20;break;case 54:break;case 55:return this.popState(),21;break;case 56:break;case 57:return this.begin("NOTE"),29;break;case 58:return this.popState(),this.pushState("NOTE_ID"),56;break;case 59:return this.popState(),this.pushState("NOTE_ID"),57;break;case 60:this.popState(),this.pushState("FLOATING_NOTE");break;case 61:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";break;case 62:break;case 63:return"NOTE_TEXT";case 64:return this.popState(),"ID";break;case 65:return this.popState(),this.pushState("NOTE_TEXT"),24;break;case 66:return this.popState(),$.yytext=$.yytext.substr(2).trim(),31;break;case 67:return this.popState(),$.yytext=$.yytext.slice(0,-8).trim(),31;break;case 68:return 6;case 69:return 6;case 70:return 16;case 71:return 54;case 72:return 24;case 73:return $.yytext=$.yytext.trim(),14;break;case 74:return 15;case 75:return 28;case 76:return 55;case 77:return 5;case 78:return"INVALID"}},"anonymous"),rules:[/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:style\s+)/i,/^(?:[\w,]+\s+)/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[9,10],inclusive:!1},struct:{rules:[9,10,22,26,29,35,42,43,44,45,54,55,56,57,71,72,73,74,75],inclusive:!1},FLOATING_NOTE_ID:{rules:[64],inclusive:!1},FLOATING_NOTE:{rules:[61,62,63],inclusive:!1},NOTE_TEXT:{rules:[66,67],inclusive:!1},NOTE_ID:{rules:[65],inclusive:!1},NOTE:{rules:[58,59,60],inclusive:!1},STYLEDEF_STYLEOPTS:{rules:[],inclusive:!1},STYLEDEF_STYLES:{rules:[31],inclusive:!1},STYLE_IDS:{rules:[],inclusive:!1},STYLE:{rules:[30],inclusive:!1},CLASS_STYLE:{rules:[28],inclusive:!1},CLASS:{rules:[27],inclusive:!1},CLASSDEFID:{rules:[25],inclusive:!1},CLASSDEF:{rules:[23,24],inclusive:!1},acc_descr_multiline:{rules:[20,21],inclusive:!1},acc_descr:{rules:[18],inclusive:!1},acc_title:{rules:[16],inclusive:!1},SCALE:{rules:[13,14,33,34],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[48],inclusive:!1},STATE_STRING:{rules:[49,50],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[9,10,36,37,38,39,40,41,46,47,51,52,53],inclusive:!1},ID:{rules:[9,10],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,10,11,12,15,17,19,22,26,29,32,35,53,57,68,69,70,71,72,73,74,76,77,78],inclusive:!0}}};return F}();O.lexer=M;function B(){this.yy={}}return o(B,"Parser"),B.prototype=O,O.Parser=B,new B}();FO.parser=FO;I6=FO});var zfe,O6,zO,L1,Eb,Gfe,Vfe,Ufe,Rp,P6,GO,VO,UO,HO,WO,B6,F6,Hfe,Wfe,qO,YO,qfe,Yfe,R1,tUe,Xfe,XO,rUe,nUe,jfe,Kfe,iUe,Qfe,aUe,Zfe,jO,KO,Jfe,$6,ede,QO,z6=N(()=>{"use strict";zfe="TB",O6="TB",zO="dir",L1="state",Eb="relation",Gfe="classDef",Vfe="style",Ufe="applyClass",Rp="default",P6="divider",GO="fill:none",VO="fill: #333",UO="c",HO="text",WO="normal",B6="rect",F6="rectWithTitle",Hfe="stateStart",Wfe="stateEnd",qO="divider",YO="roundedWithTitle",qfe="note",Yfe="noteGroup",R1="statediagram",tUe="state",Xfe=`${R1}-${tUe}`,XO="transition",rUe="note",nUe="note-edge",jfe=`${XO} ${nUe}`,Kfe=`${R1}-${rUe}`,iUe="cluster",Qfe=`${R1}-${iUe}`,aUe="cluster-alt",Zfe=`${R1}-${aUe}`,jO="parent",KO="note",Jfe="state",$6="----",ede=`${$6}${KO}`,QO=`${$6}${jO}`});function ZO(t="",e=0,r="",n=$6){let i=r!==null&&r.length>0?`${n}${r}`:"";return`${Jfe}-${t}${i}-${e}`}function G6(t,e,r){if(!e.id||e.id===""||e.id==="")return;e.cssClasses&&(Array.isArray(e.cssCompiledStyles)||(e.cssCompiledStyles=[]),e.cssClasses.split(" ").forEach(i=>{if(r.get(i)){let a=r.get(i);e.cssCompiledStyles=[...e.cssCompiledStyles,...a.styles]}}));let n=t.find(i=>i.id===e.id);n?Object.assign(n,e):t.push(e)}function oUe(t){return t?.classes?.join(" ")??""}function lUe(t){return t?.styles??[]}var V6,xf,sUe,tde,N1,rde,nde=N(()=>{"use strict";zt();vt();gr();z6();V6=new Map,xf=0;o(ZO,"stateDomId");sUe=o((t,e,r,n,i,a,s,l)=>{Y.trace("items",e),e.forEach(u=>{switch(u.stmt){case L1:N1(t,u,r,n,i,a,s,l);break;case Rp:N1(t,u,r,n,i,a,s,l);break;case Eb:{N1(t,u.state1,r,n,i,a,s,l),N1(t,u.state2,r,n,i,a,s,l);let h={id:"edge"+xf,start:u.state1.id,end:u.state2.id,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:GO,labelStyle:"",label:Ze.sanitizeText(u.description,me()),arrowheadStyle:VO,labelpos:UO,labelType:HO,thickness:WO,classes:XO,look:s};i.push(h),xf++}break}})},"setupDoc"),tde=o((t,e=O6)=>{let r=e;if(t.doc)for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir");o(G6,"insertOrUpdateNode");o(oUe,"getClassesFromDbInfo");o(lUe,"getStylesFromDbInfo");N1=o((t,e,r,n,i,a,s,l)=>{let u=e.id,h=r.get(u),f=oUe(h),d=lUe(h);if(Y.info("dataFetcher parsedItem",e,h,d),u!=="root"){let p=B6;e.start===!0?p=Hfe:e.start===!1&&(p=Wfe),e.type!==Rp&&(p=e.type),V6.get(u)||V6.set(u,{id:u,shape:p,description:Ze.sanitizeText(u,me()),cssClasses:`${f} ${Xfe}`,cssStyles:d});let m=V6.get(u);e.description&&(Array.isArray(m.description)?(m.shape=F6,m.description.push(e.description)):m.description?.length>0?(m.shape=F6,m.description===u?m.description=[e.description]:m.description=[m.description,e.description]):(m.shape=B6,m.description=e.description),m.description=Ze.sanitizeTextOrArray(m.description,me())),m.description?.length===1&&m.shape===F6&&(m.type==="group"?m.shape=YO:m.shape=B6),!m.type&&e.doc&&(Y.info("Setting cluster for XCX",u,tde(e)),m.type="group",m.isGroup=!0,m.dir=tde(e),m.shape=e.type===P6?qO:YO,m.cssClasses=`${m.cssClasses} ${Qfe} ${a?Zfe:""}`);let g={labelStyle:"",shape:m.shape,label:m.description,cssClasses:m.cssClasses,cssCompiledStyles:[],cssStyles:m.cssStyles,id:u,dir:m.dir,domId:ZO(u,xf),type:m.type,isGroup:m.type==="group",padding:8,rx:10,ry:10,look:s};if(g.shape===qO&&(g.label=""),t&&t.id!=="root"&&(Y.trace("Setting node ",u," to be child of its parent ",t.id),g.parentId=t.id),g.centerLabel=!0,e.note){let y={labelStyle:"",shape:qfe,label:e.note.text,cssClasses:Kfe,cssStyles:[],cssCompilesStyles:[],id:u+ede+"-"+xf,domId:ZO(u,xf,KO),type:m.type,isGroup:m.type==="group",padding:me().flowchart.padding,look:s,position:e.note.position},v=u+QO,x={labelStyle:"",shape:Yfe,label:e.note.text,cssClasses:m.cssClasses,cssStyles:[],id:u+QO,domId:ZO(u,xf,jO),type:"group",isGroup:!0,padding:16,look:s,position:e.note.position};xf++,x.id=v,y.parentId=v,G6(n,x,l),G6(n,y,l),G6(n,g,l);let b=u,w=y.id;e.note.position==="left of"&&(b=y.id,w=u),i.push({id:b+"-"+w,start:b,end:w,arrowhead:"none",arrowTypeEnd:"",style:GO,labelStyle:"",classes:jfe,arrowheadStyle:VO,labelpos:UO,labelType:HO,thickness:WO,look:s})}else G6(n,g,l)}e.doc&&(Y.trace("Adding nodes children "),sUe(e,e.doc,r,n,i,!a,s,l))},"dataFetcher"),rde=o(()=>{V6.clear(),xf=0},"reset")});var JO,cUe,uUe,ide,eP=N(()=>{"use strict";zt();vt();gm();Yd();$m();ir();z6();JO=o((t,e=O6)=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),cUe=o(function(t,e){return e.db.getClasses()},"getClasses"),uUe=o(async function(t,e,r,n){Y.info("REF0:"),Y.info("Drawing state diagram (v2)",e);let{securityLevel:i,state:a,layout:s}=me();n.db.extract(n.db.getRootDocV2());let l=n.db.getData(),u=yc(e,i);l.type=n.type,l.layoutAlgorithm=s,l.nodeSpacing=a?.nodeSpacing||50,l.rankSpacing=a?.rankSpacing||50,l.markers=["barb"],l.diagramId=e,await Cc(l,u);let h=8;Gt.insertTitle(u,"statediagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Ac(u,h,R1,a?.useMaxWidth??!0)},"draw"),ide={getClasses:cUe,draw:uUe,getDir:JO}});function ude(){return new Map}var tP,ade,sde,ode,lde,cde,hUe,fUe,hde,U6,Qo,H6=N(()=>{"use strict";zt();vt();ir();gr();mi();nde();eP();z6();tP="[*]",ade="start",sde=tP,ode="end",lde="color",cde="fill",hUe="bgFill",fUe=",";o(ude,"newClassesList");hde=o(()=>({relations:[],states:new Map,documents:{}}),"newDoc"),U6=o(t=>JSON.parse(JSON.stringify(t)),"clone"),Qo=class{static{o(this,"StateDB")}constructor(e){this.clear(),this.version=e,this.setRootDoc=this.setRootDoc.bind(this),this.getDividerId=this.getDividerId.bind(this),this.setDirection=this.setDirection.bind(this),this.trimColon=this.trimColon.bind(this)}version;nodes=[];edges=[];rootDoc=[];classes=ude();documents={root:hde()};currentDocument=this.documents.root;startEndCount=0;dividerCnt=0;static relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3};setRootDoc(e){Y.info("Setting root doc",e),this.rootDoc=e,this.version===1?this.extract(e):this.extract(this.getRootDocV2())}getRootDoc(){return this.rootDoc}docTranslator(e,r,n){if(r.stmt===Eb)this.docTranslator(e,r.state1,!0),this.docTranslator(e,r.state2,!1);else if(r.stmt===L1&&(r.id==="[*]"?(r.id=n?e.id+"_start":e.id+"_end",r.start=n):r.id=r.id.trim()),r.doc){let i=[],a=[],s;for(s=0;s0&&a.length>0){let l={stmt:L1,id:X9(),type:"divider",doc:U6(a)};i.push(U6(l)),r.doc=i}r.doc.forEach(l=>this.docTranslator(r,l,!0))}}getRootDocV2(){return this.docTranslator({id:"root"},{id:"root",doc:this.rootDoc},!0),{id:"root",doc:this.rootDoc}}extract(e){let r;e.doc?r=e.doc:r=e,Y.info(r),this.clear(!0),Y.info("Extract initial document:",r),r.forEach(s=>{switch(Y.warn("Statement",s.stmt),s.stmt){case L1:this.addState(s.id.trim(),s.type,s.doc,s.description,s.note,s.classes,s.styles,s.textStyles);break;case Eb:this.addRelation(s.state1,s.state2,s.description);break;case Gfe:this.addStyleClass(s.id.trim(),s.classes);break;case Vfe:{let l=s.id.trim().split(","),u=s.styleClass.split(",");l.forEach(h=>{let f=this.getState(h);if(f===void 0){let d=h.trim();this.addState(d),f=this.getState(d)}f.styles=u.map(d=>d.replace(/;/g,"")?.trim())})}break;case Ufe:this.setCssClass(s.id.trim(),s.styleClass);break}});let n=this.getStates(),a=me().look;rde(),N1(void 0,this.getRootDocV2(),n,this.nodes,this.edges,!0,a,this.classes),this.nodes.forEach(s=>{if(Array.isArray(s.label)){if(s.description=s.label.slice(1),s.isGroup&&s.description.length>0)throw new Error("Group nodes can only have label. Remove the additional description for node ["+s.id+"]");s.label=s.label[0]}})}addState(e,r=Rp,n=null,i=null,a=null,s=null,l=null,u=null){let h=e?.trim();if(this.currentDocument.states.has(h)?(this.currentDocument.states.get(h).doc||(this.currentDocument.states.get(h).doc=n),this.currentDocument.states.get(h).type||(this.currentDocument.states.get(h).type=r)):(Y.info("Adding state ",h,i),this.currentDocument.states.set(h,{id:h,descriptions:[],type:r,doc:n,note:a,classes:[],styles:[],textStyles:[]})),i&&(Y.info("Setting state description",h,i),typeof i=="string"&&this.addDescription(h,i.trim()),typeof i=="object"&&i.forEach(f=>this.addDescription(h,f.trim()))),a){let f=this.currentDocument.states.get(h);f.note=a,f.note.text=Ze.sanitizeText(f.note.text,me())}s&&(Y.info("Setting state classes",h,s),(typeof s=="string"?[s]:s).forEach(d=>this.setCssClass(h,d.trim()))),l&&(Y.info("Setting state styles",h,l),(typeof l=="string"?[l]:l).forEach(d=>this.setStyle(h,d.trim()))),u&&(Y.info("Setting state styles",h,l),(typeof u=="string"?[u]:u).forEach(d=>this.setTextStyle(h,d.trim())))}clear(e){this.nodes=[],this.edges=[],this.documents={root:hde()},this.currentDocument=this.documents.root,this.startEndCount=0,this.classes=ude(),e||Ar()}getState(e){return this.currentDocument.states.get(e)}getStates(){return this.currentDocument.states}logDocuments(){Y.info("Documents = ",this.documents)}getRelations(){return this.currentDocument.relations}startIdIfNeeded(e=""){let r=e;return e===tP&&(this.startEndCount++,r=`${ade}${this.startEndCount}`),r}startTypeIfNeeded(e="",r=Rp){return e===tP?ade:r}endIdIfNeeded(e=""){let r=e;return e===sde&&(this.startEndCount++,r=`${ode}${this.startEndCount}`),r}endTypeIfNeeded(e="",r=Rp){return e===sde?ode:r}addRelationObjs(e,r,n){let i=this.startIdIfNeeded(e.id.trim()),a=this.startTypeIfNeeded(e.id.trim(),e.type),s=this.startIdIfNeeded(r.id.trim()),l=this.startTypeIfNeeded(r.id.trim(),r.type);this.addState(i,a,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),this.addState(s,l,r.doc,r.description,r.note,r.classes,r.styles,r.textStyles),this.currentDocument.relations.push({id1:i,id2:s,relationTitle:Ze.sanitizeText(n,me())})}addRelation(e,r,n){if(typeof e=="object")this.addRelationObjs(e,r,n);else{let i=this.startIdIfNeeded(e.trim()),a=this.startTypeIfNeeded(e),s=this.endIdIfNeeded(r.trim()),l=this.endTypeIfNeeded(r);this.addState(i,a),this.addState(s,l),this.currentDocument.relations.push({id1:i,id2:s,title:Ze.sanitizeText(n,me())})}}addDescription(e,r){let n=this.currentDocument.states.get(e),i=r.startsWith(":")?r.replace(":","").trim():r;n.descriptions.push(Ze.sanitizeText(i,me()))}cleanupLabel(e){return e.substring(0,1)===":"?e.substr(2).trim():e.trim()}getDividerId(){return this.dividerCnt++,"divider-id-"+this.dividerCnt}addStyleClass(e,r=""){this.classes.has(e)||this.classes.set(e,{id:e,styles:[],textStyles:[]});let n=this.classes.get(e);r?.split(fUe).forEach(i=>{let a=i.replace(/([^;]*);/,"$1").trim();if(RegExp(lde).exec(i)){let l=a.replace(cde,hUe).replace(lde,cde);n.textStyles.push(l)}n.styles.push(a)})}getClasses(){return this.classes}setCssClass(e,r){e.split(",").forEach(n=>{let i=this.getState(n);if(i===void 0){let a=n.trim();this.addState(a),i=this.getState(a)}i.classes.push(r)})}setStyle(e,r){let n=this.getState(e);n!==void 0&&n.styles.push(r)}setTextStyle(e,r){let n=this.getState(e);n!==void 0&&n.textStyles.push(r)}getDirectionStatement(){return this.rootDoc.find(e=>e.stmt===zO)}getDirection(){return this.getDirectionStatement()?.value??zfe}setDirection(e){let r=this.getDirectionStatement();r?r.value=e:this.rootDoc.unshift({stmt:zO,value:e})}trimColon(e){return e&&e[0]===":"?e.substr(1).trim():e.trim()}getData(){let e=me();return{nodes:this.nodes,edges:this.edges,other:{},config:e,direction:JO(this.getRootDocV2())}}getConfig(){return me().state}getAccTitle=Rr;setAccTitle=Lr;getAccDescription=Mr;setAccDescription=Nr;setDiagramTitle=$r;getDiagramTitle=Ir}});var dUe,W6,rP=N(()=>{"use strict";dUe=o(t=>` +defs #statediagram-barbEnd { + fill: ${t.transitionColor}; + stroke: ${t.transitionColor}; + } +g.stateGroup text { + fill: ${t.nodeBorder}; + stroke: none; + font-size: 10px; +} +g.stateGroup text { + fill: ${t.textColor}; + stroke: none; + font-size: 10px; + +} +g.stateGroup .state-title { + font-weight: bolder; + fill: ${t.stateLabelColor}; +} + +g.stateGroup rect { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; +} + +g.stateGroup line { + stroke: ${t.lineColor}; + stroke-width: 1; +} + +.transition { + stroke: ${t.transitionColor}; + stroke-width: 1; + fill: none; +} + +.stateGroup .composit { + fill: ${t.background}; + border-bottom: 1px +} + +.stateGroup .alt-composit { + fill: #e0e0e0; + border-bottom: 1px +} + +.state-note { + stroke: ${t.noteBorderColor}; + fill: ${t.noteBkgColor}; + + text { + fill: ${t.noteTextColor}; + stroke: none; + font-size: 10px; + } +} + +.stateLabel .box { + stroke: none; + stroke-width: 0; + fill: ${t.mainBkg}; + opacity: 0.5; +} + +.edgeLabel .label rect { + fill: ${t.labelBackgroundColor}; + opacity: 0.5; +} +.edgeLabel { + background-color: ${t.edgeLabelBackground}; + p { + background-color: ${t.edgeLabelBackground}; + } + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; +} +.edgeLabel .label text { + fill: ${t.transitionLabelColor||t.tertiaryTextColor}; +} +.label div .edgeLabel { + color: ${t.transitionLabelColor||t.tertiaryTextColor}; +} + +.stateLabel text { + fill: ${t.stateLabelColor}; + font-size: 10px; + font-weight: bold; +} + +.node circle.state-start { + fill: ${t.specialStateColor}; + stroke: ${t.specialStateColor}; +} + +.node .fork-join { + fill: ${t.specialStateColor}; + stroke: ${t.specialStateColor}; +} + +.node circle.state-end { + fill: ${t.innerEndBackground}; + stroke: ${t.background}; + stroke-width: 1.5 +} +.end-state-inner { + fill: ${t.compositeBackground||t.background}; + // stroke: ${t.background}; + stroke-width: 1.5 +} + +.node rect { + fill: ${t.stateBkg||t.mainBkg}; + stroke: ${t.stateBorder||t.nodeBorder}; + stroke-width: 1px; +} +.node polygon { + fill: ${t.mainBkg}; + stroke: ${t.stateBorder||t.nodeBorder};; + stroke-width: 1px; +} +#statediagram-barbEnd { + fill: ${t.lineColor}; +} + +.statediagram-cluster rect { + fill: ${t.compositeTitleBackground}; + stroke: ${t.stateBorder||t.nodeBorder}; + stroke-width: 1px; +} + +.cluster-label, .nodeLabel { + color: ${t.stateLabelColor}; + // line-height: 1; +} + +.statediagram-cluster rect.outer { + rx: 5px; + ry: 5px; +} +.statediagram-state .divider { + stroke: ${t.stateBorder||t.nodeBorder}; +} + +.statediagram-state .title-state { + rx: 5px; + ry: 5px; +} +.statediagram-cluster.statediagram-cluster .inner { + fill: ${t.compositeBackground||t.background}; +} +.statediagram-cluster.statediagram-cluster-alt .inner { + fill: ${t.altBackground?t.altBackground:"#efefef"}; +} + +.statediagram-cluster .inner { + rx:0; + ry:0; +} + +.statediagram-state rect.basic { + rx: 5px; + ry: 5px; +} +.statediagram-state rect.divider { + stroke-dasharray: 10,10; + fill: ${t.altBackground?t.altBackground:"#efefef"}; +} + +.note-edge { + stroke-dasharray: 5; +} + +.statediagram-note rect { + fill: ${t.noteBkgColor}; + stroke: ${t.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} +.statediagram-note rect { + fill: ${t.noteBkgColor}; + stroke: ${t.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} + +.statediagram-note text { + fill: ${t.noteTextColor}; +} + +.statediagram-note .nodeLabel { + color: ${t.noteTextColor}; +} +.statediagram .edgeLabel { + color: red; // ${t.noteTextColor}; +} + +#dependencyStart, #dependencyEnd { + fill: ${t.lineColor}; + stroke: ${t.lineColor}; + stroke-width: 1; +} + +.statediagramTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; +} +`,"getStyles"),W6=dUe});var nP,pUe,mUe,fde,gUe,dde,pde=N(()=>{"use strict";nP={},pUe=o((t,e)=>{nP[t]=e},"set"),mUe=o(t=>nP[t],"get"),fde=o(()=>Object.keys(nP),"keys"),gUe=o(()=>fde().length,"size"),dde={get:mUe,set:pUe,keys:fde,size:gUe}});var yUe,vUe,xUe,bUe,gde,wUe,TUe,kUe,EUe,iP,mde,yde,vde=N(()=>{"use strict";dr();pde();H6();ir();gr();zt();vt();yUe=o(t=>t.append("circle").attr("class","start-state").attr("r",me().state.sizeUnit).attr("cx",me().state.padding+me().state.sizeUnit).attr("cy",me().state.padding+me().state.sizeUnit),"drawStartState"),vUe=o(t=>t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",me().state.textHeight).attr("class","divider").attr("x2",me().state.textHeight*2).attr("y1",0).attr("y2",0),"drawDivider"),xUe=o((t,e)=>{let r=t.append("text").attr("x",2*me().state.padding).attr("y",me().state.textHeight+2*me().state.padding).attr("font-size",me().state.fontSize).attr("class","state-title").text(e.id),n=r.node().getBBox();return t.insert("rect",":first-child").attr("x",me().state.padding).attr("y",me().state.padding).attr("width",n.width+2*me().state.padding).attr("height",n.height+2*me().state.padding).attr("rx",me().state.radius),r},"drawSimpleState"),bUe=o((t,e)=>{let r=o(function(p,m,g){let y=p.append("tspan").attr("x",2*me().state.padding).text(m);g||y.attr("dy",me().state.textHeight)},"addTspan"),i=t.append("text").attr("x",2*me().state.padding).attr("y",me().state.textHeight+1.3*me().state.padding).attr("font-size",me().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),a=i.height,s=t.append("text").attr("x",me().state.padding).attr("y",a+me().state.padding*.4+me().state.dividerMargin+me().state.textHeight).attr("class","state-description"),l=!0,u=!0;e.descriptions.forEach(function(p){l||(r(s,p,u),u=!1),l=!1});let h=t.append("line").attr("x1",me().state.padding).attr("y1",me().state.padding+a+me().state.dividerMargin/2).attr("y2",me().state.padding+a+me().state.dividerMargin/2).attr("class","descr-divider"),f=s.node().getBBox(),d=Math.max(f.width,i.width);return h.attr("x2",d+3*me().state.padding),t.insert("rect",":first-child").attr("x",me().state.padding).attr("y",me().state.padding).attr("width",d+2*me().state.padding).attr("height",f.height+a+2*me().state.padding).attr("rx",me().state.radius),t},"drawDescrState"),gde=o((t,e,r)=>{let n=me().state.padding,i=2*me().state.padding,a=t.node().getBBox(),s=a.width,l=a.x,u=t.append("text").attr("x",0).attr("y",me().state.titleShift).attr("font-size",me().state.fontSize).attr("class","state-title").text(e.id),f=u.node().getBBox().width+i,d=Math.max(f,s);d===s&&(d=d+i);let p,m=t.node().getBBox();e.doc,p=l-n,f>s&&(p=(s-d)/2+n),Math.abs(l-m.x)s&&(p=l-(f-s)/2);let g=1-me().state.textHeight;return t.insert("rect",":first-child").attr("x",p).attr("y",g).attr("class",r?"alt-composit":"composit").attr("width",d).attr("height",m.height+me().state.textHeight+me().state.titleShift+1).attr("rx","0"),u.attr("x",p+n),f<=s&&u.attr("x",l+(d-i)/2-f/2+n),t.insert("rect",":first-child").attr("x",p).attr("y",me().state.titleShift-me().state.textHeight-me().state.padding).attr("width",d).attr("height",me().state.textHeight*3).attr("rx",me().state.radius),t.insert("rect",":first-child").attr("x",p).attr("y",me().state.titleShift-me().state.textHeight-me().state.padding).attr("width",d).attr("height",m.height+3+2*me().state.textHeight).attr("rx",me().state.radius),t},"addTitleAndBox"),wUe=o(t=>(t.append("circle").attr("class","end-state-outer").attr("r",me().state.sizeUnit+me().state.miniPadding).attr("cx",me().state.padding+me().state.sizeUnit+me().state.miniPadding).attr("cy",me().state.padding+me().state.sizeUnit+me().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",me().state.sizeUnit).attr("cx",me().state.padding+me().state.sizeUnit+2).attr("cy",me().state.padding+me().state.sizeUnit+2)),"drawEndState"),TUe=o((t,e)=>{let r=me().state.forkWidth,n=me().state.forkHeight;if(e.parentId){let i=r;r=n,n=i}return t.append("rect").style("stroke","black").style("fill","black").attr("width",r).attr("height",n).attr("x",me().state.padding).attr("y",me().state.padding)},"drawForkJoinState"),kUe=o((t,e,r,n)=>{let i=0,a=n.append("text");a.style("text-anchor","start"),a.attr("class","noteText");let s=t.replace(/\r\n/g,"
    ");s=s.replace(/\n/g,"
    ");let l=s.split(Ze.lineBreakRegex),u=1.25*me().state.noteMargin;for(let h of l){let f=h.trim();if(f.length>0){let d=a.append("tspan");if(d.text(f),u===0){let p=d.node().getBBox();u+=p.height}i+=u,d.attr("x",e+me().state.noteMargin),d.attr("y",r+i+1.25*me().state.noteMargin)}}return{textWidth:a.node().getBBox().width,textHeight:i}},"_drawLongText"),EUe=o((t,e)=>{e.attr("class","state-note");let r=e.append("rect").attr("x",0).attr("y",me().state.padding),n=e.append("g"),{textWidth:i,textHeight:a}=kUe(t,0,0,n);return r.attr("height",a+2*me().state.noteMargin),r.attr("width",i+me().state.noteMargin*2),r},"drawNote"),iP=o(function(t,e){let r=e.id,n={id:r,label:e.id,width:0,height:0},i=t.append("g").attr("id",r).attr("class","stateGroup");e.type==="start"&&yUe(i),e.type==="end"&&wUe(i),(e.type==="fork"||e.type==="join")&&TUe(i,e),e.type==="note"&&EUe(e.note.text,i),e.type==="divider"&&vUe(i),e.type==="default"&&e.descriptions.length===0&&xUe(i,e),e.type==="default"&&e.descriptions.length>0&&bUe(i,e);let a=i.node().getBBox();return n.width=a.width+2*me().state.padding,n.height=a.height+2*me().state.padding,dde.set(r,n),n},"drawState"),mde=0,yde=o(function(t,e,r){let n=o(function(u){switch(u){case Qo.relationType.AGGREGATION:return"aggregation";case Qo.relationType.EXTENSION:return"extension";case Qo.relationType.COMPOSITION:return"composition";case Qo.relationType.DEPENDENCY:return"dependency"}},"getRelationType");e.points=e.points.filter(u=>!Number.isNaN(u.y));let i=e.points,a=wl().x(function(u){return u.x}).y(function(u){return u.y}).curve(Do),s=t.append("path").attr("d",a(i)).attr("id","edge"+mde).attr("class","transition"),l="";if(me().state.arrowMarkerAbsolute&&(l=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,l=l.replace(/\(/g,"\\("),l=l.replace(/\)/g,"\\)")),s.attr("marker-end","url("+l+"#"+n(Qo.relationType.DEPENDENCY)+"End)"),r.title!==void 0){let u=t.append("g").attr("class","stateLabel"),{x:h,y:f}=Gt.calcLabelPosition(e.points),d=Ze.getRows(r.title),p=0,m=[],g=0,y=0;for(let b=0;b<=d.length;b++){let w=u.append("text").attr("text-anchor","middle").text(d[b]).attr("x",h).attr("y",f+p),C=w.node().getBBox();g=Math.max(g,C.width),y=Math.min(y,C.x),Y.info(C.x,h,f+p),p===0&&(p=w.node().getBBox().height,Y.info("Title height",p,f)),m.push(w)}let v=p*d.length;if(d.length>1){let b=(d.length-1)*p*.5;m.forEach((w,C)=>w.attr("y",f+C*p-b)),v=p*d.length}let x=u.node().getBBox();u.insert("rect",":first-child").attr("class","box").attr("x",h-g/2-me().state.padding/2).attr("y",f-v/2-me().state.padding/2-3.5).attr("width",g+me().state.padding).attr("height",v+me().state.padding),Y.info(x)}mde++},"drawEdge")});var fo,aP,SUe,CUe,AUe,_Ue,xde,bde,wde=N(()=>{"use strict";dr();gR();Vo();vt();gr();vde();zt();Ei();aP={},SUe=o(function(){},"setConf"),CUe=o(function(t){t.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"insertMarkers"),AUe=o(function(t,e,r,n){fo=me().state;let i=me().securityLevel,a;i==="sandbox"&&(a=Ge("#i"+e));let s=i==="sandbox"?Ge(a.nodes()[0].contentDocument.body):Ge("body"),l=i==="sandbox"?a.nodes()[0].contentDocument:document;Y.debug("Rendering diagram "+t);let u=s.select(`[id='${e}']`);CUe(u);let h=n.db.getRootDoc();xde(h,u,void 0,!1,s,l,n);let f=fo.padding,d=u.node().getBBox(),p=d.width+f*2,m=d.height+f*2,g=p*1.75;vn(u,m,g,fo.useMaxWidth),u.attr("viewBox",`${d.x-fo.padding} ${d.y-fo.padding} `+p+" "+m)},"draw"),_Ue=o(t=>t?t.length*fo.fontSizeFactor:1,"getLabelWidth"),xde=o((t,e,r,n,i,a,s)=>{let l=new sn({compound:!0,multigraph:!0}),u,h=!0;for(u=0;u{let T=C.parentElement,E=0,A=0;T&&(T.parentElement&&(E=T.parentElement.getBBox().width),A=parseInt(T.getAttribute("data-x-shift"),10),Number.isNaN(A)&&(A=0)),C.setAttribute("x1",0-A+8),C.setAttribute("x2",E-A-8)})):Y.debug("No Node "+b+": "+JSON.stringify(l.node(b)))});let v=y.getBBox();l.edges().forEach(function(b){b!==void 0&&l.edge(b)!==void 0&&(Y.debug("Edge "+b.v+" -> "+b.w+": "+JSON.stringify(l.edge(b))),yde(e,l.edge(b),l.edge(b).relation))}),v=y.getBBox();let x={id:r||"root",label:r||"root",width:0,height:0};return x.width=v.width+2*fo.padding,x.height=v.height+2*fo.padding,Y.debug("Doc rendered",x,l),x},"renderDoc"),bde={setConf:SUe,draw:AUe}});var Tde={};hr(Tde,{diagram:()=>DUe});var DUe,kde=N(()=>{"use strict";$O();H6();rP();wde();DUe={parser:I6,get db(){return new Qo(1)},renderer:bde,styles:W6,init:o(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var Cde={};hr(Cde,{diagram:()=>MUe});var MUe,Ade=N(()=>{"use strict";$O();H6();rP();eP();MUe={parser:I6,get db(){return new Qo(2)},renderer:ide,styles:W6,init:o(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var sP,Lde,Rde=N(()=>{"use strict";sP=function(){var t=o(function(d,p,m,g){for(m=m||{},g=d.length;g--;m[d[g]]=p);return m},"o"),e=[6,8,10,11,12,14,16,17,18],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],l=[1,14],u={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,taskName:18,taskData:19,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",18:"taskName",19:"taskData"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,2]],performAction:o(function(p,m,g,y,v,x,b){var w=x.length-1;switch(v){case 1:return x[w-1];case 2:this.$=[];break;case 3:x[w-1].push(x[w]),this.$=x[w-1];break;case 4:case 5:this.$=x[w];break;case 6:case 7:this.$=[];break;case 8:y.setDiagramTitle(x[w].substr(6)),this.$=x[w].substr(6);break;case 9:this.$=x[w].trim(),y.setAccTitle(this.$);break;case 10:case 11:this.$=x[w].trim(),y.setAccDescription(this.$);break;case 12:y.addSection(x[w].substr(8)),this.$=x[w].substr(8);break;case 13:y.addTask(x[w-1],x[w]),this.$="task";break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:l},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:15,11:r,12:n,14:i,16:a,17:s,18:l},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,16]},{15:[1,17]},t(e,[2,11]),t(e,[2,12]),{19:[1,18]},t(e,[2,4]),t(e,[2,9]),t(e,[2,10]),t(e,[2,13])],defaultActions:{},parseError:o(function(p,m){if(m.recoverable)this.trace(p);else{var g=new Error(p);throw g.hash=m,g}},"parseError"),parse:o(function(p){var m=this,g=[0],y=[],v=[null],x=[],b=this.table,w="",C=0,T=0,E=0,A=2,S=1,_=x.slice.call(arguments,1),I=Object.create(this.lexer),D={yy:{}};for(var k in this.yy)Object.prototype.hasOwnProperty.call(this.yy,k)&&(D.yy[k]=this.yy[k]);I.setInput(p,D.yy),D.yy.lexer=I,D.yy.parser=this,typeof I.yylloc>"u"&&(I.yylloc={});var L=I.yylloc;x.push(L);var R=I.options&&I.options.ranges;typeof D.yy.parseError=="function"?this.parseError=D.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function O(K){g.length=g.length-2*K,v.length=v.length-K,x.length=x.length-K}o(O,"popStack");function M(){var K;return K=y.pop()||I.lex()||S,typeof K!="number"&&(K instanceof Array&&(y=K,K=y.pop()),K=m.symbols_[K]||K),K}o(M,"lex");for(var B,F,P,z,$,H,Q={},j,ie,ne,le;;){if(P=g[g.length-1],this.defaultActions[P]?z=this.defaultActions[P]:((B===null||typeof B>"u")&&(B=M()),z=b[P]&&b[P][B]),typeof z>"u"||!z.length||!z[0]){var he="";le=[];for(j in b[P])this.terminals_[j]&&j>A&&le.push("'"+this.terminals_[j]+"'");I.showPosition?he="Parse error on line "+(C+1)+`: +`+I.showPosition()+` +Expecting `+le.join(", ")+", got '"+(this.terminals_[B]||B)+"'":he="Parse error on line "+(C+1)+": Unexpected "+(B==S?"end of input":"'"+(this.terminals_[B]||B)+"'"),this.parseError(he,{text:I.match,token:this.terminals_[B]||B,line:I.yylineno,loc:L,expected:le})}if(z[0]instanceof Array&&z.length>1)throw new Error("Parse Error: multiple actions possible at state: "+P+", token: "+B);switch(z[0]){case 1:g.push(B),v.push(I.yytext),x.push(I.yylloc),g.push(z[1]),B=null,F?(B=F,F=null):(T=I.yyleng,w=I.yytext,C=I.yylineno,L=I.yylloc,E>0&&E--);break;case 2:if(ie=this.productions_[z[1]][1],Q.$=v[v.length-ie],Q._$={first_line:x[x.length-(ie||1)].first_line,last_line:x[x.length-1].last_line,first_column:x[x.length-(ie||1)].first_column,last_column:x[x.length-1].last_column},R&&(Q._$.range=[x[x.length-(ie||1)].range[0],x[x.length-1].range[1]]),H=this.performAction.apply(Q,[w,T,C,D.yy,z[1],v,x].concat(_)),typeof H<"u")return H;ie&&(g=g.slice(0,-1*ie*2),v=v.slice(0,-1*ie),x=x.slice(0,-1*ie)),g.push(this.productions_[z[1]][0]),v.push(Q.$),x.push(Q._$),ne=b[g[g.length-2]][g[g.length-1]],g.push(ne);break;case 3:return!0}}return!0},"parse")},h=function(){var d={EOF:1,parseError:o(function(m,g){if(this.yy.parser)this.yy.parser.parseError(m,g);else throw new Error(m)},"parseError"),setInput:o(function(p,m){return this.yy=m||this.yy||{},this._input=p,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var p=this._input[0];this.yytext+=p,this.yyleng++,this.offset++,this.match+=p,this.matched+=p;var m=p.match(/(?:\r\n?|\n).*/g);return m?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),p},"input"),unput:o(function(p){var m=p.length,g=p.split(/(?:\r\n?|\n)/g);this._input=p+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-m),this.offset-=m;var y=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),g.length-1&&(this.yylineno-=g.length-1);var v=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:g?(g.length===y.length?this.yylloc.first_column:0)+y[y.length-g.length].length-g[0].length:this.yylloc.first_column-m},this.options.ranges&&(this.yylloc.range=[v[0],v[0]+this.yyleng-m]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(p){this.unput(this.match.slice(p))},"less"),pastInput:o(function(){var p=this.matched.substr(0,this.matched.length-this.match.length);return(p.length>20?"...":"")+p.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var p=this.match;return p.length<20&&(p+=this._input.substr(0,20-p.length)),(p.substr(0,20)+(p.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var p=this.pastInput(),m=new Array(p.length+1).join("-");return p+this.upcomingInput()+` +`+m+"^"},"showPosition"),test_match:o(function(p,m){var g,y,v;if(this.options.backtrack_lexer&&(v={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(v.yylloc.range=this.yylloc.range.slice(0))),y=p[0].match(/(?:\r\n?|\n).*/g),y&&(this.yylineno+=y.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:y?y[y.length-1].length-y[y.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+p[0].length},this.yytext+=p[0],this.match+=p[0],this.matches=p,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(p[0].length),this.matched+=p[0],g=this.performAction.call(this,this.yy,this,m,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),g)return g;if(this._backtrack){for(var x in v)this[x]=v[x];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var p,m,g,y;this._more||(this.yytext="",this.match="");for(var v=this._currentRules(),x=0;xm[0].length)){if(m=g,y=x,this.options.backtrack_lexer){if(p=this.test_match(g,v[x]),p!==!1)return p;if(this._backtrack){m=!1;continue}else return!1}else if(!this.options.flex)break}return m?(p=this.test_match(m,v[y]),p!==!1?p:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var m=this.next();return m||this.lex()},"lex"),begin:o(function(m){this.conditionStack.push(m)},"begin"),popState:o(function(){var m=this.conditionStack.length-1;return m>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(m){return m=this.conditionStack.length-1-Math.abs(m||0),m>=0?this.conditionStack[m]:"INITIAL"},"topState"),pushState:o(function(m){this.begin(m)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(m,g,y,v){var x=v;switch(y){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 18;case 16:return 19;case 17:return":";case 18:return 6;case 19:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18,19],inclusive:!0}}};return d}();u.lexer=h;function f(){this.yy={}}return o(f,"Parser"),f.prototype=u,u.Parser=f,new f}();sP.parser=sP;Lde=sP});var M1,oP,Sb,Cb,BUe,FUe,$Ue,zUe,GUe,VUe,UUe,Nde,HUe,lP,Mde=N(()=>{"use strict";zt();mi();M1="",oP=[],Sb=[],Cb=[],BUe=o(function(){oP.length=0,Sb.length=0,M1="",Cb.length=0,Ar()},"clear"),FUe=o(function(t){M1=t,oP.push(t)},"addSection"),$Ue=o(function(){return oP},"getSections"),zUe=o(function(){let t=Nde(),e=100,r=0;for(;!t&&r{r.people&&t.push(...r.people)}),[...new Set(t)].sort()},"updateActors"),VUe=o(function(t,e){let r=e.substr(1).split(":"),n=0,i=[];r.length===1?(n=Number(r[0]),i=[]):(n=Number(r[0]),i=r[1].split(","));let a=i.map(l=>l.trim()),s={section:M1,type:M1,people:a,task:t,score:n};Cb.push(s)},"addTask"),UUe=o(function(t){let e={section:M1,type:M1,description:t,task:t,classes:[]};Sb.push(e)},"addTaskOrg"),Nde=o(function(){let t=o(function(r){return Cb[r].processed},"compileTask"),e=!0;for(let[r,n]of Cb.entries())t(r),e=e&&n.processed;return e},"compileTasks"),HUe=o(function(){return GUe()},"getActors"),lP={getConfig:o(()=>me().journey,"getConfig"),clear:BUe,setDiagramTitle:$r,getDiagramTitle:Ir,setAccTitle:Lr,getAccTitle:Rr,setAccDescription:Nr,getAccDescription:Mr,addSection:FUe,getSections:$Ue,getTasks:zUe,addTask:VUe,addTaskOrg:UUe,getActors:HUe}});var WUe,Ide,Ode=N(()=>{"use strict";WUe=o(t=>`.label { + font-family: ${t.fontFamily}; + color: ${t.textColor}; + } + .mouth { + stroke: #666; + } + + line { + stroke: ${t.textColor} + } + + .legend { + fill: ${t.textColor}; + font-family: ${t.fontFamily}; + } + + .label text { + fill: #333; + } + .label { + color: ${t.textColor} + } + + .face { + ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"}; + stroke: #999; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${t.arrowheadColor}; + } + + .edgePath .path { + stroke: ${t.lineColor}; + stroke-width: 1.5px; + } + + .flowchart-link { + stroke: ${t.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + rect { + opacity: 0.5; + } + text-align: center; + } + + .cluster rect { + } + + .cluster text { + fill: ${t.titleColor}; + } + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${t.fontFamily}; + font-size: 12px; + background: ${t.tertiaryColor}; + border: 1px solid ${t.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .task-type-0, .section-type-0 { + ${t.fillType0?`fill: ${t.fillType0}`:""}; + } + .task-type-1, .section-type-1 { + ${t.fillType0?`fill: ${t.fillType1}`:""}; + } + .task-type-2, .section-type-2 { + ${t.fillType0?`fill: ${t.fillType2}`:""}; + } + .task-type-3, .section-type-3 { + ${t.fillType0?`fill: ${t.fillType3}`:""}; + } + .task-type-4, .section-type-4 { + ${t.fillType0?`fill: ${t.fillType4}`:""}; + } + .task-type-5, .section-type-5 { + ${t.fillType0?`fill: ${t.fillType5}`:""}; + } + .task-type-6, .section-type-6 { + ${t.fillType0?`fill: ${t.fillType6}`:""}; + } + .task-type-7, .section-type-7 { + ${t.fillType0?`fill: ${t.fillType7}`:""}; + } + + .actor-0 { + ${t.actor0?`fill: ${t.actor0}`:""}; + } + .actor-1 { + ${t.actor1?`fill: ${t.actor1}`:""}; + } + .actor-2 { + ${t.actor2?`fill: ${t.actor2}`:""}; + } + .actor-3 { + ${t.actor3?`fill: ${t.actor3}`:""}; + } + .actor-4 { + ${t.actor4?`fill: ${t.actor4}`:""}; + } + .actor-5 { + ${t.actor5?`fill: ${t.actor5}`:""}; + } +`,"getStyles"),Ide=WUe});var cP,qUe,Bde,Fde,YUe,XUe,Pde,jUe,KUe,$de,QUe,I1,zde=N(()=>{"use strict";dr();Wv();cP=o(function(t,e){return kd(t,e)},"drawRect"),qUe=o(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(u){let h=bl().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}o(a,"smile");function s(u){let h=bl().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}o(s,"sad");function l(u){u.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return o(l,"ambivalent"),e.score>3?a(i):e.score<3?s(i):l(i),n},"drawFace"),Bde=o(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),Fde=o(function(t,e){return Nq(t,e)},"drawText"),YUe=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,Fde(t,e)},"drawLabel"),XUe=o(function(t,e,r){let n=t.append("g"),i=Tl();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width*e.taskCount+r.diagramMarginX*(e.taskCount-1),i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,cP(n,i),$de(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),Pde=-1,jUe=o(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");Pde++;let a=300+5*30;i.append("line").attr("id","task"+Pde).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",a).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),qUe(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=Tl();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,cP(i,s);let l=e.x+14;e.people.forEach(u=>{let h=e.actors[u].color,f={cx:l,cy:e.y,r:7,fill:h,stroke:"#000",title:u,pos:e.actors[u].position};Bde(i,f),l+=10}),$de(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),KUe=o(function(t,e){q5(t,e)},"drawBackgroundRect"),$de=function(){function t(i,a,s,l,u,h,f,d){let p=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("font-color",d).style("text-anchor","middle").text(i);n(p,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d,p){let{taskFontSize:m,taskFontFamily:g}=d,y=i.split(//gi);for(let v=0;v{let i=ju[n].color,a={cx:20,cy:r,r:7,fill:i,stroke:"#000",pos:ju[n].position};I1.drawCircle(t,a);let s={x:40,y:r+7,fill:"#666",text:n,textMargin:e.boxTextMargin|5};I1.drawText(t,s),r+=20})}var ZUe,ju,q6,Np,eHe,Zo,uP,Gde,tHe,hP,Vde=N(()=>{"use strict";dr();zde();zt();Ei();ZUe=o(function(t){Object.keys(t).forEach(function(r){q6[r]=t[r]})},"setConf"),ju={};o(JUe,"drawActorLegend");q6=me().journey,Np=q6.leftMargin,eHe=o(function(t,e,r,n){let i=me().journey,a=me().securityLevel,s;a==="sandbox"&&(s=Ge("#i"+e));let l=a==="sandbox"?Ge(s.nodes()[0].contentDocument.body):Ge("body");Zo.init();let u=l.select("#"+e);I1.initGraphics(u);let h=n.db.getTasks(),f=n.db.getDiagramTitle(),d=n.db.getActors();for(let x in ju)delete ju[x];let p=0;d.forEach(x=>{ju[x]={color:i.actorColours[p%i.actorColours.length],position:p},p++}),JUe(u),Zo.insert(0,0,Np,Object.keys(ju).length*50),tHe(u,h,0);let m=Zo.getBounds();f&&u.append("text").text(f).attr("x",Np).attr("font-size","4ex").attr("font-weight","bold").attr("y",25);let g=m.stopy-m.starty+2*i.diagramMarginY,y=Np+m.stopx+2*i.diagramMarginX;vn(u,g,y,i.useMaxWidth),u.append("line").attr("x1",Np).attr("y1",i.height*4).attr("x2",y-Np-4).attr("y2",i.height*4).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");let v=f?70:0;u.attr("viewBox",`${m.startx} -25 ${y} ${g+v}`),u.attr("preserveAspectRatio","xMinYMin meet"),u.attr("height",g+v+25)},"draw"),Zo={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:o(function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},"init"),updateVal:o(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:o(function(t,e,r,n){let i=me().journey,a=this,s=0;function l(u){return o(function(f){s++;let d=a.sequenceItems.length-s+1;a.updateVal(f,"starty",e-d*i.boxMargin,Math.min),a.updateVal(f,"stopy",n+d*i.boxMargin,Math.max),a.updateVal(Zo.data,"startx",t-d*i.boxMargin,Math.min),a.updateVal(Zo.data,"stopx",r+d*i.boxMargin,Math.max),u!=="activation"&&(a.updateVal(f,"startx",t-d*i.boxMargin,Math.min),a.updateVal(f,"stopx",r+d*i.boxMargin,Math.max),a.updateVal(Zo.data,"starty",e-d*i.boxMargin,Math.min),a.updateVal(Zo.data,"stopy",n+d*i.boxMargin,Math.max))},"updateItemBounds")}o(l,"updateFn"),this.sequenceItems.forEach(l())},"updateBounds"),insert:o(function(t,e,r,n){let i=Math.min(t,r),a=Math.max(t,r),s=Math.min(e,n),l=Math.max(e,n);this.updateVal(Zo.data,"startx",i,Math.min),this.updateVal(Zo.data,"starty",s,Math.min),this.updateVal(Zo.data,"stopx",a,Math.max),this.updateVal(Zo.data,"stopy",l,Math.max),this.updateBounds(i,s,a,l)},"insert"),bumpVerticalPos:o(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},"bumpVerticalPos"),getVerticalPos:o(function(){return this.verticalPos},"getVerticalPos"),getBounds:o(function(){return this.data},"getBounds")},uP=q6.sectionFills,Gde=q6.sectionColours,tHe=o(function(t,e,r){let n=me().journey,i="",a=n.height*2+n.diagramMarginY,s=r+a,l=0,u="#CCC",h="black",f=0;for(let[d,p]of e.entries()){if(i!==p.section){u=uP[l%uP.length],f=l%uP.length,h=Gde[l%Gde.length];let g=0,y=p.section;for(let x=d;x(ju[y]&&(g[y]=ju[y]),g),{});p.x=d*n.taskMargin+d*n.width+Np,p.y=s,p.width=n.diagramMarginX,p.height=n.diagramMarginY,p.colour=h,p.fill=u,p.num=f,p.actors=m,I1.drawTask(t,p,n),Zo.insert(p.x,p.y,p.x+p.width+n.taskMargin,300+5*30)}},"drawTasks"),hP={setConf:ZUe,draw:eHe}});var Ude={};hr(Ude,{diagram:()=>rHe});var rHe,Hde=N(()=>{"use strict";Rde();Mde();Ode();Vde();rHe={parser:Lde,db:lP,renderer:hP,styles:Ide,init:o(t=>{hP.setConf(t.journey),lP.clear()},"init")}});var dP,Qde,Zde=N(()=>{"use strict";dP=function(){var t=o(function(p,m,g,y){for(g=g||{},y=p.length;y--;g[p[y]]=m);return g},"o"),e=[6,8,10,11,12,14,16,17,20,21],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],l=[1,16],u=[1,17],h={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,timeline:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,period_statement:18,event_statement:19,period:20,event:21,$accept:0,$end:1},terminals_:{2:"error",4:"timeline",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",20:"period",21:"event"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[18,1],[19,1]],performAction:o(function(m,g,y,v,x,b,w){var C=b.length-1;switch(x){case 1:return b[C-1];case 2:this.$=[];break;case 3:b[C-1].push(b[C]),this.$=b[C-1];break;case 4:case 5:this.$=b[C];break;case 6:case 7:this.$=[];break;case 8:v.getCommonDb().setDiagramTitle(b[C].substr(6)),this.$=b[C].substr(6);break;case 9:this.$=b[C].trim(),v.getCommonDb().setAccTitle(this.$);break;case 10:case 11:this.$=b[C].trim(),v.getCommonDb().setAccDescription(this.$);break;case 12:v.addSection(b[C].substr(8)),this.$=b[C].substr(8);break;case 15:v.addTask(b[C],0,""),this.$=b[C];break;case 16:v.addEvent(b[C].substr(2)),this.$=b[C];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:l,21:u},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:18,11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:l,21:u},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,19]},{15:[1,20]},t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),t(e,[2,4]),t(e,[2,9]),t(e,[2,10])],defaultActions:{},parseError:o(function(m,g){if(g.recoverable)this.trace(m);else{var y=new Error(m);throw y.hash=g,y}},"parseError"),parse:o(function(m){var g=this,y=[0],v=[],x=[null],b=[],w=this.table,C="",T=0,E=0,A=0,S=2,_=1,I=b.slice.call(arguments,1),D=Object.create(this.lexer),k={yy:{}};for(var L in this.yy)Object.prototype.hasOwnProperty.call(this.yy,L)&&(k.yy[L]=this.yy[L]);D.setInput(m,k.yy),k.yy.lexer=D,k.yy.parser=this,typeof D.yylloc>"u"&&(D.yylloc={});var R=D.yylloc;b.push(R);var O=D.options&&D.options.ranges;typeof k.yy.parseError=="function"?this.parseError=k.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function M(X){y.length=y.length-2*X,x.length=x.length-X,b.length=b.length-X}o(M,"popStack");function B(){var X;return X=v.pop()||D.lex()||_,typeof X!="number"&&(X instanceof Array&&(v=X,X=v.pop()),X=g.symbols_[X]||X),X}o(B,"lex");for(var F,P,z,$,H,Q,j={},ie,ne,le,he;;){if(z=y[y.length-1],this.defaultActions[z]?$=this.defaultActions[z]:((F===null||typeof F>"u")&&(F=B()),$=w[z]&&w[z][F]),typeof $>"u"||!$.length||!$[0]){var K="";he=[];for(ie in w[z])this.terminals_[ie]&&ie>S&&he.push("'"+this.terminals_[ie]+"'");D.showPosition?K="Parse error on line "+(T+1)+`: +`+D.showPosition()+` +Expecting `+he.join(", ")+", got '"+(this.terminals_[F]||F)+"'":K="Parse error on line "+(T+1)+": Unexpected "+(F==_?"end of input":"'"+(this.terminals_[F]||F)+"'"),this.parseError(K,{text:D.match,token:this.terminals_[F]||F,line:D.yylineno,loc:R,expected:he})}if($[0]instanceof Array&&$.length>1)throw new Error("Parse Error: multiple actions possible at state: "+z+", token: "+F);switch($[0]){case 1:y.push(F),x.push(D.yytext),b.push(D.yylloc),y.push($[1]),F=null,P?(F=P,P=null):(E=D.yyleng,C=D.yytext,T=D.yylineno,R=D.yylloc,A>0&&A--);break;case 2:if(ne=this.productions_[$[1]][1],j.$=x[x.length-ne],j._$={first_line:b[b.length-(ne||1)].first_line,last_line:b[b.length-1].last_line,first_column:b[b.length-(ne||1)].first_column,last_column:b[b.length-1].last_column},O&&(j._$.range=[b[b.length-(ne||1)].range[0],b[b.length-1].range[1]]),Q=this.performAction.apply(j,[C,E,T,k.yy,$[1],x,b].concat(I)),typeof Q<"u")return Q;ne&&(y=y.slice(0,-1*ne*2),x=x.slice(0,-1*ne),b=b.slice(0,-1*ne)),y.push(this.productions_[$[1]][0]),x.push(j.$),b.push(j._$),le=w[y[y.length-2]][y[y.length-1]],y.push(le);break;case 3:return!0}}return!0},"parse")},f=function(){var p={EOF:1,parseError:o(function(g,y){if(this.yy.parser)this.yy.parser.parseError(g,y);else throw new Error(g)},"parseError"),setInput:o(function(m,g){return this.yy=g||this.yy||{},this._input=m,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var m=this._input[0];this.yytext+=m,this.yyleng++,this.offset++,this.match+=m,this.matched+=m;var g=m.match(/(?:\r\n?|\n).*/g);return g?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),m},"input"),unput:o(function(m){var g=m.length,y=m.split(/(?:\r\n?|\n)/g);this._input=m+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-g),this.offset-=g;var v=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),y.length-1&&(this.yylineno-=y.length-1);var x=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:y?(y.length===v.length?this.yylloc.first_column:0)+v[v.length-y.length].length-y[0].length:this.yylloc.first_column-g},this.options.ranges&&(this.yylloc.range=[x[0],x[0]+this.yyleng-g]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(m){this.unput(this.match.slice(m))},"less"),pastInput:o(function(){var m=this.matched.substr(0,this.matched.length-this.match.length);return(m.length>20?"...":"")+m.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var m=this.match;return m.length<20&&(m+=this._input.substr(0,20-m.length)),(m.substr(0,20)+(m.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var m=this.pastInput(),g=new Array(m.length+1).join("-");return m+this.upcomingInput()+` +`+g+"^"},"showPosition"),test_match:o(function(m,g){var y,v,x;if(this.options.backtrack_lexer&&(x={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(x.yylloc.range=this.yylloc.range.slice(0))),v=m[0].match(/(?:\r\n?|\n).*/g),v&&(this.yylineno+=v.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:v?v[v.length-1].length-v[v.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+m[0].length},this.yytext+=m[0],this.match+=m[0],this.matches=m,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(m[0].length),this.matched+=m[0],y=this.performAction.call(this,this.yy,this,g,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),y)return y;if(this._backtrack){for(var b in x)this[b]=x[b];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var m,g,y,v;this._more||(this.yytext="",this.match="");for(var x=this._currentRules(),b=0;bg[0].length)){if(g=y,v=b,this.options.backtrack_lexer){if(m=this.test_match(y,x[b]),m!==!1)return m;if(this._backtrack){g=!1;continue}else return!1}else if(!this.options.flex)break}return g?(m=this.test_match(g,x[v]),m!==!1?m:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var g=this.next();return g||this.lex()},"lex"),begin:o(function(g){this.conditionStack.push(g)},"begin"),popState:o(function(){var g=this.conditionStack.length-1;return g>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(g){return g=this.conditionStack.length-1-Math.abs(g||0),g>=0?this.conditionStack[g]:"INITIAL"},"topState"),pushState:o(function(g){this.begin(g)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(g,y,v,x){var b=x;switch(v){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 21;case 16:return 20;case 17:return 6;case 18:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:timeline\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^:\n]+)/i,/^(?::\s[^:\n]+)/i,/^(?:[^#:\n]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18],inclusive:!0}}};return p}();h.lexer=f;function d(){this.yy={}}return o(d,"Parser"),d.prototype=h,h.Parser=d,new d}();dP.parser=dP;Qde=dP});var mP={};hr(mP,{addEvent:()=>ope,addSection:()=>npe,addTask:()=>spe,addTaskOrg:()=>lpe,clear:()=>rpe,default:()=>hHe,getCommonDb:()=>tpe,getSections:()=>ipe,getTasks:()=>ape});var O1,epe,pP,Y6,P1,tpe,rpe,npe,ipe,ape,spe,ope,lpe,Jde,hHe,cpe=N(()=>{"use strict";mi();O1="",epe=0,pP=[],Y6=[],P1=[],tpe=o(()=>qy,"getCommonDb"),rpe=o(function(){pP.length=0,Y6.length=0,O1="",P1.length=0,Ar()},"clear"),npe=o(function(t){O1=t,pP.push(t)},"addSection"),ipe=o(function(){return pP},"getSections"),ape=o(function(){let t=Jde(),e=100,r=0;for(;!t&&rr.id===epe-1).events.push(t)},"addEvent"),lpe=o(function(t){let e={section:O1,type:O1,description:t,task:t,classes:[]};Y6.push(e)},"addTaskOrg"),Jde=o(function(){let t=o(function(r){return P1[r].processed},"compileTask"),e=!0;for(let[r,n]of P1.entries())t(r),e=e&&n.processed;return e},"compileTasks"),hHe={clear:rpe,getCommonDb:tpe,addSection:npe,getSections:ipe,getTasks:ape,addTask:spe,addTaskOrg:lpe,addEvent:ope}});function dpe(t,e){t.each(function(){var r=Ge(this),n=r.text().split(/(\s+|
    )/).reverse(),i,a=[],s=1.1,l=r.attr("y"),u=parseFloat(r.attr("dy")),h=r.text(null).append("tspan").attr("x",0).attr("y",l).attr("dy",u+"em");for(let f=0;fe||i==="
    ")&&(a.pop(),h.text(a.join(" ").trim()),i==="
    "?a=[""]:a=[i],h=r.append("tspan").attr("x",0).attr("y",l).attr("dy",s+"em").text(i))})}var fHe,X6,dHe,pHe,hpe,mHe,gHe,upe,yHe,vHe,xHe,gP,fpe,bHe,wHe,THe,kHe,bf,ppe=N(()=>{"use strict";dr();fHe=12,X6=o(function(t,e){let r=t.append("rect");return r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),r.attr("rx",e.rx),r.attr("ry",e.ry),e.class!==void 0&&r.attr("class",e.class),r},"drawRect"),dHe=o(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(u){let h=bl().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}o(a,"smile");function s(u){let h=bl().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}o(s,"sad");function l(u){u.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return o(l,"ambivalent"),e.score>3?a(i):e.score<3?s(i):l(i),n},"drawFace"),pHe=o(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),hpe=o(function(t,e){let r=e.text.replace(//gi," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class!==void 0&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),mHe=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,hpe(t,e)},"drawLabel"),gHe=o(function(t,e,r){let n=t.append("g"),i=gP();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width,i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,X6(n,i),fpe(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),upe=-1,yHe=o(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");upe++;let a=300+5*30;i.append("line").attr("id","task"+upe).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",a).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),dHe(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=gP();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,X6(i,s),fpe(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),vHe=o(function(t,e){X6(t,{x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,class:"rect"}).lower()},"drawBackgroundRect"),xHe=o(function(){return{x:0,y:0,fill:void 0,"text-anchor":"start",width:100,height:100,textMargin:0,rx:0,ry:0}},"getTextObj"),gP=o(function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),fpe=function(){function t(i,a,s,l,u,h,f,d){let p=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("font-color",d).style("text-anchor","middle").text(i);n(p,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d,p){let{taskFontSize:m,taskFontFamily:g}=d,y=i.split(//gi);for(let v=0;v{"use strict";dr();ppe();vt();zt();Ei();EHe=o(function(t,e,r,n){let i=me(),a=i.leftMargin??50;Y.debug("timeline",n.db);let s=i.securityLevel,l;s==="sandbox"&&(l=Ge("#i"+e));let h=(s==="sandbox"?Ge(l.nodes()[0].contentDocument.body):Ge("body")).select("#"+e);h.append("g");let f=n.db.getTasks(),d=n.db.getCommonDb().getDiagramTitle();Y.debug("task",f),bf.initGraphics(h);let p=n.db.getSections();Y.debug("sections",p);let m=0,g=0,y=0,v=0,x=50+a,b=50;v=50;let w=0,C=!0;p.forEach(function(_){let I={number:w,descr:_,section:w,width:150,padding:20,maxHeight:m},D=bf.getVirtualNodeHeight(h,I,i);Y.debug("sectionHeight before draw",D),m=Math.max(m,D+20)});let T=0,E=0;Y.debug("tasks.length",f.length);for(let[_,I]of f.entries()){let D={number:_,descr:I,section:I.section,width:150,padding:20,maxHeight:g},k=bf.getVirtualNodeHeight(h,D,i);Y.debug("taskHeight before draw",k),g=Math.max(g,k+20),T=Math.max(T,I.events.length);let L=0;for(let R of I.events){let O={descr:R,section:I.section,number:I.section,width:150,padding:20,maxHeight:50};L+=bf.getVirtualNodeHeight(h,O,i)}E=Math.max(E,L)}Y.debug("maxSectionHeight before draw",m),Y.debug("maxTaskHeight before draw",g),p&&p.length>0?p.forEach(_=>{let I=f.filter(R=>R.section===_),D={number:w,descr:_,section:w,width:200*Math.max(I.length,1)-50,padding:20,maxHeight:m};Y.debug("sectionNode",D);let k=h.append("g"),L=bf.drawNode(k,D,w,i);Y.debug("sectionNode output",L),k.attr("transform",`translate(${x}, ${v})`),b+=m+50,I.length>0&&mpe(h,I,w,x,b,g,i,T,E,m,!1),x+=200*Math.max(I.length,1),b=v,w++}):(C=!1,mpe(h,f,w,x,b,g,i,T,E,m,!0));let A=h.node().getBBox();Y.debug("bounds",A),d&&h.append("text").text(d).attr("x",A.width/2-a).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),y=C?m+g+150:g+100,h.append("g").attr("class","lineWrapper").append("line").attr("x1",a).attr("y1",y).attr("x2",A.width+3*a).attr("y2",y).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),Ao(void 0,h,i.timeline?.padding??50,i.timeline?.useMaxWidth??!1)},"draw"),mpe=o(function(t,e,r,n,i,a,s,l,u,h,f){for(let d of e){let p={descr:d.task,section:r,number:r,width:150,padding:20,maxHeight:a};Y.debug("taskNode",p);let m=t.append("g").attr("class","taskWrapper"),y=bf.drawNode(m,p,r,s).height;if(Y.debug("taskHeight after draw",y),m.attr("transform",`translate(${n}, ${i})`),a=Math.max(a,y),d.events){let v=t.append("g").attr("class","lineWrapper"),x=a;i+=100,x=x+SHe(t,d.events,r,n,i,s),i-=100,v.append("line").attr("x1",n+190/2).attr("y1",i+a).attr("x2",n+190/2).attr("y2",i+a+(f?a:h)+u+120).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}n=n+200,f&&!s.timeline?.disableMulticolor&&r++}i=i-10},"drawTasks"),SHe=o(function(t,e,r,n,i,a){let s=0,l=i;i=i+100;for(let u of e){let h={descr:u,section:r,number:r,width:150,padding:20,maxHeight:50};Y.debug("eventNode",h);let f=t.append("g").attr("class","eventWrapper"),p=bf.drawNode(f,h,r,a).height;s=s+p,f.attr("transform",`translate(${n}, ${i})`),i=i+10+p}return i=l,s},"drawEvents"),gpe={setConf:o(()=>{},"setConf"),draw:EHe}});var CHe,AHe,vpe,xpe=N(()=>{"use strict";Ys();CHe=o(t=>{let e="";for(let r=0;r` + .edge { + stroke-width: 3; + } + ${CHe(t)} + .section-root rect, .section-root path, .section-root circle { + fill: ${t.git0}; + } + .section-root text { + fill: ${t.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .eventWrapper { + filter: brightness(120%); + } +`,"getStyles"),vpe=AHe});var bpe={};hr(bpe,{diagram:()=>_He});var _He,wpe=N(()=>{"use strict";Zde();cpe();ype();xpe();_He={db:mP,renderer:gpe,parser:Qde,styles:vpe}});var yP,Epe,Spe=N(()=>{"use strict";yP=function(){var t=o(function(C,T,E,A){for(E=E||{},A=C.length;A--;E[C[A]]=T);return E},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],l=[1,19],u=[6,7,8],h=[1,26],f=[1,24],d=[1,25],p=[6,7,11],m=[1,6,13,15,16,19,22],g=[1,33],y=[1,34],v=[1,6,7,11,13,15,16,19,22],x={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:o(function(T,E,A,S,_,I,D){var k=I.length-1;switch(_){case 6:case 7:return S;case 8:S.getLogger().trace("Stop NL ");break;case 9:S.getLogger().trace("Stop EOF ");break;case 11:S.getLogger().trace("Stop NL2 ");break;case 12:S.getLogger().trace("Stop EOF2 ");break;case 15:S.getLogger().info("Node: ",I[k].id),S.addNode(I[k-1].length,I[k].id,I[k].descr,I[k].type);break;case 16:S.getLogger().trace("Icon: ",I[k]),S.decorateNode({icon:I[k]});break;case 17:case 21:S.decorateNode({class:I[k]});break;case 18:S.getLogger().trace("SPACELIST");break;case 19:S.getLogger().trace("Node: ",I[k].id),S.addNode(0,I[k].id,I[k].descr,I[k].type);break;case 20:S.decorateNode({icon:I[k]});break;case 25:S.getLogger().trace("node found ..",I[k-2]),this.$={id:I[k-1],descr:I[k-1],type:S.getType(I[k-2],I[k])};break;case 26:this.$={id:I[k],descr:I[k],type:S.nodeType.DEFAULT};break;case 27:S.getLogger().trace("node found ..",I[k-3]),this.$={id:I[k-3],descr:I[k-1],type:S.getType(I[k-2],I[k])};break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},t(u,[2,3]),{1:[2,2]},t(u,[2,4]),t(u,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},{6:r,9:22,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},{6:h,7:f,10:23,11:d},t(p,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:s,22:l}),t(p,[2,18]),t(p,[2,19]),t(p,[2,20]),t(p,[2,21]),t(p,[2,23]),t(p,[2,24]),t(p,[2,26],{19:[1,30]}),{20:[1,31]},{6:h,7:f,10:32,11:d},{1:[2,7],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},t(m,[2,14],{7:g,11:y}),t(v,[2,8]),t(v,[2,9]),t(v,[2,10]),t(p,[2,15]),t(p,[2,16]),t(p,[2,17]),{20:[1,35]},{21:[1,36]},t(m,[2,13],{7:g,11:y}),t(v,[2,11]),t(v,[2,12]),{21:[1,37]},t(p,[2,25]),t(p,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(T,E){if(E.recoverable)this.trace(T);else{var A=new Error(T);throw A.hash=E,A}},"parseError"),parse:o(function(T){var E=this,A=[0],S=[],_=[null],I=[],D=this.table,k="",L=0,R=0,O=0,M=2,B=1,F=I.slice.call(arguments,1),P=Object.create(this.lexer),z={yy:{}};for(var $ in this.yy)Object.prototype.hasOwnProperty.call(this.yy,$)&&(z.yy[$]=this.yy[$]);P.setInput(T,z.yy),z.yy.lexer=P,z.yy.parser=this,typeof P.yylloc>"u"&&(P.yylloc={});var H=P.yylloc;I.push(H);var Q=P.options&&P.options.ranges;typeof z.yy.parseError=="function"?this.parseError=z.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function j(ae){A.length=A.length-2*ae,_.length=_.length-ae,I.length=I.length-ae}o(j,"popStack");function ie(){var ae;return ae=S.pop()||P.lex()||B,typeof ae!="number"&&(ae instanceof Array&&(S=ae,ae=S.pop()),ae=E.symbols_[ae]||ae),ae}o(ie,"lex");for(var ne,le,he,K,X,te,J={},se,ue,Z,Se;;){if(he=A[A.length-1],this.defaultActions[he]?K=this.defaultActions[he]:((ne===null||typeof ne>"u")&&(ne=ie()),K=D[he]&&D[he][ne]),typeof K>"u"||!K.length||!K[0]){var ce="";Se=[];for(se in D[he])this.terminals_[se]&&se>M&&Se.push("'"+this.terminals_[se]+"'");P.showPosition?ce="Parse error on line "+(L+1)+`: +`+P.showPosition()+` +Expecting `+Se.join(", ")+", got '"+(this.terminals_[ne]||ne)+"'":ce="Parse error on line "+(L+1)+": Unexpected "+(ne==B?"end of input":"'"+(this.terminals_[ne]||ne)+"'"),this.parseError(ce,{text:P.match,token:this.terminals_[ne]||ne,line:P.yylineno,loc:H,expected:Se})}if(K[0]instanceof Array&&K.length>1)throw new Error("Parse Error: multiple actions possible at state: "+he+", token: "+ne);switch(K[0]){case 1:A.push(ne),_.push(P.yytext),I.push(P.yylloc),A.push(K[1]),ne=null,le?(ne=le,le=null):(R=P.yyleng,k=P.yytext,L=P.yylineno,H=P.yylloc,O>0&&O--);break;case 2:if(ue=this.productions_[K[1]][1],J.$=_[_.length-ue],J._$={first_line:I[I.length-(ue||1)].first_line,last_line:I[I.length-1].last_line,first_column:I[I.length-(ue||1)].first_column,last_column:I[I.length-1].last_column},Q&&(J._$.range=[I[I.length-(ue||1)].range[0],I[I.length-1].range[1]]),te=this.performAction.apply(J,[k,R,L,z.yy,K[1],_,I].concat(F)),typeof te<"u")return te;ue&&(A=A.slice(0,-1*ue*2),_=_.slice(0,-1*ue),I=I.slice(0,-1*ue)),A.push(this.productions_[K[1]][0]),_.push(J.$),I.push(J._$),Z=D[A[A.length-2]][A[A.length-1]],A.push(Z);break;case 3:return!0}}return!0},"parse")},b=function(){var C={EOF:1,parseError:o(function(E,A){if(this.yy.parser)this.yy.parser.parseError(E,A);else throw new Error(E)},"parseError"),setInput:o(function(T,E){return this.yy=E||this.yy||{},this._input=T,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var T=this._input[0];this.yytext+=T,this.yyleng++,this.offset++,this.match+=T,this.matched+=T;var E=T.match(/(?:\r\n?|\n).*/g);return E?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),T},"input"),unput:o(function(T){var E=T.length,A=T.split(/(?:\r\n?|\n)/g);this._input=T+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-E),this.offset-=E;var S=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),A.length-1&&(this.yylineno-=A.length-1);var _=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:A?(A.length===S.length?this.yylloc.first_column:0)+S[S.length-A.length].length-A[0].length:this.yylloc.first_column-E},this.options.ranges&&(this.yylloc.range=[_[0],_[0]+this.yyleng-E]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(T){this.unput(this.match.slice(T))},"less"),pastInput:o(function(){var T=this.matched.substr(0,this.matched.length-this.match.length);return(T.length>20?"...":"")+T.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var T=this.match;return T.length<20&&(T+=this._input.substr(0,20-T.length)),(T.substr(0,20)+(T.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var T=this.pastInput(),E=new Array(T.length+1).join("-");return T+this.upcomingInput()+` +`+E+"^"},"showPosition"),test_match:o(function(T,E){var A,S,_;if(this.options.backtrack_lexer&&(_={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(_.yylloc.range=this.yylloc.range.slice(0))),S=T[0].match(/(?:\r\n?|\n).*/g),S&&(this.yylineno+=S.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:S?S[S.length-1].length-S[S.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+T[0].length},this.yytext+=T[0],this.match+=T[0],this.matches=T,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(T[0].length),this.matched+=T[0],A=this.performAction.call(this,this.yy,this,E,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),A)return A;if(this._backtrack){for(var I in _)this[I]=_[I];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var T,E,A,S;this._more||(this.yytext="",this.match="");for(var _=this._currentRules(),I=0;I<_.length;I++)if(A=this._input.match(this.rules[_[I]]),A&&(!E||A[0].length>E[0].length)){if(E=A,S=I,this.options.backtrack_lexer){if(T=this.test_match(A,_[I]),T!==!1)return T;if(this._backtrack){E=!1;continue}else return!1}else if(!this.options.flex)break}return E?(T=this.test_match(E,_[S]),T!==!1?T:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var E=this.next();return E||this.lex()},"lex"),begin:o(function(E){this.conditionStack.push(E)},"begin"),popState:o(function(){var E=this.conditionStack.length-1;return E>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(E){return E=this.conditionStack.length-1-Math.abs(E||0),E>=0?this.conditionStack[E]:"INITIAL"},"topState"),pushState:o(function(E){this.begin(E)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(E,A,S,_){var I=_;switch(S){case 0:return E.getLogger().trace("Found comment",A.yytext),6;break;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;break;case 4:this.popState();break;case 5:E.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return E.getLogger().trace("SPACELINE"),6;break;case 7:return 7;case 8:return 15;case 9:E.getLogger().trace("end icon"),this.popState();break;case 10:return E.getLogger().trace("Exploding node"),this.begin("NODE"),19;break;case 11:return E.getLogger().trace("Cloud"),this.begin("NODE"),19;break;case 12:return E.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;break;case 13:return E.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;break;case 14:return this.begin("NODE"),19;break;case 15:return this.begin("NODE"),19;break;case 16:return this.begin("NODE"),19;break;case 17:return this.begin("NODE"),19;break;case 18:return 13;case 19:return 22;case 20:return 11;case 21:this.begin("NSTR2");break;case 22:return"NODE_DESCR";case 23:this.popState();break;case 24:E.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 25:return E.getLogger().trace("description:",A.yytext),"NODE_DESCR";break;case 26:this.popState();break;case 27:return this.popState(),E.getLogger().trace("node end ))"),"NODE_DEND";break;case 28:return this.popState(),E.getLogger().trace("node end )"),"NODE_DEND";break;case 29:return this.popState(),E.getLogger().trace("node end ...",A.yytext),"NODE_DEND";break;case 30:return this.popState(),E.getLogger().trace("node end (("),"NODE_DEND";break;case 31:return this.popState(),E.getLogger().trace("node end (-"),"NODE_DEND";break;case 32:return this.popState(),E.getLogger().trace("node end (-"),"NODE_DEND";break;case 33:return this.popState(),E.getLogger().trace("node end (("),"NODE_DEND";break;case 34:return this.popState(),E.getLogger().trace("node end (("),"NODE_DEND";break;case 35:return E.getLogger().trace("Long description:",A.yytext),20;break;case 36:return E.getLogger().trace("Long description:",A.yytext),20;break}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR2:{rules:[22,23],inclusive:!1},NSTR:{rules:[25,26],inclusive:!1},NODE:{rules:[21,24,27,28,29,30,31,32,33,34,35,36],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}};return C}();x.lexer=b;function w(){this.yy={}}return o(w,"Parser"),w.prototype=x,x.Parser=w,new w}();yP.parser=yP;Epe=yP});var $l,Cpe,vP,NHe,MHe,IHe,OHe,Vi,PHe,BHe,FHe,$He,zHe,GHe,VHe,Ape,_pe=N(()=>{"use strict";zt();gr();vt();Ya();$l=[],Cpe=0,vP={},NHe=o(()=>{$l=[],Cpe=0,vP={}},"clear"),MHe=o(function(t){for(let e=$l.length-1;e>=0;e--)if($l[e].level$l.length>0?$l[0]:null,"getMindmap"),OHe=o((t,e,r,n)=>{Y.info("addNode",t,e,r,n);let i=me(),a=i.mindmap?.padding??or.mindmap.padding;switch(n){case Vi.ROUNDED_RECT:case Vi.RECT:case Vi.HEXAGON:a*=2}let s={id:Cpe++,nodeId:Tr(e,i),level:t,descr:Tr(r,i),type:n,children:[],width:i.mindmap?.maxNodeWidth??or.mindmap.maxNodeWidth,padding:a},l=MHe(t);if(l)l.children.push(s),$l.push(s);else if($l.length===0)$l.push(s);else throw new Error('There can be only one root. No parent could be found for ("'+s.descr+'")')},"addNode"),Vi={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},PHe=o((t,e)=>{switch(Y.debug("In get type",t,e),t){case"[":return Vi.RECT;case"(":return e===")"?Vi.ROUNDED_RECT:Vi.CLOUD;case"((":return Vi.CIRCLE;case")":return Vi.CLOUD;case"))":return Vi.BANG;case"{{":return Vi.HEXAGON;default:return Vi.DEFAULT}},"getType"),BHe=o((t,e)=>{vP[t]=e},"setElementForId"),FHe=o(t=>{if(!t)return;let e=me(),r=$l[$l.length-1];t.icon&&(r.icon=Tr(t.icon,e)),t.class&&(r.class=Tr(t.class,e))},"decorateNode"),$He=o(t=>{switch(t){case Vi.DEFAULT:return"no-border";case Vi.RECT:return"rect";case Vi.ROUNDED_RECT:return"rounded-rect";case Vi.CIRCLE:return"circle";case Vi.CLOUD:return"cloud";case Vi.BANG:return"bang";case Vi.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),zHe=o(()=>Y,"getLogger"),GHe=o(t=>vP[t],"getElementById"),VHe={clear:NHe,addNode:OHe,getMindmap:IHe,nodeType:Vi,getType:PHe,setElementForId:BHe,decorateNode:FHe,type2Str:$He,getLogger:zHe,getElementById:GHe},Ape=VHe});function Wi(t){"@babel/helpers - typeof";return Wi=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Wi(t)}function Mf(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function Dpe(t,e){for(var r=0;rt.length)&&(e=t.length);for(var r=0,n=new Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},"n"),e:o(function(u){throw u},"e"),f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a=!0,s=!1,l;return{s:o(function(){r=r.call(t)},"s"),n:o(function(){var u=r.next();return a=u.done,u},"n"),e:o(function(u){s=!0,l=u},"e"),f:o(function(){try{!a&&r.return!=null&&r.return()}finally{if(s)throw l}},"f")}}function yWe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}function vWe(t,e){return e={exports:{}},t(e,e.exports),e.exports}function SWe(t){for(var e=t.length;e--&&EWe.test(t.charAt(e)););return e}function _We(t){return t&&t.slice(0,CWe(t)+1).replace(AWe,"")}function MWe(t){var e=RWe.call(t,Ab),r=t[Ab];try{t[Ab]=void 0;var n=!0}catch{}var i=NWe.call(t);return n&&(e?t[Ab]=r:delete t[Ab]),i}function BWe(t){return PWe.call(t)}function GWe(t){return t==null?t===void 0?zWe:$We:Npe&&Npe in Object(t)?IWe(t):FWe(t)}function VWe(t){return t!=null&&typeof t=="object"}function WWe(t){return typeof t=="symbol"||UWe(t)&&ame(t)==HWe}function KWe(t){if(typeof t=="number")return t;if(r4(t))return Mpe;if(zp(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=zp(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=DWe(t);var r=YWe.test(t);return r||XWe.test(t)?jWe(t.slice(2),r?2:8):qWe.test(t)?Mpe:+t}function eqe(t,e,r){var n,i,a,s,l,u,h=0,f=!1,d=!1,p=!0;if(typeof t!="function")throw new TypeError(QWe);e=Ipe(e)||0,zp(r)&&(f=!!r.leading,d="maxWait"in r,a=d?ZWe(Ipe(r.maxWait)||0,e):a,p="trailing"in r?!!r.trailing:p);function m(E){var A=n,S=i;return n=i=void 0,h=E,s=t.apply(S,A),s}o(m,"invokeFunc");function g(E){return h=E,l=setTimeout(x,e),f?m(E):s}o(g,"leadingEdge");function y(E){var A=E-u,S=E-h,_=e-A;return d?JWe(_,a-S):_}o(y,"remainingWait");function v(E){var A=E-u,S=E-h;return u===void 0||A>=e||A<0||d&&S>=a}o(v,"shouldInvoke");function x(){var E=xP();if(v(E))return b(E);l=setTimeout(x,y(E))}o(x,"timerExpired");function b(E){return l=void 0,p&&n?m(E):(n=i=void 0,s)}o(b,"trailingEdge");function w(){l!==void 0&&clearTimeout(l),h=0,n=u=i=l=void 0}o(w,"cancel");function C(){return l===void 0?s:b(xP())}o(C,"flush");function T(){var E=xP(),A=v(E);if(n=arguments,i=this,u=E,A){if(l===void 0)return g(u);if(d)return clearTimeout(l),l=setTimeout(x,e),m(u)}return l===void 0&&(l=setTimeout(x,e)),s}return o(T,"debounced"),T.cancel=w,T.flush=C,T}function IS(t,e,r,n,i,a){var s;return si(t)?s=t:s=Q1[t]||Q1.euclidean,e===0&&si(t)?s(i,a):s(e,r,n,i,a)}function qYe(t,e){if(OS(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||r4(t)?!0:WYe.test(t)||!HYe.test(t)||e!=null&&t in Object(e)}function ZYe(t){if(!zp(t))return!1;var e=ame(t);return e==jYe||e==KYe||e==XYe||e==QYe}function tXe(t){return!!e0e&&e0e in t}function aXe(t){if(t!=null){try{return iXe.call(t)}catch{}try{return t+""}catch{}}return""}function pXe(t){if(!zp(t)||rXe(t))return!1;var e=JYe(t)?dXe:lXe;return e.test(sXe(t))}function gXe(t,e){return t?.[e]}function vXe(t,e){var r=yXe(t,e);return mXe(r)?r:void 0}function bXe(){this.__data__=jb?jb(null):{},this.size=0}function TXe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}function AXe(t){var e=this.__data__;if(jb){var r=e[t];return r===EXe?void 0:r}return CXe.call(e,t)?e[t]:void 0}function RXe(t){var e=this.__data__;return jb?e[t]!==void 0:LXe.call(e,t)}function IXe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=jb&&e===void 0?MXe:e,this}function ty(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e-1}function XXe(t,e){var r=this.__data__,n=PS(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this}function ry(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e-1&&t%1==0&&t0;){var f=i.shift();e(f),a.add(f.id()),l&&n(i,a,f)}return t}function Fme(t,e,r){if(r.isParent())for(var n=r._private.children,i=0;i0&&arguments[0]!==void 0?arguments[0]:NKe,e=arguments.length>1?arguments[1]:void 0,r=0;r0?k=R:D=R;while(Math.abs(L)>s&&++O=a?b(I,O):M===0?O:C(I,D,D+h)}o(T,"getTForX");var E=!1;function A(){E=!0,(t!==e||r!==n)&&w()}o(A,"precompute");var S=o(function(D){return E||A(),t===e&&r===n?D:D===0?0:D===1?1:v(T(D),e,n)},"f");S.getControlPoints=function(){return[{x:t,y:e},{x:r,y:n}]};var _="generateBezier("+[t,e,r,n]+")";return S.toString=function(){return _},S}function x0e(t,e,r,n,i){if(n===1||e===r)return r;var a=i(e,r,n);return t==null||((t.roundValue||t.color)&&(a=Math.round(a)),t.min!==void 0&&(a=Math.max(a,t.min)),t.max!==void 0&&(a=Math.min(a,t.max))),a}function b0e(t,e){return t.pfValue!=null||t.value!=null?t.pfValue!=null&&(e==null||e.type.units!=="%")?t.pfValue:t.value:t}function $1(t,e,r,n,i){var a=i!=null?i.type:null;r<0?r=0:r>1&&(r=1);var s=b0e(t,i),l=b0e(e,i);if(Ct(s)&&Ct(l))return x0e(a,s,l,r,n);if(En(s)&&En(l)){for(var u=[],h=0;h0?(m==="spring"&&g.push(s.duration),s.easingImpl=dS[m].apply(null,g)):s.easingImpl=dS[m]}var y=s.easingImpl,v;if(s.duration===0?v=1:v=(r-u)/s.duration,s.applying&&(v=s.progress),v<0?v=0:v>1&&(v=1),s.delay==null){var x=s.startPosition,b=s.position;if(b&&i&&!t.locked()){var w={};Rb(x.x,b.x)&&(w.x=$1(x.x,b.x,v,y)),Rb(x.y,b.y)&&(w.y=$1(x.y,b.y,v,y)),t.position(w)}var C=s.startPan,T=s.pan,E=a.pan,A=T!=null&&n;A&&(Rb(C.x,T.x)&&(E.x=$1(C.x,T.x,v,y)),Rb(C.y,T.y)&&(E.y=$1(C.y,T.y,v,y)),t.emit("pan"));var S=s.startZoom,_=s.zoom,I=_!=null&&n;I&&(Rb(S,_)&&(a.zoom=Yb(a.minZoom,$1(S,_,v,y),a.maxZoom)),t.emit("zoom")),(A||I)&&t.emit("viewport");var D=s.style;if(D&&D.length>0&&i){for(var k=0;k=0;A--){var S=E[A];S()}E.splice(0,E.length)},"callbacks"),b=m.length-1;b>=0;b--){var w=m[b],C=w._private;if(C.stopped){m.splice(b,1),C.hooked=!1,C.playing=!1,C.started=!1,x(C.frames);continue}!C.playing&&!C.applying||(C.playing&&C.applying&&(C.applying=!1),C.started||qKe(f,w,t),WKe(f,w,t,d),C.applying&&(C.applying=!1),x(C.frames),C.step!=null&&C.step(t),w.completed()&&(m.splice(b,1),C.hooked=!1,C.playing=!1,C.started=!1,x(C.completes)),y=!0)}return!d&&m.length===0&&g.length===0&&n.push(f),y}o(i,"stepOne");for(var a=!1,s=0;s0?e.notify("draw",r):e.notify("draw")),r.unmerge(n),e.emit("step")}function tge(t){this.options=rr({},eQe,tQe,t)}function rge(t){this.options=rr({},rQe,t)}function nge(t){this.options=rr({},nQe,t)}function HS(t){this.options=rr({},iQe,t),this.options.layout=this;var e=this.options.eles.nodes(),r=this.options.eles.edges(),n=r.filter(function(i){var a=i.source().data("id"),s=i.target().data("id"),l=e.some(function(h){return h.data("id")===a}),u=e.some(function(h){return h.data("id")===s});return!l||!u});this.options.eles=this.options.eles.not(n)}function age(t){this.options=rr({},wQe,t)}function gB(t){this.options=rr({},TQe,t)}function sge(t){this.options=rr({},kQe,t)}function oge(t){this.options=rr({},EQe,t)}function lge(t){this.options=t,this.notifications=0}function hge(t,e){e.radius===0?t.lineTo(e.cx,e.cy):t.arc(e.cx,e.cy,e.radius,e.startAngle,e.endAngle,e.counterClockwise)}function vB(t,e,r,n){var i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0;return n===0||e.radius===0?{cx:e.x,cy:e.y,radius:0,startX:e.x,startY:e.y,stopX:e.x,stopY:e.y,startAngle:void 0,endAngle:void 0,counterClockwise:void 0}:(AQe(t,e,r,n,i),{cx:HP,cy:WP,radius:Bp,startX:cge,startY:uge,stopX:qP,stopY:YP,startAngle:qc.ang+Math.PI/2*Fp,endAngle:Jo.ang-Math.PI/2*Fp,counterClockwise:gS})}function fge(t){var e=[];if(t!=null){for(var r=0;r5&&arguments[5]!==void 0?arguments[5]:5,s=arguments.length>6?arguments[6]:void 0;t.beginPath(),t.moveTo(e+a,r),t.lineTo(e+n-a,r),t.quadraticCurveTo(e+n,r,e+n,r+a),t.lineTo(e+n,r+i-a),t.quadraticCurveTo(e+n,r+i,e+n-a,r+i),t.lineTo(e+a,r+i),t.quadraticCurveTo(e,r+i,e,r+i-a),t.lineTo(e,r+a),t.quadraticCurveTo(e,r,e+a,r),t.closePath(),s?t.stroke():t.fill()}function z0e(t,e,r){var n=t.createShader(e);if(t.shaderSource(n,r),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new Error(t.getShaderInfoLog(n));return n}function pZe(t,e,r){var n=z0e(t,t.VERTEX_SHADER,e),i=z0e(t,t.FRAGMENT_SHADER,r),a=t.createProgram();if(t.attachShader(a,n),t.attachShader(a,i),t.linkProgram(a),!t.getProgramParameter(a,t.LINK_STATUS))throw new Error("Could not initialize shaders");return a}function mZe(t,e,r){r===void 0&&(r=e);var n=t.makeOffscreenCanvas(e,r),i=n.context=n.getContext("2d");return n.clear=function(){return i.clearRect(0,0,n.width,n.height)},n.clear(),n}function wB(t){var e=t.pixelRatio,r=t.cy.zoom(),n=t.cy.pan();return{zoom:r*e,pan:{x:n.x*e,y:n.y*e}}}function NP(t,e,r,n,i){var a=n*r+e.x,s=i*r+e.y;return s=Math.round(t.canvasHeight-s),[a,s]}function oS(t,e,r){var n=t[0]/255,i=t[1]/255,a=t[2]/255,s=e,l=r||new Array(4);return l[0]=n*s,l[1]=i*s,l[2]=a*s,l[3]=s,l}function lS(t,e){var r=e||new Array(4);return r[0]=(t>>0&255)/255,r[1]=(t>>8&255)/255,r[2]=(t>>16&255)/255,r[3]=(t>>24&255)/255,r}function gZe(t){return t[0]+(t[1]<<8)+(t[2]<<16)+(t[3]<<24)}function yZe(t,e){var r=t.createTexture();return r.buffer=function(n){t.bindTexture(t.TEXTURE_2D,r),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR_MIPMAP_NEAREST),t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,n),t.generateMipmap(t.TEXTURE_2D),t.bindTexture(t.TEXTURE_2D,null)},r.deleteTexture=function(){t.deleteTexture(r)},r}function Sge(t,e){switch(e){case"float":return[1,t.FLOAT,4];case"vec2":return[2,t.FLOAT,4];case"vec3":return[3,t.FLOAT,4];case"vec4":return[4,t.FLOAT,4];case"int":return[1,t.INT,4];case"ivec2":return[2,t.INT,4]}}function Cge(t,e,r){switch(e){case t.FLOAT:return new Float32Array(r);case t.INT:return new Int32Array(r)}}function vZe(t,e,r,n,i,a){switch(e){case t.FLOAT:return new Float32Array(r.buffer,a*n,i);case t.INT:return new Int32Array(r.buffer,a*n,i)}}function xZe(t,e,r,n){var i=Sge(t,e),a=_i(i,2),s=a[0],l=a[1],u=Cge(t,l,n),h=t.createBuffer();return t.bindBuffer(t.ARRAY_BUFFER,h),t.bufferData(t.ARRAY_BUFFER,u,t.STATIC_DRAW),l===t.FLOAT?t.vertexAttribPointer(r,s,l,!1,0,0):l===t.INT&&t.vertexAttribIPointer(r,s,l,0,0),t.enableVertexAttribArray(r),t.bindBuffer(t.ARRAY_BUFFER,null),h}function po(t,e,r,n){var i=Sge(t,r),a=_i(i,3),s=a[0],l=a[1],u=a[2],h=Cge(t,l,e*s),f=s*u,d=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,d),t.bufferData(t.ARRAY_BUFFER,e*f,t.DYNAMIC_DRAW),t.enableVertexAttribArray(n),l===t.FLOAT?t.vertexAttribPointer(n,s,l,!1,f,0):l===t.INT&&t.vertexAttribIPointer(n,s,l,f,0),t.vertexAttribDivisor(n,1),t.bindBuffer(t.ARRAY_BUFFER,null);for(var p=new Array(e),m=0;mbge?(RZe(t),e.call(t,a)):(NZe(t),Rge(t,a,Vb.SCREEN)))}}{var r=t.matchCanvasSize;t.matchCanvasSize=function(a){r.call(t,a),t.pickingFrameBuffer.setFramebufferAttachmentSizes(t.canvasWidth,t.canvasHeight),t.pickingFrameBuffer.needsDraw=!0}}t.findNearestElements=function(a,s,l,u){return FZe(t,a,s)};{var n=t.invalidateCachedZSortedEles;t.invalidateCachedZSortedEles=function(){n.call(t),t.pickingFrameBuffer.needsDraw=!0}}{var i=t.notify;t.notify=function(a,s){i.call(t,a,s),a==="viewport"||a==="bounds"?t.pickingFrameBuffer.needsDraw=!0:a==="background"&&t.eleDrawing.invalidate(s,{type:"node-body"})}}}function RZe(t){var e=t.data.contexts[t.WEBGL];e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}function NZe(t){var e=o(function(n){n.save(),n.setTransform(1,0,0,1,0,0),n.clearRect(0,0,t.canvasWidth,t.canvasHeight),n.restore()},"clear");e(t.data.contexts[t.NODE]),e(t.data.contexts[t.DRAG])}function MZe(t){var e=t.canvasWidth,r=t.canvasHeight,n=wB(t),i=n.pan,a=n.zoom,s=Gb();DS(s,s,[i.x,i.y]),TB(s,s,[a,a]);var l=Gb();TZe(l,e,r);var u=Gb();return wZe(u,l,s),u}function Lge(t,e){var r=t.canvasWidth,n=t.canvasHeight,i=wB(t),a=i.pan,s=i.zoom;e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,r,n),e.translate(a.x,a.y),e.scale(s,s)}function IZe(t,e){t.drawSelectionRectangle(e,function(r){return Lge(t,r)})}function OZe(t){var e=t.data.contexts[t.NODE];e.save(),Lge(t,e),e.strokeStyle="rgba(0, 0, 0, 0.3)",e.beginPath(),e.moveTo(-1e3,0),e.lineTo(1e3,0),e.stroke(),e.beginPath(),e.moveTo(0,-1e3),e.lineTo(0,1e3),e.stroke(),e.restore()}function PZe(t){var e=o(function(i,a,s){for(var l=i.atlasManager.getRenderTypeOpts(a),u=t.data.contexts[t.NODE],h=.125,f=l.atlasCollection.atlases,d=0;d=0&&k.add(O)}return k}function FZe(t,e,r){var n=BZe(t,e,r),i=t.getCachedZSortedEles(),a,s,l=mo(n),u;try{for(l.s();!(u=l.n()).done;){var h=u.value,f=i[h];if(!a&&f.isNode()&&(a=f),!s&&f.isEdge()&&(s=f),a&&s)break}}catch(d){l.e(d)}finally{l.f()}return[a,s].filter(Boolean)}function Rge(t,e,r){var n,i;t.webglDebug&&(i=[],n=performance.now());var a=t.eleDrawing,s=0;if(r.screen&&t.data.canvasNeedsRedraw[t.SELECT_BOX]&&IZe(t,e),t.data.canvasNeedsRedraw[t.NODE]||r.picking){var l=o(function(k,L){L+=1,k.isNode()?(a.drawTexture(k,L,"node-underlay"),a.drawTexture(k,L,"node-body"),a.drawTexture(k,L,"node-label"),a.drawTexture(k,L,"node-overlay")):(a.drawEdgeLine(k,L),a.drawEdgeArrow(k,L,"source"),a.drawEdgeArrow(k,L,"target"),a.drawTexture(k,L,"edge-label"))},"draw"),u=t.data.contexts[t.WEBGL];r.screen?(u.clearColor(0,0,0,0),u.enable(u.BLEND),u.blendFunc(u.ONE,u.ONE_MINUS_SRC_ALPHA)):u.disable(u.BLEND),u.clear(u.COLOR_BUFFER_BIT|u.DEPTH_BUFFER_BIT),u.viewport(0,0,u.canvas.width,u.canvas.height);var h=MZe(t),f=t.getCachedZSortedEles();if(s=f.length,a.startFrame(h,i,r),r.screen){for(var d=0;d{"use strict";o(Wi,"_typeof");o(Mf,"_classCallCheck");o(Dpe,"_defineProperties");o(If,"_createClass");o(X0e,"_defineProperty$1");o(_i,"_slicedToArray");o(j0e,"_toConsumableArray");o(UHe,"_arrayWithoutHoles");o(HHe,"_arrayWithHoles");o(WHe,"_iterableToArray");o(qHe,"_iterableToArrayLimit");o(ZP,"_unsupportedIterableToArray");o(OP,"_arrayLikeToArray");o(YHe,"_nonIterableSpread");o(XHe,"_nonIterableRest");o(mo,"_createForOfIteratorHelper");Ui=typeof window>"u"?null:window,Lpe=Ui?Ui.navigator:null;Ui&&Ui.document;jHe=Wi(""),K0e=Wi({}),KHe=Wi(function(){}),QHe=typeof HTMLElement>"u"?"undefined":Wi(HTMLElement),e4=o(function(e){return e&&e.instanceString&&si(e.instanceString)?e.instanceString():null},"instanceStr"),Zt=o(function(e){return e!=null&&Wi(e)==jHe},"string"),si=o(function(e){return e!=null&&Wi(e)===KHe},"fn"),En=o(function(e){return!go(e)&&(Array.isArray?Array.isArray(e):e!=null&&e instanceof Array)},"array"),Ur=o(function(e){return e!=null&&Wi(e)===K0e&&!En(e)&&e.constructor===Object},"plainObject"),ZHe=o(function(e){return e!=null&&Wi(e)===K0e},"object"),Ct=o(function(e){return e!=null&&Wi(e)===Wi(1)&&!isNaN(e)},"number"),JHe=o(function(e){return Ct(e)&&Math.floor(e)===e},"integer"),vS=o(function(e){if(QHe!=="undefined")return e!=null&&e instanceof HTMLElement},"htmlElement"),go=o(function(e){return t4(e)||Q0e(e)},"elementOrCollection"),t4=o(function(e){return e4(e)==="collection"&&e._private.single},"element"),Q0e=o(function(e){return e4(e)==="collection"&&!e._private.single},"collection"),JP=o(function(e){return e4(e)==="core"},"core"),Z0e=o(function(e){return e4(e)==="stylesheet"},"stylesheet"),eWe=o(function(e){return e4(e)==="event"},"event"),Af=o(function(e){return e==null?!0:!!(e===""||e.match(/^\s+$/))},"emptyString"),tWe=o(function(e){return typeof HTMLElement>"u"?!1:e instanceof HTMLElement},"domElement"),rWe=o(function(e){return Ur(e)&&Ct(e.x1)&&Ct(e.x2)&&Ct(e.y1)&&Ct(e.y2)},"boundingBox"),nWe=o(function(e){return ZHe(e)&&si(e.then)},"promise"),iWe=o(function(){return Lpe&&Lpe.userAgent.match(/msie|trident|edge/i)},"ms"),Ub=o(function(e,r){r||(r=o(function(){if(arguments.length===1)return arguments[0];if(arguments.length===0)return"undefined";for(var a=[],s=0;sr?1:0},"ascending"),hWe=o(function(e,r){return-1*eme(e,r)},"descending"),rr=Object.assign!=null?Object.assign.bind(Object):function(t){for(var e=arguments,r=1;r1&&(v-=1),v<1/6?g+(y-g)*6*v:v<1/2?y:v<2/3?g+(y-g)*(2/3-v)*6:g}o(f,"hue2rgb");var d=new RegExp("^"+oWe+"$").exec(e);if(d){if(n=parseInt(d[1]),n<0?n=(360- -1*n%360)%360:n>360&&(n=n%360),n/=360,i=parseFloat(d[2]),i<0||i>100||(i=i/100,a=parseFloat(d[3]),a<0||a>100)||(a=a/100,s=d[4],s!==void 0&&(s=parseFloat(s),s<0||s>1)))return;if(i===0)l=u=h=Math.round(a*255);else{var p=a<.5?a*(1+i):a+i-a*i,m=2*a-p;l=Math.round(255*f(m,p,n+1/3)),u=Math.round(255*f(m,p,n)),h=Math.round(255*f(m,p,n-1/3))}r=[l,u,h,s]}return r},"hsl2tuple"),pWe=o(function(e){var r,n=new RegExp("^"+aWe+"$").exec(e);if(n){r=[];for(var i=[],a=1;a<=3;a++){var s=n[a];if(s[s.length-1]==="%"&&(i[a]=!0),s=parseFloat(s),i[a]&&(s=s/100*255),s<0||s>255)return;r.push(Math.floor(s))}var l=i[1]||i[2]||i[3],u=i[1]&&i[2]&&i[3];if(l&&!u)return;var h=n[4];if(h!==void 0){if(h=parseFloat(h),h<0||h>1)return;r.push(h)}}return r},"rgb2tuple"),mWe=o(function(e){return gWe[e.toLowerCase()]},"colorname2tuple"),tme=o(function(e){return(En(e)?e:null)||mWe(e)||fWe(e)||pWe(e)||dWe(e)},"color2tuple"),gWe={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},rme=o(function(e){for(var r=e.map,n=e.keys,i=n.length,a=0;a1&&arguments[1]!==void 0?arguments[1]:V1,n=r,i;i=e.next(),!i.done;)n=n*ome+i.value|0;return n},"hashIterableInts"),Hb=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:V1;return r*ome+e|0},"hashInt"),Wb=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Ob;return(r<<5)+r+e|0},"hashIntAlt"),rqe=o(function(e,r){return e*2097152+r},"combineHashes"),wf=o(function(e){return e[0]*2097152+e[1]},"combineHashesArray"),j6=o(function(e,r){return[Hb(e[0],r[0]),Wb(e[1],r[1])]},"hashArrays"),nqe=o(function(e,r){var n={value:0,done:!1},i=0,a=e.length,s={next:o(function(){return i=0&&!(e[i]===r&&(e.splice(i,1),n));i--);},"removeFromArray"),nB=o(function(e){e.splice(0,e.length)},"clearArray"),uqe=o(function(e,r){for(var n=0;n"u"?"undefined":Wi(Set))!==fqe?Set:dqe,NS=o(function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(e===void 0||r===void 0||!JP(e)){ai("An element must have a core reference and parameters set");return}var i=r.group;if(i==null&&(r.data&&r.data.source!=null&&r.data.target!=null?i="edges":i="nodes"),i!=="nodes"&&i!=="edges"){ai("An element must be of type `nodes` or `edges`; you specified `"+i+"`");return}this.length=1,this[0]=this;var a=this._private={cy:e,single:!0,data:r.data||{},position:r.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:i,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!r.selected,selectable:r.selectable===void 0?!0:!!r.selectable,locked:!!r.locked,grabbed:!1,grabbable:r.grabbable===void 0?!0:!!r.grabbable,pannable:r.pannable===void 0?i==="edges":!!r.pannable,active:!1,classes:new J1,animation:{current:[],queue:[]},rscratch:{},scratch:r.scratch||{},edges:[],children:[],parent:r.parent&&r.parent.isNode()?r.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(a.position.x==null&&(a.position.x=0),a.position.y==null&&(a.position.y=0),r.renderedPosition){var s=r.renderedPosition,l=e.pan(),u=e.zoom();a.position={x:(s.x-l.x)/u,y:(s.y-l.y)/u}}var h=[];En(r.classes)?h=r.classes:Zt(r.classes)&&(h=r.classes.split(/\s+/));for(var f=0,d=h.length;fb?1:0},"defaultCmp"),f=o(function(x,b,w,C,T){var E;if(w==null&&(w=0),T==null&&(T=n),w<0)throw new Error("lo must be non-negative");for(C==null&&(C=x.length);wI;0<=I?_++:_--)S.push(_);return S}.apply(this).reverse(),A=[],C=0,T=E.length;CD;0<=D?++S:--S)k.push(s(x,w));return k},"nsmallest"),y=o(function(x,b,w,C){var T,E,A;for(C==null&&(C=n),T=x[w];w>b;){if(A=w-1>>1,E=x[A],C(T,E)<0){x[w]=E,w=A;continue}break}return x[w]=T},"_siftdown"),v=o(function(x,b,w){var C,T,E,A,S;for(w==null&&(w=n),T=x.length,S=b,E=x[b],C=2*b+1;C0;){var E=b.pop(),A=v(E),S=E.id();if(p[S]=A,A!==1/0)for(var _=E.neighborhood().intersect(g),I=0;I<_.length;I++){var D=_[I],k=D.id(),L=T(E,D),R=A+L.dist;R0)for(F.unshift(B);d[z];){var $=d[z];F.unshift($.edge),F.unshift($.node),P=$.node,z=P.id()}return l.spawn(F)},"pathTo")}},"dijkstra")},yqe={kruskal:o(function(e){e=e||function(w){return 1};for(var r=this.byGroup(),n=r.nodes,i=r.edges,a=n.length,s=new Array(a),l=n,u=o(function(C){for(var T=0;T0;){if(T(),A++,C===f){for(var S=[],_=a,I=f,D=x[I];S.unshift(_),D!=null&&S.unshift(D),_=v[I],_!=null;)I=_.id(),D=x[I];return{found:!0,distance:d[C],path:this.spawn(S),steps:A}}m[C]=!0;for(var k=w._private.edges,L=0;LD&&(g[I]=D,b[I]=_,w[I]=T),!a){var k=_*f+S;!a&&g[k]>D&&(g[k]=D,b[k]=S,w[k]=T)}}}for(var L=0;L1&&arguments[1]!==void 0?arguments[1]:s,ge=w(ae),ze=[],He=ge;;){if(He==null)return r.spawn();var $e=b(He),Re=$e.edge,Ie=$e.pred;if(ze.unshift(He[0]),He.same(Oe)&&ze.length>0)break;Re!=null&&ze.unshift(Re),He=Ie}return u.spawn(ze)},"pathTo"),E=0;E=0;f--){var d=h[f],p=d[1],m=d[2];(r[p]===l&&r[m]===u||r[p]===u&&r[m]===l)&&h.splice(f,1)}for(var g=0;gi;){var a=Math.floor(Math.random()*r.length);r=Sqe(a,e,r),n--}return r},"contractUntil"),Cqe={kargerStein:o(function(){var e=this,r=this.byGroup(),n=r.nodes,i=r.edges;i.unmergeBy(function(F){return F.isLoop()});var a=n.length,s=i.length,l=Math.ceil(Math.pow(Math.log(a)/Math.LN2,2)),u=Math.floor(a/Eqe);if(a<2){ai("At least 2 nodes are required for Karger-Stein algorithm");return}for(var h=[],f=0;f1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=-1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=0,a=0,s=r;s1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,a=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0;i?e=e.slice(r,n):(n0&&e.splice(0,r));for(var l=0,u=e.length-1;u>=0;u--){var h=e[u];s?isFinite(h)||(e[u]=-1/0,l++):e.splice(u,1)}a&&e.sort(function(p,m){return p-m});var f=e.length,d=Math.floor(f/2);return f%2!==0?e[d+1+l]:(e[d-1+l]+e[d+l])/2},"median"),Nqe=o(function(e){return Math.PI*e/180},"deg2rad"),K6=o(function(e,r){return Math.atan2(r,e)-Math.PI/2},"getAngleFromDisp"),iB=Math.log2||function(t){return Math.log(t)/Math.log(2)},mme=o(function(e){return e>0?1:e<0?-1:0},"signum"),Gp=o(function(e,r){return Math.sqrt(Op(e,r))},"dist"),Op=o(function(e,r){var n=r.x-e.x,i=r.y-e.y;return n*n+i*i},"sqdist"),Mqe=o(function(e){for(var r=e.length,n=0,i=0;i=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(e.w!=null&&e.h!=null&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},"makeBoundingBox"),Oqe=o(function(e){return{x1:e.x1,x2:e.x2,w:e.w,y1:e.y1,y2:e.y2,h:e.h}},"copyBoundingBox"),Pqe=o(function(e){e.x1=1/0,e.y1=1/0,e.x2=-1/0,e.y2=-1/0,e.w=0,e.h=0},"clearBoundingBox"),Bqe=o(function(e,r,n){return{x1:e.x1+r,x2:e.x2+r,y1:e.y1+n,y2:e.y2+n,w:e.w,h:e.h}},"shiftBoundingBox"),gme=o(function(e,r){e.x1=Math.min(e.x1,r.x1),e.x2=Math.max(e.x2,r.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,r.y1),e.y2=Math.max(e.y2,r.y2),e.h=e.y2-e.y1},"updateBoundingBox"),Fqe=o(function(e,r,n){e.x1=Math.min(e.x1,r),e.x2=Math.max(e.x2,r),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},"expandBoundingBoxByPoint"),cS=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return e.x1-=r,e.x2+=r,e.y1-=r,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBox"),uS=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[0],n,i,a,s;if(r.length===1)n=i=a=s=r[0];else if(r.length===2)n=a=r[0],s=i=r[1];else if(r.length===4){var l=_i(r,4);n=l[0],i=l[1],a=l[2],s=l[3]}return e.x1-=s,e.x2+=i,e.y1-=n,e.y2+=a,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBoxSides"),Fpe=o(function(e,r){e.x1=r.x1,e.y1=r.y1,e.x2=r.x2,e.y2=r.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},"assignBoundingBox"),aB=o(function(e,r){return!(e.x1>r.x2||r.x1>e.x2||e.x2r.y2||r.y1>e.y2)},"boundingBoxesIntersect"),K1=o(function(e,r,n){return e.x1<=r&&r<=e.x2&&e.y1<=n&&n<=e.y2},"inBoundingBox"),$qe=o(function(e,r){return K1(e,r.x,r.y)},"pointInBoundingBox"),yme=o(function(e,r){return K1(e,r.x1,r.y1)&&K1(e,r.x2,r.y2)},"boundingBoxInBoundingBox"),vme=o(function(e,r,n,i,a,s,l){var u=arguments.length>7&&arguments[7]!==void 0?arguments[7]:"auto",h=u==="auto"?Vp(a,s):u,f=a/2,d=s/2;h=Math.min(h,f,d);var p=h!==f,m=h!==d,g;if(p){var y=n-f+h-l,v=i-d-l,x=n+f-h+l,b=v;if(g=Ef(e,r,n,i,y,v,x,b,!1),g.length>0)return g}if(m){var w=n+f+l,C=i-d+h-l,T=w,E=i+d-h+l;if(g=Ef(e,r,n,i,w,C,T,E,!1),g.length>0)return g}if(p){var A=n-f+h-l,S=i+d+l,_=n+f-h+l,I=S;if(g=Ef(e,r,n,i,A,S,_,I,!1),g.length>0)return g}if(m){var D=n-f-l,k=i-d+h-l,L=D,R=i+d-h+l;if(g=Ef(e,r,n,i,D,k,L,R,!1),g.length>0)return g}var O;{var M=n-f+h,B=i-d+h;if(O=Pb(e,r,n,i,M,B,h+l),O.length>0&&O[0]<=M&&O[1]<=B)return[O[0],O[1]]}{var F=n+f-h,P=i-d+h;if(O=Pb(e,r,n,i,F,P,h+l),O.length>0&&O[0]>=F&&O[1]<=P)return[O[0],O[1]]}{var z=n+f-h,$=i+d-h;if(O=Pb(e,r,n,i,z,$,h+l),O.length>0&&O[0]>=z&&O[1]>=$)return[O[0],O[1]]}{var H=n-f+h,Q=i+d-h;if(O=Pb(e,r,n,i,H,Q,h+l),O.length>0&&O[0]<=H&&O[1]>=Q)return[O[0],O[1]]}return[]},"roundRectangleIntersectLine"),zqe=o(function(e,r,n,i,a,s,l){var u=l,h=Math.min(n,a),f=Math.max(n,a),d=Math.min(i,s),p=Math.max(i,s);return h-u<=e&&e<=f+u&&d-u<=r&&r<=p+u},"inLineVicinity"),Gqe=o(function(e,r,n,i,a,s,l,u,h){var f={x1:Math.min(n,l,a)-h,x2:Math.max(n,l,a)+h,y1:Math.min(i,u,s)-h,y2:Math.max(i,u,s)+h};return!(ef.x2||rf.y2)},"inBezierVicinity"),Vqe=o(function(e,r,n,i){n-=i;var a=r*r-4*e*n;if(a<0)return[];var s=Math.sqrt(a),l=2*e,u=(-r+s)/l,h=(-r-s)/l;return[u,h]},"solveQuadratic"),Uqe=o(function(e,r,n,i,a){var s=1e-5;e===0&&(e=s),r/=e,n/=e,i/=e;var l,u,h,f,d,p,m,g;if(u=(3*n-r*r)/9,h=-(27*i)+r*(9*n-2*(r*r)),h/=54,l=u*u*u+h*h,a[1]=0,m=r/3,l>0){d=h+Math.sqrt(l),d=d<0?-Math.pow(-d,1/3):Math.pow(d,1/3),p=h-Math.sqrt(l),p=p<0?-Math.pow(-p,1/3):Math.pow(p,1/3),a[0]=-m+d+p,m+=(d+p)/2,a[4]=a[2]=-m,m=Math.sqrt(3)*(-p+d)/2,a[3]=m,a[5]=-m;return}if(a[5]=a[3]=0,l===0){g=h<0?-Math.pow(-h,1/3):Math.pow(h,1/3),a[0]=-m+2*g,a[4]=a[2]=-(g+m);return}u=-u,f=u*u*u,f=Math.acos(h/Math.sqrt(f)),g=2*Math.sqrt(u),a[0]=-m+g*Math.cos(f/3),a[2]=-m+g*Math.cos((f+2*Math.PI)/3),a[4]=-m+g*Math.cos((f+4*Math.PI)/3)},"solveCubic"),Hqe=o(function(e,r,n,i,a,s,l,u){var h=1*n*n-4*n*a+2*n*l+4*a*a-4*a*l+l*l+i*i-4*i*s+2*i*u+4*s*s-4*s*u+u*u,f=1*9*n*a-3*n*n-3*n*l-6*a*a+3*a*l+9*i*s-3*i*i-3*i*u-6*s*s+3*s*u,d=1*3*n*n-6*n*a+n*l-n*e+2*a*a+2*a*e-l*e+3*i*i-6*i*s+i*u-i*r+2*s*s+2*s*r-u*r,p=1*n*a-n*n+n*e-a*e+i*s-i*i+i*r-s*r,m=[];Uqe(h,f,d,p,m);for(var g=1e-7,y=[],v=0;v<6;v+=2)Math.abs(m[v+1])=0&&m[v]<=1&&y.push(m[v]);y.push(1),y.push(0);for(var x=-1,b,w,C,T=0;T=0?Ch?(e-a)*(e-a)+(r-s)*(r-s):f-p},"sqdistToFiniteLine"),Us=o(function(e,r,n){for(var i,a,s,l,u,h=0,f=0;f=e&&e>=s||i<=e&&e<=s)u=(e-i)/(s-i)*(l-a)+a,u>r&&h++;else continue;return h%2!==0},"pointInsidePolygonPoints"),Zu=o(function(e,r,n,i,a,s,l,u,h){var f=new Array(n.length),d;u[0]!=null?(d=Math.atan(u[1]/u[0]),u[0]<0?d=d+Math.PI/2:d=-d-Math.PI/2):d=u;for(var p=Math.cos(-d),m=Math.sin(-d),g=0;g0){var v=TS(f,-h);y=wS(v)}else y=f;return Us(e,r,y)},"pointInsidePolygon"),qqe=o(function(e,r,n,i,a,s,l,u){for(var h=new Array(n.length*2),f=0;f=0&&v<=1&&b.push(v),x>=0&&x<=1&&b.push(x),b.length===0)return[];var w=b[0]*u[0]+e,C=b[0]*u[1]+r;if(b.length>1){if(b[0]==b[1])return[w,C];var T=b[1]*u[0]+e,E=b[1]*u[1]+r;return[w,C,T,E]}else return[w,C]},"intersectLineCircle"),TP=o(function(e,r,n){return r<=e&&e<=n||n<=e&&e<=r?e:e<=r&&r<=n||n<=r&&r<=e?r:n},"midOfThree"),Ef=o(function(e,r,n,i,a,s,l,u,h){var f=e-a,d=n-e,p=l-a,m=r-s,g=i-r,y=u-s,v=p*m-y*f,x=d*m-g*f,b=y*d-p*g;if(b!==0){var w=v/b,C=x/b,T=.001,E=0-T,A=1+T;return E<=w&&w<=A&&E<=C&&C<=A?[e+w*d,r+w*g]:h?[e+w*d,r+w*g]:[]}else return v===0||x===0?TP(e,n,l)===l?[l,u]:TP(e,n,a)===a?[a,s]:TP(a,l,n)===n?[n,i]:[]:[]},"finiteLinesIntersect"),Xb=o(function(e,r,n,i,a,s,l,u){var h=[],f,d=new Array(n.length),p=!0;s==null&&(p=!1);var m;if(p){for(var g=0;g0){var y=TS(d,-u);m=wS(y)}else m=d}else m=n;for(var v,x,b,w,C=0;C2){for(var g=[f[0],f[1]],y=Math.pow(g[0]-e,2)+Math.pow(g[1]-r,2),v=1;vf&&(f=C)},"set"),get:o(function(w){return h[w]},"get")},p=0;p0?M=O.edgesTo(R)[0]:M=R.edgesTo(O)[0];var B=i(M);R=R.id(),S[R]>S[k]+B&&(S[R]=S[k]+B,_.nodes.indexOf(R)<0?_.push(R):_.updateItem(R),A[R]=0,E[R]=[]),S[R]==S[k]+B&&(A[R]=A[R]+A[k],E[R].push(k))}else for(var F=0;F0;){for(var H=T.pop(),Q=0;Q0&&l.push(n[u]);l.length!==0&&a.push(i.collection(l))}return a},"assign"),lYe=o(function(e,r){for(var n=0;n5&&arguments[5]!==void 0?arguments[5]:hYe,l=i,u,h,f=0;f=2?_b(e,r,n,0,Upe,fYe):_b(e,r,n,0,Vpe)},"euclidean"),squaredEuclidean:o(function(e,r,n){return _b(e,r,n,0,Upe)},"squaredEuclidean"),manhattan:o(function(e,r,n){return _b(e,r,n,0,Vpe)},"manhattan"),max:o(function(e,r,n){return _b(e,r,n,-1/0,dYe)},"max")};Q1["squared-euclidean"]=Q1.squaredEuclidean;Q1.squaredeuclidean=Q1.squaredEuclidean;o(IS,"clusteringDistance");pYe=la({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),oB=o(function(e){return pYe(e)},"setOptions"),kS=o(function(e,r,n,i,a){var s=a!=="kMedoids",l=s?function(d){return n[d]}:function(d){return i[d](n)},u=o(function(p){return i[p](r)},"getQ"),h=n,f=r;return IS(e,i.length,l,u,h,f)},"getDist"),kP=o(function(e,r,n){for(var i=n.length,a=new Array(i),s=new Array(i),l=new Array(r),u=null,h=0;hn)return!1}return!0},"haveMatricesConverged"),yYe=o(function(e,r,n){for(var i=0;il&&(l=r[h][f],u=f);a[u].push(e[h])}for(var d=0;d=a.threshold||a.mode==="dendrogram"&&e.length===1)return!1;var g=r[s],y=r[i[s]],v;a.mode==="dendrogram"?v={left:g,right:y,key:g.key}:v={value:g.value.concat(y.value),key:g.key},e[g.index]=v,e.splice(y.index,1),r[g.key]=v;for(var x=0;xn[y.key][b.key]&&(u=n[y.key][b.key])):a.linkage==="max"?(u=n[g.key][b.key],n[g.key][b.key]0&&i.push(a);return i},"findExemplars"),jpe=o(function(e,r,n){for(var i=[],a=0;al&&(s=h,l=r[a*e+h])}s>0&&i.push(s)}for(var f=0;fh&&(u=f,h=d)}n[a]=s[u]}return i=jpe(e,r,n),i},"assign"),Kpe=o(function(e){for(var r=this.cy(),n=this.nodes(),i=RYe(e),a={},s=0;s=D?(k=D,D=R,L=O):R>k&&(k=R);for(var M=0;M0?1:0;A[_%i.minIterations*l+H]=Q,$+=Q}if($>0&&(_>=i.minIterations-1||_==i.maxIterations-1)){for(var j=0,ie=0;ie1||E>1)&&(l=!0),d[w]=[],b.outgoers().forEach(function(S){S.isEdge()&&d[w].push(S.id())})}else p[w]=[void 0,b.target().id()]}):s.forEach(function(b){var w=b.id();if(b.isNode()){var C=b.degree(!0);C%2&&(u?h?l=!0:h=w:u=w),d[w]=[],b.connectedEdges().forEach(function(T){return d[w].push(T.id())})}else p[w]=[b.source().id(),b.target().id()]});var m={found:!1,trail:void 0};if(l)return m;if(h&&u)if(a){if(f&&h!=f)return m;f=h}else{if(f&&h!=f&&u!=f)return m;f||(f=h)}else f||(f=s[0].id());var g=o(function(w){for(var C=w,T=[w],E,A,S;d[C].length;)E=d[C].shift(),A=p[E][0],S=p[E][1],C!=S?(d[S]=d[S].filter(function(_){return _!=E}),C=S):!a&&C!=A&&(d[A]=d[A].filter(function(_){return _!=E}),C=A),T.unshift(E),T.unshift(C);return T},"walk"),y=[],v=[];for(v=g(f);v.length!=1;)d[v[0]].length==0?(y.unshift(s.getElementById(v.shift())),y.unshift(s.getElementById(v.shift()))):v=g(v.shift()).concat(v);y.unshift(s.getElementById(v.shift()));for(var x in d)if(d[x].length)return m;return m.found=!0,m.trail=this.spawn(y,!0),m},"hierholzer")},J6=o(function(){var e=this,r={},n=0,i=0,a=[],s=[],l={},u=o(function(p,m){for(var g=s.length-1,y=[],v=e.spawn();s[g].x!=p||s[g].y!=m;)y.push(s.pop().edge),g--;y.push(s.pop().edge),y.forEach(function(x){var b=x.connectedNodes().intersection(e);v.merge(x),b.forEach(function(w){var C=w.id(),T=w.connectedEdges().intersection(e);v.merge(w),r[C].cutVertex?v.merge(T.filter(function(E){return E.isLoop()})):v.merge(T)})}),a.push(v)},"buildComponent"),h=o(function d(p,m,g){p===g&&(i+=1),r[m]={id:n,low:n++,cutVertex:!1};var y=e.getElementById(m).connectedEdges().intersection(e);if(y.size()===0)a.push(e.spawn(e.getElementById(m)));else{var v,x,b,w;y.forEach(function(C){v=C.source().id(),x=C.target().id(),b=v===m?x:v,b!==g&&(w=C.id(),l[w]||(l[w]=!0,s.push({x:m,y:b,edge:C})),b in r?r[m].low=Math.min(r[m].low,r[b].id):(d(p,b,m),r[m].low=Math.min(r[m].low,r[b].low),r[m].id<=r[b].low&&(r[m].cutVertex=!0,u(m,b))))})}},"biconnectedSearch");e.forEach(function(d){if(d.isNode()){var p=d.id();p in r||(i=0,h(p,p),r[p].cutVertex=i>1)}});var f=Object.keys(r).filter(function(d){return r[d].cutVertex}).map(function(d){return e.getElementById(d)});return{cut:e.spawn(f),components:a}},"hopcroftTarjanBiconnected"),$Ye={hopcroftTarjanBiconnected:J6,htbc:J6,htb:J6,hopcroftTarjanBiconnectedComponents:J6},eS=o(function(){var e=this,r={},n=0,i=[],a=[],s=e.spawn(e),l=o(function u(h){a.push(h),r[h]={index:n,low:n++,explored:!1};var f=e.getElementById(h).connectedEdges().intersection(e);if(f.forEach(function(y){var v=y.target().id();v!==h&&(v in r||u(v),r[v].explored||(r[h].low=Math.min(r[h].low,r[v].low)))}),r[h].index===r[h].low){for(var d=e.spawn();;){var p=a.pop();if(d.merge(e.getElementById(p)),r[p].low=r[h].index,r[p].explored=!0,p===h)break}var m=d.edgesWith(d),g=d.merge(m);i.push(g),s=s.difference(g)}},"stronglyConnectedSearch");return e.forEach(function(u){if(u.isNode()){var h=u.id();h in r||l(h)}}),{cut:s,components:i}},"tarjanStronglyConnected"),zYe={tarjanStronglyConnected:eS,tsc:eS,tscc:eS,tarjanStronglyConnectedComponents:eS},Sme={};[qb,gqe,yqe,xqe,wqe,kqe,Cqe,Qqe,q1,Y1,FP,uYe,kYe,DYe,PYe,FYe,$Ye,zYe].forEach(function(t){rr(Sme,t)});Cme=0,Ame=1,_me=2,Ju=o(function t(e){if(!(this instanceof t))return new t(e);this.id="Thenable/1.0.7",this.state=Cme,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},typeof e=="function"&&e.call(this,this.fulfill.bind(this),this.reject.bind(this))},"api");Ju.prototype={fulfill:o(function(e){return Qpe(this,Ame,"fulfillValue",e)},"fulfill"),reject:o(function(e){return Qpe(this,_me,"rejectReason",e)},"reject"),then:o(function(e,r){var n=this,i=new Ju;return n.onFulfilled.push(Jpe(e,i,"fulfill")),n.onRejected.push(Jpe(r,i,"reject")),Dme(n),i.proxy},"then")};Qpe=o(function(e,r,n,i){return e.state===Cme&&(e.state=r,e[n]=i,Dme(e)),e},"deliver"),Dme=o(function(e){e.state===Ame?Zpe(e,"onFulfilled",e.fulfillValue):e.state===_me&&Zpe(e,"onRejected",e.rejectReason)},"execute"),Zpe=o(function(e,r,n){if(e[r].length!==0){var i=e[r];e[r]=[];var a=o(function(){for(var l=0;l0},"animatedImpl")},"animated"),clearQueue:o(function(){return o(function(){var r=this,n=r.length!==void 0,i=n?r:[r],a=this._private.cy||this;if(!a.styleEnabled())return this;for(var s=0;s0&&this.spawn(i).updateStyle().emit("class"),r},"classes"),addClass:o(function(e){return this.toggleClass(e,!0)},"addClass"),hasClass:o(function(e){var r=this[0];return r!=null&&r._private.classes.has(e)},"hasClass"),toggleClass:o(function(e,r){En(e)||(e=e.match(/\S+/g)||[]);for(var n=this,i=r===void 0,a=[],s=0,l=n.length;s0&&this.spawn(a).updateStyle().emit("class"),n},"toggleClass"),removeClass:o(function(e){return this.toggleClass(e,!1)},"removeClass"),flashClass:o(function(e,r){var n=this;if(r==null)r=250;else if(r===0)return n;return n.addClass(e),setTimeout(function(){n.removeClass(e)},r),n},"flashClass")};hS.className=hS.classNames=hS.classes;Vr={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:`"(?:\\\\"|[^"])*"|'(?:\\\\'|[^'])*'`,number:Hi,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};Vr.variable="(?:[\\w-.]|(?:\\\\"+Vr.metaChar+"))+";Vr.className="(?:[\\w-]|(?:\\\\"+Vr.metaChar+"))+";Vr.value=Vr.string+"|"+Vr.number;Vr.id=Vr.variable;(function(){var t,e,r;for(t=Vr.comparatorOp.split("|"),r=0;r=0)&&e!=="="&&(Vr.comparatorOp+="|\\!"+e)})();mn=o(function(){return{checks:[]}},"newQuery"),$t={GROUP:0,COLLECTION:1,FILTER:2,DATA_COMPARE:3,DATA_EXIST:4,DATA_BOOL:5,META_COMPARE:6,STATE:7,ID:8,CLASS:9,UNDIRECTED_EDGE:10,DIRECTED_EDGE:11,NODE_SOURCE:12,NODE_TARGET:13,NODE_NEIGHBOR:14,CHILD:15,DESCENDANT:16,PARENT:17,ANCESTOR:18,COMPOUND_SPLIT:19,TRUE:20},zP=[{selector:":selected",matches:o(function(e){return e.selected()},"matches")},{selector:":unselected",matches:o(function(e){return!e.selected()},"matches")},{selector:":selectable",matches:o(function(e){return e.selectable()},"matches")},{selector:":unselectable",matches:o(function(e){return!e.selectable()},"matches")},{selector:":locked",matches:o(function(e){return e.locked()},"matches")},{selector:":unlocked",matches:o(function(e){return!e.locked()},"matches")},{selector:":visible",matches:o(function(e){return e.visible()},"matches")},{selector:":hidden",matches:o(function(e){return!e.visible()},"matches")},{selector:":transparent",matches:o(function(e){return e.transparent()},"matches")},{selector:":grabbed",matches:o(function(e){return e.grabbed()},"matches")},{selector:":free",matches:o(function(e){return!e.grabbed()},"matches")},{selector:":removed",matches:o(function(e){return e.removed()},"matches")},{selector:":inside",matches:o(function(e){return!e.removed()},"matches")},{selector:":grabbable",matches:o(function(e){return e.grabbable()},"matches")},{selector:":ungrabbable",matches:o(function(e){return!e.grabbable()},"matches")},{selector:":animated",matches:o(function(e){return e.animated()},"matches")},{selector:":unanimated",matches:o(function(e){return!e.animated()},"matches")},{selector:":parent",matches:o(function(e){return e.isParent()},"matches")},{selector:":childless",matches:o(function(e){return e.isChildless()},"matches")},{selector:":child",matches:o(function(e){return e.isChild()},"matches")},{selector:":orphan",matches:o(function(e){return e.isOrphan()},"matches")},{selector:":nonorphan",matches:o(function(e){return e.isChild()},"matches")},{selector:":compound",matches:o(function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()},"matches")},{selector:":loop",matches:o(function(e){return e.isLoop()},"matches")},{selector:":simple",matches:o(function(e){return e.isSimple()},"matches")},{selector:":active",matches:o(function(e){return e.active()},"matches")},{selector:":inactive",matches:o(function(e){return!e.active()},"matches")},{selector:":backgrounding",matches:o(function(e){return e.backgrounding()},"matches")},{selector:":nonbackgrounding",matches:o(function(e){return!e.backgrounding()},"matches")}].sort(function(t,e){return hWe(t.selector,e.selector)}),Jje=function(){for(var t={},e,r=0;r0&&f.edgeCount>0)return un("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(f.edgeCount>1)return un("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;f.edgeCount===1&&un("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},"parse"),aKe=o(function(){if(this.toStringCache!=null)return this.toStringCache;for(var e=o(function(f){return f??""},"clean"),r=o(function(f){return Zt(f)?'"'+f+'"':e(f)},"cleanVal"),n=o(function(f){return" "+f+" "},"space"),i=o(function(f,d){var p=f.type,m=f.value;switch(p){case $t.GROUP:{var g=e(m);return g.substring(0,g.length-1)}case $t.DATA_COMPARE:{var y=f.field,v=f.operator;return"["+y+n(e(v))+r(m)+"]"}case $t.DATA_BOOL:{var x=f.operator,b=f.field;return"["+e(x)+b+"]"}case $t.DATA_EXIST:{var w=f.field;return"["+w+"]"}case $t.META_COMPARE:{var C=f.operator,T=f.field;return"[["+T+n(e(C))+r(m)+"]]"}case $t.STATE:return m;case $t.ID:return"#"+m;case $t.CLASS:return"."+m;case $t.PARENT:case $t.CHILD:return a(f.parent,d)+n(">")+a(f.child,d);case $t.ANCESTOR:case $t.DESCENDANT:return a(f.ancestor,d)+" "+a(f.descendant,d);case $t.COMPOUND_SPLIT:{var E=a(f.left,d),A=a(f.subject,d),S=a(f.right,d);return E+(E.length>0?" ":"")+A+S}case $t.TRUE:return""}},"checkToString"),a=o(function(f,d){return f.checks.reduce(function(p,m,g){return p+(d===f&&g===0?"$":"")+i(m,d)},"")},"queryToString"),s="",l=0;l1&&l=0&&(r=r.replace("!",""),d=!0),r.indexOf("@")>=0&&(r=r.replace("@",""),f=!0),(a||l||f)&&(u=!a&&!s?"":""+e,h=""+n),f&&(e=u=u.toLowerCase(),n=h=h.toLowerCase()),r){case"*=":i=u.indexOf(h)>=0;break;case"$=":i=u.indexOf(h,u.length-h.length)>=0;break;case"^=":i=u.indexOf(h)===0;break;case"=":i=e===n;break;case">":p=!0,i=e>n;break;case">=":p=!0,i=e>=n;break;case"<":p=!0,i=e1&&arguments[1]!==void 0?arguments[1]:!0;return fB(this,t,e,Fme)};o($me,"addParent");Z1.forEachUp=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return fB(this,t,e,$me)};o(dKe,"addParentAndChildren");Z1.forEachUpAndDown=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return fB(this,t,e,dKe)};Z1.ancestors=Z1.parents;Kb=zme={data:cn.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:cn.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:cn.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:cn.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:cn.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:cn.removeData({field:"rscratch",triggerEvent:!1}),id:o(function(){var e=this[0];if(e)return e._private.data.id},"id")};Kb.attr=Kb.data;Kb.removeAttr=Kb.removeData;pKe=zme,FS={};o(SP,"defineDegreeFunction");rr(FS,{degree:SP(function(t,e){return e.source().same(e.target())?2:1}),indegree:SP(function(t,e){return e.target().same(t)?1:0}),outdegree:SP(function(t,e){return e.source().same(t)?1:0})});o(F1,"defineDegreeBoundsFunction");rr(FS,{minDegree:F1("degree",function(t,e){return te}),minIndegree:F1("indegree",function(t,e){return te}),minOutdegree:F1("outdegree",function(t,e){return te})});rr(FS,{totalDegree:o(function(e){for(var r=0,n=this.nodes(),i=0;i0,p=d;d&&(f=f[0]);var m=p?f.position():{x:0,y:0};r!==void 0?h.position(e,r+m[e]):a!==void 0&&h.position({x:a.x+m.x,y:a.y+m.y})}else{var g=n.position(),y=l?n.parent():null,v=y&&y.length>0,x=v;v&&(y=y[0]);var b=x?y.position():{x:0,y:0};return a={x:g.x-b.x,y:g.y-b.y},e===void 0?a:a[e]}else if(!s)return;return this},"relativePosition")};Vl.modelPosition=Vl.point=Vl.position;Vl.modelPositions=Vl.points=Vl.positions;Vl.renderedPoint=Vl.renderedPosition;Vl.relativePoint=Vl.relativePosition;mKe=Gme;X1=Of={};Of.renderedBoundingBox=function(t){var e=this.boundingBox(t),r=this.cy(),n=r.zoom(),i=r.pan(),a=e.x1*n+i.x,s=e.x2*n+i.x,l=e.y1*n+i.y,u=e.y2*n+i.y;return{x1:a,x2:s,y1:l,y2:u,w:s-a,h:u-l}};Of.dirtyCompoundBoundsCache=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();return!e.styleEnabled()||!e.hasCompoundNodes()?this:(this.forEachUp(function(r){if(r.isParent()){var n=r._private;n.compoundBoundsClean=!1,n.bbCache=null,t||r.emitAndNotify("bounds")}}),this)};Of.updateCompoundBounds=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();if(!e.styleEnabled()||!e.hasCompoundNodes())return this;if(!t&&e.batching())return this;function r(s){if(!s.isParent())return;var l=s._private,u=s.children(),h=s.pstyle("compound-sizing-wrt-labels").value==="include",f={width:{val:s.pstyle("min-width").pfValue,left:s.pstyle("min-width-bias-left"),right:s.pstyle("min-width-bias-right")},height:{val:s.pstyle("min-height").pfValue,top:s.pstyle("min-height-bias-top"),bottom:s.pstyle("min-height-bias-bottom")}},d=u.boundingBox({includeLabels:h,includeOverlays:!1,useCache:!1}),p=l.position;(d.w===0||d.h===0)&&(d={w:s.pstyle("width").pfValue,h:s.pstyle("height").pfValue},d.x1=p.x-d.w/2,d.x2=p.x+d.w/2,d.y1=p.y-d.h/2,d.y2=p.y+d.h/2);function m(_,I,D){var k=0,L=0,R=I+D;return _>0&&R>0&&(k=I/R*_,L=D/R*_),{biasDiff:k,biasComplementDiff:L}}o(m,"computeBiasValues");function g(_,I,D,k){if(D.units==="%")switch(k){case"width":return _>0?D.pfValue*_:0;case"height":return I>0?D.pfValue*I:0;case"average":return _>0&&I>0?D.pfValue*(_+I)/2:0;case"min":return _>0&&I>0?_>I?D.pfValue*I:D.pfValue*_:0;case"max":return _>0&&I>0?_>I?D.pfValue*_:D.pfValue*I:0;default:return 0}else return D.units==="px"?D.pfValue:0}o(g,"computePaddingValues");var y=f.width.left.value;f.width.left.units==="px"&&f.width.val>0&&(y=y*100/f.width.val);var v=f.width.right.value;f.width.right.units==="px"&&f.width.val>0&&(v=v*100/f.width.val);var x=f.height.top.value;f.height.top.units==="px"&&f.height.val>0&&(x=x*100/f.height.val);var b=f.height.bottom.value;f.height.bottom.units==="px"&&f.height.val>0&&(b=b*100/f.height.val);var w=m(f.width.val-d.w,y,v),C=w.biasDiff,T=w.biasComplementDiff,E=m(f.height.val-d.h,x,b),A=E.biasDiff,S=E.biasComplementDiff;l.autoPadding=g(d.w,d.h,s.pstyle("padding"),s.pstyle("padding-relative-to").value),l.autoWidth=Math.max(d.w,f.width.val),p.x=(-C+d.x1+d.x2+T)/2,l.autoHeight=Math.max(d.h,f.height.val),p.y=(-A+d.y1+d.y2+S)/2}o(r,"update");for(var n=0;ne.x2?i:e.x2,e.y1=ne.y2?a:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},"updateBounds"),Pp=o(function(e,r){return r==null?e:zl(e,r.x1,r.y1,r.x2,r.y2)},"updateBoundsFromBox"),Db=o(function(e,r,n){return Gl(e,r,n)},"prefixedProperty"),tS=o(function(e,r,n){if(!r.cy().headless()){var i=r._private,a=i.rstyle,s=a.arrowWidth/2,l=r.pstyle(n+"-arrow-shape").value,u,h;if(l!=="none"){n==="source"?(u=a.srcX,h=a.srcY):n==="target"?(u=a.tgtX,h=a.tgtY):(u=a.midX,h=a.midY);var f=i.arrowBounds=i.arrowBounds||{},d=f[n]=f[n]||{};d.x1=u-s,d.y1=h-s,d.x2=u+s,d.y2=h+s,d.w=d.x2-d.x1,d.h=d.y2-d.y1,cS(d,1),zl(e,d.x1,d.y1,d.x2,d.y2)}}},"updateBoundsFromArrow"),CP=o(function(e,r,n){if(!r.cy().headless()){var i;n?i=n+"-":i="";var a=r._private,s=a.rstyle,l=r.pstyle(i+"label").strValue;if(l){var u=r.pstyle("text-halign"),h=r.pstyle("text-valign"),f=Db(s,"labelWidth",n),d=Db(s,"labelHeight",n),p=Db(s,"labelX",n),m=Db(s,"labelY",n),g=r.pstyle(i+"text-margin-x").pfValue,y=r.pstyle(i+"text-margin-y").pfValue,v=r.isEdge(),x=r.pstyle(i+"text-rotation"),b=r.pstyle("text-outline-width").pfValue,w=r.pstyle("text-border-width").pfValue,C=w/2,T=r.pstyle("text-background-padding").pfValue,E=2,A=d,S=f,_=S/2,I=A/2,D,k,L,R;if(v)D=p-_,k=p+_,L=m-I,R=m+I;else{switch(u.value){case"left":D=p-S,k=p;break;case"center":D=p-_,k=p+_;break;case"right":D=p,k=p+S;break}switch(h.value){case"top":L=m-A,R=m;break;case"center":L=m-I,R=m+I;break;case"bottom":L=m,R=m+A;break}}var O=g-Math.max(b,C)-T-E,M=g+Math.max(b,C)+T+E,B=y-Math.max(b,C)-T-E,F=y+Math.max(b,C)+T+E;D+=O,k+=M,L+=B,R+=F;var P=n||"main",z=a.labelBounds,$=z[P]=z[P]||{};$.x1=D,$.y1=L,$.x2=k,$.y2=R,$.w=k-D,$.h=R-L,$.leftPad=O,$.rightPad=M,$.topPad=B,$.botPad=F;var H=v&&x.strValue==="autorotate",Q=x.pfValue!=null&&x.pfValue!==0;if(H||Q){var j=H?Db(a.rstyle,"labelAngle",n):x.pfValue,ie=Math.cos(j),ne=Math.sin(j),le=(D+k)/2,he=(L+R)/2;if(!v){switch(u.value){case"left":le=k;break;case"right":le=D;break}switch(h.value){case"top":he=R;break;case"bottom":he=L;break}}var K=o(function(ce,ae){return ce=ce-le,ae=ae-he,{x:ce*ie-ae*ne+le,y:ce*ne+ae*ie+he}},"rotate"),X=K(D,L),te=K(D,R),J=K(k,L),se=K(k,R);D=Math.min(X.x,te.x,J.x,se.x),k=Math.max(X.x,te.x,J.x,se.x),L=Math.min(X.y,te.y,J.y,se.y),R=Math.max(X.y,te.y,J.y,se.y)}var ue=P+"Rot",Z=z[ue]=z[ue]||{};Z.x1=D,Z.y1=L,Z.x2=k,Z.y2=R,Z.w=k-D,Z.h=R-L,zl(e,D,L,k,R),zl(a.labelBounds.all,D,L,k,R)}return e}},"updateBoundsFromLabel"),gKe=o(function(e,r){if(!r.cy().headless()){var n=r.pstyle("outline-opacity").value,i=r.pstyle("outline-width").value;if(n>0&&i>0){var a=r.pstyle("outline-offset").value,s=r.pstyle("shape").value,l=i+a,u=(e.w+l*2)/e.w,h=(e.h+l*2)/e.h,f=0,d=0;["diamond","pentagon","round-triangle"].includes(s)?(u=(e.w+l*2.4)/e.w,d=-l/3.6):["concave-hexagon","rhomboid","right-rhomboid"].includes(s)?u=(e.w+l*2.4)/e.w:s==="star"?(u=(e.w+l*2.8)/e.w,h=(e.h+l*2.6)/e.h,d=-l/3.8):s==="triangle"?(u=(e.w+l*2.8)/e.w,h=(e.h+l*2.4)/e.h,d=-l/1.4):s==="vee"&&(u=(e.w+l*4.4)/e.w,h=(e.h+l*3.8)/e.h,d=-l*.5);var p=e.h*h-e.h,m=e.w*u-e.w;if(uS(e,[Math.ceil(p/2),Math.ceil(m/2)]),f!=0||d!==0){var g=Bqe(e,f,d);gme(e,g)}}}},"updateBoundsFromOutline"),yKe=o(function(e,r){var n=e._private.cy,i=n.styleEnabled(),a=n.headless(),s=Hs(),l=e._private,u=e.isNode(),h=e.isEdge(),f,d,p,m,g,y,v=l.rstyle,x=u&&i?e.pstyle("bounds-expansion").pfValue:[0],b=o(function(Se){return Se.pstyle("display").value!=="none"},"isDisplayed"),w=!i||b(e)&&(!h||b(e.source())&&b(e.target()));if(w){var C=0,T=0;i&&r.includeOverlays&&(C=e.pstyle("overlay-opacity").value,C!==0&&(T=e.pstyle("overlay-padding").value));var E=0,A=0;i&&r.includeUnderlays&&(E=e.pstyle("underlay-opacity").value,E!==0&&(A=e.pstyle("underlay-padding").value));var S=Math.max(T,A),_=0,I=0;if(i&&(_=e.pstyle("width").pfValue,I=_/2),u&&r.includeNodes){var D=e.position();g=D.x,y=D.y;var k=e.outerWidth(),L=k/2,R=e.outerHeight(),O=R/2;f=g-L,d=g+L,p=y-O,m=y+O,zl(s,f,p,d,m),i&&r.includeOutlines&&gKe(s,e)}else if(h&&r.includeEdges)if(i&&!a){var M=e.pstyle("curve-style").strValue;if(f=Math.min(v.srcX,v.midX,v.tgtX),d=Math.max(v.srcX,v.midX,v.tgtX),p=Math.min(v.srcY,v.midY,v.tgtY),m=Math.max(v.srcY,v.midY,v.tgtY),f-=I,d+=I,p-=I,m+=I,zl(s,f,p,d,m),M==="haystack"){var B=v.haystackPts;if(B&&B.length===2){if(f=B[0].x,p=B[0].y,d=B[1].x,m=B[1].y,f>d){var F=f;f=d,d=F}if(p>m){var P=p;p=m,m=P}zl(s,f-I,p-I,d+I,m+I)}}else if(M==="bezier"||M==="unbundled-bezier"||M.endsWith("segments")||M.endsWith("taxi")){var z;switch(M){case"bezier":case"unbundled-bezier":z=v.bezierPts;break;case"segments":case"taxi":case"round-segments":case"round-taxi":z=v.linePts;break}if(z!=null)for(var $=0;$d){var le=f;f=d,d=le}if(p>m){var he=p;p=m,m=he}f-=I,d+=I,p-=I,m+=I,zl(s,f,p,d,m)}if(i&&r.includeEdges&&h&&(tS(s,e,"mid-source"),tS(s,e,"mid-target"),tS(s,e,"source"),tS(s,e,"target")),i){var K=e.pstyle("ghost").value==="yes";if(K){var X=e.pstyle("ghost-offset-x").pfValue,te=e.pstyle("ghost-offset-y").pfValue;zl(s,s.x1+X,s.y1+te,s.x2+X,s.y2+te)}}var J=l.bodyBounds=l.bodyBounds||{};Fpe(J,s),uS(J,x),cS(J,1),i&&(f=s.x1,d=s.x2,p=s.y1,m=s.y2,zl(s,f-S,p-S,d+S,m+S));var se=l.overlayBounds=l.overlayBounds||{};Fpe(se,s),uS(se,x),cS(se,1);var ue=l.labelBounds=l.labelBounds||{};ue.all!=null?Pqe(ue.all):ue.all=Hs(),i&&r.includeLabels&&(r.includeMainLabels&&CP(s,e,null),h&&(r.includeSourceLabels&&CP(s,e,"source"),r.includeTargetLabels&&CP(s,e,"target")))}return s.x1=el(s.x1),s.y1=el(s.y1),s.x2=el(s.x2),s.y2=el(s.y2),s.w=el(s.x2-s.x1),s.h=el(s.y2-s.y1),s.w>0&&s.h>0&&w&&(uS(s,x),cS(s,1)),s},"boundingBoxImpl"),Ume=o(function(e){var r=0,n=o(function(s){return(s?1:0)<=0;l--)s(l);return this};Nf.removeAllListeners=function(){return this.removeListener("*")};Nf.emit=Nf.trigger=function(t,e,r){var n=this.listeners,i=n.length;return this.emitting++,En(e)||(e=[e]),MKe(this,function(a,s){r!=null&&(n=[{event:s.event,type:s.type,namespace:s.namespace,callback:r}],i=n.length);for(var l=o(function(f){var d=n[f];if(d.type===s.type&&(!d.namespace||d.namespace===s.namespace||d.namespace===RKe)&&a.eventMatches(a.context,d,s)){var p=[s];e!=null&&uqe(p,e),a.beforeEmit(a.context,d,s),d.conf&&d.conf.one&&(a.listeners=a.listeners.filter(function(y){return y!==d}));var m=a.callbackContext(a.context,d,s),g=d.callback.apply(m,p);a.afterEmit(a.context,d,s),g===!1&&(s.stopPropagation(),s.preventDefault())}},"_loop2"),u=0;u1&&!s){var l=this.length-1,u=this[l],h=u._private.data.id;this[l]=void 0,this[e]=u,a.set(h,{ele:u,index:e})}return this.length--,this},"unmergeAt"),unmergeOne:o(function(e){e=e[0];var r=this._private,n=e._private.data.id,i=r.map,a=i.get(n);if(!a)return this;var s=a.index;return this.unmergeAt(s),this},"unmergeOne"),unmerge:o(function(e){var r=this._private.cy;if(!e)return this;if(e&&Zt(e)){var n=e;e=r.mutableElements().filter(n)}for(var i=0;i=0;r--){var n=this[r];e(n)&&this.unmergeAt(r)}return this},"unmergeBy"),map:o(function(e,r){for(var n=[],i=this,a=0;an&&(n=u,i=l)}return{value:n,ele:i}},"max"),min:o(function(e,r){for(var n=1/0,i,a=this,s=0;s=0&&a"u"?"undefined":Wi(Symbol))!=e&&Wi(Symbol.iterator)!=e;r&&(ES[Symbol.iterator]=function(){var n=this,i={value:void 0,done:!1},a=0,s=this.length;return X0e({next:o(function(){return a1&&arguments[1]!==void 0?arguments[1]:!0,n=this[0],i=n.cy();if(i.styleEnabled()&&n){n._private.styleDirty&&(n._private.styleDirty=!1,i.style().apply(n));var a=n._private.style[e];return a??(r?i.style().getDefaultProperty(e):null)}},"parsedStyle"),numericStyle:o(function(e){var r=this[0];if(r.cy().styleEnabled()&&r){var n=r.pstyle(e);return n.pfValue!==void 0?n.pfValue:n.value}},"numericStyle"),numericStyleUnits:o(function(e){var r=this[0];if(r.cy().styleEnabled()&&r)return r.pstyle(e).units},"numericStyleUnits"),renderedStyle:o(function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=this[0];if(n)return r.style().getRenderedStyle(n,e)},"renderedStyle"),style:o(function(e,r){var n=this.cy();if(!n.styleEnabled())return this;var i=!1,a=n.style();if(Ur(e)){var s=e;a.applyBypass(this,s,i),this.emitAndNotify("style")}else if(Zt(e))if(r===void 0){var l=this[0];return l?a.getStylePropertyValue(l,e):void 0}else a.applyBypass(this,e,r,i),this.emitAndNotify("style");else if(e===void 0){var u=this[0];return u?a.getRawStyle(u):void 0}return this},"style"),removeStyle:o(function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=!1,i=r.style(),a=this;if(e===void 0)for(var s=0;s0&&e.push(f[0]),e.push(l[0])}return this.spawn(e,!0).filter(t)},"neighborhood"),closedNeighborhood:o(function(e){return this.neighborhood().add(this).filter(e)},"closedNeighborhood"),openNeighborhood:o(function(e){return this.neighborhood(e)},"openNeighborhood")});$a.neighbourhood=$a.neighborhood;$a.closedNeighbourhood=$a.closedNeighborhood;$a.openNeighbourhood=$a.openNeighborhood;rr($a,{source:tl(o(function(e){var r=this[0],n;return r&&(n=r._private.source||r.cy().collection()),n&&e?n.filter(e):n},"sourceImpl"),"source"),target:tl(o(function(e){var r=this[0],n;return r&&(n=r._private.target||r.cy().collection()),n&&e?n.filter(e):n},"targetImpl"),"target"),sources:g0e({attr:"source"}),targets:g0e({attr:"target"})});o(g0e,"defineSourceFunction");rr($a,{edgesWith:tl(y0e(),"edgesWith"),edgesTo:tl(y0e({thisIsSrc:!0}),"edgesTo")});o(y0e,"defineEdgesWithFunction");rr($a,{connectedEdges:tl(function(t){for(var e=[],r=this,n=0;n0);return s},"components"),component:o(function(){var e=this[0];return e.cy().mutableElements().components(e)[0]},"component")});$a.componentsOf=$a.components;ka=o(function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(e===void 0){ai("A collection must have a reference to the core");return}var a=new Xc,s=!1;if(!r)r=[];else if(r.length>0&&Ur(r[0])&&!t4(r[0])){s=!0;for(var l=[],u=new J1,h=0,f=r.length;h0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=r.cy(),i=n._private,a=[],s=[],l,u=0,h=r.length;u0){for(var P=l.length===r.length?r:new ka(n,l),z=0;z0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=[],i={},a=r._private.cy;function s(R){for(var O=R._private.edges,M=0;M0&&(t?D.emitAndNotify("remove"):e&&D.emit("remove"));for(var k=0;kf&&Math.abs(g.v)>f;);return p?function(y){return u[y*(u.length-1)|0]}:h},"springRK4Factory")}(),Nn=o(function(e,r,n,i){var a=UKe(e,r,n,i);return function(s,l,u){return s+(l-s)*a(u)}},"cubicBezier"),dS={linear:o(function(e,r,n){return e+(r-e)*n},"linear"),ease:Nn(.25,.1,.25,1),"ease-in":Nn(.42,0,1,1),"ease-out":Nn(0,0,.58,1),"ease-in-out":Nn(.42,0,.58,1),"ease-in-sine":Nn(.47,0,.745,.715),"ease-out-sine":Nn(.39,.575,.565,1),"ease-in-out-sine":Nn(.445,.05,.55,.95),"ease-in-quad":Nn(.55,.085,.68,.53),"ease-out-quad":Nn(.25,.46,.45,.94),"ease-in-out-quad":Nn(.455,.03,.515,.955),"ease-in-cubic":Nn(.55,.055,.675,.19),"ease-out-cubic":Nn(.215,.61,.355,1),"ease-in-out-cubic":Nn(.645,.045,.355,1),"ease-in-quart":Nn(.895,.03,.685,.22),"ease-out-quart":Nn(.165,.84,.44,1),"ease-in-out-quart":Nn(.77,0,.175,1),"ease-in-quint":Nn(.755,.05,.855,.06),"ease-out-quint":Nn(.23,1,.32,1),"ease-in-out-quint":Nn(.86,0,.07,1),"ease-in-expo":Nn(.95,.05,.795,.035),"ease-out-expo":Nn(.19,1,.22,1),"ease-in-out-expo":Nn(1,0,0,1),"ease-in-circ":Nn(.6,.04,.98,.335),"ease-out-circ":Nn(.075,.82,.165,1),"ease-in-out-circ":Nn(.785,.135,.15,.86),spring:o(function(e,r,n){if(n===0)return dS.linear;var i=HKe(e,r,n);return function(a,s,l){return a+(s-a)*i(l)}},"spring"),"cubic-bezier":Nn};o(x0e,"getEasedValue");o(b0e,"getValue");o($1,"ease");o(WKe,"step$1");o(Rb,"valid");o(qKe,"startAnimation");o(w0e,"stepAll");YKe={animate:cn.animate(),animation:cn.animation(),animated:cn.animated(),clearQueue:cn.clearQueue(),delay:cn.delay(),delayAnimation:cn.delayAnimation(),stop:cn.stop(),addToAnimationPool:o(function(e){var r=this;r.styleEnabled()&&r._private.aniEles.merge(e)},"addToAnimationPool"),stopAnimationLoop:o(function(){this._private.animationsRunning=!1},"stopAnimationLoop"),startAnimationLoop:o(function(){var e=this;if(e._private.animationsRunning=!0,!e.styleEnabled())return;function r(){e._private.animationsRunning&&xS(o(function(a){w0e(a,e),r()},"animationStep"))}o(r,"headlessStep");var n=e.renderer();n&&n.beforeRender?n.beforeRender(o(function(a,s){w0e(s,e)},"rendererAnimationStep"),n.beforeRenderPriorities.animations):r()},"startAnimationLoop")},XKe={qualifierCompare:o(function(e,r){return e==null||r==null?e==null&&r==null:e.sameText(r)},"qualifierCompare"),eventMatches:o(function(e,r,n){var i=r.qualifier;return i!=null?e!==n.target&&t4(n.target)&&i.matches(n.target):!0},"eventMatches"),addEventFields:o(function(e,r){r.cy=e,r.target=e},"addEventFields"),callbackContext:o(function(e,r,n){return r.qualifier!=null?n.target:e},"callbackContext")},iS=o(function(e){return Zt(e)?new Lf(e):e},"argSelector"),ege={createEmitter:o(function(){var e=this._private;return e.emitter||(e.emitter=new $S(XKe,this)),this},"createEmitter"),emitter:o(function(){return this._private.emitter},"emitter"),on:o(function(e,r,n){return this.emitter().on(e,iS(r),n),this},"on"),removeListener:o(function(e,r,n){return this.emitter().removeListener(e,iS(r),n),this},"removeListener"),removeAllListeners:o(function(){return this.emitter().removeAllListeners(),this},"removeAllListeners"),one:o(function(e,r,n){return this.emitter().one(e,iS(r),n),this},"one"),once:o(function(e,r,n){return this.emitter().one(e,iS(r),n),this},"once"),emit:o(function(e,r){return this.emitter().emit(e,r),this},"emit"),emitAndNotify:o(function(e,r){return this.emit(e),this.notify(e,r),this},"emitAndNotify")};cn.eventAliasesOn(ege);VP={png:o(function(e){var r=this._private.renderer;return e=e||{},r.png(e)},"png"),jpg:o(function(e){var r=this._private.renderer;return e=e||{},e.bg=e.bg||"#fff",r.jpg(e)},"jpg")};VP.jpeg=VP.jpg;pS={layout:o(function(e){var r=this;if(e==null){ai("Layout options must be specified to make a layout");return}if(e.name==null){ai("A `name` must be specified to make a layout");return}var n=e.name,i=r.extension("layout",n);if(i==null){ai("No such layout `"+n+"` found. Did you forget to import it and `cytoscape.use()` it?");return}var a;Zt(e.eles)?a=r.$(e.eles):a=e.eles!=null?e.eles:r.$();var s=new i(rr({},e,{cy:r,eles:a}));return s},"layout")};pS.createLayout=pS.makeLayout=pS.layout;jKe={notify:o(function(e,r){var n=this._private;if(this.batching()){n.batchNotifications=n.batchNotifications||{};var i=n.batchNotifications[e]=n.batchNotifications[e]||this.collection();r!=null&&i.merge(r);return}if(n.notificationsEnabled){var a=this.renderer();this.destroyed()||!a||a.notify(e,r)}},"notify"),notifications:o(function(e){var r=this._private;return e===void 0?r.notificationsEnabled:(r.notificationsEnabled=!!e,this)},"notifications"),noNotifications:o(function(e){this.notifications(!1),e(),this.notifications(!0)},"noNotifications"),batching:o(function(){return this._private.batchCount>0},"batching"),startBatch:o(function(){var e=this._private;return e.batchCount==null&&(e.batchCount=0),e.batchCount===0&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},"startBatch"),endBatch:o(function(){var e=this._private;if(e.batchCount===0)return this;if(e.batchCount--,e.batchCount===0){e.batchStyleEles.updateStyle();var r=this.renderer();Object.keys(e.batchNotifications).forEach(function(n){var i=e.batchNotifications[n];i.empty()?r.notify(n):r.notify(n,i)})}return this},"endBatch"),batch:o(function(e){return this.startBatch(),e(),this.endBatch(),this},"batch"),batchData:o(function(e){var r=this;return this.batch(function(){for(var n=Object.keys(e),i=0;i0;)r.removeChild(r.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach(function(n){var i=n._private;i.rscratch={},i.rstyle={},i.animation.current=[],i.animation.queue=[]})},"destroyRenderer"),onRender:o(function(e){return this.on("render",e)},"onRender"),offRender:o(function(e){return this.off("render",e)},"offRender")};UP.invalidateDimensions=UP.resize;mS={collection:o(function(e,r){return Zt(e)?this.$(e):go(e)?e.collection():En(e)?(r||(r={}),new ka(this,e,r.unique,r.removed)):new ka(this)},"collection"),nodes:o(function(e){var r=this.$(function(n){return n.isNode()});return e?r.filter(e):r},"nodes"),edges:o(function(e){var r=this.$(function(n){return n.isEdge()});return e?r.filter(e):r},"edges"),$:o(function(e){var r=this._private.elements;return e?r.filter(e):r.spawnSelf()},"$"),mutableElements:o(function(){return this._private.elements},"mutableElements")};mS.elements=mS.filter=mS.$;Ga={},$b="t",QKe="f";Ga.apply=function(t){for(var e=this,r=e._private,n=r.cy,i=n.collection(),a=0;a0;if(p||d&&m){var g=void 0;p&&m||p?g=h.properties:m&&(g=h.mappedProperties);for(var y=0;y1&&(C=1),l.color){var E=n.valueMin[0],A=n.valueMax[0],S=n.valueMin[1],_=n.valueMax[1],I=n.valueMin[2],D=n.valueMax[2],k=n.valueMin[3]==null?1:n.valueMin[3],L=n.valueMax[3]==null?1:n.valueMax[3],R=[Math.round(E+(A-E)*C),Math.round(S+(_-S)*C),Math.round(I+(D-I)*C),Math.round(k+(L-k)*C)];a={bypass:n.bypass,name:n.name,value:R,strValue:"rgb("+R[0]+", "+R[1]+", "+R[2]+")"}}else if(l.number){var O=n.valueMin+(n.valueMax-n.valueMin)*C;a=this.parse(n.name,O,n.bypass,p)}else return!1;if(!a)return y(),!1;a.mapping=n,n=a;break}case s.data:{for(var M=n.field.split("."),B=d.data,F=0;F0&&a>0){for(var l={},u=!1,h=0;h0?t.delayAnimation(s).play().promise().then(w):w()}).then(function(){return t.animation({style:l,duration:a,easing:t.pstyle("transition-timing-function").value,queue:!1}).play().promise()}).then(function(){r.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1})}else n.transitioning&&(this.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1)};Ga.checkTrigger=function(t,e,r,n,i,a){var s=this.properties[e],l=i(s);l!=null&&l(r,n)&&a(s)};Ga.checkZOrderTrigger=function(t,e,r,n){var i=this;this.checkTrigger(t,e,r,n,function(a){return a.triggersZOrder},function(){i._private.cy.notify("zorder",t)})};Ga.checkBoundsTrigger=function(t,e,r,n){this.checkTrigger(t,e,r,n,function(i){return i.triggersBounds},function(i){t.dirtyCompoundBoundsCache(),t.dirtyBoundingBoxCache(),i.triggersBoundsOfParallelBeziers&&e==="curve-style"&&(r==="bezier"||n==="bezier")&&t.parallelEdges().forEach(function(a){a.dirtyBoundingBoxCache()}),i.triggersBoundsOfConnectedEdges&&e==="display"&&(r==="none"||n==="none")&&t.connectedEdges().forEach(function(a){a.dirtyBoundingBoxCache()})})};Ga.checkTriggers=function(t,e,r,n){t.dirtyStyleCache(),this.checkZOrderTrigger(t,e,r,n),this.checkBoundsTrigger(t,e,r,n)};s4={};s4.applyBypass=function(t,e,r,n){var i=this,a=[],s=!0;if(e==="*"||e==="**"){if(r!==void 0)for(var l=0;li.length?n=n.substr(i.length):n=""}o(l,"removeSelAndBlockFromRemaining");function u(){a.length>s.length?a=a.substr(s.length):a=""}for(o(u,"removePropAndValFromRem");;){var h=n.match(/^\s*$/);if(h)break;var f=n.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!f){un("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+n);break}i=f[0];var d=f[1];if(d!=="core"){var p=new Lf(d);if(p.invalid){un("Skipping parsing of block: Invalid selector found in string stylesheet: "+d),l();continue}}var m=f[2],g=!1;a=m;for(var y=[];;){var v=a.match(/^\s*$/);if(v)break;var x=a.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!x){un("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+m),g=!0;break}s=x[0];var b=x[1],w=x[2],C=e.properties[b];if(!C){un("Skipping property: Invalid property name in: "+s),u();continue}var T=r.parse(b,w);if(!T){un("Skipping property: Invalid property definition in: "+s),u();continue}y.push({name:b,val:w}),u()}if(g){l();break}r.selector(d);for(var E=0;E=7&&e[0]==="d"&&(f=new RegExp(l.data.regex).exec(e))){if(r)return!1;var p=l.data;return{name:t,value:f,strValue:""+e,mapped:p,field:f[1],bypass:r}}else if(e.length>=10&&e[0]==="m"&&(d=new RegExp(l.mapData.regex).exec(e))){if(r||h.multiple)return!1;var m=l.mapData;if(!(h.color||h.number))return!1;var g=this.parse(t,d[4]);if(!g||g.mapped)return!1;var y=this.parse(t,d[5]);if(!y||y.mapped)return!1;if(g.pfValue===y.pfValue||g.strValue===y.strValue)return un("`"+t+": "+e+"` is not a valid mapper because the output range is zero; converting to `"+t+": "+g.strValue+"`"),this.parse(t,g.strValue);if(h.color){var v=g.value,x=y.value,b=v[0]===x[0]&&v[1]===x[1]&&v[2]===x[2]&&(v[3]===x[3]||(v[3]==null||v[3]===1)&&(x[3]==null||x[3]===1));if(b)return!1}return{name:t,value:d,strValue:""+e,mapped:m,field:d[1],fieldMin:parseFloat(d[2]),fieldMax:parseFloat(d[3]),valueMin:g.value,valueMax:y.value,bypass:r}}}if(h.multiple&&n!=="multiple"){var w;if(u?w=e.split(/\s+/):En(e)?w=e:w=[e],h.evenMultiple&&w.length%2!==0)return null;for(var C=[],T=[],E=[],A="",S=!1,_=0;_0?" ":"")+I.strValue}return h.validate&&!h.validate(C,T)?null:h.singleEnum&&S?C.length===1&&Zt(C[0])?{name:t,value:C[0],strValue:C[0],bypass:r}:null:{name:t,value:C,pfValue:E,strValue:A,bypass:r,units:T}}var D=o(function(){for(var K=0;Kh.max||h.strictMax&&e===h.max))return null;var M={name:t,value:e,strValue:""+e+(k||""),units:k,bypass:r};return h.unitless||k!=="px"&&k!=="em"?M.pfValue=e:M.pfValue=k==="px"||!k?e:this.getEmSizeInPixels()*e,(k==="ms"||k==="s")&&(M.pfValue=k==="ms"?e:1e3*e),(k==="deg"||k==="rad")&&(M.pfValue=k==="rad"?e:Nqe(e)),k==="%"&&(M.pfValue=e/100),M}else if(h.propList){var B=[],F=""+e;if(F!=="none"){for(var P=F.split(/\s*,\s*|\s+/),z=0;z0&&l>0&&!isNaN(n.w)&&!isNaN(n.h)&&n.w>0&&n.h>0){u=Math.min((s-2*r)/n.w,(l-2*r)/n.h),u=u>this._private.maxZoom?this._private.maxZoom:u,u=u=n.minZoom&&(n.maxZoom=r),this},"zoomRange"),minZoom:o(function(e){return e===void 0?this._private.minZoom:this.zoomRange({min:e})},"minZoom"),maxZoom:o(function(e){return e===void 0?this._private.maxZoom:this.zoomRange({max:e})},"maxZoom"),getZoomedViewport:o(function(e){var r=this._private,n=r.pan,i=r.zoom,a,s,l=!1;if(r.zoomingEnabled||(l=!0),Ct(e)?s=e:Ur(e)&&(s=e.level,e.position!=null?a=MS(e.position,i,n):e.renderedPosition!=null&&(a=e.renderedPosition),a!=null&&!r.panningEnabled&&(l=!0)),s=s>r.maxZoom?r.maxZoom:s,s=sr.maxZoom||!r.zoomingEnabled?s=!0:(r.zoom=u,a.push("zoom"))}if(i&&(!s||!e.cancelOnFailedZoom)&&r.panningEnabled){var h=e.pan;Ct(h.x)&&(r.pan.x=h.x,l=!1),Ct(h.y)&&(r.pan.y=h.y,l=!1),l||a.push("pan")}return a.length>0&&(a.push("viewport"),this.emit(a.join(" ")),this.notify("viewport")),this},"viewport"),center:o(function(e){var r=this.getCenterPan(e);return r&&(this._private.pan=r,this.emit("pan viewport"),this.notify("viewport")),this},"center"),getCenterPan:o(function(e,r){if(this._private.panningEnabled){if(Zt(e)){var n=e;e=this.mutableElements().filter(n)}else go(e)||(e=this.mutableElements());if(e.length!==0){var i=e.boundingBox(),a=this.width(),s=this.height();r=r===void 0?this._private.zoom:r;var l={x:(a-r*(i.x1+i.x2))/2,y:(s-r*(i.y1+i.y2))/2};return l}}},"getCenterPan"),reset:o(function(){return!this._private.panningEnabled||!this._private.zoomingEnabled?this:(this.viewport({pan:{x:0,y:0},zoom:1}),this)},"reset"),invalidateSize:o(function(){this._private.sizeCache=null},"invalidateSize"),size:o(function(){var e=this._private,r=e.container,n=this;return e.sizeCache=e.sizeCache||(r?function(){var i=n.window().getComputedStyle(r),a=o(function(l){return parseFloat(i.getPropertyValue(l))},"val");return{width:r.clientWidth-a("padding-left")-a("padding-right"),height:r.clientHeight-a("padding-top")-a("padding-bottom")}}():{width:1,height:1})},"size"),width:o(function(){return this.size().width},"width"),height:o(function(){return this.size().height},"height"),extent:o(function(){var e=this._private.pan,r=this._private.zoom,n=this.renderedExtent(),i={x1:(n.x1-e.x)/r,x2:(n.x2-e.x)/r,y1:(n.y1-e.y)/r,y2:(n.y2-e.y)/r};return i.w=i.x2-i.x1,i.h=i.y2-i.y1,i},"extent"),renderedExtent:o(function(){var e=this.width(),r=this.height();return{x1:0,y1:0,x2:e,y2:r,w:e,h:r}},"renderedExtent"),multiClickDebounceTime:o(function(e){if(e)this._private.multiClickDebounceTime=e;else return this._private.multiClickDebounceTime;return this},"multiClickDebounceTime")};Hp.centre=Hp.center;Hp.autolockNodes=Hp.autolock;Hp.autoungrabifyNodes=Hp.autoungrabify;Zb={data:cn.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:cn.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:cn.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:cn.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};Zb.attr=Zb.data;Zb.removeAttr=Zb.removeData;Jb=o(function(e){var r=this;e=rr({},e);var n=e.container;n&&!vS(n)&&vS(n[0])&&(n=n[0]);var i=n?n._cyreg:null;i=i||{},i&&i.cy&&(i.cy.destroy(),i={});var a=i.readies=i.readies||[];n&&(n._cyreg=i),i.cy=r;var s=Ui!==void 0&&n!==void 0&&!e.headless,l=e;l.layout=rr({name:s?"grid":"null"},l.layout),l.renderer=rr({name:s?"canvas":"null"},l.renderer);var u=o(function(g,y,v){return y!==void 0?y:v!==void 0?v:g},"defVal"),h=this._private={container:n,ready:!1,options:l,elements:new ka(this),listeners:[],aniEles:new ka(this),data:l.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:u(!0,l.zoomingEnabled),userZoomingEnabled:u(!0,l.userZoomingEnabled),panningEnabled:u(!0,l.panningEnabled),userPanningEnabled:u(!0,l.userPanningEnabled),boxSelectionEnabled:u(!0,l.boxSelectionEnabled),autolock:u(!1,l.autolock,l.autolockNodes),autoungrabify:u(!1,l.autoungrabify,l.autoungrabifyNodes),autounselectify:u(!1,l.autounselectify),styleEnabled:l.styleEnabled===void 0?s:l.styleEnabled,zoom:Ct(l.zoom)?l.zoom:1,pan:{x:Ur(l.pan)&&Ct(l.pan.x)?l.pan.x:0,y:Ur(l.pan)&&Ct(l.pan.y)?l.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:u(250,l.multiClickDebounceTime)};this.createEmitter(),this.selectionType(l.selectionType),this.zoomRange({min:l.minZoom,max:l.maxZoom});var f=o(function(g,y){var v=g.some(nWe);if(v)return ey.all(g).then(y);y(g)},"loadExtData");h.styleEnabled&&r.setStyle([]);var d=rr({},l,l.renderer);r.initRenderer(d);var p=o(function(g,y,v){r.notifications(!1);var x=r.mutableElements();x.length>0&&x.remove(),g!=null&&(Ur(g)||En(g))&&r.add(g),r.one("layoutready",function(w){r.notifications(!0),r.emit(w),r.one("load",y),r.emitAndNotify("load")}).one("layoutstop",function(){r.one("done",v),r.emit("done")});var b=rr({},r._private.options.layout);b.eles=r.elements(),r.layout(b).run()},"setElesAndLayout");f([l.style,l.elements],function(m){var g=m[0],y=m[1];h.styleEnabled&&r.style().append(g),p(y,function(){r.startAnimationLoop(),h.ready=!0,si(l.ready)&&r.on("ready",l.ready);for(var v=0;v0,l=!!t.boundingBox,u=e.extent(),h=Hs(l?t.boundingBox:{x1:u.x1,y1:u.y1,w:u.w,h:u.h}),f;if(go(t.roots))f=t.roots;else if(En(t.roots)){for(var d=[],p=0;p0;){var O=R(),M=I(O,k);if(M)O.outgoers().filter(function(ae){return ae.isNode()&&r.has(ae)}).forEach(L);else if(M===null){un("Detected double maximal shift for node `"+O.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}var B=0;if(t.avoidOverlap)for(var F=0;F0&&b[0].length<=3?$e/2:0),Ie=2*Math.PI/b[ze].length*He;return ze===0&&b[0].length===1&&(Re=1),{x:se.x+Re*Math.cos(Ie),y:se.y+Re*Math.sin(Ie)}}else{var be=b[ze].length,W=Math.max(be===1?0:l?(h.w-t.padding*2-ue.w)/((t.grid?Se:be)-1):(h.w-t.padding*2-ue.w)/((t.grid?Se:be)+1),B),de={x:se.x+(He+1-(be+1)/2)*W,y:se.y+(ze+1-(ne+1)/2)*Z};return de}},"getPosition");return r.nodes().layoutPositions(this,t,ce),this};rQe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(rge,"CircleLayout");rge.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,a=n.nodes().not(":parent");e.sort&&(a=a.sort(e.sort));for(var s=Hs(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=e.sweep===void 0?2*Math.PI-2*Math.PI/a.length:e.sweep,h=u/Math.max(1,a.length-1),f,d=0,p=0;p1&&e.avoidOverlap){d*=1.75;var x=Math.cos(h)-Math.cos(0),b=Math.sin(h)-Math.sin(0),w=Math.sqrt(d*d/(x*x+b*b));f=Math.max(w,f)}var C=o(function(E,A){var S=e.startAngle+A*h*(i?1:-1),_=f*Math.cos(S),I=f*Math.sin(S),D={x:l.x+_,y:l.y+I};return D},"getPos");return n.nodes().layoutPositions(this,e,C),this};nQe={fit:!0,padding:30,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:o(function(e){return e.degree()},"concentric"),levelWidth:o(function(e){return e.maxDegree()/4},"levelWidth"),animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(nge,"ConcentricLayout");nge.prototype.run=function(){for(var t=this.options,e=t,r=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,n=t.cy,i=e.eles,a=i.nodes().not(":parent"),s=Hs(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=[],h=0,f=0;f0){var T=Math.abs(b[0].value-C.value);T>=v&&(b=[],x.push(b))}b.push(C)}var E=h+e.minNodeSpacing;if(!e.avoidOverlap){var A=x.length>0&&x[0].length>1,S=Math.min(s.w,s.h)/2-E,_=S/(x.length+A?1:0);E=Math.min(E,_)}for(var I=0,D=0;D1&&e.avoidOverlap){var O=Math.cos(R)-Math.cos(0),M=Math.sin(R)-Math.sin(0),B=Math.sqrt(E*E/(O*O+M*M));I=Math.max(B,I)}k.r=I,I+=E}if(e.equidistant){for(var F=0,P=0,z=0;z=t.numIter||(hQe(n,t),n.temperature=n.temperature*t.coolingFactor,n.temperature=t.animationThreshold&&a(),xS(d)}},"frame");f()}else{for(;h;)h=s(u),u++;E0e(n,t),l()}return this};HS.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this};HS.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};aQe=o(function(e,r,n){for(var i=n.eles.edges(),a=n.eles.nodes(),s=Hs(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),l={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:a.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:i.size(),temperature:n.initialTemp,clientWidth:s.w,clientHeight:s.h,boundingBox:s},u=n.eles.components(),h={},f=0;f0){l.graphSet.push(S);for(var f=0;fi.count?0:i.graph},"findLCA"),oQe=o(function t(e,r,n,i){var a=i.graphSet[n];if(-10)var d=i.nodeOverlap*f,p=Math.sqrt(l*l+u*u),m=d*l/p,g=d*u/p;else var y=CS(e,l,u),v=CS(r,-1*l,-1*u),x=v.x-y.x,b=v.y-y.y,w=x*x+b*b,p=Math.sqrt(w),d=(e.nodeRepulsion+r.nodeRepulsion)/w,m=d*x/p,g=d*b/p;e.isLocked||(e.offsetX-=m,e.offsetY-=g),r.isLocked||(r.offsetX+=m,r.offsetY+=g)}},"nodeRepulsion"),pQe=o(function(e,r,n,i){if(n>0)var a=e.maxX-r.minX;else var a=r.maxX-e.minX;if(i>0)var s=e.maxY-r.minY;else var s=r.maxY-e.minY;return a>=0&&s>=0?Math.sqrt(a*a+s*s):0},"nodesOverlap"),CS=o(function(e,r,n){var i=e.positionX,a=e.positionY,s=e.height||1,l=e.width||1,u=n/r,h=s/l,f={};return r===0&&0n?(f.x=i,f.y=a+s/2,f):0r&&-1*h<=u&&u<=h?(f.x=i-l/2,f.y=a-l*n/2/r,f):0=h)?(f.x=i+s*r/2/n,f.y=a+s/2,f):(0>n&&(u<=-1*h||u>=h)&&(f.x=i-s*r/2/n,f.y=a-s/2),f)},"findClippingPoint"),mQe=o(function(e,r){for(var n=0;nn){var v=r.gravity*m/y,x=r.gravity*g/y;p.offsetX+=v,p.offsetY+=x}}}}},"calculateGravityForces"),yQe=o(function(e,r){var n=[],i=0,a=-1;for(n.push.apply(n,e.graphSet[0]),a+=e.graphSet[0].length;i<=a;){var s=n[i++],l=e.idToIndex[s],u=e.layoutNodes[l],h=u.children;if(0n)var a={x:n*e/i,y:n*r/i};else var a={x:e,y:r};return a},"limitForce"),bQe=o(function t(e,r){var n=e.parentId;if(n!=null){var i=r.layoutNodes[r.idToIndex[n]],a=!1;if((i.maxX==null||e.maxX+i.padRight>i.maxX)&&(i.maxX=e.maxX+i.padRight,a=!0),(i.minX==null||e.minX-i.padLefti.maxY)&&(i.maxY=e.maxY+i.padBottom,a=!0),(i.minY==null||e.minY-i.padTopx&&(g+=v+r.componentSpacing,m=0,y=0,v=0)}}},"separateComponents"),wQe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:o(function(e){},"position"),sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(age,"GridLayout");age.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=n.nodes().not(":parent");e.sort&&(i=i.sort(e.sort));var a=Hs(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()});if(a.h===0||a.w===0)n.nodes().layoutPositions(this,e,function(Q){return{x:a.x1,y:a.y1}});else{var s=i.size(),l=Math.sqrt(s*a.h/a.w),u=Math.round(l),h=Math.round(a.w/a.h*l),f=o(function(j){if(j==null)return Math.min(u,h);var ie=Math.min(u,h);ie==u?u=j:h=j},"small"),d=o(function(j){if(j==null)return Math.max(u,h);var ie=Math.max(u,h);ie==u?u=j:h=j},"large"),p=e.rows,m=e.cols!=null?e.cols:e.columns;if(p!=null&&m!=null)u=p,h=m;else if(p!=null&&m==null)u=p,h=Math.ceil(s/u);else if(p==null&&m!=null)h=m,u=Math.ceil(s/h);else if(h*u>s){var g=f(),y=d();(g-1)*y>=s?f(g-1):(y-1)*g>=s&&d(y-1)}else for(;h*u=s?d(x+1):f(v+1)}var b=a.w/h,w=a.h/u;if(e.condense&&(b=0,w=0),e.avoidOverlap)for(var C=0;C=h&&(O=0,R++)},"moveToNextCell"),B={},F=0;F(O=Wqe(t,e,M[B],M[B+1],M[B+2],M[B+3])))return v(A,O),!0}else if(_.edgeType==="bezier"||_.edgeType==="multibezier"||_.edgeType==="self"||_.edgeType==="compound"){for(var M=_.allpts,B=0;B+5<_.allpts.length;B+=4)if(Gqe(t,e,M[B],M[B+1],M[B+2],M[B+3],M[B+4],M[B+5],R)&&L>(O=Hqe(t,e,M[B],M[B+1],M[B+2],M[B+3],M[B+4],M[B+5])))return v(A,O),!0}for(var F=F||S.source,P=P||S.target,z=i.getArrowWidth(I,D),$=[{name:"source",x:_.arrowStartX,y:_.arrowStartY,angle:_.srcArrowAngle},{name:"target",x:_.arrowEndX,y:_.arrowEndY,angle:_.tgtArrowAngle},{name:"mid-source",x:_.midX,y:_.midY,angle:_.midsrcArrowAngle},{name:"mid-target",x:_.midX,y:_.midY,angle:_.midtgtArrowAngle}],B=0;B<$.length;B++){var H=$[B],Q=a.arrowShapes[A.pstyle(H.name+"-arrow-shape").value],j=A.pstyle("width").pfValue;if(Q.roughCollide(t,e,z,H.angle,{x:H.x,y:H.y},j,f)&&Q.collide(t,e,z,H.angle,{x:H.x,y:H.y},j,f))return v(A),!0}h&&l.length>0&&(x(F),x(P))}o(b,"checkEdge");function w(A,S,_){return Gl(A,S,_)}o(w,"preprop");function C(A,S){var _=A._private,I=p,D;S?D=S+"-":D="",A.boundingBox();var k=_.labelBounds[S||"main"],L=A.pstyle(D+"label").value,R=A.pstyle("text-events").strValue==="yes";if(!(!R||!L)){var O=w(_.rscratch,"labelX",S),M=w(_.rscratch,"labelY",S),B=w(_.rscratch,"labelAngle",S),F=A.pstyle(D+"text-margin-x").pfValue,P=A.pstyle(D+"text-margin-y").pfValue,z=k.x1-I-F,$=k.x2+I-F,H=k.y1-I-P,Q=k.y2+I-P;if(B){var j=Math.cos(B),ie=Math.sin(B),ne=o(function(se,ue){return se=se-O,ue=ue-M,{x:se*j-ue*ie+O,y:se*ie+ue*j+M}},"rotate"),le=ne(z,H),he=ne(z,Q),K=ne($,H),X=ne($,Q),te=[le.x+F,le.y+P,K.x+F,K.y+P,X.x+F,X.y+P,he.x+F,he.y+P];if(Us(t,e,te))return v(A),!0}else if(K1(k,t,e))return v(A),!0}}o(C,"checkLabel");for(var T=s.length-1;T>=0;T--){var E=s[T];E.isNode()?x(E)||C(E):b(E)||C(E)||C(E,"source")||C(E,"target")}return l};qp.getAllInBox=function(t,e,r,n){var i=this.getCachedZSortedEles().interactive,a=[],s=Math.min(t,r),l=Math.max(t,r),u=Math.min(e,n),h=Math.max(e,n);t=s,r=l,e=u,n=h;for(var f=Hs({x1:t,y1:e,x2:r,y2:n}),d=0;d0?-(Math.PI-e.ang):Math.PI+e.ang},"invertVec"),AQe=o(function(e,r,n,i,a){if(e!==D0e?L0e(r,e,qc):CQe(Jo,qc),L0e(r,n,Jo),A0e=qc.nx*Jo.ny-qc.ny*Jo.nx,_0e=qc.nx*Jo.nx-qc.ny*-Jo.ny,Ku=Math.asin(Math.max(-1,Math.min(1,A0e))),Math.abs(Ku)<1e-6){HP=r.x,WP=r.y,Bp=G1=0;return}Fp=1,gS=!1,_0e<0?Ku<0?Ku=Math.PI+Ku:(Ku=Math.PI-Ku,Fp=-1,gS=!0):Ku>0&&(Fp=-1,gS=!0),r.radius!==void 0?G1=r.radius:G1=i,Mp=Ku/2,aS=Math.min(qc.len/2,Jo.len/2),a?(Wc=Math.abs(Math.cos(Mp)*G1/Math.sin(Mp)),Wc>aS?(Wc=aS,Bp=Math.abs(Wc*Math.sin(Mp)/Math.cos(Mp))):Bp=G1):(Wc=Math.min(aS,G1),Bp=Math.abs(Wc*Math.sin(Mp)/Math.cos(Mp))),qP=r.x+Jo.nx*Wc,YP=r.y+Jo.ny*Wc,HP=qP-Jo.ny*Bp*Fp,WP=YP+Jo.nx*Bp*Fp,cge=r.x+qc.nx*Wc,uge=r.y+qc.ny*Wc,D0e=r},"calcCornerArc");o(hge,"drawPreparedRoundCorner");o(vB,"getRoundCorner");Va={};Va.findMidptPtsEtc=function(t,e){var r=e.posPts,n=e.intersectionPts,i=e.vectorNormInverse,a,s=t.pstyle("source-endpoint"),l=t.pstyle("target-endpoint"),u=s.units!=null&&l.units!=null,h=o(function(T,E,A,S){var _=S-E,I=A-T,D=Math.sqrt(I*I+_*_);return{x:-_/D,y:I/D}},"recalcVectorNormInverse"),f=t.pstyle("edge-distances").value;switch(f){case"node-position":a=r;break;case"intersection":a=n;break;case"endpoints":{if(u){var d=this.manualEndptToPx(t.source()[0],s),p=_i(d,2),m=p[0],g=p[1],y=this.manualEndptToPx(t.target()[0],l),v=_i(y,2),x=v[0],b=v[1],w={x1:m,y1:g,x2:x,y2:b};i=h(m,g,x,b),a=w}else un("Edge ".concat(t.id()," has edge-distances:endpoints specified without manual endpoints specified via source-endpoint and target-endpoint. Falling back on edge-distances:intersection (default).")),a=n;break}}return{midptPts:a,vectorNormInverse:i}};Va.findHaystackPoints=function(t){for(var e=0;e0?Math.max(q-pe,0):Math.min(q+pe,0)},"subDWH"),L=k(I,S),R=k(D,_),O=!1;b===h?x=Math.abs(L)>Math.abs(R)?i:n:b===u||b===l?(x=n,O=!0):(b===a||b===s)&&(x=i,O=!0);var M=x===n,B=M?R:L,F=M?D:I,P=mme(F),z=!1;!(O&&(C||E))&&(b===l&&F<0||b===u&&F>0||b===a&&F>0||b===s&&F<0)&&(P*=-1,B=P*Math.abs(B),z=!0);var $;if(C){var H=T<0?1+T:T;$=H*B}else{var Q=T<0?B:0;$=Q+T*P}var j=o(function(q){return Math.abs(q)=Math.abs(B)},"getIsTooClose"),ie=j($),ne=j(Math.abs(B)-Math.abs($)),le=ie||ne;if(le&&!z)if(M){var he=Math.abs(F)<=p/2,K=Math.abs(I)<=m/2;if(he){var X=(f.x1+f.x2)/2,te=f.y1,J=f.y2;r.segpts=[X,te,X,J]}else if(K){var se=(f.y1+f.y2)/2,ue=f.x1,Z=f.x2;r.segpts=[ue,se,Z,se]}else r.segpts=[f.x1,f.y2]}else{var Se=Math.abs(F)<=d/2,ce=Math.abs(D)<=g/2;if(Se){var ae=(f.y1+f.y2)/2,Oe=f.x1,ge=f.x2;r.segpts=[Oe,ae,ge,ae]}else if(ce){var ze=(f.x1+f.x2)/2,He=f.y1,$e=f.y2;r.segpts=[ze,He,ze,$e]}else r.segpts=[f.x2,f.y1]}else if(M){var Re=f.y1+$+(v?p/2*P:0),Ie=f.x1,be=f.x2;r.segpts=[Ie,Re,be,Re]}else{var W=f.x1+$+(v?d/2*P:0),de=f.y1,re=f.y2;r.segpts=[W,de,W,re]}if(r.isRound){var oe=t.pstyle("taxi-radius").value,V=t.pstyle("radius-type").value[0]==="arc-radius";r.radii=new Array(r.segpts.length/2).fill(oe),r.isArcRadius=new Array(r.segpts.length/2).fill(V)}};Va.tryToCorrectInvalidPoints=function(t,e){var r=t._private.rscratch;if(r.edgeType==="bezier"){var n=e.srcPos,i=e.tgtPos,a=e.srcW,s=e.srcH,l=e.tgtW,u=e.tgtH,h=e.srcShape,f=e.tgtShape,d=e.srcCornerRadius,p=e.tgtCornerRadius,m=e.srcRs,g=e.tgtRs,y=!Ct(r.startX)||!Ct(r.startY),v=!Ct(r.arrowStartX)||!Ct(r.arrowStartY),x=!Ct(r.endX)||!Ct(r.endY),b=!Ct(r.arrowEndX)||!Ct(r.arrowEndY),w=3,C=this.getArrowWidth(t.pstyle("width").pfValue,t.pstyle("arrow-scale").value)*this.arrowShapeWidth,T=w*C,E=Gp({x:r.ctrlpts[0],y:r.ctrlpts[1]},{x:r.startX,y:r.startY}),A=ER.poolIndex()){var O=L;L=R,R=O}var M=_.srcPos=L.position(),B=_.tgtPos=R.position(),F=_.srcW=L.outerWidth(),P=_.srcH=L.outerHeight(),z=_.tgtW=R.outerWidth(),$=_.tgtH=R.outerHeight(),H=_.srcShape=r.nodeShapes[e.getNodeShape(L)],Q=_.tgtShape=r.nodeShapes[e.getNodeShape(R)],j=_.srcCornerRadius=L.pstyle("corner-radius").value==="auto"?"auto":L.pstyle("corner-radius").pfValue,ie=_.tgtCornerRadius=R.pstyle("corner-radius").value==="auto"?"auto":R.pstyle("corner-radius").pfValue,ne=_.tgtRs=R._private.rscratch,le=_.srcRs=L._private.rscratch;_.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var he=0;he<_.eles.length;he++){var K=_.eles[he],X=K[0]._private.rscratch,te=K.pstyle("curve-style").value,J=te==="unbundled-bezier"||te.endsWith("segments")||te.endsWith("taxi"),se=!L.same(K.source());if(!_.calculatedIntersection&&L!==R&&(_.hasBezier||_.hasUnbundled)){_.calculatedIntersection=!0;var ue=H.intersectLine(M.x,M.y,F,P,B.x,B.y,0,j,le),Z=_.srcIntn=ue,Se=Q.intersectLine(B.x,B.y,z,$,M.x,M.y,0,ie,ne),ce=_.tgtIntn=Se,ae=_.intersectionPts={x1:ue[0],x2:Se[0],y1:ue[1],y2:Se[1]},Oe=_.posPts={x1:M.x,x2:B.x,y1:M.y,y2:B.y},ge=Se[1]-ue[1],ze=Se[0]-ue[0],He=Math.sqrt(ze*ze+ge*ge),$e=_.vector={x:ze,y:ge},Re=_.vectorNorm={x:$e.x/He,y:$e.y/He},Ie={x:-Re.y,y:Re.x};_.nodesOverlap=!Ct(He)||Q.checkPoint(ue[0],ue[1],0,z,$,B.x,B.y,ie,ne)||H.checkPoint(Se[0],Se[1],0,F,P,M.x,M.y,j,le),_.vectorNormInverse=Ie,I={nodesOverlap:_.nodesOverlap,dirCounts:_.dirCounts,calculatedIntersection:!0,hasBezier:_.hasBezier,hasUnbundled:_.hasUnbundled,eles:_.eles,srcPos:B,srcRs:ne,tgtPos:M,tgtRs:le,srcW:z,srcH:$,tgtW:F,tgtH:P,srcIntn:ce,tgtIntn:Z,srcShape:Q,tgtShape:H,posPts:{x1:Oe.x2,y1:Oe.y2,x2:Oe.x1,y2:Oe.y1},intersectionPts:{x1:ae.x2,y1:ae.y2,x2:ae.x1,y2:ae.y1},vector:{x:-$e.x,y:-$e.y},vectorNorm:{x:-Re.x,y:-Re.y},vectorNormInverse:{x:-Ie.x,y:-Ie.y}}}var be=se?I:_;X.nodesOverlap=be.nodesOverlap,X.srcIntn=be.srcIntn,X.tgtIntn=be.tgtIntn,X.isRound=te.startsWith("round"),i&&(L.isParent()||L.isChild()||R.isParent()||R.isChild())&&(L.parents().anySame(R)||R.parents().anySame(L)||L.same(R)&&L.isParent())?e.findCompoundLoopPoints(K,be,he,J):L===R?e.findLoopPoints(K,be,he,J):te.endsWith("segments")?e.findSegmentsPoints(K,be):te.endsWith("taxi")?e.findTaxiPoints(K,be):te==="straight"||!J&&_.eles.length%2===1&&he===Math.floor(_.eles.length/2)?e.findStraightEdgePoints(K):e.findBezierPoints(K,be,he,J,se),e.findEndpoints(K),e.tryToCorrectInvalidPoints(K,be),e.checkForInvalidEdgeWarning(K),e.storeAllpts(K),e.storeEdgeProjections(K),e.calculateArrowAngles(K),e.recalculateEdgeLabelProjections(K),e.calculateLabelAngles(K)}},"_loop"),T=0;T0){var J=a,se=Op(J,U1(r)),ue=Op(J,U1(te)),Z=se;if(ue2){var Se=Op(J,{x:te[2],y:te[3]});Se0){var re=s,oe=Op(re,U1(r)),V=Op(re,U1(de)),xe=oe;if(V2){var q=Op(re,{x:de[2],y:de[3]});q=g||A){v={cp:C,segment:E};break}}if(v)break}var S=v.cp,_=v.segment,I=(g-x)/_.length,D=_.t1-_.t0,k=m?_.t0+D*I:_.t1-D*I;k=Yb(0,k,1),e=W1(S.p0,S.p1,S.p2,k),p=DQe(S.p0,S.p1,S.p2,k);break}case"straight":case"segments":case"haystack":{for(var L=0,R,O,M,B,F=n.allpts.length,P=0;P+3=g));P+=2);var z=g-O,$=z/R;$=Yb(0,$,1),e=Iqe(M,B,$),p=pge(M,B);break}}s("labelX",d,e.x),s("labelY",d,e.y),s("labelAutoAngle",d,p)}},"calculateEndProjection");h("source"),h("target"),this.applyLabelDimensions(t)}};Kc.applyLabelDimensions=function(t){this.applyPrefixedLabelDimensions(t),t.isEdge()&&(this.applyPrefixedLabelDimensions(t,"source"),this.applyPrefixedLabelDimensions(t,"target"))};Kc.applyPrefixedLabelDimensions=function(t,e){var r=t._private,n=this.getLabelText(t,e),i=this.calculateLabelDimensions(t,n),a=t.pstyle("line-height").pfValue,s=t.pstyle("text-wrap").strValue,l=Gl(r.rscratch,"labelWrapCachedLines",e)||[],u=s!=="wrap"?1:Math.max(l.length,1),h=i.height/u,f=h*a,d=i.width,p=i.height+(u-1)*(a-1)*h;kf(r.rstyle,"labelWidth",e,d),kf(r.rscratch,"labelWidth",e,d),kf(r.rstyle,"labelHeight",e,p),kf(r.rscratch,"labelHeight",e,p),kf(r.rscratch,"labelLineHeight",e,f)};Kc.getLabelText=function(t,e){var r=t._private,n=e?e+"-":"",i=t.pstyle(n+"label").strValue,a=t.pstyle("text-transform").value,s=o(function(Q,j){return j?(kf(r.rscratch,Q,e,j),j):Gl(r.rscratch,Q,e)},"rscratch");if(!i)return"";a=="none"||(a=="uppercase"?i=i.toUpperCase():a=="lowercase"&&(i=i.toLowerCase()));var l=t.pstyle("text-wrap").value;if(l==="wrap"){var u=s("labelKey");if(u!=null&&s("labelWrapKey")===u)return s("labelWrapCachedText");for(var h="\u200B",f=i.split(` +`),d=t.pstyle("text-max-width").pfValue,p=t.pstyle("text-overflow-wrap").value,m=p==="anywhere",g=[],y=/[\s\u200b]+|$/g,v=0;vd){var T=x.matchAll(y),E="",A=0,S=mo(T),_;try{for(S.s();!(_=S.n()).done;){var I=_.value,D=I[0],k=x.substring(A,I.index);A=I.index+D.length;var L=E.length===0?k:E+k+D,R=this.calculateLabelDimensions(t,L),O=R.width;O<=d?E+=k+D:(E&&g.push(E),E=k+D)}}catch(H){S.e(H)}finally{S.f()}E.match(/^[\s\u200b]+$/)||g.push(E)}else g.push(x)}s("labelWrapCachedLines",g),i=s("labelWrapCachedText",g.join(` +`)),s("labelWrapKey",u)}else if(l==="ellipsis"){var M=t.pstyle("text-max-width").pfValue,B="",F="\u2026",P=!1;if(this.calculateLabelDimensions(t,i).widthM)break;B+=i[z],z===i.length-1&&(P=!0)}return P||(B+=F),B}return i};Kc.getLabelJustification=function(t){var e=t.pstyle("text-justification").strValue,r=t.pstyle("text-halign").strValue;if(e==="auto")if(t.isNode())switch(r){case"left":return"right";case"right":return"left";default:return"center"}else return"center";else return e};Kc.calculateLabelDimensions=function(t,e){var r=this,n=r.cy.window(),i=n.document,a=_f(e,t._private.labelDimsKey),s=r.labelDimCache||(r.labelDimCache=[]),l=s[a];if(l!=null)return l;var u=0,h=t.pstyle("font-style").strValue,f=t.pstyle("font-size").pfValue,d=t.pstyle("font-family").strValue,p=t.pstyle("font-weight").strValue,m=this.labelCalcCanvas,g=this.labelCalcCanvasContext;if(!m){m=this.labelCalcCanvas=i.createElement("canvas"),g=this.labelCalcCanvasContext=m.getContext("2d");var y=m.style;y.position="absolute",y.left="-9999px",y.top="-9999px",y.zIndex="-1",y.visibility="hidden",y.pointerEvents="none"}g.font="".concat(h," ").concat(p," ").concat(f,"px ").concat(d);for(var v=0,x=0,b=e.split(` +`),w=0;w1&&arguments[1]!==void 0?arguments[1]:!0;if(e.merge(s),l)for(var u=0;u=t.desktopTapThreshold2}var ot=a(W);at&&(t.hoverData.tapholdCancelled=!0);var Yt=o(function(){var Tt=t.hoverData.dragDelta=t.hoverData.dragDelta||[];Tt.length===0?(Tt.push(De[0]),Tt.push(De[1])):(Tt[0]+=De[0],Tt[1]+=De[1])},"updateDragDelta");re=!0,i(_e,["mousemove","vmousemove","tapdrag"],W,{x:q[0],y:q[1]});var bt=o(function(){t.data.bgActivePosistion=void 0,t.hoverData.selecting||oe.emit({originalEvent:W,type:"boxstart",position:{x:q[0],y:q[1]}}),Pe[4]=1,t.hoverData.selecting=!0,t.redrawHint("select",!0),t.redraw()},"goIntoBoxMode");if(t.hoverData.which===3){if(at){var Mt={originalEvent:W,type:"cxtdrag",position:{x:q[0],y:q[1]}};Ve?Ve.emit(Mt):oe.emit(Mt),t.hoverData.cxtDragged=!0,(!t.hoverData.cxtOver||_e!==t.hoverData.cxtOver)&&(t.hoverData.cxtOver&&t.hoverData.cxtOver.emit({originalEvent:W,type:"cxtdragout",position:{x:q[0],y:q[1]}}),t.hoverData.cxtOver=_e,_e&&_e.emit({originalEvent:W,type:"cxtdragover",position:{x:q[0],y:q[1]}}))}}else if(t.hoverData.dragging){if(re=!0,oe.panningEnabled()&&oe.userPanningEnabled()){var xt;if(t.hoverData.justStartedPan){var ut=t.hoverData.mdownPos;xt={x:(q[0]-ut[0])*V,y:(q[1]-ut[1])*V},t.hoverData.justStartedPan=!1}else xt={x:De[0]*V,y:De[1]*V};oe.panBy(xt),oe.emit("dragpan"),t.hoverData.dragged=!0}q=t.projectIntoViewport(W.clientX,W.clientY)}else if(Pe[4]==1&&(Ve==null||Ve.pannable())){if(at){if(!t.hoverData.dragging&&oe.boxSelectionEnabled()&&(ot||!oe.panningEnabled()||!oe.userPanningEnabled()))bt();else if(!t.hoverData.selecting&&oe.panningEnabled()&&oe.userPanningEnabled()){var Et=s(Ve,t.hoverData.downs);Et&&(t.hoverData.dragging=!0,t.hoverData.justStartedPan=!0,Pe[4]=0,t.data.bgActivePosistion=U1(pe),t.redrawHint("select",!0),t.redraw())}Ve&&Ve.pannable()&&Ve.active()&&Ve.unactivate()}}else{if(Ve&&Ve.pannable()&&Ve.active()&&Ve.unactivate(),(!Ve||!Ve.grabbed())&&_e!=we&&(we&&i(we,["mouseout","tapdragout"],W,{x:q[0],y:q[1]}),_e&&i(_e,["mouseover","tapdragover"],W,{x:q[0],y:q[1]}),t.hoverData.last=_e),Ve)if(at){if(oe.boxSelectionEnabled()&&ot)Ve&&Ve.grabbed()&&(x(qe),Ve.emit("freeon"),qe.emit("free"),t.dragData.didDrag&&(Ve.emit("dragfreeon"),qe.emit("dragfree"))),bt();else if(Ve&&Ve.grabbed()&&t.nodeIsDraggable(Ve)){var ft=!t.dragData.didDrag;ft&&t.redrawHint("eles",!0),t.dragData.didDrag=!0,t.hoverData.draggingEles||y(qe,{inDragLayer:!0});var yt={x:0,y:0};if(Ct(De[0])&&Ct(De[1])&&(yt.x+=De[0],yt.y+=De[1],ft)){var nt=t.hoverData.dragDelta;nt&&Ct(nt[0])&&Ct(nt[1])&&(yt.x+=nt[0],yt.y+=nt[1])}t.hoverData.draggingEles=!0,qe.silentShift(yt).emit("position drag"),t.redrawHint("drag",!0),t.redraw()}}else Yt();re=!0}if(Pe[2]=q[0],Pe[3]=q[1],re)return W.stopPropagation&&W.stopPropagation(),W.preventDefault&&W.preventDefault(),!1}},"mousemoveHandler"),!1);var k,L,R;t.registerBinding(e,"mouseup",o(function(W){if(!(t.hoverData.which===1&&W.which!==1&&t.hoverData.capture)){var de=t.hoverData.capture;if(de){t.hoverData.capture=!1;var re=t.cy,oe=t.projectIntoViewport(W.clientX,W.clientY),V=t.selection,xe=t.findNearestElement(oe[0],oe[1],!0,!1),q=t.dragData.possibleDragElements,pe=t.hoverData.down,ve=a(W);if(t.data.bgActivePosistion&&(t.redrawHint("select",!0),t.redraw()),t.hoverData.tapholdCancelled=!0,t.data.bgActivePosistion=void 0,pe&&pe.unactivate(),t.hoverData.which===3){var Pe={originalEvent:W,type:"cxttapend",position:{x:oe[0],y:oe[1]}};if(pe?pe.emit(Pe):re.emit(Pe),!t.hoverData.cxtDragged){var _e={originalEvent:W,type:"cxttap",position:{x:oe[0],y:oe[1]}};pe?pe.emit(_e):re.emit(_e)}t.hoverData.cxtDragged=!1,t.hoverData.which=null}else if(t.hoverData.which===1){if(i(xe,["mouseup","tapend","vmouseup"],W,{x:oe[0],y:oe[1]}),!t.dragData.didDrag&&!t.hoverData.dragged&&!t.hoverData.selecting&&!t.hoverData.isOverThresholdDrag&&(i(pe,["click","tap","vclick"],W,{x:oe[0],y:oe[1]}),L=!1,W.timeStamp-R<=re.multiClickDebounceTime()?(k&&clearTimeout(k),L=!0,R=null,i(pe,["dblclick","dbltap","vdblclick"],W,{x:oe[0],y:oe[1]})):(k=setTimeout(function(){L||i(pe,["oneclick","onetap","voneclick"],W,{x:oe[0],y:oe[1]})},re.multiClickDebounceTime()),R=W.timeStamp)),pe==null&&!t.dragData.didDrag&&!t.hoverData.selecting&&!t.hoverData.dragged&&!a(W)&&(re.$(r).unselect(["tapunselect"]),q.length>0&&t.redrawHint("eles",!0),t.dragData.possibleDragElements=q=re.collection()),xe==pe&&!t.dragData.didDrag&&!t.hoverData.selecting&&xe!=null&&xe._private.selectable&&(t.hoverData.dragging||(re.selectionType()==="additive"||ve?xe.selected()?xe.unselect(["tapunselect"]):xe.select(["tapselect"]):ve||(re.$(r).unmerge(xe).unselect(["tapunselect"]),xe.select(["tapselect"]))),t.redrawHint("eles",!0)),t.hoverData.selecting){var we=re.collection(t.getAllInBox(V[0],V[1],V[2],V[3]));t.redrawHint("select",!0),we.length>0&&t.redrawHint("eles",!0),re.emit({type:"boxend",originalEvent:W,position:{x:oe[0],y:oe[1]}});var Ve=o(function(at){return at.selectable()&&!at.selected()},"eleWouldBeSelected");re.selectionType()==="additive"||ve||re.$(r).unmerge(we).unselect(),we.emit("box").stdFilter(Ve).select().emit("boxselect"),t.redraw()}if(t.hoverData.dragging&&(t.hoverData.dragging=!1,t.redrawHint("select",!0),t.redrawHint("eles",!0),t.redraw()),!V[4]){t.redrawHint("drag",!0),t.redrawHint("eles",!0);var De=pe&&pe.grabbed();x(q),De&&(pe.emit("freeon"),q.emit("free"),t.dragData.didDrag&&(pe.emit("dragfreeon"),q.emit("dragfree")))}}V[4]=0,t.hoverData.down=null,t.hoverData.cxtStarted=!1,t.hoverData.draggingEles=!1,t.hoverData.selecting=!1,t.hoverData.isOverThresholdDrag=!1,t.dragData.didDrag=!1,t.hoverData.dragged=!1,t.hoverData.dragDelta=[],t.hoverData.mdownPos=null,t.hoverData.mdownGPos=null,t.hoverData.which=null}}},"mouseupHandler"),!1);var O=o(function(W){if(!t.scrollingPage){var de=t.cy,re=de.zoom(),oe=de.pan(),V=t.projectIntoViewport(W.clientX,W.clientY),xe=[V[0]*re+oe.x,V[1]*re+oe.y];if(t.hoverData.draggingEles||t.hoverData.dragging||t.hoverData.cxtStarted||_()){W.preventDefault();return}if(de.panningEnabled()&&de.userPanningEnabled()&&de.zoomingEnabled()&&de.userZoomingEnabled()){W.preventDefault(),t.data.wheelZooming=!0,clearTimeout(t.data.wheelTimeout),t.data.wheelTimeout=setTimeout(function(){t.data.wheelZooming=!1,t.redrawHint("eles",!0),t.redraw()},150);var q;W.deltaY!=null?q=W.deltaY/-250:W.wheelDeltaY!=null?q=W.wheelDeltaY/1e3:q=W.wheelDelta/1e3,q=q*t.wheelSensitivity;var pe=W.deltaMode===1;pe&&(q*=33);var ve=de.zoom()*Math.pow(10,q);W.type==="gesturechange"&&(ve=t.gestureStartZoom*W.scale),de.zoom({level:ve,renderedPosition:{x:xe[0],y:xe[1]}}),de.emit(W.type==="gesturechange"?"pinchzoom":"scrollzoom")}}},"wheelHandler");t.registerBinding(t.container,"wheel",O,!0),t.registerBinding(e,"scroll",o(function(W){t.scrollingPage=!0,clearTimeout(t.scrollingPageTimeout),t.scrollingPageTimeout=setTimeout(function(){t.scrollingPage=!1},250)},"scrollHandler"),!0),t.registerBinding(t.container,"gesturestart",o(function(W){t.gestureStartZoom=t.cy.zoom(),t.hasTouchStarted||W.preventDefault()},"gestureStartHandler"),!0),t.registerBinding(t.container,"gesturechange",function(be){t.hasTouchStarted||O(be)},!0),t.registerBinding(t.container,"mouseout",o(function(W){var de=t.projectIntoViewport(W.clientX,W.clientY);t.cy.emit({originalEvent:W,type:"mouseout",position:{x:de[0],y:de[1]}})},"mouseOutHandler"),!1),t.registerBinding(t.container,"mouseover",o(function(W){var de=t.projectIntoViewport(W.clientX,W.clientY);t.cy.emit({originalEvent:W,type:"mouseover",position:{x:de[0],y:de[1]}})},"mouseOverHandler"),!1);var M,B,F,P,z,$,H,Q,j,ie,ne,le,he,K=o(function(W,de,re,oe){return Math.sqrt((re-W)*(re-W)+(oe-de)*(oe-de))},"distance"),X=o(function(W,de,re,oe){return(re-W)*(re-W)+(oe-de)*(oe-de)},"distanceSq"),te;t.registerBinding(t.container,"touchstart",te=o(function(W){if(t.hasTouchStarted=!0,!!I(W)){w(),t.touchData.capture=!0,t.data.bgActivePosistion=void 0;var de=t.cy,re=t.touchData.now,oe=t.touchData.earlier;if(W.touches[0]){var V=t.projectIntoViewport(W.touches[0].clientX,W.touches[0].clientY);re[0]=V[0],re[1]=V[1]}if(W.touches[1]){var V=t.projectIntoViewport(W.touches[1].clientX,W.touches[1].clientY);re[2]=V[0],re[3]=V[1]}if(W.touches[2]){var V=t.projectIntoViewport(W.touches[2].clientX,W.touches[2].clientY);re[4]=V[0],re[5]=V[1]}if(W.touches[1]){t.touchData.singleTouchMoved=!0,x(t.dragData.touchDragEles);var xe=t.findContainerClientCoords();j=xe[0],ie=xe[1],ne=xe[2],le=xe[3],M=W.touches[0].clientX-j,B=W.touches[0].clientY-ie,F=W.touches[1].clientX-j,P=W.touches[1].clientY-ie,he=0<=M&&M<=ne&&0<=F&&F<=ne&&0<=B&&B<=le&&0<=P&&P<=le;var q=de.pan(),pe=de.zoom();z=K(M,B,F,P),$=X(M,B,F,P),H=[(M+F)/2,(B+P)/2],Q=[(H[0]-q.x)/pe,(H[1]-q.y)/pe];var ve=200,Pe=ve*ve;if($=1){for(var st=t.touchData.startPosition=[null,null,null,null,null,null],Ue=0;Ue=t.touchTapThreshold2}if(de&&t.touchData.cxt){W.preventDefault();var st=W.touches[0].clientX-j,Ue=W.touches[0].clientY-ie,ct=W.touches[1].clientX-j,We=W.touches[1].clientY-ie,ot=X(st,Ue,ct,We),Yt=ot/$,bt=150,Mt=bt*bt,xt=1.5,ut=xt*xt;if(Yt>=ut||ot>=Mt){t.touchData.cxt=!1,t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var Et={originalEvent:W,type:"cxttapend",position:{x:V[0],y:V[1]}};t.touchData.start?(t.touchData.start.unactivate().emit(Et),t.touchData.start=null):oe.emit(Et)}}if(de&&t.touchData.cxt){var Et={originalEvent:W,type:"cxtdrag",position:{x:V[0],y:V[1]}};t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.touchData.start?t.touchData.start.emit(Et):oe.emit(Et),t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxtDragged=!0;var ft=t.findNearestElement(V[0],V[1],!0,!0);(!t.touchData.cxtOver||ft!==t.touchData.cxtOver)&&(t.touchData.cxtOver&&t.touchData.cxtOver.emit({originalEvent:W,type:"cxtdragout",position:{x:V[0],y:V[1]}}),t.touchData.cxtOver=ft,ft&&ft.emit({originalEvent:W,type:"cxtdragover",position:{x:V[0],y:V[1]}}))}else if(de&&W.touches[2]&&oe.boxSelectionEnabled())W.preventDefault(),t.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,t.touchData.selecting||oe.emit({originalEvent:W,type:"boxstart",position:{x:V[0],y:V[1]}}),t.touchData.selecting=!0,t.touchData.didSelect=!0,re[4]=1,!re||re.length===0||re[0]===void 0?(re[0]=(V[0]+V[2]+V[4])/3,re[1]=(V[1]+V[3]+V[5])/3,re[2]=(V[0]+V[2]+V[4])/3+1,re[3]=(V[1]+V[3]+V[5])/3+1):(re[2]=(V[0]+V[2]+V[4])/3,re[3]=(V[1]+V[3]+V[5])/3),t.redrawHint("select",!0),t.redraw();else if(de&&W.touches[1]&&!t.touchData.didSelect&&oe.zoomingEnabled()&&oe.panningEnabled()&&oe.userZoomingEnabled()&&oe.userPanningEnabled()){W.preventDefault(),t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var yt=t.dragData.touchDragEles;if(yt){t.redrawHint("drag",!0);for(var nt=0;nt0&&!t.hoverData.draggingEles&&!t.swipePanning&&t.data.bgActivePosistion!=null&&(t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.redraw())}},"touchmoveHandler"),!1);var se;t.registerBinding(e,"touchcancel",se=o(function(W){var de=t.touchData.start;t.touchData.capture=!1,de&&de.unactivate()},"touchcancelHandler"));var ue,Z,Se,ce;if(t.registerBinding(e,"touchend",ue=o(function(W){var de=t.touchData.start,re=t.touchData.capture;if(re)W.touches.length===0&&(t.touchData.capture=!1),W.preventDefault();else return;var oe=t.selection;t.swipePanning=!1,t.hoverData.draggingEles=!1;var V=t.cy,xe=V.zoom(),q=t.touchData.now,pe=t.touchData.earlier;if(W.touches[0]){var ve=t.projectIntoViewport(W.touches[0].clientX,W.touches[0].clientY);q[0]=ve[0],q[1]=ve[1]}if(W.touches[1]){var ve=t.projectIntoViewport(W.touches[1].clientX,W.touches[1].clientY);q[2]=ve[0],q[3]=ve[1]}if(W.touches[2]){var ve=t.projectIntoViewport(W.touches[2].clientX,W.touches[2].clientY);q[4]=ve[0],q[5]=ve[1]}de&&de.unactivate();var Pe;if(t.touchData.cxt){if(Pe={originalEvent:W,type:"cxttapend",position:{x:q[0],y:q[1]}},de?de.emit(Pe):V.emit(Pe),!t.touchData.cxtDragged){var _e={originalEvent:W,type:"cxttap",position:{x:q[0],y:q[1]}};de?de.emit(_e):V.emit(_e)}t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxt=!1,t.touchData.start=null,t.redraw();return}if(!W.touches[2]&&V.boxSelectionEnabled()&&t.touchData.selecting){t.touchData.selecting=!1;var we=V.collection(t.getAllInBox(oe[0],oe[1],oe[2],oe[3]));oe[0]=void 0,oe[1]=void 0,oe[2]=void 0,oe[3]=void 0,oe[4]=0,t.redrawHint("select",!0),V.emit({type:"boxend",originalEvent:W,position:{x:q[0],y:q[1]}});var Ve=o(function(Mt){return Mt.selectable()&&!Mt.selected()},"eleWouldBeSelected");we.emit("box").stdFilter(Ve).select().emit("boxselect"),we.nonempty()&&t.redrawHint("eles",!0),t.redraw()}if(de?.unactivate(),W.touches[2])t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);else if(!W.touches[1]){if(!W.touches[0]){if(!W.touches[0]){t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var De=t.dragData.touchDragEles;if(de!=null){var qe=de._private.grabbed;x(De),t.redrawHint("drag",!0),t.redrawHint("eles",!0),qe&&(de.emit("freeon"),De.emit("free"),t.dragData.didDrag&&(de.emit("dragfreeon"),De.emit("dragfree"))),i(de,["touchend","tapend","vmouseup","tapdragout"],W,{x:q[0],y:q[1]}),de.unactivate(),t.touchData.start=null}else{var at=t.findNearestElement(q[0],q[1],!0,!0);i(at,["touchend","tapend","vmouseup","tapdragout"],W,{x:q[0],y:q[1]})}var Rt=t.touchData.startPosition[0]-q[0],st=Rt*Rt,Ue=t.touchData.startPosition[1]-q[1],ct=Ue*Ue,We=st+ct,ot=We*xe*xe;t.touchData.singleTouchMoved||(de||V.$(":selected").unselect(["tapunselect"]),i(de,["tap","vclick"],W,{x:q[0],y:q[1]}),Z=!1,W.timeStamp-ce<=V.multiClickDebounceTime()?(Se&&clearTimeout(Se),Z=!0,ce=null,i(de,["dbltap","vdblclick"],W,{x:q[0],y:q[1]})):(Se=setTimeout(function(){Z||i(de,["onetap","voneclick"],W,{x:q[0],y:q[1]})},V.multiClickDebounceTime()),ce=W.timeStamp)),de!=null&&!t.dragData.didDrag&&de._private.selectable&&ot"u"){var ae=[],Oe=o(function(W){return{clientX:W.clientX,clientY:W.clientY,force:1,identifier:W.pointerId,pageX:W.pageX,pageY:W.pageY,radiusX:W.width/2,radiusY:W.height/2,screenX:W.screenX,screenY:W.screenY,target:W.target}},"makeTouch"),ge=o(function(W){return{event:W,touch:Oe(W)}},"makePointer"),ze=o(function(W){ae.push(ge(W))},"addPointer"),He=o(function(W){for(var de=0;de0)return H[0]}return null},"getCurveT"),g=Object.keys(p),y=0;y0?m:vme(a,s,e,r,n,i,l,u)},"intersectLine"),checkPoint:o(function(e,r,n,i,a,s,l,u){u=u==="auto"?Vp(i,a):u;var h=2*u;if(Zu(e,r,this.points,s,l,i,a-h,[0,-1],n)||Zu(e,r,this.points,s,l,i-h,a,[0,-1],n))return!0;var f=i/2+2*n,d=a/2+2*n,p=[s-f,l-d,s-f,l,s+f,l,s+f,l-d];return!!(Us(e,r,p)||$p(e,r,h,h,s+i/2-u,l+a/2-u,n)||$p(e,r,h,h,s-i/2+u,l+a/2-u,n))},"checkPoint")}};eh.registerNodeShapes=function(){var t=this.nodeShapes={},e=this;this.generateEllipse(),this.generatePolygon("triangle",gs(3,0)),this.generateRoundPolygon("round-triangle",gs(3,0)),this.generatePolygon("rectangle",gs(4,0)),t.square=t.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();{var r=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",r),this.generateRoundPolygon("round-diamond",r)}this.generatePolygon("pentagon",gs(5,0)),this.generateRoundPolygon("round-pentagon",gs(5,0)),this.generatePolygon("hexagon",gs(6,0)),this.generateRoundPolygon("round-hexagon",gs(6,0)),this.generatePolygon("heptagon",gs(7,0)),this.generateRoundPolygon("round-heptagon",gs(7,0)),this.generatePolygon("octagon",gs(8,0)),this.generateRoundPolygon("round-octagon",gs(8,0));var n=new Array(20);{var i=PP(5,0),a=PP(5,Math.PI/5),s=.5*(3-Math.sqrt(5));s*=1.57;for(var l=0;l=e.deqFastCost*C)break}else if(h){if(b>=e.deqCost*m||b>=e.deqAvgCost*p)break}else if(w>=e.deqNoDrawCost*DP)break;var T=e.deq(n,v,y);if(T.length>0)for(var E=0;E0&&(e.onDeqd(n,g),!h&&e.shouldRedraw(n,g,v,y)&&a())},"dequeue"),l=e.priority||rB;i.beforeRender(s,l(n))}},"setupDequeueingImpl")},"setupDequeueing")},RQe=function(){function t(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:bS;Mf(this,t),this.idsByKey=new Xc,this.keyForId=new Xc,this.cachesByLvl=new Xc,this.lvls=[],this.getKey=e,this.doesEleInvalidateKey=r}return o(t,"ElementTextureCacheLookup"),If(t,[{key:"getIdsFor",value:o(function(r){r==null&&ai("Can not get id list for null key");var n=this.idsByKey,i=this.idsByKey.get(r);return i||(i=new J1,n.set(r,i)),i},"getIdsFor")},{key:"addIdForKey",value:o(function(r,n){r!=null&&this.getIdsFor(r).add(n)},"addIdForKey")},{key:"deleteIdForKey",value:o(function(r,n){r!=null&&this.getIdsFor(r).delete(n)},"deleteIdForKey")},{key:"getNumberOfIdsForKey",value:o(function(r){return r==null?0:this.getIdsFor(r).size},"getNumberOfIdsForKey")},{key:"updateKeyMappingFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);this.deleteIdForKey(i,n),this.addIdForKey(a,n),this.keyForId.set(n,a)},"updateKeyMappingFor")},{key:"deleteKeyMappingFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteIdForKey(i,n),this.keyForId.delete(n)},"deleteKeyMappingFor")},{key:"keyHasChangedFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);return i!==a},"keyHasChangedFor")},{key:"isInvalid",value:o(function(r){return this.keyHasChangedFor(r)||this.doesEleInvalidateKey(r)},"isInvalid")},{key:"getCachesAt",value:o(function(r){var n=this.cachesByLvl,i=this.lvls,a=n.get(r);return a||(a=new Xc,n.set(r,a),i.push(r)),a},"getCachesAt")},{key:"getCache",value:o(function(r,n){return this.getCachesAt(n).get(r)},"getCache")},{key:"get",value:o(function(r,n){var i=this.getKey(r),a=this.getCache(i,n);return a!=null&&this.updateKeyMappingFor(r),a},"get")},{key:"getForCachedKey",value:o(function(r,n){var i=this.keyForId.get(r.id()),a=this.getCache(i,n);return a},"getForCachedKey")},{key:"hasCache",value:o(function(r,n){return this.getCachesAt(n).has(r)},"hasCache")},{key:"has",value:o(function(r,n){var i=this.getKey(r);return this.hasCache(i,n)},"has")},{key:"setCache",value:o(function(r,n,i){i.key=r,this.getCachesAt(n).set(r,i)},"setCache")},{key:"set",value:o(function(r,n,i){var a=this.getKey(r);this.setCache(a,n,i),this.updateKeyMappingFor(r)},"set")},{key:"deleteCache",value:o(function(r,n){this.getCachesAt(n).delete(r)},"deleteCache")},{key:"delete",value:o(function(r,n){var i=this.getKey(r);this.deleteCache(i,n)},"_delete")},{key:"invalidateKey",value:o(function(r){var n=this;this.lvls.forEach(function(i){return n.deleteCache(r,i)})},"invalidateKey")},{key:"invalidate",value:o(function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteKeyMappingFor(r);var a=this.doesEleInvalidateKey(r);return a&&this.invalidateKey(i),a||this.getNumberOfIdsForKey(i)===0},"invalidate")}]),t}(),I0e=25,sS=50,yS=-4,XP=3,bge=7.99,NQe=8,MQe=1024,IQe=1024,OQe=1024,PQe=.2,BQe=.8,FQe=10,$Qe=.15,zQe=.1,GQe=.9,VQe=.9,UQe=100,HQe=1,H1={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},WQe=la({getKey:null,doesEleInvalidateKey:bS,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:ume,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),Fb=o(function(e,r){var n=this;n.renderer=e,n.onDequeues=[];var i=WQe(r);rr(n,i),n.lookup=new RQe(i.getKey,i.doesEleInvalidateKey),n.setupDequeueing()},"ElementTextureCache"),qi=Fb.prototype;qi.reasons=H1;qi.getTextureQueue=function(t){var e=this;return e.eleImgCaches=e.eleImgCaches||{},e.eleImgCaches[t]=e.eleImgCaches[t]||[]};qi.getRetiredTextureQueue=function(t){var e=this,r=e.eleImgCaches.retired=e.eleImgCaches.retired||{},n=r[t]=r[t]||[];return n};qi.getElementQueue=function(){var t=this,e=t.eleCacheQueue=t.eleCacheQueue||new i4(function(r,n){return n.reqs-r.reqs});return e};qi.getElementKeyToQueue=function(){var t=this,e=t.eleKeyToCacheQueue=t.eleKeyToCacheQueue||{};return e};qi.getElement=function(t,e,r,n,i){var a=this,s=this.renderer,l=s.cy.zoom(),u=this.lookup;if(!e||e.w===0||e.h===0||isNaN(e.w)||isNaN(e.h)||!t.visible()||t.removed()||!a.allowEdgeTxrCaching&&t.isEdge()||!a.allowParentTxrCaching&&t.isParent())return null;if(n==null&&(n=Math.ceil(iB(l*r))),n=bge||n>XP)return null;var h=Math.pow(2,n),f=e.h*h,d=e.w*h,p=s.eleTextBiggerThanMin(t,h);if(!this.isVisible(t,p))return null;var m=u.get(t,n);if(m&&m.invalidated&&(m.invalidated=!1,m.texture.invalidatedWidth-=m.width),m)return m;var g;if(f<=I0e?g=I0e:f<=sS?g=sS:g=Math.ceil(f/sS)*sS,f>OQe||d>IQe)return null;var y=a.getTextureQueue(g),v=y[y.length-2],x=o(function(){return a.recycleTexture(g,d)||a.addTexture(g,d)},"addNewTxr");v||(v=y[y.length-1]),v||(v=x()),v.width-v.usedWidthn;D--)_=a.getElement(t,e,r,D,H1.downscale);I()}else return a.queueElement(t,E.level-1),E;else{var k;if(!w&&!C&&!T)for(var L=n-1;L>=yS;L--){var R=u.get(t,L);if(R){k=R;break}}if(b(k))return a.queueElement(t,n),k;v.context.translate(v.usedWidth,0),v.context.scale(h,h),this.drawElement(v.context,t,e,p,!1),v.context.scale(1/h,1/h),v.context.translate(-v.usedWidth,0)}return m={x:v.usedWidth,texture:v,level:n,scale:h,width:d,height:f,scaledLabelShown:p},v.usedWidth+=Math.ceil(d+NQe),v.eleCaches.push(m),u.set(t,n,m),a.checkTextureFullness(v),m};qi.invalidateElements=function(t){for(var e=0;e=PQe*t.width&&this.retireTexture(t)};qi.checkTextureFullness=function(t){var e=this,r=e.getTextureQueue(t.height);t.usedWidth/t.width>BQe&&t.fullnessChecks>=FQe?Df(r,t):t.fullnessChecks++};qi.retireTexture=function(t){var e=this,r=t.height,n=e.getTextureQueue(r),i=this.lookup;Df(n,t),t.retired=!0;for(var a=t.eleCaches,s=0;s=e)return s.retired=!1,s.usedWidth=0,s.invalidatedWidth=0,s.fullnessChecks=0,nB(s.eleCaches),s.context.setTransform(1,0,0,1,0,0),s.context.clearRect(0,0,s.width,s.height),Df(i,s),n.push(s),s}};qi.queueElement=function(t,e){var r=this,n=r.getElementQueue(),i=r.getElementKeyToQueue(),a=this.getKey(t),s=i[a];if(s)s.level=Math.max(s.level,e),s.eles.merge(t),s.reqs++,n.updateItem(s);else{var l={eles:t.spawn().merge(t),level:e,reqs:1,key:a};n.push(l),i[a]=l}};qi.dequeue=function(t){for(var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=[],a=e.lookup,s=0;s0;s++){var l=r.pop(),u=l.key,h=l.eles[0],f=a.hasCache(h,l.level);if(n[u]=null,f)continue;i.push(l);var d=e.getBoundingBox(h);e.getElement(h,d,t,l.level,H1.dequeue)}return i};qi.removeFromQueue=function(t){var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=this.getKey(t),a=n[i];a!=null&&(a.eles.length===1?(a.reqs=tB,r.updateItem(a),r.pop(),n[i]=null):a.eles.unmerge(t))};qi.onDequeue=function(t){this.onDequeues.push(t)};qi.offDequeue=function(t){Df(this.onDequeues,t)};qi.setupDequeueing=xge.setupDequeueing({deqRedrawThreshold:UQe,deqCost:$Qe,deqAvgCost:zQe,deqNoDrawCost:GQe,deqFastCost:VQe,deq:o(function(e,r,n){return e.dequeue(r,n)},"deq"),onDeqd:o(function(e,r){for(var n=0;n=YQe||r>_S)return null}n.validateLayersElesOrdering(r,t);var u=n.layersByLevel,h=Math.pow(2,r),f=u[r]=u[r]||[],d,p=n.levelIsComplete(r,t),m,g=o(function(){var I=o(function(O){if(n.validateLayersElesOrdering(O,t),n.levelIsComplete(O,t))return m=u[O],!0},"canUseAsTmpLvl"),D=o(function(O){if(!m)for(var M=r+O;zb<=M&&M<=_S&&!I(M);M+=O);},"checkLvls");D(1),D(-1);for(var k=f.length-1;k>=0;k--){var L=f[k];L.invalid&&Df(f,L)}},"checkTempLevels");if(!p)g();else return f;var y=o(function(){if(!d){d=Hs();for(var I=0;IP0e||L>P0e)return null;var R=k*L;if(R>tZe)return null;var O=n.makeLayer(d,r);if(D!=null){var M=f.indexOf(D)+1;f.splice(M,0,O)}else(I.insert===void 0||I.insert)&&f.unshift(O);return O},"makeLayer");if(n.skipping&&!l)return null;for(var x=null,b=t.length/qQe,w=!l,C=0;C=b||!yme(x.bb,T.boundingBox()))&&(x=v({insert:!0,after:x}),!x))return null;m||w?n.queueLayer(x,T):n.drawEleInLayer(x,T,r,e),x.eles.push(T),A[r]=x}return m||(w?null:f)};Ea.getEleLevelForLayerLevel=function(t,e){return t};Ea.drawEleInLayer=function(t,e,r,n){var i=this,a=this.renderer,s=t.context,l=e.boundingBox();l.w===0||l.h===0||!e.visible()||(r=i.getEleLevelForLayerLevel(r,n),a.setImgSmoothing(s,!1),a.drawCachedElement(s,e,null,null,r,rZe),a.setImgSmoothing(s,!0))};Ea.levelIsComplete=function(t,e){var r=this,n=r.layersByLevel[t];if(!n||n.length===0)return!1;for(var i=0,a=0;a0||s.invalid)return!1;i+=s.eles.length}return i===e.length};Ea.validateLayersElesOrdering=function(t,e){var r=this.layersByLevel[t];if(r)for(var n=0;n0){e=!0;break}}return e};Ea.invalidateElements=function(t){var e=this;t.length!==0&&(e.lastInvalidationTime=Qu(),!(t.length===0||!e.haveLayers())&&e.updateElementsInLayers(t,o(function(n,i,a){e.invalidateLayer(n)},"invalAssocLayers")))};Ea.invalidateLayer=function(t){if(this.lastInvalidationTime=Qu(),!t.invalid){var e=t.level,r=t.eles,n=this.layersByLevel[e];Df(n,t),t.elesQueue=[],t.invalid=!0,t.replacement&&(t.replacement.invalid=!0);for(var i=0;i3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,l=e._private.rscratch;if(!(a&&!e.visible())&&!(l.badLine||l.allpts==null||isNaN(l.allpts[0]))){var u;r&&(u=r,t.translate(-u.x1,-u.y1));var h=a?e.pstyle("opacity").value:1,f=a?e.pstyle("line-opacity").value:1,d=e.pstyle("curve-style").value,p=e.pstyle("line-style").value,m=e.pstyle("width").pfValue,g=e.pstyle("line-cap").value,y=e.pstyle("line-outline-width").value,v=e.pstyle("line-outline-color").value,x=h*f,b=h*f,w=o(function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;d==="straight-triangle"?(s.eleStrokeStyle(t,e,O),s.drawEdgeTrianglePath(e,t,l.allpts)):(t.lineWidth=m,t.lineCap=g,s.eleStrokeStyle(t,e,O),s.drawEdgePath(e,t,l.allpts,p),t.lineCap="butt")},"drawLine"),C=o(function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;if(t.lineWidth=m+y,t.lineCap=g,y>0)s.colorStrokeStyle(t,v[0],v[1],v[2],O);else{t.lineCap="butt";return}d==="straight-triangle"?s.drawEdgeTrianglePath(e,t,l.allpts):(s.drawEdgePath(e,t,l.allpts,p),t.lineCap="butt")},"drawLineOutline"),T=o(function(){i&&s.drawEdgeOverlay(t,e)},"drawOverlay"),E=o(function(){i&&s.drawEdgeUnderlay(t,e)},"drawUnderlay"),A=o(function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:b;s.drawArrowheads(t,e,O)},"drawArrows"),S=o(function(){s.drawElementText(t,e,null,n)},"drawText");t.lineJoin="round";var _=e.pstyle("ghost").value==="yes";if(_){var I=e.pstyle("ghost-offset-x").pfValue,D=e.pstyle("ghost-offset-y").pfValue,k=e.pstyle("ghost-opacity").value,L=x*k;t.translate(I,D),w(L),A(L),t.translate(-I,-D)}else C();E(),w(),A(),T(),S(),r&&t.translate(u.x1,u.y1)}};kge=o(function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(r,n){if(n.visible()){var i=n.pstyle("".concat(e,"-opacity")).value;if(i!==0){var a=this,s=a.usePaths(),l=n._private.rscratch,u=n.pstyle("".concat(e,"-padding")).pfValue,h=2*u,f=n.pstyle("".concat(e,"-color")).value;r.lineWidth=h,l.edgeType==="self"&&!s?r.lineCap="butt":r.lineCap="round",a.colorStrokeStyle(r,f[0],f[1],f[2],i),a.drawEdgePath(n,r,l.allpts,"solid")}}}},"drawEdgeOverlayUnderlay");th.drawEdgeOverlay=kge("overlay");th.drawEdgeUnderlay=kge("underlay");th.drawEdgePath=function(t,e,r,n){var i=t._private.rscratch,a=e,s,l=!1,u=this.usePaths(),h=t.pstyle("line-dash-pattern").pfValue,f=t.pstyle("line-dash-offset").pfValue;if(u){var d=r.join("$"),p=i.pathCacheKey&&i.pathCacheKey===d;p?(s=e=i.pathCache,l=!0):(s=e=new Path2D,i.pathCacheKey=d,i.pathCache=s)}if(a.setLineDash)switch(n){case"dotted":a.setLineDash([1,1]);break;case"dashed":a.setLineDash(h),a.lineDashOffset=f;break;case"solid":a.setLineDash([]);break}if(!l&&!i.badLine)switch(e.beginPath&&e.beginPath(),e.moveTo(r[0],r[1]),i.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var m=2;m+35&&arguments[5]!==void 0?arguments[5]:!0,s=this;if(n==null){if(a&&!s.eleTextBiggerThanMin(e))return}else if(n===!1)return;if(e.isNode()){var l=e.pstyle("label");if(!l||!l.value)return;var u=s.getLabelJustification(e);t.textAlign=u,t.textBaseline="bottom"}else{var h=e.element()._private.rscratch.badLine,f=e.pstyle("label"),d=e.pstyle("source-label"),p=e.pstyle("target-label");if(h||(!f||!f.value)&&(!d||!d.value)&&(!p||!p.value))return;t.textAlign="center",t.textBaseline="bottom"}var m=!r,g;r&&(g=r,t.translate(-g.x1,-g.y1)),i==null?(s.drawText(t,e,null,m,a),e.isEdge()&&(s.drawText(t,e,"source",m,a),s.drawText(t,e,"target",m,a))):s.drawText(t,e,i,m,a),r&&t.translate(g.x1,g.y1)};Yp.getFontCache=function(t){var e;this.fontCaches=this.fontCaches||[];for(var r=0;r2&&arguments[2]!==void 0?arguments[2]:!0,n=e.pstyle("font-style").strValue,i=e.pstyle("font-size").pfValue+"px",a=e.pstyle("font-family").strValue,s=e.pstyle("font-weight").strValue,l=r?e.effectiveOpacity()*e.pstyle("text-opacity").value:1,u=e.pstyle("text-outline-opacity").value*l,h=e.pstyle("color").value,f=e.pstyle("text-outline-color").value;t.font=n+" "+s+" "+i+" "+a,t.lineJoin="round",this.colorFillStyle(t,h[0],h[1],h[2],l),this.colorStrokeStyle(t,f[0],f[1],f[2],u)};o(RP,"roundRect");Yp.getTextAngle=function(t,e){var r,n=t._private,i=n.rscratch,a=e?e+"-":"",s=t.pstyle(a+"text-rotation");if(s.strValue==="autorotate"){var l=Gl(i,"labelAngle",e);r=t.isEdge()?l:0}else s.strValue==="none"?r=0:r=s.pfValue;return r};Yp.drawText=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=e._private,s=a.rscratch,l=i?e.effectiveOpacity():1;if(!(i&&(l===0||e.pstyle("text-opacity").value===0))){r==="main"&&(r=null);var u=Gl(s,"labelX",r),h=Gl(s,"labelY",r),f,d,p=this.getLabelText(e,r);if(p!=null&&p!==""&&!isNaN(u)&&!isNaN(h)){this.setupTextStyle(t,e,i);var m=r?r+"-":"",g=Gl(s,"labelWidth",r),y=Gl(s,"labelHeight",r),v=e.pstyle(m+"text-margin-x").pfValue,x=e.pstyle(m+"text-margin-y").pfValue,b=e.isEdge(),w=e.pstyle("text-halign").value,C=e.pstyle("text-valign").value;b&&(w="center",C="center"),u+=v,h+=x;var T;switch(n?T=this.getTextAngle(e,r):T=0,T!==0&&(f=u,d=h,t.translate(f,d),t.rotate(T),u=0,h=0),C){case"top":break;case"center":h+=y/2;break;case"bottom":h+=y;break}var E=e.pstyle("text-background-opacity").value,A=e.pstyle("text-border-opacity").value,S=e.pstyle("text-border-width").pfValue,_=e.pstyle("text-background-padding").pfValue,I=e.pstyle("text-background-shape").strValue,D=I.indexOf("round")===0,k=2;if(E>0||S>0&&A>0){var L=u-_;switch(w){case"left":L-=g;break;case"center":L-=g/2;break}var R=h-y-_,O=g+2*_,M=y+2*_;if(E>0){var B=t.fillStyle,F=e.pstyle("text-background-color").value;t.fillStyle="rgba("+F[0]+","+F[1]+","+F[2]+","+E*l+")",D?RP(t,L,R,O,M,k):t.fillRect(L,R,O,M),t.fillStyle=B}if(S>0&&A>0){var P=t.strokeStyle,z=t.lineWidth,$=e.pstyle("text-border-color").value,H=e.pstyle("text-border-style").value;if(t.strokeStyle="rgba("+$[0]+","+$[1]+","+$[2]+","+A*l+")",t.lineWidth=S,t.setLineDash)switch(H){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"double":t.lineWidth=S/4,t.setLineDash([]);break;case"solid":t.setLineDash([]);break}if(D?RP(t,L,R,O,M,k,"stroke"):t.strokeRect(L,R,O,M),H==="double"){var Q=S/2;D?RP(t,L+Q,R+Q,O-Q*2,M-Q*2,k,"stroke"):t.strokeRect(L+Q,R+Q,O-Q*2,M-Q*2)}t.setLineDash&&t.setLineDash([]),t.lineWidth=z,t.strokeStyle=P}}var j=2*e.pstyle("text-outline-width").pfValue;if(j>0&&(t.lineWidth=j),e.pstyle("text-wrap").value==="wrap"){var ie=Gl(s,"labelWrapCachedLines",r),ne=Gl(s,"labelLineHeight",r),le=g/2,he=this.getLabelJustification(e);switch(he==="auto"||(w==="left"?he==="left"?u+=-g:he==="center"&&(u+=-le):w==="center"?he==="left"?u+=-le:he==="right"&&(u+=le):w==="right"&&(he==="center"?u+=le:he==="right"&&(u+=g))),C){case"top":h-=(ie.length-1)*ne;break;case"center":case"bottom":h-=(ie.length-1)*ne;break}for(var K=0;K0&&t.strokeText(ie[K],u,h),t.fillText(ie[K],u,h),h+=ne}else j>0&&t.strokeText(p,u,h),t.fillText(p,u,h);T!==0&&(t.rotate(-T),t.translate(-f,-d))}}};ly={};ly.drawNode=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,l,u,h=e._private,f=h.rscratch,d=e.position();if(!(!Ct(d.x)||!Ct(d.y))&&!(a&&!e.visible())){var p=a?e.effectiveOpacity():1,m=s.usePaths(),g,y=!1,v=e.padding();l=e.width()+2*v,u=e.height()+2*v;var x;r&&(x=r,t.translate(-x.x1,-x.y1));for(var b=e.pstyle("background-image"),w=b.value,C=new Array(w.length),T=new Array(w.length),E=0,A=0;A0&&arguments[0]!==void 0?arguments[0]:L;s.eleFillStyle(t,e,oe)},"setupShapeColor"),K=o(function(){var oe=arguments.length>0&&arguments[0]!==void 0?arguments[0]:$;s.colorStrokeStyle(t,R[0],R[1],R[2],oe)},"setupBorderColor"),X=o(function(){var oe=arguments.length>0&&arguments[0]!==void 0?arguments[0]:ie;s.colorStrokeStyle(t,Q[0],Q[1],Q[2],oe)},"setupOutlineColor"),te=o(function(oe,V,xe,q){var pe=s.nodePathCache=s.nodePathCache||[],ve=cme(xe==="polygon"?xe+","+q.join(","):xe,""+V,""+oe,""+le),Pe=pe[ve],_e,we=!1;return Pe!=null?(_e=Pe,we=!0,f.pathCache=_e):(_e=new Path2D,pe[ve]=f.pathCache=_e),{path:_e,cacheHit:we}},"getPath"),J=e.pstyle("shape").strValue,se=e.pstyle("shape-polygon-points").pfValue;if(m){t.translate(d.x,d.y);var ue=te(l,u,J,se);g=ue.path,y=ue.cacheHit}var Z=o(function(){if(!y){var oe=d;m&&(oe={x:0,y:0}),s.nodeShapes[s.getNodeShape(e)].draw(g||t,oe.x,oe.y,l,u,le,f)}m?t.fill(g):t.fill()},"drawShape"),Se=o(function(){for(var oe=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p,V=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,xe=h.backgrounding,q=0,pe=0;pe0&&arguments[0]!==void 0?arguments[0]:!1,V=arguments.length>1&&arguments[1]!==void 0?arguments[1]:p;s.hasPie(e)&&(s.drawPie(t,e,V),oe&&(m||s.nodeShapes[s.getNodeShape(e)].draw(t,d.x,d.y,l,u,le,f)))},"drawPie"),ae=o(function(){var oe=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p,V=(D>0?D:-D)*oe,xe=D>0?0:255;D!==0&&(s.colorFillStyle(t,xe,xe,xe,V),m?t.fill(g):t.fill())},"darken"),Oe=o(function(){if(k>0){if(t.lineWidth=k,t.lineCap=B,t.lineJoin=M,t.setLineDash)switch(O){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash(P),t.lineDashOffset=z;break;case"solid":case"double":t.setLineDash([]);break}if(F!=="center"){if(t.save(),t.lineWidth*=2,F==="inside")m?t.clip(g):t.clip();else{var oe=new Path2D;oe.rect(-l/2-k,-u/2-k,l+2*k,u+2*k),oe.addPath(g),t.clip(oe,"evenodd")}m?t.stroke(g):t.stroke(),t.restore()}else m?t.stroke(g):t.stroke();if(O==="double"){t.lineWidth=k/3;var V=t.globalCompositeOperation;t.globalCompositeOperation="destination-out",m?t.stroke(g):t.stroke(),t.globalCompositeOperation=V}t.setLineDash&&t.setLineDash([])}},"drawBorder"),ge=o(function(){if(H>0){if(t.lineWidth=H,t.lineCap="butt",t.setLineDash)switch(j){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"solid":case"double":t.setLineDash([]);break}var oe=d;m&&(oe={x:0,y:0});var V=s.getNodeShape(e),xe=k;F==="inside"&&(xe=0),F==="outside"&&(xe*=2);var q=(l+xe+(H+ne))/l,pe=(u+xe+(H+ne))/u,ve=l*q,Pe=u*pe,_e=s.nodeShapes[V].points,we;if(m){var Ve=te(ve,Pe,V,_e);we=Ve.path}if(V==="ellipse")s.drawEllipsePath(we||t,oe.x,oe.y,ve,Pe);else if(["round-diamond","round-heptagon","round-hexagon","round-octagon","round-pentagon","round-polygon","round-triangle","round-tag"].includes(V)){var De=0,qe=0,at=0;V==="round-diamond"?De=(xe+ne+H)*1.4:V==="round-heptagon"?(De=(xe+ne+H)*1.075,at=-(xe/2+ne+H)/35):V==="round-hexagon"?De=(xe+ne+H)*1.12:V==="round-pentagon"?(De=(xe+ne+H)*1.13,at=-(xe/2+ne+H)/15):V==="round-tag"?(De=(xe+ne+H)*1.12,qe=(xe/2+H+ne)*.07):V==="round-triangle"&&(De=(xe+ne+H)*(Math.PI/2),at=-(xe+ne/2+H)/Math.PI),De!==0&&(q=(l+De)/l,ve=l*q,["round-hexagon","round-tag"].includes(V)||(pe=(u+De)/u,Pe=u*pe)),le=le==="auto"?bme(ve,Pe):le;for(var Rt=ve/2,st=Pe/2,Ue=le+(xe+H+ne)/2,ct=new Array(_e.length/2),We=new Array(_e.length/2),ot=0;ot<_e.length/2;ot++)ct[ot]={x:oe.x+qe+Rt*_e[ot*2],y:oe.y+at+st*_e[ot*2+1]};var Yt,bt,Mt,xt,ut=ct.length;for(bt=ct[ut-1],Yt=0;Yt0){if(i=i||n.position(),a==null||s==null){var m=n.padding();a=n.width()+2*m,s=n.height()+2*m}l.colorFillStyle(r,f[0],f[1],f[2],h),l.nodeShapes[d].draw(r,i.x,i.y,a+u*2,s+u*2,p),r.fill()}}}},"drawNodeOverlayUnderlay");ly.drawNodeOverlay=Ege("overlay");ly.drawNodeUnderlay=Ege("underlay");ly.hasPie=function(t){return t=t[0],t._private.hasPie};ly.drawPie=function(t,e,r,n){e=e[0],n=n||e.position();var i=e.cy().style(),a=e.pstyle("pie-size"),s=n.x,l=n.y,u=e.width(),h=e.height(),f=Math.min(u,h)/2,d=0,p=this.usePaths();p&&(s=0,l=0),a.units==="%"?f=f*a.pfValue:a.pfValue!==void 0&&(f=a.pfValue/2);for(var m=1;m<=i.pieBackgroundN;m++){var g=e.pstyle("pie-"+m+"-background-size").value,y=e.pstyle("pie-"+m+"-background-color").value,v=e.pstyle("pie-"+m+"-background-opacity").value*r,x=g/100;x+d>1&&(x=1-d);var b=1.5*Math.PI+2*Math.PI*d,w=2*Math.PI*x,C=b+w;g===0||d>=1||d+x>1||(t.beginPath(),t.moveTo(s,l),t.arc(s,l,f,b,C),t.closePath(),this.colorFillStyle(t,y[0],y[1],y[2],v),t.fill(),d+=x)}};ys={},dZe=100;ys.getPixelRatio=function(){var t=this.data.contexts[0];if(this.forcedPixelRatio!=null)return this.forcedPixelRatio;var e=this.cy.window(),r=t.backingStorePixelRatio||t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1;return(e.devicePixelRatio||1)/r};ys.paintCache=function(t){for(var e=this.paintCaches=this.paintCaches||[],r=!0,n,i=0;ie.minMbLowQualFrames&&(e.motionBlurPxRatio=e.mbPxRBlurry)),e.clearingMotionBlur&&(e.motionBlurPxRatio=1),e.textureDrawLastFrame&&!d&&(f[e.NODE]=!0,f[e.SELECT_BOX]=!0);var b=r.style(),w=r.zoom(),C=s!==void 0?s:w,T=r.pan(),E={x:T.x,y:T.y},A={zoom:w,pan:{x:T.x,y:T.y}},S=e.prevViewport,_=S===void 0||A.zoom!==S.zoom||A.pan.x!==S.pan.x||A.pan.y!==S.pan.y;!_&&!(y&&!g)&&(e.motionBlurPxRatio=1),l&&(E=l),C*=u,E.x*=u,E.y*=u;var I=e.getCachedZSortedEles();function D(K,X,te,J,se){var ue=K.globalCompositeOperation;K.globalCompositeOperation="destination-out",e.colorFillStyle(K,255,255,255,e.motionBlurTransparency),K.fillRect(X,te,J,se),K.globalCompositeOperation=ue}o(D,"mbclear");function k(K,X){var te,J,se,ue;!e.clearingMotionBlur&&(K===h.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]||K===h.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG])?(te={x:T.x*m,y:T.y*m},J=w*m,se=e.canvasWidth*m,ue=e.canvasHeight*m):(te=E,J=C,se=e.canvasWidth,ue=e.canvasHeight),K.setTransform(1,0,0,1,0,0),X==="motionBlur"?D(K,0,0,se,ue):!n&&(X===void 0||X)&&K.clearRect(0,0,se,ue),i||(K.translate(te.x,te.y),K.scale(J,J)),l&&K.translate(l.x,l.y),s&&K.scale(s,s)}if(o(k,"setContextTransform"),d||(e.textureDrawLastFrame=!1),d){if(e.textureDrawLastFrame=!0,!e.textureCache){e.textureCache={},e.textureCache.bb=r.mutableElements().boundingBox(),e.textureCache.texture=e.data.bufferCanvases[e.TEXTURE_BUFFER];var L=e.data.bufferContexts[e.TEXTURE_BUFFER];L.setTransform(1,0,0,1,0,0),L.clearRect(0,0,e.canvasWidth*e.textureMult,e.canvasHeight*e.textureMult),e.render({forcedContext:L,drawOnlyNodeLayer:!0,forcedPxRatio:u*e.textureMult});var A=e.textureCache.viewport={zoom:r.zoom(),pan:r.pan(),width:e.canvasWidth,height:e.canvasHeight};A.mpan={x:(0-A.pan.x)/A.zoom,y:(0-A.pan.y)/A.zoom}}f[e.DRAG]=!1,f[e.NODE]=!1;var R=h.contexts[e.NODE],O=e.textureCache.texture,A=e.textureCache.viewport;R.setTransform(1,0,0,1,0,0),p?D(R,0,0,A.width,A.height):R.clearRect(0,0,A.width,A.height);var M=b.core("outside-texture-bg-color").value,B=b.core("outside-texture-bg-opacity").value;e.colorFillStyle(R,M[0],M[1],M[2],B),R.fillRect(0,0,A.width,A.height);var w=r.zoom();k(R,!1),R.clearRect(A.mpan.x,A.mpan.y,A.width/A.zoom/u,A.height/A.zoom/u),R.drawImage(O,A.mpan.x,A.mpan.y,A.width/A.zoom/u,A.height/A.zoom/u)}else e.textureOnViewport&&!n&&(e.textureCache=null);var F=r.extent(),P=e.pinching||e.hoverData.dragging||e.swipePanning||e.data.wheelZooming||e.hoverData.draggingEles||e.cy.animated(),z=e.hideEdgesOnViewport&&P,$=[];if($[e.NODE]=!f[e.NODE]&&p&&!e.clearedForMotionBlur[e.NODE]||e.clearingMotionBlur,$[e.NODE]&&(e.clearedForMotionBlur[e.NODE]=!0),$[e.DRAG]=!f[e.DRAG]&&p&&!e.clearedForMotionBlur[e.DRAG]||e.clearingMotionBlur,$[e.DRAG]&&(e.clearedForMotionBlur[e.DRAG]=!0),f[e.NODE]||i||a||$[e.NODE]){var H=p&&!$[e.NODE]&&m!==1,R=n||(H?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]:h.contexts[e.NODE]),Q=p&&!H?"motionBlur":void 0;k(R,Q),z?e.drawCachedNodes(R,I.nondrag,u,F):e.drawLayeredElements(R,I.nondrag,u,F),e.debug&&e.drawDebugPoints(R,I.nondrag),!i&&!p&&(f[e.NODE]=!1)}if(!a&&(f[e.DRAG]||i||$[e.DRAG])){var H=p&&!$[e.DRAG]&&m!==1,R=n||(H?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG]:h.contexts[e.DRAG]);k(R,p&&!H?"motionBlur":void 0),z?e.drawCachedNodes(R,I.drag,u,F):e.drawCachedElements(R,I.drag,u,F),e.debug&&e.drawDebugPoints(R,I.drag),!i&&!p&&(f[e.DRAG]=!1)}if(this.drawSelectionRectangle(t,k),p&&m!==1){var j=h.contexts[e.NODE],ie=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_NODE],ne=h.contexts[e.DRAG],le=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_DRAG],he=o(function(X,te,J){X.setTransform(1,0,0,1,0,0),J||!x?X.clearRect(0,0,e.canvasWidth,e.canvasHeight):D(X,0,0,e.canvasWidth,e.canvasHeight);var se=m;X.drawImage(te,0,0,e.canvasWidth*se,e.canvasHeight*se,0,0,e.canvasWidth,e.canvasHeight)},"drawMotionBlur");(f[e.NODE]||$[e.NODE])&&(he(j,ie,$[e.NODE]),f[e.NODE]=!1),(f[e.DRAG]||$[e.DRAG])&&(he(ne,le,$[e.DRAG]),f[e.DRAG]=!1)}e.prevViewport=A,e.clearingMotionBlur&&(e.clearingMotionBlur=!1,e.motionBlurCleared=!0,e.motionBlur=!0),p&&(e.motionBlurTimeout=setTimeout(function(){e.motionBlurTimeout=null,e.clearedForMotionBlur[e.NODE]=!1,e.clearedForMotionBlur[e.DRAG]=!1,e.motionBlur=!1,e.clearingMotionBlur=!d,e.mbFrames=0,f[e.NODE]=!0,f[e.DRAG]=!0,e.redraw()},dZe)),n||r.emit("render")};ys.drawSelectionRectangle=function(t,e){var r=this,n=r.cy,i=r.data,a=n.style(),s=t.drawOnlyNodeLayer,l=t.drawAllLayers,u=i.canvasNeedsRedraw,h=t.forcedContext;if(r.showFps||!s&&u[r.SELECT_BOX]&&!l){var f=h||i.contexts[r.SELECT_BOX];if(e(f),r.selection[4]==1&&(r.hoverData.selecting||r.touchData.selecting)){var d=r.cy.zoom(),p=a.core("selection-box-border-width").value/d;f.lineWidth=p,f.fillStyle="rgba("+a.core("selection-box-color").value[0]+","+a.core("selection-box-color").value[1]+","+a.core("selection-box-color").value[2]+","+a.core("selection-box-opacity").value+")",f.fillRect(r.selection[0],r.selection[1],r.selection[2]-r.selection[0],r.selection[3]-r.selection[1]),p>0&&(f.strokeStyle="rgba("+a.core("selection-box-border-color").value[0]+","+a.core("selection-box-border-color").value[1]+","+a.core("selection-box-border-color").value[2]+","+a.core("selection-box-opacity").value+")",f.strokeRect(r.selection[0],r.selection[1],r.selection[2]-r.selection[0],r.selection[3]-r.selection[1]))}if(i.bgActivePosistion&&!r.hoverData.selecting){var d=r.cy.zoom(),m=i.bgActivePosistion;f.fillStyle="rgba("+a.core("active-bg-color").value[0]+","+a.core("active-bg-color").value[1]+","+a.core("active-bg-color").value[2]+","+a.core("active-bg-opacity").value+")",f.beginPath(),f.arc(m.x,m.y,a.core("active-bg-size").pfValue/d,0,2*Math.PI),f.fill()}var g=r.lastRedrawTime;if(r.showFps&&g){g=Math.round(g);var y=Math.round(1e3/g),v="1 frame = "+g+" ms = "+y+" fps";if(f.setTransform(1,0,0,1,0,0),f.fillStyle="rgba(255, 0, 0, 0.75)",f.strokeStyle="rgba(255, 0, 0, 0.75)",f.font="30px Arial",!Nb){var x=f.measureText(v);Nb=x.actualBoundingBoxAscent}f.fillText(v,0,Nb);var b=60;f.strokeRect(0,Nb+10,250,20),f.fillRect(0,Nb+10,250*Math.min(y/b,1),20)}l||(u[r.SELECT_BOX]=!1)}};o(z0e,"compileShader");o(pZe,"createProgram");o(mZe,"createTextureCanvas");o(wB,"getEffectivePanZoom");o(NP,"modelToRenderedPosition");o(oS,"toWebGLColor");o(lS,"indexToVec4");o(gZe,"vec4ToIndex");o(yZe,"createTexture");o(Sge,"getTypeInfo");o(Cge,"createTypedArray");o(vZe,"createTypedArrayView");o(xZe,"createBufferStaticDraw");o(po,"createBufferDynamicDraw");o(bZe,"createPickingFrameBuffer");G0e=typeof Float32Array<"u"?Float32Array:Array;Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)});o(Gb,"create");o(Age,"identity");o(wZe,"multiply");o(DS,"translate");o(_ge,"rotate");o(TB,"scale");o(TZe,"projection");Vb={SCREEN:{name:"screen",screen:!0},PICKING:{name:"picking",picking:!0}},Mb=la({getKey:null,drawElement:null,getBoundingBox:null,getRotation:null,getRotationPoint:null,getRotationOffset:null,isVisible:null,getPadding:null}),kZe=function(){function t(e,r){Mf(this,t),this.debugID=Math.floor(Math.random()*1e4),this.r=e,this.atlasSize=r.webglTexSize,this.rows=r.webglTexRows,this.enableWrapping=r.enableWrapping,this.texHeight=Math.floor(this.atlasSize/this.rows),this.maxTexWidth=this.atlasSize,this.texture=null,this.canvas=null,this.needsBuffer=!0,this.freePointer={x:0,row:0},this.keyToLocation=new Map,this.canvas=r.createTextureCanvas(e,this.atlasSize,this.atlasSize),this.scratch=r.createTextureCanvas(e,this.atlasSize,this.texHeight,"scratch")}return o(t,"Atlas"),If(t,[{key:"getKeys",value:o(function(){return new Set(this.keyToLocation.keys())},"getKeys")},{key:"getScale",value:o(function(r){var n=r.w,i=r.h,a=this.texHeight,s=this.maxTexWidth,l=a/i,u=n*l,h=i*l;return u>s&&(l=s/n,u=n*l,h=i*l),{scale:l,texW:u,texH:h}},"getScale")},{key:"draw",value:o(function(r,n,i){var a=this,s=this.atlasSize,l=this.rows,u=this.texHeight,h=this.getScale(n),f=h.scale,d=h.texW,p=h.texH,m=[null,null],g=o(function(w,C){if(i&&C){var T=C.context,E=w.x,A=w.row,S=E,_=u*A;T.save(),T.translate(S,_),T.scale(f,f),i(T,n),T.restore()}},"drawAt"),y=o(function(){g(a.freePointer,a.canvas),m[0]={x:a.freePointer.x,y:a.freePointer.row*u,w:d,h:p},m[1]={x:a.freePointer.x+d,y:a.freePointer.row*u,w:0,h:p},a.freePointer.x+=d,a.freePointer.x==s&&(a.freePointer.x=0,a.freePointer.row++)},"drawNormal"),v=o(function(){var w=a.scratch,C=a.canvas;w.clear(),g({x:0,row:0},w);var T=s-a.freePointer.x,E=d-T,A=u;{var S=a.freePointer.x,_=a.freePointer.row*u,I=T;C.context.drawImage(w,0,0,I,A,S,_,I,A),m[0]={x:S,y:_,w:I,h:p}}{var D=T,k=(a.freePointer.row+1)*u,L=E;C&&C.context.drawImage(w,D,0,L,A,0,k,L,A),m[1]={x:0,y:k,w:L,h:p}}a.freePointer.x=E,a.freePointer.row++},"drawWrapped"),x=o(function(){a.freePointer.x=0,a.freePointer.row++},"moveToStartOfNextRow");if(this.freePointer.x+d<=s)y();else{if(this.freePointer.row>=l-1)return!1;this.freePointer.x===s?(x(),y()):this.enableWrapping?v():(x(),y())}return this.keyToLocation.set(r,m),this.needsBuffer=!0,m},"draw")},{key:"getOffsets",value:o(function(r){return this.keyToLocation.get(r)},"getOffsets")},{key:"isEmpty",value:o(function(){return this.freePointer.x===0&&this.freePointer.row===0},"isEmpty")},{key:"canFit",value:o(function(r){var n=this.atlasSize,i=this.rows,a=this.getScale(r),s=a.texW;return this.freePointer.x+s>n?this.freePointer.row1&&arguments[1]!==void 0?arguments[1]:{},i=n.forceRedraw,a=i===void 0?!1:i,s=n.filterEle,l=s===void 0?function(){return!0}:s,u=n.filterType,h=u===void 0?function(){return!0}:u,f=!1,d=mo(r),p;try{for(d.s();!(p=d.n()).done;){var m=p.value;if(l(m)){var g=m.id(),y=mo(this.getRenderTypes()),v;try{for(y.s();!(v=y.n()).done;){var x=v.value;if(h(x.type)){var b=x.getKey(m);a?(x.atlasCollection.deleteKey(g,b),x.atlasCollection.styleKeyNeedsRedraw.add(b),f=!0):f|=x.atlasCollection.checkKeyIsInvalid(g,b)}}}catch(w){y.e(w)}finally{y.f()}}}}catch(w){d.e(w)}finally{d.f()}return f},"invalidate")},{key:"gc",value:o(function(){var r=mo(this.getRenderTypes()),n;try{for(r.s();!(n=r.n()).done;){var i=n.value;i.atlasCollection.gc()}}catch(a){r.e(a)}finally{r.f()}},"gc")},{key:"isRenderable",value:o(function(r,n){var i=this.getRenderTypeOpts(n);return i&&i.isVisible(r)},"isRenderable")},{key:"startBatch",value:o(function(){this.batchAtlases=[]},"startBatch")},{key:"getAtlasCount",value:o(function(){return this.batchAtlases.length},"getAtlasCount")},{key:"getAtlases",value:o(function(){return this.batchAtlases},"getAtlases")},{key:"getOrCreateAtlas",value:o(function(r,n,i){var a=this.renderTypes.get(i),s=a.getKey(r),l=r.id();return a.atlasCollection.draw(l,s,n,function(u){a.drawElement(u,r,n,!0,!0)})},"getOrCreateAtlas")},{key:"getAtlasIndexForBatch",value:o(function(r){var n=this.batchAtlases.indexOf(r);if(n<0){if(this.batchAtlases.length===this.maxAtlasesPerBatch)return;this.batchAtlases.push(r),n=this.batchAtlases.length-1}return n},"getAtlasIndexForBatch")},{key:"getIndexArray",value:o(function(){return Array.from({length:this.maxAtlases},function(r,n){return n})},"getIndexArray")},{key:"getAtlasInfo",value:o(function(r,n){var i=this.renderTypes.get(n),a=i.getBoundingBox(r),s=this.getOrCreateAtlas(r,a,n),l=this.getAtlasIndexForBatch(s);if(l!==void 0){var u=i.getKey(r),h=s.getOffsets(u),f=_i(h,2),d=f[0],p=f[1];return{atlasID:l,tex:d,tex1:d,tex2:p,bb:a,type:n,styleKey:u}}},"getAtlasInfo")},{key:"canAddToCurrentBatch",value:o(function(r,n){if(this.batchAtlases.length===this.maxAtlasesPerBatch){var i=this.renderTypes.get(n),a=i.getKey(r),s=i.atlasCollection.getAtlas(a);return s&&this.batchAtlases.includes(s)}return!0},"canAddToCurrentBatch")},{key:"setTransformMatrix",value:o(function(r,n,i){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,s=n.bb,l=n.type,u=n.tex1,h=n.tex2,f=this.getRenderTypeOpts(l),d=f.getPadding?f.getPadding(i):0,p=u.w/(u.w+h.w);a||(p=1-p);var m=this.getAdjustedBB(s,d,a,p),g,y;Age(r);var v=f.getRotation?f.getRotation(i):0;if(v!==0){var x=f.getRotationPoint(i),b=x.x,w=x.y;DS(r,r,[b,w]),_ge(r,r,v);var C=f.getRotationOffset(i);g=C.x+m.xOffset,y=C.y}else g=m.x1,y=m.y1;DS(r,r,[g,y]),TB(r,r,[m.w,m.h])},"setTransformMatrix")},{key:"getTransformMatrix",value:o(function(r,n){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,a=Gb();return this.setTransformMatrix(a,r,n,i),a},"getTransformMatrix")},{key:"getAdjustedBB",value:o(function(r,n,i,a){var s=r.x1,l=r.y1,u=r.w,h=r.h;n&&(s-=n,l-=n,u+=2*n,h+=2*n);var f=0,d=u*a;return i&&a<1?u=d:!i&&a<1&&(f=u-d,s+=f,u=d),{x1:s,y1:l,w:u,h,xOffset:f}},"getAdjustedBB")},{key:"getDebugInfo",value:o(function(){var r=[],n=mo(this.renderTypes),i;try{for(n.s();!(i=n.n()).done;){var a=_i(i.value,2),s=a[0],l=a[1],u=l.atlasCollection.getCounts(),h=u.keyCount,f=u.atlasCount;r.push({type:s,keyCount:h,atlasCount:f})}}catch(d){n.e(d)}finally{n.f()}return r},"getDebugInfo")}]),t}(),MP=0,V0e=1,U0e=2,IP=3,AZe=function(){function t(e,r,n){Mf(this,t),this.r=e,this.gl=r,this.maxInstances=n.webglBatchSize,this.maxAtlases=n.webglTexPerBatch,this.atlasSize=n.webglTexSize,this.bgColor=n.bgColor,n.enableWrapping=!0,n.createTextureCanvas=mZe,this.atlasManager=new CZe(e,n),this.program=this.createShaderProgram(Vb.SCREEN),this.pickingProgram=this.createShaderProgram(Vb.PICKING),this.vao=this.createVAO(),this.debugInfo=[]}return o(t,"ElementDrawingWebGL"),If(t,[{key:"addTextureRenderType",value:o(function(r,n){this.atlasManager.addRenderType(r,n)},"addTextureRenderType")},{key:"invalidate",value:o(function(r){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=n.type,a=this.atlasManager;return i?a.invalidate(r,{filterType:o(function(l){return l===i},"filterType"),forceRedraw:!0}):a.invalidate(r)},"invalidate")},{key:"gc",value:o(function(){this.atlasManager.gc()},"gc")},{key:"createShaderProgram",value:o(function(r){var n=this.gl,i=`#version 300 es + precision highp float; + + uniform mat3 uPanZoomMatrix; + uniform int uAtlasSize; + + // instanced + in vec2 aPosition; + + // what are we rendering? + in int aVertType; + + // for picking + in vec4 aIndex; + + // For textures + in int aAtlasId; // which shader unit/atlas to use + in vec4 aTex1; // x/y/w/h of texture in atlas + in vec4 aTex2; + + // for any transforms that are needed + in vec4 aScaleRotate1; // vectors use fewer attributes than matrices + in vec2 aTranslate1; + in vec4 aScaleRotate2; + in vec2 aTranslate2; + + // for edges + in vec4 aPointAPointB; + in vec4 aPointCPointD; + in float aLineWidth; + in vec4 aEdgeColor; + + out vec2 vTexCoord; + out vec4 vEdgeColor; + flat out int vAtlasId; + flat out vec4 vIndex; + flat out int vVertType; + + void main(void) { + int vid = gl_VertexID; + vec2 position = aPosition; + + if(aVertType == `.concat(MP,`) { + float texX; + float texY; + float texW; + float texH; + mat3 texMatrix; + + int vid = gl_VertexID; + if(vid <= 5) { + texX = aTex1.x; + texY = aTex1.y; + texW = aTex1.z; + texH = aTex1.w; + texMatrix = mat3( + vec3(aScaleRotate1.xy, 0.0), + vec3(aScaleRotate2.zw, 0.0), + vec3(aTranslate1, 1.0) + ); + } else { + texX = aTex2.x; + texY = aTex2.y; + texW = aTex2.z; + texH = aTex2.w; + texMatrix = mat3( + vec3(aScaleRotate2.xy, 0.0), + vec3(aScaleRotate2.zw, 0.0), + vec3(aTranslate2, 1.0) + ); + } + + if(vid == 1 || vid == 2 || vid == 4 || vid == 7 || vid == 8 || vid == 10) { + texX += texW; + } + if(vid == 2 || vid == 4 || vid == 5 || vid == 8 || vid == 10 || vid == 11) { + texY += texH; + } + + float d = float(uAtlasSize); + vTexCoord = vec2(texX / d, texY / d); // tex coords must be between 0 and 1 + + gl_Position = vec4(uPanZoomMatrix * texMatrix * vec3(position, 1.0), 1.0); + } + else if(aVertType == `).concat(V0e,` && vid < 6) { + vec2 source = aPointAPointB.xy; + vec2 target = aPointAPointB.zw; + + // adjust the geometry so that the line is centered on the edge + position.y = position.y - 0.5; + + vec2 xBasis = target - source; + vec2 yBasis = normalize(vec2(-xBasis.y, xBasis.x)); + vec2 point = source + xBasis * position.x + yBasis * aLineWidth * position.y; + + gl_Position = vec4(uPanZoomMatrix * vec3(point, 1.0), 1.0); + vEdgeColor = aEdgeColor; + } + else if(aVertType == `).concat(U0e,` && vid < 6) { + vec2 pointA = aPointAPointB.xy; + vec2 pointB = aPointAPointB.zw; + vec2 pointC = aPointCPointD.xy; + vec2 pointD = aPointCPointD.zw; + + // adjust the geometry so that the line is centered on the edge + position.y = position.y - 0.5; + + vec2 p0 = pointA; + vec2 p1 = pointB; + vec2 p2 = pointC; + vec2 pos = position; + if(position.x == 1.0) { + p0 = pointD; + p1 = pointC; + p2 = pointB; + pos = vec2(0.0, -position.y); + } + + vec2 p01 = p1 - p0; + vec2 p12 = p2 - p1; + vec2 p21 = p1 - p2; + + // Find the normal vector. + vec2 tangent = normalize(normalize(p12) + normalize(p01)); + vec2 normal = vec2(-tangent.y, tangent.x); + + // Find the vector perpendicular to p0 -> p1. + vec2 p01Norm = normalize(vec2(-p01.y, p01.x)); + + // Determine the bend direction. + float sigma = sign(dot(p01 + p21, normal)); + float width = aLineWidth; + + if(sign(pos.y) == -sigma) { + // This is an intersecting vertex. Adjust the position so that there's no overlap. + vec2 point = 0.5 * width * normal * -sigma / dot(normal, p01Norm); + gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); + } else { + // This is a non-intersecting vertex. Treat it like a mitre join. + vec2 point = 0.5 * width * normal * sigma * dot(normal, p01Norm); + gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); + } + + vEdgeColor = aEdgeColor; + } + else if(aVertType == `).concat(IP,` && vid < 3) { + // massage the first triangle into an edge arrow + if(vid == 0) + position = vec2(-0.15, -0.3); + if(vid == 1) + position = vec2( 0.0, 0.0); + if(vid == 2) + position = vec2( 0.15, -0.3); + + mat3 transform = mat3( + vec3(aScaleRotate1.xy, 0.0), + vec3(aScaleRotate1.zw, 0.0), + vec3(aTranslate1, 1.0) + ); + gl_Position = vec4(uPanZoomMatrix * transform * vec3(position, 1.0), 1.0); + vEdgeColor = aEdgeColor; + } else { + gl_Position = vec4(2.0, 0.0, 0.0, 1.0); // discard vertex by putting it outside webgl clip space + } + + vAtlasId = aAtlasId; + vIndex = aIndex; + vVertType = aVertType; + } + `),a=this.atlasManager.getIndexArray(),s=`#version 300 es + precision highp float; + + // define texture unit for each node in the batch + `.concat(a.map(function(h){return"uniform sampler2D uTexture".concat(h,";")}).join(` + `),` + + uniform vec4 uBGColor; + + in vec2 vTexCoord; + in vec4 vEdgeColor; + flat in int vAtlasId; + flat in vec4 vIndex; + flat in int vVertType; + + out vec4 outColor; + + void main(void) { + if(vVertType == `).concat(MP,`) { + `).concat(a.map(function(h){return"if(vAtlasId == ".concat(h,") outColor = texture(uTexture").concat(h,", vTexCoord);")}).join(` + else `),` + } else if(vVertType == `).concat(IP,`) { + // blend arrow color with background (using premultiplied alpha) + outColor.rgb = vEdgeColor.rgb + (uBGColor.rgb * (1.0 - vEdgeColor.a)); + outColor.a = 1.0; // make opaque, masks out line under arrow + } else { + outColor = vEdgeColor; + } + + `).concat(r.picking?`if(outColor.a == 0.0) discard; + else outColor = vIndex;`:"",` + } + `),l=pZe(n,i,s);l.aPosition=n.getAttribLocation(l,"aPosition"),l.aIndex=n.getAttribLocation(l,"aIndex"),l.aVertType=n.getAttribLocation(l,"aVertType"),l.aAtlasId=n.getAttribLocation(l,"aAtlasId"),l.aTex1=n.getAttribLocation(l,"aTex1"),l.aTex2=n.getAttribLocation(l,"aTex2"),l.aScaleRotate1=n.getAttribLocation(l,"aScaleRotate1"),l.aTranslate1=n.getAttribLocation(l,"aTranslate1"),l.aScaleRotate2=n.getAttribLocation(l,"aScaleRotate2"),l.aTranslate2=n.getAttribLocation(l,"aTranslate2"),l.aPointAPointB=n.getAttribLocation(l,"aPointAPointB"),l.aPointCPointD=n.getAttribLocation(l,"aPointCPointD"),l.aLineWidth=n.getAttribLocation(l,"aLineWidth"),l.aEdgeColor=n.getAttribLocation(l,"aEdgeColor"),l.uPanZoomMatrix=n.getUniformLocation(l,"uPanZoomMatrix"),l.uAtlasSize=n.getUniformLocation(l,"uAtlasSize"),l.uBGColor=n.getUniformLocation(l,"uBGColor"),l.uTextures=[];for(var u=0;u2&&arguments[2]!==void 0?arguments[2]:Vb.SCREEN;this.panZoomMatrix=r,this.debugInfo=n,this.renderTarget=i,this.startBatch()},"startFrame")},{key:"startBatch",value:o(function(){this.instanceCount=0,this.atlasManager.startBatch()},"startBatch")},{key:"endFrame",value:o(function(){this.endBatch()},"endFrame")},{key:"getTempMatrix",value:o(function(){return this.tempMatrix=this.tempMatrix||Gb()},"getTempMatrix")},{key:"drawTexture",value:o(function(r,n,i){var a=this.atlasManager;if(a.isRenderable(r,i)){a.canAddToCurrentBatch(r,i)||this.endBatch();var s=this.instanceCount;this.vertTypeBuffer.getView(s)[0]=MP;var l=this.indexBuffer.getView(s);lS(n,l);var u=a.getAtlasInfo(r,i,u),h=u.atlasID,f=u.tex1,d=u.tex2,p=this.atlasIdBuffer.getView(s);p[0]=h;var m=this.tex1Buffer.getView(s);m[0]=f.x,m[1]=f.y,m[2]=f.w,m[3]=f.h;var g=this.tex2Buffer.getView(s);g[0]=d.x,g[1]=d.y,g[2]=d.w,g[3]=d.h;for(var y=this.getTempMatrix(),v=0,x=[1,2];v=this.maxInstances&&this.endBatch()}},"drawTexture")},{key:"drawEdgeArrow",value:o(function(r,n,i){var a=r._private.rscratch,s,l,u;if(i==="source"?(s=a.arrowStartX,l=a.arrowStartY,u=a.srcArrowAngle):(s=a.arrowEndX,l=a.arrowEndY,u=a.tgtArrowAngle),!(isNaN(s)||s==null||isNaN(l)||l==null||isNaN(u)||u==null)){var h=r.pstyle(i+"-arrow-shape").value;if(h!=="none"){var f=r.pstyle(i+"-arrow-color").value,d=r.pstyle("opacity").value,p=r.pstyle("line-opacity").value,m=d*p,g=r.pstyle("width").pfValue,y=r.pstyle("arrow-scale").value,v=this.r.getArrowWidth(g,y),x=this.getTempMatrix();Age(x),DS(x,x,[s,l]),TB(x,x,[v,v]),_ge(x,x,u);var b=this.instanceCount;this.vertTypeBuffer.getView(b)[0]=IP;var w=this.indexBuffer.getView(b);lS(n,w);var C=this.edgeColorBuffer.getView(b);oS(f,m,C);var T=this.scaleRotate1Buffer.getView(b);T[0]=x[0],T[1]=x[1],T[2]=x[3],T[3]=x[4];var E=this.translate1Buffer.getView(b);E[0]=x[6],E[1]=x[7],this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}},"drawEdgeArrow")},{key:"drawEdgeLine",value:o(function(r,n){var i=r.pstyle("opacity").value,a=r.pstyle("line-opacity").value,s=r.pstyle("width").pfValue,l=r.pstyle("line-color").value,u=i*a,h=this.getEdgePoints(r);if(h.length/2+this.instanceCount>this.maxInstances&&this.endBatch(),h.length==4){var f=this.instanceCount;this.vertTypeBuffer.getView(f)[0]=V0e;var d=this.indexBuffer.getView(f);lS(n,d);var p=this.edgeColorBuffer.getView(f);oS(l,u,p);var m=this.lineWidthBuffer.getView(f);m[0]=s;var g=this.pointAPointBBuffer.getView(f);g[0]=h[0],g[1]=h[1],g[2]=h[2],g[3]=h[3],this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}else for(var y=0;y=this.maxInstances&&this.endBatch()}},"drawEdgeLine")},{key:"getEdgePoints",value:o(function(r){var n=r._private.rscratch,i=n.allpts;if(i.length==4)return i;var a=this.getNumSegments(r);return this.getCurveSegmentPoints(i,a)},"getEdgePoints")},{key:"getNumSegments",value:o(function(r){var n=15;return Math.min(Math.max(n,5),this.maxInstances)},"getNumSegments")},{key:"getCurveSegmentPoints",value:o(function(r,n){if(r.length==4)return r;for(var i=Array((n+1)*2),a=0;a<=n;a++)if(a==0)i[0]=r[0],i[1]=r[1];else if(a==n)i[a*2]=r[r.length-2],i[a*2+1]=r[r.length-1];else{var s=a/n;this.setCurvePoint(r,s,i,a*2)}return i},"getCurveSegmentPoints")},{key:"setCurvePoint",value:o(function(r,n,i,a){if(r.length<=2)i[a]=r[0],i[a+1]=r[1];else{for(var s=Array(r.length-2),l=0;l0},"isVisible")},{key:"getStyle",value:o(function(r,n){var i=n.pstyle("".concat(r,"-opacity")).value,a=n.pstyle("".concat(r,"-color")).value,s=n.pstyle("".concat(r,"-shape")).value;return{opacity:i,color:a,shape:s}},"getStyle")},{key:"getPadding",value:o(function(r,n){return n.pstyle("".concat(r,"-padding")).pfValue},"getPadding")},{key:"draw",value:o(function(r,n,i,a){if(this.isVisible(r,i)){var s=this.r,l=a.w,u=a.h,h=l/2,f=u/2,d=this.getStyle(r,i),p=d.shape,m=d.color,g=d.opacity;n.save(),n.fillStyle=H0e(m,g),p==="round-rectangle"||p==="roundrectangle"?s.drawRoundRectanglePath(n,h,f,l,u,"auto"):p==="ellipse"&&s.drawEllipsePath(n,h,f,l,u),n.fill(),n.restore()}},"draw")}]),t}();o(DZe,"getBGColor");Dge={};Dge.initWebgl=function(t,e){var r=this,n=r.data.contexts[r.WEBGL],i=t.cy.container();t.bgColor=DZe(i),t.webglTexSize=Math.min(t.webglTexSize,n.getParameter(n.MAX_TEXTURE_SIZE)),t.webglTexRows=Math.min(t.webglTexRows,54),t.webglBatchSize=Math.min(t.webglBatchSize,16384),t.webglTexPerBatch=Math.min(t.webglTexPerBatch,n.getParameter(n.MAX_TEXTURE_IMAGE_UNITS)),r.webglDebug=t.webglDebug,r.webglDebugShowAtlases=t.webglDebugShowAtlases,console.log("max texture units",n.getParameter(n.MAX_TEXTURE_IMAGE_UNITS)),console.log("max texture size",n.getParameter(n.MAX_TEXTURE_SIZE)),console.log("webgl options",t),r.pickingFrameBuffer=bZe(n),r.pickingFrameBuffer.needsDraw=!0;var a=o(function(f){return r.getTextAngle(f,null)},"getLabelRotation"),s=o(function(f){var d=f.pstyle("label");return d&&d.value},"isLabelVisible");r.eleDrawing=new AZe(r,n,t);var l=new _Ze(r);r.eleDrawing.addTextureRenderType("node-body",Mb({getKey:e.getStyleKey,getBoundingBox:e.getElementBox,drawElement:e.drawElement,isVisible:o(function(f){return f.visible()},"isVisible")})),r.eleDrawing.addTextureRenderType("node-label",Mb({getKey:e.getLabelKey,getBoundingBox:e.getLabelBox,drawElement:e.drawLabel,getRotation:a,getRotationPoint:e.getLabelRotationPoint,getRotationOffset:e.getLabelRotationOffset,isVisible:s})),r.eleDrawing.addTextureRenderType("node-overlay",Mb({getBoundingBox:e.getElementBox,getKey:o(function(f){return l.getStyleKey("overlay",f)},"getKey"),drawElement:o(function(f,d,p){return l.draw("overlay",f,d,p)},"drawElement"),isVisible:o(function(f){return l.isVisible("overlay",f)},"isVisible"),getPadding:o(function(f){return l.getPadding("overlay",f)},"getPadding")})),r.eleDrawing.addTextureRenderType("node-underlay",Mb({getBoundingBox:e.getElementBox,getKey:o(function(f){return l.getStyleKey("underlay",f)},"getKey"),drawElement:o(function(f,d,p){return l.draw("underlay",f,d,p)},"drawElement"),isVisible:o(function(f){return l.isVisible("underlay",f)},"isVisible"),getPadding:o(function(f){return l.getPadding("underlay",f)},"getPadding")})),r.eleDrawing.addTextureRenderType("edge-label",Mb({getKey:e.getLabelKey,getBoundingBox:e.getLabelBox,drawElement:e.drawLabel,getRotation:a,getRotationPoint:e.getLabelRotationPoint,getRotationOffset:e.getLabelRotationOffset,isVisible:s}));var u=n4(function(){console.log("garbage collect flag set"),r.data.gc=!0},1e4);r.onUpdateEleCalcs(function(h,f){var d=!1;f&&f.length>0&&(d|=r.eleDrawing.invalidate(f)),d&&u()}),LZe(r)};o(LZe,"overrideCanvasRendererFunctions");o(RZe,"clearWebgl");o(NZe,"clearCanvas");o(MZe,"createPanZoomMatrix");o(Lge,"setContextTransform");o(IZe,"drawSelectionRectangle");o(OZe,"drawAxes");o(PZe,"drawAtlases");o(BZe,"getPickingIndexes");o(FZe,"findNearestElementsWebgl");o(Rge,"renderWebgl");Pf={};Pf.drawPolygonPath=function(t,e,r,n,i,a){var s=n/2,l=i/2;t.beginPath&&t.beginPath(),t.moveTo(e+s*a[0],r+l*a[1]);for(var u=1;u0&&s>0){m.clearRect(0,0,a,s),m.globalCompositeOperation="source-over";var g=this.getCachedZSortedEles();if(t.full)m.translate(-n.x1*h,-n.y1*h),m.scale(h,h),this.drawElements(m,g),m.scale(1/h,1/h),m.translate(n.x1*h,n.y1*h);else{var y=e.pan(),v={x:y.x*h,y:y.y*h};h*=e.zoom(),m.translate(v.x,v.y),m.scale(h,h),this.drawElements(m,g),m.scale(1/h,1/h),m.translate(-v.x,-v.y)}t.bg&&(m.globalCompositeOperation="destination-over",m.fillStyle=t.bg,m.rect(0,0,a,s),m.fill())}return p};o($Ze,"b64ToBlob");o(Y0e,"b64UriToB64");o(Mge,"output");c4.png=function(t){return Mge(t,this.bufferCanvasImage(t),"image/png")};c4.jpg=function(t){return Mge(t,this.bufferCanvasImage(t),"image/jpeg")};Ige={};Ige.nodeShapeImpl=function(t,e,r,n,i,a,s,l){switch(t){case"ellipse":return this.drawEllipsePath(e,r,n,i,a);case"polygon":return this.drawPolygonPath(e,r,n,i,a,s);case"round-polygon":return this.drawRoundPolygonPath(e,r,n,i,a,s,l);case"roundrectangle":case"round-rectangle":return this.drawRoundRectanglePath(e,r,n,i,a,l);case"cutrectangle":case"cut-rectangle":return this.drawCutRectanglePath(e,r,n,i,a,s,l);case"bottomroundrectangle":case"bottom-round-rectangle":return this.drawBottomRoundRectanglePath(e,r,n,i,a,l);case"barrel":return this.drawBarrelPath(e,r,n,i,a)}};zZe=Oge,Er=Oge.prototype;Er.CANVAS_LAYERS=3;Er.SELECT_BOX=0;Er.DRAG=1;Er.NODE=2;Er.WEBGL=3;Er.CANVAS_TYPES=["2d","2d","2d","webgl2"];Er.BUFFER_COUNT=3;Er.TEXTURE_BUFFER=0;Er.MOTIONBLUR_BUFFER_NODE=1;Er.MOTIONBLUR_BUFFER_DRAG=2;o(Oge,"CanvasRenderer");Er.redrawHint=function(t,e){var r=this;switch(t){case"eles":r.data.canvasNeedsRedraw[Er.NODE]=e;break;case"drag":r.data.canvasNeedsRedraw[Er.DRAG]=e;break;case"select":r.data.canvasNeedsRedraw[Er.SELECT_BOX]=e;break;case"gc":r.data.gc=!0;break}};GZe=typeof Path2D<"u";Er.path2dEnabled=function(t){if(t===void 0)return this.pathsEnabled;this.pathsEnabled=!!t};Er.usePaths=function(){return GZe&&this.pathsEnabled};Er.setImgSmoothing=function(t,e){t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled=e:(t.webkitImageSmoothingEnabled=e,t.mozImageSmoothingEnabled=e,t.msImageSmoothingEnabled=e)};Er.getImgSmoothing=function(t){return t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled:t.webkitImageSmoothingEnabled||t.mozImageSmoothingEnabled||t.msImageSmoothingEnabled};Er.makeOffscreenCanvas=function(t,e){var r;if((typeof OffscreenCanvas>"u"?"undefined":Wi(OffscreenCanvas))!=="undefined")r=new OffscreenCanvas(t,e);else{var n=this.cy.window(),i=n.document;r=i.createElement("canvas"),r.width=t,r.height=e}return r};[Tge,Qc,th,bB,Yp,ly,ys,Dge,Pf,c4,Ige].forEach(function(t){rr(Er,t)});VZe=[{name:"null",impl:lge},{name:"base",impl:vge},{name:"canvas",impl:zZe}],UZe=[{type:"layout",extensions:SQe},{type:"renderer",extensions:VZe}],Pge={},Bge={};o(Fge,"setExtension");o($ge,"getExtension");o(HZe,"setModule");o(WZe,"getModule");QP=o(function(){if(arguments.length===2)return $ge.apply(null,arguments);if(arguments.length===3)return Fge.apply(null,arguments);if(arguments.length===4)return WZe.apply(null,arguments);if(arguments.length===5)return HZe.apply(null,arguments);ai("Invalid extension access syntax")},"extension");Jb.prototype.extension=QP;UZe.forEach(function(t){t.extensions.forEach(function(e){Fge(t.type,e.name,e.impl)})});zge=o(function t(){if(!(this instanceof t))return new t;this.length=0},"Stylesheet"),Wp=zge.prototype;Wp.instanceString=function(){return"stylesheet"};Wp.selector=function(t){var e=this.length++;return this[e]={selector:t,properties:[]},this};Wp.css=function(t,e){var r=this.length-1;if(Zt(t))this[r].properties.push({name:t,value:e});else if(Ur(t))for(var n=t,i=Object.keys(n),a=0;a{"use strict";o(function(e,r){typeof u4=="object"&&typeof EB=="object"?EB.exports=r():typeof define=="function"&&define.amd?define([],r):typeof u4=="object"?u4.layoutBase=r():e.layoutBase=r()},"webpackUniversalModuleDefinition")(u4,function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return o(r,"__webpack_require__"),r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?o(function(){return n.default},"getDefault"):o(function(){return n},"getModuleExports");return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=26)}([function(t,e,r){"use strict";function n(){}o(n,"LayoutConstants"),n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(u,h,f){n.call(this,f),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=f,this.bendpoints=[],this.source=u,this.target=h}o(s,"LEdge"),s.prototype=Object.create(n.prototype);for(var l in n)s[l]=n[l];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(u){if(this.source===u)return this.target;if(this.target===u)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(u,h){for(var f=this.getOtherEnd(u),d=h.getGraphManager().getRoot();;){if(f.getOwner()==h)return f;if(f.getOwner()==d)break;f=f.getOwner().getParent()}return null},s.prototype.updateLength=function(){var u=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),u),this.isOverlapingSourceAndTarget||(this.lengthX=u[0]-u[2],this.lengthY=u[1]-u[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s},function(t,e,r){"use strict";function n(i){this.vGraphObject=i}o(n,"LGraphObject"),t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),l=r(16),u=r(4);function h(d,p,m,g){m==null&&g==null&&(g=p),n.call(this,g),d.graphManager!=null&&(d=d.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=d,m!=null&&p!=null?this.rect=new a(p.x,p.y,m.width,m.height):this.rect=new a}o(h,"LNode"),h.prototype=Object.create(n.prototype);for(var f in n)h[f]=n[f];h.prototype.getEdges=function(){return this.edges},h.prototype.getChild=function(){return this.child},h.prototype.getOwner=function(){return this.owner},h.prototype.getWidth=function(){return this.rect.width},h.prototype.setWidth=function(d){this.rect.width=d},h.prototype.getHeight=function(){return this.rect.height},h.prototype.setHeight=function(d){this.rect.height=d},h.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},h.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},h.prototype.getCenter=function(){return new u(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},h.prototype.getLocation=function(){return new u(this.rect.x,this.rect.y)},h.prototype.getRect=function(){return this.rect},h.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},h.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},h.prototype.setRect=function(d,p){this.rect.x=d.x,this.rect.y=d.y,this.rect.width=p.width,this.rect.height=p.height},h.prototype.setCenter=function(d,p){this.rect.x=d-this.rect.width/2,this.rect.y=p-this.rect.height/2},h.prototype.setLocation=function(d,p){this.rect.x=d,this.rect.y=p},h.prototype.moveBy=function(d,p){this.rect.x+=d,this.rect.y+=p},h.prototype.getEdgeListToNode=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(y.target==d){if(y.source!=g)throw"Incorrect edge source!";p.push(y)}}),p},h.prototype.getEdgesBetween=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(!(y.source==g||y.target==g))throw"Incorrect edge source and/or target";(y.target==d||y.source==d)&&p.push(y)}),p},h.prototype.getNeighborsList=function(){var d=new Set,p=this;return p.edges.forEach(function(m){if(m.source==p)d.add(m.target);else{if(m.target!=p)throw"Incorrect incidency!";d.add(m.source)}}),d},h.prototype.withChildren=function(){var d=new Set,p,m;if(d.add(this),this.child!=null)for(var g=this.child.getNodes(),y=0;yp&&(this.rect.x-=(this.labelWidth-p)/2,this.setWidth(this.labelWidth)),this.labelHeight>m&&(this.labelPos=="center"?this.rect.y-=(this.labelHeight-m)/2:this.labelPos=="top"&&(this.rect.y-=this.labelHeight-m),this.setHeight(this.labelHeight))}}},h.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},h.prototype.transform=function(d){var p=this.rect.x;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var m=this.rect.y;m>s.WORLD_BOUNDARY?m=s.WORLD_BOUNDARY:m<-s.WORLD_BOUNDARY&&(m=-s.WORLD_BOUNDARY);var g=new u(p,m),y=d.inverseTransformPoint(g);this.setLocation(y.x,y.y)},h.prototype.getLeft=function(){return this.rect.x},h.prototype.getRight=function(){return this.rect.x+this.rect.width},h.prototype.getTop=function(){return this.rect.y},h.prototype.getBottom=function(){return this.rect.y+this.rect.height},h.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=h},function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}o(n,"PointD"),n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(6),l=r(3),u=r(1),h=r(13),f=r(12),d=r(11);function p(g,y,v){n.call(this,v),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,y!=null&&y instanceof s?this.graphManager=y:y!=null&&y instanceof Layout&&(this.graphManager=y.graphManager)}o(p,"LGraph"),p.prototype=Object.create(n.prototype);for(var m in n)p[m]=n[m];p.prototype.getNodes=function(){return this.nodes},p.prototype.getEdges=function(){return this.edges},p.prototype.getGraphManager=function(){return this.graphManager},p.prototype.getParent=function(){return this.parent},p.prototype.getLeft=function(){return this.left},p.prototype.getRight=function(){return this.right},p.prototype.getTop=function(){return this.top},p.prototype.getBottom=function(){return this.bottom},p.prototype.isConnected=function(){return this.isConnected},p.prototype.add=function(g,y,v){if(y==null&&v==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(y)>-1&&this.getNodes().indexOf(v)>-1))throw"Source or target not in graph!";if(!(y.owner==v.owner&&y.owner==this))throw"Both owners must be this graph!";return y.owner!=v.owner?null:(b.source=y,b.target=v,b.isInterGraph=!1,this.getEdges().push(b),y.edges.push(b),v!=y&&v.edges.push(b),b)}},p.prototype.remove=function(g){var y=g;if(g instanceof l){if(y==null)throw"Node is null!";if(!(y.owner!=null&&y.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var v=y.edges.slice(),x,b=v.length,w=0;w-1&&E>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(T,1),x.target!=x.source&&x.target.edges.splice(E,1);var C=x.source.owner.getEdges().indexOf(x);if(C==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(C,1)}},p.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,y=i.MAX_VALUE,v,x,b,w=this.getNodes(),C=w.length,T=0;Tv&&(g=v),y>x&&(y=x)}return g==i.MAX_VALUE?null:(w[0].getParent().paddingLeft!=null?b=w[0].getParent().paddingLeft:b=this.margin,this.left=y-b,this.top=g-b,new f(this.left,this.top))},p.prototype.updateBounds=function(g){for(var y=i.MAX_VALUE,v=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,w,C,T,E,A,S=this.nodes,_=S.length,I=0;I<_;I++){var D=S[I];g&&D.child!=null&&D.updateBounds(),w=D.getLeft(),C=D.getRight(),T=D.getTop(),E=D.getBottom(),y>w&&(y=w),vT&&(x=T),bw&&(y=w),vT&&(x=T),b=this.nodes.length){var _=0;v.forEach(function(I){I.owner==g&&_++}),_==this.nodes.length&&(this.isConnected=!0)}},t.exports=p},function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(5),this.layout=s,this.graphs=[],this.edges=[]}o(a,"LGraphManager"),a.prototype.addRoot=function(){var s=this.layout.newGraph(),l=this.layout.newNode(null),u=this.add(s,l);return this.setRootGraph(u),this.rootGraph},a.prototype.add=function(s,l,u,h,f){if(u==null&&h==null&&f==null){if(s==null)throw"Graph is null!";if(l==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(l.child!=null)throw"Already has a child!";return s.parent=l,l.child=s,s}else{f=u,h=l,u=s;var d=h.getOwner(),p=f.getOwner();if(!(d!=null&&d.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(p!=null&&p.getGraphManager()==this))throw"Target not in this graph mgr!";if(d==p)return u.isInterGraph=!1,d.add(u,h,f);if(u.isInterGraph=!0,u.source=h,u.target=f,this.edges.indexOf(u)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(u),!(u.source!=null&&u.target!=null))throw"Edge source and/or target is null!";if(!(u.source.edges.indexOf(u)==-1&&u.target.edges.indexOf(u)==-1))throw"Edge already in source and/or target incidency list!";return u.source.edges.push(u),u.target.edges.push(u),u}},a.prototype.remove=function(s){if(s instanceof n){var l=s;if(l.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(l==this.rootGraph||l.parent!=null&&l.parent.graphManager==this))throw"Invalid parent node!";var u=[];u=u.concat(l.getEdges());for(var h,f=u.length,d=0;d=s.getRight()?l[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(l[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?l[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(l[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var f=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(f=1);var d=f*l[0],p=l[1]/f;l[0]d)return l[0]=u,l[1]=m,l[2]=f,l[3]=S,!1;if(hf)return l[0]=p,l[1]=h,l[2]=E,l[3]=d,!1;if(uf?(l[0]=y,l[1]=v,k=!0):(l[0]=g,l[1]=m,k=!0):R===M&&(u>f?(l[0]=p,l[1]=m,k=!0):(l[0]=x,l[1]=v,k=!0)),-O===M?f>u?(l[2]=A,l[3]=S,L=!0):(l[2]=E,l[3]=T,L=!0):O===M&&(f>u?(l[2]=C,l[3]=T,L=!0):(l[2]=_,l[3]=S,L=!0)),k&&L)return!1;if(u>f?h>d?(B=this.getCardinalDirection(R,M,4),F=this.getCardinalDirection(O,M,2)):(B=this.getCardinalDirection(-R,M,3),F=this.getCardinalDirection(-O,M,1)):h>d?(B=this.getCardinalDirection(-R,M,1),F=this.getCardinalDirection(-O,M,3)):(B=this.getCardinalDirection(R,M,2),F=this.getCardinalDirection(O,M,4)),!k)switch(B){case 1:z=m,P=u+-w/M,l[0]=P,l[1]=z;break;case 2:P=x,z=h+b*M,l[0]=P,l[1]=z;break;case 3:z=v,P=u+w/M,l[0]=P,l[1]=z;break;case 4:P=y,z=h+-b*M,l[0]=P,l[1]=z;break}if(!L)switch(F){case 1:H=T,$=f+-D/M,l[2]=$,l[3]=H;break;case 2:$=_,H=d+I*M,l[2]=$,l[3]=H;break;case 3:H=S,$=f+D/M,l[2]=$,l[3]=H;break;case 4:$=A,H=d+-I*M,l[2]=$,l[3]=H;break}}return!1},i.getCardinalDirection=function(a,s,l){return a>s?l:1+l%4},i.getIntersection=function(a,s,l,u){if(u==null)return this.getIntersection2(a,s,l);var h=a.x,f=a.y,d=s.x,p=s.y,m=l.x,g=l.y,y=u.x,v=u.y,x=void 0,b=void 0,w=void 0,C=void 0,T=void 0,E=void 0,A=void 0,S=void 0,_=void 0;return w=p-f,T=h-d,A=d*f-h*p,C=v-g,E=m-y,S=y*g-m*v,_=w*E-C*T,_===0?null:(x=(T*S-E*A)/_,b=(C*A-w*S)/_,new n(x,b))},i.angleOfVector=function(a,s,l,u){var h=void 0;return a!==l?(h=Math.atan((u-s)/(l-a)),l0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n},function(t,e,r){"use strict";function n(){}o(n,"Integer"),n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n},function(t,e,r){"use strict";var n=function(){function h(f,d){for(var p=0;p"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i},function(t,e,r){"use strict";function n(m){if(Array.isArray(m)){for(var g=0,y=Array(m.length);g0&&g;){for(w.push(T[0]);w.length>0&&g;){var E=w[0];w.splice(0,1),b.add(E);for(var A=E.getEdges(),x=0;x-1&&T.splice(D,1)}b=new Set,C=new Map}}return m},p.prototype.createDummyNodesForBendpoints=function(m){for(var g=[],y=m.source,v=this.graphManager.calcLowestCommonAncestor(m.source,m.target),x=0;x0){for(var v=this.edgeToDummyNodes.get(y),x=0;x=0&&g.splice(S,1);var _=C.getNeighborsList();_.forEach(function(k){if(y.indexOf(k)<0){var L=v.get(k),R=L-1;R==1&&E.push(k),v.set(k,R)}})}y=y.concat(E),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},p.prototype.setGraphManager=function(m){this.graphManager=m},t.exports=p},function(t,e,r){"use strict";function n(){}o(n,"RandomSeed"),n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n},function(t,e,r){"use strict";var n=r(4);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o(i,"Transform"),i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,l=this.lworldExtX;return l!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/l),s},i.prototype.transformY=function(a){var s=0,l=this.lworldExtY;return l!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/l),s},i.prototype.inverseTransformX=function(a){var s=0,l=this.ldeviceExtX;return l!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/l),s},i.prototype.inverseTransformY=function(a){var s=0,l=this.ldeviceExtY;return l!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/l),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i},function(t,e,r){"use strict";function n(d){if(Array.isArray(d)){for(var p=0,m=Array(d.length);pa.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(d>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var d=this.getAllEdges(),p,m=0;m0&&arguments[0]!==void 0?arguments[0]:!0,p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,m,g,y,v,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&d&&this.updateGrid(),b=new Set,m=0;mw||b>w)&&(d.gravitationForceX=-this.gravityConstant*y,d.gravitationForceY=-this.gravityConstant*v)):(w=p.getEstimatedSize()*this.compoundGravityRangeFactor,(x>w||b>w)&&(d.gravitationForceX=-this.gravityConstant*y*this.compoundGravityConstant,d.gravitationForceY=-this.gravityConstant*v*this.compoundGravityConstant))},h.prototype.isConverged=function(){var d,p=!1;return this.totalIterations>this.maxIterations/3&&(p=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),d=this.totalDisplacement=x.length||w>=x[0].length)){for(var C=0;Ch},"_defaultCompareFunction")}]),l}();t.exports=s},function(t,e,r){"use strict";var n=function(){function s(l,u){for(var h=0;h2&&arguments[2]!==void 0?arguments[2]:1,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,d=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=l,this.sequence2=u,this.match_score=h,this.mismatch_penalty=f,this.gap_penalty=d,this.iMax=l.length+1,this.jMax=u.length+1,this.grid=new Array(this.iMax);for(var p=0;p=0;l--){var u=this.listeners[l];u.event===a&&u.callback===s&&this.listeners.splice(l,1)}},i.emit=function(a,s){for(var l=0;l{"use strict";o(function(e,r){typeof h4=="object"&&typeof CB=="object"?CB.exports=r(SB()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof h4=="object"?h4.coseBase=r(SB()):e.coseBase=r(e.layoutBase)},"webpackUniversalModuleDefinition")(h4,function(t){return function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return o(n,"__webpack_require__"),n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?o(function(){return i.default},"getDefault"):o(function(){return i},"getModuleExports");return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=7)}([function(e,r){e.exports=t},function(e,r,n){"use strict";var i=n(0).FDLayoutConstants;function a(){}o(a,"CoSEConstants");for(var s in i)a[s]=i[s];a.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,a.DEFAULT_RADIAL_SEPARATION=i.DEFAULT_EDGE_LENGTH,a.DEFAULT_COMPONENT_SEPERATION=60,a.TILE=!0,a.TILING_PADDING_VERTICAL=10,a.TILING_PADDING_HORIZONTAL=10,a.TREE_REDUCTION_ON_INCREMENTAL=!1,e.exports=a},function(e,r,n){"use strict";var i=n(0).FDLayoutEdge;function a(l,u,h){i.call(this,l,u,h)}o(a,"CoSEEdge"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a},function(e,r,n){"use strict";var i=n(0).LGraph;function a(l,u,h){i.call(this,l,u,h)}o(a,"CoSEGraph"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a},function(e,r,n){"use strict";var i=n(0).LGraphManager;function a(l){i.call(this,l)}o(a,"CoSEGraphManager"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a},function(e,r,n){"use strict";var i=n(0).FDLayoutNode,a=n(0).IMath;function s(u,h,f,d){i.call(this,u,h,f,d)}o(s,"CoSENode"),s.prototype=Object.create(i.prototype);for(var l in i)s[l]=i[l];s.prototype.move=function(){var u=this.graphManager.getLayout();this.displacementX=u.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY=u.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren,Math.abs(this.displacementX)>u.coolingFactor*u.maxNodeDisplacement&&(this.displacementX=u.coolingFactor*u.maxNodeDisplacement*a.sign(this.displacementX)),Math.abs(this.displacementY)>u.coolingFactor*u.maxNodeDisplacement&&(this.displacementY=u.coolingFactor*u.maxNodeDisplacement*a.sign(this.displacementY)),this.child==null?this.moveBy(this.displacementX,this.displacementY):this.child.getNodes().length==0?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),u.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},s.prototype.propogateDisplacementToChildren=function(u,h){for(var f=this.getChild().getNodes(),d,p=0;p0)this.positionNodesRadially(T);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var E=new Set(this.getAllNodes()),A=this.nodesWithGravity.filter(function(S){return E.has(S)});this.graphManager.setAllNodesToApplyGravitation(A),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},w.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%f.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var T=new Set(this.getAllNodes()),E=this.nodesWithGravity.filter(function(_){return T.has(_)});this.graphManager.setAllNodesToApplyGravitation(E),this.graphManager.updateBounds(),this.updateGrid(),this.coolingFactor=f.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),this.coolingFactor=f.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var A=!this.isTreeGrowing&&!this.isGrowthFinished,S=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(A,S),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},w.prototype.getPositionsData=function(){for(var T=this.graphManager.getAllNodes(),E={},A=0;A1){var k;for(k=0;kS&&(S=Math.floor(D.y)),I=Math.floor(D.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new m(d.WORLD_CENTER_X-D.x/2,d.WORLD_CENTER_Y-D.y/2))},w.radialLayout=function(T,E,A){var S=Math.max(this.maxDiagonalInTree(T),h.DEFAULT_RADIAL_SEPARATION);w.branchRadialLayout(E,null,0,359,0,S);var _=x.calculateBounds(T),I=new b;I.setDeviceOrgX(_.getMinX()),I.setDeviceOrgY(_.getMinY()),I.setWorldOrgX(A.x),I.setWorldOrgY(A.y);for(var D=0;D1;){var Q=H[0];H.splice(0,1);var j=B.indexOf(Q);j>=0&&B.splice(j,1),z--,F--}E!=null?$=(B.indexOf(H[0])+1)%z:$=0;for(var ie=Math.abs(S-A)/F,ne=$;P!=F;ne=++ne%z){var le=B[ne].getOtherEnd(T);if(le!=E){var he=(A+P*ie)%360,K=(he+ie)%360;w.branchRadialLayout(le,T,he,K,_+I,I),P++}}},w.maxDiagonalInTree=function(T){for(var E=y.MIN_VALUE,A=0;AE&&(E=_)}return E},w.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},w.prototype.groupZeroDegreeMembers=function(){var T=this,E={};this.memberGroups={},this.idToDummyNode={};for(var A=[],S=this.graphManager.getAllNodes(),_=0;_"u"&&(E[k]=[]),E[k]=E[k].concat(I)}Object.keys(E).forEach(function(L){if(E[L].length>1){var R="DummyCompound_"+L;T.memberGroups[R]=E[L];var O=E[L][0].getParent(),M=new l(T.graphManager);M.id=R,M.paddingLeft=O.paddingLeft||0,M.paddingRight=O.paddingRight||0,M.paddingBottom=O.paddingBottom||0,M.paddingTop=O.paddingTop||0,T.idToDummyNode[R]=M;var B=T.getGraphManager().add(T.newGraph(),M),F=O.getChild();F.add(M);for(var P=0;P=0;T--){var E=this.compoundOrder[T],A=E.id,S=E.paddingLeft,_=E.paddingTop;this.adjustLocations(this.tiledMemberPack[A],E.rect.x,E.rect.y,S,_)}},w.prototype.repopulateZeroDegreeMembers=function(){var T=this,E=this.tiledZeroDegreePack;Object.keys(E).forEach(function(A){var S=T.idToDummyNode[A],_=S.paddingLeft,I=S.paddingTop;T.adjustLocations(E[A],S.rect.x,S.rect.y,_,I)})},w.prototype.getToBeTiled=function(T){var E=T.id;if(this.toBeTiled[E]!=null)return this.toBeTiled[E];var A=T.getChild();if(A==null)return this.toBeTiled[E]=!1,!1;for(var S=A.getNodes(),_=0;_0)return this.toBeTiled[E]=!1,!1;if(I.getChild()==null){this.toBeTiled[I.id]=!1;continue}if(!this.getToBeTiled(I))return this.toBeTiled[E]=!1,!1}return this.toBeTiled[E]=!0,!0},w.prototype.getNodeDegree=function(T){for(var E=T.id,A=T.getEdges(),S=0,_=0;_L&&(L=O.rect.height)}A+=L+T.verticalPadding}},w.prototype.tileCompoundMembers=function(T,E){var A=this;this.tiledMemberPack=[],Object.keys(T).forEach(function(S){var _=E[S];A.tiledMemberPack[S]=A.tileNodes(T[S],_.paddingLeft+_.paddingRight),_.rect.width=A.tiledMemberPack[S].width,_.rect.height=A.tiledMemberPack[S].height})},w.prototype.tileNodes=function(T,E){var A=h.TILING_PADDING_VERTICAL,S=h.TILING_PADDING_HORIZONTAL,_={rows:[],rowWidth:[],rowHeight:[],width:0,height:E,verticalPadding:A,horizontalPadding:S};T.sort(function(k,L){return k.rect.width*k.rect.height>L.rect.width*L.rect.height?-1:k.rect.width*k.rect.height0&&(D+=T.horizontalPadding),T.rowWidth[A]=D,T.width0&&(k+=T.verticalPadding);var L=0;k>T.rowHeight[A]&&(L=T.rowHeight[A],T.rowHeight[A]=k,L=T.rowHeight[A]-L),T.height+=L,T.rows[A].push(E)},w.prototype.getShortestRowIndex=function(T){for(var E=-1,A=Number.MAX_VALUE,S=0;SA&&(E=S,A=T.rowWidth[S]);return E},w.prototype.canAddHorizontal=function(T,E,A){var S=this.getShortestRowIndex(T);if(S<0)return!0;var _=T.rowWidth[S];if(_+T.horizontalPadding+E<=T.width)return!0;var I=0;T.rowHeight[S]0&&(I=A+T.verticalPadding-T.rowHeight[S]);var D;T.width-_>=E+T.horizontalPadding?D=(T.height+I)/(_+E+T.horizontalPadding):D=(T.height+I)/T.width,I=A+T.verticalPadding;var k;return T.widthI&&E!=A){S.splice(-1,1),T.rows[A].push(_),T.rowWidth[E]=T.rowWidth[E]-I,T.rowWidth[A]=T.rowWidth[A]+I,T.width=T.rowWidth[instance.getLongestRowIndex(T)];for(var D=Number.MIN_VALUE,k=0;kD&&(D=S[k].height);E>0&&(D+=T.verticalPadding);var L=T.rowHeight[E]+T.rowHeight[A];T.rowHeight[E]=D,T.rowHeight[A]<_.height+T.verticalPadding&&(T.rowHeight[A]=_.height+T.verticalPadding);var R=T.rowHeight[E]+T.rowHeight[A];T.height+=R-L,this.shiftToLastRow(T)}},w.prototype.tilingPreLayout=function(){h.TILE&&(this.groupZeroDegreeMembers(),this.clearCompounds(),this.clearZeroDegreeMembers())},w.prototype.tilingPostLayout=function(){h.TILE&&(this.repopulateZeroDegreeMembers(),this.repopulateCompounds())},w.prototype.reduceTrees=function(){for(var T=[],E=!0,A;E;){var S=this.graphManager.getAllNodes(),_=[];E=!1;for(var I=0;I0)for(var F=_;F<=I;F++)B[0]+=this.grid[F][D-1].length+this.grid[F][D].length-1;if(I0)for(var F=D;F<=k;F++)B[3]+=this.grid[_-1][F].length+this.grid[_][F].length-1;for(var P=y.MAX_VALUE,z,$,H=0;H{"use strict";o(function(e,r){typeof f4=="object"&&typeof _B=="object"?_B.exports=r(AB()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof f4=="object"?f4.cytoscapeCoseBilkent=r(AB()):e.cytoscapeCoseBilkent=r(e.coseBase)},"webpackUniversalModuleDefinition")(f4,function(t){return function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return o(n,"__webpack_require__"),n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?o(function(){return i.default},"getDefault"):o(function(){return i},"getModuleExports");return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=1)}([function(e,r){e.exports=t},function(e,r,n){"use strict";var i=n(0).layoutBase.LayoutConstants,a=n(0).layoutBase.FDLayoutConstants,s=n(0).CoSEConstants,l=n(0).CoSELayout,u=n(0).CoSENode,h=n(0).layoutBase.PointD,f=n(0).layoutBase.DimensionD,d={ready:o(function(){},"ready"),stop:o(function(){},"stop"),quality:"default",nodeDimensionsIncludeLabels:!1,refresh:30,fit:!0,padding:10,randomize:!0,nodeRepulsion:4500,idealEdgeLength:50,edgeElasticity:.45,nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,animate:"end",animationDuration:500,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.5};function p(v,x){var b={};for(var w in v)b[w]=v[w];for(var w in x)b[w]=x[w];return b}o(p,"extend");function m(v){this.options=p(d,v),g(this.options)}o(m,"_CoSELayout");var g=o(function(x){x.nodeRepulsion!=null&&(s.DEFAULT_REPULSION_STRENGTH=a.DEFAULT_REPULSION_STRENGTH=x.nodeRepulsion),x.idealEdgeLength!=null&&(s.DEFAULT_EDGE_LENGTH=a.DEFAULT_EDGE_LENGTH=x.idealEdgeLength),x.edgeElasticity!=null&&(s.DEFAULT_SPRING_STRENGTH=a.DEFAULT_SPRING_STRENGTH=x.edgeElasticity),x.nestingFactor!=null&&(s.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=a.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=x.nestingFactor),x.gravity!=null&&(s.DEFAULT_GRAVITY_STRENGTH=a.DEFAULT_GRAVITY_STRENGTH=x.gravity),x.numIter!=null&&(s.MAX_ITERATIONS=a.MAX_ITERATIONS=x.numIter),x.gravityRange!=null&&(s.DEFAULT_GRAVITY_RANGE_FACTOR=a.DEFAULT_GRAVITY_RANGE_FACTOR=x.gravityRange),x.gravityCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_STRENGTH=a.DEFAULT_COMPOUND_GRAVITY_STRENGTH=x.gravityCompound),x.gravityRangeCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=a.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=x.gravityRangeCompound),x.initialEnergyOnIncremental!=null&&(s.DEFAULT_COOLING_FACTOR_INCREMENTAL=a.DEFAULT_COOLING_FACTOR_INCREMENTAL=x.initialEnergyOnIncremental),x.quality=="draft"?i.QUALITY=0:x.quality=="proof"?i.QUALITY=2:i.QUALITY=1,s.NODE_DIMENSIONS_INCLUDE_LABELS=a.NODE_DIMENSIONS_INCLUDE_LABELS=i.NODE_DIMENSIONS_INCLUDE_LABELS=x.nodeDimensionsIncludeLabels,s.DEFAULT_INCREMENTAL=a.DEFAULT_INCREMENTAL=i.DEFAULT_INCREMENTAL=!x.randomize,s.ANIMATE=a.ANIMATE=i.ANIMATE=x.animate,s.TILE=x.tile,s.TILING_PADDING_VERTICAL=typeof x.tilingPaddingVertical=="function"?x.tilingPaddingVertical.call():x.tilingPaddingVertical,s.TILING_PADDING_HORIZONTAL=typeof x.tilingPaddingHorizontal=="function"?x.tilingPaddingHorizontal.call():x.tilingPaddingHorizontal},"getUserOptions");m.prototype.run=function(){var v,x,b=this.options,w=this.idToLNode={},C=this.layout=new l,T=this;T.stopped=!1,this.cy=this.options.cy,this.cy.trigger({type:"layoutstart",layout:this});var E=C.newGraphManager();this.gm=E;var A=this.options.eles.nodes(),S=this.options.eles.edges();this.root=E.addRoot(),this.processChildrenList(this.root,this.getTopMostNodes(A),C);for(var _=0;_0){var k;k=b.getGraphManager().add(b.newGraph(),A),this.processChildrenList(k,E,b)}}},m.prototype.stop=function(){return this.stopped=!0,this};var y=o(function(x){x("layout","cose-bilkent",m)},"register");typeof cytoscape<"u"&&y(cytoscape),e.exports=y}])})});function JZe(t,e,r,n,i){return t.insert("polygon",":first-child").attr("points",n.map(function(a){return a.x+","+a.y}).join(" ")).attr("transform","translate("+(i.width-e)/2+", "+r+")")}var YZe,XZe,jZe,KZe,QZe,ZZe,eJe,tJe,Vge,Uge,Hge=N(()=>{"use strict";to();ir();YZe=12,XZe=o(function(t,e,r,n){e.append("path").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("d",`M0 ${r.height-5} v${-r.height+2*5} q0,-5 5,-5 h${r.width-2*5} q5,0 5,5 v${r.height-5} H0 Z`),e.append("line").attr("class","node-line-"+n).attr("x1",0).attr("y1",r.height).attr("x2",r.width).attr("y2",r.height)},"defaultBkg"),jZe=o(function(t,e,r){e.append("rect").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("height",r.height).attr("width",r.width)},"rectBkg"),KZe=o(function(t,e,r){let n=r.width,i=r.height,a=.15*n,s=.25*n,l=.35*n,u=.2*n;e.append("path").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("d",`M0 0 a${a},${a} 0 0,1 ${n*.25},${-1*n*.1} + a${l},${l} 1 0,1 ${n*.4},${-1*n*.1} + a${s},${s} 1 0,1 ${n*.35},${1*n*.2} + + a${a},${a} 1 0,1 ${n*.15},${1*i*.35} + a${u},${u} 1 0,1 ${-1*n*.15},${1*i*.65} + + a${s},${a} 1 0,1 ${-1*n*.25},${n*.15} + a${l},${l} 1 0,1 ${-1*n*.5},0 + a${a},${a} 1 0,1 ${-1*n*.25},${-1*n*.15} + + a${a},${a} 1 0,1 ${-1*n*.1},${-1*i*.35} + a${u},${u} 1 0,1 ${n*.1},${-1*i*.65} + + H0 V0 Z`)},"cloudBkg"),QZe=o(function(t,e,r){let n=r.width,i=r.height,a=.15*n;e.append("path").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("d",`M0 0 a${a},${a} 1 0,0 ${n*.25},${-1*i*.1} + a${a},${a} 1 0,0 ${n*.25},0 + a${a},${a} 1 0,0 ${n*.25},0 + a${a},${a} 1 0,0 ${n*.25},${1*i*.1} + + a${a},${a} 1 0,0 ${n*.15},${1*i*.33} + a${a*.8},${a*.8} 1 0,0 0,${1*i*.34} + a${a},${a} 1 0,0 ${-1*n*.15},${1*i*.33} + + a${a},${a} 1 0,0 ${-1*n*.25},${i*.15} + a${a},${a} 1 0,0 ${-1*n*.25},0 + a${a},${a} 1 0,0 ${-1*n*.25},0 + a${a},${a} 1 0,0 ${-1*n*.25},${-1*i*.15} + + a${a},${a} 1 0,0 ${-1*n*.1},${-1*i*.33} + a${a*.8},${a*.8} 1 0,0 0,${-1*i*.34} + a${a},${a} 1 0,0 ${n*.1},${-1*i*.33} + + H0 V0 Z`)},"bangBkg"),ZZe=o(function(t,e,r){e.append("circle").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("r",r.width/2)},"circleBkg");o(JZe,"insertPolygonShape");eJe=o(function(t,e,r){let n=r.height,a=n/4,s=r.width-r.padding+2*a,l=[{x:a,y:0},{x:s-a,y:0},{x:s,y:-n/2},{x:s-a,y:-n},{x:a,y:-n},{x:0,y:-n/2}];JZe(e,s,n,l,r)},"hexagonBkg"),tJe=o(function(t,e,r){e.append("rect").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("height",r.height).attr("rx",r.padding).attr("ry",r.padding).attr("width",r.width)},"roundedRectBkg"),Vge=o(async function(t,e,r,n,i){let a=i.htmlLabels,s=n%(YZe-1),l=e.append("g");r.section=s;let u="section-"+s;s<0&&(u+=" section-root"),l.attr("class",(r.class?r.class+" ":"")+"mindmap-node "+u);let h=l.append("g"),f=l.append("g"),d=r.descr.replace(/()/g,` +`);await Hn(f,d,{useHtmlLabels:a,width:r.width,classes:"mindmap-node-label"},i),a||f.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle");let p=f.node().getBBox(),[m]=Bo(i.fontSize);if(r.height=p.height+m*1.1*.5+r.padding,r.width=p.width+2*r.padding,r.icon)if(r.type===t.nodeType.CIRCLE)r.height+=50,r.width+=50,l.append("foreignObject").attr("height","50px").attr("width",r.width).attr("style","text-align: center;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+s+" "+r.icon),f.attr("transform","translate("+r.width/2+", "+(r.height/2-1.5*r.padding)+")");else{r.width+=50;let g=r.height;r.height=Math.max(g,60);let y=Math.abs(r.height-g);l.append("foreignObject").attr("width","60px").attr("height",r.height).attr("style","text-align: center;margin-top:"+y/2+"px;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+s+" "+r.icon),f.attr("transform","translate("+(25+r.width/2)+", "+(y/2+r.padding/2)+")")}else if(a){let g=(r.width-p.width)/2,y=(r.height-p.height)/2;f.attr("transform","translate("+g+", "+y+")")}else{let g=r.width/2,y=r.padding/2;f.attr("transform","translate("+g+", "+y+")")}switch(r.type){case t.nodeType.DEFAULT:XZe(t,h,r,s);break;case t.nodeType.ROUNDED_RECT:tJe(t,h,r,s);break;case t.nodeType.RECT:jZe(t,h,r,s);break;case t.nodeType.CIRCLE:h.attr("transform","translate("+r.width/2+", "+ +r.height/2+")"),ZZe(t,h,r,s);break;case t.nodeType.CLOUD:KZe(t,h,r,s);break;case t.nodeType.BANG:QZe(t,h,r,s);break;case t.nodeType.HEXAGON:eJe(t,h,r,s);break}return t.setElementForId(r.id,l),r.height},"drawNode"),Uge=o(function(t,e){let r=t.getElementById(e.id),n=e.x||0,i=e.y||0;r.attr("transform","translate("+n+","+i+")")},"positionNode")});async function qge(t,e,r,n,i){await Vge(t,e,r,n,i),r.children&&await Promise.all(r.children.map((a,s)=>qge(t,e,a,n<0?s:n,i)))}function rJe(t,e){e.edges().map((r,n)=>{let i=r.data();if(r[0]._private.bodyBounds){let a=r[0]._private.rscratch;Y.trace("Edge: ",n,i),t.insert("path").attr("d",`M ${a.startX},${a.startY} L ${a.midX},${a.midY} L${a.endX},${a.endY} `).attr("class","edge section-edge-"+i.section+" edge-depth-"+i.depth)}})}function Yge(t,e,r,n){e.add({group:"nodes",data:{id:t.id.toString(),labelText:t.descr,height:t.height,width:t.width,level:n,nodeId:t.id,padding:t.padding,type:t.type},position:{x:t.x,y:t.y}}),t.children&&t.children.forEach(i=>{Yge(i,e,r,n+1),e.add({group:"edges",data:{id:`${t.id}_${i.id}`,source:t.id,target:i.id,depth:n,section:i.section}})})}function nJe(t,e){return new Promise(r=>{let n=Ge("body").append("div").attr("id","cy").attr("style","display:none"),i=rl({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});n.remove(),Yge(t,i,e,0),i.nodes().forEach(function(a){a.layoutDimensions=()=>{let s=a.data();return{w:s.width,h:s.height}}}),i.layout({name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1}).run(),i.ready(a=>{Y.info("Ready",a),r(i)})})}function iJe(t,e){e.nodes().map((r,n)=>{let i=r.data();i.x=r.position().x,i.y=r.position().y,Uge(t,i);let a=t.getElementById(i.nodeId);Y.info("Id:",n,"Position: (",r.position().x,", ",r.position().y,")",i),a.attr("transform",`translate(${r.position().x-i.width/2}, ${r.position().y-i.height/2})`),a.attr("attr",`apa-${n})`)})}var Wge,aJe,Xge,jge=N(()=>{"use strict";kB();Wge=Sa(Gge(),1);dr();zt();vt();Vc();Ei();Hge();Ya();rl.use(Wge.default);o(qge,"drawNodes");o(rJe,"drawEdges");o(Yge,"addNodes");o(nJe,"layoutMindmap");o(iJe,"positionNodes");aJe=o(async(t,e,r,n)=>{Y.debug(`Rendering mindmap diagram +`+t);let i=n.db,a=i.getMindmap();if(!a)return;let s=me();s.htmlLabels=!1;let l=sa(e),u=l.append("g");u.attr("class","mindmap-edges");let h=l.append("g");h.attr("class","mindmap-nodes"),await qge(i,h,a,-1,s);let f=await nJe(a,s);rJe(u,f),iJe(i,f),Ao(void 0,l,s.mindmap?.padding??or.mindmap.padding,s.mindmap?.useMaxWidth??or.mindmap.useMaxWidth)},"draw"),Xge={draw:aJe}});var sJe,oJe,Kge,Qge=N(()=>{"use strict";Ys();sJe=o(t=>{let e="";for(let r=0;r` + .edge { + stroke-width: 3; + } + ${sJe(t)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${t.git0}; + } + .section-root text { + fill: ${t.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .mindmap-node-label { + dy: 1em; + alignment-baseline: middle; + text-anchor: middle; + dominant-baseline: middle; + text-align: center; + } +`,"getStyles"),Kge=oJe});var Zge={};hr(Zge,{diagram:()=>lJe});var lJe,Jge=N(()=>{"use strict";Spe();_pe();jge();Qge();lJe={db:Ape,renderer:Xge,parser:Epe,styles:Kge}});var DB,r1e,n1e=N(()=>{"use strict";DB=function(){var t=o(function(A,S,_,I){for(_=_||{},I=A.length;I--;_[A[I]]=S);return _},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],l=[1,19],u=[6,7,8],h=[1,26],f=[1,24],d=[1,25],p=[6,7,11],m=[1,31],g=[6,7,11,24],y=[1,6,13,16,17,20,23],v=[1,35],x=[1,36],b=[1,6,7,11,13,16,17,20,23],w=[1,38],C={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,KANBAN:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,shapeData:15,ICON:16,CLASS:17,nodeWithId:18,nodeWithoutId:19,NODE_DSTART:20,NODE_DESCR:21,NODE_DEND:22,NODE_ID:23,SHAPE_DATA:24,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"KANBAN",11:"EOF",13:"SPACELIST",16:"ICON",17:"CLASS",20:"NODE_DSTART",21:"NODE_DESCR",22:"NODE_DEND",23:"NODE_ID",24:"SHAPE_DATA"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,3],[12,2],[12,2],[12,2],[12,1],[12,2],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[19,3],[18,1],[18,4],[15,2],[15,1]],performAction:o(function(S,_,I,D,k,L,R){var O=L.length-1;switch(k){case 6:case 7:return D;case 8:D.getLogger().trace("Stop NL ");break;case 9:D.getLogger().trace("Stop EOF ");break;case 11:D.getLogger().trace("Stop NL2 ");break;case 12:D.getLogger().trace("Stop EOF2 ");break;case 15:D.getLogger().info("Node: ",L[O-1].id),D.addNode(L[O-2].length,L[O-1].id,L[O-1].descr,L[O-1].type,L[O]);break;case 16:D.getLogger().info("Node: ",L[O].id),D.addNode(L[O-1].length,L[O].id,L[O].descr,L[O].type);break;case 17:D.getLogger().trace("Icon: ",L[O]),D.decorateNode({icon:L[O]});break;case 18:case 23:D.decorateNode({class:L[O]});break;case 19:D.getLogger().trace("SPACELIST");break;case 20:D.getLogger().trace("Node: ",L[O-1].id),D.addNode(0,L[O-1].id,L[O-1].descr,L[O-1].type,L[O]);break;case 21:D.getLogger().trace("Node: ",L[O].id),D.addNode(0,L[O].id,L[O].descr,L[O].type);break;case 22:D.decorateNode({icon:L[O]});break;case 27:D.getLogger().trace("node found ..",L[O-2]),this.$={id:L[O-1],descr:L[O-1],type:D.getType(L[O-2],L[O])};break;case 28:this.$={id:L[O],descr:L[O],type:0};break;case 29:D.getLogger().trace("node found ..",L[O-3]),this.$={id:L[O-3],descr:L[O-1],type:D.getType(L[O-2],L[O])};break;case 30:this.$=L[O-1]+L[O];break;case 31:this.$=L[O];break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},t(u,[2,3]),{1:[2,2]},t(u,[2,4]),t(u,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},{6:r,9:22,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},{6:h,7:f,10:23,11:d},t(p,[2,24],{18:17,19:18,14:27,16:[1,28],17:[1,29],20:s,23:l}),t(p,[2,19]),t(p,[2,21],{15:30,24:m}),t(p,[2,22]),t(p,[2,23]),t(g,[2,25]),t(g,[2,26]),t(g,[2,28],{20:[1,32]}),{21:[1,33]},{6:h,7:f,10:34,11:d},{1:[2,7],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},t(y,[2,14],{7:v,11:x}),t(b,[2,8]),t(b,[2,9]),t(b,[2,10]),t(p,[2,16],{15:37,24:m}),t(p,[2,17]),t(p,[2,18]),t(p,[2,20],{24:w}),t(g,[2,31]),{21:[1,39]},{22:[1,40]},t(y,[2,13],{7:v,11:x}),t(b,[2,11]),t(b,[2,12]),t(p,[2,15],{24:w}),t(g,[2,30]),{22:[1,41]},t(g,[2,27]),t(g,[2,29])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(S,_){if(_.recoverable)this.trace(S);else{var I=new Error(S);throw I.hash=_,I}},"parseError"),parse:o(function(S){var _=this,I=[0],D=[],k=[null],L=[],R=this.table,O="",M=0,B=0,F=0,P=2,z=1,$=L.slice.call(arguments,1),H=Object.create(this.lexer),Q={yy:{}};for(var j in this.yy)Object.prototype.hasOwnProperty.call(this.yy,j)&&(Q.yy[j]=this.yy[j]);H.setInput(S,Q.yy),Q.yy.lexer=H,Q.yy.parser=this,typeof H.yylloc>"u"&&(H.yylloc={});var ie=H.yylloc;L.push(ie);var ne=H.options&&H.options.ranges;typeof Q.yy.parseError=="function"?this.parseError=Q.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function le(ze){I.length=I.length-2*ze,k.length=k.length-ze,L.length=L.length-ze}o(le,"popStack");function he(){var ze;return ze=D.pop()||H.lex()||z,typeof ze!="number"&&(ze instanceof Array&&(D=ze,ze=D.pop()),ze=_.symbols_[ze]||ze),ze}o(he,"lex");for(var K,X,te,J,se,ue,Z={},Se,ce,ae,Oe;;){if(te=I[I.length-1],this.defaultActions[te]?J=this.defaultActions[te]:((K===null||typeof K>"u")&&(K=he()),J=R[te]&&R[te][K]),typeof J>"u"||!J.length||!J[0]){var ge="";Oe=[];for(Se in R[te])this.terminals_[Se]&&Se>P&&Oe.push("'"+this.terminals_[Se]+"'");H.showPosition?ge="Parse error on line "+(M+1)+`: +`+H.showPosition()+` +Expecting `+Oe.join(", ")+", got '"+(this.terminals_[K]||K)+"'":ge="Parse error on line "+(M+1)+": Unexpected "+(K==z?"end of input":"'"+(this.terminals_[K]||K)+"'"),this.parseError(ge,{text:H.match,token:this.terminals_[K]||K,line:H.yylineno,loc:ie,expected:Oe})}if(J[0]instanceof Array&&J.length>1)throw new Error("Parse Error: multiple actions possible at state: "+te+", token: "+K);switch(J[0]){case 1:I.push(K),k.push(H.yytext),L.push(H.yylloc),I.push(J[1]),K=null,X?(K=X,X=null):(B=H.yyleng,O=H.yytext,M=H.yylineno,ie=H.yylloc,F>0&&F--);break;case 2:if(ce=this.productions_[J[1]][1],Z.$=k[k.length-ce],Z._$={first_line:L[L.length-(ce||1)].first_line,last_line:L[L.length-1].last_line,first_column:L[L.length-(ce||1)].first_column,last_column:L[L.length-1].last_column},ne&&(Z._$.range=[L[L.length-(ce||1)].range[0],L[L.length-1].range[1]]),ue=this.performAction.apply(Z,[O,B,M,Q.yy,J[1],k,L].concat($)),typeof ue<"u")return ue;ce&&(I=I.slice(0,-1*ce*2),k=k.slice(0,-1*ce),L=L.slice(0,-1*ce)),I.push(this.productions_[J[1]][0]),k.push(Z.$),L.push(Z._$),ae=R[I[I.length-2]][I[I.length-1]],I.push(ae);break;case 3:return!0}}return!0},"parse")},T=function(){var A={EOF:1,parseError:o(function(_,I){if(this.yy.parser)this.yy.parser.parseError(_,I);else throw new Error(_)},"parseError"),setInput:o(function(S,_){return this.yy=_||this.yy||{},this._input=S,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var S=this._input[0];this.yytext+=S,this.yyleng++,this.offset++,this.match+=S,this.matched+=S;var _=S.match(/(?:\r\n?|\n).*/g);return _?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),S},"input"),unput:o(function(S){var _=S.length,I=S.split(/(?:\r\n?|\n)/g);this._input=S+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-_),this.offset-=_;var D=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),I.length-1&&(this.yylineno-=I.length-1);var k=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:I?(I.length===D.length?this.yylloc.first_column:0)+D[D.length-I.length].length-I[0].length:this.yylloc.first_column-_},this.options.ranges&&(this.yylloc.range=[k[0],k[0]+this.yyleng-_]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(S){this.unput(this.match.slice(S))},"less"),pastInput:o(function(){var S=this.matched.substr(0,this.matched.length-this.match.length);return(S.length>20?"...":"")+S.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var S=this.match;return S.length<20&&(S+=this._input.substr(0,20-S.length)),(S.substr(0,20)+(S.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var S=this.pastInput(),_=new Array(S.length+1).join("-");return S+this.upcomingInput()+` +`+_+"^"},"showPosition"),test_match:o(function(S,_){var I,D,k;if(this.options.backtrack_lexer&&(k={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(k.yylloc.range=this.yylloc.range.slice(0))),D=S[0].match(/(?:\r\n?|\n).*/g),D&&(this.yylineno+=D.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:D?D[D.length-1].length-D[D.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+S[0].length},this.yytext+=S[0],this.match+=S[0],this.matches=S,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(S[0].length),this.matched+=S[0],I=this.performAction.call(this,this.yy,this,_,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),I)return I;if(this._backtrack){for(var L in k)this[L]=k[L];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var S,_,I,D;this._more||(this.yytext="",this.match="");for(var k=this._currentRules(),L=0;L_[0].length)){if(_=I,D=L,this.options.backtrack_lexer){if(S=this.test_match(I,k[L]),S!==!1)return S;if(this._backtrack){_=!1;continue}else return!1}else if(!this.options.flex)break}return _?(S=this.test_match(_,k[D]),S!==!1?S:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var _=this.next();return _||this.lex()},"lex"),begin:o(function(_){this.conditionStack.push(_)},"begin"),popState:o(function(){var _=this.conditionStack.length-1;return _>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(_){return _=this.conditionStack.length-1-Math.abs(_||0),_>=0?this.conditionStack[_]:"INITIAL"},"topState"),pushState:o(function(_){this.begin(_)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(_,I,D,k){var L=k;switch(D){case 0:return this.pushState("shapeData"),I.yytext="",24;break;case 1:return this.pushState("shapeDataStr"),24;break;case 2:return this.popState(),24;break;case 3:let R=/\n\s*/g;return I.yytext=I.yytext.replace(R,"
    "),24;break;case 4:return 24;case 5:this.popState();break;case 6:return _.getLogger().trace("Found comment",I.yytext),6;break;case 7:return 8;case 8:this.begin("CLASS");break;case 9:return this.popState(),17;break;case 10:this.popState();break;case 11:_.getLogger().trace("Begin icon"),this.begin("ICON");break;case 12:return _.getLogger().trace("SPACELINE"),6;break;case 13:return 7;case 14:return 16;case 15:_.getLogger().trace("end icon"),this.popState();break;case 16:return _.getLogger().trace("Exploding node"),this.begin("NODE"),20;break;case 17:return _.getLogger().trace("Cloud"),this.begin("NODE"),20;break;case 18:return _.getLogger().trace("Explosion Bang"),this.begin("NODE"),20;break;case 19:return _.getLogger().trace("Cloud Bang"),this.begin("NODE"),20;break;case 20:return this.begin("NODE"),20;break;case 21:return this.begin("NODE"),20;break;case 22:return this.begin("NODE"),20;break;case 23:return this.begin("NODE"),20;break;case 24:return 13;case 25:return 23;case 26:return 11;case 27:this.begin("NSTR2");break;case 28:return"NODE_DESCR";case 29:this.popState();break;case 30:_.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 31:return _.getLogger().trace("description:",I.yytext),"NODE_DESCR";break;case 32:this.popState();break;case 33:return this.popState(),_.getLogger().trace("node end ))"),"NODE_DEND";break;case 34:return this.popState(),_.getLogger().trace("node end )"),"NODE_DEND";break;case 35:return this.popState(),_.getLogger().trace("node end ...",I.yytext),"NODE_DEND";break;case 36:return this.popState(),_.getLogger().trace("node end (("),"NODE_DEND";break;case 37:return this.popState(),_.getLogger().trace("node end (-"),"NODE_DEND";break;case 38:return this.popState(),_.getLogger().trace("node end (-"),"NODE_DEND";break;case 39:return this.popState(),_.getLogger().trace("node end (("),"NODE_DEND";break;case 40:return this.popState(),_.getLogger().trace("node end (("),"NODE_DEND";break;case 41:return _.getLogger().trace("Long description:",I.yytext),21;break;case 42:return _.getLogger().trace("Long description:",I.yytext),21;break}},"anonymous"),rules:[/^(?:@\{)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^\"]+)/i,/^(?:[^}^"]+)/i,/^(?:\})/i,/^(?:\s*%%.*)/i,/^(?:kanban\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}@]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{shapeDataEndBracket:{rules:[],inclusive:!1},shapeDataStr:{rules:[2,3],inclusive:!1},shapeData:{rules:[1,4,5],inclusive:!1},CLASS:{rules:[9,10],inclusive:!1},ICON:{rules:[14,15],inclusive:!1},NSTR2:{rules:[28,29],inclusive:!1},NSTR:{rules:[31,32],inclusive:!1},NODE:{rules:[27,30,33,34,35,36,37,38,39,40,41,42],inclusive:!1},INITIAL:{rules:[0,6,7,8,11,12,13,16,17,18,19,20,21,22,23,24,25,26],inclusive:!0}}};return A}();C.lexer=T;function E(){this.yy={}}return o(E,"Parser"),E.prototype=C,C.Parser=E,new E}();DB.parser=DB;r1e=DB});var nl,RB,LB,NB,fJe,dJe,i1e,pJe,mJe,Yi,gJe,yJe,vJe,xJe,bJe,wJe,TJe,a1e,s1e=N(()=>{"use strict";zt();gr();vt();Ya();Ew();nl=[],RB=[],LB=0,NB={},fJe=o(()=>{nl=[],RB=[],LB=0,NB={}},"clear"),dJe=o(t=>{if(nl.length===0)return null;let e=nl[0].level,r=null;for(let n=nl.length-1;n>=0;n--)if(nl[n].level===e&&!r&&(r=nl[n]),nl[n].levell.parentId===i.id);for(let l of s){let u={id:l.id,parentId:i.id,label:Tr(l.label??"",n),isGroup:!1,ticket:l?.ticket,priority:l?.priority,assigned:l?.assigned,icon:l?.icon,shape:"kanbanItem",level:l.level,rx:5,ry:5,cssStyles:["text-align: left"]};e.push(u)}}return{nodes:e,edges:t,other:{},config:me()}},"getData"),mJe=o((t,e,r,n,i)=>{let a=me(),s=a.mindmap?.padding??or.mindmap.padding;switch(n){case Yi.ROUNDED_RECT:case Yi.RECT:case Yi.HEXAGON:s*=2}let l={id:Tr(e,a)||"kbn"+LB++,level:t,label:Tr(r,a),width:a.mindmap?.maxNodeWidth??or.mindmap.maxNodeWidth,padding:s,isGroup:!1};if(i!==void 0){let h;i.includes(` +`)?h=i+` +`:h=`{ +`+i+` +}`;let f=cm(h,{schema:lm});if(f.shape&&(f.shape!==f.shape.toLowerCase()||f.shape.includes("_")))throw new Error(`No such shape: ${f.shape}. Shape names should be lowercase.`);f?.shape&&f.shape==="kanbanItem"&&(l.shape=f?.shape),f?.label&&(l.label=f?.label),f?.icon&&(l.icon=f?.icon.toString()),f?.assigned&&(l.assigned=f?.assigned.toString()),f?.ticket&&(l.ticket=f?.ticket.toString()),f?.priority&&(l.priority=f?.priority)}let u=dJe(t);u?l.parentId=u.id||"kbn"+LB++:RB.push(l),nl.push(l)},"addNode"),Yi={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},gJe=o((t,e)=>{switch(Y.debug("In get type",t,e),t){case"[":return Yi.RECT;case"(":return e===")"?Yi.ROUNDED_RECT:Yi.CLOUD;case"((":return Yi.CIRCLE;case")":return Yi.CLOUD;case"))":return Yi.BANG;case"{{":return Yi.HEXAGON;default:return Yi.DEFAULT}},"getType"),yJe=o((t,e)=>{NB[t]=e},"setElementForId"),vJe=o(t=>{if(!t)return;let e=me(),r=nl[nl.length-1];t.icon&&(r.icon=Tr(t.icon,e)),t.class&&(r.cssClasses=Tr(t.class,e))},"decorateNode"),xJe=o(t=>{switch(t){case Yi.DEFAULT:return"no-border";case Yi.RECT:return"rect";case Yi.ROUNDED_RECT:return"rounded-rect";case Yi.CIRCLE:return"circle";case Yi.CLOUD:return"cloud";case Yi.BANG:return"bang";case Yi.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),bJe=o(()=>Y,"getLogger"),wJe=o(t=>NB[t],"getElementById"),TJe={clear:fJe,addNode:mJe,getSections:i1e,getData:pJe,nodeType:Yi,getType:gJe,setElementForId:yJe,decorateNode:vJe,type2Str:xJe,getLogger:bJe,getElementById:wJe},a1e=TJe});var kJe,o1e,l1e=N(()=>{"use strict";zt();vt();Vc();Ei();Ya();Hw();eT();kJe=o(async(t,e,r,n)=>{Y.debug(`Rendering kanban diagram +`+t);let a=n.db.getData(),s=me();s.htmlLabels=!1;let l=sa(e),u=l.append("g");u.attr("class","sections");let h=l.append("g");h.attr("class","items");let f=a.nodes.filter(v=>v.isGroup),d=0,p=10,m=[],g=25;for(let v of f){let x=s?.kanban?.sectionWidth||200;d=d+1,v.x=x*d+(d-1)*p/2,v.width=x,v.y=0,v.height=x*3,v.rx=5,v.ry=5,v.cssClasses=v.cssClasses+" section-"+d;let b=await ym(u,v);g=Math.max(g,b?.labelBBox?.height),m.push(b)}let y=0;for(let v of f){let x=m[y];y=y+1;let b=s?.kanban?.sectionWidth||200,w=-b*3/2+g,C=w,T=a.nodes.filter(S=>S.parentId===v.id);for(let S of T){if(S.isGroup)throw new Error("Groups within groups are not allowed in Kanban diagrams");S.x=v.x,S.width=b-1.5*p;let I=(await vm(h,S,{config:s})).node().getBBox();S.y=C+I.height/2,await k2(S),C=S.y+I.height/2+p/2}let E=x.cluster.select("rect"),A=Math.max(C-w+3*p,50)+(g-25);E.attr("height",A)}Ao(void 0,l,s.mindmap?.padding??or.kanban.padding,s.mindmap?.useMaxWidth??or.kanban.useMaxWidth)},"draw"),o1e={draw:kJe}});var EJe,SJe,c1e,u1e=N(()=>{"use strict";Ys();EJe=o(t=>{let e="";for(let n=0;nt.darkMode?Ot(n,i):Dt(n,i),"adjuster");for(let n=0;n` + .edge { + stroke-width: 3; + } + ${EJe(t)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${t.git0}; + } + .section-root text { + fill: ${t.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .cluster-label, .label { + color: ${t.textColor}; + fill: ${t.textColor}; + } + .kanban-label { + dy: 1em; + alignment-baseline: middle; + text-anchor: middle; + dominant-baseline: middle; + text-align: center; + } +`,"getStyles"),c1e=SJe});var h1e={};hr(h1e,{diagram:()=>CJe});var CJe,f1e=N(()=>{"use strict";n1e();s1e();l1e();u1e();CJe={db:a1e,renderer:o1e,parser:r1e,styles:c1e}});var MB,d4,m1e=N(()=>{"use strict";MB=function(){var t=o(function(l,u,h,f){for(h=h||{},f=l.length;f--;h[l[f]]=u);return h},"o"),e=[1,9],r=[1,10],n=[1,5,10,12],i={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SANKEY:4,NEWLINE:5,csv:6,opt_eof:7,record:8,csv_tail:9,EOF:10,"field[source]":11,COMMA:12,"field[target]":13,"field[value]":14,field:15,escaped:16,non_escaped:17,DQUOTE:18,ESCAPED_TEXT:19,NON_ESCAPED_TEXT:20,$accept:0,$end:1},terminals_:{2:"error",4:"SANKEY",5:"NEWLINE",10:"EOF",11:"field[source]",12:"COMMA",13:"field[target]",14:"field[value]",18:"DQUOTE",19:"ESCAPED_TEXT",20:"NON_ESCAPED_TEXT"},productions_:[0,[3,4],[6,2],[9,2],[9,0],[7,1],[7,0],[8,5],[15,1],[15,1],[16,3],[17,1]],performAction:o(function(u,h,f,d,p,m,g){var y=m.length-1;switch(p){case 7:let v=d.findOrCreateNode(m[y-4].trim().replaceAll('""','"')),x=d.findOrCreateNode(m[y-2].trim().replaceAll('""','"')),b=parseFloat(m[y].trim());d.addLink(v,x,b);break;case 8:case 9:case 11:this.$=m[y];break;case 10:this.$=m[y-1];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},{5:[1,3]},{6:4,8:5,15:6,16:7,17:8,18:e,20:r},{1:[2,6],7:11,10:[1,12]},t(r,[2,4],{9:13,5:[1,14]}),{12:[1,15]},t(n,[2,8]),t(n,[2,9]),{19:[1,16]},t(n,[2,11]),{1:[2,1]},{1:[2,5]},t(r,[2,2]),{6:17,8:5,15:6,16:7,17:8,18:e,20:r},{15:18,16:7,17:8,18:e,20:r},{18:[1,19]},t(r,[2,3]),{12:[1,20]},t(n,[2,10]),{15:21,16:7,17:8,18:e,20:r},t([1,5,10],[2,7])],defaultActions:{11:[2,1],12:[2,5]},parseError:o(function(u,h){if(h.recoverable)this.trace(u);else{var f=new Error(u);throw f.hash=h,f}},"parseError"),parse:o(function(u){var h=this,f=[0],d=[],p=[null],m=[],g=this.table,y="",v=0,x=0,b=0,w=2,C=1,T=m.slice.call(arguments,1),E=Object.create(this.lexer),A={yy:{}};for(var S in this.yy)Object.prototype.hasOwnProperty.call(this.yy,S)&&(A.yy[S]=this.yy[S]);E.setInput(u,A.yy),A.yy.lexer=E,A.yy.parser=this,typeof E.yylloc>"u"&&(E.yylloc={});var _=E.yylloc;m.push(_);var I=E.options&&E.options.ranges;typeof A.yy.parseError=="function"?this.parseError=A.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function D(ie){f.length=f.length-2*ie,p.length=p.length-ie,m.length=m.length-ie}o(D,"popStack");function k(){var ie;return ie=d.pop()||E.lex()||C,typeof ie!="number"&&(ie instanceof Array&&(d=ie,ie=d.pop()),ie=h.symbols_[ie]||ie),ie}o(k,"lex");for(var L,R,O,M,B,F,P={},z,$,H,Q;;){if(O=f[f.length-1],this.defaultActions[O]?M=this.defaultActions[O]:((L===null||typeof L>"u")&&(L=k()),M=g[O]&&g[O][L]),typeof M>"u"||!M.length||!M[0]){var j="";Q=[];for(z in g[O])this.terminals_[z]&&z>w&&Q.push("'"+this.terminals_[z]+"'");E.showPosition?j="Parse error on line "+(v+1)+`: +`+E.showPosition()+` +Expecting `+Q.join(", ")+", got '"+(this.terminals_[L]||L)+"'":j="Parse error on line "+(v+1)+": Unexpected "+(L==C?"end of input":"'"+(this.terminals_[L]||L)+"'"),this.parseError(j,{text:E.match,token:this.terminals_[L]||L,line:E.yylineno,loc:_,expected:Q})}if(M[0]instanceof Array&&M.length>1)throw new Error("Parse Error: multiple actions possible at state: "+O+", token: "+L);switch(M[0]){case 1:f.push(L),p.push(E.yytext),m.push(E.yylloc),f.push(M[1]),L=null,R?(L=R,R=null):(x=E.yyleng,y=E.yytext,v=E.yylineno,_=E.yylloc,b>0&&b--);break;case 2:if($=this.productions_[M[1]][1],P.$=p[p.length-$],P._$={first_line:m[m.length-($||1)].first_line,last_line:m[m.length-1].last_line,first_column:m[m.length-($||1)].first_column,last_column:m[m.length-1].last_column},I&&(P._$.range=[m[m.length-($||1)].range[0],m[m.length-1].range[1]]),F=this.performAction.apply(P,[y,x,v,A.yy,M[1],p,m].concat(T)),typeof F<"u")return F;$&&(f=f.slice(0,-1*$*2),p=p.slice(0,-1*$),m=m.slice(0,-1*$)),f.push(this.productions_[M[1]][0]),p.push(P.$),m.push(P._$),H=g[f[f.length-2]][f[f.length-1]],f.push(H);break;case 3:return!0}}return!0},"parse")},a=function(){var l={EOF:1,parseError:o(function(h,f){if(this.yy.parser)this.yy.parser.parseError(h,f);else throw new Error(h)},"parseError"),setInput:o(function(u,h){return this.yy=h||this.yy||{},this._input=u,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var u=this._input[0];this.yytext+=u,this.yyleng++,this.offset++,this.match+=u,this.matched+=u;var h=u.match(/(?:\r\n?|\n).*/g);return h?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),u},"input"),unput:o(function(u){var h=u.length,f=u.split(/(?:\r\n?|\n)/g);this._input=u+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-h),this.offset-=h;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),f.length-1&&(this.yylineno-=f.length-1);var p=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:f?(f.length===d.length?this.yylloc.first_column:0)+d[d.length-f.length].length-f[0].length:this.yylloc.first_column-h},this.options.ranges&&(this.yylloc.range=[p[0],p[0]+this.yyleng-h]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(u){this.unput(this.match.slice(u))},"less"),pastInput:o(function(){var u=this.matched.substr(0,this.matched.length-this.match.length);return(u.length>20?"...":"")+u.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var u=this.match;return u.length<20&&(u+=this._input.substr(0,20-u.length)),(u.substr(0,20)+(u.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var u=this.pastInput(),h=new Array(u.length+1).join("-");return u+this.upcomingInput()+` +`+h+"^"},"showPosition"),test_match:o(function(u,h){var f,d,p;if(this.options.backtrack_lexer&&(p={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(p.yylloc.range=this.yylloc.range.slice(0))),d=u[0].match(/(?:\r\n?|\n).*/g),d&&(this.yylineno+=d.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:d?d[d.length-1].length-d[d.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+u[0].length},this.yytext+=u[0],this.match+=u[0],this.matches=u,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(u[0].length),this.matched+=u[0],f=this.performAction.call(this,this.yy,this,h,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),f)return f;if(this._backtrack){for(var m in p)this[m]=p[m];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var u,h,f,d;this._more||(this.yytext="",this.match="");for(var p=this._currentRules(),m=0;mh[0].length)){if(h=f,d=m,this.options.backtrack_lexer){if(u=this.test_match(f,p[m]),u!==!1)return u;if(this._backtrack){h=!1;continue}else return!1}else if(!this.options.flex)break}return h?(u=this.test_match(h,p[d]),u!==!1?u:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var h=this.next();return h||this.lex()},"lex"),begin:o(function(h){this.conditionStack.push(h)},"begin"),popState:o(function(){var h=this.conditionStack.length-1;return h>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(h){return h=this.conditionStack.length-1-Math.abs(h||0),h>=0?this.conditionStack[h]:"INITIAL"},"topState"),pushState:o(function(h){this.begin(h)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(h,f,d,p){var m=p;switch(d){case 0:return this.pushState("csv"),4;break;case 1:return 10;case 2:return 5;case 3:return 12;case 4:return this.pushState("escaped_text"),18;break;case 5:return 20;case 6:return this.popState("escaped_text"),18;break;case 7:return 19}},"anonymous"),rules:[/^(?:sankey-beta\b)/i,/^(?:$)/i,/^(?:((\u000D\u000A)|(\u000A)))/i,/^(?:(\u002C))/i,/^(?:(\u0022))/i,/^(?:([\u0020-\u0021\u0023-\u002B\u002D-\u007E])*)/i,/^(?:(\u0022)(?!(\u0022)))/i,/^(?:(([\u0020-\u0021\u0023-\u002B\u002D-\u007E])|(\u002C)|(\u000D)|(\u000A)|(\u0022)(\u0022))*)/i],conditions:{csv:{rules:[1,2,3,4,5,6,7],inclusive:!1},escaped_text:{rules:[6,7],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7],inclusive:!0}}};return l}();i.lexer=a;function s(){this.yy={}}return o(s,"Parser"),s.prototype=i,i.Parser=s,new s}();MB.parser=MB;d4=MB});var XS,jS,YS,LJe,IB,RJe,OB,NJe,MJe,IJe,OJe,g1e,y1e=N(()=>{"use strict";zt();gr();mi();XS=[],jS=[],YS=new Map,LJe=o(()=>{XS=[],jS=[],YS=new Map,Ar()},"clear"),IB=class{constructor(e,r,n=0){this.source=e;this.target=r;this.value=n}static{o(this,"SankeyLink")}},RJe=o((t,e,r)=>{XS.push(new IB(t,e,r))},"addLink"),OB=class{constructor(e){this.ID=e}static{o(this,"SankeyNode")}},NJe=o(t=>{t=Ze.sanitizeText(t,me());let e=YS.get(t);return e===void 0&&(e=new OB(t),YS.set(t,e),jS.push(e)),e},"findOrCreateNode"),MJe=o(()=>jS,"getNodes"),IJe=o(()=>XS,"getLinks"),OJe=o(()=>({nodes:jS.map(t=>({id:t.ID})),links:XS.map(t=>({source:t.source.ID,target:t.target.ID,value:t.value}))}),"getGraph"),g1e={nodesMap:YS,getConfig:o(()=>me().sankey,"getConfig"),getNodes:MJe,getLinks:IJe,getGraph:OJe,addLink:RJe,findOrCreateNode:NJe,getAccTitle:Rr,setAccTitle:Lr,getAccDescription:Mr,setAccDescription:Nr,getDiagramTitle:Ir,setDiagramTitle:$r,clear:LJe}});function p4(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var v1e=N(()=>{"use strict";o(p4,"max")});function cy(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var x1e=N(()=>{"use strict";o(cy,"min")});function uy(t,e){let r=0;if(e===void 0)for(let n of t)(n=+n)&&(r+=n);else{let n=-1;for(let i of t)(i=+e(i,++n,t))&&(r+=i)}return r}var b1e=N(()=>{"use strict";o(uy,"sum")});var PB=N(()=>{"use strict";v1e();x1e();b1e()});function PJe(t){return t.target.depth}function BB(t){return t.depth}function FB(t,e){return e-1-t.height}function m4(t,e){return t.sourceLinks.length?t.depth:e-1}function $B(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?cy(t.sourceLinks,PJe)-1:0}var zB=N(()=>{"use strict";PB();o(PJe,"targetDepth");o(BB,"left");o(FB,"right");o(m4,"justify");o($B,"center")});function hy(t){return function(){return t}}var w1e=N(()=>{"use strict";o(hy,"constant")});function T1e(t,e){return KS(t.source,e.source)||t.index-e.index}function k1e(t,e){return KS(t.target,e.target)||t.index-e.index}function KS(t,e){return t.y0-e.y0}function GB(t){return t.value}function BJe(t){return t.index}function FJe(t){return t.nodes}function $Je(t){return t.links}function E1e(t,e){let r=t.get(e);if(!r)throw new Error("missing: "+e);return r}function S1e({nodes:t}){for(let e of t){let r=e.y0,n=r;for(let i of e.sourceLinks)i.y0=r+i.width/2,r+=i.width;for(let i of e.targetLinks)i.y1=n+i.width/2,n+=i.width}}function QS(){let t=0,e=0,r=1,n=1,i=24,a=8,s,l=BJe,u=m4,h,f,d=FJe,p=$Je,m=6;function g(){let O={nodes:d.apply(null,arguments),links:p.apply(null,arguments)};return y(O),v(O),x(O),b(O),T(O),S1e(O),O}o(g,"sankey"),g.update=function(O){return S1e(O),O},g.nodeId=function(O){return arguments.length?(l=typeof O=="function"?O:hy(O),g):l},g.nodeAlign=function(O){return arguments.length?(u=typeof O=="function"?O:hy(O),g):u},g.nodeSort=function(O){return arguments.length?(h=O,g):h},g.nodeWidth=function(O){return arguments.length?(i=+O,g):i},g.nodePadding=function(O){return arguments.length?(a=s=+O,g):a},g.nodes=function(O){return arguments.length?(d=typeof O=="function"?O:hy(O),g):d},g.links=function(O){return arguments.length?(p=typeof O=="function"?O:hy(O),g):p},g.linkSort=function(O){return arguments.length?(f=O,g):f},g.size=function(O){return arguments.length?(t=e=0,r=+O[0],n=+O[1],g):[r-t,n-e]},g.extent=function(O){return arguments.length?(t=+O[0][0],r=+O[1][0],e=+O[0][1],n=+O[1][1],g):[[t,e],[r,n]]},g.iterations=function(O){return arguments.length?(m=+O,g):m};function y({nodes:O,links:M}){for(let[F,P]of O.entries())P.index=F,P.sourceLinks=[],P.targetLinks=[];let B=new Map(O.map((F,P)=>[l(F,P,O),F]));for(let[F,P]of M.entries()){P.index=F;let{source:z,target:$}=P;typeof z!="object"&&(z=P.source=E1e(B,z)),typeof $!="object"&&($=P.target=E1e(B,$)),z.sourceLinks.push(P),$.targetLinks.push(P)}if(f!=null)for(let{sourceLinks:F,targetLinks:P}of O)F.sort(f),P.sort(f)}o(y,"computeNodeLinks");function v({nodes:O}){for(let M of O)M.value=M.fixedValue===void 0?Math.max(uy(M.sourceLinks,GB),uy(M.targetLinks,GB)):M.fixedValue}o(v,"computeNodeValues");function x({nodes:O}){let M=O.length,B=new Set(O),F=new Set,P=0;for(;B.size;){for(let z of B){z.depth=P;for(let{target:$}of z.sourceLinks)F.add($)}if(++P>M)throw new Error("circular link");B=F,F=new Set}}o(x,"computeNodeDepths");function b({nodes:O}){let M=O.length,B=new Set(O),F=new Set,P=0;for(;B.size;){for(let z of B){z.height=P;for(let{source:$}of z.targetLinks)F.add($)}if(++P>M)throw new Error("circular link");B=F,F=new Set}}o(b,"computeNodeHeights");function w({nodes:O}){let M=p4(O,P=>P.depth)+1,B=(r-t-i)/(M-1),F=new Array(M);for(let P of O){let z=Math.max(0,Math.min(M-1,Math.floor(u.call(null,P,M))));P.layer=z,P.x0=t+z*B,P.x1=P.x0+i,F[z]?F[z].push(P):F[z]=[P]}if(h)for(let P of F)P.sort(h);return F}o(w,"computeNodeLayers");function C(O){let M=cy(O,B=>(n-e-(B.length-1)*s)/uy(B,GB));for(let B of O){let F=e;for(let P of B){P.y0=F,P.y1=F+P.value*M,F=P.y1+s;for(let z of P.sourceLinks)z.width=z.value*M}F=(n-F+s)/(B.length+1);for(let P=0;PB.length)-1)),C(M);for(let B=0;B0))continue;let j=(H/Q-$.y0)*M;$.y0+=j,$.y1+=j,D($)}h===void 0&&z.sort(KS),S(z,B)}}o(E,"relaxLeftToRight");function A(O,M,B){for(let F=O.length,P=F-2;P>=0;--P){let z=O[P];for(let $ of z){let H=0,Q=0;for(let{target:ie,value:ne}of $.sourceLinks){let le=ne*(ie.layer-$.layer);H+=R($,ie)*le,Q+=le}if(!(Q>0))continue;let j=(H/Q-$.y0)*M;$.y0+=j,$.y1+=j,D($)}h===void 0&&z.sort(KS),S(z,B)}}o(A,"relaxRightToLeft");function S(O,M){let B=O.length>>1,F=O[B];I(O,F.y0-s,B-1,M),_(O,F.y1+s,B+1,M),I(O,n,O.length-1,M),_(O,e,0,M)}o(S,"resolveCollisions");function _(O,M,B,F){for(;B1e-6&&(P.y0+=z,P.y1+=z),M=P.y1+s}}o(_,"resolveCollisionsTopToBottom");function I(O,M,B,F){for(;B>=0;--B){let P=O[B],z=(P.y1-M)*F;z>1e-6&&(P.y0-=z,P.y1-=z),M=P.y0-s}}o(I,"resolveCollisionsBottomToTop");function D({sourceLinks:O,targetLinks:M}){if(f===void 0){for(let{source:{sourceLinks:B}}of M)B.sort(k1e);for(let{target:{targetLinks:B}}of O)B.sort(T1e)}}o(D,"reorderNodeLinks");function k(O){if(f===void 0)for(let{sourceLinks:M,targetLinks:B}of O)M.sort(k1e),B.sort(T1e)}o(k,"reorderLinks");function L(O,M){let B=O.y0-(O.sourceLinks.length-1)*s/2;for(let{target:F,width:P}of O.sourceLinks){if(F===M)break;B+=P+s}for(let{source:F,width:P}of M.targetLinks){if(F===O)break;B-=P}return B}o(L,"targetTop");function R(O,M){let B=M.y0-(M.targetLinks.length-1)*s/2;for(let{source:F,width:P}of M.targetLinks){if(F===O)break;B+=P+s}for(let{target:F,width:P}of O.sourceLinks){if(F===M)break;B-=P}return B}return o(R,"sourceTop"),g}var C1e=N(()=>{"use strict";PB();zB();w1e();o(T1e,"ascendingSourceBreadth");o(k1e,"ascendingTargetBreadth");o(KS,"ascendingBreadth");o(GB,"value");o(BJe,"defaultId");o(FJe,"defaultNodes");o($Je,"defaultLinks");o(E1e,"find");o(S1e,"computeLinkBreadths");o(QS,"Sankey")});function HB(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function A1e(){return new HB}var VB,UB,Xp,zJe,WB,_1e=N(()=>{"use strict";VB=Math.PI,UB=2*VB,Xp=1e-6,zJe=UB-Xp;o(HB,"Path");o(A1e,"path");HB.prototype=A1e.prototype={constructor:HB,moveTo:o(function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},"moveTo"),closePath:o(function(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},"closePath"),lineTo:o(function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},"lineTo"),quadraticCurveTo:o(function(t,e,r,n){this._+="Q"+ +t+","+ +e+","+(this._x1=+r)+","+(this._y1=+n)},"quadraticCurveTo"),bezierCurveTo:o(function(t,e,r,n,i,a){this._+="C"+ +t+","+ +e+","+ +r+","+ +n+","+(this._x1=+i)+","+(this._y1=+a)},"bezierCurveTo"),arcTo:o(function(t,e,r,n,i){t=+t,e=+e,r=+r,n=+n,i=+i;var a=this._x1,s=this._y1,l=r-t,u=n-e,h=a-t,f=s-e,d=h*h+f*f;if(i<0)throw new Error("negative radius: "+i);if(this._x1===null)this._+="M"+(this._x1=t)+","+(this._y1=e);else if(d>Xp)if(!(Math.abs(f*l-u*h)>Xp)||!i)this._+="L"+(this._x1=t)+","+(this._y1=e);else{var p=r-a,m=n-s,g=l*l+u*u,y=p*p+m*m,v=Math.sqrt(g),x=Math.sqrt(d),b=i*Math.tan((VB-Math.acos((g+d-y)/(2*v*x)))/2),w=b/x,C=b/v;Math.abs(w-1)>Xp&&(this._+="L"+(t+w*h)+","+(e+w*f)),this._+="A"+i+","+i+",0,0,"+ +(f*p>h*m)+","+(this._x1=t+C*l)+","+(this._y1=e+C*u)}},"arcTo"),arc:o(function(t,e,r,n,i,a){t=+t,e=+e,r=+r,a=!!a;var s=r*Math.cos(n),l=r*Math.sin(n),u=t+s,h=e+l,f=1^a,d=a?n-i:i-n;if(r<0)throw new Error("negative radius: "+r);this._x1===null?this._+="M"+u+","+h:(Math.abs(this._x1-u)>Xp||Math.abs(this._y1-h)>Xp)&&(this._+="L"+u+","+h),r&&(d<0&&(d=d%UB+UB),d>zJe?this._+="A"+r+","+r+",0,1,"+f+","+(t-s)+","+(e-l)+"A"+r+","+r+",0,1,"+f+","+(this._x1=u)+","+(this._y1=h):d>Xp&&(this._+="A"+r+","+r+",0,"+ +(d>=VB)+","+f+","+(this._x1=t+r*Math.cos(i))+","+(this._y1=e+r*Math.sin(i))))},"arc"),rect:o(function(t,e,r,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +r+"v"+ +n+"h"+-r+"Z"},"rect"),toString:o(function(){return this._},"toString")};WB=A1e});var D1e=N(()=>{"use strict";_1e()});function ZS(t){return o(function(){return t},"constant")}var L1e=N(()=>{"use strict";o(ZS,"default")});function R1e(t){return t[0]}function N1e(t){return t[1]}var M1e=N(()=>{"use strict";o(R1e,"x");o(N1e,"y")});var I1e,O1e=N(()=>{"use strict";I1e=Array.prototype.slice});function GJe(t){return t.source}function VJe(t){return t.target}function UJe(t){var e=GJe,r=VJe,n=R1e,i=N1e,a=null;function s(){var l,u=I1e.call(arguments),h=e.apply(this,u),f=r.apply(this,u);if(a||(a=l=WB()),t(a,+n.apply(this,(u[0]=h,u)),+i.apply(this,u),+n.apply(this,(u[0]=f,u)),+i.apply(this,u)),l)return a=null,l+""||null}return o(s,"link"),s.source=function(l){return arguments.length?(e=l,s):e},s.target=function(l){return arguments.length?(r=l,s):r},s.x=function(l){return arguments.length?(n=typeof l=="function"?l:ZS(+l),s):n},s.y=function(l){return arguments.length?(i=typeof l=="function"?l:ZS(+l),s):i},s.context=function(l){return arguments.length?(a=l??null,s):a},s}function HJe(t,e,r,n,i){t.moveTo(e,r),t.bezierCurveTo(e=(e+n)/2,r,e,i,n,i)}function qB(){return UJe(HJe)}var P1e=N(()=>{"use strict";D1e();O1e();L1e();M1e();o(GJe,"linkSource");o(VJe,"linkTarget");o(UJe,"link");o(HJe,"curveHorizontal");o(qB,"linkHorizontal")});var B1e=N(()=>{"use strict";P1e()});function WJe(t){return[t.source.x1,t.y0]}function qJe(t){return[t.target.x0,t.y1]}function JS(){return qB().source(WJe).target(qJe)}var F1e=N(()=>{"use strict";B1e();o(WJe,"horizontalSource");o(qJe,"horizontalTarget");o(JS,"default")});var $1e=N(()=>{"use strict";C1e();zB();F1e()});var g4,z1e=N(()=>{"use strict";g4=class t{static{o(this,"Uid")}static{this.count=0}static next(e){return new t(e+ ++t.count)}constructor(e){this.id=e,this.href=`#${e}`}toString(){return"url("+this.href+")"}}});var YJe,XJe,G1e,V1e=N(()=>{"use strict";zt();dr();$1e();Ei();z1e();YJe={left:BB,right:FB,center:$B,justify:m4},XJe=o(function(t,e,r,n){let{securityLevel:i,sankey:a}=me(),s=A3.sankey,l;i==="sandbox"&&(l=Ge("#i"+e));let u=i==="sandbox"?Ge(l.nodes()[0].contentDocument.body):Ge("body"),h=i==="sandbox"?u.select(`[id="${e}"]`):Ge(`[id="${e}"]`),f=a?.width??s.width,d=a?.height??s.width,p=a?.useMaxWidth??s.useMaxWidth,m=a?.nodeAlignment??s.nodeAlignment,g=a?.prefix??s.prefix,y=a?.suffix??s.suffix,v=a?.showValues??s.showValues,x=n.db.getGraph(),b=YJe[m];QS().nodeId(I=>I.id).nodeWidth(10).nodePadding(10+(v?15:0)).nodeAlign(b).extent([[0,0],[f,d]])(x);let T=gu(e9);h.append("g").attr("class","nodes").selectAll(".node").data(x.nodes).join("g").attr("class","node").attr("id",I=>(I.uid=g4.next("node-")).id).attr("transform",function(I){return"translate("+I.x0+","+I.y0+")"}).attr("x",I=>I.x0).attr("y",I=>I.y0).append("rect").attr("height",I=>I.y1-I.y0).attr("width",I=>I.x1-I.x0).attr("fill",I=>T(I.id));let E=o(({id:I,value:D})=>v?`${I} +${g}${Math.round(D*100)/100}${y}`:I,"getText");h.append("g").attr("class","node-labels").attr("font-size",14).selectAll("text").data(x.nodes).join("text").attr("x",I=>I.x0(I.y1+I.y0)/2).attr("dy",`${v?"0":"0.35"}em`).attr("text-anchor",I=>I.x0(D.uid=g4.next("linearGradient-")).id).attr("gradientUnits","userSpaceOnUse").attr("x1",D=>D.source.x1).attr("x2",D=>D.target.x0);I.append("stop").attr("offset","0%").attr("stop-color",D=>T(D.source.id)),I.append("stop").attr("offset","100%").attr("stop-color",D=>T(D.target.id))}let _;switch(S){case"gradient":_=o(I=>I.uid,"coloring");break;case"source":_=o(I=>T(I.source.id),"coloring");break;case"target":_=o(I=>T(I.target.id),"coloring");break;default:_=S}A.append("path").attr("d",JS()).attr("stroke",_).attr("stroke-width",I=>Math.max(1,I.width)),Ao(void 0,h,0,p)},"draw"),G1e={draw:XJe}});var U1e,H1e=N(()=>{"use strict";U1e=o(t=>t.replaceAll(/^[^\S\n\r]+|[^\S\n\r]+$/g,"").replaceAll(/([\n\r])+/g,` +`).trim(),"prepareTextForParsing")});var jJe,W1e,q1e=N(()=>{"use strict";jJe=o(t=>`.label { + font-family: ${t.fontFamily}; + }`,"getStyles"),W1e=jJe});var Y1e={};hr(Y1e,{diagram:()=>QJe});var KJe,QJe,X1e=N(()=>{"use strict";m1e();y1e();V1e();H1e();q1e();KJe=d4.parse.bind(d4);d4.parse=t=>KJe(U1e(t));QJe={styles:W1e,parser:d4,db:g1e,renderer:G1e}});var Q1e,YB,tet,ret,net,iet,aet,Bf,XB=N(()=>{"use strict";ji();Ya();ir();mi();Q1e={packet:[]},YB=structuredClone(Q1e),tet=or.packet,ret=o(()=>{let t=Fi({...tet,...cr().packet});return t.showBits&&(t.paddingY+=10),t},"getConfig"),net=o(()=>YB.packet,"getPacket"),iet=o(t=>{t.length>0&&YB.packet.push(t)},"pushWord"),aet=o(()=>{Ar(),YB=structuredClone(Q1e)},"clear"),Bf={pushWord:iet,getPacket:net,getConfig:ret,clear:aet,setAccTitle:Lr,getAccTitle:Rr,setDiagramTitle:$r,getDiagramTitle:Ir,getAccDescription:Mr,setAccDescription:Nr}});var set,oet,cet,Z1e,J1e=N(()=>{"use strict";kp();vt();T1();XB();set=1e4,oet=o(t=>{$c(t,Bf);let e=-1,r=[],n=1,{bitsPerRow:i}=Bf.getConfig();for(let{start:a,end:s,label:l}of t.blocks){if(s&&s{if(t.end===void 0&&(t.end=t.start),t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);return t.end+1<=e*r?[t,void 0]:[{start:t.start,end:e*r-1,label:t.label},{start:e*r,end:t.end,label:t.label}]},"getNextFittingBlock"),Z1e={parse:o(async t=>{let e=await uo("packet",t);Y.debug(e),oet(e)},"parse")}});var uet,het,eye,tye=N(()=>{"use strict";Vc();Ei();uet=o((t,e,r,n)=>{let i=n.db,a=i.getConfig(),{rowHeight:s,paddingY:l,bitWidth:u,bitsPerRow:h}=a,f=i.getPacket(),d=i.getDiagramTitle(),p=s+l,m=p*(f.length+1)-(d?0:s),g=u*h+2,y=sa(e);y.attr("viewbox",`0 0 ${g} ${m}`),vn(y,m,g,a.useMaxWidth);for(let[v,x]of f.entries())het(y,x,v,a);y.append("text").text(d).attr("x",g/2).attr("y",m-p/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),het=o((t,e,r,{rowHeight:n,paddingX:i,paddingY:a,bitWidth:s,bitsPerRow:l,showBits:u})=>{let h=t.append("g"),f=r*(n+a)+a;for(let d of e){let p=d.start%l*s+1,m=(d.end-d.start+1)*s-i;if(h.append("rect").attr("x",p).attr("y",f).attr("width",m).attr("height",n).attr("class","packetBlock"),h.append("text").attr("x",p+m/2).attr("y",f+n/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(d.label),!u)continue;let g=d.end===d.start,y=f-2;h.append("text").attr("x",p+(g?m/2:0)).attr("y",y).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",g?"middle":"start").text(d.start),g||h.append("text").attr("x",p+m).attr("y",y).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(d.end)}},"drawWord"),eye={draw:uet}});var fet,rye,nye=N(()=>{"use strict";ir();fet={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},rye=o(({packet:t}={})=>{let e=Fi(fet,t);return` + .packetByte { + font-size: ${e.byteFontSize}; + } + .packetByte.start { + fill: ${e.startByteColor}; + } + .packetByte.end { + fill: ${e.endByteColor}; + } + .packetLabel { + fill: ${e.labelColor}; + font-size: ${e.labelFontSize}; + } + .packetTitle { + fill: ${e.titleColor}; + font-size: ${e.titleFontSize}; + } + .packetBlock { + stroke: ${e.blockStrokeColor}; + stroke-width: ${e.blockStrokeWidth}; + fill: ${e.blockFillColor}; + } + `},"styles")});var iye={};hr(iye,{diagram:()=>det});var det,aye=N(()=>{"use strict";XB();J1e();tye();nye();det={parser:Z1e,db:Bf,renderer:eye,styles:rye}});var fy,lye,jp,get,yet,cye,vet,xet,bet,wet,Tet,ket,Eet,Kp,jB=N(()=>{"use strict";ji();Ya();ir();mi();fy={showLegend:!0,ticks:5,max:null,min:0,graticule:"circle"},lye={axes:[],curves:[],options:fy},jp=structuredClone(lye),get=or.radar,yet=o(()=>Fi({...get,...cr().radar}),"getConfig"),cye=o(()=>jp.axes,"getAxes"),vet=o(()=>jp.curves,"getCurves"),xet=o(()=>jp.options,"getOptions"),bet=o(t=>{jp.axes=t.map(e=>({name:e.name,label:e.label??e.name}))},"setAxes"),wet=o(t=>{jp.curves=t.map(e=>({name:e.name,label:e.label??e.name,entries:Tet(e.entries)}))},"setCurves"),Tet=o(t=>{if(t[0].axis==null)return t.map(r=>r.value);let e=cye();if(e.length===0)throw new Error("Axes must be populated before curves for reference entries");return e.map(r=>{let n=t.find(i=>i.axis?.$refText===r.name);if(n===void 0)throw new Error("Missing entry for axis "+r.label);return n.value})},"computeCurveEntries"),ket=o(t=>{let e=t.reduce((r,n)=>(r[n.name]=n,r),{});jp.options={showLegend:e.showLegend?.value??fy.showLegend,ticks:e.ticks?.value??fy.ticks,max:e.max?.value??fy.max,min:e.min?.value??fy.min,graticule:e.graticule?.value??fy.graticule}},"setOptions"),Eet=o(()=>{Ar(),jp=structuredClone(lye)},"clear"),Kp={getAxes:cye,getCurves:vet,getOptions:xet,setAxes:bet,setCurves:wet,setOptions:ket,getConfig:yet,clear:Eet,setAccTitle:Lr,getAccTitle:Rr,setDiagramTitle:$r,getDiagramTitle:Ir,getAccDescription:Mr,setAccDescription:Nr}});var Cet,uye,hye=N(()=>{"use strict";kp();vt();T1();jB();Cet=o(t=>{$c(t,Kp);let{axes:e,curves:r,options:n}=t;Kp.setAxes(e),Kp.setCurves(r),Kp.setOptions(n)},"populate"),uye={parse:o(async t=>{let e=await uo("radar",t);Y.debug(e),Cet(e)},"parse")}});function Ret(t,e,r,n,i,a,s){let l=e.length,u=Math.min(s.width,s.height)/2;r.forEach((h,f)=>{if(h.entries.length!==l)return;let d=h.entries.map((p,m)=>{let g=2*Math.PI*m/l-Math.PI/2,y=Net(p,n,i,u),v=y*Math.cos(g),x=y*Math.sin(g);return{x:v,y:x}});a==="circle"?t.append("path").attr("d",Met(d,s.curveTension)).attr("class",`radarCurve-${f}`):a==="polygon"&&t.append("polygon").attr("points",d.map(p=>`${p.x},${p.y}`).join(" ")).attr("class",`radarCurve-${f}`)})}function Net(t,e,r,n){let i=Math.min(Math.max(t,e),r);return n*(i-e)/(r-e)}function Met(t,e){let r=t.length,n=`M${t[0].x},${t[0].y}`;for(let i=0;i{let h=t.append("g").attr("transform",`translate(${i}, ${a+u*s})`);h.append("rect").attr("width",12).attr("height",12).attr("class",`radarLegendBox-${u}`),h.append("text").attr("x",16).attr("y",0).attr("class","radarLegendText").text(l.label)})}var Aet,_et,Det,Let,fye,dye=N(()=>{"use strict";Vc();Aet=o((t,e,r,n)=>{let i=n.db,a=i.getAxes(),s=i.getCurves(),l=i.getOptions(),u=i.getConfig(),h=i.getDiagramTitle(),f=sa(e),d=_et(f,u),p=l.max??Math.max(...s.map(y=>Math.max(...y.entries))),m=l.min,g=Math.min(u.width,u.height)/2;Det(d,a,g,l.ticks,l.graticule),Let(d,a,g,u),Ret(d,a,s,m,p,l.graticule,u),Iet(d,s,l.showLegend,u),d.append("text").attr("class","radarTitle").text(h).attr("x",0).attr("y",-u.height/2-u.marginTop)},"draw"),_et=o((t,e)=>{let r=e.width+e.marginLeft+e.marginRight,n=e.height+e.marginTop+e.marginBottom,i={x:e.marginLeft+e.width/2,y:e.marginTop+e.height/2};return t.attr("viewbox",`0 0 ${r} ${n}`).attr("width",r).attr("height",n),t.append("g").attr("transform",`translate(${i.x}, ${i.y})`)},"drawFrame"),Det=o((t,e,r,n,i)=>{if(i==="circle")for(let a=0;a{let d=2*f*Math.PI/a-Math.PI/2,p=l*Math.cos(d),m=l*Math.sin(d);return`${p},${m}`}).join(" ");t.append("polygon").attr("points",u).attr("class","radarGraticule")}}},"drawGraticule"),Let=o((t,e,r,n)=>{let i=e.length;for(let a=0;a{"use strict";ir();_y();ji();Oet=o((t,e)=>{let r="";for(let n=0;n{let e=oh(),r=cr(),n=Fi(e,r.themeVariables),i=Fi(n.radar,t);return{themeVariables:n,radarOptions:i}},"buildRadarStyleOptions"),pye=o(({radar:t}={})=>{let{themeVariables:e,radarOptions:r}=Pet(t);return` + .radarTitle { + font-size: ${e.fontSize}; + color: ${e.titleColor}; + dominant-baseline: hanging; + text-anchor: middle; + } + .radarAxisLine { + stroke: ${r.axisColor}; + stroke-width: ${r.axisStrokeWidth}; + } + .radarAxisLabel { + dominant-baseline: middle; + text-anchor: middle; + font-size: ${r.axisLabelFontSize}px; + color: ${r.axisColor}; + } + .radarGraticule { + fill: ${r.graticuleColor}; + fill-opacity: ${r.graticuleOpacity}; + stroke: ${r.graticuleColor}; + stroke-width: ${r.graticuleStrokeWidth}; + } + .radarLegendText { + text-anchor: start; + font-size: ${r.legendFontSize}px; + dominant-baseline: hanging; + } + ${Oet(e,r)} + `},"styles")});var gye={};hr(gye,{diagram:()=>Bet});var Bet,yye=N(()=>{"use strict";jB();hye();dye();mye();Bet={parser:uye,db:Kp,renderer:fye,styles:pye}});var KB,bye,wye=N(()=>{"use strict";KB=function(){var t=o(function(w,C,T,E){for(T=T||{},E=w.length;E--;T[w[E]]=C);return T},"o"),e=[1,7],r=[1,13],n=[1,14],i=[1,15],a=[1,19],s=[1,16],l=[1,17],u=[1,18],h=[8,30],f=[8,21,28,29,30,31,32,40,44,47],d=[1,23],p=[1,24],m=[8,15,16,21,28,29,30,31,32,40,44,47],g=[8,15,16,21,27,28,29,30,31,32,40,44,47],y=[1,49],v={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,spaceLines:3,SPACELINE:4,NL:5,separator:6,SPACE:7,EOF:8,start:9,BLOCK_DIAGRAM_KEY:10,document:11,stop:12,statement:13,link:14,LINK:15,START_LINK:16,LINK_LABEL:17,STR:18,nodeStatement:19,columnsStatement:20,SPACE_BLOCK:21,blockStatement:22,classDefStatement:23,cssClassStatement:24,styleStatement:25,node:26,SIZE:27,COLUMNS:28,"id-block":29,end:30,block:31,NODE_ID:32,nodeShapeNLabel:33,dirList:34,DIR:35,NODE_DSTART:36,NODE_DEND:37,BLOCK_ARROW_START:38,BLOCK_ARROW_END:39,classDef:40,CLASSDEF_ID:41,CLASSDEF_STYLEOPTS:42,DEFAULT:43,class:44,CLASSENTITY_IDS:45,STYLECLASS:46,style:47,STYLE_ENTITY_IDS:48,STYLE_DEFINITION_DATA:49,$accept:0,$end:1},terminals_:{2:"error",4:"SPACELINE",5:"NL",7:"SPACE",8:"EOF",10:"BLOCK_DIAGRAM_KEY",15:"LINK",16:"START_LINK",17:"LINK_LABEL",18:"STR",21:"SPACE_BLOCK",27:"SIZE",28:"COLUMNS",29:"id-block",30:"end",31:"block",32:"NODE_ID",35:"DIR",36:"NODE_DSTART",37:"NODE_DEND",38:"BLOCK_ARROW_START",39:"BLOCK_ARROW_END",40:"classDef",41:"CLASSDEF_ID",42:"CLASSDEF_STYLEOPTS",43:"DEFAULT",44:"class",45:"CLASSENTITY_IDS",46:"STYLECLASS",47:"style",48:"STYLE_ENTITY_IDS",49:"STYLE_DEFINITION_DATA"},productions_:[0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[34,1],[34,2],[33,3],[33,4],[23,3],[23,3],[24,3],[25,3]],performAction:o(function(C,T,E,A,S,_,I){var D=_.length-1;switch(S){case 4:A.getLogger().debug("Rule: separator (NL) ");break;case 5:A.getLogger().debug("Rule: separator (Space) ");break;case 6:A.getLogger().debug("Rule: separator (EOF) ");break;case 7:A.getLogger().debug("Rule: hierarchy: ",_[D-1]),A.setHierarchy(_[D-1]);break;case 8:A.getLogger().debug("Stop NL ");break;case 9:A.getLogger().debug("Stop EOF ");break;case 10:A.getLogger().debug("Stop NL2 ");break;case 11:A.getLogger().debug("Stop EOF2 ");break;case 12:A.getLogger().debug("Rule: statement: ",_[D]),typeof _[D].length=="number"?this.$=_[D]:this.$=[_[D]];break;case 13:A.getLogger().debug("Rule: statement #2: ",_[D-1]),this.$=[_[D-1]].concat(_[D]);break;case 14:A.getLogger().debug("Rule: link: ",_[D],C),this.$={edgeTypeStr:_[D],label:""};break;case 15:A.getLogger().debug("Rule: LABEL link: ",_[D-3],_[D-1],_[D]),this.$={edgeTypeStr:_[D],label:_[D-1]};break;case 18:let k=parseInt(_[D]),L=A.generateId();this.$={id:L,type:"space",label:"",width:k,children:[]};break;case 23:A.getLogger().debug("Rule: (nodeStatement link node) ",_[D-2],_[D-1],_[D]," typestr: ",_[D-1].edgeTypeStr);let R=A.edgeStrToEdgeData(_[D-1].edgeTypeStr);this.$=[{id:_[D-2].id,label:_[D-2].label,type:_[D-2].type,directions:_[D-2].directions},{id:_[D-2].id+"-"+_[D].id,start:_[D-2].id,end:_[D].id,label:_[D-1].label,type:"edge",directions:_[D].directions,arrowTypeEnd:R,arrowTypeStart:"arrow_open"},{id:_[D].id,label:_[D].label,type:A.typeStr2Type(_[D].typeStr),directions:_[D].directions}];break;case 24:A.getLogger().debug("Rule: nodeStatement (abc88 node size) ",_[D-1],_[D]),this.$={id:_[D-1].id,label:_[D-1].label,type:A.typeStr2Type(_[D-1].typeStr),directions:_[D-1].directions,widthInColumns:parseInt(_[D],10)};break;case 25:A.getLogger().debug("Rule: nodeStatement (node) ",_[D]),this.$={id:_[D].id,label:_[D].label,type:A.typeStr2Type(_[D].typeStr),directions:_[D].directions,widthInColumns:1};break;case 26:A.getLogger().debug("APA123",this?this:"na"),A.getLogger().debug("COLUMNS: ",_[D]),this.$={type:"column-setting",columns:_[D]==="auto"?-1:parseInt(_[D])};break;case 27:A.getLogger().debug("Rule: id-block statement : ",_[D-2],_[D-1]);let O=A.generateId();this.$={..._[D-2],type:"composite",children:_[D-1]};break;case 28:A.getLogger().debug("Rule: blockStatement : ",_[D-2],_[D-1],_[D]);let M=A.generateId();this.$={id:M,type:"composite",label:"",children:_[D-1]};break;case 29:A.getLogger().debug("Rule: node (NODE_ID separator): ",_[D]),this.$={id:_[D]};break;case 30:A.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ",_[D-1],_[D]),this.$={id:_[D-1],label:_[D].label,typeStr:_[D].typeStr,directions:_[D].directions};break;case 31:A.getLogger().debug("Rule: dirList: ",_[D]),this.$=[_[D]];break;case 32:A.getLogger().debug("Rule: dirList: ",_[D-1],_[D]),this.$=[_[D-1]].concat(_[D]);break;case 33:A.getLogger().debug("Rule: nodeShapeNLabel: ",_[D-2],_[D-1],_[D]),this.$={typeStr:_[D-2]+_[D],label:_[D-1]};break;case 34:A.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ",_[D-3],_[D-2]," #3:",_[D-1],_[D]),this.$={typeStr:_[D-3]+_[D],label:_[D-2],directions:_[D-1]};break;case 35:case 36:this.$={type:"classDef",id:_[D-1].trim(),css:_[D].trim()};break;case 37:this.$={type:"applyClass",id:_[D-1].trim(),styleClass:_[D].trim()};break;case 38:this.$={type:"applyStyles",id:_[D-1].trim(),stylesStr:_[D].trim()};break}},"anonymous"),table:[{9:1,10:[1,2]},{1:[3]},{11:3,13:4,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:n,31:i,32:a,40:s,44:l,47:u},{8:[1,20]},t(h,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,21:e,28:r,29:n,31:i,32:a,40:s,44:l,47:u}),t(f,[2,16],{14:22,15:d,16:p}),t(f,[2,17]),t(f,[2,18]),t(f,[2,19]),t(f,[2,20]),t(f,[2,21]),t(f,[2,22]),t(m,[2,25],{27:[1,25]}),t(f,[2,26]),{19:26,26:12,32:a},{11:27,13:4,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:n,31:i,32:a,40:s,44:l,47:u},{41:[1,28],43:[1,29]},{45:[1,30]},{48:[1,31]},t(g,[2,29],{33:32,36:[1,33],38:[1,34]}),{1:[2,7]},t(h,[2,13]),{26:35,32:a},{32:[2,14]},{17:[1,36]},t(m,[2,24]),{11:37,13:4,14:22,15:d,16:p,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:n,31:i,32:a,40:s,44:l,47:u},{30:[1,38]},{42:[1,39]},{42:[1,40]},{46:[1,41]},{49:[1,42]},t(g,[2,30]),{18:[1,43]},{18:[1,44]},t(m,[2,23]),{18:[1,45]},{30:[1,46]},t(f,[2,28]),t(f,[2,35]),t(f,[2,36]),t(f,[2,37]),t(f,[2,38]),{37:[1,47]},{34:48,35:y},{15:[1,50]},t(f,[2,27]),t(g,[2,33]),{39:[1,51]},{34:52,35:y,39:[2,31]},{32:[2,15]},t(g,[2,34]),{39:[2,32]}],defaultActions:{20:[2,7],23:[2,14],50:[2,15],52:[2,32]},parseError:o(function(C,T){if(T.recoverable)this.trace(C);else{var E=new Error(C);throw E.hash=T,E}},"parseError"),parse:o(function(C){var T=this,E=[0],A=[],S=[null],_=[],I=this.table,D="",k=0,L=0,R=0,O=2,M=1,B=_.slice.call(arguments,1),F=Object.create(this.lexer),P={yy:{}};for(var z in this.yy)Object.prototype.hasOwnProperty.call(this.yy,z)&&(P.yy[z]=this.yy[z]);F.setInput(C,P.yy),P.yy.lexer=F,P.yy.parser=this,typeof F.yylloc>"u"&&(F.yylloc={});var $=F.yylloc;_.push($);var H=F.options&&F.options.ranges;typeof P.yy.parseError=="function"?this.parseError=P.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Q(ce){E.length=E.length-2*ce,S.length=S.length-ce,_.length=_.length-ce}o(Q,"popStack");function j(){var ce;return ce=A.pop()||F.lex()||M,typeof ce!="number"&&(ce instanceof Array&&(A=ce,ce=A.pop()),ce=T.symbols_[ce]||ce),ce}o(j,"lex");for(var ie,ne,le,he,K,X,te={},J,se,ue,Z;;){if(le=E[E.length-1],this.defaultActions[le]?he=this.defaultActions[le]:((ie===null||typeof ie>"u")&&(ie=j()),he=I[le]&&I[le][ie]),typeof he>"u"||!he.length||!he[0]){var Se="";Z=[];for(J in I[le])this.terminals_[J]&&J>O&&Z.push("'"+this.terminals_[J]+"'");F.showPosition?Se="Parse error on line "+(k+1)+`: +`+F.showPosition()+` +Expecting `+Z.join(", ")+", got '"+(this.terminals_[ie]||ie)+"'":Se="Parse error on line "+(k+1)+": Unexpected "+(ie==M?"end of input":"'"+(this.terminals_[ie]||ie)+"'"),this.parseError(Se,{text:F.match,token:this.terminals_[ie]||ie,line:F.yylineno,loc:$,expected:Z})}if(he[0]instanceof Array&&he.length>1)throw new Error("Parse Error: multiple actions possible at state: "+le+", token: "+ie);switch(he[0]){case 1:E.push(ie),S.push(F.yytext),_.push(F.yylloc),E.push(he[1]),ie=null,ne?(ie=ne,ne=null):(L=F.yyleng,D=F.yytext,k=F.yylineno,$=F.yylloc,R>0&&R--);break;case 2:if(se=this.productions_[he[1]][1],te.$=S[S.length-se],te._$={first_line:_[_.length-(se||1)].first_line,last_line:_[_.length-1].last_line,first_column:_[_.length-(se||1)].first_column,last_column:_[_.length-1].last_column},H&&(te._$.range=[_[_.length-(se||1)].range[0],_[_.length-1].range[1]]),X=this.performAction.apply(te,[D,L,k,P.yy,he[1],S,_].concat(B)),typeof X<"u")return X;se&&(E=E.slice(0,-1*se*2),S=S.slice(0,-1*se),_=_.slice(0,-1*se)),E.push(this.productions_[he[1]][0]),S.push(te.$),_.push(te._$),ue=I[E[E.length-2]][E[E.length-1]],E.push(ue);break;case 3:return!0}}return!0},"parse")},x=function(){var w={EOF:1,parseError:o(function(T,E){if(this.yy.parser)this.yy.parser.parseError(T,E);else throw new Error(T)},"parseError"),setInput:o(function(C,T){return this.yy=T||this.yy||{},this._input=C,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var C=this._input[0];this.yytext+=C,this.yyleng++,this.offset++,this.match+=C,this.matched+=C;var T=C.match(/(?:\r\n?|\n).*/g);return T?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),C},"input"),unput:o(function(C){var T=C.length,E=C.split(/(?:\r\n?|\n)/g);this._input=C+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-T),this.offset-=T;var A=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),E.length-1&&(this.yylineno-=E.length-1);var S=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:E?(E.length===A.length?this.yylloc.first_column:0)+A[A.length-E.length].length-E[0].length:this.yylloc.first_column-T},this.options.ranges&&(this.yylloc.range=[S[0],S[0]+this.yyleng-T]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(C){this.unput(this.match.slice(C))},"less"),pastInput:o(function(){var C=this.matched.substr(0,this.matched.length-this.match.length);return(C.length>20?"...":"")+C.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var C=this.match;return C.length<20&&(C+=this._input.substr(0,20-C.length)),(C.substr(0,20)+(C.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var C=this.pastInput(),T=new Array(C.length+1).join("-");return C+this.upcomingInput()+` +`+T+"^"},"showPosition"),test_match:o(function(C,T){var E,A,S;if(this.options.backtrack_lexer&&(S={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(S.yylloc.range=this.yylloc.range.slice(0))),A=C[0].match(/(?:\r\n?|\n).*/g),A&&(this.yylineno+=A.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:A?A[A.length-1].length-A[A.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+C[0].length},this.yytext+=C[0],this.match+=C[0],this.matches=C,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(C[0].length),this.matched+=C[0],E=this.performAction.call(this,this.yy,this,T,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),E)return E;if(this._backtrack){for(var _ in S)this[_]=S[_];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var C,T,E,A;this._more||(this.yytext="",this.match="");for(var S=this._currentRules(),_=0;_T[0].length)){if(T=E,A=_,this.options.backtrack_lexer){if(C=this.test_match(E,S[_]),C!==!1)return C;if(this._backtrack){T=!1;continue}else return!1}else if(!this.options.flex)break}return T?(C=this.test_match(T,S[A]),C!==!1?C:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var T=this.next();return T||this.lex()},"lex"),begin:o(function(T){this.conditionStack.push(T)},"begin"),popState:o(function(){var T=this.conditionStack.length-1;return T>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(T){return T=this.conditionStack.length-1-Math.abs(T||0),T>=0?this.conditionStack[T]:"INITIAL"},"topState"),pushState:o(function(T){this.begin(T)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(T,E,A,S){var _=S;switch(A){case 0:return 10;case 1:return T.getLogger().debug("Found space-block"),31;break;case 2:return T.getLogger().debug("Found nl-block"),31;break;case 3:return T.getLogger().debug("Found space-block"),29;break;case 4:T.getLogger().debug(".",E.yytext);break;case 5:T.getLogger().debug("_",E.yytext);break;case 6:return 5;case 7:return E.yytext=-1,28;break;case 8:return E.yytext=E.yytext.replace(/columns\s+/,""),T.getLogger().debug("COLUMNS (LEX)",E.yytext),28;break;case 9:this.pushState("md_string");break;case 10:return"MD_STR";case 11:this.popState();break;case 12:this.pushState("string");break;case 13:T.getLogger().debug("LEX: POPPING STR:",E.yytext),this.popState();break;case 14:return T.getLogger().debug("LEX: STR end:",E.yytext),"STR";break;case 15:return E.yytext=E.yytext.replace(/space\:/,""),T.getLogger().debug("SPACE NUM (LEX)",E.yytext),21;break;case 16:return E.yytext="1",T.getLogger().debug("COLUMNS (LEX)",E.yytext),21;break;case 17:return 43;case 18:return"LINKSTYLE";case 19:return"INTERPOLATE";case 20:return this.pushState("CLASSDEF"),40;break;case 21:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 22:return this.popState(),this.pushState("CLASSDEFID"),41;break;case 23:return this.popState(),42;break;case 24:return this.pushState("CLASS"),44;break;case 25:return this.popState(),this.pushState("CLASS_STYLE"),45;break;case 26:return this.popState(),46;break;case 27:return this.pushState("STYLE_STMNT"),47;break;case 28:return this.popState(),this.pushState("STYLE_DEFINITION"),48;break;case 29:return this.popState(),49;break;case 30:return this.pushState("acc_title"),"acc_title";break;case 31:return this.popState(),"acc_title_value";break;case 32:return this.pushState("acc_descr"),"acc_descr";break;case 33:return this.popState(),"acc_descr_value";break;case 34:this.pushState("acc_descr_multiline");break;case 35:this.popState();break;case 36:return"acc_descr_multiline_value";case 37:return 30;case 38:return this.popState(),T.getLogger().debug("Lex: (("),"NODE_DEND";break;case 39:return this.popState(),T.getLogger().debug("Lex: (("),"NODE_DEND";break;case 40:return this.popState(),T.getLogger().debug("Lex: ))"),"NODE_DEND";break;case 41:return this.popState(),T.getLogger().debug("Lex: (("),"NODE_DEND";break;case 42:return this.popState(),T.getLogger().debug("Lex: (("),"NODE_DEND";break;case 43:return this.popState(),T.getLogger().debug("Lex: (-"),"NODE_DEND";break;case 44:return this.popState(),T.getLogger().debug("Lex: -)"),"NODE_DEND";break;case 45:return this.popState(),T.getLogger().debug("Lex: (("),"NODE_DEND";break;case 46:return this.popState(),T.getLogger().debug("Lex: ]]"),"NODE_DEND";break;case 47:return this.popState(),T.getLogger().debug("Lex: ("),"NODE_DEND";break;case 48:return this.popState(),T.getLogger().debug("Lex: ])"),"NODE_DEND";break;case 49:return this.popState(),T.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 50:return this.popState(),T.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 51:return this.popState(),T.getLogger().debug("Lex: )]"),"NODE_DEND";break;case 52:return this.popState(),T.getLogger().debug("Lex: )"),"NODE_DEND";break;case 53:return this.popState(),T.getLogger().debug("Lex: ]>"),"NODE_DEND";break;case 54:return this.popState(),T.getLogger().debug("Lex: ]"),"NODE_DEND";break;case 55:return T.getLogger().debug("Lexa: -)"),this.pushState("NODE"),36;break;case 56:return T.getLogger().debug("Lexa: (-"),this.pushState("NODE"),36;break;case 57:return T.getLogger().debug("Lexa: ))"),this.pushState("NODE"),36;break;case 58:return T.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 59:return T.getLogger().debug("Lex: ((("),this.pushState("NODE"),36;break;case 60:return T.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 61:return T.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 62:return T.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 63:return T.getLogger().debug("Lexc: >"),this.pushState("NODE"),36;break;case 64:return T.getLogger().debug("Lexa: (["),this.pushState("NODE"),36;break;case 65:return T.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 66:return this.pushState("NODE"),36;break;case 67:return this.pushState("NODE"),36;break;case 68:return this.pushState("NODE"),36;break;case 69:return this.pushState("NODE"),36;break;case 70:return this.pushState("NODE"),36;break;case 71:return this.pushState("NODE"),36;break;case 72:return this.pushState("NODE"),36;break;case 73:return T.getLogger().debug("Lexa: ["),this.pushState("NODE"),36;break;case 74:return this.pushState("BLOCK_ARROW"),T.getLogger().debug("LEX ARR START"),38;break;case 75:return T.getLogger().debug("Lex: NODE_ID",E.yytext),32;break;case 76:return T.getLogger().debug("Lex: EOF",E.yytext),8;break;case 77:this.pushState("md_string");break;case 78:this.pushState("md_string");break;case 79:return"NODE_DESCR";case 80:this.popState();break;case 81:T.getLogger().debug("Lex: Starting string"),this.pushState("string");break;case 82:T.getLogger().debug("LEX ARR: Starting string"),this.pushState("string");break;case 83:return T.getLogger().debug("LEX: NODE_DESCR:",E.yytext),"NODE_DESCR";break;case 84:T.getLogger().debug("LEX POPPING"),this.popState();break;case 85:T.getLogger().debug("Lex: =>BAE"),this.pushState("ARROW_DIR");break;case 86:return E.yytext=E.yytext.replace(/^,\s*/,""),T.getLogger().debug("Lex (right): dir:",E.yytext),"DIR";break;case 87:return E.yytext=E.yytext.replace(/^,\s*/,""),T.getLogger().debug("Lex (left):",E.yytext),"DIR";break;case 88:return E.yytext=E.yytext.replace(/^,\s*/,""),T.getLogger().debug("Lex (x):",E.yytext),"DIR";break;case 89:return E.yytext=E.yytext.replace(/^,\s*/,""),T.getLogger().debug("Lex (y):",E.yytext),"DIR";break;case 90:return E.yytext=E.yytext.replace(/^,\s*/,""),T.getLogger().debug("Lex (up):",E.yytext),"DIR";break;case 91:return E.yytext=E.yytext.replace(/^,\s*/,""),T.getLogger().debug("Lex (down):",E.yytext),"DIR";break;case 92:return E.yytext="]>",T.getLogger().debug("Lex (ARROW_DIR end):",E.yytext),this.popState(),this.popState(),"BLOCK_ARROW_END";break;case 93:return T.getLogger().debug("Lex: LINK","#"+E.yytext+"#"),15;break;case 94:return T.getLogger().debug("Lex: LINK",E.yytext),15;break;case 95:return T.getLogger().debug("Lex: LINK",E.yytext),15;break;case 96:return T.getLogger().debug("Lex: LINK",E.yytext),15;break;case 97:return T.getLogger().debug("Lex: START_LINK",E.yytext),this.pushState("LLABEL"),16;break;case 98:return T.getLogger().debug("Lex: START_LINK",E.yytext),this.pushState("LLABEL"),16;break;case 99:return T.getLogger().debug("Lex: START_LINK",E.yytext),this.pushState("LLABEL"),16;break;case 100:this.pushState("md_string");break;case 101:return T.getLogger().debug("Lex: Starting string"),this.pushState("string"),"LINK_LABEL";break;case 102:return this.popState(),T.getLogger().debug("Lex: LINK","#"+E.yytext+"#"),15;break;case 103:return this.popState(),T.getLogger().debug("Lex: LINK",E.yytext),15;break;case 104:return this.popState(),T.getLogger().debug("Lex: LINK",E.yytext),15;break;case 105:return T.getLogger().debug("Lex: COLON",E.yytext),E.yytext=E.yytext.slice(1),27;break}},"anonymous"),rules:[/^(?:block-beta\b)/,/^(?:block\s+)/,/^(?:block\n+)/,/^(?:block:)/,/^(?:[\s]+)/,/^(?:[\n]+)/,/^(?:((\u000D\u000A)|(\u000A)))/,/^(?:columns\s+auto\b)/,/^(?:columns\s+[\d]+)/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:space[:]\d+)/,/^(?:space\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\s+)/,/^(?:DEFAULT\s+)/,/^(?:\w+\s+)/,/^(?:[^\n]*)/,/^(?:class\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:style\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:end\b\s*)/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:[\)]\))/,/^(?:\}\})/,/^(?:\})/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\()/,/^(?:\]\])/,/^(?:\()/,/^(?:\]\))/,/^(?:\\\])/,/^(?:\/\])/,/^(?:\)\])/,/^(?:[\)])/,/^(?:\]>)/,/^(?:[\]])/,/^(?:-\))/,/^(?:\(-)/,/^(?:\)\))/,/^(?:\))/,/^(?:\(\(\()/,/^(?:\(\()/,/^(?:\{\{)/,/^(?:\{)/,/^(?:>)/,/^(?:\(\[)/,/^(?:\()/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\[\\)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:\[)/,/^(?:<\[)/,/^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/,/^(?:$)/,/^(?:["][`])/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:\]>\s*\()/,/^(?:,?\s*right\s*)/,/^(?:,?\s*left\s*)/,/^(?:,?\s*x\s*)/,/^(?:,?\s*y\s*)/,/^(?:,?\s*up\s*)/,/^(?:,?\s*down\s*)/,/^(?:\)\s*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*~~[\~]+\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:["][`])/,/^(?:["])/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?::\d+)/],conditions:{STYLE_DEFINITION:{rules:[29],inclusive:!1},STYLE_STMNT:{rules:[28],inclusive:!1},CLASSDEFID:{rules:[23],inclusive:!1},CLASSDEF:{rules:[21,22],inclusive:!1},CLASS_STYLE:{rules:[26],inclusive:!1},CLASS:{rules:[25],inclusive:!1},LLABEL:{rules:[100,101,102,103,104],inclusive:!1},ARROW_DIR:{rules:[86,87,88,89,90,91,92],inclusive:!1},BLOCK_ARROW:{rules:[77,82,85],inclusive:!1},NODE:{rules:[38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,78,81],inclusive:!1},md_string:{rules:[10,11,79,80],inclusive:!1},space:{rules:[],inclusive:!1},string:{rules:[13,14,83,84],inclusive:!1},acc_descr_multiline:{rules:[35,36],inclusive:!1},acc_descr:{rules:[33],inclusive:!1},acc_title:{rules:[31],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,12,15,16,17,18,19,20,24,27,30,32,34,37,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,93,94,95,96,97,98,99,105],inclusive:!0}}};return w}();v.lexer=x;function b(){this.yy={}}return o(b,"Parser"),b.prototype=v,v.Parser=b,new b}();KB.parser=KB;bye=KB});function Yet(t){switch(Y.debug("typeStr2Type",t),t){case"[]":return"square";case"()":return Y.debug("we have a round"),"round";case"(())":return"circle";case">]":return"rect_left_inv_arrow";case"{}":return"diamond";case"{{}}":return"hexagon";case"([])":return"stadium";case"[[]]":return"subroutine";case"[()]":return"cylinder";case"((()))":return"doublecircle";case"[//]":return"lean_right";case"[\\\\]":return"lean_left";case"[/\\]":return"trapezoid";case"[\\/]":return"inv_trapezoid";case"<[]>":return"block_arrow";default:return"na"}}function Xet(t){switch(Y.debug("typeStr2Type",t),t){case"==":return"thick";default:return"normal"}}function jet(t){switch(t.trim()){case"--x":return"arrow_cross";case"--o":return"arrow_circle";default:return"arrow_point"}}var Ul,ZB,QB,Tye,kye,zet,Sye,Get,eC,Vet,Uet,Het,Wet,Cye,JB,y4,qet,Eye,Ket,Qet,Zet,Jet,ett,ttt,rtt,ntt,itt,att,stt,Aye,_ye=N(()=>{"use strict";gL();ji();zt();vt();gr();mi();Ul=new Map,ZB=[],QB=new Map,Tye="color",kye="fill",zet="bgFill",Sye=",",Get=me(),eC=new Map,Vet=o(t=>Ze.sanitizeText(t,Get),"sanitizeText"),Uet=o(function(t,e=""){let r=eC.get(t);r||(r={id:t,styles:[],textStyles:[]},eC.set(t,r)),e?.split(Sye).forEach(n=>{let i=n.replace(/([^;]*);/,"$1").trim();if(RegExp(Tye).exec(n)){let s=i.replace(kye,zet).replace(Tye,kye);r.textStyles.push(s)}r.styles.push(i)})},"addStyleClass"),Het=o(function(t,e=""){let r=Ul.get(t);e!=null&&(r.styles=e.split(Sye))},"addStyle2Node"),Wet=o(function(t,e){t.split(",").forEach(function(r){let n=Ul.get(r);if(n===void 0){let i=r.trim();n={id:i,type:"na",children:[]},Ul.set(i,n)}n.classes||(n.classes=[]),n.classes.push(e)})},"setCssClass"),Cye=o((t,e)=>{let r=t.flat(),n=[];for(let i of r){if(i.label&&(i.label=Vet(i.label)),i.type==="classDef"){Uet(i.id,i.css);continue}if(i.type==="applyClass"){Wet(i.id,i?.styleClass??"");continue}if(i.type==="applyStyles"){i?.stylesStr&&Het(i.id,i?.stylesStr);continue}if(i.type==="column-setting")e.columns=i.columns??-1;else if(i.type==="edge"){let a=(QB.get(i.id)??0)+1;QB.set(i.id,a),i.id=a+"-"+i.id,ZB.push(i)}else{i.label||(i.type==="composite"?i.label="":i.label=i.id);let a=Ul.get(i.id);if(a===void 0?Ul.set(i.id,i):(i.type!=="na"&&(a.type=i.type),i.label!==i.id&&(a.label=i.label)),i.children&&Cye(i.children,i),i.type==="space"){let s=i.width??1;for(let l=0;l{Y.debug("Clear called"),Ar(),y4={id:"root",type:"composite",children:[],columns:-1},Ul=new Map([["root",y4]]),JB=[],eC=new Map,ZB=[],QB=new Map},"clear");o(Yet,"typeStr2Type");o(Xet,"edgeTypeStr2Type");o(jet,"edgeStrToEdgeData");Eye=0,Ket=o(()=>(Eye++,"id-"+Math.random().toString(36).substr(2,12)+"-"+Eye),"generateId"),Qet=o(t=>{y4.children=t,Cye(t,y4),JB=y4.children},"setHierarchy"),Zet=o(t=>{let e=Ul.get(t);return e?e.columns?e.columns:e.children?e.children.length:-1:-1},"getColumns"),Jet=o(()=>[...Ul.values()],"getBlocksFlat"),ett=o(()=>JB||[],"getBlocks"),ttt=o(()=>ZB,"getEdges"),rtt=o(t=>Ul.get(t),"getBlock"),ntt=o(t=>{Ul.set(t.id,t)},"setBlock"),itt=o(()=>console,"getLogger"),att=o(function(){return eC},"getClasses"),stt={getConfig:o(()=>cr().block,"getConfig"),typeStr2Type:Yet,edgeTypeStr2Type:Xet,edgeStrToEdgeData:jet,getLogger:itt,getBlocksFlat:Jet,getBlocks:ett,getEdges:ttt,setHierarchy:Qet,getBlock:rtt,setBlock:ntt,getColumns:Zet,getClasses:att,clear:qet,generateId:Ket},Aye=stt});var tC,ott,Dye,Lye=N(()=>{"use strict";Ys();tC=o((t,e)=>{let r=Kf,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return qa(n,i,a,e)},"fade"),ott=o(t=>`.label { + font-family: ${t.fontFamily}; + color: ${t.nodeTextColor||t.textColor}; + } + .cluster-label text { + fill: ${t.titleColor}; + } + .cluster-label span,p { + color: ${t.titleColor}; + } + + + + .label text,span,p { + fill: ${t.nodeTextColor||t.textColor}; + color: ${t.nodeTextColor||t.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${t.mainBkg}; + stroke: ${t.nodeBorder}; + stroke-width: 1px; + } + .flowchart-label text { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${t.arrowheadColor}; + } + + .edgePath .path { + stroke: ${t.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${t.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${t.edgeLabelBackground}; + rect { + opacity: 0.5; + background-color: ${t.edgeLabelBackground}; + fill: ${t.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${tC(t.edgeLabelBackground,.5)}; + // background-color: + } + + .node .cluster { + // fill: ${tC(t.mainBkg,.5)}; + fill: ${tC(t.clusterBkg,.5)}; + stroke: ${tC(t.clusterBorder,.2)}; + box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; + stroke-width: 1px; + } + + .cluster text { + fill: ${t.titleColor}; + } + + .cluster span,p { + color: ${t.titleColor}; + } + /* .cluster div { + color: ${t.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${t.fontFamily}; + font-size: 12px; + background: ${t.tertiaryColor}; + border: 1px solid ${t.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${t.textColor}; + } +`,"getStyles"),Dye=ott});var ltt,ctt,utt,htt,ftt,dtt,ptt,mtt,gtt,ytt,vtt,Rye,Nye=N(()=>{"use strict";vt();ltt=o((t,e,r,n)=>{e.forEach(i=>{vtt[i](t,r,n)})},"insertMarkers"),ctt=o((t,e,r)=>{Y.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),utt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),htt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),ftt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),dtt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),ptt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",6).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),mtt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),gtt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),ytt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),vtt={extension:ctt,composition:utt,aggregation:htt,dependency:ftt,lollipop:dtt,point:ptt,circle:mtt,cross:gtt,barb:ytt},Rye=ltt});function xtt(t,e){if(t===0||!Number.isInteger(t))throw new Error("Columns must be an integer !== 0.");if(e<0||!Number.isInteger(e))throw new Error("Position must be a non-negative integer."+e);if(t<0)return{px:e,py:0};if(t===1)return{px:0,py:e};let r=e%t,n=Math.floor(e/t);return{px:r,py:n}}function eF(t,e,r=0,n=0){Y.debug("setBlockSizes abc95 (start)",t.id,t?.size?.x,"block width =",t?.size,"sieblingWidth",r),t?.size?.width||(t.size={width:r,height:n,x:0,y:0});let i=0,a=0;if(t.children?.length>0){for(let m of t.children)eF(m,e);let s=btt(t);i=s.width,a=s.height,Y.debug("setBlockSizes abc95 maxWidth of",t.id,":s children is ",i,a);for(let m of t.children)m.size&&(Y.debug(`abc95 Setting size of children of ${t.id} id=${m.id} ${i} ${a} ${JSON.stringify(m.size)}`),m.size.width=i*(m.widthInColumns??1)+bi*((m.widthInColumns??1)-1),m.size.height=a,m.size.x=0,m.size.y=0,Y.debug(`abc95 updating size of ${t.id} children child:${m.id} maxWidth:${i} maxHeight:${a}`));for(let m of t.children)eF(m,e,i,a);let l=t.columns??-1,u=0;for(let m of t.children)u+=m.widthInColumns??1;let h=t.children.length;l>0&&l0?Math.min(t.children.length,l):t.children.length;if(m>0){let g=(d-m*bi-bi)/m;Y.debug("abc95 (growing to fit) width",t.id,d,t.size?.width,g);for(let y of t.children)y.size&&(y.size.width=g)}}t.size={width:d,height:p,x:0,y:0}}Y.debug("setBlockSizes abc94 (done)",t.id,t?.size?.x,t?.size?.width,t?.size?.y,t?.size?.height)}function Mye(t,e){Y.debug(`abc85 layout blocks (=>layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`);let r=t.columns??-1;if(Y.debug("layoutBlocks columns abc95",t.id,"=>",r,t),t.children&&t.children.length>0){let n=t?.children[0]?.size?.width??0,i=t.children.length*n+(t.children.length-1)*bi;Y.debug("widthOfChildren 88",i,"posX");let a=0;Y.debug("abc91 block?.size?.x",t.id,t?.size?.x);let s=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-bi,l=0;for(let u of t.children){let h=t;if(!u.size)continue;let{width:f,height:d}=u.size,{px:p,py:m}=xtt(r,a);if(m!=l&&(l=m,s=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-bi,Y.debug("New row in layout for block",t.id," and child ",u.id,l)),Y.debug(`abc89 layout blocks (child) id: ${u.id} Pos: ${a} (px, py) ${p},${m} (${h?.size?.x},${h?.size?.y}) parent: ${h.id} width: ${f}${bi}`),h.size){let g=f/2;u.size.x=s+bi+g,Y.debug(`abc91 layout blocks (calc) px, pyid:${u.id} startingPos=X${s} new startingPosX${u.size.x} ${g} padding=${bi} width=${f} halfWidth=${g} => x:${u.size.x} y:${u.size.y} ${u.widthInColumns} (width * (child?.w || 1)) / 2 ${f*(u?.widthInColumns??1)/2}`),s=u.size.x+g,u.size.y=h.size.y-h.size.height/2+m*(d+bi)+d/2+bi,Y.debug(`abc88 layout blocks (calc) px, pyid:${u.id}startingPosX${s}${bi}${g}=>x:${u.size.x}y:${u.size.y}${u.widthInColumns}(width * (child?.w || 1)) / 2${f*(u?.widthInColumns??1)/2}`)}u.children&&Mye(u,e),a+=u?.widthInColumns??1,Y.debug("abc88 columnsPos",u,a)}}Y.debug(`layout blocks (<==layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`)}function Iye(t,{minX:e,minY:r,maxX:n,maxY:i}={minX:0,minY:0,maxX:0,maxY:0}){if(t.size&&t.id!=="root"){let{x:a,y:s,width:l,height:u}=t.size;a-l/2n&&(n=a+l/2),s+u/2>i&&(i=s+u/2)}if(t.children)for(let a of t.children)({minX:e,minY:r,maxX:n,maxY:i}=Iye(a,{minX:e,minY:r,maxX:n,maxY:i}));return{minX:e,minY:r,maxX:n,maxY:i}}function Oye(t){let e=t.getBlock("root");if(!e)return;eF(e,t,0,0),Mye(e,t),Y.debug("getBlocks",JSON.stringify(e,null,2));let{minX:r,minY:n,maxX:i,maxY:a}=Iye(e),s=a-n,l=i-r;return{x:r,y:n,width:l,height:s}}var bi,btt,Pye=N(()=>{"use strict";vt();zt();bi=me()?.block?.padding??8;o(xtt,"calculateBlockPosition");btt=o(t=>{let e=0,r=0;for(let n of t.children){let{width:i,height:a,x:s,y:l}=n.size??{width:0,height:0,x:0,y:0};Y.debug("getMaxChildSize abc95 child:",n.id,"width:",i,"height:",a,"x:",s,"y:",l,n.type),n.type!=="space"&&(i>e&&(e=i/(t.widthInColumns??1)),a>r&&(r=a))}return{width:e,height:r}},"getMaxChildSize");o(eF,"setBlockSizes");o(Mye,"layoutBlocks");o(Iye,"findBounds");o(Oye,"layout")});function Bye(t,e){e&&t.attr("style",e)}function wtt(t){let e=Ge(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),r=e.append("xhtml:div"),n=t.label,i=t.isNode?"nodeLabel":"edgeLabel",a=r.append("span");return a.html(n),Bye(a,t.labelStyle),a.attr("class",i),Bye(r,t.labelStyle),r.style("display","inline-block"),r.style("white-space","nowrap"),r.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}var Ttt,vs,rC=N(()=>{"use strict";dr();vt();zt();gr();ir();to();o(Bye,"applyStyle");o(wtt,"addHtmlLabel");Ttt=o((t,e,r,n)=>{let i=t||"";if(typeof i=="object"&&(i=i[0]),fr(me().flowchart.htmlLabels)){i=i.replace(/\\n|\n/g,"
    "),Y.debug("vertexText"+i);let a={isNode:n,label:DD(na(i)),labelStyle:e.replace("fill:","color:")};return wtt(a)}else{let a=document.createElementNS("http://www.w3.org/2000/svg","text");a.setAttribute("style",e.replace("color:","fill:"));let s=[];typeof i=="string"?s=i.split(/\\n|\n|/gi):Array.isArray(i)?s=i:s=[];for(let l of s){let u=document.createElementNS("http://www.w3.org/2000/svg","tspan");u.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),u.setAttribute("dy","1em"),u.setAttribute("x","0"),r?u.setAttribute("class","title-row"):u.setAttribute("class","row"),u.textContent=l.trim(),a.appendChild(u)}return a}},"createLabel"),vs=Ttt});var $ye,ktt,Fye,zye=N(()=>{"use strict";vt();$ye=o((t,e,r,n,i)=>{e.arrowTypeStart&&Fye(t,"start",e.arrowTypeStart,r,n,i),e.arrowTypeEnd&&Fye(t,"end",e.arrowTypeEnd,r,n,i)},"addEdgeMarkers"),ktt={arrow_cross:"cross",arrow_point:"point",arrow_barb:"barb",arrow_circle:"circle",aggregation:"aggregation",extension:"extension",composition:"composition",dependency:"dependency",lollipop:"lollipop"},Fye=o((t,e,r,n,i,a)=>{let s=ktt[r];if(!s){Y.warn(`Unknown arrow type: ${r}`);return}let l=e==="start"?"Start":"End";t.attr(`marker-${e}`,`url(${n}#${i}_${a}-${s}${l})`)},"addEdgeMarker")});function nC(t,e){me().flowchart.htmlLabels&&t&&(t.style.width=e.length*9+"px",t.style.height="12px")}var tF,Ua,Vye,Uye,Ett,Stt,Gye,Hye,Wye=N(()=>{"use strict";vt();rC();to();dr();zt();ir();gr();JD();w2();zye();tF={},Ua={},Vye=o((t,e)=>{let r=me(),n=fr(r.flowchart.htmlLabels),i=e.labelType==="markdown"?Hn(t,e.label,{style:e.labelStyle,useHtmlLabels:n,addSvgBackground:!0},r):vs(e.label,e.labelStyle),a=t.insert("g").attr("class","edgeLabel"),s=a.insert("g").attr("class","label");s.node().appendChild(i);let l=i.getBBox();if(n){let h=i.children[0],f=Ge(i);l=h.getBoundingClientRect(),f.attr("width",l.width),f.attr("height",l.height)}s.attr("transform","translate("+-l.width/2+", "+-l.height/2+")"),tF[e.id]=a,e.width=l.width,e.height=l.height;let u;if(e.startLabelLeft){let h=vs(e.startLabelLeft,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),Ua[e.id]||(Ua[e.id]={}),Ua[e.id].startLeft=f,nC(u,e.startLabelLeft)}if(e.startLabelRight){let h=vs(e.startLabelRight,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=f.node().appendChild(h),d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),Ua[e.id]||(Ua[e.id]={}),Ua[e.id].startRight=f,nC(u,e.startLabelRight)}if(e.endLabelLeft){let h=vs(e.endLabelLeft,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),Ua[e.id]||(Ua[e.id]={}),Ua[e.id].endLeft=f,nC(u,e.endLabelLeft)}if(e.endLabelRight){let h=vs(e.endLabelRight,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),Ua[e.id]||(Ua[e.id]={}),Ua[e.id].endRight=f,nC(u,e.endLabelRight)}return i},"insertEdgeLabel");o(nC,"setTerminalWidth");Uye=o((t,e)=>{Y.debug("Moving label abc88 ",t.id,t.label,tF[t.id],e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=me(),{subGraphTitleTotalMargin:i}=Ru(n);if(t.label){let a=tF[t.id],s=t.x,l=t.y;if(r){let u=Gt.calcLabelPosition(r);Y.debug("Moving label "+t.label+" from (",s,",",l,") to (",u.x,",",u.y,") abc88"),e.updatedPath&&(s=u.x,l=u.y)}a.attr("transform",`translate(${s}, ${l+i/2})`)}if(t.startLabelLeft){let a=Ua[t.id].startLeft,s=t.x,l=t.y;if(r){let u=Gt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.startLabelRight){let a=Ua[t.id].startRight,s=t.x,l=t.y;if(r){let u=Gt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelLeft){let a=Ua[t.id].endLeft,s=t.x,l=t.y;if(r){let u=Gt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelRight){let a=Ua[t.id].endRight,s=t.x,l=t.y;if(r){let u=Gt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}},"positionEdgeLabel"),Ett=o((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,l=t.height/2;return i>=s||a>=l},"outsideNode"),Stt=o((t,e,r)=>{Y.debug(`intersection calc abc89: + outsidePoint: ${JSON.stringify(e)} + insidePoint : ${JSON.stringify(r)} + node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,l=r.xMath.abs(n-e.x)*u){let d=r.y{Y.debug("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(!Ett(e,a)&&!i){let s=Stt(e,n,a),l=!1;r.forEach(u=>{l=l||u.x===s.x&&u.y===s.y}),r.some(u=>u.x===s.x&&u.y===s.y)||r.push(s),i=!0}else n=a,i||r.push(a)}),r},"cutPathAtIntersect"),Hye=o(function(t,e,r,n,i,a,s){let l=r.points;Y.debug("abc88 InsertEdge: edge=",r,"e=",e);let u=!1,h=a.node(e.v);var f=a.node(e.w);f?.intersect&&h?.intersect&&(l=l.slice(1,r.points.length-1),l.unshift(h.intersect(l[0])),l.push(f.intersect(l[l.length-1]))),r.toCluster&&(Y.debug("to cluster abc88",n[r.toCluster]),l=Gye(r.points,n[r.toCluster].node),u=!0),r.fromCluster&&(Y.debug("from cluster abc88",n[r.fromCluster]),l=Gye(l.reverse(),n[r.fromCluster].node).reverse(),u=!0);let d=l.filter(C=>!Number.isNaN(C.y)),p=Do;r.curve&&(i==="graph"||i==="flowchart")&&(p=r.curve);let{x:m,y:g}=qw(r),y=wl().x(m).y(g).curve(p),v;switch(r.thickness){case"normal":v="edge-thickness-normal";break;case"thick":v="edge-thickness-thick";break;case"invisible":v="edge-thickness-thick";break;default:v=""}switch(r.pattern){case"solid":v+=" edge-pattern-solid";break;case"dotted":v+=" edge-pattern-dotted";break;case"dashed":v+=" edge-pattern-dashed";break}let x=t.append("path").attr("d",y(d)).attr("id",r.id).attr("class"," "+v+(r.classes?" "+r.classes:"")).attr("style",r.style),b="";(me().flowchart.arrowMarkerAbsolute||me().state.arrowMarkerAbsolute)&&(b=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,b=b.replace(/\(/g,"\\("),b=b.replace(/\)/g,"\\)")),$ye(x,r,b,s,i);let w={};return u&&(w.updatedPath=l),w.originalPath=r.points,w},"insertEdge")});var Ctt,qye,Yye=N(()=>{"use strict";Ctt=o(t=>{let e=new Set;for(let r of t)switch(r){case"x":e.add("right"),e.add("left");break;case"y":e.add("up"),e.add("down");break;default:e.add(r);break}return e},"expandAndDeduplicateDirections"),qye=o((t,e,r)=>{let n=Ctt(t),i=2,a=e.height+2*r.padding,s=a/i,l=e.width+2*s+r.padding,u=r.padding/2;return n.has("right")&&n.has("left")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:s,y:0},{x:l/2,y:2*u},{x:l-s,y:0},{x:l,y:0},{x:l,y:-a/3},{x:l+2*u,y:-a/2},{x:l,y:-2*a/3},{x:l,y:-a},{x:l-s,y:-a},{x:l/2,y:-a-2*u},{x:s,y:-a},{x:0,y:-a},{x:0,y:-2*a/3},{x:-2*u,y:-a/2},{x:0,y:-a/3}]:n.has("right")&&n.has("left")&&n.has("up")?[{x:s,y:0},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}]:n.has("right")&&n.has("left")&&n.has("down")?[{x:0,y:0},{x:s,y:-a},{x:l-s,y:-a},{x:l,y:0}]:n.has("right")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:l,y:-s},{x:l,y:-a+s},{x:0,y:-a}]:n.has("left")&&n.has("up")&&n.has("down")?[{x:l,y:0},{x:0,y:-s},{x:0,y:-a+s},{x:l,y:-a}]:n.has("right")&&n.has("left")?[{x:s,y:0},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")&&n.has("down")?[{x:l/2,y:0},{x:0,y:-u},{x:s,y:-u},{x:s,y:-a+u},{x:0,y:-a+u},{x:l/2,y:-a},{x:l,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u},{x:l,y:-u}]:n.has("right")&&n.has("up")?[{x:0,y:0},{x:l,y:-s},{x:0,y:-a}]:n.has("right")&&n.has("down")?[{x:0,y:0},{x:l,y:0},{x:0,y:-a}]:n.has("left")&&n.has("up")?[{x:l,y:0},{x:0,y:-s},{x:l,y:-a}]:n.has("left")&&n.has("down")?[{x:l,y:0},{x:0,y:0},{x:l,y:-a}]:n.has("right")?[{x:s,y:-u},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a+u}]:n.has("left")?[{x:s,y:0},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")?[{x:s,y:-u},{x:s,y:-a+u},{x:0,y:-a+u},{x:l/2,y:-a},{x:l,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u}]:n.has("down")?[{x:l/2,y:0},{x:0,y:-u},{x:s,y:-u},{x:s,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u},{x:l,y:-u}]:[{x:0,y:0}]},"getArrowPoints")});function Att(t,e){return t.intersect(e)}var Xye,jye=N(()=>{"use strict";o(Att,"intersectNode");Xye=Att});function _tt(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,l=a-n.y,u=Math.sqrt(e*e*l*l+r*r*s*s),h=Math.abs(e*r*s/u);n.x{"use strict";o(_tt,"intersectEllipse");iC=_tt});function Dtt(t,e,r){return iC(t,e,e,r)}var Kye,Qye=N(()=>{"use strict";rF();o(Dtt,"intersectCircle");Kye=Dtt});function Ltt(t,e,r,n){var i,a,s,l,u,h,f,d,p,m,g,y,v,x,b;if(i=e.y-t.y,s=t.x-e.x,u=e.x*t.y-t.x*e.y,p=i*r.x+s*r.y+u,m=i*n.x+s*n.y+u,!(p!==0&&m!==0&&Zye(p,m))&&(a=n.y-r.y,l=r.x-n.x,h=n.x*r.y-r.x*n.y,f=a*t.x+l*t.y+h,d=a*e.x+l*e.y+h,!(f!==0&&d!==0&&Zye(f,d))&&(g=i*l-a*s,g!==0)))return y=Math.abs(g/2),v=s*h-l*u,x=v<0?(v-y)/g:(v+y)/g,v=a*u-i*h,b=v<0?(v-y)/g:(v+y)/g,{x,y:b}}function Zye(t,e){return t*e>0}var Jye,eve=N(()=>{"use strict";o(Ltt,"intersectLine");o(Zye,"sameSign");Jye=Ltt});function Rtt(t,e,r){var n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(g){s=Math.min(s,g.x),l=Math.min(l,g.y)}):(s=Math.min(s,e.x),l=Math.min(l,e.y));for(var u=n-t.width/2-s,h=i-t.height/2-l,f=0;f1&&a.sort(function(g,y){var v=g.x-r.x,x=g.y-r.y,b=Math.sqrt(v*v+x*x),w=y.x-r.x,C=y.y-r.y,T=Math.sqrt(w*w+C*C);return b{"use strict";eve();tve=Rtt;o(Rtt,"intersectPolygon")});var Ntt,nve,ive=N(()=>{"use strict";Ntt=o((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2,u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=a===0?0:l*i/a,h=l):(i<0&&(s=-s),u=s,h=i===0?0:s*a/i),{x:r+u,y:n+h}},"intersectRect"),nve=Ntt});var In,nF=N(()=>{"use strict";jye();Qye();rF();rve();ive();In={node:Xye,circle:Kye,ellipse:iC,polygon:tve,rect:nve}});function Hl(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(i){return i.x+","+i.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}var Di,Qn,iF=N(()=>{"use strict";rC();to();zt();dr();gr();ir();Di=o(async(t,e,r,n)=>{let i=me(),a,s=e.useHtmlLabels||fr(i.flowchart.htmlLabels);r?a=r:a="node default";let l=t.insert("g").attr("class",a).attr("id",e.domId||e.id),u=l.insert("g").attr("class","label").attr("style",e.labelStyle),h;e.labelText===void 0?h="":h=typeof e.labelText=="string"?e.labelText:e.labelText[0];let f=u.node(),d;e.labelType==="markdown"?d=Hn(u,Tr(na(h),i),{useHtmlLabels:s,width:e.width||i.flowchart.wrappingWidth,classes:"markdown-node-label"},i):d=f.appendChild(vs(Tr(na(h),i),e.labelStyle,!1,n));let p=d.getBBox(),m=e.padding/2;if(fr(i.flowchart.htmlLabels)){let g=d.children[0],y=Ge(d),v=g.getElementsByTagName("img");if(v){let x=h.replace(/]*>/g,"").trim()==="";await Promise.all([...v].map(b=>new Promise(w=>{function C(){if(b.style.display="flex",b.style.flexDirection="column",x){let T=i.fontSize?i.fontSize:window.getComputedStyle(document.body).fontSize,A=parseInt(T,10)*5+"px";b.style.minWidth=A,b.style.maxWidth=A}else b.style.width="100%";w(b)}o(C,"setupImage"),setTimeout(()=>{b.complete&&C()}),b.addEventListener("error",C),b.addEventListener("load",C)})))}p=g.getBoundingClientRect(),y.attr("width",p.width),y.attr("height",p.height)}return s?u.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"):u.attr("transform","translate(0, "+-p.height/2+")"),e.centerLabel&&u.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),u.insert("rect",":first-child"),{shapeSvg:l,bbox:p,halfPadding:m,label:u}},"labelHelper"),Qn=o((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds");o(Hl,"insertPolygonShape")});var Mtt,ave,sve=N(()=>{"use strict";iF();vt();zt();nF();Mtt=o(async(t,e)=>{e.useHtmlLabels||me().flowchart.htmlLabels||(e.centerLabel=!0);let{shapeSvg:n,bbox:i,halfPadding:a}=await Di(t,e,"node "+e.classes,!0);Y.info("Classes = ",e.classes);let s=n.insert("rect",":first-child");return s.attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-a).attr("y",-i.height/2-a).attr("width",i.width+e.padding).attr("height",i.height+e.padding),Qn(e,s),e.intersect=function(l){return In.rect(e,l)},n},"note"),ave=Mtt});function aF(t,e,r,n){let i=[],a=o(l=>{i.push(l,0)},"addBorder"),s=o(l=>{i.push(0,l)},"skipBorder");e.includes("t")?(Y.debug("add top border"),a(r)):s(r),e.includes("r")?(Y.debug("add right border"),a(n)):s(n),e.includes("b")?(Y.debug("add bottom border"),a(r)):s(r),e.includes("l")?(Y.debug("add left border"),a(n)):s(n),t.attr("stroke-dasharray",i.join(" "))}var ove,yo,lve,Itt,Ott,Ptt,Btt,Ftt,$tt,ztt,Gtt,Vtt,Utt,Htt,Wtt,qtt,Ytt,Xtt,jtt,Ktt,Qtt,Ztt,cve,Jtt,ert,uve,aC,sF,hve,fve=N(()=>{"use strict";dr();zt();gr();vt();Yye();rC();nF();sve();iF();ove=o(t=>t?" "+t:"","formatClass"),yo=o((t,e)=>`${e||"node default"}${ove(t.classes)} ${ove(t.class)}`,"getClassesFromNode"),lve=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Di(t,e,yo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=i+a,l=[{x:s/2,y:0},{x:s,y:-s/2},{x:s/2,y:-s},{x:0,y:-s/2}];Y.info("Question main (Circle)");let u=Hl(r,s,s,l);return u.attr("style",e.style),Qn(e,u),e.intersect=function(h){return Y.warn("Intersect called"),In.polygon(e,l,h)},r},"question"),Itt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=28,i=[{x:0,y:n/2},{x:n/2,y:0},{x:0,y:-n/2},{x:-n/2,y:0}];return r.insert("polygon",":first-child").attr("points",i.map(function(s){return s.x+","+s.y}).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),e.width=28,e.height=28,e.intersect=function(s){return In.circle(e,14,s)},r},"choice"),Ott=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Di(t,e,yo(e,void 0),!0),i=4,a=n.height+e.padding,s=a/i,l=n.width+2*s+e.padding,u=[{x:s,y:0},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}],h=Hl(r,l,a,u);return h.attr("style",e.style),Qn(e,h),e.intersect=function(f){return In.polygon(e,u,f)},r},"hexagon"),Ptt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Di(t,e,void 0,!0),i=2,a=n.height+2*e.padding,s=a/i,l=n.width+2*s+e.padding,u=qye(e.directions,n,e),h=Hl(r,l,a,u);return h.attr("style",e.style),Qn(e,h),e.intersect=function(f){return In.polygon(e,u,f)},r},"block_arrow"),Btt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Di(t,e,yo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-a/2,y:0},{x:i,y:0},{x:i,y:-a},{x:-a/2,y:-a},{x:0,y:-a/2}];return Hl(r,i,a,s).attr("style",e.style),e.width=i+a,e.height=a,e.intersect=function(u){return In.polygon(e,s,u)},r},"rect_left_inv_arrow"),Ftt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Di(t,e,yo(e),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:a/6,y:-a}],l=Hl(r,i,a,s);return l.attr("style",e.style),Qn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"lean_right"),$tt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Di(t,e,yo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:2*a/6,y:0},{x:i+a/6,y:0},{x:i-2*a/6,y:-a},{x:-a/6,y:-a}],l=Hl(r,i,a,s);return l.attr("style",e.style),Qn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"lean_left"),ztt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Di(t,e,yo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i+2*a/6,y:0},{x:i-a/6,y:-a},{x:a/6,y:-a}],l=Hl(r,i,a,s);return l.attr("style",e.style),Qn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"trapezoid"),Gtt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Di(t,e,yo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:-2*a/6,y:-a}],l=Hl(r,i,a,s);return l.attr("style",e.style),Qn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"inv_trapezoid"),Vtt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Di(t,e,yo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i+a/2,y:0},{x:i,y:-a/2},{x:i+a/2,y:-a},{x:0,y:-a}],l=Hl(r,i,a,s);return l.attr("style",e.style),Qn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"rect_right_inv_arrow"),Utt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Di(t,e,yo(e,void 0),!0),i=n.width+e.padding,a=i/2,s=a/(2.5+i/50),l=n.height+s+e.padding,u="M 0,"+s+" a "+a+","+s+" 0,0,0 "+i+" 0 a "+a+","+s+" 0,0,0 "+-i+" 0 l 0,"+l+" a "+a+","+s+" 0,0,0 "+i+" 0 l 0,"+-l,h=r.attr("label-offset-y",s).insert("path",":first-child").attr("style",e.style).attr("d",u).attr("transform","translate("+-i/2+","+-(l/2+s)+")");return Qn(e,h),e.intersect=function(f){let d=In.rect(e,f),p=d.x-e.x;if(a!=0&&(Math.abs(p)e.height/2-s)){let m=s*s*(1-p*p/(a*a));m!=0&&(m=Math.sqrt(m)),m=s-m,f.y-e.y>0&&(m=-m),d.y+=m}return d},r},"cylinder"),Htt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Di(t,e,"node "+e.classes+" "+e.class,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,l=e.positioned?e.height:n.height+e.padding,u=e.positioned?-s/2:-n.width/2-i,h=e.positioned?-l/2:-n.height/2-i;if(a.attr("class","basic label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",u).attr("y",h).attr("width",s).attr("height",l),e.props){let f=new Set(Object.keys(e.props));e.props.borders&&(aF(a,e.props.borders,s,l),f.delete("borders")),f.forEach(d=>{Y.warn(`Unknown node property ${d}`)})}return Qn(e,a),e.intersect=function(f){return In.rect(e,f)},r},"rect"),Wtt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Di(t,e,"node "+e.classes,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,l=e.positioned?e.height:n.height+e.padding,u=e.positioned?-s/2:-n.width/2-i,h=e.positioned?-l/2:-n.height/2-i;if(a.attr("class","basic cluster composite label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",u).attr("y",h).attr("width",s).attr("height",l),e.props){let f=new Set(Object.keys(e.props));e.props.borders&&(aF(a,e.props.borders,s,l),f.delete("borders")),f.forEach(d=>{Y.warn(`Unknown node property ${d}`)})}return Qn(e,a),e.intersect=function(f){return In.rect(e,f)},r},"composite"),qtt=o(async(t,e)=>{let{shapeSvg:r}=await Di(t,e,"label",!0);Y.trace("Classes = ",e.class);let n=r.insert("rect",":first-child"),i=0,a=0;if(n.attr("width",i).attr("height",a),r.attr("class","label edgeLabel"),e.props){let s=new Set(Object.keys(e.props));e.props.borders&&(aF(n,e.props.borders,i,a),s.delete("borders")),s.forEach(l=>{Y.warn(`Unknown node property ${l}`)})}return Qn(e,n),e.intersect=function(s){return In.rect(e,s)},r},"labelRect");o(aF,"applyNodePropertyBorders");Ytt=o((t,e)=>{let r;e.classes?r="node "+e.classes:r="node default";let n=t.insert("g").attr("class",r).attr("id",e.domId||e.id),i=n.insert("rect",":first-child"),a=n.insert("line"),s=n.insert("g").attr("class","label"),l=e.labelText.flat?e.labelText.flat():e.labelText,u="";typeof l=="object"?u=l[0]:u=l,Y.info("Label text abc79",u,l,typeof l=="object");let h=s.node().appendChild(vs(u,e.labelStyle,!0,!0)),f={width:0,height:0};if(fr(me().flowchart.htmlLabels)){let y=h.children[0],v=Ge(h);f=y.getBoundingClientRect(),v.attr("width",f.width),v.attr("height",f.height)}Y.info("Text 2",l);let d=l.slice(1,l.length),p=h.getBBox(),m=s.node().appendChild(vs(d.join?d.join("
    "):d,e.labelStyle,!0,!0));if(fr(me().flowchart.htmlLabels)){let y=m.children[0],v=Ge(m);f=y.getBoundingClientRect(),v.attr("width",f.width),v.attr("height",f.height)}let g=e.padding/2;return Ge(m).attr("transform","translate( "+(f.width>p.width?0:(p.width-f.width)/2)+", "+(p.height+g+5)+")"),Ge(h).attr("transform","translate( "+(f.width{let{shapeSvg:r,bbox:n}=await Di(t,e,yo(e,void 0),!0),i=n.height+e.padding,a=n.width+i/4+e.padding,s=r.insert("rect",":first-child").attr("style",e.style).attr("rx",i/2).attr("ry",i/2).attr("x",-a/2).attr("y",-i/2).attr("width",a).attr("height",i);return Qn(e,s),e.intersect=function(l){return In.rect(e,l)},r},"stadium"),jtt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Di(t,e,yo(e,void 0),!0),a=r.insert("circle",":first-child");return a.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),Y.info("Circle main"),Qn(e,a),e.intersect=function(s){return Y.info("Circle intersect",e,n.width/2+i,s),In.circle(e,n.width/2+i,s)},r},"circle"),Ktt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Di(t,e,yo(e,void 0),!0),a=5,s=r.insert("g",":first-child"),l=s.insert("circle"),u=s.insert("circle");return s.attr("class",e.class),l.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i+a).attr("width",n.width+e.padding+a*2).attr("height",n.height+e.padding+a*2),u.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),Y.info("DoubleCircle main"),Qn(e,l),e.intersect=function(h){return Y.info("DoubleCircle intersect",e,n.width/2+i+a,h),In.circle(e,n.width/2+i+a,h)},r},"doublecircle"),Qtt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Di(t,e,yo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i,y:0},{x:i,y:-a},{x:0,y:-a},{x:0,y:0},{x:-8,y:0},{x:i+8,y:0},{x:i+8,y:-a},{x:-8,y:-a},{x:-8,y:0}],l=Hl(r,i,a,s);return l.attr("style",e.style),Qn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"subroutine"),Ztt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child");return n.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),Qn(e,n),e.intersect=function(i){return In.circle(e,7,i)},r},"start"),cve=o((t,e,r)=>{let n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=70,a=10;r==="LR"&&(i=10,a=70);let s=n.append("rect").attr("x",-1*i/2).attr("y",-1*a/2).attr("width",i).attr("height",a).attr("class","fork-join");return Qn(e,s),e.height=e.height+e.padding/2,e.width=e.width+e.padding/2,e.intersect=function(l){return In.rect(e,l)},n},"forkJoin"),Jtt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child"),i=r.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),n.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),Qn(e,i),e.intersect=function(a){return In.circle(e,7,a)},r},"end"),ert=o((t,e)=>{let r=e.padding/2,n=4,i=8,a;e.classes?a="node "+e.classes:a="node default";let s=t.insert("g").attr("class",a).attr("id",e.domId||e.id),l=s.insert("rect",":first-child"),u=s.insert("line"),h=s.insert("line"),f=0,d=n,p=s.insert("g").attr("class","label"),m=0,g=e.classData.annotations?.[0],y=e.classData.annotations[0]?"\xAB"+e.classData.annotations[0]+"\xBB":"",v=p.node().appendChild(vs(y,e.labelStyle,!0,!0)),x=v.getBBox();if(fr(me().flowchart.htmlLabels)){let S=v.children[0],_=Ge(v);x=S.getBoundingClientRect(),_.attr("width",x.width),_.attr("height",x.height)}e.classData.annotations[0]&&(d+=x.height+n,f+=x.width);let b=e.classData.label;e.classData.type!==void 0&&e.classData.type!==""&&(me().flowchart.htmlLabels?b+="<"+e.classData.type+">":b+="<"+e.classData.type+">");let w=p.node().appendChild(vs(b,e.labelStyle,!0,!0));Ge(w).attr("class","classTitle");let C=w.getBBox();if(fr(me().flowchart.htmlLabels)){let S=w.children[0],_=Ge(w);C=S.getBoundingClientRect(),_.attr("width",C.width),_.attr("height",C.height)}d+=C.height+n,C.width>f&&(f=C.width);let T=[];e.classData.members.forEach(S=>{let _=S.getDisplayDetails(),I=_.displayText;me().flowchart.htmlLabels&&(I=I.replace(//g,">"));let D=p.node().appendChild(vs(I,_.cssStyle?_.cssStyle:e.labelStyle,!0,!0)),k=D.getBBox();if(fr(me().flowchart.htmlLabels)){let L=D.children[0],R=Ge(D);k=L.getBoundingClientRect(),R.attr("width",k.width),R.attr("height",k.height)}k.width>f&&(f=k.width),d+=k.height+n,T.push(D)}),d+=i;let E=[];if(e.classData.methods.forEach(S=>{let _=S.getDisplayDetails(),I=_.displayText;me().flowchart.htmlLabels&&(I=I.replace(//g,">"));let D=p.node().appendChild(vs(I,_.cssStyle?_.cssStyle:e.labelStyle,!0,!0)),k=D.getBBox();if(fr(me().flowchart.htmlLabels)){let L=D.children[0],R=Ge(D);k=L.getBoundingClientRect(),R.attr("width",k.width),R.attr("height",k.height)}k.width>f&&(f=k.width),d+=k.height+n,E.push(D)}),d+=i,g){let S=(f-x.width)/2;Ge(v).attr("transform","translate( "+(-1*f/2+S)+", "+-1*d/2+")"),m=x.height+n}let A=(f-C.width)/2;return Ge(w).attr("transform","translate( "+(-1*f/2+A)+", "+(-1*d/2+m)+")"),m+=C.height+n,u.attr("class","divider").attr("x1",-f/2-r).attr("x2",f/2+r).attr("y1",-d/2-r+i+m).attr("y2",-d/2-r+i+m),m+=i,T.forEach(S=>{Ge(S).attr("transform","translate( "+-f/2+", "+(-1*d/2+m+i/2)+")");let _=S?.getBBox();m+=(_?.height??0)+n}),m+=i,h.attr("class","divider").attr("x1",-f/2-r).attr("x2",f/2+r).attr("y1",-d/2-r+i+m).attr("y2",-d/2-r+i+m),m+=i,E.forEach(S=>{Ge(S).attr("transform","translate( "+-f/2+", "+(-1*d/2+m)+")");let _=S?.getBBox();m+=(_?.height??0)+n}),l.attr("style",e.style).attr("class","outer title-state").attr("x",-f/2-r).attr("y",-(d/2)-r).attr("width",f+e.padding).attr("height",d+e.padding),Qn(e,l),e.intersect=function(S){return In.rect(e,S)},s},"class_box"),uve={rhombus:lve,composite:Wtt,question:lve,rect:Htt,labelRect:qtt,rectWithTitle:Ytt,choice:Itt,circle:jtt,doublecircle:Ktt,stadium:Xtt,hexagon:Ott,block_arrow:Ptt,rect_left_inv_arrow:Btt,lean_right:Ftt,lean_left:$tt,trapezoid:ztt,inv_trapezoid:Gtt,rect_right_inv_arrow:Vtt,cylinder:Utt,start:Ztt,end:Jtt,note:ave,subroutine:Qtt,fork:cve,join:cve,class_box:ert},aC={},sF=o(async(t,e,r)=>{let n,i;if(e.link){let a;me().securityLevel==="sandbox"?a="_top":e.linkTarget&&(a=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",a),i=await uve[e.shape](n,e,r)}else i=await uve[e.shape](t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),e.class&&i.attr("class","node default "+e.class),aC[e.id]=n,e.haveCallback&&aC[e.id].attr("class",aC[e.id].attr("class")+" clickable"),n},"insertNode"),hve=o(t=>{let e=aC[t.id];Y.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode")});function dve(t,e,r=!1){let n=t,i="default";(n?.classes?.length||0)>0&&(i=(n?.classes??[]).join(" ")),i=i+" flowchart-label";let a=0,s="",l;switch(n.type){case"round":a=5,s="rect";break;case"composite":a=0,s="composite",l=0;break;case"square":s="rect";break;case"diamond":s="question";break;case"hexagon":s="hexagon";break;case"block_arrow":s="block_arrow";break;case"odd":s="rect_left_inv_arrow";break;case"lean_right":s="lean_right";break;case"lean_left":s="lean_left";break;case"trapezoid":s="trapezoid";break;case"inv_trapezoid":s="inv_trapezoid";break;case"rect_left_inv_arrow":s="rect_left_inv_arrow";break;case"circle":s="circle";break;case"ellipse":s="ellipse";break;case"stadium":s="stadium";break;case"subroutine":s="subroutine";break;case"cylinder":s="cylinder";break;case"group":s="rect";break;case"doublecircle":s="doublecircle";break;default:s="rect"}let u=Y9(n?.styles??[]),h=n.label,f=n.size??{width:0,height:0,x:0,y:0};return{labelStyle:u.labelStyle,shape:s,labelText:h,rx:a,ry:a,class:i,style:u.style,id:n.id,directions:n.directions,width:f.width,height:f.height,x:f.x,y:f.y,positioned:r,intersect:void 0,type:n.type,padding:l??cr()?.block?.padding??0}}async function trt(t,e,r){let n=dve(e,r,!1);if(n.type==="group")return;let i=cr(),a=await sF(t,n,{config:i}),s=a.node().getBBox(),l=r.getBlock(n.id);l.size={width:s.width,height:s.height,x:0,y:0,node:a},r.setBlock(l),a.remove()}async function rrt(t,e,r){let n=dve(e,r,!0);if(r.getBlock(n.id).type!=="space"){let a=cr();await sF(t,n,{config:a}),e.intersect=n?.intersect,hve(n)}}async function oF(t,e,r,n){for(let i of e)await n(t,i,r),i.children&&await oF(t,i.children,r,n)}async function pve(t,e,r){await oF(t,e,r,trt)}async function mve(t,e,r){await oF(t,e,r,rrt)}async function gve(t,e,r,n,i){let a=new sn({multigraph:!0,compound:!0});a.setGraph({rankdir:"TB",nodesep:10,ranksep:10,marginx:8,marginy:8});for(let s of r)s.size&&a.setNode(s.id,{width:s.size.width,height:s.size.height,intersect:s.intersect});for(let s of e)if(s.start&&s.end){let l=n.getBlock(s.start),u=n.getBlock(s.end);if(l?.size&&u?.size){let h=l.size,f=u.size,d=[{x:h.x,y:h.y},{x:h.x+(f.x-h.x)/2,y:h.y+(f.y-h.y)/2},{x:f.x,y:f.y}];Hye(t,{v:s.start,w:s.end,name:s.id},{...s,arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:d,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"},void 0,"block",a,i),s.label&&(await Vye(t,{...s,label:s.label,labelStyle:"stroke: #333; stroke-width: 1.5px;fill:none;",arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:d,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"}),Uye({...s,x:d[1].x,y:d[1].y},{originalPath:d}))}}}var yve=N(()=>{"use strict";Vo();ji();Wye();fve();ir();o(dve,"getNodeFromBlock");o(trt,"calculateBlockSize");o(rrt,"insertBlockPositioned");o(oF,"performOperations");o(pve,"calculateBlockSizes");o(mve,"insertBlocks");o(gve,"insertEdges")});var nrt,irt,vve,xve=N(()=>{"use strict";dr();ji();Nye();vt();Ei();Pye();yve();nrt=o(function(t,e){return e.db.getClasses()},"getClasses"),irt=o(async function(t,e,r,n){let{securityLevel:i,block:a}=cr(),s=n.db,l;i==="sandbox"&&(l=Ge("#i"+e));let u=i==="sandbox"?Ge(l.nodes()[0].contentDocument.body):Ge("body"),h=i==="sandbox"?u.select(`[id="${e}"]`):Ge(`[id="${e}"]`);Rye(h,["point","circle","cross"],n.type,e);let d=s.getBlocks(),p=s.getBlocksFlat(),m=s.getEdges(),g=h.insert("g").attr("class","block");await pve(g,d,s);let y=Oye(s);if(await mve(g,d,s),await gve(g,m,p,s,e),y){let v=y,x=Math.max(1,Math.round(.125*(v.width/v.height))),b=v.height+x+10,w=v.width+10,{useMaxWidth:C}=a;vn(h,b,w,!!C),Y.debug("Here Bounds",y,v),h.attr("viewBox",`${v.x-5} ${v.y-5} ${v.width+10} ${v.height+10}`)}},"draw"),vve={draw:irt,getClasses:nrt}});var bve={};hr(bve,{diagram:()=>art});var art,wve=N(()=>{"use strict";wye();_ye();Lye();xve();art={parser:bye,db:Aye,renderer:vve,styles:Dye}});var lF,cF,v4,Eve,uF,Ha,Zc,x4,Sve,crt,b4,Cve,Ave,_ve,Dve,Lve,sC,Ff,oC=N(()=>{"use strict";lF={L:"left",R:"right",T:"top",B:"bottom"},cF={L:o(t=>`${t},${t/2} 0,${t} 0,0`,"L"),R:o(t=>`0,${t/2} ${t},0 ${t},${t}`,"R"),T:o(t=>`0,0 ${t},0 ${t/2},${t}`,"T"),B:o(t=>`${t/2},0 ${t},${t} 0,${t}`,"B")},v4={L:o((t,e)=>t-e+2,"L"),R:o((t,e)=>t-2,"R"),T:o((t,e)=>t-e+2,"T"),B:o((t,e)=>t-2,"B")},Eve=o(function(t){return Ha(t)?t==="L"?"R":"L":t==="T"?"B":"T"},"getOppositeArchitectureDirection"),uF=o(function(t){let e=t;return e==="L"||e==="R"||e==="T"||e==="B"},"isArchitectureDirection"),Ha=o(function(t){let e=t;return e==="L"||e==="R"},"isArchitectureDirectionX"),Zc=o(function(t){let e=t;return e==="T"||e==="B"},"isArchitectureDirectionY"),x4=o(function(t,e){let r=Ha(t)&&Zc(e),n=Zc(t)&&Ha(e);return r||n},"isArchitectureDirectionXY"),Sve=o(function(t){let e=t[0],r=t[1],n=Ha(e)&&Zc(r),i=Zc(e)&&Ha(r);return n||i},"isArchitecturePairXY"),crt=o(function(t){return t!=="LL"&&t!=="RR"&&t!=="TT"&&t!=="BB"},"isValidArchitectureDirectionPair"),b4=o(function(t,e){let r=`${t}${e}`;return crt(r)?r:void 0},"getArchitectureDirectionPair"),Cve=o(function([t,e],r){let n=r[0],i=r[1];return Ha(n)?Zc(i)?[t+(n==="L"?-1:1),e+(i==="T"?1:-1)]:[t+(n==="L"?-1:1),e]:Ha(i)?[t+(i==="L"?1:-1),e+(n==="T"?1:-1)]:[t,e+(n==="T"?1:-1)]},"shiftPositionByArchitectureDirectionPair"),Ave=o(function(t){return t==="LT"||t==="TL"?[1,1]:t==="BL"||t==="LB"?[1,-1]:t==="BR"||t==="RB"?[-1,-1]:[-1,1]},"getArchitectureDirectionXYFactors"),_ve=o(function(t,e){return x4(t,e)?"bend":Ha(t)?"horizontal":"vertical"},"getArchitectureDirectionAlignment"),Dve=o(function(t){return t.type==="service"},"isArchitectureService"),Lve=o(function(t){return t.type==="junction"},"isArchitectureJunction"),sC=o(t=>t.data(),"edgeData"),Ff=o(t=>t.data(),"nodeData")});function Li(t){let e=me().architecture;return e?.[t]?e[t]:Rve[t]}var Rve,vr,urt,hrt,frt,drt,prt,mrt,hF,grt,yrt,vrt,xrt,brt,wrt,Trt,Qp,w4=N(()=>{"use strict";Ya();zt();s6();mi();oC();Rve=or.architecture,vr=new pf(()=>({nodes:{},groups:{},edges:[],registeredIds:{},config:Rve,dataStructures:void 0,elements:{}})),urt=o(()=>{vr.reset(),Ar()},"clear"),hrt=o(function({id:t,icon:e,in:r,title:n,iconText:i}){if(vr.records.registeredIds[t]!==void 0)throw new Error(`The service id [${t}] is already in use by another ${vr.records.registeredIds[t]}`);if(r!==void 0){if(t===r)throw new Error(`The service [${t}] cannot be placed within itself`);if(vr.records.registeredIds[r]===void 0)throw new Error(`The service [${t}]'s parent does not exist. Please make sure the parent is created before this service`);if(vr.records.registeredIds[r]==="node")throw new Error(`The service [${t}]'s parent is not a group`)}vr.records.registeredIds[t]="node",vr.records.nodes[t]={id:t,type:"service",icon:e,iconText:i,title:n,edges:[],in:r}},"addService"),frt=o(()=>Object.values(vr.records.nodes).filter(Dve),"getServices"),drt=o(function({id:t,in:e}){vr.records.registeredIds[t]="node",vr.records.nodes[t]={id:t,type:"junction",edges:[],in:e}},"addJunction"),prt=o(()=>Object.values(vr.records.nodes).filter(Lve),"getJunctions"),mrt=o(()=>Object.values(vr.records.nodes),"getNodes"),hF=o(t=>vr.records.nodes[t],"getNode"),grt=o(function({id:t,icon:e,in:r,title:n}){if(vr.records.registeredIds[t]!==void 0)throw new Error(`The group id [${t}] is already in use by another ${vr.records.registeredIds[t]}`);if(r!==void 0){if(t===r)throw new Error(`The group [${t}] cannot be placed within itself`);if(vr.records.registeredIds[r]===void 0)throw new Error(`The group [${t}]'s parent does not exist. Please make sure the parent is created before this group`);if(vr.records.registeredIds[r]==="node")throw new Error(`The group [${t}]'s parent is not a group`)}vr.records.registeredIds[t]="group",vr.records.groups[t]={id:t,icon:e,title:n,in:r}},"addGroup"),yrt=o(()=>Object.values(vr.records.groups),"getGroups"),vrt=o(function({lhsId:t,rhsId:e,lhsDir:r,rhsDir:n,lhsInto:i,rhsInto:a,lhsGroup:s,rhsGroup:l,title:u}){if(!uF(r))throw new Error(`Invalid direction given for left hand side of edge ${t}--${e}. Expected (L,R,T,B) got ${r}`);if(!uF(n))throw new Error(`Invalid direction given for right hand side of edge ${t}--${e}. Expected (L,R,T,B) got ${n}`);if(vr.records.nodes[t]===void 0&&vr.records.groups[t]===void 0)throw new Error(`The left-hand id [${t}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(vr.records.nodes[e]===void 0&&vr.records.groups[t]===void 0)throw new Error(`The right-hand id [${e}] does not yet exist. Please create the service/group before declaring an edge to it.`);let h=vr.records.nodes[t].in,f=vr.records.nodes[e].in;if(s&&h&&f&&h==f)throw new Error(`The left-hand id [${t}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(l&&h&&f&&h==f)throw new Error(`The right-hand id [${e}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let d={lhsId:t,lhsDir:r,lhsInto:i,lhsGroup:s,rhsId:e,rhsDir:n,rhsInto:a,rhsGroup:l,title:u};vr.records.edges.push(d),vr.records.nodes[t]&&vr.records.nodes[e]&&(vr.records.nodes[t].edges.push(vr.records.edges[vr.records.edges.length-1]),vr.records.nodes[e].edges.push(vr.records.edges[vr.records.edges.length-1]))},"addEdge"),xrt=o(()=>vr.records.edges,"getEdges"),brt=o(()=>{if(vr.records.dataStructures===void 0){let t={},e=Object.entries(vr.records.nodes).reduce((l,[u,h])=>(l[u]=h.edges.reduce((f,d)=>{let p=hF(d.lhsId)?.in,m=hF(d.rhsId)?.in;if(p&&m&&p!==m){let g=_ve(d.lhsDir,d.rhsDir);g!=="bend"&&(t[p]??={},t[p][m]=g,t[m]??={},t[m][p]=g)}if(d.lhsId===u){let g=b4(d.lhsDir,d.rhsDir);g&&(f[g]=d.rhsId)}else{let g=b4(d.rhsDir,d.lhsDir);g&&(f[g]=d.lhsId)}return f},{}),l),{}),r=Object.keys(e)[0],n={[r]:1},i=Object.keys(e).reduce((l,u)=>u===r?l:{...l,[u]:1},{}),a=o(l=>{let u={[l]:[0,0]},h=[l];for(;h.length>0;){let f=h.shift();if(f){n[f]=1,delete i[f];let d=e[f],[p,m]=u[f];Object.entries(d).forEach(([g,y])=>{n[y]||(u[y]=Cve([p,m],g),h.push(y))})}}return u},"BFS"),s=[a(r)];for(;Object.keys(i).length>0;)s.push(a(Object.keys(i)[0]));vr.records.dataStructures={adjList:e,spatialMaps:s,groupAlignments:t}}return vr.records.dataStructures},"getDataStructures"),wrt=o((t,e)=>{vr.records.elements[t]=e},"setElementForId"),Trt=o(t=>vr.records.elements[t],"getElementById"),Qp={clear:urt,setDiagramTitle:$r,getDiagramTitle:Ir,setAccTitle:Lr,getAccTitle:Rr,setAccDescription:Nr,getAccDescription:Mr,addService:hrt,getServices:frt,addJunction:drt,getJunctions:prt,getNodes:mrt,getNode:hF,addGroup:grt,getGroups:yrt,addEdge:vrt,getEdges:xrt,setElementForId:wrt,getElementById:Trt,getDataStructures:brt};o(Li,"getConfigField")});var krt,Nve,Mve=N(()=>{"use strict";kp();vt();T1();w4();krt=o((t,e)=>{$c(t,e),t.groups.map(e.addGroup),t.services.map(r=>e.addService({...r,type:"service"})),t.junctions.map(r=>e.addJunction({...r,type:"junction"})),t.edges.map(e.addEdge)},"populateDb"),Nve={parse:o(async t=>{let e=await uo("architecture",t);Y.debug(e),krt(e,Qp)},"parse")}});var Ert,Ive,Ove=N(()=>{"use strict";Ert=o(t=>` + .edge { + stroke-width: ${t.archEdgeWidth}; + stroke: ${t.archEdgeColor}; + fill: none; + } + + .arrow { + fill: ${t.archEdgeArrowColor}; + } + + .node-bkg { + fill: none; + stroke: ${t.archGroupBorderColor}; + stroke-width: ${t.archGroupBorderWidth}; + stroke-dasharray: 8; + } + .node-icon-text { + display: flex; + align-items: center; + } + + .node-icon-text > div { + color: #fff; + margin: 1px; + height: fit-content; + text-align: center; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + } +`,"getStyles"),Ive=Ert});var dF=Mi((T4,fF)=>{"use strict";o(function(e,r){typeof T4=="object"&&typeof fF=="object"?fF.exports=r():typeof define=="function"&&define.amd?define([],r):typeof T4=="object"?T4.layoutBase=r():e.layoutBase=r()},"webpackUniversalModuleDefinition")(T4,function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return o(r,"__webpack_require__"),r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?o(function(){return n.default},"getDefault"):o(function(){return n},"getModuleExports");return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=28)}([function(t,e,r){"use strict";function n(){}o(n,"LayoutConstants"),n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(u,h,f){n.call(this,f),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=f,this.bendpoints=[],this.source=u,this.target=h}o(s,"LEdge"),s.prototype=Object.create(n.prototype);for(var l in n)s[l]=n[l];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(u){if(this.source===u)return this.target;if(this.target===u)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(u,h){for(var f=this.getOtherEnd(u),d=h.getGraphManager().getRoot();;){if(f.getOwner()==h)return f;if(f.getOwner()==d)break;f=f.getOwner().getParent()}return null},s.prototype.updateLength=function(){var u=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),u),this.isOverlapingSourceAndTarget||(this.lengthX=u[0]-u[2],this.lengthY=u[1]-u[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s},function(t,e,r){"use strict";function n(i){this.vGraphObject=i}o(n,"LGraphObject"),t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),l=r(16),u=r(5);function h(d,p,m,g){m==null&&g==null&&(g=p),n.call(this,g),d.graphManager!=null&&(d=d.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=d,m!=null&&p!=null?this.rect=new a(p.x,p.y,m.width,m.height):this.rect=new a}o(h,"LNode"),h.prototype=Object.create(n.prototype);for(var f in n)h[f]=n[f];h.prototype.getEdges=function(){return this.edges},h.prototype.getChild=function(){return this.child},h.prototype.getOwner=function(){return this.owner},h.prototype.getWidth=function(){return this.rect.width},h.prototype.setWidth=function(d){this.rect.width=d},h.prototype.getHeight=function(){return this.rect.height},h.prototype.setHeight=function(d){this.rect.height=d},h.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},h.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},h.prototype.getCenter=function(){return new u(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},h.prototype.getLocation=function(){return new u(this.rect.x,this.rect.y)},h.prototype.getRect=function(){return this.rect},h.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},h.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},h.prototype.setRect=function(d,p){this.rect.x=d.x,this.rect.y=d.y,this.rect.width=p.width,this.rect.height=p.height},h.prototype.setCenter=function(d,p){this.rect.x=d-this.rect.width/2,this.rect.y=p-this.rect.height/2},h.prototype.setLocation=function(d,p){this.rect.x=d,this.rect.y=p},h.prototype.moveBy=function(d,p){this.rect.x+=d,this.rect.y+=p},h.prototype.getEdgeListToNode=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(y.target==d){if(y.source!=g)throw"Incorrect edge source!";p.push(y)}}),p},h.prototype.getEdgesBetween=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(!(y.source==g||y.target==g))throw"Incorrect edge source and/or target";(y.target==d||y.source==d)&&p.push(y)}),p},h.prototype.getNeighborsList=function(){var d=new Set,p=this;return p.edges.forEach(function(m){if(m.source==p)d.add(m.target);else{if(m.target!=p)throw"Incorrect incidency!";d.add(m.source)}}),d},h.prototype.withChildren=function(){var d=new Set,p,m;if(d.add(this),this.child!=null)for(var g=this.child.getNodes(),y=0;yp?(this.rect.x-=(this.labelWidth-p)/2,this.setWidth(this.labelWidth)):this.labelPosHorizontal=="right"&&this.setWidth(p+this.labelWidth)),this.labelHeight&&(this.labelPosVertical=="top"?(this.rect.y-=this.labelHeight,this.setHeight(m+this.labelHeight)):this.labelPosVertical=="center"&&this.labelHeight>m?(this.rect.y-=(this.labelHeight-m)/2,this.setHeight(this.labelHeight)):this.labelPosVertical=="bottom"&&this.setHeight(m+this.labelHeight))}}},h.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},h.prototype.transform=function(d){var p=this.rect.x;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var m=this.rect.y;m>s.WORLD_BOUNDARY?m=s.WORLD_BOUNDARY:m<-s.WORLD_BOUNDARY&&(m=-s.WORLD_BOUNDARY);var g=new u(p,m),y=d.inverseTransformPoint(g);this.setLocation(y.x,y.y)},h.prototype.getLeft=function(){return this.rect.x},h.prototype.getRight=function(){return this.rect.x+this.rect.width},h.prototype.getTop=function(){return this.rect.y},h.prototype.getBottom=function(){return this.rect.y+this.rect.height},h.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=h},function(t,e,r){"use strict";var n=r(0);function i(){}o(i,"FDLayoutConstants");for(var a in n)i[a]=n[a];i.MAX_ITERATIONS=2500,i.DEFAULT_EDGE_LENGTH=50,i.DEFAULT_SPRING_STRENGTH=.45,i.DEFAULT_REPULSION_STRENGTH=4500,i.DEFAULT_GRAVITY_STRENGTH=.4,i.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,i.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,i.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,i.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,i.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,i.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,i.COOLING_ADAPTATION_FACTOR=.33,i.ADAPTATION_LOWER_NODE_LIMIT=1e3,i.ADAPTATION_UPPER_NODE_LIMIT=5e3,i.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,i.MAX_NODE_DISPLACEMENT=i.MAX_NODE_DISPLACEMENT_INCREMENTAL*3,i.MIN_REPULSION_DIST=i.DEFAULT_EDGE_LENGTH/10,i.CONVERGENCE_CHECK_PERIOD=100,i.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,i.MIN_EDGE_LENGTH=1,i.GRID_CALCULATION_CHECK_PERIOD=10,t.exports=i},function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}o(n,"PointD"),n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(7),l=r(3),u=r(1),h=r(13),f=r(12),d=r(11);function p(g,y,v){n.call(this,v),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,y!=null&&y instanceof s?this.graphManager=y:y!=null&&y instanceof Layout&&(this.graphManager=y.graphManager)}o(p,"LGraph"),p.prototype=Object.create(n.prototype);for(var m in n)p[m]=n[m];p.prototype.getNodes=function(){return this.nodes},p.prototype.getEdges=function(){return this.edges},p.prototype.getGraphManager=function(){return this.graphManager},p.prototype.getParent=function(){return this.parent},p.prototype.getLeft=function(){return this.left},p.prototype.getRight=function(){return this.right},p.prototype.getTop=function(){return this.top},p.prototype.getBottom=function(){return this.bottom},p.prototype.isConnected=function(){return this.isConnected},p.prototype.add=function(g,y,v){if(y==null&&v==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(y)>-1&&this.getNodes().indexOf(v)>-1))throw"Source or target not in graph!";if(!(y.owner==v.owner&&y.owner==this))throw"Both owners must be this graph!";return y.owner!=v.owner?null:(b.source=y,b.target=v,b.isInterGraph=!1,this.getEdges().push(b),y.edges.push(b),v!=y&&v.edges.push(b),b)}},p.prototype.remove=function(g){var y=g;if(g instanceof l){if(y==null)throw"Node is null!";if(!(y.owner!=null&&y.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var v=y.edges.slice(),x,b=v.length,w=0;w-1&&E>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(T,1),x.target!=x.source&&x.target.edges.splice(E,1);var C=x.source.owner.getEdges().indexOf(x);if(C==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(C,1)}},p.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,y=i.MAX_VALUE,v,x,b,w=this.getNodes(),C=w.length,T=0;Tv&&(g=v),y>x&&(y=x)}return g==i.MAX_VALUE?null:(w[0].getParent().paddingLeft!=null?b=w[0].getParent().paddingLeft:b=this.margin,this.left=y-b,this.top=g-b,new f(this.left,this.top))},p.prototype.updateBounds=function(g){for(var y=i.MAX_VALUE,v=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,w,C,T,E,A,S=this.nodes,_=S.length,I=0;I<_;I++){var D=S[I];g&&D.child!=null&&D.updateBounds(),w=D.getLeft(),C=D.getRight(),T=D.getTop(),E=D.getBottom(),y>w&&(y=w),vT&&(x=T),bw&&(y=w),vT&&(x=T),b=this.nodes.length){var _=0;v.forEach(function(I){I.owner==g&&_++}),_==this.nodes.length&&(this.isConnected=!0)}},t.exports=p},function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(6),this.layout=s,this.graphs=[],this.edges=[]}o(a,"LGraphManager"),a.prototype.addRoot=function(){var s=this.layout.newGraph(),l=this.layout.newNode(null),u=this.add(s,l);return this.setRootGraph(u),this.rootGraph},a.prototype.add=function(s,l,u,h,f){if(u==null&&h==null&&f==null){if(s==null)throw"Graph is null!";if(l==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(l.child!=null)throw"Already has a child!";return s.parent=l,l.child=s,s}else{f=u,h=l,u=s;var d=h.getOwner(),p=f.getOwner();if(!(d!=null&&d.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(p!=null&&p.getGraphManager()==this))throw"Target not in this graph mgr!";if(d==p)return u.isInterGraph=!1,d.add(u,h,f);if(u.isInterGraph=!0,u.source=h,u.target=f,this.edges.indexOf(u)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(u),!(u.source!=null&&u.target!=null))throw"Edge source and/or target is null!";if(!(u.source.edges.indexOf(u)==-1&&u.target.edges.indexOf(u)==-1))throw"Edge already in source and/or target incidency list!";return u.source.edges.push(u),u.target.edges.push(u),u}},a.prototype.remove=function(s){if(s instanceof n){var l=s;if(l.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(l==this.rootGraph||l.parent!=null&&l.parent.graphManager==this))throw"Invalid parent node!";var u=[];u=u.concat(l.getEdges());for(var h,f=u.length,d=0;d=s.getRight()?l[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(l[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?l[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(l[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var f=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(f=1);var d=f*l[0],p=l[1]/f;l[0]d)return l[0]=u,l[1]=m,l[2]=f,l[3]=S,!1;if(hf)return l[0]=p,l[1]=h,l[2]=E,l[3]=d,!1;if(uf?(l[0]=y,l[1]=v,k=!0):(l[0]=g,l[1]=m,k=!0):R===M&&(u>f?(l[0]=p,l[1]=m,k=!0):(l[0]=x,l[1]=v,k=!0)),-O===M?f>u?(l[2]=A,l[3]=S,L=!0):(l[2]=E,l[3]=T,L=!0):O===M&&(f>u?(l[2]=C,l[3]=T,L=!0):(l[2]=_,l[3]=S,L=!0)),k&&L)return!1;if(u>f?h>d?(B=this.getCardinalDirection(R,M,4),F=this.getCardinalDirection(O,M,2)):(B=this.getCardinalDirection(-R,M,3),F=this.getCardinalDirection(-O,M,1)):h>d?(B=this.getCardinalDirection(-R,M,1),F=this.getCardinalDirection(-O,M,3)):(B=this.getCardinalDirection(R,M,2),F=this.getCardinalDirection(O,M,4)),!k)switch(B){case 1:z=m,P=u+-w/M,l[0]=P,l[1]=z;break;case 2:P=x,z=h+b*M,l[0]=P,l[1]=z;break;case 3:z=v,P=u+w/M,l[0]=P,l[1]=z;break;case 4:P=y,z=h+-b*M,l[0]=P,l[1]=z;break}if(!L)switch(F){case 1:H=T,$=f+-D/M,l[2]=$,l[3]=H;break;case 2:$=_,H=d+I*M,l[2]=$,l[3]=H;break;case 3:H=S,$=f+D/M,l[2]=$,l[3]=H;break;case 4:$=A,H=d+-I*M,l[2]=$,l[3]=H;break}}return!1},i.getCardinalDirection=function(a,s,l){return a>s?l:1+l%4},i.getIntersection=function(a,s,l,u){if(u==null)return this.getIntersection2(a,s,l);var h=a.x,f=a.y,d=s.x,p=s.y,m=l.x,g=l.y,y=u.x,v=u.y,x=void 0,b=void 0,w=void 0,C=void 0,T=void 0,E=void 0,A=void 0,S=void 0,_=void 0;return w=p-f,T=h-d,A=d*f-h*p,C=v-g,E=m-y,S=y*g-m*v,_=w*E-C*T,_===0?null:(x=(T*S-E*A)/_,b=(C*A-w*S)/_,new n(x,b))},i.angleOfVector=function(a,s,l,u){var h=void 0;return a!==l?(h=Math.atan((u-s)/(l-a)),l=0){var v=(-m+Math.sqrt(m*m-4*p*g))/(2*p),x=(-m-Math.sqrt(m*m-4*p*g))/(2*p),b=null;return v>=0&&v<=1?[v]:x>=0&&x<=1?[x]:b}else return null},i.HALF_PI=.5*Math.PI,i.ONE_AND_HALF_PI=1.5*Math.PI,i.TWO_PI=2*Math.PI,i.THREE_PI=3*Math.PI,t.exports=i},function(t,e,r){"use strict";function n(){}o(n,"IMath"),n.sign=function(i){return i>0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n},function(t,e,r){"use strict";function n(){}o(n,"Integer"),n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n},function(t,e,r){"use strict";var n=function(){function h(f,d){for(var p=0;p"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i},function(t,e,r){"use strict";function n(m){if(Array.isArray(m)){for(var g=0,y=Array(m.length);g0&&g;){for(w.push(T[0]);w.length>0&&g;){var E=w[0];w.splice(0,1),b.add(E);for(var A=E.getEdges(),x=0;x-1&&T.splice(D,1)}b=new Set,C=new Map}}return m},p.prototype.createDummyNodesForBendpoints=function(m){for(var g=[],y=m.source,v=this.graphManager.calcLowestCommonAncestor(m.source,m.target),x=0;x0){for(var v=this.edgeToDummyNodes.get(y),x=0;x=0&&g.splice(S,1);var _=C.getNeighborsList();_.forEach(function(k){if(y.indexOf(k)<0){var L=v.get(k),R=L-1;R==1&&E.push(k),v.set(k,R)}})}y=y.concat(E),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},p.prototype.setGraphManager=function(m){this.graphManager=m},t.exports=p},function(t,e,r){"use strict";function n(){}o(n,"RandomSeed"),n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n},function(t,e,r){"use strict";var n=r(5);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o(i,"Transform"),i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,l=this.lworldExtX;return l!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/l),s},i.prototype.transformY=function(a){var s=0,l=this.lworldExtY;return l!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/l),s},i.prototype.inverseTransformX=function(a){var s=0,l=this.ldeviceExtX;return l!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/l),s},i.prototype.inverseTransformY=function(a){var s=0,l=this.ldeviceExtY;return l!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/l),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i},function(t,e,r){"use strict";function n(d){if(Array.isArray(d)){for(var p=0,m=Array(d.length);pa.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(d>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.displacementThresholdPerNode=3*a.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var d=this.getAllEdges(),p,m=0;m0&&arguments[0]!==void 0?arguments[0]:!0,p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,m,g,y,v,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&d&&this.updateGrid(),b=new Set,m=0;mw||b>w)&&(d.gravitationForceX=-this.gravityConstant*y,d.gravitationForceY=-this.gravityConstant*v)):(w=p.getEstimatedSize()*this.compoundGravityRangeFactor,(x>w||b>w)&&(d.gravitationForceX=-this.gravityConstant*y*this.compoundGravityConstant,d.gravitationForceY=-this.gravityConstant*v*this.compoundGravityConstant))},h.prototype.isConverged=function(){var d,p=!1;return this.totalIterations>this.maxIterations/3&&(p=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),d=this.totalDisplacement=x.length||w>=x[0].length)){for(var C=0;Ch},"_defaultCompareFunction")}]),l}();t.exports=s},function(t,e,r){"use strict";function n(){}o(n,"SVD"),n.svd=function(i){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=i.length,this.n=i[0].length;var a=Math.min(this.m,this.n);this.s=function(xt){for(var ut=[];xt-- >0;)ut.push(0);return ut}(Math.min(this.m+1,this.n)),this.U=function(xt){var ut=o(function Et(ft){if(ft.length==0)return 0;for(var yt=[],nt=0;nt0;)ut.push(0);return ut}(this.n),l=function(xt){for(var ut=[];xt-- >0;)ut.push(0);return ut}(this.m),u=!0,h=!0,f=Math.min(this.m-1,this.n),d=Math.max(0,Math.min(this.n-2,this.m)),p=0;p=0;M--)if(this.s[M]!==0){for(var B=M+1;B=0;j--){if(function(xt,ut){return xt&&ut}(j0;){var ue=void 0,Z=void 0;for(ue=L-2;ue>=-1&&ue!==-1;ue--)if(Math.abs(s[ue])<=se+J*(Math.abs(this.s[ue])+Math.abs(this.s[ue+1]))){s[ue]=0;break}if(ue===L-2)Z=4;else{var Se=void 0;for(Se=L-1;Se>=ue&&Se!==ue;Se--){var ce=(Se!==L?Math.abs(s[Se]):0)+(Se!==ue+1?Math.abs(s[Se-1]):0);if(Math.abs(this.s[Se])<=se+J*ce){this.s[Se]=0;break}}Se===ue?Z=3:Se===L-1?Z=1:(Z=2,ue=Se)}switch(ue++,Z){case 1:{var ae=s[L-2];s[L-2]=0;for(var Oe=L-2;Oe>=ue;Oe--){var ge=n.hypot(this.s[Oe],ae),ze=this.s[Oe]/ge,He=ae/ge;if(this.s[Oe]=ge,Oe!==ue&&(ae=-He*s[Oe-1],s[Oe-1]=ze*s[Oe-1]),h)for(var $e=0;$e=this.s[ue+1]);){var ot=this.s[ue];if(this.s[ue]=this.s[ue+1],this.s[ue+1]=ot,h&&ueMath.abs(a)?(s=a/i,s=Math.abs(i)*Math.sqrt(1+s*s)):a!=0?(s=i/a,s=Math.abs(a)*Math.sqrt(1+s*s)):s=0,s},t.exports=n},function(t,e,r){"use strict";var n=function(){function s(l,u){for(var h=0;h2&&arguments[2]!==void 0?arguments[2]:1,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,d=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=l,this.sequence2=u,this.match_score=h,this.mismatch_penalty=f,this.gap_penalty=d,this.iMax=l.length+1,this.jMax=u.length+1,this.grid=new Array(this.iMax);for(var p=0;p=0;l--){var u=this.listeners[l];u.event===a&&u.callback===s&&this.listeners.splice(l,1)}},i.emit=function(a,s){for(var l=0;l{"use strict";o(function(e,r){typeof k4=="object"&&typeof pF=="object"?pF.exports=r(dF()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof k4=="object"?k4.coseBase=r(dF()):e.coseBase=r(e.layoutBase)},"webpackUniversalModuleDefinition")(k4,function(t){return(()=>{"use strict";var e={45:(a,s,l)=>{var u={};u.layoutBase=l(551),u.CoSEConstants=l(806),u.CoSEEdge=l(767),u.CoSEGraph=l(880),u.CoSEGraphManager=l(578),u.CoSELayout=l(765),u.CoSENode=l(991),u.ConstraintHandler=l(902),a.exports=u},806:(a,s,l)=>{var u=l(551).FDLayoutConstants;function h(){}o(h,"CoSEConstants");for(var f in u)h[f]=u[f];h.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,h.DEFAULT_RADIAL_SEPARATION=u.DEFAULT_EDGE_LENGTH,h.DEFAULT_COMPONENT_SEPERATION=60,h.TILE=!0,h.TILING_PADDING_VERTICAL=10,h.TILING_PADDING_HORIZONTAL=10,h.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,h.ENFORCE_CONSTRAINTS=!0,h.APPLY_LAYOUT=!0,h.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,h.TREE_REDUCTION_ON_INCREMENTAL=!0,h.PURE_INCREMENTAL=h.DEFAULT_INCREMENTAL,a.exports=h},767:(a,s,l)=>{var u=l(551).FDLayoutEdge;function h(d,p,m){u.call(this,d,p,m)}o(h,"CoSEEdge"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h},880:(a,s,l)=>{var u=l(551).LGraph;function h(d,p,m){u.call(this,d,p,m)}o(h,"CoSEGraph"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h},578:(a,s,l)=>{var u=l(551).LGraphManager;function h(d){u.call(this,d)}o(h,"CoSEGraphManager"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h},765:(a,s,l)=>{var u=l(551).FDLayout,h=l(578),f=l(880),d=l(991),p=l(767),m=l(806),g=l(902),y=l(551).FDLayoutConstants,v=l(551).LayoutConstants,x=l(551).Point,b=l(551).PointD,w=l(551).DimensionD,C=l(551).Layout,T=l(551).Integer,E=l(551).IGeometry,A=l(551).LGraph,S=l(551).Transform,_=l(551).LinkedList;function I(){u.call(this),this.toBeTiled={},this.constraints={}}o(I,"CoSELayout"),I.prototype=Object.create(u.prototype);for(var D in u)I[D]=u[D];I.prototype.newGraphManager=function(){var k=new h(this);return this.graphManager=k,k},I.prototype.newGraph=function(k){return new f(null,this.graphManager,k)},I.prototype.newNode=function(k){return new d(this.graphManager,k)},I.prototype.newEdge=function(k){return new p(null,null,k)},I.prototype.initParameters=function(){u.prototype.initParameters.call(this,arguments),this.isSubLayout||(m.DEFAULT_EDGE_LENGTH<10?this.idealEdgeLength=10:this.idealEdgeLength=m.DEFAULT_EDGE_LENGTH,this.useSmartIdealEdgeLengthCalculation=m.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=y.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=y.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=y.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=y.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},I.prototype.initSpringEmbedder=function(){u.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/y.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},I.prototype.layout=function(){var k=v.DEFAULT_CREATE_BENDS_AS_NEEDED;return k&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},I.prototype.classicLayout=function(){if(this.nodesWithGravity=this.calculateNodesToApplyGravitationTo(),this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity),this.calcNoOfChildrenForAllNodes(),this.graphManager.calcLowestCommonAncestors(),this.graphManager.calcInclusionTreeDepths(),this.graphManager.getRoot().calcEstimatedSize(),this.calcIdealEdgeLengths(),this.incremental){if(m.TREE_REDUCTION_ON_INCREMENTAL){this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var L=new Set(this.getAllNodes()),R=this.nodesWithGravity.filter(function(B){return L.has(B)});this.graphManager.setAllNodesToApplyGravitation(R)}}else{var k=this.getFlatForest();if(k.length>0)this.positionNodesRadially(k);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var L=new Set(this.getAllNodes()),R=this.nodesWithGravity.filter(function(O){return L.has(O)});this.graphManager.setAllNodesToApplyGravitation(R),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(g.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),m.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},I.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%y.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var k=new Set(this.getAllNodes()),L=this.nodesWithGravity.filter(function(M){return k.has(M)});this.graphManager.setAllNodesToApplyGravitation(L),this.graphManager.updateBounds(),this.updateGrid(),m.PURE_INCREMENTAL?this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),m.PURE_INCREMENTAL?this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var R=!this.isTreeGrowing&&!this.isGrowthFinished,O=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(R,O),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},I.prototype.getPositionsData=function(){for(var k=this.graphManager.getAllNodes(),L={},R=0;R0&&this.updateDisplacements();for(var R=0;R0&&(O.fixedNodeWeight=B)}}if(this.constraints.relativePlacementConstraint){var F=new Map,P=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach(function(le){k.fixedNodesOnHorizontal.add(le),k.fixedNodesOnVertical.add(le)}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var z=this.constraints.alignmentConstraint.vertical,R=0;R=2*le.length/3;X--)he=Math.floor(Math.random()*(X+1)),K=le[X],le[X]=le[he],le[he]=K;return le},this.nodesInRelativeHorizontal=[],this.nodesInRelativeVertical=[],this.nodeToRelativeConstraintMapHorizontal=new Map,this.nodeToRelativeConstraintMapVertical=new Map,this.nodeToTempPositionMapHorizontal=new Map,this.nodeToTempPositionMapVertical=new Map,this.constraints.relativePlacementConstraint.forEach(function(le){if(le.left){var he=F.has(le.left)?F.get(le.left):le.left,K=F.has(le.right)?F.get(le.right):le.right;k.nodesInRelativeHorizontal.includes(he)||(k.nodesInRelativeHorizontal.push(he),k.nodeToRelativeConstraintMapHorizontal.set(he,[]),k.dummyToNodeForVerticalAlignment.has(he)?k.nodeToTempPositionMapHorizontal.set(he,k.idToNodeMap.get(k.dummyToNodeForVerticalAlignment.get(he)[0]).getCenterX()):k.nodeToTempPositionMapHorizontal.set(he,k.idToNodeMap.get(he).getCenterX())),k.nodesInRelativeHorizontal.includes(K)||(k.nodesInRelativeHorizontal.push(K),k.nodeToRelativeConstraintMapHorizontal.set(K,[]),k.dummyToNodeForVerticalAlignment.has(K)?k.nodeToTempPositionMapHorizontal.set(K,k.idToNodeMap.get(k.dummyToNodeForVerticalAlignment.get(K)[0]).getCenterX()):k.nodeToTempPositionMapHorizontal.set(K,k.idToNodeMap.get(K).getCenterX())),k.nodeToRelativeConstraintMapHorizontal.get(he).push({right:K,gap:le.gap}),k.nodeToRelativeConstraintMapHorizontal.get(K).push({left:he,gap:le.gap})}else{var X=P.has(le.top)?P.get(le.top):le.top,te=P.has(le.bottom)?P.get(le.bottom):le.bottom;k.nodesInRelativeVertical.includes(X)||(k.nodesInRelativeVertical.push(X),k.nodeToRelativeConstraintMapVertical.set(X,[]),k.dummyToNodeForHorizontalAlignment.has(X)?k.nodeToTempPositionMapVertical.set(X,k.idToNodeMap.get(k.dummyToNodeForHorizontalAlignment.get(X)[0]).getCenterY()):k.nodeToTempPositionMapVertical.set(X,k.idToNodeMap.get(X).getCenterY())),k.nodesInRelativeVertical.includes(te)||(k.nodesInRelativeVertical.push(te),k.nodeToRelativeConstraintMapVertical.set(te,[]),k.dummyToNodeForHorizontalAlignment.has(te)?k.nodeToTempPositionMapVertical.set(te,k.idToNodeMap.get(k.dummyToNodeForHorizontalAlignment.get(te)[0]).getCenterY()):k.nodeToTempPositionMapVertical.set(te,k.idToNodeMap.get(te).getCenterY())),k.nodeToRelativeConstraintMapVertical.get(X).push({bottom:te,gap:le.gap}),k.nodeToRelativeConstraintMapVertical.get(te).push({top:X,gap:le.gap})}});else{var H=new Map,Q=new Map;this.constraints.relativePlacementConstraint.forEach(function(le){if(le.left){var he=F.has(le.left)?F.get(le.left):le.left,K=F.has(le.right)?F.get(le.right):le.right;H.has(he)?H.get(he).push(K):H.set(he,[K]),H.has(K)?H.get(K).push(he):H.set(K,[he])}else{var X=P.has(le.top)?P.get(le.top):le.top,te=P.has(le.bottom)?P.get(le.bottom):le.bottom;Q.has(X)?Q.get(X).push(te):Q.set(X,[te]),Q.has(te)?Q.get(te).push(X):Q.set(te,[X])}});var j=o(function(he,K){var X=[],te=[],J=new _,se=new Set,ue=0;return he.forEach(function(Z,Se){if(!se.has(Se)){X[ue]=[],te[ue]=!1;var ce=Se;for(J.push(ce),se.add(ce),X[ue].push(ce);J.length!=0;){ce=J.shift(),K.has(ce)&&(te[ue]=!0);var ae=he.get(ce);ae.forEach(function(Oe){se.has(Oe)||(J.push(Oe),se.add(Oe),X[ue].push(Oe))})}ue++}}),{components:X,isFixed:te}},"constructComponents"),ie=j(H,k.fixedNodesOnHorizontal);this.componentsOnHorizontal=ie.components,this.fixedComponentsOnHorizontal=ie.isFixed;var ne=j(Q,k.fixedNodesOnVertical);this.componentsOnVertical=ne.components,this.fixedComponentsOnVertical=ne.isFixed}}},I.prototype.updateDisplacements=function(){var k=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach(function(ne){var le=k.idToNodeMap.get(ne.nodeId);le.displacementX=0,le.displacementY=0}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var L=this.constraints.alignmentConstraint.vertical,R=0;R1){var P;for(P=0;PO&&(O=Math.floor(F.y)),B=Math.floor(F.x+m.DEFAULT_COMPONENT_SEPERATION)}this.transform(new b(v.WORLD_CENTER_X-F.x/2,v.WORLD_CENTER_Y-F.y/2))},I.radialLayout=function(k,L,R){var O=Math.max(this.maxDiagonalInTree(k),m.DEFAULT_RADIAL_SEPARATION);I.branchRadialLayout(L,null,0,359,0,O);var M=A.calculateBounds(k),B=new S;B.setDeviceOrgX(M.getMinX()),B.setDeviceOrgY(M.getMinY()),B.setWorldOrgX(R.x),B.setWorldOrgY(R.y);for(var F=0;F1;){var X=K[0];K.splice(0,1);var te=j.indexOf(X);te>=0&&j.splice(te,1),le--,ie--}L!=null?he=(j.indexOf(K[0])+1)%le:he=0;for(var J=Math.abs(O-R)/ie,se=he;ne!=ie;se=++se%le){var ue=j[se].getOtherEnd(k);if(ue!=L){var Z=(R+ne*J)%360,Se=(Z+J)%360;I.branchRadialLayout(ue,k,Z,Se,M+B,B),ne++}}},I.maxDiagonalInTree=function(k){for(var L=T.MIN_VALUE,R=0;RL&&(L=M)}return L},I.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},I.prototype.groupZeroDegreeMembers=function(){var k=this,L={};this.memberGroups={},this.idToDummyNode={};for(var R=[],O=this.graphManager.getAllNodes(),M=0;M"u"&&(L[P]=[]),L[P]=L[P].concat(B)}Object.keys(L).forEach(function(z){if(L[z].length>1){var $="DummyCompound_"+z;k.memberGroups[$]=L[z];var H=L[z][0].getParent(),Q=new d(k.graphManager);Q.id=$,Q.paddingLeft=H.paddingLeft||0,Q.paddingRight=H.paddingRight||0,Q.paddingBottom=H.paddingBottom||0,Q.paddingTop=H.paddingTop||0,k.idToDummyNode[$]=Q;var j=k.getGraphManager().add(k.newGraph(),Q),ie=H.getChild();ie.add(Q);for(var ne=0;neM?(O.rect.x-=(O.labelWidth-M)/2,O.setWidth(O.labelWidth),O.labelMarginLeft=(O.labelWidth-M)/2):O.labelPosHorizontal=="right"&&O.setWidth(M+O.labelWidth)),O.labelHeight&&(O.labelPosVertical=="top"?(O.rect.y-=O.labelHeight,O.setHeight(B+O.labelHeight),O.labelMarginTop=O.labelHeight):O.labelPosVertical=="center"&&O.labelHeight>B?(O.rect.y-=(O.labelHeight-B)/2,O.setHeight(O.labelHeight),O.labelMarginTop=(O.labelHeight-B)/2):O.labelPosVertical=="bottom"&&O.setHeight(B+O.labelHeight))}})},I.prototype.repopulateCompounds=function(){for(var k=this.compoundOrder.length-1;k>=0;k--){var L=this.compoundOrder[k],R=L.id,O=L.paddingLeft,M=L.paddingTop,B=L.labelMarginLeft,F=L.labelMarginTop;this.adjustLocations(this.tiledMemberPack[R],L.rect.x,L.rect.y,O,M,B,F)}},I.prototype.repopulateZeroDegreeMembers=function(){var k=this,L=this.tiledZeroDegreePack;Object.keys(L).forEach(function(R){var O=k.idToDummyNode[R],M=O.paddingLeft,B=O.paddingTop,F=O.labelMarginLeft,P=O.labelMarginTop;k.adjustLocations(L[R],O.rect.x,O.rect.y,M,B,F,P)})},I.prototype.getToBeTiled=function(k){var L=k.id;if(this.toBeTiled[L]!=null)return this.toBeTiled[L];var R=k.getChild();if(R==null)return this.toBeTiled[L]=!1,!1;for(var O=R.getNodes(),M=0;M0)return this.toBeTiled[L]=!1,!1;if(B.getChild()==null){this.toBeTiled[B.id]=!1;continue}if(!this.getToBeTiled(B))return this.toBeTiled[L]=!1,!1}return this.toBeTiled[L]=!0,!0},I.prototype.getNodeDegree=function(k){for(var L=k.id,R=k.getEdges(),O=0,M=0;MH&&(H=j.rect.height)}R+=H+k.verticalPadding}},I.prototype.tileCompoundMembers=function(k,L){var R=this;this.tiledMemberPack=[],Object.keys(k).forEach(function(O){var M=L[O];if(R.tiledMemberPack[O]=R.tileNodes(k[O],M.paddingLeft+M.paddingRight),M.rect.width=R.tiledMemberPack[O].width,M.rect.height=R.tiledMemberPack[O].height,M.setCenter(R.tiledMemberPack[O].centerX,R.tiledMemberPack[O].centerY),M.labelMarginLeft=0,M.labelMarginTop=0,m.NODE_DIMENSIONS_INCLUDE_LABELS){var B=M.rect.width,F=M.rect.height;M.labelWidth&&(M.labelPosHorizontal=="left"?(M.rect.x-=M.labelWidth,M.setWidth(B+M.labelWidth),M.labelMarginLeft=M.labelWidth):M.labelPosHorizontal=="center"&&M.labelWidth>B?(M.rect.x-=(M.labelWidth-B)/2,M.setWidth(M.labelWidth),M.labelMarginLeft=(M.labelWidth-B)/2):M.labelPosHorizontal=="right"&&M.setWidth(B+M.labelWidth)),M.labelHeight&&(M.labelPosVertical=="top"?(M.rect.y-=M.labelHeight,M.setHeight(F+M.labelHeight),M.labelMarginTop=M.labelHeight):M.labelPosVertical=="center"&&M.labelHeight>F?(M.rect.y-=(M.labelHeight-F)/2,M.setHeight(M.labelHeight),M.labelMarginTop=(M.labelHeight-F)/2):M.labelPosVertical=="bottom"&&M.setHeight(F+M.labelHeight))}})},I.prototype.tileNodes=function(k,L){var R=this.tileNodesByFavoringDim(k,L,!0),O=this.tileNodesByFavoringDim(k,L,!1),M=this.getOrgRatio(R),B=this.getOrgRatio(O),F;return BP&&(P=ne.getWidth())});var z=B/M,$=F/M,H=Math.pow(R-O,2)+4*(z+O)*($+R)*M,Q=(O-R+Math.sqrt(H))/(2*(z+O)),j;L?(j=Math.ceil(Q),j==Q&&j++):j=Math.floor(Q);var ie=j*(z+O)-O;return P>ie&&(ie=P),ie+=O*2,ie},I.prototype.tileNodesByFavoringDim=function(k,L,R){var O=m.TILING_PADDING_VERTICAL,M=m.TILING_PADDING_HORIZONTAL,B=m.TILING_COMPARE_BY,F={rows:[],rowWidth:[],rowHeight:[],width:0,height:L,verticalPadding:O,horizontalPadding:M,centerX:0,centerY:0};B&&(F.idealRowWidth=this.calcIdealRowWidth(k,R));var P=o(function(le){return le.rect.width*le.rect.height},"getNodeArea"),z=o(function(le,he){return P(he)-P(le)},"areaCompareFcn");k.sort(function(ne,le){var he=z;return F.idealRowWidth?(he=B,he(ne.id,le.id)):he(ne,le)});for(var $=0,H=0,Q=0;Q0&&(F+=k.horizontalPadding),k.rowWidth[R]=F,k.width0&&(P+=k.verticalPadding);var z=0;P>k.rowHeight[R]&&(z=k.rowHeight[R],k.rowHeight[R]=P,z=k.rowHeight[R]-z),k.height+=z,k.rows[R].push(L)},I.prototype.getShortestRowIndex=function(k){for(var L=-1,R=Number.MAX_VALUE,O=0;OR&&(L=O,R=k.rowWidth[O]);return L},I.prototype.canAddHorizontal=function(k,L,R){if(k.idealRowWidth){var O=k.rows.length-1,M=k.rowWidth[O];return M+L+k.horizontalPadding<=k.idealRowWidth}var B=this.getShortestRowIndex(k);if(B<0)return!0;var F=k.rowWidth[B];if(F+k.horizontalPadding+L<=k.width)return!0;var P=0;k.rowHeight[B]0&&(P=R+k.verticalPadding-k.rowHeight[B]);var z;k.width-F>=L+k.horizontalPadding?z=(k.height+P)/(F+L+k.horizontalPadding):z=(k.height+P)/k.width,P=R+k.verticalPadding;var $;return k.widthB&&L!=R){O.splice(-1,1),k.rows[R].push(M),k.rowWidth[L]=k.rowWidth[L]-B,k.rowWidth[R]=k.rowWidth[R]+B,k.width=k.rowWidth[instance.getLongestRowIndex(k)];for(var F=Number.MIN_VALUE,P=0;PF&&(F=O[P].height);L>0&&(F+=k.verticalPadding);var z=k.rowHeight[L]+k.rowHeight[R];k.rowHeight[L]=F,k.rowHeight[R]0)for(var ie=M;ie<=B;ie++)j[0]+=this.grid[ie][F-1].length+this.grid[ie][F].length-1;if(B0)for(var ie=F;ie<=P;ie++)j[3]+=this.grid[M-1][ie].length+this.grid[M][ie].length-1;for(var ne=T.MAX_VALUE,le,he,K=0;K{var u=l(551).FDLayoutNode,h=l(551).IMath;function f(p,m,g,y){u.call(this,p,m,g,y)}o(f,"CoSENode"),f.prototype=Object.create(u.prototype);for(var d in u)f[d]=u[d];f.prototype.calculateDisplacement=function(){var p=this.graphManager.getLayout();this.getChild()!=null&&this.fixedNodeWeight?(this.displacementX+=p.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=p.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=p.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=p.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>p.coolingFactor*p.maxNodeDisplacement&&(this.displacementX=p.coolingFactor*p.maxNodeDisplacement*h.sign(this.displacementX)),Math.abs(this.displacementY)>p.coolingFactor*p.maxNodeDisplacement&&(this.displacementY=p.coolingFactor*p.maxNodeDisplacement*h.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},f.prototype.propogateDisplacementToChildren=function(p,m){for(var g=this.getChild().getNodes(),y,v=0;v{function u(g){if(Array.isArray(g)){for(var y=0,v=Array(g.length);y0){var ct=0;Ue.forEach(function(ot){xe=="horizontal"?(we.set(ot,x.has(ot)?b[x.get(ot)]:pe.get(ot)),ct+=we.get(ot)):(we.set(ot,x.has(ot)?w[x.get(ot)]:pe.get(ot)),ct+=we.get(ot))}),ct=ct/Ue.length,st.forEach(function(ot){q.has(ot)||we.set(ot,ct)})}else{var We=0;st.forEach(function(ot){xe=="horizontal"?We+=x.has(ot)?b[x.get(ot)]:pe.get(ot):We+=x.has(ot)?w[x.get(ot)]:pe.get(ot)}),We=We/st.length,st.forEach(function(ot){we.set(ot,We)})}});for(var qe=o(function(){var Ue=De.shift(),ct=V.get(Ue);ct.forEach(function(We){if(we.get(We.id)ot&&(ot=yt),ntYt&&(Yt=nt)}}catch(At){Mt=!0,xt=At}finally{try{!bt&&ut.return&&ut.return()}finally{if(Mt)throw xt}}var dn=(ct+ot)/2-(We+Yt)/2,Tt=!0,On=!1,tn=void 0;try{for(var _r=st[Symbol.iterator](),Dr;!(Tt=(Dr=_r.next()).done);Tt=!0){var Pn=Dr.value;we.set(Pn,we.get(Pn)+dn)}}catch(At){On=!0,tn=At}finally{try{!Tt&&_r.return&&_r.return()}finally{if(On)throw tn}}})}return we},"findAppropriatePositionForRelativePlacement"),D=o(function(V){var xe=0,q=0,pe=0,ve=0;if(V.forEach(function(Ve){Ve.left?b[x.get(Ve.left)]-b[x.get(Ve.right)]>=0?xe++:q++:w[x.get(Ve.top)]-w[x.get(Ve.bottom)]>=0?pe++:ve++}),xe>q&&pe>ve)for(var Pe=0;Peq)for(var _e=0;_eve)for(var we=0;we1)y.fixedNodeConstraint.forEach(function(oe,V){O[V]=[oe.position.x,oe.position.y],M[V]=[b[x.get(oe.nodeId)],w[x.get(oe.nodeId)]]}),B=!0;else if(y.alignmentConstraint)(function(){var oe=0;if(y.alignmentConstraint.vertical){for(var V=y.alignmentConstraint.vertical,xe=o(function(we){var Ve=new Set;V[we].forEach(function(at){Ve.add(at)});var De=new Set([].concat(u(Ve)).filter(function(at){return P.has(at)})),qe=void 0;De.size>0?qe=b[x.get(De.values().next().value)]:qe=_(Ve).x,V[we].forEach(function(at){O[oe]=[qe,w[x.get(at)]],M[oe]=[b[x.get(at)],w[x.get(at)]],oe++})},"_loop2"),q=0;q0?qe=b[x.get(De.values().next().value)]:qe=_(Ve).y,pe[we].forEach(function(at){O[oe]=[b[x.get(at)],qe],M[oe]=[b[x.get(at)],w[x.get(at)]],oe++})},"_loop3"),Pe=0;PeQ&&(Q=H[ie].length,j=ie);if(Q<$.size/2)D(y.relativePlacementConstraint),B=!1,F=!1;else{var ne=new Map,le=new Map,he=[];H[j].forEach(function(oe){z.get(oe).forEach(function(V){V.direction=="horizontal"?(ne.has(oe)?ne.get(oe).push(V):ne.set(oe,[V]),ne.has(V.id)||ne.set(V.id,[]),he.push({left:oe,right:V.id})):(le.has(oe)?le.get(oe).push(V):le.set(oe,[V]),le.has(V.id)||le.set(V.id,[]),he.push({top:oe,bottom:V.id}))})}),D(he),F=!1;var K=I(ne,"horizontal"),X=I(le,"vertical");H[j].forEach(function(oe,V){M[V]=[b[x.get(oe)],w[x.get(oe)]],O[V]=[],K.has(oe)?O[V][0]=K.get(oe):O[V][0]=b[x.get(oe)],X.has(oe)?O[V][1]=X.get(oe):O[V][1]=w[x.get(oe)]}),B=!0}}if(B){for(var te=void 0,J=d.transpose(O),se=d.transpose(M),ue=0;ue0){var ze={x:0,y:0};y.fixedNodeConstraint.forEach(function(oe,V){var xe={x:b[x.get(oe.nodeId)],y:w[x.get(oe.nodeId)]},q=oe.position,pe=S(q,xe);ze.x+=pe.x,ze.y+=pe.y}),ze.x/=y.fixedNodeConstraint.length,ze.y/=y.fixedNodeConstraint.length,b.forEach(function(oe,V){b[V]+=ze.x}),w.forEach(function(oe,V){w[V]+=ze.y}),y.fixedNodeConstraint.forEach(function(oe){b[x.get(oe.nodeId)]=oe.position.x,w[x.get(oe.nodeId)]=oe.position.y})}if(y.alignmentConstraint){if(y.alignmentConstraint.vertical)for(var He=y.alignmentConstraint.vertical,$e=o(function(V){var xe=new Set;He[V].forEach(function(ve){xe.add(ve)});var q=new Set([].concat(u(xe)).filter(function(ve){return P.has(ve)})),pe=void 0;q.size>0?pe=b[x.get(q.values().next().value)]:pe=_(xe).x,xe.forEach(function(ve){P.has(ve)||(b[x.get(ve)]=pe)})},"_loop4"),Re=0;Re0?pe=w[x.get(q.values().next().value)]:pe=_(xe).y,xe.forEach(function(ve){P.has(ve)||(w[x.get(ve)]=pe)})},"_loop5"),W=0;W{a.exports=t}},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var l=r[a]={exports:{}};return e[a](l,l.exports,n),l.exports}o(n,"__webpack_require__");var i=n(45);return i})()})});var Pve=Mi((E4,gF)=>{"use strict";o(function(e,r){typeof E4=="object"&&typeof gF=="object"?gF.exports=r(mF()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof E4=="object"?E4.cytoscapeFcose=r(mF()):e.cytoscapeFcose=r(e.coseBase)},"webpackUniversalModuleDefinition")(E4,function(t){return(()=>{"use strict";var e={658:a=>{a.exports=Object.assign!=null?Object.assign.bind(Object):function(s){for(var l=arguments.length,u=Array(l>1?l-1:0),h=1;h{var u=function(){function d(p,m){var g=[],y=!0,v=!1,x=void 0;try{for(var b=p[Symbol.iterator](),w;!(y=(w=b.next()).done)&&(g.push(w.value),!(m&&g.length===m));y=!0);}catch(C){v=!0,x=C}finally{try{!y&&b.return&&b.return()}finally{if(v)throw x}}return g}return o(d,"sliceIterator"),function(p,m){if(Array.isArray(p))return p;if(Symbol.iterator in Object(p))return d(p,m);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),h=l(140).layoutBase.LinkedList,f={};f.getTopMostNodes=function(d){for(var p={},m=0;m0&&B.merge($)});for(var F=0;F1){w=x[0],C=w.connectedEdges().length,x.forEach(function(M){M.connectedEdges().length0&&g.set("dummy"+(g.size+1),A),S},f.relocateComponent=function(d,p,m){if(!m.fixedNodeConstraint){var g=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY,v=Number.POSITIVE_INFINITY,x=Number.NEGATIVE_INFINITY;if(m.quality=="draft"){var b=!0,w=!1,C=void 0;try{for(var T=p.nodeIndexes[Symbol.iterator](),E;!(b=(E=T.next()).done);b=!0){var A=E.value,S=u(A,2),_=S[0],I=S[1],D=m.cy.getElementById(_);if(D){var k=D.boundingBox(),L=p.xCoords[I]-k.w/2,R=p.xCoords[I]+k.w/2,O=p.yCoords[I]-k.h/2,M=p.yCoords[I]+k.h/2;Ly&&(y=R),Ox&&(x=M)}}}catch($){w=!0,C=$}finally{try{!b&&T.return&&T.return()}finally{if(w)throw C}}var B=d.x-(y+g)/2,F=d.y-(x+v)/2;p.xCoords=p.xCoords.map(function($){return $+B}),p.yCoords=p.yCoords.map(function($){return $+F})}else{Object.keys(p).forEach(function($){var H=p[$],Q=H.getRect().x,j=H.getRect().x+H.getRect().width,ie=H.getRect().y,ne=H.getRect().y+H.getRect().height;Qy&&(y=j),iex&&(x=ne)});var P=d.x-(y+g)/2,z=d.y-(x+v)/2;Object.keys(p).forEach(function($){var H=p[$];H.setCenter(H.getCenterX()+P,H.getCenterY()+z)})}}},f.calcBoundingBox=function(d,p,m,g){for(var y=Number.MAX_SAFE_INTEGER,v=Number.MIN_SAFE_INTEGER,x=Number.MAX_SAFE_INTEGER,b=Number.MIN_SAFE_INTEGER,w=void 0,C=void 0,T=void 0,E=void 0,A=d.descendants().not(":parent"),S=A.length,_=0;_w&&(y=w),vT&&(x=T),b{var u=l(548),h=l(140).CoSELayout,f=l(140).CoSENode,d=l(140).layoutBase.PointD,p=l(140).layoutBase.DimensionD,m=l(140).layoutBase.LayoutConstants,g=l(140).layoutBase.FDLayoutConstants,y=l(140).CoSEConstants,v=o(function(b,w){var C=b.cy,T=b.eles,E=T.nodes(),A=T.edges(),S=void 0,_=void 0,I=void 0,D={};b.randomize&&(S=w.nodeIndexes,_=w.xCoords,I=w.yCoords);var k=o(function($){return typeof $=="function"},"isFn"),L=o(function($,H){return k($)?$(H):$},"optFn"),R=u.calcParentsWithoutChildren(C,T),O=o(function z($,H,Q,j){for(var ie=H.length,ne=0;ne0){var J=void 0;J=Q.getGraphManager().add(Q.newGraph(),K),z(J,he,Q,j)}}},"processChildrenList"),M=o(function($,H,Q){for(var j=0,ie=0,ne=0;ne0?y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=j/ie:k(b.idealEdgeLength)?y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=50:y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=b.idealEdgeLength,y.MIN_REPULSION_DIST=g.MIN_REPULSION_DIST=g.DEFAULT_EDGE_LENGTH/10,y.DEFAULT_RADIAL_SEPARATION=g.DEFAULT_EDGE_LENGTH)},"processEdges"),B=o(function($,H){H.fixedNodeConstraint&&($.constraints.fixedNodeConstraint=H.fixedNodeConstraint),H.alignmentConstraint&&($.constraints.alignmentConstraint=H.alignmentConstraint),H.relativePlacementConstraint&&($.constraints.relativePlacementConstraint=H.relativePlacementConstraint)},"processConstraints");b.nestingFactor!=null&&(y.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=g.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=b.nestingFactor),b.gravity!=null&&(y.DEFAULT_GRAVITY_STRENGTH=g.DEFAULT_GRAVITY_STRENGTH=b.gravity),b.numIter!=null&&(y.MAX_ITERATIONS=g.MAX_ITERATIONS=b.numIter),b.gravityRange!=null&&(y.DEFAULT_GRAVITY_RANGE_FACTOR=g.DEFAULT_GRAVITY_RANGE_FACTOR=b.gravityRange),b.gravityCompound!=null&&(y.DEFAULT_COMPOUND_GRAVITY_STRENGTH=g.DEFAULT_COMPOUND_GRAVITY_STRENGTH=b.gravityCompound),b.gravityRangeCompound!=null&&(y.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=g.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=b.gravityRangeCompound),b.initialEnergyOnIncremental!=null&&(y.DEFAULT_COOLING_FACTOR_INCREMENTAL=g.DEFAULT_COOLING_FACTOR_INCREMENTAL=b.initialEnergyOnIncremental),b.tilingCompareBy!=null&&(y.TILING_COMPARE_BY=b.tilingCompareBy),b.quality=="proof"?m.QUALITY=2:m.QUALITY=0,y.NODE_DIMENSIONS_INCLUDE_LABELS=g.NODE_DIMENSIONS_INCLUDE_LABELS=m.NODE_DIMENSIONS_INCLUDE_LABELS=b.nodeDimensionsIncludeLabels,y.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=m.DEFAULT_INCREMENTAL=!b.randomize,y.ANIMATE=g.ANIMATE=m.ANIMATE=b.animate,y.TILE=b.tile,y.TILING_PADDING_VERTICAL=typeof b.tilingPaddingVertical=="function"?b.tilingPaddingVertical.call():b.tilingPaddingVertical,y.TILING_PADDING_HORIZONTAL=typeof b.tilingPaddingHorizontal=="function"?b.tilingPaddingHorizontal.call():b.tilingPaddingHorizontal,y.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=m.DEFAULT_INCREMENTAL=!0,y.PURE_INCREMENTAL=!b.randomize,m.DEFAULT_UNIFORM_LEAF_NODE_SIZES=b.uniformNodeDimensions,b.step=="transformed"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,y.ENFORCE_CONSTRAINTS=!1,y.APPLY_LAYOUT=!1),b.step=="enforced"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!0,y.APPLY_LAYOUT=!1),b.step=="cose"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!1,y.APPLY_LAYOUT=!0),b.step=="all"&&(b.randomize?y.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!0,y.APPLY_LAYOUT=!0),b.fixedNodeConstraint||b.alignmentConstraint||b.relativePlacementConstraint?y.TREE_REDUCTION_ON_INCREMENTAL=!1:y.TREE_REDUCTION_ON_INCREMENTAL=!0;var F=new h,P=F.newGraphManager();return O(P.addRoot(),u.getTopMostNodes(E),F,b),M(F,P,A),B(F,b),F.runLayout(),D},"coseLayout");a.exports={coseLayout:v}},212:(a,s,l)=>{var u=function(){function b(w,C){for(var T=0;T0)if(M){var P=d.getTopMostNodes(T.eles.nodes());if(k=d.connectComponents(E,T.eles,P),k.forEach(function(ce){var ae=ce.boundingBox();L.push({x:ae.x1+ae.w/2,y:ae.y1+ae.h/2})}),T.randomize&&k.forEach(function(ce){T.eles=ce,S.push(m(T))}),T.quality=="default"||T.quality=="proof"){var z=E.collection();if(T.tile){var $=new Map,H=[],Q=[],j=0,ie={nodeIndexes:$,xCoords:H,yCoords:Q},ne=[];if(k.forEach(function(ce,ae){ce.edges().length==0&&(ce.nodes().forEach(function(Oe,ge){z.merge(ce.nodes()[ge]),Oe.isParent()||(ie.nodeIndexes.set(ce.nodes()[ge].id(),j++),ie.xCoords.push(ce.nodes()[0].position().x),ie.yCoords.push(ce.nodes()[0].position().y))}),ne.push(ae))}),z.length>1){var le=z.boundingBox();L.push({x:le.x1+le.w/2,y:le.y1+le.h/2}),k.push(z),S.push(ie);for(var he=ne.length-1;he>=0;he--)k.splice(ne[he],1),S.splice(ne[he],1),L.splice(ne[he],1)}}k.forEach(function(ce,ae){T.eles=ce,D.push(y(T,S[ae])),d.relocateComponent(L[ae],D[ae],T)})}else k.forEach(function(ce,ae){d.relocateComponent(L[ae],S[ae],T)});var K=new Set;if(k.length>1){var X=[],te=A.filter(function(ce){return ce.css("display")=="none"});k.forEach(function(ce,ae){var Oe=void 0;if(T.quality=="draft"&&(Oe=S[ae].nodeIndexes),ce.nodes().not(te).length>0){var ge={};ge.edges=[],ge.nodes=[];var ze=void 0;ce.nodes().not(te).forEach(function(He){if(T.quality=="draft")if(!He.isParent())ze=Oe.get(He.id()),ge.nodes.push({x:S[ae].xCoords[ze]-He.boundingbox().w/2,y:S[ae].yCoords[ze]-He.boundingbox().h/2,width:He.boundingbox().w,height:He.boundingbox().h});else{var $e=d.calcBoundingBox(He,S[ae].xCoords,S[ae].yCoords,Oe);ge.nodes.push({x:$e.topLeftX,y:$e.topLeftY,width:$e.width,height:$e.height})}else D[ae][He.id()]&&ge.nodes.push({x:D[ae][He.id()].getLeft(),y:D[ae][He.id()].getTop(),width:D[ae][He.id()].getWidth(),height:D[ae][He.id()].getHeight()})}),ce.edges().forEach(function(He){var $e=He.source(),Re=He.target();if($e.css("display")!="none"&&Re.css("display")!="none")if(T.quality=="draft"){var Ie=Oe.get($e.id()),be=Oe.get(Re.id()),W=[],de=[];if($e.isParent()){var re=d.calcBoundingBox($e,S[ae].xCoords,S[ae].yCoords,Oe);W.push(re.topLeftX+re.width/2),W.push(re.topLeftY+re.height/2)}else W.push(S[ae].xCoords[Ie]),W.push(S[ae].yCoords[Ie]);if(Re.isParent()){var oe=d.calcBoundingBox(Re,S[ae].xCoords,S[ae].yCoords,Oe);de.push(oe.topLeftX+oe.width/2),de.push(oe.topLeftY+oe.height/2)}else de.push(S[ae].xCoords[be]),de.push(S[ae].yCoords[be]);ge.edges.push({startX:W[0],startY:W[1],endX:de[0],endY:de[1]})}else D[ae][$e.id()]&&D[ae][Re.id()]&&ge.edges.push({startX:D[ae][$e.id()].getCenterX(),startY:D[ae][$e.id()].getCenterY(),endX:D[ae][Re.id()].getCenterX(),endY:D[ae][Re.id()].getCenterY()})}),ge.nodes.length>0&&(X.push(ge),K.add(ae))}});var J=O.packComponents(X,T.randomize).shifts;if(T.quality=="draft")S.forEach(function(ce,ae){var Oe=ce.xCoords.map(function(ze){return ze+J[ae].dx}),ge=ce.yCoords.map(function(ze){return ze+J[ae].dy});ce.xCoords=Oe,ce.yCoords=ge});else{var se=0;K.forEach(function(ce){Object.keys(D[ce]).forEach(function(ae){var Oe=D[ce][ae];Oe.setCenter(Oe.getCenterX()+J[se].dx,Oe.getCenterY()+J[se].dy)}),se++})}}}else{var B=T.eles.boundingBox();if(L.push({x:B.x1+B.w/2,y:B.y1+B.h/2}),T.randomize){var F=m(T);S.push(F)}T.quality=="default"||T.quality=="proof"?(D.push(y(T,S[0])),d.relocateComponent(L[0],D[0],T)):d.relocateComponent(L[0],S[0],T)}var ue=o(function(ae,Oe){if(T.quality=="default"||T.quality=="proof"){typeof ae=="number"&&(ae=Oe);var ge=void 0,ze=void 0,He=ae.data("id");return D.forEach(function(Re){He in Re&&(ge={x:Re[He].getRect().getCenterX(),y:Re[He].getRect().getCenterY()},ze=Re[He])}),T.nodeDimensionsIncludeLabels&&(ze.labelWidth&&(ze.labelPosHorizontal=="left"?ge.x+=ze.labelWidth/2:ze.labelPosHorizontal=="right"&&(ge.x-=ze.labelWidth/2)),ze.labelHeight&&(ze.labelPosVertical=="top"?ge.y+=ze.labelHeight/2:ze.labelPosVertical=="bottom"&&(ge.y-=ze.labelHeight/2))),ge==null&&(ge={x:ae.position("x"),y:ae.position("y")}),{x:ge.x,y:ge.y}}else{var $e=void 0;return S.forEach(function(Re){var Ie=Re.nodeIndexes.get(ae.id());Ie!=null&&($e={x:Re.xCoords[Ie],y:Re.yCoords[Ie]})}),$e==null&&($e={x:ae.position("x"),y:ae.position("y")}),{x:$e.x,y:$e.y}}},"getPositions");if(T.quality=="default"||T.quality=="proof"||T.randomize){var Z=d.calcParentsWithoutChildren(E,A),Se=A.filter(function(ce){return ce.css("display")=="none"});T.eles=A.not(Se),A.nodes().not(":parent").not(Se).layoutPositions(C,T,ue),Z.length>0&&Z.forEach(function(ce){ce.position(ue(ce))})}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")},"run")}]),b}();a.exports=x},657:(a,s,l)=>{var u=l(548),h=l(140).layoutBase.Matrix,f=l(140).layoutBase.SVD,d=o(function(m){var g=m.cy,y=m.eles,v=y.nodes(),x=y.nodes(":parent"),b=new Map,w=new Map,C=new Map,T=[],E=[],A=[],S=[],_=[],I=[],D=[],k=[],L=void 0,R=void 0,O=1e8,M=1e-9,B=m.piTol,F=m.samplingType,P=m.nodeSeparation,z=void 0,$=o(function(){for(var xe=0,q=0,pe=!1;q=Pe;){we=ve[Pe++];for(var st=T[we],Ue=0;Ueqe&&(qe=_[We],at=We)}return at},"BFS"),Q=o(function(xe){var q=void 0;if(xe){q=Math.floor(Math.random()*R),L=q;for(var ve=0;ve=1)break;qe=De}for(var st=0;st=1)break;qe=De}for(var ct=0;ct0&&(q.isParent()?T[xe].push(C.get(q.id())):T[xe].push(q.id()))})});var Z=o(function(xe){var q=w.get(xe),pe=void 0;b.get(xe).forEach(function(ve){g.getElementById(ve).isParent()?pe=C.get(ve):pe=ve,T[q].push(pe),T[w.get(pe)].push(xe)})},"_loop"),Se=!0,ce=!1,ae=void 0;try{for(var Oe=b.keys()[Symbol.iterator](),ge;!(Se=(ge=Oe.next()).done);Se=!0){var ze=ge.value;Z(ze)}}catch(V){ce=!0,ae=V}finally{try{!Se&&Oe.return&&Oe.return()}finally{if(ce)throw ae}}R=w.size;var He=void 0;if(R>2){z=R{var u=l(212),h=o(function(d){d&&d("layout","fcose",u)},"register");typeof cytoscape<"u"&&h(cytoscape),a.exports=h},140:a=>{a.exports=t}},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var l=r[a]={exports:{}};return e[a](l,l.exports,n),l.exports}o(n,"__webpack_require__");var i=n(579);return i})()})});var dy,Zp,yF=N(()=>{"use strict";tu();dy=o(t=>`${t}`,"wrapIcon"),Zp={prefix:"mermaid-architecture",height:80,width:80,icons:{database:{body:dy('')},server:{body:dy('')},disk:{body:dy('')},internet:{body:dy('')},cloud:{body:dy('')},unknown:OC,blank:{body:dy("")}}}});var Bve,Fve,$ve,zve,Gve=N(()=>{"use strict";tu();zt();to();w4();yF();oC();Bve=o(async function(t,e){let r=Li("padding"),n=Li("iconSize"),i=n/2,a=n/6,s=a/2;await Promise.all(e.edges().map(async l=>{let{source:u,sourceDir:h,sourceArrow:f,sourceGroup:d,target:p,targetDir:m,targetArrow:g,targetGroup:y,label:v}=sC(l),{x,y:b}=l[0].sourceEndpoint(),{x:w,y:C}=l[0].midpoint(),{x:T,y:E}=l[0].targetEndpoint(),A=r+4;if(d&&(Ha(h)?x+=h==="L"?-A:A:b+=h==="T"?-A:A+18),y&&(Ha(m)?T+=m==="L"?-A:A:E+=m==="T"?-A:A+18),!d&&Qp.getNode(u)?.type==="junction"&&(Ha(h)?x+=h==="L"?i:-i:b+=h==="T"?i:-i),!y&&Qp.getNode(p)?.type==="junction"&&(Ha(m)?T+=m==="L"?i:-i:E+=m==="T"?i:-i),l[0]._private.rscratch){let S=t.insert("g");if(S.insert("path").attr("d",`M ${x},${b} L ${w},${C} L${T},${E} `).attr("class","edge"),f){let _=Ha(h)?v4[h](x,a):x-s,I=Zc(h)?v4[h](b,a):b-s;S.insert("polygon").attr("points",cF[h](a)).attr("transform",`translate(${_},${I})`).attr("class","arrow")}if(g){let _=Ha(m)?v4[m](T,a):T-s,I=Zc(m)?v4[m](E,a):E-s;S.insert("polygon").attr("points",cF[m](a)).attr("transform",`translate(${_},${I})`).attr("class","arrow")}if(v){let _=x4(h,m)?"XY":Ha(h)?"X":"Y",I=0;_==="X"?I=Math.abs(x-T):_==="Y"?I=Math.abs(b-E)/1.5:I=Math.abs(x-T)/2;let D=S.append("g");if(await Hn(D,v,{useHtmlLabels:!1,width:I,classes:"architecture-service-label"},me()),D.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),_==="X")D.attr("transform","translate("+w+", "+C+")");else if(_==="Y")D.attr("transform","translate("+w+", "+C+") rotate(-90)");else if(_==="XY"){let k=b4(h,m);if(k&&Sve(k)){let L=D.node().getBoundingClientRect(),[R,O]=Ave(k);D.attr("dominant-baseline","auto").attr("transform",`rotate(${-1*R*O*45})`);let M=D.node().getBoundingClientRect();D.attr("transform",` + translate(${w}, ${C-L.height/2}) + translate(${R*M.width/2}, ${O*M.height/2}) + rotate(${-1*R*O*45}, 0, ${L.height/2}) + `)}}}}}))},"drawEdges"),Fve=o(async function(t,e){let n=Li("padding")*.75,i=Li("fontSize"),s=Li("iconSize")/2;await Promise.all(e.nodes().map(async l=>{let u=Ff(l);if(u.type==="group"){let{h,w:f,x1:d,y1:p}=l.boundingBox();t.append("rect").attr("x",d+s).attr("y",p+s).attr("width",f).attr("height",h).attr("class","node-bkg");let m=t.append("g"),g=d,y=p;if(u.icon){let v=m.append("g");v.html(`${await wo(u.icon,{height:n,width:n,fallbackPrefix:Zp.prefix})}`),v.attr("transform","translate("+(g+s+1)+", "+(y+s+1)+")"),g+=n,y+=i/2-1-2}if(u.label){let v=m.append("g");await Hn(v,u.label,{useHtmlLabels:!1,width:f,classes:"architecture-service-label"},me()),v.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","start").attr("text-anchor","start"),v.attr("transform","translate("+(g+s+4)+", "+(y+s+2)+")")}}}))},"drawGroups"),$ve=o(async function(t,e,r){for(let n of r){let i=e.append("g"),a=Li("iconSize");if(n.title){let h=i.append("g");await Hn(h,n.title,{useHtmlLabels:!1,width:a*1.5,classes:"architecture-service-label"},me()),h.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),h.attr("transform","translate("+a/2+", "+a+")")}let s=i.append("g");if(n.icon)s.html(`${await wo(n.icon,{height:a,width:a,fallbackPrefix:Zp.prefix})}`);else if(n.iconText){s.html(`${await wo("blank",{height:a,width:a,fallbackPrefix:Zp.prefix})}`);let d=s.append("g").append("foreignObject").attr("width",a).attr("height",a).append("div").attr("class","node-icon-text").attr("style",`height: ${a}px;`).append("div").html(n.iconText),p=parseInt(window.getComputedStyle(d.node(),null).getPropertyValue("font-size").replace(/\D/g,""))??16;d.attr("style",`-webkit-line-clamp: ${Math.floor((a-2)/p)};`)}else s.append("path").attr("class","node-bkg").attr("id","node-"+n.id).attr("d",`M0 ${a} v${-a} q0,-5 5,-5 h${a} q5,0 5,5 v${a} H0 Z`);i.attr("class","architecture-service");let{width:l,height:u}=i._groups[0][0].getBBox();n.width=l,n.height=u,t.setElementForId(n.id,i)}return 0},"drawServices"),zve=o(function(t,e,r){r.forEach(n=>{let i=e.append("g"),a=Li("iconSize");i.append("g").append("rect").attr("id","node-"+n.id).attr("fill-opacity","0").attr("width",a).attr("height",a),i.attr("class","architecture-junction");let{width:l,height:u}=i._groups[0][0].getBBox();i.width=l,i.height=u,t.setElementForId(n.id,i)})},"drawJunctions")});function Srt(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"service",id:r.id,icon:r.icon,label:r.title,parent:r.in,width:Li("iconSize"),height:Li("iconSize")},classes:"node-service"})})}function Crt(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"junction",id:r.id,parent:r.in,width:Li("iconSize"),height:Li("iconSize")},classes:"node-junction"})})}function Art(t,e){e.nodes().map(r=>{let n=Ff(r);if(n.type==="group")return;n.x=r.position().x,n.y=r.position().y,t.getElementById(n.id).attr("transform","translate("+(n.x||0)+","+(n.y||0)+")")})}function _rt(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"group",id:r.id,icon:r.icon,label:r.title,parent:r.in},classes:"node-group"})})}function Drt(t,e){t.forEach(r=>{let{lhsId:n,rhsId:i,lhsInto:a,lhsGroup:s,rhsInto:l,lhsDir:u,rhsDir:h,rhsGroup:f,title:d}=r,p=x4(r.lhsDir,r.rhsDir)?"segments":"straight",m={id:`${n}-${i}`,label:d,source:n,sourceDir:u,sourceArrow:a,sourceGroup:s,sourceEndpoint:u==="L"?"0 50%":u==="R"?"100% 50%":u==="T"?"50% 0":"50% 100%",target:i,targetDir:h,targetArrow:l,targetGroup:f,targetEndpoint:h==="L"?"0 50%":h==="R"?"100% 50%":h==="T"?"50% 0":"50% 100%"};e.add({group:"edges",data:m,classes:p})})}function Lrt(t,e,r){let n=o((l,u)=>Object.entries(l).reduce((h,[f,d])=>{let p=0,m=Object.entries(d);if(m.length===1)return h[f]=m[0][1],h;for(let g=0;g{let u={},h={};return Object.entries(l).forEach(([f,[d,p]])=>{let m=t.getNode(f)?.in??"default";u[p]??={},u[p][m]??=[],u[p][m].push(f),h[d]??={},h[d][m]??=[],h[d][m].push(f)}),{horiz:Object.values(n(u,"horizontal")).filter(f=>f.length>1),vert:Object.values(n(h,"vertical")).filter(f=>f.length>1)}}),[a,s]=i.reduce(([l,u],{horiz:h,vert:f})=>[[...l,...h],[...u,...f]],[[],[]]);return{horizontal:a,vertical:s}}function Rrt(t){let e=[],r=o(i=>`${i[0]},${i[1]}`,"posToStr"),n=o(i=>i.split(",").map(a=>parseInt(a)),"strToPos");return t.forEach(i=>{let a=Object.fromEntries(Object.entries(i).map(([h,f])=>[r(f),h])),s=[r([0,0])],l={},u={L:[-1,0],R:[1,0],T:[0,1],B:[0,-1]};for(;s.length>0;){let h=s.shift();if(h){l[h]=1;let f=a[h];if(f){let d=n(h);Object.entries(u).forEach(([p,m])=>{let g=r([d[0]+m[0],d[1]+m[1]]),y=a[g];y&&!l[g]&&(s.push(g),e.push({[lF[p]]:y,[lF[Eve(p)]]:f,gap:1.5*Li("iconSize")}))})}}}}),e}function Nrt(t,e,r,n,i,{spatialMaps:a,groupAlignments:s}){return new Promise(l=>{let u=Ge("body").append("div").attr("id","cy").attr("style","display:none"),h=rl({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"straight",label:"data(label)","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"edge.segments",style:{"curve-style":"segments","segment-weights":"0","segment-distances":[.5],"edge-distances":"endpoints","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"node",style:{"compound-sizing-wrt-labels":"include"}},{selector:"node[label]",style:{"text-valign":"bottom","text-halign":"center","font-size":`${Li("fontSize")}px`}},{selector:".node-service",style:{label:"data(label)",width:"data(width)",height:"data(height)"}},{selector:".node-junction",style:{width:"data(width)",height:"data(height)"}},{selector:".node-group",style:{padding:`${Li("padding")}px`}}]});u.remove(),_rt(r,h),Srt(t,h),Crt(e,h),Drt(n,h);let f=Lrt(i,a,s),d=Rrt(a),p=h.layout({name:"fcose",quality:"proof",styleEnabled:!1,animate:!1,nodeDimensionsIncludeLabels:!1,idealEdgeLength(m){let[g,y]=m.connectedNodes(),{parent:v}=Ff(g),{parent:x}=Ff(y);return v===x?1.5*Li("iconSize"):.5*Li("iconSize")},edgeElasticity(m){let[g,y]=m.connectedNodes(),{parent:v}=Ff(g),{parent:x}=Ff(y);return v===x?.45:.001},alignmentConstraint:f,relativePlacementConstraint:d});p.one("layoutstop",()=>{function m(g,y,v,x){let b,w,{x:C,y:T}=g,{x:E,y:A}=y;w=(x-T+(C-v)*(T-A)/(C-E))/Math.sqrt(1+Math.pow((T-A)/(C-E),2)),b=Math.sqrt(Math.pow(x-T,2)+Math.pow(v-C,2)-Math.pow(w,2));let S=Math.sqrt(Math.pow(E-C,2)+Math.pow(A-T,2));b=b/S;let _=(E-C)*(x-T)-(A-T)*(v-C);switch(!0){case _>=0:_=1;break;case _<0:_=-1;break}let I=(E-C)*(v-C)+(A-T)*(x-T);switch(!0){case I>=0:I=1;break;case I<0:I=-1;break}return w=Math.abs(w)*_,b=b*I,{distances:w,weights:b}}o(m,"getSegmentWeights"),h.startBatch();for(let g of Object.values(h.edges()))if(g.data?.()){let{x:y,y:v}=g.source().position(),{x,y:b}=g.target().position();if(y!==x&&v!==b){let w=g.sourceEndpoint(),C=g.targetEndpoint(),{sourceDir:T}=sC(g),[E,A]=Zc(T)?[w.x,C.y]:[C.x,w.y],{weights:S,distances:_}=m(w,C,E,A);g.style("segment-distances",_),g.style("segment-weights",S)}}h.endBatch(),p.run()}),p.run(),h.ready(m=>{Y.info("Ready",m),l(h)})})}var Vve,Mrt,Uve,Hve=N(()=>{"use strict";tu();kB();Vve=Sa(Pve(),1);dr();vt();Vc();Ei();w4();yF();oC();Gve();P4([{name:Zp.prefix,icons:Zp}]);rl.use(Vve.default);o(Srt,"addServices");o(Crt,"addJunctions");o(Art,"positionNodes");o(_rt,"addGroups");o(Drt,"addEdges");o(Lrt,"getAlignments");o(Rrt,"getRelativeConstraints");o(Nrt,"layoutArchitecture");Mrt=o(async(t,e,r,n)=>{let i=n.db,a=i.getServices(),s=i.getJunctions(),l=i.getGroups(),u=i.getEdges(),h=i.getDataStructures(),f=sa(e),d=f.append("g");d.attr("class","architecture-edges");let p=f.append("g");p.attr("class","architecture-services");let m=f.append("g");m.attr("class","architecture-groups"),await $ve(i,p,a),zve(i,p,s);let g=await Nrt(a,s,l,u,i,h);await Bve(d,g),await Fve(m,g),Art(i,g),Ao(void 0,f,Li("padding"),Li("useMaxWidth"))},"draw"),Uve={draw:Mrt}});var Wve={};hr(Wve,{diagram:()=>Irt});var Irt,qve=N(()=>{"use strict";Mve();w4();Ove();Hve();Irt={parser:Nve,db:Qp,renderer:Uve,styles:Ive}});var bnt={};hr(bnt,{default:()=>xnt});tu();PC();Xf();var YX="c4",PCe=o(t=>/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(t),"detector"),BCe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(qX(),WX));return{id:YX,diagram:t}},"loader"),FCe={id:YX,detector:PCe,loader:BCe},XX=FCe;var Xie="flowchart",xOe=o((t,e)=>e?.flowchart?.defaultRenderer==="dagre-wrapper"||e?.flowchart?.defaultRenderer==="elk"?!1:/^\s*graph/.test(t),"detector"),bOe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(ak(),ik));return{id:Xie,diagram:t}},"loader"),wOe={id:Xie,detector:xOe,loader:bOe},jie=wOe;var Kie="flowchart-v2",TOe=o((t,e)=>e?.flowchart?.defaultRenderer==="dagre-d3"?!1:(e?.flowchart?.defaultRenderer==="elk"&&(e.layout="elk"),/^\s*graph/.test(t)&&e?.flowchart?.defaultRenderer==="dagre-wrapper"?!0:/^\s*flowchart/.test(t)),"detector"),kOe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(ak(),ik));return{id:Kie,diagram:t}},"loader"),EOe={id:Kie,detector:TOe,loader:kOe},Qie=EOe;var sae="er",DOe=o(t=>/^\s*erDiagram/.test(t),"detector"),LOe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(aae(),iae));return{id:sae,diagram:t}},"loader"),ROe={id:sae,detector:DOe,loader:LOe},oae=ROe;var uue="gitGraph",tze=o(t=>/^\s*gitGraph/.test(t),"detector"),rze=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(cue(),lue));return{id:uue,diagram:t}},"loader"),nze={id:uue,detector:tze,loader:rze},hue=nze;var Gue="gantt",Hze=o(t=>/^\s*gantt/.test(t),"detector"),Wze=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(zue(),$ue));return{id:Gue,diagram:t}},"loader"),qze={id:Gue,detector:Hze,loader:Wze},Vue=qze;var Que="info",Zze=o(t=>/^\s*info/.test(t),"detector"),Jze=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Kue(),jue));return{id:Que,diagram:t}},"loader"),Zue={id:Que,detector:Zze,loader:Jze};var lhe="pie",fGe=o(t=>/^\s*pie/.test(t),"detector"),dGe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(ohe(),she));return{id:lhe,diagram:t}},"loader"),che={id:lhe,detector:fGe,loader:dGe};var The="quadrantChart",RGe=o(t=>/^\s*quadrantChart/.test(t),"detector"),NGe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(whe(),bhe));return{id:The,diagram:t}},"loader"),MGe={id:The,detector:RGe,loader:NGe},khe=MGe;var Khe="xychart",jGe=o(t=>/^\s*xychart-beta/.test(t),"detector"),KGe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(jhe(),Xhe));return{id:Khe,diagram:t}},"loader"),QGe={id:Khe,detector:jGe,loader:KGe},Qhe=QGe;var sfe="requirement",tVe=o(t=>/^\s*requirement(Diagram)?/.test(t),"detector"),rVe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(afe(),ife));return{id:sfe,diagram:t}},"loader"),nVe={id:sfe,detector:tVe,loader:rVe},ofe=nVe;var Afe="sequence",zVe=o(t=>/^\s*sequenceDiagram/.test(t),"detector"),GVe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Cfe(),Sfe));return{id:Afe,diagram:t}},"loader"),VVe={id:Afe,detector:zVe,loader:GVe},_fe=VVe;var Ife="class",XVe=o((t,e)=>e?.class?.defaultRenderer==="dagre-wrapper"?!1:/^\s*classDiagram/.test(t),"detector"),jVe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Mfe(),Nfe));return{id:Ife,diagram:t}},"loader"),KVe={id:Ife,detector:XVe,loader:jVe},Ofe=KVe;var Ffe="classDiagram",ZVe=o((t,e)=>/^\s*classDiagram/.test(t)&&e?.class?.defaultRenderer==="dagre-wrapper"?!0:/^\s*classDiagram-v2/.test(t),"detector"),JVe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Bfe(),Pfe));return{id:Ffe,diagram:t}},"loader"),eUe={id:Ffe,detector:ZVe,loader:JVe},$fe=eUe;var Ede="state",LUe=o((t,e)=>e?.state?.defaultRenderer==="dagre-wrapper"?!1:/^\s*stateDiagram/.test(t),"detector"),RUe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(kde(),Tde));return{id:Ede,diagram:t}},"loader"),NUe={id:Ede,detector:LUe,loader:RUe},Sde=NUe;var _de="stateDiagram",IUe=o((t,e)=>!!(/^\s*stateDiagram-v2/.test(t)||/^\s*stateDiagram/.test(t)&&e?.state?.defaultRenderer==="dagre-wrapper"),"detector"),OUe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Ade(),Cde));return{id:_de,diagram:t}},"loader"),PUe={id:_de,detector:IUe,loader:OUe},Dde=PUe;var Wde="journey",nHe=o(t=>/^\s*journey/.test(t),"detector"),iHe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Hde(),Ude));return{id:Wde,diagram:t}},"loader"),aHe={id:Wde,detector:nHe,loader:iHe},qde=aHe;vt();Vc();Ei();var sHe=o((t,e,r)=>{Y.debug(`rendering svg for syntax error +`);let n=sa(e),i=n.append("g");n.attr("viewBox","0 0 2412 512"),vn(n,100,512,!0),i.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),i.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),i.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),i.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),i.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),i.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),i.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in text"),i.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text(`mermaid version ${r}`)},"draw"),fP={draw:sHe},Yde=fP;var oHe={db:{},renderer:fP,parser:{parse:o(()=>{},"parse")}},Xde=oHe;var jde="flowchart-elk",lHe=o((t,e={})=>/^\s*flowchart-elk/.test(t)||/^\s*flowchart|graph/.test(t)&&e?.flowchart?.defaultRenderer==="elk"?(e.layout="elk",!0):!1,"detector"),cHe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(ak(),ik));return{id:jde,diagram:t}},"loader"),uHe={id:jde,detector:lHe,loader:cHe},Kde=uHe;var Tpe="timeline",DHe=o(t=>/^\s*timeline/.test(t),"detector"),LHe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(wpe(),bpe));return{id:Tpe,diagram:t}},"loader"),RHe={id:Tpe,detector:DHe,loader:LHe},kpe=RHe;var e1e="mindmap",cJe=o(t=>/^\s*mindmap/.test(t),"detector"),uJe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Jge(),Zge));return{id:e1e,diagram:t}},"loader"),hJe={id:e1e,detector:cJe,loader:uJe},t1e=hJe;var d1e="kanban",AJe=o(t=>/^\s*kanban/.test(t),"detector"),_Je=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(f1e(),h1e));return{id:d1e,diagram:t}},"loader"),DJe={id:d1e,detector:AJe,loader:_Je},p1e=DJe;var j1e="sankey",ZJe=o(t=>/^\s*sankey-beta/.test(t),"detector"),JJe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(X1e(),Y1e));return{id:j1e,diagram:t}},"loader"),eet={id:j1e,detector:ZJe,loader:JJe},K1e=eet;var sye="packet",pet=o(t=>/^\s*packet-beta/.test(t),"detector"),met=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(aye(),iye));return{id:sye,diagram:t}},"loader"),oye={id:sye,detector:pet,loader:met};var vye="radar",Fet=o(t=>/^\s*radar-beta/.test(t),"detector"),$et=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(yye(),gye));return{id:vye,diagram:t}},"loader"),xye={id:vye,detector:Fet,loader:$et};var Tve="block",srt=o(t=>/^\s*block-beta/.test(t),"detector"),ort=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(wve(),bve));return{id:Tve,diagram:t}},"loader"),lrt={id:Tve,detector:srt,loader:ort},kve=lrt;var Yve="architecture",Ort=o(t=>/^\s*architecture/.test(t),"detector"),Prt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(qve(),Wve));return{id:Yve,diagram:t}},"loader"),Brt={id:Yve,detector:Ort,loader:Prt},Xve=Brt;Xf();zt();var jve=!1,py=o(()=>{jve||(jve=!0,ad("error",Xde,t=>t.toLowerCase().trim()==="error"),ad("---",{db:{clear:o(()=>{},"clear")},styles:{},renderer:{draw:o(()=>{},"draw")},parser:{parse:o(()=>{throw new Error("Diagrams beginning with --- are not valid. If you were trying to use a YAML front-matter, please ensure that you've correctly opened and closed the YAML front-matter with un-indented `---` blocks")},"parse")},init:o(()=>null,"init")},t=>t.toLowerCase().trimStart().startsWith("---")),z4(XX,p1e,$fe,Ofe,oae,Vue,Zue,che,ofe,_fe,Kde,Qie,jie,t1e,kpe,hue,Dde,Sde,qde,khe,K1e,oye,Qhe,kve,Xve,xye))},"addDiagrams");vt();Xf();zt();var Kve=o(async()=>{Y.debug("Loading registered diagrams");let e=(await Promise.allSettled(Object.entries(Yf).map(async([r,{detector:n,loader:i}])=>{if(i)try{jy(r)}catch{try{let{diagram:a,id:s}=await i();ad(s,a,n)}catch(a){throw Y.error(`Failed to load external diagram with key ${r}. Removing from detectors.`),delete Yf[r],a}}}))).filter(r=>r.status==="rejected");if(e.length>0){Y.error(`Failed to load ${e.length} external diagrams`);for(let r of e)Y.error(r);throw new Error(`Failed to load ${e.length} external diagrams`)}},"loadRegisteredDiagrams");vt();dr();var lC="comm",cC="rule",uC="decl";var Qve="@import";var Zve="@namespace",Jve="@keyframes";var e2e="@layer";var vF=Math.abs,S4=String.fromCharCode;function hC(t){return t.trim()}o(hC,"trim");function C4(t,e,r){return t.replace(e,r)}o(C4,"replace");function t2e(t,e,r){return t.indexOf(e,r)}o(t2e,"indexof");function $f(t,e){return t.charCodeAt(e)|0}o($f,"charat");function zf(t,e,r){return t.slice(e,r)}o(zf,"substr");function vo(t){return t.length}o(vo,"strlen");function r2e(t){return t.length}o(r2e,"sizeof");function my(t,e){return e.push(t),t}o(my,"append");var fC=1,gy=1,n2e=0,il=0,Ri=0,vy="";function dC(t,e,r,n,i,a,s,l){return{value:t,root:e,parent:r,type:n,props:i,children:a,line:fC,column:gy,length:s,return:"",siblings:l}}o(dC,"node");function i2e(){return Ri}o(i2e,"char");function a2e(){return Ri=il>0?$f(vy,--il):0,gy--,Ri===10&&(gy=1,fC--),Ri}o(a2e,"prev");function al(){return Ri=il2||yy(Ri)>3?"":" "}o(l2e,"whitespace");function c2e(t,e){for(;--e&&al()&&!(Ri<48||Ri>102||Ri>57&&Ri<65||Ri>70&&Ri<97););return pC(t,A4()+(e<6&&rh()==32&&al()==32))}o(c2e,"escaping");function xF(t){for(;al();)switch(Ri){case t:return il;case 34:case 39:t!==34&&t!==39&&xF(Ri);break;case 40:t===41&&xF(t);break;case 92:al();break}return il}o(xF,"delimiter");function u2e(t,e){for(;al()&&t+Ri!==57;)if(t+Ri===84&&rh()===47)break;return"/*"+pC(e,il-1)+"*"+S4(t===47?t:al())}o(u2e,"commenter");function h2e(t){for(;!yy(rh());)al();return pC(t,il)}o(h2e,"identifier");function p2e(t){return o2e(gC("",null,null,null,[""],t=s2e(t),0,[0],t))}o(p2e,"compile");function gC(t,e,r,n,i,a,s,l,u){for(var h=0,f=0,d=s,p=0,m=0,g=0,y=1,v=1,x=1,b=0,w="",C=i,T=a,E=n,A=w;v;)switch(g=b,b=al()){case 40:if(g!=108&&$f(A,d-1)==58){t2e(A+=C4(mC(b),"&","&\f"),"&\f",vF(h?l[h-1]:0))!=-1&&(x=-1);break}case 34:case 39:case 91:A+=mC(b);break;case 9:case 10:case 13:case 32:A+=l2e(g);break;case 92:A+=c2e(A4()-1,7);continue;case 47:switch(rh()){case 42:case 47:my(Frt(u2e(al(),A4()),e,r,u),u),(yy(g||1)==5||yy(rh()||1)==5)&&vo(A)&&zf(A,-1,void 0)!==" "&&(A+=" ");break;default:A+="/"}break;case 123*y:l[h++]=vo(A)*x;case 125*y:case 59:case 0:switch(b){case 0:case 125:v=0;case 59+f:x==-1&&(A=C4(A,/\f/g,"")),m>0&&(vo(A)-d||y===0&&g===47)&&my(m>32?d2e(A+";",n,r,d-1,u):d2e(C4(A," ","")+";",n,r,d-2,u),u);break;case 59:A+=";";default:if(my(E=f2e(A,e,r,h,f,i,l,w,C=[],T=[],d,a),a),b===123)if(f===0)gC(A,e,E,E,C,a,d,l,T);else{switch(p){case 99:if($f(A,3)===110)break;case 108:if($f(A,2)===97)break;default:f=0;case 100:case 109:case 115:}f?gC(t,E,E,n&&my(f2e(t,E,E,0,0,i,l,w,i,C=[],d,T),T),i,T,d,l,n?C:T):gC(A,E,E,E,[""],T,0,l,T)}}h=f=m=0,y=x=1,w=A="",d=s;break;case 58:d=1+vo(A),m=g;default:if(y<1){if(b==123)--y;else if(b==125&&y++==0&&a2e()==125)continue}switch(A+=S4(b),b*y){case 38:x=f>0?1:(A+="\f",-1);break;case 44:l[h++]=(vo(A)-1)*x,x=1;break;case 64:rh()===45&&(A+=mC(al())),p=rh(),f=d=vo(w=A+=h2e(A4())),b++;break;case 45:g===45&&vo(A)==2&&(y=0)}}return a}o(gC,"parse");function f2e(t,e,r,n,i,a,s,l,u,h,f,d){for(var p=i-1,m=i===0?a:[""],g=r2e(m),y=0,v=0,x=0;y0?m[b]+" "+w:C4(w,/&\f/g,m[b])))&&(u[x++]=C);return dC(t,e,r,i===0?cC:l,u,h,f,d)}o(f2e,"ruleset");function Frt(t,e,r,n){return dC(t,e,r,lC,S4(i2e()),zf(t,2,-2),0,n)}o(Frt,"comment");function d2e(t,e,r,n,i){return dC(t,e,r,uC,zf(t,0,n),zf(t,n+1,-1),n,i)}o(d2e,"declaration");function yC(t,e){for(var r="",n=0;n{v2e.forEach(t=>{t()}),v2e=[]},"attachFunctions");vt();var b2e=o(t=>t.replace(/^\s*%%(?!{)[^\n]+\n?/gm,"").trimStart(),"cleanupComments");$4();Ew();function w2e(t){let e=t.match(F4);if(!e)return{text:t,metadata:{}};let r=cm(e[1],{schema:lm})??{};r=typeof r=="object"&&!Array.isArray(r)?r:{};let n={};return r.displayMode&&(n.displayMode=r.displayMode.toString()),r.title&&(n.title=r.title.toString()),r.config&&(n.config=r.config),{text:t.slice(e[0].length),metadata:n}}o(w2e,"extractFrontMatter");ir();var zrt=o(t=>t.replace(/\r\n?/g,` +`).replace(/<(\w+)([^>]*)>/g,(e,r,n)=>"<"+r+n.replace(/="([^"]*)"/g,"='$1'")+">"),"cleanupText"),Grt=o(t=>{let{text:e,metadata:r}=w2e(t),{displayMode:n,title:i,config:a={}}=r;return n&&(a.gantt||(a.gantt={}),a.gantt.displayMode=n),{title:i,config:a,text:e}},"processFrontmatter"),Vrt=o(t=>{let e=Gt.detectInit(t)??{},r=Gt.detectDirective(t,"wrap");return Array.isArray(r)?e.wrap=r.some(({type:n})=>n==="wrap"):r?.type==="wrap"&&(e.wrap=!0),{text:IX(t),directive:e}},"processDirectives");function bF(t){let e=zrt(t),r=Grt(e),n=Vrt(r.text),i=Fi(r.config,n.directive);return t=b2e(n.text),{code:t,title:r.title,config:i}}o(bF,"preprocessDiagram");tA();q4();ir();function T2e(t){let e=new TextEncoder().encode(t),r=Array.from(e,n=>String.fromCodePoint(n)).join("");return btoa(r)}o(T2e,"toBase64");var Urt=5e4,Hrt="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",Wrt="sandbox",qrt="loose",Yrt="http://www.w3.org/2000/svg",Xrt="http://www.w3.org/1999/xlink",jrt="http://www.w3.org/1999/xhtml",Krt="100%",Qrt="100%",Zrt="border:0;margin:0;",Jrt="margin:0",ent="allow-top-navigation-by-user-activation allow-popups",tnt='The "iframe" tag is not supported by your browser.',rnt=["foreignobject"],nnt=["dominant-baseline"];function C2e(t){let e=bF(t);return Ly(),W$(e.config??{}),e}o(C2e,"processAndSetConfigs");async function int(t,e){py();try{let{code:r,config:n}=C2e(t);return{diagramType:(await A2e(r)).type,config:n}}catch(r){if(e?.suppressErrors)return!1;throw r}}o(int,"parse");var k2e=o((t,e,r=[])=>` +.${t} ${e} { ${r.join(" !important; ")} !important; }`,"cssImportantStyles"),ant=o((t,e=new Map)=>{let r="";if(t.themeCSS!==void 0&&(r+=` +${t.themeCSS}`),t.fontFamily!==void 0&&(r+=` +:root { --mermaid-font-family: ${t.fontFamily}}`),t.altFontFamily!==void 0&&(r+=` +:root { --mermaid-alt-font-family: ${t.altFontFamily}}`),e instanceof Map){let s=t.htmlLabels??t.flowchart?.htmlLabels?["> *","span"]:["rect","polygon","ellipse","circle","path"];e.forEach(l=>{ur(l.styles)||s.forEach(u=>{r+=k2e(l.id,u,l.styles)}),ur(l.textStyles)||(r+=k2e(l.id,"tspan",(l?.textStyles||[]).map(u=>u.replace("color","fill"))))})}return r},"createCssStyles"),snt=o((t,e,r,n)=>{let i=ant(t,r),a=zG(e,i,t.themeVariables);return yC(p2e(`${n}{${a}}`),m2e)},"createUserStyles"),ont=o((t="",e,r)=>{let n=t;return!r&&!e&&(n=n.replace(/marker-end="url\([\d+./:=?A-Za-z-]*?#/g,'marker-end="url(#')),n=na(n),n=n.replace(/
    /g,"
    "),n},"cleanUpSvgCode"),lnt=o((t="",e)=>{let r=e?.viewBox?.baseVal?.height?e.viewBox.baseVal.height+"px":Qrt,n=T2e(`${t}`);return``},"putIntoIFrame"),E2e=o((t,e,r,n,i)=>{let a=t.append("div");a.attr("id",r),n&&a.attr("style",n);let s=a.append("svg").attr("id",e).attr("width","100%").attr("xmlns",Yrt);return i&&s.attr("xmlns:xlink",i),s.append("g"),t},"appendDivSvgG");function S2e(t,e){return t.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}o(S2e,"sandboxedIframe");var cnt=o((t,e,r,n)=>{t.getElementById(e)?.remove(),t.getElementById(r)?.remove(),t.getElementById(n)?.remove()},"removeExistingElements"),unt=o(async function(t,e,r){py();let n=C2e(e);e=n.code;let i=cr();Y.debug(i),e.length>(i?.maxTextSize??Urt)&&(e=Hrt);let a="#"+t,s="i"+t,l="#"+s,u="d"+t,h="#"+u,f=o(()=>{let L=Ge(p?l:h).node();L&&"remove"in L&&L.remove()},"removeTempElements"),d=Ge("body"),p=i.securityLevel===Wrt,m=i.securityLevel===qrt,g=i.fontFamily;if(r!==void 0){if(r&&(r.innerHTML=""),p){let k=S2e(Ge(r),s);d=Ge(k.nodes()[0].contentDocument.body),d.node().style.margin=0}else d=Ge(r);E2e(d,t,u,`font-family: ${g}`,Xrt)}else{if(cnt(document,t,u,s),p){let k=S2e(Ge("body"),s);d=Ge(k.nodes()[0].contentDocument.body),d.node().style.margin=0}else d=Ge("body");E2e(d,t,u)}let y,v;try{y=await xy.fromText(e,{title:n.title})}catch(k){if(i.suppressErrorRendering)throw f(),k;y=await xy.fromText("error"),v=k}let x=d.select(h).node(),b=y.type,w=x.firstChild,C=w.firstChild,T=y.renderer.getClasses?.(e,y),E=snt(i,b,T,a),A=document.createElement("style");A.innerHTML=E,w.insertBefore(A,C);try{await y.renderer.draw(e,t,vb.version,y)}catch(k){throw i.suppressErrorRendering?f():Yde.draw(e,t,vb.version),k}let S=d.select(`${h} svg`),_=y.db.getAccTitle?.(),I=y.db.getAccDescription?.();fnt(b,S,_,I),d.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",jrt);let D=d.select(h).node().innerHTML;if(Y.debug("config.arrowMarkerAbsolute",i.arrowMarkerAbsolute),D=ont(D,p,fr(i.arrowMarkerAbsolute)),p){let k=d.select(h+" svg").node();D=lnt(D,k)}else m||(D=ch.sanitize(D,{ADD_TAGS:rnt,ADD_ATTR:nnt,HTML_INTEGRATION_POINTS:{foreignobject:!0}}));if(x2e(),v)throw v;return f(),{diagramType:b,svg:D,bindFunctions:y.db.bindFunctions}},"render");function hnt(t={}){let e=Gn({},t);e?.fontFamily&&!e.themeVariables?.fontFamily&&(e.themeVariables||(e.themeVariables={}),e.themeVariables.fontFamily=e.fontFamily),V$(e),e?.theme&&e.theme in To?e.themeVariables=To[e.theme].getThemeVariables(e.themeVariables):e&&(e.themeVariables=To.default.getThemeVariables(e.themeVariables));let r=typeof e=="object"?t7(e):r7();wy(r.logLevel),py()}o(hnt,"initialize");var A2e=o((t,e={})=>{let{code:r}=bF(t);return xy.fromText(r,e)},"getDiagramFromText");function fnt(t,e,r,n){g2e(e,t),y2e(e,r,n,e.attr("id"))}o(fnt,"addA11yInfo");var Gf=Object.freeze({render:unt,parse:int,getDiagramFromText:A2e,initialize:hnt,getConfig:cr,setConfig:X4,getSiteConfig:r7,updateSiteConfig:U$,reset:o(()=>{Ly()},"reset"),globalReset:o(()=>{Ly(lh)},"globalReset"),defaultConfig:lh});wy(cr().logLevel);Ly(cr());Yd();ir();var dnt=o((t,e,r)=>{Y.warn(t),Z9(t)?(r&&r(t.str,t.hash),e.push({...t,message:t.str,error:t})):(r&&r(t),t instanceof Error&&e.push({str:t.message,message:t.message,hash:t.name,error:t}))},"handleError"),_2e=o(async function(t={querySelector:".mermaid"}){try{await pnt(t)}catch(e){if(Z9(e)&&Y.error(e.str),nh.parseError&&nh.parseError(e),!t.suppressErrors)throw Y.error("Use the suppressErrors option to suppress these errors"),e}},"run"),pnt=o(async function({postRenderCallback:t,querySelector:e,nodes:r}={querySelector:".mermaid"}){let n=Gf.getConfig();Y.debug(`${t?"":"No "}Callback function found`);let i;if(r)i=r;else if(e)i=document.querySelectorAll(e);else throw new Error("Nodes and querySelector are both undefined");Y.debug(`Found ${i.length} diagrams`),n?.startOnLoad!==void 0&&(Y.debug("Start On Load: "+n?.startOnLoad),Gf.updateSiteConfig({startOnLoad:n?.startOnLoad}));let a=new Gt.InitIDGenerator(n.deterministicIds,n.deterministicIDSeed),s,l=[];for(let u of Array.from(i)){Y.info("Rendering diagram: "+u.id);if(u.getAttribute("data-processed"))continue;u.setAttribute("data-processed","true");let h=`mermaid-${a.next()}`;s=u.innerHTML,s=B4(Gt.entityDecode(s)).trim().replace(//gi,"
    ");let f=Gt.detectInit(s);f&&Y.debug("Detected early reinit: ",f);try{let{svg:d,bindFunctions:p}=await N2e(h,s,u);u.innerHTML=d,t&&await t(h),p&&p(u)}catch(d){dnt(d,l,nh.parseError)}}if(l.length>0)throw l[0]},"runThrowsErrors"),D2e=o(function(t){Gf.initialize(t)},"initialize"),mnt=o(async function(t,e,r){Y.warn("mermaid.init is deprecated. Please use run instead."),t&&D2e(t);let n={postRenderCallback:r,querySelector:".mermaid"};typeof e=="string"?n.querySelector=e:e&&(e instanceof HTMLElement?n.nodes=[e]:n.nodes=e),await _2e(n)},"init"),gnt=o(async(t,{lazyLoad:e=!0}={})=>{py(),z4(...t),e===!1&&await Kve()},"registerExternalDiagrams"),L2e=o(function(){if(nh.startOnLoad){let{startOnLoad:t}=Gf.getConfig();t&&nh.run().catch(e=>Y.error("Mermaid failed to initialize",e))}},"contentLoaded");if(typeof document<"u"){window.addEventListener("load",L2e,!1)}var ynt=o(function(t){nh.parseError=t},"setParseErrorHandler"),vC=[],wF=!1,R2e=o(async()=>{if(!wF){for(wF=!0;vC.length>0;){let t=vC.shift();if(t)try{await t()}catch(e){Y.error("Error executing queue",e)}}wF=!1}},"executeQueue"),vnt=o(async(t,e)=>new Promise((r,n)=>{let i=o(()=>new Promise((a,s)=>{Gf.parse(t,e).then(l=>{a(l),r(l)},l=>{Y.error("Error parsing",l),nh.parseError?.(l),s(l),n(l)})}),"performCall");vC.push(i),R2e().catch(n)}),"parse"),N2e=o((t,e,r)=>new Promise((n,i)=>{let a=o(()=>new Promise((s,l)=>{Gf.render(t,e,r).then(u=>{s(u),n(u)},u=>{Y.error("Error parsing",u),nh.parseError?.(u),l(u),i(u)})}),"performCall");vC.push(a),R2e().catch(i)}),"render"),nh={startOnLoad:!0,mermaidAPI:Gf,parse:vnt,render:N2e,init:mnt,run:_2e,registerExternalDiagrams:gnt,registerLayoutLoaders:vR,initialize:D2e,parseError:void 0,contentLoaded:L2e,setParseErrorHandler:ynt,detectType:a0,registerIconPacks:P4},xnt=nh;return V2e(bnt);})(); +/*! Check if previously processed */ +/*! + * Wait for document loaded before starting the execution + */ +/*! Bundled license information: + +dompurify/dist/purify.es.mjs: + (*! @license DOMPurify 3.2.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.4/LICENSE *) + +js-yaml/dist/js-yaml.mjs: + (*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT *) + +lodash-es/lodash.js: + (** + * @license + * Lodash (Custom Build) + * Build: `lodash modularize exports="es" -o ./` + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + *) + +cytoscape/dist/cytoscape.esm.mjs: + (*! + Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable + Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) + Licensed under The MIT License (http://opensource.org/licenses/MIT) + *) + (*! + Event object based on jQuery events, MIT license + + https://jquery.org/license/ + https://tldrlegal.com/license/mit-license + https://github.com/jquery/jquery/blob/master/src/event.js + *) + (*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License *) + (*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License *) +*/ +globalThis.mermaid = globalThis.__esbuild_esm_mermaid.default; diff --git a/docs/js/moment.min.2.30.1.js b/docs/js/moment.min.2.30.1.js new file mode 100644 index 0000000000..0441995152 --- /dev/null +++ b/docs/js/moment.min.2.30.1.js @@ -0,0 +1,15 @@ +/** + * Minified by jsDelivr using Terser v5.37.0. + * Original file: /npm/moment@2.30.1/moment.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +//! moment.js +//! version : 2.30.1 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,(function(){"use strict";var e,t;function n(){return e.apply(null,arguments)}function s(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function i(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function a(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(r(e,t))return!1;return!0}function o(e){return void 0===e}function u(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function l(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function d(e,t){var n,s=[],i=e.length;for(n=0;n>>0;for(t=0;t0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+s}var N=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,W=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,P={},R={};function C(e,t,n,s){var i=s;"string"==typeof s&&(i=function(){return this[s]()}),e&&(R[e]=i),t&&(R[t[0]]=function(){return x(i.apply(this,arguments),t[1],t[2])}),n&&(R[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function U(e,t){return e.isValid()?(t=H(t,e.localeData()),P[t]=P[t]||function(e){var t,n,s,i=e.match(N);for(t=0,n=i.length;t=0&&W.test(e);)e=e.replace(W,s),W.lastIndex=0,n-=1;return e}var F={D:"date",dates:"date",date:"date",d:"day",days:"day",day:"day",e:"weekday",weekdays:"weekday",weekday:"weekday",E:"isoWeekday",isoweekdays:"isoWeekday",isoweekday:"isoWeekday",DDD:"dayOfYear",dayofyears:"dayOfYear",dayofyear:"dayOfYear",h:"hour",hours:"hour",hour:"hour",ms:"millisecond",milliseconds:"millisecond",millisecond:"millisecond",m:"minute",minutes:"minute",minute:"minute",M:"month",months:"month",month:"month",Q:"quarter",quarters:"quarter",quarter:"quarter",s:"second",seconds:"second",second:"second",gg:"weekYear",weekyears:"weekYear",weekyear:"weekYear",GG:"isoWeekYear",isoweekyears:"isoWeekYear",isoweekyear:"isoWeekYear",w:"week",weeks:"week",week:"week",W:"isoWeek",isoweeks:"isoWeek",isoweek:"isoWeek",y:"year",years:"year",year:"year"};function L(e){return"string"==typeof e?F[e]||F[e.toLowerCase()]:void 0}function V(e){var t,n,s={};for(n in e)r(e,n)&&(t=L(n))&&(s[t]=e[n]);return s}var G={date:9,day:11,weekday:11,isoWeekday:11,dayOfYear:4,hour:13,millisecond:16,minute:14,month:8,quarter:7,second:15,weekYear:1,isoWeekYear:1,week:5,isoWeek:5,year:1};var E,A=/\d/,j=/\d\d/,I=/\d{3}/,Z=/\d{4}/,z=/[+-]?\d{6}/,q=/\d\d?/,$=/\d\d\d\d?/,B=/\d\d\d\d\d\d?/,J=/\d{1,3}/,Q=/\d{1,4}/,X=/[+-]?\d{1,6}/,K=/\d+/,ee=/[+-]?\d+/,te=/Z|[+-]\d\d:?\d\d/gi,ne=/Z|[+-]\d\d(?::?\d\d)?/gi,se=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,ie=/^[1-9]\d?/,re=/^([1-9]\d|\d)/;function ae(e,t,n){E[e]=O(t)?t:function(e,s){return e&&n?n:t}}function oe(e,t){return r(E,e)?E[e](t._strict,t._locale):new RegExp(ue(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,(function(e,t,n,s,i){return t||n||s||i}))))}function ue(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function le(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function de(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=le(t)),n}E={};var he={};function ce(e,t){var n,s,i=t;for("string"==typeof e&&(e=[e]),u(t)&&(i=function(e,n){n[t]=de(e)}),s=e.length,n=0;n68?1900:2e3)};var Oe,be=Te("FullYear",!0);function Te(e,t){return function(s){return null!=s?(Ne(this,e,s),n.updateOffset(this,t),this):xe(this,e)}}function xe(e,t){if(!e.isValid())return NaN;var n=e._d,s=e._isUTC;switch(t){case"Milliseconds":return s?n.getUTCMilliseconds():n.getMilliseconds();case"Seconds":return s?n.getUTCSeconds():n.getSeconds();case"Minutes":return s?n.getUTCMinutes():n.getMinutes();case"Hours":return s?n.getUTCHours():n.getHours();case"Date":return s?n.getUTCDate():n.getDate();case"Day":return s?n.getUTCDay():n.getDay();case"Month":return s?n.getUTCMonth():n.getMonth();case"FullYear":return s?n.getUTCFullYear():n.getFullYear();default:return NaN}}function Ne(e,t,n){var s,i,r,a,o;if(e.isValid()&&!isNaN(n)){switch(s=e._d,i=e._isUTC,t){case"Milliseconds":return void(i?s.setUTCMilliseconds(n):s.setMilliseconds(n));case"Seconds":return void(i?s.setUTCSeconds(n):s.setSeconds(n));case"Minutes":return void(i?s.setUTCMinutes(n):s.setMinutes(n));case"Hours":return void(i?s.setUTCHours(n):s.setHours(n));case"Date":return void(i?s.setUTCDate(n):s.setDate(n));case"FullYear":break;default:return}r=n,a=e.month(),o=29!==(o=e.date())||1!==a||_e(r)?o:28,i?s.setUTCFullYear(r,a,o):s.setFullYear(r,a,o)}}function We(e,t){if(isNaN(e)||isNaN(t))return NaN;var n,s=(t%(n=12)+n)%n;return e+=(t-s)/12,1===s?_e(e)?29:28:31-s%7%2}Oe=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;t=0?(o=new Date(e+400,t,n,s,i,r,a),isFinite(o.getFullYear())&&o.setFullYear(e)):o=new Date(e,t,n,s,i,r,a),o}function Ae(e){var t,n;return e<100&&e>=0?((n=Array.prototype.slice.call(arguments))[0]=e+400,t=new Date(Date.UTC.apply(null,n)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function je(e,t,n){var s=7+t-n;return-((7+Ae(e,0,s).getUTCDay()-t)%7)+s-1}function Ie(e,t,n,s,i){var r,a,o=1+7*(t-1)+(7+n-s)%7+je(e,s,i);return o<=0?a=Se(r=e-1)+o:o>Se(e)?(r=e+1,a=o-Se(e)):(r=e,a=o),{year:r,dayOfYear:a}}function Ze(e,t,n){var s,i,r=je(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+ze(i=e.year()-1,t,n):a>ze(e.year(),t,n)?(s=a-ze(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function ze(e,t,n){var s=je(e,t,n),i=je(e+1,t,n);return(Se(e)-s+i)/7}C("w",["ww",2],"wo","week"),C("W",["WW",2],"Wo","isoWeek"),ae("w",q,ie),ae("ww",q,j),ae("W",q,ie),ae("WW",q,j),fe(["w","ww","W","WW"],(function(e,t,n,s){t[s.substr(0,1)]=de(e)}));function qe(e,t){return e.slice(t,7).concat(e.slice(0,t))}C("d",0,"do","day"),C("dd",0,0,(function(e){return this.localeData().weekdaysMin(this,e)})),C("ddd",0,0,(function(e){return this.localeData().weekdaysShort(this,e)})),C("dddd",0,0,(function(e){return this.localeData().weekdays(this,e)})),C("e",0,0,"weekday"),C("E",0,0,"isoWeekday"),ae("d",q),ae("e",q),ae("E",q),ae("dd",(function(e,t){return t.weekdaysMinRegex(e)})),ae("ddd",(function(e,t){return t.weekdaysShortRegex(e)})),ae("dddd",(function(e,t){return t.weekdaysRegex(e)})),fe(["dd","ddd","dddd"],(function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:f(n).invalidWeekday=e})),fe(["d","e","E"],(function(e,t,n,s){t[s]=de(e)}));var $e="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Be="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Je="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Qe=se,Xe=se,Ke=se;function et(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=c([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=Oe.call(this._weekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Oe.call(this._shortWeekdaysParse,a))?i:null:-1!==(i=Oe.call(this._minWeekdaysParse,a))?i:null:"dddd"===t?-1!==(i=Oe.call(this._weekdaysParse,a))||-1!==(i=Oe.call(this._shortWeekdaysParse,a))||-1!==(i=Oe.call(this._minWeekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Oe.call(this._shortWeekdaysParse,a))||-1!==(i=Oe.call(this._weekdaysParse,a))||-1!==(i=Oe.call(this._minWeekdaysParse,a))?i:null:-1!==(i=Oe.call(this._minWeekdaysParse,a))||-1!==(i=Oe.call(this._weekdaysParse,a))||-1!==(i=Oe.call(this._shortWeekdaysParse,a))?i:null}function tt(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],l=[];for(t=0;t<7;t++)n=c([2e3,1]).day(t),s=ue(this.weekdaysMin(n,"")),i=ue(this.weekdaysShort(n,"")),r=ue(this.weekdays(n,"")),a.push(s),o.push(i),u.push(r),l.push(s),l.push(i),l.push(r);a.sort(e),o.sort(e),u.sort(e),l.sort(e),this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function nt(){return this.hours()%12||12}function st(e,t){C(e,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)}))}function it(e,t){return t._meridiemParse}C("H",["HH",2],0,"hour"),C("h",["hh",2],0,nt),C("k",["kk",2],0,(function(){return this.hours()||24})),C("hmm",0,0,(function(){return""+nt.apply(this)+x(this.minutes(),2)})),C("hmmss",0,0,(function(){return""+nt.apply(this)+x(this.minutes(),2)+x(this.seconds(),2)})),C("Hmm",0,0,(function(){return""+this.hours()+x(this.minutes(),2)})),C("Hmmss",0,0,(function(){return""+this.hours()+x(this.minutes(),2)+x(this.seconds(),2)})),st("a",!0),st("A",!1),ae("a",it),ae("A",it),ae("H",q,re),ae("h",q,ie),ae("k",q,ie),ae("HH",q,j),ae("hh",q,j),ae("kk",q,j),ae("hmm",$),ae("hmmss",B),ae("Hmm",$),ae("Hmmss",B),ce(["H","HH"],pe),ce(["k","kk"],(function(e,t,n){var s=de(e);t[pe]=24===s?0:s})),ce(["a","A"],(function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e})),ce(["h","hh"],(function(e,t,n){t[pe]=de(e),f(n).bigHour=!0})),ce("hmm",(function(e,t,n){var s=e.length-2;t[pe]=de(e.substr(0,s)),t[ve]=de(e.substr(s)),f(n).bigHour=!0})),ce("hmmss",(function(e,t,n){var s=e.length-4,i=e.length-2;t[pe]=de(e.substr(0,s)),t[ve]=de(e.substr(s,2)),t[ke]=de(e.substr(i)),f(n).bigHour=!0})),ce("Hmm",(function(e,t,n){var s=e.length-2;t[pe]=de(e.substr(0,s)),t[ve]=de(e.substr(s))})),ce("Hmmss",(function(e,t,n){var s=e.length-4,i=e.length-2;t[pe]=de(e.substr(0,s)),t[ve]=de(e.substr(s,2)),t[ke]=de(e.substr(i))}));var rt=Te("Hours",!0);var at,ot={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Pe,monthsShort:Re,week:{dow:0,doy:6},weekdays:$e,weekdaysMin:Je,weekdaysShort:Be,meridiemParse:/[ap]\.?m?\.?/i},ut={},lt={};function dt(e,t){var n,s=Math.min(e.length,t.length);for(n=0;n0;){if(s=ct(i.slice(0,t).join("-")))return s;if(n&&n.length>=t&&dt(i,n)>=t-1)break;t--}r++}return at}(e)}function yt(e){var t,n=e._a;return n&&-2===f(e).overflow&&(t=n[ge]<0||n[ge]>11?ge:n[we]<1||n[we]>We(n[ye],n[ge])?we:n[pe]<0||n[pe]>24||24===n[pe]&&(0!==n[ve]||0!==n[ke]||0!==n[Me])?pe:n[ve]<0||n[ve]>59?ve:n[ke]<0||n[ke]>59?ke:n[Me]<0||n[Me]>999?Me:-1,f(e)._overflowDayOfYear&&(twe)&&(t=we),f(e)._overflowWeeks&&-1===t&&(t=De),f(e)._overflowWeekday&&-1===t&&(t=Ye),f(e).overflow=t),e}var gt=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,wt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,pt=/Z|[+-]\d\d(?::?\d\d)?/,vt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],kt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Mt=/^\/?Date\((-?\d+)/i,Dt=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Yt={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function St(e){var t,n,s,i,r,a,o=e._i,u=gt.exec(o)||wt.exec(o),l=vt.length,d=kt.length;if(u){for(f(e).iso=!0,t=0,n=l;t7)&&(u=!0)):(r=e._locale._week.dow,a=e._locale._week.doy,l=Ze(Rt(),r,a),n=Tt(t.gg,e._a[ye],l.year),s=Tt(t.w,l.week),null!=t.d?((i=t.d)<0||i>6)&&(u=!0):null!=t.e?(i=t.e+r,(t.e<0||t.e>6)&&(u=!0)):i=r);s<1||s>ze(n,r,a)?f(e)._overflowWeeks=!0:null!=u?f(e)._overflowWeekday=!0:(o=Ie(n,s,i,r,a),e._a[ye]=o.year,e._dayOfYear=o.dayOfYear)}(e),null!=e._dayOfYear&&(a=Tt(e._a[ye],i[ye]),(e._dayOfYear>Se(a)||0===e._dayOfYear)&&(f(e)._overflowDayOfYear=!0),s=Ae(a,0,e._dayOfYear),e._a[ge]=s.getUTCMonth(),e._a[we]=s.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=o[t]=i[t];for(;t<7;t++)e._a[t]=o[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[pe]&&0===e._a[ve]&&0===e._a[ke]&&0===e._a[Me]&&(e._nextDay=!0,e._a[pe]=0),e._d=(e._useUTC?Ae:Ee).apply(null,o),r=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[pe]=24),e._w&&void 0!==e._w.d&&e._w.d!==r&&(f(e).weekdayMismatch=!0)}}function Nt(e){if(e._f!==n.ISO_8601)if(e._f!==n.RFC_2822){e._a=[],f(e).empty=!0;var t,s,i,r,a,o,u,l=""+e._i,d=l.length,h=0;for(u=(i=H(e._f,e._locale).match(N)||[]).length,t=0;t0&&f(e).unusedInput.push(a),l=l.slice(l.indexOf(s)+s.length),h+=s.length),R[r]?(s?f(e).empty=!1:f(e).unusedTokens.push(r),me(r,s,e)):e._strict&&!s&&f(e).unusedTokens.push(r);f(e).charsLeftOver=d-h,l.length>0&&f(e).unusedInput.push(l),e._a[pe]<=12&&!0===f(e).bigHour&&e._a[pe]>0&&(f(e).bigHour=void 0),f(e).parsedDateParts=e._a.slice(0),f(e).meridiem=e._meridiem,e._a[pe]=function(e,t,n){var s;if(null==n)return t;return null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((s=e.isPM(n))&&t<12&&(t+=12),s||12!==t||(t=0),t):t}(e._locale,e._a[pe],e._meridiem),null!==(o=f(e).era)&&(e._a[ye]=e._locale.erasConvertYear(o,e._a[ye])),xt(e),yt(e)}else bt(e);else St(e)}function Wt(e){var t=e._i,r=e._f;return e._locale=e._locale||_t(e._l),null===t||void 0===r&&""===t?_({nullInput:!0}):("string"==typeof t&&(e._i=t=e._locale.preparse(t)),v(t)?new p(yt(t)):(l(t)?e._d=t:s(r)?function(e){var t,n,s,i,r,a,o=!1,u=e._f.length;if(0===u)return f(e).invalidFormat=!0,void(e._d=new Date(NaN));for(i=0;ithis?this:e:_()}));function Ht(e,t){var n,i;if(1===t.length&&s(t[0])&&(t=t[0]),!t.length)return Rt();for(n=t[0],i=1;i=0?new Date(e+400,t,n)-cn:new Date(e,t,n).valueOf()}function _n(e,t,n){return e<100&&e>=0?Date.UTC(e+400,t,n)-cn:Date.UTC(e,t,n)}function yn(e,t){return t.erasAbbrRegex(e)}function gn(){var e,t,n,s,i,r=[],a=[],o=[],u=[],l=this.eras();for(e=0,t=l.length;e(r=ze(e,s,i))&&(t=r),vn.call(this,e,t,n,s,i))}function vn(e,t,n,s,i){var r=Ie(e,t,n,s,i),a=Ae(r.year,0,r.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}C("N",0,0,"eraAbbr"),C("NN",0,0,"eraAbbr"),C("NNN",0,0,"eraAbbr"),C("NNNN",0,0,"eraName"),C("NNNNN",0,0,"eraNarrow"),C("y",["y",1],"yo","eraYear"),C("y",["yy",2],0,"eraYear"),C("y",["yyy",3],0,"eraYear"),C("y",["yyyy",4],0,"eraYear"),ae("N",yn),ae("NN",yn),ae("NNN",yn),ae("NNNN",(function(e,t){return t.erasNameRegex(e)})),ae("NNNNN",(function(e,t){return t.erasNarrowRegex(e)})),ce(["N","NN","NNN","NNNN","NNNNN"],(function(e,t,n,s){var i=n._locale.erasParse(e,s,n._strict);i?f(n).era=i:f(n).invalidEra=e})),ae("y",K),ae("yy",K),ae("yyy",K),ae("yyyy",K),ae("yo",(function(e,t){return t._eraYearOrdinalRegex||K})),ce(["y","yy","yyy","yyyy"],ye),ce(["yo"],(function(e,t,n,s){var i;n._locale._eraYearOrdinalRegex&&(i=e.match(n._locale._eraYearOrdinalRegex)),n._locale.eraYearOrdinalParse?t[ye]=n._locale.eraYearOrdinalParse(e,i):t[ye]=parseInt(e,10)})),C(0,["gg",2],0,(function(){return this.weekYear()%100})),C(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),wn("gggg","weekYear"),wn("ggggg","weekYear"),wn("GGGG","isoWeekYear"),wn("GGGGG","isoWeekYear"),ae("G",ee),ae("g",ee),ae("GG",q,j),ae("gg",q,j),ae("GGGG",Q,Z),ae("gggg",Q,Z),ae("GGGGG",X,z),ae("ggggg",X,z),fe(["gggg","ggggg","GGGG","GGGGG"],(function(e,t,n,s){t[s.substr(0,2)]=de(e)})),fe(["gg","GG"],(function(e,t,s,i){t[i]=n.parseTwoDigitYear(e)})),C("Q",0,"Qo","quarter"),ae("Q",A),ce("Q",(function(e,t){t[ge]=3*(de(e)-1)})),C("D",["DD",2],"Do","date"),ae("D",q,ie),ae("DD",q,j),ae("Do",(function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient})),ce(["D","DD"],we),ce("Do",(function(e,t){t[we]=de(e.match(q)[0])}));var kn=Te("Date",!0);C("DDD",["DDDD",3],"DDDo","dayOfYear"),ae("DDD",J),ae("DDDD",I),ce(["DDD","DDDD"],(function(e,t,n){n._dayOfYear=de(e)})),C("m",["mm",2],0,"minute"),ae("m",q,re),ae("mm",q,j),ce(["m","mm"],ve);var Mn=Te("Minutes",!1);C("s",["ss",2],0,"second"),ae("s",q,re),ae("ss",q,j),ce(["s","ss"],ke);var Dn,Yn,Sn=Te("Seconds",!1);for(C("S",0,0,(function(){return~~(this.millisecond()/100)})),C(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),C(0,["SSS",3],0,"millisecond"),C(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),C(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),C(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),C(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),C(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),C(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),ae("S",J,A),ae("SS",J,j),ae("SSS",J,I),Dn="SSSS";Dn.length<=9;Dn+="S")ae(Dn,K);function On(e,t){t[Me]=de(1e3*("0."+e))}for(Dn="S";Dn.length<=9;Dn+="S")ce(Dn,On);Yn=Te("Milliseconds",!1),C("z",0,0,"zoneAbbr"),C("zz",0,0,"zoneName");var bn=p.prototype;function Tn(e){return e}bn.add=en,bn.calendar=function(e,t){1===arguments.length&&(arguments[0]?sn(arguments[0])?(e=arguments[0],t=void 0):function(e){var t,n=i(e)&&!a(e),s=!1,o=["sameDay","nextDay","lastDay","nextWeek","lastWeek","sameElse"];for(t=0;tn.valueOf():n.valueOf()9999?U(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):O(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(n,"Z")):U(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},bn.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e,t,n,s="moment",i="";return this.isLocal()||(s=0===this.utcOffset()?"moment.utc":"moment.parseZone",i="Z"),e="["+s+'("]',t=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n=i+'[")]',this.format(e+t+"-MM-DD[T]HH:mm:ss.SSS"+n)},"undefined"!=typeof Symbol&&null!=Symbol.for&&(bn[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),bn.toJSON=function(){return this.isValid()?this.toISOString():null},bn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},bn.unix=function(){return Math.floor(this.valueOf()/1e3)},bn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},bn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},bn.eraName=function(){var e,t,n,s=this.localeData().eras();for(e=0,t=s.length;ethis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},bn.isLocal=function(){return!!this.isValid()&&!this._isUTC},bn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},bn.isUtc=zt,bn.isUTC=zt,bn.zoneAbbr=function(){return this._isUTC?"UTC":""},bn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},bn.dates=M("dates accessor is deprecated. Use date instead.",kn),bn.months=M("months accessor is deprecated. Use month instead",Ve),bn.years=M("years accessor is deprecated. Use year instead",be),bn.zone=M("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",(function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()})),bn.isDSTShifted=M("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",(function(){if(!o(this._isDSTShifted))return this._isDSTShifted;var e,t={};return w(t,this),(t=Wt(t))._a?(e=t._isUTC?c(t._a):Rt(t._a),this._isDSTShifted=this.isValid()&&function(e,t,n){var s,i=Math.min(e.length,t.length),r=Math.abs(e.length-t.length),a=0;for(s=0;s0):this._isDSTShifted=!1,this._isDSTShifted}));var xn=T.prototype;function Nn(e,t,n,s){var i=_t(),r=c().set(s,t);return i[n](r,e)}function Wn(e,t,n){if(u(e)&&(t=e,e=void 0),e=e||"",null!=t)return Nn(e,t,n,"month");var s,i=[];for(s=0;s<12;s++)i[s]=Nn(e,s,n,"month");return i}function Pn(e,t,n,s){"boolean"==typeof e?(u(t)&&(n=t,t=void 0),t=t||""):(n=t=e,e=!1,u(t)&&(n=t,t=void 0),t=t||"");var i,r=_t(),a=e?r._week.dow:0,o=[];if(null!=n)return Nn(t,(n+a)%7,s,"day");for(i=0;i<7;i++)o[i]=Nn(t,(i+a)%7,s,"day");return o}xn.calendar=function(e,t,n){var s=this._calendar[e]||this._calendar.sameElse;return O(s)?s.call(t,n):s},xn.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.match(N).map((function(e){return"MMMM"===e||"MM"===e||"DD"===e||"dddd"===e?e.slice(1):e})).join(""),this._longDateFormat[e])},xn.invalidDate=function(){return this._invalidDate},xn.ordinal=function(e){return this._ordinal.replace("%d",e)},xn.preparse=Tn,xn.postformat=Tn,xn.relativeTime=function(e,t,n,s){var i=this._relativeTime[n];return O(i)?i(e,t,n,s):i.replace(/%d/i,e)},xn.pastFuture=function(e,t){var n=this._relativeTime[e>0?"future":"past"];return O(n)?n(t):n.replace(/%s/i,t)},xn.set=function(e){var t,n;for(n in e)r(e,n)&&(O(t=e[n])?this[n]=t:this["_"+n]=t);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},xn.eras=function(e,t){var s,i,r,a=this._eras||_t("en")._eras;for(s=0,i=a.length;s=0)return u[s]},xn.erasConvertYear=function(e,t){var s=e.since<=e.until?1:-1;return void 0===t?n(e.since).year():n(e.since).year()+(t-e.offset)*s},xn.erasAbbrRegex=function(e){return r(this,"_erasAbbrRegex")||gn.call(this),e?this._erasAbbrRegex:this._erasRegex},xn.erasNameRegex=function(e){return r(this,"_erasNameRegex")||gn.call(this),e?this._erasNameRegex:this._erasRegex},xn.erasNarrowRegex=function(e){return r(this,"_erasNarrowRegex")||gn.call(this),e?this._erasNarrowRegex:this._erasRegex},xn.months=function(e,t){return e?s(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||Ce).test(t)?"format":"standalone"][e.month()]:s(this._months)?this._months:this._months.standalone},xn.monthsShort=function(e,t){return e?s(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[Ce.test(t)?"format":"standalone"][e.month()]:s(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},xn.monthsParse=function(e,t,n){var s,i,r;if(this._monthsParseExact)return Fe.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(i=c([2e3,s]),n&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[s]||(r="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[s]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[s].test(e))return s;if(n&&"MMM"===t&&this._shortMonthsParse[s].test(e))return s;if(!n&&this._monthsParse[s].test(e))return s}},xn.monthsRegex=function(e){return this._monthsParseExact?(r(this,"_monthsRegex")||Ge.call(this),e?this._monthsStrictRegex:this._monthsRegex):(r(this,"_monthsRegex")||(this._monthsRegex=He),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},xn.monthsShortRegex=function(e){return this._monthsParseExact?(r(this,"_monthsRegex")||Ge.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(r(this,"_monthsShortRegex")||(this._monthsShortRegex=Ue),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},xn.week=function(e){return Ze(e,this._week.dow,this._week.doy).week},xn.firstDayOfYear=function(){return this._week.doy},xn.firstDayOfWeek=function(){return this._week.dow},xn.weekdays=function(e,t){var n=s(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(t)?"format":"standalone"];return!0===e?qe(n,this._week.dow):e?n[e.day()]:n},xn.weekdaysMin=function(e){return!0===e?qe(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin},xn.weekdaysShort=function(e){return!0===e?qe(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort},xn.weekdaysParse=function(e,t,n){var s,i,r;if(this._weekdaysParseExact)return et.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(i=c([2e3,1]).day(s),n&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[s]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[s]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[s]||(r="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[s]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[s].test(e))return s;if(n&&"ddd"===t&&this._shortWeekdaysParse[s].test(e))return s;if(n&&"dd"===t&&this._minWeekdaysParse[s].test(e))return s;if(!n&&this._weekdaysParse[s].test(e))return s}},xn.weekdaysRegex=function(e){return this._weekdaysParseExact?(r(this,"_weekdaysRegex")||tt.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(r(this,"_weekdaysRegex")||(this._weekdaysRegex=Qe),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},xn.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(r(this,"_weekdaysRegex")||tt.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(r(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Xe),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},xn.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(r(this,"_weekdaysRegex")||tt.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(r(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Ke),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},xn.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},xn.meridiem=function(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"},ft("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===de(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),n.lang=M("moment.lang is deprecated. Use moment.locale instead.",ft),n.langData=M("moment.langData is deprecated. Use moment.localeData instead.",_t);var Rn=Math.abs;function Cn(e,t,n,s){var i=Bt(t,n);return e._milliseconds+=s*i._milliseconds,e._days+=s*i._days,e._months+=s*i._months,e._bubble()}function Un(e){return e<0?Math.floor(e):Math.ceil(e)}function Hn(e){return 4800*e/146097}function Fn(e){return 146097*e/4800}function Ln(e){return function(){return this.as(e)}}var Vn=Ln("ms"),Gn=Ln("s"),En=Ln("m"),An=Ln("h"),jn=Ln("d"),In=Ln("w"),Zn=Ln("M"),zn=Ln("Q"),qn=Ln("y"),$n=Vn;function Bn(e){return function(){return this.isValid()?this._data[e]:NaN}}var Jn=Bn("milliseconds"),Qn=Bn("seconds"),Xn=Bn("minutes"),Kn=Bn("hours"),es=Bn("days"),ts=Bn("months"),ns=Bn("years");var ss=Math.round,is={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function rs(e,t,n,s,i){return i.relativeTime(t||1,!!n,e,s)}var as=Math.abs;function os(e){return(e>0)-(e<0)||+e}function us(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n,s,i,r,a,o,u=as(this._milliseconds)/1e3,l=as(this._days),d=as(this._months),h=this.asSeconds();return h?(e=le(u/60),t=le(e/60),u%=60,e%=60,n=le(d/12),d%=12,s=u?u.toFixed(3).replace(/\.?0+$/,""):"",i=h<0?"-":"",r=os(this._months)!==os(h)?"-":"",a=os(this._days)!==os(h)?"-":"",o=os(this._milliseconds)!==os(h)?"-":"",i+"P"+(n?r+n+"Y":"")+(d?r+d+"M":"")+(l?a+l+"D":"")+(t||e||u?"T":"")+(t?o+t+"H":"")+(e?o+e+"M":"")+(u?o+s+"S":"")):"P0D"}var ls=Lt.prototype;return ls.isValid=function(){return this._isValid},ls.abs=function(){var e=this._data;return this._milliseconds=Rn(this._milliseconds),this._days=Rn(this._days),this._months=Rn(this._months),e.milliseconds=Rn(e.milliseconds),e.seconds=Rn(e.seconds),e.minutes=Rn(e.minutes),e.hours=Rn(e.hours),e.months=Rn(e.months),e.years=Rn(e.years),this},ls.add=function(e,t){return Cn(this,e,t,1)},ls.subtract=function(e,t){return Cn(this,e,t,-1)},ls.as=function(e){if(!this.isValid())return NaN;var t,n,s=this._milliseconds;if("month"===(e=L(e))||"quarter"===e||"year"===e)switch(t=this._days+s/864e5,n=this._months+Hn(t),e){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(t=this._days+Math.round(Fn(this._months)),e){case"week":return t/7+s/6048e5;case"day":return t+s/864e5;case"hour":return 24*t+s/36e5;case"minute":return 1440*t+s/6e4;case"second":return 86400*t+s/1e3;case"millisecond":return Math.floor(864e5*t)+s;default:throw new Error("Unknown unit "+e)}},ls.asMilliseconds=Vn,ls.asSeconds=Gn,ls.asMinutes=En,ls.asHours=An,ls.asDays=jn,ls.asWeeks=In,ls.asMonths=Zn,ls.asQuarters=zn,ls.asYears=qn,ls.valueOf=$n,ls._bubble=function(){var e,t,n,s,i,r=this._milliseconds,a=this._days,o=this._months,u=this._data;return r>=0&&a>=0&&o>=0||r<=0&&a<=0&&o<=0||(r+=864e5*Un(Fn(o)+a),a=0,o=0),u.milliseconds=r%1e3,e=le(r/1e3),u.seconds=e%60,t=le(e/60),u.minutes=t%60,n=le(t/60),u.hours=n%24,a+=le(n/24),o+=i=le(Hn(a)),a-=Un(Fn(i)),s=le(o/12),o%=12,u.days=a,u.months=o,u.years=s,this},ls.clone=function(){return Bt(this)},ls.get=function(e){return e=L(e),this.isValid()?this[e+"s"]():NaN},ls.milliseconds=Jn,ls.seconds=Qn,ls.minutes=Xn,ls.hours=Kn,ls.days=es,ls.weeks=function(){return le(this.days()/7)},ls.months=ts,ls.years=ns,ls.humanize=function(e,t){if(!this.isValid())return this.localeData().invalidDate();var n,s,i=!1,r=is;return"object"==typeof e&&(t=e,e=!1),"boolean"==typeof e&&(i=e),"object"==typeof t&&(r=Object.assign({},is,t),null!=t.s&&null==t.ss&&(r.ss=t.s-1)),s=function(e,t,n,s){var i=Bt(e).abs(),r=ss(i.as("s")),a=ss(i.as("m")),o=ss(i.as("h")),u=ss(i.as("d")),l=ss(i.as("M")),d=ss(i.as("w")),h=ss(i.as("y")),c=r<=n.ss&&["s",r]||r0,c[4]=s,rs.apply(null,c)}(this,!i,r,n=this.localeData()),i&&(s=n.pastFuture(+this,s)),n.postformat(s)},ls.toISOString=us,ls.toString=us,ls.toJSON=us,ls.locale=an,ls.localeData=un,ls.toIsoString=M("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",us),ls.lang=on,C("X",0,0,"unix"),C("x",0,0,"valueOf"),ae("x",ee),ae("X",/[+-]?\d+(\.\d{1,3})?/),ce("X",(function(e,t,n){n._d=new Date(1e3*parseFloat(e))})),ce("x",(function(e,t,n){n._d=new Date(de(e))})), +//! moment.js +n.version="2.30.1",e=Rt,n.fn=bn,n.min=function(){return Ht("isBefore",[].slice.call(arguments,0))},n.max=function(){return Ht("isAfter",[].slice.call(arguments,0))},n.now=function(){return Date.now?Date.now():+new Date},n.utc=c,n.unix=function(e){return Rt(1e3*e)},n.months=function(e,t){return Wn(e,t,"months")},n.isDate=l,n.locale=ft,n.invalid=_,n.duration=Bt,n.isMoment=v,n.weekdays=function(e,t,n){return Pn(e,t,n,"weekdays")},n.parseZone=function(){return Rt.apply(null,arguments).parseZone()},n.localeData=_t,n.isDuration=Vt,n.monthsShort=function(e,t){return Wn(e,t,"monthsShort")},n.weekdaysMin=function(e,t,n){return Pn(e,t,n,"weekdaysMin")},n.defineLocale=mt,n.updateLocale=function(e,t){if(null!=t){var n,s,i=ot;null!=ut[e]&&null!=ut[e].parentLocale?ut[e].set(b(ut[e]._config,t)):(null!=(s=ct(e))&&(i=s._config),t=b(i,t),null==s&&(t.abbr=e),(n=new T(t)).parentLocale=ut[e],ut[e]=n),ft(e)}else null!=ut[e]&&(null!=ut[e].parentLocale?(ut[e]=ut[e].parentLocale,e===ft()&&ft(e)):null!=ut[e]&&delete ut[e]);return ut[e]},n.locales=function(){return D(ut)},n.weekdaysShort=function(e,t,n){return Pn(e,t,n,"weekdaysShort")},n.normalizeUnits=L,n.relativeTimeRounding=function(e){return void 0===e?ss:"function"==typeof e&&(ss=e,!0)},n.relativeTimeThreshold=function(e,t){return void 0!==is[e]&&(void 0===t?is[e]:(is[e]=t,"s"===e&&(is.ss=t-1),!0))},n.calendarFormat=function(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},n.prototype=bn,n.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},n})); +//# sourceMappingURL=/sm/df3bdbeede915a91d38b35756be9d3dba4da2f1a8fbb6c745de8976ab57cfdf6.map \ No newline at end of file diff --git a/docs/security-vulnerability-runbook.md b/docs/security-vulnerability-runbook.md index 328e08b7d7..9935d5a8e7 100644 --- a/docs/security-vulnerability-runbook.md +++ b/docs/security-vulnerability-runbook.md @@ -37,8 +37,9 @@ is created these steps are followed: developed and the vulnerability is better understood at this point the description of the advisory should be fully filled out and be made ready to go to the public. This is also when the incident manager should determine the - number of versions of Wasmtime to patch. The latest two versions are - required, and older versions are optional. + number of versions of Wasmtime to patch. All [supported releases + documented](./stability-release.md) must be patched, but the incident manager + may also elect to patch more releases if desired. 5. **Request a CVE**. Use the Big Green Button on the advisory to request a CVE number from GitHub staff. diff --git a/docs/security-what-is-considered-a-security-vulnerability.md b/docs/security-what-is-considered-a-security-vulnerability.md index b89310e86d..bce52fc978 100644 --- a/docs/security-what-is-considered-a-security-vulnerability.md +++ b/docs/security-what-is-considered-a-security-vulnerability.md @@ -73,3 +73,6 @@ Note that we still want to fix every bug mentioned above even if it is not a security vulnerability! We appreciate when issues are filed for non-vulnerability bugs, particularly when they come with test cases and steps to reproduce! + +Backports for non-security related fixes is [documented +here](./contributing-release-process.html#releasing-a-patch-version). diff --git a/docs/stability-release.md b/docs/stability-release.md index 54add880b8..09ecae3b98 100644 --- a/docs/stability-release.md +++ b/docs/stability-release.md @@ -1,18 +1,51 @@ # Release Process -Wasmtime's release process was [originally designed in an RFC][rfc4] and this -page is intended to serve as documentation for the current process as-is today. +Wasmtime's release process was [originally designed in an RFC][rfc4] and later +amended with [an LTS process][rfc-lts] and this page is intended to serve as +documentation for the current process as-is today. + The high-level summary of Wasmtime's release process is: -* A new major version of Wasmtime will be made available once a month. -* Security bugs and correctness fixes will be backported to the latest two - releases of Wasmtime and issued as patch releases. +* A new major version of Wasmtime will be made available on the 20th of each + month. +* Each release that is a multiple of 12 is considered an LTS release and is + supported for 24 months. Other releases are supported for 2 months. +* Security bugs are guaranteed to be backported to all supported releases. +* Bug fixes are backported on a volunteer basis. + +[rfc-lts]: https://github.com/bytecodealliance/rfcs/pull/42 + +## Current Versions + +
    + +This is a table of supported, recent, and some upcoming releases of Wasmtime +along with the dates around their release process. Rows in **bold** are +actively supported at this time. + +| Version | LTS | Branch Date | Release Date | EOL Date | +|------------|-----|-------------|--------------|----------| + + + +In more visual form this is a gantt chart of the current release trains: + + + +
    + + +## New Versions Once a month Wasmtime will issue a new major version. This will be issued with a -semver-major version update, such as 4.0.0 to 5.0.0. The precise schedule of -Wasmtime's release is currently an automated PR is sent to bump the version on -the 5th of every month and a release is made when the PR is merged. The PR -typically gets merged within a few days. +semver-major version update, such as 4.0.0 to 5.0.0. Releases are created from +main with a new `release-X.0.0` git branch on the 5th of every month. The +release itself then happens on the 20th of the month, or shortly after if that +happens to fall on a weekend. Each major release of Wasmtime reserves the right to break both behavior and API backwards-compatibility. This is not expected to happen frequently, however, and @@ -28,18 +61,75 @@ any breaking change will follow these criteria: feedback about embeddings. Release notes will clearly indicate if any major breaking changes through accepted RFCs are included in a release. +All releases will have an accompanying `RELEASES.md` on the release branch +documenting major and minor changes made during development. Note that each +branch only contains the release notes for that branch, but links are provided +for older release notes. + +For maintainers, performing a release is [documented +here](./contributing-release-process.md#releasing-a-major-version). + +## Version Support + +Wasmtime major version releases are of one of two categories: + +* LTS release - this happens every 12 releases of Wasmtime and the version + number is always divisible by 12. LTS releases are supported for 24 months. + For example Wasmtime 24.0.0 is supported for 2 years. + +* Normal release - this is every release other than an LTS release. Normal + releases are supported for 2 months. For example Wasmtime 31.0.0 is supported + for 2 months. + +At any one time Wasmtime has two supported LTS releases and up to two supported +normal releases. Once a version of Wasmtime is release the project strives to +maintain binary/version compatibility with dependencies and such throughout the +lifetime of the release. For example the minimum supported version of Rust +required to compile a version of Wasmtime will not increase. Exceptions may be +made to LTS branches though if the versions of tooling to produce the LTS itself +have fallen out-of-date. For example if an LTS was originally produced with a +GitHub Actions runner that is no longer available then the oldest supported +image will be used instead. + +## Patch Versions + Patch releases of Wasmtime will only be issued for security and critical -correctness issues for on-by-default behavior in the previous releases. If -Wasmtime is currently at version 5.0.0 then 5.0.1 and 4.0.1 will be issued as -patch releases if a bug is found. Patch releases are guaranteed to maintain API -and behavior backwards-compatibility and are intended to be trivial for users to -upgrade to. +correctness issues for on-by-default behavior in supported releases. For example +if the current version is 39.0.0 then a security issue would issue a new release +for: + +* 39.0.x - the current release +* 38.0.x - the last release +* 36.0.x - the current LTS release +* 24.0.x - the last LTS release + +Patch releases are guaranteed to maintain API and behavior +backwards-compatibility and are intended to be trivial for users to upgrade to. + +The Wasmtime project guarantees backports and patch releases will be made for +any discovered security issue. Other bug fixes are done on a best-effort basis +in accordance with volunteers able to do the backports (see below). The Wasmtime +project does not support backporting new features to older releases, even if a +volunteer performs a backport for the project. Patch releases for Cranelift will be made for any miscompilations found by Cranelift, even those that Wasmtime itself may not exercise. Due to the current release process a patch release for Cranelift will issue a patch release for Wasmtime as well. +Patch releases do not have a set cadence and are done on an as-needed basis. For +maintainers, performing a patch release is [documented +here](./contributing-release-process.md#releasing-a-patch-version). + +## Security Fixes + +Security fixes will be issued as patch releases of Wasmtime. They follow the +same process as normal backports except that they're coordinated in private +prior to patch release day. + +For maintainers, performing a security release is [documented +here](./security-vulnerability-runbook.md). + ## What's released? At this time the release process of Wasmtime encompasses: diff --git a/docs/stability-tiers.md b/docs/stability-tiers.md index 870d9a70d4..6ce58074ec 100644 --- a/docs/stability-tiers.md +++ b/docs/stability-tiers.md @@ -111,6 +111,7 @@ For explanations of what each tier means see below. | WASI Proposal | [`wasi-threads`] | More CI, unstable proposal | | WASI Proposal | [`wasi-config`] | unstable proposal | | WASI Proposal | [`wasi-keyvalue`] | unstable proposal | +| WASI Proposal | [`wasi-tls`] | unstable proposal | | *misc* | Non-Wasmtime Cranelift usage [^1] | CI testing, full-time maintainer | | *misc* | DWARF debugging [^2] | CI testing, full-time maintainer, improved quality | @@ -118,6 +119,7 @@ For explanations of what each tier means see below. [`wasi-threads`]: https://github.com/WebAssembly/wasi-threads [`wasi-config`]: https://github.com/WebAssembly/wasi-config [`wasi-keyvalue`]: https://github.com/WebAssembly/wasi-keyvalue +[`wasi-tls`]: https://github.com/WebAssembly/wasi-tls [`gc`]: https://github.com/WebAssembly/gc [^1]: This is intended to encompass features that Cranelift supports as a diff --git a/examples/min-platform/embedding/src/lib.rs b/examples/min-platform/embedding/src/lib.rs index 2badc4c4c4..6f0481b421 100644 --- a/examples/min-platform/embedding/src/lib.rs +++ b/examples/min-platform/embedding/src/lib.rs @@ -5,6 +5,7 @@ extern crate alloc; use alloc::string::ToString; use anyhow::Result; +use core::ptr; use wasmtime::{Engine, Instance, Linker, Module, Store}; mod allocator; @@ -94,7 +95,11 @@ fn simple_host_fn(module: &[u8]) -> Result<()> { } fn deserialize(engine: &Engine, module: &[u8]) -> Result> { - match unsafe { Module::deserialize(engine, module) } { + // NOTE: deserialize_raw avoids creating a copy of the module code. See the + // safety notes before using in your embedding. + let memory_ptr = ptr::slice_from_raw_parts(module.as_ptr(), module.len()); + let module_memory = ptr::NonNull::new(memory_ptr.cast_mut()).unwrap(); + match unsafe { Module::deserialize_raw(engine, module_memory) } { Ok(module) => Ok(Some(module)), Err(e) => { // Currently if custom signals/virtual memory are disabled then this diff --git a/examples/mpk.rs b/examples/mpk.rs index 8b850d2edb..6607f04be2 100644 --- a/examples/mpk.rs +++ b/examples/mpk.rs @@ -120,7 +120,7 @@ struct Pool { impl Pool { /// Print a human-readable, tab-separated description of this structure. fn to_string(&self) -> String { - let human_size = ByteSize::b(self.mapped_bytes as u64).to_string_as(true); + let human_size = ByteSize::b(self.mapped_bytes as u64).display().si(); format!( "{} memory slots\t{} reserved", self.num_memories, human_size diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 3027e56f3f..c3c94c46ee 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -14,6 +14,7 @@ cargo-fuzz = true [dependencies] anyhow = { workspace = true } env_logger = { workspace = true } +cranelift-assembler-x64 = { workspace = true, features = ["fuzz"] } cranelift-codegen = { workspace = true, features = ["incremental-cache", "x86", "arm64", "s390x", "riscv64"] } cranelift-reader = { workspace = true } cranelift-filetests = { workspace = true } @@ -28,17 +29,16 @@ smallvec = { workspace = true } wasmparser = { workspace = true } wasmtime = { workspace = true, features = ["winch"] } wasmtime-fuzzing = { workspace = true } -component-test-util = { workspace = true } -component-fuzz-util = { workspace = true } +wasmtime-test-util = { workspace = true } log = { workspace = true } [build-dependencies] anyhow = { workspace = true } -proc-macro2 = "1.0" +proc-macro2 = { workspace = true } arbitrary = { workspace = true, features = ["derive"] } rand = { version = "0.8.0" } -quote = "1.0" -component-fuzz-util = { workspace = true } +quote = { workspace = true } +wasmtime-test-util = { workspace = true, features = ['component-fuzz'] } [features] default = ['fuzz-spec-interpreter'] @@ -57,12 +57,6 @@ path = "fuzz_targets/instantiate.rs" test = false doc = false -[[bin]] -name = "api_calls" -path = "fuzz_targets/api_calls.rs" -test = false -doc = false - [[bin]] name = "differential" path = "fuzz_targets/differential.rs" @@ -75,18 +69,6 @@ path = "fuzz_targets/wast_tests.rs" test = false doc = false -[[bin]] -name = "table_ops" -path = "fuzz_targets/table_ops.rs" -test = false -doc = false - -[[bin]] -name = "stacks" -path = "fuzz_targets/stacks.rs" -test = false -doc = false - [[bin]] name = "cranelift-fuzzgen" path = "fuzz_targets/cranelift-fuzzgen.rs" @@ -118,22 +100,8 @@ test = false doc = false [[bin]] -name = "memory_accesses" -path = "fuzz_targets/memory_accesses.rs" -test = false -doc = false -bench = false - -[[bin]] -name = "pulley" -path = "fuzz_targets/pulley.rs" -test = false -doc = false -bench = false - -[[bin]] -name = "dominator_tree" -path = "fuzz_targets/dominator_tree.rs" +name = "misc" +path = "fuzz_targets/misc.rs" test = false doc = false bench = false diff --git a/fuzz/build.rs b/fuzz/build.rs index f6f282a6f5..a3cd8b6b1d 100644 --- a/fuzz/build.rs +++ b/fuzz/build.rs @@ -7,7 +7,6 @@ fn main() -> anyhow::Result<()> { mod component { use anyhow::{anyhow, Context, Error, Result}; use arbitrary::Unstructured; - use component_fuzz_util::{Declarations, TestCase, Type, MAX_TYPE_DEPTH}; use proc_macro2::TokenStream; use quote::quote; use rand::rngs::StdRng; @@ -18,6 +17,7 @@ mod component { use std::iter; use std::path::PathBuf; use std::process::Command; + use wasmtime_test_util::component_fuzz::{Declarations, TestCase, Type, MAX_TYPE_DEPTH}; pub fn generate_static_api_tests() -> Result<()> { println!("cargo:rerun-if-changed=build.rs"); @@ -73,7 +73,8 @@ mod component { ret })?; - let name = component_fuzz_util::rust_type(&ty, name_counter, &mut declarations); + let name = + wasmtime_test_util::component_fuzz::rust_type(&ty, name_counter, &mut declarations); types.push((name, ty)); } @@ -140,8 +141,8 @@ mod component { #[allow(unused_imports)] fn static_component_api_target(input: &mut libfuzzer_sys::arbitrary::Unstructured) -> libfuzzer_sys::arbitrary::Result<()> { use anyhow::Result; - use component_fuzz_util::Declarations; - use component_test_util::{self, Float32, Float64}; + use wasmtime_test_util::component_fuzz::Declarations; + use wasmtime_test_util::component::{Float32, Float64}; use libfuzzer_sys::arbitrary::{self, Arbitrary}; use std::borrow::Cow; use std::sync::{Arc, Once}; diff --git a/fuzz/fuzz_targets/api_calls.rs b/fuzz/fuzz_targets/api_calls.rs deleted file mode 100644 index 75f967afc0..0000000000 --- a/fuzz/fuzz_targets/api_calls.rs +++ /dev/null @@ -1,8 +0,0 @@ -#![no_main] - -use libfuzzer_sys::fuzz_target; -use wasmtime_fuzzing::{generators::api::ApiCalls, oracles}; - -fuzz_target!(|api: ApiCalls| { - oracles::make_api_calls(api); -}); diff --git a/fuzz/fuzz_targets/cranelift-icache.rs b/fuzz/fuzz_targets/cranelift-icache.rs index 044a89d311..ccaf78d3e3 100644 --- a/fuzz/fuzz_targets/cranelift-icache.rs +++ b/fuzz/fuzz_targets/cranelift-icache.rs @@ -43,6 +43,8 @@ pub struct FunctionWithIsa { impl FunctionWithIsa { pub fn generate(u: &mut Unstructured) -> anyhow::Result { + let _ = env_logger::try_init(); + // We filter out targets that aren't supported in the current build // configuration after randomly choosing one, instead of randomly choosing // a supported one, so that the same fuzz input works across different build diff --git a/fuzz/fuzz_targets/differential.rs b/fuzz/fuzz_targets/differential.rs index e0f675e035..5f411e375c 100644 --- a/fuzz/fuzz_targets/differential.rs +++ b/fuzz/fuzz_targets/differential.rs @@ -1,6 +1,6 @@ #![no_main] -use libfuzzer_sys::arbitrary::{Result, Unstructured}; +use libfuzzer_sys::arbitrary::{self, Result, Unstructured}; use libfuzzer_sys::fuzz_target; use std::sync::atomic::AtomicUsize; use std::sync::atomic::Ordering::SeqCst; @@ -80,12 +80,15 @@ fn execute_one(data: &[u8]) -> Result<()> { return Ok(()); } }; + + log::trace!("Building LHS engine"); let mut lhs = match engine::build(&mut u, lhs, &mut config)? { Some(engine) => engine, // The chosen engine does not have support compiled into the fuzzer, // discard this test case. None => return Ok(()), }; + log::debug!("lhs engine: {}", lhs.name()); // Using the now-legalized module configuration generate the Wasm module; // this is specified by either the ALLOWED_MODULES environment variable or a @@ -118,11 +121,11 @@ fn execute_one(data: &[u8]) -> Result<()> { log_wasm(&wasm); // Instantiate the generated wasm file in the chosen differential engine. - log::debug!("lhs engine: {}", lhs.name()); let lhs_instance = lhs.instantiate(&wasm); STATS.bump_engine(lhs.name()); // Always use Wasmtime as the second engine to instantiate within. + log::debug!("Building RHS Wasmtime"); let rhs_store = config.to_store(); let rhs_module = wasmtime::Module::new(rhs_store.engine(), &wasm).unwrap(); let rhs_instance = WasmtimeInstance::new(rhs_store, rhs_module); @@ -141,14 +144,38 @@ fn execute_one(data: &[u8]) -> Result<()> { 'outer: for (name, signature) in rhs_instance.exported_functions() { let mut invocations = 0; loop { - let arguments = signature + let arguments = match signature .params() - .map(|t| DiffValue::arbitrary_of_type(&mut u, t.try_into().unwrap())) - .collect::>>()?; - let result_tys = signature + .map(|ty| { + let ty = ty + .try_into() + .map_err(|_| arbitrary::Error::IncorrectFormat)?; + DiffValue::arbitrary_of_type(&mut u, ty) + }) + .collect::>>() + { + Ok(args) => args, + // This function signature isn't compatible with differential + // fuzzing yet, try the next exported function in the meantime. + Err(_) => continue 'outer, + }; + + let result_tys = match signature .results() - .map(|t| DiffValueType::try_from(t).unwrap()) - .collect::>(); + .map(|ty| { + let ty: wasmtime::ValType = ty + .try_into() + .map_err(|_| arbitrary::Error::IncorrectFormat)?; + DiffValueType::try_from(ty).map_err(|_| arbitrary::Error::IncorrectFormat) + }) + .collect::>>() + { + Ok(tys) => tys, + // This function signature isn't compatible with differential + // fuzzing yet, try the next exported function in the meantime. + Err(_) => continue 'outer, + }; + let ok = differential( lhs_instance.as_mut(), lhs.as_ref(), diff --git a/fuzz/fuzz_targets/dominator_tree.rs b/fuzz/fuzz_targets/dominator_tree.rs deleted file mode 100644 index e9e78a52f2..0000000000 --- a/fuzz/fuzz_targets/dominator_tree.rs +++ /dev/null @@ -1,105 +0,0 @@ -#![no_main] - -use libfuzzer_sys::{ - arbitrary::{self, Arbitrary, Unstructured}, - fuzz_target, -}; - -use std::collections::HashMap; - -use cranelift_codegen::cursor::{Cursor, FuncCursor}; -use cranelift_codegen::dominator_tree::{DominatorTree, SimpleDominatorTree}; -use cranelift_codegen::flowgraph::ControlFlowGraph; -use cranelift_codegen::ir::{ - types::I32, Block, BlockCall, Function, InstBuilder, JumpTableData, Value, -}; - -const MAX_BLOCKS: u16 = 1 << 12; - -#[derive(Debug)] -struct ArbitraryFunction { - func: Function, -} - -fn build_func(data: &mut Unstructured<'_>) -> arbitrary::Result { - let mut func = Function::new(); - - let mut num_to_block = Vec::new(); - - let mut cfg = HashMap::>::new(); - - for edge in data.arbitrary_iter::<(u16, u16)>()? { - let (a, b) = edge?; - - let a = a % MAX_BLOCKS; - let b = b % MAX_BLOCKS; - - while a >= num_to_block.len() as u16 { - num_to_block.push(func.dfg.make_block()); - } - - let a = num_to_block[a as usize]; - - while b >= num_to_block.len() as u16 { - num_to_block.push(func.dfg.make_block()); - } - - let b = num_to_block[b as usize]; - - cfg.entry(a).or_default().push(b); - } - - let mut cursor = FuncCursor::new(&mut func); - - let mut v0: Option = None; - - for block in num_to_block { - cursor.insert_block(block); - - if v0.is_none() { - v0 = Some(cursor.ins().iconst(I32, 0)); - } - - if let Some(children) = cfg.get(&block) { - if children.len() == 1 { - cursor.ins().jump(children[0], &[]); - } else { - let block_calls = children - .iter() - .map(|&block| BlockCall::new(block, &[], &mut cursor.func.dfg.value_lists)) - .collect::>(); - - let data = JumpTableData::new(block_calls[0], &block_calls[1..]); - let jt = cursor.func.create_jump_table(data); - cursor.ins().br_table(v0.unwrap(), jt); - } - } else { - cursor.ins().return_(&[]); - } - } - - Ok(func) -} - -impl Arbitrary<'_> for ArbitraryFunction { - fn arbitrary(data: &mut Unstructured<'_>) -> arbitrary::Result { - Ok(Self { - func: build_func(data)?, - }) - } -} - -fuzz_target!(|func: ArbitraryFunction| { - let func = &func.func; - let cfg = ControlFlowGraph::with_function(&func); - let domtree = DominatorTree::with_function(&func, &cfg); - let expected_domtree = SimpleDominatorTree::with_function(&func, &cfg); - - for block in func.layout.blocks() { - let expected = expected_domtree.idom(block); - let got = domtree.idom(block); - if expected != got { - panic!("Expected dominator for {block} is {expected:?}, got {got:?}"); - } - } -}); diff --git a/fuzz/fuzz_targets/memory_accesses.rs b/fuzz/fuzz_targets/memory_accesses.rs deleted file mode 100644 index 1386a069b8..0000000000 --- a/fuzz/fuzz_targets/memory_accesses.rs +++ /dev/null @@ -1,8 +0,0 @@ -#![no_main] - -use libfuzzer_sys::fuzz_target; -use wasmtime_fuzzing::{generators::MemoryAccesses, oracles::memory::check_memory_accesses}; - -fuzz_target!(|input: MemoryAccesses| { - check_memory_accesses(input); -}); diff --git a/fuzz/fuzz_targets/misc.rs b/fuzz/fuzz_targets/misc.rs new file mode 100644 index 0000000000..f4fd1f3c88 --- /dev/null +++ b/fuzz/fuzz_targets/misc.rs @@ -0,0 +1,186 @@ +#![no_main] + +use libfuzzer_sys::arbitrary::{Arbitrary, Result, Unstructured}; +use libfuzzer_sys::fuzz_target; +use std::sync::OnceLock; + +// Helper macro which takes a static list of fuzzers as input which are then +// delegated to internally based on the fuzz target selected. +// +// In general this fuzz target will execute a number of fuzzers all with the +// same input. The `FUZZER` environment variable can be used to forcibly disable +// all but one. +macro_rules! run_fuzzers { + ($($fuzzer:ident)*) => { + static ENABLED: OnceLock = OnceLock::new(); + + fuzz_target!(|bytes: &[u8]| { + // Use the first byte of input as a discriminant of which fuzzer to + // select. + let Some((which_fuzzer, bytes)) = bytes.split_first() else { + return; + }; + + // Lazily initialize this fuzzer in terms of logging as well as + // enabled fuzzers via the `FUZZER` env var. This creates a bitmask + // inside of `ENABLED` of enabled fuzzers, returned here as + // `enabled`. + let enabled = *ENABLED.get_or_init(|| { + env_logger::init(); + let configured = std::env::var("FUZZER").ok(); + let configured = configured.as_deref(); + let mut enabled = 0; + let mut index = 0; + + $( + if configured.is_none() || configured == Some(stringify!($fuzzer)) { + enabled |= 1 << index; + } + index += 1; + )* + let _ = index; + + enabled + }); + + // Generate a linear check for each fuzzer. Only run each fuzzer if + // the fuzzer is enabled, and also only if the `which_fuzzer` + // discriminant matches the fuzzer being run. + // + // Note that it's a bit wonky here due to rust macros. + let mut index = 0; + $( + if enabled & (1 << index) != 0 && *which_fuzzer == index { + let _: Result<()> = $fuzzer(Unstructured::new(bytes)); + } + index += 1; + )* + let _ = index; + }); + }; +} + +run_fuzzers! { + pulley_roundtrip + assembler_roundtrip + memory_accesses + table_ops + stacks + api_calls + dominator_tree +} + +fn pulley_roundtrip(u: Unstructured<'_>) -> Result<()> { + pulley_interpreter_fuzz::roundtrip(Arbitrary::arbitrary_take_rest(u)?); + Ok(()) +} + +fn assembler_roundtrip(u: Unstructured<'_>) -> Result<()> { + use cranelift_assembler_x64::{fuzz, Inst}; + let inst: Inst = Arbitrary::arbitrary_take_rest(u)?; + fuzz::roundtrip(&inst); + Ok(()) +} + +fn memory_accesses(u: Unstructured<'_>) -> Result<()> { + wasmtime_fuzzing::oracles::memory::check_memory_accesses(Arbitrary::arbitrary_take_rest(u)?); + Ok(()) +} + +fn table_ops(u: Unstructured<'_>) -> Result<()> { + let (config, ops) = Arbitrary::arbitrary_take_rest(u)?; + let _ = wasmtime_fuzzing::oracles::table_ops(config, ops); + Ok(()) +} + +fn stacks(u: Unstructured<'_>) -> Result<()> { + wasmtime_fuzzing::oracles::check_stacks(Arbitrary::arbitrary_take_rest(u)?); + Ok(()) +} + +fn api_calls(u: Unstructured<'_>) -> Result<()> { + wasmtime_fuzzing::oracles::make_api_calls(Arbitrary::arbitrary_take_rest(u)?); + Ok(()) +} + +fn dominator_tree(mut data: Unstructured<'_>) -> Result<()> { + use cranelift_codegen::cursor::{Cursor, FuncCursor}; + use cranelift_codegen::dominator_tree::{DominatorTree, SimpleDominatorTree}; + use cranelift_codegen::flowgraph::ControlFlowGraph; + use cranelift_codegen::ir::{ + types::I32, Block, BlockCall, Function, InstBuilder, JumpTableData, Value, + }; + use std::collections::HashMap; + + const MAX_BLOCKS: u16 = 1 << 12; + + let mut func = Function::new(); + + let mut num_to_block = Vec::new(); + + let mut cfg = HashMap::>::new(); + + for edge in data.arbitrary_iter::<(u16, u16)>()? { + let (a, b) = edge?; + + let a = a % MAX_BLOCKS; + let b = b % MAX_BLOCKS; + + while a >= num_to_block.len() as u16 { + num_to_block.push(func.dfg.make_block()); + } + + let a = num_to_block[a as usize]; + + while b >= num_to_block.len() as u16 { + num_to_block.push(func.dfg.make_block()); + } + + let b = num_to_block[b as usize]; + + cfg.entry(a).or_default().push(b); + } + + let mut cursor = FuncCursor::new(&mut func); + + let mut v0: Option = None; + + for block in num_to_block { + cursor.insert_block(block); + + if v0.is_none() { + v0 = Some(cursor.ins().iconst(I32, 0)); + } + + if let Some(children) = cfg.get(&block) { + if children.len() == 1 { + cursor.ins().jump(children[0], &[]); + } else { + let block_calls = children + .iter() + .map(|&block| BlockCall::new(block, &[], &mut cursor.func.dfg.value_lists)) + .collect::>(); + + let data = JumpTableData::new(block_calls[0], &block_calls[1..]); + let jt = cursor.func.create_jump_table(data); + cursor.ins().br_table(v0.unwrap(), jt); + } + } else { + cursor.ins().return_(&[]); + } + } + + let cfg = ControlFlowGraph::with_function(&func); + let domtree = DominatorTree::with_function(&func, &cfg); + let expected_domtree = SimpleDominatorTree::with_function(&func, &cfg); + + for block in func.layout.blocks() { + let expected = expected_domtree.idom(block); + let got = domtree.idom(block); + if expected != got { + panic!("Expected dominator for {block} is {expected:?}, got {got:?}"); + } + } + + Ok(()) +} diff --git a/fuzz/fuzz_targets/pulley.rs b/fuzz/fuzz_targets/pulley.rs deleted file mode 100644 index 35b0349480..0000000000 --- a/fuzz/fuzz_targets/pulley.rs +++ /dev/null @@ -1,20 +0,0 @@ -#![no_main] - -use libfuzzer_sys::{arbitrary::*, fuzz_target}; -use pulley_interpreter_fuzz::roundtrip; - -fuzz_target!(|data| { - let _ = fuzz(data); -}); - -fn fuzz(data: &[u8]) -> Result<()> { - let _ = env_logger::try_init(); - - let mut u = Unstructured::new(data); - match u.int_in_range(0..=0)? { - 0 => roundtrip(Arbitrary::arbitrary_take_rest(u)?), - _ => unreachable!(), - } - - Ok(()) -} diff --git a/fuzz/fuzz_targets/stacks.rs b/fuzz/fuzz_targets/stacks.rs deleted file mode 100644 index 08504c795f..0000000000 --- a/fuzz/fuzz_targets/stacks.rs +++ /dev/null @@ -1,10 +0,0 @@ -//! Check that we see the stack trace correctly. - -#![no_main] - -use libfuzzer_sys::fuzz_target; -use wasmtime_fuzzing::{generators::Stacks, oracles::check_stacks}; - -fuzz_target!(|stacks: Stacks| { - check_stacks(stacks); -}); diff --git a/fuzz/fuzz_targets/table_ops.rs b/fuzz/fuzz_targets/table_ops.rs deleted file mode 100644 index 93c9cecce7..0000000000 --- a/fuzz/fuzz_targets/table_ops.rs +++ /dev/null @@ -1,9 +0,0 @@ -#![no_main] - -use libfuzzer_sys::fuzz_target; -use wasmtime_fuzzing::generators::{table_ops::TableOps, Config}; - -fuzz_target!(|pair: (Config, TableOps)| { - let (config, ops) = pair; - let _ = wasmtime_fuzzing::oracles::table_ops(config, ops); -}); diff --git a/pulley/Cargo.toml b/pulley/Cargo.toml index f3e5b1b7dc..6d828f5c35 100644 --- a/pulley/Cargo.toml +++ b/pulley/Cargo.toml @@ -21,10 +21,9 @@ anyhow = { workspace = true, optional = true } [dev-dependencies] env_logger = { workspace = true } -object = { workspace = true, features = ['std'] } anyhow = { workspace = true, features = ['std'] } clap = { workspace = true } -termcolor = "1.4.1" +termcolor = { workspace = true } [features] std = ['wasmtime-math?/std'] @@ -38,10 +37,6 @@ profile = ['std', 'dep:anyhow'] [package.metadata.docs.rs] all-features = true -[[example]] -name = "objdump" -required-features = ["disas"] - [[example]] name = "profiler-html" required-features = ["profile"] diff --git a/pulley/build.rs b/pulley/build.rs deleted file mode 100644 index 825e28d1e5..0000000000 --- a/pulley/build.rs +++ /dev/null @@ -1,25 +0,0 @@ -use std::process::Command; -use std::str; - -fn main() { - // Temporary check to see if the rustc version >= 1.84 in which case - // provenance-related pointer APIs are available. This is temporary because - // in the future the MSRV of this crate will be beyond 1.84 in which case - // this build script can be deleted. - let minor = rustc_minor_version().unwrap_or(0); - if minor >= 84 { - println!("cargo:rustc-cfg=has_provenance_apis"); - } - println!("cargo:rustc-check-cfg=cfg(has_provenance_apis)"); -} - -fn rustc_minor_version() -> Option { - let rustc = std::env::var("RUSTC").unwrap(); - let output = Command::new(rustc).arg("--version").output().ok()?; - let version = str::from_utf8(&output.stdout).ok()?; - let mut pieces = version.split('.'); - if pieces.next() != Some("rustc 1") { - return None; - } - pieces.next()?.parse().ok() -} diff --git a/pulley/examples/objdump.rs b/pulley/examples/objdump.rs deleted file mode 100644 index ad7b57b0dd..0000000000 --- a/pulley/examples/objdump.rs +++ /dev/null @@ -1,48 +0,0 @@ -//! Small helper utility to disassemble `*.cwasm` files produced by Wasmtime. -//! -//! Run with: -//! -//! cargo run --example objdump -F disas -p pulley-interpreter foo.cwasm - -use anyhow::{bail, Result}; -use object::{File, Object as _, ObjectSection, ObjectSymbol, SymbolKind}; -use pulley_interpreter::decode::Decoder; -use pulley_interpreter::disas::Disassembler; - -fn main() -> Result<()> { - let cwasm = std::fs::read(std::env::args().nth(1).unwrap())?; - - let image = File::parse(&cwasm[..])?; - - let text = match image.sections().find(|s| s.name().ok() == Some(".text")) { - Some(section) => section.data()?, - None => bail!("no text section"), - }; - - for sym in image.symbols() { - if !sym.is_definition() { - continue; - } - if sym.kind() != SymbolKind::Text { - continue; - } - let address = sym.address(); - let size = sym.size(); - if size == 0 { - continue; - } - - let name = sym.name()?; - let code = &text[address as usize..][..size as usize]; - - println!("{address:#08x}: <{name}>:"); - let mut disas = Disassembler::new(code); - disas.start_offset(address as usize); - let result = Decoder::decode_all(&mut disas); - println!("{}", disas.disas()); - if let Err(e) = result { - println!(" : error disassembling: {e:?}"); - } - } - Ok(()) -} diff --git a/pulley/src/decode.rs b/pulley/src/decode.rs index a0d880d27f..953fecd668 100644 --- a/pulley/src/decode.rs +++ b/pulley/src/decode.rs @@ -771,7 +771,7 @@ pub mod operands { ) => { $( #[allow(unused_variables, reason = "macro-generated")] - #[allow(missing_docs, reason = "macro-generated")] + #[expect(missing_docs, reason = "macro-generated")] pub fn $snake_name(pc: &mut T) -> Result<($($($field_ty,)*)?), T::Error> { Ok((($($((<$field_ty>::decode(pc))?,)*)?))) } diff --git a/pulley/src/interp.rs b/pulley/src/interp.rs index f5cf32d0b7..11f7ef4ef3 100644 --- a/pulley/src/interp.rs +++ b/pulley/src/interp.rs @@ -418,7 +418,7 @@ impl Default for XRegVal { } } -#[allow(missing_docs, reason = "self-describing methods")] +#[expect(missing_docs, reason = "self-describing methods")] impl XRegVal { pub fn new_i32(x: i32) -> Self { let mut val = XRegVal::default(); @@ -472,11 +472,7 @@ impl XRegVal { pub fn get_ptr(&self) -> *mut T { let ptr = unsafe { self.0.ptr }; - let ptr = usize::from_le(ptr); - #[cfg(has_provenance_apis)] - return core::ptr::with_exposed_provenance_mut(ptr); - #[cfg(not(has_provenance_apis))] - return ptr as *mut T; + core::ptr::with_exposed_provenance_mut(usize::from_le(ptr)) } pub fn set_i32(&mut self, x: i32) { @@ -496,11 +492,7 @@ impl XRegVal { } pub fn set_ptr(&mut self, ptr: *mut T) { - #[cfg(has_provenance_apis)] - let ptr = ptr.expose_provenance(); - #[cfg(not(has_provenance_apis))] - let ptr = ptr as usize; - self.0.ptr = ptr.to_le(); + self.0.ptr = ptr.expose_provenance().to_le(); } } @@ -537,7 +529,7 @@ impl Default for FRegVal { } } -#[allow(missing_docs, reason = "self-describing methods")] +#[expect(missing_docs, reason = "self-describing methods")] impl FRegVal { pub fn new_f32(f: f32) -> Self { let mut val = Self::default(); @@ -620,7 +612,7 @@ impl Default for VRegVal { } } -#[allow(missing_docs, reason = "self-describing methods")] +#[expect(missing_docs, reason = "self-describing methods")] impl VRegVal { pub fn new_u128(i: u128) -> Self { let mut val = Self::default(); @@ -934,7 +926,7 @@ mod done { } /// Stored within `DoneReason::Trap`. - #[allow(missing_docs, reason = "self-describing variants")] + #[expect(missing_docs, reason = "self-describing variants")] pub enum TrapKind { DivideByZero, IntegerOverflow, @@ -1317,16 +1309,14 @@ impl OpVisitor for Interpreter<'_> { fn call(&mut self, offset: PcRelOffset) -> ControlFlow { let return_addr = self.pc.as_ptr(); self.state.lr = return_addr.as_ptr(); - self.pc_rel_jump::(offset); - ControlFlow::Continue(()) + self.pc_rel_jump::(offset) } fn call1(&mut self, arg1: XReg, offset: PcRelOffset) -> ControlFlow { let return_addr = self.pc.as_ptr(); self.state.lr = return_addr.as_ptr(); self.state[XReg::x0] = self.state[arg1]; - self.pc_rel_jump::(offset); - ControlFlow::Continue(()) + self.pc_rel_jump::(offset) } fn call2(&mut self, arg1: XReg, arg2: XReg, offset: PcRelOffset) -> ControlFlow { @@ -1335,8 +1325,7 @@ impl OpVisitor for Interpreter<'_> { let (x0, x1) = (self.state[arg1], self.state[arg2]); self.state[XReg::x0] = x0; self.state[XReg::x1] = x1; - self.pc_rel_jump::(offset); - ControlFlow::Continue(()) + self.pc_rel_jump::(offset) } fn call3( @@ -1352,8 +1341,7 @@ impl OpVisitor for Interpreter<'_> { self.state[XReg::x0] = x0; self.state[XReg::x1] = x1; self.state[XReg::x2] = x2; - self.pc_rel_jump::(offset); - ControlFlow::Continue(()) + self.pc_rel_jump::(offset) } fn call4( @@ -1376,8 +1364,7 @@ impl OpVisitor for Interpreter<'_> { self.state[XReg::x1] = x1; self.state[XReg::x2] = x2; self.state[XReg::x3] = x3; - self.pc_rel_jump::(offset); - ControlFlow::Continue(()) + self.pc_rel_jump::(offset) } fn call_indirect(&mut self, dst: XReg) -> ControlFlow { @@ -1393,8 +1380,7 @@ impl OpVisitor for Interpreter<'_> { } fn jump(&mut self, offset: PcRelOffset) -> ControlFlow { - self.pc_rel_jump::(offset); - ControlFlow::Continue(()) + self.pc_rel_jump::(offset) } fn xjump(&mut self, reg: XReg) -> ControlFlow { diff --git a/pulley/src/op.rs b/pulley/src/op.rs index 62a0956106..73d08cd4aa 100644 --- a/pulley/src/op.rs +++ b/pulley/src/op.rs @@ -36,7 +36,7 @@ macro_rules! define_op { $( // TODO: add doc comments to all fields and update all // the macros to match them. - #[allow(missing_docs, reason = "macro-generated code")] + #[expect(missing_docs, reason = "macro-generated code")] pub $field : $field_ty, )* )? } @@ -86,7 +86,7 @@ macro_rules! define_extended_op { $( // TODO: add doc comments to all fields and update all // the macros to match them. - #[allow(missing_docs, reason = "macro-generated code")] + #[expect(missing_docs, reason = "macro-generated code")] pub $field : $field_ty, )* )? } diff --git a/pulley/src/regs.rs b/pulley/src/regs.rs index 0beeec257e..378eed230b 100644 --- a/pulley/src/regs.rs +++ b/pulley/src/regs.rs @@ -65,7 +65,7 @@ macro_rules! impl_reg { #[repr(u8)] #[derive(Debug,Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] #[expect(non_camel_case_types, reason = "matching in-asm register names")] #[rustfmt::skip] pub enum XReg { @@ -108,7 +108,7 @@ fn assert_special_start_is_right() { #[repr(u8)] #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] #[expect(non_camel_case_types, reason = "matching in-asm register names")] #[rustfmt::skip] pub enum FReg { @@ -122,7 +122,7 @@ pub enum FReg { #[repr(u8)] #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] #[expect(non_camel_case_types, reason = "matching in-asm register names")] #[rustfmt::skip] pub enum VReg { @@ -140,7 +140,7 @@ impl_reg!(VReg, V, 0..32); /// /// Never appears inside an instruction -- instructions always name a particular /// class of register -- but this is useful for testing and things like that. -#[allow(missing_docs, reason = "self-describing variants")] +#[expect(missing_docs, reason = "self-describing variants")] #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))] pub enum AnyReg { diff --git a/scripts/publish.rs b/scripts/publish.rs index eb13bd3b75..402446a61b 100644 --- a/scripts/publish.rs +++ b/scripts/publish.rs @@ -22,6 +22,7 @@ const CRATES_TO_PUBLISH: &[&str] = &[ "wasmtime-math", "pulley-interpreter", // cranelift + "cranelift-srcgen", "cranelift-assembler-x64-meta", "cranelift-assembler-x64", "cranelift-isle", @@ -74,6 +75,7 @@ const CRATES_TO_PUBLISH: &[&str] = &[ "wasmtime-wasi-config", "wasmtime-wasi-keyvalue", "wasmtime-wasi-threads", + "wasmtime-wasi-tls", "wasmtime-wast", "wasmtime-c-api-macros", "wasmtime-c-api-impl", @@ -87,19 +89,21 @@ const CRATES_TO_PUBLISH: &[&str] = &[ // releases since everything not mentioned here is just an organizational detail // that no one else should rely on. const PUBLIC_CRATES: &[&str] = &[ - // these are actually public crates which we cannot break the API of in + // These are actually public crates which we cannot break the API of in // patch releases. "wasmtime", "wasmtime-wasi-io", "wasmtime-wasi", + "wasmtime-wasi-tls", "wasmtime-wasi-http", "wasmtime-wasi-nn", "wasmtime-wasi-config", "wasmtime-wasi-keyvalue", "wasmtime-wasi-threads", "wasmtime-cli", - // all cranelift crates are considered "public" in that they can't - // have breaking API changes in patch releases + // All cranelift crates are considered "public" in that they can't have + // breaking API changes in patch releases. + "cranelift-srcgen", "cranelift-assembler-x64-meta", "cranelift-assembler-x64", "cranelift-entity", diff --git a/src/bin/wasmtime.rs b/src/bin/wasmtime.rs index ba3c1fb771..ecafff3aa5 100644 --- a/src/bin/wasmtime.rs +++ b/src/bin/wasmtime.rs @@ -85,6 +85,10 @@ enum Subcommand { /// Generate shell completions for the `wasmtime` CLI #[cfg(feature = "completion")] Completion(CompletionCommand), + + /// Inspect `*.cwasm` files output from Wasmtime + #[cfg(feature = "objdump")] + Objdump(wasmtime_cli::commands::ObjdumpCommand), } impl Wasmtime { @@ -119,6 +123,9 @@ impl Wasmtime { #[cfg(feature = "completion")] Subcommand::Completion(c) => c.execute(), + + #[cfg(feature = "objdump")] + Subcommand::Objdump(c) => c.execute(), } } } diff --git a/src/commands.rs b/src/commands.rs index bd498d1734..04fd0286ba 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -34,3 +34,8 @@ pub use self::compile::*; mod settings; #[cfg(feature = "cranelift")] pub use self::settings::*; + +#[cfg(feature = "objdump")] +mod objdump; +#[cfg(feature = "objdump")] +pub use self::objdump::*; diff --git a/src/commands/compile.rs b/src/commands/compile.rs index f635e51597..d9c3a30436 100644 --- a/src/commands/compile.rs +++ b/src/commands/compile.rs @@ -32,7 +32,7 @@ const AFTER_HELP: &str = )] pub struct CompileCommand { #[command(flatten)] - #[allow(missing_docs, reason = "don't want to mess with clap doc-strings")] + #[expect(missing_docs, reason = "don't want to mess with clap doc-strings")] pub common: CommonOptions, /// The path of the output compiled module; defaults to `.cwasm` diff --git a/src/commands/objdump.rs b/src/commands/objdump.rs new file mode 100644 index 0000000000..f936d25657 --- /dev/null +++ b/src/commands/objdump.rs @@ -0,0 +1,558 @@ +//! Implementation of the `wasmtime objdump` CLI command. + +use anyhow::{bail, Context, Result}; +use capstone::InsnGroupType::{CS_GRP_JUMP, CS_GRP_RET}; +use clap::Parser; +use cranelift_codegen::isa::lookup_by_name; +use cranelift_codegen::settings::Flags; +use object::read::elf::ElfFile64; +use object::{Architecture, Endianness, FileFlags, Object, ObjectSection, ObjectSymbol}; +use pulley_interpreter::decode::{Decoder, DecodingError, OpVisitor}; +use pulley_interpreter::disas::Disassembler; +use std::io::{IsTerminal, Read, Write}; +use std::iter::{self, Peekable}; +use std::path::{Path, PathBuf}; +use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor}; +use wasmtime::Engine; +use wasmtime_environ::{obj, FilePos, StackMap, Trap}; + +/// A helper utility in wasmtime to explore the compiled object file format of +/// a `*.cwasm` file. +#[derive(Parser)] +pub struct ObjdumpCommand { + /// The path to a compiled `*.cwasm` file. + /// + /// If this is `-` or not provided then stdin is used as input. + cwasm: Option, + + /// Whether or not to display function/instruction addresses. + #[arg(long)] + addresses: bool, + + /// Whether or not to try to only display addresses of instruction jump + /// targets. + #[arg(long)] + address_jumps: bool, + + /// What functions should be printed + #[arg(long, default_value = "wasm", value_name = "KIND")] + funcs: Vec, + + /// String filter to apply to function names to only print some functions. + #[arg(long, value_name = "STR")] + filter: Option, + + /// Whether or not instruction bytes are disassembled. + #[arg(long)] + bytes: bool, + + /// Whether or not to use color. + #[arg(long, default_value = "auto")] + color: ColorChoice, + + /// Whether or not to interleave instructions with address maps. + #[arg(long, require_equals = true, value_name = "true|false")] + addrmap: Option>, + + /// Column width of how large an address is rendered as. + #[arg(long, default_value = "10", value_name = "N")] + address_width: usize, + + /// Whether or not to show information about what instructions can trap. + #[arg(long, require_equals = true, value_name = "true|false")] + traps: Option>, + + /// Whether or not to show information about stack maps. + #[arg(long, require_equals = true, value_name = "true|false")] + stack_maps: Option>, +} + +fn optional_flag_with_default(flag: Option>, default: bool) -> bool { + match flag { + None => default, + Some(None) => true, + Some(Some(val)) => val, + } +} + +impl ObjdumpCommand { + fn addrmap(&self) -> bool { + optional_flag_with_default(self.addrmap, false) + } + + fn traps(&self) -> bool { + optional_flag_with_default(self.traps, true) + } + + fn stack_maps(&self) -> bool { + optional_flag_with_default(self.stack_maps, true) + } + + /// Executes the command. + pub fn execute(self) -> Result<()> { + // Setup stdout handling color options. Also build some variables used + // below to configure colors of certain items. + let mut choice = self.color; + if choice == ColorChoice::Auto && !std::io::stdout().is_terminal() { + choice = ColorChoice::Never; + } + let mut stdout = StandardStream::stdout(choice); + + let mut color_address = ColorSpec::new(); + color_address.set_bold(true).set_fg(Some(Color::Yellow)); + let mut color_bytes = ColorSpec::new(); + color_bytes.set_fg(Some(Color::Magenta)); + + let bytes = self.read_cwasm()?; + + // Double-check this is a `*.cwasm` + if Engine::detect_precompiled(&bytes).is_none() { + bail!("not a `*.cwasm` file from wasmtime: {:?}", self.cwasm); + } + + // Parse the input as an ELF file, extract the `.text` section. + let elf = ElfFile64::::parse(&bytes)?; + let text = elf + .section_by_name(".text") + .context("missing .text section")?; + let text = text.data()?; + + // Build the helper that'll get used to attach decorations/annotations + // to various instructions. + let mut decorator = Decorator { + addrmap: elf + .section_by_name(obj::ELF_WASMTIME_ADDRMAP) + .and_then(|section| section.data().ok()) + .and_then(|bytes| wasmtime_environ::iterate_address_map(bytes)) + .map(|i| (Box::new(i) as Box>).peekable()), + traps: elf + .section_by_name(obj::ELF_WASMTIME_TRAPS) + .and_then(|section| section.data().ok()) + .and_then(|bytes| wasmtime_environ::iterate_traps(bytes)) + .map(|i| (Box::new(i) as Box>).peekable()), + stack_maps: elf + .section_by_name(obj::ELF_WASMTIME_STACK_MAP) + .and_then(|section| section.data().ok()) + .and_then(|bytes| StackMap::iter(bytes)) + .map(|i| (Box::new(i) as Box>).peekable()), + objdump: &self, + }; + + // Iterate over all symbols which will be functions for a cwasm and + // we'll disassemble them all. + let mut first = true; + for sym in elf.symbols() { + let name = match sym.name() { + Ok(name) => name, + Err(_) => continue, + }; + let bytes = &text[sym.address() as usize..][..sym.size() as usize]; + + let kind = if name.starts_with("wasmtime_builtin") { + Func::Builtin + } else if name.contains("]::function[") { + Func::Wasm + } else if name.contains("trampoline") { + Func::Trampoline + } else if name.contains("libcall") { + Func::Libcall + } else { + panic!("unknown symbol: {name}") + }; + + // Apply any filters, if provided, to this function to look at just + // one function in the disassembly. + if self.funcs.is_empty() { + if kind != Func::Wasm { + continue; + } + } else { + if !(self.funcs.contains(&Func::All) || self.funcs.contains(&kind)) { + continue; + } + } + if let Some(filter) = &self.filter { + if !name.contains(filter) { + continue; + } + } + + // Place a blank line between functions. + if first { + first = false; + } else { + writeln!(stdout)?; + } + + // Print the function's address, if so desired. Then print the + // function name. + if self.addresses { + stdout.set_color(color_address.clone().set_bold(true))?; + write!(stdout, "{:08x} ", sym.address())?; + stdout.reset()?; + } + stdout.set_color(ColorSpec::new().set_bold(true).set_fg(Some(Color::Green)))?; + write!(stdout, "{name}")?; + stdout.reset()?; + writeln!(stdout, ":")?; + + // Tracking variables for rough heuristics of printing targets of + // jump instructions for `--address-jumps` mode. + let mut prev_jump = false; + let mut write_offsets = false; + + for inst in self.disas(&elf, bytes, sym.address())? { + let Inst { + address, + is_jump, + is_return, + disassembly: disas, + bytes, + } = inst; + + // Generate an infinite list of bytes to make printing below + // easier, but only limit `inline_bytes` to get printed before + // an instruction. + let mut bytes = bytes.iter().map(Some).chain(iter::repeat(None)); + let inline_bytes = 9; + let width = self.address_width; + + // Some instructions may disassemble to multiple lines, such as + // `br_table` with Pulley. Handle separate lines per-instruction + // here. + for (i, line) in disas.lines().enumerate() { + let print_address = self.addresses + || (self.address_jumps && (write_offsets || (prev_jump && !is_jump))); + if i == 0 && print_address { + stdout.set_color(&color_address)?; + write!(stdout, "{address:>width$x}: ")?; + stdout.reset()?; + } else { + write!(stdout, "{:width$} ", "")?; + } + + // If we're printing inline bytes then print up to + // `inline_bytes` of instruction data, and any remaining + // data will go on the next line, if any, or after the + // instruction below. + if self.bytes { + stdout.set_color(&color_bytes)?; + for byte in bytes.by_ref().take(inline_bytes) { + match byte { + Some(byte) => write!(stdout, "{byte:02x} ")?, + None => write!(stdout, " ")?, + } + } + write!(stdout, " ")?; + stdout.reset()?; + } + + writeln!(stdout, "{line}")?; + } + + // Flip write_offsets to true once we've seen a `ret`, as + // instructions that follow the return are often related to trap + // tables. + write_offsets |= is_return; + prev_jump = is_jump; + + // After the instruction is printed then finish printing the + // instruction bytes if any are present. Still limit to + // `inline_bytes` per line. + if self.bytes { + let mut inline = 0; + stdout.set_color(&color_bytes)?; + for byte in bytes { + let Some(byte) = byte else { break }; + if inline == 0 { + write!(stdout, "{:width$} ", "")?; + } else { + write!(stdout, " ")?; + } + write!(stdout, "{byte:02x}")?; + inline += 1; + if inline == inline_bytes { + writeln!(stdout)?; + inline = 0; + } + } + stdout.reset()?; + if inline > 0 { + writeln!(stdout)?; + } + } + + // And now finally after an instruction is printed try to + // collect any "decorations" or annotations for this + // instruction. This is for example the address map, stack maps, + // etc. + // + // Once they're collected then print them after the instruction + // attempting to use some unicode characters to make it easier + // to read/scan. + let mut decorations = Vec::new(); + decorator.decorate(address, &mut decorations); + + let print_whitespace_to_decoration = |stdout: &mut StandardStream| -> Result<()> { + write!(stdout, "{:width$} ", "")?; + if self.bytes { + for _ in 0..inline_bytes + 1 { + write!(stdout, " ")?; + } + } + Ok(()) + }; + for (i, decoration) in decorations.iter().enumerate() { + print_whitespace_to_decoration(&mut stdout)?; + let mut color = ColorSpec::new(); + color.set_fg(Some(Color::Cyan)); + stdout.set_color(&color)?; + let final_decoration = i == decorations.len() - 1; + if !final_decoration { + write!(stdout, "├")?; + } else { + write!(stdout, "╰")?; + } + for (i, line) in decoration.lines().enumerate() { + if i == 0 { + write!(stdout, "─╼ ")?; + } else { + print_whitespace_to_decoration(&mut stdout)?; + if final_decoration { + write!(stdout, " ")?; + } else { + write!(stdout, "│ ")?; + } + } + writeln!(stdout, "{line}")?; + } + stdout.reset()?; + } + } + } + Ok(()) + } + + /// Disassembles `func` contained within `elf` returning a list of + /// instructions that represent the function. + fn disas(&self, elf: &ElfFile64<'_, Endianness>, func: &[u8], addr: u64) -> Result> { + let cranelift_target = match elf.architecture() { + Architecture::X86_64 => "x86_64", + Architecture::Aarch64 => "aarch64", + Architecture::S390x => "s390x", + Architecture::Riscv64 => { + let e_flags = match elf.flags() { + FileFlags::Elf { e_flags, .. } => e_flags, + _ => bail!("not an ELF file"), + }; + if e_flags & (obj::EF_WASMTIME_PULLEY32 | obj::EF_WASMTIME_PULLEY64) != 0 { + return self.disas_pulley(func, addr); + } else { + "riscv64" + } + } + other => bail!("unknown architecture {other:?}"), + }; + let builder = + lookup_by_name(cranelift_target).context("failed to load cranelift ISA builder")?; + let flags = cranelift_codegen::settings::builder(); + let isa = builder.finish(Flags::new(flags))?; + let isa = &*isa; + let capstone = isa + .to_capstone() + .context("failed to create a capstone disassembler")?; + + let insts = capstone + .disasm_all(func, addr)? + .into_iter() + .map(|inst| { + let detail = capstone.insn_detail(&inst).ok(); + let detail = detail.as_ref(); + let is_jump = detail + .map(|d| { + d.groups() + .iter() + .find(|g| g.0 as u32 == CS_GRP_JUMP) + .is_some() + }) + .unwrap_or(false); + + let is_return = detail + .map(|d| { + d.groups() + .iter() + .find(|g| g.0 as u32 == CS_GRP_RET) + .is_some() + }) + .unwrap_or(false); + + let disassembly = match (inst.mnemonic(), inst.op_str()) { + (Some(i), Some(o)) => { + if o.is_empty() { + format!("{i}") + } else { + format!("{i:7} {o}") + } + } + (Some(i), None) => format!("{i}"), + _ => unreachable!(), + }; + + let address = inst.address(); + Inst { + address, + is_jump, + is_return, + bytes: inst.bytes().to_vec(), + disassembly, + } + }) + .collect::>(); + Ok(insts) + } + + /// Same as `dias` above, but just for Pulley. + fn disas_pulley(&self, func: &[u8], addr: u64) -> Result> { + let mut result = vec![]; + + let mut disas = Disassembler::new(func); + disas.offsets(false); + disas.hexdump(false); + disas.start_offset(usize::try_from(addr).unwrap()); + let mut decoder = Decoder::new(); + let mut last_disas_pos = 0; + loop { + let start_addr = disas.bytecode().position(); + + match decoder.decode_one(&mut disas) { + // If we got EOF at the initial position, then we're done disassembling. + Err(DecodingError::UnexpectedEof { position }) if position == start_addr => break, + + // Otherwise, propagate the error. + Err(e) => { + return Err(e).context("failed to disassembly pulley bytecode"); + } + + Ok(()) => { + let bytes_range = start_addr..disas.bytecode().position(); + let disassembly = disas.disas()[last_disas_pos..].trim(); + last_disas_pos = disas.disas().len(); + let address = u64::try_from(start_addr).unwrap() + addr; + let is_jump = disassembly.contains("jump") || disassembly.contains("br_"); + let is_return = disassembly == "ret"; + result.push(Inst { + bytes: func[bytes_range].to_vec(), + address, + is_jump, + is_return, + disassembly: disassembly.to_string(), + }); + } + } + } + + Ok(result) + } + + /// Helper to read the input bytes of the `*.cwasm` handling stdin + /// automatically. + fn read_cwasm(&self) -> Result> { + if let Some(path) = &self.cwasm { + if path != Path::new("-") { + return std::fs::read(path).with_context(|| format!("failed to read {path:?}")); + } + } + + let mut stdin = Vec::new(); + std::io::stdin() + .read_to_end(&mut stdin) + .context("failed to read stdin")?; + Ok(stdin) + } +} + +/// Helper structure to package up metadata about an instruction. +struct Inst { + address: u64, + is_jump: bool, + is_return: bool, + disassembly: String, + bytes: Vec, +} + +#[derive(clap::ValueEnum, Clone, Copy, PartialEq, Eq)] +enum Func { + All, + Wasm, + Trampoline, + Builtin, + Libcall, +} + +struct Decorator<'a> { + objdump: &'a ObjdumpCommand, + addrmap: Option + 'a>>>, + traps: Option + 'a>>>, + stack_maps: Option)> + 'a>>>, +} + +impl Decorator<'_> { + fn decorate(&mut self, address: u64, list: &mut Vec) { + self.addrmap(address, list); + self.traps(address, list); + self.stack_maps(address, list); + } + + fn addrmap(&mut self, address: u64, list: &mut Vec) { + if !self.objdump.addrmap() { + return; + } + let Some(addrmap) = &mut self.addrmap else { + return; + }; + while let Some((addr, pos)) = addrmap.next_if(|(addr, _pos)| u64::from(*addr) <= address) { + if u64::from(addr) != address { + continue; + } + if let Some(offset) = pos.file_offset() { + list.push(format!("addrmap: {offset:#x}")); + } + } + } + + fn traps(&mut self, address: u64, list: &mut Vec) { + if !self.objdump.traps() { + return; + } + let Some(traps) = &mut self.traps else { + return; + }; + while let Some((addr, trap)) = traps.next_if(|(addr, _pos)| u64::from(*addr) <= address) { + if u64::from(addr) != address { + continue; + } + list.push(format!("trap: {trap:?}")); + } + } + + fn stack_maps(&mut self, address: u64, list: &mut Vec) { + if !self.objdump.stack_maps() { + return; + } + let Some(stack_maps) = &mut self.stack_maps else { + return; + }; + while let Some((addr, stack_map)) = + stack_maps.next_if(|(addr, _pos)| u64::from(*addr) <= address) + { + if u64::from(addr) != address { + continue; + } + list.push(format!( + "stack_map: frame_size={}, frame_offsets={:?}", + stack_map.frame_size(), + stack_map.offsets().collect::>() + )); + } + } +} diff --git a/src/commands/run.rs b/src/commands/run.rs index 1aed4d4b81..e0b52fec8f 100644 --- a/src/commands/run.rs +++ b/src/commands/run.rs @@ -33,6 +33,9 @@ use wasmtime_wasi_http::{ #[cfg(feature = "wasi-keyvalue")] use wasmtime_wasi_keyvalue::{WasiKeyValue, WasiKeyValueCtx, WasiKeyValueCtxBuilder}; +#[cfg(feature = "wasi-tls")] +use wasmtime_wasi_tls::WasiTlsCtx; + fn parse_preloads(s: &str) -> Result<(String, PathBuf)> { let parts: Vec<&str> = s.splitn(2, '=').collect(); if parts.len() != 2 { @@ -45,7 +48,7 @@ fn parse_preloads(s: &str) -> Result<(String, PathBuf)> { #[derive(Parser)] pub struct RunCommand { #[command(flatten)] - #[allow(missing_docs, reason = "don't want to mess with clap doc-strings")] + #[expect(missing_docs, reason = "don't want to mess with clap doc-strings")] pub run: RunCommon, /// The name of the function to run @@ -179,28 +182,30 @@ impl RunCommand { .unwrap_or(std::time::Duration::MAX); let result = runtime.block_on(async { tokio::time::timeout(dur, async { - // Load the preload wasm modules. - let mut modules = Vec::new(); + let mut profiled_modules: Vec<(String, Module)> = Vec::new(); if let RunTarget::Core(m) = &main { - modules.push((String::new(), m.clone())); + profiled_modules.push(("".to_string(), m.clone())); } + + // Load the preload wasm modules. for (name, path) in self.preloads.iter() { // Read the wasm module binary either as `*.wat` or a raw binary - let module = match self.run.load_module(&engine, path)? { + let preload_target = self.run.load_module(&engine, path)?; + let preload_module = match preload_target { RunTarget::Core(m) => m, #[cfg(feature = "component-model")] RunTarget::Component(_) => { bail!("components cannot be loaded with `--preload`") } }; - modules.push((name.clone(), module.clone())); + profiled_modules.push((name.to_string(), preload_module.clone())); // Add the module's functions to the linker. match &mut linker { #[cfg(feature = "cranelift")] CliLinker::Core(linker) => { linker - .module_async(&mut store, name, &module) + .module_async(&mut store, name, &preload_module) .await .context(format!( "failed to process preload `{}` at `{}`", @@ -219,7 +224,7 @@ impl RunCommand { } } - self.load_main_module(&mut store, &mut linker, &main, modules) + self.load_main_module(&mut store, &mut linker, &main, profiled_modules) .await .with_context(|| { format!( @@ -293,14 +298,21 @@ impl RunCommand { fn setup_epoch_handler( &self, store: &mut Store, - modules: Vec<(String, Module)>, + main_target: &RunTarget, + profiled_modules: Vec<(String, Module)>, ) -> Result)>> { if let Some(Profile::Guest { path, interval }) = &self.run.profile { #[cfg(feature = "profiling")] - return Ok(self.setup_guest_profiler(store, modules, path, *interval)); + return Ok(self.setup_guest_profiler( + store, + main_target, + profiled_modules, + path, + *interval, + )); #[cfg(not(feature = "profiling"))] { - let _ = (modules, path, interval); + let _ = (profiled_modules, path, interval, main_target); bail!("support for profiling disabled at compile time"); } } @@ -321,15 +333,27 @@ impl RunCommand { fn setup_guest_profiler( &self, store: &mut Store, - modules: Vec<(String, Module)>, + main_target: &RunTarget, + profiled_modules: Vec<(String, Module)>, path: &str, interval: std::time::Duration, ) -> Box)> { use wasmtime::{AsContext, GuestProfiler, StoreContext, StoreContextMut, UpdateDeadline}; let module_name = self.module_and_args[0].to_str().unwrap_or("
    "); - store.data_mut().guest_profiler = - Some(Arc::new(GuestProfiler::new(module_name, interval, modules))); + store.data_mut().guest_profiler = match main_target { + RunTarget::Core(_m) => Some(Arc::new(GuestProfiler::new( + module_name, + interval, + profiled_modules, + ))), + RunTarget::Component(component) => Some(Arc::new(GuestProfiler::new_component( + module_name, + interval, + component.clone(), + profiled_modules, + ))), + }; fn sample( mut store: StoreContextMut, @@ -398,19 +422,19 @@ impl RunCommand { &self, store: &mut Store, linker: &mut CliLinker, - module: &RunTarget, - modules: Vec<(String, Module)>, + main_target: &RunTarget, + profiled_modules: Vec<(String, Module)>, ) -> Result<()> { // The main module might be allowed to have unknown imports, which // should be defined as traps: if self.run.common.wasm.unknown_imports_trap == Some(true) { match linker { CliLinker::Core(linker) => { - linker.define_unknown_imports_as_traps(module.unwrap_core())?; + linker.define_unknown_imports_as_traps(main_target.unwrap_core())?; } #[cfg(feature = "component-model")] CliLinker::Component(linker) => { - linker.define_unknown_imports_as_traps(module.unwrap_component())?; + linker.define_unknown_imports_as_traps(main_target.unwrap_component())?; } } } @@ -419,17 +443,21 @@ impl RunCommand { if self.run.common.wasm.unknown_imports_default == Some(true) { match linker { CliLinker::Core(linker) => { - linker.define_unknown_imports_as_default_values(module.unwrap_core())?; + linker.define_unknown_imports_as_default_values( + store, + main_target.unwrap_core(), + )?; } _ => bail!("cannot use `--default-values-unknown-imports` with components"), } } - let finish_epoch_handler = self.setup_epoch_handler(store, modules)?; + let finish_epoch_handler = + self.setup_epoch_handler(store, main_target, profiled_modules)?; let result = match linker { CliLinker::Core(linker) => { - let module = module.unwrap_core(); + let module = main_target.unwrap_core(); let instance = linker .instantiate_async(&mut *store, &module) .await @@ -471,7 +499,7 @@ impl RunCommand { bail!("using `--invoke` with components is not supported"); } - let component = module.unwrap_component(); + let component = main_target.unwrap_component(); let result = if let Ok(command) = wasmtime_wasi::p3::bindings::Command::instantiate_async( &mut *store, @@ -539,11 +567,17 @@ impl RunCommand { .to_str() .ok_or_else(|| anyhow!("argument is not valid utf-8: {val:?}"))?; values.push(match ty { - // TODO: integer parsing here should handle hexadecimal notation - // like `0x0...`, but the Rust standard library currently only - // parses base-10 representations. - ValType::I32 => Val::I32(val.parse()?), - ValType::I64 => Val::I64(val.parse()?), + // Supports both decimal and hexadecimal notation (with 0x prefix) + ValType::I32 => Val::I32(if val.starts_with("0x") || val.starts_with("0X") { + i32::from_str_radix(&val[2..], 16)? + } else { + val.parse::()? + }), + ValType::I64 => Val::I64(if val.starts_with("0x") || val.starts_with("0X") { + i64::from_str_radix(&val[2..], 16)? + } else { + val.parse::()? + }), ValType::F32 => Val::F32(val.parse::()?.to_bits()), ValType::F64 => Val::F64(val.parse::()?.to_bits()), t => bail!("unsupported argument type {:?}", t), @@ -845,6 +879,32 @@ impl RunCommand { } } + if self.run.common.wasi.tls == Some(true) { + #[cfg(all(not(all(feature = "wasi-tls", feature = "component-model"))))] + { + bail!("Cannot enable wasi-tls when the binary is not compiled with this feature."); + } + #[cfg(all(feature = "wasi-tls", feature = "component-model",))] + { + match linker { + CliLinker::Core(_) => { + bail!("Cannot enable wasi-tls for core wasm modules"); + } + CliLinker::Component(linker) => { + let mut opts = wasmtime_wasi_tls::LinkOptions::default(); + opts.tls(true); + wasmtime_wasi_tls::add_to_linker(linker, &mut opts, |h| { + let preview2_ctx = + h.preview2_ctx.as_mut().expect("wasip2 is not configured"); + let preview2_ctx = + Arc::get_mut(preview2_ctx).unwrap().get_mut().unwrap(); + WasiTlsCtx::new(preview2_ctx.table()) + })?; + } + } + } + } + Ok(()) } diff --git a/src/commands/serve.rs b/src/commands/serve.rs index 81111c7180..c6d89a21bd 100644 --- a/src/commands/serve.rs +++ b/src/commands/serve.rs @@ -2,15 +2,18 @@ use crate::common::{Profile, RunCommon, RunTarget}; use anyhow::{anyhow, bail, Result}; use clap::Parser; use std::net::SocketAddr; +use std::time::Instant; use std::{ path::PathBuf, sync::{ atomic::{AtomicBool, AtomicU64, Ordering}, - Arc, + Arc, Mutex, }, + time::Duration, }; -use wasmtime::component::Linker; -use wasmtime::{Engine, Store, StoreLimits}; +use tokio::sync::Notify; +use wasmtime::component::{Component, Linker}; +use wasmtime::{Engine, Store, StoreLimits, UpdateDeadline}; use wasmtime_wasi::{IoView, StreamError, StreamResult, WasiCtx, WasiCtxBuilder, WasiView}; use wasmtime_wasi_http::bindings::http::types::Scheme; use wasmtime_wasi_http::bindings::ProxyPre; @@ -44,6 +47,9 @@ struct Host { #[cfg(feature = "wasi-keyvalue")] wasi_keyvalue: Option, + + #[cfg(feature = "profiling")] + guest_profiler: Option>, } impl IoView for Host { @@ -85,12 +91,19 @@ pub struct ServeCommand { run: RunCommon, /// Socket address for the web server to bind to. - #[arg(long = "addr", value_name = "SOCKADDR", default_value_t = DEFAULT_ADDR)] + #[arg(long , value_name = "SOCKADDR", default_value_t = DEFAULT_ADDR)] addr: SocketAddr, + /// Socket address where, when connected to, will initiate a graceful + /// shutdown. + /// + /// Note that graceful shutdown is also supported on ctrl-c. + #[arg(long, value_name = "SOCKADDR")] + shutdown_addr: Option, + /// Disable log prefixes of wasi-http handlers. /// if unspecified, logs will be prefixed with 'stdout|stderr [{req_id}] :: ' - #[arg(long = "no-logging-prefix")] + #[arg(long)] no_logging_prefix: bool, /// The WebAssembly component to run. @@ -105,9 +118,6 @@ impl ServeCommand { // We force cli errors before starting to listen for connections so then // we don't accidentally delay them to the first request. - if let Some(Profile::Guest { .. }) = &self.run.profile { - bail!("Cannot use the guest profiler with components"); - } if self.run.common.wasi.nn == Some(true) { #[cfg(not(feature = "wasi-nn"))] @@ -134,17 +144,7 @@ impl ServeCommand { .enable_io() .build()?; - runtime.block_on(async move { - tokio::select! { - _ = tokio::signal::ctrl_c() => { - Ok::<_, anyhow::Error>(()) - } - - res = self.serve() => { - res - } - } - })?; + runtime.block_on(self.serve())?; Ok(()) } @@ -182,6 +182,8 @@ impl ServeCommand { wasi_config: None, #[cfg(feature = "wasi-keyvalue")] wasi_keyvalue: None, + #[cfg(feature = "profiling")] + guest_profiler: None, }; if self.run.common.wasi.nn == Some(true) { @@ -234,10 +236,6 @@ impl ServeCommand { let mut store = Store::new(engine, host); - if self.run.common.wasm.timeout.is_some() { - store.set_epoch_deadline(u64::from(EPOCH_PRECISION) + 1); - } - store.data_mut().limits = self.run.store_limits(); store.limiter(|t| &mut t.limits); @@ -351,10 +349,9 @@ impl ServeCommand { Some(Profile::Native(s)) => { config.profiler(s); } - - // We bail early in `execute` if the guest profiler is configured. - Some(Profile::Guest { .. }) => unreachable!(), - + Some(Profile::Guest { .. }) => { + config.epoch_interruption(true); + } None => {} } @@ -371,6 +368,30 @@ impl ServeCommand { let instance = linker.instantiate_pre(&component)?; let instance = ProxyPre::new(instance)?; + // Spawn background task(s) waiting for graceful shutdown signals. This + // always listens for ctrl-c but additionally can listen for a TCP + // connection to the specified address. + let shutdown = Arc::new(GracefulShutdown::default()); + tokio::task::spawn({ + let shutdown = shutdown.clone(); + async move { + tokio::signal::ctrl_c().await.unwrap(); + shutdown.requested.notify_one(); + } + }); + if let Some(addr) = self.shutdown_addr { + let listener = tokio::net::TcpListener::bind(addr).await?; + eprintln!( + "Listening for shutdown on tcp://{}/", + listener.local_addr()? + ); + let shutdown = shutdown.clone(); + tokio::task::spawn(async move { + let _ = listener.accept().await; + shutdown.requested.notify_one(); + }); + } + let socket = match &self.addr { SocketAddr::V4(_) => tokio::net::TcpSocket::new_v4()?, SocketAddr::V6(_) => tokio::net::TcpSocket::new_v6()?, @@ -389,44 +410,111 @@ impl ServeCommand { eprintln!("Serving HTTP on http://{}/", listener.local_addr()?); - let _epoch_thread = if let Some(timeout) = self.run.common.wasm.timeout { - Some(EpochThread::spawn( - timeout / EPOCH_PRECISION, - engine.clone(), - )) - } else { - None - }; - log::info!("Listening on {}", self.addr); let handler = ProxyHandler::new(self, engine, instance); loop { - let (stream, _) = listener.accept().await?; + // Wait for a socket, but also "race" against shutdown to break out + // of this loop. Once the graceful shutdown signal is received then + // this loop exits immediately. + let (stream, _) = tokio::select! { + _ = shutdown.requested.notified() => break, + v = listener.accept() => v?, + }; + let comp = component.clone(); let stream = TokioIo::new(stream); let h = handler.clone(); - tokio::task::spawn(async { + let shutdown_guard = shutdown.clone().increment(); + tokio::task::spawn(async move { if let Err(e) = http1::Builder::new() .keep_alive(true) .serve_connection( stream, - hyper::service::service_fn(move |req| handle_request(h.clone(), req)), + hyper::service::service_fn(move |req| { + handle_request(h.clone(), req, comp.clone()) + }), ) .await { eprintln!("error: {e:?}"); } + drop(shutdown_guard); }); } + + // Upon exiting the loop we'll no longer process any more incoming + // connections but there may still be outstanding connections + // processing in child tasks. If there are wait for those to complete + // before shutting down completely. Also enable short-circuiting this + // wait with a second ctrl-c signal. + if shutdown.close() { + return Ok(()); + } + eprintln!("Waiting for child tasks to exit, ctrl-c again to quit sooner..."); + tokio::select! { + _ = tokio::signal::ctrl_c() => {} + _ = shutdown.complete.notified() => {} + } + + Ok(()) } } -/// This is the number of epochs that we will observe before expiring a request handler. As -/// instances may be started at any point within an epoch, and epochs are counted globally per -/// engine, we expire after `EPOCH_PRECISION + 1` epochs have been observed. This gives a maximum -/// overshoot of `timeout / EPOCH_PRECISION`, which is more desirable than expiring early. -const EPOCH_PRECISION: u32 = 10; +/// Helper structure to manage graceful shutdown int he accept loop above. +#[derive(Default)] +struct GracefulShutdown { + /// Async notification that shutdown has been requested. + requested: Notify, + /// Async notification that shutdown has completed, signaled when + /// `notify_when_done` is `true` and `active_tasks` reaches 0. + complete: Notify, + /// Internal state related to what's in progress when shutdown is requested. + state: Mutex, +} + +#[derive(Default)] +struct GracefulShutdownState { + active_tasks: u32, + notify_when_done: bool, +} + +impl GracefulShutdown { + /// Increments the number of active tasks and returns a guard indicating + fn increment(self: Arc) -> impl Drop { + struct Guard(Arc); + + let mut state = self.state.lock().unwrap(); + assert!(!state.notify_when_done); + state.active_tasks += 1; + drop(state); + + return Guard(self); + + impl Drop for Guard { + fn drop(&mut self) { + let mut state = self.0.state.lock().unwrap(); + state.active_tasks -= 1; + if state.notify_when_done && state.active_tasks == 0 { + self.0.complete.notify_one(); + } + } + } + } + + /// Flags this state as done spawning tasks and returns whether there are no + /// more child tasks remaining. + fn close(&self) -> bool { + let mut state = self.state.lock().unwrap(); + state.notify_when_done = true; + state.active_tasks == 0 + } +} + +/// When executing with a timeout enabled, this is how frequently epoch +/// interrupts will be executed to check for timeouts. If guest profiling +/// is enabled, the guest epoch period will be used. +const EPOCH_INTERRUPT_PERIOD: Duration = Duration::from_millis(50); struct EpochThread { shutdown: Arc, @@ -434,13 +522,13 @@ struct EpochThread { } impl EpochThread { - fn spawn(timeout: std::time::Duration, engine: Engine) -> Self { + fn spawn(interval: std::time::Duration, engine: Engine) -> Self { let shutdown = Arc::new(AtomicBool::new(false)); let handle = { let shutdown = Arc::clone(&shutdown); let handle = std::thread::spawn(move || { while !shutdown.load(Ordering::Relaxed) { - std::thread::sleep(timeout); + std::thread::sleep(interval); engine.increment_epoch(); } }); @@ -460,6 +548,121 @@ impl Drop for EpochThread { } } +type WriteProfile = Box) + Send>; + +fn setup_epoch_handler( + cmd: &ServeCommand, + store: &mut Store, + component: Component, +) -> Result<(WriteProfile, Option)> { + // Profiling Enabled + if let Some(Profile::Guest { interval, path }) = &cmd.run.profile { + #[cfg(feature = "profiling")] + return setup_guest_profiler(cmd, store, path.clone(), *interval, component.clone()); + #[cfg(not(feature = "profiling"))] + { + let _ = (path, interval); + bail!("support for profiling disabled at compile time!"); + } + } + + // Profiling disabled but there's a global request timeout + let epoch_thread = if let Some(timeout) = cmd.run.common.wasm.timeout { + let start = Instant::now(); + store.epoch_deadline_callback(move |_store| { + if start.elapsed() > timeout { + bail!("Timeout expired"); + } + Ok(UpdateDeadline::Continue(1)) + }); + store.set_epoch_deadline(1); + let engine = store.engine().clone(); + Some(EpochThread::spawn(EPOCH_INTERRUPT_PERIOD, engine)) + } else { + None + }; + + Ok((Box::new(|_store| {}), epoch_thread)) +} + +#[cfg(feature = "profiling")] +fn setup_guest_profiler( + cmd: &ServeCommand, + store: &mut Store, + path: String, + interval: Duration, + component: Component, +) -> Result<(WriteProfile, Option)> { + use wasmtime::{AsContext, GuestProfiler, StoreContext, StoreContextMut}; + + let module_name = "
    "; + + store.data_mut().guest_profiler = Some(Arc::new(GuestProfiler::new_component( + module_name, + interval, + component, + std::iter::empty(), + ))); + + fn sample( + mut store: StoreContextMut, + f: impl FnOnce(&mut GuestProfiler, StoreContext), + ) { + let mut profiler = store.data_mut().guest_profiler.take().unwrap(); + f( + Arc::get_mut(&mut profiler).expect("profiling doesn't support threads yet"), + store.as_context(), + ); + store.data_mut().guest_profiler = Some(profiler); + } + + // Hostcall entry/exit, etc. + store.call_hook(|store, kind| { + sample(store, |profiler, store| profiler.call_hook(store, kind)); + Ok(()) + }); + + let start = Instant::now(); + let timeout = cmd.run.common.wasm.timeout; + store.epoch_deadline_callback(move |store| { + sample(store, |profiler, store| { + profiler.sample(store, std::time::Duration::ZERO) + }); + + // Originally epoch counting was used here; this is problematic in + // a lot of cases due to there being a lot of time (e.g. in hostcalls) + // when we are not expected to get sample hits. + if let Some(timeout) = timeout { + if start.elapsed() > timeout { + bail!("Timeout expired"); + } + } + + Ok(UpdateDeadline::Continue(1)) + }); + + store.set_epoch_deadline(1); + let engine = store.engine().clone(); + let epoch_thread = Some(EpochThread::spawn(interval, engine)); + + let write_profile = Box::new(move |store: &mut Store| { + let profiler = Arc::try_unwrap(store.data_mut().guest_profiler.take().unwrap()) + .expect("profiling doesn't support threads yet"); + if let Err(e) = std::fs::File::create(&path) + .map_err(anyhow::Error::new) + .and_then(|output| profiler.finish(std::io::BufWriter::new(output))) + { + eprintln!("failed writing profile at {path}: {e:#}"); + } else { + eprintln!(); + eprintln!("Profile written to: {path}"); + eprintln!("View this profile at https://profiler.firefox.com/."); + } + }); + + Ok((write_profile, epoch_thread)) +} + struct ProxyHandlerInner { cmd: ServeCommand, engine: Engine, @@ -492,6 +695,7 @@ type Request = hyper::Request; async fn handle_request( ProxyHandler(inner): ProxyHandler, req: Request, + component: Component, ) -> Result> { let (sender, receiver) = tokio::sync::oneshot::channel(); @@ -509,20 +713,26 @@ async fn handle_request( let out = store.data_mut().new_response_outparam(sender)?; let proxy = inner.instance_pre.instantiate_async(&mut store).await?; + let comp = component.clone(); let task = tokio::task::spawn(async move { + let (write_profile, epoch_thread) = setup_epoch_handler(&inner.cmd, &mut store, comp)?; + if let Err(e) = proxy .wasi_http_incoming_handler() - .call_handle(store, req, out) + .call_handle(&mut store, req, out) .await { log::error!("[{req_id}] :: {:?}", e); return Err(e); } + write_profile(&mut store); + drop(epoch_thread); + Ok(()) }); - match receiver.await { + let result = match receiver.await { Ok(Ok(resp)) => Ok(resp), Ok(Err(e)) => Err(e.into()), Err(_) => { @@ -534,12 +744,17 @@ async fn handle_request( // that we assume the task has already exited at this point so the // `await` should resolve immediately. let e = match task.await { - Ok(r) => r.expect_err("if the receiver has an error, the task must have failed"), + Ok(Ok(())) => { + bail!("guest never invoked `response-outparam::set` method") + } + Ok(Err(e)) => e, Err(e) => e.into(), }; - return Err(e.context("guest never invoked `response-outparam::set` method")); + Err(e.context("guest never invoked `response-outparam::set` method")) } - } + }; + + result } #[derive(Clone)] diff --git a/src/common.rs b/src/common.rs index f9275e289a..618ef7479a 100644 --- a/src/common.rs +++ b/src/common.rs @@ -213,7 +213,7 @@ impl RunCommon { deserialize_module: impl FnOnce() -> Result, #[cfg(feature = "component-model")] deserialize_component: impl FnOnce() -> Result, ) -> Result { - Ok(match engine.detect_precompiled(bytes) { + Ok(match Engine::detect_precompiled(bytes) { Some(Precompiled::Module) => { self.ensure_allow_precompiled()?; RunTarget::Core(deserialize_module()?) @@ -252,7 +252,7 @@ impl RunCommon { #[cfg(not(any(feature = "cranelift", feature = "winch")))] None => { - let _ = path; + let _ = (path, engine); bail!("support for compiling modules was disabled at compile time"); } }) diff --git a/supply-chain/audits.toml b/supply-chain/audits.toml index f4088c27a6..01693e9d27 100644 --- a/supply-chain/audits.toml +++ b/supply-chain/audits.toml @@ -1158,6 +1158,12 @@ who = "Andrew Brown " criteria = "safe-to-deploy" version = "1.3.0" +[[audits.bytesize]] +who = "Alex Crichton " +criteria = "safe-to-run" +delta = "1.3.0 -> 2.0.1" +notes = "New functionality, but no new unsafe, and no other suspicious changes." + [[audits.camino]] who = "Pat Hickey " criteria = "safe-to-deploy" @@ -1385,6 +1391,18 @@ who = "Dan Gohman " criteria = "safe-to-deploy" delta = "3.4.0 -> 3.4.1" +[[audits.capstone]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.12.0 -> 0.13.0" +notes = "No new major features added here, mostly new architectures from a capstone update. No fundamental new `unsafe` code or anything suspicious" + +[[audits.capstone-sys]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.16.0 -> 0.17.0" +notes = "Updates to the build process of capstone and adding some new architectures. Nothing major." + [[audits.cargo-platform]] who = "Pat Hickey " criteria = "safe-to-deploy" @@ -1403,6 +1421,12 @@ criteria = "safe-to-deploy" delta = "0.17.0 -> 0.18.1" notes = "No major changes, no unsafe code here." +[[audits.cargo_metadata]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.18.1 -> 0.19.2" +notes = "Dependency updates and minor changes, nothing suspicious." + [[audits.cast]] who = "Alex Crichton " criteria = "safe-to-run" @@ -2166,6 +2190,15 @@ Minimal `unsafe` usage. Few blocks that existed looked reasonable. Does what it says on the tin: lots of iterators. """ +[[audits.itertools]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.12.1 -> 0.14.0" +notes = """ +Lots of new iterators and shuffling some things around. Some new unsafe code but +it's well-documented and well-tested. Nothing suspicious. +""" + [[audits.itoa]] who = "Dan Gohman " criteria = "safe-to-deploy" @@ -2271,6 +2304,15 @@ who = "Dan Gohman " criteria = "safe-to-deploy" delta = "0.2.158 -> 0.2.161" +[[audits.libc]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.2.161 -> 0.2.171" +notes = """ +Lots of unsafe, but that's par for the course with libc, it's all FFI type +definitions updates/adjustments/etc. +""" + [[audits.libfuzzer-sys]] who = "Nick Fitzgerald " criteria = "safe-to-run" @@ -2307,12 +2349,24 @@ This is a minor update which has some testing affordances as well as some updated math algorithms. """ +[[audits.libm]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.2.8 -> 0.2.11" +notes = "Mostly formatting-related changes, nothing major." + [[audits.libtest-mimic]] who = "Alex Crichton " criteria = "safe-to-run" delta = "0.6.1 -> 0.7.0" notes = "Only minor changes with new flags and such, no major updates to `unsafe` or anything outside of a test framework." +[[audits.libtest-mimic]] +who = "Alex Crichton " +criteria = "safe-to-run" +delta = "0.7.0 -> 0.8.1" +notes = "Nothing major that's new in this update, mostly just updating a few things here and there. Nothing suspicious." + [[audits.linux-raw-sys]] who = "Dan Gohman " criteria = "safe-to-deploy" @@ -4441,7 +4495,7 @@ end = "2024-07-06" criteria = "safe-to-deploy" user-id = 6825 # Dan Gohman (sunfishcode) start = "2021-06-12" -end = "2024-07-14" +end = "2026-03-19" [[trusted.lock_api]] criteria = "safe-to-deploy" @@ -4519,7 +4573,7 @@ end = "2025-11-13" criteria = "safe-to-deploy" user-id = 6825 # Dan Gohman (sunfishcode) start = "2021-10-29" -end = "2024-07-14" +end = "2026-03-19" [[trusted.ryu]] criteria = "safe-to-deploy" @@ -4555,7 +4609,7 @@ end = "2025-12-02" criteria = "safe-to-deploy" user-id = 3618 # David Tolnay (dtolnay) start = "2019-02-28" -end = "2024-07-06" +end = "2026-03-19" [[trusted.serde_spanned]] criteria = "safe-to-deploy" diff --git a/supply-chain/config.toml b/supply-chain/config.toml index faf5952815..79bd672b92 100644 --- a/supply-chain/config.toml +++ b/supply-chain/config.toml @@ -216,10 +216,6 @@ criteria = "safe-to-deploy" version = "0.8.4" criteria = "safe-to-deploy" -[[exemptions.ahash]] -version = "0.8.11" -criteria = "safe-to-deploy" - [[exemptions.base64ct]] version = "1.6.0" criteria = "safe-to-deploy" @@ -326,10 +322,6 @@ criteria = "safe-to-deploy" version = "2.4.1" criteria = "safe-to-deploy" -[[exemptions.hermit-abi]] -version = "0.2.0" -criteria = "safe-to-deploy" - [[exemptions.hermit-abi]] version = "0.3.9" criteria = "safe-to-deploy" @@ -520,10 +512,6 @@ criteria = "safe-to-deploy" version = "1.1.2" criteria = "safe-to-deploy" -[[exemptions.slice-group-by]] -version = "0.3.0" -criteria = "safe-to-deploy" - [[exemptions.smallvec]] version = "1.8.0" criteria = "safe-to-deploy" diff --git a/supply-chain/imports.lock b/supply-chain/imports.lock index cba0989a13..9e4c25438f 100644 --- a/supply-chain/imports.lock +++ b/supply-chain/imports.lock @@ -2,956 +2,400 @@ # cargo-vet imports lock [[unpublished.cranelift]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-assembler-x64]] -version = "0.118.0" -audited_as = "0.117.0" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-assembler-x64]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-assembler-x64-meta]] -version = "0.118.0" -audited_as = "0.117.0" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-assembler-x64-meta]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-bforest]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-bforest]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-bforest]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-bforest]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-bforest]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-bitset]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-bitset]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-bitset]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-bitset]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-bitset]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-codegen]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-codegen]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-codegen]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-codegen]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-codegen]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-codegen-meta]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-codegen-meta]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-codegen-meta]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-codegen-meta]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-codegen-meta]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-codegen-shared]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-codegen-shared]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-codegen-shared]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-codegen-shared]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-codegen-shared]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-control]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-control]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-control]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-control]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-control]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-entity]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-entity]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-entity]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-entity]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-entity]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-frontend]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-frontend]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-frontend]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-frontend]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-frontend]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-interpreter]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-interpreter]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-interpreter]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-interpreter]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-interpreter]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-isle]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-isle]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-isle]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-isle]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-isle]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-jit]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-jit]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-jit]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-jit]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-jit]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-module]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-module]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-module]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-module]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-module]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-native]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-native]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-native]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-native]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-native]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-object]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-object]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-object]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-object]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-object]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-reader]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-reader]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-reader]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-reader]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-reader]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.cranelift-serde]] -version = "0.115.0" -audited_as = "0.113.1" - -[[unpublished.cranelift-serde]] -version = "0.116.0" -audited_as = "0.114.0" - -[[unpublished.cranelift-serde]] -version = "0.117.0" -audited_as = "0.115.0" - -[[unpublished.cranelift-serde]] -version = "0.118.0" -audited_as = "0.116.1" +version = "0.119.0" +audited_as = "0.117.2" [[unpublished.cranelift-serde]] version = "0.119.0" audited_as = "0.117.2" [[unpublished.pulley-interpreter]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.pulley-interpreter]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.pulley-interpreter]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.pulley-interpreter]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.pulley-interpreter]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasi-common]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasi-common]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasi-common]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasi-common]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasi-common]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-asm-macros]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-asm-macros]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-asm-macros]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-asm-macros]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-asm-macros]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-cache]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-cache]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-cache]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-cache]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-cache]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-cli]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-cli]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-cli]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-cli]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-cli]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-cli-flags]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-cli-flags]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-cli-flags]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-cli-flags]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-cli-flags]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-component-macro]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-component-macro]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-component-macro]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-component-macro]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-component-macro]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-component-util]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-component-util]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-component-util]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-component-util]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-component-util]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-cranelift]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-cranelift]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-cranelift]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-cranelift]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-cranelift]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-environ]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-environ]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-environ]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-environ]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-environ]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-explorer]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-explorer]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-explorer]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-explorer]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-explorer]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-fiber]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-fiber]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-fiber]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-fiber]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-fiber]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-jit-debug]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-jit-debug]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-jit-debug]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-jit-debug]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-jit-debug]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-jit-icache-coherence]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-jit-icache-coherence]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-jit-icache-coherence]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-jit-icache-coherence]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-jit-icache-coherence]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-math]] -version = "30.0.0" -audited_as = "29.0.0" - -[[unpublished.wasmtime-math]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-math]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-slab]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-slab]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-slab]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-slab]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-slab]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-wasi]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-wasi]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-wasi]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-wasi]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-wasi]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-wasi-config]] -version = "28.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-wasi-config]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-wasi-config]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-wasi-config]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-wasi-config]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-wasi-http]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-wasi-http]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-wasi-http]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-wasi-http]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-wasi-http]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-wasi-io]] -version = "31.0.0" -audited_as = "30.0.0" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-wasi-io]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-wasi-keyvalue]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-wasi-keyvalue]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-wasi-keyvalue]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-wasi-keyvalue]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-wasi-keyvalue]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-wasi-nn]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-wasi-nn]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-wasi-nn]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-wasi-nn]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-wasi-nn]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-wasi-threads]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-wasi-threads]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-wasi-threads]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-wasi-threads]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-wasi-threads]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-wast]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-wast]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-wast]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-wast]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-wast]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-winch]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-winch]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-winch]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-winch]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-winch]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-wit-bindgen]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-wit-bindgen]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-wit-bindgen]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-wit-bindgen]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-wit-bindgen]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wasmtime-wmemcheck]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wasmtime-wmemcheck]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wasmtime-wmemcheck]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wasmtime-wmemcheck]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wasmtime-wmemcheck]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wiggle]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wiggle]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wiggle]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wiggle]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wiggle]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wiggle-generate]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wiggle-generate]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wiggle-generate]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wiggle-generate]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wiggle-generate]] version = "32.0.0" audited_as = "30.0.2" [[unpublished.wiggle-macro]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.wiggle-macro]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.wiggle-macro]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.wiggle-macro]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.wiggle-macro]] version = "32.0.0" @@ -962,20 +406,8 @@ version = "0.0.0" audited_as = "0.1.0" [[unpublished.winch-codegen]] -version = "28.0.0" -audited_as = "26.0.1" - -[[unpublished.winch-codegen]] -version = "29.0.0" -audited_as = "27.0.0" - -[[unpublished.winch-codegen]] -version = "30.0.0" -audited_as = "28.0.0" - -[[unpublished.winch-codegen]] -version = "31.0.0" -audited_as = "29.0.1" +version = "32.0.0" +audited_as = "30.0.2" [[unpublished.winch-codegen]] version = "32.0.0" @@ -1030,20 +462,6 @@ user-id = 3618 user-login = "dtolnay" user-name = "David Tolnay" -[[publisher.arbitrary]] -version = "1.3.1" -when = "2023-10-11" -user-id = 696 -user-login = "fitzgen" -user-name = "Nick Fitzgerald" - -[[publisher.arbitrary]] -version = "1.4.0" -when = "2024-11-04" -user-id = 696 -user-login = "fitzgen" -user-name = "Nick Fitzgerald" - [[publisher.async-trait]] version = "0.1.71" when = "2023-07-05" @@ -1298,13 +716,6 @@ when = "2025-02-25" user-id = 73222 user-login = "wasmtime-publish" -[[publisher.derive_arbitrary]] -version = "1.3.0" -when = "2023-03-13" -user-id = 696 -user-login = "fitzgen" -user-name = "Nick Fitzgerald" - [[publisher.derive_arbitrary]] version = "1.4.0" when = "2024-11-04" @@ -1389,13 +800,6 @@ user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" -[[publisher.hashbrown]] -version = "0.14.3" -when = "2023-11-26" -user-id = 2915 -user-login = "Amanieu" -user-name = "Amanieu d'Antras" - [[publisher.hashbrown]] version = "0.15.2" when = "2024-11-25" @@ -1480,6 +884,13 @@ user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" +[[publisher.linux-raw-sys]] +version = "0.9.3" +when = "2025-03-14" +user-id = 6825 +user-login = "sunfishcode" +user-name = "Dan Gohman" + [[publisher.memchr]] version = "2.5.0" when = "2022-04-30" @@ -1495,8 +906,8 @@ user-login = "dtolnay" user-name = "David Tolnay" [[publisher.prettyplease]] -version = "0.2.20" -when = "2024-05-07" +version = "0.2.31" +when = "2025-03-13" user-id = 3618 user-login = "dtolnay" user-name = "David Tolnay" @@ -1522,8 +933,8 @@ user-login = "dtolnay" user-name = "David Tolnay" [[publisher.regalloc2]] -version = "0.11.1" -when = "2024-12-02" +version = "0.11.2" +when = "2025-04-01" user-id = 3726 user-login = "cfallin" user-name = "Chris Fallin" @@ -1577,6 +988,13 @@ user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" +[[publisher.rustix]] +version = "1.0.3" +when = "2025-03-18" +user-id = 6825 +user-login = "sunfishcode" +user-name = "Dan Gohman" + [[publisher.ryu]] version = "1.0.9" when = "2021-12-12" @@ -1606,8 +1024,8 @@ user-login = "dtolnay" user-name = "David Tolnay" [[publisher.serde_json]] -version = "1.0.107" -when = "2023-09-13" +version = "1.0.140" +when = "2025-03-03" user-id = 3618 user-login = "dtolnay" user-name = "David Tolnay" @@ -1633,8 +1051,8 @@ user-login = "dtolnay" user-name = "David Tolnay" [[publisher.syn]] -version = "2.0.90" -when = "2024-11-29" +version = "2.0.100" +when = "2025-03-09" user-id = 3618 user-login = "dtolnay" user-name = "David Tolnay" @@ -1674,6 +1092,13 @@ user-id = 3618 user-login = "dtolnay" user-name = "David Tolnay" +[[publisher.thiserror]] +version = "2.0.12" +when = "2025-03-03" +user-id = 3618 +user-login = "dtolnay" +user-name = "David Tolnay" + [[publisher.thiserror-impl]] version = "1.0.65" when = "2024-10-22" @@ -1681,6 +1106,13 @@ user-id = 3618 user-login = "dtolnay" user-name = "David Tolnay" +[[publisher.thiserror-impl]] +version = "2.0.12" +when = "2025-03-03" +user-id = 3618 +user-login = "dtolnay" +user-name = "David Tolnay" + [[publisher.toml]] version = "0.8.10" when = "2024-02-05" @@ -1800,50 +1232,50 @@ user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasm-encoder]] -version = "0.225.0" -when = "2025-02-04" +version = "0.227.1" +when = "2025-03-07" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasm-encoder]] -version = "0.227.0" -when = "2025-03-05" +version = "0.228.0" +when = "2025-04-01" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasm-metadata]] -version = "0.225.0" -when = "2025-02-04" +version = "0.227.0" +when = "2025-03-05" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasm-metadata]] -version = "0.227.0" -when = "2025-03-05" +version = "0.228.0" +when = "2025-04-01" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasm-wave]] -version = "0.227.0" -when = "2025-03-05" +version = "0.228.0" +when = "2025-04-01" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmparser]] -version = "0.225.0" -when = "2025-02-04" +version = "0.227.1" +when = "2025-03-07" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmparser]] -version = "0.227.0" -when = "2025-03-05" +version = "0.228.0" +when = "2025-04-01" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmprinter]] -version = "0.227.0" -when = "2025-03-05" +version = "0.228.0" +when = "2025-04-01" user-id = 73222 user-login = "wasmtime-publish" @@ -2004,14 +1436,14 @@ user-id = 73222 user-login = "wasmtime-publish" [[publisher.wast]] -version = "227.0.0" -when = "2025-03-05" +version = "228.0.0" +when = "2025-04-01" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wat]] -version = "1.227.0" -when = "2025-03-05" +version = "1.228.0" +when = "2025-04-01" user-id = 73222 user-login = "wasmtime-publish" @@ -2236,14 +1668,14 @@ user-login = "sunfishcode" user-name = "Dan Gohman" [[publisher.wit-bindgen]] -version = "0.39.0" -when = "2025-02-05" +version = "0.41.0" +when = "2025-03-13" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wit-bindgen-core]] -version = "0.39.0" -when = "2025-02-05" +version = "0.41.0" +when = "2025-03-13" user-id = 73222 user-login = "wasmtime-publish" @@ -2254,44 +1686,44 @@ user-id = 73222 user-login = "wasmtime-publish" [[publisher.wit-bindgen-rt]] -version = "0.39.0" -when = "2025-02-05" +version = "0.41.0" +when = "2025-03-13" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wit-bindgen-rust]] -version = "0.39.0" -when = "2025-02-05" +version = "0.41.0" +when = "2025-03-13" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wit-bindgen-rust-macro]] -version = "0.39.0" -when = "2025-02-05" +version = "0.41.0" +when = "2025-03-13" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wit-component]] -version = "0.225.0" -when = "2025-02-04" +version = "0.227.0" +when = "2025-03-05" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wit-component]] -version = "0.227.0" -when = "2025-03-05" +version = "0.228.0" +when = "2025-04-01" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wit-parser]] -version = "0.225.0" -when = "2025-02-04" +version = "0.227.0" +when = "2025-03-05" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wit-parser]] -version = "0.227.0" -when = "2025-03-05" +version = "0.228.0" +when = "2025-04-01" user-id = 73222 user-login = "wasmtime-publish" @@ -2805,12 +2237,6 @@ criteria = "safe-to-deploy" delta = "0.3.27 -> 0.3.28" aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" -[[audits.mozilla.audits.futures-io]] -who = "Mike Hommey " -criteria = "safe-to-deploy" -delta = "0.3.27 -> 0.3.28" -aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" - [[audits.mozilla.audits.futures-sink]] who = "Mike Hommey " criteria = "safe-to-deploy" @@ -3209,6 +2635,13 @@ version = "1.1.0" notes = "Straightforward crate with no unsafe code, does what it says on the tin." aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" +[[audits.mozilla.audits.rustc-hash]] +who = "Ben Dean-Kawamura " +criteria = "safe-to-deploy" +delta = "1.1.0 -> 2.1.1" +notes = "Simple hashing crate, no unsafe code." +aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" + [[audits.mozilla.audits.rustversion]] who = "Bobby Holley " criteria = "safe-to-deploy" @@ -3359,19 +2792,6 @@ dependencies make sense, and no side-effectful std functions are used. """ aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" -[[audits.mozilla.audits.unicode-normalization]] -who = "Mike Hommey " -criteria = "safe-to-deploy" -delta = "0.1.19 -> 0.1.20" -notes = "I am the author of most of these changes upstream, and prepared the release myself, at which point I looked at the other changes since 0.1.19." -aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" - -[[audits.mozilla.audits.unicode-normalization]] -who = "Mike Hommey " -criteria = "safe-to-deploy" -delta = "0.1.20 -> 0.1.21" -aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" - [[audits.mozilla.audits.url]] who = "Valentin Gosu " criteria = "safe-to-deploy" @@ -3466,26 +2886,6 @@ criteria = "safe-to-deploy" delta = "0.7.3 -> 0.7.4" aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" -[[audits.mozilla.audits.zerocopy]] -who = "Alex Franchuk " -criteria = "safe-to-deploy" -version = "0.7.32" -notes = """ -This crate is `no_std` so doesn't use any side-effectful std functions. It -contains quite a lot of `unsafe` code, however. I verified portions of this. It -also has a large, thorough test suite. The project claims to run tests with -Miri to have stronger soundness checks, and also claims to use formal -verification tools to prove correctness. -""" -aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" - -[[audits.mozilla.audits.zerocopy-derive]] -who = "Alex Franchuk " -criteria = "safe-to-deploy" -version = "0.7.32" -notes = "Clean, safe macros for zerocopy." -aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" - [[audits.mozilla.audits.zerofrom]] who = "Makoto Kato " criteria = "safe-to-deploy" diff --git a/tests/all/cli_tests.rs b/tests/all/cli_tests.rs index 0f7ddaaf04..dee3e534bb 100644 --- a/tests/all/cli_tests.rs +++ b/tests/all/cli_tests.rs @@ -3,7 +3,7 @@ use anyhow::{bail, Result}; use std::fs::File; use std::io::Write; -use std::path::{Path, PathBuf}; +use std::path::Path; use std::process::{Command, ExitStatus, Output, Stdio}; use tempfile::{NamedTempFile, TempDir}; @@ -20,26 +20,7 @@ pub fn run_wasmtime_for_output(args: &[&str], stdin: Option<&Path>) -> Result Result { - // Figure out the Wasmtime binary from the current executable. - let bin = get_wasmtime_path()?; - let runner = std::env::vars() - .filter(|(k, _v)| k.starts_with("CARGO_TARGET") && k.ends_with("RUNNER")) - .next(); - - // If we're running tests with a "runner" then we might be doing something - // like cross-emulation, so spin up the emulator rather than the tests - // itself, which may not be natively executable. - let mut cmd = if let Some((_, runner)) = runner { - let mut parts = runner.split_whitespace(); - let mut cmd = Command::new(parts.next().unwrap()); - for arg in parts { - cmd.arg(arg); - } - cmd.arg(&bin); - cmd - } else { - Command::new(&bin) - }; + let mut cmd = wasmtime_test_util::command(get_wasmtime_path()); // Ignore this if it's specified in the environment to allow tests to run in // "default mode" by default. @@ -48,12 +29,8 @@ pub fn get_wasmtime_command() -> Result { Ok(cmd) } -fn get_wasmtime_path() -> Result { - let mut path = std::env::current_exe()?; - path.pop(); // chop off the file name - path.pop(); // chop off `deps` - path.push("wasmtime"); - Ok(path) +fn get_wasmtime_path() -> &'static str { + env!("CARGO_BIN_EXE_wasmtime") } // Run the wasmtime CLI with the provided args and, if it succeeds, return @@ -1530,6 +1507,7 @@ mod test_programs { struct WasmtimeServe { child: Option, addr: SocketAddr, + shutdown_addr: SocketAddr, } impl WasmtimeServe { @@ -1548,61 +1526,79 @@ mod test_programs { } fn spawn(cmd: &mut Command) -> Result { + cmd.arg("--shutdown-addr=127.0.0.1:0"); cmd.stdin(Stdio::null()); cmd.stdout(Stdio::piped()); cmd.stderr(Stdio::piped()); let mut child = cmd.spawn()?; - // Read the first line of stderr which will say which address it's - // listening on. - // - // NB: this intentionally discards any extra buffered data in the - // `BufReader` once the newline is found. The server shouldn't print - // anything interesting other than the address so once we get a line - // all remaining output is left to be captured by future requests - // send to the server. + // Read the first few lines of stderr which will say which address + // it's listening on. The first line is the shutdown line (with + // `--shutdown-addr`) and the second is what `--addr` was bound to. + // This is done to figure out what `:0` was bound to in the child + // process. let mut line = String::new(); let mut reader = BufReader::new(child.stderr.take().unwrap()); - reader.read_line(&mut line)?; - - match line.find("127.0.0.1").and_then(|addr_start| { - let addr = &line[addr_start..]; - let addr_end = addr.find("/")?; - addr[..addr_end].parse().ok() - }) { - Some(addr) => { - assert!(reader.buffer().is_empty()); - child.stderr = Some(reader.into_inner()); - Ok(WasmtimeServe { - child: Some(child), - addr, - }) + let mut read_addr_from_line = |prefix: &str| -> Result { + reader.read_line(&mut line)?; + + if !line.starts_with(prefix) { + bail!("input line `{line}` didn't start with `{prefix}`"); } - None => { + match line.find("127.0.0.1").and_then(|addr_start| { + let addr = &line[addr_start..]; + let addr_end = addr.find("/")?; + addr[..addr_end].parse().ok() + }) { + Some(addr) => { + line.truncate(0); + Ok(addr) + } + None => bail!("failed to address from: {line}"), + } + }; + let shutdown_addr = read_addr_from_line("Listening for shutdown"); + let addr = read_addr_from_line("Serving HTTP on"); + let (shutdown_addr, addr) = match (shutdown_addr, addr) { + (Ok(a), Ok(b)) => (a, b), + // If either failed kill the child and otherwise try to shepherd + // along any contextual information we have. + (Err(a), _) | (_, Err(a)) => { child.kill()?; child.wait()?; reader.read_to_string(&mut line)?; - bail!("failed to start child: {line}") + return Err(a.context(line)); } - } + }; + assert!(reader.buffer().is_empty()); + child.stderr = Some(reader.into_inner()); + Ok(WasmtimeServe { + child: Some(child), + addr, + shutdown_addr, + }) } /// Completes this server gracefully by printing the output on failure. fn finish(mut self) -> Result<(String, String)> { let mut child = self.child.take().unwrap(); - // If the child process has already exited then collect the output - // and test if it succeeded. Otherwise it's still running so kill it - // and then reap it. Assume that if it's still running then the test - // has otherwise passed so no need to print the output. - let known_failure = if child.try_wait()?.is_some() { - false - } else { - child.kill()?; - true - }; + // If the child process has already exited, then great! Otherwise + // the server is still running and it shouldn't be possible to exit + // until a shutdown signal is sent, so do that here. Make a TCP + // connection to the shutdown port which is used as a shutdown + // signal. + if child.try_wait()?.is_none() { + std::net::TcpStream::connect(&self.shutdown_addr) + .context("failed to initiate graceful shutdown")?; + } + + // Regardless of whether we just shut the server down or whether it + // was already shut down (e.g. panicked or similar), wait for the + // result here. The result should succeed (e.g. 0 exit status), and + // if it did then the stdout/stderr are the caller's problem. let output = child.wait_with_output()?; - if !known_failure && !output.status.success() { + if !output.status.success() { bail!("child failed {output:?}"); } @@ -1905,9 +1901,9 @@ stdout [1] :: \n\ stdout [1] :: after empty " ); - assert_eq!( - err, - "\ + assert!( + err.contains( + "\ stderr [0] :: this is half a print to stderr stderr [0] :: \n\ stderr [0] :: after empty @@ -1915,6 +1911,8 @@ stderr [1] :: this is half a print to stderr stderr [1] :: \n\ stderr [1] :: after empty " + ), + "bad stderr: {err}" ); Ok(()) @@ -1951,9 +1949,9 @@ this is half a print to stdout after empty " ); - assert_eq!( - err, - "\ + assert!( + err.contains( + "\ this is half a print to stderr \n\ after empty @@ -1961,6 +1959,8 @@ this is half a print to stderr \n\ after empty " + ), + "bad stderr {err}", ); Ok(()) @@ -2082,6 +2082,41 @@ after empty ])?; Ok(()) } + + async fn cli_serve_guest_never_invoked_set(wasm: &str) -> Result<()> { + let server = WasmtimeServe::new(wasm, |cmd| { + cmd.arg("-Scli"); + })?; + + for _ in 0..2 { + let res = server + .send_request( + hyper::Request::builder() + .uri("http://localhost/") + .body(String::new()) + .context("failed to make request")?, + ) + .await; + assert!(res.is_err()); + } + + let (stdout, stderr) = server.finish()?; + println!("stdout: {stdout}"); + println!("stderr: {stderr}"); + assert!(stderr.contains("guest never invoked `response-outparam::set` method")); + assert!(!stderr.contains("panicked")); + Ok(()) + } + + #[tokio::test] + async fn cli_serve_return_before_set() -> Result<()> { + cli_serve_guest_never_invoked_set(CLI_SERVE_RETURN_BEFORE_SET_COMPONENT).await + } + + #[tokio::test] + async fn cli_serve_trap_before_set() -> Result<()> { + cli_serve_guest_never_invoked_set(CLI_SERVE_TRAP_BEFORE_SET_COMPONENT).await + } } #[test] @@ -2112,7 +2147,7 @@ fn profile_with_vtune() -> Result<()> { "-user-data-dir", &std::env::temp_dir().to_string_lossy(), // ...then run Wasmtime with profiling enabled: - &get_wasmtime_path()?.to_string_lossy(), + get_wasmtime_path(), "--profile=vtune", "tests/all/cli_tests/simple.wat", ]); @@ -2264,3 +2299,139 @@ fn invalid_subcommand() -> Result<()> { assert!(String::from_utf8_lossy(&output.stderr).contains("invalid-subcommand")); Ok(()) } + +#[test] +fn numeric_args() -> Result<()> { + let wasm = build_wasm("tests/all/cli_tests/numeric_args.wat")?; + // Test decimal i32 + let output = run_wasmtime_for_output( + &[ + "run", + "--invoke", + "i32_test", + wasm.path().to_str().unwrap(), + "42", + ], + None, + )?; + assert_eq!(output.status.success(), true); + assert_eq!(output.stdout, b"42\n"); + // Test hexadecimal i32 with lowercase prefix + let output = run_wasmtime_for_output( + &[ + "run", + "--invoke", + "i32_test", + wasm.path().to_str().unwrap(), + "0x2A", + ], + None, + )?; + assert_eq!(output.status.success(), true); + assert_eq!(output.stdout, b"42\n"); + // Test hexadecimal i32 with uppercase prefix + let output = run_wasmtime_for_output( + &[ + "run", + "--invoke", + "i32_test", + wasm.path().to_str().unwrap(), + "0X2a", + ], + None, + )?; + assert_eq!(output.status.success(), true); + assert_eq!(output.stdout, b"42\n"); + // Test that non-prefixed hex strings are not interpreted as hex + let output = run_wasmtime_for_output( + &[ + "run", + "--invoke", + "i32_test", + wasm.path().to_str().unwrap(), + "ff", + ], + None, + )?; + assert!(!output.status.success()); // Should fail as "ff" is not a valid decimal number + + // Test decimal i64 + let output = run_wasmtime_for_output( + &[ + "run", + "--invoke", + "i64_test", + wasm.path().to_str().unwrap(), + "42", + ], + None, + )?; + assert_eq!(output.status.success(), true); + assert_eq!(output.stdout, b"42\n"); + // Test hexadecimal i64 + let output = run_wasmtime_for_output( + &[ + "run", + "--invoke", + "i64_test", + wasm.path().to_str().unwrap(), + "0x2A", + ], + None, + )?; + assert_eq!(output.status.success(), true); + assert_eq!(output.stdout, b"42\n"); + Ok(()) +} + +#[test] +fn compilation_logs() -> Result<()> { + let temp = tempfile::NamedTempFile::new()?; + let output = get_wasmtime_command()? + .args(&[ + "compile", + "-Wgc", + "tests/all/cli_tests/issue-10353.wat", + "--output", + &temp.path().display().to_string(), + ]) + .env("WASMTIME_LOG", "trace") + .env("RUST_BACKTRACE", "1") + .output()?; + if !output.status.success() { + println!("stdout: {}", String::from_utf8_lossy(&output.stdout)); + println!("stderr: {}", String::from_utf8_lossy(&output.stderr)); + panic!("wasmtime compilation failed when logs requested"); + } + Ok(()) +} + +#[test] +fn big_table_in_pooling_allocator() -> Result<()> { + // Works by default + run_wasmtime(&["tests/all/cli_tests/big_table.wat"])?; + + // Does not work by default in the pooling allocator, and the error message + // should mention something about the pooling allocator. + let output = run_wasmtime_for_output( + &["-Opooling-allocator", "tests/all/cli_tests/big_table.wat"], + None, + )?; + assert!(!output.status.success()); + println!("{}", String::from_utf8_lossy(&output.stderr)); + assert!(String::from_utf8_lossy(&output.stderr).contains("pooling allocator")); + + // Does work with `-Wmax-table-elements` + run_wasmtime(&[ + "-Opooling-allocator", + "-Wmax-table-elements=25000", + "tests/all/cli_tests/big_table.wat", + ])?; + // Also works with `-Opooling-table-elements` + run_wasmtime(&[ + "-Opooling-allocator", + "-Opooling-table-elements=25000", + "tests/all/cli_tests/big_table.wat", + ])?; + Ok(()) +} diff --git a/tests/all/cli_tests/big_table.wat b/tests/all/cli_tests/big_table.wat new file mode 100644 index 0000000000..c15168142c --- /dev/null +++ b/tests/all/cli_tests/big_table.wat @@ -0,0 +1,3 @@ +(module + (table 25000 funcref) +) diff --git a/tests/all/cli_tests/issue-10353.wat b/tests/all/cli_tests/issue-10353.wat new file mode 100644 index 0000000000..a6edb37f43 --- /dev/null +++ b/tests/all/cli_tests/issue-10353.wat @@ -0,0 +1,7 @@ +(module + (table $t 10 (ref null none)) + (func (export "f") (result (ref null none)) + (i32.const 99) + (table.get $t) + ) +) diff --git a/tests/all/cli_tests/numeric_args.wat b/tests/all/cli_tests/numeric_args.wat new file mode 100644 index 0000000000..2c80fa433d --- /dev/null +++ b/tests/all/cli_tests/numeric_args.wat @@ -0,0 +1,13 @@ +(module + (func $i32_test (export "i32_test") (param i32) (result i32) + local.get 0) + + (func $i64_test (export "i64_test") (param i64) (result i64) + local.get 0) + + (func $f32_test (export "f32_test") (param f32) (result f32) + local.get 0) + + (func $f64_test (export "f64_test") (param f64) (result f64) + local.get 0) +) diff --git a/tests/all/component_model.rs b/tests/all/component_model.rs index 2f2079e586..0e21606d03 100644 --- a/tests/all/component_model.rs +++ b/tests/all/component_model.rs @@ -1,9 +1,9 @@ use anyhow::Result; -use component_test_util::{async_engine, engine, TypedFuncExt}; use std::fmt::Write; use std::iter; use wasmtime::component::Component; use wasmtime_component_util::REALLOC_AND_FREE; +use wasmtime_test_util::component::{async_engine, engine, TypedFuncExt}; mod aot; mod r#async; diff --git a/tests/all/component_model/aot.rs b/tests/all/component_model/aot.rs index 676de39d19..701ad4c4fe 100644 --- a/tests/all/component_model/aot.rs +++ b/tests/all/component_model/aot.rs @@ -1,7 +1,7 @@ use anyhow::Result; use wasmtime::component::types::ComponentItem; use wasmtime::component::{Component, Linker, Type}; -use wasmtime::{Module, Precompiled, Store}; +use wasmtime::{Engine, Module, Precompiled, Store}; #[test] fn module_component_mismatch() -> Result<()> { @@ -126,10 +126,10 @@ fn usable_exported_modules() -> Result<()> { fn detect_precompiled() -> Result<()> { let engine = super::engine(); let buffer = Component::new(&engine, "(component)")?.serialize()?; - assert_eq!(engine.detect_precompiled(&[]), None); - assert_eq!(engine.detect_precompiled(&buffer[..5]), None); + assert_eq!(Engine::detect_precompiled(&[]), None); + assert_eq!(Engine::detect_precompiled(&buffer[..5]), None); assert_eq!( - engine.detect_precompiled(&buffer), + Engine::detect_precompiled(&buffer), Some(Precompiled::Component) ); Ok(()) diff --git a/tests/all/component_model/async.rs b/tests/all/component_model/async.rs index 26a2df86a9..84bb200cca 100644 --- a/tests/all/component_model/async.rs +++ b/tests/all/component_model/async.rs @@ -104,7 +104,7 @@ async fn smoke_func_wrap() -> Result<()> { // situation" with respect to the runtime. #[tokio::test] async fn resume_separate_thread() -> Result<()> { - let mut config = component_test_util::config(); + let mut config = wasmtime_test_util::component::config(); config.async_support(true); config.consume_fuel(true); let engine = Engine::new(&config)?; @@ -180,7 +180,7 @@ async fn resume_separate_thread() -> Result<()> { // situation" with respect to the runtime. #[tokio::test] async fn poll_through_wasm_activation() -> Result<()> { - let mut config = component_test_util::config(); + let mut config = wasmtime_test_util::component::config(); config.async_support(true); config.consume_fuel(true); let engine = Engine::new(&config)?; diff --git a/tests/all/component_model/dynamic.rs b/tests/all/component_model/dynamic.rs index a6417b07d3..18ee4c5008 100644 --- a/tests/all/component_model/dynamic.rs +++ b/tests/all/component_model/dynamic.rs @@ -2,11 +2,11 @@ use super::{make_echo_component, make_echo_component_with_params, Param, Type}; use anyhow::Result; -use component_test_util::FuncExt; use wasmtime::component::types::{self, Case, ComponentItem, Field}; use wasmtime::component::{Component, Linker, ResourceType, Val}; use wasmtime::{Module, Store}; use wasmtime_component_util::REALLOC_AND_FREE; +use wasmtime_test_util::component::FuncExt; #[test] fn primitives() -> Result<()> { diff --git a/tests/all/component_model/macros.rs b/tests/all/component_model/macros.rs index 6297d5b1b9..55410203b1 100644 --- a/tests/all/component_model/macros.rs +++ b/tests/all/component_model/macros.rs @@ -2,9 +2,9 @@ use super::{make_echo_component, TypedFuncExt}; use anyhow::Result; -use component_macro_test::{add_variants, flags_test}; use wasmtime::component::{Component, ComponentType, Lift, Linker, Lower}; use wasmtime::{Engine, Store}; +use wasmtime_test_macros::{add_variants, flags_test}; #[test] fn record_derive() -> Result<()> { @@ -340,7 +340,7 @@ fn enum_derive() -> Result<()> { #[test] fn flags() -> Result<()> { - let config = component_test_util::config(); + let config = wasmtime_test_util::component::config(); let engine = Engine::new(&config)?; let mut store = Store::new(&engine, ()); diff --git a/tests/all/component_model/strings.rs b/tests/all/component_model/strings.rs index 67d42ab456..de6c87392e 100644 --- a/tests/all/component_model/strings.rs +++ b/tests/all/component_model/strings.rs @@ -86,7 +86,7 @@ static ENCODINGS: [&str; 3] = ["utf8", "utf16", "latin1+utf16"]; #[test] fn roundtrip() -> Result<()> { for debug in [true, false] { - let mut config = component_test_util::config(); + let mut config = wasmtime_test_util::component::config(); config.debug_adapter_modules(debug); let engine = Engine::new(&config)?; for src in ENCODINGS { @@ -195,7 +195,7 @@ fn test_roundtrip(engine: &Engine, src: &str, dst: &str) -> Result<()> { #[test] fn ptr_out_of_bounds() -> Result<()> { - let engine = component_test_util::engine(); + let engine = wasmtime_test_util::component::engine(); for src in ENCODINGS { for dst in ENCODINGS { test_ptr_out_of_bounds(&engine, src, dst)?; @@ -264,7 +264,7 @@ fn test_ptr_out_of_bounds(engine: &Engine, src: &str, dst: &str) -> Result<()> { // happens. #[test] fn ptr_overflow() -> Result<()> { - let engine = component_test_util::engine(); + let engine = wasmtime_test_util::component::engine(); for src in ENCODINGS { for dst in ENCODINGS { test_ptr_overflow(&engine, src, dst)?; @@ -369,7 +369,7 @@ fn test_ptr_overflow(engine: &Engine, src: &str, dst: &str) -> Result<()> { // Test that that the pointer returned from `realloc` is bounds-checked. #[test] fn realloc_oob() -> Result<()> { - let engine = component_test_util::engine(); + let engine = wasmtime_test_util::component::engine(); for src in ENCODINGS { for dst in ENCODINGS { test_realloc_oob(&engine, src, dst)?; @@ -431,7 +431,7 @@ fn test_realloc_oob(engine: &Engine, src: &str, dst: &str) -> Result<()> { // Test that that the pointer returned from `realloc` is bounds-checked. #[test] fn raw_string_encodings() -> Result<()> { - let engine = component_test_util::engine(); + let engine = wasmtime_test_util::component::engine(); test_invalid_string_encoding(&engine, "utf8", "utf8", &[0xff], 1)?; let array = b"valid string until \xffthen valid again"; test_invalid_string_encoding(&engine, "utf8", "utf8", array, array.len() as u32)?; diff --git a/tests/all/debug/lldb.rs b/tests/all/debug/lldb.rs index 68339e556a..6a3043d464 100644 --- a/tests/all/debug/lldb.rs +++ b/tests/all/debug/lldb.rs @@ -6,6 +6,7 @@ use std::env; use std::io::Write; use std::process::Command; use tempfile::NamedTempFile; +use test_programs_artifacts as assets; fn lldb_with_script(args: &[&str], script: &str) -> Result { let lldb_path = env::var("LLDB").unwrap_or("lldb".to_string()); @@ -70,7 +71,7 @@ pub fn test_debug_dwarf_lldb() -> Result<()> { "-Ddebug-info", "--invoke", "fib", - "tests/all/debug/testsuite/fib-wasm.wasm", + assets::FIB_WASM_WASM_PATH, "3", ], r#"b fib @@ -107,7 +108,7 @@ pub fn test_debug_dwarf5_lldb() -> Result<()> { "-Ddebug-info", "--invoke", "fib", - "tests/all/debug/testsuite/fib-wasm-dwarf5.wasm", + assets::FIB_WASM_DWARF5_WASM_PATH, "3", ], r#"b fib @@ -144,7 +145,7 @@ pub fn test_debug_split_dwarf4_lldb() -> Result<()> { "-Ddebug-info", "--invoke", "fib", - "tests/all/debug/testsuite/fib-wasm-split4.wasm", + assets::FIB_WASM_SPLIT4_WASM_PATH, "3", ], r#"b fib @@ -180,7 +181,7 @@ pub fn test_debug_dwarf_generic_lldb() -> Result<()> { "-Ccache=n", "-Ddebug-info", "-Oopt-level=0", - "tests/all/debug/testsuite/generic.wasm", + assets::GENERIC_WASM_PATH, ], r#"br set -n debug_break -C up r @@ -225,6 +226,41 @@ check: exited with status = 0 Ok(()) } +#[test] +#[ignore] +pub fn test_debug_codegen_optimized_lldb() -> Result<()> { + let output = lldb_with_script( + &[ + "-Ccache=n", + "-Ddebug-info", + "-Oopt-level=2", + assets::CODEGEN_OPTIMIZED_WASM_PATH, + ], + r#"b InitializeTest +r +b codegen-optimized.cpp:25 +b codegen-optimized.cpp:26 +c +v x +c +v x +c"#, + )?; + + check_lldb_output( + &output, + r#" +check: stop reason = breakpoint 1.1 +check: stop reason = breakpoint 2.1 +check: x = 42 +check: stop reason = breakpoint 3.1 +check: x = +check: exited with status = 0 +"#, + )?; + Ok(()) +} + #[test] #[ignore] pub fn test_debug_dwarf_ref() -> Result<()> { @@ -233,7 +269,7 @@ pub fn test_debug_dwarf_ref() -> Result<()> { "-Ccache=n", "-Oopt-level=0", "-Ddebug-info", - "tests/all/debug/testsuite/fraction-norm.wasm", + assets::FRACTION_NORM_WASM_PATH, ], r#"b fraction-norm.cc:26 r @@ -263,7 +299,7 @@ pub fn test_debug_inst_offsets_are_correct_when_branches_are_removed() -> Result "-Ccache=n", "-Oopt-level=0", "-Ddebug-info", - "tests/all/debug/testsuite/two_removed_branches.wasm", + assets::TWO_REMOVED_BRANCHES_WASM_PATH, ], r#"r"#, )?; @@ -286,7 +322,7 @@ pub fn test_spilled_frame_base_is_accessible() -> Result<()> { "-Ccache=n", "-Oopt-level=0", "-Ddebug-info", - "tests/all/debug/testsuite/spilled_frame_base.wasm", + assets::SPILLED_FRAME_BASE_WASM_PATH, ], r#"b spilled_frame_base.c:8 r @@ -336,11 +372,7 @@ int main() #[ignore] pub fn test_debug_dwarf5_fission_lldb() -> Result<()> { let output = lldb_with_script( - &[ - "-Ccache=n", - "-Ddebug-info", - "tests/all/debug/testsuite/dwarf_fission.wasm", - ], + &["-Ccache=n", "-Ddebug-info", assets::DWARF_FISSION_WASM_PATH], r#"breakpoint set --file dwarf_fission.c --line 6 r fr v diff --git a/tests/all/debug/testsuite/codegen-optimized.cpp b/tests/all/debug/testsuite/codegen-optimized.cpp new file mode 100644 index 0000000000..d6bb397b71 --- /dev/null +++ b/tests/all/debug/testsuite/codegen-optimized.cpp @@ -0,0 +1,35 @@ +// clang-format off +// clang -o codegen-optimized.wasm -target wasm32-unknown-wasip1 -g codegen-optimized.cpp +// clang-format on + +// Make sure to adjust the break locations in lldb.rs when modifying the test. +#define BREAKPOINT + +int InvalidateRegisters() { + int r1 = -1; + int r2 = -2; + int r3 = -3; + int r4 = -4; + int r5 = -5; + int r6 = -6; + int r7 = -7; + int r8 = -8; + return r1 + r2 + r3 + r4 + r5 + r6 + r7 + r8; +} + +void VariableWithSimpleLifetime() { + // Here we are testing that the value range of "x" is correctly recorded + // as being bound by a loclist that is shorted than the entire method body, + // even as the location can be represented with a single DWARF expression. + int x = 42; + InvalidateRegisters(); + BREAKPOINT; +} + +void InitializeTest() {} + +int main(int argc, char *argv[]) { + InitializeTest(); + VariableWithSimpleLifetime(); + return 0; +} diff --git a/tests/all/debug/testsuite/generic.cpp b/tests/all/debug/testsuite/generic.cpp index 150157aa33..dc718c88cb 100644 --- a/tests/all/debug/testsuite/generic.cpp +++ b/tests/all/debug/testsuite/generic.cpp @@ -1,5 +1,5 @@ // clang-format off -// clang generic.cpp generic-satellite.cpp -o generic.wasm -g -target wasm32-unknown-wasip1 +// clang -o generic.wasm -target wasm32-unknown-wasip1 -g generic.cpp generic-satellite.cpp // clang-format on // #include "generic.h" diff --git a/tests/all/debug/testsuite/generic.wasm b/tests/all/debug/testsuite/generic.wasm deleted file mode 100644 index 108e5d88bc..0000000000 Binary files a/tests/all/debug/testsuite/generic.wasm and /dev/null differ diff --git a/tests/all/gc.rs b/tests/all/gc.rs index 9bd2455fd2..6c02ac9e96 100644 --- a/tests/all/gc.rs +++ b/tests/all/gc.rs @@ -80,6 +80,14 @@ fn smoke_test_gc_impl(use_epochs: bool) -> Result<()> { Ok(()) } +struct CountDrops(Arc); + +impl Drop for CountDrops { + fn drop(&mut self) { + self.0.fetch_add(1, SeqCst); + } +} + #[test] #[cfg_attr(miri, ignore)] fn wasm_dropping_refs() -> Result<()> { @@ -115,14 +123,6 @@ fn wasm_dropping_refs() -> Result<()> { assert_eq!(num_refs_dropped.load(SeqCst), 4096); return Ok(()); - - struct CountDrops(Arc); - - impl Drop for CountDrops { - fn drop(&mut self) { - self.0.fetch_add(1, SeqCst); - } - } } #[test] @@ -1053,3 +1053,179 @@ fn issue_9669() -> Result<()> { Ok(()) } + +#[test] +fn drc_transitive_drop_cons_list() -> Result<()> { + let _ = env_logger::try_init(); + + let mut config = Config::new(); + config.wasm_function_references(true); + config.wasm_gc(true); + config.collector(Collector::DeferredReferenceCounting); + + let engine = Engine::new(&config)?; + + // Define a module that defines a recursive type (a `cons` list of + // `externref`s) and exports a global of that type so that we can access it + // from the host, because we don't yet have host APIs for defining recursive + // types or rec groups. + let module = Module::new( + &engine, + r#" + (module + (type $cons (struct (field externref) (field (ref null $cons)))) + (global (export "g") (ref null $cons) (ref.null $cons)) + ) + "#, + )?; + + let export = module.exports().nth(0).unwrap().ty(); + let global = export.unwrap_global(); + let ref_ty = global.content().unwrap_ref(); + let struct_ty = ref_ty.heap_type().unwrap_concrete_struct(); + + let mut store = Store::new(&engine, ()); + + let pre = StructRefPre::new(&mut store, struct_ty.clone()); + let num_refs_dropped = Arc::new(AtomicUsize::new(0)); + + let len = if cfg!(miri) { 2 } else { 100 }; + { + let mut store = RootScope::new(&mut store); + + let mut cdr = None; + for _ in 0..len { + let externref = ExternRef::new(&mut store, CountDrops(num_refs_dropped.clone()))?; + let cons = StructRef::new(&mut store, &pre, &[externref.into(), cdr.into()])?; + cdr = Some(cons); + } + + // Still holding the cons list alive at this point. + assert_eq!(num_refs_dropped.load(SeqCst), 0); + } + + // Not holding the cons list alive anymore; should transitively drop + // everything we created. + store.gc(); + assert_eq!(num_refs_dropped.load(SeqCst), len); + + Ok(()) +} + +#[test] +fn drc_transitive_drop_nested_arrays_tree() -> Result<()> { + let _ = env_logger::try_init(); + + let mut config = Config::new(); + config.wasm_function_references(true); + config.wasm_gc(true); + config.collector(Collector::DeferredReferenceCounting); + + let engine = Engine::new(&config)?; + + let array_ty = ArrayType::new( + &engine, + FieldType::new( + Mutability::Var, + StorageType::ValType(ValType::Ref(RefType::ANYREF)), + ), + ); + + let mut store = Store::new(&engine, ()); + let pre = ArrayRefPre::new(&mut store, array_ty); + let num_refs_dropped = Arc::new(AtomicUsize::new(0)); + let mut expected = 0; + + fn recursively_build_tree( + mut store: &mut RootScope<&mut Store<()>>, + pre: &ArrayRefPre, + num_refs_dropped: &Arc, + expected: &mut usize, + depth: u32, + ) -> Result> { + let max = if cfg!(miri) { 1 } else { 3 }; + if depth >= max { + *expected += 1; + let e = ExternRef::new(&mut store, CountDrops(num_refs_dropped.clone()))?; + AnyRef::convert_extern(&mut store, e) + } else { + let left = recursively_build_tree(store, pre, num_refs_dropped, expected, depth + 1)?; + let right = recursively_build_tree(store, pre, num_refs_dropped, expected, depth + 1)?; + let arr = ArrayRef::new_fixed(store, pre, &[left.into(), right.into()])?; + Ok(arr.to_anyref()) + } + } + + { + let mut store = RootScope::new(&mut store); + let _tree = recursively_build_tree(&mut store, &pre, &num_refs_dropped, &mut expected, 0)?; + + // Still holding the tree alive at this point. + assert_eq!(num_refs_dropped.load(SeqCst), 0); + } + + // Not holding the tree alive anymore; should transitively drop everything + // we created. + store.gc(); + assert_eq!(num_refs_dropped.load(SeqCst), expected); + + Ok(()) +} + +#[test] +#[cfg_attr(miri, ignore)] +fn drc_traces_the_correct_number_of_gc_refs_in_arrays() -> Result<()> { + let _ = env_logger::try_init(); + + let mut config = Config::new(); + config.wasm_function_references(true); + config.wasm_gc(true); + config.collector(Collector::DeferredReferenceCounting); + + let engine = Engine::new(&config)?; + let mut store = Store::new(&engine, ()); + + // The DRC collector was mistakenly reporting that arrays of GC refs had + // `size_of(elems)` outgoing edges, rather than `len(elems)` edges. None of + // our existing tests happened to trigger this bug because although we were + // tricking the collector into tracing unallocated GC heap memory, it was + // all zeroed out and was treated as null GC references. We can avoid that + // in this regression test by first painting the heap with a large poison + // value before we start allocating arrays, so that if the GC tries tracing + // bogus heap memory, it finds very large GC ref heap indices and ultimately + // tries to follow them outside the bounds of the GC heap, which (before + // this bug was fixed) would lead to a panic. + + let array_i8_ty = ArrayType::new(&engine, FieldType::new(Mutability::Var, StorageType::I8)); + let array_i8_pre = ArrayRefPre::new(&mut store, array_i8_ty); + + { + let mut store = RootScope::new(&mut store); + + // Spray a poison pattern across the heap. + let len = 1_000_000; + let _poison = ArrayRef::new(&mut store, &array_i8_pre, &Val::I32(-1), len); + } + + // Make sure the poison array is collected. + store.gc(); + + // Allocate and then collect an array of GC refs from Wasm. This should not + // trick the collector into tracing any poison and panicking. + let module = Module::new( + &engine, + r#" + (module + (type $ty (array (mut anyref))) + (start $f) + (func $f + (drop (array.new $ty (ref.null any) (i32.const 1_000))) + ) + ) + "#, + )?; + let _instance = Instance::new(&mut store, &module, &[])?; + store.gc(); + + Ok(()) +} diff --git a/tests/all/linker.rs b/tests/all/linker.rs index 6ff4ad8c20..3ebc3e0e67 100644 --- a/tests/all/linker.rs +++ b/tests/all/linker.rs @@ -420,7 +420,7 @@ fn test_default_value_unknown_import() -> Result<()> { let module = Module::new(store.engine(), WAT).expect("failed to create module"); let mut linker = Linker::new(store.engine()); - linker.define_unknown_imports_as_default_values(&module)?; + linker.define_unknown_imports_as_default_values(&mut store, &module)?; let instance = linker.instantiate(&mut store, &module)?; // "run" calls an import function which will not be defined, so it should diff --git a/tests/all/main.rs b/tests/all/main.rs index 1922c1393a..c6a6cad6f6 100644 --- a/tests/all/main.rs +++ b/tests/all/main.rs @@ -118,3 +118,17 @@ pub(crate) fn gc_store() -> wasmtime::Result> { let engine = wasmtime::Engine::new(&config)?; Ok(wasmtime::Store::new(&engine, ())) } + +trait ErrorExt { + fn assert_contains(&self, msg: &str); +} + +impl ErrorExt for anyhow::Error { + fn assert_contains(&self, msg: &str) { + if self.chain().any(|e| e.to_string().contains(msg)) { + return; + } + + panic!("failed to find:\n{msg}\n\nwithin error message:\n{self:?}") + } +} diff --git a/tests/all/module.rs b/tests/all/module.rs index 9de373afba..7a6ee84bba 100644 --- a/tests/all/module.rs +++ b/tests/all/module.rs @@ -1,7 +1,9 @@ use anyhow::Context; use std::sync::atomic::{AtomicBool, Ordering::Relaxed}; use std::sync::Arc; +use target_lexicon::Triple; use wasmtime::*; +use wasmtime_environ::TripleExt; use wasmtime_test_macros::wasmtime_test; #[test] @@ -580,3 +582,70 @@ fn validate_deterministic() { .to_string(); assert_eq!(result_parallel, result_sequential); } + +#[test] +#[cfg_attr(miri, ignore)] +fn deserialize_raw_avoids_copy() { + // target pulley; executing code directly requires virtual memory + let mut config = Config::new(); + let target = format!("{}", Triple::pulley_host()); + config.target(&target).unwrap(); + let engine = Engine::new(&config).unwrap(); + let wat = String::from( + r#" + (module + (func (export "add") (param $lhs i32) (param $rhs i32) (result i32) + (i32.add (local.get $lhs) (local.get $rhs)) + ) + ) + "#, + ); + let module = Module::new(&engine, &wat).unwrap(); + let mut serialized = module.serialize().expect("Serialize failed"); + let serialized_ptr = std::ptr::slice_from_raw_parts(serialized.as_mut_ptr(), serialized.len()); + let module_memory = std::ptr::NonNull::new(serialized_ptr.cast_mut()).unwrap(); + let deserialized_module = + unsafe { Module::deserialize_raw(&engine, module_memory).expect("Deserialize Failed") }; + + // assert that addresses haven't changed, no full copy + // TODO: haven't been able to find a pub way of doing this + + // basic verification that the loaded module works + let mut store = Store::new(&engine, ()); + let instance = Instance::new(&mut store, &deserialized_module, &[]).unwrap(); + let f = instance + .get_typed_func::<(i32, i32), i32>(&mut store, "add") + .unwrap(); + assert_eq!(f.call(&mut store, (26, 50)).unwrap(), 76); +} + +#[test] +#[cfg_attr(miri, ignore)] +fn deserialize_raw_fails_for_native() { + // target pulley + let engine = Engine::default(); + let wat = String::from( + r#" + (module + (func (export "add") (param $lhs i32) (param $rhs i32) (result i32) + (i32.add (local.get $lhs) (local.get $rhs)) + ) + ) + "#, + ); + let module = Module::new(&engine, &wat).unwrap(); + let mut serialized = module.serialize().expect("Serialize failed"); + let serialized_ptr = std::ptr::slice_from_raw_parts(serialized.as_mut_ptr(), serialized.len()); + let module_memory = std::ptr::NonNull::new(serialized_ptr.cast_mut()).unwrap(); + let deserialize_res = unsafe { Module::deserialize_raw(&engine, module_memory) }; + + if engine.is_pulley() { + let _mod = deserialize_res.expect("Module should deserialize fine for pulley"); + } else { + let err = deserialize_res.expect_err("Deserialization should fail for host target"); + assert_eq!( + format!("{err}"), + "this target requires virtual memory to be enabled" + ); + } +} diff --git a/tests/all/module_serialize.rs b/tests/all/module_serialize.rs index f3804a0463..3884145eec 100644 --- a/tests/all/module_serialize.rs +++ b/tests/all/module_serialize.rs @@ -145,10 +145,10 @@ fn detect_precompiled() -> Result<()> { &engine, "(module (func (export \"run\") (result i32) i32.const 42))", )?; - assert_eq!(engine.detect_precompiled(&[]), None); - assert_eq!(engine.detect_precompiled(&buffer[..5]), None); + assert_eq!(Engine::detect_precompiled(&[]), None); + assert_eq!(Engine::detect_precompiled(&buffer[..5]), None); assert_eq!( - engine.detect_precompiled(&buffer), + Engine::detect_precompiled(&buffer), Some(Precompiled::Module) ); Ok(()) diff --git a/tests/all/pooling_allocator.rs b/tests/all/pooling_allocator.rs index abd3470cbf..76736b7824 100644 --- a/tests/all/pooling_allocator.rs +++ b/tests/all/pooling_allocator.rs @@ -1,4 +1,4 @@ -use super::skip_pooling_allocator_tests; +use super::{skip_pooling_allocator_tests, ErrorExt}; use wasmtime::*; #[test] @@ -35,18 +35,17 @@ fn memory_limit() -> Result<()> { // Module should fail to instantiate because it has too many memories match Module::new(&engine, r#"(module (memory 1) (memory 1))"#) { Ok(_) => panic!("module instantiation should fail"), - Err(e) => assert_eq!( - e.to_string(), - "defined memories count of 2 exceeds the per-instance limit of 1", - ), + Err(e) => { + e.assert_contains("defined memories count of 2 exceeds the per-instance limit of 1") + } } // Module should fail to instantiate because the minimum is greater than // the configured limit match Module::new(&engine, r#"(module (memory 4))"#) { Ok(_) => panic!("module instantiation should fail"), - Err(e) => assert_eq!( - e.to_string(), + Err(e) => + e.assert_contains( "memory index 0 has a minimum byte size of 262144 which exceeds the limit of 0x30000 bytes", ), } @@ -244,18 +243,16 @@ fn table_limit() -> Result<()> { // Module should fail to instantiate because it has too many tables match Module::new(&engine, r#"(module (table 1 funcref) (table 1 funcref))"#) { Ok(_) => panic!("module compilation should fail"), - Err(e) => assert_eq!( - e.to_string(), - "defined tables count of 2 exceeds the per-instance limit of 1", - ), + Err(e) => { + e.assert_contains("defined tables count of 2 exceeds the per-instance limit of 1") + } } // Module should fail to instantiate because the minimum is greater than // the configured limit match Module::new(&engine, r#"(module (table 31 funcref))"#) { Ok(_) => panic!("module compilation should fail"), - Err(e) => assert_eq!( - e.to_string(), + Err(e) => e.assert_contains( "table index 0 has a minimum element size of 31 which exceeds the limit of 10", ), } @@ -634,26 +631,14 @@ fn instance_too_large() -> Result<()> { config.allocation_strategy(pool); let engine = Engine::new(&config)?; - let expected = if cfg!(feature = "wmemcheck") { - "\ - instance allocation for this module requires 336 bytes which exceeds the \ -configured maximum of 16 bytes; breakdown of allocation requirement: - - * 76.19% - 256 bytes - instance state management - * 23.81% - 80 bytes - static vmctx data -" - } else { - "\ -instance allocation for this module requires 240 bytes which exceeds the \ -configured maximum of 16 bytes; breakdown of allocation requirement: - - * 66.67% - 160 bytes - instance state management - * 33.33% - 80 bytes - static vmctx data -" - }; match Module::new(&engine, "(module)") { Ok(_) => panic!("should have failed to compile"), - Err(e) => assert_eq!(e.to_string(), expected), + Err(e) => { + e.assert_contains("exceeds the configured maximum of 16 bytes"); + e.assert_contains("breakdown of allocation requirement"); + e.assert_contains("instance state management"); + e.assert_contains("static vmctx data"); + } } let mut lots_of_globals = format!("(module"); @@ -662,26 +647,14 @@ configured maximum of 16 bytes; breakdown of allocation requirement: } lots_of_globals.push_str(")"); - let expected = if cfg!(feature = "wmemcheck") { - "\ -instance allocation for this module requires 1936 bytes which exceeds the \ -configured maximum of 16 bytes; breakdown of allocation requirement: - - * 13.22% - 256 bytes - instance state management - * 82.64% - 1600 bytes - defined globals -" - } else { - "\ -instance allocation for this module requires 1840 bytes which exceeds the \ -configured maximum of 16 bytes; breakdown of allocation requirement: - - * 8.70% - 160 bytes - instance state management - * 86.96% - 1600 bytes - defined globals -" - }; match Module::new(&engine, &lots_of_globals) { Ok(_) => panic!("should have failed to compile"), - Err(e) => assert_eq!(e.to_string(), expected), + Err(e) => { + e.assert_contains("exceeds the configured maximum of 16 bytes"); + e.assert_contains("breakdown of allocation requirement"); + e.assert_contains("defined globals"); + e.assert_contains("instance state management"); + } } Ok(()) @@ -879,10 +852,9 @@ fn component_instance_size_limit() -> Result<()> { match wasmtime::component::Component::new(&engine, "(component)") { Ok(_) => panic!("should have hit limit"), - Err(e) => assert_eq!( - e.to_string(), - "instance allocation for this component requires 48 bytes of `VMComponentContext` space \ - which exceeds the configured maximum of 1 bytes" + Err(e) => e.assert_contains( + "instance allocation for this component requires 48 bytes of \ + `VMComponentContext` space which exceeds the configured maximum of 1 bytes", ), } @@ -1047,10 +1019,9 @@ fn component_core_instances_limit() -> Result<()> { "#, ) { Ok(_) => panic!("should have hit limit"), - Err(e) => assert_eq!( - e.to_string(), + Err(e) => e.assert_contains( "The component transitively contains 2 core module instances, which exceeds the \ - configured maximum of 1" + configured maximum of 1", ), } @@ -1090,10 +1061,9 @@ fn component_memories_limit() -> Result<()> { "#, ) { Ok(_) => panic!("should have hit limit"), - Err(e) => assert_eq!( - e.to_string(), + Err(e) => e.assert_contains( "The component transitively contains 2 Wasm linear memories, which exceeds the \ - configured maximum of 1" + configured maximum of 1", ), } @@ -1133,10 +1103,9 @@ fn component_tables_limit() -> Result<()> { "#, ) { Ok(_) => panic!("should have hit limit"), - Err(e) => assert_eq!( - e.to_string(), + Err(e) => e.assert_contains( "The component transitively contains 2 tables, which exceeds the \ - configured maximum of 1" + configured maximum of 1", ), } @@ -1281,13 +1250,9 @@ fn shared_memory_unsupported() -> Result<()> { "#, ) .unwrap_err(); - let err = err.to_string(); - assert!( - err.contains( - "memory index 0 is shared which is not supported \ - in the pooling allocator" - ), - "bad error: {err}" + err.assert_contains( + "memory index 0 is shared which is not supported \ + in the pooling allocator", ); Ok(()) } diff --git a/tests/all/traps.rs b/tests/all/traps.rs index cab0bb6bb5..8da2418f94 100644 --- a/tests/all/traps.rs +++ b/tests/all/traps.rs @@ -1,5 +1,6 @@ #![cfg(not(miri))] +use crate::ErrorExt; use anyhow::bail; use std::panic::{self, AssertUnwindSafe}; use std::process::Command; @@ -25,7 +26,7 @@ fn test_trap_return() -> Result<()> { let run_func = instance.get_typed_func::<(), ()>(&mut store, "run")?; let e = run_func.call(&mut store, ()).unwrap_err(); - assert!(format!("{e:?}").contains("test 123")); + e.assert_contains("test 123"); assert!( e.downcast_ref::().is_some(), @@ -55,8 +56,7 @@ fn test_anyhow_error_return() -> Result<()> { let run_func = instance.get_typed_func::<(), ()>(&mut store, "run")?; let e = run_func.call(&mut store, ()).unwrap_err(); - assert!(!e.to_string().contains("test 1234")); - assert!(format!("{e:?}").contains("Caused by:\n test 1234")); + e.assert_contains("test 1234"); assert!(e.downcast_ref::().is_none()); assert!(e.downcast_ref::().is_some()); @@ -96,11 +96,9 @@ fn test_trap_return_downcast() -> Result<()> { .call(&mut store, ()) .err() .expect("error calling function"); - let dbg = format!("{e:?}"); - println!("{dbg}"); assert!(!e.to_string().contains("my trap")); - assert!(dbg.contains("Caused by:\n my trap")); + e.assert_contains("my trap"); e.downcast_ref::() .expect("error downcasts to MyTrap"); @@ -259,7 +257,7 @@ fn test_trap_trace_cb() -> Result<()> { assert_eq!(trace[0].func_index(), 2); assert_eq!(trace[1].module().name().unwrap(), "hello_mod"); assert_eq!(trace[1].func_index(), 1); - assert!(format!("{e:?}").contains("cb throw")); + e.assert_contains("cb throw"); Ok(()) } @@ -308,19 +306,16 @@ fn trap_display_pretty() -> Result<()> { let run_func = instance.get_typed_func::<(), ()>(&mut store, "bar")?; let e = run_func.call(&mut store, ()).unwrap_err(); - let e = format!("{e:?}"); - assert!(e.contains( + e.assert_contains( "\ error while executing at wasm backtrace: - 0: 0x23 - m!die - 1: 0x27 - m! - 2: 0x2c - m!foo - 3: 0x31 - m! - -Caused by: - wasm trap: wasm `unreachable` instruction executed\ -" - )); + 0: 0x23 - m!die + 1: 0x27 - m! + 2: 0x2c - m!foo + 3: 0x31 - m!", + ); + + e.assert_contains("wasm trap: wasm `unreachable` instruction executed"); Ok(()) } @@ -352,21 +347,17 @@ fn trap_display_multi_module() -> Result<()> { let bar2 = instance.get_typed_func::<(), ()>(&mut store, "bar2")?; let e = bar2.call(&mut store, ()).unwrap_err(); - let e = format!("{e:?}"); - assert!(e.contains( + e.assert_contains( "\ error while executing at wasm backtrace: - 0: 0x23 - a!die - 1: 0x27 - a! - 2: 0x2c - a!foo - 3: 0x31 - a! - 4: 0x29 - b!middle - 5: 0x2e - b! - -Caused by: - wasm trap: wasm `unreachable` instruction executed\ -" - )); + 0: 0x23 - a!die + 1: 0x27 - a! + 2: 0x2c - a!foo + 3: 0x31 - a! + 4: 0x29 - b!middle + 5: 0x2e - b!", + ); + e.assert_contains("wasm trap: wasm `unreachable` instruction executed"); Ok(()) } @@ -386,7 +377,7 @@ fn trap_start_function_import() -> Result<()> { let sig = FuncType::new(store.engine(), None, None); let func = Func::new(&mut store, sig, |_, _, _| bail!("user trap")); let err = Instance::new(&mut store, &module, &[func.into()]).unwrap_err(); - assert!(format!("{err:?}").contains("user trap")); + err.assert_contains("user trap"); Ok(()) } @@ -533,9 +524,8 @@ fn mismatched_arguments() -> Result<()> { "expected 1 arguments, got 0" ); let e = func.call(&mut store, &[Val::F32(0)], &mut []).unwrap_err(); - let e = format!("{e:?}"); - assert!(e.contains("argument type mismatch")); - assert!(e.contains("expected i32, found f32")); + e.assert_contains("argument type mismatch"); + e.assert_contains("expected i32, found f32"); assert_eq!( func.call(&mut store, &[Val::I32(0), Val::I32(1)], &mut []) .unwrap_err() @@ -564,14 +554,9 @@ fn call_signature_mismatch() -> Result<()> { )?; let module = Module::new(store.engine(), &binary)?; - let err = Instance::new(&mut store, &module, &[]) - .err() - .unwrap() - .downcast::() - .unwrap(); - assert!(err - .to_string() - .contains("wasm trap: indirect call type mismatch")); + let err = Instance::new(&mut store, &module, &[]).err().unwrap(); + err.downcast_ref::().unwrap(); + err.assert_contains("wasm trap: indirect call type mismatch"); Ok(()) } @@ -591,21 +576,19 @@ fn start_trap_pretty() -> Result<()> { let module = Module::new(store.engine(), wat)?; let e = match Instance::new(&mut store, &module, &[]) { Ok(_) => panic!("expected failure"), - Err(e) => format!("{e:?}"), + Err(e) => e, }; - assert!(e.contains( + e.assert_contains( "\ error while executing at wasm backtrace: - 0: 0x1d - m!die - 1: 0x21 - m! - 2: 0x26 - m!foo - 3: 0x2b - m!start - -Caused by: - wasm trap: wasm `unreachable` instruction executed\ -" - )); + 0: 0x1d - m!die + 1: 0x21 - m! + 2: 0x26 - m!foo + 3: 0x2b - m!start", + ); + + e.assert_contains("wasm trap: wasm `unreachable` instruction executed"); Ok(()) } @@ -793,17 +776,14 @@ fn no_hint_even_with_dwarf_info() -> Result<()> { "#, )?; let trap = Instance::new(&mut store, &module, &[]).unwrap_err(); - let trap = format!("{trap:?}"); - assert!(trap.contains( + trap.assert_contains( "\ error while executing at wasm backtrace: - 0: 0x1a - !start + 0: 0x1a - !start", + ); -Caused by: - wasm trap: wasm `unreachable` instruction executed\ -" - )); - assert!(!trap.contains("WASM_BACKTRACE_DETAILS")); + trap.assert_contains("wasm trap: wasm `unreachable` instruction executed"); + assert!(!format!("{trap:?}").contains("WASM_BACKTRACE_DETAILS")); Ok(()) } @@ -827,16 +807,12 @@ fn hint_with_dwarf_info() -> Result<()> { "#, )?; let trap = Instance::new(&mut store, &module, &[]).unwrap_err(); - let trap = format!("{trap:?}"); - assert!(trap.contains( + trap.assert_contains( "\ error while executing at wasm backtrace: - 0: 0x1a - !start -note: using the `WASMTIME_BACKTRACE_DETAILS=1` environment variable may show more debugging information - -Caused by: - wasm trap: wasm `unreachable` instruction executed" - )); + 0: 0x1a - !start +note: using the `WASMTIME_BACKTRACE_DETAILS=1` environment variable may show more debugging information"); + trap.assert_contains("wasm trap: wasm `unreachable` instruction executed"); Ok(()) } @@ -936,10 +912,7 @@ fn catch_trap_calling_across_stores() -> Result<()> { .expect("trap function should be exported"); let trap = func.call(&mut data.child_store, ()).unwrap_err(); - assert!( - format!("{trap:?}").contains("unreachable"), - "trap should contain 'unreachable', got: {trap:?}" - ); + trap.assert_contains("unreachable"); let trace = trap.downcast_ref::().unwrap().frames(); @@ -1394,8 +1367,7 @@ fn wasm_fault_address_reported_from_mpk_protected_memory() -> Result<()> { // We expect an error here, not an abort; but we also check that the store // can now calculate the correct Wasm address. If this test is failing with // an abort, use `--nocapture` to see more details. - let err = format!("{err:?}"); - assert!(err.contains("0xdeadbeef"), "bad error: {err}"); + err.assert_contains("0xdeadbeef"); Ok(()) } @@ -1547,7 +1519,7 @@ fn dont_see_stale_stack_walking_registers() -> Result<()> { let get_trap = instance.get_func(&mut store, "get_trap").unwrap(); let err = get_trap.call(&mut store, &[], &mut []).unwrap_err(); - assert!(err.to_string().contains("trap!!!")); + err.assert_contains("trap!!!"); Ok(()) } @@ -1707,7 +1679,7 @@ fn tail_call_to_imported_function(config: &mut Config) -> Result<()> { let run = instance.get_typed_func::<(), i32>(&mut store, "run")?; let err = run.call(&mut store, ()).unwrap_err(); - assert!(err.to_string().contains("whoopsie")); + err.assert_contains("whoopsie"); Ok(()) } @@ -1734,7 +1706,7 @@ fn tail_call_to_imported_function_in_start_function(config: &mut Config) -> Resu let mut store = Store::new(&engine, ()); let host_func = Func::wrap(&mut store, || -> Result<()> { bail!("whoopsie") }); let err = Instance::new(&mut store, &module, &[host_func.into()]).unwrap_err(); - assert!(err.to_string().contains("whoopsie")); + err.assert_contains("whoopsie"); Ok(()) } @@ -1761,7 +1733,7 @@ fn return_call_ref_to_imported_function(config: &mut Config) -> Result<()> { let run = instance.get_typed_func::(&mut store, "run")?; let err = run.call(&mut store, host_func).unwrap_err(); - assert!(err.to_string().contains("whoopsie")); + err.assert_contains("whoopsie"); Ok(()) } @@ -1789,7 +1761,7 @@ fn return_call_indirect_to_imported_function(config: &mut Config) -> Result<()> let run = instance.get_typed_func::<(), i32>(&mut store, "run")?; let err = run.call(&mut store, ()).unwrap_err(); - assert!(err.to_string().contains("whoopsie")); + err.assert_contains("whoopsie"); Ok(()) } diff --git a/tests/disas.rs b/tests/disas.rs index 678879b52c..ca77a5ceae 100644 --- a/tests/disas.rs +++ b/tests/disas.rs @@ -42,19 +42,16 @@ use anyhow::{bail, Context, Result}; use clap::Parser; use cranelift_codegen::ir::{Function, UserExternalName, UserFuncName}; -use cranelift_codegen::isa::{lookup_by_name, TargetIsa}; -use cranelift_codegen::settings::{Configurable, Flags, SetError}; use libtest_mimic::{Arguments, Trial}; -use pulley_interpreter::decode::OpVisitor; use serde_derive::Deserialize; use similar::TextDiff; -use std::fmt::Write; +use std::fmt::Write as _; +use std::io::Write as _; use std::path::{Path, PathBuf}; -use std::sync::Arc; +use std::process::Stdio; use tempfile::TempDir; use wasmtime::{Engine, OptLevel, Strategy}; use wasmtime_cli_flags::CommonOptions; -use wasmtime_environ::TripleExt; fn main() -> Result<()> { if cfg!(miri) { @@ -102,9 +99,8 @@ fn find_tests(path: &Path, dst: &mut Vec) -> Result<()> { fn run_test(path: &Path) -> Result<()> { let mut test = Test::new(path)?; let output = test.compile()?; - let isa = test.build_target_isa()?; - assert_output(&test.path, &test.contents, &*isa, test.config.test, output)?; + assert_output(&test, output)?; Ok(()) } @@ -115,6 +111,7 @@ struct TestConfig { #[serde(default)] test: TestKind, flags: Option, + objdump: Option, } #[derive(Debug, Deserialize)] @@ -124,6 +121,15 @@ enum TestConfigFlags { List(Vec), } +impl TestConfigFlags { + fn to_vec(&self) -> Vec<&str> { + match self { + TestConfigFlags::SpaceSeparated(s) => s.split_whitespace().collect(), + TestConfigFlags::List(s) => s.iter().map(|s| s.as_str()).collect(), + } + } +} + struct Test { path: PathBuf, contents: String, @@ -152,13 +158,11 @@ impl Test { fn new(path: &Path) -> Result { let contents = std::fs::read_to_string(path).with_context(|| format!("failed to read {path:?}"))?; - let config: TestConfig = wasmtime_wast_util::parse_test_config(&contents) + let config: TestConfig = wasmtime_test_util::wast::parse_test_config(&contents) .context("failed to parse test configuration as TOML")?; let mut flags = vec!["wasmtime"]; - match &config.flags { - Some(TestConfigFlags::SpaceSeparated(s)) => flags.extend(s.split_whitespace()), - Some(TestConfigFlags::List(s)) => flags.extend(s.iter().map(|s| s.as_str())), - None => {} + if let Some(config) = &config.flags { + flags.extend(config.to_vec()); } let opts = wasmtime_cli_flags::CommonOptions::try_parse_from(&flags)?; @@ -239,39 +243,6 @@ impl Test { TestKind::Compile | TestKind::Winch => Ok(CompileOutput::Elf(elf)), } } - - /// Use the test configuration present with CLI flags to build a - /// `TargetIsa` to compile/optimize the CLIF. - fn build_target_isa(&self) -> Result> { - let mut builder = lookup_by_name(&self.config.target)?; - let mut flags = cranelift_codegen::settings::builder(); - let opt_level = match self.opts.opts.opt_level { - None | Some(OptLevel::Speed) => "speed", - Some(OptLevel::SpeedAndSize) => "speed_and_size", - Some(OptLevel::None) => "none", - _ => unreachable!(), - }; - flags.set("opt_level", opt_level)?; - flags.set("preserve_frame_pointers", "true")?; - for (key, val) in self.opts.codegen.cranelift.iter() { - let key = &key.replace("-", "_"); - let target_res = match val { - Some(val) => builder.set(key, val), - None => builder.enable(key), - }; - match target_res { - Ok(()) => continue, - Err(SetError::BadName(_)) => {} - Err(e) => bail!(e), - } - match val { - Some(val) => flags.set(key, val)?, - None => flags.enable(key)?, - } - } - let isa = builder.finish(Flags::new(flags))?; - Ok(isa) - } } enum CompileOutput { @@ -280,199 +251,54 @@ enum CompileOutput { } /// Assert that `wat` contains the test expectations necessary for `funcs`. -fn assert_output( - path: &Path, - wat: &str, - isa: &dyn TargetIsa, - kind: TestKind, - output: CompileOutput, -) -> Result<()> { +fn assert_output(test: &Test, output: CompileOutput) -> Result<()> { let mut actual = String::new(); match output { CompileOutput::Clif(funcs) => { for mut func in funcs { - match kind { - TestKind::Compile | TestKind::Winch => unreachable!(), - TestKind::Optimize | TestKind::Clif => { - func.dfg.resolve_all_aliases(); - writeln!(&mut actual, "{}", func.display()).unwrap(); - } - } - } - } - CompileOutput::Elf(bytes) => match isa.to_capstone() { - Ok(disas) => disas_insts(&mut actual, &bytes, |bytes, addr| { - Ok(disas - .disasm_all(bytes, addr)? - .into_iter() - .map(|inst| { - use capstone::InsnGroupType::{CS_GRP_JUMP, CS_GRP_RET}; - - let detail = disas.insn_detail(&inst).ok(); - let detail = detail.as_ref(); - let is_jump = detail - .map(|d| { - d.groups() - .iter() - .find(|g| g.0 as u32 == CS_GRP_JUMP) - .is_some() - }) - .unwrap_or(false); - - let is_return = detail - .map(|d| { - d.groups() - .iter() - .find(|g| g.0 as u32 == CS_GRP_RET) - .is_some() - }) - .unwrap_or(false); - - let disassembly = match (inst.mnemonic(), inst.op_str()) { - (Some(i), Some(o)) => { - if o.is_empty() { - format!("{i}") - } else { - format!("{i:7} {o}") - } - } - (Some(i), None) => format!("{i}"), - _ => unreachable!(), - }; - - let address = inst.address(); - DisasInst { - address, - is_jump, - is_return, - disassembly, - } - }) - .collect::>()) - })?, - Err(_) => { - assert!(isa.triple().is_pulley()); - disas_insts(&mut actual, &bytes, |bytes, _addr| { - let mut result = vec![]; - - let mut disas = pulley_interpreter::disas::Disassembler::new(bytes); - disas.offsets(false); - disas.hexdump(false); - let mut decoder = pulley_interpreter::decode::Decoder::new(); - let mut last_disas_pos = 0; - loop { - let addr = disas.bytecode().position(); - - match decoder.decode_one(&mut disas) { - // If we got EOF at the initial position, then we're done disassembling. - Err(pulley_interpreter::decode::DecodingError::UnexpectedEof { - position, - }) if position == addr => break, - - // Otherwise, propagate the error. - Err(e) => { - return Err(anyhow::Error::from(e)) - .context("failed to disassembly pulley bytecode"); - } - - Ok(()) => { - let disassembly = disas.disas()[last_disas_pos..].trim(); - last_disas_pos = disas.disas().len(); - let address = u64::try_from(addr).unwrap(); - let is_jump = - disassembly.contains("jump") || disassembly.contains("br_"); - let is_return = disassembly == "ret"; - result.push(DisasInst { - address, - is_jump, - is_return, - disassembly: disassembly.to_string(), - }); - } - } - } - - Ok(result) - })? + func.dfg.resolve_all_aliases(); + writeln!(&mut actual, "{}", func.display()).unwrap(); } - }, - } - let actual = actual.trim(); - assert_or_bless_output(path, wat, actual) -} - -struct DisasInst { - address: u64, - is_jump: bool, - is_return: bool, - disassembly: String, -} - -fn disas_insts( - result: &mut String, - elf: &[u8], - disas: impl Fn(&[u8], u64) -> Result, -) -> Result<()> -where - I: IntoIterator, -{ - use object::{Endianness, Object, ObjectSection, ObjectSymbol}; - - let elf = object::read::elf::ElfFile64::::parse(elf)?; - let text = elf.section_by_name(".text").unwrap(); - let text = text.data()?; - let mut first = true; - for sym in elf.symbols() { - let name = match sym.name() { - Ok(name) => name, - Err(_) => continue, - }; - if !name.contains("wasm") || !name.contains("function") { - continue; } - - let bytes = &text[sym.address() as usize..][..sym.size() as usize]; - - if first { - first = false; - } else { - result.push_str("\n"); - } - writeln!(result, "{name}:")?; - - // By default don't write all the offsets of all the instructions. That - // means that small changes in the instruction sequence cause large - // diffs which aren't always the most readable. As a rough balance, - // print offset of instructions-after-jumps and anything-after-ret as - // that's a decent-enough heuristic for jump targets. - let mut prev_jump = false; - let mut write_offsets = false; - - for DisasInst { - address, - is_jump, - is_return, - disassembly: disas, - } in disas(bytes, sym.address())?.into_iter() - { - for (i, line) in disas.lines().enumerate() { - if i == 0 && (write_offsets || (prev_jump && !is_jump)) { - write!(result, "{address:>4x}: ")?; - } else { - write!(result, " ")?; + CompileOutput::Elf(bytes) => { + let mut cmd = wasmtime_test_util::command(env!("CARGO_BIN_EXE_wasmtime")); + cmd.arg("objdump") + .arg("--address-width=4") + .arg("--address-jumps") + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + match &test.config.objdump { + Some(args) => { + cmd.args(args.to_vec()); + } + None => { + cmd.arg("--traps=false"); } - writeln!(result, "{line}")?; } - prev_jump = is_jump; - - // Flip write_offsets to true once we've seen a `ret`, as - // instructions that follow the return are often related to trap - // tables. - write_offsets |= is_return; + let mut child = cmd.spawn().context("failed to run wasmtime")?; + child + .stdin + .take() + .unwrap() + .write_all(&bytes) + .context("failed to write stdin")?; + let output = child + .wait_with_output() + .context("failed to wait for child")?; + if !output.status.success() { + bail!( + "objdump failed: {}\nstderr: {}", + output.status, + String::from_utf8_lossy(&output.stderr), + ); + } + actual = String::from_utf8(output.stdout).unwrap(); } } - Ok(()) + let actual = actual.trim(); + assert_or_bless_output(&test.path, &test.contents, actual) } fn assert_or_bless_output(path: &Path, wat: &str, actual: &str) -> Result<()> { diff --git a/tests/disas/basic-wat-test.wat b/tests/disas/basic-wat-test.wat index b0be34af99..d027108753 100644 --- a/tests/disas/basic-wat-test.wat +++ b/tests/disas/basic-wat-test.wat @@ -14,17 +14,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0021 v5 = uextend.i64 v2 -;; @0021 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0021 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0021 v7 = iadd v6, v5 ;; @0021 v8 = load.i32 little heap v7 ;; @0026 v9 = uextend.i64 v3 -;; @0026 v10 = load.i64 notrap aligned readonly checked v0+88 +;; @0026 v10 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0026 v11 = iadd v10, v9 ;; @0026 v12 = load.i32 little heap v11 ;; @0029 v13 = iadd v8, v12 diff --git a/tests/disas/duplicate-loads-dynamic-memory.wat b/tests/disas/duplicate-loads-dynamic-memory.wat index a6533c2cc1..fbfc4fc1b1 100644 --- a/tests/disas/duplicate-loads-dynamic-memory.wat +++ b/tests/disas/duplicate-loads-dynamic-memory.wat @@ -27,13 +27,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): -;; @0057 v6 = load.i64 notrap aligned v0+96 -;; @0057 v8 = load.i64 notrap aligned checked v0+88 +;; @0057 v6 = load.i64 notrap aligned v0+88 +;; @0057 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0057 v5 = uextend.i64 v2 ;; @0057 v7 = icmp ugt v5, v6 ;; @0057 v10 = iconst.i64 0 @@ -51,13 +51,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): -;; @0064 v6 = load.i64 notrap aligned v0+96 -;; @0064 v8 = load.i64 notrap aligned checked v0+88 +;; @0064 v6 = load.i64 notrap aligned v0+88 +;; @0064 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0064 v5 = uextend.i64 v2 ;; @0064 v7 = icmp ugt v5, v6 ;; @0064 v12 = iconst.i64 0 diff --git a/tests/disas/duplicate-loads-static-memory.wat b/tests/disas/duplicate-loads-static-memory.wat index c09e162069..bc19500184 100644 --- a/tests/disas/duplicate-loads-static-memory.wat +++ b/tests/disas/duplicate-loads-static-memory.wat @@ -22,12 +22,12 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): -;; @0057 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0057 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0057 v5 = uextend.i64 v2 ;; @0057 v7 = iadd v6, v5 ;; @0057 v8 = load.i32 little heap v7 @@ -42,12 +42,12 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): -;; @0064 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0064 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0064 v5 = uextend.i64 v2 ;; @0064 v7 = iadd v6, v5 ;; @0064 v8 = iconst.i64 1234 diff --git a/tests/disas/dynamic-memory-no-spectre-access-same-index-different-offsets.wat b/tests/disas/dynamic-memory-no-spectre-access-same-index-different-offsets.wat index 0262b6c4c2..8d201ca9a6 100644 --- a/tests/disas/dynamic-memory-no-spectre-access-same-index-different-offsets.wat +++ b/tests/disas/dynamic-memory-no-spectre-access-same-index-different-offsets.wat @@ -40,16 +40,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): -;; @0047 v7 = load.i64 notrap aligned v0+96 +;; @0047 v7 = load.i64 notrap aligned v0+88 ;; @0047 v6 = uextend.i64 v2 ;; @0047 v8 = icmp ugt v6, v7 ;; @0047 trapnz v8, heap_oob -;; @0047 v9 = load.i64 notrap aligned checked v0+88 +;; @0047 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0047 v10 = iadd v9, v6 ;; @0047 v11 = load.i32 little heap v10 ;; @004c v17 = iconst.i64 4 @@ -73,16 +73,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32, v4: i32, v5: i32): -;; @005d v7 = load.i64 notrap aligned v0+96 +;; @005d v7 = load.i64 notrap aligned v0+88 ;; @005d v6 = uextend.i64 v2 ;; @005d v8 = icmp ugt v6, v7 ;; @005d trapnz v8, heap_oob -;; @005d v9 = load.i64 notrap aligned checked v0+88 +;; @005d v9 = load.i64 notrap aligned can_move checked v0+80 ;; @005d v10 = iadd v9, v6 ;; @005d store little heap v3, v10 ;; @0064 v16 = iconst.i64 4 diff --git a/tests/disas/dynamic-memory-yes-spectre-access-same-index-different-offsets.wat b/tests/disas/dynamic-memory-yes-spectre-access-same-index-different-offsets.wat index dbe1ee36d9..4365dbb4ed 100644 --- a/tests/disas/dynamic-memory-yes-spectre-access-same-index-different-offsets.wat +++ b/tests/disas/dynamic-memory-yes-spectre-access-same-index-different-offsets.wat @@ -36,13 +36,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): -;; @0047 v7 = load.i64 notrap aligned v0+96 -;; @0047 v9 = load.i64 notrap aligned checked v0+88 +;; @0047 v7 = load.i64 notrap aligned v0+88 +;; @0047 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0047 v6 = uextend.i64 v2 ;; @0047 v8 = icmp ugt v6, v7 ;; @0047 v11 = iconst.i64 0 @@ -71,13 +71,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32, v4: i32, v5: i32): -;; @005d v7 = load.i64 notrap aligned v0+96 -;; @005d v9 = load.i64 notrap aligned checked v0+88 +;; @005d v7 = load.i64 notrap aligned v0+88 +;; @005d v9 = load.i64 notrap aligned can_move checked v0+80 ;; @005d v6 = uextend.i64 v2 ;; @005d v8 = icmp ugt v6, v7 ;; @005d v11 = iconst.i64 0 diff --git a/tests/disas/epoch-interruption-x86.wat b/tests/disas/epoch-interruption-x86.wat index ce51a1971c..d44f258442 100644 --- a/tests/disas/epoch-interruption-x86.wat +++ b/tests/disas/epoch-interruption-x86.wat @@ -11,29 +11,29 @@ ;; movq 0x10(%r10), %r10 ;; addq $0x30, %r10 ;; cmpq %rsp, %r10 -;; ja 0x80 +;; ja 0x7e ;; 19: subq $0x20, %rsp -;; movq %rbx, (%rsp) -;; movq %r12, 8(%rsp) -;; movq %r13, 0x10(%rsp) -;; movq 8(%rdi), %r12 -;; movq 0x20(%rdi), %rbx -;; movq %rdi, %r13 -;; movq (%rbx), %r9 -;; movq 8(%r12), %rax -;; cmpq %rax, %r9 -;; jae 0x58 -;; 47: movq (%rbx), %rdi -;; cmpq %rax, %rdi -;; jae 0x65 -;; jmp 0x47 -;; 58: movq %r13, %rdi -;; callq 0x107 -;; jmp 0x47 -;; 65: movq 8(%r12), %rax -;; cmpq %rax, %rdi -;; jb 0x47 -;; 73: movq %r13, %rdi -;; callq 0x107 -;; jmp 0x47 -;; 80: ud2 +;; movq %r13, (%rsp) +;; movq %r14, 8(%rsp) +;; movq %r15, 0x10(%rsp) +;; movq 0x20(%rdi), %r14 +;; movq (%r14), %rcx +;; movq 8(%rdi), %r13 +;; movq %rdi, %r15 +;; movq 8(%r13), %rax +;; cmpq %rax, %rcx +;; jae 0x57 +;; 46: movq (%r14), %r11 +;; cmpq %rax, %r11 +;; jae 0x64 +;; jmp 0x46 +;; 57: movq %r15, %rdi +;; callq 0x105 +;; jmp 0x46 +;; 64: movq 8(%r13), %rax +;; cmpq %rax, %r11 +;; jb 0x46 +;; 71: movq %r15, %rdi +;; callq 0x105 +;; jmp 0x46 +;; 7e: ud2 diff --git a/tests/disas/epoch-interruption.wat b/tests/disas/epoch-interruption.wat index 527526b356..ddee8fa91b 100644 --- a/tests/disas/epoch-interruption.wat +++ b/tests/disas/epoch-interruption.wat @@ -14,9 +14,9 @@ ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64): -;; @0016 v3 = load.i64 notrap aligned v0+8 ;; @0016 v5 = load.i64 notrap aligned v0+32 ;; @0016 v6 = load.i64 notrap aligned v5 +;; @0016 v3 = load.i64 notrap aligned readonly can_move v0+8 ;; @0016 v7 = load.i64 notrap aligned v3+8 ;; @0016 v8 = icmp uge v6, v7 ;; @0016 brif v8, block3, block2(v7) diff --git a/tests/disas/f32-load.wat b/tests/disas/f32-load.wat index 1eb83fc425..aa0a4ea18e 100644 --- a/tests/disas/f32-load.wat +++ b/tests/disas/f32-load.wat @@ -11,13 +11,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @002e v4 = uextend.i64 v2 -;; @002e v5 = load.i64 notrap aligned readonly checked v0+88 +;; @002e v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @002e v6 = iadd v5, v4 ;; @002e v7 = load.f32 little heap v6 ;; @0031 jump block1 diff --git a/tests/disas/f32-store.wat b/tests/disas/f32-store.wat index fe82e70bb0..b8e5842a10 100644 --- a/tests/disas/f32-store.wat +++ b/tests/disas/f32-store.wat @@ -14,13 +14,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: f32): ;; @0031 v4 = uextend.i64 v2 -;; @0031 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0031 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0031 v6 = iadd v5, v4 ;; @0031 store little heap v3, v6 ;; @0034 jump block1 diff --git a/tests/disas/f64-load.wat b/tests/disas/f64-load.wat index b73a5416bd..a3cd6e642e 100644 --- a/tests/disas/f64-load.wat +++ b/tests/disas/f64-load.wat @@ -13,13 +13,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @002e v4 = uextend.i64 v2 -;; @002e v5 = load.i64 notrap aligned readonly checked v0+88 +;; @002e v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @002e v6 = iadd v5, v4 ;; @002e v7 = load.f64 little heap v6 ;; @0031 jump block1 diff --git a/tests/disas/f64-store.wat b/tests/disas/f64-store.wat index 603255ea95..89051273d0 100644 --- a/tests/disas/f64-store.wat +++ b/tests/disas/f64-store.wat @@ -14,13 +14,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: f64): ;; @0031 v4 = uextend.i64 v2 -;; @0031 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0031 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0031 v6 = iadd v5, v4 ;; @0031 store little heap v3, v6 ;; @0034 jump block1 diff --git a/tests/disas/fibonacci.wat b/tests/disas/fibonacci.wat index 9c7643889c..29f85cba1b 100644 --- a/tests/disas/fibonacci.wat +++ b/tests/disas/fibonacci.wat @@ -28,8 +28,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64): @@ -55,7 +55,7 @@ ;; block2: ;; @0056 v16 = iconst.i32 0 ;; @005a v17 = uextend.i64 v16 ; v16 = 0 -;; @005a v18 = load.i64 notrap aligned readonly checked v0+88 +;; @005a v18 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @005a v19 = iadd v18, v17 ;; @005a store.i32 little heap v11, v19 ;; @005d jump block1 diff --git a/tests/disas/fixed-size-memory.wat b/tests/disas/fixed-size-memory.wat index bd22320d0b..607313b7ee 100644 --- a/tests/disas/fixed-size-memory.wat +++ b/tests/disas/fixed-size-memory.wat @@ -25,8 +25,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): @@ -34,7 +34,7 @@ ;; @0041 v5 = iconst.i64 0x0001_0000 ;; @0041 v6 = icmp uge v4, v5 ; v5 = 0x0001_0000 ;; @0041 trapnz v6, heap_oob -;; @0041 v7 = load.i64 notrap aligned checked v0+88 +;; @0041 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0041 v8 = iadd v7, v4 ;; @0041 istore8 little heap v3, v8 ;; @0044 jump block1 @@ -48,8 +48,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): @@ -57,7 +57,7 @@ ;; @0049 v5 = iconst.i64 0x0001_0000 ;; @0049 v6 = icmp uge v4, v5 ; v5 = 0x0001_0000 ;; @0049 trapnz v6, heap_oob -;; @0049 v7 = load.i64 notrap aligned checked v0+88 +;; @0049 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v8 = iadd v7, v4 ;; @0049 v9 = uload8.i32 little heap v8 ;; @004c jump block1 diff --git a/tests/disas/gc/drc/array-fill.wat b/tests/disas/gc/drc/array-fill.wat index 919ebdc39f..efbd0d2ae9 100644 --- a/tests/disas/gc/drc/array-fill.wat +++ b/tests/disas/gc/drc/array-fill.wat @@ -23,48 +23,49 @@ ;; @0027 v12 = uadd_overflow_trap v10, v11, user1 ; v11 = 16 ;; @0027 v13 = iconst.i64 4 ;; @0027 v14 = uadd_overflow_trap v12, v13, user1 ; v13 = 4 -;; @0027 v9 = load.i64 notrap aligned readonly v0+48 +;; @0027 v9 = load.i64 notrap aligned readonly can_move v0+48 ;; @0027 v15 = icmp ule v14, v9 ;; @0027 trapz v15, user1 -;; @0027 v7 = load.i64 notrap aligned readonly v0+40 +;; @0027 v7 = load.i64 notrap aligned readonly can_move v0+40 ;; @0027 v16 = iadd v7, v12 -;; @0027 v17 = load.i32 notrap aligned v16 +;; @0027 v17 = load.i32 notrap aligned readonly v16 ;; @0027 v18 = uadd_overflow_trap v3, v5, user17 ;; @0027 v19 = icmp ugt v18, v17 ;; @0027 trapnz v19, user17 ;; @0027 v21 = uextend.i64 v17 -;; v48 = iconst.i64 3 -;; v49 = ishl v21, v48 ; v48 = 3 -;; v47 = iconst.i64 32 -;; @0027 v23 = ushr v49, v47 ; v47 = 32 +;; v49 = iconst.i64 3 +;; v50 = ishl v21, v49 ; v49 = 3 +;; v48 = iconst.i64 32 +;; @0027 v23 = ushr v50, v48 ; v48 = 32 ;; @0027 trapnz v23, user1 -;; v58 = iconst.i32 3 -;; v59 = ishl v17, v58 ; v58 = 3 +;; v59 = iconst.i32 3 +;; v60 = ishl v17, v59 ; v59 = 3 ;; @0027 v25 = iconst.i32 24 -;; @0027 v26 = uadd_overflow_trap v59, v25, user1 ; v25 = 24 -;; v66 = ishl v3, v58 ; v58 = 3 -;; v68 = iadd v66, v25 ; v25 = 24 -;; @0027 v35 = uextend.i64 v68 +;; @0027 v26 = uadd_overflow_trap v60, v25, user1 ; v25 = 24 +;; v67 = ishl v3, v59 ; v59 = 3 +;; v69 = iadd v67, v25 ; v25 = 24 +;; @0027 v35 = uextend.i64 v69 ;; @0027 v36 = uadd_overflow_trap v10, v35, user1 ;; @0027 v37 = uextend.i64 v26 ;; @0027 v38 = uadd_overflow_trap v10, v37, user1 ;; @0027 v39 = icmp ule v38, v9 ;; @0027 trapz v39, user1 ;; @0027 v40 = iadd v7, v36 -;; @0027 v41 = uextend.i64 v66 -;; @0027 v42 = iadd v40, v41 +;; v71 = ishl v5, v59 ; v59 = 3 +;; @0027 v42 = uextend.i64 v71 +;; @0027 v43 = iadd v40, v42 ;; @0027 v20 = iconst.i64 8 ;; @0027 jump block2(v40) ;; -;; block2(v44: i64): -;; @0027 v45 = icmp eq v44, v42 -;; @0027 brif v45, block4, block3 +;; block2(v45: i64): +;; @0027 v46 = icmp eq v45, v43 +;; @0027 brif v46, block4, block3 ;; ;; block3: -;; @0027 store.i64 notrap aligned little v4, v44 -;; v70 = iconst.i64 8 -;; v71 = iadd.i64 v44, v70 ; v70 = 8 -;; @0027 jump block2(v71) +;; @0027 store.i64 notrap aligned little v4, v45 +;; v73 = iconst.i64 8 +;; v74 = iadd.i64 v45, v73 ; v73 = 8 +;; @0027 jump block2(v74) ;; ;; block4: ;; @002a jump block1 diff --git a/tests/disas/gc/drc/array-get-s.wat b/tests/disas/gc/drc/array-get-s.wat index 6b34697287..8b57f4eb6f 100644 --- a/tests/disas/gc/drc/array-get-s.wat +++ b/tests/disas/gc/drc/array-get-s.wat @@ -23,12 +23,12 @@ ;; @0022 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 16 ;; @0022 v12 = iconst.i64 4 ;; @0022 v13 = uadd_overflow_trap v11, v12, user1 ; v12 = 4 -;; @0022 v8 = load.i64 notrap aligned readonly v0+48 +;; @0022 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0022 v14 = icmp ule v13, v8 ;; @0022 trapz v14, user1 -;; @0022 v6 = load.i64 notrap aligned readonly v0+40 +;; @0022 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0022 v15 = iadd v6, v11 -;; @0022 v16 = load.i32 notrap aligned v15 +;; @0022 v16 = load.i32 notrap aligned readonly v15 ;; @0022 v17 = icmp ult v3, v16 ;; @0022 trapz v17, user17 ;; @0022 v19 = uextend.i64 v16 diff --git a/tests/disas/gc/drc/array-get-u.wat b/tests/disas/gc/drc/array-get-u.wat index 3d704f47fe..89b71c72c3 100644 --- a/tests/disas/gc/drc/array-get-u.wat +++ b/tests/disas/gc/drc/array-get-u.wat @@ -23,12 +23,12 @@ ;; @0022 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 16 ;; @0022 v12 = iconst.i64 4 ;; @0022 v13 = uadd_overflow_trap v11, v12, user1 ; v12 = 4 -;; @0022 v8 = load.i64 notrap aligned readonly v0+48 +;; @0022 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0022 v14 = icmp ule v13, v8 ;; @0022 trapz v14, user1 -;; @0022 v6 = load.i64 notrap aligned readonly v0+40 +;; @0022 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0022 v15 = iadd v6, v11 -;; @0022 v16 = load.i32 notrap aligned v15 +;; @0022 v16 = load.i32 notrap aligned readonly v15 ;; @0022 v17 = icmp ult v3, v16 ;; @0022 trapz v17, user17 ;; @0022 v19 = uextend.i64 v16 diff --git a/tests/disas/gc/drc/array-get.wat b/tests/disas/gc/drc/array-get.wat index 2691a83859..5c62fc6416 100644 --- a/tests/disas/gc/drc/array-get.wat +++ b/tests/disas/gc/drc/array-get.wat @@ -23,12 +23,12 @@ ;; @0022 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 16 ;; @0022 v12 = iconst.i64 4 ;; @0022 v13 = uadd_overflow_trap v11, v12, user1 ; v12 = 4 -;; @0022 v8 = load.i64 notrap aligned readonly v0+48 +;; @0022 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0022 v14 = icmp ule v13, v8 ;; @0022 trapz v14, user1 -;; @0022 v6 = load.i64 notrap aligned readonly v0+40 +;; @0022 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0022 v15 = iadd v6, v11 -;; @0022 v16 = load.i32 notrap aligned v15 +;; @0022 v16 = load.i32 notrap aligned readonly v15 ;; @0022 v17 = icmp ult v3, v16 ;; @0022 trapz v17, user17 ;; @0022 v19 = uextend.i64 v16 diff --git a/tests/disas/gc/drc/array-len.wat b/tests/disas/gc/drc/array-len.wat index bcfe4d4b3f..0802fd2f7c 100644 --- a/tests/disas/gc/drc/array-len.wat +++ b/tests/disas/gc/drc/array-len.wat @@ -23,12 +23,12 @@ ;; @001f v10 = uadd_overflow_trap v8, v9, user1 ; v9 = 16 ;; @001f v11 = iconst.i64 4 ;; @001f v12 = uadd_overflow_trap v10, v11, user1 ; v11 = 4 -;; @001f v7 = load.i64 notrap aligned readonly v0+48 +;; @001f v7 = load.i64 notrap aligned readonly can_move v0+48 ;; @001f v13 = icmp ule v12, v7 ;; @001f trapz v13, user1 -;; @001f v5 = load.i64 notrap aligned readonly v0+40 +;; @001f v5 = load.i64 notrap aligned readonly can_move v0+40 ;; @001f v14 = iadd v5, v10 -;; @001f v15 = load.i32 notrap aligned v14 +;; @001f v15 = load.i32 notrap aligned readonly v14 ;; @0021 jump block1 ;; ;; block1: diff --git a/tests/disas/gc/drc/array-new-fixed-of-gc-refs.wat b/tests/disas/gc/drc/array-new-fixed-of-gc-refs.wat new file mode 100644 index 0000000000..35310e9f75 --- /dev/null +++ b/tests/disas/gc/drc/array-new-fixed-of-gc-refs.wat @@ -0,0 +1,137 @@ +;;! target = "x86_64" +;;! flags = "-W function-references,gc -C collector=drc" +;;! test = "optimize" + +(module + (type $ty (array (mut anyref))) + + (func (param anyref anyref anyref) (result (ref $ty)) + (array.new_fixed $ty 3 (local.get 0) (local.get 1) (local.get 2)) + ) +) +;; function u0:0(i64 vmctx, i64, i32, i32, i32) -> i32 tail { +;; ss0 = explicit_slot 4, align = 4 +;; ss1 = explicit_slot 4, align = 4 +;; ss2 = explicit_slot 4, align = 4 +;; gv0 = vmctx +;; gv1 = load.i64 notrap aligned readonly gv0+8 +;; gv2 = load.i64 notrap aligned gv1+16 +;; gv3 = vmctx +;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i32 tail +;; fn0 = colocated u1:27 sig0 +;; stack_limit = gv2 +;; +;; block0(v0: i64, v1: i64, v2: i32, v3: i32, v4: i32): +;; v129 = stack_addr.i64 ss2 +;; store notrap v2, v129 +;; v130 = stack_addr.i64 ss1 +;; store notrap v3, v130 +;; v131 = stack_addr.i64 ss0 +;; store notrap v4, v131 +;; v169 = iconst.i64 0 +;; @0025 trapnz v169, user18 ; v169 = 0 +;; @0025 v7 = iconst.i32 20 +;; v170 = iconst.i32 12 +;; @0025 v12 = uadd_overflow_trap v7, v170, user18 ; v7 = 20, v170 = 12 +;; @0025 v14 = iconst.i32 -1476395008 +;; @0025 v15 = iconst.i32 0 +;; @0025 v16 = iconst.i32 8 +;; @0025 v17 = call fn0(v0, v14, v15, v12, v16), stack_map=[i32 @ ss2+0, i32 @ ss1+0, i32 @ ss0+0] ; v14 = -1476395008, v15 = 0, v16 = 8 +;; @0025 v6 = iconst.i32 3 +;; @0025 v19 = load.i64 notrap aligned readonly can_move v0+40 +;; @0025 v20 = uextend.i64 v17 +;; @0025 v21 = iadd v19, v20 +;; v134 = iconst.i64 16 +;; @0025 v22 = iadd v21, v134 ; v134 = 16 +;; @0025 store notrap aligned v6, v22 ; v6 = 3 +;; v128 = load.i32 notrap v129 +;; v136 = iconst.i32 1 +;; @0025 v27 = band v128, v136 ; v136 = 1 +;; @0025 v28 = icmp eq v128, v15 ; v15 = 0 +;; @0025 v29 = uextend.i32 v28 +;; @0025 v30 = bor v27, v29 +;; @0025 brif v30, block3, block2 +;; +;; block2: +;; @0025 v35 = uextend.i64 v128 +;; @0025 v94 = iconst.i64 8 +;; @0025 v37 = uadd_overflow_trap v35, v94, user1 ; v94 = 8 +;; @0025 v39 = uadd_overflow_trap v37, v94, user1 ; v94 = 8 +;; @0025 v92 = load.i64 notrap aligned readonly can_move v0+48 +;; @0025 v40 = icmp ule v39, v92 +;; @0025 trapz v40, user1 +;; @0025 v41 = iadd.i64 v19, v37 +;; @0025 v42 = load.i64 notrap aligned v41 +;; v156 = iconst.i64 1 +;; @0025 v43 = iadd v42, v156 ; v156 = 1 +;; @0025 store notrap aligned v43, v41 +;; @0025 jump block3 +;; +;; block3: +;; v124 = load.i32 notrap v129 +;; v172 = iconst.i64 20 +;; v178 = iadd.i64 v21, v172 ; v172 = 20 +;; @0025 store notrap aligned little v124, v178 +;; v123 = load.i32 notrap v130 +;; v202 = iconst.i32 1 +;; v203 = band v123, v202 ; v202 = 1 +;; v204 = iconst.i32 0 +;; v205 = icmp eq v123, v204 ; v204 = 0 +;; @0025 v58 = uextend.i32 v205 +;; @0025 v59 = bor v203, v58 +;; @0025 brif v59, block5, block4 +;; +;; block4: +;; @0025 v64 = uextend.i64 v123 +;; v206 = iconst.i64 8 +;; @0025 v66 = uadd_overflow_trap v64, v206, user1 ; v206 = 8 +;; @0025 v68 = uadd_overflow_trap v66, v206, user1 ; v206 = 8 +;; v207 = load.i64 notrap aligned readonly can_move v0+48 +;; @0025 v69 = icmp ule v68, v207 +;; @0025 trapz v69, user1 +;; @0025 v70 = iadd.i64 v19, v66 +;; @0025 v71 = load.i64 notrap aligned v70 +;; v208 = iconst.i64 1 +;; @0025 v72 = iadd v71, v208 ; v208 = 1 +;; @0025 store notrap aligned v72, v70 +;; @0025 jump block5 +;; +;; block5: +;; v119 = load.i32 notrap v130 +;; v180 = iconst.i64 24 +;; v186 = iadd.i64 v21, v180 ; v180 = 24 +;; @0025 store notrap aligned little v119, v186 +;; v118 = load.i32 notrap v131 +;; v209 = iconst.i32 1 +;; v210 = band v118, v209 ; v209 = 1 +;; v211 = iconst.i32 0 +;; v212 = icmp eq v118, v211 ; v211 = 0 +;; @0025 v87 = uextend.i32 v212 +;; @0025 v88 = bor v210, v87 +;; @0025 brif v88, block7, block6 +;; +;; block6: +;; @0025 v93 = uextend.i64 v118 +;; v213 = iconst.i64 8 +;; @0025 v95 = uadd_overflow_trap v93, v213, user1 ; v213 = 8 +;; @0025 v97 = uadd_overflow_trap v95, v213, user1 ; v213 = 8 +;; v214 = load.i64 notrap aligned readonly can_move v0+48 +;; @0025 v98 = icmp ule v97, v214 +;; @0025 trapz v98, user1 +;; @0025 v99 = iadd.i64 v19, v95 +;; @0025 v100 = load.i64 notrap aligned v99 +;; v215 = iconst.i64 1 +;; @0025 v101 = iadd v100, v215 ; v215 = 1 +;; @0025 store notrap aligned v101, v99 +;; @0025 jump block7 +;; +;; block7: +;; v114 = load.i32 notrap v131 +;; v188 = iconst.i64 28 +;; v194 = iadd.i64 v21, v188 ; v188 = 28 +;; @0025 store notrap aligned little v114, v194 +;; @0029 jump block1 +;; +;; block1: +;; @0029 return v17 +;; } diff --git a/tests/disas/gc/drc/array-new-fixed.wat b/tests/disas/gc/drc/array-new-fixed.wat index 14227bb0b9..f47b367e30 100644 --- a/tests/disas/gc/drc/array-new-fixed.wat +++ b/tests/disas/gc/drc/array-new-fixed.wat @@ -14,38 +14,37 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i64 tail +;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i32 tail ;; fn0 = colocated u1:27 sig0 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i64, v4: i64): -;; v43 = iconst.i64 0 -;; @0025 trapnz v43, user18 ; v43 = 0 -;; @0025 v6 = iconst.i32 24 -;; @0025 v12 = uadd_overflow_trap v6, v6, user18 ; v6 = 24, v6 = 24 +;; v42 = iconst.i64 0 +;; @0025 trapnz v42, user18 ; v42 = 0 +;; @0025 v7 = iconst.i32 24 +;; @0025 v12 = uadd_overflow_trap v7, v7, user18 ; v7 = 24, v7 = 24 ;; @0025 v14 = iconst.i32 -1476395008 ;; @0025 v15 = iconst.i32 0 ;; @0025 v16 = iconst.i32 8 ;; @0025 v17 = call fn0(v0, v14, v15, v12, v16) ; v14 = -1476395008, v15 = 0, v16 = 8 -;; @0025 v7 = iconst.i32 3 -;; @0025 v20 = load.i64 notrap aligned readonly v0+40 -;; @0025 v18 = ireduce.i32 v17 -;; @0025 v21 = uextend.i64 v18 -;; @0025 v22 = iadd v20, v21 -;; v33 = iconst.i64 16 -;; @0025 v23 = iadd v22, v33 ; v33 = 16 -;; @0025 store notrap aligned v7, v23 ; v7 = 3 -;; v35 = iconst.i64 24 -;; v50 = iadd v22, v35 ; v35 = 24 -;; @0025 store notrap aligned little v2, v50 -;; v32 = iconst.i64 32 -;; v57 = iadd v22, v32 ; v32 = 32 -;; @0025 store notrap aligned little v3, v57 -;; v59 = iconst.i64 40 -;; v65 = iadd v22, v59 ; v59 = 40 -;; @0025 store notrap aligned little v4, v65 +;; @0025 v6 = iconst.i32 3 +;; @0025 v19 = load.i64 notrap aligned readonly can_move v0+40 +;; @0025 v20 = uextend.i64 v17 +;; @0025 v21 = iadd v19, v20 +;; v32 = iconst.i64 16 +;; @0025 v22 = iadd v21, v32 ; v32 = 16 +;; @0025 store notrap aligned v6, v22 ; v6 = 3 +;; v34 = iconst.i64 24 +;; v49 = iadd v21, v34 ; v34 = 24 +;; @0025 store notrap aligned little v2, v49 +;; v31 = iconst.i64 32 +;; v56 = iadd v21, v31 ; v31 = 32 +;; @0025 store notrap aligned little v3, v56 +;; v58 = iconst.i64 40 +;; v64 = iadd v21, v58 ; v58 = 40 +;; @0025 store notrap aligned little v4, v64 ;; @0029 jump block1 ;; ;; block1: -;; @0029 return v18 +;; @0029 return v17 ;; } diff --git a/tests/disas/gc/drc/array-new.wat b/tests/disas/gc/drc/array-new.wat index 2ee71f8aa0..116760ba8a 100644 --- a/tests/disas/gc/drc/array-new.wat +++ b/tests/disas/gc/drc/array-new.wat @@ -14,52 +14,51 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i64 tail +;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i32 tail ;; fn0 = colocated u1:27 sig0 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0022 v6 = uextend.i64 v3 -;; v35 = iconst.i64 3 -;; v36 = ishl v6, v35 ; v35 = 3 -;; v33 = iconst.i64 32 -;; @0022 v8 = ushr v36, v33 ; v33 = 32 +;; v34 = iconst.i64 3 +;; v35 = ishl v6, v34 ; v34 = 3 +;; v32 = iconst.i64 32 +;; @0022 v8 = ushr v35, v32 ; v32 = 32 ;; @0022 trapnz v8, user18 ;; @0022 v5 = iconst.i32 24 -;; v42 = iconst.i32 3 -;; v43 = ishl v3, v42 ; v42 = 3 -;; @0022 v10 = uadd_overflow_trap v5, v43, user18 ; v5 = 24 +;; v41 = iconst.i32 3 +;; v42 = ishl v3, v41 ; v41 = 3 +;; @0022 v10 = uadd_overflow_trap v5, v42, user18 ; v5 = 24 ;; @0022 v12 = iconst.i32 -1476395008 ;; @0022 v13 = iconst.i32 0 -;; v40 = iconst.i32 8 -;; @0022 v15 = call fn0(v0, v12, v13, v10, v40) ; v12 = -1476395008, v13 = 0, v40 = 8 -;; @0022 v18 = load.i64 notrap aligned readonly v0+40 -;; @0022 v16 = ireduce.i32 v15 -;; @0022 v19 = uextend.i64 v16 -;; @0022 v20 = iadd v18, v19 -;; v34 = iconst.i64 16 -;; @0022 v21 = iadd v20, v34 ; v34 = 16 -;; @0022 store notrap aligned v3, v21 -;; v47 = iconst.i64 24 -;; v53 = iadd v20, v47 ; v47 = 24 -;; @0022 v27 = uextend.i64 v10 -;; @0022 v28 = iadd v20, v27 -;; v32 = iconst.i64 8 -;; @0022 jump block2(v53) +;; v39 = iconst.i32 8 +;; @0022 v15 = call fn0(v0, v12, v13, v10, v39) ; v12 = -1476395008, v13 = 0, v39 = 8 +;; @0022 v17 = load.i64 notrap aligned readonly can_move v0+40 +;; @0022 v18 = uextend.i64 v15 +;; @0022 v19 = iadd v17, v18 +;; v33 = iconst.i64 16 +;; @0022 v20 = iadd v19, v33 ; v33 = 16 +;; @0022 store notrap aligned v3, v20 +;; v46 = iconst.i64 24 +;; v52 = iadd v19, v46 ; v46 = 24 +;; @0022 v26 = uextend.i64 v10 +;; @0022 v27 = iadd v19, v26 +;; v31 = iconst.i64 8 +;; @0022 jump block2(v52) ;; -;; block2(v29: i64): -;; @0022 v30 = icmp eq v29, v28 -;; @0022 brif v30, block4, block3 +;; block2(v28: i64): +;; @0022 v29 = icmp eq v28, v27 +;; @0022 brif v29, block4, block3 ;; ;; block3: -;; @0022 store.i64 notrap aligned little v2, v29 -;; v65 = iconst.i64 8 -;; v66 = iadd.i64 v29, v65 ; v65 = 8 -;; @0022 jump block2(v66) +;; @0022 store.i64 notrap aligned little v2, v28 +;; v64 = iconst.i64 8 +;; v65 = iadd.i64 v28, v64 ; v64 = 8 +;; @0022 jump block2(v65) ;; ;; block4: ;; @0025 jump block1 ;; ;; block1: -;; @0025 return v16 +;; @0025 return v15 ;; } diff --git a/tests/disas/gc/drc/array-set.wat b/tests/disas/gc/drc/array-set.wat index c6c95b7c12..06b28223e3 100644 --- a/tests/disas/gc/drc/array-set.wat +++ b/tests/disas/gc/drc/array-set.wat @@ -23,12 +23,12 @@ ;; @0024 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 16 ;; @0024 v12 = iconst.i64 4 ;; @0024 v13 = uadd_overflow_trap v11, v12, user1 ; v12 = 4 -;; @0024 v8 = load.i64 notrap aligned readonly v0+48 +;; @0024 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0024 v14 = icmp ule v13, v8 ;; @0024 trapz v14, user1 -;; @0024 v6 = load.i64 notrap aligned readonly v0+40 +;; @0024 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0024 v15 = iadd v6, v11 -;; @0024 v16 = load.i32 notrap aligned v15 +;; @0024 v16 = load.i32 notrap aligned readonly v15 ;; @0024 v17 = icmp ult v3, v16 ;; @0024 trapz v17, user17 ;; @0024 v19 = uextend.i64 v16 diff --git a/tests/disas/gc/drc/br-on-cast-fail.wat b/tests/disas/gc/drc/br-on-cast-fail.wat index 7fee7e181b..02429bb402 100644 --- a/tests/disas/gc/drc/br-on-cast-fail.wat +++ b/tests/disas/gc/drc/br-on-cast-fail.wat @@ -49,14 +49,14 @@ ;; @002e v18 = iconst.i64 4 ;; @002e v19 = uadd_overflow_trap v17, v18, user1 ; v18 = 4 ;; @002e v21 = uadd_overflow_trap v19, v18, user1 ; v18 = 4 -;; @002e v16 = load.i64 notrap aligned readonly v0+48 +;; @002e v16 = load.i64 notrap aligned readonly can_move v0+48 ;; @002e v22 = icmp ule v21, v16 ;; @002e trapz v22, user1 -;; @002e v14 = load.i64 notrap aligned readonly v0+40 +;; @002e v14 = load.i64 notrap aligned readonly can_move v0+40 ;; @002e v23 = iadd v14, v19 ;; @002e v24 = load.i32 notrap aligned readonly v23 -;; @002e v11 = load.i64 notrap aligned readonly v0+64 -;; @002e v12 = load.i32 notrap aligned readonly v11 +;; @002e v11 = load.i64 notrap aligned readonly can_move v0+64 +;; @002e v12 = load.i32 notrap aligned readonly can_move v11 ;; @002e v25 = icmp eq v24, v12 ;; @002e v26 = uextend.i32 v25 ;; @002e brif v26, block7(v26), block6 @@ -73,14 +73,14 @@ ;; @002e brif v30, block8, block2 ;; ;; block8: -;; @0034 v32 = load.i64 notrap aligned readonly v0+80 -;; @0034 v33 = load.i64 notrap aligned readonly v0+96 +;; @0034 v32 = load.i64 notrap aligned readonly can_move v0+72 +;; @0034 v33 = load.i64 notrap aligned readonly can_move v0+88 ;; @0034 call_indirect sig1, v32(v33, v0) ;; @0036 return ;; ;; block2: -;; @0038 v35 = load.i64 notrap aligned readonly v0+104 -;; @0038 v36 = load.i64 notrap aligned readonly v0+120 +;; @0038 v35 = load.i64 notrap aligned readonly can_move v0+96 +;; @0038 v36 = load.i64 notrap aligned readonly can_move v0+112 ;; @0038 call_indirect sig2, v35(v36, v0) ;; @003a return ;; } diff --git a/tests/disas/gc/drc/br-on-cast.wat b/tests/disas/gc/drc/br-on-cast.wat index 740ddc7f49..7eae1a8148 100644 --- a/tests/disas/gc/drc/br-on-cast.wat +++ b/tests/disas/gc/drc/br-on-cast.wat @@ -49,14 +49,14 @@ ;; @002f v18 = iconst.i64 4 ;; @002f v19 = uadd_overflow_trap v17, v18, user1 ; v18 = 4 ;; @002f v21 = uadd_overflow_trap v19, v18, user1 ; v18 = 4 -;; @002f v16 = load.i64 notrap aligned readonly v0+48 +;; @002f v16 = load.i64 notrap aligned readonly can_move v0+48 ;; @002f v22 = icmp ule v21, v16 ;; @002f trapz v22, user1 -;; @002f v14 = load.i64 notrap aligned readonly v0+40 +;; @002f v14 = load.i64 notrap aligned readonly can_move v0+40 ;; @002f v23 = iadd v14, v19 ;; @002f v24 = load.i32 notrap aligned readonly v23 -;; @002f v11 = load.i64 notrap aligned readonly v0+64 -;; @002f v12 = load.i32 notrap aligned readonly v11 +;; @002f v11 = load.i64 notrap aligned readonly can_move v0+64 +;; @002f v12 = load.i32 notrap aligned readonly can_move v11 ;; @002f v25 = icmp eq v24, v12 ;; @002f v26 = uextend.i32 v25 ;; @002f brif v26, block7(v26), block6 @@ -73,14 +73,14 @@ ;; @002f brif v30, block2, block8 ;; ;; block8: -;; @0035 v32 = load.i64 notrap aligned readonly v0+80 -;; @0035 v33 = load.i64 notrap aligned readonly v0+96 +;; @0035 v32 = load.i64 notrap aligned readonly can_move v0+72 +;; @0035 v33 = load.i64 notrap aligned readonly can_move v0+88 ;; @0035 call_indirect sig1, v32(v33, v0) ;; @0037 return ;; ;; block2: -;; @0039 v35 = load.i64 notrap aligned readonly v0+104 -;; @0039 v36 = load.i64 notrap aligned readonly v0+120 +;; @0039 v35 = load.i64 notrap aligned readonly can_move v0+96 +;; @0039 v36 = load.i64 notrap aligned readonly can_move v0+112 ;; @0039 call_indirect sig2, v35(v36, v0) ;; @003b return ;; } diff --git a/tests/disas/gc/drc/call-indirect-and-subtyping.wat b/tests/disas/gc/drc/call-indirect-and-subtyping.wat index 6a362f80c8..4ea540723c 100644 --- a/tests/disas/gc/drc/call-indirect-and-subtyping.wat +++ b/tests/disas/gc/drc/call-indirect-and-subtyping.wat @@ -21,7 +21,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+128 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+120 ;; sig0 = (i64 vmctx, i64) tail ;; sig1 = (i64 vmctx, i32, i64) -> i64 tail ;; sig2 = (i64 vmctx, i32, i32) -> i32 tail @@ -33,7 +33,7 @@ ;; @005c v3 = iconst.i32 2 ;; @005c v4 = icmp uge v2, v3 ; v3 = 2 ;; @005c v9 = iconst.i64 0 -;; @005c v6 = load.i64 notrap aligned readonly v0+128 +;; @005c v6 = load.i64 notrap aligned readonly can_move v0+120 ;; @005c v5 = uextend.i64 v2 ;; v30 = iconst.i64 3 ;; @005c v7 = ishl v5, v30 ; v30 = 3 @@ -51,8 +51,8 @@ ;; ;; block3(v13: i64): ;; @005c v21 = load.i32 user6 aligned readonly v13+16 -;; @005c v19 = load.i64 notrap aligned readonly v0+64 -;; @005c v20 = load.i32 notrap aligned readonly v19 +;; @005c v19 = load.i64 notrap aligned readonly can_move v0+64 +;; @005c v20 = load.i32 notrap aligned readonly can_move v19 ;; @005c v22 = icmp eq v21, v20 ;; @005c v23 = uextend.i32 v22 ;; @005c brif v23, block5(v23), block4 diff --git a/tests/disas/gc/drc/externref-globals.wat b/tests/disas/gc/drc/externref-globals.wat index d055c43a11..e92c86754b 100644 --- a/tests/disas/gc/drc/externref-globals.wat +++ b/tests/disas/gc/drc/externref-globals.wat @@ -23,53 +23,57 @@ ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64): -;; v45 = iconst.i64 80 -;; @0034 v4 = iadd v0, v45 ; v45 = 80 +;; v49 = iconst.i64 80 +;; @0034 v4 = iadd v0, v49 ; v49 = 80 ;; @0034 v5 = load.i32 notrap aligned v4 -;; v46 = stack_addr.i64 ss0 -;; store notrap v5, v46 -;; v48 = iconst.i32 0 -;; @0034 v6 = icmp eq v5, v48 ; v48 = 0 -;; @0034 brif v6, block5, block2 +;; v50 = stack_addr.i64 ss0 +;; store notrap v5, v50 +;; v52 = iconst.i32 1 +;; @0034 v6 = band v5, v52 ; v52 = 1 +;; v54 = iconst.i32 0 +;; @0034 v7 = icmp eq v5, v54 ; v54 = 0 +;; @0034 v8 = uextend.i32 v7 +;; @0034 v9 = bor v6, v8 +;; @0034 brif v9, block5, block2 ;; ;; block2: -;; @0034 v8 = load.i64 notrap aligned readonly v0+56 -;; @0034 v9 = load.i64 notrap aligned v8 -;; @0034 v10 = load.i64 notrap aligned v8+8 -;; @0034 v11 = icmp eq v9, v10 -;; @0034 brif v11, block3, block4 +;; @0034 v11 = load.i64 notrap aligned readonly v0+56 +;; @0034 v12 = load.i64 notrap aligned v11 +;; @0034 v13 = load.i64 notrap aligned v11+8 +;; @0034 v14 = icmp eq v12, v13 +;; @0034 brif v14, block3, block4 ;; ;; block4: -;; @0034 v16 = uextend.i64 v5 -;; @0034 v17 = iconst.i64 8 -;; @0034 v18 = uadd_overflow_trap v16, v17, user1 ; v17 = 8 -;; @0034 v20 = uadd_overflow_trap v18, v17, user1 ; v17 = 8 -;; @0034 v15 = load.i64 notrap aligned readonly v0+48 -;; @0034 v21 = icmp ule v20, v15 -;; @0034 trapz v21, user1 -;; @0034 v13 = load.i64 notrap aligned readonly v0+40 -;; @0034 v22 = iadd v13, v18 -;; @0034 v23 = load.i64 notrap aligned v22 -;; v50 = iconst.i64 1 -;; @0034 v24 = iadd v23, v50 ; v50 = 1 -;; @0034 store notrap aligned v24, v22 -;; v41 = load.i32 notrap v46 -;; @0034 store notrap aligned v41, v9 -;; v53 = iconst.i64 4 -;; @0034 v36 = iadd.i64 v9, v53 ; v53 = 4 -;; @0034 store notrap aligned v36, v8 +;; @0034 v19 = uextend.i64 v5 +;; @0034 v20 = iconst.i64 8 +;; @0034 v21 = uadd_overflow_trap v19, v20, user1 ; v20 = 8 +;; @0034 v23 = uadd_overflow_trap v21, v20, user1 ; v20 = 8 +;; @0034 v18 = load.i64 notrap aligned readonly can_move v0+48 +;; @0034 v24 = icmp ule v23, v18 +;; @0034 trapz v24, user1 +;; @0034 v16 = load.i64 notrap aligned readonly can_move v0+40 +;; @0034 v25 = iadd v16, v21 +;; @0034 v26 = load.i64 notrap aligned v25 +;; v56 = iconst.i64 1 +;; @0034 v27 = iadd v26, v56 ; v56 = 1 +;; @0034 store notrap aligned v27, v25 +;; v44 = load.i32 notrap v50 +;; @0034 store notrap aligned v44, v12 +;; v59 = iconst.i64 4 +;; @0034 v39 = iadd.i64 v12, v59 ; v59 = 4 +;; @0034 store notrap aligned v39, v11 ;; @0034 jump block5 ;; ;; block3 cold: -;; @0034 v38 = call fn0(v0, v5), stack_map=[i32 @ ss0+0] +;; @0034 v41 = call fn0(v0, v5), stack_map=[i32 @ ss0+0] ;; @0034 jump block5 ;; ;; block5: -;; v39 = load.i32 notrap v46 +;; v42 = load.i32 notrap v50 ;; @0036 jump block1 ;; ;; block1: -;; @0036 return v39 +;; @0036 return v42 ;; } ;; ;; function u0:1(i64 vmctx, i64, i32) tail { @@ -82,60 +86,67 @@ ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): -;; v58 = iconst.i64 80 -;; @003b v4 = iadd v0, v58 ; v58 = 80 +;; v64 = iconst.i64 80 +;; @003b v4 = iadd v0, v64 ; v64 = 80 ;; @003b v5 = load.i32 notrap aligned v4 -;; v59 = iconst.i32 0 -;; @003b v6 = icmp eq v2, v59 ; v59 = 0 -;; @003b brif v6, block3, block2 +;; v65 = iconst.i32 1 +;; @003b v6 = band v2, v65 ; v65 = 1 +;; v66 = iconst.i32 0 +;; @003b v7 = icmp eq v2, v66 ; v66 = 0 +;; @003b v8 = uextend.i32 v7 +;; @003b v9 = bor v6, v8 +;; @003b brif v9, block3, block2 ;; ;; block2: -;; @003b v11 = uextend.i64 v2 -;; @003b v37 = iconst.i64 8 -;; @003b v13 = uadd_overflow_trap v11, v37, user1 ; v37 = 8 -;; @003b v15 = uadd_overflow_trap v13, v37, user1 ; v37 = 8 -;; @003b v35 = load.i64 notrap aligned readonly v0+48 -;; @003b v16 = icmp ule v15, v35 -;; @003b trapz v16, user1 -;; @003b v33 = load.i64 notrap aligned readonly v0+40 -;; @003b v17 = iadd v33, v13 -;; @003b v18 = load.i64 notrap aligned v17 -;; v60 = iconst.i64 1 -;; @003b v19 = iadd v18, v60 ; v60 = 1 -;; @003b store notrap aligned v19, v17 +;; @003b v14 = uextend.i64 v2 +;; @003b v43 = iconst.i64 8 +;; @003b v16 = uadd_overflow_trap v14, v43, user1 ; v43 = 8 +;; @003b v18 = uadd_overflow_trap v16, v43, user1 ; v43 = 8 +;; @003b v41 = load.i64 notrap aligned readonly can_move v0+48 +;; @003b v19 = icmp ule v18, v41 +;; @003b trapz v19, user1 +;; @003b v39 = load.i64 notrap aligned readonly can_move v0+40 +;; @003b v20 = iadd v39, v16 +;; @003b v21 = load.i64 notrap aligned v20 +;; v73 = iconst.i64 1 +;; @003b v22 = iadd v21, v73 ; v73 = 1 +;; @003b store notrap aligned v22, v20 ;; @003b jump block3 ;; ;; block3: -;; v64 = iadd.i64 v0, v58 ; v58 = 80 -;; @003b store.i32 notrap aligned v2, v64 -;; v65 = iconst.i32 0 -;; v66 = icmp.i32 eq v5, v65 ; v65 = 0 -;; @003b brif v66, block7, block4 +;; v85 = iadd.i64 v0, v64 ; v64 = 80 +;; @003b store.i32 notrap aligned v2, v85 +;; v86 = iconst.i32 1 +;; v87 = band.i32 v5, v86 ; v86 = 1 +;; v88 = iconst.i32 0 +;; v89 = icmp.i32 eq v5, v88 ; v88 = 0 +;; @003b v36 = uextend.i32 v89 +;; @003b v37 = bor v87, v36 +;; @003b brif v37, block7, block4 ;; ;; block4: -;; @003b v36 = uextend.i64 v5 -;; v67 = iconst.i64 8 -;; @003b v38 = uadd_overflow_trap v36, v67, user1 ; v67 = 8 -;; @003b v40 = uadd_overflow_trap v38, v67, user1 ; v67 = 8 -;; v68 = load.i64 notrap aligned readonly v0+48 -;; @003b v41 = icmp ule v40, v68 -;; @003b trapz v41, user1 -;; v69 = load.i64 notrap aligned readonly v0+40 -;; @003b v42 = iadd v69, v38 -;; @003b v43 = load.i64 notrap aligned v42 -;; v62 = iconst.i64 -1 -;; @003b v44 = iadd v43, v62 ; v62 = -1 -;; v63 = iconst.i64 0 -;; @003b v45 = icmp eq v44, v63 ; v63 = 0 -;; @003b brif v45, block5, block6 +;; @003b v42 = uextend.i64 v5 +;; v90 = iconst.i64 8 +;; @003b v44 = uadd_overflow_trap v42, v90, user1 ; v90 = 8 +;; @003b v46 = uadd_overflow_trap v44, v90, user1 ; v90 = 8 +;; v91 = load.i64 notrap aligned readonly can_move v0+48 +;; @003b v47 = icmp ule v46, v91 +;; @003b trapz v47, user1 +;; v92 = load.i64 notrap aligned readonly can_move v0+40 +;; @003b v48 = iadd v92, v44 +;; @003b v49 = load.i64 notrap aligned v48 +;; v93 = iconst.i64 1 +;; v83 = icmp eq v49, v93 ; v93 = 1 +;; @003b brif v83, block5, block6 ;; ;; block5 cold: ;; @003b call fn0(v0, v5) ;; @003b jump block7 ;; ;; block6: -;; v70 = iadd.i64 v43, v62 ; v62 = -1 -;; @003b store notrap aligned v70, v42 +;; v70 = iconst.i64 -1 +;; @003b v50 = iadd.i64 v49, v70 ; v70 = -1 +;; @003b store notrap aligned v50, v48 ;; @003b jump block7 ;; ;; block7: diff --git a/tests/disas/gc/drc/funcref-in-gc-heap-get.wat b/tests/disas/gc/drc/funcref-in-gc-heap-get.wat index d2bc8444f8..f62cb8678d 100644 --- a/tests/disas/gc/drc/funcref-in-gc-heap-get.wat +++ b/tests/disas/gc/drc/funcref-in-gc-heap-get.wat @@ -25,10 +25,10 @@ ;; @0020 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 16 ;; v20 = iconst.i64 24 ;; @0020 v13 = uadd_overflow_trap v9, v20, user1 ; v20 = 24 -;; @0020 v8 = load.i64 notrap aligned readonly v0+48 +;; @0020 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0020 v14 = icmp ule v13, v8 ;; @0020 trapz v14, user1 -;; @0020 v6 = load.i64 notrap aligned readonly v0+40 +;; @0020 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0020 v15 = iadd v6, v11 ;; @0020 v18 = load.i32 notrap aligned little v15 ;; @0020 v16 = iconst.i32 -1 diff --git a/tests/disas/gc/drc/funcref-in-gc-heap-new.wat b/tests/disas/gc/drc/funcref-in-gc-heap-new.wat index aa98d80ad8..10e989699f 100644 --- a/tests/disas/gc/drc/funcref-in-gc-heap-new.wat +++ b/tests/disas/gc/drc/funcref-in-gc-heap-new.wat @@ -15,7 +15,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i64 tail +;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i32 tail ;; sig1 = (i64 vmctx, i64) -> i64 tail ;; fn0 = colocated u1:27 sig0 ;; fn1 = colocated u1:28 sig1 @@ -27,20 +27,19 @@ ;; @0020 v4 = iconst.i32 24 ;; @0020 v8 = iconst.i32 8 ;; @0020 v9 = call fn0(v0, v6, v7, v4, v8) ; v6 = -1342177280, v7 = 0, v4 = 24, v8 = 8 -;; @0020 v10 = ireduce.i32 v9 -;; v21 = stack_addr.i64 ss0 -;; store notrap v10, v21 -;; @0020 v17 = call fn1(v0, v2), stack_map=[i32 @ ss0+0] -;; @0020 v18 = ireduce.i32 v17 -;; @0020 v12 = load.i64 notrap aligned readonly v0+40 -;; @0020 v13 = uextend.i64 v10 -;; @0020 v14 = iadd v12, v13 -;; v23 = iconst.i64 16 -;; @0020 v15 = iadd v14, v23 ; v23 = 16 -;; @0020 store notrap aligned little v18, v15 -;; v19 = load.i32 notrap v21 +;; v20 = stack_addr.i64 ss0 +;; store notrap v9, v20 +;; @0020 v16 = call fn1(v0, v2), stack_map=[i32 @ ss0+0] +;; @0020 v17 = ireduce.i32 v16 +;; @0020 v11 = load.i64 notrap aligned readonly can_move v0+40 +;; @0020 v12 = uextend.i64 v9 +;; @0020 v13 = iadd v11, v12 +;; v22 = iconst.i64 16 +;; @0020 v14 = iadd v13, v22 ; v22 = 16 +;; @0020 store notrap aligned little v17, v14 +;; v18 = load.i32 notrap v20 ;; @0023 jump block1 ;; ;; block1: -;; @0023 return v19 +;; @0023 return v18 ;; } diff --git a/tests/disas/gc/drc/funcref-in-gc-heap-set.wat b/tests/disas/gc/drc/funcref-in-gc-heap-set.wat index fae6efb76e..d436834a6e 100644 --- a/tests/disas/gc/drc/funcref-in-gc-heap-set.wat +++ b/tests/disas/gc/drc/funcref-in-gc-heap-set.wat @@ -25,12 +25,12 @@ ;; @0022 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 16 ;; v19 = iconst.i64 24 ;; @0022 v13 = uadd_overflow_trap v9, v19, user1 ; v19 = 24 -;; @0022 v8 = load.i64 notrap aligned readonly v0+48 +;; @0022 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0022 v14 = icmp ule v13, v8 ;; @0022 trapz v14, user1 ;; @0022 v17 = call fn0(v0, v3) ;; @0022 v18 = ireduce.i32 v17 -;; @0022 v6 = load.i64 notrap aligned readonly v0+40 +;; @0022 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0022 v15 = iadd v6, v11 ;; @0022 store notrap aligned little v18, v15 ;; @0026 jump block1 diff --git a/tests/disas/gc/drc/multiple-array-get.wat b/tests/disas/gc/drc/multiple-array-get.wat index 57aa0f23a1..d71cc2c9fa 100644 --- a/tests/disas/gc/drc/multiple-array-get.wat +++ b/tests/disas/gc/drc/multiple-array-get.wat @@ -24,12 +24,12 @@ ;; @0024 v13 = uadd_overflow_trap v11, v12, user1 ; v12 = 16 ;; @0024 v14 = iconst.i64 4 ;; @0024 v15 = uadd_overflow_trap v13, v14, user1 ; v14 = 4 -;; @0024 v10 = load.i64 notrap aligned readonly v0+48 +;; @0024 v10 = load.i64 notrap aligned readonly can_move v0+48 ;; @0024 v16 = icmp ule v15, v10 ;; @0024 trapz v16, user1 -;; @0024 v8 = load.i64 notrap aligned readonly v0+40 +;; @0024 v8 = load.i64 notrap aligned readonly can_move v0+40 ;; @0024 v17 = iadd v8, v13 -;; @0024 v18 = load.i32 notrap aligned v17 +;; @0024 v18 = load.i32 notrap aligned readonly v17 ;; @0024 v19 = icmp ult v3, v18 ;; @0024 trapz v19, user17 ;; @0024 v21 = uextend.i64 v18 diff --git a/tests/disas/gc/drc/multiple-struct-get.wat b/tests/disas/gc/drc/multiple-struct-get.wat index 1cb69c6d0d..deae67c896 100644 --- a/tests/disas/gc/drc/multiple-struct-get.wat +++ b/tests/disas/gc/drc/multiple-struct-get.wat @@ -25,10 +25,10 @@ ;; @0023 v12 = uadd_overflow_trap v10, v11, user1 ; v11 = 16 ;; v32 = iconst.i64 24 ;; @0023 v14 = uadd_overflow_trap v10, v32, user1 ; v32 = 24 -;; @0023 v9 = load.i64 notrap aligned readonly v0+48 +;; @0023 v9 = load.i64 notrap aligned readonly can_move v0+48 ;; @0023 v15 = icmp ule v14, v9 ;; @0023 trapz v15, user1 -;; @0023 v7 = load.i64 notrap aligned readonly v0+40 +;; @0023 v7 = load.i64 notrap aligned readonly can_move v0+40 ;; @0023 v16 = iadd v7, v12 ;; @0023 v17 = load.f32 notrap aligned little v16 ;; @0029 v24 = iconst.i64 20 diff --git a/tests/disas/gc/drc/ref-cast.wat b/tests/disas/gc/drc/ref-cast.wat index 4254644cbe..aca43c32f8 100644 --- a/tests/disas/gc/drc/ref-cast.wat +++ b/tests/disas/gc/drc/ref-cast.wat @@ -37,14 +37,14 @@ ;; @001e v18 = iconst.i64 4 ;; @001e v19 = uadd_overflow_trap v17, v18, user1 ; v18 = 4 ;; @001e v21 = uadd_overflow_trap v19, v18, user1 ; v18 = 4 -;; @001e v16 = load.i64 notrap aligned readonly v0+48 +;; @001e v16 = load.i64 notrap aligned readonly can_move v0+48 ;; @001e v22 = icmp ule v21, v16 ;; @001e trapz v22, user1 -;; @001e v14 = load.i64 notrap aligned readonly v0+40 +;; @001e v14 = load.i64 notrap aligned readonly can_move v0+40 ;; @001e v23 = iadd v14, v19 ;; @001e v24 = load.i32 notrap aligned readonly v23 -;; @001e v11 = load.i64 notrap aligned readonly v0+64 -;; @001e v12 = load.i32 notrap aligned readonly v11 +;; @001e v11 = load.i64 notrap aligned readonly can_move v0+64 +;; @001e v12 = load.i32 notrap aligned readonly can_move v11 ;; @001e v25 = icmp eq v24, v12 ;; @001e v26 = uextend.i32 v25 ;; @001e brif v26, block6(v26), block5 diff --git a/tests/disas/gc/drc/ref-test-array.wat b/tests/disas/gc/drc/ref-test-array.wat index 464b0ce8b8..dae95697f3 100644 --- a/tests/disas/gc/drc/ref-test-array.wat +++ b/tests/disas/gc/drc/ref-test-array.wat @@ -32,10 +32,10 @@ ;; @001b v17 = uadd_overflow_trap v15, v16, user1 ; v16 = 0 ;; v29 = iconst.i64 8 ;; @001b v19 = uadd_overflow_trap v15, v29, user1 ; v29 = 8 -;; @001b v14 = load.i64 notrap aligned readonly v0+48 +;; @001b v14 = load.i64 notrap aligned readonly can_move v0+48 ;; @001b v20 = icmp ule v19, v14 ;; @001b trapz v20, user1 -;; @001b v12 = load.i64 notrap aligned readonly v0+40 +;; @001b v12 = load.i64 notrap aligned readonly can_move v0+40 ;; @001b v21 = iadd v12, v17 ;; @001b v22 = load.i32 notrap aligned readonly v21 ;; @001b v23 = iconst.i32 -1476395008 diff --git a/tests/disas/gc/drc/ref-test-concrete-func-type.wat b/tests/disas/gc/drc/ref-test-concrete-func-type.wat index 606648428e..fb82170404 100644 --- a/tests/disas/gc/drc/ref-test-concrete-func-type.wat +++ b/tests/disas/gc/drc/ref-test-concrete-func-type.wat @@ -29,8 +29,8 @@ ;; ;; block3: ;; @0020 v10 = load.i32 notrap aligned readonly v2+16 -;; @0020 v8 = load.i64 notrap aligned readonly v0+64 -;; @0020 v9 = load.i32 notrap aligned readonly v8 +;; @0020 v8 = load.i64 notrap aligned readonly can_move v0+64 +;; @0020 v9 = load.i32 notrap aligned readonly can_move v8 ;; @0020 v11 = icmp eq v10, v9 ;; @0020 v12 = uextend.i32 v11 ;; @0020 brif v12, block6(v12), block5 diff --git a/tests/disas/gc/drc/ref-test-concrete-type.wat b/tests/disas/gc/drc/ref-test-concrete-type.wat index d0a97bdaa3..ba691294c4 100644 --- a/tests/disas/gc/drc/ref-test-concrete-type.wat +++ b/tests/disas/gc/drc/ref-test-concrete-type.wat @@ -34,14 +34,14 @@ ;; @001d v18 = iconst.i64 4 ;; @001d v19 = uadd_overflow_trap v17, v18, user1 ; v18 = 4 ;; @001d v21 = uadd_overflow_trap v19, v18, user1 ; v18 = 4 -;; @001d v16 = load.i64 notrap aligned readonly v0+48 +;; @001d v16 = load.i64 notrap aligned readonly can_move v0+48 ;; @001d v22 = icmp ule v21, v16 ;; @001d trapz v22, user1 -;; @001d v14 = load.i64 notrap aligned readonly v0+40 +;; @001d v14 = load.i64 notrap aligned readonly can_move v0+40 ;; @001d v23 = iadd v14, v19 ;; @001d v24 = load.i32 notrap aligned readonly v23 -;; @001d v11 = load.i64 notrap aligned readonly v0+64 -;; @001d v12 = load.i32 notrap aligned readonly v11 +;; @001d v11 = load.i64 notrap aligned readonly can_move v0+64 +;; @001d v12 = load.i32 notrap aligned readonly can_move v11 ;; @001d v25 = icmp eq v24, v12 ;; @001d v26 = uextend.i32 v25 ;; @001d brif v26, block6(v26), block5 diff --git a/tests/disas/gc/drc/ref-test-eq.wat b/tests/disas/gc/drc/ref-test-eq.wat index b6d37ae9f6..7be2379813 100644 --- a/tests/disas/gc/drc/ref-test-eq.wat +++ b/tests/disas/gc/drc/ref-test-eq.wat @@ -31,10 +31,10 @@ ;; @001b v17 = uadd_overflow_trap v15, v16, user1 ; v16 = 0 ;; v29 = iconst.i64 8 ;; @001b v19 = uadd_overflow_trap v15, v29, user1 ; v29 = 8 -;; @001b v14 = load.i64 notrap aligned readonly v0+48 +;; @001b v14 = load.i64 notrap aligned readonly can_move v0+48 ;; @001b v20 = icmp ule v19, v14 ;; @001b trapz v20, user1 -;; @001b v12 = load.i64 notrap aligned readonly v0+40 +;; @001b v12 = load.i64 notrap aligned readonly can_move v0+40 ;; @001b v21 = iadd v12, v17 ;; @001b v22 = load.i32 notrap aligned readonly v21 ;; @001b v23 = iconst.i32 -1610612736 diff --git a/tests/disas/gc/drc/ref-test-struct.wat b/tests/disas/gc/drc/ref-test-struct.wat index 9bd38ab0ae..597b371c7f 100644 --- a/tests/disas/gc/drc/ref-test-struct.wat +++ b/tests/disas/gc/drc/ref-test-struct.wat @@ -32,10 +32,10 @@ ;; @001b v17 = uadd_overflow_trap v15, v16, user1 ; v16 = 0 ;; v29 = iconst.i64 8 ;; @001b v19 = uadd_overflow_trap v15, v29, user1 ; v29 = 8 -;; @001b v14 = load.i64 notrap aligned readonly v0+48 +;; @001b v14 = load.i64 notrap aligned readonly can_move v0+48 ;; @001b v20 = icmp ule v19, v14 ;; @001b trapz v20, user1 -;; @001b v12 = load.i64 notrap aligned readonly v0+40 +;; @001b v12 = load.i64 notrap aligned readonly can_move v0+40 ;; @001b v21 = iadd v12, v17 ;; @001b v22 = load.i32 notrap aligned readonly v21 ;; @001b v23 = iconst.i32 -1342177280 diff --git a/tests/disas/gc/drc/struct-get.wat b/tests/disas/gc/drc/struct-get.wat index bad6dc2551..c8435b21ee 100644 --- a/tests/disas/gc/drc/struct-get.wat +++ b/tests/disas/gc/drc/struct-get.wat @@ -37,10 +37,10 @@ ;; @0033 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 16 ;; v17 = iconst.i64 32 ;; @0033 v13 = uadd_overflow_trap v9, v17, user1 ; v17 = 32 -;; @0033 v8 = load.i64 notrap aligned readonly v0+48 +;; @0033 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0033 v14 = icmp ule v13, v8 ;; @0033 trapz v14, user1 -;; @0033 v6 = load.i64 notrap aligned readonly v0+40 +;; @0033 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0033 v15 = iadd v6, v11 ;; @0033 v16 = load.f32 notrap aligned little v15 ;; @0037 jump block1 @@ -63,10 +63,10 @@ ;; @003c v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 20 ;; v18 = iconst.i64 32 ;; @003c v13 = uadd_overflow_trap v9, v18, user1 ; v18 = 32 -;; @003c v8 = load.i64 notrap aligned readonly v0+48 +;; @003c v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @003c v14 = icmp ule v13, v8 ;; @003c trapz v14, user1 -;; @003c v6 = load.i64 notrap aligned readonly v0+40 +;; @003c v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @003c v15 = iadd v6, v11 ;; @003c v16 = load.i8 notrap aligned little v15 ;; @0040 jump block1 @@ -90,10 +90,10 @@ ;; @0045 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 20 ;; v18 = iconst.i64 32 ;; @0045 v13 = uadd_overflow_trap v9, v18, user1 ; v18 = 32 -;; @0045 v8 = load.i64 notrap aligned readonly v0+48 +;; @0045 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0045 v14 = icmp ule v13, v8 ;; @0045 trapz v14, user1 -;; @0045 v6 = load.i64 notrap aligned readonly v0+40 +;; @0045 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0045 v15 = iadd v6, v11 ;; @0045 v16 = load.i8 notrap aligned little v15 ;; @0049 jump block1 @@ -120,10 +120,10 @@ ;; @004e v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 24 ;; v72 = iconst.i64 32 ;; @004e v13 = uadd_overflow_trap v9, v72, user1 ; v72 = 32 -;; @004e v8 = load.i64 notrap aligned readonly v0+48 +;; @004e v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @004e v14 = icmp ule v13, v8 ;; @004e trapz v14, user1 -;; @004e v6 = load.i64 notrap aligned readonly v0+40 +;; @004e v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @004e v15 = iadd v6, v11 ;; @004e v16 = load.i32 notrap aligned little v15 ;; v60 = stack_addr.i64 ss0 diff --git a/tests/disas/gc/drc/struct-new-default.wat b/tests/disas/gc/drc/struct-new-default.wat index ee7e1d111b..d4a5999e84 100644 --- a/tests/disas/gc/drc/struct-new-default.wat +++ b/tests/disas/gc/drc/struct-new-default.wat @@ -16,7 +16,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i64 tail +;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i32 tail ;; fn0 = colocated u1:27 sig0 ;; stack_limit = gv2 ;; @@ -27,41 +27,40 @@ ;; @0021 v10 = iconst.i32 8 ;; @0021 v11 = call fn0(v0, v8, v4, v6, v10) ; v8 = -1342177280, v4 = 0, v6 = 32, v10 = 8 ;; @0021 v3 = f32const 0.0 -;; @0021 v14 = load.i64 notrap aligned readonly v0+40 -;; @0021 v12 = ireduce.i32 v11 -;; @0021 v15 = uextend.i64 v12 -;; @0021 v16 = iadd v14, v15 -;; v48 = iconst.i64 16 -;; @0021 v17 = iadd v16, v48 ; v48 = 16 -;; @0021 store notrap aligned little v3, v17 ; v3 = 0.0 -;; v49 = iconst.i64 20 -;; @0021 v18 = iadd v16, v49 ; v49 = 20 -;; @0021 istore8 notrap aligned little v4, v18 ; v4 = 0 -;; v51 = iconst.i32 1 -;; @0021 brif v51, block3, block2 ; v51 = 1 +;; @0021 v13 = load.i64 notrap aligned readonly can_move v0+40 +;; @0021 v14 = uextend.i64 v11 +;; @0021 v15 = iadd v13, v14 +;; v47 = iconst.i64 16 +;; @0021 v16 = iadd v15, v47 ; v47 = 16 +;; @0021 store notrap aligned little v3, v16 ; v3 = 0.0 +;; v48 = iconst.i64 20 +;; @0021 v17 = iadd v15, v48 ; v48 = 20 +;; @0021 istore8 notrap aligned little v4, v17 ; v4 = 0 +;; v50 = iconst.i32 1 +;; @0021 brif v50, block3, block2 ; v50 = 1 ;; ;; block2: -;; v73 = iconst.i64 0 -;; @0021 v29 = iconst.i64 8 -;; @0021 v30 = uadd_overflow_trap v73, v29, user1 ; v73 = 0, v29 = 8 -;; @0021 v32 = uadd_overflow_trap v30, v29, user1 ; v29 = 8 -;; @0021 v27 = load.i64 notrap aligned readonly v0+48 -;; @0021 v33 = icmp ule v32, v27 -;; @0021 trapz v33, user1 -;; @0021 v34 = iadd.i64 v14, v30 -;; @0021 v35 = load.i64 notrap aligned v34 -;; v53 = iconst.i64 1 -;; @0021 v36 = iadd v35, v53 ; v53 = 1 -;; @0021 store notrap aligned v36, v34 +;; v72 = iconst.i64 0 +;; @0021 v28 = iconst.i64 8 +;; @0021 v29 = uadd_overflow_trap v72, v28, user1 ; v72 = 0, v28 = 8 +;; @0021 v31 = uadd_overflow_trap v29, v28, user1 ; v28 = 8 +;; @0021 v26 = load.i64 notrap aligned readonly can_move v0+48 +;; @0021 v32 = icmp ule v31, v26 +;; @0021 trapz v32, user1 +;; @0021 v33 = iadd.i64 v13, v29 +;; @0021 v34 = load.i64 notrap aligned v33 +;; v52 = iconst.i64 1 +;; @0021 v35 = iadd v34, v52 ; v52 = 1 +;; @0021 store notrap aligned v35, v33 ;; @0021 jump block3 ;; ;; block3: -;; v74 = iconst.i32 0 -;; v50 = iconst.i64 24 -;; @0021 v19 = iadd.i64 v16, v50 ; v50 = 24 -;; @0021 store notrap aligned little v74, v19 ; v74 = 0 +;; v73 = iconst.i32 0 +;; v49 = iconst.i64 24 +;; @0021 v18 = iadd.i64 v15, v49 ; v49 = 24 +;; @0021 store notrap aligned little v73, v18 ; v73 = 0 ;; @0024 jump block1 ;; ;; block1: -;; @0024 return v12 +;; @0024 return v11 ;; } diff --git a/tests/disas/gc/drc/struct-new.wat b/tests/disas/gc/drc/struct-new.wat index 461874c3f1..629a7394e2 100644 --- a/tests/disas/gc/drc/struct-new.wat +++ b/tests/disas/gc/drc/struct-new.wat @@ -17,58 +17,57 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i64 tail +;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i32 tail ;; fn0 = colocated u1:27 sig0 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: f32, v3: i32, v4: i32): -;; v53 = stack_addr.i64 ss0 -;; store notrap v4, v53 +;; v52 = stack_addr.i64 ss0 +;; store notrap v4, v52 ;; @002a v8 = iconst.i32 -1342177280 ;; @002a v9 = iconst.i32 0 ;; @002a v6 = iconst.i32 32 ;; @002a v10 = iconst.i32 8 ;; @002a v11 = call fn0(v0, v8, v9, v6, v10), stack_map=[i32 @ ss0+0] ; v8 = -1342177280, v9 = 0, v6 = 32, v10 = 8 -;; @002a v14 = load.i64 notrap aligned readonly v0+40 -;; @002a v12 = ireduce.i32 v11 -;; @002a v15 = uextend.i64 v12 -;; @002a v16 = iadd v14, v15 -;; v54 = iconst.i64 16 -;; @002a v17 = iadd v16, v54 ; v54 = 16 -;; @002a store notrap aligned little v2, v17 -;; v55 = iconst.i64 20 -;; @002a v18 = iadd v16, v55 ; v55 = 20 -;; @002a istore8 notrap aligned little v3, v18 -;; v52 = load.i32 notrap v53 -;; v58 = iconst.i32 1 -;; @002a v20 = band v52, v58 ; v58 = 1 -;; @002a v21 = icmp eq v52, v9 ; v9 = 0 -;; @002a v22 = uextend.i32 v21 -;; @002a v23 = bor v20, v22 -;; @002a brif v23, block3, block2 +;; @002a v13 = load.i64 notrap aligned readonly can_move v0+40 +;; @002a v14 = uextend.i64 v11 +;; @002a v15 = iadd v13, v14 +;; v53 = iconst.i64 16 +;; @002a v16 = iadd v15, v53 ; v53 = 16 +;; @002a store notrap aligned little v2, v16 +;; v54 = iconst.i64 20 +;; @002a v17 = iadd v15, v54 ; v54 = 20 +;; @002a istore8 notrap aligned little v3, v17 +;; v51 = load.i32 notrap v52 +;; v57 = iconst.i32 1 +;; @002a v19 = band v51, v57 ; v57 = 1 +;; @002a v20 = icmp eq v51, v9 ; v9 = 0 +;; @002a v21 = uextend.i32 v20 +;; @002a v22 = bor v19, v21 +;; @002a brif v22, block3, block2 ;; ;; block2: -;; @002a v28 = uextend.i64 v52 -;; @002a v29 = iconst.i64 8 -;; @002a v30 = uadd_overflow_trap v28, v29, user1 ; v29 = 8 -;; @002a v32 = uadd_overflow_trap v30, v29, user1 ; v29 = 8 -;; @002a v27 = load.i64 notrap aligned readonly v0+48 -;; @002a v33 = icmp ule v32, v27 -;; @002a trapz v33, user1 -;; @002a v34 = iadd.i64 v14, v30 -;; @002a v35 = load.i64 notrap aligned v34 -;; v62 = iconst.i64 1 -;; @002a v36 = iadd v35, v62 ; v62 = 1 -;; @002a store notrap aligned v36, v34 +;; @002a v27 = uextend.i64 v51 +;; @002a v28 = iconst.i64 8 +;; @002a v29 = uadd_overflow_trap v27, v28, user1 ; v28 = 8 +;; @002a v31 = uadd_overflow_trap v29, v28, user1 ; v28 = 8 +;; @002a v26 = load.i64 notrap aligned readonly can_move v0+48 +;; @002a v32 = icmp ule v31, v26 +;; @002a trapz v32, user1 +;; @002a v33 = iadd.i64 v13, v29 +;; @002a v34 = load.i64 notrap aligned v33 +;; v61 = iconst.i64 1 +;; @002a v35 = iadd v34, v61 ; v61 = 1 +;; @002a store notrap aligned v35, v33 ;; @002a jump block3 ;; ;; block3: -;; v48 = load.i32 notrap v53 -;; v56 = iconst.i64 24 -;; @002a v19 = iadd.i64 v16, v56 ; v56 = 24 -;; @002a store notrap aligned little v48, v19 +;; v47 = load.i32 notrap v52 +;; v55 = iconst.i64 24 +;; @002a v18 = iadd.i64 v15, v55 ; v55 = 24 +;; @002a store notrap aligned little v47, v18 ;; @002d jump block1 ;; ;; block1: -;; @002d return v12 +;; @002d return v11 ;; } diff --git a/tests/disas/gc/drc/struct-set.wat b/tests/disas/gc/drc/struct-set.wat index ee6b1e76be..a51f7cb37f 100644 --- a/tests/disas/gc/drc/struct-set.wat +++ b/tests/disas/gc/drc/struct-set.wat @@ -33,10 +33,10 @@ ;; @0034 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 16 ;; v16 = iconst.i64 32 ;; @0034 v13 = uadd_overflow_trap v9, v16, user1 ; v16 = 32 -;; @0034 v8 = load.i64 notrap aligned readonly v0+48 +;; @0034 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0034 v14 = icmp ule v13, v8 ;; @0034 trapz v14, user1 -;; @0034 v6 = load.i64 notrap aligned readonly v0+40 +;; @0034 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0034 v15 = iadd v6, v11 ;; @0034 store notrap aligned little v3, v15 ;; @0038 jump block1 @@ -59,10 +59,10 @@ ;; @003f v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 20 ;; v16 = iconst.i64 32 ;; @003f v13 = uadd_overflow_trap v9, v16, user1 ; v16 = 32 -;; @003f v8 = load.i64 notrap aligned readonly v0+48 +;; @003f v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @003f v14 = icmp ule v13, v8 ;; @003f trapz v14, user1 -;; @003f v6 = load.i64 notrap aligned readonly v0+40 +;; @003f v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @003f v15 = iadd v6, v11 ;; @003f istore8 notrap aligned little v3, v15 ;; @0043 jump block1 @@ -87,10 +87,10 @@ ;; @004a v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 24 ;; v82 = iconst.i64 32 ;; @004a v13 = uadd_overflow_trap v9, v82, user1 ; v82 = 32 -;; @004a v8 = load.i64 notrap aligned readonly v0+48 +;; @004a v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @004a v14 = icmp ule v13, v8 ;; @004a trapz v14, user1 -;; @004a v6 = load.i64 notrap aligned readonly v0+40 +;; @004a v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @004a v15 = iadd v6, v11 ;; @004a v16 = load.i32 notrap aligned little v15 ;; v75 = iconst.i32 1 @@ -110,43 +110,42 @@ ;; @004a trapz v30, user1 ;; @004a v31 = iadd.i64 v6, v27 ;; @004a v32 = load.i64 notrap aligned v31 -;; v77 = iconst.i64 1 -;; @004a v33 = iadd v32, v77 ; v77 = 1 +;; v84 = iconst.i64 1 +;; @004a v33 = iadd v32, v84 ; v84 = 1 ;; @004a store notrap aligned v33, v31 ;; @004a jump block3 ;; ;; block3: ;; @004a store.i32 notrap aligned little v3, v15 -;; v83 = iconst.i32 1 -;; v84 = band.i32 v16, v83 ; v83 = 1 -;; v85 = iconst.i32 0 -;; v86 = icmp.i32 eq v16, v85 ; v85 = 0 -;; @004a v47 = uextend.i32 v86 -;; @004a v48 = bor v84, v47 +;; v96 = iconst.i32 1 +;; v97 = band.i32 v16, v96 ; v96 = 1 +;; v98 = iconst.i32 0 +;; v99 = icmp.i32 eq v16, v98 ; v98 = 0 +;; @004a v47 = uextend.i32 v99 +;; @004a v48 = bor v97, v47 ;; @004a brif v48, block7, block4 ;; ;; block4: ;; @004a v53 = uextend.i64 v16 -;; v87 = iconst.i64 8 -;; @004a v55 = uadd_overflow_trap v53, v87, user1 ; v87 = 8 -;; @004a v57 = uadd_overflow_trap v55, v87, user1 ; v87 = 8 +;; v100 = iconst.i64 8 +;; @004a v55 = uadd_overflow_trap v53, v100, user1 ; v100 = 8 +;; @004a v57 = uadd_overflow_trap v55, v100, user1 ; v100 = 8 ;; @004a v58 = icmp ule v57, v8 ;; @004a trapz v58, user1 ;; @004a v59 = iadd.i64 v6, v55 ;; @004a v60 = load.i64 notrap aligned v59 -;; v80 = iconst.i64 -1 -;; @004a v61 = iadd v60, v80 ; v80 = -1 -;; v81 = iconst.i64 0 -;; @004a v62 = icmp eq v61, v81 ; v81 = 0 -;; @004a brif v62, block5, block6 +;; v101 = iconst.i64 1 +;; v94 = icmp eq v60, v101 ; v101 = 1 +;; @004a brif v94, block5, block6 ;; ;; block5 cold: ;; @004a call fn0(v0, v16) ;; @004a jump block7 ;; ;; block6: -;; v88 = iadd.i64 v60, v80 ; v80 = -1 -;; @004a store notrap aligned v88, v59 +;; v80 = iconst.i64 -1 +;; @004a v61 = iadd.i64 v60, v80 ; v80 = -1 +;; @004a store notrap aligned v61, v59 ;; @004a jump block7 ;; ;; block7: diff --git a/tests/disas/gc/null/array-fill.wat b/tests/disas/gc/null/array-fill.wat index a083d41c34..afc1962617 100644 --- a/tests/disas/gc/null/array-fill.wat +++ b/tests/disas/gc/null/array-fill.wat @@ -23,47 +23,48 @@ ;; @0027 v12 = uadd_overflow_trap v10, v11, user1 ; v11 = 8 ;; @0027 v13 = iconst.i64 4 ;; @0027 v14 = uadd_overflow_trap v12, v13, user1 ; v13 = 4 -;; @0027 v9 = load.i64 notrap aligned readonly v0+48 +;; @0027 v9 = load.i64 notrap aligned readonly can_move v0+48 ;; @0027 v15 = icmp ule v14, v9 ;; @0027 trapz v15, user1 -;; @0027 v7 = load.i64 notrap aligned readonly v0+40 +;; @0027 v7 = load.i64 notrap aligned readonly can_move v0+40 ;; @0027 v16 = iadd v7, v12 -;; @0027 v17 = load.i32 notrap aligned v16 +;; @0027 v17 = load.i32 notrap aligned readonly v16 ;; @0027 v18 = uadd_overflow_trap v3, v5, user17 ;; @0027 v19 = icmp ugt v18, v17 ;; @0027 trapnz v19, user17 ;; @0027 v21 = uextend.i64 v17 -;; v48 = iconst.i64 3 -;; v49 = ishl v21, v48 ; v48 = 3 -;; v47 = iconst.i64 32 -;; @0027 v23 = ushr v49, v47 ; v47 = 32 +;; v49 = iconst.i64 3 +;; v50 = ishl v21, v49 ; v49 = 3 +;; v48 = iconst.i64 32 +;; @0027 v23 = ushr v50, v48 ; v48 = 32 ;; @0027 trapnz v23, user1 -;; v58 = iconst.i32 3 -;; v59 = ishl v17, v58 ; v58 = 3 +;; v59 = iconst.i32 3 +;; v60 = ishl v17, v59 ; v59 = 3 ;; @0027 v25 = iconst.i32 16 -;; @0027 v26 = uadd_overflow_trap v59, v25, user1 ; v25 = 16 -;; v66 = ishl v3, v58 ; v58 = 3 -;; v68 = iadd v66, v25 ; v25 = 16 -;; @0027 v35 = uextend.i64 v68 +;; @0027 v26 = uadd_overflow_trap v60, v25, user1 ; v25 = 16 +;; v67 = ishl v3, v59 ; v59 = 3 +;; v69 = iadd v67, v25 ; v25 = 16 +;; @0027 v35 = uextend.i64 v69 ;; @0027 v36 = uadd_overflow_trap v10, v35, user1 ;; @0027 v37 = uextend.i64 v26 ;; @0027 v38 = uadd_overflow_trap v10, v37, user1 ;; @0027 v39 = icmp ule v38, v9 ;; @0027 trapz v39, user1 ;; @0027 v40 = iadd v7, v36 -;; @0027 v41 = uextend.i64 v66 -;; @0027 v42 = iadd v40, v41 +;; v71 = ishl v5, v59 ; v59 = 3 +;; @0027 v42 = uextend.i64 v71 +;; @0027 v43 = iadd v40, v42 ;; @0027 jump block2(v40) ;; -;; block2(v44: i64): -;; @0027 v45 = icmp eq v44, v42 -;; @0027 brif v45, block4, block3 +;; block2(v45: i64): +;; @0027 v46 = icmp eq v45, v43 +;; @0027 brif v46, block4, block3 ;; ;; block3: -;; @0027 store.i64 notrap aligned little v4, v44 -;; v70 = iconst.i64 8 -;; v71 = iadd.i64 v44, v70 ; v70 = 8 -;; @0027 jump block2(v71) +;; @0027 store.i64 notrap aligned little v4, v45 +;; v73 = iconst.i64 8 +;; v74 = iadd.i64 v45, v73 ; v73 = 8 +;; @0027 jump block2(v74) ;; ;; block4: ;; @002a jump block1 diff --git a/tests/disas/gc/null/array-get-s.wat b/tests/disas/gc/null/array-get-s.wat index 4ff79af0c6..5221b5e0f8 100644 --- a/tests/disas/gc/null/array-get-s.wat +++ b/tests/disas/gc/null/array-get-s.wat @@ -23,12 +23,12 @@ ;; @0022 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 8 ;; @0022 v12 = iconst.i64 4 ;; @0022 v13 = uadd_overflow_trap v11, v12, user1 ; v12 = 4 -;; @0022 v8 = load.i64 notrap aligned readonly v0+48 +;; @0022 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0022 v14 = icmp ule v13, v8 ;; @0022 trapz v14, user1 -;; @0022 v6 = load.i64 notrap aligned readonly v0+40 +;; @0022 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0022 v15 = iadd v6, v11 -;; @0022 v16 = load.i32 notrap aligned v15 +;; @0022 v16 = load.i32 notrap aligned readonly v15 ;; @0022 v17 = icmp ult v3, v16 ;; @0022 trapz v17, user17 ;; @0022 v19 = uextend.i64 v16 diff --git a/tests/disas/gc/null/array-get-u.wat b/tests/disas/gc/null/array-get-u.wat index 4c6eef63cf..d0384fe3bd 100644 --- a/tests/disas/gc/null/array-get-u.wat +++ b/tests/disas/gc/null/array-get-u.wat @@ -23,12 +23,12 @@ ;; @0022 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 8 ;; @0022 v12 = iconst.i64 4 ;; @0022 v13 = uadd_overflow_trap v11, v12, user1 ; v12 = 4 -;; @0022 v8 = load.i64 notrap aligned readonly v0+48 +;; @0022 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0022 v14 = icmp ule v13, v8 ;; @0022 trapz v14, user1 -;; @0022 v6 = load.i64 notrap aligned readonly v0+40 +;; @0022 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0022 v15 = iadd v6, v11 -;; @0022 v16 = load.i32 notrap aligned v15 +;; @0022 v16 = load.i32 notrap aligned readonly v15 ;; @0022 v17 = icmp ult v3, v16 ;; @0022 trapz v17, user17 ;; @0022 v19 = uextend.i64 v16 diff --git a/tests/disas/gc/null/array-get.wat b/tests/disas/gc/null/array-get.wat index 0ea2b978aa..fd0fce8561 100644 --- a/tests/disas/gc/null/array-get.wat +++ b/tests/disas/gc/null/array-get.wat @@ -23,12 +23,12 @@ ;; @0022 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 8 ;; @0022 v12 = iconst.i64 4 ;; @0022 v13 = uadd_overflow_trap v11, v12, user1 ; v12 = 4 -;; @0022 v8 = load.i64 notrap aligned readonly v0+48 +;; @0022 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0022 v14 = icmp ule v13, v8 ;; @0022 trapz v14, user1 -;; @0022 v6 = load.i64 notrap aligned readonly v0+40 +;; @0022 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0022 v15 = iadd v6, v11 -;; @0022 v16 = load.i32 notrap aligned v15 +;; @0022 v16 = load.i32 notrap aligned readonly v15 ;; @0022 v17 = icmp ult v3, v16 ;; @0022 trapz v17, user17 ;; @0022 v19 = uextend.i64 v16 diff --git a/tests/disas/gc/null/array-len.wat b/tests/disas/gc/null/array-len.wat index 695dae2af6..317ff20a82 100644 --- a/tests/disas/gc/null/array-len.wat +++ b/tests/disas/gc/null/array-len.wat @@ -23,12 +23,12 @@ ;; @001f v10 = uadd_overflow_trap v8, v9, user1 ; v9 = 8 ;; @001f v11 = iconst.i64 4 ;; @001f v12 = uadd_overflow_trap v10, v11, user1 ; v11 = 4 -;; @001f v7 = load.i64 notrap aligned readonly v0+48 +;; @001f v7 = load.i64 notrap aligned readonly can_move v0+48 ;; @001f v13 = icmp ule v12, v7 ;; @001f trapz v13, user1 -;; @001f v5 = load.i64 notrap aligned readonly v0+40 +;; @001f v5 = load.i64 notrap aligned readonly can_move v0+40 ;; @001f v14 = iadd v5, v10 -;; @001f v15 = load.i32 notrap aligned v14 +;; @001f v15 = load.i32 notrap aligned readonly v14 ;; @0021 jump block1 ;; ;; block1: diff --git a/tests/disas/gc/null/array-new-fixed-of-gc-refs.wat b/tests/disas/gc/null/array-new-fixed-of-gc-refs.wat new file mode 100644 index 0000000000..9349bc667f --- /dev/null +++ b/tests/disas/gc/null/array-new-fixed-of-gc-refs.wat @@ -0,0 +1,66 @@ +;;! target = "x86_64" +;;! flags = "-W function-references,gc -C collector=null" +;;! test = "optimize" + +(module + (type $ty (array (mut anyref))) + + (func (param anyref anyref anyref) (result (ref $ty)) + (array.new_fixed $ty 3 (local.get 0) (local.get 1) (local.get 2)) + ) +) +;; function u0:0(i64 vmctx, i64, i32, i32, i32) -> i32 tail { +;; gv0 = vmctx +;; gv1 = load.i64 notrap aligned readonly gv0+8 +;; gv2 = load.i64 notrap aligned gv1+16 +;; gv3 = vmctx +;; stack_limit = gv2 +;; +;; block0(v0: i64, v1: i64, v2: i32, v3: i32, v4: i32): +;; v59 = iconst.i64 0 +;; @0025 trapnz v59, user18 ; v59 = 0 +;; @0025 v7 = iconst.i32 12 +;; @0025 v12 = uadd_overflow_trap v7, v7, user18 ; v7 = 12, v7 = 12 +;; @0025 v14 = iconst.i32 -134217728 +;; @0025 v15 = band v12, v14 ; v14 = -134217728 +;; @0025 trapnz v15, user18 +;; @0025 v17 = load.i64 notrap aligned readonly v0+56 +;; @0025 v18 = load.i32 notrap aligned v17 +;; v60 = iconst.i32 7 +;; @0025 v21 = uadd_overflow_trap v18, v60, user18 ; v60 = 7 +;; v67 = iconst.i32 -8 +;; @0025 v23 = band v21, v67 ; v67 = -8 +;; @0025 v24 = uadd_overflow_trap v23, v12, user18 +;; @0025 v25 = uextend.i64 v24 +;; @0025 v29 = load.i64 notrap aligned readonly can_move v0+48 +;; @0025 v30 = icmp ule v25, v29 +;; @0025 trapz v30, user18 +;; @0025 v33 = iconst.i32 -1476395008 +;; v68 = bor v12, v33 ; v33 = -1476395008 +;; @0025 v27 = load.i64 notrap aligned readonly can_move v0+40 +;; @0025 v31 = uextend.i64 v23 +;; @0025 v32 = iadd v27, v31 +;; @0025 store notrap aligned v68, v32 +;; @0025 v36 = load.i64 notrap aligned readonly can_move v0+64 +;; @0025 v37 = load.i32 notrap aligned readonly can_move v36 +;; @0025 store notrap aligned v37, v32+4 +;; @0025 store notrap aligned v24, v17 +;; @0025 v6 = iconst.i32 3 +;; v48 = iconst.i64 8 +;; @0025 v38 = iadd v32, v48 ; v48 = 8 +;; @0025 store notrap aligned v6, v38 ; v6 = 3 +;; v50 = iconst.i64 12 +;; v76 = iadd v32, v50 ; v50 = 12 +;; @0025 store notrap aligned little v2, v76 +;; v78 = iconst.i64 16 +;; v84 = iadd v32, v78 ; v78 = 16 +;; @0025 store notrap aligned little v3, v84 +;; v86 = iconst.i64 20 +;; v92 = iadd v32, v86 ; v86 = 20 +;; @0025 store notrap aligned little v4, v92 +;; @0029 jump block1 +;; +;; block1: +;; v101 = band.i32 v21, v67 ; v67 = -8 +;; @0029 return v101 +;; } diff --git a/tests/disas/gc/null/array-new-fixed.wat b/tests/disas/gc/null/array-new-fixed.wat index 0be5bad675..0bdf887528 100644 --- a/tests/disas/gc/null/array-new-fixed.wat +++ b/tests/disas/gc/null/array-new-fixed.wat @@ -19,9 +19,9 @@ ;; block0(v0: i64, v1: i64, v2: i64, v3: i64, v4: i64): ;; v58 = iconst.i64 0 ;; @0025 trapnz v58, user18 ; v58 = 0 -;; @0025 v6 = iconst.i32 16 +;; @0025 v7 = iconst.i32 16 ;; v59 = iconst.i32 24 -;; @0025 v12 = uadd_overflow_trap v6, v59, user18 ; v6 = 16, v59 = 24 +;; @0025 v12 = uadd_overflow_trap v7, v59, user18 ; v7 = 16, v59 = 24 ;; @0025 v14 = iconst.i32 -134217728 ;; @0025 v15 = band v12, v14 ; v14 = -134217728 ;; @0025 trapnz v15, user18 @@ -33,23 +33,23 @@ ;; @0025 v23 = band v21, v67 ; v67 = -8 ;; @0025 v24 = uadd_overflow_trap v23, v12, user18 ;; @0025 v25 = uextend.i64 v24 -;; @0025 v29 = load.i64 notrap aligned readonly v0+48 +;; @0025 v29 = load.i64 notrap aligned readonly can_move v0+48 ;; @0025 v30 = icmp ule v25, v29 ;; @0025 trapz v30, user18 ;; @0025 v33 = iconst.i32 -1476395008 ;; v68 = bor v12, v33 ; v33 = -1476395008 -;; @0025 v27 = load.i64 notrap aligned readonly v0+40 +;; @0025 v27 = load.i64 notrap aligned readonly can_move v0+40 ;; @0025 v31 = uextend.i64 v23 ;; @0025 v32 = iadd v27, v31 ;; @0025 store notrap aligned v68, v32 -;; @0025 v36 = load.i64 notrap aligned readonly v0+64 -;; @0025 v37 = load.i32 notrap aligned readonly v36 +;; @0025 v36 = load.i64 notrap aligned readonly can_move v0+64 +;; @0025 v37 = load.i32 notrap aligned readonly can_move v36 ;; @0025 store notrap aligned v37, v32+4 ;; @0025 store notrap aligned v24, v17 -;; @0025 v7 = iconst.i32 3 +;; @0025 v6 = iconst.i32 3 ;; v46 = iconst.i64 8 ;; @0025 v38 = iadd v32, v46 ; v46 = 8 -;; @0025 store notrap aligned v7, v38 ; v7 = 3 +;; @0025 store notrap aligned v6, v38 ; v6 = 3 ;; v71 = iconst.i64 16 ;; v77 = iadd v32, v71 ; v71 = 16 ;; @0025 store notrap aligned little v2, v77 diff --git a/tests/disas/gc/null/array-new.wat b/tests/disas/gc/null/array-new.wat index 20c4bebae8..26eaba49e8 100644 --- a/tests/disas/gc/null/array-new.wat +++ b/tests/disas/gc/null/array-new.wat @@ -38,17 +38,17 @@ ;; @0022 v21 = band v19, v68 ; v68 = -8 ;; @0022 v22 = uadd_overflow_trap v21, v10, user18 ;; @0022 v23 = uextend.i64 v22 -;; @0022 v27 = load.i64 notrap aligned readonly v0+48 +;; @0022 v27 = load.i64 notrap aligned readonly can_move v0+48 ;; @0022 v28 = icmp ule v23, v27 ;; @0022 trapz v28, user18 ;; @0022 v31 = iconst.i32 -1476395008 ;; v69 = bor v10, v31 ; v31 = -1476395008 -;; @0022 v25 = load.i64 notrap aligned readonly v0+40 +;; @0022 v25 = load.i64 notrap aligned readonly can_move v0+40 ;; @0022 v29 = uextend.i64 v21 ;; @0022 v30 = iadd v25, v29 ;; @0022 store notrap aligned v69, v30 -;; @0022 v34 = load.i64 notrap aligned readonly v0+64 -;; @0022 v35 = load.i32 notrap aligned readonly v34 +;; @0022 v34 = load.i64 notrap aligned readonly can_move v0+64 +;; @0022 v35 = load.i32 notrap aligned readonly can_move v34 ;; @0022 store notrap aligned v35, v30+4 ;; @0022 store notrap aligned v22, v15 ;; v47 = iconst.i64 8 diff --git a/tests/disas/gc/null/array-set.wat b/tests/disas/gc/null/array-set.wat index 127f5f8805..113f0a75c6 100644 --- a/tests/disas/gc/null/array-set.wat +++ b/tests/disas/gc/null/array-set.wat @@ -23,12 +23,12 @@ ;; @0024 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 8 ;; @0024 v12 = iconst.i64 4 ;; @0024 v13 = uadd_overflow_trap v11, v12, user1 ; v12 = 4 -;; @0024 v8 = load.i64 notrap aligned readonly v0+48 +;; @0024 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0024 v14 = icmp ule v13, v8 ;; @0024 trapz v14, user1 -;; @0024 v6 = load.i64 notrap aligned readonly v0+40 +;; @0024 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0024 v15 = iadd v6, v11 -;; @0024 v16 = load.i32 notrap aligned v15 +;; @0024 v16 = load.i32 notrap aligned readonly v15 ;; @0024 v17 = icmp ult v3, v16 ;; @0024 trapz v17, user17 ;; @0024 v19 = uextend.i64 v16 diff --git a/tests/disas/gc/null/br-on-cast-fail.wat b/tests/disas/gc/null/br-on-cast-fail.wat index 02c96be3cf..f9ca90580f 100644 --- a/tests/disas/gc/null/br-on-cast-fail.wat +++ b/tests/disas/gc/null/br-on-cast-fail.wat @@ -49,14 +49,14 @@ ;; @002e v18 = iconst.i64 4 ;; @002e v19 = uadd_overflow_trap v17, v18, user1 ; v18 = 4 ;; @002e v21 = uadd_overflow_trap v19, v18, user1 ; v18 = 4 -;; @002e v16 = load.i64 notrap aligned readonly v0+48 +;; @002e v16 = load.i64 notrap aligned readonly can_move v0+48 ;; @002e v22 = icmp ule v21, v16 ;; @002e trapz v22, user1 -;; @002e v14 = load.i64 notrap aligned readonly v0+40 +;; @002e v14 = load.i64 notrap aligned readonly can_move v0+40 ;; @002e v23 = iadd v14, v19 ;; @002e v24 = load.i32 notrap aligned readonly v23 -;; @002e v11 = load.i64 notrap aligned readonly v0+64 -;; @002e v12 = load.i32 notrap aligned readonly v11 +;; @002e v11 = load.i64 notrap aligned readonly can_move v0+64 +;; @002e v12 = load.i32 notrap aligned readonly can_move v11 ;; @002e v25 = icmp eq v24, v12 ;; @002e v26 = uextend.i32 v25 ;; @002e brif v26, block7(v26), block6 @@ -73,14 +73,14 @@ ;; @002e brif v30, block8, block2 ;; ;; block8: -;; @0034 v32 = load.i64 notrap aligned readonly v0+80 -;; @0034 v33 = load.i64 notrap aligned readonly v0+96 +;; @0034 v32 = load.i64 notrap aligned readonly can_move v0+72 +;; @0034 v33 = load.i64 notrap aligned readonly can_move v0+88 ;; @0034 call_indirect sig1, v32(v33, v0) ;; @0036 return ;; ;; block2: -;; @0038 v35 = load.i64 notrap aligned readonly v0+104 -;; @0038 v36 = load.i64 notrap aligned readonly v0+120 +;; @0038 v35 = load.i64 notrap aligned readonly can_move v0+96 +;; @0038 v36 = load.i64 notrap aligned readonly can_move v0+112 ;; @0038 call_indirect sig2, v35(v36, v0) ;; @003a return ;; } diff --git a/tests/disas/gc/null/br-on-cast.wat b/tests/disas/gc/null/br-on-cast.wat index a4e2ea5c1c..1a6fe11126 100644 --- a/tests/disas/gc/null/br-on-cast.wat +++ b/tests/disas/gc/null/br-on-cast.wat @@ -49,14 +49,14 @@ ;; @002f v18 = iconst.i64 4 ;; @002f v19 = uadd_overflow_trap v17, v18, user1 ; v18 = 4 ;; @002f v21 = uadd_overflow_trap v19, v18, user1 ; v18 = 4 -;; @002f v16 = load.i64 notrap aligned readonly v0+48 +;; @002f v16 = load.i64 notrap aligned readonly can_move v0+48 ;; @002f v22 = icmp ule v21, v16 ;; @002f trapz v22, user1 -;; @002f v14 = load.i64 notrap aligned readonly v0+40 +;; @002f v14 = load.i64 notrap aligned readonly can_move v0+40 ;; @002f v23 = iadd v14, v19 ;; @002f v24 = load.i32 notrap aligned readonly v23 -;; @002f v11 = load.i64 notrap aligned readonly v0+64 -;; @002f v12 = load.i32 notrap aligned readonly v11 +;; @002f v11 = load.i64 notrap aligned readonly can_move v0+64 +;; @002f v12 = load.i32 notrap aligned readonly can_move v11 ;; @002f v25 = icmp eq v24, v12 ;; @002f v26 = uextend.i32 v25 ;; @002f brif v26, block7(v26), block6 @@ -73,14 +73,14 @@ ;; @002f brif v30, block2, block8 ;; ;; block8: -;; @0035 v32 = load.i64 notrap aligned readonly v0+80 -;; @0035 v33 = load.i64 notrap aligned readonly v0+96 +;; @0035 v32 = load.i64 notrap aligned readonly can_move v0+72 +;; @0035 v33 = load.i64 notrap aligned readonly can_move v0+88 ;; @0035 call_indirect sig1, v32(v33, v0) ;; @0037 return ;; ;; block2: -;; @0039 v35 = load.i64 notrap aligned readonly v0+104 -;; @0039 v36 = load.i64 notrap aligned readonly v0+120 +;; @0039 v35 = load.i64 notrap aligned readonly can_move v0+96 +;; @0039 v36 = load.i64 notrap aligned readonly can_move v0+112 ;; @0039 call_indirect sig2, v35(v36, v0) ;; @003b return ;; } diff --git a/tests/disas/gc/null/call-indirect-and-subtyping.wat b/tests/disas/gc/null/call-indirect-and-subtyping.wat index c801f532a0..3b95e528ce 100644 --- a/tests/disas/gc/null/call-indirect-and-subtyping.wat +++ b/tests/disas/gc/null/call-indirect-and-subtyping.wat @@ -21,7 +21,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+128 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+120 ;; sig0 = (i64 vmctx, i64) tail ;; sig1 = (i64 vmctx, i32, i64) -> i64 tail ;; sig2 = (i64 vmctx, i32, i32) -> i32 tail @@ -33,7 +33,7 @@ ;; @005c v3 = iconst.i32 2 ;; @005c v4 = icmp uge v2, v3 ; v3 = 2 ;; @005c v9 = iconst.i64 0 -;; @005c v6 = load.i64 notrap aligned readonly v0+128 +;; @005c v6 = load.i64 notrap aligned readonly can_move v0+120 ;; @005c v5 = uextend.i64 v2 ;; v30 = iconst.i64 3 ;; @005c v7 = ishl v5, v30 ; v30 = 3 @@ -51,8 +51,8 @@ ;; ;; block3(v13: i64): ;; @005c v21 = load.i32 user6 aligned readonly v13+16 -;; @005c v19 = load.i64 notrap aligned readonly v0+64 -;; @005c v20 = load.i32 notrap aligned readonly v19 +;; @005c v19 = load.i64 notrap aligned readonly can_move v0+64 +;; @005c v20 = load.i32 notrap aligned readonly can_move v19 ;; @005c v22 = icmp eq v21, v20 ;; @005c v23 = uextend.i32 v22 ;; @005c brif v23, block5(v23), block4 diff --git a/tests/disas/gc/null/funcref-in-gc-heap-get.wat b/tests/disas/gc/null/funcref-in-gc-heap-get.wat index e7f082ea08..fdf64a391d 100644 --- a/tests/disas/gc/null/funcref-in-gc-heap-get.wat +++ b/tests/disas/gc/null/funcref-in-gc-heap-get.wat @@ -25,10 +25,10 @@ ;; @0020 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 8 ;; v20 = iconst.i64 16 ;; @0020 v13 = uadd_overflow_trap v9, v20, user1 ; v20 = 16 -;; @0020 v8 = load.i64 notrap aligned readonly v0+48 +;; @0020 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0020 v14 = icmp ule v13, v8 ;; @0020 trapz v14, user1 -;; @0020 v6 = load.i64 notrap aligned readonly v0+40 +;; @0020 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0020 v15 = iadd v6, v11 ;; @0020 v18 = load.i32 notrap aligned little v15 ;; @0020 v16 = iconst.i32 -1 diff --git a/tests/disas/gc/null/funcref-in-gc-heap-new.wat b/tests/disas/gc/null/funcref-in-gc-heap-new.wat index 19576ca989..65a31189e5 100644 --- a/tests/disas/gc/null/funcref-in-gc-heap-new.wat +++ b/tests/disas/gc/null/funcref-in-gc-heap-new.wat @@ -30,16 +30,16 @@ ;; @0020 v4 = iconst.i32 16 ;; @0020 v16 = uadd_overflow_trap v15, v4, user18 ; v4 = 16 ;; @0020 v17 = uextend.i64 v16 -;; @0020 v21 = load.i64 notrap aligned readonly v0+48 +;; @0020 v21 = load.i64 notrap aligned readonly can_move v0+48 ;; @0020 v22 = icmp ule v17, v21 ;; @0020 trapz v22, user18 ;; v50 = iconst.i32 -1342177264 -;; @0020 v19 = load.i64 notrap aligned readonly v0+40 +;; @0020 v19 = load.i64 notrap aligned readonly can_move v0+40 ;; @0020 v23 = uextend.i64 v15 ;; @0020 v24 = iadd v19, v23 ;; @0020 store notrap aligned v50, v24 ; v50 = -1342177264 -;; @0020 v28 = load.i64 notrap aligned readonly v0+64 -;; @0020 v29 = load.i32 notrap aligned readonly v28 +;; @0020 v28 = load.i64 notrap aligned readonly can_move v0+64 +;; @0020 v29 = load.i32 notrap aligned readonly can_move v28 ;; @0020 store notrap aligned v29, v24+4 ;; @0020 store notrap aligned v16, v9 ;; @0020 v32 = call fn0(v0, v2) diff --git a/tests/disas/gc/null/funcref-in-gc-heap-set.wat b/tests/disas/gc/null/funcref-in-gc-heap-set.wat index 82487b5112..83c2251b16 100644 --- a/tests/disas/gc/null/funcref-in-gc-heap-set.wat +++ b/tests/disas/gc/null/funcref-in-gc-heap-set.wat @@ -25,12 +25,12 @@ ;; @0022 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 8 ;; v19 = iconst.i64 16 ;; @0022 v13 = uadd_overflow_trap v9, v19, user1 ; v19 = 16 -;; @0022 v8 = load.i64 notrap aligned readonly v0+48 +;; @0022 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0022 v14 = icmp ule v13, v8 ;; @0022 trapz v14, user1 ;; @0022 v17 = call fn0(v0, v3) ;; @0022 v18 = ireduce.i32 v17 -;; @0022 v6 = load.i64 notrap aligned readonly v0+40 +;; @0022 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0022 v15 = iadd v6, v11 ;; @0022 store notrap aligned little v18, v15 ;; @0026 jump block1 diff --git a/tests/disas/gc/null/multiple-array-get.wat b/tests/disas/gc/null/multiple-array-get.wat index 8cd8c2c2d4..b5c853aa6a 100644 --- a/tests/disas/gc/null/multiple-array-get.wat +++ b/tests/disas/gc/null/multiple-array-get.wat @@ -24,12 +24,12 @@ ;; @0024 v13 = uadd_overflow_trap v11, v12, user1 ; v12 = 8 ;; @0024 v14 = iconst.i64 4 ;; @0024 v15 = uadd_overflow_trap v13, v14, user1 ; v14 = 4 -;; @0024 v10 = load.i64 notrap aligned readonly v0+48 +;; @0024 v10 = load.i64 notrap aligned readonly can_move v0+48 ;; @0024 v16 = icmp ule v15, v10 ;; @0024 trapz v16, user1 -;; @0024 v8 = load.i64 notrap aligned readonly v0+40 +;; @0024 v8 = load.i64 notrap aligned readonly can_move v0+40 ;; @0024 v17 = iadd v8, v13 -;; @0024 v18 = load.i32 notrap aligned v17 +;; @0024 v18 = load.i32 notrap aligned readonly v17 ;; @0024 v19 = icmp ult v3, v18 ;; @0024 trapz v19, user17 ;; @0024 v21 = uextend.i64 v18 diff --git a/tests/disas/gc/null/multiple-struct-get.wat b/tests/disas/gc/null/multiple-struct-get.wat index 05cb85c9d7..6dd160ea80 100644 --- a/tests/disas/gc/null/multiple-struct-get.wat +++ b/tests/disas/gc/null/multiple-struct-get.wat @@ -25,10 +25,10 @@ ;; @0023 v12 = uadd_overflow_trap v10, v11, user1 ; v11 = 8 ;; v32 = iconst.i64 16 ;; @0023 v14 = uadd_overflow_trap v10, v32, user1 ; v32 = 16 -;; @0023 v9 = load.i64 notrap aligned readonly v0+48 +;; @0023 v9 = load.i64 notrap aligned readonly can_move v0+48 ;; @0023 v15 = icmp ule v14, v9 ;; @0023 trapz v15, user1 -;; @0023 v7 = load.i64 notrap aligned readonly v0+40 +;; @0023 v7 = load.i64 notrap aligned readonly can_move v0+40 ;; @0023 v16 = iadd v7, v12 ;; @0023 v17 = load.f32 notrap aligned little v16 ;; @0029 v24 = iconst.i64 12 diff --git a/tests/disas/gc/null/ref-cast.wat b/tests/disas/gc/null/ref-cast.wat index d65414e99f..dc1a313996 100644 --- a/tests/disas/gc/null/ref-cast.wat +++ b/tests/disas/gc/null/ref-cast.wat @@ -37,14 +37,14 @@ ;; @001e v18 = iconst.i64 4 ;; @001e v19 = uadd_overflow_trap v17, v18, user1 ; v18 = 4 ;; @001e v21 = uadd_overflow_trap v19, v18, user1 ; v18 = 4 -;; @001e v16 = load.i64 notrap aligned readonly v0+48 +;; @001e v16 = load.i64 notrap aligned readonly can_move v0+48 ;; @001e v22 = icmp ule v21, v16 ;; @001e trapz v22, user1 -;; @001e v14 = load.i64 notrap aligned readonly v0+40 +;; @001e v14 = load.i64 notrap aligned readonly can_move v0+40 ;; @001e v23 = iadd v14, v19 ;; @001e v24 = load.i32 notrap aligned readonly v23 -;; @001e v11 = load.i64 notrap aligned readonly v0+64 -;; @001e v12 = load.i32 notrap aligned readonly v11 +;; @001e v11 = load.i64 notrap aligned readonly can_move v0+64 +;; @001e v12 = load.i32 notrap aligned readonly can_move v11 ;; @001e v25 = icmp eq v24, v12 ;; @001e v26 = uextend.i32 v25 ;; @001e brif v26, block6(v26), block5 diff --git a/tests/disas/gc/null/ref-test-array.wat b/tests/disas/gc/null/ref-test-array.wat index 2c54e69408..c7daf29d4f 100644 --- a/tests/disas/gc/null/ref-test-array.wat +++ b/tests/disas/gc/null/ref-test-array.wat @@ -32,10 +32,10 @@ ;; @001b v17 = uadd_overflow_trap v15, v16, user1 ; v16 = 0 ;; v29 = iconst.i64 8 ;; @001b v19 = uadd_overflow_trap v15, v29, user1 ; v29 = 8 -;; @001b v14 = load.i64 notrap aligned readonly v0+48 +;; @001b v14 = load.i64 notrap aligned readonly can_move v0+48 ;; @001b v20 = icmp ule v19, v14 ;; @001b trapz v20, user1 -;; @001b v12 = load.i64 notrap aligned readonly v0+40 +;; @001b v12 = load.i64 notrap aligned readonly can_move v0+40 ;; @001b v21 = iadd v12, v17 ;; @001b v22 = load.i32 notrap aligned readonly v21 ;; @001b v23 = iconst.i32 -1476395008 diff --git a/tests/disas/gc/null/ref-test-concrete-func-type.wat b/tests/disas/gc/null/ref-test-concrete-func-type.wat index ff40b4e550..4510efb3d6 100644 --- a/tests/disas/gc/null/ref-test-concrete-func-type.wat +++ b/tests/disas/gc/null/ref-test-concrete-func-type.wat @@ -29,8 +29,8 @@ ;; ;; block3: ;; @0020 v10 = load.i32 notrap aligned readonly v2+16 -;; @0020 v8 = load.i64 notrap aligned readonly v0+64 -;; @0020 v9 = load.i32 notrap aligned readonly v8 +;; @0020 v8 = load.i64 notrap aligned readonly can_move v0+64 +;; @0020 v9 = load.i32 notrap aligned readonly can_move v8 ;; @0020 v11 = icmp eq v10, v9 ;; @0020 v12 = uextend.i32 v11 ;; @0020 brif v12, block6(v12), block5 diff --git a/tests/disas/gc/null/ref-test-concrete-type.wat b/tests/disas/gc/null/ref-test-concrete-type.wat index dd8c6bd205..d5139164ef 100644 --- a/tests/disas/gc/null/ref-test-concrete-type.wat +++ b/tests/disas/gc/null/ref-test-concrete-type.wat @@ -34,14 +34,14 @@ ;; @001d v18 = iconst.i64 4 ;; @001d v19 = uadd_overflow_trap v17, v18, user1 ; v18 = 4 ;; @001d v21 = uadd_overflow_trap v19, v18, user1 ; v18 = 4 -;; @001d v16 = load.i64 notrap aligned readonly v0+48 +;; @001d v16 = load.i64 notrap aligned readonly can_move v0+48 ;; @001d v22 = icmp ule v21, v16 ;; @001d trapz v22, user1 -;; @001d v14 = load.i64 notrap aligned readonly v0+40 +;; @001d v14 = load.i64 notrap aligned readonly can_move v0+40 ;; @001d v23 = iadd v14, v19 ;; @001d v24 = load.i32 notrap aligned readonly v23 -;; @001d v11 = load.i64 notrap aligned readonly v0+64 -;; @001d v12 = load.i32 notrap aligned readonly v11 +;; @001d v11 = load.i64 notrap aligned readonly can_move v0+64 +;; @001d v12 = load.i32 notrap aligned readonly can_move v11 ;; @001d v25 = icmp eq v24, v12 ;; @001d v26 = uextend.i32 v25 ;; @001d brif v26, block6(v26), block5 diff --git a/tests/disas/gc/null/ref-test-eq.wat b/tests/disas/gc/null/ref-test-eq.wat index c1eea328eb..5e1b073e12 100644 --- a/tests/disas/gc/null/ref-test-eq.wat +++ b/tests/disas/gc/null/ref-test-eq.wat @@ -31,10 +31,10 @@ ;; @001b v17 = uadd_overflow_trap v15, v16, user1 ; v16 = 0 ;; v29 = iconst.i64 8 ;; @001b v19 = uadd_overflow_trap v15, v29, user1 ; v29 = 8 -;; @001b v14 = load.i64 notrap aligned readonly v0+48 +;; @001b v14 = load.i64 notrap aligned readonly can_move v0+48 ;; @001b v20 = icmp ule v19, v14 ;; @001b trapz v20, user1 -;; @001b v12 = load.i64 notrap aligned readonly v0+40 +;; @001b v12 = load.i64 notrap aligned readonly can_move v0+40 ;; @001b v21 = iadd v12, v17 ;; @001b v22 = load.i32 notrap aligned readonly v21 ;; @001b v23 = iconst.i32 -1610612736 diff --git a/tests/disas/gc/null/ref-test-struct.wat b/tests/disas/gc/null/ref-test-struct.wat index 388dbb1da3..c24ad1c4a7 100644 --- a/tests/disas/gc/null/ref-test-struct.wat +++ b/tests/disas/gc/null/ref-test-struct.wat @@ -32,10 +32,10 @@ ;; @001b v17 = uadd_overflow_trap v15, v16, user1 ; v16 = 0 ;; v29 = iconst.i64 8 ;; @001b v19 = uadd_overflow_trap v15, v29, user1 ; v29 = 8 -;; @001b v14 = load.i64 notrap aligned readonly v0+48 +;; @001b v14 = load.i64 notrap aligned readonly can_move v0+48 ;; @001b v20 = icmp ule v19, v14 ;; @001b trapz v20, user1 -;; @001b v12 = load.i64 notrap aligned readonly v0+40 +;; @001b v12 = load.i64 notrap aligned readonly can_move v0+40 ;; @001b v21 = iadd v12, v17 ;; @001b v22 = load.i32 notrap aligned readonly v21 ;; @001b v23 = iconst.i32 -1342177280 diff --git a/tests/disas/gc/null/struct-get.wat b/tests/disas/gc/null/struct-get.wat index 3241f2f5e9..9f033b38ad 100644 --- a/tests/disas/gc/null/struct-get.wat +++ b/tests/disas/gc/null/struct-get.wat @@ -37,10 +37,10 @@ ;; @0033 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 8 ;; v17 = iconst.i64 24 ;; @0033 v13 = uadd_overflow_trap v9, v17, user1 ; v17 = 24 -;; @0033 v8 = load.i64 notrap aligned readonly v0+48 +;; @0033 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0033 v14 = icmp ule v13, v8 ;; @0033 trapz v14, user1 -;; @0033 v6 = load.i64 notrap aligned readonly v0+40 +;; @0033 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0033 v15 = iadd v6, v11 ;; @0033 v16 = load.f32 notrap aligned little v15 ;; @0037 jump block1 @@ -63,10 +63,10 @@ ;; @003c v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 12 ;; v18 = iconst.i64 24 ;; @003c v13 = uadd_overflow_trap v9, v18, user1 ; v18 = 24 -;; @003c v8 = load.i64 notrap aligned readonly v0+48 +;; @003c v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @003c v14 = icmp ule v13, v8 ;; @003c trapz v14, user1 -;; @003c v6 = load.i64 notrap aligned readonly v0+40 +;; @003c v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @003c v15 = iadd v6, v11 ;; @003c v16 = load.i8 notrap aligned little v15 ;; @0040 jump block1 @@ -90,10 +90,10 @@ ;; @0045 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 12 ;; v18 = iconst.i64 24 ;; @0045 v13 = uadd_overflow_trap v9, v18, user1 ; v18 = 24 -;; @0045 v8 = load.i64 notrap aligned readonly v0+48 +;; @0045 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0045 v14 = icmp ule v13, v8 ;; @0045 trapz v14, user1 -;; @0045 v6 = load.i64 notrap aligned readonly v0+40 +;; @0045 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0045 v15 = iadd v6, v11 ;; @0045 v16 = load.i8 notrap aligned little v15 ;; @0049 jump block1 @@ -117,10 +117,10 @@ ;; @004e v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 16 ;; v17 = iconst.i64 24 ;; @004e v13 = uadd_overflow_trap v9, v17, user1 ; v17 = 24 -;; @004e v8 = load.i64 notrap aligned readonly v0+48 +;; @004e v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @004e v14 = icmp ule v13, v8 ;; @004e trapz v14, user1 -;; @004e v6 = load.i64 notrap aligned readonly v0+40 +;; @004e v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @004e v15 = iadd v6, v11 ;; @004e v16 = load.i32 notrap aligned little v15 ;; @0052 jump block1 diff --git a/tests/disas/gc/null/struct-new-default.wat b/tests/disas/gc/null/struct-new-default.wat index c1343f4191..8efe8c7d42 100644 --- a/tests/disas/gc/null/struct-new-default.wat +++ b/tests/disas/gc/null/struct-new-default.wat @@ -30,16 +30,16 @@ ;; @0021 v6 = iconst.i32 24 ;; @0021 v18 = uadd_overflow_trap v17, v6, user18 ; v6 = 24 ;; @0021 v19 = uextend.i64 v18 -;; @0021 v23 = load.i64 notrap aligned readonly v0+48 +;; @0021 v23 = load.i64 notrap aligned readonly can_move v0+48 ;; @0021 v24 = icmp ule v19, v23 ;; @0021 trapz v24, user18 ;; v52 = iconst.i32 -1342177256 -;; @0021 v21 = load.i64 notrap aligned readonly v0+40 +;; @0021 v21 = load.i64 notrap aligned readonly can_move v0+40 ;; @0021 v25 = uextend.i64 v17 ;; @0021 v26 = iadd v21, v25 ;; @0021 store notrap aligned v52, v26 ; v52 = -1342177256 -;; @0021 v30 = load.i64 notrap aligned readonly v0+64 -;; @0021 v31 = load.i32 notrap aligned readonly v30 +;; @0021 v30 = load.i64 notrap aligned readonly can_move v0+64 +;; @0021 v31 = load.i32 notrap aligned readonly can_move v30 ;; @0021 store notrap aligned v31, v26+4 ;; @0021 store notrap aligned v18, v11 ;; @0021 v3 = f32const 0.0 diff --git a/tests/disas/gc/null/struct-new.wat b/tests/disas/gc/null/struct-new.wat index 9da345f938..0b29605e20 100644 --- a/tests/disas/gc/null/struct-new.wat +++ b/tests/disas/gc/null/struct-new.wat @@ -30,16 +30,16 @@ ;; @002a v6 = iconst.i32 24 ;; @002a v18 = uadd_overflow_trap v17, v6, user18 ; v6 = 24 ;; @002a v19 = uextend.i64 v18 -;; @002a v23 = load.i64 notrap aligned readonly v0+48 +;; @002a v23 = load.i64 notrap aligned readonly can_move v0+48 ;; @002a v24 = icmp ule v19, v23 ;; @002a trapz v24, user18 ;; v53 = iconst.i32 -1342177256 -;; @002a v21 = load.i64 notrap aligned readonly v0+40 +;; @002a v21 = load.i64 notrap aligned readonly can_move v0+40 ;; @002a v25 = uextend.i64 v17 ;; @002a v26 = iadd v21, v25 ;; @002a store notrap aligned v53, v26 ; v53 = -1342177256 -;; @002a v30 = load.i64 notrap aligned readonly v0+64 -;; @002a v31 = load.i32 notrap aligned readonly v30 +;; @002a v30 = load.i64 notrap aligned readonly can_move v0+64 +;; @002a v31 = load.i32 notrap aligned readonly can_move v30 ;; @002a store notrap aligned v31, v26+4 ;; @002a store notrap aligned v18, v11 ;; v35 = iconst.i64 8 diff --git a/tests/disas/gc/null/struct-set.wat b/tests/disas/gc/null/struct-set.wat index 9cd22459bd..a392c83b99 100644 --- a/tests/disas/gc/null/struct-set.wat +++ b/tests/disas/gc/null/struct-set.wat @@ -33,10 +33,10 @@ ;; @0034 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 8 ;; v16 = iconst.i64 24 ;; @0034 v13 = uadd_overflow_trap v9, v16, user1 ; v16 = 24 -;; @0034 v8 = load.i64 notrap aligned readonly v0+48 +;; @0034 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0034 v14 = icmp ule v13, v8 ;; @0034 trapz v14, user1 -;; @0034 v6 = load.i64 notrap aligned readonly v0+40 +;; @0034 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0034 v15 = iadd v6, v11 ;; @0034 store notrap aligned little v3, v15 ;; @0038 jump block1 @@ -59,10 +59,10 @@ ;; @003f v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 12 ;; v16 = iconst.i64 24 ;; @003f v13 = uadd_overflow_trap v9, v16, user1 ; v16 = 24 -;; @003f v8 = load.i64 notrap aligned readonly v0+48 +;; @003f v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @003f v14 = icmp ule v13, v8 ;; @003f trapz v14, user1 -;; @003f v6 = load.i64 notrap aligned readonly v0+40 +;; @003f v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @003f v15 = iadd v6, v11 ;; @003f istore8 notrap aligned little v3, v15 ;; @0043 jump block1 @@ -85,10 +85,10 @@ ;; @004a v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 16 ;; v16 = iconst.i64 24 ;; @004a v13 = uadd_overflow_trap v9, v16, user1 ; v16 = 24 -;; @004a v8 = load.i64 notrap aligned readonly v0+48 +;; @004a v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @004a v14 = icmp ule v13, v8 ;; @004a trapz v14, user1 -;; @004a v6 = load.i64 notrap aligned readonly v0+40 +;; @004a v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @004a v15 = iadd v6, v11 ;; @004a store notrap aligned little v3, v15 ;; @004e jump block1 diff --git a/tests/disas/gc/null/v128-fields.wat b/tests/disas/gc/null/v128-fields.wat index 5bd2f3d641..2e5fce7e5a 100644 --- a/tests/disas/gc/null/v128-fields.wat +++ b/tests/disas/gc/null/v128-fields.wat @@ -25,10 +25,10 @@ ;; @0022 v11 = uadd_overflow_trap v9, v10, user1 ; v10 = 16 ;; v31 = iconst.i64 48 ;; @0022 v13 = uadd_overflow_trap v9, v31, user1 ; v31 = 48 -;; @0022 v8 = load.i64 notrap aligned readonly v0+48 +;; @0022 v8 = load.i64 notrap aligned readonly can_move v0+48 ;; @0022 v14 = icmp ule v13, v8 ;; @0022 trapz v14, user1 -;; @0022 v6 = load.i64 notrap aligned readonly v0+40 +;; @0022 v6 = load.i64 notrap aligned readonly can_move v0+40 ;; @0022 v15 = iadd v6, v11 ;; @0022 v16 = load.i8x16 notrap aligned little v15 ;; @002e jump block1 diff --git a/tests/disas/gc/struct-new-default.wat b/tests/disas/gc/struct-new-default.wat index b8604f75e1..133a6cbc6e 100644 --- a/tests/disas/gc/struct-new-default.wat +++ b/tests/disas/gc/struct-new-default.wat @@ -17,7 +17,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i64 tail +;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i32 tail ;; fn0 = colocated u1:27 sig0 ;; const0 = 0x00000000000000000000000000000000 ;; stack_limit = gv2 @@ -29,45 +29,44 @@ ;; @0023 v11 = iconst.i32 16 ;; @0023 v12 = call fn0(v0, v9, v4, v7, v11) ; v9 = -1342177280, v4 = 0, v7 = 48, v11 = 16 ;; @0023 v3 = f32const 0.0 -;; @0023 v15 = load.i64 notrap aligned readonly v0+40 -;; @0023 v13 = ireduce.i32 v12 -;; @0023 v16 = uextend.i64 v13 -;; @0023 v17 = iadd v15, v16 -;; v50 = iconst.i64 16 -;; @0023 v18 = iadd v17, v50 ; v50 = 16 -;; @0023 store notrap aligned little v3, v18 ; v3 = 0.0 -;; v51 = iconst.i64 20 -;; @0023 v19 = iadd v17, v51 ; v51 = 20 -;; @0023 istore8 notrap aligned little v4, v19 ; v4 = 0 -;; v53 = iconst.i32 1 -;; @0023 brif v53, block3, block2 ; v53 = 1 +;; @0023 v14 = load.i64 notrap aligned readonly can_move v0+40 +;; @0023 v15 = uextend.i64 v12 +;; @0023 v16 = iadd v14, v15 +;; v49 = iconst.i64 16 +;; @0023 v17 = iadd v16, v49 ; v49 = 16 +;; @0023 store notrap aligned little v3, v17 ; v3 = 0.0 +;; v50 = iconst.i64 20 +;; @0023 v18 = iadd v16, v50 ; v50 = 20 +;; @0023 istore8 notrap aligned little v4, v18 ; v4 = 0 +;; v52 = iconst.i32 1 +;; @0023 brif v52, block3, block2 ; v52 = 1 ;; ;; block2: -;; v76 = iconst.i64 0 -;; @0023 v30 = iconst.i64 8 -;; @0023 v31 = uadd_overflow_trap v76, v30, user1 ; v76 = 0, v30 = 8 -;; @0023 v33 = uadd_overflow_trap v31, v30, user1 ; v30 = 8 -;; @0023 v28 = load.i64 notrap aligned readonly v0+48 -;; @0023 v34 = icmp ule v33, v28 -;; @0023 trapz v34, user1 -;; @0023 v35 = iadd.i64 v15, v31 -;; @0023 v36 = load.i64 notrap aligned v35 -;; v55 = iconst.i64 1 -;; @0023 v37 = iadd v36, v55 ; v55 = 1 -;; @0023 store notrap aligned v37, v35 +;; v75 = iconst.i64 0 +;; @0023 v29 = iconst.i64 8 +;; @0023 v30 = uadd_overflow_trap v75, v29, user1 ; v75 = 0, v29 = 8 +;; @0023 v32 = uadd_overflow_trap v30, v29, user1 ; v29 = 8 +;; @0023 v27 = load.i64 notrap aligned readonly can_move v0+48 +;; @0023 v33 = icmp ule v32, v27 +;; @0023 trapz v33, user1 +;; @0023 v34 = iadd.i64 v14, v30 +;; @0023 v35 = load.i64 notrap aligned v34 +;; v54 = iconst.i64 1 +;; @0023 v36 = iadd v35, v54 ; v54 = 1 +;; @0023 store notrap aligned v36, v34 ;; @0023 jump block3 ;; ;; block3: -;; v77 = iconst.i32 0 -;; v52 = iconst.i64 24 -;; @0023 v20 = iadd.i64 v17, v52 ; v52 = 24 -;; @0023 store notrap aligned little v77, v20 ; v77 = 0 +;; v76 = iconst.i32 0 +;; v51 = iconst.i64 24 +;; @0023 v19 = iadd.i64 v16, v51 ; v51 = 24 +;; @0023 store notrap aligned little v76, v19 ; v76 = 0 ;; @0023 v6 = vconst.i8x16 const0 -;; v56 = iconst.i64 32 -;; @0023 v49 = iadd.i64 v17, v56 ; v56 = 32 -;; @0023 store notrap aligned little v6, v49 ; v6 = const0 +;; v55 = iconst.i64 32 +;; @0023 v48 = iadd.i64 v16, v55 ; v55 = 32 +;; @0023 store notrap aligned little v6, v48 ; v6 = const0 ;; @0026 jump block1 ;; ;; block1: -;; @0026 return v13 +;; @0026 return v12 ;; } diff --git a/tests/disas/gc/struct-new-stack-map.wat b/tests/disas/gc/struct-new-stack-map.wat new file mode 100644 index 0000000000..ca61f6841f --- /dev/null +++ b/tests/disas/gc/struct-new-stack-map.wat @@ -0,0 +1,76 @@ +;;! target = "x86_64" +;;! flags = "-W function-references,gc" +;;! test = "compile" + +(module + (type $ty (struct (field (mut f32)) + (field (mut i8)) + (field (mut anyref)))) + + (func (param f32 i32 anyref) (result (ref $ty)) + (struct.new $ty (local.get 0) (local.get 1) (local.get 2)) + ) +) +;; wasm[0]::function[0]: +;; pushq %rbp +;; movq %rsp, %rbp +;; movq 8(%rdi), %r10 +;; movq 0x10(%r10), %r10 +;; addq $0x50, %r10 +;; cmpq %rsp, %r10 +;; ja 0xe4 +;; 19: subq $0x40, %rsp +;; movq %r13, 0x20(%rsp) +;; movq %r14, 0x28(%rsp) +;; movq %r15, 0x30(%rsp) +;; movq %rdx, %r15 +;; movdqu %xmm0, 8(%rsp) +;; leaq (%rsp), %r14 +;; movl %ecx, (%r14) +;; movl $0xb0000000, %esi +;; xorl %edx, %edx +;; movl $0x20, %ecx +;; movl $8, %r8d +;; movq %rdi, %r13 +;; callq 0x195 +;; movq 0x28(%r13), %r9 +;; ╰─╼ stack_map: frame_size=64, frame_offsets=[0] +;; movq %rax, %r8 +;; movl %r8d, %r10d +;; movdqu 8(%rsp), %xmm0 +;; movss %xmm0, 0x10(%r9, %r10) +;; movq %r15, %rdx +;; movb %dl, 0x14(%r9, %r10) +;; movl (%r14), %r11d +;; movq %r11, %rdx +;; andl $1, %edx +;; testl %r11d, %r11d +;; sete %sil +;; movzbl %sil, %esi +;; orl %esi, %edx +;; testl %edx, %edx +;; jne 0xc1 +;; 93: movl %r11d, %edi +;; addq $8, %rdi +;; jb 0xe6 +;; a0: movq %rdi, %rcx +;; addq $8, %rcx +;; jb 0xe8 +;; ad: cmpq 0x30(%r13), %rcx +;; ja 0xea +;; b7: movl $1, %r11d +;; addq %r11, (%r9, %rdi) +;; movl (%r14), %r11d +;; movl %r11d, 0x18(%r9, %r10) +;; movq %r8, %rax +;; movq 0x20(%rsp), %r13 +;; movq 0x28(%rsp), %r14 +;; movq 0x30(%rsp), %r15 +;; addq $0x40, %rsp +;; movq %rbp, %rsp +;; popq %rbp +;; retq +;; e4: ud2 +;; e6: ud2 +;; e8: ud2 +;; ea: ud2 diff --git a/tests/disas/gc/struct-new.wat b/tests/disas/gc/struct-new.wat index 20f04a0e6a..042bf12b42 100644 --- a/tests/disas/gc/struct-new.wat +++ b/tests/disas/gc/struct-new.wat @@ -17,58 +17,57 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i64 tail +;; sig0 = (i64 vmctx, i32, i32, i32, i32) -> i32 tail ;; fn0 = colocated u1:27 sig0 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: f32, v3: i32, v4: i32): -;; v53 = stack_addr.i64 ss0 -;; store notrap v4, v53 +;; v52 = stack_addr.i64 ss0 +;; store notrap v4, v52 ;; @002a v8 = iconst.i32 -1342177280 ;; @002a v9 = iconst.i32 0 ;; @002a v6 = iconst.i32 32 ;; @002a v10 = iconst.i32 8 ;; @002a v11 = call fn0(v0, v8, v9, v6, v10), stack_map=[i32 @ ss0+0] ; v8 = -1342177280, v9 = 0, v6 = 32, v10 = 8 -;; @002a v14 = load.i64 notrap aligned readonly v0+40 -;; @002a v12 = ireduce.i32 v11 -;; @002a v15 = uextend.i64 v12 -;; @002a v16 = iadd v14, v15 -;; v54 = iconst.i64 16 -;; @002a v17 = iadd v16, v54 ; v54 = 16 -;; @002a store notrap aligned little v2, v17 -;; v55 = iconst.i64 20 -;; @002a v18 = iadd v16, v55 ; v55 = 20 -;; @002a istore8 notrap aligned little v3, v18 -;; v52 = load.i32 notrap v53 -;; v58 = iconst.i32 1 -;; @002a v20 = band v52, v58 ; v58 = 1 -;; @002a v21 = icmp eq v52, v9 ; v9 = 0 -;; @002a v22 = uextend.i32 v21 -;; @002a v23 = bor v20, v22 -;; @002a brif v23, block3, block2 +;; @002a v13 = load.i64 notrap aligned readonly can_move v0+40 +;; @002a v14 = uextend.i64 v11 +;; @002a v15 = iadd v13, v14 +;; v53 = iconst.i64 16 +;; @002a v16 = iadd v15, v53 ; v53 = 16 +;; @002a store notrap aligned little v2, v16 +;; v54 = iconst.i64 20 +;; @002a v17 = iadd v15, v54 ; v54 = 20 +;; @002a istore8 notrap aligned little v3, v17 +;; v51 = load.i32 notrap v52 +;; v57 = iconst.i32 1 +;; @002a v19 = band v51, v57 ; v57 = 1 +;; @002a v20 = icmp eq v51, v9 ; v9 = 0 +;; @002a v21 = uextend.i32 v20 +;; @002a v22 = bor v19, v21 +;; @002a brif v22, block3, block2 ;; ;; block2: -;; @002a v28 = uextend.i64 v52 -;; @002a v29 = iconst.i64 8 -;; @002a v30 = uadd_overflow_trap v28, v29, user1 ; v29 = 8 -;; @002a v32 = uadd_overflow_trap v30, v29, user1 ; v29 = 8 -;; @002a v27 = load.i64 notrap aligned readonly v0+48 -;; @002a v33 = icmp ule v32, v27 -;; @002a trapz v33, user1 -;; @002a v34 = iadd.i64 v14, v30 -;; @002a v35 = load.i64 notrap aligned v34 -;; v62 = iconst.i64 1 -;; @002a v36 = iadd v35, v62 ; v62 = 1 -;; @002a store notrap aligned v36, v34 +;; @002a v27 = uextend.i64 v51 +;; @002a v28 = iconst.i64 8 +;; @002a v29 = uadd_overflow_trap v27, v28, user1 ; v28 = 8 +;; @002a v31 = uadd_overflow_trap v29, v28, user1 ; v28 = 8 +;; @002a v26 = load.i64 notrap aligned readonly can_move v0+48 +;; @002a v32 = icmp ule v31, v26 +;; @002a trapz v32, user1 +;; @002a v33 = iadd.i64 v13, v29 +;; @002a v34 = load.i64 notrap aligned v33 +;; v61 = iconst.i64 1 +;; @002a v35 = iadd v34, v61 ; v61 = 1 +;; @002a store notrap aligned v35, v33 ;; @002a jump block3 ;; ;; block3: -;; v48 = load.i32 notrap v53 -;; v56 = iconst.i64 24 -;; @002a v19 = iadd.i64 v16, v56 ; v56 = 24 -;; @002a store notrap aligned little v48, v19 +;; v47 = load.i32 notrap v52 +;; v55 = iconst.i64 24 +;; @002a v18 = iadd.i64 v15, v55 ; v55 = 24 +;; @002a store notrap aligned little v47, v18 ;; @002d jump block1 ;; ;; block1: -;; @002d return v12 +;; @002d return v11 ;; } diff --git a/tests/disas/globals.wat b/tests/disas/globals.wat index 09aa5c6e9a..1778541942 100644 --- a/tests/disas/globals.wat +++ b/tests/disas/globals.wat @@ -14,16 +14,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64): ;; @0027 v2 = iconst.i32 0 ;; @0029 v3 = iconst.i32 0 -;; @002b v5 = load.i32 notrap aligned table v0+112 +;; @002b v5 = load.i32 notrap aligned table v0+96 ;; @002d v6 = uextend.i64 v3 ; v3 = 0 -;; @002d v7 = load.i64 notrap aligned readonly checked v0+88 +;; @002d v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @002d v8 = iadd v7, v6 ;; @002d store little heap v5, v8 ;; @0030 jump block1 diff --git a/tests/disas/i128-cmp.wat b/tests/disas/i128-cmp.wat index 35a753d724..2866344369 100644 --- a/tests/disas/i128-cmp.wat +++ b/tests/disas/i128-cmp.wat @@ -112,8 +112,8 @@ ;; v16 = iconcat.i64 v2, v3 ;; v17 = iconcat.i64 v4, v5 ;; v18 = icmp slt v16, v17 -;; v20 = uextend.i32 v18 -;; @0034 return v20 +;; v26 = uextend.i32 v18 +;; @0034 return v26 ;; } ;; ;; function u0:1(i64 vmctx, i64, i64, i64, i64, i64) -> i32 tail { @@ -129,8 +129,8 @@ ;; v16 = iconcat.i64 v2, v3 ;; v17 = iconcat.i64 v4, v5 ;; v18 = icmp ult v16, v17 -;; v20 = uextend.i32 v18 -;; @0047 return v20 +;; v26 = uextend.i32 v18 +;; @0047 return v26 ;; } ;; ;; function u0:2(i64 vmctx, i64, i64, i64, i64, i64) -> i32 tail { @@ -146,8 +146,8 @@ ;; v16 = iconcat.i64 v2, v3 ;; v17 = iconcat.i64 v4, v5 ;; v18 = icmp sle v16, v17 -;; v20 = uextend.i32 v18 -;; @005a return v20 +;; v26 = uextend.i32 v18 +;; @005a return v26 ;; } ;; ;; function u0:3(i64 vmctx, i64, i64, i64, i64, i64) -> i32 tail { @@ -163,8 +163,8 @@ ;; v16 = iconcat.i64 v2, v3 ;; v17 = iconcat.i64 v4, v5 ;; v18 = icmp ule v16, v17 -;; v20 = uextend.i32 v18 -;; @006d return v20 +;; v26 = uextend.i32 v18 +;; @006d return v26 ;; } ;; ;; function u0:4(i64 vmctx, i64, i64, i64, i64, i64) -> i32 tail { @@ -180,8 +180,8 @@ ;; v16 = iconcat.i64 v2, v3 ;; v17 = iconcat.i64 v4, v5 ;; v18 = icmp sgt v16, v17 -;; v20 = uextend.i32 v18 -;; @0080 return v20 +;; v26 = uextend.i32 v18 +;; @0080 return v26 ;; } ;; ;; function u0:5(i64 vmctx, i64, i64, i64, i64, i64) -> i32 tail { @@ -197,8 +197,8 @@ ;; v16 = iconcat.i64 v2, v3 ;; v17 = iconcat.i64 v4, v5 ;; v18 = icmp ugt v16, v17 -;; v20 = uextend.i32 v18 -;; @0093 return v20 +;; v26 = uextend.i32 v18 +;; @0093 return v26 ;; } ;; ;; function u0:6(i64 vmctx, i64, i64, i64, i64, i64) -> i32 tail { @@ -214,8 +214,8 @@ ;; v16 = iconcat.i64 v2, v3 ;; v17 = iconcat.i64 v4, v5 ;; v18 = icmp sge v16, v17 -;; v20 = uextend.i32 v18 -;; @00a6 return v20 +;; v26 = uextend.i32 v18 +;; @00a6 return v26 ;; } ;; ;; function u0:7(i64 vmctx, i64, i64, i64, i64, i64) -> i32 tail { @@ -231,6 +231,6 @@ ;; v16 = iconcat.i64 v2, v3 ;; v17 = iconcat.i64 v4, v5 ;; v18 = icmp uge v16, v17 -;; v20 = uextend.i32 v18 -;; @00b9 return v20 +;; v26 = uextend.i32 v18 +;; @00b9 return v26 ;; } diff --git a/tests/disas/i32-load.wat b/tests/disas/i32-load.wat index bdb87314c7..59c7e77e8c 100644 --- a/tests/disas/i32-load.wat +++ b/tests/disas/i32-load.wat @@ -13,13 +13,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @002e v4 = uextend.i64 v2 -;; @002e v5 = load.i64 notrap aligned readonly checked v0+88 +;; @002e v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @002e v6 = iadd v5, v4 ;; @002e v7 = load.i32 little heap v6 ;; @0031 jump block1 diff --git a/tests/disas/i32-load16-s.wat b/tests/disas/i32-load16-s.wat index 5e08c61590..4a3e1fedf4 100644 --- a/tests/disas/i32-load16-s.wat +++ b/tests/disas/i32-load16-s.wat @@ -13,13 +13,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0032 v4 = uextend.i64 v2 -;; @0032 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0032 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0032 v6 = iadd v5, v4 ;; @0032 v7 = sload16.i32 little heap v6 ;; @0035 jump block1 diff --git a/tests/disas/i32-load16-u.wat b/tests/disas/i32-load16-u.wat index b88324b0a6..6cdee22128 100644 --- a/tests/disas/i32-load16-u.wat +++ b/tests/disas/i32-load16-u.wat @@ -13,13 +13,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0032 v4 = uextend.i64 v2 -;; @0032 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0032 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0032 v6 = iadd v5, v4 ;; @0032 v7 = uload16.i32 little heap v6 ;; @0035 jump block1 diff --git a/tests/disas/i32-load8-s.wat b/tests/disas/i32-load8-s.wat index 64e26fe9ac..2aa1de74cc 100644 --- a/tests/disas/i32-load8-s.wat +++ b/tests/disas/i32-load8-s.wat @@ -13,13 +13,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0031 v4 = uextend.i64 v2 -;; @0031 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0031 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0031 v6 = iadd v5, v4 ;; @0031 v7 = sload8.i32 little heap v6 ;; @0034 jump block1 diff --git a/tests/disas/i32-load8-u.wat b/tests/disas/i32-load8-u.wat index eb70e62c57..d06ed6db4f 100644 --- a/tests/disas/i32-load8-u.wat +++ b/tests/disas/i32-load8-u.wat @@ -13,13 +13,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0031 v4 = uextend.i64 v2 -;; @0031 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0031 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0031 v6 = iadd v5, v4 ;; @0031 v7 = uload8.i32 little heap v6 ;; @0034 jump block1 diff --git a/tests/disas/i32-store.wat b/tests/disas/i32-store.wat index d6763f8dad..b0fc90c41c 100644 --- a/tests/disas/i32-store.wat +++ b/tests/disas/i32-store.wat @@ -14,13 +14,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0031 v4 = uextend.i64 v2 -;; @0031 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0031 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0031 v6 = iadd v5, v4 ;; @0031 store little heap v3, v6 ;; @0034 jump block1 diff --git a/tests/disas/i32-store16.wat b/tests/disas/i32-store16.wat index 4987afb1d6..d4d60705a5 100644 --- a/tests/disas/i32-store16.wat +++ b/tests/disas/i32-store16.wat @@ -14,13 +14,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0033 v4 = uextend.i64 v2 -;; @0033 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0033 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0033 v6 = iadd v5, v4 ;; @0033 istore16 little heap v3, v6 ;; @0036 jump block1 diff --git a/tests/disas/i32-store8.wat b/tests/disas/i32-store8.wat index 31105c63ff..92dd88c505 100644 --- a/tests/disas/i32-store8.wat +++ b/tests/disas/i32-store8.wat @@ -14,13 +14,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0032 v4 = uextend.i64 v2 -;; @0032 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0032 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0032 v6 = iadd v5, v4 ;; @0032 istore8 little heap v3, v6 ;; @0035 jump block1 diff --git a/tests/disas/i64-load.wat b/tests/disas/i64-load.wat index a61726e242..60b7bf11fd 100644 --- a/tests/disas/i64-load.wat +++ b/tests/disas/i64-load.wat @@ -13,13 +13,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @002e v4 = uextend.i64 v2 -;; @002e v5 = load.i64 notrap aligned readonly checked v0+88 +;; @002e v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @002e v6 = iadd v5, v4 ;; @002e v7 = load.i64 little heap v6 ;; @0031 jump block1 diff --git a/tests/disas/i64-load16-s.wat b/tests/disas/i64-load16-s.wat index 31ab512789..26dd09a9e9 100644 --- a/tests/disas/i64-load16-s.wat +++ b/tests/disas/i64-load16-s.wat @@ -13,13 +13,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0032 v4 = uextend.i64 v2 -;; @0032 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0032 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0032 v6 = iadd v5, v4 ;; @0032 v7 = sload16.i64 little heap v6 ;; @0035 jump block1 diff --git a/tests/disas/i64-load16-u.wat b/tests/disas/i64-load16-u.wat index e68a286db5..f26175be56 100644 --- a/tests/disas/i64-load16-u.wat +++ b/tests/disas/i64-load16-u.wat @@ -13,13 +13,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0032 v4 = uextend.i64 v2 -;; @0032 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0032 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0032 v6 = iadd v5, v4 ;; @0032 v7 = uload16.i64 little heap v6 ;; @0035 jump block1 diff --git a/tests/disas/i64-load8-s.wat b/tests/disas/i64-load8-s.wat index 470c441cdd..b3f4f88faa 100644 --- a/tests/disas/i64-load8-s.wat +++ b/tests/disas/i64-load8-s.wat @@ -13,13 +13,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0031 v4 = uextend.i64 v2 -;; @0031 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0031 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0031 v6 = iadd v5, v4 ;; @0031 v7 = sload8.i64 little heap v6 ;; @0034 jump block1 diff --git a/tests/disas/i64-load8-u.wat b/tests/disas/i64-load8-u.wat index 6cd9bf944d..f4d365ad7d 100644 --- a/tests/disas/i64-load8-u.wat +++ b/tests/disas/i64-load8-u.wat @@ -13,13 +13,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0031 v4 = uextend.i64 v2 -;; @0031 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0031 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0031 v6 = iadd v5, v4 ;; @0031 v7 = uload8.i64 little heap v6 ;; @0034 jump block1 diff --git a/tests/disas/i64-store.wat b/tests/disas/i64-store.wat index 60ea783e17..bfda0d3708 100644 --- a/tests/disas/i64-store.wat +++ b/tests/disas/i64-store.wat @@ -14,13 +14,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i64): ;; @0031 v4 = uextend.i64 v2 -;; @0031 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0031 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0031 v6 = iadd v5, v4 ;; @0031 store little heap v3, v6 ;; @0034 jump block1 diff --git a/tests/disas/i64-store16.wat b/tests/disas/i64-store16.wat index dcaa0805d6..31ef7f993e 100644 --- a/tests/disas/i64-store16.wat +++ b/tests/disas/i64-store16.wat @@ -14,13 +14,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i64): ;; @0033 v4 = uextend.i64 v2 -;; @0033 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0033 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0033 v6 = iadd v5, v4 ;; @0033 istore16 little heap v3, v6 ;; @0036 jump block1 diff --git a/tests/disas/i64-store32.wat b/tests/disas/i64-store32.wat index 869b855be8..dfe59408dd 100644 --- a/tests/disas/i64-store32.wat +++ b/tests/disas/i64-store32.wat @@ -14,13 +14,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i64): ;; @0033 v4 = uextend.i64 v2 -;; @0033 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0033 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0033 v6 = iadd v5, v4 ;; @0033 istore32 little heap v3, v6 ;; @0036 jump block1 diff --git a/tests/disas/i64-store8.wat b/tests/disas/i64-store8.wat index 004cbef817..eaab74bb14 100644 --- a/tests/disas/i64-store8.wat +++ b/tests/disas/i64-store8.wat @@ -14,13 +14,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i64): ;; @0032 v4 = uextend.i64 v2 -;; @0032 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0032 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0032 v6 = iadd v5, v4 ;; @0032 istore8 little heap v3, v6 ;; @0035 jump block1 diff --git a/tests/disas/icall-loop.wat b/tests/disas/icall-loop.wat index 70989e0b51..2bbfd1ca8c 100644 --- a/tests/disas/icall-loop.wat +++ b/tests/disas/icall-loop.wat @@ -27,7 +27,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i64) -> i32 tail ;; sig1 = (i64 vmctx, i32, i64) -> i64 tail ;; fn0 = colocated u1:9 sig1 @@ -37,7 +37,7 @@ ;; @002b v4 = iconst.i32 2 ;; @002b v5 = icmp uge v2, v4 ; v4 = 2 ;; @002b v10 = iconst.i64 0 -;; @002b v7 = load.i64 notrap aligned readonly v0+80 +;; @002b v7 = load.i64 notrap aligned readonly can_move v0+72 ;; @002b v6 = uextend.i64 v2 ;; v29 = iconst.i64 3 ;; @002b v8 = ishl v6, v29 ; v29 = 3 @@ -45,8 +45,8 @@ ;; @002b v11 = select_spectre_guard v5, v10, v9 ; v10 = 0 ;; v30 = iconst.i64 -2 ;; @002b v15 = iconst.i32 0 -;; @002b v20 = load.i64 notrap aligned readonly v0+64 -;; @002b v21 = load.i32 notrap aligned readonly v20 +;; @002b v20 = load.i64 notrap aligned readonly can_move v0+64 +;; @002b v21 = load.i32 notrap aligned readonly can_move v20 ;; @0027 jump block2 ;; ;; block2: @@ -75,21 +75,21 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i64) -> i32 tail ;; sig1 = (i64 vmctx, i32, i64) -> i64 tail ;; fn0 = colocated u1:9 sig1 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64): -;; @0038 v6 = load.i64 notrap aligned readonly v0+80 +;; @0038 v6 = load.i64 notrap aligned readonly can_move v0+72 ;; v37 = iconst.i64 8 ;; @0038 v8 = iadd v6, v37 ; v37 = 8 ;; v28 = iconst.i64 -2 ;; @0038 v14 = iconst.i32 0 ;; v36 = iconst.i64 1 -;; @0038 v19 = load.i64 notrap aligned readonly v0+64 -;; @0038 v20 = load.i32 notrap aligned readonly v19 +;; @0038 v19 = load.i64 notrap aligned readonly can_move v0+64 +;; @0038 v20 = load.i32 notrap aligned readonly can_move v19 ;; @0034 jump block2 ;; ;; block2: diff --git a/tests/disas/icall-simd.wat b/tests/disas/icall-simd.wat index 95b4e95186..9a28faddaa 100644 --- a/tests/disas/icall-simd.wat +++ b/tests/disas/icall-simd.wat @@ -13,7 +13,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i64, i8x16) -> i8x16 tail ;; sig1 = (i64 vmctx, i32, i64) -> i64 tail ;; fn0 = colocated u1:9 sig1 @@ -23,7 +23,7 @@ ;; @0033 v5 = iconst.i32 23 ;; @0033 v6 = icmp uge v2, v5 ; v5 = 23 ;; @0033 v7 = uextend.i64 v2 -;; @0033 v8 = load.i64 notrap aligned readonly v0+80 +;; @0033 v8 = load.i64 notrap aligned readonly can_move v0+72 ;; v29 = iconst.i64 3 ;; @0033 v9 = ishl v7, v29 ; v29 = 3 ;; @0033 v10 = iadd v8, v9 @@ -41,8 +41,8 @@ ;; @0033 jump block3(v19) ;; ;; block3(v15: i64): -;; @0033 v21 = load.i64 notrap aligned readonly v0+64 -;; @0033 v22 = load.i32 notrap aligned readonly v21 +;; @0033 v21 = load.i64 notrap aligned readonly can_move v0+64 +;; @0033 v22 = load.i32 notrap aligned readonly can_move v21 ;; @0033 v23 = load.i32 user6 aligned readonly v15+16 ;; @0033 v24 = icmp eq v23, v22 ;; @0033 trapz v24, user7 diff --git a/tests/disas/icall.wat b/tests/disas/icall.wat index a904d200dd..2f320ca0af 100644 --- a/tests/disas/icall.wat +++ b/tests/disas/icall.wat @@ -13,7 +13,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i64, f32) -> i32 tail ;; sig1 = (i64 vmctx, i32, i64) -> i64 tail ;; fn0 = colocated u1:9 sig1 @@ -23,7 +23,7 @@ ;; @0033 v5 = iconst.i32 23 ;; @0033 v6 = icmp uge v2, v5 ; v5 = 23 ;; @0033 v7 = uextend.i64 v2 -;; @0033 v8 = load.i64 notrap aligned readonly v0+80 +;; @0033 v8 = load.i64 notrap aligned readonly can_move v0+72 ;; v29 = iconst.i64 3 ;; @0033 v9 = ishl v7, v29 ; v29 = 3 ;; @0033 v10 = iadd v8, v9 @@ -41,8 +41,8 @@ ;; @0033 jump block3(v19) ;; ;; block3(v15: i64): -;; @0033 v21 = load.i64 notrap aligned readonly v0+64 -;; @0033 v22 = load.i32 notrap aligned readonly v21 +;; @0033 v21 = load.i64 notrap aligned readonly can_move v0+64 +;; @0033 v22 = load.i32 notrap aligned readonly can_move v21 ;; @0033 v23 = load.i32 user6 aligned readonly v15+16 ;; @0033 v24 = icmp eq v23, v22 ;; @0033 trapz v24, user7 diff --git a/tests/disas/if-unreachable-else-params-2.wat b/tests/disas/if-unreachable-else-params-2.wat index d0ee714ef5..fcf4e58b68 100644 --- a/tests/disas/if-unreachable-else-params-2.wat +++ b/tests/disas/if-unreachable-else-params-2.wat @@ -24,8 +24,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): @@ -34,7 +34,7 @@ ;; ;; block2: ;; @0058 v7 = uextend.i64 v2 -;; @0058 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @0058 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0058 v9 = iadd v8, v7 ;; @0058 v10 = sload16.i64 little heap v9 ;; @005c jump block3 diff --git a/tests/disas/if-unreachable-else-params.wat b/tests/disas/if-unreachable-else-params.wat index 4d78d5d388..68371fead6 100644 --- a/tests/disas/if-unreachable-else-params.wat +++ b/tests/disas/if-unreachable-else-params.wat @@ -47,8 +47,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): @@ -60,7 +60,7 @@ ;; ;; block4: ;; @004b v7 = uextend.i64 v3 ; v3 = 35 -;; @004b v8 = load.i64 notrap aligned readonly checked v0+88 +;; @004b v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004b v9 = iadd v8, v7 ;; @004b v10 = sload16.i64 little heap v9 ;; @004e trap user11 diff --git a/tests/disas/indirect-call-no-caching.wat b/tests/disas/indirect-call-no-caching.wat index fec90b968d..38229ae250 100644 --- a/tests/disas/indirect-call-no-caching.wat +++ b/tests/disas/indirect-call-no-caching.wat @@ -67,7 +67,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i64) -> i32 tail ;; sig1 = (i64 vmctx, i32, i64) -> i64 tail ;; fn0 = colocated u1:9 sig1 @@ -77,7 +77,7 @@ ;; @0050 v4 = iconst.i32 10 ;; @0050 v5 = icmp uge v2, v4 ; v4 = 10 ;; @0050 v6 = uextend.i64 v2 -;; @0050 v7 = load.i64 notrap aligned readonly v0+80 +;; @0050 v7 = load.i64 notrap aligned readonly can_move v0+72 ;; v28 = iconst.i64 3 ;; @0050 v8 = ishl v6, v28 ; v28 = 3 ;; @0050 v9 = iadd v7, v8 @@ -95,8 +95,8 @@ ;; @0050 jump block3(v18) ;; ;; block3(v14: i64): -;; @0050 v20 = load.i64 notrap aligned readonly v0+64 -;; @0050 v21 = load.i32 notrap aligned readonly v20 +;; @0050 v20 = load.i64 notrap aligned readonly can_move v0+64 +;; @0050 v21 = load.i32 notrap aligned readonly can_move v20 ;; @0050 v22 = load.i32 user6 aligned readonly v14+16 ;; @0050 v23 = icmp eq v22, v21 ;; @0050 trapz v23, user7 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat index aa65c70d69..817e1ce518 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -21,14 +21,14 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] +;; ldr x9, [x2, #0x58] ;; mov w10, w4 ;; sub x9, x9, #4 ;; cmp x10, x9 ;; cset x10, hi ;; uxtb w10, w10 ;; cbnz x10, #0x34 -;; 24: ldr x11, [x2, #0x58] +;; 24: ldr x11, [x2, #0x50] ;; str w5, [x11, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -37,14 +37,14 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] +;; ldr x9, [x2, #0x58] ;; mov w10, w4 ;; sub x9, x9, #4 ;; cmp x10, x9 ;; cset x10, hi ;; uxtb w10, w10 ;; cbnz x10, #0x74 -;; 64: ldr x11, [x2, #0x58] +;; 64: ldr x11, [x2, #0x50] ;; ldr w2, [x11, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index 1f0d4907ff..b1c7f1ee79 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x11, [x2, #0x60] +;; ldr x11, [x2, #0x58] ;; mov w12, w4 ;; mov x13, #0x1004 ;; sub x11, x11, x13 @@ -29,7 +29,7 @@ ;; cset x12, hi ;; uxtb w12, w12 ;; cbnz x12, #0x3c -;; 28: ldr x13, [x2, #0x58] +;; 28: ldr x13, [x2, #0x50] ;; add x13, x13, #1, lsl #12 ;; str w5, [x13, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 @@ -39,7 +39,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x11, [x2, #0x60] +;; ldr x11, [x2, #0x58] ;; mov w12, w4 ;; mov x13, #0x1004 ;; sub x11, x11, x13 @@ -47,7 +47,7 @@ ;; cset x12, hi ;; uxtb w12, w12 ;; cbnz x12, #0x7c -;; 68: ldr x13, [x2, #0x58] +;; 68: ldr x13, [x2, #0x50] ;; add x12, x13, #1, lsl #12 ;; ldr w2, [x12, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index baf4d9534a..d5685f0634 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -25,12 +25,12 @@ ;; mov w13, #-0xfffc ;; adds x12, x12, x13 ;; b.hs #0x44 -;; 18: ldr x13, [x2, #0x60] +;; 18: ldr x13, [x2, #0x58] ;; cmp x12, x13 ;; cset x14, hi ;; uxtb w14, w14 ;; cbnz x14, #0x48 -;; 2c: ldr x15, [x2, #0x58] +;; 2c: ldr x15, [x2, #0x50] ;; add x15, x15, w4, uxtw ;; mov x0, #0xffff0000 ;; str w5, [x15, x0] @@ -46,12 +46,12 @@ ;; mov w13, #-0xfffc ;; adds x12, x12, x13 ;; b.hs #0xa4 -;; 78: ldr x13, [x2, #0x60] +;; 78: ldr x13, [x2, #0x58] ;; cmp x12, x13 ;; cset x14, hi ;; uxtb w14, w14 ;; cbnz x14, #0xa8 -;; 8c: ldr x15, [x2, #0x58] +;; 8c: ldr x15, [x2, #0x50] ;; add x15, x15, w4, uxtw ;; mov x0, #0xffff0000 ;; ldr w2, [x15, x0] diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat index 6ecd01e1cd..78cb57b3ff 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -21,13 +21,13 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] +;; ldr x8, [x2, #0x58] ;; mov w9, w4 ;; cmp x9, x8 ;; cset x9, hs ;; uxtb w9, w9 ;; cbnz x9, #0x30 -;; 20: ldr x10, [x2, #0x58] +;; 20: ldr x10, [x2, #0x50] ;; strb w5, [x10, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -36,13 +36,13 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] +;; ldr x8, [x2, #0x58] ;; mov w9, w4 ;; cmp x9, x8 ;; cset x9, hs ;; uxtb w9, w9 ;; cbnz x9, #0x70 -;; 60: ldr x10, [x2, #0x58] +;; 60: ldr x10, [x2, #0x50] ;; ldrb w2, [x10, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index 091e0e9623..927539ca36 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x11, [x2, #0x60] +;; ldr x11, [x2, #0x58] ;; mov w12, w4 ;; mov x13, #0x1001 ;; sub x11, x11, x13 @@ -29,7 +29,7 @@ ;; cset x12, hi ;; uxtb w12, w12 ;; cbnz x12, #0x3c -;; 28: ldr x13, [x2, #0x58] +;; 28: ldr x13, [x2, #0x50] ;; add x13, x13, #1, lsl #12 ;; strb w5, [x13, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 @@ -39,7 +39,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x11, [x2, #0x60] +;; ldr x11, [x2, #0x58] ;; mov w12, w4 ;; mov x13, #0x1001 ;; sub x11, x11, x13 @@ -47,7 +47,7 @@ ;; cset x12, hi ;; uxtb w12, w12 ;; cbnz x12, #0x7c -;; 68: ldr x13, [x2, #0x58] +;; 68: ldr x13, [x2, #0x50] ;; add x12, x13, #1, lsl #12 ;; ldrb w2, [x12, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index 7187c95417..4aabc3097d 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -25,12 +25,12 @@ ;; mov w13, #-0xffff ;; adds x12, x12, x13 ;; b.hs #0x44 -;; 18: ldr x13, [x2, #0x60] +;; 18: ldr x13, [x2, #0x58] ;; cmp x12, x13 ;; cset x14, hi ;; uxtb w14, w14 ;; cbnz x14, #0x48 -;; 2c: ldr x15, [x2, #0x58] +;; 2c: ldr x15, [x2, #0x50] ;; add x15, x15, w4, uxtw ;; mov x0, #0xffff0000 ;; strb w5, [x15, x0] @@ -46,12 +46,12 @@ ;; mov w13, #-0xffff ;; adds x12, x12, x13 ;; b.hs #0xa4 -;; 78: ldr x13, [x2, #0x60] +;; 78: ldr x13, [x2, #0x58] ;; cmp x12, x13 ;; cset x14, hi ;; uxtb w14, w14 ;; cbnz x14, #0xa8 -;; 8c: ldr x15, [x2, #0x58] +;; 8c: ldr x15, [x2, #0x50] ;; add x15, x15, w4, uxtw ;; mov x0, #0xffff0000 ;; ldrb w2, [x15, x0] diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat index a39ffd30f0..5ed905975a 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x12, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x12, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov w11, w4 ;; sub x12, x12, #4 ;; mov x13, #0 @@ -37,8 +37,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x12, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x12, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov w11, w4 ;; sub x12, x12, #4 ;; mov x13, #0 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index 4e8abe1be2..b467bacfa8 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x14, [x2, #0x60] -;; ldr x13, [x2, #0x58] +;; ldr x14, [x2, #0x58] +;; ldr x13, [x2, #0x50] ;; mov w12, w4 ;; mov x15, #0x1004 ;; sub x14, x14, x15 @@ -39,8 +39,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x14, [x2, #0x60] -;; ldr x13, [x2, #0x58] +;; ldr x14, [x2, #0x58] +;; ldr x13, [x2, #0x50] ;; mov w12, w4 ;; mov x15, #0x1004 ;; sub x14, x14, x15 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index f3cc067e2e..a96943f499 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -25,8 +25,8 @@ ;; mov w14, #-0xfffc ;; adds x13, x13, x14 ;; b.hs #0x48 -;; 18: ldr x14, [x2, #0x60] -;; ldr x0, [x2, #0x58] +;; 18: ldr x14, [x2, #0x58] +;; ldr x0, [x2, #0x50] ;; mov x15, #0 ;; add x0, x0, w4, uxtw ;; mov x1, #0xffff0000 @@ -46,8 +46,8 @@ ;; mov w14, #-0xfffc ;; adds x13, x13, x14 ;; b.hs #0xa8 -;; 78: ldr x14, [x2, #0x60] -;; ldr x0, [x2, #0x58] +;; 78: ldr x14, [x2, #0x58] +;; ldr x0, [x2, #0x50] ;; mov x15, #0 ;; add x0, x0, w4, uxtw ;; mov x1, #0xffff0000 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat index a2321aa14a..d477949d5f 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x9, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov w11, w4 ;; mov x12, #0 ;; add x10, x10, w4, uxtw @@ -36,8 +36,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x9, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov w11, w4 ;; mov x12, #0 ;; add x10, x10, w4, uxtw diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index 34432bbfa0..80d721c7ca 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x14, [x2, #0x60] -;; ldr x13, [x2, #0x58] +;; ldr x14, [x2, #0x58] +;; ldr x13, [x2, #0x50] ;; mov w12, w4 ;; mov x15, #0x1001 ;; sub x14, x14, x15 @@ -39,8 +39,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x14, [x2, #0x60] -;; ldr x13, [x2, #0x58] +;; ldr x14, [x2, #0x58] +;; ldr x13, [x2, #0x50] ;; mov w12, w4 ;; mov x15, #0x1001 ;; sub x14, x14, x15 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 566414109b..5c0bb1ae6a 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -25,8 +25,8 @@ ;; mov w14, #-0xffff ;; adds x13, x13, x14 ;; b.hs #0x48 -;; 18: ldr x14, [x2, #0x60] -;; ldr x0, [x2, #0x58] +;; 18: ldr x14, [x2, #0x58] +;; ldr x0, [x2, #0x50] ;; mov x15, #0 ;; add x0, x0, w4, uxtw ;; mov x1, #0xffff0000 @@ -46,8 +46,8 @@ ;; mov w14, #-0xffff ;; adds x13, x13, x14 ;; b.hs #0xa8 -;; 78: ldr x14, [x2, #0x60] -;; ldr x0, [x2, #0x58] +;; 78: ldr x14, [x2, #0x58] +;; ldr x0, [x2, #0x50] ;; mov x15, #0 ;; add x0, x0, w4, uxtw ;; mov x1, #0xffff0000 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index 98cfd54986..8f0609d056 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -21,13 +21,13 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] +;; ldr x8, [x2, #0x58] ;; mov w9, w4 ;; cmp x9, x8 ;; cset x9, hi ;; uxtb w9, w9 ;; cbnz x9, #0x30 -;; 20: ldr x10, [x2, #0x58] +;; 20: ldr x10, [x2, #0x50] ;; str w5, [x10, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -36,13 +36,13 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] +;; ldr x8, [x2, #0x58] ;; mov w9, w4 ;; cmp x9, x8 ;; cset x9, hi ;; uxtb w9, w9 ;; cbnz x9, #0x70 -;; 60: ldr x10, [x2, #0x58] +;; 60: ldr x10, [x2, #0x50] ;; ldr w2, [x10, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index da41660a42..d1a15294d3 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -21,13 +21,13 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] +;; ldr x9, [x2, #0x58] ;; mov w10, w4 ;; cmp x10, x9 ;; cset x10, hi ;; uxtb w10, w10 ;; cbnz x10, #0x34 -;; 20: ldr x11, [x2, #0x58] +;; 20: ldr x11, [x2, #0x50] ;; add x11, x11, #1, lsl #12 ;; str w5, [x11, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 @@ -37,13 +37,13 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] +;; ldr x9, [x2, #0x58] ;; mov w10, w4 ;; cmp x10, x9 ;; cset x10, hi ;; uxtb w10, w10 ;; cbnz x10, #0x74 -;; 60: ldr x11, [x2, #0x58] +;; 60: ldr x11, [x2, #0x50] ;; add x10, x11, #1, lsl #12 ;; ldr w2, [x10, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 70b85a8213..20cd562e67 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -21,13 +21,13 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] +;; ldr x10, [x2, #0x58] ;; mov w11, w4 ;; cmp x11, x10 ;; cset x11, hi ;; uxtb w11, w11 ;; cbnz x11, #0x38 -;; 20: ldr x12, [x2, #0x58] +;; 20: ldr x12, [x2, #0x50] ;; add x12, x12, w4, uxtw ;; mov x13, #0xffff0000 ;; str w5, [x12, x13] @@ -38,13 +38,13 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] +;; ldr x10, [x2, #0x58] ;; mov w11, w4 ;; cmp x11, x10 ;; cset x11, hi ;; uxtb w11, w11 ;; cbnz x11, #0x78 -;; 60: ldr x12, [x2, #0x58] +;; 60: ldr x12, [x2, #0x50] ;; add x12, x12, w4, uxtw ;; mov x13, #0xffff0000 ;; ldr w2, [x12, x13] diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 9eaa2955b3..3c41eef8c2 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -21,13 +21,13 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] +;; ldr x8, [x2, #0x58] ;; mov w9, w4 ;; cmp x9, x8 ;; cset x9, hs ;; uxtb w9, w9 ;; cbnz x9, #0x30 -;; 20: ldr x10, [x2, #0x58] +;; 20: ldr x10, [x2, #0x50] ;; strb w5, [x10, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -36,13 +36,13 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] +;; ldr x8, [x2, #0x58] ;; mov w9, w4 ;; cmp x9, x8 ;; cset x9, hs ;; uxtb w9, w9 ;; cbnz x9, #0x70 -;; 60: ldr x10, [x2, #0x58] +;; 60: ldr x10, [x2, #0x50] ;; ldrb w2, [x10, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index 0bc1a4b439..03cf61a3b5 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -21,13 +21,13 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] +;; ldr x9, [x2, #0x58] ;; mov w10, w4 ;; cmp x10, x9 ;; cset x10, hi ;; uxtb w10, w10 ;; cbnz x10, #0x34 -;; 20: ldr x11, [x2, #0x58] +;; 20: ldr x11, [x2, #0x50] ;; add x11, x11, #1, lsl #12 ;; strb w5, [x11, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 @@ -37,13 +37,13 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] +;; ldr x9, [x2, #0x58] ;; mov w10, w4 ;; cmp x10, x9 ;; cset x10, hi ;; uxtb w10, w10 ;; cbnz x10, #0x74 -;; 60: ldr x11, [x2, #0x58] +;; 60: ldr x11, [x2, #0x50] ;; add x10, x11, #1, lsl #12 ;; ldrb w2, [x10, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index 7d9304ad16..a7e2b77f99 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -21,13 +21,13 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] +;; ldr x10, [x2, #0x58] ;; mov w11, w4 ;; cmp x11, x10 ;; cset x11, hi ;; uxtb w11, w11 ;; cbnz x11, #0x38 -;; 20: ldr x12, [x2, #0x58] +;; 20: ldr x12, [x2, #0x50] ;; add x12, x12, w4, uxtw ;; mov x13, #0xffff0000 ;; strb w5, [x12, x13] @@ -38,13 +38,13 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] +;; ldr x10, [x2, #0x58] ;; mov w11, w4 ;; cmp x11, x10 ;; cset x11, hi ;; uxtb w11, w11 ;; cbnz x11, #0x78 -;; 60: ldr x12, [x2, #0x58] +;; 60: ldr x12, [x2, #0x50] ;; add x12, x12, w4, uxtw ;; mov x13, #0xffff0000 ;; ldrb w2, [x12, x13] diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index b5fdb2615e..973d9307a8 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x9, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov w11, w4 ;; mov x12, #0 ;; add x10, x10, w4, uxtw @@ -36,8 +36,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x9, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov w11, w4 ;; mov x12, #0 ;; add x10, x10, w4, uxtw diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index c4700bebfa..feb9575d5a 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] -;; ldr x13, [x2, #0x58] +;; ldr x10, [x2, #0x58] +;; ldr x13, [x2, #0x50] ;; mov w11, w4 ;; mov x12, #0 ;; add x13, x13, w4, uxtw @@ -37,8 +37,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] -;; ldr x13, [x2, #0x58] +;; ldr x10, [x2, #0x58] +;; ldr x13, [x2, #0x50] ;; mov w11, w4 ;; mov x12, #0 ;; add x13, x13, w4, uxtw diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 3b7367d213..74355c4979 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x11, [x2, #0x60] -;; ldr x14, [x2, #0x58] +;; ldr x11, [x2, #0x58] +;; ldr x14, [x2, #0x50] ;; mov w12, w4 ;; mov x13, #0 ;; add x14, x14, w4, uxtw @@ -38,8 +38,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x11, [x2, #0x60] -;; ldr x14, [x2, #0x58] +;; ldr x11, [x2, #0x58] +;; ldr x14, [x2, #0x50] ;; mov w12, w4 ;; mov x13, #0 ;; add x14, x14, w4, uxtw diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index ded3a8771d..cdcc81a015 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x9, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov w11, w4 ;; mov x12, #0 ;; add x10, x10, w4, uxtw @@ -36,8 +36,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x9, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov w11, w4 ;; mov x12, #0 ;; add x10, x10, w4, uxtw diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 01330b8046..2c9b85eec2 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] -;; ldr x13, [x2, #0x58] +;; ldr x10, [x2, #0x58] +;; ldr x13, [x2, #0x50] ;; mov w11, w4 ;; mov x12, #0 ;; add x13, x13, w4, uxtw @@ -37,8 +37,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] -;; ldr x13, [x2, #0x58] +;; ldr x10, [x2, #0x58] +;; ldr x13, [x2, #0x50] ;; mov w11, w4 ;; mov x12, #0 ;; add x13, x13, w4, uxtw diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index f138016c45..933e9d2643 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x11, [x2, #0x60] -;; ldr x14, [x2, #0x58] +;; ldr x11, [x2, #0x58] +;; ldr x14, [x2, #0x50] ;; mov w12, w4 ;; mov x13, #0 ;; add x14, x14, w4, uxtw @@ -38,8 +38,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x11, [x2, #0x60] -;; ldr x14, [x2, #0x58] +;; ldr x11, [x2, #0x58] +;; ldr x14, [x2, #0x50] ;; mov w12, w4 ;; mov x13, #0 ;; add x14, x14, w4, uxtw diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat index 3db8df9dc4..0164b4c054 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -21,13 +21,13 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] +;; ldr x8, [x2, #0x58] ;; sub x8, x8, #4 ;; cmp x4, x8 ;; cset x9, hi ;; uxtb w9, w9 ;; cbnz x9, #0x30 -;; 20: ldr x10, [x2, #0x58] +;; 20: ldr x10, [x2, #0x50] ;; str w5, [x10, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -36,13 +36,13 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] +;; ldr x8, [x2, #0x58] ;; sub x8, x8, #4 ;; cmp x4, x8 ;; cset x9, hi ;; uxtb w9, w9 ;; cbnz x9, #0x70 -;; 60: ldr x10, [x2, #0x58] +;; 60: ldr x10, [x2, #0x50] ;; ldr w2, [x10, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index edbd24d193..981d708627 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -21,14 +21,14 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] +;; ldr x10, [x2, #0x58] ;; mov x11, #0x1004 ;; sub x10, x10, x11 ;; cmp x4, x10 ;; cset x11, hi ;; uxtb w11, w11 ;; cbnz x11, #0x38 -;; 24: ldr x12, [x2, #0x58] +;; 24: ldr x12, [x2, #0x50] ;; add x12, x12, #1, lsl #12 ;; str w5, [x12, x4] ;; ldp x29, x30, [sp], #0x10 @@ -38,14 +38,14 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] +;; ldr x10, [x2, #0x58] ;; mov x11, #0x1004 ;; sub x10, x10, x11 ;; cmp x4, x10 ;; cset x11, hi ;; uxtb w11, w11 ;; cbnz x11, #0x78 -;; 64: ldr x12, [x2, #0x58] +;; 64: ldr x12, [x2, #0x50] ;; add x11, x12, #1, lsl #12 ;; ldr w2, [x11, x4] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index 88318a6240..8ebec048ad 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -24,12 +24,12 @@ ;; mov w11, #-0xfffc ;; adds x11, x4, x11 ;; b.hs #0x40 -;; 14: ldr x12, [x2, #0x60] +;; 14: ldr x12, [x2, #0x58] ;; cmp x11, x12 ;; cset x13, hi ;; uxtb w13, w13 ;; cbnz x13, #0x44 -;; 28: ldr x14, [x2, #0x58] +;; 28: ldr x14, [x2, #0x50] ;; add x14, x14, x4 ;; mov x15, #0xffff0000 ;; str w5, [x14, x15] @@ -44,12 +44,12 @@ ;; mov w11, #-0xfffc ;; adds x11, x4, x11 ;; b.hs #0xa0 -;; 74: ldr x12, [x2, #0x60] +;; 74: ldr x12, [x2, #0x58] ;; cmp x11, x12 ;; cset x13, hi ;; uxtb w13, w13 ;; cbnz x13, #0xa4 -;; 88: ldr x14, [x2, #0x58] +;; 88: ldr x14, [x2, #0x50] ;; add x14, x14, x4 ;; mov x15, #0xffff0000 ;; ldr w2, [x14, x15] diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat index fcfb2a85be..5f1c8b3433 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -21,12 +21,12 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x7, [x2, #0x60] +;; ldr x7, [x2, #0x58] ;; cmp x4, x7 ;; cset x8, hs ;; uxtb w8, w8 ;; cbnz x8, #0x2c -;; 1c: ldr x9, [x2, #0x58] +;; 1c: ldr x9, [x2, #0x50] ;; strb w5, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -35,12 +35,12 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x7, [x2, #0x60] +;; ldr x7, [x2, #0x58] ;; cmp x4, x7 ;; cset x8, hs ;; uxtb w8, w8 ;; cbnz x8, #0x6c -;; 5c: ldr x9, [x2, #0x58] +;; 5c: ldr x9, [x2, #0x50] ;; ldrb w2, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index deb558c7b2..a5161f055b 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -21,14 +21,14 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] +;; ldr x10, [x2, #0x58] ;; mov x11, #0x1001 ;; sub x10, x10, x11 ;; cmp x4, x10 ;; cset x11, hi ;; uxtb w11, w11 ;; cbnz x11, #0x38 -;; 24: ldr x12, [x2, #0x58] +;; 24: ldr x12, [x2, #0x50] ;; add x12, x12, #1, lsl #12 ;; strb w5, [x12, x4] ;; ldp x29, x30, [sp], #0x10 @@ -38,14 +38,14 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] +;; ldr x10, [x2, #0x58] ;; mov x11, #0x1001 ;; sub x10, x10, x11 ;; cmp x4, x10 ;; cset x11, hi ;; uxtb w11, w11 ;; cbnz x11, #0x78 -;; 64: ldr x12, [x2, #0x58] +;; 64: ldr x12, [x2, #0x50] ;; add x11, x12, #1, lsl #12 ;; ldrb w2, [x11, x4] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index 5bb91393b5..ec14abf657 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -24,12 +24,12 @@ ;; mov w11, #-0xffff ;; adds x11, x4, x11 ;; b.hs #0x40 -;; 14: ldr x12, [x2, #0x60] +;; 14: ldr x12, [x2, #0x58] ;; cmp x11, x12 ;; cset x13, hi ;; uxtb w13, w13 ;; cbnz x13, #0x44 -;; 28: ldr x14, [x2, #0x58] +;; 28: ldr x14, [x2, #0x50] ;; add x14, x14, x4 ;; mov x15, #0xffff0000 ;; strb w5, [x14, x15] @@ -44,12 +44,12 @@ ;; mov w11, #-0xffff ;; adds x11, x4, x11 ;; b.hs #0xa0 -;; 74: ldr x12, [x2, #0x60] +;; 74: ldr x12, [x2, #0x58] ;; cmp x11, x12 ;; cset x13, hi ;; uxtb w13, w13 ;; cbnz x13, #0xa4 -;; 88: ldr x14, [x2, #0x58] +;; 88: ldr x14, [x2, #0x50] ;; add x14, x14, x4 ;; mov x15, #0xffff0000 ;; ldrb w2, [x14, x15] diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat index 60ae97f3b3..4ca51df423 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] -;; ldr x9, [x2, #0x58] +;; ldr x10, [x2, #0x58] +;; ldr x9, [x2, #0x50] ;; sub x10, x10, #4 ;; mov x11, #0 ;; add x9, x9, x4 @@ -36,8 +36,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] -;; ldr x9, [x2, #0x58] +;; ldr x10, [x2, #0x58] +;; ldr x9, [x2, #0x50] ;; sub x10, x10, #4 ;; mov x11, #0 ;; add x9, x9, x4 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index cf7ee6b0a9..b5e0cea10a 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x12, [x2, #0x60] -;; ldr x11, [x2, #0x58] +;; ldr x12, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; mov x13, #0x1004 ;; sub x12, x12, x13 ;; mov x13, #0 @@ -38,8 +38,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x12, [x2, #0x60] -;; ldr x11, [x2, #0x58] +;; ldr x12, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; mov x13, #0x1004 ;; sub x12, x12, x13 ;; mov x13, #0 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 193168b6ee..46d323d9df 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -24,8 +24,8 @@ ;; mov w12, #-0xfffc ;; adds x12, x4, x12 ;; b.hs #0x44 -;; 14: ldr x13, [x2, #0x60] -;; ldr x15, [x2, #0x58] +;; 14: ldr x13, [x2, #0x58] +;; ldr x15, [x2, #0x50] ;; mov x14, #0 ;; add x15, x15, x4 ;; mov x0, #0xffff0000 @@ -44,8 +44,8 @@ ;; mov w12, #-0xfffc ;; adds x12, x4, x12 ;; b.hs #0xa4 -;; 74: ldr x13, [x2, #0x60] -;; ldr x15, [x2, #0x58] +;; 74: ldr x13, [x2, #0x58] +;; ldr x15, [x2, #0x50] ;; mov x14, #0 ;; add x15, x15, x4 ;; mov x0, #0xffff0000 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat index 9909c5dbec..297e3d2c68 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x8, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov x9, #0 ;; add x10, x10, x4 ;; cmp x4, x8 @@ -35,8 +35,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x8, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov x9, #0 ;; add x10, x10, x4 ;; cmp x4, x8 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index a58036bd96..dbb4767670 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x12, [x2, #0x60] -;; ldr x11, [x2, #0x58] +;; ldr x12, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; mov x13, #0x1001 ;; sub x12, x12, x13 ;; mov x13, #0 @@ -38,8 +38,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x12, [x2, #0x60] -;; ldr x11, [x2, #0x58] +;; ldr x12, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; mov x13, #0x1001 ;; sub x12, x12, x13 ;; mov x13, #0 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 9f848a8872..e3631568f2 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -24,8 +24,8 @@ ;; mov w12, #-0xffff ;; adds x12, x4, x12 ;; b.hs #0x44 -;; 14: ldr x13, [x2, #0x60] -;; ldr x15, [x2, #0x58] +;; 14: ldr x13, [x2, #0x58] +;; ldr x15, [x2, #0x50] ;; mov x14, #0 ;; add x15, x15, x4 ;; mov x0, #0xffff0000 @@ -44,8 +44,8 @@ ;; mov w12, #-0xffff ;; adds x12, x4, x12 ;; b.hs #0xa4 -;; 74: ldr x13, [x2, #0x60] -;; ldr x15, [x2, #0x58] +;; 74: ldr x13, [x2, #0x58] +;; ldr x15, [x2, #0x50] ;; mov x14, #0 ;; add x15, x15, x4 ;; mov x0, #0xffff0000 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index b4f52ef512..e0069345e8 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -21,12 +21,12 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x7, [x2, #0x60] +;; ldr x7, [x2, #0x58] ;; cmp x4, x7 ;; cset x8, hi ;; uxtb w8, w8 ;; cbnz x8, #0x2c -;; 1c: ldr x9, [x2, #0x58] +;; 1c: ldr x9, [x2, #0x50] ;; str w5, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -35,12 +35,12 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x7, [x2, #0x60] +;; ldr x7, [x2, #0x58] ;; cmp x4, x7 ;; cset x8, hi ;; uxtb w8, w8 ;; cbnz x8, #0x6c -;; 5c: ldr x9, [x2, #0x58] +;; 5c: ldr x9, [x2, #0x50] ;; ldr w2, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index cc5d9050d4..f2b1a1e2d6 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -21,12 +21,12 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] +;; ldr x8, [x2, #0x58] ;; cmp x4, x8 ;; cset x9, hi ;; uxtb w9, w9 ;; cbnz x9, #0x30 -;; 1c: ldr x10, [x2, #0x58] +;; 1c: ldr x10, [x2, #0x50] ;; add x10, x10, #1, lsl #12 ;; str w5, [x10, x4] ;; ldp x29, x30, [sp], #0x10 @@ -36,12 +36,12 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] +;; ldr x8, [x2, #0x58] ;; cmp x4, x8 ;; cset x9, hi ;; uxtb w9, w9 ;; cbnz x9, #0x70 -;; 5c: ldr x10, [x2, #0x58] +;; 5c: ldr x10, [x2, #0x50] ;; add x9, x10, #1, lsl #12 ;; ldr w2, [x9, x4] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 45db2cef00..0296335777 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -21,12 +21,12 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] +;; ldr x9, [x2, #0x58] ;; cmp x4, x9 ;; cset x10, hi ;; uxtb w10, w10 ;; cbnz x10, #0x34 -;; 1c: ldr x11, [x2, #0x58] +;; 1c: ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; str w5, [x11, x12] @@ -37,12 +37,12 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] +;; ldr x9, [x2, #0x58] ;; cmp x4, x9 ;; cset x10, hi ;; uxtb w10, w10 ;; cbnz x10, #0x74 -;; 5c: ldr x11, [x2, #0x58] +;; 5c: ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; ldr w2, [x11, x12] diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 0b967ab879..f183e5c035 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -21,12 +21,12 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x7, [x2, #0x60] +;; ldr x7, [x2, #0x58] ;; cmp x4, x7 ;; cset x8, hs ;; uxtb w8, w8 ;; cbnz x8, #0x2c -;; 1c: ldr x9, [x2, #0x58] +;; 1c: ldr x9, [x2, #0x50] ;; strb w5, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -35,12 +35,12 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x7, [x2, #0x60] +;; ldr x7, [x2, #0x58] ;; cmp x4, x7 ;; cset x8, hs ;; uxtb w8, w8 ;; cbnz x8, #0x6c -;; 5c: ldr x9, [x2, #0x58] +;; 5c: ldr x9, [x2, #0x50] ;; ldrb w2, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index d7a63f21d9..4ca9c94255 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -21,12 +21,12 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] +;; ldr x8, [x2, #0x58] ;; cmp x4, x8 ;; cset x9, hi ;; uxtb w9, w9 ;; cbnz x9, #0x30 -;; 1c: ldr x10, [x2, #0x58] +;; 1c: ldr x10, [x2, #0x50] ;; add x10, x10, #1, lsl #12 ;; strb w5, [x10, x4] ;; ldp x29, x30, [sp], #0x10 @@ -36,12 +36,12 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] +;; ldr x8, [x2, #0x58] ;; cmp x4, x8 ;; cset x9, hi ;; uxtb w9, w9 ;; cbnz x9, #0x70 -;; 5c: ldr x10, [x2, #0x58] +;; 5c: ldr x10, [x2, #0x50] ;; add x9, x10, #1, lsl #12 ;; ldrb w2, [x9, x4] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index ee4bd9929e..884fabff6f 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -21,12 +21,12 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] +;; ldr x9, [x2, #0x58] ;; cmp x4, x9 ;; cset x10, hi ;; uxtb w10, w10 ;; cbnz x10, #0x34 -;; 1c: ldr x11, [x2, #0x58] +;; 1c: ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; strb w5, [x11, x12] @@ -37,12 +37,12 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] +;; ldr x9, [x2, #0x58] ;; cmp x4, x9 ;; cset x10, hi ;; uxtb w10, w10 ;; cbnz x10, #0x74 -;; 5c: ldr x11, [x2, #0x58] +;; 5c: ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; ldrb w2, [x11, x12] diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index e1ee15085b..2f649ebfd3 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x8, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov x9, #0 ;; add x10, x10, x4 ;; cmp x4, x8 @@ -35,8 +35,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x8, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov x9, #0 ;; add x10, x10, x4 ;; cmp x4, x8 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index c3b8ff8e02..17d3a018a1 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] -;; ldr x11, [x2, #0x58] +;; ldr x9, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; mov x10, #0 ;; add x11, x11, x4 ;; add x11, x11, #1, lsl #12 @@ -36,8 +36,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] -;; ldr x11, [x2, #0x58] +;; ldr x9, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; mov x10, #0 ;; add x11, x11, x4 ;; add x11, x11, #1, lsl #12 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 93ad176eba..b5d8c250ec 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] -;; ldr x12, [x2, #0x58] +;; ldr x10, [x2, #0x58] +;; ldr x12, [x2, #0x50] ;; mov x11, #0 ;; add x12, x12, x4 ;; mov x13, #0xffff0000 @@ -37,8 +37,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] -;; ldr x12, [x2, #0x58] +;; ldr x10, [x2, #0x58] +;; ldr x12, [x2, #0x50] ;; mov x11, #0 ;; add x12, x12, x4 ;; mov x13, #0xffff0000 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index 98e9331e76..99f8ead12c 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x8, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov x9, #0 ;; add x10, x10, x4 ;; cmp x4, x8 @@ -35,8 +35,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x8, [x2, #0x60] -;; ldr x10, [x2, #0x58] +;; ldr x8, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; mov x9, #0 ;; add x10, x10, x4 ;; cmp x4, x8 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 8e4ab7e772..9c885b54fe 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] -;; ldr x11, [x2, #0x58] +;; ldr x9, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; mov x10, #0 ;; add x11, x11, x4 ;; add x11, x11, #1, lsl #12 @@ -36,8 +36,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x9, [x2, #0x60] -;; ldr x11, [x2, #0x58] +;; ldr x9, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; mov x10, #0 ;; add x11, x11, x4 ;; add x11, x11, #1, lsl #12 diff --git a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index eea0e86947..15cdf18b45 100644 --- a/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] -;; ldr x12, [x2, #0x58] +;; ldr x10, [x2, #0x58] +;; ldr x12, [x2, #0x50] ;; mov x11, #0 ;; add x12, x12, x4 ;; mov x13, #0xffff0000 @@ -37,8 +37,8 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x10, [x2, #0x60] -;; ldr x12, [x2, #0x58] +;; ldr x10, [x2, #0x58] +;; ldr x12, [x2, #0x50] ;; mov x11, #0 ;; add x12, x12, x4 ;; mov x13, #0xffff0000 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat index 279e768858..a960ad0d06 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -27,7 +27,7 @@ ;; cset x10, hi ;; uxtb w9, w10 ;; cbnz x9, #0x30 -;; 20: ldr x10, [x2, #0x58] +;; 20: ldr x10, [x2, #0x50] ;; str w5, [x10, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -42,7 +42,7 @@ ;; cset x10, hi ;; uxtb w9, w10 ;; cbnz x9, #0x70 -;; 60: ldr x10, [x2, #0x58] +;; 60: ldr x10, [x2, #0x50] ;; ldr w2, [x10, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index dc7fb975a7..fba2eb8f27 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -27,7 +27,7 @@ ;; cset x11, hi ;; uxtb w10, w11 ;; cbnz x10, #0x34 -;; 20: ldr x11, [x2, #0x58] +;; 20: ldr x11, [x2, #0x50] ;; add x11, x11, #1, lsl #12 ;; str w5, [x11, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 @@ -43,7 +43,7 @@ ;; cset x11, hi ;; uxtb w10, w11 ;; cbnz x10, #0x74 -;; 60: ldr x11, [x2, #0x58] +;; 60: ldr x11, [x2, #0x50] ;; add x10, x11, #1, lsl #12 ;; ldr w2, [x10, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index 7f1d08e8f2..ec70e4699c 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -27,7 +27,7 @@ ;; cset x12, hi ;; uxtb w11, w12 ;; cbnz x11, #0x38 -;; 20: ldr x12, [x2, #0x58] +;; 20: ldr x12, [x2, #0x50] ;; add x12, x12, w4, uxtw ;; mov x13, #0xffff0000 ;; str w5, [x12, x13] @@ -44,7 +44,7 @@ ;; cset x12, hi ;; uxtb w11, w12 ;; cbnz x11, #0x78 -;; 60: ldr x12, [x2, #0x58] +;; 60: ldr x12, [x2, #0x50] ;; add x12, x12, w4, uxtw ;; mov x13, #0xffff0000 ;; ldr w2, [x12, x13] diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat index 80d63700f7..a93b915c14 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; strb w5, [x6, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -29,7 +29,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x5, [x2, #0x58] +;; ldr x5, [x2, #0x50] ;; ldrb w2, [x5, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index c725cf4d8f..a7490b99b0 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -27,7 +27,7 @@ ;; cset x11, hi ;; uxtb w10, w11 ;; cbnz x10, #0x34 -;; 20: ldr x11, [x2, #0x58] +;; 20: ldr x11, [x2, #0x50] ;; add x11, x11, #1, lsl #12 ;; strb w5, [x11, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 @@ -43,7 +43,7 @@ ;; cset x11, hi ;; uxtb w10, w11 ;; cbnz x10, #0x74 -;; 60: ldr x11, [x2, #0x58] +;; 60: ldr x11, [x2, #0x50] ;; add x10, x11, #1, lsl #12 ;; ldrb w2, [x10, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index a795e0283a..5cfa11aecc 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -27,7 +27,7 @@ ;; cset x12, hi ;; uxtb w11, w12 ;; cbnz x11, #0x38 -;; 20: ldr x12, [x2, #0x58] +;; 20: ldr x12, [x2, #0x50] ;; add x12, x12, w4, uxtw ;; mov x13, #0xffff0000 ;; strb w5, [x12, x13] @@ -44,7 +44,7 @@ ;; cset x12, hi ;; uxtb w11, w12 ;; cbnz x11, #0x78 -;; 60: ldr x12, [x2, #0x58] +;; 60: ldr x12, [x2, #0x50] ;; add x12, x12, w4, uxtw ;; mov x13, #0xffff0000 ;; ldrb w2, [x12, x13] diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat index 26a71aada7..5110d57d3f 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -23,7 +23,7 @@ ;; mov x29, sp ;; mov w9, w4 ;; mov x10, #0 -;; ldr x11, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; add x11, x11, w4, uxtw ;; orr x8, xzr, #0xfffffffc ;; cmp x9, x8 @@ -38,7 +38,7 @@ ;; mov x29, sp ;; mov w9, w4 ;; mov x10, #0 -;; ldr x11, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; add x11, x11, w4, uxtw ;; orr x8, xzr, #0xfffffffc ;; cmp x9, x8 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index e9232b8726..0afd47b181 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; mov x29, sp ;; mov w10, w4 ;; mov x11, #0 -;; ldr x12, [x2, #0x58] +;; ldr x12, [x2, #0x50] ;; add x12, x12, w4, uxtw ;; add x12, x12, #1, lsl #12 ;; mov w9, #-0x1004 @@ -39,7 +39,7 @@ ;; mov x29, sp ;; mov w10, w4 ;; mov x11, #0 -;; ldr x12, [x2, #0x58] +;; ldr x12, [x2, #0x50] ;; add x12, x12, w4, uxtw ;; add x12, x12, #1, lsl #12 ;; mov w9, #-0x1004 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 0a8ebbaee1..5caac4fd14 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; mov x29, sp ;; mov w11, w4 ;; mov x12, #0 -;; ldr x13, [x2, #0x58] +;; ldr x13, [x2, #0x50] ;; add x13, x13, w4, uxtw ;; mov x14, #0xffff0000 ;; add x13, x13, x14 @@ -40,7 +40,7 @@ ;; mov x29, sp ;; mov w11, w4 ;; mov x12, #0 -;; ldr x13, [x2, #0x58] +;; ldr x13, [x2, #0x50] ;; add x13, x13, w4, uxtw ;; mov x14, #0xffff0000 ;; add x13, x13, x14 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat index 6d212adcdb..88f223951c 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; strb w5, [x6, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -29,7 +29,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x5, [x2, #0x58] +;; ldr x5, [x2, #0x50] ;; ldrb w2, [x5, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index a0c50a66de..d5f8d46982 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; mov x29, sp ;; mov w10, w4 ;; mov x11, #0 -;; ldr x12, [x2, #0x58] +;; ldr x12, [x2, #0x50] ;; add x12, x12, w4, uxtw ;; add x12, x12, #1, lsl #12 ;; mov w9, #-0x1001 @@ -39,7 +39,7 @@ ;; mov x29, sp ;; mov w10, w4 ;; mov x11, #0 -;; ldr x12, [x2, #0x58] +;; ldr x12, [x2, #0x50] ;; add x12, x12, w4, uxtw ;; add x12, x12, #1, lsl #12 ;; mov w9, #-0x1001 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 291bcf744e..eb2cff27e9 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; mov x29, sp ;; mov w11, w4 ;; mov x12, #0 -;; ldr x13, [x2, #0x58] +;; ldr x13, [x2, #0x50] ;; add x13, x13, w4, uxtw ;; mov x14, #0xffff0000 ;; add x13, x13, x14 @@ -40,7 +40,7 @@ ;; mov x29, sp ;; mov w11, w4 ;; mov x12, #0 -;; ldr x13, [x2, #0x58] +;; ldr x13, [x2, #0x50] ;; add x13, x13, w4, uxtw ;; mov x14, #0xffff0000 ;; add x13, x13, x14 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index cb1cf0a09b..300c7f5ad2 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; str w5, [x6, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -29,7 +29,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x5, [x2, #0x58] +;; ldr x5, [x2, #0x50] ;; ldr w2, [x5, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index 5fc0a80e9b..d0cf5c4931 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; add x6, x6, #1, lsl #12 ;; str w5, [x6, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 @@ -30,7 +30,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x5, [x2, #0x58] +;; ldr x5, [x2, #0x50] ;; add x5, x5, #1, lsl #12 ;; ldr w2, [x5, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 1ec34b9d28..dc26c5878b 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; add x6, x6, w4, uxtw ;; mov x7, #0xffff0000 ;; str w5, [x6, x7] @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; add x6, x6, w4, uxtw ;; mov x7, #0xffff0000 ;; ldr w2, [x6, x7] diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 383417a7bb..54e4042413 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; strb w5, [x6, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -29,7 +29,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x5, [x2, #0x58] +;; ldr x5, [x2, #0x50] ;; ldrb w2, [x5, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index cac6a548fd..384be4eeca 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; add x6, x6, #1, lsl #12 ;; strb w5, [x6, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 @@ -30,7 +30,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x5, [x2, #0x58] +;; ldr x5, [x2, #0x50] ;; add x5, x5, #1, lsl #12 ;; ldrb w2, [x5, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index c8ae8f9fb2..4b8cb6eaa0 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; add x6, x6, w4, uxtw ;; mov x7, #0xffff0000 ;; strb w5, [x6, x7] @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; add x6, x6, w4, uxtw ;; mov x7, #0xffff0000 ;; ldrb w2, [x6, x7] diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index 7596ac62c3..5c6943ab38 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; str w5, [x6, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -29,7 +29,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x5, [x2, #0x58] +;; ldr x5, [x2, #0x50] ;; ldr w2, [x5, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index da7dce3bb5..4bef182415 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; add x6, x6, #1, lsl #12 ;; str w5, [x6, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 @@ -30,7 +30,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x5, [x2, #0x58] +;; ldr x5, [x2, #0x50] ;; add x5, x5, #1, lsl #12 ;; ldr w2, [x5, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index b391943712..71e7f6c593 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; add x6, x6, w4, uxtw ;; mov x7, #0xffff0000 ;; str w5, [x6, x7] @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; add x6, x6, w4, uxtw ;; mov x7, #0xffff0000 ;; ldr w2, [x6, x7] diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index 51f50fe2eb..f461845f88 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; strb w5, [x6, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -29,7 +29,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x5, [x2, #0x58] +;; ldr x5, [x2, #0x50] ;; ldrb w2, [x5, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 653088c889..2beef7a42d 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; add x6, x6, #1, lsl #12 ;; strb w5, [x6, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 @@ -30,7 +30,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x5, [x2, #0x58] +;; ldr x5, [x2, #0x50] ;; add x5, x5, #1, lsl #12 ;; ldrb w2, [x5, w4, uxtw] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 916b7c644c..29b1eb212b 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; add x6, x6, w4, uxtw ;; mov x7, #0xffff0000 ;; strb w5, [x6, x7] @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp -;; ldr x6, [x2, #0x58] +;; ldr x6, [x2, #0x50] ;; add x6, x6, w4, uxtw ;; mov x7, #0xffff0000 ;; ldrb w2, [x6, x7] diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat index ccce60d22f..aa6fddd775 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -26,7 +26,7 @@ ;; cset x9, hi ;; uxtb w8, w9 ;; cbnz x8, #0x2c -;; 1c: ldr x9, [x2, #0x58] +;; 1c: ldr x9, [x2, #0x50] ;; str w5, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -40,7 +40,7 @@ ;; cset x9, hi ;; uxtb w8, w9 ;; cbnz x8, #0x6c -;; 5c: ldr x9, [x2, #0x58] +;; 5c: ldr x9, [x2, #0x50] ;; ldr w2, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index dd1062ecde..97c92b0943 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -26,7 +26,7 @@ ;; cset x10, hi ;; uxtb w9, w10 ;; cbnz x9, #0x30 -;; 1c: ldr x10, [x2, #0x58] +;; 1c: ldr x10, [x2, #0x50] ;; add x10, x10, #1, lsl #12 ;; str w5, [x10, x4] ;; ldp x29, x30, [sp], #0x10 @@ -41,7 +41,7 @@ ;; cset x10, hi ;; uxtb w9, w10 ;; cbnz x9, #0x70 -;; 5c: ldr x10, [x2, #0x58] +;; 5c: ldr x10, [x2, #0x50] ;; add x9, x10, #1, lsl #12 ;; ldr w2, [x9, x4] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index e2f06227be..a9a609238d 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -26,7 +26,7 @@ ;; cset x11, hi ;; uxtb w10, w11 ;; cbnz x10, #0x34 -;; 1c: ldr x11, [x2, #0x58] +;; 1c: ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; str w5, [x11, x12] @@ -42,7 +42,7 @@ ;; cset x11, hi ;; uxtb w10, w11 ;; cbnz x10, #0x74 -;; 5c: ldr x11, [x2, #0x58] +;; 5c: ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; ldr w2, [x11, x12] diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat index 021c97b514..7e386a4476 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -26,7 +26,7 @@ ;; cset x9, hi ;; uxtb w8, w9 ;; cbnz x8, #0x2c -;; 1c: ldr x9, [x2, #0x58] +;; 1c: ldr x9, [x2, #0x50] ;; strb w5, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -40,7 +40,7 @@ ;; cset x9, hi ;; uxtb w8, w9 ;; cbnz x8, #0x6c -;; 5c: ldr x9, [x2, #0x58] +;; 5c: ldr x9, [x2, #0x50] ;; ldrb w2, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index 9007b1a8d1..fe5be61f10 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -26,7 +26,7 @@ ;; cset x10, hi ;; uxtb w9, w10 ;; cbnz x9, #0x30 -;; 1c: ldr x10, [x2, #0x58] +;; 1c: ldr x10, [x2, #0x50] ;; add x10, x10, #1, lsl #12 ;; strb w5, [x10, x4] ;; ldp x29, x30, [sp], #0x10 @@ -41,7 +41,7 @@ ;; cset x10, hi ;; uxtb w9, w10 ;; cbnz x9, #0x70 -;; 5c: ldr x10, [x2, #0x58] +;; 5c: ldr x10, [x2, #0x50] ;; add x9, x10, #1, lsl #12 ;; ldrb w2, [x9, x4] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index 0a2209741b..ccba096989 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -26,7 +26,7 @@ ;; cset x11, hi ;; uxtb w10, w11 ;; cbnz x10, #0x34 -;; 1c: ldr x11, [x2, #0x58] +;; 1c: ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; strb w5, [x11, x12] @@ -42,7 +42,7 @@ ;; cset x11, hi ;; uxtb w10, w11 ;; cbnz x10, #0x74 -;; 5c: ldr x11, [x2, #0x58] +;; 5c: ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; ldrb w2, [x11, x12] diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat index 3da0a0e928..ab432e0300 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -22,7 +22,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x8, #0 -;; ldr x9, [x2, #0x58] +;; ldr x9, [x2, #0x50] ;; add x9, x9, x4 ;; orr x7, xzr, #0xfffffffc ;; cmp x4, x7 @@ -36,7 +36,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x8, #0 -;; ldr x9, [x2, #0x58] +;; ldr x9, [x2, #0x50] ;; add x9, x9, x4 ;; orr x7, xzr, #0xfffffffc ;; cmp x4, x7 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index 2cd68bfd4c..533d750aa8 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -22,7 +22,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x9, #0 -;; ldr x10, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; add x10, x10, x4 ;; add x10, x10, #1, lsl #12 ;; mov w8, #-0x1004 @@ -37,7 +37,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x9, #0 -;; ldr x10, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; add x10, x10, x4 ;; add x10, x10, #1, lsl #12 ;; mov w8, #-0x1004 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 376cef13c1..0b942d0f74 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -22,7 +22,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x10, #0 -;; ldr x11, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; add x11, x11, x12 @@ -38,7 +38,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x10, #0 -;; ldr x11, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; add x11, x11, x12 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat index c40908a34d..e155a3f82d 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -22,7 +22,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x8, #0 -;; ldr x9, [x2, #0x58] +;; ldr x9, [x2, #0x50] ;; add x9, x9, x4 ;; orr x7, xzr, #0xffffffff ;; cmp x4, x7 @@ -36,7 +36,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x8, #0 -;; ldr x9, [x2, #0x58] +;; ldr x9, [x2, #0x50] ;; add x9, x9, x4 ;; orr x7, xzr, #0xffffffff ;; cmp x4, x7 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index 6f1973c73c..5a07a9bc0a 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -22,7 +22,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x9, #0 -;; ldr x10, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; add x10, x10, x4 ;; add x10, x10, #1, lsl #12 ;; mov w8, #-0x1001 @@ -37,7 +37,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x9, #0 -;; ldr x10, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; add x10, x10, x4 ;; add x10, x10, #1, lsl #12 ;; mov w8, #-0x1001 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index a45171001d..1cebeb7771 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -22,7 +22,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x10, #0 -;; ldr x11, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; add x11, x11, x12 @@ -38,7 +38,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x10, #0 -;; ldr x11, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; add x11, x11, x12 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index a6daa4c753..360d1b0cd5 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -26,7 +26,7 @@ ;; cset x9, hi ;; uxtb w8, w9 ;; cbnz x8, #0x2c -;; 1c: ldr x9, [x2, #0x58] +;; 1c: ldr x9, [x2, #0x50] ;; str w5, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -40,7 +40,7 @@ ;; cset x9, hi ;; uxtb w8, w9 ;; cbnz x8, #0x6c -;; 5c: ldr x9, [x2, #0x58] +;; 5c: ldr x9, [x2, #0x50] ;; ldr w2, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index fdb9a4af23..a69c88dfbd 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -26,7 +26,7 @@ ;; cset x10, hi ;; uxtb w9, w10 ;; cbnz x9, #0x30 -;; 1c: ldr x10, [x2, #0x58] +;; 1c: ldr x10, [x2, #0x50] ;; add x10, x10, #1, lsl #12 ;; str w5, [x10, x4] ;; ldp x29, x30, [sp], #0x10 @@ -41,7 +41,7 @@ ;; cset x10, hi ;; uxtb w9, w10 ;; cbnz x9, #0x70 -;; 5c: ldr x10, [x2, #0x58] +;; 5c: ldr x10, [x2, #0x50] ;; add x9, x10, #1, lsl #12 ;; ldr w2, [x9, x4] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 525a07e321..211c65bdf9 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -26,7 +26,7 @@ ;; cset x11, hi ;; uxtb w10, w11 ;; cbnz x10, #0x34 -;; 1c: ldr x11, [x2, #0x58] +;; 1c: ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; str w5, [x11, x12] @@ -42,7 +42,7 @@ ;; cset x11, hi ;; uxtb w10, w11 ;; cbnz x10, #0x74 -;; 5c: ldr x11, [x2, #0x58] +;; 5c: ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; ldr w2, [x11, x12] diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 0203b34797..ea45fcc798 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -26,7 +26,7 @@ ;; cset x9, hi ;; uxtb w8, w9 ;; cbnz x8, #0x2c -;; 1c: ldr x9, [x2, #0x58] +;; 1c: ldr x9, [x2, #0x50] ;; strb w5, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret @@ -40,7 +40,7 @@ ;; cset x9, hi ;; uxtb w8, w9 ;; cbnz x8, #0x6c -;; 5c: ldr x9, [x2, #0x58] +;; 5c: ldr x9, [x2, #0x50] ;; ldrb w2, [x9, x4] ;; ldp x29, x30, [sp], #0x10 ;; ret diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index 3fd26017fb..80e1bd2b64 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -26,7 +26,7 @@ ;; cset x10, hi ;; uxtb w9, w10 ;; cbnz x9, #0x30 -;; 1c: ldr x10, [x2, #0x58] +;; 1c: ldr x10, [x2, #0x50] ;; add x10, x10, #1, lsl #12 ;; strb w5, [x10, x4] ;; ldp x29, x30, [sp], #0x10 @@ -41,7 +41,7 @@ ;; cset x10, hi ;; uxtb w9, w10 ;; cbnz x9, #0x70 -;; 5c: ldr x10, [x2, #0x58] +;; 5c: ldr x10, [x2, #0x50] ;; add x9, x10, #1, lsl #12 ;; ldrb w2, [x9, x4] ;; ldp x29, x30, [sp], #0x10 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index a745a183c7..f07ed2fb01 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -26,7 +26,7 @@ ;; cset x11, hi ;; uxtb w10, w11 ;; cbnz x10, #0x34 -;; 1c: ldr x11, [x2, #0x58] +;; 1c: ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; strb w5, [x11, x12] @@ -42,7 +42,7 @@ ;; cset x11, hi ;; uxtb w10, w11 ;; cbnz x10, #0x74 -;; 5c: ldr x11, [x2, #0x58] +;; 5c: ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; ldrb w2, [x11, x12] diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index 68d80b02d6..1d4d46fe44 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -22,7 +22,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x8, #0 -;; ldr x9, [x2, #0x58] +;; ldr x9, [x2, #0x50] ;; add x9, x9, x4 ;; orr x7, xzr, #0xfffffffc ;; cmp x4, x7 @@ -36,7 +36,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x8, #0 -;; ldr x9, [x2, #0x58] +;; ldr x9, [x2, #0x50] ;; add x9, x9, x4 ;; orr x7, xzr, #0xfffffffc ;; cmp x4, x7 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index 1211e93d37..c5987c2d7d 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -22,7 +22,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x9, #0 -;; ldr x10, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; add x10, x10, x4 ;; add x10, x10, #1, lsl #12 ;; mov w8, #-0x1004 @@ -37,7 +37,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x9, #0 -;; ldr x10, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; add x10, x10, x4 ;; add x10, x10, #1, lsl #12 ;; mov w8, #-0x1004 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 08e29d112d..f135dbff39 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -22,7 +22,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x10, #0 -;; ldr x11, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; add x11, x11, x12 @@ -38,7 +38,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x10, #0 -;; ldr x11, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; add x11, x11, x12 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index e0cad3211b..39ea614580 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -22,7 +22,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x8, #0 -;; ldr x9, [x2, #0x58] +;; ldr x9, [x2, #0x50] ;; add x9, x9, x4 ;; orr x7, xzr, #0xffffffff ;; cmp x4, x7 @@ -36,7 +36,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x8, #0 -;; ldr x9, [x2, #0x58] +;; ldr x9, [x2, #0x50] ;; add x9, x9, x4 ;; orr x7, xzr, #0xffffffff ;; cmp x4, x7 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 20a73e646b..379863feab 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -22,7 +22,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x9, #0 -;; ldr x10, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; add x10, x10, x4 ;; add x10, x10, #1, lsl #12 ;; mov w8, #-0x1001 @@ -37,7 +37,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x9, #0 -;; ldr x10, [x2, #0x58] +;; ldr x10, [x2, #0x50] ;; add x10, x10, x4 ;; add x10, x10, #1, lsl #12 ;; mov w8, #-0x1001 diff --git a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index b3393793ce..0bdc7b259a 100644 --- a/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/aarch64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -22,7 +22,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x10, #0 -;; ldr x11, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; add x11, x11, x12 @@ -38,7 +38,7 @@ ;; stp x29, x30, [sp, #-0x10]! ;; mov x29, sp ;; mov x10, #0 -;; ldr x11, [x2, #0x58] +;; ldr x11, [x2, #0x50] ;; add x11, x11, x4 ;; mov x12, #0xffff0000 ;; add x11, x11, x12 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat index cb7bd354ff..165f7d61ed 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -23,18 +23,18 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = iconst.i64 4 ;; @0040 v7 = isub v5, v6 ; v6 = 4 ;; @0040 v8 = icmp ugt v4, v7 ;; @0040 trapnz v8, heap_oob -;; @0040 v9 = load.i64 notrap aligned checked v0+88 +;; @0040 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v10 = iadd v9, v4 ;; @0040 store little heap v3, v10 ;; @0043 jump block1 @@ -48,18 +48,18 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned v0+96 +;; @0048 v5 = load.i64 notrap aligned v0+88 ;; @0048 v6 = iconst.i64 4 ;; @0048 v7 = isub v5, v6 ; v6 = 4 ;; @0048 v8 = icmp ugt v4, v7 ;; @0048 trapnz v8, heap_oob -;; @0048 v9 = load.i64 notrap aligned checked v0+88 +;; @0048 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v10 = iadd v9, v4 ;; @0048 v11 = load.i32 little heap v10 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index cb3a7058a3..5bf685ee00 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,18 +23,18 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = iconst.i64 4100 ;; @0040 v7 = isub v5, v6 ; v6 = 4100 ;; @0040 v8 = icmp ugt v4, v7 ;; @0040 trapnz v8, heap_oob -;; @0040 v9 = load.i64 notrap aligned checked v0+88 +;; @0040 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v10 = iadd v9, v4 ;; @0040 v11 = iconst.i64 4096 ;; @0040 v12 = iadd v10, v11 ; v11 = 4096 @@ -50,18 +50,18 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 -;; @0049 v5 = load.i64 notrap aligned v0+96 +;; @0049 v5 = load.i64 notrap aligned v0+88 ;; @0049 v6 = iconst.i64 4100 ;; @0049 v7 = isub v5, v6 ; v6 = 4100 ;; @0049 v8 = icmp ugt v4, v7 ;; @0049 trapnz v8, heap_oob -;; @0049 v9 = load.i64 notrap aligned checked v0+88 +;; @0049 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v10 = iadd v9, v4 ;; @0049 v11 = iconst.i64 4096 ;; @0049 v12 = iadd v10, v11 ; v11 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index 6fb2bfc7ac..bbc51d1d88 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -23,18 +23,18 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 ;; @0040 v5 = iconst.i64 0xffff_0004 ;; @0040 v6 = uadd_overflow_trap v4, v5, heap_oob ; v5 = 0xffff_0004 -;; @0040 v7 = load.i64 notrap aligned v0+96 +;; @0040 v7 = load.i64 notrap aligned v0+88 ;; @0040 v8 = icmp ugt v6, v7 ;; @0040 trapnz v8, heap_oob -;; @0040 v9 = load.i64 notrap aligned checked v0+88 +;; @0040 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v10 = iadd v9, v4 ;; @0040 v11 = iconst.i64 0xffff_0000 ;; @0040 v12 = iadd v10, v11 ; v11 = 0xffff_0000 @@ -50,18 +50,18 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 ;; @004c v5 = iconst.i64 0xffff_0004 ;; @004c v6 = uadd_overflow_trap v4, v5, heap_oob ; v5 = 0xffff_0004 -;; @004c v7 = load.i64 notrap aligned v0+96 +;; @004c v7 = load.i64 notrap aligned v0+88 ;; @004c v8 = icmp ugt v6, v7 ;; @004c trapnz v8, heap_oob -;; @004c v9 = load.i64 notrap aligned checked v0+88 +;; @004c v9 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v10 = iadd v9, v4 ;; @004c v11 = iconst.i64 0xffff_0000 ;; @004c v12 = iadd v10, v11 ; v11 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat index 08d1a302ff..5b67e77f5f 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -23,16 +23,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp uge v4, v5 ;; @0040 trapnz v6, heap_oob -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 istore8 little heap v3, v8 ;; @0043 jump block1 @@ -46,16 +46,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned v0+96 +;; @0048 v5 = load.i64 notrap aligned v0+88 ;; @0048 v6 = icmp uge v4, v5 ;; @0048 trapnz v6, heap_oob -;; @0048 v7 = load.i64 notrap aligned checked v0+88 +;; @0048 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v8 = iadd v7, v4 ;; @0048 v9 = uload8.i32 little heap v8 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index 83b0ace226..e644b9e93f 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,18 +23,18 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = iconst.i64 4097 ;; @0040 v7 = isub v5, v6 ; v6 = 4097 ;; @0040 v8 = icmp ugt v4, v7 ;; @0040 trapnz v8, heap_oob -;; @0040 v9 = load.i64 notrap aligned checked v0+88 +;; @0040 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v10 = iadd v9, v4 ;; @0040 v11 = iconst.i64 4096 ;; @0040 v12 = iadd v10, v11 ; v11 = 4096 @@ -50,18 +50,18 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 -;; @0049 v5 = load.i64 notrap aligned v0+96 +;; @0049 v5 = load.i64 notrap aligned v0+88 ;; @0049 v6 = iconst.i64 4097 ;; @0049 v7 = isub v5, v6 ; v6 = 4097 ;; @0049 v8 = icmp ugt v4, v7 ;; @0049 trapnz v8, heap_oob -;; @0049 v9 = load.i64 notrap aligned checked v0+88 +;; @0049 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v10 = iadd v9, v4 ;; @0049 v11 = iconst.i64 4096 ;; @0049 v12 = iadd v10, v11 ; v11 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index 87db669e1c..3eb78367eb 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -23,18 +23,18 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 ;; @0040 v5 = iconst.i64 0xffff_0001 ;; @0040 v6 = uadd_overflow_trap v4, v5, heap_oob ; v5 = 0xffff_0001 -;; @0040 v7 = load.i64 notrap aligned v0+96 +;; @0040 v7 = load.i64 notrap aligned v0+88 ;; @0040 v8 = icmp ugt v6, v7 ;; @0040 trapnz v8, heap_oob -;; @0040 v9 = load.i64 notrap aligned checked v0+88 +;; @0040 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v10 = iadd v9, v4 ;; @0040 v11 = iconst.i64 0xffff_0000 ;; @0040 v12 = iadd v10, v11 ; v11 = 0xffff_0000 @@ -50,18 +50,18 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 ;; @004c v5 = iconst.i64 0xffff_0001 ;; @004c v6 = uadd_overflow_trap v4, v5, heap_oob ; v5 = 0xffff_0001 -;; @004c v7 = load.i64 notrap aligned v0+96 +;; @004c v7 = load.i64 notrap aligned v0+88 ;; @004c v8 = icmp ugt v6, v7 ;; @004c trapnz v8, heap_oob -;; @004c v9 = load.i64 notrap aligned checked v0+88 +;; @004c v9 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v10 = iadd v9, v4 ;; @004c v11 = iconst.i64 0xffff_0000 ;; @004c v12 = iadd v10, v11 ; v11 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat index 39cf9bfeda..9d8c7e49c0 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -23,17 +23,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = iconst.i64 4 ;; @0040 v7 = isub v5, v6 ; v6 = 4 ;; @0040 v8 = icmp ugt v4, v7 -;; @0040 v9 = load.i64 notrap aligned checked v0+88 +;; @0040 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v10 = iadd v9, v4 ;; @0040 v11 = iconst.i64 0 ;; @0040 v12 = select_spectre_guard v8, v11, v10 ; v11 = 0 @@ -49,17 +49,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned v0+96 +;; @0048 v5 = load.i64 notrap aligned v0+88 ;; @0048 v6 = iconst.i64 4 ;; @0048 v7 = isub v5, v6 ; v6 = 4 ;; @0048 v8 = icmp ugt v4, v7 -;; @0048 v9 = load.i64 notrap aligned checked v0+88 +;; @0048 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v10 = iadd v9, v4 ;; @0048 v11 = iconst.i64 0 ;; @0048 v12 = select_spectre_guard v8, v11, v10 ; v11 = 0 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index 4fc14388b1..2bba671034 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,17 +23,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = iconst.i64 4100 ;; @0040 v7 = isub v5, v6 ; v6 = 4100 ;; @0040 v8 = icmp ugt v4, v7 -;; @0040 v9 = load.i64 notrap aligned checked v0+88 +;; @0040 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v10 = iadd v9, v4 ;; @0040 v11 = iconst.i64 4096 ;; @0040 v12 = iadd v10, v11 ; v11 = 4096 @@ -51,17 +51,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 -;; @0049 v5 = load.i64 notrap aligned v0+96 +;; @0049 v5 = load.i64 notrap aligned v0+88 ;; @0049 v6 = iconst.i64 4100 ;; @0049 v7 = isub v5, v6 ; v6 = 4100 ;; @0049 v8 = icmp ugt v4, v7 -;; @0049 v9 = load.i64 notrap aligned checked v0+88 +;; @0049 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v10 = iadd v9, v4 ;; @0049 v11 = iconst.i64 4096 ;; @0049 v12 = iadd v10, v11 ; v11 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 6054b7740f..79b977e0d0 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,17 +23,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 ;; @0040 v5 = iconst.i64 0xffff_0004 ;; @0040 v6 = uadd_overflow_trap v4, v5, heap_oob ; v5 = 0xffff_0004 -;; @0040 v7 = load.i64 notrap aligned v0+96 +;; @0040 v7 = load.i64 notrap aligned v0+88 ;; @0040 v8 = icmp ugt v6, v7 -;; @0040 v9 = load.i64 notrap aligned checked v0+88 +;; @0040 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v10 = iadd v9, v4 ;; @0040 v11 = iconst.i64 0xffff_0000 ;; @0040 v12 = iadd v10, v11 ; v11 = 0xffff_0000 @@ -51,17 +51,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 ;; @004c v5 = iconst.i64 0xffff_0004 ;; @004c v6 = uadd_overflow_trap v4, v5, heap_oob ; v5 = 0xffff_0004 -;; @004c v7 = load.i64 notrap aligned v0+96 +;; @004c v7 = load.i64 notrap aligned v0+88 ;; @004c v8 = icmp ugt v6, v7 -;; @004c v9 = load.i64 notrap aligned checked v0+88 +;; @004c v9 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v10 = iadd v9, v4 ;; @004c v11 = iconst.i64 0xffff_0000 ;; @004c v12 = iadd v10, v11 ; v11 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat index ec980ac974..8e5005996d 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp uge v4, v5 -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 0 ;; @0040 v10 = select_spectre_guard v6, v9, v8 ; v9 = 0 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned v0+96 +;; @0048 v5 = load.i64 notrap aligned v0+88 ;; @0048 v6 = icmp uge v4, v5 -;; @0048 v7 = load.i64 notrap aligned checked v0+88 +;; @0048 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v8 = iadd v7, v4 ;; @0048 v9 = iconst.i64 0 ;; @0048 v10 = select_spectre_guard v6, v9, v8 ; v9 = 0 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index 05f6ab708a..ba0b8992e4 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,17 +23,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = iconst.i64 4097 ;; @0040 v7 = isub v5, v6 ; v6 = 4097 ;; @0040 v8 = icmp ugt v4, v7 -;; @0040 v9 = load.i64 notrap aligned checked v0+88 +;; @0040 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v10 = iadd v9, v4 ;; @0040 v11 = iconst.i64 4096 ;; @0040 v12 = iadd v10, v11 ; v11 = 4096 @@ -51,17 +51,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 -;; @0049 v5 = load.i64 notrap aligned v0+96 +;; @0049 v5 = load.i64 notrap aligned v0+88 ;; @0049 v6 = iconst.i64 4097 ;; @0049 v7 = isub v5, v6 ; v6 = 4097 ;; @0049 v8 = icmp ugt v4, v7 -;; @0049 v9 = load.i64 notrap aligned checked v0+88 +;; @0049 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v10 = iadd v9, v4 ;; @0049 v11 = iconst.i64 4096 ;; @0049 v12 = iadd v10, v11 ; v11 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index cb28ff8142..131ec9f919 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,17 +23,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 ;; @0040 v5 = iconst.i64 0xffff_0001 ;; @0040 v6 = uadd_overflow_trap v4, v5, heap_oob ; v5 = 0xffff_0001 -;; @0040 v7 = load.i64 notrap aligned v0+96 +;; @0040 v7 = load.i64 notrap aligned v0+88 ;; @0040 v8 = icmp ugt v6, v7 -;; @0040 v9 = load.i64 notrap aligned checked v0+88 +;; @0040 v9 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v10 = iadd v9, v4 ;; @0040 v11 = iconst.i64 0xffff_0000 ;; @0040 v12 = iadd v10, v11 ; v11 = 0xffff_0000 @@ -51,17 +51,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 ;; @004c v5 = iconst.i64 0xffff_0001 ;; @004c v6 = uadd_overflow_trap v4, v5, heap_oob ; v5 = 0xffff_0001 -;; @004c v7 = load.i64 notrap aligned v0+96 +;; @004c v7 = load.i64 notrap aligned v0+88 ;; @004c v8 = icmp ugt v6, v7 -;; @004c v9 = load.i64 notrap aligned checked v0+88 +;; @004c v9 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v10 = iadd v9, v4 ;; @004c v11 = iconst.i64 0xffff_0000 ;; @004c v12 = iadd v10, v11 ; v11 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index 593ac94426..37311e6cf8 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -23,16 +23,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp ugt v4, v5 ;; @0040 trapnz v6, heap_oob -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 store little heap v3, v8 ;; @0043 jump block1 @@ -46,16 +46,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned v0+96 +;; @0048 v5 = load.i64 notrap aligned v0+88 ;; @0048 v6 = icmp ugt v4, v5 ;; @0048 trapnz v6, heap_oob -;; @0048 v7 = load.i64 notrap aligned checked v0+88 +;; @0048 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v8 = iadd v7, v4 ;; @0048 v9 = load.i32 little heap v8 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index ecbd1ea936..4b2f141b1f 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,16 +23,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp ugt v4, v5 ;; @0040 trapnz v6, heap_oob -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 4096 ;; @0040 v10 = iadd v8, v9 ; v9 = 4096 @@ -48,16 +48,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 -;; @0049 v5 = load.i64 notrap aligned v0+96 +;; @0049 v5 = load.i64 notrap aligned v0+88 ;; @0049 v6 = icmp ugt v4, v5 ;; @0049 trapnz v6, heap_oob -;; @0049 v7 = load.i64 notrap aligned checked v0+88 +;; @0049 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v8 = iadd v7, v4 ;; @0049 v9 = iconst.i64 4096 ;; @0049 v10 = iadd v8, v9 ; v9 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 2968772ff2..31e31a16cd 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -23,16 +23,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp ugt v4, v5 ;; @0040 trapnz v6, heap_oob -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 0xffff_0000 ;; @0040 v10 = iadd v8, v9 ; v9 = 0xffff_0000 @@ -48,16 +48,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 -;; @004c v5 = load.i64 notrap aligned v0+96 +;; @004c v5 = load.i64 notrap aligned v0+88 ;; @004c v6 = icmp ugt v4, v5 ;; @004c trapnz v6, heap_oob -;; @004c v7 = load.i64 notrap aligned checked v0+88 +;; @004c v7 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v8 = iadd v7, v4 ;; @004c v9 = iconst.i64 0xffff_0000 ;; @004c v10 = iadd v8, v9 ; v9 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 78f66dd62a..94f687360f 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -23,16 +23,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp uge v4, v5 ;; @0040 trapnz v6, heap_oob -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 istore8 little heap v3, v8 ;; @0043 jump block1 @@ -46,16 +46,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned v0+96 +;; @0048 v5 = load.i64 notrap aligned v0+88 ;; @0048 v6 = icmp uge v4, v5 ;; @0048 trapnz v6, heap_oob -;; @0048 v7 = load.i64 notrap aligned checked v0+88 +;; @0048 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v8 = iadd v7, v4 ;; @0048 v9 = uload8.i32 little heap v8 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index 0d562b15b4..df847e2d15 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,16 +23,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp ugt v4, v5 ;; @0040 trapnz v6, heap_oob -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 4096 ;; @0040 v10 = iadd v8, v9 ; v9 = 4096 @@ -48,16 +48,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 -;; @0049 v5 = load.i64 notrap aligned v0+96 +;; @0049 v5 = load.i64 notrap aligned v0+88 ;; @0049 v6 = icmp ugt v4, v5 ;; @0049 trapnz v6, heap_oob -;; @0049 v7 = load.i64 notrap aligned checked v0+88 +;; @0049 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v8 = iadd v7, v4 ;; @0049 v9 = iconst.i64 4096 ;; @0049 v10 = iadd v8, v9 ; v9 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index 6800d583e6..8f533cb5be 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -23,16 +23,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp ugt v4, v5 ;; @0040 trapnz v6, heap_oob -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 0xffff_0000 ;; @0040 v10 = iadd v8, v9 ; v9 = 0xffff_0000 @@ -48,16 +48,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 -;; @004c v5 = load.i64 notrap aligned v0+96 +;; @004c v5 = load.i64 notrap aligned v0+88 ;; @004c v6 = icmp ugt v4, v5 ;; @004c trapnz v6, heap_oob -;; @004c v7 = load.i64 notrap aligned checked v0+88 +;; @004c v7 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v8 = iadd v7, v4 ;; @004c v9 = iconst.i64 0xffff_0000 ;; @004c v10 = iadd v8, v9 ; v9 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index 53448082dd..9d520e4b1d 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp ugt v4, v5 -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 0 ;; @0040 v10 = select_spectre_guard v6, v9, v8 ; v9 = 0 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned v0+96 +;; @0048 v5 = load.i64 notrap aligned v0+88 ;; @0048 v6 = icmp ugt v4, v5 -;; @0048 v7 = load.i64 notrap aligned checked v0+88 +;; @0048 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v8 = iadd v7, v4 ;; @0048 v9 = iconst.i64 0 ;; @0048 v10 = select_spectre_guard v6, v9, v8 ; v9 = 0 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index 1651e40759..c43392abdb 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp ugt v4, v5 -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 4096 ;; @0040 v10 = iadd v8, v9 ; v9 = 4096 @@ -49,15 +49,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 -;; @0049 v5 = load.i64 notrap aligned v0+96 +;; @0049 v5 = load.i64 notrap aligned v0+88 ;; @0049 v6 = icmp ugt v4, v5 -;; @0049 v7 = load.i64 notrap aligned checked v0+88 +;; @0049 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v8 = iadd v7, v4 ;; @0049 v9 = iconst.i64 4096 ;; @0049 v10 = iadd v8, v9 ; v9 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 3e26466b05..3f6e1ab611 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp ugt v4, v5 -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 0xffff_0000 ;; @0040 v10 = iadd v8, v9 ; v9 = 0xffff_0000 @@ -49,15 +49,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 -;; @004c v5 = load.i64 notrap aligned v0+96 +;; @004c v5 = load.i64 notrap aligned v0+88 ;; @004c v6 = icmp ugt v4, v5 -;; @004c v7 = load.i64 notrap aligned checked v0+88 +;; @004c v7 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v8 = iadd v7, v4 ;; @004c v9 = iconst.i64 0xffff_0000 ;; @004c v10 = iadd v8, v9 ; v9 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index 5d1472671e..d7bb731730 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp uge v4, v5 -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 0 ;; @0040 v10 = select_spectre_guard v6, v9, v8 ; v9 = 0 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned v0+96 +;; @0048 v5 = load.i64 notrap aligned v0+88 ;; @0048 v6 = icmp uge v4, v5 -;; @0048 v7 = load.i64 notrap aligned checked v0+88 +;; @0048 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v8 = iadd v7, v4 ;; @0048 v9 = iconst.i64 0 ;; @0048 v10 = select_spectre_guard v6, v9, v8 ; v9 = 0 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 60059d51c0..93706e273b 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp ugt v4, v5 -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 4096 ;; @0040 v10 = iadd v8, v9 ; v9 = 4096 @@ -49,15 +49,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 -;; @0049 v5 = load.i64 notrap aligned v0+96 +;; @0049 v5 = load.i64 notrap aligned v0+88 ;; @0049 v6 = icmp ugt v4, v5 -;; @0049 v7 = load.i64 notrap aligned checked v0+88 +;; @0049 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v8 = iadd v7, v4 ;; @0049 v9 = iconst.i64 4096 ;; @0049 v10 = iadd v8, v9 ; v9 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index b56f927d04..a303c0e63e 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned v0+96 +;; @0040 v5 = load.i64 notrap aligned v0+88 ;; @0040 v6 = icmp ugt v4, v5 -;; @0040 v7 = load.i64 notrap aligned checked v0+88 +;; @0040 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 0xffff_0000 ;; @0040 v10 = iadd v8, v9 ; v9 = 0xffff_0000 @@ -49,15 +49,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 -;; @004c v5 = load.i64 notrap aligned v0+96 +;; @004c v5 = load.i64 notrap aligned v0+88 ;; @004c v6 = icmp ugt v4, v5 -;; @004c v7 = load.i64 notrap aligned checked v0+88 +;; @004c v7 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v8 = iadd v7, v4 ;; @004c v9 = iconst.i64 0xffff_0000 ;; @004c v10 = iadd v8, v9 ; v9 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat index a37feb1e3a..ed739af19e 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -23,17 +23,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = iconst.i64 4 ;; @0040 v6 = isub v4, v5 ; v5 = 4 ;; @0040 v7 = icmp ugt v2, v6 ;; @0040 trapnz v7, heap_oob -;; @0040 v8 = load.i64 notrap aligned checked v0+88 +;; @0040 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v9 = iadd v8, v2 ;; @0040 store little heap v3, v9 ;; @0043 jump block1 @@ -47,17 +47,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0048 v4 = load.i64 notrap aligned v0+96 +;; @0048 v4 = load.i64 notrap aligned v0+88 ;; @0048 v5 = iconst.i64 4 ;; @0048 v6 = isub v4, v5 ; v5 = 4 ;; @0048 v7 = icmp ugt v2, v6 ;; @0048 trapnz v7, heap_oob -;; @0048 v8 = load.i64 notrap aligned checked v0+88 +;; @0048 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v9 = iadd v8, v2 ;; @0048 v10 = load.i32 little heap v9 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index dc5c95810e..738950cf21 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,17 +23,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = iconst.i64 4100 ;; @0040 v6 = isub v4, v5 ; v5 = 4100 ;; @0040 v7 = icmp ugt v2, v6 ;; @0040 trapnz v7, heap_oob -;; @0040 v8 = load.i64 notrap aligned checked v0+88 +;; @0040 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v9 = iadd v8, v2 ;; @0040 v10 = iconst.i64 4096 ;; @0040 v11 = iadd v9, v10 ; v10 = 4096 @@ -49,17 +49,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0049 v4 = load.i64 notrap aligned v0+96 +;; @0049 v4 = load.i64 notrap aligned v0+88 ;; @0049 v5 = iconst.i64 4100 ;; @0049 v6 = isub v4, v5 ; v5 = 4100 ;; @0049 v7 = icmp ugt v2, v6 ;; @0049 trapnz v7, heap_oob -;; @0049 v8 = load.i64 notrap aligned checked v0+88 +;; @0049 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v9 = iadd v8, v2 ;; @0049 v10 = iconst.i64 4096 ;; @0049 v11 = iadd v9, v10 ; v10 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index f199c25c67..7bebcbd252 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -23,17 +23,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_0004 ;; @0040 v5 = uadd_overflow_trap v2, v4, heap_oob ; v4 = 0xffff_0004 -;; @0040 v6 = load.i64 notrap aligned v0+96 +;; @0040 v6 = load.i64 notrap aligned v0+88 ;; @0040 v7 = icmp ugt v5, v6 ;; @0040 trapnz v7, heap_oob -;; @0040 v8 = load.i64 notrap aligned checked v0+88 +;; @0040 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v9 = iadd v8, v2 ;; @0040 v10 = iconst.i64 0xffff_0000 ;; @0040 v11 = iadd v9, v10 ; v10 = 0xffff_0000 @@ -49,17 +49,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @004c v4 = iconst.i64 0xffff_0004 ;; @004c v5 = uadd_overflow_trap v2, v4, heap_oob ; v4 = 0xffff_0004 -;; @004c v6 = load.i64 notrap aligned v0+96 +;; @004c v6 = load.i64 notrap aligned v0+88 ;; @004c v7 = icmp ugt v5, v6 ;; @004c trapnz v7, heap_oob -;; @004c v8 = load.i64 notrap aligned checked v0+88 +;; @004c v8 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v9 = iadd v8, v2 ;; @004c v10 = iconst.i64 0xffff_0000 ;; @004c v11 = iadd v9, v10 ; v10 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat index ed2d955214..e454b1e4b6 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp uge v2, v4 ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 istore8 little heap v3, v7 ;; @0043 jump block1 @@ -45,15 +45,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0048 v4 = load.i64 notrap aligned v0+96 +;; @0048 v4 = load.i64 notrap aligned v0+88 ;; @0048 v5 = icmp uge v2, v4 ;; @0048 trapnz v5, heap_oob -;; @0048 v6 = load.i64 notrap aligned checked v0+88 +;; @0048 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = uload8.i32 little heap v7 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index c6eafa066d..35015253f9 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,17 +23,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = iconst.i64 4097 ;; @0040 v6 = isub v4, v5 ; v5 = 4097 ;; @0040 v7 = icmp ugt v2, v6 ;; @0040 trapnz v7, heap_oob -;; @0040 v8 = load.i64 notrap aligned checked v0+88 +;; @0040 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v9 = iadd v8, v2 ;; @0040 v10 = iconst.i64 4096 ;; @0040 v11 = iadd v9, v10 ; v10 = 4096 @@ -49,17 +49,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0049 v4 = load.i64 notrap aligned v0+96 +;; @0049 v4 = load.i64 notrap aligned v0+88 ;; @0049 v5 = iconst.i64 4097 ;; @0049 v6 = isub v4, v5 ; v5 = 4097 ;; @0049 v7 = icmp ugt v2, v6 ;; @0049 trapnz v7, heap_oob -;; @0049 v8 = load.i64 notrap aligned checked v0+88 +;; @0049 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v9 = iadd v8, v2 ;; @0049 v10 = iconst.i64 4096 ;; @0049 v11 = iadd v9, v10 ; v10 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index 02266512b6..37e310481a 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -23,17 +23,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_0001 ;; @0040 v5 = uadd_overflow_trap v2, v4, heap_oob ; v4 = 0xffff_0001 -;; @0040 v6 = load.i64 notrap aligned v0+96 +;; @0040 v6 = load.i64 notrap aligned v0+88 ;; @0040 v7 = icmp ugt v5, v6 ;; @0040 trapnz v7, heap_oob -;; @0040 v8 = load.i64 notrap aligned checked v0+88 +;; @0040 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v9 = iadd v8, v2 ;; @0040 v10 = iconst.i64 0xffff_0000 ;; @0040 v11 = iadd v9, v10 ; v10 = 0xffff_0000 @@ -49,17 +49,17 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @004c v4 = iconst.i64 0xffff_0001 ;; @004c v5 = uadd_overflow_trap v2, v4, heap_oob ; v4 = 0xffff_0001 -;; @004c v6 = load.i64 notrap aligned v0+96 +;; @004c v6 = load.i64 notrap aligned v0+88 ;; @004c v7 = icmp ugt v5, v6 ;; @004c trapnz v7, heap_oob -;; @004c v8 = load.i64 notrap aligned checked v0+88 +;; @004c v8 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v9 = iadd v8, v2 ;; @004c v10 = iconst.i64 0xffff_0000 ;; @004c v11 = iadd v9, v10 ; v10 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat index 6325b04f02..85964b897c 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -23,16 +23,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = iconst.i64 4 ;; @0040 v6 = isub v4, v5 ; v5 = 4 ;; @0040 v7 = icmp ugt v2, v6 -;; @0040 v8 = load.i64 notrap aligned checked v0+88 +;; @0040 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v9 = iadd v8, v2 ;; @0040 v10 = iconst.i64 0 ;; @0040 v11 = select_spectre_guard v7, v10, v9 ; v10 = 0 @@ -48,16 +48,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0048 v4 = load.i64 notrap aligned v0+96 +;; @0048 v4 = load.i64 notrap aligned v0+88 ;; @0048 v5 = iconst.i64 4 ;; @0048 v6 = isub v4, v5 ; v5 = 4 ;; @0048 v7 = icmp ugt v2, v6 -;; @0048 v8 = load.i64 notrap aligned checked v0+88 +;; @0048 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v9 = iadd v8, v2 ;; @0048 v10 = iconst.i64 0 ;; @0048 v11 = select_spectre_guard v7, v10, v9 ; v10 = 0 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index d906a60ff3..a4edd69d59 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,16 +23,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = iconst.i64 4100 ;; @0040 v6 = isub v4, v5 ; v5 = 4100 ;; @0040 v7 = icmp ugt v2, v6 -;; @0040 v8 = load.i64 notrap aligned checked v0+88 +;; @0040 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v9 = iadd v8, v2 ;; @0040 v10 = iconst.i64 4096 ;; @0040 v11 = iadd v9, v10 ; v10 = 4096 @@ -50,16 +50,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0049 v4 = load.i64 notrap aligned v0+96 +;; @0049 v4 = load.i64 notrap aligned v0+88 ;; @0049 v5 = iconst.i64 4100 ;; @0049 v6 = isub v4, v5 ; v5 = 4100 ;; @0049 v7 = icmp ugt v2, v6 -;; @0049 v8 = load.i64 notrap aligned checked v0+88 +;; @0049 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v9 = iadd v8, v2 ;; @0049 v10 = iconst.i64 4096 ;; @0049 v11 = iadd v9, v10 ; v10 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 6ea464255b..fcd4a231fd 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,16 +23,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_0004 ;; @0040 v5 = uadd_overflow_trap v2, v4, heap_oob ; v4 = 0xffff_0004 -;; @0040 v6 = load.i64 notrap aligned v0+96 +;; @0040 v6 = load.i64 notrap aligned v0+88 ;; @0040 v7 = icmp ugt v5, v6 -;; @0040 v8 = load.i64 notrap aligned checked v0+88 +;; @0040 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v9 = iadd v8, v2 ;; @0040 v10 = iconst.i64 0xffff_0000 ;; @0040 v11 = iadd v9, v10 ; v10 = 0xffff_0000 @@ -50,16 +50,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @004c v4 = iconst.i64 0xffff_0004 ;; @004c v5 = uadd_overflow_trap v2, v4, heap_oob ; v4 = 0xffff_0004 -;; @004c v6 = load.i64 notrap aligned v0+96 +;; @004c v6 = load.i64 notrap aligned v0+88 ;; @004c v7 = icmp ugt v5, v6 -;; @004c v8 = load.i64 notrap aligned checked v0+88 +;; @004c v8 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v9 = iadd v8, v2 ;; @004c v10 = iconst.i64 0xffff_0000 ;; @004c v11 = iadd v9, v10 ; v10 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat index 763d6b64eb..adf7535a30 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp uge v2, v4 -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0 ;; @0040 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 @@ -46,14 +46,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0048 v4 = load.i64 notrap aligned v0+96 +;; @0048 v4 = load.i64 notrap aligned v0+88 ;; @0048 v5 = icmp uge v2, v4 -;; @0048 v6 = load.i64 notrap aligned checked v0+88 +;; @0048 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = iconst.i64 0 ;; @0048 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index d8f9c4a817..01395c6c83 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,16 +23,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = iconst.i64 4097 ;; @0040 v6 = isub v4, v5 ; v5 = 4097 ;; @0040 v7 = icmp ugt v2, v6 -;; @0040 v8 = load.i64 notrap aligned checked v0+88 +;; @0040 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v9 = iadd v8, v2 ;; @0040 v10 = iconst.i64 4096 ;; @0040 v11 = iadd v9, v10 ; v10 = 4096 @@ -50,16 +50,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0049 v4 = load.i64 notrap aligned v0+96 +;; @0049 v4 = load.i64 notrap aligned v0+88 ;; @0049 v5 = iconst.i64 4097 ;; @0049 v6 = isub v4, v5 ; v5 = 4097 ;; @0049 v7 = icmp ugt v2, v6 -;; @0049 v8 = load.i64 notrap aligned checked v0+88 +;; @0049 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v9 = iadd v8, v2 ;; @0049 v10 = iconst.i64 4096 ;; @0049 v11 = iadd v9, v10 ; v10 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index c46150e975..d3fb6b9fac 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,16 +23,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_0001 ;; @0040 v5 = uadd_overflow_trap v2, v4, heap_oob ; v4 = 0xffff_0001 -;; @0040 v6 = load.i64 notrap aligned v0+96 +;; @0040 v6 = load.i64 notrap aligned v0+88 ;; @0040 v7 = icmp ugt v5, v6 -;; @0040 v8 = load.i64 notrap aligned checked v0+88 +;; @0040 v8 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v9 = iadd v8, v2 ;; @0040 v10 = iconst.i64 0xffff_0000 ;; @0040 v11 = iadd v9, v10 ; v10 = 0xffff_0000 @@ -50,16 +50,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @004c v4 = iconst.i64 0xffff_0001 ;; @004c v5 = uadd_overflow_trap v2, v4, heap_oob ; v4 = 0xffff_0001 -;; @004c v6 = load.i64 notrap aligned v0+96 +;; @004c v6 = load.i64 notrap aligned v0+88 ;; @004c v7 = icmp ugt v5, v6 -;; @004c v8 = load.i64 notrap aligned checked v0+88 +;; @004c v8 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v9 = iadd v8, v2 ;; @004c v10 = iconst.i64 0xffff_0000 ;; @004c v11 = iadd v9, v10 ; v10 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index 580c834d00..411c6792f7 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp ugt v2, v4 ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 store little heap v3, v7 ;; @0043 jump block1 @@ -45,15 +45,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0048 v4 = load.i64 notrap aligned v0+96 +;; @0048 v4 = load.i64 notrap aligned v0+88 ;; @0048 v5 = icmp ugt v2, v4 ;; @0048 trapnz v5, heap_oob -;; @0048 v6 = load.i64 notrap aligned checked v0+88 +;; @0048 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = load.i32 little heap v7 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index 12d7f300de..b4e66936f7 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp ugt v2, v4 ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 4096 ;; @0040 v9 = iadd v7, v8 ; v8 = 4096 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0049 v4 = load.i64 notrap aligned v0+96 +;; @0049 v4 = load.i64 notrap aligned v0+88 ;; @0049 v5 = icmp ugt v2, v4 ;; @0049 trapnz v5, heap_oob -;; @0049 v6 = load.i64 notrap aligned checked v0+88 +;; @0049 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v7 = iadd v6, v2 ;; @0049 v8 = iconst.i64 4096 ;; @0049 v9 = iadd v7, v8 ; v8 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index b917362af3..84b139bb7c 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp ugt v2, v4 ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0xffff_0000 ;; @0040 v9 = iadd v7, v8 ; v8 = 0xffff_0000 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @004c v4 = load.i64 notrap aligned v0+96 +;; @004c v4 = load.i64 notrap aligned v0+88 ;; @004c v5 = icmp ugt v2, v4 ;; @004c trapnz v5, heap_oob -;; @004c v6 = load.i64 notrap aligned checked v0+88 +;; @004c v6 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v7 = iadd v6, v2 ;; @004c v8 = iconst.i64 0xffff_0000 ;; @004c v9 = iadd v7, v8 ; v8 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index f455db744e..a145223d13 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp uge v2, v4 ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 istore8 little heap v3, v7 ;; @0043 jump block1 @@ -45,15 +45,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0048 v4 = load.i64 notrap aligned v0+96 +;; @0048 v4 = load.i64 notrap aligned v0+88 ;; @0048 v5 = icmp uge v2, v4 ;; @0048 trapnz v5, heap_oob -;; @0048 v6 = load.i64 notrap aligned checked v0+88 +;; @0048 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = uload8.i32 little heap v7 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index e1d76463d3..4c8b1751d9 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp ugt v2, v4 ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 4096 ;; @0040 v9 = iadd v7, v8 ; v8 = 4096 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0049 v4 = load.i64 notrap aligned v0+96 +;; @0049 v4 = load.i64 notrap aligned v0+88 ;; @0049 v5 = icmp ugt v2, v4 ;; @0049 trapnz v5, heap_oob -;; @0049 v6 = load.i64 notrap aligned checked v0+88 +;; @0049 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v7 = iadd v6, v2 ;; @0049 v8 = iconst.i64 4096 ;; @0049 v9 = iadd v7, v8 ; v8 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index a949800920..5d31442f59 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp ugt v2, v4 ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0xffff_0000 ;; @0040 v9 = iadd v7, v8 ; v8 = 0xffff_0000 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @004c v4 = load.i64 notrap aligned v0+96 +;; @004c v4 = load.i64 notrap aligned v0+88 ;; @004c v5 = icmp ugt v2, v4 ;; @004c trapnz v5, heap_oob -;; @004c v6 = load.i64 notrap aligned checked v0+88 +;; @004c v6 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v7 = iadd v6, v2 ;; @004c v8 = iconst.i64 0xffff_0000 ;; @004c v9 = iadd v7, v8 ; v8 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index 15a7a5677a..41ec153f8a 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp ugt v2, v4 -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0 ;; @0040 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 @@ -46,14 +46,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0048 v4 = load.i64 notrap aligned v0+96 +;; @0048 v4 = load.i64 notrap aligned v0+88 ;; @0048 v5 = icmp ugt v2, v4 -;; @0048 v6 = load.i64 notrap aligned checked v0+88 +;; @0048 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = iconst.i64 0 ;; @0048 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index 3f11a2029d..ceaf79a1f0 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp ugt v2, v4 -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 4096 ;; @0040 v9 = iadd v7, v8 ; v8 = 4096 @@ -48,14 +48,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0049 v4 = load.i64 notrap aligned v0+96 +;; @0049 v4 = load.i64 notrap aligned v0+88 ;; @0049 v5 = icmp ugt v2, v4 -;; @0049 v6 = load.i64 notrap aligned checked v0+88 +;; @0049 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v7 = iadd v6, v2 ;; @0049 v8 = iconst.i64 4096 ;; @0049 v9 = iadd v7, v8 ; v8 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 088fd9ae1e..a1e7534350 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp ugt v2, v4 -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0xffff_0000 ;; @0040 v9 = iadd v7, v8 ; v8 = 0xffff_0000 @@ -48,14 +48,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @004c v4 = load.i64 notrap aligned v0+96 +;; @004c v4 = load.i64 notrap aligned v0+88 ;; @004c v5 = icmp ugt v2, v4 -;; @004c v6 = load.i64 notrap aligned checked v0+88 +;; @004c v6 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v7 = iadd v6, v2 ;; @004c v8 = iconst.i64 0xffff_0000 ;; @004c v9 = iadd v7, v8 ; v8 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index e2148b7892..1b88241e2f 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp uge v2, v4 -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0 ;; @0040 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 @@ -46,14 +46,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0048 v4 = load.i64 notrap aligned v0+96 +;; @0048 v4 = load.i64 notrap aligned v0+88 ;; @0048 v5 = icmp uge v2, v4 -;; @0048 v6 = load.i64 notrap aligned checked v0+88 +;; @0048 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = iconst.i64 0 ;; @0048 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index b1aa57b7d6..a6b30d305c 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp ugt v2, v4 -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 4096 ;; @0040 v9 = iadd v7, v8 ; v8 = 4096 @@ -48,14 +48,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @0049 v4 = load.i64 notrap aligned v0+96 +;; @0049 v4 = load.i64 notrap aligned v0+88 ;; @0049 v5 = icmp ugt v2, v4 -;; @0049 v6 = load.i64 notrap aligned checked v0+88 +;; @0049 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v7 = iadd v6, v2 ;; @0049 v8 = iconst.i64 4096 ;; @0049 v9 = iadd v7, v8 ; v8 = 4096 diff --git a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 2fb340c276..4e5abfa7fc 100644 --- a/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): -;; @0040 v4 = load.i64 notrap aligned v0+96 +;; @0040 v4 = load.i64 notrap aligned v0+88 ;; @0040 v5 = icmp ugt v2, v4 -;; @0040 v6 = load.i64 notrap aligned checked v0+88 +;; @0040 v6 = load.i64 notrap aligned can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0xffff_0000 ;; @0040 v9 = iadd v7, v8 ; v8 = 0xffff_0000 @@ -48,14 +48,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): -;; @004c v4 = load.i64 notrap aligned v0+96 +;; @004c v4 = load.i64 notrap aligned v0+88 ;; @004c v5 = icmp ugt v2, v4 -;; @004c v6 = load.i64 notrap aligned checked v0+88 +;; @004c v6 = load.i64 notrap aligned can_move checked v0+80 ;; @004c v7 = iadd v6, v2 ;; @004c v8 = iconst.i64 0xffff_0000 ;; @004c v9 = iadd v7, v8 ; v8 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat index 6952806796..a1cb891ea0 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -23,8 +23,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): @@ -32,7 +32,7 @@ ;; @0040 v5 = iconst.i64 0xffff_fffc ;; @0040 v6 = icmp ugt v4, v5 ; v5 = 0xffff_fffc ;; @0040 trapnz v6, heap_oob -;; @0040 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 store little heap v3, v8 ;; @0043 jump block1 @@ -46,8 +46,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): @@ -55,7 +55,7 @@ ;; @0048 v5 = iconst.i64 0xffff_fffc ;; @0048 v6 = icmp ugt v4, v5 ; v5 = 0xffff_fffc ;; @0048 trapnz v6, heap_oob -;; @0048 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v8 = iadd v7, v4 ;; @0048 v9 = load.i32 little heap v8 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index 776581361f..85c09e79c4 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,8 +23,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): @@ -32,7 +32,7 @@ ;; @0040 v5 = iconst.i64 0xffff_effc ;; @0040 v6 = icmp ugt v4, v5 ; v5 = 0xffff_effc ;; @0040 trapnz v6, heap_oob -;; @0040 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 4096 ;; @0040 v10 = iadd v8, v9 ; v9 = 4096 @@ -48,8 +48,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): @@ -57,7 +57,7 @@ ;; @0049 v5 = iconst.i64 0xffff_effc ;; @0049 v6 = icmp ugt v4, v5 ; v5 = 0xffff_effc ;; @0049 trapnz v6, heap_oob -;; @0049 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v8 = iadd v7, v4 ;; @0049 v9 = iconst.i64 4096 ;; @0049 v10 = iadd v8, v9 ; v9 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index 049a2d4e60..0a18c3f472 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -23,8 +23,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): @@ -32,7 +32,7 @@ ;; @0040 v5 = iconst.i64 0xfffc ;; @0040 v6 = icmp ugt v4, v5 ; v5 = 0xfffc ;; @0040 trapnz v6, heap_oob -;; @0040 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 0xffff_0000 ;; @0040 v10 = iadd v8, v9 ; v9 = 0xffff_0000 @@ -48,8 +48,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): @@ -57,7 +57,7 @@ ;; @004c v5 = iconst.i64 0xfffc ;; @004c v6 = icmp ugt v4, v5 ; v5 = 0xfffc ;; @004c trapnz v6, heap_oob -;; @004c v7 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v8 = iadd v7, v4 ;; @004c v9 = iconst.i64 0xffff_0000 ;; @004c v10 = iadd v8, v9 ; v9 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat index f3aeacbd9e..0300e36437 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 istore8 little heap v3, v6 ;; @0043 jump block1 @@ -43,13 +43,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v6 = iadd v5, v4 ;; @0048 v7 = uload8.i32 little heap v6 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index 05a59895a1..18bad38132 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,8 +23,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): @@ -32,7 +32,7 @@ ;; @0040 v5 = iconst.i64 0xffff_efff ;; @0040 v6 = icmp ugt v4, v5 ; v5 = 0xffff_efff ;; @0040 trapnz v6, heap_oob -;; @0040 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 4096 ;; @0040 v10 = iadd v8, v9 ; v9 = 4096 @@ -48,8 +48,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): @@ -57,7 +57,7 @@ ;; @0049 v5 = iconst.i64 0xffff_efff ;; @0049 v6 = icmp ugt v4, v5 ; v5 = 0xffff_efff ;; @0049 trapnz v6, heap_oob -;; @0049 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v8 = iadd v7, v4 ;; @0049 v9 = iconst.i64 4096 ;; @0049 v10 = iadd v8, v9 ; v9 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index db069fcad1..d181ab5408 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -23,8 +23,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): @@ -32,7 +32,7 @@ ;; @0040 v5 = iconst.i64 0xffff ;; @0040 v6 = icmp ugt v4, v5 ; v5 = 0xffff ;; @0040 trapnz v6, heap_oob -;; @0040 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 0xffff_0000 ;; @0040 v10 = iadd v8, v9 ; v9 = 0xffff_0000 @@ -48,8 +48,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): @@ -57,7 +57,7 @@ ;; @004c v5 = iconst.i64 0xffff ;; @004c v6 = icmp ugt v4, v5 ; v5 = 0xffff ;; @004c trapnz v6, heap_oob -;; @004c v7 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v8 = iadd v7, v4 ;; @004c v9 = iconst.i64 0xffff_0000 ;; @004c v10 = iadd v8, v9 ; v9 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat index 0db0b45388..e5a402d4d2 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 ;; @0040 v5 = iconst.i64 0xffff_fffc ;; @0040 v6 = icmp ugt v4, v5 ; v5 = 0xffff_fffc -;; @0040 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 0 ;; @0040 v10 = select_spectre_guard v6, v9, v8 ; v9 = 0 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 ;; @0048 v5 = iconst.i64 0xffff_fffc ;; @0048 v6 = icmp ugt v4, v5 ; v5 = 0xffff_fffc -;; @0048 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v8 = iadd v7, v4 ;; @0048 v9 = iconst.i64 0 ;; @0048 v10 = select_spectre_guard v6, v9, v8 ; v9 = 0 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index 294491dace..767797fe65 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 ;; @0040 v5 = iconst.i64 0xffff_effc ;; @0040 v6 = icmp ugt v4, v5 ; v5 = 0xffff_effc -;; @0040 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 4096 ;; @0040 v10 = iadd v8, v9 ; v9 = 4096 @@ -49,15 +49,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 ;; @0049 v5 = iconst.i64 0xffff_effc ;; @0049 v6 = icmp ugt v4, v5 ; v5 = 0xffff_effc -;; @0049 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v8 = iadd v7, v4 ;; @0049 v9 = iconst.i64 4096 ;; @0049 v10 = iadd v8, v9 ; v9 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 01ce73ac87..5bdd002416 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 ;; @0040 v5 = iconst.i64 0xfffc ;; @0040 v6 = icmp ugt v4, v5 ; v5 = 0xfffc -;; @0040 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 0xffff_0000 ;; @0040 v10 = iadd v8, v9 ; v9 = 0xffff_0000 @@ -49,15 +49,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 ;; @004c v5 = iconst.i64 0xfffc ;; @004c v6 = icmp ugt v4, v5 ; v5 = 0xfffc -;; @004c v7 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v8 = iadd v7, v4 ;; @004c v9 = iconst.i64 0xffff_0000 ;; @004c v10 = iadd v8, v9 ; v9 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat index 2893726984..e49f8534f8 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 istore8 little heap v3, v6 ;; @0043 jump block1 @@ -43,13 +43,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v6 = iadd v5, v4 ;; @0048 v7 = uload8.i32 little heap v6 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index 5e3b01badd..89b42af293 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 ;; @0040 v5 = iconst.i64 0xffff_efff ;; @0040 v6 = icmp ugt v4, v5 ; v5 = 0xffff_efff -;; @0040 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 4096 ;; @0040 v10 = iadd v8, v9 ; v9 = 4096 @@ -49,15 +49,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 ;; @0049 v5 = iconst.i64 0xffff_efff ;; @0049 v6 = icmp ugt v4, v5 ; v5 = 0xffff_efff -;; @0049 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v8 = iadd v7, v4 ;; @0049 v9 = iconst.i64 4096 ;; @0049 v10 = iadd v8, v9 ; v9 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index dc4004897e..a1da512485 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 ;; @0040 v5 = iconst.i64 0xffff ;; @0040 v6 = icmp ugt v4, v5 ; v5 = 0xffff -;; @0040 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v8 = iadd v7, v4 ;; @0040 v9 = iconst.i64 0xffff_0000 ;; @0040 v10 = iadd v8, v9 ; v9 = 0xffff_0000 @@ -49,15 +49,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 ;; @004c v5 = iconst.i64 0xffff ;; @004c v6 = icmp ugt v4, v5 ; v5 = 0xffff -;; @004c v7 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v8 = iadd v7, v4 ;; @004c v9 = iconst.i64 0xffff_0000 ;; @004c v10 = iadd v8, v9 ; v9 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index c4b875883d..097371d1bd 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 store little heap v3, v6 ;; @0043 jump block1 @@ -43,13 +43,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v6 = iadd v5, v4 ;; @0048 v7 = load.i32 little heap v6 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index 578f1eedf4..c6b49d22b0 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 v7 = iconst.i64 4096 ;; @0040 v8 = iadd v6, v7 ; v7 = 4096 @@ -45,13 +45,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 -;; @0049 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v6 = iadd v5, v4 ;; @0049 v7 = iconst.i64 4096 ;; @0049 v8 = iadd v6, v7 ; v7 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index c8923bd7ac..2559bf4aed 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 v7 = iconst.i64 0xffff_0000 ;; @0040 v8 = iadd v6, v7 ; v7 = 0xffff_0000 @@ -45,13 +45,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 -;; @004c v5 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v6 = iadd v5, v4 ;; @004c v7 = iconst.i64 0xffff_0000 ;; @004c v8 = iadd v6, v7 ; v7 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 939db9ce08..cf2fa83dca 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 istore8 little heap v3, v6 ;; @0043 jump block1 @@ -43,13 +43,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v6 = iadd v5, v4 ;; @0048 v7 = uload8.i32 little heap v6 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index b9ab4bf06b..5fc7c58fb2 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 v7 = iconst.i64 4096 ;; @0040 v8 = iadd v6, v7 ; v7 = 4096 @@ -45,13 +45,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 -;; @0049 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v6 = iadd v5, v4 ;; @0049 v7 = iconst.i64 4096 ;; @0049 v8 = iadd v6, v7 ; v7 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index af4583c9af..8e759bbe50 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 v7 = iconst.i64 0xffff_0000 ;; @0040 v8 = iadd v6, v7 ; v7 = 0xffff_0000 @@ -45,13 +45,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 -;; @004c v5 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v6 = iadd v5, v4 ;; @004c v7 = iconst.i64 0xffff_0000 ;; @004c v8 = iadd v6, v7 ; v7 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index f0201b3c2b..9e42c1980c 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 store little heap v3, v6 ;; @0043 jump block1 @@ -43,13 +43,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v6 = iadd v5, v4 ;; @0048 v7 = load.i32 little heap v6 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index 59db5f6c5d..af0274261a 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 v7 = iconst.i64 4096 ;; @0040 v8 = iadd v6, v7 ; v7 = 4096 @@ -45,13 +45,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 -;; @0049 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v6 = iadd v5, v4 ;; @0049 v7 = iconst.i64 4096 ;; @0049 v8 = iadd v6, v7 ; v7 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 78251310e6..144a52f364 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 v7 = iconst.i64 0xffff_0000 ;; @0040 v8 = iadd v6, v7 ; v7 = 0xffff_0000 @@ -45,13 +45,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 -;; @004c v5 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v6 = iadd v5, v4 ;; @004c v7 = iconst.i64 0xffff_0000 ;; @004c v8 = iadd v6, v7 ; v7 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index c9c46caf20..45d09a5444 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 istore8 little heap v3, v6 ;; @0043 jump block1 @@ -43,13 +43,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0048 v4 = uextend.i64 v2 -;; @0048 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v6 = iadd v5, v4 ;; @0048 v7 = uload8.i32 little heap v6 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 13ea500a8f..8138bb0fc2 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 v7 = iconst.i64 4096 ;; @0040 v8 = iadd v6, v7 ; v7 = 4096 @@ -45,13 +45,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 -;; @0049 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v6 = iadd v5, v4 ;; @0049 v7 = iconst.i64 4096 ;; @0049 v8 = iadd v6, v7 ; v7 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index cc3fc6cf34..030f4141a3 100644 --- a/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,13 +23,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0040 v4 = uextend.i64 v2 -;; @0040 v5 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v6 = iadd v5, v4 ;; @0040 v7 = iconst.i64 0xffff_0000 ;; @0040 v8 = iadd v6, v7 ; v7 = 0xffff_0000 @@ -45,13 +45,13 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @004c v4 = uextend.i64 v2 -;; @004c v5 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v5 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v6 = iadd v5, v4 ;; @004c v7 = iconst.i64 0xffff_0000 ;; @004c v8 = iadd v6, v7 ; v7 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat index 696b49b870..457130a87c 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_fffc ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_fffc ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 store little heap v3, v7 ;; @0043 jump block1 @@ -45,15 +45,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0048 v4 = iconst.i64 0xffff_fffc ;; @0048 v5 = icmp ugt v2, v4 ; v4 = 0xffff_fffc ;; @0048 trapnz v5, heap_oob -;; @0048 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = load.i32 little heap v7 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index 17c27b12a8..adc14d99c1 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_effc ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_effc ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 4096 ;; @0040 v9 = iadd v7, v8 ; v8 = 4096 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0049 v4 = iconst.i64 0xffff_effc ;; @0049 v5 = icmp ugt v2, v4 ; v4 = 0xffff_effc ;; @0049 trapnz v5, heap_oob -;; @0049 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v7 = iadd v6, v2 ;; @0049 v8 = iconst.i64 4096 ;; @0049 v9 = iadd v7, v8 ; v8 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index 985ea1fecb..7aaaef2280 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xfffc ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xfffc ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0xffff_0000 ;; @0040 v9 = iadd v7, v8 ; v8 = 0xffff_0000 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @004c v4 = iconst.i64 0xfffc ;; @004c v5 = icmp ugt v2, v4 ; v4 = 0xfffc ;; @004c trapnz v5, heap_oob -;; @004c v6 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v7 = iadd v6, v2 ;; @004c v8 = iconst.i64 0xffff_0000 ;; @004c v9 = iadd v7, v8 ; v8 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat index 787037c394..23c7691f0f 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_ffff ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_ffff ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 istore8 little heap v3, v7 ;; @0043 jump block1 @@ -45,15 +45,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0048 v4 = iconst.i64 0xffff_ffff ;; @0048 v5 = icmp ugt v2, v4 ; v4 = 0xffff_ffff ;; @0048 trapnz v5, heap_oob -;; @0048 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = uload8.i32 little heap v7 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index 64bb8093ba..b8723ed6d8 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_efff ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_efff ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 4096 ;; @0040 v9 = iadd v7, v8 ; v8 = 4096 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0049 v4 = iconst.i64 0xffff_efff ;; @0049 v5 = icmp ugt v2, v4 ; v4 = 0xffff_efff ;; @0049 trapnz v5, heap_oob -;; @0049 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v7 = iadd v6, v2 ;; @0049 v8 = iconst.i64 4096 ;; @0049 v9 = iadd v7, v8 ; v8 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index 9f905e1eb6..22b90a6f26 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0xffff_0000 ;; @0040 v9 = iadd v7, v8 ; v8 = 0xffff_0000 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @004c v4 = iconst.i64 0xffff ;; @004c v5 = icmp ugt v2, v4 ; v4 = 0xffff ;; @004c trapnz v5, heap_oob -;; @004c v6 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v7 = iadd v6, v2 ;; @004c v8 = iconst.i64 0xffff_0000 ;; @004c v9 = iadd v7, v8 ; v8 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat index 65e6f623e6..6dbea23f7b 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_fffc ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_fffc -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0 ;; @0040 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 @@ -46,14 +46,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0048 v4 = iconst.i64 0xffff_fffc ;; @0048 v5 = icmp ugt v2, v4 ; v4 = 0xffff_fffc -;; @0048 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = iconst.i64 0 ;; @0048 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index f5c65ca8c1..5dd8acd5c5 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_effc ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_effc -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 4096 ;; @0040 v9 = iadd v7, v8 ; v8 = 4096 @@ -48,14 +48,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0049 v4 = iconst.i64 0xffff_effc ;; @0049 v5 = icmp ugt v2, v4 ; v4 = 0xffff_effc -;; @0049 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v7 = iadd v6, v2 ;; @0049 v8 = iconst.i64 4096 ;; @0049 v9 = iadd v7, v8 ; v8 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 2c518cab94..c82e355587 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xfffc ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xfffc -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0xffff_0000 ;; @0040 v9 = iadd v7, v8 ; v8 = 0xffff_0000 @@ -48,14 +48,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @004c v4 = iconst.i64 0xfffc ;; @004c v5 = icmp ugt v2, v4 ; v4 = 0xfffc -;; @004c v6 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v7 = iadd v6, v2 ;; @004c v8 = iconst.i64 0xffff_0000 ;; @004c v9 = iadd v7, v8 ; v8 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat index 9203193d09..b273760f42 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_ffff ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_ffff -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0 ;; @0040 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 @@ -46,14 +46,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0048 v4 = iconst.i64 0xffff_ffff ;; @0048 v5 = icmp ugt v2, v4 ; v4 = 0xffff_ffff -;; @0048 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = iconst.i64 0 ;; @0048 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index 83280f05e0..5a855213c7 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_efff ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_efff -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 4096 ;; @0040 v9 = iadd v7, v8 ; v8 = 4096 @@ -48,14 +48,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0049 v4 = iconst.i64 0xffff_efff ;; @0049 v5 = icmp ugt v2, v4 ; v4 = 0xffff_efff -;; @0049 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v7 = iadd v6, v2 ;; @0049 v8 = iconst.i64 4096 ;; @0049 v9 = iadd v7, v8 ; v8 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index ad9ec1c07b..a76790e7f7 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0xffff_0000 ;; @0040 v9 = iadd v7, v8 ; v8 = 0xffff_0000 @@ -48,14 +48,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @004c v4 = iconst.i64 0xffff ;; @004c v5 = icmp ugt v2, v4 ; v4 = 0xffff -;; @004c v6 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v7 = iadd v6, v2 ;; @004c v8 = iconst.i64 0xffff_0000 ;; @004c v9 = iadd v7, v8 ; v8 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index 2de0ec9018..eda3604f6e 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_fffc ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_fffc ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 store little heap v3, v7 ;; @0043 jump block1 @@ -45,15 +45,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0048 v4 = iconst.i64 0xffff_fffc ;; @0048 v5 = icmp ugt v2, v4 ; v4 = 0xffff_fffc ;; @0048 trapnz v5, heap_oob -;; @0048 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = load.i32 little heap v7 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index c17c12b895..8630e63c22 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_effc ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_effc ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 4096 ;; @0040 v9 = iadd v7, v8 ; v8 = 4096 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0049 v4 = iconst.i64 0xffff_effc ;; @0049 v5 = icmp ugt v2, v4 ; v4 = 0xffff_effc ;; @0049 trapnz v5, heap_oob -;; @0049 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v7 = iadd v6, v2 ;; @0049 v8 = iconst.i64 4096 ;; @0049 v9 = iadd v7, v8 ; v8 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 641e6a56a4..c3a59c2a9e 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xfffc ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xfffc ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0xffff_0000 ;; @0040 v9 = iadd v7, v8 ; v8 = 0xffff_0000 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @004c v4 = iconst.i64 0xfffc ;; @004c v5 = icmp ugt v2, v4 ; v4 = 0xfffc ;; @004c trapnz v5, heap_oob -;; @004c v6 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v7 = iadd v6, v2 ;; @004c v8 = iconst.i64 0xffff_0000 ;; @004c v9 = iadd v7, v8 ; v8 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 1121176e70..41f2c982a9 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_ffff ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_ffff ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 istore8 little heap v3, v7 ;; @0043 jump block1 @@ -45,15 +45,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0048 v4 = iconst.i64 0xffff_ffff ;; @0048 v5 = icmp ugt v2, v4 ; v4 = 0xffff_ffff ;; @0048 trapnz v5, heap_oob -;; @0048 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = uload8.i32 little heap v7 ;; @004b jump block1 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index b99e565068..47e2a1de15 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_efff ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_efff ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 4096 ;; @0040 v9 = iadd v7, v8 ; v8 = 4096 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0049 v4 = iconst.i64 0xffff_efff ;; @0049 v5 = icmp ugt v2, v4 ; v4 = 0xffff_efff ;; @0049 trapnz v5, heap_oob -;; @0049 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v7 = iadd v6, v2 ;; @0049 v8 = iconst.i64 4096 ;; @0049 v9 = iadd v7, v8 ; v8 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index ff6284cf52..3329a005f2 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -23,15 +23,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff ;; @0040 trapnz v5, heap_oob -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0xffff_0000 ;; @0040 v9 = iadd v7, v8 ; v8 = 0xffff_0000 @@ -47,15 +47,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @004c v4 = iconst.i64 0xffff ;; @004c v5 = icmp ugt v2, v4 ; v4 = 0xffff ;; @004c trapnz v5, heap_oob -;; @004c v6 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v7 = iadd v6, v2 ;; @004c v8 = iconst.i64 0xffff_0000 ;; @004c v9 = iadd v7, v8 ; v8 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index d54f02b870..8a7c8bb354 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_fffc ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_fffc -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0 ;; @0040 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 @@ -46,14 +46,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0048 v4 = iconst.i64 0xffff_fffc ;; @0048 v5 = icmp ugt v2, v4 ; v4 = 0xffff_fffc -;; @0048 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = iconst.i64 0 ;; @0048 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index 2434728d9f..2616f9c59a 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_effc ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_effc -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 4096 ;; @0040 v9 = iadd v7, v8 ; v8 = 4096 @@ -48,14 +48,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0049 v4 = iconst.i64 0xffff_effc ;; @0049 v5 = icmp ugt v2, v4 ; v4 = 0xffff_effc -;; @0049 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v7 = iadd v6, v2 ;; @0049 v8 = iconst.i64 4096 ;; @0049 v9 = iadd v7, v8 ; v8 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 5e2a076b84..28ae130d19 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xfffc ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xfffc -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0xffff_0000 ;; @0040 v9 = iadd v7, v8 ; v8 = 0xffff_0000 @@ -48,14 +48,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @004c v4 = iconst.i64 0xfffc ;; @004c v5 = icmp ugt v2, v4 ; v4 = 0xfffc -;; @004c v6 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v7 = iadd v6, v2 ;; @004c v8 = iconst.i64 0xffff_0000 ;; @004c v9 = iadd v7, v8 ; v8 = 0xffff_0000 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index 86262f965d..28ecc279c6 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_ffff ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_ffff -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0 ;; @0040 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 @@ -46,14 +46,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0048 v4 = iconst.i64 0xffff_ffff ;; @0048 v5 = icmp ugt v2, v4 ; v4 = 0xffff_ffff -;; @0048 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0048 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0048 v7 = iadd v6, v2 ;; @0048 v8 = iconst.i64 0 ;; @0048 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 3a8f8ef491..65c27d6342 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff_efff ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff_efff -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 4096 ;; @0040 v9 = iadd v7, v8 ; v8 = 4096 @@ -48,14 +48,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0049 v4 = iconst.i64 0xffff_efff ;; @0049 v5 = icmp ugt v2, v4 ; v4 = 0xffff_efff -;; @0049 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0049 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0049 v7 = iadd v6, v2 ;; @0049 v8 = iconst.i64 4096 ;; @0049 v9 = iadd v7, v8 ; v8 = 4096 diff --git a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index eec3be5175..023cbd116c 100644 --- a/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,14 +23,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64, v3: i32): ;; @0040 v4 = iconst.i64 0xffff ;; @0040 v5 = icmp ugt v2, v4 ; v4 = 0xffff -;; @0040 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v7 = iadd v6, v2 ;; @0040 v8 = iconst.i64 0xffff_0000 ;; @0040 v9 = iadd v7, v8 ; v8 = 0xffff_0000 @@ -48,14 +48,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @004c v4 = iconst.i64 0xffff ;; @004c v5 = icmp ugt v2, v4 ; v4 = 0xffff -;; @004c v6 = load.i64 notrap aligned readonly checked v0+88 +;; @004c v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004c v7 = iadd v6, v2 ;; @004c v8 = iconst.i64 0xffff_0000 ;; @004c v9 = iadd v7, v8 ; v8 = 0xffff_0000 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat index 5e36bbc2a1..28a0695c77 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -23,13 +23,13 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a2, a2, 0x20 ;; srli a4, a2, 0x20 ;; addi a5, a5, -4 ;; bgeu a5, a4, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a4, a5, a4 ;; sw a3, 0(a4) ;; ld ra, 8(sp) @@ -42,13 +42,13 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a3, 0x60(a0) +;; ld a3, 0x58(a0) ;; slli a2, a2, 0x20 ;; srli a4, a2, 0x20 ;; addi a3, a3, -4 ;; bgeu a3, a4, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a4, a5, a4 ;; lw a0, 0(a4) ;; ld ra, 8(sp) diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index 812f8a048d..be0c5c0c0b 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a4, a2, 0x20 ;; srli a1, a4, 0x20 ;; lui a4, 1 @@ -31,7 +31,7 @@ ;; sub a5, a5, a2 ;; bgeu a5, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a1 ;; lui t6, 1 ;; add t6, t6, a0 @@ -46,7 +46,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a4, a2, 0x20 ;; srli a1, a4, 0x20 ;; lui a4, 1 @@ -54,7 +54,7 @@ ;; sub a5, a5, a2 ;; bgeu a5, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a1 ;; lui t6, 1 ;; add t6, t6, a0 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index f02676a6d2..3d3a94985a 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -31,10 +31,10 @@ ;; add a5, a4, a5 ;; bgeu a5, a4, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; bgeu a1, a5, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a4 ;; lui a4, 0xffff ;; slli a0, a4, 4 @@ -58,10 +58,10 @@ ;; add a3, a4, a5 ;; bgeu a3, a4, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; bgeu a5, a3, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a4 ;; lui a4, 0xffff ;; slli a0, a4, 4 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat index da4e53c4a5..b5b0b938d3 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -23,12 +23,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a1, a2, 0x20 ;; srli a4, a1, 0x20 ;; bltu a4, a5, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a4, a5, a4 ;; sb a3, 0(a4) ;; ld ra, 8(sp) @@ -41,12 +41,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) +;; ld a4, 0x58(a0) ;; slli a1, a2, 0x20 ;; srli a3, a1, 0x20 ;; bltu a3, a4, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a3, a4, a3 ;; lbu a0, 0(a3) ;; ld ra, 8(sp) diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index 57fc2f586d..9e33a52297 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a4, a2, 0x20 ;; srli a1, a4, 0x20 ;; lui a4, 1 @@ -31,7 +31,7 @@ ;; sub a5, a5, a2 ;; bgeu a5, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a1 ;; lui t6, 1 ;; add t6, t6, a0 @@ -46,7 +46,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a4, a2, 0x20 ;; srli a1, a4, 0x20 ;; lui a4, 1 @@ -54,7 +54,7 @@ ;; sub a5, a5, a2 ;; bgeu a5, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a1 ;; lui t6, 1 ;; add t6, t6, a0 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index ee4544b5ec..312ea204e9 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -30,10 +30,10 @@ ;; add a1, a2, a1 ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x60(a0) +;; ld a4, 0x58(a0) ;; bgeu a4, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; lui a2, 0xffff ;; slli a5, a2, 4 @@ -58,10 +58,10 @@ ;; add a1, a2, a1 ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a3, 0x60(a0) +;; ld a3, 0x58(a0) ;; bgeu a3, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a3, 0x58(a0) +;; ld a3, 0x50(a0) ;; add a3, a3, a2 ;; lui a2, 0xffff ;; slli a4, a2, 4 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat index 5168bef17e..1e3f52c14a 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) -;; ld a1, 0x58(a0) +;; ld a5, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a4, a0, 0x20 ;; addi a2, a5, -4 @@ -44,8 +44,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a1, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a3, a0, 0x20 ;; addi a2, a4, -4 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index a1941cd91f..26f665004a 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a5, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a1, a0, 0x20 ;; lui a0, 1 @@ -48,8 +48,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a3, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a3, 0x58(a0) +;; ld a5, 0x50(a0) ;; slli a4, a2, 0x20 ;; srli a1, a4, 0x20 ;; lui a4, 1 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index c797ea9ecc..af0d33cda5 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -31,8 +31,8 @@ ;; add a1, a2, a4 ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a5, 0x50(a0) ;; sltu a4, a4, a1 ;; add a2, a5, a2 ;; lui a1, 0xffff @@ -60,8 +60,8 @@ ;; add a1, a2, a3 ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a3, 0x60(a0) -;; ld a4, 0x58(a0) +;; ld a3, 0x58(a0) +;; ld a4, 0x50(a0) ;; sltu a3, a3, a1 ;; add a2, a4, a2 ;; lui a1, 0xffff diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat index dbda4907bd..8e94652a06 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) -;; ld a1, 0x58(a0) +;; ld a5, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a4, a0, 0x20 ;; sltu a0, a4, a5 @@ -44,8 +44,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a1, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a3, a0, 0x20 ;; sltu a0, a3, a4 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index e804f57eae..17cc955099 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a5, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a1, a0, 0x20 ;; lui a0, 1 @@ -48,8 +48,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a3, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a3, 0x58(a0) +;; ld a5, 0x50(a0) ;; slli a4, a2, 0x20 ;; srli a1, a4, 0x20 ;; lui a4, 1 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index fdba11f1d6..fbd1261573 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -32,8 +32,8 @@ ;; bgeu a5, a0, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 ;; mv a2, a1 -;; ld a1, 0x60(a2) -;; ld a2, 0x58(a2) +;; ld a1, 0x58(a2) +;; ld a2, 0x50(a2) ;; sltu a1, a1, a5 ;; add a0, a2, a0 ;; lui a5, 0xffff @@ -64,8 +64,8 @@ ;; bgeu a5, a0, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 ;; mv a2, a1 -;; ld a1, 0x60(a2) -;; ld a2, 0x58(a2) +;; ld a1, 0x58(a2) +;; ld a2, 0x50(a2) ;; sltu a1, a1, a5 ;; add a0, a2, a0 ;; lui a5, 0xffff diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index 1cea11f122..3509d5ab10 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -23,12 +23,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a1, a2, 0x20 ;; srli a4, a1, 0x20 ;; bgeu a5, a4, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a4, a5, a4 ;; sw a3, 0(a4) ;; ld ra, 8(sp) @@ -41,12 +41,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) +;; ld a4, 0x58(a0) ;; slli a1, a2, 0x20 ;; srli a3, a1, 0x20 ;; bgeu a4, a3, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a3, a4, a3 ;; lw a0, 0(a3) ;; ld ra, 8(sp) diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index ae94432d74..fd47d830f5 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,12 +23,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a1, a2, 0x20 ;; srli a4, a1, 0x20 ;; bgeu a5, a4, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a4, a5, a4 ;; lui t6, 1 ;; add t6, t6, a4 @@ -43,12 +43,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) +;; ld a4, 0x58(a0) ;; slli a1, a2, 0x20 ;; srli a3, a1, 0x20 ;; bgeu a4, a3, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a3, a4, a3 ;; lui t6, 1 ;; add t6, t6, a3 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index cf6b462339..3800ed0aeb 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -23,12 +23,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a4, a2, 0x20 ;; srli a1, a4, 0x20 ;; bgeu a5, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a1 ;; lui a5, 0xffff ;; slli a1, a5, 4 @@ -44,12 +44,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a4, a2, 0x20 ;; srli a1, a4, 0x20 ;; bgeu a5, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a1 ;; lui a5, 0xffff ;; slli a1, a5, 4 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 1789474ff9..fb9d886092 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -23,12 +23,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a1, a2, 0x20 ;; srli a4, a1, 0x20 ;; bltu a4, a5, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a4, a5, a4 ;; sb a3, 0(a4) ;; ld ra, 8(sp) @@ -41,12 +41,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) +;; ld a4, 0x58(a0) ;; slli a1, a2, 0x20 ;; srli a3, a1, 0x20 ;; bltu a3, a4, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a3, a4, a3 ;; lbu a0, 0(a3) ;; ld ra, 8(sp) diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index 3f17bd2999..155e8ce132 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,12 +23,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a1, a2, 0x20 ;; srli a4, a1, 0x20 ;; bgeu a5, a4, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a4, a5, a4 ;; lui t6, 1 ;; add t6, t6, a4 @@ -43,12 +43,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) +;; ld a4, 0x58(a0) ;; slli a1, a2, 0x20 ;; srli a3, a1, 0x20 ;; bgeu a4, a3, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a3, a4, a3 ;; lui t6, 1 ;; add t6, t6, a3 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index b9215ef461..2524d4488e 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -23,12 +23,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a4, a2, 0x20 ;; srli a1, a4, 0x20 ;; bgeu a5, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a1 ;; lui a5, 0xffff ;; slli a1, a5, 4 @@ -44,12 +44,12 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) +;; ld a5, 0x58(a0) ;; slli a4, a2, 0x20 ;; srli a1, a4, 0x20 ;; bgeu a5, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a1 ;; lui a5, 0xffff ;; slli a1, a5, 4 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index 43124c7697..e06e9bc787 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a1, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a5, a2, 0x20 ;; srli a2, a5, 0x20 ;; sltu a4, a4, a2 @@ -43,8 +43,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a3, 0x60(a0) -;; ld a1, 0x58(a0) +;; ld a3, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a5, a2, 0x20 ;; srli a2, a5, 0x20 ;; sltu a3, a3, a2 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index c5edf8bcf6..3a76c91cda 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) -;; ld a4, 0x58(a0) +;; ld a5, 0x58(a0) +;; ld a4, 0x50(a0) ;; slli a1, a2, 0x20 ;; srli a0, a1, 0x20 ;; sltu a2, a5, a0 @@ -45,8 +45,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a3, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a3, 0x50(a0) ;; slli a1, a2, 0x20 ;; srli a5, a1, 0x20 ;; sltu a2, a4, a5 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index b4a1dc3210..8907f45bc9 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a5, 0x50(a0) ;; slli a2, a2, 0x20 ;; srli a0, a2, 0x20 ;; sltu a4, a4, a0 @@ -46,8 +46,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a3, 0x60(a0) -;; ld a4, 0x58(a0) +;; ld a3, 0x58(a0) +;; ld a4, 0x50(a0) ;; slli a2, a2, 0x20 ;; srli a5, a2, 0x20 ;; sltu a3, a3, a5 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index 4a2bad1ab2..944b2e3bd0 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) -;; ld a1, 0x58(a0) +;; ld a5, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a4, a0, 0x20 ;; sltu a0, a4, a5 @@ -44,8 +44,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a1, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a3, a0, 0x20 ;; sltu a0, a3, a4 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 77a013573b..68e25ef5f2 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) -;; ld a4, 0x58(a0) +;; ld a5, 0x58(a0) +;; ld a4, 0x50(a0) ;; slli a1, a2, 0x20 ;; srli a0, a1, 0x20 ;; sltu a2, a5, a0 @@ -45,8 +45,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a3, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a3, 0x50(a0) ;; slli a1, a2, 0x20 ;; srli a5, a1, 0x20 ;; sltu a2, a4, a5 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 2666f2b4e1..3daa5edccc 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a5, 0x50(a0) ;; slli a2, a2, 0x20 ;; srli a0, a2, 0x20 ;; sltu a4, a4, a0 @@ -46,8 +46,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a3, 0x60(a0) -;; ld a4, 0x58(a0) +;; ld a3, 0x58(a0) +;; ld a4, 0x50(a0) ;; slli a2, a2, 0x20 ;; srli a5, a2, 0x20 ;; sltu a3, a3, a5 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat index 0580254ef5..d3b07276f0 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -23,11 +23,11 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; addi a1, a1, -4 ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a2, a4, a2 ;; sw a3, 0(a2) ;; ld ra, 8(sp) @@ -40,11 +40,11 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; addi a1, a1, -4 ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a3, 0x58(a0) +;; ld a3, 0x50(a0) ;; add a2, a3, a2 ;; lw a0, 0(a2) ;; ld ra, 8(sp) diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index 5ce7dce1ba..52b129b3d3 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,13 +23,13 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) +;; ld a4, 0x58(a0) ;; lui a5, 1 ;; addi a5, a5, 4 ;; sub a4, a4, a5 ;; bgeu a4, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; lui t6, 1 ;; add t6, t6, a4 @@ -44,13 +44,13 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a3, 0x60(a0) +;; ld a3, 0x58(a0) ;; lui a4, 1 ;; addi a4, a4, 4 ;; sub a3, a3, a4 ;; bgeu a3, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; lui t6, 1 ;; add t6, t6, a4 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index c3dbf80876..da766020de 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -29,10 +29,10 @@ ;; add a1, a2, a4 ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x60(a0) +;; ld a4, 0x58(a0) ;; bgeu a4, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; lui a2, 0xffff ;; slli a5, a2, 4 @@ -54,10 +54,10 @@ ;; add a1, a2, a3 ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a3, 0x60(a0) +;; ld a3, 0x58(a0) ;; bgeu a3, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a3, 0x58(a0) +;; ld a3, 0x50(a0) ;; add a3, a3, a2 ;; lui a2, 0xffff ;; slli a4, a2, 4 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat index be1b49d41b..96b6bbf465 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -23,10 +23,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; bltu a2, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; sb a3, 0(a1) ;; ld ra, 8(sp) @@ -39,10 +39,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; bltu a2, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lbu a0, 0(a1) ;; ld ra, 8(sp) diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index 0f0a176035..c041c91a68 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,13 +23,13 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) +;; ld a4, 0x58(a0) ;; lui a5, 1 ;; addi a5, a5, 1 ;; sub a4, a4, a5 ;; bgeu a4, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; lui t6, 1 ;; add t6, t6, a4 @@ -44,13 +44,13 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a3, 0x60(a0) +;; ld a3, 0x58(a0) ;; lui a4, 1 ;; addi a4, a4, 1 ;; sub a3, a3, a4 ;; bgeu a3, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; lui t6, 1 ;; add t6, t6, a4 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index b838826d8f..93a28c098b 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -28,10 +28,10 @@ ;; add a5, a2, a5 ;; bgeu a5, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; bgeu a1, a5, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lui a0, 0xffff ;; slli a2, a0, 4 @@ -54,10 +54,10 @@ ;; add a5, a2, a5 ;; bgeu a5, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; bgeu a1, a5, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lui a0, 0xffff ;; slli a2, a0, 4 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat index 60defac1db..2088e81160 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a1, 0x58(a0) +;; ld a5, 0x50(a0) ;; addi a0, a1, -4 ;; sltu a0, a0, a2 ;; add a5, a5, a2 @@ -42,8 +42,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a1, 0x58(a0) +;; ld a5, 0x50(a0) ;; addi a0, a1, -4 ;; sltu a0, a0, a2 ;; add a5, a5, a2 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index ee59e68d0a..8e31e42a56 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) -;; ld a4, 0x58(a0) +;; ld a5, 0x58(a0) +;; ld a4, 0x50(a0) ;; lui a0, 1 ;; addi a0, a0, 4 ;; sub a5, a5, a0 @@ -46,8 +46,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a3, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a3, 0x50(a0) ;; lui a5, 1 ;; addi a5, a5, 4 ;; sub a4, a4, a5 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 9b41b0288a..7db51d2367 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -29,8 +29,8 @@ ;; add a5, a2, a1 ;; bgeu a5, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x60(a0) -;; ld a4, 0x58(a0) +;; ld a1, 0x58(a0) +;; ld a4, 0x50(a0) ;; sltu a0, a1, a5 ;; add a1, a4, a2 ;; lui a5, 0xffff @@ -56,8 +56,8 @@ ;; add a5, a2, a1 ;; bgeu a5, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x60(a0) -;; ld a3, 0x58(a0) +;; ld a1, 0x58(a0) +;; ld a3, 0x50(a0) ;; sltu a0, a1, a5 ;; add a1, a3, a2 ;; lui a5, 0xffff diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat index 5fafb17bab..67c247d6f6 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a1, 0x58(a0) +;; ld a5, 0x50(a0) ;; sltu a4, a2, a1 ;; xori a0, a4, 1 ;; add a5, a5, a2 @@ -42,8 +42,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a1, 0x58(a0) +;; ld a5, 0x50(a0) ;; sltu a4, a2, a1 ;; xori a0, a4, 1 ;; add a5, a5, a2 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index a7e99b1547..eb3984a490 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a5, 0x60(a0) -;; ld a4, 0x58(a0) +;; ld a5, 0x58(a0) +;; ld a4, 0x50(a0) ;; lui a0, 1 ;; addi a0, a0, 1 ;; sub a5, a5, a0 @@ -46,8 +46,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a3, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a3, 0x50(a0) ;; lui a5, 1 ;; addi a5, a5, 1 ;; sub a4, a4, a5 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 567ae0416a..db74d5f6ad 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -28,8 +28,8 @@ ;; add a4, a2, a4 ;; bgeu a4, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x60(a0) -;; ld a0, 0x58(a0) +;; ld a5, 0x58(a0) +;; ld a0, 0x50(a0) ;; sltu a4, a5, a4 ;; add a5, a0, a2 ;; lui a0, 0xffff @@ -56,8 +56,8 @@ ;; add a3, a2, a3 ;; bgeu a3, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a5, 0x50(a0) ;; sltu a4, a4, a3 ;; add a5, a5, a2 ;; lui a3, 0xffff diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index 0ba0974922..179c447f9c 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -23,10 +23,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; sw a3, 0(a1) ;; ld ra, 8(sp) @@ -39,10 +39,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lw a0, 0(a1) ;; ld ra, 8(sp) diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index 28a2b5faa9..748def8edf 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,10 +23,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lui t6, 1 ;; add t6, t6, a1 @@ -41,10 +41,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lui t6, 1 ;; add t6, t6, a1 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index ea111dc3fa..b033e0c56c 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -23,10 +23,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) +;; ld a4, 0x58(a0) ;; bgeu a4, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; lui a5, 0xffff ;; slli a5, a5, 4 @@ -42,10 +42,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a3, 0x60(a0) +;; ld a3, 0x58(a0) ;; bgeu a3, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; lui a3, 0xffff ;; slli a5, a3, 4 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 37a8594ea4..15f16421e8 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -23,10 +23,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; bltu a2, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; sb a3, 0(a1) ;; ld ra, 8(sp) @@ -39,10 +39,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; bltu a2, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lbu a0, 0(a1) ;; ld ra, 8(sp) diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index 0d4e075953..9720077807 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,10 +23,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lui t6, 1 ;; add t6, t6, a1 @@ -41,10 +41,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) +;; ld a1, 0x58(a0) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lui t6, 1 ;; add t6, t6, a1 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index 75809ca1f6..5a81f368cf 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -23,10 +23,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) +;; ld a4, 0x58(a0) ;; bgeu a4, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; lui a5, 0xffff ;; slli a5, a5, 4 @@ -42,10 +42,10 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a3, 0x60(a0) +;; ld a3, 0x58(a0) ;; bgeu a3, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; lui a3, 0xffff ;; slli a5, a3, 4 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index 7bdf0983b0..16319efc24 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a5, 0x50(a0) ;; sltu a0, a4, a2 ;; add a4, a5, a2 ;; neg a2, a0 @@ -41,8 +41,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a5, 0x50(a0) ;; sltu a0, a4, a2 ;; add a4, a5, a2 ;; neg a2, a0 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index e6962179a6..1f48692837 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a1, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a1, 0x50(a0) ;; sltu a0, a4, a2 ;; add a1, a1, a2 ;; lui a2, 1 @@ -43,8 +43,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a3, 0x60(a0) -;; ld a1, 0x58(a0) +;; ld a3, 0x58(a0) +;; ld a1, 0x50(a0) ;; sltu a0, a3, a2 ;; add a1, a1, a2 ;; lui a2, 1 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 64b7ce0efc..ea4f1d9f57 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) -;; ld a4, 0x58(a0) +;; ld a1, 0x58(a0) +;; ld a4, 0x50(a0) ;; sltu a1, a1, a2 ;; add a2, a4, a2 ;; lui a0, 0xffff @@ -44,8 +44,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) -;; ld a3, 0x58(a0) +;; ld a1, 0x58(a0) +;; ld a3, 0x50(a0) ;; sltu a1, a1, a2 ;; add a2, a3, a2 ;; lui a0, 0xffff diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index 4f17cb2cb3..aa5b739ebb 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a1, 0x58(a0) +;; ld a5, 0x50(a0) ;; sltu a4, a2, a1 ;; xori a0, a4, 1 ;; add a5, a5, a2 @@ -42,8 +42,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) -;; ld a5, 0x58(a0) +;; ld a1, 0x58(a0) +;; ld a5, 0x50(a0) ;; sltu a4, a2, a1 ;; xori a0, a4, 1 ;; add a5, a5, a2 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index e135cd6606..b120e36704 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x60(a0) -;; ld a1, 0x58(a0) +;; ld a4, 0x58(a0) +;; ld a1, 0x50(a0) ;; sltu a0, a4, a2 ;; add a1, a1, a2 ;; lui a2, 1 @@ -43,8 +43,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a3, 0x60(a0) -;; ld a1, 0x58(a0) +;; ld a3, 0x58(a0) +;; ld a1, 0x50(a0) ;; sltu a0, a3, a2 ;; add a1, a1, a2 ;; lui a2, 1 diff --git a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index bc81429662..cde26c1de1 100644 --- a/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,8 +23,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) -;; ld a4, 0x58(a0) +;; ld a1, 0x58(a0) +;; ld a4, 0x50(a0) ;; sltu a1, a1, a2 ;; add a2, a4, a2 ;; lui a0, 0xffff @@ -44,8 +44,8 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x60(a0) -;; ld a3, 0x58(a0) +;; ld a1, 0x58(a0) +;; ld a3, 0x50(a0) ;; sltu a1, a1, a2 ;; add a2, a3, a2 ;; lui a0, 0xffff diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat index eabfafea2b..fead57247a 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -30,7 +30,7 @@ ;; slli a1, a4, 2 ;; bgeu a1, a5, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a5, a0, a5 ;; sw a3, 0(a5) ;; ld ra, 8(sp) @@ -50,7 +50,7 @@ ;; slli a1, a4, 2 ;; bgeu a1, a5, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a5, a0, a5 ;; lw a0, 0(a5) ;; ld ra, 8(sp) diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index 0c77586d6d..6a44914518 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -30,7 +30,7 @@ ;; slli a1, a4, 2 ;; bgeu a1, a5, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a5, a0, a5 ;; lui t6, 1 ;; add t6, t6, a5 @@ -52,7 +52,7 @@ ;; slli a1, a4, 2 ;; bgeu a1, a5, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a5, a0, a5 ;; lui t6, 1 ;; add t6, t6, a5 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index 647a84d8cd..81d53b9a47 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -29,7 +29,7 @@ ;; addi a2, a5, -4 ;; bgeu a2, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a2, 0x58(a0) +;; ld a2, 0x50(a0) ;; add a1, a2, a1 ;; lui a0, 0xffff ;; slli a2, a0, 4 @@ -51,7 +51,7 @@ ;; addi a2, a5, -4 ;; bgeu a2, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a2, 0x58(a0) +;; ld a2, 0x50(a0) ;; add a1, a2, a1 ;; lui a0, 0xffff ;; slli a2, a0, 4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat index c75294c9bc..be68fe9ae3 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 @@ -38,7 +38,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index 2a1e8ad950..0331b7d4d0 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -29,7 +29,7 @@ ;; ld a2, 0x38(a2) ;; bgeu a2, a4, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a4, a5, a4 ;; lui t6, 1 ;; add t6, t6, a4 @@ -53,7 +53,7 @@ ;; ld a2, 0x38(a2) ;; bgeu a2, a3, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a3, a4, a3 ;; lui t6, 1 ;; add t6, t6, a3 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index 5944e2a867..2a3033b5db 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -29,7 +29,7 @@ ;; addi a2, a5, -1 ;; bgeu a2, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a2, 0x58(a0) +;; ld a2, 0x50(a0) ;; add a1, a2, a1 ;; lui a0, 0xffff ;; slli a2, a0, 4 @@ -51,7 +51,7 @@ ;; addi a2, a5, -1 ;; bgeu a2, a1, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a2, 0x58(a0) +;; ld a2, 0x50(a0) ;; add a1, a2, a1 ;; lui a0, 0xffff ;; slli a2, a0, 4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat index 8e1389ac4f..4fe1622428 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -29,7 +29,7 @@ ;; addi a2, a1, -1 ;; slli a5, a2, 2 ;; sltu a2, a5, a4 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a4, a5, a4 ;; neg a0, a2 ;; not a2, a0 @@ -51,7 +51,7 @@ ;; addi a2, a1, -1 ;; slli a4, a2, 2 ;; sltu a2, a4, a3 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a3, a4, a3 ;; neg a0, a2 ;; not a2, a0 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index b97170b8da..9a4c3da3d5 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -29,7 +29,7 @@ ;; addi a4, a2, -0x401 ;; slli a1, a4, 2 ;; sltu a4, a1, a5 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a5, a0, a5 ;; lui a0, 1 ;; add a5, a5, a0 @@ -53,7 +53,7 @@ ;; addi a4, a2, -0x401 ;; slli a1, a4, 2 ;; sltu a4, a1, a5 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a5, a0, a5 ;; lui a0, 1 ;; add a5, a5, a0 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 61c6fe0df9..50f23512e5 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -28,7 +28,7 @@ ;; lui a4, 0x10 ;; addi a1, a4, -4 ;; sltu a4, a1, a5 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a5, a0, a5 ;; lui a0, 0xffff ;; slli a0, a0, 4 @@ -52,7 +52,7 @@ ;; lui a3, 0x10 ;; addi a1, a3, -4 ;; sltu a4, a1, a5 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a5, a0, a5 ;; lui a3, 0xffff ;; slli a0, a3, 4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat index ff49d46466..41173152c8 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 @@ -38,7 +38,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index c1957d7bc7..c482028786 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -28,7 +28,7 @@ ;; auipc a2, 0 ;; ld a2, 0x40(a2) ;; sltu a2, a2, a4 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a4, a5, a4 ;; lui a5, 1 ;; add a4, a4, a5 @@ -54,7 +54,7 @@ ;; auipc a2, 0 ;; ld a2, 0x40(a2) ;; sltu a2, a2, a3 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a3, a4, a3 ;; lui a4, 1 ;; add a3, a3, a4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index f8ad006f37..7a71a64bb7 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -28,7 +28,7 @@ ;; lui a4, 0x10 ;; addi a1, a4, -1 ;; sltu a4, a1, a5 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a5, a0, a5 ;; lui a0, 0xffff ;; slli a0, a0, 4 @@ -52,7 +52,7 @@ ;; lui a3, 0x10 ;; addi a1, a3, -1 ;; sltu a4, a1, a5 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a5, a0, a5 ;; lui a3, 0xffff ;; slli a0, a3, 4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index a03e1f1186..e897a6fc1a 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 @@ -38,7 +38,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index c71424d314..29d1cf80bd 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 @@ -40,7 +40,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index e19f39a0df..3a43c27a48 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; slli a5, a2, 0x20 ;; srli a5, a5, 0x20 ;; add a4, a4, a5 @@ -41,7 +41,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; slli a3, a2, 0x20 ;; srli a5, a3, 0x20 ;; add a4, a4, a5 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index f388ecabf2..d4fe772d04 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 @@ -38,7 +38,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index 9dad828fb4..2b40b8f94e 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 @@ -40,7 +40,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index 5a3058638d..1fd42bc96b 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; slli a5, a2, 0x20 ;; srli a5, a5, 0x20 ;; add a4, a4, a5 @@ -41,7 +41,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; slli a3, a2, 0x20 ;; srli a5, a3, 0x20 ;; add a4, a4, a5 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index 7dadcabc52..accd5dfa1d 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 @@ -38,7 +38,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index 3cb6b0bc1c..e2ed29c4ad 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 @@ -40,7 +40,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index c0dac22811..4c973e80e9 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; slli a5, a2, 0x20 ;; srli a5, a5, 0x20 ;; add a4, a4, a5 @@ -41,7 +41,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; slli a3, a2, 0x20 ;; srli a5, a3, 0x20 ;; add a4, a4, a5 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index 5010c14686..816a9bdd07 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 @@ -38,7 +38,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index f3cce262d2..73ff5da028 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 @@ -40,7 +40,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; slli a0, a2, 0x20 ;; srli a2, a0, 0x20 ;; add a1, a1, a2 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 2e3d23253b..6016304e89 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; slli a5, a2, 0x20 ;; srli a5, a5, 0x20 ;; add a4, a4, a5 @@ -41,7 +41,7 @@ ;; sd ra, 8(sp) ;; sd s0, 0(sp) ;; mv s0, sp -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; slli a3, a2, 0x20 ;; srli a5, a3, 0x20 ;; add a4, a4, a5 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat index 8c838d93d2..342c38025b 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -28,7 +28,7 @@ ;; slli a4, a4, 2 ;; bgeu a4, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; sw a3, 0(a4) ;; ld ra, 8(sp) @@ -46,7 +46,7 @@ ;; slli a4, a3, 2 ;; bgeu a4, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a3, 0x58(a0) +;; ld a3, 0x50(a0) ;; add a3, a3, a2 ;; lw a0, 0(a3) ;; ld ra, 8(sp) diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index e510a01243..b0cd2786cc 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -28,7 +28,7 @@ ;; slli a4, a4, 2 ;; bgeu a4, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; lui t6, 1 ;; add t6, t6, a4 @@ -48,7 +48,7 @@ ;; slli a4, a3, 2 ;; bgeu a4, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a3, 0x58(a0) +;; ld a3, 0x50(a0) ;; add a3, a3, a2 ;; lui t6, 1 ;; add t6, t6, a3 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index e93be0131f..cf80abd9e3 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -27,7 +27,7 @@ ;; addi a5, a4, -4 ;; bgeu a5, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a2 ;; lui a4, 0xffff ;; slli a0, a4, 4 @@ -47,7 +47,7 @@ ;; addi a5, a3, -4 ;; bgeu a5, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a2 ;; lui a4, 0xffff ;; slli a0, a4, 4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat index 21de375aff..b6edc090f0 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -27,7 +27,7 @@ ;; ld a1, 0x30(a1) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; sb a3, 0(a1) ;; ld ra, 8(sp) @@ -47,7 +47,7 @@ ;; ld a1, 0x30(a1) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lbu a0, 0(a1) ;; ld ra, 8(sp) diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index f5b7509c0c..88e57562b5 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -27,7 +27,7 @@ ;; ld a1, 0x38(a1) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lui t6, 1 ;; add t6, t6, a1 @@ -49,7 +49,7 @@ ;; ld a1, 0x38(a1) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lui t6, 1 ;; add t6, t6, a1 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index 8512f1c776..00c75325bc 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -27,7 +27,7 @@ ;; addi a5, a4, -1 ;; bgeu a5, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a2 ;; lui a4, 0xffff ;; slli a0, a4, 4 @@ -47,7 +47,7 @@ ;; addi a5, a3, -1 ;; bgeu a5, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a2 ;; lui a4, 0xffff ;; slli a0, a4, 4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat index d0942d1a4c..bb8d15d6af 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -27,7 +27,7 @@ ;; addi a1, a4, -1 ;; slli a4, a1, 2 ;; sltu a1, a4, a2 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a2 ;; neg a4, a1 ;; not a1, a4 @@ -47,7 +47,7 @@ ;; addi a1, a4, -1 ;; slli a3, a1, 2 ;; sltu a1, a3, a2 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a2 ;; neg a4, a1 ;; not a1, a4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index cc42e6428a..0db1987d54 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -27,7 +27,7 @@ ;; addi a4, a1, -0x401 ;; slli a4, a4, 2 ;; sltu a4, a4, a2 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a2, a5, a2 ;; lui a5, 1 ;; add a2, a2, a5 @@ -49,7 +49,7 @@ ;; addi a3, a1, -0x401 ;; slli a4, a3, 2 ;; sltu a3, a4, a2 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a2, a4, a2 ;; lui a4, 1 ;; add a2, a2, a4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index cad88c0502..72db7393c5 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -26,7 +26,7 @@ ;; lui a1, 0x10 ;; addi a4, a1, -4 ;; sltu a4, a4, a2 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a2, a5, a2 ;; lui a1, 0xffff ;; slli a5, a1, 4 @@ -48,7 +48,7 @@ ;; lui a1, 0x10 ;; addi a3, a1, -4 ;; sltu a3, a3, a2 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a2, a4, a2 ;; lui a1, 0xffff ;; slli a4, a1, 4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat index 9f5d92c997..35c669a345 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -26,7 +26,7 @@ ;; auipc a4, 0 ;; ld a4, 0x38(a4) ;; sltu a4, a4, a2 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a2 ;; neg a2, a4 ;; not a4, a2 @@ -48,7 +48,7 @@ ;; auipc a4, 0 ;; ld a4, 0x38(a4) ;; sltu a4, a4, a2 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a2 ;; neg a2, a4 ;; not a4, a2 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index 0187cc5897..888a5d6af2 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -26,7 +26,7 @@ ;; auipc a1, 0 ;; ld a1, 0x40(a1) ;; sltu a4, a1, a2 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a2 ;; lui a1, 1 ;; add a1, a0, a1 @@ -50,7 +50,7 @@ ;; auipc a1, 0 ;; ld a1, 0x40(a1) ;; sltu a3, a1, a2 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a2 ;; lui a1, 1 ;; add a1, a0, a1 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index b769f30652..83dcf13ef9 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -26,7 +26,7 @@ ;; lui a1, 0x10 ;; addi a4, a1, -1 ;; sltu a4, a4, a2 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a2, a5, a2 ;; lui a1, 0xffff ;; slli a5, a1, 4 @@ -48,7 +48,7 @@ ;; lui a1, 0x10 ;; addi a3, a1, -1 ;; sltu a3, a3, a2 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a2, a4, a2 ;; lui a1, 0xffff ;; slli a4, a1, 4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index 391768c099..4f1b466f89 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -28,7 +28,7 @@ ;; slli a4, a4, 2 ;; bgeu a4, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; sw a3, 0(a4) ;; ld ra, 8(sp) @@ -46,7 +46,7 @@ ;; slli a4, a3, 2 ;; bgeu a4, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a3, 0x58(a0) +;; ld a3, 0x50(a0) ;; add a3, a3, a2 ;; lw a0, 0(a3) ;; ld ra, 8(sp) diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index 2cc4a70dbc..27ebb60d9a 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -28,7 +28,7 @@ ;; slli a4, a4, 2 ;; bgeu a4, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a4, a4, a2 ;; lui t6, 1 ;; add t6, t6, a4 @@ -48,7 +48,7 @@ ;; slli a4, a3, 2 ;; bgeu a4, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a3, 0x58(a0) +;; ld a3, 0x50(a0) ;; add a3, a3, a2 ;; lui t6, 1 ;; add t6, t6, a3 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 7aef31e3a4..d5629d49fe 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -27,7 +27,7 @@ ;; addi a5, a4, -4 ;; bgeu a5, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a2 ;; lui a4, 0xffff ;; slli a0, a4, 4 @@ -47,7 +47,7 @@ ;; addi a5, a3, -4 ;; bgeu a5, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a2 ;; lui a4, 0xffff ;; slli a0, a4, 4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index ee28aaea08..79db9fb173 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -27,7 +27,7 @@ ;; ld a1, 0x30(a1) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; sb a3, 0(a1) ;; ld ra, 8(sp) @@ -47,7 +47,7 @@ ;; ld a1, 0x30(a1) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lbu a0, 0(a1) ;; ld ra, 8(sp) diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index 1c9eb331f3..0a014409ed 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -27,7 +27,7 @@ ;; ld a1, 0x38(a1) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lui t6, 1 ;; add t6, t6, a1 @@ -49,7 +49,7 @@ ;; ld a1, 0x38(a1) ;; bgeu a1, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a1, 0x58(a0) +;; ld a1, 0x50(a0) ;; add a1, a1, a2 ;; lui t6, 1 ;; add t6, t6, a1 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index c99f99996d..ca6798bf25 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -27,7 +27,7 @@ ;; addi a5, a4, -1 ;; bgeu a5, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a2 ;; lui a4, 0xffff ;; slli a0, a4, 4 @@ -47,7 +47,7 @@ ;; addi a5, a3, -1 ;; bgeu a5, a2, 8 ;; .byte 0x00, 0x00, 0x00, 0x00 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a2 ;; lui a4, 0xffff ;; slli a0, a4, 4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index 20013cd579..97a1c15c7d 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -27,7 +27,7 @@ ;; addi a1, a4, -1 ;; slli a4, a1, 2 ;; sltu a1, a4, a2 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a2 ;; neg a4, a1 ;; not a1, a4 @@ -47,7 +47,7 @@ ;; addi a1, a4, -1 ;; slli a3, a1, 2 ;; sltu a1, a3, a2 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a2 ;; neg a4, a1 ;; not a1, a4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index a7bf2eb472..e045f66cfd 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -27,7 +27,7 @@ ;; addi a4, a1, -0x401 ;; slli a4, a4, 2 ;; sltu a4, a4, a2 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a2, a5, a2 ;; lui a5, 1 ;; add a2, a2, a5 @@ -49,7 +49,7 @@ ;; addi a3, a1, -0x401 ;; slli a4, a3, 2 ;; sltu a3, a4, a2 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a2, a4, a2 ;; lui a4, 1 ;; add a2, a2, a4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index e65a9b360d..25de228ada 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -26,7 +26,7 @@ ;; lui a1, 0x10 ;; addi a4, a1, -4 ;; sltu a4, a4, a2 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a2, a5, a2 ;; lui a1, 0xffff ;; slli a5, a1, 4 @@ -48,7 +48,7 @@ ;; lui a1, 0x10 ;; addi a3, a1, -4 ;; sltu a3, a3, a2 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a2, a4, a2 ;; lui a1, 0xffff ;; slli a4, a1, 4 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index 2adcccb029..323f300d54 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -26,7 +26,7 @@ ;; auipc a4, 0 ;; ld a4, 0x38(a4) ;; sltu a4, a4, a2 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a2 ;; neg a2, a4 ;; not a4, a2 @@ -48,7 +48,7 @@ ;; auipc a4, 0 ;; ld a4, 0x38(a4) ;; sltu a4, a4, a2 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a5, a5, a2 ;; neg a2, a4 ;; not a4, a2 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index e0d1fabda5..0938b80d43 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -26,7 +26,7 @@ ;; auipc a1, 0 ;; ld a1, 0x40(a1) ;; sltu a4, a1, a2 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a2 ;; lui a1, 1 ;; add a1, a0, a1 @@ -50,7 +50,7 @@ ;; auipc a1, 0 ;; ld a1, 0x40(a1) ;; sltu a3, a1, a2 -;; ld a0, 0x58(a0) +;; ld a0, 0x50(a0) ;; add a0, a0, a2 ;; lui a1, 1 ;; add a1, a0, a1 diff --git a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 593b010d0b..ab72894678 100644 --- a/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/riscv64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -26,7 +26,7 @@ ;; lui a1, 0x10 ;; addi a4, a1, -1 ;; sltu a4, a4, a2 -;; ld a5, 0x58(a0) +;; ld a5, 0x50(a0) ;; add a2, a5, a2 ;; lui a1, 0xffff ;; slli a5, a1, 4 @@ -48,7 +48,7 @@ ;; lui a1, 0x10 ;; addi a3, a1, -1 ;; sltu a3, a3, a2 -;; ld a4, 0x58(a0) +;; ld a4, 0x50(a0) ;; add a2, a4, a2 ;; lui a1, 0xffff ;; slli a4, a1, 4 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat index aaab5db99a..00f701be2b 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -28,12 +28,12 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r6, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r6 ;; aghi %r4, -4 ;; clgr %r3, %r4 ;; jgh 0x40 -;; lg %r6, 0x58(%r2) +;; lg %r6, 0x50(%r2) ;; strv %r5, 0(%r3, %r6) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 @@ -48,12 +48,12 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r5, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r5 ;; aghi %r4, -4 ;; clgr %r3, %r4 ;; jgh 0x98 -;; lg %r5, 0x58(%r2) +;; lg %r5, 0x50(%r2) ;; lrv %r2, 0(%r3, %r5) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index bdb553ed1e..f084a71e96 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -28,12 +28,12 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r6, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r6 ;; aghi %r4, -0x1004 ;; clgr %r3, %r4 ;; jgh 0x40 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; lghi %r6, 0x1000 ;; strv %r5, 0(%r6, %r3) ;; lmg %r14, %r15, 0x110(%r15) @@ -49,12 +49,12 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r6, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r6 ;; aghi %r4, -0x1004 ;; clgr %r3, %r4 ;; jgh 0x9c -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; lghi %r6, 0x1000 ;; lrv %r2, 0(%r6, %r3) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index e544f24211..434bd3019e 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -32,10 +32,10 @@ ;; llilf %r4, 0xffff0004 ;; algfr %r4, %r3 ;; jgnle 0x3c -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; clgr %r4, %r6 ;; jgh 0x4c -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; strv %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -55,10 +55,10 @@ ;; llilf %r4, 0xffff0004 ;; algfr %r4, %r3 ;; jgnle 0xa4 -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; clgr %r4, %r6 ;; jgh 0xb4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; lrv %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat index a18735fd7e..25e8fb2938 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -28,11 +28,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r6, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r6 ;; clgr %r3, %r4 ;; jghe 0x3c -;; lg %r4, 0x58(%r2) +;; lg %r4, 0x50(%r2) ;; stc %r5, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 @@ -47,11 +47,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r5, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r5 ;; clgr %r3, %r4 ;; jghe 0x90 -;; lg %r4, 0x58(%r2) +;; lg %r4, 0x50(%r2) ;; llc %r2, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index aa2f9c4224..cbc372495e 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -28,12 +28,12 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r6, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r6 ;; aghi %r4, -0x1001 ;; clgr %r3, %r4 ;; jgh 0x40 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; lghi %r6, 0x1000 ;; stc %r5, 0(%r6, %r3) ;; lmg %r14, %r15, 0x110(%r15) @@ -49,12 +49,12 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r6, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r6 ;; aghi %r4, -0x1001 ;; clgr %r3, %r4 ;; jgh 0x9c -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; lghi %r6, 0x1000 ;; llc %r2, 0(%r6, %r3) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index 292c6fca24..246a43206c 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -32,10 +32,10 @@ ;; llilf %r4, 0xffff0001 ;; algfr %r4, %r3 ;; jgnle 0x3c -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; clgr %r4, %r6 ;; jgh 0x4c -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; stc %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -55,10 +55,10 @@ ;; llilf %r4, 0xffff0001 ;; algfr %r4, %r3 ;; jgnle 0xa4 -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; clgr %r4, %r6 ;; jgh 0xb4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; llc %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat index 89e29c82be..e3d41fffca 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -27,12 +27,12 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; llgfr %r6, %r4 ;; aghik %r3, %r7, -4 ;; lghi %r7, 0 ;; lgr %r4, %r6 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; clgr %r6, %r3 ;; locgrh %r4, %r7 ;; strv %r5, 0(%r4) @@ -48,12 +48,12 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; llgfr %r5, %r4 ;; aghik %r7, %r6, -4 ;; lghi %r6, 0 ;; lgr %r4, %r5 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; clgr %r5, %r7 ;; locgrh %r4, %r6 ;; lrv %r2, 0(%r4) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index 6e9a3c0587..4403b74b70 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -27,12 +27,12 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; llgfr %r6, %r4 ;; aghik %r3, %r7, -0x1004 ;; lghi %r7, 0 ;; lgr %r4, %r6 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; aghik %r2, %r4, 0x1000 ;; clgr %r6, %r3 ;; locgrh %r2, %r7 @@ -49,12 +49,12 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; llgfr %r6, %r4 ;; aghik %r3, %r7, -0x1004 ;; lghi %r7, 0 ;; lgr %r4, %r6 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; aghik %r5, %r4, 0x1000 ;; clgr %r6, %r3 ;; locgrh %r5, %r7 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index e631e543f5..aa553008e8 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -31,9 +31,9 @@ ;; llilf %r7, 0xffff0004 ;; algfr %r7, %r4 ;; jgnle 0x38 -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; lghi %r4, 0 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r2, %r3, %r2 ;; clgr %r7, %r6 @@ -55,9 +55,9 @@ ;; llilf %r7, 0xffff0004 ;; algfr %r7, %r4 ;; jgnle 0xa4 -;; lg %r5, 0x60(%r2) +;; lg %r5, 0x58(%r2) ;; lghi %r4, 0 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; llilh %r6, 0xffff ;; agrk %r2, %r3, %r6 ;; clgr %r7, %r5 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat index 84a30ebcf0..48bded156b 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -27,11 +27,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r9, 0x60(%r2) +;; lg %r9, 0x58(%r2) ;; llgfr %r7, %r4 ;; lghi %r6, 0 ;; lgr %r3, %r7 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; clgr %r7, %r9 ;; locgrhe %r3, %r6 ;; stc %r5, 0(%r3) @@ -47,11 +47,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; llgfr %r6, %r4 ;; lghi %r5, 0 ;; lgr %r3, %r6 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; clgr %r6, %r7 ;; locgrhe %r3, %r5 ;; llc %r2, 0(%r3) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index d3acf202bf..dad3b03c8f 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -27,12 +27,12 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; llgfr %r6, %r4 ;; aghik %r3, %r7, -0x1001 ;; lghi %r7, 0 ;; lgr %r4, %r6 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; aghik %r2, %r4, 0x1000 ;; clgr %r6, %r3 ;; locgrh %r2, %r7 @@ -49,12 +49,12 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; llgfr %r6, %r4 ;; aghik %r3, %r7, -0x1001 ;; lghi %r7, 0 ;; lgr %r4, %r6 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; aghik %r5, %r4, 0x1000 ;; clgr %r6, %r3 ;; locgrh %r5, %r7 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 8d5d76140c..39834a459e 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -31,9 +31,9 @@ ;; llilf %r7, 0xffff0001 ;; algfr %r7, %r4 ;; jgnle 0x38 -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; lghi %r4, 0 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r2, %r3, %r2 ;; clgr %r7, %r6 @@ -55,9 +55,9 @@ ;; llilf %r7, 0xffff0001 ;; algfr %r7, %r4 ;; jgnle 0xa0 -;; lg %r5, 0x60(%r2) +;; lg %r5, 0x58(%r2) ;; lghi %r4, 0 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; llilh %r6, 0xffff ;; agrk %r2, %r3, %r6 ;; clgr %r7, %r5 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index 0995ba1ad7..0743631f86 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -28,11 +28,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r6, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r6 ;; clgr %r3, %r4 ;; jgh 0x3c -;; lg %r4, 0x58(%r2) +;; lg %r4, 0x50(%r2) ;; strv %r5, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 @@ -47,11 +47,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r5, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r5 ;; clgr %r3, %r4 ;; jgh 0x90 -;; lg %r4, 0x58(%r2) +;; lg %r4, 0x50(%r2) ;; lrv %r2, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index c795196edc..2cf6765737 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -28,11 +28,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r6, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r6 ;; clgr %r3, %r4 ;; jgh 0x3c -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; lghi %r6, 0x1000 ;; strv %r5, 0(%r6, %r3) ;; lmg %r14, %r15, 0x110(%r15) @@ -48,11 +48,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r5, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r5 ;; clgr %r3, %r4 ;; jgh 0x94 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; lghi %r5, 0x1000 ;; lrv %r2, 0(%r5, %r3) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 594e51e129..6c6700ae72 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -28,11 +28,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r6, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r6 ;; clgr %r3, %r4 ;; jgh 0x3c -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; llilh %r6, 0xffff ;; strv %r5, 0(%r6, %r3) ;; lmg %r14, %r15, 0x110(%r15) @@ -48,11 +48,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r5, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r5 ;; clgr %r3, %r4 ;; jgh 0x94 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; llilh %r5, 0xffff ;; lrv %r2, 0(%r5, %r3) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 9742211c5b..151f71c3d7 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -28,11 +28,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r6, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r6 ;; clgr %r3, %r4 ;; jghe 0x3c -;; lg %r4, 0x58(%r2) +;; lg %r4, 0x50(%r2) ;; stc %r5, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 @@ -47,11 +47,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r5, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r5 ;; clgr %r3, %r4 ;; jghe 0x90 -;; lg %r4, 0x58(%r2) +;; lg %r4, 0x50(%r2) ;; llc %r2, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index f635eda6f5..612fb8f509 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -28,11 +28,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r6, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r6 ;; clgr %r3, %r4 ;; jgh 0x3c -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; lghi %r6, 0x1000 ;; stc %r5, 0(%r6, %r3) ;; lmg %r14, %r15, 0x110(%r15) @@ -48,11 +48,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r5, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r5 ;; clgr %r3, %r4 ;; jgh 0x94 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; lghi %r5, 0x1000 ;; llc %r2, 0(%r5, %r3) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index 76d68755af..d08cca1d9d 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -28,11 +28,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r6, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r6 ;; clgr %r3, %r4 ;; jgh 0x3c -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; llilh %r6, 0xffff ;; stc %r5, 0(%r6, %r3) ;; lmg %r14, %r15, 0x110(%r15) @@ -48,11 +48,11 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; lgr %r5, %r4 -;; lg %r4, 0x60(%r2) +;; lg %r4, 0x58(%r2) ;; llgfr %r3, %r5 ;; clgr %r3, %r4 ;; jgh 0x94 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; llilh %r5, 0xffff ;; llc %r2, 0(%r5, %r3) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index b57360340f..4e73aff190 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -27,11 +27,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r9, 0x60(%r2) +;; lg %r9, 0x58(%r2) ;; llgfr %r7, %r4 ;; lghi %r6, 0 ;; lgr %r3, %r7 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; clgr %r7, %r9 ;; locgrh %r3, %r6 ;; strv %r5, 0(%r3) @@ -47,11 +47,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; llgfr %r6, %r4 ;; lghi %r5, 0 ;; lgr %r3, %r6 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; clgr %r6, %r7 ;; locgrh %r3, %r5 ;; lrv %r2, 0(%r3) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index 07f95661dc..2b435c6c4d 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -27,11 +27,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; llgfr %r3, %r4 ;; lghi %r7, 0 ;; lgr %r4, %r3 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; aghi %r4, 0x1000 ;; clgr %r3, %r6 ;; locgrh %r4, %r7 @@ -48,11 +48,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r5, 0x60(%r2) +;; lg %r5, 0x58(%r2) ;; llgfr %r7, %r4 ;; lghi %r6, 0 ;; lgr %r3, %r7 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; aghik %r4, %r3, 0x1000 ;; clgr %r7, %r5 ;; locgrh %r4, %r6 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 02e63b6a2c..b50b5b1e84 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -27,13 +27,13 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; lgr %r3, %r2 ;; llgfr %r2, %r4 ;; lghi %r7, 0 ;; lgr %r4, %r3 ;; lgr %r3, %r2 -;; ag %r3, 0x58(%r4) +;; ag %r3, 0x50(%r4) ;; llilh %r4, 0xffff ;; agr %r3, %r4 ;; clgr %r2, %r6 @@ -51,13 +51,13 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; lgr %r3, %r2 ;; llgfr %r2, %r4 ;; lghi %r7, 0 ;; lgr %r4, %r3 ;; lgr %r3, %r2 -;; ag %r3, 0x58(%r4) +;; ag %r3, 0x50(%r4) ;; llilh %r4, 0xffff ;; agrk %r5, %r3, %r4 ;; clgr %r2, %r6 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index 0aa0274b9b..d04cd2cdf8 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -27,11 +27,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r9, 0x60(%r2) +;; lg %r9, 0x58(%r2) ;; llgfr %r7, %r4 ;; lghi %r6, 0 ;; lgr %r3, %r7 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; clgr %r7, %r9 ;; locgrhe %r3, %r6 ;; stc %r5, 0(%r3) @@ -47,11 +47,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; llgfr %r6, %r4 ;; lghi %r5, 0 ;; lgr %r3, %r6 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; clgr %r6, %r7 ;; locgrhe %r3, %r5 ;; llc %r2, 0(%r3) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 547a22e64a..2252d3d214 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -27,11 +27,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; llgfr %r3, %r4 ;; lghi %r7, 0 ;; lgr %r4, %r3 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; aghi %r4, 0x1000 ;; clgr %r3, %r6 ;; locgrh %r4, %r7 @@ -48,11 +48,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r5, 0x60(%r2) +;; lg %r5, 0x58(%r2) ;; llgfr %r7, %r4 ;; lghi %r6, 0 ;; lgr %r3, %r7 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; aghik %r4, %r3, 0x1000 ;; clgr %r7, %r5 ;; locgrh %r4, %r6 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index fe3852f41e..9b8a8af43a 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -27,13 +27,13 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; lgr %r3, %r2 ;; llgfr %r2, %r4 ;; lghi %r7, 0 ;; lgr %r4, %r3 ;; lgr %r3, %r2 -;; ag %r3, 0x58(%r4) +;; ag %r3, 0x50(%r4) ;; llilh %r4, 0xffff ;; agr %r3, %r4 ;; clgr %r2, %r6 @@ -51,13 +51,13 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; lgr %r3, %r2 ;; llgfr %r2, %r4 ;; lghi %r7, 0 ;; lgr %r4, %r3 ;; lgr %r3, %r2 -;; ag %r3, 0x58(%r4) +;; ag %r3, 0x50(%r4) ;; llilh %r4, 0xffff ;; agrk %r5, %r3, %r4 ;; clgr %r2, %r6 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat index 6c78e18070..57c7286e19 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -27,11 +27,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; aghi %r3, -4 ;; clgr %r4, %r3 ;; jgh 0x38 -;; lg %r6, 0x58(%r2) +;; lg %r6, 0x50(%r2) ;; strv %r5, 0(%r4, %r6) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 @@ -45,11 +45,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; aghi %r3, -4 ;; clgr %r4, %r3 ;; jgh 0x88 -;; lg %r5, 0x58(%r2) +;; lg %r5, 0x50(%r2) ;; lrv %r2, 0(%r4, %r5) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index 9e95f50290..70d3e80f13 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -27,11 +27,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; aghi %r3, -0x1004 ;; clgr %r4, %r3 ;; jgh 0x38 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r6, 0x1000 ;; strv %r5, 0(%r6, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -46,11 +46,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; aghi %r3, -0x1004 ;; clgr %r4, %r3 ;; jgh 0x8c -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r5, 0x1000 ;; lrv %r2, 0(%r5, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index 246e7f3795..8cd45d30d1 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -30,10 +30,10 @@ ;; lgr %r3, %r4 ;; algfi %r3, 0xffff0004 ;; jgnle 0x34 -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; clgr %r3, %r6 ;; jgh 0x44 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r6, 0xffff ;; strv %r5, 0(%r6, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -51,10 +51,10 @@ ;; lgr %r3, %r4 ;; algfi %r3, 0xffff0004 ;; jgnle 0x94 -;; lg %r5, 0x60(%r2) +;; lg %r5, 0x58(%r2) ;; clgr %r3, %r5 ;; jgh 0xa4 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r6, 0xffff ;; lrv %r2, 0(%r6, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat index 181822dc0a..e4f1465749 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; clgr %r4, %r7 ;; jghe 0x34 -;; lg %r3, 0x58(%r2) +;; lg %r3, 0x50(%r2) ;; stc %r5, 0(%r4, %r3) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 @@ -44,10 +44,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; clgr %r4, %r7 ;; jghe 0x80 -;; lg %r3, 0x58(%r2) +;; lg %r3, 0x50(%r2) ;; llc %r2, 0(%r4, %r3) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index f9dee716b9..25cb9fd5fe 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -27,11 +27,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; aghi %r3, -0x1001 ;; clgr %r4, %r3 ;; jgh 0x38 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r6, 0x1000 ;; stc %r5, 0(%r6, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -46,11 +46,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; aghi %r3, -0x1001 ;; clgr %r4, %r3 ;; jgh 0x8c -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r5, 0x1000 ;; llc %r2, 0(%r5, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index ebff0c9091..71b6436c27 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -30,10 +30,10 @@ ;; lgr %r3, %r4 ;; algfi %r3, 0xffff0001 ;; jgnle 0x34 -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; clgr %r3, %r6 ;; jgh 0x44 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r6, 0xffff ;; stc %r5, 0(%r6, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -51,10 +51,10 @@ ;; lgr %r3, %r4 ;; algfi %r3, 0xffff0001 ;; jgnle 0x94 -;; lg %r5, 0x60(%r2) +;; lg %r5, 0x58(%r2) ;; clgr %r3, %r5 ;; jgh 0xa4 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r6, 0xffff ;; llc %r2, 0(%r6, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat index 4d0473c667..dba7b07945 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -27,11 +27,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; aghik %r7, %r6, -4 ;; lghi %r6, 0 ;; lgr %r3, %r4 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; clgr %r4, %r7 ;; locgrh %r3, %r6 ;; strv %r5, 0(%r3) @@ -47,11 +47,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r5, 0x60(%r2) +;; lg %r5, 0x58(%r2) ;; aghik %r6, %r5, -4 ;; lghi %r5, 0 ;; lgr %r3, %r4 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; clgr %r4, %r6 ;; locgrh %r3, %r5 ;; lrv %r2, 0(%r3) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index 8269c624df..e9fb2836a4 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -27,11 +27,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; aghik %r7, %r6, -0x1004 ;; lghi %r6, 0 ;; lgr %r3, %r4 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; aghik %r2, %r3, 0x1000 ;; clgr %r4, %r7 ;; locgrh %r2, %r6 @@ -48,11 +48,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r5, 0x60(%r2) +;; lg %r5, 0x58(%r2) ;; aghik %r6, %r5, -0x1004 ;; lghi %r5, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; aghi %r7, 0x1000 ;; clgr %r4, %r6 ;; locgrh %r7, %r5 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 89155e9fd5..bde6232fb5 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -30,9 +30,9 @@ ;; lgr %r6, %r4 ;; algfi %r6, 0xffff0004 ;; jgnle 0x34 -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; lghi %r7, 0 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r2, %r4, %r2 ;; clgr %r6, %r3 @@ -53,9 +53,9 @@ ;; lgr %r6, %r4 ;; algfi %r6, 0xffff0004 ;; jgnle 0x9c -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; lghi %r7, 0 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r2, %r4, %r2 ;; clgr %r6, %r3 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat index 3e3d6d0991..e7a317fddc 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; lghi %r3, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; clgr %r4, %r6 ;; locgrhe %r7, %r3 ;; stc %r5, 0(%r7) @@ -46,10 +46,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r5, 0x60(%r2) +;; lg %r5, 0x58(%r2) ;; lghi %r3, 0 ;; lgr %r6, %r4 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; clgr %r4, %r5 ;; locgrhe %r6, %r3 ;; llc %r2, 0(%r6) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index 74c0ca62cd..06188274b5 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -27,11 +27,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; aghik %r7, %r6, -0x1001 ;; lghi %r6, 0 ;; lgr %r3, %r4 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; aghik %r2, %r3, 0x1000 ;; clgr %r4, %r7 ;; locgrh %r2, %r6 @@ -48,11 +48,11 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r5, 0x60(%r2) +;; lg %r5, 0x58(%r2) ;; aghik %r6, %r5, -0x1001 ;; lghi %r5, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; aghi %r7, 0x1000 ;; clgr %r4, %r6 ;; locgrh %r7, %r5 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index c26ab873ee..0167501f3d 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -30,9 +30,9 @@ ;; lgr %r6, %r4 ;; algfi %r6, 0xffff0001 ;; jgnle 0x34 -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; lghi %r7, 0 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r2, %r4, %r2 ;; clgr %r6, %r3 @@ -53,9 +53,9 @@ ;; lgr %r6, %r4 ;; algfi %r6, 0xffff0001 ;; jgnle 0x98 -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; lghi %r7, 0 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r2, %r4, %r2 ;; clgr %r6, %r3 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index 3cedf46b0f..fce055ac36 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; clgr %r4, %r7 ;; jgh 0x34 -;; lg %r3, 0x58(%r2) +;; lg %r3, 0x50(%r2) ;; strv %r5, 0(%r4, %r3) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 @@ -44,10 +44,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; clgr %r4, %r7 ;; jgh 0x80 -;; lg %r3, 0x58(%r2) +;; lg %r3, 0x50(%r2) ;; lrv %r2, 0(%r4, %r3) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index f99ae6e75c..b218c63303 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; clgr %r4, %r3 ;; jgh 0x34 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r6, 0x1000 ;; strv %r5, 0(%r6, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -45,10 +45,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; clgr %r4, %r3 ;; jgh 0x84 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r5, 0x1000 ;; lrv %r2, 0(%r5, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 848a606a3e..822f9a2211 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; clgr %r4, %r3 ;; jgh 0x34 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r6, 0xffff ;; strv %r5, 0(%r6, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -45,10 +45,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; clgr %r4, %r3 ;; jgh 0x84 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r5, 0xffff ;; lrv %r2, 0(%r5, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 93007b2368..5b1537ac48 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; clgr %r4, %r7 ;; jghe 0x34 -;; lg %r3, 0x58(%r2) +;; lg %r3, 0x50(%r2) ;; stc %r5, 0(%r4, %r3) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 @@ -44,10 +44,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; clgr %r4, %r7 ;; jghe 0x80 -;; lg %r3, 0x58(%r2) +;; lg %r3, 0x50(%r2) ;; llc %r2, 0(%r4, %r3) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index 5e6508e9e6..ba7dd0f2a7 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; clgr %r4, %r3 ;; jgh 0x34 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r6, 0x1000 ;; stc %r5, 0(%r6, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -45,10 +45,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; clgr %r4, %r3 ;; jgh 0x84 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r5, 0x1000 ;; llc %r2, 0(%r5, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index 3fdbf89efe..22f23dc056 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; clgr %r4, %r3 ;; jgh 0x34 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r6, 0xffff ;; stc %r5, 0(%r6, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -45,10 +45,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r3, 0x60(%r2) +;; lg %r3, 0x58(%r2) ;; clgr %r4, %r3 ;; jgh 0x84 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r5, 0xffff ;; llc %r2, 0(%r5, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index 0057dacb84..9f158f9feb 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; lghi %r3, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; clgr %r4, %r6 ;; locgrh %r7, %r3 ;; strv %r5, 0(%r7) @@ -46,10 +46,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r5, 0x60(%r2) +;; lg %r5, 0x58(%r2) ;; lghi %r3, 0 ;; lgr %r6, %r4 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; clgr %r4, %r5 ;; locgrh %r6, %r3 ;; lrv %r2, 0(%r6) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index cc020a586f..e739c0dde7 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; lghi %r6, 0 ;; lgr %r3, %r4 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; aghi %r3, 0x1000 ;; clgr %r4, %r7 ;; locgrh %r3, %r6 @@ -47,10 +47,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; lghi %r5, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; aghik %r3, %r7, 0x1000 ;; clgr %r4, %r6 ;; locgrh %r3, %r5 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 300141bd17..8912fae74a 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; lghi %r6, 0 ;; lgr %r3, %r4 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r2, %r3, %r2 ;; clgr %r4, %r7 @@ -48,10 +48,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; lghi %r5, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; agr %r7, %r2 ;; clgr %r4, %r6 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index af01f02c10..e3c9f8f7d2 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; lghi %r3, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; clgr %r4, %r6 ;; locgrhe %r7, %r3 ;; stc %r5, 0(%r7) @@ -46,10 +46,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r5, 0x60(%r2) +;; lg %r5, 0x58(%r2) ;; lghi %r3, 0 ;; lgr %r6, %r4 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; clgr %r4, %r5 ;; locgrhe %r6, %r3 ;; llc %r2, 0(%r6) diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index acd15b33a3..c70a7bbb63 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; lghi %r6, 0 ;; lgr %r3, %r4 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; aghi %r3, 0x1000 ;; clgr %r4, %r7 ;; locgrh %r3, %r6 @@ -47,10 +47,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; lghi %r5, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; aghik %r3, %r7, 0x1000 ;; clgr %r4, %r6 ;; locgrh %r3, %r5 diff --git a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index d78e294c1b..b5d0345cb8 100644 --- a/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -27,10 +27,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x60(%r2) +;; lg %r7, 0x58(%r2) ;; lghi %r6, 0 ;; lgr %r3, %r4 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r2, %r3, %r2 ;; clgr %r4, %r7 @@ -48,10 +48,10 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r6, 0x60(%r2) +;; lg %r6, 0x58(%r2) ;; lghi %r5, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; agr %r7, %r2 ;; clgr %r4, %r6 diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat index 8dd3339b35..e79633d338 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -30,7 +30,7 @@ ;; llgfr %r7, %r4 ;; clgfi %r7, 0xfffffffc ;; jgh 0x34 -;; lg %r3, 0x58(%r2) +;; lg %r3, 0x50(%r2) ;; strv %r5, 0(%r7, %r3) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 @@ -47,7 +47,7 @@ ;; llgfr %r7, %r4 ;; clgfi %r7, 0xfffffffc ;; jgh 0x80 -;; lg %r3, 0x58(%r2) +;; lg %r3, 0x50(%r2) ;; lrv %r2, 0(%r7, %r3) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index 4a39c3941d..cd9b81990a 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -30,7 +30,7 @@ ;; llgfr %r7, %r4 ;; clgfi %r7, 0xffffeffc ;; jgh 0x34 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; lghi %r4, 0x1000 ;; strv %r5, 0(%r4, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -48,7 +48,7 @@ ;; llgfr %r7, %r4 ;; clgfi %r7, 0xffffeffc ;; jgh 0x84 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; lghi %r4, 0x1000 ;; lrv %r2, 0(%r4, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index d734b68ea9..e984a7f08d 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -30,7 +30,7 @@ ;; llgfr %r7, %r4 ;; clgfi %r7, 0xfffc ;; jgh 0x34 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r4, 0xffff ;; strv %r5, 0(%r4, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -48,7 +48,7 @@ ;; llgfr %r7, %r4 ;; clgfi %r7, 0xfffc ;; jgh 0x84 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r4, 0xffff ;; lrv %r2, 0(%r4, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat index b39718c2a0..339cb8e31a 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -27,7 +27,7 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x58(%r2) +;; lg %r7, 0x50(%r2) ;; llgfr %r2, %r4 ;; stc %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -42,7 +42,7 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x58(%r2) +;; lg %r7, 0x50(%r2) ;; llgfr %r2, %r4 ;; llc %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index a40051c69d..fdd8e21c02 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -30,7 +30,7 @@ ;; llgfr %r7, %r4 ;; clgfi %r7, 0xffffefff ;; jgh 0x34 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; lghi %r4, 0x1000 ;; stc %r5, 0(%r4, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -48,7 +48,7 @@ ;; llgfr %r7, %r4 ;; clgfi %r7, 0xffffefff ;; jgh 0x84 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; lghi %r4, 0x1000 ;; llc %r2, 0(%r4, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index 1c6bc1f2d6..65fe839e4d 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -30,7 +30,7 @@ ;; llgfr %r7, %r4 ;; clgfi %r7, 0xffff ;; jgh 0x34 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r4, 0xffff ;; stc %r5, 0(%r4, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -48,7 +48,7 @@ ;; llgfr %r7, %r4 ;; clgfi %r7, 0xffff ;; jgh 0x84 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r4, 0xffff ;; llc %r2, 0(%r4, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat index 2c66799a37..bb5b9a9d2e 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -30,7 +30,7 @@ ;; llgfr %r4, %r4 ;; lghi %r3, 0 ;; lgr %r6, %r4 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; clgfi %r4, 0xfffffffc ;; locgrh %r6, %r3 ;; strv %r5, 0(%r6) @@ -49,7 +49,7 @@ ;; llgfr %r4, %r4 ;; lghi %r3, 0 ;; lgr %r5, %r4 -;; ag %r5, 0x58(%r2) +;; ag %r5, 0x50(%r2) ;; clgfi %r4, 0xfffffffc ;; locgrh %r5, %r3 ;; lrv %r2, 0(%r5) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index c6b7022f5e..2415af1f7d 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -30,7 +30,7 @@ ;; llgfr %r6, %r4 ;; lghi %r4, 0 ;; lgr %r7, %r6 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; aghik %r3, %r7, 0x1000 ;; clgfi %r6, 0xffffeffc ;; locgrh %r3, %r4 @@ -50,7 +50,7 @@ ;; llgfr %r5, %r4 ;; lghi %r4, 0 ;; lgr %r6, %r5 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; aghik %r3, %r6, 0x1000 ;; clgfi %r5, 0xffffeffc ;; locgrh %r3, %r4 diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 6955a53e93..2b47b7fea2 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -30,7 +30,7 @@ ;; llgfr %r7, %r4 ;; lghi %r6, 0 ;; lgr %r3, %r7 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r4, %r3, %r2 ;; clgfi %r7, 0xfffc @@ -51,7 +51,7 @@ ;; llgfr %r6, %r4 ;; lghi %r5, 0 ;; lgr %r7, %r6 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r4, %r7, %r2 ;; clgfi %r6, 0xfffc diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat index 769c607a41..9b678687dc 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -27,7 +27,7 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x58(%r2) +;; lg %r7, 0x50(%r2) ;; llgfr %r2, %r4 ;; stc %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -42,7 +42,7 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x58(%r2) +;; lg %r7, 0x50(%r2) ;; llgfr %r2, %r4 ;; llc %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index 32ce48dda6..4df6454b89 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -30,7 +30,7 @@ ;; llgfr %r6, %r4 ;; lghi %r4, 0 ;; lgr %r7, %r6 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; aghik %r3, %r7, 0x1000 ;; clgfi %r6, 0xffffefff ;; locgrh %r3, %r4 @@ -50,7 +50,7 @@ ;; llgfr %r5, %r4 ;; lghi %r4, 0 ;; lgr %r6, %r5 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; aghik %r3, %r6, 0x1000 ;; clgfi %r5, 0xffffefff ;; locgrh %r3, %r4 diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 1d2d67572f..72b3ccf757 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -30,7 +30,7 @@ ;; llgfr %r7, %r4 ;; lghi %r6, 0 ;; lgr %r3, %r7 -;; ag %r3, 0x58(%r2) +;; ag %r3, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r4, %r3, %r2 ;; clgfi %r7, 0xffff @@ -51,7 +51,7 @@ ;; llgfr %r6, %r4 ;; lghi %r5, 0 ;; lgr %r7, %r6 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r4, %r7, %r2 ;; clgfi %r6, 0xffff diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index e358b468fe..c16343b029 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -27,7 +27,7 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x58(%r2) +;; lg %r7, 0x50(%r2) ;; llgfr %r2, %r4 ;; strv %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -42,7 +42,7 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x58(%r2) +;; lg %r7, 0x50(%r2) ;; llgfr %r2, %r4 ;; lrv %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index 9a924b43f9..e34ed16f94 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -28,7 +28,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; lghi %r2, 0x1000 ;; strv %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -44,7 +44,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; lghi %r2, 0x1000 ;; lrv %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 5a445bbcd4..a6b5eeebc5 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -28,7 +28,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; strv %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -44,7 +44,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; lrv %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index c1d6d4d855..9319023b50 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -27,7 +27,7 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x58(%r2) +;; lg %r7, 0x50(%r2) ;; llgfr %r2, %r4 ;; stc %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -42,7 +42,7 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x58(%r2) +;; lg %r7, 0x50(%r2) ;; llgfr %r2, %r4 ;; llc %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index 23270ec99d..5c161126b8 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -28,7 +28,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; lghi %r2, 0x1000 ;; stc %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -44,7 +44,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; lghi %r2, 0x1000 ;; llc %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index d03a7053ec..8401eb0518 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -28,7 +28,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; stc %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -44,7 +44,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; llc %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index 4cefedbfbf..3cef763041 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -27,7 +27,7 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x58(%r2) +;; lg %r7, 0x50(%r2) ;; llgfr %r2, %r4 ;; strv %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -42,7 +42,7 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x58(%r2) +;; lg %r7, 0x50(%r2) ;; llgfr %r2, %r4 ;; lrv %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index d6b1877f4b..e7e45ba7f0 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -28,7 +28,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; lghi %r2, 0x1000 ;; strv %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -44,7 +44,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; lghi %r2, 0x1000 ;; lrv %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index f2b5de2460..91e179f225 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -28,7 +28,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; strv %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -44,7 +44,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; lrv %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index 479c9fbb72..8cdbbbdff9 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -27,7 +27,7 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x58(%r2) +;; lg %r7, 0x50(%r2) ;; llgfr %r2, %r4 ;; stc %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -42,7 +42,7 @@ ;; lgr %r1, %r15 ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) -;; lg %r7, 0x58(%r2) +;; lg %r7, 0x50(%r2) ;; llgfr %r2, %r4 ;; llc %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 82bc9338a0..2f92015c50 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -28,7 +28,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; lghi %r2, 0x1000 ;; stc %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -44,7 +44,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; lghi %r2, 0x1000 ;; llc %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index f94d030c12..af1b2108af 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -28,7 +28,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; stc %r5, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) @@ -44,7 +44,7 @@ ;; aghi %r15, -0xa0 ;; stg %r1, 0(%r15) ;; llgfr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; llc %r2, 0(%r2, %r7) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat index d0c77a34ff..a71ae2f82f 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xfffffffc ;; jgh 0x30 -;; lg %r2, 0x58(%r2) +;; lg %r2, 0x50(%r2) ;; strv %r5, 0(%r4, %r2) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 @@ -45,7 +45,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xfffffffc ;; jgh 0x78 -;; lg %r2, 0x58(%r2) +;; lg %r2, 0x50(%r2) ;; lrv %r2, 0(%r4, %r2) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index 4efed9e7a3..ae4e4cf607 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffffeffc ;; jgh 0x30 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r3, 0x1000 ;; strv %r5, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -46,7 +46,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffffeffc ;; jgh 0x7c -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r3, 0x1000 ;; lrv %r2, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index 8ef9254fc6..b2e2e55bf3 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xfffc ;; jgh 0x30 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r3, 0xffff ;; strv %r5, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -46,7 +46,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xfffc ;; jgh 0x7c -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r3, 0xffff ;; lrv %r2, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat index 8355c2838d..9f02b270cd 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffffffff ;; jgh 0x30 -;; lg %r2, 0x58(%r2) +;; lg %r2, 0x50(%r2) ;; stc %r5, 0(%r4, %r2) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 @@ -45,7 +45,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffffffff ;; jgh 0x78 -;; lg %r2, 0x58(%r2) +;; lg %r2, 0x50(%r2) ;; llc %r2, 0(%r4, %r2) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index 9c6c08882c..6ef8e71bc5 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffffefff ;; jgh 0x30 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r3, 0x1000 ;; stc %r5, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -46,7 +46,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffffefff ;; jgh 0x7c -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r3, 0x1000 ;; llc %r2, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index 1a7504a9e6..993279f360 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffff ;; jgh 0x30 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r3, 0xffff ;; stc %r5, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -46,7 +46,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffff ;; jgh 0x7c -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r3, 0xffff ;; llc %r2, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat index 532d7a2119..7b2e104303 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; clgfi %r4, 0xfffffffc ;; locgrh %r7, %r3 ;; strv %r5, 0(%r7) @@ -47,7 +47,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; clgfi %r4, 0xfffffffc ;; locgrh %r7, %r3 ;; lrv %r2, 0(%r7) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index 117fe87bcb..bc6ac871ee 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r6, %r4 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; aghik %r2, %r6, 0x1000 ;; clgfi %r4, 0xffffeffc ;; locgrh %r2, %r3 @@ -48,7 +48,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r5, %r4 -;; ag %r5, 0x58(%r2) +;; ag %r5, 0x50(%r2) ;; aghik %r2, %r5, 0x1000 ;; clgfi %r4, 0xffffeffc ;; locgrh %r2, %r3 diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 266519f3bc..fb42606fe5 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r6, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r3, %r7, %r2 ;; clgfi %r4, 0xfffc @@ -49,7 +49,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r5, 0 ;; lgr %r6, %r4 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; llilh %r7, 0xffff ;; agrk %r3, %r6, %r7 ;; clgfi %r4, 0xfffc diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat index f3e04bc574..f47b41ee6d 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; clgfi %r4, 0xffffffff ;; locgrh %r7, %r3 ;; stc %r5, 0(%r7) @@ -47,7 +47,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; clgfi %r4, 0xffffffff ;; locgrh %r7, %r3 ;; llc %r2, 0(%r7) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index f4e865f46c..11a8a30c46 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r6, %r4 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; aghik %r2, %r6, 0x1000 ;; clgfi %r4, 0xffffefff ;; locgrh %r2, %r3 @@ -48,7 +48,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r5, %r4 -;; ag %r5, 0x58(%r2) +;; ag %r5, 0x50(%r2) ;; aghik %r2, %r5, 0x1000 ;; clgfi %r4, 0xffffefff ;; locgrh %r2, %r3 diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 1d3d0c6d97..3ff0472823 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r6, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r3, %r7, %r2 ;; clgfi %r4, 0xffff @@ -49,7 +49,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r5, 0 ;; lgr %r6, %r4 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; llilh %r7, 0xffff ;; agrk %r3, %r6, %r7 ;; clgfi %r4, 0xffff diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index c9004bdaab..7bbe1314f8 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xfffffffc ;; jgh 0x30 -;; lg %r2, 0x58(%r2) +;; lg %r2, 0x50(%r2) ;; strv %r5, 0(%r4, %r2) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 @@ -45,7 +45,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xfffffffc ;; jgh 0x78 -;; lg %r2, 0x58(%r2) +;; lg %r2, 0x50(%r2) ;; lrv %r2, 0(%r4, %r2) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index 60c3d2feb1..a741ba15fe 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffffeffc ;; jgh 0x30 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r3, 0x1000 ;; strv %r5, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -46,7 +46,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffffeffc ;; jgh 0x7c -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r3, 0x1000 ;; lrv %r2, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 4627708500..1571951115 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xfffc ;; jgh 0x30 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r3, 0xffff ;; strv %r5, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -46,7 +46,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xfffc ;; jgh 0x7c -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r3, 0xffff ;; lrv %r2, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 5bdda4771a..acde1a4bf2 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffffffff ;; jgh 0x30 -;; lg %r2, 0x58(%r2) +;; lg %r2, 0x50(%r2) ;; stc %r5, 0(%r4, %r2) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 @@ -45,7 +45,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffffffff ;; jgh 0x78 -;; lg %r2, 0x58(%r2) +;; lg %r2, 0x50(%r2) ;; llc %r2, 0(%r4, %r2) ;; lmg %r14, %r15, 0x110(%r15) ;; br %r14 diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index 365bd845e1..47bc839237 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffffefff ;; jgh 0x30 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r3, 0x1000 ;; stc %r5, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -46,7 +46,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffffefff ;; jgh 0x7c -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; lghi %r3, 0x1000 ;; llc %r2, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index 05df0196f0..eca922bbc7 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffff ;; jgh 0x30 -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r3, 0xffff ;; stc %r5, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) @@ -46,7 +46,7 @@ ;; stg %r1, 0(%r15) ;; clgfi %r4, 0xffff ;; jgh 0x7c -;; ag %r4, 0x58(%r2) +;; ag %r4, 0x50(%r2) ;; llilh %r3, 0xffff ;; llc %r2, 0(%r3, %r4) ;; lmg %r14, %r15, 0x110(%r15) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index 97b84202f0..d6ee4ae9fc 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; clgfi %r4, 0xfffffffc ;; locgrh %r7, %r3 ;; strv %r5, 0(%r7) @@ -47,7 +47,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; clgfi %r4, 0xfffffffc ;; locgrh %r7, %r3 ;; lrv %r2, 0(%r7) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index 5d4413331c..ac83c7339a 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r6, %r4 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; aghik %r2, %r6, 0x1000 ;; clgfi %r4, 0xffffeffc ;; locgrh %r2, %r3 @@ -48,7 +48,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r5, %r4 -;; ag %r5, 0x58(%r2) +;; ag %r5, 0x50(%r2) ;; aghik %r2, %r5, 0x1000 ;; clgfi %r4, 0xffffeffc ;; locgrh %r2, %r3 diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index dc8a40063f..93f0c0a9e7 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r6, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r3, %r7, %r2 ;; clgfi %r4, 0xfffc @@ -49,7 +49,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r5, 0 ;; lgr %r6, %r4 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; llilh %r7, 0xffff ;; agrk %r3, %r6, %r7 ;; clgfi %r4, 0xfffc diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index ec5409fbf6..76b19cf7b0 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; clgfi %r4, 0xffffffff ;; locgrh %r7, %r3 ;; stc %r5, 0(%r7) @@ -47,7 +47,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; clgfi %r4, 0xffffffff ;; locgrh %r7, %r3 ;; llc %r2, 0(%r7) diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index a5b054e06c..64d335d614 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r6, %r4 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; aghik %r2, %r6, 0x1000 ;; clgfi %r4, 0xffffefff ;; locgrh %r2, %r3 @@ -48,7 +48,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r3, 0 ;; lgr %r5, %r4 -;; ag %r5, 0x58(%r2) +;; ag %r5, 0x50(%r2) ;; aghik %r2, %r5, 0x1000 ;; clgfi %r4, 0xffffefff ;; locgrh %r2, %r3 diff --git a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 7524e30bab..9649f19574 100644 --- a/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/s390x/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -29,7 +29,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r6, 0 ;; lgr %r7, %r4 -;; ag %r7, 0x58(%r2) +;; ag %r7, 0x50(%r2) ;; llilh %r2, 0xffff ;; agrk %r3, %r7, %r2 ;; clgfi %r4, 0xffff @@ -49,7 +49,7 @@ ;; stg %r1, 0(%r15) ;; lghi %r5, 0 ;; lgr %r6, %r4 -;; ag %r6, 0x58(%r2) +;; ag %r6, 0x50(%r2) ;; llilh %r7, 0xffff ;; agrk %r3, %r6, %r7 ;; clgfi %r4, 0xffff diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat index 33a71994ce..483d2de92c 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -21,12 +21,12 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; movl %edx, %r10d ;; subq $4, %r8 ;; cmpq %r8, %r10 ;; ja 0x25 -;; 18: movq 0x58(%rdi), %rsi +;; 18: movq 0x50(%rdi), %rsi ;; movl %ecx, (%rsi, %r10) ;; movq %rbp, %rsp ;; popq %rbp @@ -36,12 +36,12 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; movl %edx, %r10d ;; subq $4, %r8 ;; cmpq %r8, %r10 ;; ja 0x65 -;; 58: movq 0x58(%rdi), %rsi +;; 58: movq 0x50(%rdi), %rsi ;; movl (%rsi, %r10), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index de268d8597..848c4b5afe 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -21,12 +21,12 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; movl %edx, %r10d ;; subq $0x1004, %r8 ;; cmpq %r8, %r10 ;; ja 0x2c -;; 1b: movq 0x58(%rdi), %rsi +;; 1b: movq 0x50(%rdi), %rsi ;; movl %ecx, 0x1000(%rsi, %r10) ;; movq %rbp, %rsp ;; popq %rbp @@ -36,12 +36,12 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; movl %edx, %r10d ;; subq $0x1004, %r8 ;; cmpq %r8, %r10 ;; ja 0x6c -;; 5b: movq 0x58(%rdi), %rsi +;; 5b: movq 0x50(%rdi), %rsi ;; movl 0x1000(%rsi, %r10), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index 9434c84dee..0010a0581d 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -25,9 +25,9 @@ ;; movq %r8, %r10 ;; addq 0x27(%rip), %r10 ;; jb 0x33 -;; 17: cmpq 0x60(%rdi), %r10 +;; 17: cmpq 0x58(%rdi), %r10 ;; ja 0x35 -;; 21: addq 0x58(%rdi), %r8 +;; 21: addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %edi ;; movl %ecx, (%r8, %rdi) ;; movq %rbp, %rsp @@ -44,9 +44,9 @@ ;; movq %r8, %r10 ;; addq 0x27(%rip), %r10 ;; jb 0x73 -;; 57: cmpq 0x60(%rdi), %r10 +;; 57: cmpq 0x58(%rdi), %r10 ;; ja 0x75 -;; 61: addq 0x58(%rdi), %r8 +;; 61: addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %edi ;; movl (%r8, %rdi), %eax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat index 1292d94dd2..1156bd36f4 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -22,9 +22,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; jae 0x1e -;; 11: movq 0x58(%rdi), %r10 +;; 11: movq 0x50(%rdi), %r10 ;; movb %cl, (%r10, %r8) ;; movq %rbp, %rsp ;; popq %rbp @@ -35,9 +35,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; jae 0x3f -;; 31: movq 0x58(%rdi), %r10 +;; 31: movq 0x50(%rdi), %r10 ;; movzbq (%r10, %r8), %rax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index 61629491de..e46da3e928 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -21,12 +21,12 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; movl %edx, %r10d ;; subq $0x1001, %r8 ;; cmpq %r8, %r10 ;; ja 0x2c -;; 1b: movq 0x58(%rdi), %rsi +;; 1b: movq 0x50(%rdi), %rsi ;; movb %cl, 0x1000(%rsi, %r10) ;; movq %rbp, %rsp ;; popq %rbp @@ -36,12 +36,12 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; movl %edx, %r10d ;; subq $0x1001, %r8 ;; cmpq %r8, %r10 ;; ja 0x6d -;; 5b: movq 0x58(%rdi), %rsi +;; 5b: movq 0x50(%rdi), %rsi ;; movzbq 0x1000(%rsi, %r10), %rax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index f41f5cc8f2..51dea51d34 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -25,9 +25,9 @@ ;; movq %r8, %r10 ;; addq 0x27(%rip), %r10 ;; jb 0x33 -;; 17: cmpq 0x60(%rdi), %r10 +;; 17: cmpq 0x58(%rdi), %r10 ;; ja 0x35 -;; 21: addq 0x58(%rdi), %r8 +;; 21: addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %edi ;; movb %cl, (%r8, %rdi) ;; movq %rbp, %rsp @@ -47,9 +47,9 @@ ;; movq %r8, %r10 ;; addq 0x27(%rip), %r10 ;; jb 0x74 -;; 57: cmpq 0x60(%rdi), %r10 +;; 57: cmpq 0x58(%rdi), %r10 ;; ja 0x76 -;; 61: addq 0x58(%rdi), %r8 +;; 61: addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %edi ;; movzbq (%r8, %rdi), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat index 7ef44883fc..1207ab9437 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -21,12 +21,12 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r10 +;; movq 0x58(%rdi), %r10 ;; movl %edx, %esi ;; subq $4, %r10 ;; xorq %rax, %rax ;; movq %rsi, %r11 -;; addq 0x58(%rdi), %r11 +;; addq 0x50(%rdi), %r11 ;; cmpq %r10, %rsi ;; cmovaq %rax, %r11 ;; movl %ecx, (%r11) @@ -37,12 +37,12 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r10 +;; movq 0x58(%rdi), %r10 ;; movl %edx, %esi ;; subq $4, %r10 ;; xorq %rax, %rax ;; movq %rsi, %r11 -;; addq 0x58(%rdi), %r11 +;; addq 0x50(%rdi), %r11 ;; cmpq %r10, %rsi ;; cmovaq %rax, %r11 ;; movl (%r11), %eax diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index 1e6523ecb1..ce8ede7ce2 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r10 -;; movq 0x58(%rdi), %rdi +;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %rdi ;; movl %edx, %eax ;; subq $0x1004, %r10 ;; xorq %rdx, %rdx @@ -37,8 +37,8 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r10 -;; movq 0x58(%rdi), %rdi +;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %rdi ;; movl %edx, %eax ;; subq $0x1004, %r10 ;; xorq %rcx, %rcx diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index ef72bfdfd7..f0536bb80c 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -25,9 +25,9 @@ ;; movq %r10, %rax ;; addq 0x2f(%rip), %rax ;; jb 0x3a -;; 17: movq 0x60(%rdi), %r8 +;; 17: movq 0x58(%rdi), %r8 ;; xorq %rdx, %rdx -;; addq 0x58(%rdi), %r10 +;; addq 0x50(%rdi), %r10 ;; movl $0xffff0000, %r9d ;; addq %r10, %r9 ;; cmpq %r8, %rax @@ -48,9 +48,9 @@ ;; movq %r10, %rax ;; addq 0x2f(%rip), %rax ;; jb 0x9a -;; 77: movq 0x60(%rdi), %rdx +;; 77: movq 0x58(%rdi), %rdx ;; xorq %rcx, %rcx -;; addq 0x58(%rdi), %r10 +;; addq 0x50(%rdi), %r10 ;; movl $0xffff0000, %r8d ;; addq %r10, %r8 ;; cmpq %rdx, %rax diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat index 74d4c57903..2c8ec765f0 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -21,11 +21,11 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 +;; movq 0x58(%rdi), %r11 ;; movl %edx, %eax ;; xorq %rsi, %rsi ;; movq %rax, %r10 -;; addq 0x58(%rdi), %r10 +;; addq 0x50(%rdi), %r10 ;; cmpq %r11, %rax ;; cmovaeq %rsi, %r10 ;; movb %cl, (%r10) @@ -36,11 +36,11 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 +;; movq 0x58(%rdi), %r11 ;; movl %edx, %eax ;; xorq %rsi, %rsi ;; movq %rax, %r10 -;; addq 0x58(%rdi), %r10 +;; addq 0x50(%rdi), %r10 ;; cmpq %r11, %rax ;; cmovaeq %rsi, %r10 ;; movzbq (%r10), %rax diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index 2d2f3c8958..0097f73792 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r10 -;; movq 0x58(%rdi), %rdi +;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %rdi ;; movl %edx, %eax ;; subq $0x1001, %r10 ;; xorq %rdx, %rdx @@ -37,8 +37,8 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r10 -;; movq 0x58(%rdi), %rdi +;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %rdi ;; movl %edx, %eax ;; subq $0x1001, %r10 ;; xorq %rcx, %rcx diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index f72daefcf4..dc93b5e85e 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -25,9 +25,9 @@ ;; movq %r10, %rax ;; addq 0x2f(%rip), %rax ;; jb 0x3a -;; 17: movq 0x60(%rdi), %r8 +;; 17: movq 0x58(%rdi), %r8 ;; xorq %rdx, %rdx -;; addq 0x58(%rdi), %r10 +;; addq 0x50(%rdi), %r10 ;; movl $0xffff0000, %r9d ;; addq %r10, %r9 ;; cmpq %r8, %rax @@ -48,9 +48,9 @@ ;; movq %r10, %rax ;; addq 0x2f(%rip), %rax ;; jb 0x9b -;; 77: movq 0x60(%rdi), %rdx +;; 77: movq 0x58(%rdi), %rdx ;; xorq %rcx, %rcx -;; addq 0x58(%rdi), %r10 +;; addq 0x50(%rdi), %r10 ;; movl $0xffff0000, %r8d ;; addq %r10, %r8 ;; cmpq %rdx, %rax diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index 5d28a828b9..5dd416e733 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -22,9 +22,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; ja 0x1e -;; 11: movq 0x58(%rdi), %r10 +;; 11: movq 0x50(%rdi), %r10 ;; movl %ecx, (%r10, %r8) ;; movq %rbp, %rsp ;; popq %rbp @@ -35,9 +35,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; ja 0x3e -;; 31: movq 0x58(%rdi), %r10 +;; 31: movq 0x50(%rdi), %r10 ;; movl (%r10, %r8), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index 434699b2f1..246c44bd60 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -22,9 +22,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; ja 0x22 -;; 11: movq 0x58(%rdi), %r10 +;; 11: movq 0x50(%rdi), %r10 ;; movl %ecx, 0x1000(%r10, %r8) ;; movq %rbp, %rsp ;; popq %rbp @@ -35,9 +35,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; ja 0x62 -;; 51: movq 0x58(%rdi), %r10 +;; 51: movq 0x50(%rdi), %r10 ;; movl 0x1000(%r10, %r8), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 4b59f37526..07885ffe7d 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -22,9 +22,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; ja 0x24 -;; 11: addq 0x58(%rdi), %r8 +;; 11: addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r11d ;; movl %ecx, (%r8, %r11) ;; movq %rbp, %rsp @@ -36,9 +36,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; ja 0x64 -;; 51: addq 0x58(%rdi), %r8 +;; 51: addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r11d ;; movl (%r8, %r11), %eax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 81a5d9d52f..3112e83e3d 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -22,9 +22,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; jae 0x1e -;; 11: movq 0x58(%rdi), %r10 +;; 11: movq 0x50(%rdi), %r10 ;; movb %cl, (%r10, %r8) ;; movq %rbp, %rsp ;; popq %rbp @@ -35,9 +35,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; jae 0x3f -;; 31: movq 0x58(%rdi), %r10 +;; 31: movq 0x50(%rdi), %r10 ;; movzbq (%r10, %r8), %rax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index 28bd7b020d..9e65a92e30 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -22,9 +22,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; ja 0x22 -;; 11: movq 0x58(%rdi), %r10 +;; 11: movq 0x50(%rdi), %r10 ;; movb %cl, 0x1000(%r10, %r8) ;; movq %rbp, %rsp ;; popq %rbp @@ -35,9 +35,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; ja 0x63 -;; 51: movq 0x58(%rdi), %r10 +;; 51: movq 0x50(%rdi), %r10 ;; movzbq 0x1000(%r10, %r8), %rax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index f07c277404..da2a8e4747 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -22,9 +22,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; ja 0x24 -;; 11: addq 0x58(%rdi), %r8 +;; 11: addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r11d ;; movb %cl, (%r8, %r11) ;; movq %rbp, %rsp @@ -36,9 +36,9 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; cmpq 0x60(%rdi), %r8 +;; cmpq 0x58(%rdi), %r8 ;; ja 0x65 -;; 51: addq 0x58(%rdi), %r8 +;; 51: addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r11d ;; movzbq (%r8, %r11), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index f90ba39393..feff29a992 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -21,11 +21,11 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 +;; movq 0x58(%rdi), %r11 ;; movl %edx, %eax ;; xorq %rsi, %rsi ;; movq %rax, %r10 -;; addq 0x58(%rdi), %r10 +;; addq 0x50(%rdi), %r10 ;; cmpq %r11, %rax ;; cmovaq %rsi, %r10 ;; movl %ecx, (%r10) @@ -36,11 +36,11 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 +;; movq 0x58(%rdi), %r11 ;; movl %edx, %eax ;; xorq %rsi, %rsi ;; movq %rax, %r10 -;; addq 0x58(%rdi), %r10 +;; addq 0x50(%rdi), %r10 ;; cmpq %r11, %rax ;; cmovaq %rsi, %r10 ;; movl (%r10), %eax diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index 8bddb353ab..27bbc97a54 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %rsi -;; movq 0x58(%rdi), %rax +;; movq 0x58(%rdi), %rsi +;; movq 0x50(%rdi), %rax ;; movl %edx, %edx ;; xorq %rdi, %rdi ;; leaq 0x1000(%rax, %rdx), %r11 @@ -36,8 +36,8 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %rsi -;; movq 0x58(%rdi), %rax +;; movq 0x58(%rdi), %rsi +;; movq 0x50(%rdi), %rax ;; movl %edx, %ecx ;; xorq %rdi, %rdi ;; leaq 0x1000(%rax, %rcx), %r11 diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 0aa771007f..356a172c7e 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -21,11 +21,11 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; movl %edx, %edx ;; xorq %rax, %rax ;; movq %rdx, %r9 -;; addq 0x58(%rdi), %r9 +;; addq 0x50(%rdi), %r9 ;; movl $0xffff0000, %edi ;; leaq (%r9, %rdi), %rsi ;; cmpq %r8, %rdx @@ -38,11 +38,11 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r9 +;; movq 0x58(%rdi), %r9 ;; movl %edx, %ecx ;; xorq %rax, %rax ;; movq %rcx, %r8 -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %edi ;; leaq (%r8, %rdi), %rsi ;; cmpq %r9, %rcx diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index 186f6c62be..3226850a3d 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -21,11 +21,11 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 +;; movq 0x58(%rdi), %r11 ;; movl %edx, %eax ;; xorq %rsi, %rsi ;; movq %rax, %r10 -;; addq 0x58(%rdi), %r10 +;; addq 0x50(%rdi), %r10 ;; cmpq %r11, %rax ;; cmovaeq %rsi, %r10 ;; movb %cl, (%r10) @@ -36,11 +36,11 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 +;; movq 0x58(%rdi), %r11 ;; movl %edx, %eax ;; xorq %rsi, %rsi ;; movq %rax, %r10 -;; addq 0x58(%rdi), %r10 +;; addq 0x50(%rdi), %r10 ;; cmpq %r11, %rax ;; cmovaeq %rsi, %r10 ;; movzbq (%r10), %rax diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 26e045feff..493dce78bb 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %rsi -;; movq 0x58(%rdi), %rax +;; movq 0x58(%rdi), %rsi +;; movq 0x50(%rdi), %rax ;; movl %edx, %edx ;; xorq %rdi, %rdi ;; leaq 0x1000(%rax, %rdx), %r11 @@ -36,8 +36,8 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %rsi -;; movq 0x58(%rdi), %rax +;; movq 0x58(%rdi), %rsi +;; movq 0x50(%rdi), %rax ;; movl %edx, %ecx ;; xorq %rdi, %rdi ;; leaq 0x1000(%rax, %rcx), %r11 diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index a5f8f2df61..6fbc564cfa 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -21,11 +21,11 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; movl %edx, %edx ;; xorq %rax, %rax ;; movq %rdx, %r9 -;; addq 0x58(%rdi), %r9 +;; addq 0x50(%rdi), %r9 ;; movl $0xffff0000, %edi ;; leaq (%r9, %rdi), %rsi ;; cmpq %r8, %rdx @@ -38,11 +38,11 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r9 +;; movq 0x58(%rdi), %r9 ;; movl %edx, %ecx ;; xorq %rax, %rax ;; movq %rcx, %r8 -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %edi ;; leaq (%r8, %rdi), %rsi ;; cmpq %r9, %rcx diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat index ab651cee05..3caaed2d3f 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -21,11 +21,11 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; subq $4, %r8 ;; cmpq %r8, %rdx ;; ja 0x22 -;; 15: movq 0x58(%rdi), %r11 +;; 15: movq 0x50(%rdi), %r11 ;; movl %ecx, (%r11, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -35,11 +35,11 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; subq $4, %r8 ;; cmpq %r8, %rdx ;; ja 0x62 -;; 55: movq 0x58(%rdi), %r11 +;; 55: movq 0x50(%rdi), %r11 ;; movl (%r11, %rdx), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index 0cf17a04ba..8f314283de 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -21,11 +21,11 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; subq $0x1004, %r8 ;; cmpq %r8, %rdx ;; ja 0x29 -;; 18: movq 0x58(%rdi), %r11 +;; 18: movq 0x50(%rdi), %r11 ;; movl %ecx, 0x1000(%r11, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -35,11 +35,11 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; subq $0x1004, %r8 ;; cmpq %r8, %rdx ;; ja 0x69 -;; 58: movq 0x58(%rdi), %r11 +;; 58: movq 0x50(%rdi), %r11 ;; movl 0x1000(%r11, %rdx), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index 7634934f6a..5713959fcb 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -24,9 +24,9 @@ ;; movq %rdx, %r9 ;; addq 0x2a(%rip), %r9 ;; jb 0x2f -;; 14: cmpq 0x60(%rdi), %r9 +;; 14: cmpq 0x58(%rdi), %r9 ;; ja 0x31 -;; 1e: addq 0x58(%rdi), %rdx +;; 1e: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %esi ;; movl %ecx, (%rdx, %rsi) ;; movq %rbp, %rsp @@ -44,9 +44,9 @@ ;; movq %rdx, %r9 ;; addq 0x2a(%rip), %r9 ;; jb 0x6f -;; 54: cmpq 0x60(%rdi), %r9 +;; 54: cmpq 0x58(%rdi), %r9 ;; ja 0x71 -;; 5e: addq 0x58(%rdi), %rdx +;; 5e: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %esi ;; movl (%rdx, %rsi), %eax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat index 3ee87ac770..54b57b527d 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -21,9 +21,9 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; jae 0x1b -;; e: movq 0x58(%rdi), %r9 +;; e: movq 0x50(%rdi), %r9 ;; movb %cl, (%r9, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -33,9 +33,9 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; jae 0x3c -;; 2e: movq 0x58(%rdi), %r9 +;; 2e: movq 0x50(%rdi), %r9 ;; movzbq (%r9, %rdx), %rax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index 8a7673e43c..90b633dbf4 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -21,11 +21,11 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; subq $0x1001, %r8 ;; cmpq %r8, %rdx ;; ja 0x29 -;; 18: movq 0x58(%rdi), %r11 +;; 18: movq 0x50(%rdi), %r11 ;; movb %cl, 0x1000(%r11, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -35,11 +35,11 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r8 +;; movq 0x58(%rdi), %r8 ;; subq $0x1001, %r8 ;; cmpq %r8, %rdx ;; ja 0x6a -;; 58: movq 0x58(%rdi), %r11 +;; 58: movq 0x50(%rdi), %r11 ;; movzbq 0x1000(%r11, %rdx), %rax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index 35ee5f662c..0fc6269ac4 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -24,9 +24,9 @@ ;; movq %rdx, %r9 ;; addq 0x2a(%rip), %r9 ;; jb 0x2f -;; 14: cmpq 0x60(%rdi), %r9 +;; 14: cmpq 0x58(%rdi), %r9 ;; ja 0x31 -;; 1e: addq 0x58(%rdi), %rdx +;; 1e: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %esi ;; movb %cl, (%rdx, %rsi) ;; movq %rbp, %rsp @@ -47,9 +47,9 @@ ;; movq %rdx, %r9 ;; addq 0x2a(%rip), %r9 ;; jb 0x71 -;; 54: cmpq 0x60(%rdi), %r9 +;; 54: cmpq 0x58(%rdi), %r9 ;; ja 0x73 -;; 5e: addq 0x58(%rdi), %rdx +;; 5e: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %esi ;; movzbq (%rdx, %rsi), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat index d34cc020ac..087b2324b3 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -21,11 +21,11 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r10 +;; movq 0x58(%rdi), %r10 ;; subq $4, %r10 ;; xorq %r11, %r11 ;; movq %rdx, %rsi -;; addq 0x58(%rdi), %rsi +;; addq 0x50(%rdi), %rsi ;; cmpq %r10, %rdx ;; cmovaq %r11, %rsi ;; movl %ecx, (%rsi) @@ -36,11 +36,11 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r10 +;; movq 0x58(%rdi), %r10 ;; subq $4, %r10 ;; xorq %r11, %r11 ;; movq %rdx, %rsi -;; addq 0x58(%rdi), %rsi +;; addq 0x50(%rdi), %rsi ;; cmpq %r10, %rdx ;; cmovaq %r11, %rsi ;; movl (%rsi), %eax diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index d4dfc3d1ad..6c7d0a1d5c 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r10 -;; movq 0x58(%rdi), %rdi +;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %rdi ;; subq $0x1004, %r10 ;; xorq %rsi, %rsi ;; leaq 0x1000(%rdi, %rdx), %r11 @@ -36,8 +36,8 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r10 -;; movq 0x58(%rdi), %rdi +;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %rdi ;; subq $0x1004, %r10 ;; xorq %rsi, %rsi ;; leaq 0x1000(%rdi, %rdx), %r11 diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index c63beb0fac..1ea0ba6fab 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -24,9 +24,9 @@ ;; movq %rdx, %r8 ;; addq 0x32(%rip), %r8 ;; jb 0x37 -;; 14: movq 0x60(%rdi), %r9 +;; 14: movq 0x58(%rdi), %r9 ;; xorq %rax, %rax -;; addq 0x58(%rdi), %rdx +;; addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; leaq (%rdx, %r10), %rdi ;; cmpq %r9, %r8 @@ -47,9 +47,9 @@ ;; movq %rdx, %rcx ;; addq 0x32(%rip), %rcx ;; jb 0x97 -;; 74: movq 0x60(%rdi), %r8 +;; 74: movq 0x58(%rdi), %r8 ;; xorq %rax, %rax -;; addq 0x58(%rdi), %rdx +;; addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r9d ;; leaq (%rdx, %r9), %rdi ;; cmpq %r8, %rcx diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat index 429396683e..cc87976431 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -21,10 +21,10 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 +;; movq 0x58(%rdi), %r11 ;; xorq %r10, %r10 ;; movq %rdx, %r9 -;; addq 0x58(%rdi), %r9 +;; addq 0x50(%rdi), %r9 ;; cmpq %r11, %rdx ;; cmovaeq %r10, %r9 ;; movb %cl, (%r9) @@ -35,10 +35,10 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 +;; movq 0x58(%rdi), %r11 ;; xorq %r10, %r10 ;; movq %rdx, %r9 -;; addq 0x58(%rdi), %r9 +;; addq 0x50(%rdi), %r9 ;; cmpq %r11, %rdx ;; cmovaeq %r10, %r9 ;; movzbq (%r9), %rax diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index 4492e3b7c6..753a34d58c 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r10 -;; movq 0x58(%rdi), %rdi +;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %rdi ;; subq $0x1001, %r10 ;; xorq %rsi, %rsi ;; leaq 0x1000(%rdi, %rdx), %r11 @@ -36,8 +36,8 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r10 -;; movq 0x58(%rdi), %rdi +;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %rdi ;; subq $0x1001, %r10 ;; xorq %rsi, %rsi ;; leaq 0x1000(%rdi, %rdx), %r11 diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 7a1520e027..975903bd93 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -24,9 +24,9 @@ ;; movq %rdx, %r8 ;; addq 0x32(%rip), %r8 ;; jb 0x37 -;; 14: movq 0x60(%rdi), %r9 +;; 14: movq 0x58(%rdi), %r9 ;; xorq %rax, %rax -;; addq 0x58(%rdi), %rdx +;; addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; leaq (%rdx, %r10), %rdi ;; cmpq %r9, %r8 @@ -50,9 +50,9 @@ ;; movq %rdx, %rcx ;; addq 0x32(%rip), %rcx ;; jb 0x99 -;; 74: movq 0x60(%rdi), %r8 +;; 74: movq 0x58(%rdi), %r8 ;; xorq %rax, %rax -;; addq 0x58(%rdi), %rdx +;; addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r9d ;; leaq (%rdx, %r9), %rdi ;; cmpq %r8, %rcx diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index 4c1bfa7e9b..5c3b0510c1 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -21,9 +21,9 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; ja 0x1b -;; e: movq 0x58(%rdi), %r9 +;; e: movq 0x50(%rdi), %r9 ;; movl %ecx, (%r9, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -33,9 +33,9 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; ja 0x3b -;; 2e: movq 0x58(%rdi), %r9 +;; 2e: movq 0x50(%rdi), %r9 ;; movl (%r9, %rdx), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index 5426c2f096..95a1363074 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -21,9 +21,9 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; ja 0x1f -;; e: movq 0x58(%rdi), %r9 +;; e: movq 0x50(%rdi), %r9 ;; movl %ecx, 0x1000(%r9, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -33,9 +33,9 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; ja 0x5f -;; 4e: movq 0x58(%rdi), %r9 +;; 4e: movq 0x50(%rdi), %r9 ;; movl 0x1000(%r9, %rdx), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 39662eb46d..e01dce7c0a 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -21,9 +21,9 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; ja 0x21 -;; e: addq 0x58(%rdi), %rdx +;; e: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; movl %ecx, (%rdx, %r10) ;; movq %rbp, %rsp @@ -34,9 +34,9 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; ja 0x61 -;; 4e: addq 0x58(%rdi), %rdx +;; 4e: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; movl (%rdx, %r10), %eax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index efceb480b2..23309d2795 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -21,9 +21,9 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; jae 0x1b -;; e: movq 0x58(%rdi), %r9 +;; e: movq 0x50(%rdi), %r9 ;; movb %cl, (%r9, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -33,9 +33,9 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; jae 0x3c -;; 2e: movq 0x58(%rdi), %r9 +;; 2e: movq 0x50(%rdi), %r9 ;; movzbq (%r9, %rdx), %rax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index f0edfd1ed5..c33b4ac3aa 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -21,9 +21,9 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; ja 0x1f -;; e: movq 0x58(%rdi), %r9 +;; e: movq 0x50(%rdi), %r9 ;; movb %cl, 0x1000(%r9, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -33,9 +33,9 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; ja 0x60 -;; 4e: movq 0x58(%rdi), %r9 +;; 4e: movq 0x50(%rdi), %r9 ;; movzbq 0x1000(%r9, %rdx), %rax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index ead47faa38..39a739c927 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -21,9 +21,9 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; ja 0x21 -;; e: addq 0x58(%rdi), %rdx +;; e: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; movb %cl, (%rdx, %r10) ;; movq %rbp, %rsp @@ -34,9 +34,9 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; cmpq 0x60(%rdi), %rdx +;; cmpq 0x58(%rdi), %rdx ;; ja 0x62 -;; 4e: addq 0x58(%rdi), %rdx +;; 4e: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; movzbq (%rdx, %r10), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index b32d853911..2f631ada9a 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -21,10 +21,10 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 +;; movq 0x58(%rdi), %r11 ;; xorq %r10, %r10 ;; movq %rdx, %r9 -;; addq 0x58(%rdi), %r9 +;; addq 0x50(%rdi), %r9 ;; cmpq %r11, %rdx ;; cmovaq %r10, %r9 ;; movl %ecx, (%r9) @@ -35,10 +35,10 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 +;; movq 0x58(%rdi), %r11 ;; xorq %r10, %r10 ;; movq %rdx, %r9 -;; addq 0x58(%rdi), %r9 +;; addq 0x50(%rdi), %r9 ;; cmpq %r11, %rdx ;; cmovaq %r10, %r9 ;; movl (%r9), %eax diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index 8fcb22a3c0..e12b64325b 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 -;; movq 0x58(%rdi), %rdi +;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %rdi ;; xorq %rsi, %rsi ;; leaq 0x1000(%rdi, %rdx), %r10 ;; cmpq %r11, %rdx @@ -35,8 +35,8 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 -;; movq 0x58(%rdi), %rdi +;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %rdi ;; xorq %rsi, %rsi ;; leaq 0x1000(%rdi, %rdx), %r10 ;; cmpq %r11, %rdx diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 95c6aba908..d1cc333996 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -21,10 +21,10 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %rax +;; movq 0x58(%rdi), %rax ;; xorq %rsi, %rsi ;; movq %rdx, %r8 -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %edi ;; leaq (%r8, %rdi), %r11 ;; cmpq %rax, %rdx @@ -37,10 +37,10 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %rax +;; movq 0x58(%rdi), %rax ;; xorq %rsi, %rsi ;; movq %rdx, %rcx -;; addq 0x58(%rdi), %rcx +;; addq 0x50(%rdi), %rcx ;; movl $0xffff0000, %edi ;; leaq (%rcx, %rdi), %r11 ;; cmpq %rax, %rdx diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index 4093e10d17..dae2e3a635 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -21,10 +21,10 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 +;; movq 0x58(%rdi), %r11 ;; xorq %r10, %r10 ;; movq %rdx, %r9 -;; addq 0x58(%rdi), %r9 +;; addq 0x50(%rdi), %r9 ;; cmpq %r11, %rdx ;; cmovaeq %r10, %r9 ;; movb %cl, (%r9) @@ -35,10 +35,10 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 +;; movq 0x58(%rdi), %r11 ;; xorq %r10, %r10 ;; movq %rdx, %r9 -;; addq 0x58(%rdi), %r9 +;; addq 0x50(%rdi), %r9 ;; cmpq %r11, %rdx ;; cmovaeq %r10, %r9 ;; movzbq (%r9), %rax diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 35f16bb9b7..db95ba4c73 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -21,8 +21,8 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 -;; movq 0x58(%rdi), %rdi +;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %rdi ;; xorq %rsi, %rsi ;; leaq 0x1000(%rdi, %rdx), %r10 ;; cmpq %r11, %rdx @@ -35,8 +35,8 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %r11 -;; movq 0x58(%rdi), %rdi +;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %rdi ;; xorq %rsi, %rsi ;; leaq 0x1000(%rdi, %rdx), %r10 ;; cmpq %r11, %rdx diff --git a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 08a56e0408..44ae363548 100644 --- a/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -21,10 +21,10 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %rax +;; movq 0x58(%rdi), %rax ;; xorq %rsi, %rsi ;; movq %rdx, %r8 -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %edi ;; leaq (%r8, %rdi), %r11 ;; cmpq %rax, %rdx @@ -37,10 +37,10 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x60(%rdi), %rax +;; movq 0x58(%rdi), %rax ;; xorq %rsi, %rsi ;; movq %rdx, %rcx -;; addq 0x58(%rdi), %rcx +;; addq 0x50(%rdi), %rcx ;; movl $0xffff0000, %edi ;; leaq (%rcx, %rdi), %r11 ;; cmpq %rax, %rdx diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat index 0cabd54607..cab43e7f85 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -24,7 +24,7 @@ ;; movl %edx, %r8d ;; cmpq 0x1a(%rip), %r8 ;; ja 0x21 -;; 14: movq 0x58(%rdi), %r10 +;; 14: movq 0x50(%rdi), %r10 ;; movl %ecx, (%r10, %r8) ;; movq %rbp, %rsp ;; popq %rbp @@ -40,7 +40,7 @@ ;; movl %edx, %r8d ;; cmpq 0x1a(%rip), %r8 ;; ja 0x61 -;; 54: movq 0x58(%rdi), %r10 +;; 54: movq 0x50(%rdi), %r10 ;; movl (%r10, %r8), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index 57d73e24fe..6bc8112cb5 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -24,7 +24,7 @@ ;; movl %edx, %r8d ;; cmpq 0x1a(%rip), %r8 ;; ja 0x25 -;; 14: movq 0x58(%rdi), %r10 +;; 14: movq 0x50(%rdi), %r10 ;; movl %ecx, 0x1000(%r10, %r8) ;; movq %rbp, %rsp ;; popq %rbp @@ -39,7 +39,7 @@ ;; movl %edx, %r8d ;; cmpq 0x1a(%rip), %r8 ;; ja 0x65 -;; 54: movq 0x58(%rdi), %r10 +;; 54: movq 0x50(%rdi), %r10 ;; movl 0x1000(%r10, %r8), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index edae795155..99f6e1cfa0 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -24,7 +24,7 @@ ;; movl %edx, %r8d ;; cmpq $0xfffc, %r8 ;; ja 0x27 -;; 14: addq 0x58(%rdi), %r8 +;; 14: addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r11d ;; movl %ecx, (%r8, %r11) ;; movq %rbp, %rsp @@ -38,7 +38,7 @@ ;; movl %edx, %r8d ;; cmpq $0xfffc, %r8 ;; ja 0x67 -;; 54: addq 0x58(%rdi), %r8 +;; 54: addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r11d ;; movl (%r8, %r11), %eax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat index fc0de14b95..f848fad3fe 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movb %cl, (%r8, %r9) ;; movq %rbp, %rsp @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movzbq (%r8, %r9), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index c6eaebe1b4..958dc2c414 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -24,7 +24,7 @@ ;; movl %edx, %r8d ;; cmpq 0x1a(%rip), %r8 ;; ja 0x25 -;; 14: movq 0x58(%rdi), %r10 +;; 14: movq 0x50(%rdi), %r10 ;; movb %cl, 0x1000(%r10, %r8) ;; movq %rbp, %rsp ;; popq %rbp @@ -39,7 +39,7 @@ ;; movl %edx, %r8d ;; cmpq 0x1a(%rip), %r8 ;; ja 0x66 -;; 54: movq 0x58(%rdi), %r10 +;; 54: movq 0x50(%rdi), %r10 ;; movzbq 0x1000(%r10, %r8), %rax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index a73c47e759..1708d31410 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -24,7 +24,7 @@ ;; movl %edx, %r8d ;; cmpq $0xffff, %r8 ;; ja 0x27 -;; 14: addq 0x58(%rdi), %r8 +;; 14: addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r11d ;; movb %cl, (%r8, %r11) ;; movq %rbp, %rsp @@ -38,7 +38,7 @@ ;; movl %edx, %r8d ;; cmpq $0xffff, %r8 ;; ja 0x68 -;; 54: addq 0x58(%rdi), %r8 +;; 54: addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r11d ;; movzbq (%r8, %r11), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat index 1eefdfb5a9..73eef2ee4f 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -24,7 +24,7 @@ ;; movl %edx, %r11d ;; xorq %r10, %r10 ;; movq %r11, %r9 -;; addq 0x58(%rdi), %r9 +;; addq 0x50(%rdi), %r9 ;; cmpq 0x10(%rip), %r11 ;; cmovaq %r10, %r9 ;; movl %ecx, (%r9) @@ -41,7 +41,7 @@ ;; movl %edx, %r11d ;; xorq %r10, %r10 ;; movq %r11, %r9 -;; addq 0x58(%rdi), %r9 +;; addq 0x50(%rdi), %r9 ;; cmpq 0x10(%rip), %r11 ;; cmovaq %r10, %r9 ;; movl (%r9), %eax diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index e5a3ca5f73..27b5dab8c5 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; movl %edx, %esi ;; xorq %r11, %r11 -;; movq 0x58(%rdi), %rdi +;; movq 0x50(%rdi), %rdi ;; leaq 0x1000(%rdi, %rsi), %r10 ;; cmpq 0xc(%rip), %rsi ;; cmovaq %r11, %r10 @@ -39,7 +39,7 @@ ;; movq %rsp, %rbp ;; movl %edx, %esi ;; xorq %r11, %r11 -;; movq 0x58(%rdi), %rdi +;; movq 0x50(%rdi), %rdi ;; leaq 0x1000(%rdi, %rsi), %r10 ;; cmpq 0xc(%rip), %rsi ;; cmovaq %r11, %r10 diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 4666a78216..e780ab9fcf 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -26,7 +26,7 @@ ;; xorq %rsi, %rsi ;; movq %rax, %rdx ;; movq %rdi, %rax -;; addq 0x58(%rdx), %rax +;; addq 0x50(%rdx), %rax ;; movl $0xffff0000, %edx ;; leaq (%rax, %rdx), %r11 ;; cmpq $0xfffc, %rdi @@ -44,7 +44,7 @@ ;; xorq %rsi, %rsi ;; movq %rax, %rcx ;; movq %rdi, %rax -;; addq 0x58(%rcx), %rax +;; addq 0x50(%rcx), %rax ;; movl $0xffff0000, %ecx ;; leaq (%rax, %rcx), %r11 ;; cmpq $0xfffc, %rdi diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat index e64cdae8f5..a5a655211d 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movb %cl, (%r8, %r9) ;; movq %rbp, %rsp @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movzbq (%r8, %r9), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index 3a0482e6a4..01297e7f82 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; movl %edx, %esi ;; xorq %r11, %r11 -;; movq 0x58(%rdi), %rdi +;; movq 0x50(%rdi), %rdi ;; leaq 0x1000(%rdi, %rsi), %r10 ;; cmpq 0xc(%rip), %rsi ;; cmovaq %r11, %r10 @@ -37,7 +37,7 @@ ;; movq %rsp, %rbp ;; movl %edx, %esi ;; xorq %r11, %r11 -;; movq 0x58(%rdi), %rdi +;; movq 0x50(%rdi), %rdi ;; leaq 0x1000(%rdi, %rsi), %r10 ;; cmpq 0x14(%rip), %rsi ;; cmovaq %r11, %r10 diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index e8275bc6ea..2b74012102 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -26,7 +26,7 @@ ;; xorq %rsi, %rsi ;; movq %rax, %rdx ;; movq %rdi, %rax -;; addq 0x58(%rdx), %rax +;; addq 0x50(%rdx), %rax ;; movl $0xffff0000, %edx ;; leaq (%rax, %rdx), %r11 ;; cmpq $0xffff, %rdi @@ -44,7 +44,7 @@ ;; xorq %rsi, %rsi ;; movq %rax, %rcx ;; movq %rdi, %rax -;; addq 0x58(%rcx), %rax +;; addq 0x50(%rcx), %rax ;; movl $0xffff0000, %ecx ;; leaq (%rax, %rcx), %r11 ;; cmpq $0xffff, %rdi diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index e9e881b6b5..c0778d3b38 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movl %ecx, (%r8, %r9) ;; movq %rbp, %rsp @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movl (%r8, %r9), %eax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index 6d0ce6bea9..20da190851 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movl %ecx, 0x1000(%r8, %r9) ;; movq %rbp, %rsp @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movl 0x1000(%r8, %r9), %eax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index 22ea35b658..ba34e56c32 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -22,7 +22,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r9d ;; movl %ecx, (%r8, %r9) ;; movq %rbp, %rsp @@ -33,7 +33,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r9d ;; movl (%r8, %r9), %eax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 60f69aeee7..fce3947538 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movb %cl, (%r8, %r9) ;; movq %rbp, %rsp @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movzbq (%r8, %r9), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index a2c8a76dd9..7bd5e40f62 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movb %cl, 0x1000(%r8, %r9) ;; movq %rbp, %rsp @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movzbq 0x1000(%r8, %r9), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index 410a921f9c..2e49454502 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -22,7 +22,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r9d ;; movb %cl, (%r8, %r9) ;; movq %rbp, %rsp @@ -33,7 +33,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r9d ;; movzbq (%r8, %r9), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index be3969bcd1..096e50c9ac 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movl %ecx, (%r8, %r9) ;; movq %rbp, %rsp @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movl (%r8, %r9), %eax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index c01dff9890..e0589dd426 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movl %ecx, 0x1000(%r8, %r9) ;; movq %rbp, %rsp @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movl 0x1000(%r8, %r9), %eax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 2a0de8a0d6..87c83c2ec8 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -22,7 +22,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r9d ;; movl %ecx, (%r8, %r9) ;; movq %rbp, %rsp @@ -33,7 +33,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r9d ;; movl (%r8, %r9), %eax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index f195201d84..93e6756e91 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movb %cl, (%r8, %r9) ;; movq %rbp, %rsp @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movzbq (%r8, %r9), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 3896ff546c..efd78329c7 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movb %cl, 0x1000(%r8, %r9) ;; movq %rbp, %rsp @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movzbq 0x1000(%r8, %r9), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 3f719fde38..0f3b8c8093 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -22,7 +22,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r9d ;; movb %cl, (%r8, %r9) ;; movq %rbp, %rsp @@ -33,7 +33,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; movl $0xffff0000, %r9d ;; movzbq (%r8, %r9), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat index 38c3b38a67..aa8e543eb1 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x15(%rip), %rdx ;; ja 0x1e -;; 11: movq 0x58(%rdi), %r9 +;; 11: movq 0x50(%rdi), %r9 ;; movl %ecx, (%r9, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -36,7 +36,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x15(%rip), %rdx ;; ja 0x5e -;; 51: movq 0x58(%rdi), %r9 +;; 51: movq 0x50(%rdi), %r9 ;; movl (%r9, %rdx), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat index 6949322829..10a83fe11d 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x1d(%rip), %rdx ;; ja 0x22 -;; 11: movq 0x58(%rdi), %r9 +;; 11: movq 0x50(%rdi), %r9 ;; movl %ecx, 0x1000(%r9, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -39,7 +39,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x1d(%rip), %rdx ;; ja 0x62 -;; 51: movq 0x58(%rdi), %r9 +;; 51: movq 0x50(%rdi), %r9 ;; movl 0x1000(%r9, %rdx), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat index 995a37ab24..596dae2be2 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; cmpq $0xfffc, %rdx ;; ja 0x24 -;; 11: addq 0x58(%rdi), %rdx +;; 11: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; movl %ecx, (%rdx, %r10) ;; movq %rbp, %rsp @@ -36,7 +36,7 @@ ;; movq %rsp, %rbp ;; cmpq $0xfffc, %rdx ;; ja 0x64 -;; 51: addq 0x58(%rdi), %rdx +;; 51: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; movl (%rdx, %r10), %eax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat index 8eeb70cda4..6dd3cfe9c9 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x15(%rip), %rdx ;; ja 0x1e -;; 11: movq 0x58(%rdi), %r9 +;; 11: movq 0x50(%rdi), %r9 ;; movb %cl, (%r9, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -35,7 +35,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x1d(%rip), %rdx ;; ja 0x5f -;; 51: movq 0x58(%rdi), %r9 +;; 51: movq 0x50(%rdi), %r9 ;; movzbq (%r9, %rdx), %rax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat index 951a369b7a..430b16cbdc 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x1d(%rip), %rdx ;; ja 0x22 -;; 11: movq 0x58(%rdi), %r9 +;; 11: movq 0x50(%rdi), %r9 ;; movb %cl, 0x1000(%r9, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -37,7 +37,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x1d(%rip), %rdx ;; ja 0x63 -;; 51: movq 0x58(%rdi), %r9 +;; 51: movq 0x50(%rdi), %r9 ;; movzbq 0x1000(%r9, %rdx), %rax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat index 3d3f0ddbd2..6bcdb8ee03 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; cmpq $0xffff, %rdx ;; ja 0x24 -;; 11: addq 0x58(%rdi), %rdx +;; 11: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; movb %cl, (%rdx, %r10) ;; movq %rbp, %rsp @@ -36,7 +36,7 @@ ;; movq %rsp, %rbp ;; cmpq $0xffff, %rdx ;; ja 0x65 -;; 51: addq 0x58(%rdi), %rdx +;; 51: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; movzbq (%rdx, %r10), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat index 84ea6877bf..c1c1960e3c 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; xorq %r9, %r9 ;; movq %rdx, %r8 -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; cmpq 0x13(%rip), %rdx ;; cmovaq %r9, %r8 ;; movl %ecx, (%r8) @@ -40,7 +40,7 @@ ;; movq %rsp, %rbp ;; xorq %r9, %r9 ;; movq %rdx, %r8 -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; cmpq 0x13(%rip), %rdx ;; cmovaq %r9, %r8 ;; movl (%r8), %eax diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index c094c52d60..6b3228e259 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -22,7 +22,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; xorq %r10, %r10 -;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %r11 ;; leaq 0x1000(%r11, %rdx), %r9 ;; cmpq 0xe(%rip), %rdx ;; cmovaq %r10, %r9 @@ -38,7 +38,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; xorq %r10, %r10 -;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %r11 ;; leaq 0x1000(%r11, %rdx), %r9 ;; cmpq 0xe(%rip), %rdx ;; cmovaq %r10, %r9 diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 6667eb14f6..b96ab62935 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; xorq %r11, %r11 ;; movq %rdx, %rsi -;; addq 0x58(%rdi), %rsi +;; addq 0x50(%rdi), %rsi ;; movl $0xffff0000, %edi ;; leaq (%rsi, %rdi), %r10 ;; cmpq $0xfffc, %rdx @@ -38,7 +38,7 @@ ;; movq %rsp, %rbp ;; xorq %r11, %r11 ;; movq %rdx, %rsi -;; addq 0x58(%rdi), %rsi +;; addq 0x50(%rdi), %rsi ;; movl $0xffff0000, %edi ;; leaq (%rsi, %rdi), %r10 ;; cmpq $0xfffc, %rdx diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat index 81f0a50428..a669bbdcbb 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; xorq %r9, %r9 ;; movq %rdx, %r8 -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; cmpq 0x13(%rip), %rdx ;; cmovaq %r9, %r8 ;; movb %cl, (%r8) @@ -40,7 +40,7 @@ ;; movq %rsp, %rbp ;; xorq %r9, %r9 ;; movq %rdx, %r8 -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; cmpq 0x13(%rip), %rdx ;; cmovaq %r9, %r8 ;; movzbq (%r8), %rax diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index b5ca4af6c6..0d6a8b9aae 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -22,7 +22,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; xorq %r10, %r10 -;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %r11 ;; leaq 0x1000(%r11, %rdx), %r9 ;; cmpq 0xe(%rip), %rdx ;; cmovaq %r10, %r9 @@ -36,7 +36,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; xorq %r10, %r10 -;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %r11 ;; leaq 0x1000(%r11, %rdx), %r9 ;; cmpq 0xe(%rip), %rdx ;; cmovaq %r10, %r9 diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index aac5a12384..e3dd0d4ba3 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; xorq %r11, %r11 ;; movq %rdx, %rsi -;; addq 0x58(%rdi), %rsi +;; addq 0x50(%rdi), %rsi ;; movl $0xffff0000, %edi ;; leaq (%rsi, %rdi), %r10 ;; cmpq $0xffff, %rdx @@ -38,7 +38,7 @@ ;; movq %rsp, %rbp ;; xorq %r11, %r11 ;; movq %rdx, %rsi -;; addq 0x58(%rdi), %rsi +;; addq 0x50(%rdi), %rsi ;; movl $0xffff0000, %edi ;; leaq (%rsi, %rdi), %r10 ;; cmpq $0xffff, %rdx diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat index e8e1f59fcf..9168bc3f65 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x15(%rip), %rdx ;; ja 0x1e -;; 11: movq 0x58(%rdi), %r9 +;; 11: movq 0x50(%rdi), %r9 ;; movl %ecx, (%r9, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -36,7 +36,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x15(%rip), %rdx ;; ja 0x5e -;; 51: movq 0x58(%rdi), %r9 +;; 51: movq 0x50(%rdi), %r9 ;; movl (%r9, %rdx), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat index ceeec3f386..678928c659 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x1d(%rip), %rdx ;; ja 0x22 -;; 11: movq 0x58(%rdi), %r9 +;; 11: movq 0x50(%rdi), %r9 ;; movl %ecx, 0x1000(%r9, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -39,7 +39,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x1d(%rip), %rdx ;; ja 0x62 -;; 51: movq 0x58(%rdi), %r9 +;; 51: movq 0x50(%rdi), %r9 ;; movl 0x1000(%r9, %rdx), %eax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat index e6651861ce..8cd1836298 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i32_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; cmpq $0xfffc, %rdx ;; ja 0x24 -;; 11: addq 0x58(%rdi), %rdx +;; 11: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; movl %ecx, (%rdx, %r10) ;; movq %rbp, %rsp @@ -36,7 +36,7 @@ ;; movq %rsp, %rbp ;; cmpq $0xfffc, %rdx ;; ja 0x64 -;; 51: addq 0x58(%rdi), %rdx +;; 51: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; movl (%rdx, %r10), %eax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat index 239653c0ac..cec5dd194e 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x15(%rip), %rdx ;; ja 0x1e -;; 11: movq 0x58(%rdi), %r9 +;; 11: movq 0x50(%rdi), %r9 ;; movb %cl, (%r9, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -35,7 +35,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x1d(%rip), %rdx ;; ja 0x5f -;; 51: movq 0x58(%rdi), %r9 +;; 51: movq 0x50(%rdi), %r9 ;; movzbq (%r9, %rdx), %rax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat index 036bb1e646..3b6eb680ee 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0x1000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x1d(%rip), %rdx ;; ja 0x22 -;; 11: movq 0x58(%rdi), %r9 +;; 11: movq 0x50(%rdi), %r9 ;; movb %cl, 0x1000(%r9, %rdx) ;; movq %rbp, %rsp ;; popq %rbp @@ -37,7 +37,7 @@ ;; movq %rsp, %rbp ;; cmpq 0x1d(%rip), %rdx ;; ja 0x63 -;; 51: movq 0x58(%rdi), %r9 +;; 51: movq 0x50(%rdi), %r9 ;; movzbq 0x1000(%r9, %rdx), %rax ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat index d3d818ffa9..6cbec50dd1 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_no_spectre_i8_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; cmpq $0xffff, %rdx ;; ja 0x24 -;; 11: addq 0x58(%rdi), %rdx +;; 11: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; movb %cl, (%rdx, %r10) ;; movq %rbp, %rsp @@ -36,7 +36,7 @@ ;; movq %rsp, %rbp ;; cmpq $0xffff, %rdx ;; ja 0x65 -;; 51: addq 0x58(%rdi), %rdx +;; 51: addq 0x50(%rdi), %rdx ;; movl $0xffff0000, %r10d ;; movzbq (%rdx, %r10), %rax ;; movq %rbp, %rsp diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat index 573d5e6711..2e65c2c113 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; xorq %r9, %r9 ;; movq %rdx, %r8 -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; cmpq 0x13(%rip), %rdx ;; cmovaq %r9, %r8 ;; movl %ecx, (%r8) @@ -40,7 +40,7 @@ ;; movq %rsp, %rbp ;; xorq %r9, %r9 ;; movq %rdx, %r8 -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; cmpq 0x13(%rip), %rdx ;; cmovaq %r9, %r8 ;; movl (%r8), %eax diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index 5d2e64e4d7..5f864c4d2c 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -22,7 +22,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; xorq %r10, %r10 -;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %r11 ;; leaq 0x1000(%r11, %rdx), %r9 ;; cmpq 0xe(%rip), %rdx ;; cmovaq %r10, %r9 @@ -38,7 +38,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; xorq %r10, %r10 -;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %r11 ;; leaq 0x1000(%r11, %rdx), %r9 ;; cmpq 0xe(%rip), %rdx ;; cmovaq %r10, %r9 diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 301aa60846..531de739dc 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; xorq %r11, %r11 ;; movq %rdx, %rsi -;; addq 0x58(%rdi), %rsi +;; addq 0x50(%rdi), %rsi ;; movl $0xffff0000, %edi ;; leaq (%rsi, %rdi), %r10 ;; cmpq $0xfffc, %rdx @@ -38,7 +38,7 @@ ;; movq %rsp, %rbp ;; xorq %r11, %r11 ;; movq %rdx, %rsi -;; addq 0x58(%rdi), %rsi +;; addq 0x50(%rdi), %rsi ;; movl $0xffff0000, %edi ;; leaq (%rsi, %rdi), %r10 ;; cmpq $0xfffc, %rdx diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat index 50c65b8e76..3363dcd57a 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; xorq %r9, %r9 ;; movq %rdx, %r8 -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; cmpq 0x13(%rip), %rdx ;; cmovaq %r9, %r8 ;; movb %cl, (%r8) @@ -40,7 +40,7 @@ ;; movq %rsp, %rbp ;; xorq %r9, %r9 ;; movq %rdx, %r8 -;; addq 0x58(%rdi), %r8 +;; addq 0x50(%rdi), %r8 ;; cmpq 0x13(%rip), %rdx ;; cmovaq %r9, %r8 ;; movzbq (%r8), %rax diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 2bd45f29ac..bf674258c1 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -22,7 +22,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; xorq %r10, %r10 -;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %r11 ;; leaq 0x1000(%r11, %rdx), %r9 ;; cmpq 0xe(%rip), %rdx ;; cmovaq %r10, %r9 @@ -36,7 +36,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; xorq %r10, %r10 -;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %r11 ;; leaq 0x1000(%r11, %rdx), %r9 ;; cmpq 0xe(%rip), %rdx ;; cmovaq %r10, %r9 diff --git a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 63d86f5ee5..ef543b608a 100644 --- a/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/tests/disas/load-store/x64/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -23,7 +23,7 @@ ;; movq %rsp, %rbp ;; xorq %r11, %r11 ;; movq %rdx, %rsi -;; addq 0x58(%rdi), %rsi +;; addq 0x50(%rdi), %rsi ;; movl $0xffff0000, %edi ;; leaq (%rsi, %rdi), %r10 ;; cmpq $0xffff, %rdx @@ -38,7 +38,7 @@ ;; movq %rsp, %rbp ;; xorq %r11, %r11 ;; movq %rdx, %rsi -;; addq 0x58(%rdi), %rsi +;; addq 0x50(%rdi), %rsi ;; movl $0xffff0000, %edi ;; leaq (%rsi, %rdi), %r10 ;; cmpq $0xffff, %rdx diff --git a/tests/disas/memory.wat b/tests/disas/memory.wat index 7241c0cdf1..191fdad68a 100644 --- a/tests/disas/memory.wat +++ b/tests/disas/memory.wat @@ -17,8 +17,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64): @@ -26,12 +26,12 @@ ;; @0021 v3 = iconst.i32 0 ;; @0023 v4 = iconst.i32 0 ;; @0025 v5 = uextend.i64 v3 ; v3 = 0 -;; @0025 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0025 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0025 v7 = iadd v6, v5 ;; @0025 store little heap v4, v7 ; v4 = 0 ;; @0028 v8 = iconst.i32 0 ;; @002a v9 = uextend.i64 v8 ; v8 = 0 -;; @002a v10 = load.i64 notrap aligned readonly checked v0+88 +;; @002a v10 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @002a v11 = iadd v10, v9 ;; @002a v12 = load.i32 little heap v11 ;; @002d brif v12, block2, block4 @@ -40,7 +40,7 @@ ;; @002f v13 = iconst.i32 0 ;; @0031 v14 = iconst.i32 10 ;; @0033 v15 = uextend.i64 v13 ; v13 = 0 -;; @0033 v16 = load.i64 notrap aligned readonly checked v0+88 +;; @0033 v16 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0033 v17 = iadd v16, v15 ;; @0033 store little heap v14, v17 ; v14 = 10 ;; @0036 jump block3 @@ -49,7 +49,7 @@ ;; @0037 v18 = iconst.i32 0 ;; @0039 v19 = iconst.i32 11 ;; @003b v20 = uextend.i64 v18 ; v18 = 0 -;; @003b v21 = load.i64 notrap aligned readonly checked v0+88 +;; @003b v21 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @003b v22 = iadd v21, v20 ;; @003b store little heap v19, v22 ; v19 = 11 ;; @003e jump block3 diff --git a/tests/disas/non-fixed-size-memory.wat b/tests/disas/non-fixed-size-memory.wat index 01e87fd69e..5d767a8cfd 100644 --- a/tests/disas/non-fixed-size-memory.wat +++ b/tests/disas/non-fixed-size-memory.wat @@ -25,16 +25,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): ;; @0041 v4 = uextend.i64 v2 -;; @0041 v5 = load.i64 notrap aligned v0+96 +;; @0041 v5 = load.i64 notrap aligned v0+88 ;; @0041 v6 = icmp uge v4, v5 ;; @0041 trapnz v6, heap_oob -;; @0041 v7 = load.i64 notrap aligned checked v0+88 +;; @0041 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0041 v8 = iadd v7, v4 ;; @0041 istore8 little heap v3, v8 ;; @0044 jump block1 @@ -48,16 +48,16 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0049 v4 = uextend.i64 v2 -;; @0049 v5 = load.i64 notrap aligned v0+96 +;; @0049 v5 = load.i64 notrap aligned v0+88 ;; @0049 v6 = icmp uge v4, v5 ;; @0049 trapnz v6, heap_oob -;; @0049 v7 = load.i64 notrap aligned checked v0+88 +;; @0049 v7 = load.i64 notrap aligned can_move checked v0+80 ;; @0049 v8 = iadd v7, v4 ;; @0049 v9 = uload8.i32 little heap v8 ;; @004c jump block1 diff --git a/tests/disas/passive-data.wat b/tests/disas/passive-data.wat index 9fa1ded590..62270e786c 100644 --- a/tests/disas/passive-data.wat +++ b/tests/disas/passive-data.wat @@ -18,8 +18,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; sig0 = (i64 vmctx, i32, i32, i64, i32, i32) -> i8 tail ;; fn0 = colocated u1:6 sig0 ;; stack_limit = gv2 diff --git a/tests/disas/pcc-imported-memory.wat b/tests/disas/pcc-imported-memory.wat index a891f47af5..9d1bcad2c1 100644 --- a/tests/disas/pcc-imported-memory.wat +++ b/tests/disas/pcc-imported-memory.wat @@ -37,7 +37,7 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x50(%rdi), %rcx +;; movq 0x48(%rdi), %rcx ;; movq 8(%rcx), %rax ;; shrq $0x10, %rax ;; movq %rax, %rcx @@ -47,7 +47,7 @@ ;; jbe 0x3b ;; 21: testl %eax, %eax ;; jle 0x3b -;; 29: movq 0x50(%rdi), %rsi +;; 29: movq 0x48(%rdi), %rsi ;; movq (%rsi), %rsi ;; movl %eax, %edi ;; movl (%rsi, %rdi), %r10d diff --git a/tests/disas/pcc-insertlane-x64-avx.wat b/tests/disas/pcc-insertlane-x64-avx.wat index 20bc0128c3..93699baf9c 100644 --- a/tests/disas/pcc-insertlane-x64-avx.wat +++ b/tests/disas/pcc-insertlane-x64-avx.wat @@ -70,7 +70,7 @@ ;; movq %rsp, %rbp ;; vmovdqu 0x14(%rip), %xmm6 ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; vpinsrb $1, (%r10, %r9), %xmm6, %xmm0 ;; movq %rbp, %rsp ;; popq %rbp @@ -85,7 +85,7 @@ ;; movq %rsp, %rbp ;; vmovdqu 0x14(%rip), %xmm6 ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; vpinsrw $1, (%r10, %r9), %xmm6, %xmm0 ;; movq %rbp, %rsp ;; popq %rbp @@ -100,7 +100,7 @@ ;; movq %rsp, %rbp ;; vmovdqu 0x14(%rip), %xmm6 ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; vpinsrd $1, (%r10, %r9), %xmm6, %xmm0 ;; movq %rbp, %rsp ;; popq %rbp @@ -115,7 +115,7 @@ ;; movq %rsp, %rbp ;; vmovdqu 0x14(%rip), %xmm6 ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; vpinsrq $1, (%r10, %r9), %xmm6, %xmm0 ;; movq %rbp, %rsp ;; popq %rbp @@ -129,7 +129,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; vinsertps $0, (%r10, %r9), %xmm0, %xmm0 ;; movq %rbp, %rsp ;; popq %rbp @@ -139,7 +139,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; vmovhps (%r10, %r9), %xmm0, %xmm0 ;; movq %rbp, %rsp ;; popq %rbp @@ -149,7 +149,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r10d -;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %r11 ;; vmovsd (%r11, %r10), %xmm7 ;; vmovsd %xmm7, %xmm0, %xmm0 ;; movq %rbp, %rsp @@ -161,7 +161,7 @@ ;; movq %rsp, %rbp ;; vpshufd $0xee, %xmm0, %xmm6 ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; vmovsd %xmm6, (%r10, %r9) ;; movq %rbp, %rsp ;; popq %rbp @@ -172,7 +172,7 @@ ;; movq %rsp, %rbp ;; vpshufd $1, %xmm0, %xmm6 ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; vmovss %xmm6, (%r10, %r9) ;; movq %rbp, %rsp ;; popq %rbp @@ -184,7 +184,7 @@ ;; vpextrb $1, %xmm0, %r10d ;; movsbl %r10b, %r10d ;; movl %edx, %r11d -;; movq 0x58(%rdi), %rsi +;; movq 0x50(%rdi), %rsi ;; movb %r10b, (%rsi, %r11) ;; movq %rbp, %rsp ;; popq %rbp @@ -196,7 +196,7 @@ ;; vpextrw $1, %xmm0, %r10d ;; movswl %r10w, %r10d ;; movl %edx, %r11d -;; movq 0x58(%rdi), %rsi +;; movq 0x50(%rdi), %rsi ;; movw %r10w, (%rsi, %r11) ;; movq %rbp, %rsp ;; popq %rbp @@ -206,7 +206,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; movq 0x58(%rdi), %r9 +;; movq 0x50(%rdi), %r9 ;; vpextrd $1, %xmm0, (%r9, %r8) ;; movq %rbp, %rsp ;; popq %rbp @@ -216,7 +216,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; movq 0x58(%rdi), %r9 +;; movq 0x50(%rdi), %r9 ;; vpextrq $1, %xmm0, (%r9, %r8) ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/pcc-insertlane-x64.wat b/tests/disas/pcc-insertlane-x64.wat index 675eb22eb4..f621e024be 100644 --- a/tests/disas/pcc-insertlane-x64.wat +++ b/tests/disas/pcc-insertlane-x64.wat @@ -70,7 +70,7 @@ ;; movq %rsp, %rbp ;; movdqu 0x14(%rip), %xmm0 ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; pinsrb $1, (%r10, %r9), %xmm0 ;; movq %rbp, %rsp ;; popq %rbp @@ -86,7 +86,7 @@ ;; movq %rsp, %rbp ;; movdqu 0x14(%rip), %xmm0 ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; pinsrw $1, (%r10, %r9), %xmm0 ;; movq %rbp, %rsp ;; popq %rbp @@ -101,7 +101,7 @@ ;; movq %rsp, %rbp ;; movdqu 0x14(%rip), %xmm0 ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; pinsrd $1, (%r10, %r9), %xmm0 ;; movq %rbp, %rsp ;; popq %rbp @@ -117,7 +117,7 @@ ;; movq %rsp, %rbp ;; movdqu 0x14(%rip), %xmm0 ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; pinsrq $1, (%r10, %r9), %xmm0 ;; movq %rbp, %rsp ;; popq %rbp @@ -132,7 +132,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; insertps $0, (%r10, %r9), %xmm0 ;; movq %rbp, %rsp ;; popq %rbp @@ -142,7 +142,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r10d -;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %r11 ;; movdqu (%r11, %r10), %xmm6 ;; movlhps %xmm6, %xmm0 ;; movq %rbp, %rsp @@ -153,7 +153,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r10d -;; movq 0x58(%rdi), %r11 +;; movq 0x50(%rdi), %r11 ;; movsd (%r11, %r10), %xmm7 ;; movsd %xmm7, %xmm0 ;; movq %rbp, %rsp @@ -165,7 +165,7 @@ ;; movq %rsp, %rbp ;; pshufd $0xee, %xmm0, %xmm6 ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; movsd %xmm6, (%r10, %r9) ;; movq %rbp, %rsp ;; popq %rbp @@ -176,7 +176,7 @@ ;; movq %rsp, %rbp ;; pshufd $1, %xmm0, %xmm6 ;; movl %edx, %r9d -;; movq 0x58(%rdi), %r10 +;; movq 0x50(%rdi), %r10 ;; movss %xmm6, (%r10, %r9) ;; movq %rbp, %rsp ;; popq %rbp @@ -188,7 +188,7 @@ ;; pextrb $1, %xmm0, %r10d ;; movsbl %r10b, %r10d ;; movl %edx, %r11d -;; movq 0x58(%rdi), %rsi +;; movq 0x50(%rdi), %rsi ;; movb %r10b, (%rsi, %r11) ;; movq %rbp, %rsp ;; popq %rbp @@ -200,7 +200,7 @@ ;; pextrw $1, %xmm0, %r10d ;; movswl %r10w, %r10d ;; movl %edx, %r11d -;; movq 0x58(%rdi), %rsi +;; movq 0x50(%rdi), %rsi ;; movw %r10w, (%rsi, %r11) ;; movq %rbp, %rsp ;; popq %rbp @@ -210,7 +210,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; movq 0x58(%rdi), %r9 +;; movq 0x50(%rdi), %r9 ;; pextrd $1, %xmm0, (%r9, %r8) ;; movq %rbp, %rsp ;; popq %rbp @@ -220,7 +220,7 @@ ;; pushq %rbp ;; movq %rsp, %rbp ;; movl %edx, %r8d -;; movq 0x58(%rdi), %r9 +;; movq 0x50(%rdi), %r9 ;; pextrq $1, %xmm0, (%r9, %r8) ;; movq %rbp, %rsp ;; popq %rbp diff --git a/tests/disas/pcc-loads-x64-avx.wat b/tests/disas/pcc-loads-x64-avx.wat index 94881669a3..019cf70a86 100644 --- a/tests/disas/pcc-loads-x64-avx.wat +++ b/tests/disas/pcc-loads-x64-avx.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; vmovss (%r8, %r9), %xmm0 ;; movq %rbp, %rsp @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; vmovsd (%r8, %r9), %xmm0 ;; movq %rbp, %rsp @@ -41,7 +41,7 @@ ;; wasm[0]::function[2]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; vmovss %xmm0, (%r8, %r9) ;; movq %rbp, %rsp @@ -51,7 +51,7 @@ ;; wasm[0]::function[3]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; vmovsd %xmm0, (%r8, %r9) ;; movq %rbp, %rsp diff --git a/tests/disas/pcc-loads-x64.wat b/tests/disas/pcc-loads-x64.wat index e7f728c921..2b05a79e96 100644 --- a/tests/disas/pcc-loads-x64.wat +++ b/tests/disas/pcc-loads-x64.wat @@ -21,7 +21,7 @@ ;; wasm[0]::function[0]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movss (%r8, %r9), %xmm0 ;; movq %rbp, %rsp @@ -31,7 +31,7 @@ ;; wasm[0]::function[1]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movsd (%r8, %r9), %xmm0 ;; movq %rbp, %rsp @@ -41,7 +41,7 @@ ;; wasm[0]::function[2]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movss %xmm0, (%r8, %r9) ;; movq %rbp, %rsp @@ -51,7 +51,7 @@ ;; wasm[0]::function[3]: ;; pushq %rbp ;; movq %rsp, %rbp -;; movq 0x58(%rdi), %r8 +;; movq 0x50(%rdi), %r8 ;; movl %edx, %r9d ;; movsd %xmm0, (%r8, %r9) ;; movq %rbp, %rsp diff --git a/tests/disas/pr2303.wat b/tests/disas/pr2303.wat index ffa80abf1a..cf0168d8ad 100644 --- a/tests/disas/pr2303.wat +++ b/tests/disas/pr2303.wat @@ -21,20 +21,20 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0036 v3 = iconst.i32 48 ;; @0038 v4 = iconst.i32 0 ;; @003a v5 = uextend.i64 v4 ; v4 = 0 -;; @003a v6 = load.i64 notrap aligned readonly checked v0+88 +;; @003a v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @003a v7 = iadd v6, v5 ;; @003a v8 = load.i8x16 little heap v7 ;; @003e v9 = iconst.i32 16 ;; @0040 v10 = uextend.i64 v9 ; v9 = 16 -;; @0040 v11 = load.i64 notrap aligned readonly checked v0+88 +;; @0040 v11 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0040 v12 = iadd v11, v10 ;; @0040 v13 = load.i8x16 little heap v12 ;; @0046 brif v2, block2, block4 @@ -45,7 +45,7 @@ ;; @0048 v18 = iadd v16, v17 ;; @004b v19 = iconst.i32 32 ;; @004d v20 = uextend.i64 v19 ; v19 = 32 -;; @004d v21 = load.i64 notrap aligned readonly checked v0+88 +;; @004d v21 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @004d v22 = iadd v21, v20 ;; @004d v23 = load.i8x16 little heap v22 ;; @0051 v26 = bitcast.i8x16 little v18 @@ -57,7 +57,7 @@ ;; @0052 v29 = isub v27, v28 ;; @0055 v30 = iconst.i32 0 ;; @0057 v31 = uextend.i64 v30 ; v30 = 0 -;; @0057 v32 = load.i64 notrap aligned readonly checked v0+88 +;; @0057 v32 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0057 v33 = iadd v32, v31 ;; @0057 v34 = load.i8x16 little heap v33 ;; @005b v35 = bitcast.i8x16 little v29 @@ -68,7 +68,7 @@ ;; @005c v37 = bitcast.i16x8 little v15 ;; @005c v38 = imul v36, v37 ;; @005f v39 = uextend.i64 v3 ; v3 = 48 -;; @005f v40 = load.i64 notrap aligned readonly checked v0+88 +;; @005f v40 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @005f v41 = iadd v40, v39 ;; @005f store little heap v38, v41 ;; @0063 jump block1 diff --git a/tests/disas/pulley/call.wat b/tests/disas/pulley/call.wat index 5c3efe6c62..a950782da0 100644 --- a/tests/disas/pulley/call.wat +++ b/tests/disas/pulley/call.wat @@ -7,9 +7,9 @@ ) ;; wasm[0]::function[1]: ;; push_frame -;; xload32le_o32 x3, x0, 40 +;; xload32le_o32 x3, x0, 36 ;; xmov x6, x0 -;; xload32le_o32 x0, x6, 48 +;; xload32le_o32 x0, x6, 44 ;; xmov x1, x6 ;; call_indirect x3 ;; pop_frame diff --git a/tests/disas/pulley/coremark-1.wat b/tests/disas/pulley/coremark-1.wat index 89fcfc8a5a..c568c651df 100644 --- a/tests/disas/pulley/coremark-1.wat +++ b/tests/disas/pulley/coremark-1.wat @@ -70,28 +70,28 @@ (func $other) ) ;; wasm[0]::function[0]: -;; push_frame_save 16, x16 +;; push_frame_save 16, x26 ;; xzero x6 -;; xload64le_o32 x11, x0, 88 -;; xload64le_o32 x13, x0, 96 -;; xload16le_u32_g32 x12, x11, x13, x2, 0 -;; xload16le_u32_g32 x13, x11, x13, x3, 0 +;; xload64le_o32 x7, x0, 80 +;; xload64le_o32 x9, x0, 88 +;; xload16le_u32_g32 x8, x7, x9, x2, 0 +;; xload16le_u32_g32 x9, x7, x9, x3, 0 ;; xsub32_u8 x4, x4, 1 -;; xmul32 x12, x12, x13 -;; xshr32_u_u6 x13, x12, 2 -;; xband32_s8 x13, x13, 15 -;; xshr32_u_u6 x12, x12, 5 -;; xband32_s8 x12, x12, 127 -;; xmadd32 x6, x13, x12, x6 -;; xmov x16, x6 +;; xmul32 x8, x8, x9 +;; xshr32_u_u6 x9, x8, 2 +;; xband32_s8 x9, x9, 15 +;; xshr32_u_u6 x8, x8, 5 +;; xband32_s8 x8, x8, 127 +;; xmadd32 x6, x9, x8, x6 +;; xmov x26, x6 ;; xadd32 x2, x2, x5 ;; xadd32_u8 x3, x3, 2 ;; br_if_not32 x4, 0xe // target = 0x53 -;; 4b: xmov x6, x16 +;; 4b: xmov x6, x26 ;; jump -0x40 // target = 0xe ;; 53: call2 x0, x0, 0x10 // target = 0x63 -;; xmov x0, x16 -;; pop_frame_restore 16, x16 +;; xmov x0, x26 +;; pop_frame_restore 16, x26 ;; ret ;; ;; wasm[0]::function[1]::other: diff --git a/tests/disas/pulley/epoch-simple.wat b/tests/disas/pulley/epoch-simple.wat index 8ac5c4bc7c..8de5d2e68f 100644 --- a/tests/disas/pulley/epoch-simple.wat +++ b/tests/disas/pulley/epoch-simple.wat @@ -7,11 +7,11 @@ ) ;; wasm[0]::function[0]: ;; push_frame -;; xload64le_o32 x6, x0, 8 -;; xload64le_o32 x7, x0, 32 -;; xload64le_o32 x7, x7, 0 -;; xload64le_o32 x6, x6, 8 -;; br_if_xulteq64 x6, x7, 0x9 // target = 0x26 +;; xload64le_o32 x6, x0, 32 +;; xload64le_o32 x6, x6, 0 +;; xload64le_o32 x7, x0, 8 +;; xload64le_o32 x7, x7, 8 +;; br_if_xulteq64 x7, x6, 0x9 // target = 0x26 ;; 24: pop_frame ;; ret ;; 26: call 0x9e // target = 0xc4 diff --git a/tests/disas/pulley/memory-inbounds.wat b/tests/disas/pulley/memory-inbounds.wat index 8e6da87e03..f2ce02a615 100644 --- a/tests/disas/pulley/memory-inbounds.wat +++ b/tests/disas/pulley/memory-inbounds.wat @@ -20,67 +20,66 @@ ;; wasm[0]::function[0]::offset0: ;; push_frame -;; xload64le_o32 x3, x0, 88 +;; xload64le_o32 x3, x0, 80 ;; xload32le_z x0, x3, 0 ;; pop_frame ;; ret ;; ;; wasm[0]::function[1]::offset100: ;; push_frame -;; xload64le_o32 x3, x0, 88 +;; xload64le_o32 x3, x0, 80 ;; xload32le_z x0, x3, 100 ;; pop_frame ;; ret ;; ;; wasm[0]::function[2]::offset_mixed: ;; push_frame -;; xload64le_o32 x3, x0, 88 +;; xload64le_o32 x3, x0, 80 ;; xload32le_z x0, x3, 200 ;; pop_frame ;; ret ;; ;; wasm[0]::function[3]::offset_just_ok: ;; push_frame -;; xload64le_o32 x3, x0, 88 +;; xload64le_o32 x3, x0, 80 ;; xload32le_z x0, x3, 65532 ;; pop_frame ;; ret ;; ;; wasm[0]::function[4]::offset_just_bad: ;; push_frame -;; xload64le_o32 x5, x0, 96 +;; xload64le_o32 x5, x0, 88 ;; xconst32 x6, 65533 -;; xload64le_o32 x7, x0, 88 +;; xload64le_o32 x7, x0, 80 ;; xload32le_g32 x0, x7, x5, x6, 0 ;; pop_frame ;; ret ;; ;; wasm[0]::function[5]::offset_just_ok_v2: ;; push_frame -;; xload64le_o32 x3, x0, 88 +;; xload64le_o32 x3, x0, 80 ;; xload32le_z x0, x3, 65532 ;; pop_frame ;; ret ;; ;; wasm[0]::function[6]::offset_just_bad_v2: ;; push_frame -;; xload64le_o32 x10, x0, 96 -;; xsub64_u32 x10, x10, 65536 -;; xzero x11 -;; xload64le_o32 x12, x0, 88 -;; xadd64_u32 x12, x12, 65533 -;; xzero x8 -;; xeq64 x10, x10, x8 -;; xselect64 x12, x10, x11, x12 -;; xload32le_z x0, x12, 0 +;; xload64le_o32 x9, x0, 88 +;; xzero x10 +;; xload64le_o32 x11, x0, 80 +;; xadd64_u32 x11, x11, 65533 +;; xconst32 x7, 65536 +;; xeq64 x9, x9, x7 +;; xselect64 x11, x9, x10, x11 +;; xload32le_z x0, x11, 0 ;; pop_frame ;; ret ;; ;; wasm[0]::function[7]::maybe_inbounds: ;; push_frame -;; xload64le_o32 x5, x0, 96 +;; xload64le_o32 x5, x0, 88 ;; xconst32 x6, 131068 -;; xload64le_o32 x7, x0, 88 +;; xload64le_o32 x7, x0, 80 ;; xload32le_g32 x0, x7, x5, x6, 0 ;; pop_frame ;; ret @@ -90,8 +89,8 @@ ;; xzero x10 ;; xconst32 x11, 131072 ;; xadd64_uoverflow_trap x11, x10, x11 -;; xload64le_o32 x12, x0, 96 -;; xload64le_o32 x13, x0, 88 +;; xload64le_o32 x12, x0, 88 +;; xload64le_o32 x13, x0, 80 ;; xadd64_u32 x13, x13, 131068 ;; xult64 x9, x12, x11 ;; xselect64 x11, x9, x10, x13 @@ -101,9 +100,9 @@ ;; ;; wasm[0]::function[9]::never_inbounds: ;; push_frame -;; xload64le_o32 x5, x0, 96 +;; xload64le_o32 x5, x0, 88 ;; xconst32 x6, 131069 -;; xload64le_o32 x7, x0, 88 +;; xload64le_o32 x7, x0, 80 ;; xload32le_g32 x0, x7, x5, x6, 0 ;; pop_frame ;; ret diff --git a/tests/disas/pulley/pulley32_memory32.wat b/tests/disas/pulley/pulley32_memory32.wat index 8a9e7ba18a..389adba636 100644 --- a/tests/disas/pulley/pulley32_memory32.wat +++ b/tests/disas/pulley/pulley32_memory32.wat @@ -54,128 +54,128 @@ ) ;; wasm[0]::function[0]::load8: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xload8_u32_g32 x0, x6, x5, x2, 0 ;; pop_frame ;; ret ;; ;; wasm[0]::function[1]::load16: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xload16le_u32_g32 x0, x6, x5, x2, 0 ;; pop_frame ;; ret ;; ;; wasm[0]::function[2]::load32: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xload32le_g32 x0, x6, x5, x2, 0 ;; pop_frame ;; ret ;; ;; wasm[0]::function[3]::load64: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xload64le_g32 x0, x6, x5, x2, 0 ;; pop_frame ;; ret ;; ;; wasm[0]::function[4]::store8: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xstore8_g32 x6, x5, x2, 0, x3 ;; pop_frame ;; ret ;; ;; wasm[0]::function[5]::store16: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xstore16le_g32 x6, x5, x2, 0, x3 ;; pop_frame ;; ret ;; ;; wasm[0]::function[6]::store32: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xstore32le_g32 x6, x5, x2, 0, x3 ;; pop_frame ;; ret ;; ;; wasm[0]::function[7]::store64: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xstore64le_g32 x6, x5, x2, 0, x3 ;; pop_frame ;; ret ;; ;; wasm[0]::function[8]::load8_offset: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xload8_u32_g32 x0, x6, x5, x2, 32 ;; pop_frame ;; ret ;; ;; wasm[0]::function[9]::load16_offset: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xload16le_u32_g32 x0, x6, x5, x2, 32 ;; pop_frame ;; ret ;; ;; wasm[0]::function[10]::load32_offset: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xload32le_g32 x0, x6, x5, x2, 32 ;; pop_frame ;; ret ;; ;; wasm[0]::function[11]::load64_offset: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xload64le_g32 x0, x6, x5, x2, 32 ;; pop_frame ;; ret ;; ;; wasm[0]::function[12]::store8_offset: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xstore8_g32 x6, x5, x2, 8, x3 ;; pop_frame ;; ret ;; ;; wasm[0]::function[13]::store16_offset: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xstore16le_g32 x6, x5, x2, 8, x3 ;; pop_frame ;; ret ;; ;; wasm[0]::function[14]::store32_offset: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xstore32le_g32 x6, x5, x2, 8, x3 ;; pop_frame ;; ret ;; ;; wasm[0]::function[15]::store64_offset: ;; push_frame -;; xload32le_o32 x5, x0, 48 -;; xload32le_o32 x6, x0, 44 +;; xload32le_o32 x5, x0, 44 +;; xload32le_o32 x6, x0, 40 ;; xstore64le_g32 x6, x5, x2, 8, x3 ;; pop_frame ;; ret diff --git a/tests/disas/pulley/pulley64_memory32.wat b/tests/disas/pulley/pulley64_memory32.wat index 988c7cc14e..f6c7480d4d 100644 --- a/tests/disas/pulley/pulley64_memory32.wat +++ b/tests/disas/pulley/pulley64_memory32.wat @@ -1,5 +1,6 @@ ;;! target = "pulley64" ;;! test = "compile" +;;! objdump = '--traps --addrmap' (module (memory 1) @@ -58,137 +59,189 @@ ) ;; wasm[0]::function[0]::load8: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0x47 +;; xload64le_o32 x6, x0, 80 ;; xload8_u32_g32 x0, x6, x5, x2, 0 ;; pop_frame +;; ╰─╼ addrmap: 0x4a ;; ret ;; ;; wasm[0]::function[1]::load16: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0x4f +;; xload64le_o32 x6, x0, 80 ;; xload16le_u32_g32 x0, x6, x5, x2, 0 ;; pop_frame +;; ╰─╼ addrmap: 0x52 ;; ret ;; ;; wasm[0]::function[2]::load32: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0x57 +;; xload64le_o32 x6, x0, 80 ;; xload32le_g32 x0, x6, x5, x2, 0 ;; pop_frame +;; ╰─╼ addrmap: 0x5a ;; ret ;; ;; wasm[0]::function[3]::load64: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0x5f +;; xload64le_o32 x6, x0, 80 ;; xload64le_g32 x0, x6, x5, x2, 0 ;; pop_frame +;; ╰─╼ addrmap: 0x62 ;; ret ;; ;; wasm[0]::function[4]::store8: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0x69 +;; xload64le_o32 x6, x0, 80 ;; xstore8_g32 x6, x5, x2, 0, x3 ;; pop_frame +;; ╰─╼ addrmap: 0x6c ;; ret ;; ;; wasm[0]::function[5]::store16: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0x73 +;; xload64le_o32 x6, x0, 80 ;; xstore16le_g32 x6, x5, x2, 0, x3 ;; pop_frame +;; ╰─╼ addrmap: 0x76 ;; ret ;; ;; wasm[0]::function[6]::store32: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0x7d +;; xload64le_o32 x6, x0, 80 ;; xstore32le_g32 x6, x5, x2, 0, x3 ;; pop_frame +;; ╰─╼ addrmap: 0x80 ;; ret ;; ;; wasm[0]::function[7]::store64: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0x87 +;; xload64le_o32 x6, x0, 80 ;; xstore64le_g32 x6, x5, x2, 0, x3 ;; pop_frame +;; ╰─╼ addrmap: 0x8a ;; ret ;; ;; wasm[0]::function[8]::load8_offset: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0x8f +;; xload64le_o32 x6, x0, 80 ;; xload8_u32_g32 x0, x6, x5, x2, 32 ;; pop_frame +;; ╰─╼ addrmap: 0x92 ;; ret ;; ;; wasm[0]::function[9]::load16_offset: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0x97 +;; xload64le_o32 x6, x0, 80 ;; xload16le_u32_g32 x0, x6, x5, x2, 32 ;; pop_frame +;; ╰─╼ addrmap: 0x9a ;; ret ;; ;; wasm[0]::function[10]::load32_offset: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0x9f +;; xload64le_o32 x6, x0, 80 ;; xload32le_g32 x0, x6, x5, x2, 32 ;; pop_frame +;; ╰─╼ addrmap: 0xa2 ;; ret ;; ;; wasm[0]::function[11]::load64_offset: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0xa7 +;; xload64le_o32 x6, x0, 80 ;; xload64le_g32 x0, x6, x5, x2, 32 ;; pop_frame +;; ╰─╼ addrmap: 0xaa ;; ret ;; ;; wasm[0]::function[12]::store8_offset: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0xb1 +;; xload64le_o32 x6, x0, 80 ;; xstore8_g32 x6, x5, x2, 8, x3 ;; pop_frame +;; ╰─╼ addrmap: 0xb4 ;; ret ;; ;; wasm[0]::function[13]::store16_offset: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0xbb +;; xload64le_o32 x6, x0, 80 ;; xstore16le_g32 x6, x5, x2, 8, x3 ;; pop_frame +;; ╰─╼ addrmap: 0xbe ;; ret ;; ;; wasm[0]::function[14]::store32_offset: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0xc5 +;; xload64le_o32 x6, x0, 80 ;; xstore32le_g32 x6, x5, x2, 8, x3 ;; pop_frame +;; ╰─╼ addrmap: 0xc8 ;; ret ;; ;; wasm[0]::function[15]::store64_offset: ;; push_frame -;; xload64le_o32 x5, x0, 96 -;; xload64le_o32 x6, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x5, x0, 88 +;; ╰─╼ addrmap: 0xcf +;; xload64le_o32 x6, x0, 80 ;; xstore64le_g32 x6, x5, x2, 8, x3 ;; pop_frame +;; ╰─╼ addrmap: 0xd2 ;; ret ;; ;; wasm[0]::function[16]::load16_two: ;; push_frame -;; xload64le_o32 x7, x0, 96 -;; xload64le_o32 x8, x0, 88 +;; ╰─╼ trap: StackOverflow +;; xload64le_o32 x7, x0, 88 +;; ╰─╼ addrmap: 0xd7 +;; xload64le_o32 x8, x0, 80 ;; xload16le_u32_g32 x0, x8, x7, x2, 0 ;; xload16le_u32_g32 x1, x8, x7, x3, 0 +;; ╰─╼ addrmap: 0xdc ;; pop_frame +;; ╰─╼ addrmap: 0xdf ;; ret diff --git a/tests/disas/readonly-funcrefs.wat b/tests/disas/readonly-funcrefs.wat index 0bf74566aa..8a260d1b0d 100644 --- a/tests/disas/readonly-funcrefs.wat +++ b/tests/disas/readonly-funcrefs.wat @@ -36,7 +36,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i64) tail ;; sig1 = (i64 vmctx, i32, i64) -> i64 tail ;; fn0 = colocated u1:9 sig1 @@ -46,7 +46,7 @@ ;; @0031 v3 = iconst.i32 2 ;; @0031 v4 = icmp uge v2, v3 ; v3 = 2 ;; @0031 v9 = iconst.i64 0 -;; @0031 v6 = load.i64 notrap aligned readonly v0+80 +;; @0031 v6 = load.i64 notrap aligned readonly can_move v0+72 ;; @0031 v5 = uextend.i64 v2 ;; v26 = iconst.i64 3 ;; @0031 v7 = ishl v5, v26 ; v26 = 3 @@ -64,8 +64,8 @@ ;; ;; block3(v13: i64): ;; @0031 v21 = load.i32 user6 aligned readonly v13+16 -;; @0031 v19 = load.i64 notrap aligned readonly v0+64 -;; @0031 v20 = load.i32 notrap aligned readonly v19 +;; @0031 v19 = load.i64 notrap aligned readonly can_move v0+64 +;; @0031 v20 = load.i32 notrap aligned readonly can_move v19 ;; @0031 v22 = icmp eq v21, v20 ;; @0031 trapz v22, user7 ;; @0031 v23 = load.i64 notrap aligned readonly v13+8 diff --git a/tests/disas/readonly-heap-base-pointer1.wat b/tests/disas/readonly-heap-base-pointer1.wat index 2d6e0c9dcd..ea3d7a687c 100644 --- a/tests/disas/readonly-heap-base-pointer1.wat +++ b/tests/disas/readonly-heap-base-pointer1.wat @@ -12,8 +12,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): @@ -21,7 +21,7 @@ ;; @0020 v5 = iconst.i64 0x0001_fffc ;; @0020 v6 = icmp ugt v4, v5 ; v5 = 0x0001_fffc ;; @0020 v9 = iconst.i64 0 -;; @0020 v7 = load.i64 notrap aligned readonly checked v0+88 +;; @0020 v7 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0020 v8 = iadd v7, v4 ;; @0020 v10 = select_spectre_guard v6, v9, v8 ; v9 = 0 ;; @0020 v11 = load.i32 little heap v10 diff --git a/tests/disas/readonly-heap-base-pointer2.wat b/tests/disas/readonly-heap-base-pointer2.wat index 0f60de44e6..6e1377b0fd 100644 --- a/tests/disas/readonly-heap-base-pointer2.wat +++ b/tests/disas/readonly-heap-base-pointer2.wat @@ -12,9 +12,9 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; gv5 = load.i64 notrap aligned gv4+8 -;; gv6 = load.i64 notrap aligned readonly checked gv4 +;; gv6 = load.i64 notrap aligned readonly can_move checked gv4 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): @@ -22,8 +22,8 @@ ;; @0022 v5 = iconst.i64 0x0001_fffc ;; @0022 v6 = icmp ugt v4, v5 ; v5 = 0x0001_fffc ;; @0022 v9 = iconst.i64 0 -;; @0022 v12 = load.i64 notrap aligned readonly v0+80 -;; @0022 v7 = load.i64 notrap aligned readonly checked v12 +;; @0022 v12 = load.i64 notrap aligned readonly can_move v0+72 +;; @0022 v7 = load.i64 notrap aligned readonly can_move checked v12 ;; @0022 v8 = iadd v7, v4 ;; @0022 v10 = select_spectre_guard v6, v9, v8 ; v9 = 0 ;; @0022 v11 = load.i32 little heap v10 diff --git a/tests/disas/readonly-heap-base-pointer3.wat b/tests/disas/readonly-heap-base-pointer3.wat index 15e21acf79..ad834c359a 100644 --- a/tests/disas/readonly-heap-base-pointer3.wat +++ b/tests/disas/readonly-heap-base-pointer3.wat @@ -12,15 +12,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i64): ;; @0020 v4 = iconst.i64 0xffff_fffc ;; @0020 v5 = icmp ugt v2, v4 ; v4 = 0xffff_fffc ;; @0020 v8 = iconst.i64 0 -;; @0020 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0020 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0020 v7 = iadd v6, v2 ;; @0020 v9 = select_spectre_guard v5, v8, v7 ; v8 = 0 ;; @0020 v10 = load.i32 little heap v9 diff --git a/tests/disas/ref-func-0.wat b/tests/disas/ref-func-0.wat index 5c347a1433..ef03905c44 100644 --- a/tests/disas/ref-func-0.wat +++ b/tests/disas/ref-func-0.wat @@ -25,138 +25,150 @@ ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64): -;; v94 = iconst.i64 112 -;; @008f v7 = iadd v0, v94 ; v94 = 112 -;; @008f v8 = load.i32 notrap aligned v7 -;; v95 = stack_addr.i64 ss0 -;; store notrap v8, v95 -;; v96 = stack_addr.i64 ss0 -;; v93 = load.i32 notrap v96 -;; v97 = iconst.i32 0 -;; @008f v9 = icmp eq v93, v97 ; v97 = 0 -;; @008f brif v9, block5, block2 +;; v102 = iconst.i64 96 +;; @008f v7 = iadd v0, v102 ; v102 = 96 +;; @008f v8 = load.i32 notrap aligned readonly can_move v7 +;; v103 = stack_addr.i64 ss0 +;; store notrap v8, v103 +;; v104 = stack_addr.i64 ss0 +;; v101 = load.i32 notrap v104 +;; v105 = iconst.i32 1 +;; @008f v9 = band v101, v105 ; v105 = 1 +;; v106 = stack_addr.i64 ss0 +;; v100 = load.i32 notrap v106 +;; v107 = iconst.i32 0 +;; @008f v10 = icmp eq v100, v107 ; v107 = 0 +;; @008f v11 = uextend.i32 v10 +;; @008f v12 = bor v9, v11 +;; @008f brif v12, block5, block2 ;; ;; block2: -;; @008f v11 = load.i64 notrap aligned readonly v0+56 -;; @008f v12 = load.i64 notrap aligned v11 -;; @008f v13 = load.i64 notrap aligned v11+8 -;; @008f v14 = icmp eq v12, v13 -;; @008f brif v14, block3, block4 +;; @008f v14 = load.i64 notrap aligned readonly v0+56 +;; @008f v15 = load.i64 notrap aligned v14 +;; @008f v16 = load.i64 notrap aligned v14+8 +;; @008f v17 = icmp eq v15, v16 +;; @008f brif v17, block3, block4 ;; ;; block4: -;; @008f v16 = load.i64 notrap aligned readonly v0+40 -;; @008f v18 = load.i64 notrap aligned readonly v0+48 -;; v98 = stack_addr.i64 ss0 -;; v92 = load.i32 notrap v98 -;; @008f v19 = uextend.i64 v92 -;; @008f v20 = iconst.i64 8 -;; @008f v21 = uadd_overflow_trap v19, v20, user1 ; v20 = 8 -;; @008f v22 = iconst.i64 8 -;; @008f v23 = uadd_overflow_trap v21, v22, user1 ; v22 = 8 -;; @008f v24 = icmp ule v23, v18 -;; @008f trapz v24, user1 -;; @008f v25 = iadd v16, v21 -;; @008f v26 = load.i64 notrap aligned v25 -;; v99 = iconst.i64 1 -;; @008f v27 = iadd v26, v99 ; v99 = 1 -;; @008f v29 = load.i64 notrap aligned readonly v0+40 -;; @008f v31 = load.i64 notrap aligned readonly v0+48 -;; v100 = stack_addr.i64 ss0 -;; v91 = load.i32 notrap v100 -;; @008f v32 = uextend.i64 v91 -;; @008f v33 = iconst.i64 8 -;; @008f v34 = uadd_overflow_trap v32, v33, user1 ; v33 = 8 -;; @008f v35 = iconst.i64 8 -;; @008f v36 = uadd_overflow_trap v34, v35, user1 ; v35 = 8 -;; @008f v37 = icmp ule v36, v31 -;; @008f trapz v37, user1 -;; @008f v38 = iadd v29, v34 -;; @008f store notrap aligned v27, v38 -;; v101 = stack_addr.i64 ss0 -;; v90 = load.i32 notrap v101 -;; @008f store notrap aligned v90, v12 -;; v102 = iconst.i64 4 -;; @008f v39 = iadd.i64 v12, v102 ; v102 = 4 -;; @008f store notrap aligned v39, v11 +;; @008f v19 = load.i64 notrap aligned readonly can_move v0+40 +;; @008f v21 = load.i64 notrap aligned readonly can_move v0+48 +;; v108 = stack_addr.i64 ss0 +;; v99 = load.i32 notrap v108 +;; @008f v22 = uextend.i64 v99 +;; @008f v23 = iconst.i64 8 +;; @008f v24 = uadd_overflow_trap v22, v23, user1 ; v23 = 8 +;; @008f v25 = iconst.i64 8 +;; @008f v26 = uadd_overflow_trap v24, v25, user1 ; v25 = 8 +;; @008f v27 = icmp ule v26, v21 +;; @008f trapz v27, user1 +;; @008f v28 = iadd v19, v24 +;; @008f v29 = load.i64 notrap aligned v28 +;; v109 = iconst.i64 1 +;; @008f v30 = iadd v29, v109 ; v109 = 1 +;; @008f v32 = load.i64 notrap aligned readonly can_move v0+40 +;; @008f v34 = load.i64 notrap aligned readonly can_move v0+48 +;; v110 = stack_addr.i64 ss0 +;; v98 = load.i32 notrap v110 +;; @008f v35 = uextend.i64 v98 +;; @008f v36 = iconst.i64 8 +;; @008f v37 = uadd_overflow_trap v35, v36, user1 ; v36 = 8 +;; @008f v38 = iconst.i64 8 +;; @008f v39 = uadd_overflow_trap v37, v38, user1 ; v38 = 8 +;; @008f v40 = icmp ule v39, v34 +;; @008f trapz v40, user1 +;; @008f v41 = iadd v32, v37 +;; @008f store notrap aligned v30, v41 +;; v111 = stack_addr.i64 ss0 +;; v97 = load.i32 notrap v111 +;; @008f store notrap aligned v97, v15 +;; v112 = iconst.i64 4 +;; @008f v42 = iadd.i64 v15, v112 ; v112 = 4 +;; @008f store notrap aligned v42, v14 ;; @008f jump block5 ;; ;; block3 cold: -;; v103 = stack_addr.i64 ss0 -;; v89 = load.i32 notrap v103 -;; @008f v41 = call fn0(v0, v89), stack_map=[i32 @ ss0+0] +;; v113 = stack_addr.i64 ss0 +;; v96 = load.i32 notrap v113 +;; @008f v44 = call fn0(v0, v96), stack_map=[i32 @ ss0+0] ;; @008f jump block5 ;; ;; block5: -;; v104 = iconst.i64 128 -;; @0091 v43 = iadd.i64 v0, v104 ; v104 = 128 -;; @0091 v44 = load.i32 notrap aligned v43 -;; v105 = stack_addr.i64 ss1 -;; store notrap v44, v105 -;; v106 = stack_addr.i64 ss1 -;; v88 = load.i32 notrap v106 -;; v107 = iconst.i32 0 -;; @0091 v45 = icmp eq v88, v107 ; v107 = 0 -;; @0091 brif v45, block9, block6 +;; v114 = iconst.i64 112 +;; @0091 v46 = iadd.i64 v0, v114 ; v114 = 112 +;; @0091 v47 = load.i32 notrap aligned readonly can_move v46 +;; v115 = stack_addr.i64 ss1 +;; store notrap v47, v115 +;; v116 = stack_addr.i64 ss1 +;; v95 = load.i32 notrap v116 +;; v117 = iconst.i32 1 +;; @0091 v48 = band v95, v117 ; v117 = 1 +;; v118 = stack_addr.i64 ss1 +;; v94 = load.i32 notrap v118 +;; v119 = iconst.i32 0 +;; @0091 v49 = icmp eq v94, v119 ; v119 = 0 +;; @0091 v50 = uextend.i32 v49 +;; @0091 v51 = bor v48, v50 +;; @0091 brif v51, block9, block6 ;; ;; block6: -;; @0091 v47 = load.i64 notrap aligned readonly v0+56 -;; @0091 v48 = load.i64 notrap aligned v47 -;; @0091 v49 = load.i64 notrap aligned v47+8 -;; @0091 v50 = icmp eq v48, v49 -;; @0091 brif v50, block7, block8 +;; @0091 v53 = load.i64 notrap aligned readonly v0+56 +;; @0091 v54 = load.i64 notrap aligned v53 +;; @0091 v55 = load.i64 notrap aligned v53+8 +;; @0091 v56 = icmp eq v54, v55 +;; @0091 brif v56, block7, block8 ;; ;; block8: -;; @0091 v52 = load.i64 notrap aligned readonly v0+40 -;; @0091 v54 = load.i64 notrap aligned readonly v0+48 -;; v108 = stack_addr.i64 ss1 -;; v87 = load.i32 notrap v108 -;; @0091 v55 = uextend.i64 v87 -;; @0091 v56 = iconst.i64 8 -;; @0091 v57 = uadd_overflow_trap v55, v56, user1 ; v56 = 8 -;; @0091 v58 = iconst.i64 8 -;; @0091 v59 = uadd_overflow_trap v57, v58, user1 ; v58 = 8 -;; @0091 v60 = icmp ule v59, v54 -;; @0091 trapz v60, user1 -;; @0091 v61 = iadd v52, v57 -;; @0091 v62 = load.i64 notrap aligned v61 -;; v109 = iconst.i64 1 -;; @0091 v63 = iadd v62, v109 ; v109 = 1 -;; @0091 v65 = load.i64 notrap aligned readonly v0+40 -;; @0091 v67 = load.i64 notrap aligned readonly v0+48 -;; v110 = stack_addr.i64 ss1 -;; v86 = load.i32 notrap v110 -;; @0091 v68 = uextend.i64 v86 -;; @0091 v69 = iconst.i64 8 -;; @0091 v70 = uadd_overflow_trap v68, v69, user1 ; v69 = 8 -;; @0091 v71 = iconst.i64 8 -;; @0091 v72 = uadd_overflow_trap v70, v71, user1 ; v71 = 8 -;; @0091 v73 = icmp ule v72, v67 -;; @0091 trapz v73, user1 -;; @0091 v74 = iadd v65, v70 -;; @0091 store notrap aligned v63, v74 -;; v111 = stack_addr.i64 ss1 -;; v85 = load.i32 notrap v111 -;; @0091 store notrap aligned v85, v48 -;; v112 = iconst.i64 4 -;; @0091 v75 = iadd.i64 v48, v112 ; v112 = 4 -;; @0091 store notrap aligned v75, v47 +;; @0091 v58 = load.i64 notrap aligned readonly can_move v0+40 +;; @0091 v60 = load.i64 notrap aligned readonly can_move v0+48 +;; v120 = stack_addr.i64 ss1 +;; v93 = load.i32 notrap v120 +;; @0091 v61 = uextend.i64 v93 +;; @0091 v62 = iconst.i64 8 +;; @0091 v63 = uadd_overflow_trap v61, v62, user1 ; v62 = 8 +;; @0091 v64 = iconst.i64 8 +;; @0091 v65 = uadd_overflow_trap v63, v64, user1 ; v64 = 8 +;; @0091 v66 = icmp ule v65, v60 +;; @0091 trapz v66, user1 +;; @0091 v67 = iadd v58, v63 +;; @0091 v68 = load.i64 notrap aligned v67 +;; v121 = iconst.i64 1 +;; @0091 v69 = iadd v68, v121 ; v121 = 1 +;; @0091 v71 = load.i64 notrap aligned readonly can_move v0+40 +;; @0091 v73 = load.i64 notrap aligned readonly can_move v0+48 +;; v122 = stack_addr.i64 ss1 +;; v92 = load.i32 notrap v122 +;; @0091 v74 = uextend.i64 v92 +;; @0091 v75 = iconst.i64 8 +;; @0091 v76 = uadd_overflow_trap v74, v75, user1 ; v75 = 8 +;; @0091 v77 = iconst.i64 8 +;; @0091 v78 = uadd_overflow_trap v76, v77, user1 ; v77 = 8 +;; @0091 v79 = icmp ule v78, v73 +;; @0091 trapz v79, user1 +;; @0091 v80 = iadd v71, v76 +;; @0091 store notrap aligned v69, v80 +;; v123 = stack_addr.i64 ss1 +;; v91 = load.i32 notrap v123 +;; @0091 store notrap aligned v91, v54 +;; v124 = iconst.i64 4 +;; @0091 v81 = iadd.i64 v54, v124 ; v124 = 4 +;; @0091 store notrap aligned v81, v53 ;; @0091 jump block9 ;; ;; block7 cold: -;; v113 = stack_addr.i64 ss1 -;; v84 = load.i32 notrap v113 -;; @0091 v77 = call fn0(v0, v84), stack_map=[i32 @ ss0+0, i32 @ ss1+0] +;; v125 = stack_addr.i64 ss1 +;; v90 = load.i32 notrap v125 +;; @0091 v83 = call fn0(v0, v90), stack_map=[i32 @ ss0+0, i32 @ ss1+0] ;; @0091 jump block9 ;; ;; block9: -;; @0093 v79 = load.i64 notrap aligned table v0+144 -;; @0095 v81 = load.i64 notrap aligned table v0+160 -;; v114 = stack_addr.i64 ss0 -;; v82 = load.i32 notrap v114 -;; v115 = stack_addr.i64 ss1 -;; v83 = load.i32 notrap v115 +;; @0093 v85 = load.i64 notrap aligned table v0+128 +;; @0095 v87 = load.i64 notrap aligned table v0+144 +;; v126 = stack_addr.i64 ss0 +;; v88 = load.i32 notrap v126 +;; v127 = stack_addr.i64 ss1 +;; v89 = load.i32 notrap v127 ;; @0097 jump block1 ;; ;; block1: -;; @0097 return v82, v83, v79, v81 +;; @0097 return v88, v89, v85, v87 ;; } diff --git a/tests/disas/simd-store.wat b/tests/disas/simd-store.wat index 44295c4087..ae25a8732d 100644 --- a/tests/disas/simd-store.wat +++ b/tests/disas/simd-store.wat @@ -89,15 +89,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): ;; @003f v3 = iconst.i32 0 ;; @0045 v4 = icmp eq v2, v2 ;; @0047 v5 = uextend.i64 v3 ; v3 = 0 -;; @0047 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0047 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0047 v7 = iadd v6, v5 ;; @0047 store little heap v4, v7 ;; @004b jump block1 @@ -111,8 +111,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -121,7 +121,7 @@ ;; @0054 v5 = bitcast.i16x8 little v2 ;; @0054 v6 = icmp eq v4, v5 ;; @0056 v7 = uextend.i64 v3 ; v3 = 0 -;; @0056 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @0056 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0056 v9 = iadd v8, v7 ;; @0056 store little heap v6, v9 ;; @005a jump block1 @@ -135,8 +135,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -145,7 +145,7 @@ ;; @0063 v5 = bitcast.i32x4 little v2 ;; @0063 v6 = icmp eq v4, v5 ;; @0065 v7 = uextend.i64 v3 ; v3 = 0 -;; @0065 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @0065 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0065 v9 = iadd v8, v7 ;; @0065 store little heap v6, v9 ;; @0069 jump block1 @@ -159,8 +159,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -169,7 +169,7 @@ ;; @0072 v5 = bitcast.i64x2 little v2 ;; @0072 v6 = icmp eq v4, v5 ;; @0075 v7 = uextend.i64 v3 ; v3 = 0 -;; @0075 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @0075 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0075 v9 = iadd v8, v7 ;; @0075 store little heap v6, v9 ;; @0079 jump block1 @@ -183,15 +183,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): ;; @007c v3 = iconst.i32 0 ;; @0082 v4 = icmp ne v2, v2 ;; @0084 v5 = uextend.i64 v3 ; v3 = 0 -;; @0084 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0084 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0084 v7 = iadd v6, v5 ;; @0084 store little heap v4, v7 ;; @0088 jump block1 @@ -205,8 +205,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -215,7 +215,7 @@ ;; @0091 v5 = bitcast.i16x8 little v2 ;; @0091 v6 = icmp ne v4, v5 ;; @0093 v7 = uextend.i64 v3 ; v3 = 0 -;; @0093 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @0093 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0093 v9 = iadd v8, v7 ;; @0093 store little heap v6, v9 ;; @0097 jump block1 @@ -229,8 +229,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -239,7 +239,7 @@ ;; @00a0 v5 = bitcast.i32x4 little v2 ;; @00a0 v6 = icmp ne v4, v5 ;; @00a2 v7 = uextend.i64 v3 ; v3 = 0 -;; @00a2 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @00a2 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @00a2 v9 = iadd v8, v7 ;; @00a2 store little heap v6, v9 ;; @00a6 jump block1 @@ -253,8 +253,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -263,7 +263,7 @@ ;; @00af v5 = bitcast.i64x2 little v2 ;; @00af v6 = icmp ne v4, v5 ;; @00b2 v7 = uextend.i64 v3 ; v3 = 0 -;; @00b2 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @00b2 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @00b2 v9 = iadd v8, v7 ;; @00b2 store little heap v6, v9 ;; @00b6 jump block1 @@ -277,15 +277,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): ;; @00b9 v3 = iconst.i32 0 ;; @00bf v4 = icmp slt v2, v2 ;; @00c1 v5 = uextend.i64 v3 ; v3 = 0 -;; @00c1 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @00c1 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @00c1 v7 = iadd v6, v5 ;; @00c1 store little heap v4, v7 ;; @00c5 jump block1 @@ -299,8 +299,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -309,7 +309,7 @@ ;; @00ce v5 = bitcast.i16x8 little v2 ;; @00ce v6 = icmp slt v4, v5 ;; @00d0 v7 = uextend.i64 v3 ; v3 = 0 -;; @00d0 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @00d0 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @00d0 v9 = iadd v8, v7 ;; @00d0 store little heap v6, v9 ;; @00d4 jump block1 @@ -323,8 +323,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -333,7 +333,7 @@ ;; @00dd v5 = bitcast.i32x4 little v2 ;; @00dd v6 = icmp slt v4, v5 ;; @00df v7 = uextend.i64 v3 ; v3 = 0 -;; @00df v8 = load.i64 notrap aligned readonly checked v0+88 +;; @00df v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @00df v9 = iadd v8, v7 ;; @00df store little heap v6, v9 ;; @00e3 jump block1 @@ -347,8 +347,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -357,7 +357,7 @@ ;; @00ec v5 = bitcast.i64x2 little v2 ;; @00ec v6 = icmp slt v4, v5 ;; @00ef v7 = uextend.i64 v3 ; v3 = 0 -;; @00ef v8 = load.i64 notrap aligned readonly checked v0+88 +;; @00ef v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @00ef v9 = iadd v8, v7 ;; @00ef store little heap v6, v9 ;; @00f3 jump block1 @@ -371,15 +371,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): ;; @00f6 v3 = iconst.i32 0 ;; @00fc v4 = icmp ult v2, v2 ;; @00fe v5 = uextend.i64 v3 ; v3 = 0 -;; @00fe v6 = load.i64 notrap aligned readonly checked v0+88 +;; @00fe v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @00fe v7 = iadd v6, v5 ;; @00fe store little heap v4, v7 ;; @0102 jump block1 @@ -393,8 +393,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -403,7 +403,7 @@ ;; @010b v5 = bitcast.i16x8 little v2 ;; @010b v6 = icmp ult v4, v5 ;; @010d v7 = uextend.i64 v3 ; v3 = 0 -;; @010d v8 = load.i64 notrap aligned readonly checked v0+88 +;; @010d v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @010d v9 = iadd v8, v7 ;; @010d store little heap v6, v9 ;; @0111 jump block1 @@ -417,8 +417,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -427,7 +427,7 @@ ;; @011a v5 = bitcast.i32x4 little v2 ;; @011a v6 = icmp ult v4, v5 ;; @011c v7 = uextend.i64 v3 ; v3 = 0 -;; @011c v8 = load.i64 notrap aligned readonly checked v0+88 +;; @011c v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @011c v9 = iadd v8, v7 ;; @011c store little heap v6, v9 ;; @0120 jump block1 @@ -441,15 +441,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): ;; @0123 v3 = iconst.i32 0 ;; @0129 v4 = icmp sgt v2, v2 ;; @012b v5 = uextend.i64 v3 ; v3 = 0 -;; @012b v6 = load.i64 notrap aligned readonly checked v0+88 +;; @012b v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @012b v7 = iadd v6, v5 ;; @012b store little heap v4, v7 ;; @012f jump block1 @@ -463,8 +463,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -473,7 +473,7 @@ ;; @0138 v5 = bitcast.i16x8 little v2 ;; @0138 v6 = icmp sgt v4, v5 ;; @013a v7 = uextend.i64 v3 ; v3 = 0 -;; @013a v8 = load.i64 notrap aligned readonly checked v0+88 +;; @013a v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @013a v9 = iadd v8, v7 ;; @013a store little heap v6, v9 ;; @013e jump block1 @@ -487,8 +487,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -497,7 +497,7 @@ ;; @0147 v5 = bitcast.i32x4 little v2 ;; @0147 v6 = icmp sgt v4, v5 ;; @0149 v7 = uextend.i64 v3 ; v3 = 0 -;; @0149 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @0149 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0149 v9 = iadd v8, v7 ;; @0149 store little heap v6, v9 ;; @014d jump block1 @@ -511,8 +511,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -521,7 +521,7 @@ ;; @0156 v5 = bitcast.i64x2 little v2 ;; @0156 v6 = icmp sgt v4, v5 ;; @0159 v7 = uextend.i64 v3 ; v3 = 0 -;; @0159 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @0159 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0159 v9 = iadd v8, v7 ;; @0159 store little heap v6, v9 ;; @015d jump block1 @@ -535,15 +535,15 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): ;; @0160 v3 = iconst.i32 0 ;; @0166 v4 = icmp ugt v2, v2 ;; @0168 v5 = uextend.i64 v3 ; v3 = 0 -;; @0168 v6 = load.i64 notrap aligned readonly checked v0+88 +;; @0168 v6 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0168 v7 = iadd v6, v5 ;; @0168 store little heap v4, v7 ;; @016c jump block1 @@ -557,8 +557,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -567,7 +567,7 @@ ;; @0175 v5 = bitcast.i16x8 little v2 ;; @0175 v6 = icmp ugt v4, v5 ;; @0177 v7 = uextend.i64 v3 ; v3 = 0 -;; @0177 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @0177 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0177 v9 = iadd v8, v7 ;; @0177 store little heap v6, v9 ;; @017b jump block1 @@ -581,8 +581,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -591,7 +591,7 @@ ;; @0184 v5 = bitcast.i32x4 little v2 ;; @0184 v6 = icmp ugt v4, v5 ;; @0186 v7 = uextend.i64 v3 ; v3 = 0 -;; @0186 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @0186 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0186 v9 = iadd v8, v7 ;; @0186 store little heap v6, v9 ;; @018a jump block1 @@ -605,8 +605,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -615,7 +615,7 @@ ;; @0193 v5 = bitcast.f32x4 little v2 ;; @0193 v6 = fcmp eq v4, v5 ;; @0195 v7 = uextend.i64 v3 ; v3 = 0 -;; @0195 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @0195 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @0195 v9 = iadd v8, v7 ;; @0195 store little heap v6, v9 ;; @0199 jump block1 @@ -629,8 +629,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -639,7 +639,7 @@ ;; @01a2 v5 = bitcast.f64x2 little v2 ;; @01a2 v6 = fcmp eq v4, v5 ;; @01a4 v7 = uextend.i64 v3 ; v3 = 0 -;; @01a4 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @01a4 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @01a4 v9 = iadd v8, v7 ;; @01a4 store little heap v6, v9 ;; @01a8 jump block1 @@ -653,8 +653,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -663,7 +663,7 @@ ;; @01b1 v5 = bitcast.f32x4 little v2 ;; @01b1 v6 = fcmp ne v4, v5 ;; @01b3 v7 = uextend.i64 v3 ; v3 = 0 -;; @01b3 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @01b3 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @01b3 v9 = iadd v8, v7 ;; @01b3 store little heap v6, v9 ;; @01b7 jump block1 @@ -677,8 +677,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -687,7 +687,7 @@ ;; @01c0 v5 = bitcast.f64x2 little v2 ;; @01c0 v6 = fcmp ne v4, v5 ;; @01c2 v7 = uextend.i64 v3 ; v3 = 0 -;; @01c2 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @01c2 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @01c2 v9 = iadd v8, v7 ;; @01c2 store little heap v6, v9 ;; @01c6 jump block1 @@ -701,8 +701,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -711,7 +711,7 @@ ;; @01cf v5 = bitcast.f32x4 little v2 ;; @01cf v6 = fcmp lt v4, v5 ;; @01d1 v7 = uextend.i64 v3 ; v3 = 0 -;; @01d1 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @01d1 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @01d1 v9 = iadd v8, v7 ;; @01d1 store little heap v6, v9 ;; @01d5 jump block1 @@ -725,8 +725,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -735,7 +735,7 @@ ;; @01de v5 = bitcast.f64x2 little v2 ;; @01de v6 = fcmp lt v4, v5 ;; @01e0 v7 = uextend.i64 v3 ; v3 = 0 -;; @01e0 v8 = load.i64 notrap aligned readonly checked v0+88 +;; @01e0 v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @01e0 v9 = iadd v8, v7 ;; @01e0 store little heap v6, v9 ;; @01e4 jump block1 @@ -749,8 +749,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -759,7 +759,7 @@ ;; @01ed v5 = bitcast.f32x4 little v2 ;; @01ed v6 = fcmp le v4, v5 ;; @01ef v7 = uextend.i64 v3 ; v3 = 0 -;; @01ef v8 = load.i64 notrap aligned readonly checked v0+88 +;; @01ef v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @01ef v9 = iadd v8, v7 ;; @01ef store little heap v6, v9 ;; @01f3 jump block1 @@ -773,8 +773,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -783,7 +783,7 @@ ;; @01fc v5 = bitcast.f64x2 little v2 ;; @01fc v6 = fcmp le v4, v5 ;; @01fe v7 = uextend.i64 v3 ; v3 = 0 -;; @01fe v8 = load.i64 notrap aligned readonly checked v0+88 +;; @01fe v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @01fe v9 = iadd v8, v7 ;; @01fe store little heap v6, v9 ;; @0202 jump block1 @@ -797,8 +797,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -807,7 +807,7 @@ ;; @020b v5 = bitcast.f32x4 little v2 ;; @020b v6 = fcmp gt v4, v5 ;; @020d v7 = uextend.i64 v3 ; v3 = 0 -;; @020d v8 = load.i64 notrap aligned readonly checked v0+88 +;; @020d v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @020d v9 = iadd v8, v7 ;; @020d store little heap v6, v9 ;; @0211 jump block1 @@ -821,8 +821,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -831,7 +831,7 @@ ;; @021a v5 = bitcast.f64x2 little v2 ;; @021a v6 = fcmp gt v4, v5 ;; @021c v7 = uextend.i64 v3 ; v3 = 0 -;; @021c v8 = load.i64 notrap aligned readonly checked v0+88 +;; @021c v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @021c v9 = iadd v8, v7 ;; @021c store little heap v6, v9 ;; @0220 jump block1 @@ -845,8 +845,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -855,7 +855,7 @@ ;; @0229 v5 = bitcast.f32x4 little v2 ;; @0229 v6 = fcmp ge v4, v5 ;; @022b v7 = uextend.i64 v3 ; v3 = 0 -;; @022b v8 = load.i64 notrap aligned readonly checked v0+88 +;; @022b v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @022b v9 = iadd v8, v7 ;; @022b store little heap v6, v9 ;; @022f jump block1 @@ -869,8 +869,8 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+96 -;; gv5 = load.i64 notrap aligned readonly checked gv3+88 +;; gv4 = load.i64 notrap aligned gv3+88 +;; gv5 = load.i64 notrap aligned readonly can_move checked gv3+80 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i8x16): @@ -879,7 +879,7 @@ ;; @0238 v5 = bitcast.f64x2 little v2 ;; @0238 v6 = fcmp ge v4, v5 ;; @023a v7 = uextend.i64 v3 ; v3 = 0 -;; @023a v8 = load.i64 notrap aligned readonly checked v0+88 +;; @023a v8 = load.i64 notrap aligned readonly can_move checked v0+80 ;; @023a v9 = iadd v8, v7 ;; @023a store little heap v6, v9 ;; @023e jump block1 diff --git a/tests/disas/table-get-fixed-size.wat b/tests/disas/table-get-fixed-size.wat index f905953e2f..5740f0a456 100644 --- a/tests/disas/table-get-fixed-size.wat +++ b/tests/disas/table-get-fixed-size.wat @@ -21,7 +21,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i32) -> i64 tail ;; fn0 = colocated u1:26 sig0 ;; stack_limit = gv2 @@ -31,78 +31,84 @@ ;; @0054 v4 = iconst.i32 7 ;; @0054 v5 = icmp uge v3, v4 ; v3 = 0, v4 = 7 ;; @0054 v6 = uextend.i64 v3 ; v3 = 0 -;; @0054 v7 = load.i64 notrap aligned readonly v0+80 -;; v53 = iconst.i64 2 -;; @0054 v8 = ishl v6, v53 ; v53 = 2 +;; @0054 v7 = load.i64 notrap aligned readonly can_move v0+72 +;; v57 = iconst.i64 2 +;; @0054 v8 = ishl v6, v57 ; v57 = 2 ;; @0054 v9 = iadd v7, v8 ;; @0054 v10 = iconst.i64 0 ;; @0054 v11 = select_spectre_guard v5, v10, v9 ; v10 = 0 ;; @0054 v12 = load.i32 user5 aligned table v11 -;; v54 = stack_addr.i64 ss0 -;; store notrap v12, v54 -;; v55 = stack_addr.i64 ss0 -;; v51 = load.i32 notrap v55 -;; v56 = iconst.i32 0 -;; @0054 v13 = icmp eq v51, v56 ; v56 = 0 -;; @0054 brif v13, block5, block2 +;; v58 = stack_addr.i64 ss0 +;; store notrap v12, v58 +;; v59 = stack_addr.i64 ss0 +;; v55 = load.i32 notrap v59 +;; v60 = iconst.i32 1 +;; @0054 v13 = band v55, v60 ; v60 = 1 +;; v61 = stack_addr.i64 ss0 +;; v54 = load.i32 notrap v61 +;; v62 = iconst.i32 0 +;; @0054 v14 = icmp eq v54, v62 ; v62 = 0 +;; @0054 v15 = uextend.i32 v14 +;; @0054 v16 = bor v13, v15 +;; @0054 brif v16, block5, block2 ;; ;; block2: -;; @0054 v15 = load.i64 notrap aligned readonly v0+56 -;; @0054 v16 = load.i64 notrap aligned v15 -;; @0054 v17 = load.i64 notrap aligned v15+8 -;; @0054 v18 = icmp eq v16, v17 -;; @0054 brif v18, block3, block4 +;; @0054 v18 = load.i64 notrap aligned readonly v0+56 +;; @0054 v19 = load.i64 notrap aligned v18 +;; @0054 v20 = load.i64 notrap aligned v18+8 +;; @0054 v21 = icmp eq v19, v20 +;; @0054 brif v21, block3, block4 ;; ;; block4: -;; @0054 v20 = load.i64 notrap aligned readonly v0+40 -;; @0054 v22 = load.i64 notrap aligned readonly v0+48 -;; v57 = stack_addr.i64 ss0 -;; v50 = load.i32 notrap v57 -;; @0054 v23 = uextend.i64 v50 -;; @0054 v24 = iconst.i64 8 -;; @0054 v25 = uadd_overflow_trap v23, v24, user1 ; v24 = 8 -;; @0054 v26 = iconst.i64 8 -;; @0054 v27 = uadd_overflow_trap v25, v26, user1 ; v26 = 8 -;; @0054 v28 = icmp ule v27, v22 -;; @0054 trapz v28, user1 -;; @0054 v29 = iadd v20, v25 -;; @0054 v30 = load.i64 notrap aligned v29 -;; v58 = iconst.i64 1 -;; @0054 v31 = iadd v30, v58 ; v58 = 1 -;; @0054 v33 = load.i64 notrap aligned readonly v0+40 -;; @0054 v35 = load.i64 notrap aligned readonly v0+48 -;; v59 = stack_addr.i64 ss0 -;; v49 = load.i32 notrap v59 -;; @0054 v36 = uextend.i64 v49 -;; @0054 v37 = iconst.i64 8 -;; @0054 v38 = uadd_overflow_trap v36, v37, user1 ; v37 = 8 -;; @0054 v39 = iconst.i64 8 -;; @0054 v40 = uadd_overflow_trap v38, v39, user1 ; v39 = 8 -;; @0054 v41 = icmp ule v40, v35 -;; @0054 trapz v41, user1 -;; @0054 v42 = iadd v33, v38 -;; @0054 store notrap aligned v31, v42 -;; v60 = stack_addr.i64 ss0 -;; v48 = load.i32 notrap v60 -;; @0054 store notrap aligned v48, v16 -;; v61 = iconst.i64 4 -;; @0054 v43 = iadd.i64 v16, v61 ; v61 = 4 -;; @0054 store notrap aligned v43, v15 +;; @0054 v23 = load.i64 notrap aligned readonly can_move v0+40 +;; @0054 v25 = load.i64 notrap aligned readonly can_move v0+48 +;; v63 = stack_addr.i64 ss0 +;; v53 = load.i32 notrap v63 +;; @0054 v26 = uextend.i64 v53 +;; @0054 v27 = iconst.i64 8 +;; @0054 v28 = uadd_overflow_trap v26, v27, user1 ; v27 = 8 +;; @0054 v29 = iconst.i64 8 +;; @0054 v30 = uadd_overflow_trap v28, v29, user1 ; v29 = 8 +;; @0054 v31 = icmp ule v30, v25 +;; @0054 trapz v31, user1 +;; @0054 v32 = iadd v23, v28 +;; @0054 v33 = load.i64 notrap aligned v32 +;; v64 = iconst.i64 1 +;; @0054 v34 = iadd v33, v64 ; v64 = 1 +;; @0054 v36 = load.i64 notrap aligned readonly can_move v0+40 +;; @0054 v38 = load.i64 notrap aligned readonly can_move v0+48 +;; v65 = stack_addr.i64 ss0 +;; v52 = load.i32 notrap v65 +;; @0054 v39 = uextend.i64 v52 +;; @0054 v40 = iconst.i64 8 +;; @0054 v41 = uadd_overflow_trap v39, v40, user1 ; v40 = 8 +;; @0054 v42 = iconst.i64 8 +;; @0054 v43 = uadd_overflow_trap v41, v42, user1 ; v42 = 8 +;; @0054 v44 = icmp ule v43, v38 +;; @0054 trapz v44, user1 +;; @0054 v45 = iadd v36, v41 +;; @0054 store notrap aligned v34, v45 +;; v66 = stack_addr.i64 ss0 +;; v51 = load.i32 notrap v66 +;; @0054 store notrap aligned v51, v19 +;; v67 = iconst.i64 4 +;; @0054 v46 = iadd.i64 v19, v67 ; v67 = 4 +;; @0054 store notrap aligned v46, v18 ;; @0054 jump block5 ;; ;; block3 cold: -;; v62 = stack_addr.i64 ss0 -;; v47 = load.i32 notrap v62 -;; @0054 v45 = call fn0(v0, v47), stack_map=[i32 @ ss0+0] +;; v68 = stack_addr.i64 ss0 +;; v50 = load.i32 notrap v68 +;; @0054 v48 = call fn0(v0, v50), stack_map=[i32 @ ss0+0] ;; @0054 jump block5 ;; ;; block5: -;; v63 = stack_addr.i64 ss0 -;; v46 = load.i32 notrap v63 +;; v69 = stack_addr.i64 ss0 +;; v49 = load.i32 notrap v69 ;; @0056 jump block1 ;; ;; block1: -;; @0056 return v46 +;; @0056 return v49 ;; } ;; ;; function u0:1(i64 vmctx, i64, i32) -> i32 tail { @@ -111,7 +117,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i32) -> i64 tail ;; fn0 = colocated u1:26 sig0 ;; stack_limit = gv2 @@ -120,76 +126,82 @@ ;; @005b v4 = iconst.i32 7 ;; @005b v5 = icmp uge v2, v4 ; v4 = 7 ;; @005b v6 = uextend.i64 v2 -;; @005b v7 = load.i64 notrap aligned readonly v0+80 -;; v53 = iconst.i64 2 -;; @005b v8 = ishl v6, v53 ; v53 = 2 +;; @005b v7 = load.i64 notrap aligned readonly can_move v0+72 +;; v57 = iconst.i64 2 +;; @005b v8 = ishl v6, v57 ; v57 = 2 ;; @005b v9 = iadd v7, v8 ;; @005b v10 = iconst.i64 0 ;; @005b v11 = select_spectre_guard v5, v10, v9 ; v10 = 0 ;; @005b v12 = load.i32 user5 aligned table v11 -;; v54 = stack_addr.i64 ss0 -;; store notrap v12, v54 -;; v55 = stack_addr.i64 ss0 -;; v51 = load.i32 notrap v55 -;; v56 = iconst.i32 0 -;; @005b v13 = icmp eq v51, v56 ; v56 = 0 -;; @005b brif v13, block5, block2 +;; v58 = stack_addr.i64 ss0 +;; store notrap v12, v58 +;; v59 = stack_addr.i64 ss0 +;; v55 = load.i32 notrap v59 +;; v60 = iconst.i32 1 +;; @005b v13 = band v55, v60 ; v60 = 1 +;; v61 = stack_addr.i64 ss0 +;; v54 = load.i32 notrap v61 +;; v62 = iconst.i32 0 +;; @005b v14 = icmp eq v54, v62 ; v62 = 0 +;; @005b v15 = uextend.i32 v14 +;; @005b v16 = bor v13, v15 +;; @005b brif v16, block5, block2 ;; ;; block2: -;; @005b v15 = load.i64 notrap aligned readonly v0+56 -;; @005b v16 = load.i64 notrap aligned v15 -;; @005b v17 = load.i64 notrap aligned v15+8 -;; @005b v18 = icmp eq v16, v17 -;; @005b brif v18, block3, block4 +;; @005b v18 = load.i64 notrap aligned readonly v0+56 +;; @005b v19 = load.i64 notrap aligned v18 +;; @005b v20 = load.i64 notrap aligned v18+8 +;; @005b v21 = icmp eq v19, v20 +;; @005b brif v21, block3, block4 ;; ;; block4: -;; @005b v20 = load.i64 notrap aligned readonly v0+40 -;; @005b v22 = load.i64 notrap aligned readonly v0+48 -;; v57 = stack_addr.i64 ss0 -;; v50 = load.i32 notrap v57 -;; @005b v23 = uextend.i64 v50 -;; @005b v24 = iconst.i64 8 -;; @005b v25 = uadd_overflow_trap v23, v24, user1 ; v24 = 8 -;; @005b v26 = iconst.i64 8 -;; @005b v27 = uadd_overflow_trap v25, v26, user1 ; v26 = 8 -;; @005b v28 = icmp ule v27, v22 -;; @005b trapz v28, user1 -;; @005b v29 = iadd v20, v25 -;; @005b v30 = load.i64 notrap aligned v29 -;; v58 = iconst.i64 1 -;; @005b v31 = iadd v30, v58 ; v58 = 1 -;; @005b v33 = load.i64 notrap aligned readonly v0+40 -;; @005b v35 = load.i64 notrap aligned readonly v0+48 -;; v59 = stack_addr.i64 ss0 -;; v49 = load.i32 notrap v59 -;; @005b v36 = uextend.i64 v49 -;; @005b v37 = iconst.i64 8 -;; @005b v38 = uadd_overflow_trap v36, v37, user1 ; v37 = 8 -;; @005b v39 = iconst.i64 8 -;; @005b v40 = uadd_overflow_trap v38, v39, user1 ; v39 = 8 -;; @005b v41 = icmp ule v40, v35 -;; @005b trapz v41, user1 -;; @005b v42 = iadd v33, v38 -;; @005b store notrap aligned v31, v42 -;; v60 = stack_addr.i64 ss0 -;; v48 = load.i32 notrap v60 -;; @005b store notrap aligned v48, v16 -;; v61 = iconst.i64 4 -;; @005b v43 = iadd.i64 v16, v61 ; v61 = 4 -;; @005b store notrap aligned v43, v15 +;; @005b v23 = load.i64 notrap aligned readonly can_move v0+40 +;; @005b v25 = load.i64 notrap aligned readonly can_move v0+48 +;; v63 = stack_addr.i64 ss0 +;; v53 = load.i32 notrap v63 +;; @005b v26 = uextend.i64 v53 +;; @005b v27 = iconst.i64 8 +;; @005b v28 = uadd_overflow_trap v26, v27, user1 ; v27 = 8 +;; @005b v29 = iconst.i64 8 +;; @005b v30 = uadd_overflow_trap v28, v29, user1 ; v29 = 8 +;; @005b v31 = icmp ule v30, v25 +;; @005b trapz v31, user1 +;; @005b v32 = iadd v23, v28 +;; @005b v33 = load.i64 notrap aligned v32 +;; v64 = iconst.i64 1 +;; @005b v34 = iadd v33, v64 ; v64 = 1 +;; @005b v36 = load.i64 notrap aligned readonly can_move v0+40 +;; @005b v38 = load.i64 notrap aligned readonly can_move v0+48 +;; v65 = stack_addr.i64 ss0 +;; v52 = load.i32 notrap v65 +;; @005b v39 = uextend.i64 v52 +;; @005b v40 = iconst.i64 8 +;; @005b v41 = uadd_overflow_trap v39, v40, user1 ; v40 = 8 +;; @005b v42 = iconst.i64 8 +;; @005b v43 = uadd_overflow_trap v41, v42, user1 ; v42 = 8 +;; @005b v44 = icmp ule v43, v38 +;; @005b trapz v44, user1 +;; @005b v45 = iadd v36, v41 +;; @005b store notrap aligned v34, v45 +;; v66 = stack_addr.i64 ss0 +;; v51 = load.i32 notrap v66 +;; @005b store notrap aligned v51, v19 +;; v67 = iconst.i64 4 +;; @005b v46 = iadd.i64 v19, v67 ; v67 = 4 +;; @005b store notrap aligned v46, v18 ;; @005b jump block5 ;; ;; block3 cold: -;; v62 = stack_addr.i64 ss0 -;; v47 = load.i32 notrap v62 -;; @005b v45 = call fn0(v0, v47), stack_map=[i32 @ ss0+0] +;; v68 = stack_addr.i64 ss0 +;; v50 = load.i32 notrap v68 +;; @005b v48 = call fn0(v0, v50), stack_map=[i32 @ ss0+0] ;; @005b jump block5 ;; ;; block5: -;; v63 = stack_addr.i64 ss0 -;; v46 = load.i32 notrap v63 +;; v69 = stack_addr.i64 ss0 +;; v49 = load.i32 notrap v69 ;; @005d jump block1 ;; ;; block1: -;; @005d return v46 +;; @005d return v49 ;; } diff --git a/tests/disas/table-get.wat b/tests/disas/table-get.wat index 40e3545978..06c6733c28 100644 --- a/tests/disas/table-get.wat +++ b/tests/disas/table-get.wat @@ -20,90 +20,96 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+80 -;; gv5 = load.i64 notrap aligned gv3+88 +;; gv4 = load.i64 notrap aligned gv3+72 +;; gv5 = load.i64 notrap aligned gv3+80 ;; sig0 = (i64 vmctx, i32) -> i64 tail ;; fn0 = colocated u1:26 sig0 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64): ;; @0051 v3 = iconst.i32 0 -;; @0053 v4 = load.i64 notrap aligned v0+88 +;; @0053 v4 = load.i64 notrap aligned v0+80 ;; @0053 v5 = ireduce.i32 v4 ;; @0053 v6 = icmp uge v3, v5 ; v3 = 0 ;; @0053 v7 = uextend.i64 v3 ; v3 = 0 -;; @0053 v8 = load.i64 notrap aligned v0+80 -;; v55 = iconst.i64 2 -;; @0053 v9 = ishl v7, v55 ; v55 = 2 +;; @0053 v8 = load.i64 notrap aligned v0+72 +;; v59 = iconst.i64 2 +;; @0053 v9 = ishl v7, v59 ; v59 = 2 ;; @0053 v10 = iadd v8, v9 ;; @0053 v11 = iconst.i64 0 ;; @0053 v12 = select_spectre_guard v6, v11, v10 ; v11 = 0 ;; @0053 v13 = load.i32 user5 aligned table v12 -;; v56 = stack_addr.i64 ss0 -;; store notrap v13, v56 -;; v57 = stack_addr.i64 ss0 -;; v52 = load.i32 notrap v57 -;; v58 = iconst.i32 0 -;; @0053 v14 = icmp eq v52, v58 ; v58 = 0 -;; @0053 brif v14, block5, block2 +;; v60 = stack_addr.i64 ss0 +;; store notrap v13, v60 +;; v61 = stack_addr.i64 ss0 +;; v56 = load.i32 notrap v61 +;; v62 = iconst.i32 1 +;; @0053 v14 = band v56, v62 ; v62 = 1 +;; v63 = stack_addr.i64 ss0 +;; v55 = load.i32 notrap v63 +;; v64 = iconst.i32 0 +;; @0053 v15 = icmp eq v55, v64 ; v64 = 0 +;; @0053 v16 = uextend.i32 v15 +;; @0053 v17 = bor v14, v16 +;; @0053 brif v17, block5, block2 ;; ;; block2: -;; @0053 v16 = load.i64 notrap aligned readonly v0+56 -;; @0053 v17 = load.i64 notrap aligned v16 -;; @0053 v18 = load.i64 notrap aligned v16+8 -;; @0053 v19 = icmp eq v17, v18 -;; @0053 brif v19, block3, block4 +;; @0053 v19 = load.i64 notrap aligned readonly v0+56 +;; @0053 v20 = load.i64 notrap aligned v19 +;; @0053 v21 = load.i64 notrap aligned v19+8 +;; @0053 v22 = icmp eq v20, v21 +;; @0053 brif v22, block3, block4 ;; ;; block4: -;; @0053 v21 = load.i64 notrap aligned readonly v0+40 -;; @0053 v23 = load.i64 notrap aligned readonly v0+48 -;; v59 = stack_addr.i64 ss0 -;; v51 = load.i32 notrap v59 -;; @0053 v24 = uextend.i64 v51 -;; @0053 v25 = iconst.i64 8 -;; @0053 v26 = uadd_overflow_trap v24, v25, user1 ; v25 = 8 -;; @0053 v27 = iconst.i64 8 -;; @0053 v28 = uadd_overflow_trap v26, v27, user1 ; v27 = 8 -;; @0053 v29 = icmp ule v28, v23 -;; @0053 trapz v29, user1 -;; @0053 v30 = iadd v21, v26 -;; @0053 v31 = load.i64 notrap aligned v30 -;; v60 = iconst.i64 1 -;; @0053 v32 = iadd v31, v60 ; v60 = 1 -;; @0053 v34 = load.i64 notrap aligned readonly v0+40 -;; @0053 v36 = load.i64 notrap aligned readonly v0+48 -;; v61 = stack_addr.i64 ss0 -;; v50 = load.i32 notrap v61 -;; @0053 v37 = uextend.i64 v50 -;; @0053 v38 = iconst.i64 8 -;; @0053 v39 = uadd_overflow_trap v37, v38, user1 ; v38 = 8 -;; @0053 v40 = iconst.i64 8 -;; @0053 v41 = uadd_overflow_trap v39, v40, user1 ; v40 = 8 -;; @0053 v42 = icmp ule v41, v36 -;; @0053 trapz v42, user1 -;; @0053 v43 = iadd v34, v39 -;; @0053 store notrap aligned v32, v43 -;; v62 = stack_addr.i64 ss0 -;; v49 = load.i32 notrap v62 -;; @0053 store notrap aligned v49, v17 -;; v63 = iconst.i64 4 -;; @0053 v44 = iadd.i64 v17, v63 ; v63 = 4 -;; @0053 store notrap aligned v44, v16 +;; @0053 v24 = load.i64 notrap aligned readonly can_move v0+40 +;; @0053 v26 = load.i64 notrap aligned readonly can_move v0+48 +;; v65 = stack_addr.i64 ss0 +;; v54 = load.i32 notrap v65 +;; @0053 v27 = uextend.i64 v54 +;; @0053 v28 = iconst.i64 8 +;; @0053 v29 = uadd_overflow_trap v27, v28, user1 ; v28 = 8 +;; @0053 v30 = iconst.i64 8 +;; @0053 v31 = uadd_overflow_trap v29, v30, user1 ; v30 = 8 +;; @0053 v32 = icmp ule v31, v26 +;; @0053 trapz v32, user1 +;; @0053 v33 = iadd v24, v29 +;; @0053 v34 = load.i64 notrap aligned v33 +;; v66 = iconst.i64 1 +;; @0053 v35 = iadd v34, v66 ; v66 = 1 +;; @0053 v37 = load.i64 notrap aligned readonly can_move v0+40 +;; @0053 v39 = load.i64 notrap aligned readonly can_move v0+48 +;; v67 = stack_addr.i64 ss0 +;; v53 = load.i32 notrap v67 +;; @0053 v40 = uextend.i64 v53 +;; @0053 v41 = iconst.i64 8 +;; @0053 v42 = uadd_overflow_trap v40, v41, user1 ; v41 = 8 +;; @0053 v43 = iconst.i64 8 +;; @0053 v44 = uadd_overflow_trap v42, v43, user1 ; v43 = 8 +;; @0053 v45 = icmp ule v44, v39 +;; @0053 trapz v45, user1 +;; @0053 v46 = iadd v37, v42 +;; @0053 store notrap aligned v35, v46 +;; v68 = stack_addr.i64 ss0 +;; v52 = load.i32 notrap v68 +;; @0053 store notrap aligned v52, v20 +;; v69 = iconst.i64 4 +;; @0053 v47 = iadd.i64 v20, v69 ; v69 = 4 +;; @0053 store notrap aligned v47, v19 ;; @0053 jump block5 ;; ;; block3 cold: -;; v64 = stack_addr.i64 ss0 -;; v48 = load.i32 notrap v64 -;; @0053 v46 = call fn0(v0, v48), stack_map=[i32 @ ss0+0] +;; v70 = stack_addr.i64 ss0 +;; v51 = load.i32 notrap v70 +;; @0053 v49 = call fn0(v0, v51), stack_map=[i32 @ ss0+0] ;; @0053 jump block5 ;; ;; block5: -;; v65 = stack_addr.i64 ss0 -;; v47 = load.i32 notrap v65 +;; v71 = stack_addr.i64 ss0 +;; v50 = load.i32 notrap v71 ;; @0055 jump block1 ;; ;; block1: -;; @0055 return v47 +;; @0055 return v50 ;; } ;; ;; function u0:1(i64 vmctx, i64, i32) -> i32 tail { @@ -112,87 +118,93 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+80 -;; gv5 = load.i64 notrap aligned gv3+88 +;; gv4 = load.i64 notrap aligned gv3+72 +;; gv5 = load.i64 notrap aligned gv3+80 ;; sig0 = (i64 vmctx, i32) -> i64 tail ;; fn0 = colocated u1:26 sig0 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): -;; @005a v4 = load.i64 notrap aligned v0+88 +;; @005a v4 = load.i64 notrap aligned v0+80 ;; @005a v5 = ireduce.i32 v4 ;; @005a v6 = icmp uge v2, v5 ;; @005a v7 = uextend.i64 v2 -;; @005a v8 = load.i64 notrap aligned v0+80 -;; v55 = iconst.i64 2 -;; @005a v9 = ishl v7, v55 ; v55 = 2 +;; @005a v8 = load.i64 notrap aligned v0+72 +;; v59 = iconst.i64 2 +;; @005a v9 = ishl v7, v59 ; v59 = 2 ;; @005a v10 = iadd v8, v9 ;; @005a v11 = iconst.i64 0 ;; @005a v12 = select_spectre_guard v6, v11, v10 ; v11 = 0 ;; @005a v13 = load.i32 user5 aligned table v12 -;; v56 = stack_addr.i64 ss0 -;; store notrap v13, v56 -;; v57 = stack_addr.i64 ss0 -;; v52 = load.i32 notrap v57 -;; v58 = iconst.i32 0 -;; @005a v14 = icmp eq v52, v58 ; v58 = 0 -;; @005a brif v14, block5, block2 +;; v60 = stack_addr.i64 ss0 +;; store notrap v13, v60 +;; v61 = stack_addr.i64 ss0 +;; v56 = load.i32 notrap v61 +;; v62 = iconst.i32 1 +;; @005a v14 = band v56, v62 ; v62 = 1 +;; v63 = stack_addr.i64 ss0 +;; v55 = load.i32 notrap v63 +;; v64 = iconst.i32 0 +;; @005a v15 = icmp eq v55, v64 ; v64 = 0 +;; @005a v16 = uextend.i32 v15 +;; @005a v17 = bor v14, v16 +;; @005a brif v17, block5, block2 ;; ;; block2: -;; @005a v16 = load.i64 notrap aligned readonly v0+56 -;; @005a v17 = load.i64 notrap aligned v16 -;; @005a v18 = load.i64 notrap aligned v16+8 -;; @005a v19 = icmp eq v17, v18 -;; @005a brif v19, block3, block4 +;; @005a v19 = load.i64 notrap aligned readonly v0+56 +;; @005a v20 = load.i64 notrap aligned v19 +;; @005a v21 = load.i64 notrap aligned v19+8 +;; @005a v22 = icmp eq v20, v21 +;; @005a brif v22, block3, block4 ;; ;; block4: -;; @005a v21 = load.i64 notrap aligned readonly v0+40 -;; @005a v23 = load.i64 notrap aligned readonly v0+48 -;; v59 = stack_addr.i64 ss0 -;; v51 = load.i32 notrap v59 -;; @005a v24 = uextend.i64 v51 -;; @005a v25 = iconst.i64 8 -;; @005a v26 = uadd_overflow_trap v24, v25, user1 ; v25 = 8 -;; @005a v27 = iconst.i64 8 -;; @005a v28 = uadd_overflow_trap v26, v27, user1 ; v27 = 8 -;; @005a v29 = icmp ule v28, v23 -;; @005a trapz v29, user1 -;; @005a v30 = iadd v21, v26 -;; @005a v31 = load.i64 notrap aligned v30 -;; v60 = iconst.i64 1 -;; @005a v32 = iadd v31, v60 ; v60 = 1 -;; @005a v34 = load.i64 notrap aligned readonly v0+40 -;; @005a v36 = load.i64 notrap aligned readonly v0+48 -;; v61 = stack_addr.i64 ss0 -;; v50 = load.i32 notrap v61 -;; @005a v37 = uextend.i64 v50 -;; @005a v38 = iconst.i64 8 -;; @005a v39 = uadd_overflow_trap v37, v38, user1 ; v38 = 8 -;; @005a v40 = iconst.i64 8 -;; @005a v41 = uadd_overflow_trap v39, v40, user1 ; v40 = 8 -;; @005a v42 = icmp ule v41, v36 -;; @005a trapz v42, user1 -;; @005a v43 = iadd v34, v39 -;; @005a store notrap aligned v32, v43 -;; v62 = stack_addr.i64 ss0 -;; v49 = load.i32 notrap v62 -;; @005a store notrap aligned v49, v17 -;; v63 = iconst.i64 4 -;; @005a v44 = iadd.i64 v17, v63 ; v63 = 4 -;; @005a store notrap aligned v44, v16 +;; @005a v24 = load.i64 notrap aligned readonly can_move v0+40 +;; @005a v26 = load.i64 notrap aligned readonly can_move v0+48 +;; v65 = stack_addr.i64 ss0 +;; v54 = load.i32 notrap v65 +;; @005a v27 = uextend.i64 v54 +;; @005a v28 = iconst.i64 8 +;; @005a v29 = uadd_overflow_trap v27, v28, user1 ; v28 = 8 +;; @005a v30 = iconst.i64 8 +;; @005a v31 = uadd_overflow_trap v29, v30, user1 ; v30 = 8 +;; @005a v32 = icmp ule v31, v26 +;; @005a trapz v32, user1 +;; @005a v33 = iadd v24, v29 +;; @005a v34 = load.i64 notrap aligned v33 +;; v66 = iconst.i64 1 +;; @005a v35 = iadd v34, v66 ; v66 = 1 +;; @005a v37 = load.i64 notrap aligned readonly can_move v0+40 +;; @005a v39 = load.i64 notrap aligned readonly can_move v0+48 +;; v67 = stack_addr.i64 ss0 +;; v53 = load.i32 notrap v67 +;; @005a v40 = uextend.i64 v53 +;; @005a v41 = iconst.i64 8 +;; @005a v42 = uadd_overflow_trap v40, v41, user1 ; v41 = 8 +;; @005a v43 = iconst.i64 8 +;; @005a v44 = uadd_overflow_trap v42, v43, user1 ; v43 = 8 +;; @005a v45 = icmp ule v44, v39 +;; @005a trapz v45, user1 +;; @005a v46 = iadd v37, v42 +;; @005a store notrap aligned v35, v46 +;; v68 = stack_addr.i64 ss0 +;; v52 = load.i32 notrap v68 +;; @005a store notrap aligned v52, v20 +;; v69 = iconst.i64 4 +;; @005a v47 = iadd.i64 v20, v69 ; v69 = 4 +;; @005a store notrap aligned v47, v19 ;; @005a jump block5 ;; ;; block3 cold: -;; v64 = stack_addr.i64 ss0 -;; v48 = load.i32 notrap v64 -;; @005a v46 = call fn0(v0, v48), stack_map=[i32 @ ss0+0] +;; v70 = stack_addr.i64 ss0 +;; v51 = load.i32 notrap v70 +;; @005a v49 = call fn0(v0, v51), stack_map=[i32 @ ss0+0] ;; @005a jump block5 ;; ;; block5: -;; v65 = stack_addr.i64 ss0 -;; v47 = load.i32 notrap v65 +;; v71 = stack_addr.i64 ss0 +;; v50 = load.i32 notrap v71 ;; @005c jump block1 ;; ;; block1: -;; @005c return v47 +;; @005c return v50 ;; } diff --git a/tests/disas/table-set-fixed-size.wat b/tests/disas/table-set-fixed-size.wat index 1361fc24de..1f84eb9467 100644 --- a/tests/disas/table-set-fixed-size.wat +++ b/tests/disas/table-set-fixed-size.wat @@ -21,7 +21,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i32) tail ;; fn0 = colocated u1:25 sig0 ;; stack_limit = gv2 @@ -31,84 +31,92 @@ ;; @0056 v4 = iconst.i32 7 ;; @0056 v5 = icmp uge v3, v4 ; v3 = 0, v4 = 7 ;; @0056 v6 = uextend.i64 v3 ; v3 = 0 -;; @0056 v7 = load.i64 notrap aligned readonly v0+80 -;; v66 = iconst.i64 2 -;; @0056 v8 = ishl v6, v66 ; v66 = 2 +;; @0056 v7 = load.i64 notrap aligned readonly can_move v0+72 +;; v72 = iconst.i64 2 +;; @0056 v8 = ishl v6, v72 ; v72 = 2 ;; @0056 v9 = iadd v7, v8 ;; @0056 v10 = iconst.i64 0 ;; @0056 v11 = select_spectre_guard v5, v10, v9 ; v10 = 0 ;; @0056 v12 = load.i32 user5 aligned table v11 -;; v67 = iconst.i32 0 -;; @0056 v13 = icmp eq v2, v67 ; v67 = 0 -;; @0056 brif v13, block3, block2 +;; v73 = iconst.i32 1 +;; @0056 v13 = band v2, v73 ; v73 = 1 +;; v74 = iconst.i32 0 +;; @0056 v14 = icmp eq v2, v74 ; v74 = 0 +;; @0056 v15 = uextend.i32 v14 +;; @0056 v16 = bor v13, v15 +;; @0056 brif v16, block3, block2 ;; ;; block2: -;; @0056 v15 = load.i64 notrap aligned readonly v0+40 -;; @0056 v17 = load.i64 notrap aligned readonly v0+48 -;; @0056 v18 = uextend.i64 v2 -;; @0056 v19 = iconst.i64 8 -;; @0056 v20 = uadd_overflow_trap v18, v19, user1 ; v19 = 8 -;; @0056 v21 = iconst.i64 8 -;; @0056 v22 = uadd_overflow_trap v20, v21, user1 ; v21 = 8 -;; @0056 v23 = icmp ule v22, v17 -;; @0056 trapz v23, user1 -;; @0056 v24 = iadd v15, v20 -;; @0056 v25 = load.i64 notrap aligned v24 -;; v68 = iconst.i64 1 -;; @0056 v26 = iadd v25, v68 ; v68 = 1 -;; @0056 v28 = load.i64 notrap aligned readonly v0+40 -;; @0056 v30 = load.i64 notrap aligned readonly v0+48 -;; @0056 v31 = uextend.i64 v2 -;; @0056 v32 = iconst.i64 8 -;; @0056 v33 = uadd_overflow_trap v31, v32, user1 ; v32 = 8 -;; @0056 v34 = iconst.i64 8 -;; @0056 v35 = uadd_overflow_trap v33, v34, user1 ; v34 = 8 -;; @0056 v36 = icmp ule v35, v30 -;; @0056 trapz v36, user1 -;; @0056 v37 = iadd v28, v33 -;; @0056 store notrap aligned v26, v37 +;; @0056 v18 = load.i64 notrap aligned readonly can_move v0+40 +;; @0056 v20 = load.i64 notrap aligned readonly can_move v0+48 +;; @0056 v21 = uextend.i64 v2 +;; @0056 v22 = iconst.i64 8 +;; @0056 v23 = uadd_overflow_trap v21, v22, user1 ; v22 = 8 +;; @0056 v24 = iconst.i64 8 +;; @0056 v25 = uadd_overflow_trap v23, v24, user1 ; v24 = 8 +;; @0056 v26 = icmp ule v25, v20 +;; @0056 trapz v26, user1 +;; @0056 v27 = iadd v18, v23 +;; @0056 v28 = load.i64 notrap aligned v27 +;; v75 = iconst.i64 1 +;; @0056 v29 = iadd v28, v75 ; v75 = 1 +;; @0056 v31 = load.i64 notrap aligned readonly can_move v0+40 +;; @0056 v33 = load.i64 notrap aligned readonly can_move v0+48 +;; @0056 v34 = uextend.i64 v2 +;; @0056 v35 = iconst.i64 8 +;; @0056 v36 = uadd_overflow_trap v34, v35, user1 ; v35 = 8 +;; @0056 v37 = iconst.i64 8 +;; @0056 v38 = uadd_overflow_trap v36, v37, user1 ; v37 = 8 +;; @0056 v39 = icmp ule v38, v33 +;; @0056 trapz v39, user1 +;; @0056 v40 = iadd v31, v36 +;; @0056 store notrap aligned v29, v40 ;; @0056 jump block3 ;; ;; block3: ;; @0056 store.i32 user5 aligned table v2, v11 -;; v69 = iconst.i32 0 -;; @0056 v38 = icmp.i32 eq v12, v69 ; v69 = 0 -;; @0056 brif v38, block7, block4 +;; v76 = iconst.i32 1 +;; @0056 v41 = band.i32 v12, v76 ; v76 = 1 +;; v77 = iconst.i32 0 +;; @0056 v42 = icmp.i32 eq v12, v77 ; v77 = 0 +;; @0056 v43 = uextend.i32 v42 +;; @0056 v44 = bor v41, v43 +;; @0056 brif v44, block7, block4 ;; ;; block4: -;; @0056 v40 = load.i64 notrap aligned readonly v0+40 -;; @0056 v42 = load.i64 notrap aligned readonly v0+48 -;; @0056 v43 = uextend.i64 v12 -;; @0056 v44 = iconst.i64 8 -;; @0056 v45 = uadd_overflow_trap v43, v44, user1 ; v44 = 8 -;; @0056 v46 = iconst.i64 8 -;; @0056 v47 = uadd_overflow_trap v45, v46, user1 ; v46 = 8 -;; @0056 v48 = icmp ule v47, v42 -;; @0056 trapz v48, user1 -;; @0056 v49 = iadd v40, v45 -;; @0056 v50 = load.i64 notrap aligned v49 -;; v70 = iconst.i64 -1 -;; @0056 v51 = iadd v50, v70 ; v70 = -1 -;; v71 = iconst.i64 0 -;; @0056 v52 = icmp eq v51, v71 ; v71 = 0 -;; @0056 brif v52, block5, block6 +;; @0056 v46 = load.i64 notrap aligned readonly can_move v0+40 +;; @0056 v48 = load.i64 notrap aligned readonly can_move v0+48 +;; @0056 v49 = uextend.i64 v12 +;; @0056 v50 = iconst.i64 8 +;; @0056 v51 = uadd_overflow_trap v49, v50, user1 ; v50 = 8 +;; @0056 v52 = iconst.i64 8 +;; @0056 v53 = uadd_overflow_trap v51, v52, user1 ; v52 = 8 +;; @0056 v54 = icmp ule v53, v48 +;; @0056 trapz v54, user1 +;; @0056 v55 = iadd v46, v51 +;; @0056 v56 = load.i64 notrap aligned v55 +;; v78 = iconst.i64 -1 +;; @0056 v57 = iadd v56, v78 ; v78 = -1 +;; v79 = iconst.i64 0 +;; @0056 v58 = icmp eq v57, v79 ; v79 = 0 +;; @0056 brif v58, block5, block6 ;; ;; block5 cold: ;; @0056 call fn0(v0, v12) ;; @0056 jump block7 ;; ;; block6: -;; @0056 v55 = load.i64 notrap aligned readonly v0+40 -;; @0056 v57 = load.i64 notrap aligned readonly v0+48 -;; @0056 v58 = uextend.i64 v12 -;; @0056 v59 = iconst.i64 8 -;; @0056 v60 = uadd_overflow_trap v58, v59, user1 ; v59 = 8 -;; @0056 v61 = iconst.i64 8 -;; @0056 v62 = uadd_overflow_trap v60, v61, user1 ; v61 = 8 -;; @0056 v63 = icmp ule v62, v57 -;; @0056 trapz v63, user1 -;; @0056 v64 = iadd v55, v60 -;; @0056 store.i64 notrap aligned v51, v64 +;; @0056 v61 = load.i64 notrap aligned readonly can_move v0+40 +;; @0056 v63 = load.i64 notrap aligned readonly can_move v0+48 +;; @0056 v64 = uextend.i64 v12 +;; @0056 v65 = iconst.i64 8 +;; @0056 v66 = uadd_overflow_trap v64, v65, user1 ; v65 = 8 +;; @0056 v67 = iconst.i64 8 +;; @0056 v68 = uadd_overflow_trap v66, v67, user1 ; v67 = 8 +;; @0056 v69 = icmp ule v68, v63 +;; @0056 trapz v69, user1 +;; @0056 v70 = iadd v61, v66 +;; @0056 store.i64 notrap aligned v57, v70 ;; @0056 jump block7 ;; ;; block7: @@ -123,7 +131,7 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i32) tail ;; fn0 = colocated u1:25 sig0 ;; stack_limit = gv2 @@ -132,84 +140,92 @@ ;; @005f v4 = iconst.i32 7 ;; @005f v5 = icmp uge v2, v4 ; v4 = 7 ;; @005f v6 = uextend.i64 v2 -;; @005f v7 = load.i64 notrap aligned readonly v0+80 -;; v66 = iconst.i64 2 -;; @005f v8 = ishl v6, v66 ; v66 = 2 +;; @005f v7 = load.i64 notrap aligned readonly can_move v0+72 +;; v72 = iconst.i64 2 +;; @005f v8 = ishl v6, v72 ; v72 = 2 ;; @005f v9 = iadd v7, v8 ;; @005f v10 = iconst.i64 0 ;; @005f v11 = select_spectre_guard v5, v10, v9 ; v10 = 0 ;; @005f v12 = load.i32 user5 aligned table v11 -;; v67 = iconst.i32 0 -;; @005f v13 = icmp eq v3, v67 ; v67 = 0 -;; @005f brif v13, block3, block2 +;; v73 = iconst.i32 1 +;; @005f v13 = band v3, v73 ; v73 = 1 +;; v74 = iconst.i32 0 +;; @005f v14 = icmp eq v3, v74 ; v74 = 0 +;; @005f v15 = uextend.i32 v14 +;; @005f v16 = bor v13, v15 +;; @005f brif v16, block3, block2 ;; ;; block2: -;; @005f v15 = load.i64 notrap aligned readonly v0+40 -;; @005f v17 = load.i64 notrap aligned readonly v0+48 -;; @005f v18 = uextend.i64 v3 -;; @005f v19 = iconst.i64 8 -;; @005f v20 = uadd_overflow_trap v18, v19, user1 ; v19 = 8 -;; @005f v21 = iconst.i64 8 -;; @005f v22 = uadd_overflow_trap v20, v21, user1 ; v21 = 8 -;; @005f v23 = icmp ule v22, v17 -;; @005f trapz v23, user1 -;; @005f v24 = iadd v15, v20 -;; @005f v25 = load.i64 notrap aligned v24 -;; v68 = iconst.i64 1 -;; @005f v26 = iadd v25, v68 ; v68 = 1 -;; @005f v28 = load.i64 notrap aligned readonly v0+40 -;; @005f v30 = load.i64 notrap aligned readonly v0+48 -;; @005f v31 = uextend.i64 v3 -;; @005f v32 = iconst.i64 8 -;; @005f v33 = uadd_overflow_trap v31, v32, user1 ; v32 = 8 -;; @005f v34 = iconst.i64 8 -;; @005f v35 = uadd_overflow_trap v33, v34, user1 ; v34 = 8 -;; @005f v36 = icmp ule v35, v30 -;; @005f trapz v36, user1 -;; @005f v37 = iadd v28, v33 -;; @005f store notrap aligned v26, v37 +;; @005f v18 = load.i64 notrap aligned readonly can_move v0+40 +;; @005f v20 = load.i64 notrap aligned readonly can_move v0+48 +;; @005f v21 = uextend.i64 v3 +;; @005f v22 = iconst.i64 8 +;; @005f v23 = uadd_overflow_trap v21, v22, user1 ; v22 = 8 +;; @005f v24 = iconst.i64 8 +;; @005f v25 = uadd_overflow_trap v23, v24, user1 ; v24 = 8 +;; @005f v26 = icmp ule v25, v20 +;; @005f trapz v26, user1 +;; @005f v27 = iadd v18, v23 +;; @005f v28 = load.i64 notrap aligned v27 +;; v75 = iconst.i64 1 +;; @005f v29 = iadd v28, v75 ; v75 = 1 +;; @005f v31 = load.i64 notrap aligned readonly can_move v0+40 +;; @005f v33 = load.i64 notrap aligned readonly can_move v0+48 +;; @005f v34 = uextend.i64 v3 +;; @005f v35 = iconst.i64 8 +;; @005f v36 = uadd_overflow_trap v34, v35, user1 ; v35 = 8 +;; @005f v37 = iconst.i64 8 +;; @005f v38 = uadd_overflow_trap v36, v37, user1 ; v37 = 8 +;; @005f v39 = icmp ule v38, v33 +;; @005f trapz v39, user1 +;; @005f v40 = iadd v31, v36 +;; @005f store notrap aligned v29, v40 ;; @005f jump block3 ;; ;; block3: ;; @005f store.i32 user5 aligned table v3, v11 -;; v69 = iconst.i32 0 -;; @005f v38 = icmp.i32 eq v12, v69 ; v69 = 0 -;; @005f brif v38, block7, block4 +;; v76 = iconst.i32 1 +;; @005f v41 = band.i32 v12, v76 ; v76 = 1 +;; v77 = iconst.i32 0 +;; @005f v42 = icmp.i32 eq v12, v77 ; v77 = 0 +;; @005f v43 = uextend.i32 v42 +;; @005f v44 = bor v41, v43 +;; @005f brif v44, block7, block4 ;; ;; block4: -;; @005f v40 = load.i64 notrap aligned readonly v0+40 -;; @005f v42 = load.i64 notrap aligned readonly v0+48 -;; @005f v43 = uextend.i64 v12 -;; @005f v44 = iconst.i64 8 -;; @005f v45 = uadd_overflow_trap v43, v44, user1 ; v44 = 8 -;; @005f v46 = iconst.i64 8 -;; @005f v47 = uadd_overflow_trap v45, v46, user1 ; v46 = 8 -;; @005f v48 = icmp ule v47, v42 -;; @005f trapz v48, user1 -;; @005f v49 = iadd v40, v45 -;; @005f v50 = load.i64 notrap aligned v49 -;; v70 = iconst.i64 -1 -;; @005f v51 = iadd v50, v70 ; v70 = -1 -;; v71 = iconst.i64 0 -;; @005f v52 = icmp eq v51, v71 ; v71 = 0 -;; @005f brif v52, block5, block6 +;; @005f v46 = load.i64 notrap aligned readonly can_move v0+40 +;; @005f v48 = load.i64 notrap aligned readonly can_move v0+48 +;; @005f v49 = uextend.i64 v12 +;; @005f v50 = iconst.i64 8 +;; @005f v51 = uadd_overflow_trap v49, v50, user1 ; v50 = 8 +;; @005f v52 = iconst.i64 8 +;; @005f v53 = uadd_overflow_trap v51, v52, user1 ; v52 = 8 +;; @005f v54 = icmp ule v53, v48 +;; @005f trapz v54, user1 +;; @005f v55 = iadd v46, v51 +;; @005f v56 = load.i64 notrap aligned v55 +;; v78 = iconst.i64 -1 +;; @005f v57 = iadd v56, v78 ; v78 = -1 +;; v79 = iconst.i64 0 +;; @005f v58 = icmp eq v57, v79 ; v79 = 0 +;; @005f brif v58, block5, block6 ;; ;; block5 cold: ;; @005f call fn0(v0, v12) ;; @005f jump block7 ;; ;; block6: -;; @005f v55 = load.i64 notrap aligned readonly v0+40 -;; @005f v57 = load.i64 notrap aligned readonly v0+48 -;; @005f v58 = uextend.i64 v12 -;; @005f v59 = iconst.i64 8 -;; @005f v60 = uadd_overflow_trap v58, v59, user1 ; v59 = 8 -;; @005f v61 = iconst.i64 8 -;; @005f v62 = uadd_overflow_trap v60, v61, user1 ; v61 = 8 -;; @005f v63 = icmp ule v62, v57 -;; @005f trapz v63, user1 -;; @005f v64 = iadd v55, v60 -;; @005f store.i64 notrap aligned v51, v64 +;; @005f v61 = load.i64 notrap aligned readonly can_move v0+40 +;; @005f v63 = load.i64 notrap aligned readonly can_move v0+48 +;; @005f v64 = uextend.i64 v12 +;; @005f v65 = iconst.i64 8 +;; @005f v66 = uadd_overflow_trap v64, v65, user1 ; v65 = 8 +;; @005f v67 = iconst.i64 8 +;; @005f v68 = uadd_overflow_trap v66, v67, user1 ; v67 = 8 +;; @005f v69 = icmp ule v68, v63 +;; @005f trapz v69, user1 +;; @005f v70 = iadd v61, v66 +;; @005f store.i64 notrap aligned v57, v70 ;; @005f jump block7 ;; ;; block7: diff --git a/tests/disas/table-set.wat b/tests/disas/table-set.wat index 005e938600..588a1f8c93 100644 --- a/tests/disas/table-set.wat +++ b/tests/disas/table-set.wat @@ -21,96 +21,104 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+80 -;; gv5 = load.i64 notrap aligned gv3+88 +;; gv4 = load.i64 notrap aligned gv3+72 +;; gv5 = load.i64 notrap aligned gv3+80 ;; sig0 = (i64 vmctx, i32) tail ;; fn0 = colocated u1:25 sig0 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32): ;; @0051 v3 = iconst.i32 0 -;; @0055 v4 = load.i64 notrap aligned v0+88 +;; @0055 v4 = load.i64 notrap aligned v0+80 ;; @0055 v5 = ireduce.i32 v4 ;; @0055 v6 = icmp uge v3, v5 ; v3 = 0 ;; @0055 v7 = uextend.i64 v3 ; v3 = 0 -;; @0055 v8 = load.i64 notrap aligned v0+80 -;; v68 = iconst.i64 2 -;; @0055 v9 = ishl v7, v68 ; v68 = 2 +;; @0055 v8 = load.i64 notrap aligned v0+72 +;; v74 = iconst.i64 2 +;; @0055 v9 = ishl v7, v74 ; v74 = 2 ;; @0055 v10 = iadd v8, v9 ;; @0055 v11 = iconst.i64 0 ;; @0055 v12 = select_spectre_guard v6, v11, v10 ; v11 = 0 ;; @0055 v13 = load.i32 user5 aligned table v12 -;; v69 = iconst.i32 0 -;; @0055 v14 = icmp eq v2, v69 ; v69 = 0 -;; @0055 brif v14, block3, block2 +;; v75 = iconst.i32 1 +;; @0055 v14 = band v2, v75 ; v75 = 1 +;; v76 = iconst.i32 0 +;; @0055 v15 = icmp eq v2, v76 ; v76 = 0 +;; @0055 v16 = uextend.i32 v15 +;; @0055 v17 = bor v14, v16 +;; @0055 brif v17, block3, block2 ;; ;; block2: -;; @0055 v16 = load.i64 notrap aligned readonly v0+40 -;; @0055 v18 = load.i64 notrap aligned readonly v0+48 -;; @0055 v19 = uextend.i64 v2 -;; @0055 v20 = iconst.i64 8 -;; @0055 v21 = uadd_overflow_trap v19, v20, user1 ; v20 = 8 -;; @0055 v22 = iconst.i64 8 -;; @0055 v23 = uadd_overflow_trap v21, v22, user1 ; v22 = 8 -;; @0055 v24 = icmp ule v23, v18 -;; @0055 trapz v24, user1 -;; @0055 v25 = iadd v16, v21 -;; @0055 v26 = load.i64 notrap aligned v25 -;; v70 = iconst.i64 1 -;; @0055 v27 = iadd v26, v70 ; v70 = 1 -;; @0055 v29 = load.i64 notrap aligned readonly v0+40 -;; @0055 v31 = load.i64 notrap aligned readonly v0+48 -;; @0055 v32 = uextend.i64 v2 -;; @0055 v33 = iconst.i64 8 -;; @0055 v34 = uadd_overflow_trap v32, v33, user1 ; v33 = 8 -;; @0055 v35 = iconst.i64 8 -;; @0055 v36 = uadd_overflow_trap v34, v35, user1 ; v35 = 8 -;; @0055 v37 = icmp ule v36, v31 -;; @0055 trapz v37, user1 -;; @0055 v38 = iadd v29, v34 -;; @0055 store notrap aligned v27, v38 +;; @0055 v19 = load.i64 notrap aligned readonly can_move v0+40 +;; @0055 v21 = load.i64 notrap aligned readonly can_move v0+48 +;; @0055 v22 = uextend.i64 v2 +;; @0055 v23 = iconst.i64 8 +;; @0055 v24 = uadd_overflow_trap v22, v23, user1 ; v23 = 8 +;; @0055 v25 = iconst.i64 8 +;; @0055 v26 = uadd_overflow_trap v24, v25, user1 ; v25 = 8 +;; @0055 v27 = icmp ule v26, v21 +;; @0055 trapz v27, user1 +;; @0055 v28 = iadd v19, v24 +;; @0055 v29 = load.i64 notrap aligned v28 +;; v77 = iconst.i64 1 +;; @0055 v30 = iadd v29, v77 ; v77 = 1 +;; @0055 v32 = load.i64 notrap aligned readonly can_move v0+40 +;; @0055 v34 = load.i64 notrap aligned readonly can_move v0+48 +;; @0055 v35 = uextend.i64 v2 +;; @0055 v36 = iconst.i64 8 +;; @0055 v37 = uadd_overflow_trap v35, v36, user1 ; v36 = 8 +;; @0055 v38 = iconst.i64 8 +;; @0055 v39 = uadd_overflow_trap v37, v38, user1 ; v38 = 8 +;; @0055 v40 = icmp ule v39, v34 +;; @0055 trapz v40, user1 +;; @0055 v41 = iadd v32, v37 +;; @0055 store notrap aligned v30, v41 ;; @0055 jump block3 ;; ;; block3: ;; @0055 store.i32 user5 aligned table v2, v12 -;; v71 = iconst.i32 0 -;; @0055 v39 = icmp.i32 eq v13, v71 ; v71 = 0 -;; @0055 brif v39, block7, block4 +;; v78 = iconst.i32 1 +;; @0055 v42 = band.i32 v13, v78 ; v78 = 1 +;; v79 = iconst.i32 0 +;; @0055 v43 = icmp.i32 eq v13, v79 ; v79 = 0 +;; @0055 v44 = uextend.i32 v43 +;; @0055 v45 = bor v42, v44 +;; @0055 brif v45, block7, block4 ;; ;; block4: -;; @0055 v41 = load.i64 notrap aligned readonly v0+40 -;; @0055 v43 = load.i64 notrap aligned readonly v0+48 -;; @0055 v44 = uextend.i64 v13 -;; @0055 v45 = iconst.i64 8 -;; @0055 v46 = uadd_overflow_trap v44, v45, user1 ; v45 = 8 -;; @0055 v47 = iconst.i64 8 -;; @0055 v48 = uadd_overflow_trap v46, v47, user1 ; v47 = 8 -;; @0055 v49 = icmp ule v48, v43 -;; @0055 trapz v49, user1 -;; @0055 v50 = iadd v41, v46 -;; @0055 v51 = load.i64 notrap aligned v50 -;; v72 = iconst.i64 -1 -;; @0055 v52 = iadd v51, v72 ; v72 = -1 -;; v73 = iconst.i64 0 -;; @0055 v53 = icmp eq v52, v73 ; v73 = 0 -;; @0055 brif v53, block5, block6 +;; @0055 v47 = load.i64 notrap aligned readonly can_move v0+40 +;; @0055 v49 = load.i64 notrap aligned readonly can_move v0+48 +;; @0055 v50 = uextend.i64 v13 +;; @0055 v51 = iconst.i64 8 +;; @0055 v52 = uadd_overflow_trap v50, v51, user1 ; v51 = 8 +;; @0055 v53 = iconst.i64 8 +;; @0055 v54 = uadd_overflow_trap v52, v53, user1 ; v53 = 8 +;; @0055 v55 = icmp ule v54, v49 +;; @0055 trapz v55, user1 +;; @0055 v56 = iadd v47, v52 +;; @0055 v57 = load.i64 notrap aligned v56 +;; v80 = iconst.i64 -1 +;; @0055 v58 = iadd v57, v80 ; v80 = -1 +;; v81 = iconst.i64 0 +;; @0055 v59 = icmp eq v58, v81 ; v81 = 0 +;; @0055 brif v59, block5, block6 ;; ;; block5 cold: ;; @0055 call fn0(v0, v13) ;; @0055 jump block7 ;; ;; block6: -;; @0055 v56 = load.i64 notrap aligned readonly v0+40 -;; @0055 v58 = load.i64 notrap aligned readonly v0+48 -;; @0055 v59 = uextend.i64 v13 -;; @0055 v60 = iconst.i64 8 -;; @0055 v61 = uadd_overflow_trap v59, v60, user1 ; v60 = 8 -;; @0055 v62 = iconst.i64 8 -;; @0055 v63 = uadd_overflow_trap v61, v62, user1 ; v62 = 8 -;; @0055 v64 = icmp ule v63, v58 -;; @0055 trapz v64, user1 -;; @0055 v65 = iadd v56, v61 -;; @0055 store.i64 notrap aligned v52, v65 +;; @0055 v62 = load.i64 notrap aligned readonly can_move v0+40 +;; @0055 v64 = load.i64 notrap aligned readonly can_move v0+48 +;; @0055 v65 = uextend.i64 v13 +;; @0055 v66 = iconst.i64 8 +;; @0055 v67 = uadd_overflow_trap v65, v66, user1 ; v66 = 8 +;; @0055 v68 = iconst.i64 8 +;; @0055 v69 = uadd_overflow_trap v67, v68, user1 ; v68 = 8 +;; @0055 v70 = icmp ule v69, v64 +;; @0055 trapz v70, user1 +;; @0055 v71 = iadd v62, v67 +;; @0055 store.i64 notrap aligned v58, v71 ;; @0055 jump block7 ;; ;; block7: @@ -125,95 +133,103 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned gv3+80 -;; gv5 = load.i64 notrap aligned gv3+88 +;; gv4 = load.i64 notrap aligned gv3+72 +;; gv5 = load.i64 notrap aligned gv3+80 ;; sig0 = (i64 vmctx, i32) tail ;; fn0 = colocated u1:25 sig0 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32): -;; @005e v4 = load.i64 notrap aligned v0+88 +;; @005e v4 = load.i64 notrap aligned v0+80 ;; @005e v5 = ireduce.i32 v4 ;; @005e v6 = icmp uge v2, v5 ;; @005e v7 = uextend.i64 v2 -;; @005e v8 = load.i64 notrap aligned v0+80 -;; v68 = iconst.i64 2 -;; @005e v9 = ishl v7, v68 ; v68 = 2 +;; @005e v8 = load.i64 notrap aligned v0+72 +;; v74 = iconst.i64 2 +;; @005e v9 = ishl v7, v74 ; v74 = 2 ;; @005e v10 = iadd v8, v9 ;; @005e v11 = iconst.i64 0 ;; @005e v12 = select_spectre_guard v6, v11, v10 ; v11 = 0 ;; @005e v13 = load.i32 user5 aligned table v12 -;; v69 = iconst.i32 0 -;; @005e v14 = icmp eq v3, v69 ; v69 = 0 -;; @005e brif v14, block3, block2 +;; v75 = iconst.i32 1 +;; @005e v14 = band v3, v75 ; v75 = 1 +;; v76 = iconst.i32 0 +;; @005e v15 = icmp eq v3, v76 ; v76 = 0 +;; @005e v16 = uextend.i32 v15 +;; @005e v17 = bor v14, v16 +;; @005e brif v17, block3, block2 ;; ;; block2: -;; @005e v16 = load.i64 notrap aligned readonly v0+40 -;; @005e v18 = load.i64 notrap aligned readonly v0+48 -;; @005e v19 = uextend.i64 v3 -;; @005e v20 = iconst.i64 8 -;; @005e v21 = uadd_overflow_trap v19, v20, user1 ; v20 = 8 -;; @005e v22 = iconst.i64 8 -;; @005e v23 = uadd_overflow_trap v21, v22, user1 ; v22 = 8 -;; @005e v24 = icmp ule v23, v18 -;; @005e trapz v24, user1 -;; @005e v25 = iadd v16, v21 -;; @005e v26 = load.i64 notrap aligned v25 -;; v70 = iconst.i64 1 -;; @005e v27 = iadd v26, v70 ; v70 = 1 -;; @005e v29 = load.i64 notrap aligned readonly v0+40 -;; @005e v31 = load.i64 notrap aligned readonly v0+48 -;; @005e v32 = uextend.i64 v3 -;; @005e v33 = iconst.i64 8 -;; @005e v34 = uadd_overflow_trap v32, v33, user1 ; v33 = 8 -;; @005e v35 = iconst.i64 8 -;; @005e v36 = uadd_overflow_trap v34, v35, user1 ; v35 = 8 -;; @005e v37 = icmp ule v36, v31 -;; @005e trapz v37, user1 -;; @005e v38 = iadd v29, v34 -;; @005e store notrap aligned v27, v38 +;; @005e v19 = load.i64 notrap aligned readonly can_move v0+40 +;; @005e v21 = load.i64 notrap aligned readonly can_move v0+48 +;; @005e v22 = uextend.i64 v3 +;; @005e v23 = iconst.i64 8 +;; @005e v24 = uadd_overflow_trap v22, v23, user1 ; v23 = 8 +;; @005e v25 = iconst.i64 8 +;; @005e v26 = uadd_overflow_trap v24, v25, user1 ; v25 = 8 +;; @005e v27 = icmp ule v26, v21 +;; @005e trapz v27, user1 +;; @005e v28 = iadd v19, v24 +;; @005e v29 = load.i64 notrap aligned v28 +;; v77 = iconst.i64 1 +;; @005e v30 = iadd v29, v77 ; v77 = 1 +;; @005e v32 = load.i64 notrap aligned readonly can_move v0+40 +;; @005e v34 = load.i64 notrap aligned readonly can_move v0+48 +;; @005e v35 = uextend.i64 v3 +;; @005e v36 = iconst.i64 8 +;; @005e v37 = uadd_overflow_trap v35, v36, user1 ; v36 = 8 +;; @005e v38 = iconst.i64 8 +;; @005e v39 = uadd_overflow_trap v37, v38, user1 ; v38 = 8 +;; @005e v40 = icmp ule v39, v34 +;; @005e trapz v40, user1 +;; @005e v41 = iadd v32, v37 +;; @005e store notrap aligned v30, v41 ;; @005e jump block3 ;; ;; block3: ;; @005e store.i32 user5 aligned table v3, v12 -;; v71 = iconst.i32 0 -;; @005e v39 = icmp.i32 eq v13, v71 ; v71 = 0 -;; @005e brif v39, block7, block4 +;; v78 = iconst.i32 1 +;; @005e v42 = band.i32 v13, v78 ; v78 = 1 +;; v79 = iconst.i32 0 +;; @005e v43 = icmp.i32 eq v13, v79 ; v79 = 0 +;; @005e v44 = uextend.i32 v43 +;; @005e v45 = bor v42, v44 +;; @005e brif v45, block7, block4 ;; ;; block4: -;; @005e v41 = load.i64 notrap aligned readonly v0+40 -;; @005e v43 = load.i64 notrap aligned readonly v0+48 -;; @005e v44 = uextend.i64 v13 -;; @005e v45 = iconst.i64 8 -;; @005e v46 = uadd_overflow_trap v44, v45, user1 ; v45 = 8 -;; @005e v47 = iconst.i64 8 -;; @005e v48 = uadd_overflow_trap v46, v47, user1 ; v47 = 8 -;; @005e v49 = icmp ule v48, v43 -;; @005e trapz v49, user1 -;; @005e v50 = iadd v41, v46 -;; @005e v51 = load.i64 notrap aligned v50 -;; v72 = iconst.i64 -1 -;; @005e v52 = iadd v51, v72 ; v72 = -1 -;; v73 = iconst.i64 0 -;; @005e v53 = icmp eq v52, v73 ; v73 = 0 -;; @005e brif v53, block5, block6 +;; @005e v47 = load.i64 notrap aligned readonly can_move v0+40 +;; @005e v49 = load.i64 notrap aligned readonly can_move v0+48 +;; @005e v50 = uextend.i64 v13 +;; @005e v51 = iconst.i64 8 +;; @005e v52 = uadd_overflow_trap v50, v51, user1 ; v51 = 8 +;; @005e v53 = iconst.i64 8 +;; @005e v54 = uadd_overflow_trap v52, v53, user1 ; v53 = 8 +;; @005e v55 = icmp ule v54, v49 +;; @005e trapz v55, user1 +;; @005e v56 = iadd v47, v52 +;; @005e v57 = load.i64 notrap aligned v56 +;; v80 = iconst.i64 -1 +;; @005e v58 = iadd v57, v80 ; v80 = -1 +;; v81 = iconst.i64 0 +;; @005e v59 = icmp eq v58, v81 ; v81 = 0 +;; @005e brif v59, block5, block6 ;; ;; block5 cold: ;; @005e call fn0(v0, v13) ;; @005e jump block7 ;; ;; block6: -;; @005e v56 = load.i64 notrap aligned readonly v0+40 -;; @005e v58 = load.i64 notrap aligned readonly v0+48 -;; @005e v59 = uextend.i64 v13 -;; @005e v60 = iconst.i64 8 -;; @005e v61 = uadd_overflow_trap v59, v60, user1 ; v60 = 8 -;; @005e v62 = iconst.i64 8 -;; @005e v63 = uadd_overflow_trap v61, v62, user1 ; v62 = 8 -;; @005e v64 = icmp ule v63, v58 -;; @005e trapz v64, user1 -;; @005e v65 = iadd v56, v61 -;; @005e store.i64 notrap aligned v52, v65 +;; @005e v62 = load.i64 notrap aligned readonly can_move v0+40 +;; @005e v64 = load.i64 notrap aligned readonly can_move v0+48 +;; @005e v65 = uextend.i64 v13 +;; @005e v66 = iconst.i64 8 +;; @005e v67 = uadd_overflow_trap v65, v66, user1 ; v66 = 8 +;; @005e v68 = iconst.i64 8 +;; @005e v69 = uadd_overflow_trap v67, v68, user1 ; v68 = 8 +;; @005e v70 = icmp ule v69, v64 +;; @005e trapz v70, user1 +;; @005e v71 = iadd v62, v67 +;; @005e store.i64 notrap aligned v58, v71 ;; @005e jump block7 ;; ;; block7: diff --git a/tests/disas/typed-funcrefs-eager-init.wat b/tests/disas/typed-funcrefs-eager-init.wat index a7832005da..1e4d14f25c 100644 --- a/tests/disas/typed-funcrefs-eager-init.wat +++ b/tests/disas/typed-funcrefs-eager-init.wat @@ -131,12 +131,12 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i64, i32, i32, i32, i32) -> i32 tail ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32, v4: i32, v5: i32): -;; @0048 v12 = load.i64 notrap aligned readonly v0+80 +;; @0048 v12 = load.i64 notrap aligned readonly can_move v0+72 ;; v48 = iconst.i64 8 ;; @0048 v14 = iadd v12, v48 ; v48 = 8 ;; @0048 v17 = load.i64 user5 aligned table v14 @@ -161,12 +161,12 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i64, i32, i32, i32, i32) -> i32 tail ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32, v4: i32, v5: i32): -;; @0075 v12 = load.i64 notrap aligned readonly v0+80 +;; @0075 v12 = load.i64 notrap aligned readonly can_move v0+72 ;; v48 = iconst.i64 8 ;; @0075 v14 = iadd v12, v48 ; v48 = 8 ;; @0075 v17 = load.i64 user5 aligned table v14 diff --git a/tests/disas/typed-funcrefs.wat b/tests/disas/typed-funcrefs.wat index be254edba9..d83fc1a2cc 100644 --- a/tests/disas/typed-funcrefs.wat +++ b/tests/disas/typed-funcrefs.wat @@ -131,14 +131,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i32, i64) -> i64 tail ;; sig1 = (i64 vmctx, i64, i32, i32, i32, i32) -> i32 tail ;; fn0 = colocated u1:9 sig0 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32, v4: i32, v5: i32): -;; @0048 v12 = load.i64 notrap aligned readonly v0+80 +;; @0048 v12 = load.i64 notrap aligned readonly can_move v0+72 ;; v68 = iconst.i64 8 ;; @0048 v14 = iadd v12, v68 ; v68 = 8 ;; @0048 v17 = load.i64 user5 aligned table v14 @@ -185,14 +185,14 @@ ;; gv1 = load.i64 notrap aligned readonly gv0+8 ;; gv2 = load.i64 notrap aligned gv1+16 ;; gv3 = vmctx -;; gv4 = load.i64 notrap aligned readonly gv3+80 +;; gv4 = load.i64 notrap aligned readonly can_move gv3+72 ;; sig0 = (i64 vmctx, i64, i32, i32, i32, i32) -> i32 tail ;; sig1 = (i64 vmctx, i32, i64) -> i64 tail ;; fn0 = colocated u1:9 sig1 ;; stack_limit = gv2 ;; ;; block0(v0: i64, v1: i64, v2: i32, v3: i32, v4: i32, v5: i32): -;; @0075 v12 = load.i64 notrap aligned readonly v0+80 +;; @0075 v12 = load.i64 notrap aligned readonly can_move v0+72 ;; v68 = iconst.i64 8 ;; @0075 v14 = iadd v12, v68 ; v68 = 8 ;; @0075 v17 = load.i64 user5 aligned table v14 diff --git a/tests/disas/winch/aarch64/call_indirect/call_indirect.wat b/tests/disas/winch/aarch64/call_indirect/call_indirect.wat index 34e7fbfcac..02355b81f5 100644 --- a/tests/disas/winch/aarch64/call_indirect/call_indirect.wat +++ b/tests/disas/winch/aarch64/call_indirect/call_indirect.wat @@ -57,7 +57,7 @@ ;; mov x16, #0 ;; mov w1, w16 ;; mov x2, x9 -;; ldur x3, [x2, #0x58] +;; ldur x3, [x2, #0x50] ;; cmp x1, x3, uxtx ;; sub sp, x28, #4 ;; b.hs #0x284 @@ -65,7 +65,7 @@ ;; mov x16, x1 ;; mov x16, #8 ;; mul x16, x16, x16 -;; ldur x2, [x2, #0x50] +;; ldur x2, [x2, #0x48] ;; mov x4, x2 ;; add x2, x2, x16, uxtx ;; cmp w1, w3, uxtx @@ -127,13 +127,13 @@ ;; mov x16, #0 ;; mov w1, w16 ;; mov x2, x9 -;; ldur x3, [x2, #0x58] +;; ldur x3, [x2, #0x50] ;; cmp x1, x3, uxtx ;; b.hs #0x290 ;; 190: mov x16, x1 ;; mov x16, #8 ;; mul x16, x16, x16 -;; ldur x2, [x2, #0x50] +;; ldur x2, [x2, #0x48] ;; mov x4, x2 ;; add x2, x2, x16, uxtx ;; cmp w1, w3, uxtx diff --git a/tests/disas/winch/aarch64/call_indirect/local_arg.wat b/tests/disas/winch/aarch64/call_indirect/local_arg.wat index bf2223e51c..3c11570842 100644 --- a/tests/disas/winch/aarch64/call_indirect/local_arg.wat +++ b/tests/disas/winch/aarch64/call_indirect/local_arg.wat @@ -54,7 +54,7 @@ ;; mov x16, #0 ;; mov w1, w16 ;; mov x2, x9 -;; ldur x3, [x2, #0x58] +;; ldur x3, [x2, #0x50] ;; cmp x1, x3, uxtx ;; sub sp, x28, #4 ;; b.hs #0x18c @@ -62,7 +62,7 @@ ;; mov x16, x1 ;; mov x16, #8 ;; mul x16, x16, x16 -;; ldur x2, [x2, #0x50] +;; ldur x2, [x2, #0x48] ;; mov x4, x2 ;; add x2, x2, x16, uxtx ;; cmp w1, w3, uxtx diff --git a/tests/disas/winch/aarch64/load/dynamic_heap.wat b/tests/disas/winch/aarch64/load/dynamic_heap.wat index 7d8365c606..e165eb782d 100644 --- a/tests/disas/winch/aarch64/load/dynamic_heap.wat +++ b/tests/disas/winch/aarch64/load/dynamic_heap.wat @@ -32,13 +32,13 @@ ;; stur w3, [x28, #0xc] ;; stur x0, [x28] ;; ldur w0, [x28, #0xc] -;; ldur x1, [x9, #0x60] +;; ldur x1, [x9, #0x58] ;; mov w2, w0 ;; add x2, x2, #4 ;; b.hs #0x140 ;; 40: cmp x2, x1, uxtx ;; b.hi #0x144 -;; 48: ldur x3, [x9, #0x58] +;; 48: ldur x3, [x9, #0x50] ;; add x3, x3, x0, uxtx ;; mov x16, #0 ;; mov x4, x16 @@ -46,13 +46,13 @@ ;; csel x3, x4, x4, hi ;; ldur w0, [x3] ;; ldur w1, [x28, #0xc] -;; ldur x2, [x9, #0x60] +;; ldur x2, [x9, #0x58] ;; mov w3, w1 ;; add x3, x3, #8 ;; b.hs #0x148 ;; 78: cmp x3, x2, uxtx ;; b.hi #0x14c -;; 80: ldur x4, [x9, #0x58] +;; 80: ldur x4, [x9, #0x50] ;; add x4, x4, x1, uxtx ;; add x4, x4, #4 ;; mov x16, #0 @@ -61,7 +61,7 @@ ;; csel x4, x5, x5, hi ;; ldur w1, [x4] ;; ldur w2, [x28, #0xc] -;; ldur x3, [x9, #0x60] +;; ldur x3, [x9, #0x58] ;; mov w4, w2 ;; mov w16, #3 ;; movk w16, #0x10, lsl #16 @@ -69,7 +69,7 @@ ;; b.hs #0x150 ;; bc: cmp x4, x3, uxtx ;; b.hi #0x154 -;; c4: ldur x5, [x9, #0x58] +;; c4: ldur x5, [x9, #0x50] ;; add x5, x5, x2, uxtx ;; orr x16, xzr, #0xfffff ;; add x5, x5, x16, uxtx diff --git a/tests/disas/winch/aarch64/load/f32.wat b/tests/disas/winch/aarch64/load/f32.wat index ae1afc0074..6ef5da67d6 100644 --- a/tests/disas/winch/aarch64/load/f32.wat +++ b/tests/disas/winch/aarch64/load/f32.wat @@ -18,7 +18,7 @@ ;; stur x1, [x28] ;; mov x16, #0 ;; mov w0, w16 -;; ldur x1, [x9, #0x58] +;; ldur x1, [x9, #0x50] ;; add x1, x1, x0, uxtx ;; ldur s0, [x1] ;; add x28, x28, #0x10 diff --git a/tests/disas/winch/aarch64/load/f64.wat b/tests/disas/winch/aarch64/load/f64.wat index 3d73c2ae3d..4cc3bfb739 100644 --- a/tests/disas/winch/aarch64/load/f64.wat +++ b/tests/disas/winch/aarch64/load/f64.wat @@ -17,7 +17,7 @@ ;; stur x1, [x28] ;; mov x16, #0 ;; mov w0, w16 -;; ldur x1, [x9, #0x58] +;; ldur x1, [x9, #0x50] ;; add x1, x1, x0, uxtx ;; ldur d0, [x1] ;; add x28, x28, #0x10 diff --git a/tests/disas/winch/aarch64/load/i32.wat b/tests/disas/winch/aarch64/load/i32.wat index 65a830e178..b52e5f02e6 100644 --- a/tests/disas/winch/aarch64/load/i32.wat +++ b/tests/disas/winch/aarch64/load/i32.wat @@ -18,7 +18,7 @@ ;; stur x1, [x28] ;; mov x16, #0 ;; mov w0, w16 -;; ldur x1, [x9, #0x58] +;; ldur x1, [x9, #0x50] ;; add x1, x1, x0, uxtx ;; ldur w0, [x1] ;; add x28, x28, #0x10 diff --git a/tests/disas/winch/aarch64/load/i64.wat b/tests/disas/winch/aarch64/load/i64.wat index 8889327106..5fedf9b186 100644 --- a/tests/disas/winch/aarch64/load/i64.wat +++ b/tests/disas/winch/aarch64/load/i64.wat @@ -21,14 +21,14 @@ ;; ldur x0, [x28] ;; mov x16, #8 ;; mov w1, w16 -;; ldur x2, [x9, #0x58] +;; ldur x2, [x9, #0x50] ;; add x2, x2, x1, uxtx ;; sub sp, x28, #8 ;; sturb w0, [x2] ;; mov sp, x28 ;; mov x16, #8 ;; mov w0, w16 -;; ldur x1, [x9, #0x58] +;; ldur x1, [x9, #0x50] ;; add x1, x1, x0, uxtx ;; sub sp, x28, #8 ;; ldursb x0, [x1] diff --git a/tests/disas/winch/aarch64/store/dynamic_heap.wat b/tests/disas/winch/aarch64/store/dynamic_heap.wat index 06e7492756..c59069eebc 100644 --- a/tests/disas/winch/aarch64/store/dynamic_heap.wat +++ b/tests/disas/winch/aarch64/store/dynamic_heap.wat @@ -35,13 +35,13 @@ ;; stur w5, [x28] ;; ldur w0, [x28, #8] ;; ldur w1, [x28, #0xc] -;; ldur x2, [x9, #0x60] +;; ldur x2, [x9, #0x58] ;; mov w3, w1 ;; add x3, x3, #4 ;; b.hs #0x114 ;; 4c: cmp x3, x2, uxtx ;; b.hi #0x118 -;; 54: ldur x4, [x9, #0x58] +;; 54: ldur x4, [x9, #0x50] ;; add x4, x4, x1, uxtx ;; mov x16, #0 ;; mov x5, x16 @@ -50,13 +50,13 @@ ;; stur w0, [x4] ;; ldur w0, [x28, #4] ;; ldur w1, [x28, #0xc] -;; ldur x2, [x9, #0x60] +;; ldur x2, [x9, #0x58] ;; mov w3, w1 ;; add x3, x3, #8 ;; b.hs #0x11c ;; 88: cmp x3, x2, uxtx ;; b.hi #0x120 -;; 90: ldur x4, [x9, #0x58] +;; 90: ldur x4, [x9, #0x50] ;; add x4, x4, x1, uxtx ;; add x4, x4, #4 ;; mov x16, #0 @@ -66,7 +66,7 @@ ;; stur w0, [x4] ;; ldur w0, [x28] ;; ldur w1, [x28, #0xc] -;; ldur x2, [x9, #0x60] +;; ldur x2, [x9, #0x58] ;; mov w3, w1 ;; mov w16, #3 ;; movk w16, #0x10, lsl #16 @@ -74,7 +74,7 @@ ;; b.hs #0x124 ;; d0: cmp x3, x2, uxtx ;; b.hi #0x128 -;; d8: ldur x4, [x9, #0x58] +;; d8: ldur x4, [x9, #0x50] ;; add x4, x4, x1, uxtx ;; orr x16, xzr, #0xfffff ;; add x4, x4, x16, uxtx diff --git a/tests/disas/winch/aarch64/store/f32.wat b/tests/disas/winch/aarch64/store/f32.wat index 84a223c29c..79825613da 100644 --- a/tests/disas/winch/aarch64/store/f32.wat +++ b/tests/disas/winch/aarch64/store/f32.wat @@ -19,7 +19,7 @@ ;; fmov s0, w16 ;; mov x16, #0 ;; mov w0, w16 -;; ldur x1, [x9, #0x58] +;; ldur x1, [x9, #0x50] ;; add x1, x1, x0, uxtx ;; stur s0, [x1] ;; add x28, x28, #0x10 diff --git a/tests/disas/winch/aarch64/store/f64.wat b/tests/disas/winch/aarch64/store/f64.wat index ba2bdadf82..666d5a41a6 100644 --- a/tests/disas/winch/aarch64/store/f64.wat +++ b/tests/disas/winch/aarch64/store/f64.wat @@ -20,7 +20,7 @@ ;; fmov d0, x16 ;; mov x16, #0 ;; mov w0, w16 -;; ldur x1, [x9, #0x58] +;; ldur x1, [x9, #0x50] ;; add x1, x1, x0, uxtx ;; stur d0, [x1] ;; add x28, x28, #0x10 diff --git a/tests/disas/winch/aarch64/store/i32.wat b/tests/disas/winch/aarch64/store/i32.wat index fe032e3dd2..c329695f28 100644 --- a/tests/disas/winch/aarch64/store/i32.wat +++ b/tests/disas/winch/aarch64/store/i32.wat @@ -21,7 +21,7 @@ ;; mov w0, w16 ;; mov x16, #0 ;; mov w1, w16 -;; ldur x2, [x9, #0x58] +;; ldur x2, [x9, #0x50] ;; add x2, x2, x1, uxtx ;; stur w0, [x2] ;; add x28, x28, #0x10 diff --git a/tests/disas/winch/x64/atomic/fence/fence.wat b/tests/disas/winch/x64/atomic/fence/fence.wat index 6c757827ab..def2aec8e6 100644 --- a/tests/disas/winch/x64/atomic/fence/fence.wat +++ b/tests/disas/winch/x64/atomic/fence/fence.wat @@ -22,13 +22,13 @@ ;; movq %rsi, (%rsp) ;; movl $0x2a, %eax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; movl %eax, (%rdx) ;; mfence ;; movl $0, %eax -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rcx ;; addq %rax, %rcx ;; movl (%rcx), %eax diff --git a/tests/disas/winch/x64/atomic/load/i32_atomic_load.wat b/tests/disas/winch/x64/atomic/load/i32_atomic_load.wat index d6d09c3d6f..ee1a64623b 100644 --- a/tests/disas/winch/x64/atomic/load/i32_atomic_load.wat +++ b/tests/disas/winch/x64/atomic/load/i32_atomic_load.wat @@ -24,7 +24,7 @@ ;; cmpl $0, %eax ;; jne 0x59 ;; 41: movl 0xc(%rsp), %eax -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rcx ;; addq %rax, %rcx ;; movl (%rcx), %eax diff --git a/tests/disas/winch/x64/atomic/load/i32_atomic_load16_u.wat b/tests/disas/winch/x64/atomic/load/i32_atomic_load16_u.wat index c555b70590..1dec794a86 100644 --- a/tests/disas/winch/x64/atomic/load/i32_atomic_load16_u.wat +++ b/tests/disas/winch/x64/atomic/load/i32_atomic_load16_u.wat @@ -24,7 +24,7 @@ ;; cmpw $0, %ax ;; jne 0x5d ;; 43: movl 0xc(%rsp), %eax -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rcx ;; addq %rax, %rcx ;; movzwq (%rcx), %rax diff --git a/tests/disas/winch/x64/atomic/load/i32_atomic_load8_u.wat b/tests/disas/winch/x64/atomic/load/i32_atomic_load8_u.wat index 158db283d1..42d924572d 100644 --- a/tests/disas/winch/x64/atomic/load/i32_atomic_load8_u.wat +++ b/tests/disas/winch/x64/atomic/load/i32_atomic_load8_u.wat @@ -19,7 +19,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movzbq (%rcx), %rax ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/atomic/load/i64_atomic_load.wat b/tests/disas/winch/x64/atomic/load/i64_atomic_load.wat index 34ee74cf87..66fa01df46 100644 --- a/tests/disas/winch/x64/atomic/load/i64_atomic_load.wat +++ b/tests/disas/winch/x64/atomic/load/i64_atomic_load.wat @@ -24,7 +24,7 @@ ;; cmpq $0, %rax ;; jne 0x56 ;; 3f: movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movq (%rcx), %rax ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/atomic/load/i64_atomic_load16_u.wat b/tests/disas/winch/x64/atomic/load/i64_atomic_load16_u.wat index 8872945afb..2aefd67650 100644 --- a/tests/disas/winch/x64/atomic/load/i64_atomic_load16_u.wat +++ b/tests/disas/winch/x64/atomic/load/i64_atomic_load16_u.wat @@ -24,7 +24,7 @@ ;; cmpw $0, %ax ;; jne 0x57 ;; 3f: movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movzwq (%rcx), %rax ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/atomic/load/i64_atomic_load32_u.wat b/tests/disas/winch/x64/atomic/load/i64_atomic_load32_u.wat index 6be19a466f..6ef2558acc 100644 --- a/tests/disas/winch/x64/atomic/load/i64_atomic_load32_u.wat +++ b/tests/disas/winch/x64/atomic/load/i64_atomic_load32_u.wat @@ -24,7 +24,7 @@ ;; cmpl $0, %eax ;; jne 0x53 ;; 3d: movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movl (%rcx), %eax ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/atomic/load/i64_atomic_load8_u.wat b/tests/disas/winch/x64/atomic/load/i64_atomic_load8_u.wat index 03b18db07d..5d6736dde9 100644 --- a/tests/disas/winch/x64/atomic/load/i64_atomic_load8_u.wat +++ b/tests/disas/winch/x64/atomic/load/i64_atomic_load8_u.wat @@ -20,7 +20,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movzbq (%rcx), %rax ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/atomic/rmw/add/i32_atomic_rmw16_addu.wat b/tests/disas/winch/x64/atomic/rmw/add/i32_atomic_rmw16_addu.wat index fa53575020..1eb502ce72 100644 --- a/tests/disas/winch/x64/atomic/rmw/add/i32_atomic_rmw16_addu.wat +++ b/tests/disas/winch/x64/atomic/rmw/add/i32_atomic_rmw16_addu.wat @@ -23,7 +23,7 @@ ;; cmpw $0, %cx ;; jne 0x63 ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; lock xaddw %ax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/add/i32_atomic_rmw8_addu.wat b/tests/disas/winch/x64/atomic/rmw/add/i32_atomic_rmw8_addu.wat index 2d6511ac53..1831628286 100644 --- a/tests/disas/winch/x64/atomic/rmw/add/i32_atomic_rmw8_addu.wat +++ b/tests/disas/winch/x64/atomic/rmw/add/i32_atomic_rmw8_addu.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movl $0x2a, %eax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; lock xaddb %al, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/add/i32_atomic_rmw_add.wat b/tests/disas/winch/x64/atomic/rmw/add/i32_atomic_rmw_add.wat index f397577ee2..ba2561f320 100644 --- a/tests/disas/winch/x64/atomic/rmw/add/i32_atomic_rmw_add.wat +++ b/tests/disas/winch/x64/atomic/rmw/add/i32_atomic_rmw_add.wat @@ -23,7 +23,7 @@ ;; cmpl $0, %ecx ;; jne 0x5d ;; 42: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; lock xaddl %eax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw16_addu.wat b/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw16_addu.wat index 526fc3b6fc..1b4c876e4b 100644 --- a/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw16_addu.wat +++ b/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw16_addu.wat @@ -23,7 +23,7 @@ ;; cmpw $0, %cx ;; jne 0x66 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; lock xaddw %ax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw32_addu.wat b/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw32_addu.wat index 002a02fd95..6bf37303e6 100644 --- a/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw32_addu.wat +++ b/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw32_addu.wat @@ -23,7 +23,7 @@ ;; cmpl $0, %ecx ;; jne 0x5f ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; lock xaddl %eax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw8_addu.wat b/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw8_addu.wat index 4f35ab8eb6..4114c725de 100644 --- a/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw8_addu.wat +++ b/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw8_addu.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movq $0x2a, %rax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; lock xaddb %al, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw_add.wat b/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw_add.wat index 1cd3ace197..06715029b9 100644 --- a/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw_add.wat +++ b/tests/disas/winch/x64/atomic/rmw/add/i64_atomic_rmw_add.wat @@ -23,7 +23,7 @@ ;; cmpq $0, %rcx ;; jne 0x62 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; lock xaddq %rax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw16_andu.wat b/tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw16_andu.wat index e203a48685..7200905264 100644 --- a/tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw16_andu.wat +++ b/tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw16_andu.wat @@ -23,7 +23,7 @@ ;; cmpw $0, %cx ;; jne 0x82 ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; subq $4, %rsp diff --git a/tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw8_andu.wat b/tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw8_andu.wat index 654ac913e3..716b05cd23 100644 --- a/tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw8_andu.wat +++ b/tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw8_andu.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movl $0x2a, %eax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; subq $4, %rsp diff --git a/tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw_and.wat b/tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw_and.wat index 0c823ae564..7cc5bd58a5 100644 --- a/tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw_and.wat +++ b/tests/disas/winch/x64/atomic/rmw/and/i32_atomic_rmw_and.wat @@ -23,7 +23,7 @@ ;; cmpl $0, %ecx ;; jne 0x7a ;; 42: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; subq $4, %rsp diff --git a/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw16_andu.wat b/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw16_andu.wat index 3b47c6de0e..2883d7d0dd 100644 --- a/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw16_andu.wat +++ b/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw16_andu.wat @@ -23,7 +23,7 @@ ;; cmpw $0, %cx ;; jne 0x79 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; pushq %rax diff --git a/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw32_andu.wat b/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw32_andu.wat index 2473b65583..2d203408f0 100644 --- a/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw32_andu.wat +++ b/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw32_andu.wat @@ -23,7 +23,7 @@ ;; cmpl $0, %ecx ;; jne 0x70 ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; pushq %rax diff --git a/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw8_andu.wat b/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw8_andu.wat index 6b6d1e371c..7e39abc272 100644 --- a/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw8_andu.wat +++ b/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw8_andu.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movq $0x2a, %rax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; pushq %rax diff --git a/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw_and.wat b/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw_and.wat index 71bb63e6e3..3aa9810b00 100644 --- a/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw_and.wat +++ b/tests/disas/winch/x64/atomic/rmw/and/i64_atomic_rmw_and.wat @@ -23,7 +23,7 @@ ;; cmpq $0, %rcx ;; jne 0x73 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; pushq %rax diff --git a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i32_atomic_rmw16_cmpxchgu.wat b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i32_atomic_rmw16_cmpxchgu.wat index cbb6827544..8d65a3b17a 100644 --- a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i32_atomic_rmw16_cmpxchgu.wat +++ b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i32_atomic_rmw16_cmpxchgu.wat @@ -24,7 +24,7 @@ ;; cmpw $0, %dx ;; jne 0x84 ;; 49: movl $0, %edx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rbx ;; addq %rdx, %rbx ;; subq $4, %rsp diff --git a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i32_atomic_rmw8_cmpxchgu.wat b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i32_atomic_rmw8_cmpxchgu.wat index bd27b8dd31..9bc0695ad6 100644 --- a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i32_atomic_rmw8_cmpxchgu.wat +++ b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i32_atomic_rmw8_cmpxchgu.wat @@ -20,7 +20,7 @@ ;; movl $0x539, %eax ;; movl $0x2a, %ecx ;; movl $0, %edx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rbx ;; addq %rdx, %rbx ;; subq $4, %rsp diff --git a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i32_atomic_rmw_cmpxchg.wat b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i32_atomic_rmw_cmpxchg.wat index 8e2dc99c2d..813d23f96b 100644 --- a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i32_atomic_rmw_cmpxchg.wat +++ b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i32_atomic_rmw_cmpxchg.wat @@ -24,7 +24,7 @@ ;; cmpl $0, %edx ;; jne 0x7e ;; 47: movl $0, %edx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rbx ;; addq %rdx, %rbx ;; subq $4, %rsp diff --git a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw16_cmpxchgu.wat b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw16_cmpxchgu.wat index 9e8b6bcd9a..a5bdf40e4f 100644 --- a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw16_cmpxchgu.wat +++ b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw16_cmpxchgu.wat @@ -24,7 +24,7 @@ ;; cmpw $0, %dx ;; jne 0x71 ;; 4d: movl $0, %edx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rbx ;; addq %rdx, %rbx ;; pushq %rcx diff --git a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw32_cmpxchgu.wat b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw32_cmpxchgu.wat index dffa86624f..9d1ed0f56f 100644 --- a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw32_cmpxchgu.wat +++ b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw32_cmpxchgu.wat @@ -24,7 +24,7 @@ ;; cmpl $0, %edx ;; jne 0x6a ;; 4b: movl $0, %edx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rbx ;; addq %rdx, %rbx ;; pushq %rcx diff --git a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw8_cmpxchgu.wat b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw8_cmpxchgu.wat index eaffa4b63d..05373f00d1 100644 --- a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw8_cmpxchgu.wat +++ b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw8_cmpxchgu.wat @@ -20,7 +20,7 @@ ;; movq $0x539, %rax ;; movq $0x2a, %rcx ;; movl $0, %edx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rbx ;; addq %rdx, %rbx ;; pushq %rcx diff --git a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw_cmpxchg.wat b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw_cmpxchg.wat index b4c86a37a6..7351dbafc9 100644 --- a/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw_cmpxchg.wat +++ b/tests/disas/winch/x64/atomic/rmw/cmpxchg/i64_atomic_rmw_cmpxchg.wat @@ -24,7 +24,7 @@ ;; cmpq $0, %rdx ;; jne 0x6d ;; 4d: movl $0, %edx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rbx ;; addq %rdx, %rbx ;; pushq %rcx diff --git a/tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw16_oru.wat b/tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw16_oru.wat index 80402ce6c0..c4ea4860ff 100644 --- a/tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw16_oru.wat +++ b/tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw16_oru.wat @@ -23,7 +23,7 @@ ;; cmpw $0, %cx ;; jne 0x82 ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; subq $4, %rsp diff --git a/tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw8_oru.wat b/tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw8_oru.wat index ccbfbe3bd1..9baa98b6ad 100644 --- a/tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw8_oru.wat +++ b/tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw8_oru.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movl $0x2a, %eax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; subq $4, %rsp diff --git a/tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw_or.wat b/tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw_or.wat index 7d2837406c..0493ddb563 100644 --- a/tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw_or.wat +++ b/tests/disas/winch/x64/atomic/rmw/or/i32_atomic_rmw_or.wat @@ -23,7 +23,7 @@ ;; cmpl $0, %ecx ;; jne 0x7a ;; 42: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; subq $4, %rsp diff --git a/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw16_oru.wat b/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw16_oru.wat index 55153c11e2..f55b5a1484 100644 --- a/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw16_oru.wat +++ b/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw16_oru.wat @@ -23,7 +23,7 @@ ;; cmpw $0, %cx ;; jne 0x79 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; pushq %rax diff --git a/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw32_oru.wat b/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw32_oru.wat index 8f6be5e87e..6e2097ffac 100644 --- a/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw32_oru.wat +++ b/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw32_oru.wat @@ -23,7 +23,7 @@ ;; cmpl $0, %ecx ;; jne 0x70 ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; pushq %rax diff --git a/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw8_oru.wat b/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw8_oru.wat index 02a8211a1e..81c370bc28 100644 --- a/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw8_oru.wat +++ b/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw8_oru.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movq $0x2a, %rax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; pushq %rax diff --git a/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw_or.wat b/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw_or.wat index cffbe70bcb..c620b579cf 100644 --- a/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw_or.wat +++ b/tests/disas/winch/x64/atomic/rmw/or/i64_atomic_rmw_or.wat @@ -23,7 +23,7 @@ ;; cmpq $0, %rcx ;; jne 0x73 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; pushq %rax diff --git a/tests/disas/winch/x64/atomic/rmw/sub/i32_atomic_rmw16_subu.wat b/tests/disas/winch/x64/atomic/rmw/sub/i32_atomic_rmw16_subu.wat index 361cef9db5..1be0cad1ba 100644 --- a/tests/disas/winch/x64/atomic/rmw/sub/i32_atomic_rmw16_subu.wat +++ b/tests/disas/winch/x64/atomic/rmw/sub/i32_atomic_rmw16_subu.wat @@ -23,7 +23,7 @@ ;; cmpw $0, %cx ;; jne 0x66 ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; negw %ax diff --git a/tests/disas/winch/x64/atomic/rmw/sub/i32_atomic_rmw8_subu.wat b/tests/disas/winch/x64/atomic/rmw/sub/i32_atomic_rmw8_subu.wat index 05bf900f89..ed2f0b20fc 100644 --- a/tests/disas/winch/x64/atomic/rmw/sub/i32_atomic_rmw8_subu.wat +++ b/tests/disas/winch/x64/atomic/rmw/sub/i32_atomic_rmw8_subu.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movl $0x2a, %eax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; negb %al diff --git a/tests/disas/winch/x64/atomic/rmw/sub/i32_atomic_rmw_sub.wat b/tests/disas/winch/x64/atomic/rmw/sub/i32_atomic_rmw_sub.wat index 1f2f52413a..5707e5283f 100644 --- a/tests/disas/winch/x64/atomic/rmw/sub/i32_atomic_rmw_sub.wat +++ b/tests/disas/winch/x64/atomic/rmw/sub/i32_atomic_rmw_sub.wat @@ -23,7 +23,7 @@ ;; cmpl $0, %ecx ;; jne 0x5f ;; 42: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; negl %eax diff --git a/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw16_subu.wat b/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw16_subu.wat index 72a2f3e8e4..e6965771dc 100644 --- a/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw16_subu.wat +++ b/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw16_subu.wat @@ -23,7 +23,7 @@ ;; cmpw $0, %cx ;; jne 0x69 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; negw %ax diff --git a/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw32_subu.wat b/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw32_subu.wat index f6738a176f..74a851ea62 100644 --- a/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw32_subu.wat +++ b/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw32_subu.wat @@ -23,7 +23,7 @@ ;; cmpl $0, %ecx ;; jne 0x61 ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; negl %eax diff --git a/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw8_subu.wat b/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw8_subu.wat index 30701282ef..ccff67da27 100644 --- a/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw8_subu.wat +++ b/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw8_subu.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movq $0x2a, %rax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; negb %al diff --git a/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw_sub.wat b/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw_sub.wat index 87a6ee2b19..32e5cbfca0 100644 --- a/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw_sub.wat +++ b/tests/disas/winch/x64/atomic/rmw/sub/i64_atomic_rmw_sub.wat @@ -23,7 +23,7 @@ ;; cmpq $0, %rcx ;; jne 0x65 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; negq %rax diff --git a/tests/disas/winch/x64/atomic/rmw/xchg/i32_atomic_rmw16_xchgu.wat b/tests/disas/winch/x64/atomic/rmw/xchg/i32_atomic_rmw16_xchgu.wat index a75ca95dae..70d9be6436 100644 --- a/tests/disas/winch/x64/atomic/rmw/xchg/i32_atomic_rmw16_xchgu.wat +++ b/tests/disas/winch/x64/atomic/rmw/xchg/i32_atomic_rmw16_xchgu.wat @@ -23,7 +23,7 @@ ;; cmpw $0, %cx ;; jne 0x61 ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; xchgw %ax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/xchg/i32_atomic_rmw8_xchgu.wat b/tests/disas/winch/x64/atomic/rmw/xchg/i32_atomic_rmw8_xchgu.wat index c249e81163..3646bbf2d1 100644 --- a/tests/disas/winch/x64/atomic/rmw/xchg/i32_atomic_rmw8_xchgu.wat +++ b/tests/disas/winch/x64/atomic/rmw/xchg/i32_atomic_rmw8_xchgu.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movl $0x2a, %eax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; xchgb %al, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/xchg/i32_atomic_rmw_xchg.wat b/tests/disas/winch/x64/atomic/rmw/xchg/i32_atomic_rmw_xchg.wat index 1c0c95652e..c2ec1dd649 100644 --- a/tests/disas/winch/x64/atomic/rmw/xchg/i32_atomic_rmw_xchg.wat +++ b/tests/disas/winch/x64/atomic/rmw/xchg/i32_atomic_rmw_xchg.wat @@ -23,7 +23,7 @@ ;; cmpl $0, %ecx ;; jne 0x5b ;; 42: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; xchgl %eax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw16_xchgu.wat b/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw16_xchgu.wat index bc25f420d6..c358a4074b 100644 --- a/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw16_xchgu.wat +++ b/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw16_xchgu.wat @@ -23,7 +23,7 @@ ;; cmpw $0, %cx ;; jne 0x64 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; xchgw %ax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw32_xchgu.wat b/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw32_xchgu.wat index f35ecca0ac..f5ffe86daf 100644 --- a/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw32_xchgu.wat +++ b/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw32_xchgu.wat @@ -23,7 +23,7 @@ ;; cmpl $0, %ecx ;; jne 0x5d ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; xchgl %eax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw8_xchgu.wat b/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw8_xchgu.wat index b0c823278f..4bc2d9aacd 100644 --- a/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw8_xchgu.wat +++ b/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw8_xchgu.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movq $0x2a, %rax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; xchgb %al, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw_xchg.wat b/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw_xchg.wat index 345ae4cb11..1be5c4ce74 100644 --- a/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw_xchg.wat +++ b/tests/disas/winch/x64/atomic/rmw/xchg/i64_atomic_rmw_xchg.wat @@ -23,7 +23,7 @@ ;; cmpq $0, %rcx ;; jne 0x60 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; xchgq %rax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/rmw/xor/i32_atomic_rmw16_xoru.wat b/tests/disas/winch/x64/atomic/rmw/xor/i32_atomic_rmw16_xoru.wat index e805ad3312..344f5df9b2 100644 --- a/tests/disas/winch/x64/atomic/rmw/xor/i32_atomic_rmw16_xoru.wat +++ b/tests/disas/winch/x64/atomic/rmw/xor/i32_atomic_rmw16_xoru.wat @@ -23,7 +23,7 @@ ;; cmpw $0, %cx ;; jne 0x82 ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; subq $4, %rsp diff --git a/tests/disas/winch/x64/atomic/rmw/xor/i32_atomic_rmw8_xoru.wat b/tests/disas/winch/x64/atomic/rmw/xor/i32_atomic_rmw8_xoru.wat index fdacb98473..a402095bca 100644 --- a/tests/disas/winch/x64/atomic/rmw/xor/i32_atomic_rmw8_xoru.wat +++ b/tests/disas/winch/x64/atomic/rmw/xor/i32_atomic_rmw8_xoru.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movl $0x2a, %eax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; subq $4, %rsp diff --git a/tests/disas/winch/x64/atomic/rmw/xor/i32_atomic_rmw_xor.wat b/tests/disas/winch/x64/atomic/rmw/xor/i32_atomic_rmw_xor.wat index 9b2ca5be0b..a39248aa11 100644 --- a/tests/disas/winch/x64/atomic/rmw/xor/i32_atomic_rmw_xor.wat +++ b/tests/disas/winch/x64/atomic/rmw/xor/i32_atomic_rmw_xor.wat @@ -23,7 +23,7 @@ ;; cmpl $0, %ecx ;; jne 0x7a ;; 42: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; subq $4, %rsp diff --git a/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw16_xoru.wat b/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw16_xoru.wat index bf3db96a50..fb3527e67a 100644 --- a/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw16_xoru.wat +++ b/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw16_xoru.wat @@ -23,7 +23,7 @@ ;; cmpw $0, %cx ;; jne 0x79 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; pushq %rax diff --git a/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw32_xoru.wat b/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw32_xoru.wat index ab2df9cb38..7e836df45e 100644 --- a/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw32_xoru.wat +++ b/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw32_xoru.wat @@ -23,7 +23,7 @@ ;; cmpl $0, %ecx ;; jne 0x70 ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; pushq %rax diff --git a/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw8_xoru.wat b/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw8_xoru.wat index 953c08a727..7f96452061 100644 --- a/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw8_xoru.wat +++ b/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw8_xoru.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movq $0x2a, %rax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; pushq %rax diff --git a/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw_xor.wat b/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw_xor.wat index d926ed2404..bfeeed2fc1 100644 --- a/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw_xor.wat +++ b/tests/disas/winch/x64/atomic/rmw/xor/i64_atomic_rmw_xor.wat @@ -23,7 +23,7 @@ ;; cmpq $0, %rcx ;; jne 0x73 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; pushq %rax diff --git a/tests/disas/winch/x64/atomic/store/i32_atomic_store.wat b/tests/disas/winch/x64/atomic/store/i32_atomic_store.wat index 574938c4ef..9453ad26ed 100644 --- a/tests/disas/winch/x64/atomic/store/i32_atomic_store.wat +++ b/tests/disas/winch/x64/atomic/store/i32_atomic_store.wat @@ -22,7 +22,7 @@ ;; cmpl $0, %ecx ;; jne 0x5e ;; 42: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; movl %eax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/store/i32_atomic_store16.wat b/tests/disas/winch/x64/atomic/store/i32_atomic_store16.wat index a70534ca84..8de3057781 100644 --- a/tests/disas/winch/x64/atomic/store/i32_atomic_store16.wat +++ b/tests/disas/winch/x64/atomic/store/i32_atomic_store16.wat @@ -22,7 +22,7 @@ ;; cmpw $0, %cx ;; jne 0x61 ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; movw %ax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/store/i32_atomic_store8.wat b/tests/disas/winch/x64/atomic/store/i32_atomic_store8.wat index 3e63a300ad..ddf3f9d065 100644 --- a/tests/disas/winch/x64/atomic/store/i32_atomic_store8.wat +++ b/tests/disas/winch/x64/atomic/store/i32_atomic_store8.wat @@ -18,7 +18,7 @@ ;; movq %rsi, (%rsp) ;; movl $0x2a, %eax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; movb %al, (%rdx) diff --git a/tests/disas/winch/x64/atomic/store/i64_atomic_store.wat b/tests/disas/winch/x64/atomic/store/i64_atomic_store.wat index cfa690ede7..0e7c5abd36 100644 --- a/tests/disas/winch/x64/atomic/store/i64_atomic_store.wat +++ b/tests/disas/winch/x64/atomic/store/i64_atomic_store.wat @@ -22,7 +22,7 @@ ;; cmpq $0, %rcx ;; jne 0x63 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; movq %rax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/store/i64_atomic_store16.wat b/tests/disas/winch/x64/atomic/store/i64_atomic_store16.wat index 4e2d4124f9..d979186240 100644 --- a/tests/disas/winch/x64/atomic/store/i64_atomic_store16.wat +++ b/tests/disas/winch/x64/atomic/store/i64_atomic_store16.wat @@ -22,7 +22,7 @@ ;; cmpw $0, %cx ;; jne 0x63 ;; 46: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; movw %ax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/store/i64_atomic_store32.wat b/tests/disas/winch/x64/atomic/store/i64_atomic_store32.wat index 0428027aa5..909b10c625 100644 --- a/tests/disas/winch/x64/atomic/store/i64_atomic_store32.wat +++ b/tests/disas/winch/x64/atomic/store/i64_atomic_store32.wat @@ -22,7 +22,7 @@ ;; cmpl $0, %ecx ;; jne 0x60 ;; 44: movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; movl %eax, (%rdx) diff --git a/tests/disas/winch/x64/atomic/store/i64_atomic_store8.wat b/tests/disas/winch/x64/atomic/store/i64_atomic_store8.wat index 77dda7ff6a..28504d7e79 100644 --- a/tests/disas/winch/x64/atomic/store/i64_atomic_store8.wat +++ b/tests/disas/winch/x64/atomic/store/i64_atomic_store8.wat @@ -18,7 +18,7 @@ ;; movq %rsi, (%rsp) ;; movq $0x2a, %rax ;; movl $0, %ecx -;; movq 0x50(%r14), %r11 +;; movq 0x48(%r14), %r11 ;; movq (%r11), %rdx ;; addq %rcx, %rdx ;; movb %al, (%rdx) diff --git a/tests/disas/winch/x64/call_indirect/call_indirect.wat b/tests/disas/winch/x64/call_indirect/call_indirect.wat index 3e2ead8751..15dcce1b41 100644 --- a/tests/disas/winch/x64/call_indirect/call_indirect.wat +++ b/tests/disas/winch/x64/call_indirect/call_indirect.wat @@ -57,12 +57,12 @@ ;; movl %eax, (%rsp) ;; movl $0, %ecx ;; movq %r14, %rdx -;; movq 0x58(%rdx), %rbx +;; movq 0x50(%rdx), %rbx ;; cmpq %rbx, %rcx ;; jae 0x1e1 ;; 76: movq %rcx, %r11 ;; imulq $8, %r11, %r11 -;; movq 0x50(%rdx), %rdx +;; movq 0x48(%rdx), %rdx ;; movq %rdx, %rsi ;; addq %r11, %rdx ;; cmpl %ebx, %ecx @@ -109,12 +109,12 @@ ;; movl %ecx, (%rsp) ;; movl $0, %ecx ;; movq %r14, %rdx -;; movq 0x58(%rdx), %rbx +;; movq 0x50(%rdx), %rbx ;; cmpq %rbx, %rcx ;; jae 0x1e7 ;; 137: movq %rcx, %r11 ;; imulq $8, %r11, %r11 -;; movq 0x50(%rdx), %rdx +;; movq 0x48(%rdx), %rdx ;; movq %rdx, %rsi ;; addq %r11, %rdx ;; cmpl %ebx, %ecx diff --git a/tests/disas/winch/x64/call_indirect/local_arg.wat b/tests/disas/winch/x64/call_indirect/local_arg.wat index a16fcee98b..e077145a56 100644 --- a/tests/disas/winch/x64/call_indirect/local_arg.wat +++ b/tests/disas/winch/x64/call_indirect/local_arg.wat @@ -53,12 +53,12 @@ ;; movl %r11d, (%rsp) ;; movl $0, %ecx ;; movq %r14, %rdx -;; movq 0x58(%rdx), %rbx +;; movq 0x50(%rdx), %rbx ;; cmpq %rbx, %rcx ;; jae 0x135 ;; 98: movq %rcx, %r11 ;; imulq $8, %r11, %r11 -;; movq 0x50(%rdx), %rdx +;; movq 0x48(%rdx), %rdx ;; movq %rdx, %rsi ;; addq %r11, %rdx ;; cmpl %ebx, %ecx diff --git a/tests/disas/winch/x64/f64x2_replace_lane/const_lane0_avx.wat b/tests/disas/winch/x64/f64x2_replace_lane/const_lane0_avx.wat index 2e20a2c411..69c8145b4a 100644 --- a/tests/disas/winch/x64/f64x2_replace_lane/const_lane0_avx.wat +++ b/tests/disas/winch/x64/f64x2_replace_lane/const_lane0_avx.wat @@ -14,32 +14,30 @@ ;; movq 0x10(%r11), %r11 ;; addq $0x10, %r11 ;; cmpq %rsp, %r11 -;; ja 0x42 +;; ja 0x47 ;; 1c: movq %rdi, %r14 ;; subq $0x10, %rsp ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movdqu 0x1c(%rip), %xmm0 -;; vmovsd 0x24(%rip), %xmm0 +;; vmovsd 0x24(%rip), %xmm15 +;; vmovsd %xmm15, %xmm0, %xmm0 ;; addq $0x10, %rsp ;; popq %rbp ;; retq -;; 42: ud2 -;; 44: addb %al, (%rax) -;; 46: addb %al, (%rax) -;; 48: addb %al, (%rax) -;; 4a: addb %al, (%rax) -;; 4c: addb %al, (%rax) -;; 4e: addb %al, (%rax) -;; 50: addl %eax, (%rax) -;; 52: addb %al, (%rax) -;; 54: addb %al, (%rax) -;; 56: addb %al, (%rax) -;; 58: addb (%rax), %al -;; 5a: addb %al, (%rax) -;; 5c: addb %al, (%rax) -;; 5e: addb %al, (%rax) -;; 60: addb %al, (%rax) -;; 62: addb %al, (%rax) -;; 64: addb %al, (%rax) -;; 66: addb %al, (%rax) +;; 47: ud2 +;; 49: addb %al, (%rax) +;; 4b: addb %al, (%rax) +;; 4d: addb %al, (%rax) +;; 4f: addb %al, (%rcx) +;; 51: addb %al, (%rax) +;; 53: addb %al, (%rax) +;; 55: addb %al, (%rax) +;; 57: addb %al, (%rdx) +;; 59: addb %al, (%rax) +;; 5b: addb %al, (%rax) +;; 5d: addb %al, (%rax) +;; 5f: addb %al, (%rax) +;; 61: addb %al, (%rax) +;; 63: addb %al, (%rax) +;; 65: addb %al, (%rax) diff --git a/tests/disas/winch/x64/fuel/call.wat b/tests/disas/winch/x64/fuel/call.wat index ce9fa89a14..ad11d308df 100644 --- a/tests/disas/winch/x64/fuel/call.wat +++ b/tests/disas/winch/x64/fuel/call.wat @@ -34,8 +34,8 @@ ;; movq (%rax), %r11 ;; addq $1, %r11 ;; movq %r11, (%rax) -;; movq 0x60(%r14), %rcx -;; movq 0x50(%r14), %rax +;; movq 0x58(%r14), %rcx +;; movq 0x48(%r14), %rax ;; movq %rcx, %rdi ;; movq %r14, %rsi ;; callq *%rax diff --git a/tests/disas/winch/x64/i16x8/extadd/extadd_s.wat b/tests/disas/winch/x64/i16x8/extadd/extadd_s.wat index 2d7579c7b5..21611bd16c 100644 --- a/tests/disas/winch/x64/i16x8/extadd/extadd_s.wat +++ b/tests/disas/winch/x64/i16x8/extadd/extadd_s.wat @@ -14,18 +14,25 @@ ;; movq 0x10(%r11), %r11 ;; addq $0x20, %r11 ;; cmpq %rsp, %r11 -;; ja 0x51 +;; ja 0x4b ;; 1c: movq %rdi, %r14 ;; subq $0x20, %rsp ;; movq %rdi, 0x18(%rsp) ;; movq %rsi, 0x10(%rsp) ;; movdqu %xmm0, (%rsp) ;; movdqu (%rsp), %xmm0 -;; vpmovsxbw %xmm0, %xmm15 -;; vpalignr $8, %xmm0, %xmm0, %xmm0 -;; vpmovsxbw %xmm0, %xmm0 -;; vpaddw %xmm0, %xmm0, %xmm0 +;; movdqu 0x10(%rip), %xmm15 +;; vpmaddubsw %xmm0, %xmm15, %xmm0 ;; addq $0x20, %rsp ;; popq %rbp ;; retq -;; 51: ud2 +;; 4b: ud2 +;; 4d: addb %al, (%rax) +;; 4f: addb %al, (%rcx) +;; 51: addl %eax, (%rcx) +;; 53: addl %eax, (%rcx) +;; 55: addl %eax, (%rcx) +;; 57: addl %eax, (%rcx) +;; 59: addl %eax, (%rcx) +;; 5b: addl %eax, (%rcx) +;; 5d: addl %eax, (%rcx) diff --git a/tests/disas/winch/x64/i16x8/extadd/extadd_u.wat b/tests/disas/winch/x64/i16x8/extadd/extadd_u.wat index 2880ea2b77..3fc8f2f20a 100644 --- a/tests/disas/winch/x64/i16x8/extadd/extadd_u.wat +++ b/tests/disas/winch/x64/i16x8/extadd/extadd_u.wat @@ -14,18 +14,27 @@ ;; movq 0x10(%r11), %r11 ;; addq $0x20, %r11 ;; cmpq %rsp, %r11 -;; ja 0x50 +;; ja 0x46 ;; 1c: movq %rdi, %r14 ;; subq $0x20, %rsp ;; movq %rdi, 0x18(%rsp) ;; movq %rsi, 0x10(%rsp) ;; movdqu %xmm0, (%rsp) ;; movdqu (%rsp), %xmm0 -;; vpmovzxbw %xmm0, %xmm15 -;; vpxor %xmm15, %xmm15, %xmm15 -;; vpunpckhbw %xmm15, %xmm0, %xmm0 -;; vpaddw %xmm0, %xmm0, %xmm0 +;; vpmaddubsw 0x10(%rip), %xmm0, %xmm0 ;; addq $0x20, %rsp ;; popq %rbp ;; retq -;; 50: ud2 +;; 46: ud2 +;; 48: addb %al, (%rax) +;; 4a: addb %al, (%rax) +;; 4c: addb %al, (%rax) +;; 4e: addb %al, (%rax) +;; 50: addl %eax, (%rcx) +;; 52: addl %eax, (%rcx) +;; 54: addl %eax, (%rcx) +;; 56: addl %eax, (%rcx) +;; 58: addl %eax, (%rcx) +;; 5a: addl %eax, (%rcx) +;; 5c: addl %eax, (%rcx) +;; 5e: addl %eax, (%rcx) diff --git a/tests/disas/winch/x64/i32x4/extadd/extadd_s.wat b/tests/disas/winch/x64/i32x4/extadd/extadd_s.wat index c9c682111d..dfb9b8da53 100644 --- a/tests/disas/winch/x64/i32x4/extadd/extadd_s.wat +++ b/tests/disas/winch/x64/i32x4/extadd/extadd_s.wat @@ -14,18 +14,27 @@ ;; movq 0x10(%r11), %r11 ;; addq $0x20, %r11 ;; cmpq %rsp, %r11 -;; ja 0x51 +;; ja 0x45 ;; 1c: movq %rdi, %r14 ;; subq $0x20, %rsp ;; movq %rdi, 0x18(%rsp) ;; movq %rsi, 0x10(%rsp) ;; movdqu %xmm0, (%rsp) ;; movdqu (%rsp), %xmm0 -;; vpmovsxwd %xmm0, %xmm15 -;; vpalignr $8, %xmm0, %xmm0, %xmm0 -;; vpmovsxwd %xmm0, %xmm0 -;; vpaddd %xmm0, %xmm0, %xmm0 +;; vpmaddwd 0x11(%rip), %xmm0, %xmm0 ;; addq $0x20, %rsp ;; popq %rbp ;; retq -;; 51: ud2 +;; 45: ud2 +;; 47: addb %al, (%rax) +;; 49: addb %al, (%rax) +;; 4b: addb %al, (%rax) +;; 4d: addb %al, (%rax) +;; 4f: addb %al, (%rcx) +;; 51: addb %al, (%rcx) +;; 53: addb %al, (%rcx) +;; 55: addb %al, (%rcx) +;; 57: addb %al, (%rcx) +;; 59: addb %al, (%rcx) +;; 5b: addb %al, (%rcx) +;; 5d: addb %al, (%rcx) diff --git a/tests/disas/winch/x64/i32x4/extadd/extadd_u.wat b/tests/disas/winch/x64/i32x4/extadd/extadd_u.wat index 9d3171c860..24fc4da561 100644 --- a/tests/disas/winch/x64/i32x4/extadd/extadd_u.wat +++ b/tests/disas/winch/x64/i32x4/extadd/extadd_u.wat @@ -14,18 +14,41 @@ ;; movq 0x10(%r11), %r11 ;; addq $0x20, %r11 ;; cmpq %rsp, %r11 -;; ja 0x50 +;; ja 0x55 ;; 1c: movq %rdi, %r14 ;; subq $0x20, %rsp ;; movq %rdi, 0x18(%rsp) ;; movq %rsi, 0x10(%rsp) ;; movdqu %xmm0, (%rsp) ;; movdqu (%rsp), %xmm0 -;; vpmovzxwd %xmm0, %xmm15 -;; vpxor %xmm15, %xmm15, %xmm15 -;; vpunpckhwd %xmm15, %xmm0, %xmm0 -;; vpaddd %xmm0, %xmm0, %xmm0 +;; vpxor 0x21(%rip), %xmm0, %xmm0 +;; vpmaddwd 0x29(%rip), %xmm0, %xmm0 +;; vpaddd 0x31(%rip), %xmm0, %xmm0 ;; addq $0x20, %rsp ;; popq %rbp ;; retq -;; 50: ud2 +;; 55: ud2 +;; 57: addb %al, (%rax) +;; 59: addb %al, (%rax) +;; 5b: addb %al, (%rax) +;; 5d: addb %al, (%rax) +;; 5f: addb %al, (%rax) +;; 61: addb $0x80, (%rax) +;; 64: addb %al, -0x7fff8000(%rax) +;; 6a: addb %al, -0x7fff8000(%rax) +;; 70: addl %eax, (%rax) +;; 72: addl %eax, (%rax) +;; 74: addl %eax, (%rax) +;; 76: addl %eax, (%rax) +;; 78: addl %eax, (%rax) +;; 7a: addl %eax, (%rax) +;; 7c: addl %eax, (%rax) +;; 7e: addl %eax, (%rax) +;; 80: addb %al, (%rax) +;; 82: addl %eax, (%rax) +;; 84: addb %al, (%rax) +;; 86: addl %eax, (%rax) +;; 88: addb %al, (%rax) +;; 8a: addl %eax, (%rax) +;; 8c: addb %al, (%rax) +;; 8e: addl %eax, (%rax) diff --git a/tests/disas/winch/x64/load/f32.wat b/tests/disas/winch/x64/load/f32.wat index 7e28e3ccf6..44cdd41be8 100644 --- a/tests/disas/winch/x64/load/f32.wat +++ b/tests/disas/winch/x64/load/f32.wat @@ -19,7 +19,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movss (%rcx), %xmm0 ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/load/f64.wat b/tests/disas/winch/x64/load/f64.wat index 23f7e91dc0..483fcd0d2c 100644 --- a/tests/disas/winch/x64/load/f64.wat +++ b/tests/disas/winch/x64/load/f64.wat @@ -18,7 +18,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movsd (%rcx), %xmm0 ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/load/grow_load.wat b/tests/disas/winch/x64/load/grow_load.wat index 37cfbf3a85..4b0bada9f6 100644 --- a/tests/disas/winch/x64/load/grow_load.wat +++ b/tests/disas/winch/x64/load/grow_load.wat @@ -34,7 +34,7 @@ ;; movq 0x10(%r11), %r11 ;; addq $0x70, %r11 ;; cmpq %rsp, %r11 -;; ja 0x121 +;; ja 0x118 ;; 1c: movq %rsi, %r14 ;; subq $0x60, %rsp ;; movq %rsi, 0x58(%rsp) @@ -47,17 +47,17 @@ ;; movsd %xmm3, 0x20(%rsp) ;; movss %xmm4, 0x1c(%rsp) ;; movq %rdi, 8(%rsp) -;; movl 0x80(%r14), %eax +;; movl 0x70(%r14), %eax ;; cmpl $0, %eax ;; movl $0, %eax ;; sete %al ;; testl %eax, %eax -;; je 0x77 -;; 75: ud2 -;; movl 0x80(%r14), %eax +;; je 0x74 +;; 72: ud2 +;; movl 0x70(%r14), %eax ;; subl $1, %eax -;; movl %eax, 0x80(%r14) -;; movq 0x60(%r14), %rax +;; movl %eax, 0x70(%r14) +;; movq 0x58(%r14), %rax ;; shrl $0x10, %eax ;; subq $4, %rsp ;; movl %eax, (%rsp) @@ -65,20 +65,20 @@ ;; movq %r14, %rdi ;; movl 0xc(%rsp), %esi ;; movl $0, %edx -;; callq 0x2de +;; callq 0x2d6 ;; addq $0xc, %rsp ;; addq $4, %rsp ;; movq 0x58(%rsp), %r14 ;; movl %eax, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; addq $0x23024, %rcx ;; movsbq (%rcx), %rax -;; movss 0x54(%rip), %xmm0 +;; movss 0x55(%rip), %xmm0 ;; subq $0xc, %rsp -;; movsd 0x4f(%rip), %xmm15 +;; movsd 0x50(%rip), %xmm15 ;; movsd %xmm15, (%rsp) -;; movss 0x38(%rip), %xmm15 +;; movss 0x39(%rip), %xmm15 ;; movss %xmm15, 8(%rsp) ;; movq 0x14(%rsp), %rax ;; movsd (%rsp), %xmm15 @@ -90,14 +90,15 @@ ;; addq $0x60, %rsp ;; popq %rbp ;; retq -;; 121: ud2 -;; 123: addb %al, (%rax) -;; 125: addb %al, (%rax) -;; 127: addb %al, (%rax) -;; 129: addb %al, (%rax) -;; 12b: addb %al, (%rax) -;; 12d: addb %al, (%rax) -;; 12f: addb %al, (%rax) -;; 131: addb %al, (%rax) -;; 133: addb %al, (%rax) -;; 135: addb %al, (%rax) +;; 118: ud2 +;; 11a: addb %al, (%rax) +;; 11c: addb %al, (%rax) +;; 11e: addb %al, (%rax) +;; 120: addb %al, (%rax) +;; 122: addb %al, (%rax) +;; 124: addb %al, (%rax) +;; 126: addb %al, (%rax) +;; 128: addb %al, (%rax) +;; 12a: addb %al, (%rax) +;; 12c: addb %al, (%rax) +;; 12e: addb %al, (%rax) diff --git a/tests/disas/winch/x64/load/i32.wat b/tests/disas/winch/x64/load/i32.wat index 4db499e4c4..111b379a1a 100644 --- a/tests/disas/winch/x64/load/i32.wat +++ b/tests/disas/winch/x64/load/i32.wat @@ -19,7 +19,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movl (%rcx), %eax ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/load/i64.wat b/tests/disas/winch/x64/load/i64.wat index 114c6f7ffd..05ac205de5 100644 --- a/tests/disas/winch/x64/load/i64.wat +++ b/tests/disas/winch/x64/load/i64.wat @@ -22,11 +22,11 @@ ;; movq %rdx, 8(%rsp) ;; movq 8(%rsp), %rax ;; movl $8, %ecx -;; movq 0x58(%r14), %rdx +;; movq 0x50(%r14), %rdx ;; addq %rcx, %rdx ;; movb %al, (%rdx) ;; movl $8, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movsbq (%rcx), %rax ;; addq $0x20, %rsp diff --git a/tests/disas/winch/x64/load/v128.wat b/tests/disas/winch/x64/load/v128.wat index 85f150aff4..5bd073ca0a 100644 --- a/tests/disas/winch/x64/load/v128.wat +++ b/tests/disas/winch/x64/load/v128.wat @@ -19,7 +19,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movdqu (%rcx), %xmm0 ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/load/v128_load16_splat_avx2.wat b/tests/disas/winch/x64/load/v128_load16_splat_avx2.wat index a77d33b472..68828a377b 100644 --- a/tests/disas/winch/x64/load/v128_load16_splat_avx2.wat +++ b/tests/disas/winch/x64/load/v128_load16_splat_avx2.wat @@ -20,7 +20,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; vpbroadcastw (%rcx), %xmm0 ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/load/v128_load16x4_s_avx.wat b/tests/disas/winch/x64/load/v128_load16x4_s_avx.wat index a17715875d..c39c1c27b6 100644 --- a/tests/disas/winch/x64/load/v128_load16x4_s_avx.wat +++ b/tests/disas/winch/x64/load/v128_load16x4_s_avx.wat @@ -20,7 +20,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; vpmovsxwd (%rcx), %xmm0 ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/load/v128_load16x4_u_avx.wat b/tests/disas/winch/x64/load/v128_load16x4_u_avx.wat index 5507df2c73..a958ab77f2 100644 --- a/tests/disas/winch/x64/load/v128_load16x4_u_avx.wat +++ b/tests/disas/winch/x64/load/v128_load16x4_u_avx.wat @@ -20,7 +20,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; vpmovzxwd (%rcx), %xmm0 ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/load/v128_load32_splat_avx2.wat b/tests/disas/winch/x64/load/v128_load32_splat_avx2.wat index 58415b0342..6d7d4127ed 100644 --- a/tests/disas/winch/x64/load/v128_load32_splat_avx2.wat +++ b/tests/disas/winch/x64/load/v128_load32_splat_avx2.wat @@ -20,7 +20,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; vpbroadcastd (%rcx), %xmm0 ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/load/v128_load32_zero_avx.wat b/tests/disas/winch/x64/load/v128_load32_zero_avx.wat index cb5b6ac6be..031fb7e472 100644 --- a/tests/disas/winch/x64/load/v128_load32_zero_avx.wat +++ b/tests/disas/winch/x64/load/v128_load32_zero_avx.wat @@ -20,7 +20,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movl (%rcx), %r11d ;; vmovd %r11d, %xmm0 diff --git a/tests/disas/winch/x64/load/v128_load32x2_s_avx.wat b/tests/disas/winch/x64/load/v128_load32x2_s_avx.wat index 81c2115390..aa83f0ae2c 100644 --- a/tests/disas/winch/x64/load/v128_load32x2_s_avx.wat +++ b/tests/disas/winch/x64/load/v128_load32x2_s_avx.wat @@ -20,7 +20,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; vpmovsxdq (%rcx), %xmm0 ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/load/v128_load32x2_s_oob_avx.wat b/tests/disas/winch/x64/load/v128_load32x2_s_oob_avx.wat index a7b87dd796..00942ca805 100644 --- a/tests/disas/winch/x64/load/v128_load32x2_s_oob_avx.wat +++ b/tests/disas/winch/x64/load/v128_load32x2_s_oob_avx.wat @@ -26,7 +26,7 @@ ;; jb 0x6f ;; 44: cmpq %rcx, %rdx ;; ja 0x71 -;; 4d: movq 0x58(%r14), %rbx +;; 4d: movq 0x50(%r14), %rbx ;; addq %rax, %rbx ;; movq $0, %rsi ;; cmpq %rcx, %rdx diff --git a/tests/disas/winch/x64/load/v128_load32x2_u_avx.wat b/tests/disas/winch/x64/load/v128_load32x2_u_avx.wat index aa6754eb69..0fa7727030 100644 --- a/tests/disas/winch/x64/load/v128_load32x2_u_avx.wat +++ b/tests/disas/winch/x64/load/v128_load32x2_u_avx.wat @@ -20,7 +20,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; vpmovzxdq (%rcx), %xmm0 ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/load/v128_load32x2_u_oob_avx.wat b/tests/disas/winch/x64/load/v128_load32x2_u_oob_avx.wat index 3fbbaf1e02..f36b9042c4 100644 --- a/tests/disas/winch/x64/load/v128_load32x2_u_oob_avx.wat +++ b/tests/disas/winch/x64/load/v128_load32x2_u_oob_avx.wat @@ -26,7 +26,7 @@ ;; jb 0x6f ;; 44: cmpq %rcx, %rdx ;; ja 0x71 -;; 4d: movq 0x58(%r14), %rbx +;; 4d: movq 0x50(%r14), %rbx ;; addq %rax, %rbx ;; movq $0, %rsi ;; cmpq %rcx, %rdx diff --git a/tests/disas/winch/x64/load/v128_load64_splat_avx.wat b/tests/disas/winch/x64/load/v128_load64_splat_avx.wat index da55b00c2d..2738a767ab 100644 --- a/tests/disas/winch/x64/load/v128_load64_splat_avx.wat +++ b/tests/disas/winch/x64/load/v128_load64_splat_avx.wat @@ -20,7 +20,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movsd (%rcx), %xmm0 ;; vpshufd $0x44, %xmm0, %xmm0 diff --git a/tests/disas/winch/x64/load/v128_load64_zero_avx.wat b/tests/disas/winch/x64/load/v128_load64_zero_avx.wat index 3dfb54ec29..838968a4ef 100644 --- a/tests/disas/winch/x64/load/v128_load64_zero_avx.wat +++ b/tests/disas/winch/x64/load/v128_load64_zero_avx.wat @@ -20,7 +20,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movq (%rcx), %r11 ;; vmovq %r11, %xmm0 diff --git a/tests/disas/winch/x64/load/v128_load8_splat_avx2.wat b/tests/disas/winch/x64/load/v128_load8_splat_avx2.wat index ed49ca2aa8..3f5b45a046 100644 --- a/tests/disas/winch/x64/load/v128_load8_splat_avx2.wat +++ b/tests/disas/winch/x64/load/v128_load8_splat_avx2.wat @@ -20,7 +20,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; vpbroadcastb (%rcx), %xmm0 ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/load/v128_load8x8_s_avx.wat b/tests/disas/winch/x64/load/v128_load8x8_s_avx.wat index d2756a94d2..438caacf85 100644 --- a/tests/disas/winch/x64/load/v128_load8x8_s_avx.wat +++ b/tests/disas/winch/x64/load/v128_load8x8_s_avx.wat @@ -20,7 +20,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; vpmovsxbw (%rcx), %xmm0 ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/load/v128_load8x8_u_avx.wat b/tests/disas/winch/x64/load/v128_load8x8_u_avx.wat index fcb80b92e4..aa9a9287d1 100644 --- a/tests/disas/winch/x64/load/v128_load8x8_u_avx.wat +++ b/tests/disas/winch/x64/load/v128_load8x8_u_avx.wat @@ -20,7 +20,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; vpmovzxbw (%rcx), %xmm0 ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/local/v128_multivalue.wat b/tests/disas/winch/x64/local/v128_multivalue.wat new file mode 100644 index 0000000000..f85bc04765 --- /dev/null +++ b/tests/disas/winch/x64/local/v128_multivalue.wat @@ -0,0 +1,44 @@ +;;! target = "x86_64" +;;! test = "winch" + +(module + (func (export "") (param v128) (result i64 v128 i64) + i64.const 0 + local.get 0 + i64.const 0 + ) +) +;; wasm[0]::function[0]: +;; pushq %rbp +;; movq %rsp, %rbp +;; movq 8(%rsi), %r11 +;; movq 0x10(%r11), %r11 +;; addq $0x48, %r11 +;; cmpq %rsp, %r11 +;; ja 0x90 +;; 1c: movq %rsi, %r14 +;; subq $0x30, %rsp +;; movq %rsi, 0x28(%rsp) +;; movq %rdx, 0x20(%rsp) +;; movdqu %xmm0, 0x10(%rsp) +;; movq %rdi, 8(%rsp) +;; movq $0, %rax +;; movdqu 0x10(%rsp), %xmm15 +;; subq $0x10, %rsp +;; movdqu %xmm15, (%rsp) +;; subq $8, %rsp +;; movq 8(%rsp), %r11 +;; movq %r11, (%rsp) +;; movq 0x10(%rsp), %r11 +;; movq %r11, 8(%rsp) +;; movq $0, 0x10(%rsp) +;; movq 0x20(%rsp), %rcx +;; movdqu (%rsp), %xmm15 +;; addq $0x10, %rsp +;; movdqu %xmm15, (%rcx) +;; popq %r11 +;; movq %r11, 0x10(%rcx) +;; addq $0x30, %rsp +;; popq %rbp +;; retq +;; 90: ud2 diff --git a/tests/disas/winch/x64/store/f32.wat b/tests/disas/winch/x64/store/f32.wat index 527bcf313b..4d113acd7c 100644 --- a/tests/disas/winch/x64/store/f32.wat +++ b/tests/disas/winch/x64/store/f32.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movss 0x1c(%rip), %xmm0 ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movss %xmm0, (%rcx) ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/store/f64.wat b/tests/disas/winch/x64/store/f64.wat index fa6796180a..370c33822d 100644 --- a/tests/disas/winch/x64/store/f64.wat +++ b/tests/disas/winch/x64/store/f64.wat @@ -20,7 +20,7 @@ ;; movq %rsi, (%rsp) ;; movsd 0x1c(%rip), %xmm0 ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movsd %xmm0, (%rcx) ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/store/i32.wat b/tests/disas/winch/x64/store/i32.wat index 70658cd8d2..9529b71fac 100644 --- a/tests/disas/winch/x64/store/i32.wat +++ b/tests/disas/winch/x64/store/i32.wat @@ -21,7 +21,7 @@ ;; movq %rsi, (%rsp) ;; movl $1, %eax ;; movl $0, %ecx -;; movq 0x58(%r14), %rdx +;; movq 0x50(%r14), %rdx ;; addq %rcx, %rdx ;; movl %eax, (%rdx) ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/store/oob.wat b/tests/disas/winch/x64/store/oob.wat index 6da9532c99..3cfee04e76 100644 --- a/tests/disas/winch/x64/store/oob.wat +++ b/tests/disas/winch/x64/store/oob.wat @@ -25,14 +25,14 @@ ;; movl %edx, 0xc(%rsp) ;; movl 0xc(%rsp), %eax ;; movl $0, %ecx -;; movq 0x60(%r14), %rdx +;; movq 0x58(%r14), %rdx ;; movl %ecx, %ebx ;; movabsq $0x100000000, %r11 ;; addq %r11, %rbx ;; jb 0x88 ;; 53: cmpq %rdx, %rbx ;; ja 0x8a -;; 5c: movq 0x58(%r14), %rsi +;; 5c: movq 0x50(%r14), %rsi ;; addq %rcx, %rsi ;; movabsq $0xffffffff, %r11 ;; addq %r11, %rsi diff --git a/tests/disas/winch/x64/store/v128.wat b/tests/disas/winch/x64/store/v128.wat index 0de8f21ead..6359d0adef 100644 --- a/tests/disas/winch/x64/store/v128.wat +++ b/tests/disas/winch/x64/store/v128.wat @@ -19,7 +19,7 @@ ;; movq %rsi, (%rsp) ;; movdqu 0x1c(%rip), %xmm0 ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movdqu %xmm0, (%rcx) ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/table/fill.wat b/tests/disas/winch/x64/table/fill.wat index ef28782e04..b11f603be3 100644 --- a/tests/disas/winch/x64/table/fill.wat +++ b/tests/disas/winch/x64/table/fill.wat @@ -94,12 +94,12 @@ ;; movl (%rsp), %ecx ;; addq $4, %rsp ;; movq %r14, %rdx -;; movq 0x58(%rdx), %rbx +;; movq 0x50(%rdx), %rbx ;; cmpq %rbx, %rcx ;; jae 0x1d5 ;; 12f: movq %rcx, %r11 ;; imulq $8, %r11, %r11 -;; movq 0x50(%rdx), %rdx +;; movq 0x48(%rdx), %rdx ;; movq %rdx, %rsi ;; addq %r11, %rdx ;; cmpl %ebx, %ecx diff --git a/tests/disas/winch/x64/table/get.wat b/tests/disas/winch/x64/table/get.wat index 8be5ea5a00..a39feed78e 100644 --- a/tests/disas/winch/x64/table/get.wat +++ b/tests/disas/winch/x64/table/get.wat @@ -46,12 +46,12 @@ ;; movl (%rsp), %ecx ;; addq $4, %rsp ;; movq %r14, %rdx -;; movq 0x58(%rdx), %rbx +;; movq 0x50(%rdx), %rbx ;; cmpq %rbx, %rcx ;; jae 0xf2 ;; 95: movq %rcx, %r11 ;; imulq $8, %r11, %r11 -;; movq 0x50(%rdx), %rdx +;; movq 0x48(%rdx), %rdx ;; movq %rdx, %rsi ;; addq %r11, %rdx ;; cmpl %ebx, %ecx diff --git a/tests/disas/winch/x64/table/init_copy_drop.wat b/tests/disas/winch/x64/table/init_copy_drop.wat index a3706da23a..d397529df2 100644 --- a/tests/disas/winch/x64/table/init_copy_drop.wat +++ b/tests/disas/winch/x64/table/init_copy_drop.wat @@ -146,7 +146,7 @@ ;; movq 8(%rsp), %r14 ;; movq %r14, %rdi ;; movl $1, %esi -;; callq 0x984 +;; callq 0x988 ;; movq 8(%rsp), %r14 ;; movq %r14, %rdi ;; movl $0, %esi @@ -158,7 +158,7 @@ ;; movq 8(%rsp), %r14 ;; movq %r14, %rdi ;; movl $3, %esi -;; callq 0x984 +;; callq 0x988 ;; movq 8(%rsp), %r14 ;; movq %r14, %rdi ;; movl $0, %esi @@ -166,7 +166,7 @@ ;; movl $0x14, %ecx ;; movl $0xf, %r8d ;; movl $5, %r9d -;; callq 0x9c3 +;; callq 0x9c7 ;; movq 8(%rsp), %r14 ;; movq %r14, %rdi ;; movl $0, %esi @@ -174,7 +174,7 @@ ;; movl $0x15, %ecx ;; movl $0x1d, %r8d ;; movl $1, %r9d -;; callq 0x9c3 +;; callq 0x9c7 ;; movq 8(%rsp), %r14 ;; movq %r14, %rdi ;; movl $0, %esi @@ -182,7 +182,7 @@ ;; movl $0x18, %ecx ;; movl $0xa, %r8d ;; movl $1, %r9d -;; callq 0x9c3 +;; callq 0x9c7 ;; movq 8(%rsp), %r14 ;; movq %r14, %rdi ;; movl $0, %esi @@ -190,7 +190,7 @@ ;; movl $0xd, %ecx ;; movl $0xb, %r8d ;; movl $4, %r9d -;; callq 0x9c3 +;; callq 0x9c7 ;; movq 8(%rsp), %r14 ;; movq %r14, %rdi ;; movl $0, %esi @@ -198,7 +198,7 @@ ;; movl $0x13, %ecx ;; movl $0x14, %r8d ;; movl $5, %r9d -;; callq 0x9c3 +;; callq 0x9c7 ;; movq 8(%rsp), %r14 ;; addq $0x10, %rsp ;; popq %rbp @@ -224,12 +224,12 @@ ;; movl (%rsp), %ecx ;; addq $4, %rsp ;; movq %r14, %rdx -;; movq 0xd0(%rdx), %rbx +;; movq 0xc8(%rdx), %rbx ;; cmpq %rbx, %rcx ;; jae 0x39a ;; 308: movq %rcx, %r11 ;; imulq $8, %r11, %r11 -;; movq 0xc8(%rdx), %rdx +;; movq 0xc0(%rdx), %rdx ;; movq %rdx, %rsi ;; addq %r11, %rdx ;; cmpl %ebx, %ecx @@ -243,7 +243,7 @@ ;; movq %r14, %rdi ;; movl $0, %esi ;; movl 0xc(%rsp), %edx -;; callq 0xa1e +;; callq 0xa26 ;; addq $0xc, %rsp ;; addq $4, %rsp ;; movq 0x18(%rsp), %r14 diff --git a/tests/disas/winch/x64/table/set.wat b/tests/disas/winch/x64/table/set.wat index 42432d826a..a98a971e29 100644 --- a/tests/disas/winch/x64/table/set.wat +++ b/tests/disas/winch/x64/table/set.wat @@ -49,12 +49,12 @@ ;; movq (%rsp), %rax ;; movl 0xc(%rsp), %ecx ;; movq %r14, %rdx -;; movq 0x58(%rdx), %rbx +;; movq 0x50(%rdx), %rbx ;; cmpq %rbx, %rcx ;; jae 0xb3 ;; 8d: movq %rcx, %r11 ;; imulq $8, %r11, %r11 -;; movq 0x50(%rdx), %rdx +;; movq 0x48(%rdx), %rdx ;; movq %rdx, %rsi ;; addq %r11, %rdx ;; cmpl %ebx, %ecx @@ -90,12 +90,12 @@ ;; movl (%rsp), %ecx ;; addq $4, %rsp ;; movq %r14, %rdx -;; movq 0x58(%rdx), %rbx +;; movq 0x50(%rdx), %rbx ;; cmpq %rbx, %rcx ;; jae 0x1b8 ;; 126: movq %rcx, %r11 ;; imulq $8, %r11, %r11 -;; movq 0x50(%rdx), %rdx +;; movq 0x48(%rdx), %rdx ;; movq %rdx, %rsi ;; addq %r11, %rdx ;; cmpl %ebx, %ecx @@ -118,12 +118,12 @@ ;; movl (%rsp), %ecx ;; addq $4, %rsp ;; movq %r14, %rdx -;; movq 0x58(%rdx), %rbx +;; movq 0x50(%rdx), %rbx ;; cmpq %rbx, %rcx ;; jae 0x1ba ;; 192: movq %rcx, %r11 ;; imulq $8, %r11, %r11 -;; movq 0x50(%rdx), %rdx +;; movq 0x48(%rdx), %rdx ;; movq %rdx, %rsi ;; addq %r11, %rdx ;; cmpl %ebx, %ecx diff --git a/tests/disas/winch/x64/table/size.wat b/tests/disas/winch/x64/table/size.wat index c10b980f59..39acd9f80d 100644 --- a/tests/disas/winch/x64/table/size.wat +++ b/tests/disas/winch/x64/table/size.wat @@ -18,7 +18,7 @@ ;; movq %rdi, 8(%rsp) ;; movq %rsi, (%rsp) ;; movq %r14, %r11 -;; movq 0x58(%r11), %rax +;; movq 0x50(%r11), %rax ;; addq $0x10, %rsp ;; popq %rbp ;; retq diff --git a/tests/disas/winch/x64/v128_mixed_sig.wat b/tests/disas/winch/x64/v128_mixed_sig.wat new file mode 100644 index 0000000000..08e3a3d1cc --- /dev/null +++ b/tests/disas/winch/x64/v128_mixed_sig.wat @@ -0,0 +1,34 @@ +;;! target = "x86_64" +;;! test = "winch" +(module + (func (export "x") + (param f32 f32 f32 f32 f32 f32 f32 f32 f32) (param $last v128) + (result v128) + local.get $last + ) +) +;; wasm[0]::function[0]: +;; pushq %rbp +;; movq %rsp, %rbp +;; movq 8(%rdi), %r11 +;; movq 0x10(%r11), %r11 +;; addq $0x30, %r11 +;; cmpq %rsp, %r11 +;; ja 0x67 +;; 1c: movq %rdi, %r14 +;; subq $0x30, %rsp +;; movq %rdi, 0x28(%rsp) +;; movq %rsi, 0x20(%rsp) +;; movss %xmm0, 0x1c(%rsp) +;; movss %xmm1, 0x18(%rsp) +;; movss %xmm2, 0x14(%rsp) +;; movss %xmm3, 0x10(%rsp) +;; movss %xmm4, 0xc(%rsp) +;; movss %xmm5, 8(%rsp) +;; movss %xmm6, 4(%rsp) +;; movss %xmm7, (%rsp) +;; movdqu 0x20(%rbp), %xmm0 +;; addq $0x30, %rsp +;; popq %rbp +;; retq +;; 67: ud2 diff --git a/tests/disas/winch/x64/v128_ops/load_lane/load16.wat b/tests/disas/winch/x64/v128_ops/load_lane/load16.wat index db3b131251..a15b3b857d 100644 --- a/tests/disas/winch/x64/v128_ops/load_lane/load16.wat +++ b/tests/disas/winch/x64/v128_ops/load_lane/load16.wat @@ -22,7 +22,7 @@ ;; movq %rsi, (%rsp) ;; movdqu 0x2c(%rip), %xmm0 ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movzwq (%rcx), %r11 ;; vpinsrw $1, %r11d, %xmm0, %xmm0 diff --git a/tests/disas/winch/x64/v128_ops/load_lane/load32.wat b/tests/disas/winch/x64/v128_ops/load_lane/load32.wat index 76ae4e8815..669cccaa4d 100644 --- a/tests/disas/winch/x64/v128_ops/load_lane/load32.wat +++ b/tests/disas/winch/x64/v128_ops/load_lane/load32.wat @@ -22,7 +22,7 @@ ;; movq %rsi, (%rsp) ;; movdqu 0x2c(%rip), %xmm0 ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movl (%rcx), %r11d ;; vpinsrd $1, %r11d, %xmm0, %xmm0 diff --git a/tests/disas/winch/x64/v128_ops/load_lane/load64.wat b/tests/disas/winch/x64/v128_ops/load_lane/load64.wat index 4cc37a4575..2028d027ca 100644 --- a/tests/disas/winch/x64/v128_ops/load_lane/load64.wat +++ b/tests/disas/winch/x64/v128_ops/load_lane/load64.wat @@ -22,7 +22,7 @@ ;; movq %rsi, (%rsp) ;; movdqu 0x2c(%rip), %xmm0 ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movq (%rcx), %r11 ;; vpinsrq $1, %r11, %xmm0, %xmm0 diff --git a/tests/disas/winch/x64/v128_ops/load_lane/load8.wat b/tests/disas/winch/x64/v128_ops/load_lane/load8.wat index 17380d371d..25111ae4b6 100644 --- a/tests/disas/winch/x64/v128_ops/load_lane/load8.wat +++ b/tests/disas/winch/x64/v128_ops/load_lane/load8.wat @@ -22,7 +22,7 @@ ;; movq %rsi, (%rsp) ;; movdqu 0x2c(%rip), %xmm0 ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; movzbq (%rcx), %r11 ;; vpinsrb $1, %r11d, %xmm0, %xmm0 diff --git a/tests/disas/winch/x64/v128_ops/store_lane/store16.wat b/tests/disas/winch/x64/v128_ops/store_lane/store16.wat index f56ac3b179..c80fb2bd5d 100644 --- a/tests/disas/winch/x64/v128_ops/store_lane/store16.wat +++ b/tests/disas/winch/x64/v128_ops/store_lane/store16.wat @@ -22,7 +22,7 @@ ;; movq %rsi, (%rsp) ;; movdqu 0x1c(%rip), %xmm0 ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; vpextrw $1, %xmm0, (%rcx) ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/v128_ops/store_lane/store32.wat b/tests/disas/winch/x64/v128_ops/store_lane/store32.wat index 87a231cdae..1f4347fd43 100644 --- a/tests/disas/winch/x64/v128_ops/store_lane/store32.wat +++ b/tests/disas/winch/x64/v128_ops/store_lane/store32.wat @@ -22,7 +22,7 @@ ;; movq %rsi, (%rsp) ;; movdqu 0x1c(%rip), %xmm0 ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; vpextrd $1, %xmm0, (%rcx) ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/v128_ops/store_lane/store64.wat b/tests/disas/winch/x64/v128_ops/store_lane/store64.wat index 73e39ae681..d31c8d3f53 100644 --- a/tests/disas/winch/x64/v128_ops/store_lane/store64.wat +++ b/tests/disas/winch/x64/v128_ops/store_lane/store64.wat @@ -22,7 +22,7 @@ ;; movq %rsi, (%rsp) ;; movdqu 0x1c(%rip), %xmm0 ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; vpextrq $1, %xmm0, (%rcx) ;; addq $0x10, %rsp diff --git a/tests/disas/winch/x64/v128_ops/store_lane/store8.wat b/tests/disas/winch/x64/v128_ops/store_lane/store8.wat index c3337d2ff0..380e6cb5e9 100644 --- a/tests/disas/winch/x64/v128_ops/store_lane/store8.wat +++ b/tests/disas/winch/x64/v128_ops/store_lane/store8.wat @@ -22,7 +22,7 @@ ;; movq %rsi, (%rsp) ;; movdqu 0x1c(%rip), %xmm0 ;; movl $0, %eax -;; movq 0x58(%r14), %rcx +;; movq 0x50(%r14), %rcx ;; addq %rax, %rcx ;; vpextrb $1, %xmm0, (%rcx) ;; addq $0x10, %rsp diff --git a/tests/disas/x64-simple-load.wat b/tests/disas/x64-simple-load.wat new file mode 100644 index 0000000000..fd2a821035 --- /dev/null +++ b/tests/disas/x64-simple-load.wat @@ -0,0 +1,27 @@ +;;! target = "x86_64" +;;! test = "compile" +;;! objdump = '--traps --addrmap' + +(module + (memory 1) + + (func $load8 (param i32) (result i32 i32) + (i32.load8_u (local.get 0)) + (i32.load8_u offset=4 (local.get 0)) + ) +) +;; wasm[0]::function[0]::load8: +;; pushq %rbp +;; movq %rsp, %rbp +;; movq 0x50(%rdi), %r9 +;; ╰─╼ addrmap: 0x21 +;; movl %edx, %r10d +;; movzbq (%r9, %r10), %rax +;; ╰─╼ trap: MemoryOutOfBounds +;; movzbq 4(%r9, %r10), %rcx +;; ├─╼ addrmap: 0x26 +;; ╰─╼ trap: MemoryOutOfBounds +;; movq %rbp, %rsp +;; ╰─╼ addrmap: 0x29 +;; popq %rbp +;; retq diff --git a/tests/misc_testsuite/component-model-async/error-context.wast b/tests/misc_testsuite/component-model-async/error-context.wast index 4ec197f51e..c1be6d8011 100644 --- a/tests/misc_testsuite/component-model-async/error-context.wast +++ b/tests/misc_testsuite/component-model-async/error-context.wast @@ -1,4 +1,5 @@ -;;! cm_async = true +;;! component_model_async = true +;;! component_model_error_context = true ;; error-context.new (component diff --git a/tests/misc_testsuite/component-model-async/fused.wast b/tests/misc_testsuite/component-model-async/fused.wast index 1a94397fea..56b9b12c7d 100644 --- a/tests/misc_testsuite/component-model-async/fused.wast +++ b/tests/misc_testsuite/component-model-async/fused.wast @@ -1,5 +1,5 @@ -;;! cm_async = true -;;! cm_async_stackful = true +;;! component_model_async = true +;;! component_model_async_stackful = true ;;! reference_types = true ;;! gc_types = true ;;! multi_memory = true diff --git a/tests/misc_testsuite/component-model-async/future-read.wast b/tests/misc_testsuite/component-model-async/future-read.wast index 738001ed63..155aada18e 100644 --- a/tests/misc_testsuite/component-model-async/future-read.wast +++ b/tests/misc_testsuite/component-model-async/future-read.wast @@ -1,4 +1,4 @@ -;;! cm_async = true +;;! component_model_async = true ;;! reference_types = true ;;! gc_types = true ;;! multi_memory = true diff --git a/tests/misc_testsuite/component-model-async/futures.wast b/tests/misc_testsuite/component-model-async/futures.wast index 3a3eed8a56..aae952d53f 100644 --- a/tests/misc_testsuite/component-model-async/futures.wast +++ b/tests/misc_testsuite/component-model-async/futures.wast @@ -1,5 +1,5 @@ -;;! cm_async = true -;;! cm_async_builtins = true +;;! component_model_async = true +;;! component_model_async_builtins = true ;; future.new (component diff --git a/tests/misc_testsuite/component-model-async/lift.wast b/tests/misc_testsuite/component-model-async/lift.wast index 0a3d5d12a7..f1175b0e89 100644 --- a/tests/misc_testsuite/component-model-async/lift.wast +++ b/tests/misc_testsuite/component-model-async/lift.wast @@ -1,5 +1,5 @@ -;;! cm_async = true -;;! cm_async_stackful = true +;;! component_model_async = true +;;! component_model_async_stackful = true ;; async lift; no callback (component diff --git a/tests/misc_testsuite/component-model-async/lower.wast b/tests/misc_testsuite/component-model-async/lower.wast index c641a27e6b..bcb4862fc8 100644 --- a/tests/misc_testsuite/component-model-async/lower.wast +++ b/tests/misc_testsuite/component-model-async/lower.wast @@ -1,4 +1,4 @@ -;;! cm_async = true +;;! component_model_async = true ;; async lower (component diff --git a/tests/misc_testsuite/component-model-async/streams.wast b/tests/misc_testsuite/component-model-async/streams.wast index c99f87c1fc..aa915fb5cb 100644 --- a/tests/misc_testsuite/component-model-async/streams.wast +++ b/tests/misc_testsuite/component-model-async/streams.wast @@ -1,5 +1,5 @@ -;;! cm_async = true -;;! cm_async_builtins = true +;;! component_model_async = true +;;! component_model_async_builtins = true ;; stream.new (component diff --git a/tests/misc_testsuite/component-model-async/task-builtins.wast b/tests/misc_testsuite/component-model-async/task-builtins.wast index eb9e51e2aa..3141d2ae72 100644 --- a/tests/misc_testsuite/component-model-async/task-builtins.wast +++ b/tests/misc_testsuite/component-model-async/task-builtins.wast @@ -1,5 +1,5 @@ -;;! cm_async = true -;;! cm_async_stackful = true +;;! component_model_async = true +;;! component_model_async_stackful = true ;; backpressure.set (component diff --git a/tests/misc_testsuite/component-model-async/wait-forever.wast b/tests/misc_testsuite/component-model-async/wait-forever.wast index 8989b1a4e5..f3ebc6dce3 100644 --- a/tests/misc_testsuite/component-model-async/wait-forever.wast +++ b/tests/misc_testsuite/component-model-async/wait-forever.wast @@ -1,4 +1,4 @@ -;;! cm_async = true +;;! component_model_async = true ;;! reference_types = true ;;! gc_types = true ;;! multi_memory = true @@ -29,7 +29,7 @@ (export "waitable-set-new" (func $waitable-set-new)) )) )) - + (func (export "run") (canon lift (core func $i "run") async (callback (func $i "cb")))) ) diff --git a/tests/misc_testsuite/gc/alloc-v128-struct.wast b/tests/misc_testsuite/gc/alloc-v128-struct.wast new file mode 100644 index 0000000000..cb147743c9 --- /dev/null +++ b/tests/misc_testsuite/gc/alloc-v128-struct.wast @@ -0,0 +1,12 @@ +;;! gc = true +;;! simd = true + +(module + (type $s (struct (field v128))) + (func (export "alloc") + struct.new_default $s + drop + ) +) + +(assert_return (invoke "alloc")) diff --git a/tests/misc_testsuite/gc/arrays-of-different-types.wast b/tests/misc_testsuite/gc/arrays-of-different-types.wast new file mode 100644 index 0000000000..b775dde4f1 --- /dev/null +++ b/tests/misc_testsuite/gc/arrays-of-different-types.wast @@ -0,0 +1,54 @@ +;;! gc = true +;;! simd = true + +(module + (type $func_ty (func)) + (type $struct_ty (struct)) + + (type $a (array i8)) + (type $b (array i16)) + (type $c (array i32)) + (type $d (array i64)) + (type $e (array f32)) + (type $f (array f64)) + (type $g (array v128)) + (type $h (array funcref)) + (type $i (array (ref $func_ty))) + (type $j (array nullfuncref)) + (type $k (array externref)) + (type $l (array nullexternref)) + (type $m (array anyref)) + (type $n (array eqref)) + (type $o (array structref)) + (type $p (array (ref $struct_ty))) + (type $q (array arrayref)) + (type $r (array (ref $a))) + (type $s (array i31ref)) + (type $t (array nullref)) + + (elem declare funcref (ref.func $f)) + (func $f (export "f") + (drop (array.new $a (i32.const 0xff) (i32.const 3))) + (drop (array.new $b (i32.const 0xffff) (i32.const 3))) + (drop (array.new $c (i32.const 0xffffffff) (i32.const 3))) + (drop (array.new $d (i64.const 0xffffffffffffffff) (i32.const 3))) + (drop (array.new $e (f32.const 0.0) (i32.const 3))) + (drop (array.new $f (f64.const 0.0) (i32.const 3))) + (drop (array.new $g (v128.const i32x4 1 2 3 4) (i32.const 3))) + (drop (array.new $h (ref.func $f) (i32.const 3))) + (drop (array.new $i (ref.func $f) (i32.const 3))) + (drop (array.new $j (ref.null nofunc) (i32.const 3))) + (drop (array.new $k (ref.null extern) (i32.const 3))) + (drop (array.new $l (ref.null noextern) (i32.const 3))) + (drop (array.new $m (array.new_default $a (i32.const 1)) (i32.const 3))) + (drop (array.new $n (array.new_default $b (i32.const 1)) (i32.const 3))) + (drop (array.new $o (struct.new $struct_ty) (i32.const 3))) + (drop (array.new $p (struct.new $struct_ty) (i32.const 3))) + (drop (array.new $q (array.new_default $b (i32.const 1)) (i32.const 3))) + (drop (array.new $r (array.new_default $a (i32.const 1)) (i32.const 3))) + (drop (array.new $s (ref.i31 (i32.const 0x12345678)) (i32.const 3))) + (drop (array.new $t (ref.null none) (i32.const 3))) + ) +) + +(assert_return (invoke "f")) diff --git a/tests/misc_testsuite/gc/externrefs-can-be-i31refs.wast b/tests/misc_testsuite/gc/externrefs-can-be-i31refs.wast new file mode 100644 index 0000000000..017b5c00c6 --- /dev/null +++ b/tests/misc_testsuite/gc/externrefs-can-be-i31refs.wast @@ -0,0 +1,14 @@ +;;! gc = true + +(module + (type (struct (field externref))) + (func (export "") + i32.const 0x7fffffff + ref.i31 + extern.convert_any + struct.new 0 + drop + ) +) + +(assert_return (invoke "")) diff --git a/tests/misc_testsuite/gc/fuzz-segfault.wast b/tests/misc_testsuite/gc/fuzz-segfault.wast new file mode 100644 index 0000000000..12424ac9f9 --- /dev/null +++ b/tests/misc_testsuite/gc/fuzz-segfault.wast @@ -0,0 +1,13 @@ +;;! gc = true + +(module + (func (export "") + loop + ref.null 0 + ref.test (ref 0) + br_if 0 + end + ) +) + +(assert_return (invoke "")) diff --git a/tests/misc_testsuite/gc/issue-10182.wast b/tests/misc_testsuite/gc/issue-10182.wast new file mode 100644 index 0000000000..7d4cf838e0 --- /dev/null +++ b/tests/misc_testsuite/gc/issue-10182.wast @@ -0,0 +1,23 @@ +;;! gc = true + +(module + (type (array (mut anyref))) + + (global (ref 0) (array.new_fixed 0 1 (array.new_fixed 0 0))) + + (func (export "") + (local $l (ref 0)) + + global.get 0 + local.set $l + + local.get 0 + i32.const 0 + local.get 0 + i32.const 0 + i32.const 1 + array.copy 0 0 + ) +) + +(assert_return (invoke "")) diff --git a/tests/misc_testsuite/gc/issue-10353.wast b/tests/misc_testsuite/gc/issue-10353.wast new file mode 100644 index 0000000000..1b3b428ab9 --- /dev/null +++ b/tests/misc_testsuite/gc/issue-10353.wast @@ -0,0 +1,11 @@ +;;! gc = true + +(module + (table $t 10 (ref null none)) + (func (export "f") (result (ref null none)) + (i32.const 99) + (table.get $t) + ) +) + +(assert_trap (invoke "f") "out of bounds table access") diff --git a/tests/misc_testsuite/gc/issue-10397.wast b/tests/misc_testsuite/gc/issue-10397.wast new file mode 100644 index 0000000000..9884185e08 --- /dev/null +++ b/tests/misc_testsuite/gc/issue-10397.wast @@ -0,0 +1,39 @@ +;;! gc = true + +(module + (type $func (func)) + (type $array (array (mut i32))) + (type $struct (sub (struct (field $field (ref $func))))) + + (elem func $nop) + (func $nop) + + (func (export "") + (local $local_array (ref $array)) + (local $local_struct (ref $struct)) + (local $i i32) + + (local.set $local_struct (struct.new $struct (ref.func $nop))) + + (loop $outer + (local.set $local_array (array.new $array (i32.const 0) (i32.const 1))) + + (loop $inner + (array.set $array (ref.cast (ref $array) (local.get $local_array)) + (i32.const 0) + (i32.const 1)) + (br_if $inner (i32.const 0)) + ) + + (call_ref $func (struct.get $struct $field (local.get $local_struct))) + + (if (i32.gt_u (local.get $i) (i32.shl (i32.const 1) (i32.const 14))) + (then (return))) + + (local.set $i (i32.add (local.get $i) (i32.const 1))) + (br $outer) + ) + ) +) + +(assert_return (invoke "")) diff --git a/tests/misc_testsuite/gc/issue-10459.wast b/tests/misc_testsuite/gc/issue-10459.wast new file mode 100644 index 0000000000..098b07622e --- /dev/null +++ b/tests/misc_testsuite/gc/issue-10459.wast @@ -0,0 +1,21 @@ +;;! gc = true + +(module + (type $func (func)) + + (type $super (sub (struct (field (ref $func))))) + (type $sub (sub final $super (struct (field (ref $func)) (field (ref eq))))) + + (elem declare func $f) + (func $f) + + (func (export "run") + (drop + (struct.get $super 0 + (struct.new $sub + (ref.func $f) + (ref.i31 (i32.const 0))))) + ) +) + +(assert_return (invoke "run")) diff --git a/tests/misc_testsuite/gc/issue-10464.wast b/tests/misc_testsuite/gc/issue-10464.wast new file mode 100644 index 0000000000..5752a207b1 --- /dev/null +++ b/tests/misc_testsuite/gc/issue-10464.wast @@ -0,0 +1,14 @@ +;;! gc = true + +(module + (type $a (struct)) + (type $b (array structref)) + (func (export "f") + struct.new_default $a + i32.const 536870911 + array.new $b + drop + ) +) + +(assert_trap (invoke "f") "allocation size too large") diff --git a/tests/misc_testsuite/gc/issue-10467.wast b/tests/misc_testsuite/gc/issue-10467.wast new file mode 100644 index 0000000000..d0a6ed0ce8 --- /dev/null +++ b/tests/misc_testsuite/gc/issue-10467.wast @@ -0,0 +1,20 @@ +;;! gc = true + +(module + (type $string (array (mut i8))) + (func (export "f") + (local $s (ref $string)) + (local.set $s (array.new_default $string (i32.const 1))) + (array.fill $string + (local.get $s) + (i32.const 0) + (i32.const 32) + (i32.const 1)) + (if (i32.ne (array.get_u $string (local.get $s) (i32.const 0)) + (i32.const 32)) + (then + (unreachable))) + ) +) + +(assert_return (invoke "f")) diff --git a/tests/misc_testsuite/wide-arithmetic.wast b/tests/misc_testsuite/wide-arithmetic.wast index a1eee727ed..04ce7a3f03 100644 --- a/tests/misc_testsuite/wide-arithmetic.wast +++ b/tests/misc_testsuite/wide-arithmetic.wast @@ -323,3 +323,21 @@ (i64.const -1) (i64.const 0)) (assert_return (invoke "i64.mul_wide_u" (i64.const 1) (i64.const 0)) (i64.const 0) (i64.const 0)) + +(module + (func (export "u64::overflowing_add") (param i64 i64) (result i64 i64) + local.get 0 + i64.const 0 + local.get 1 + i64.const 0 + i64.add128) +) + +(assert_return (invoke "u64::overflowing_add" (i64.const 0) (i64.const 0)) + (i64.const 0) (i64.const 0)) +(assert_return (invoke "u64::overflowing_add" (i64.const 0) (i64.const 1)) + (i64.const 1) (i64.const 0)) +(assert_return (invoke "u64::overflowing_add" (i64.const 1) (i64.const -1)) + (i64.const 0) (i64.const 1)) +(assert_return (invoke "u64::overflowing_add" (i64.const -2) (i64.const -1)) + (i64.const -3) (i64.const 1)) diff --git a/tests/misc_testsuite/winch/issue-10331.wast b/tests/misc_testsuite/winch/issue-10331.wast new file mode 100644 index 0000000000..6a9058d5a4 --- /dev/null +++ b/tests/misc_testsuite/winch/issue-10331.wast @@ -0,0 +1,16 @@ +;;! simd = true + +;; See https://github.com/bytecodealliance/wasmtime/issues/10331 + +(module + (func (export "test") (result v128) + v128.const i8x16 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + call 1 + ) + (func (param v128) (result v128) + local.get 0 + i16x8.extadd_pairwise_i8x16_s + ) +) + +(assert_return (invoke "test") (v128.const i16x8 65408 0 0 0 0 0 0 0)) diff --git a/tests/misc_testsuite/winch/issue-10357.wast b/tests/misc_testsuite/winch/issue-10357.wast new file mode 100644 index 0000000000..030cb8fecc --- /dev/null +++ b/tests/misc_testsuite/winch/issue-10357.wast @@ -0,0 +1,20 @@ +;;! simd = true + +;; See https://github.com/bytecodealliance/wasmtime/issues/10357 + +(module + (func (export "test") (result i64 v128 v128) + i32.const 0 + v128.const i32x4 0x00000000 0x00000000 0x68732efe 0x74727473 + i64.const 1 + call 1 + ) + + (func (param i32 v128 i64) (result i64 v128 v128) + i64.const 0 + local.get 1 + v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000 + ) +) + +(assert_return (invoke "test") (i64.const 0) (v128.const i32x4 0x00000000 0x00000000 0x68732efe 0x74727473) (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000)) diff --git a/tests/misc_testsuite/winch/issue-10460.wast b/tests/misc_testsuite/winch/issue-10460.wast new file mode 100644 index 0000000000..7a688b1476 --- /dev/null +++ b/tests/misc_testsuite/winch/issue-10460.wast @@ -0,0 +1,23 @@ +;;! simd = true +(module + (func (export "x") + (param f32 f32 f32 f32 f32 f32 f32 f32 f32) (param $last v128) + (result v128) + local.get $last + ) +) + +(assert_return + (invoke "x" + (f32.const 1) + (f32.const 2) + (f32.const 3) + (f32.const 4) + (f32.const 5) + (f32.const 6) + (f32.const 7) + (f32.const 8) + (f32.const 9) + (v128.const i64x2 10 11) + ) + (v128.const i64x2 10 11)) diff --git a/tests/misc_testsuite/winch/replace_lane.wast b/tests/misc_testsuite/winch/replace_lane.wast new file mode 100644 index 0000000000..668bd8e032 --- /dev/null +++ b/tests/misc_testsuite/winch/replace_lane.wast @@ -0,0 +1,32 @@ +;;! simd = true + +(module + (func (export "f32x4_lane0") (result v128) + v128.const f32x4 2 3 4 5 + f32.const 1 + f32x4.replace_lane 0 + ) + + (func (export "f32x4_lane1") (result v128) + v128.const f32x4 2 3 4 5 + f32.const 1 + f32x4.replace_lane 1 + ) + + (func (export "f64x2_lane0") (result v128) + v128.const f64x2 2 3 + f64.const 1 + f64x2.replace_lane 0 + ) + + (func (export "f64x2_lane1") (result v128) + v128.const f64x2 2 3 + f64.const 1 + f64x2.replace_lane 1 + ) +) + +(assert_return (invoke "f32x4_lane0") (v128.const f32x4 1 3 4 5)) +(assert_return (invoke "f32x4_lane1") (v128.const f32x4 2 1 4 5)) +(assert_return (invoke "f64x2_lane0") (v128.const f64x2 1 3)) +(assert_return (invoke "f64x2_lane1") (v128.const f64x2 2 1)) diff --git a/tests/misc_testsuite/winch/simd_multivalue.wast b/tests/misc_testsuite/winch/simd_multivalue.wast index c7f0cee851..e30d3f1e1f 100644 --- a/tests/misc_testsuite/winch/simd_multivalue.wast +++ b/tests/misc_testsuite/winch/simd_multivalue.wast @@ -7,3 +7,13 @@ ;; test 0 consts (module (func (export "consts") (result v128) (result v128) (v128.const i64x2 0 0) (v128.const i64x2 0 0))) (assert_return (invoke "consts") (v128.const i64x2 0 0) (v128.const i64x2 0 0)) + +;; test case where vector is neither the first return value nor the last return value +(module + (func (export "not-first-nor-last") (param v128) (result i64 v128 i64) + i64.const 0 + local.get 0 + i64.const 0 + ) +) +(assert_return (invoke "not-first-nor-last" (v128.const i32x4 1 2 3 4)) (i64.const 0) (v128.const i32x4 1 2 3 4) (i64.const 0)) diff --git a/tests/rlimited-memory.rs b/tests/rlimited-memory.rs index 06bfa5eea4..fb743ea432 100644 --- a/tests/rlimited-memory.rs +++ b/tests/rlimited-memory.rs @@ -49,11 +49,7 @@ fn custom_limiter_detect_os_oom_failure() -> Result<()> { // QEMU commits 5dfa88f7162f ("linux-user: do setrlimit selectively") and // 055d92f8673c ("linux-user: do prlimit selectively") for more // information. - if std::env::vars() - .filter(|(k, _v)| k.starts_with("CARGO_TARGET") && k.ends_with("RUNNER")) - .count() - > 0 - { + if wasmtime_test_util::cargo_test_runner().is_some() { return Ok(()); } diff --git a/tests/wast.rs b/tests/wast.rs index b71b0ab76e..fa29447eb8 100644 --- a/tests/wast.rs +++ b/tests/wast.rs @@ -4,8 +4,8 @@ use std::sync::{Condvar, LazyLock, Mutex}; use wasmtime::{ Config, Engine, InstanceAllocationStrategy, MpkEnabled, PoolingAllocationConfig, Store, }; +use wasmtime_test_util::wast::{limits, Collector, Compiler, WastConfig, WastTest}; use wasmtime_wast::{Async, SpectestConfig, WastContext}; -use wasmtime_wast_util::{limits, Collector, Compiler, WastConfig, WastTest}; fn main() { env_logger::init(); @@ -13,7 +13,7 @@ fn main() { let tests = if cfg!(miri) { Vec::new() } else { - wasmtime_wast_util::find_tests(".".as_ref()).unwrap() + wasmtime_test_util::wast::find_tests(".".as_ref()).unwrap() }; let mut trials = Vec::new(); @@ -124,8 +124,8 @@ fn run_wast(test: &WastTest, config: WastConfig) -> anyhow::Result<()> { let mut cfg = Config::new(); cfg.async_support(true); - component_test_util::apply_test_config(&mut cfg, &test_config); - component_test_util::apply_wast_config(&mut cfg, &config); + wasmtime_test_util::wasmtime_wast::apply_test_config(&mut cfg, &test_config); + wasmtime_test_util::wasmtime_wast::apply_wast_config(&mut cfg, &config); if is_cranelift { cfg.cranelift_debug_verifier(true); diff --git a/winch/codegen/src/codegen/env.rs b/winch/codegen/src/codegen/env.rs index ecb7aff3d6..aa2b108f9a 100644 --- a/winch/codegen/src/codegen/env.rs +++ b/winch/codegen/src/codegen/env.rs @@ -230,7 +230,7 @@ impl<'a, 'translation, 'data, P: PtrSize> FuncEnv<'a, 'translation, 'data, P> { .vmctx_vmtable_definition_current_elements(defined), ), None => ( - Some(self.vmoffsets.vmctx_vmtable_import_from(index)), + Some(self.vmoffsets.vmctx_vmtable_from(index)), self.vmoffsets.vmtable_definition_base().into(), self.vmoffsets.vmtable_definition_current_elements().into(), ), diff --git a/winch/codegen/src/codegen/mod.rs b/winch/codegen/src/codegen/mod.rs index f990d27f3b..2beb4f5e68 100644 --- a/winch/codegen/src/codegen/mod.rs +++ b/winch/codegen/src/codegen/mod.rs @@ -1143,10 +1143,11 @@ where /// Emits a series of instructions that load the `fuel_consumed` field from /// `VMStoreContext`. fn emit_load_fuel_consumed(&mut self, fuel_reg: Reg) -> Result<()> { - let limits_offset = self.env.vmoffsets.ptr.vmctx_runtime_limits(); + let store_context_offset = self.env.vmoffsets.ptr.vmctx_store_context(); let fuel_offset = self.env.vmoffsets.ptr.vmstore_context_fuel_consumed(); self.masm.load_ptr( - self.masm.address_at_vmctx(u32::from(limits_offset))?, + self.masm + .address_at_vmctx(u32::from(store_context_offset))?, writable!(fuel_reg), )?; @@ -1221,7 +1222,7 @@ where epoch_counter_reg: Reg, ) -> Result<()> { let epoch_ptr_offset = self.env.vmoffsets.ptr.vmctx_epoch_ptr(); - let runtime_limits_offset = self.env.vmoffsets.ptr.vmctx_runtime_limits(); + let store_context_offset = self.env.vmoffsets.ptr.vmctx_store_context(); let epoch_deadline_offset = self.env.vmoffsets.ptr.vmstore_context_epoch_deadline(); // Load the current epoch value into `epoch_counter_var`. @@ -1241,7 +1242,7 @@ where // Load the `VMStoreContext`. self.masm.load_ptr( self.masm - .address_at_vmctx(u32::from(runtime_limits_offset))?, + .address_at_vmctx(u32::from(store_context_offset))?, writable!(epoch_deadline_reg), )?; @@ -1262,13 +1263,14 @@ where return Ok(()); } - let limits_offset = self.env.vmoffsets.ptr.vmctx_runtime_limits(); + let store_context_offset = self.env.vmoffsets.ptr.vmctx_store_context(); let fuel_offset = self.env.vmoffsets.ptr.vmstore_context_fuel_consumed(); let limits_reg = self.context.any_gpr(self.masm)?; // Load `VMStoreContext` into the `limits_reg` reg. self.masm.load_ptr( - self.masm.address_at_vmctx(u32::from(limits_offset))?, + self.masm + .address_at_vmctx(u32::from(store_context_offset))?, writable!(limits_reg), )?; diff --git a/winch/codegen/src/isa/aarch64/masm.rs b/winch/codegen/src/isa/aarch64/masm.rs index fe3dcb75ae..8dccb2d6b7 100644 --- a/winch/codegen/src/isa/aarch64/masm.rs +++ b/winch/codegen/src/isa/aarch64/masm.rs @@ -133,7 +133,7 @@ impl Masm for MacroAssembler { self.move_shadow_sp_to_sp(); // Pop the shadow stack pointer. It's assumed that at this point - // `sp_offset` is 0 and therfore the real stack pointer should be + // `sp_offset` is 0 and therefore the real stack pointer should be // 16-byte aligned. let addr = Address::post_indexed_from_sp(SHADOW_STACK_POINTER_SLOT_SIZE as i64); self.asm.uload( @@ -181,7 +181,7 @@ impl Masm for MacroAssembler { self.asm .add_ir(bytes as u64, ssp, writable!(ssp), OperandSize::S64); - // We must ensure that the real stack pointer reflects the the offset + // We must ensure that the real stack pointer reflects the offset // tracked by `self.sp_offset`, we use such value to calculate // alignment, which is crucial for calls. // @@ -1370,13 +1370,13 @@ impl MacroAssembler { // sp, x28. // // This function is usually called when the space is claimed, e.g., via - // a push, when stack space is reserved explcitly or after emitting code + // a push, when stack space is reserved explicitly or after emitting code // that requires explicit stack pointer alignment (code that could result in // signal handling). // // This ensures the stack pointer always reflects the allocated stack space, // otherwise any space below the stack pointer could get clobbered with - // interrups and signal handlers. + // interrupts and signal handlers. // // This function must also be called at the function epilogue, since the // stack pointer is used to restore the current function frame. diff --git a/winch/codegen/src/isa/x64/abi.rs b/winch/codegen/src/isa/x64/abi.rs index 5b13d35669..b54c0a52a5 100644 --- a/winch/codegen/src/isa/x64/abi.rs +++ b/winch/codegen/src/isa/x64/abi.rs @@ -169,30 +169,31 @@ impl X64ABI { let ty_size = ::sizeof(wasm_arg); let default = || { - let arg = ABIOperand::stack_offset(stack_offset, *ty, ty_size as u32); let slot_size = Self::stack_slot_size(); - // Stack slots for parameters are aligned to a fixed slot size, - // in the case of x64, 8 bytes. Except if they are v128 values, - // in which case they use 16 bytes. - // Stack slots for returns are type-size aligned. - let next_stack = if params_or_returns == ParamsOrReturns::Params { - let alignment = if *ty == WasmValType::V128 { - ty_size - } else { - slot_size - }; - align_to(stack_offset, alignment as u32) + (alignment as u32) + if params_or_returns == ParamsOrReturns::Params { + // Stack slots for parameters are aligned to a fixed slot size, + // 8 bytes if the type size is 8 or less and type-sized aligned + // if the type size is greater than 8 bytes. + let alignment = std::cmp::max(ty_size, slot_size); + let offset = align_to(stack_offset, u32::from(alignment)); + let arg = ABIOperand::stack_offset(offset, *ty, u32::from(ty_size)); + (arg, offset + u32::from(alignment)) } else { // For the default calling convention, we don't type-size align, // given that results on the stack must match spills generated // from within the compiler, which are not type-size aligned. + // In all other cases the results are type-sized aligned. if call_conv.is_default() { - stack_offset + (ty_size as u32) + let arg = ABIOperand::stack_offset(stack_offset, *ty, u32::from(ty_size)); + (arg, stack_offset + (ty_size as u32)) } else { - align_to(stack_offset, ty_size as u32) + (ty_size as u32) + let offset = align_to(stack_offset, u32::from(ty_size)); + ( + ABIOperand::stack_offset(offset, *ty, u32::from(ty_size)), + offset + u32::from(ty_size), + ) } - }; - (arg, next_stack) + } }; Ok(reg.map_or_else(default, |reg| { @@ -418,6 +419,17 @@ mod tests { match_reg_arg(params.get(6).unwrap(), F64, regs::xmm3()); match_reg_arg(params.get(7).unwrap(), F32, regs::xmm4()); match_reg_arg(params.get(8).unwrap(), F64, regs::xmm5()); + + let wasm_sig = WasmFuncType::new( + [F32, F32, F32, F32, F32, F32, F32, F32, F32, V128].into(), + [V128].into(), + ); + + let sig = X64ABI::sig(&wasm_sig, &CallingConvention::Default)?; + let params = sig.params; + + match_stack_arg(params.get(8).unwrap(), F32, 0); + match_stack_arg(params.get(9).unwrap(), V128, 16); Ok(()) } @@ -486,7 +498,7 @@ mod tests { match_stack_arg(results.get(1).unwrap(), F32, 0); match_stack_arg(results.get(2).unwrap(), I32, 4); match_stack_arg(results.get(3).unwrap(), F32, 8); - match_stack_arg(results.get(4).unwrap(), I64, 12); + match_stack_arg(results.get(4).unwrap(), I64, 16); Ok(()) } diff --git a/winch/codegen/src/isa/x64/asm.rs b/winch/codegen/src/isa/x64/asm.rs index 6d380912ba..ba8d9ee6a9 100644 --- a/winch/codegen/src/isa/x64/asm.rs +++ b/winch/codegen/src/isa/x64/asm.rs @@ -1818,17 +1818,43 @@ impl Assembler { }) } - /// Adds vectors of integers in `src1` and `src2` and puts the results in - /// `dst`. - pub fn xmm_vpadd_rrr(&mut self, src1: Reg, src2: Reg, dst: WritableReg, size: OperandSize) { - let op = match size { + /// Converts an operand size to the appropriate opcode for `vpadd``. + fn xmm_vpadd_opcode(size: OperandSize) -> AvxOpcode { + match size { OperandSize::S8 => AvxOpcode::Vpaddb, OperandSize::S32 => AvxOpcode::Vpaddd, _ => unimplemented!(), - }; + } + } + + pub fn xmm_vpadd_rmr( + &mut self, + src1: Reg, + src2: &Address, + dst: WritableReg, + size: OperandSize, + ) { + let address = Self::to_synthetic_amode( + src2, + &mut self.pool, + &mut self.constants, + &mut self.buffer, + MemFlags::trusted(), + ); self.emit(Inst::XmmRmiRVex { - op, + op: Self::xmm_vpadd_opcode(size), + src1: src1.into(), + src2: XmmMemImm::unwrap_new(RegMemImm::mem(address)), + dst: dst.to_reg().into(), + }); + } + + /// Adds vectors of integers in `src1` and `src2` and puts the results in + /// `dst`. + pub fn xmm_vpadd_rrr(&mut self, src1: Reg, src2: Reg, dst: WritableReg, size: OperandSize) { + self.emit(Inst::XmmRmiRVex { + op: Self::xmm_vpadd_opcode(size), src1: src1.into(), src2: src2.into(), dst: dst.to_reg().into(), @@ -1937,6 +1963,7 @@ impl Assembler { } /// Moves 64-bit float from `src` into lower 64-bits of `dst`. + /// Zeroes out the upper 64 bits of `dst`. pub fn xmm_vmovsd_rm(&mut self, dst: WritableReg, src: &Address) { let src = Self::to_synthetic_amode( src, @@ -2914,6 +2941,72 @@ impl Assembler { dst: dst.to_reg().into(), }); } + + /// Multiply and add packed signed and unsigned bytes. + pub fn xmm_vpmaddubs_rmr( + &mut self, + src: Reg, + address: &Address, + dst: WritableReg, + size: OperandSize, + ) { + let address = Self::to_synthetic_amode( + address, + &mut self.pool, + &mut self.constants, + &mut self.buffer, + MemFlags::trusted(), + ); + + let op = match size { + OperandSize::S16 => AvxOpcode::Vpmaddubsw, + _ => unimplemented!(), + }; + + self.emit(Inst::XmmRmiRVex { + op, + src1: src.into(), + src2: XmmMemImm::unwrap_new(RegMemImm::mem(address)), + dst: dst.to_reg().into(), + }); + } + + /// Multiple and add packed integers. + pub fn xmm_vpmaddwd_rmr(&mut self, src: Reg, address: &Address, dst: WritableReg) { + let address = Self::to_synthetic_amode( + address, + &mut self.pool, + &mut self.constants, + &mut self.buffer, + MemFlags::trusted(), + ); + + self.emit(Inst::XmmRmiRVex { + op: AvxOpcode::Vpmaddwd, + src1: src.into(), + src2: XmmMemImm::unwrap_new(RegMemImm::mem(address)), + dst: dst.to_reg().into(), + }) + } + + /// Perform a logical on vector in `src` and in `address` and put the + /// results in `dst`. + pub fn xmm_vpxor_rmr(&mut self, src: Reg, address: &Address, dst: WritableReg) { + let address = Self::to_synthetic_amode( + address, + &mut self.pool, + &mut self.constants, + &mut self.buffer, + MemFlags::trusted(), + ); + + self.emit(Inst::XmmRmiRVex { + op: AvxOpcode::Vpxor, + src1: src.into(), + src2: XmmMemImm::unwrap_new(RegMemImm::mem(address)), + dst: dst.to_reg().into(), + }) + } } /// Captures the region in a MachBuffer where an add-with-immediate instruction would be emitted, diff --git a/winch/codegen/src/isa/x64/masm.rs b/winch/codegen/src/isa/x64/masm.rs index 75ef425a09..1ef9f7f8c5 100644 --- a/winch/codegen/src/isa/x64/masm.rs +++ b/winch/codegen/src/isa/x64/masm.rs @@ -1607,7 +1607,15 @@ impl Masm for MacroAssembler { RegImm::Imm(imm) => { let address = self.asm.add_constant(&imm.to_bytes()); match lane { - 0 => self.asm.xmm_vmovsd_rm(dst, &address), + 0 => { + // Memory load variant of `vmovsd` zeroes the upper + // 64 bits of the register so need to load the + // immediate to a register to use the register + // variant of `vmovsd` to perform the merge. + let scratch = writable!(regs::scratch_xmm()); + self.asm.xmm_vmovsd_rm(scratch, &address); + self.asm.xmm_vmovsd_rrr(dst, dst.to_reg(), scratch.to_reg()); + } 1 => self.asm.xmm_vmovlhps_rrm(dst, dst.to_reg(), &address), _ => unreachable!(), } @@ -2738,25 +2746,71 @@ impl Masm for MacroAssembler { dst: WritableReg, kind: V128ExtAddKind, ) -> Result<()> { - use V128ExtendKind::*; - self.ensure_has_avx()?; - // The implementation for extadd is not optimized; for simplicity's sake, we simply perform - // an extension followed by an addition using already implemented primitives. - let (low_kind, high_kind) = match kind { - V128ExtAddKind::I8x16S => (LowI8x16S, HighI8x16S), - V128ExtAddKind::I8x16U => (LowI8x16U, HighI8x16U), - V128ExtAddKind::I16x8S => (LowI16x8S, HighI16x8S), - V128ExtAddKind::I16x8U => (LowI16x8U, HighI16x8U), - }; - - let tmp = regs::scratch_xmm(); + match kind { + V128ExtAddKind::I8x16S => { + let scratch = regs::scratch_xmm(); + // Use `vpmaddubsw` with a vector of 16 8-bit 1's which will + // sign extend `src` to 16 bits and add adjacent words. + // Need to supply constant as first operand since first operand + // is treated as unsigned and the second operand is signed. + let mask = self.asm.add_constant(&[1; 16]); + self.asm.xmm_mov_mr( + &mask, + writable!(scratch), + OperandSize::S128, + MemFlags::trusted(), + ); + self.asm + .xmm_vex_rr(AvxOpcode::Vpmaddubsw, scratch, src, dst); + } + V128ExtAddKind::I8x16U => { + // Same approach as the signed variant but treat `src` as + // unsigned instead of signed by passing it as the first + // operand. + let mask = self.asm.add_constant(&[1; 16]); + self.asm + .xmm_vpmaddubs_rmr(src, &mask, dst, OperandSize::S16); + } + V128ExtAddKind::I16x8S => { + // Similar approach to the two variants above. The vector is 8 + // lanes of 16-bit 1's and `vpmaddwd` treats both operands as + // signed. + let mask = self + .asm + .add_constant(&[1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]); + self.asm.xmm_vpmaddwd_rmr(src, &mask, dst); + } + V128ExtAddKind::I16x8U => { + // Similar approach as the signed variant. + // `vpmaddwd` operates on signed integers and the operand is + // unsigned so the operand needs to be converted to a signed + // format and than that process needs to be reversed after + // `vpmaddwd`. + // Flip the sign bit for 8 16-bit lanes. + let xor_mask = self.asm.add_constant(&[ + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, + ]); + self.asm.xmm_vpxor_rmr(src, &xor_mask, dst); - self.v128_extend(src, writable!(tmp), low_kind)?; - self.v128_extend(src, dst, high_kind)?; + let madd_mask = self + .asm + .add_constant(&[1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]); + self.asm.xmm_vpmaddwd_rmr(dst.to_reg(), &madd_mask, dst); - self.v128_add(src, dst.to_reg(), dst, kind.into()) + // Reverse the XOR. The XOR effectively subtracts 32,768 from + // both pairs that are added together so 65,536 (0x10000) + // needs to be added to 4 lanes of 32-bit values. + let add_mask = self + .asm + .add_constant(&[0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0]); + self.asm + .xmm_vpadd_rmr(dst.to_reg(), &add_mask, dst, OperandSize::S32); + } + } + Ok(()) } fn v128_dot(&mut self, lhs: Reg, rhs: Reg, dst: WritableReg) -> Result<()> { diff --git a/winch/codegen/src/masm.rs b/winch/codegen/src/masm.rs index d16429aa95..156f9def13 100644 --- a/winch/codegen/src/masm.rs +++ b/winch/codegen/src/masm.rs @@ -915,15 +915,6 @@ pub(crate) enum V128ExtAddKind { I16x8U, } -impl From for V128AddKind { - fn from(value: V128ExtAddKind) -> Self { - match value { - V128ExtAddKind::I8x16S | V128ExtAddKind::I8x16U => Self::I16x8, - V128ExtAddKind::I16x8S | V128ExtAddKind::I16x8U => Self::I32x4, - } - } -} - /// Kinds of vector extended multiplication supported by WebAssembly. #[derive(Debug, Clone, Copy)] pub(crate) enum V128ExtMulKind { @@ -1480,31 +1471,60 @@ pub(crate) trait MacroAssembler { let word_bytes = ::word_bytes(); let scratch = scratch!(Self); - let mut dst_offs = dst.as_u32() - bytes; - let mut src_offs = src.as_u32() - bytes; - let word_bytes = word_bytes as u32; - while remaining >= word_bytes { - remaining -= word_bytes; - dst_offs += word_bytes; - src_offs += word_bytes; - self.load_ptr( - self.address_from_sp(SPOffset::from_u32(src_offs))?, - writable!(scratch), - )?; - self.store_ptr( - scratch.into(), - self.address_from_sp(SPOffset::from_u32(dst_offs))?, - )?; + let mut dst_offs; + let mut src_offs; + match direction { + MemMoveDirection::LowToHigh => { + dst_offs = dst.as_u32() - bytes; + src_offs = src.as_u32() - bytes; + while remaining >= word_bytes { + remaining -= word_bytes; + dst_offs += word_bytes; + src_offs += word_bytes; + + self.load_ptr( + self.address_from_sp(SPOffset::from_u32(src_offs))?, + writable!(scratch), + )?; + self.store_ptr( + scratch.into(), + self.address_from_sp(SPOffset::from_u32(dst_offs))?, + )?; + } + } + MemMoveDirection::HighToLow => { + // Go from the end to the beginning to handle overlapping addresses. + src_offs = src.as_u32(); + dst_offs = dst.as_u32(); + while remaining >= word_bytes { + self.load_ptr( + self.address_from_sp(SPOffset::from_u32(src_offs))?, + writable!(scratch), + )?; + self.store_ptr( + scratch.into(), + self.address_from_sp(SPOffset::from_u32(dst_offs))?, + )?; + + remaining -= word_bytes; + src_offs -= word_bytes; + dst_offs -= word_bytes; + } + } } if remaining > 0 { let half_word = word_bytes / 2; let ptr_size = OperandSize::from_bytes(half_word as u8); debug_assert!(remaining == half_word); - dst_offs += half_word; - src_offs += half_word; + // Need to move the offsets ahead in the `LowToHigh` case to + // compensate for the initial subtraction of `bytes`. + if direction == MemMoveDirection::LowToHigh { + dst_offs += half_word; + src_offs += half_word; + } self.load( self.address_from_sp(SPOffset::from_u32(src_offs))?, @@ -2119,7 +2139,7 @@ pub(crate) trait MacroAssembler { fn v128_neg(&mut self, op: WritableReg, kind: V128NegKind) -> Result<()>; /// Perform the shift operation specified by `kind`, by the shift amount specified by the 32-bit - /// integer at the top the the stack, on the 128-bit vector specified by the second value + /// integer at the top of the stack, on the 128-bit vector specified by the second value /// from the top of the stack, interpreted as packed integers of size `lane_width`. /// /// The shift amount is taken modulo `lane_width`.