diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..5700a10 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,58 @@ +name: Release + +on: + release: + types: [ published ] + +env: + RUST_BACKTRACE: 1 + CARGO_TERM_COLOR: always + +jobs: + upload-binary: + permissions: write-all + name: ${{ matrix.target }} + strategy: + matrix: + include: + - target: aarch64-apple-darwin + os: macos-latest + - target: x86_64-unknown-linux-gnu + - target: x86_64-apple-darwin + os: macos-latest + - target: x86_64-pc-windows-msvc + os: windows-latest + runs-on: ${{ matrix.os || 'ubuntu-latest' }} + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + persist-credentials: false + + - name: Install rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + profile: minimal + override: true + + - if: ${{ !matrix.os }} + name: Install system dependencies + uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: xorg-dev libxcb-shape0-dev libxcb-xfixes0-dev fontconfig libfontconfig-dev libfreetype6-dev libfontconfig1-dev pkgconf + version: 1.0 + + - name: Upload binary + uses: taiki-e/upload-rust-binary-action@v1 + with: + bin: jp2gmd + target: ${{ matrix.target }} + ref: refs/tags/${{ github.ref_name }} + tar: all + zip: windows + include: assets + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CARGO_PROFILE_RELEASE_CODEGEN_UNITS: 1 + CARGO_PROFILE_RELEASE_LTO: true diff --git a/.github/workflows/rust-checks.yml b/.github/workflows/rust-checks.yml new file mode 100644 index 0000000..e0983f2 --- /dev/null +++ b/.github/workflows/rust-checks.yml @@ -0,0 +1,44 @@ +name: Rust Code Quality and Tests + +on: + pull_request: + branches: [ "main" ] + +env: + CARGO_TERM_COLOR: always + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: xorg-dev libxcb-shape0-dev libxcb-xfixes0-dev + version: 1.0 + - uses: actions/checkout@v3 + - name: Rust cache + uses: Swatinem/rust-cache@v2 + with: + shared-key: 'kolezanka' + - name: Build + run: cargo build --verbose + + checks: + needs: build + runs-on: ubuntu-latest + steps: + - uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: xorg-dev libxcb-shape0-dev libxcb-xfixes0-dev + version: 1.0 + - uses: actions/checkout@v3 + - name: Rust cache + uses: Swatinem/rust-cache@v2 + with: + shared-key: 'kolezanka' + - name: Tests + run: cargo test --verbose + - name: Code Format + run: cargo fmt --check + - name: Code Lint + run: cargo clippy -- -D warnings diff --git a/.github/workflows/rust-format.yml b/.github/workflows/rust-format.yml new file mode 100644 index 0000000..82e0faf --- /dev/null +++ b/.github/workflows/rust-format.yml @@ -0,0 +1,30 @@ +name: Format Rust Code + +on: + workflow_dispatch: + push: + branches: [ "main" ] + +jobs: + format: + runs-on: ubuntu-latest + steps: + - uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: xorg-dev libxcb-shape0-dev libxcb-xfixes0-dev + version: 1.0 + - uses: actions/checkout@v3 + - name: Format code + run: cargo fmt + - name: Setup committer + run: | + git config --local user.name "Matrix Busters Automatic Agent" + git config --local user.email "matrix-busters@jnp3.mimuw.edu.pl" + - name: Commit changes + run: | + if [[ `git status --porcelain` ]]; then + git diff + git commit -am "Rust code reformatted automatically" + fi + - name: Create Pull Request + uses: peter-evans/create-pull-request@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f2f264b --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/target +/.idea +/.fleet +/out +project-matrix-busters.iml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..fff569f --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,9 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: +- repo: https://github.com/doublify/pre-commit-rust + rev: v1.0 + hooks: + - id: fmt + - id: clippy + - id: cargo-check diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..fa97cd4 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,3489 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ab_glyph" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e08104bebc65a46f8bc7aa733d39ea6874bfa7156f41a46b805785e3af1587d" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + +[[package]] +name = "accesskit" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4803cf8c252f374ae6bfbb341e49e5a37f7601f2ce74a105927a663eba952c67" + +[[package]] +name = "accesskit_consumer" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee8cf1202a4f94d31837f1902ab0a75c77b65bf59719e093703abe83efd74ec" +dependencies = [ + "accesskit", + "parking_lot", +] + +[[package]] +name = "accesskit_macos" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10be25f2b27bc33aa1647072e86b948b41596f1af1ae43a2b4b9be5d2011cbda" +dependencies = [ + "accesskit", + "accesskit_consumer", + "objc2", + "once_cell", + "parking_lot", +] + +[[package]] +name = "accesskit_unix" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630e7ee8f93c6246478bf0df6760db899b28d9ad54353a5f2d3157138ba817fc" +dependencies = [ + "accesskit", + "accesskit_consumer", + "async-channel 1.9.0", + "atspi", + "futures-lite 1.13.0", + "parking_lot", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13c462fabdd950ef14308a9390b07fa2e2e3aabccba1f3ea36ea2231bb942ab" +dependencies = [ + "accesskit", + "accesskit_consumer", + "arrayvec", + "once_cell", + "parking_lot", + "paste", + "windows", +] + +[[package]] +name = "accesskit_winit" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17727888757ec027ec221db33070e226ee07df44425b583bc67684204d35eff9" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_unix", + "accesskit_windows", + "parking_lot", + "winit", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[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.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-activity" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" +dependencies = [ + "android-properties", + "bitflags 1.3.2", + "cc", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum 0.6.1", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" + +[[package]] +name = "arboard" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2041f1943049c7978768d84e6d0fd95de98b76d6c4727b09e78ec253d29fa58" +dependencies = [ + "clipboard-win", + "core-graphics 0.23.2", + "image", + "log", + "objc", + "objc-foundation", + "objc_id", + "parking_lot", + "thiserror", + "windows-sys 0.48.0", + "x11rb", +] + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "assets" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "async-broadcast" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +dependencies = [ + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" +dependencies = [ + "concurrent-queue", + "event-listener 5.3.0", + "event-listener-strategy 0.5.1", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f98c37cf288e302c16ef6c8472aad1e034c6c84ce5ea7b8101c98eb4a802fee" +dependencies = [ + "async-lock 3.3.0", + "async-task", + "concurrent-queue", + "fastrand 2.0.2", + "futures-lite 2.3.0", + "slab", +] + +[[package]] +name = "async-fs" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "blocking", + "futures-lite 1.13.0", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.27", + "slab", + "socket2", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +dependencies = [ + "async-lock 3.3.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.3.0", + "parking", + "polling 3.6.0", + "rustix 0.38.32", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +dependencies = [ + "event-listener 4.0.3", + "event-listener-strategy 0.4.0", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +dependencies = [ + "async-io 1.13.0", + "async-lock 2.8.0", + "async-signal", + "blocking", + "cfg-if", + "event-listener 3.1.0", + "futures-lite 1.13.0", + "rustix 0.38.32", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-recursion" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c5ef0ede93efbf733c1a727f3b6b5a1060bbedd5600183e66f6e4be4af0ec5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "async-signal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +dependencies = [ + "async-io 2.3.2", + "async-lock 2.8.0", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 0.38.32", + "signal-hook-registry", + "slab", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-task" +version = "4.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" + +[[package]] +name = "async-trait" +version = "0.1.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atomic_refcell" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" + +[[package]] +name = "atspi" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab84c09a770065868da0d713f1f4b35af85d96530a868f1c1a6c249178379187" +dependencies = [ + "async-recursion", + "async-trait", + "atspi-macros", + "enumflags2", + "futures-lite 1.13.0", + "serde", + "tracing", + "zbus", + "zbus_names", +] + +[[package]] +name = "atspi-macros" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3ebc5a6f61f6996eca56a4cece7b3fe7da3b86f0473c7b71ab44e229f3acce4" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", + "zbus", + "zbus_names", + "zvariant", +] + +[[package]] +name = "autocfg" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-sys" +version = "0.1.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" +dependencies = [ + "objc-sys", +] + +[[package]] +name = "block2" +version = "0.2.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" +dependencies = [ + "block-sys", + "objc2-encode", +] + +[[package]] +name = "blocking" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +dependencies = [ + "async-channel 2.2.0", + "async-lock 3.3.0", + "async-task", + "fastrand 2.0.2", + "futures-io", + "futures-lite 2.3.0", + "piper", + "tracing", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + +[[package]] +name = "calloop" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e0d00eb1ea24371a97d2da6201c6747a633dc6dc1988ef503403b4c59504a8" +dependencies = [ + "bitflags 1.3.2", + "log", + "nix 0.25.1", + "slotmap", + "thiserror", + "vec_map", +] + +[[package]] +name = "cc" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2678b2e3449475e95b0aa6f9b506a28e61b3dc8996592b983695e8ebb58a8b41" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "chrono" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets 0.52.4", +] + +[[package]] +name = "clap" +version = "4.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "clap_lex" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" + +[[package]] +name = "clipboard-win" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d517d4b86184dbb111d3556a10f1c8a04da7428d2987bf1081602bf11c3aa9ee" +dependencies = [ + "error-code", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.3.2", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.3", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "ecolor" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f99fe3cac305af9d6d92971af60d0f7ea4d783201ef1673571567b6699964d9" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "eframe" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df3ce60931e5f2d83bab4484d1a283908534d5308cc6b0c5c22c59cd15ee7cc" +dependencies = [ + "bytemuck", + "egui", + "egui-winit", + "egui_glow", + "glow", + "glutin", + "glutin-winit", + "js-sys", + "percent-encoding", + "raw-window-handle", + "thiserror", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winit", +] + +[[package]] +name = "egui" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6412a21e0bde7c0918f7fb44bbbb86b5e1f88e63c026a4e747cc7af02f76dfbe" +dependencies = [ + "accesskit", + "ahash", + "epaint", + "nohash-hasher", + "tracing", +] + +[[package]] +name = "egui-toast" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75eb34993b081ac9d09b59db1fbd6a66756d6725944ba6b9e3c525e15b5e54e" +dependencies = [ + "egui", +] + +[[package]] +name = "egui-winit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab43597ba41f0ce39a364ad83185594578bfd8b3409b99dbcbb01df23afc3dbb" +dependencies = [ + "accesskit_winit", + "android-activity", + "arboard", + "egui", + "instant", + "smithay-clipboard", + "tracing", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_glow" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8257332fb168a965b3dca81d6a344e053153773c889cabdba0b3b76f1629ae81" +dependencies = [ + "bytemuck", + "egui", + "glow", + "memoffset 0.6.5", + "tracing", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + +[[package]] +name = "emath" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8ecd80612937e0267909d5351770fe150004e24dab93954f69ca62eecd3f77e" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "enumflags2" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "epaint" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12e78b5c58a1f7f621f9d546add2adce20636422c9b251e29f749e8a2f713c95" +dependencies = [ + "ab_glyph", + "ahash", + "atomic_refcell", + "bytemuck", + "ecolor", + "emath", + "nohash-hasher", + "parking_lot", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "error-code" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332f51cb23d20b0de8458b86580878211da09bcd4503cb579c225b3d124cabb3" +dependencies = [ + "event-listener 5.3.0", + "pin-project-lite", +] + +[[package]] +name = "exr" +version = "1.72.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" +dependencies = [ + "bit_field", + "flume", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" + +[[package]] +name = "fdeflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "spin", +] + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand 2.0.2", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + +[[package]] +name = "getrandom" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glow" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin" +version = "0.30.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc93b03242719b8ad39fb26ed2b01737144ce7bd4bfc7adadcef806596760fe" +dependencies = [ + "bitflags 1.3.2", + "cfg_aliases", + "cgl", + "core-foundation", + "dispatch", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading 0.7.4", + "objc2", + "once_cell", + "raw-window-handle", + "wayland-sys 0.30.1", + "windows-sys 0.45.0", + "x11-dl", +] + +[[package]] +name = "glutin-winit" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "629a873fc04062830bfe8f97c03773bcd7b371e23bcc465d0a61448cd1588fa4" +dependencies = [ + "cfg_aliases", + "glutin", + "raw-window-handle", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af784eb26c5a68ec85391268e074f0aa618c096eadb5d6330b0911cf34fe57c5" +dependencies = [ + "gl_generator", + "windows-sys 0.45.0", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b53cb5fe568964aa066a3ba91eac5ecbac869fb0842cd0dc9e412434f1a1494" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef89398e90033fc6bc65e9bd42fd29bbbfd483bda5b56dc5562f455550618165" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "jpeg-decoder", + "num-traits", + "png", + "qoi", + "tiff", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +dependencies = [ + "libc", +] + +[[package]] +name = "jp2gmd" +version = "0.1.0" +dependencies = [ + "anyhow", + "arboard", + "chrono", + "clap", + "eframe", + "egui", + "egui-toast", + "image", + "itertools", + "lazy_static", + "num-rational", + "num-traits", + "serde", + "serde_json", + "time", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +dependencies = [ + "rayon", +] + +[[package]] +name = "js-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +dependencies = [ + "cfg-if", + "windows-targets 0.52.4", +] + +[[package]] +name = "libredox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.5.0", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "ndk" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum 0.5.11", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.4.1+23.1.7779620" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc-sys" +version = "0.2.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" + +[[package]] +name = "objc2" +version = "0.3.0-beta.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe31e5425d3d0b89a15982c024392815da40689aceb34bad364d58732bcfd649" +dependencies = [ + "block2", + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-encode" +version = "2.0.0-pre.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" +dependencies = [ + "objc-sys", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "orbclient" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +dependencies = [ + "libredox", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand 2.0.2", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "png" +version = "0.17.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c976a60b2d7e99d6f229e414670a9b85d13ac305cc6d1e9c134de58c5aaaf6" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 0.38.32", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys 0.4.13", + "windows-sys 0.52.0", +] + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sctk-adwaita" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda4e97be1fd174ccc2aae81c8b694e803fa99b34e8fd0f057a9d70698e3ed09" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit", + "tiny-skia", +] + +[[package]] +name = "serde" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-xml-rs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0bf1ba0696ccf0872866277143ff1fd14d22eec235d2b23702f95e6660f7dfa" +dependencies = [ + "log", + "serde", + "thiserror", + "xml-rs", +] + +[[package]] +name = "serde_derive" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "serde_json" +version = "1.0.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smithay-client-toolkit" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" +dependencies = [ + "bitflags 1.3.2", + "calloop", + "dlib", + "lazy_static", + "log", + "memmap2", + "nix 0.24.3", + "pkg-config", + "wayland-client", + "wayland-cursor", + "wayland-protocols", +] + +[[package]] +name = "smithay-clipboard" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" +dependencies = [ + "smithay-client-toolkit", + "wayland-client", +] + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand 2.0.2", + "rustix 0.38.32", + "windows-sys 0.52.0", +] + +[[package]] +name = "thiserror" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "time" +version = "0.3.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef89ece63debf11bc32d1ed8d078ac870cbeb44da02afb02a9ff135ae7ca0582" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "tiny-skia" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8493a203431061e901613751931f047d1971337153f96d0e5e363d6dbf6a67" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "png", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adbfb5d3f3dd57a0e11d12f4f13d4ebbbc1b5c15b7ab0a156d030b21da5f677c" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset 0.9.1", + "tempfile", + "winapi", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "waker-fn" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "wayland-client" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" +dependencies = [ + "bitflags 1.3.2", + "downcast-rs", + "libc", + "nix 0.24.3", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys 0.29.5", +] + +[[package]] +name = "wayland-commons" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +dependencies = [ + "nix 0.24.3", + "once_cell", + "smallvec", + "wayland-sys 0.29.5", +] + +[[package]] +name = "wayland-cursor" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +dependencies = [ + "nix 0.24.3", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +dependencies = [ + "bitflags 1.3.2", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +dependencies = [ + "dlib", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "wayland-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b2a02ac608e07132978689a6f9bf4214949c85998c247abadd4f4129b1aa06" +dependencies = [ + "dlib", + "lazy_static", + "log", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd595fb70f33583ac61644820ebc144a26c96028b625b96cafcd861f4743fbc8" +dependencies = [ + "core-foundation", + "home", + "jni", + "log", + "ndk-context", + "objc", + "raw-window-handle", + "url", + "web-sys", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0286ba339aa753e70765d521bb0242cc48e1194562bfa2a2ad7ac8a6de28f5d5" +dependencies = [ + "windows-implement", + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-implement" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9539b6bd3eadbd9de66c9666b22d802b833da7e996bc06896142e09854a61767" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.4", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + +[[package]] +name = "winit" +version = "0.28.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94" +dependencies = [ + "android-activity", + "bitflags 1.3.2", + "cfg_aliases", + "core-foundation", + "core-graphics 0.22.3", + "dispatch", + "instant", + "libc", + "log", + "mio", + "ndk", + "objc2", + "once_cell", + "orbclient", + "percent-encoding", + "raw-window-handle", + "redox_syscall 0.3.5", + "sctk-adwaita", + "smithay-client-toolkit", + "wasm-bindgen", + "wayland-client", + "wayland-commons", + "wayland-protocols", + "wayland-scanner", + "web-sys", + "windows-sys 0.45.0", + "x11-dl", +] + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a" +dependencies = [ + "gethostname", + "rustix 0.38.32", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e63e71c4b8bd9ffec2c963173a4dc4cbde9ee96961d4fcb4429db9929b606c34" + +[[package]] +name = "xcursor" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911" + +[[package]] +name = "xdg-home" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e5a325c3cb8398ad6cf859c1135b25dd29e186679cf2da7581d9679f63b38e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "xml-rs" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" + +[[package]] +name = "zbus" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io 1.13.0", + "async-lock 2.8.0", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "byteorder", + "derivative", + "enumflags2", + "event-listener 2.5.3", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.26.4", + "once_cell", + "ordered-stream", + "rand", + "serde", + "serde-xml-rs", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "winapi", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[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.58", +] + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zvariant" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" +dependencies = [ + "byteorder", + "enumflags2", + "libc", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..1393215 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,41 @@ +[workspace] +members = [ + "assets", +] + +[package] +name = "jp2gmd" +version = "0.1.0" +edition = "2021" +authors = ["Mieszko Grodzicki", "Aleksander Tudruj"] + +[[bin]] +name = "jp2gmd" +path = "src/main.rs" + +[lib] +name = "jp2gmd_lib" +path = "src/lib.rs" +doctest = true + +[features] +fft = [] +clock = [] +easter-eggs = ["clock", "fft"] + +[dependencies] +egui = "0.21" +eframe = "0.21" +num-rational = "0.4" +num-traits = "0.2" +anyhow = "1.0" +image = "0.24" +lazy_static = "1.4" +arboard = "3.2" +clap = { version = "4.1", features = ["derive"] } +chrono = "0.4" +time = "0.3" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +itertools = "0.10" +egui-toast = "0.7" diff --git a/GUIDE.md b/GUIDE.md new file mode 100644 index 0000000..1cba899 --- /dev/null +++ b/GUIDE.md @@ -0,0 +1,225 @@ +# Usage + +## Types + +### Scalar + +Scalars are 2x64-bit rational numbers - let's call this field $\hat{Q}$. They can be signed. Examples + +```matlab +10 +-45 +2/13 +-75/3 +``` + +Rational numbers are always normalized e.g. if number is in form $\frac{p}{q}$ it will be +displayed as $\frac{p/g}{q/g}$, where $g=\text{gcd}(p, q)$. Also if $q/g = 1$ the number is displayed as an integer. + +Scalars can be both added in *shell* or via *GUI editor*. + +### Matrix + +Matrices are 2D arrays of Scalars. More precisely matrix $A \in \hat{Q}^{N\times M}$ +is a matrix over field $\hat{Q}$ with width $N$ and height $M$. + +Currently, the only way to create a matrix is to use *GUI editor*. + +## Warning + +A matrix $M\in \hat{Q}^{1,1}$ is **not** a scalar. It is a matrix with one element. + +## Variables + +Variables are supported, and they are calculated during their initialization. Let's say +there is a variable called `x` and it stores the value $\frac{1}{3}$. Creating variable +`y = x` will result in copying the value of `x` into `y`, so later changes to `x` +will not apply to `y`. + +## Operations + +* **Addition** - both `Scalars` and `Matrices` support addition operation. + * For `Scalars` it is defined as $\hat{Q} \times \hat{Q} \to \hat{Q}$, and works as expected for rational numbers. + * For `Matrices` it is defined as $\hat{Q}^{N\times M} \times \hat{Q}^{N\times M} \to \hat{Q}^{N\times M}$ and works + element-wise. +* **Subtraction** - both `Scalars` and `Matrices` support subtraction operation. + * For both `Scalars` and `Matrices` it is defined as $\hat{Q} \times \hat{Q} \to \hat{Q}$ and works like addition. +* **Multiplication** - both `Scalars` and `Matrices` support multiplication operation. + * For `Scalars` it is defined as $\hat{Q} \times \hat{Q} \to \hat{Q}$, and works as expected for rational numbers. + * For `Matrices` it is defined as $\hat{Q}^{N\times M} \times \hat{Q}^{M\times K} \to \hat{Q}^{N\times K}$ and works as expected for matrices. + * For `Matrices` and `Scalars` it is defined as $\hat{Q}^{N\times M} \times \hat{Q} \to \hat{Q}^{N\times M}$ and works as expected for matrices and scalars. +* **Division** - only `Scalars` support division operation. + * For `Scalars` it is defined as $\hat{Q} \times \hat{Q} \to \hat{Q}$, and works as expected for rational numbers. +* **Inverse** - only `Matrices` support inverse operation. + * For `Matrices` it is defined as $\hat{Q}^{N\times N} \to \hat{Q}^{N\times N}$. Inverse $A^{-1}$ of matrix $A$ is + defined as $A^{-1}A = AA^{-1} = I$, where $I$ is identity matrix. +* **Echelon** - only `Matrices` support echelon operation. + * For `Matrices` it is defined as $\hat{Q}^{N\times M} \to \hat{Q}^{N\times M}$. Echelon form is + defined [here](https://en.wikipedia.org/wiki/Row_echelon_form). +* **Power** - both `Scalars` and `Matrices` support power operation. + * For `Scalars` it is defined as $\hat{Q} \times \mathbb{N} \to \hat{Q}$, and works as expected for rational numbers. + * For `Matrices` it is defined as $\hat{Q}^{N\times N} \times \mathbb{N} \to \hat{Q}^{N\times N}$. Power $A^k$ of + matrix $A$ is defined as $A^k = A \cdot A \cdot \dots \cdot A$ where $k$ is a positive integer. + +## Examples + +```matlab +x = 1/3 +y = 2/3 +M = [1 2; 5 3] % This syntax is not supported yet. +N = [6 7; 3 1] % Use GUI editor instead. +% Addition +z = x + y % z = 1 +P = M + N % P = [7 9; 8 4] +% Subtraction +z = x - y % z = -1/3 +P = M - N % P = [-5 -5; 2 2] +% Multiplication +z = x * y % z = 2/9 +P = M * N % P = [18 10; 36 22] +% Division +z = x / y % z = 1/2 +% Inverse (only in GUI) +P = inv(M) % P = 1/7 * [-3 2; 5 -1] +% Echelon (only in GUI) +P = echelon(M) % P = [1 0; 0 1] +% Power +z = x^2 % z = 1/9 +P = M^2 % P = [11 8; 20 19] +``` + +## Shell + +Shell is a command line interface for the calculator. It is used to input commands. +Supported commands are: + +* `x = ` - creates a variable `x` and assigns it the value of ``. +* `` - evaluates `` and stores it in special variable `$`. + Error messages are displayed as a popup notification toast. + +These are the rules expressed in BNF: +```bnf + ::= "0" | "1" | ... | "9" + ::= + + ::= "a" | "ą" | "b" | ... | "ż" + ::= ( | "_") ( | | "_")* | "$" + ::= "+" | "-" + ::= "+" | "-" | "*" | "/" + ::= | | | "(" ")" | +``` + +### Examples +```matlab +v = 1/3 + 4/15 - 4/19 * 2/3 - 4^5 * (3/4 - 2/3) +w = ((((4/3 + 5/2) * 14) - 44) / 2) ^ 2 +N = M^14 - Z * 4 * (M - Z) % where M, Z are square matrices +a = -v +very_simple_NAME_123 = 1/3 +``` + +## GUI + +GUI is a graphical user interface for the calculator. All objects created in current environment are displayed +on `Objects` list. Clicking on an object will open a new window with object's properties. In such window, +the value can be edited. If the value is edited, the object will be updated. +There are certain operations that can be performed on objects: + +* `Scalar` + * `Inverse` - calculates inverse of the scalar, copies its LaTeX representation to clipboard and stores the + numerical value in `$`. + * `LaTeX` - copies the scalar's LaTeX representation to clipboard. +* `Matrix` + * `Inverse` - calculates inverse of the matrix, copies its LaTeX representation to clipboard and stores the + numerical value in `$`. + * `LaTeX` - copies the matrix's LaTeX representation to clipboard. + If an error occurs during the operation, the error message will be displayed as a popup toast. + * `Echelon` - calculates echelon form of the matrix, stores the numerical value in `$` and copies *all* transitions + in LaTeX to clipboard. + +### Echelon LaTeX example + +Let's say we have a matrix + +```math +A = \begin{bmatrix} 1 & 2 & 3 \\ 11 & 67 & 2 \\ 8 & 1 & 34 \end{bmatrix}. +``` + +`Echelon` operation will result in LaTeX code representing this: + +```math +\left[\begin{array}{ccc} +1 & 2 & 3\\11 & 67 & 2\\8 & 1 & 34 +\end{array}\right] +\xrightarrow{\substack{w_{2} - 11w_{1}\\w_{3} - 8w_{1}}} \left[\begin{array}{ccc} +1 & 2 & 3\\0 & 45 & -31\\0 & -15 & 10 +\end{array}\right] +\xrightarrow{w_{2} : 45} \left[\begin{array}{ccc} +1 & 2 & 3\\0 & 1 & -\frac{31}{45}\\0 & -15 & 10 +\end{array}\right] +\xrightarrow{\substack{w_{1} - 2w_{2}\\w_{3} + 15w_{2}}} \left[\begin{array}{ccc} +1 & 0 & \frac{197}{45}\\0 & 1 & -\frac{31}{45}\\0 & 0 & -\frac{1}{3} +\end{array}\right] +\xrightarrow{w_{3} : \left(-\frac{1}{3}\right)} \left[\begin{array}{ccc} +1 & 0 & \frac{197}{45}\\0 & 1 & -\frac{31}{45}\\0 & 0 & 1 +\end{array}\right] +\xrightarrow{\substack{w_{1} - \frac{197}{45}w_{3}\\w_{2} + \frac{31}{45}w_{3}}} \left[\begin{array}{ccc} +1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1 +\end{array}\right] +``` + +This may not look useful, as it produced an identity matrix, but when we take a different matrix + +```math +B = \left[\begin{array}{cccc}1 & 4 & 0 & 15\\6 & 11 & 8 & 4\\-1 & 3 & 6 & -6\end{array}\right] +``` + +which represents a system of linear equations, we get a much more useful result: + +```math +\left[\begin{array}{cccc}1 & 4 & 0 & 15\\6 & 11 & 8 & 4\\-1 & 3 & 6 & -6\end{array}\right] +\xrightarrow{\substack{w_{2} - 6w_{1}\\w_{3} + w_{1}}} \left[\begin{array}{cccc}1 & 4 & 0 & 15\\0 & -13 & 8 & -86\\0 & 7 & 6 & 9\end{array}\right] +\xrightarrow{w_{2} : \left(-13\right)} \left[\begin{array}{cccc}1 & 4 & 0 & 15\\0 & 1 & -\frac{8}{13} & \frac{86}{13}\\0 & 7 & 6 & 9\end{array}\right] +\xrightarrow{\substack{w_{1} - 4w_{2}\\w_{3} - 7w_{2}}} \left[\begin{array}{cccc}1 & 0 & \frac{32}{13} & -\frac{149}{13}\\0 & 1 & -\frac{8}{13} & \frac{86}{13}\\0 & 0 & \frac{134}{13} & -\frac{485}{13}\end{array}\right] +\xrightarrow{w_{3} : \frac{134}{13}} \left[\begin{array}{cccc}1 & 0 & \frac{32}{13} & -\frac{149}{13}\\0 & 1 & -\frac{8}{13} & \frac{86}{13}\\0 & 0 & 1 & -\frac{485}{134}\end{array}\right] +\xrightarrow{\substack{w_{1} - \frac{32}{13}w_{3}\\w_{2} + \frac{8}{13}w_{3}}} \left[\begin{array}{cccc}1 & 0 & 0 & -\frac{171}{67}\\0 & 1 & 0 & \frac{294}{67}\\0 & 0 & 1 & -\frac{485}{134}\end{array}\right] +``` + +Producing a row echelon form is a very tedious task, but with this calculator, it is as easy as clicking a button. +It may be very useful for students, as it can be used to create LaTeX for their homework. + +Another useful application is to calculate the inverse of a matrix. Let's say we have a matrix +```math +Z = \left[\begin{array}{cc}1 & 2\\6 & 1\end{array}\right] +``` +If we produce a matrix +```math +Z' = \left[\begin{array}{cc|cc}1 & 2 & 1 & 0\\6 & 1 & 0 & 1\end{array}\right] +``` +and perform `Echelon` operation on it, we get +```math +\left[\begin{array}{cccc}1 & 2 & 1 & 0\\6 & 1 & 0 & 1\end{array}\right] +\xrightarrow{\substack{w_{2} - 6w_{1}}} \left[\begin{array}{cccc}1 & 2 & 1 & 0\\0 & -11 & -6 & 1\end{array}\right] +\xrightarrow{w_{2} : \left(-11\right)} \left[\begin{array}{cccc}1 & 2 & 1 & 0\\0 & 1 & \frac{6}{11} & -\frac{1}{11}\end{array}\right] +\xrightarrow{\substack{w_{1} - 2w_{2}}} \left[\begin{array}{cccc}1 & 0 & -\frac{1}{11} & \frac{2}{11}\\0 & 1 & \frac{6}{11} & -\frac{1}{11}\end{array}\right] +``` +and as surprising as it may seem, the inverse of `Z` is +```math +\left[\begin{array}{cc}-\frac{1}{11} & \frac{2}{11}\\\frac{6}{11} & -\frac{1}{11}\end{array}\right] +``` +We just inverted the matrix `Z` by performing elementary row operations on the augmented matrix and got all transformations in LaTeX. +Finally, the `Inverse` operation will also produce LaTeX code representing all the transformations. + + +## GUI editor + +GUI editor is a graphical interface for creating matrices and scalars. To open it click on `Add matrix` or `Add scalar` +button. +A new variable has to have a name and a value, that can be evaluated using existing environment variables. +If provided value is invalid, an error message will be displayed and new variable will not be created. + +## Features +If you get bored with plain background and want to spice things up, you can turn `fft` feature on. +It will draw an image of a Fourier transformed image provided in `assets/`. The other way to change +the background is to turn `clock` feature on. It will draw a fractal clock in the background. If both +`fft` and `clock` are turned on, `fft` will prioritize `clock` - only if image file is missing +the clock will be drawn. diff --git a/README.md b/README.md index 58e9e49..133e634 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,66 @@ -# Frobnicator (this is a template) +# Just Pure 2D Graphics Matrix Display ## Authors -- Andrzej Głuszak (@agluszak on GitHub) -- Linus Torvalds (@torvalds on GitHub) +- Mieszko Grodzicki [@mgr0dzicki][#MieszkoGH] +- Alek Tudruj [@tudny][#AlekGH] + +--- ## Description -Frobnicator is going to be a platformer game similar to Super Mario Bros made using Bevy game engine. +**Just Pure 2D Graphics Matrix Display** (*JP2GMD*) is a powerful matrix calculator. + +It allows you to perform basic operations on matrices, such as addition, subtraction, multiplication, and division. +It also allows you to perform more advanced operations, such as finding the determinant, the inverse, and the transpose of a matrix. + +One of its most powerful features is the ability to generate `LaTeX` code for the matrix you are working with and all the operations you perform on it. + +--- + +## Installation +Install dependencies if applicable: + +Ubuntu +```bash +sudo apt-get install libfontconfig libfontconfig1-dev cmake xorg-dev libxcb-shape0-dev libxcb-xfixes0-dev +``` -## Features -- map generator -- shooting -- enemy AI -- game state saving and loading -- scores +Run the program: +```bash +$ cargo run +``` +Check program help using +```bash +$ cargo run -- --help +``` + +# Usage +Check out [the guide](GUIDE.md). + +# Development ## Plan -In the first part we're going to implement the basics: movement, physics and shooting. The enemies will simply bounce from one edge of the platform to the other. There will be only a single map. +- [X] 1.1. Implement rational numbers representation. +- [X] 1.2. Implement matrix module for given any number representation. +- [X] 1.3. Implement basic operations on matrices. +- [X] 1.4. Implement `LaTeX` code generation. +- [X] 2.1. Implement GUI. +- [ ] ~~2.2. Extend the number representation module to allow for more sophisticated numbers.~~ +- [ ] ~~2.3. Implement complex operations on matrices.~~ + +and all other things added as GH Issues. +Issue marked [NITD] (Not Intended To be Developed) +are ideas taken into consideration when +developing more critical features. They are not +intended to be developed during the JNP3 project - +maybe in the future if time allows. -In the second part we're going to add random map generator, saving/loading, scores and a more sophisticated AI. +## GUI Preview +![gui.png](gui.png) ## Libraries -- Bevy -- Serde (for serialization) +- [egui](https://crates.io/crates/egui) - (https://github.com/emilk/egui) +- [num](https://docs.rs/num/latest/num/) + + +[#MieszkoGH]: https://github.com/mgr0dzicki +[#AlekGH]: https://github.com/tudny diff --git a/assets/Cargo.toml b/assets/Cargo.toml new file mode 100644 index 0000000..63bab16 --- /dev/null +++ b/assets/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "assets" +version = "0.1.0" +edition = "2021" +authors = ["Aleksander Tudruj"] + +[[bin]] +name = "dft" +path = "dft.rs" + +[dependencies] +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } diff --git a/assets/dft.rs b/assets/dft.rs new file mode 100644 index 0000000..42d0fba --- /dev/null +++ b/assets/dft.rs @@ -0,0 +1,115 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +struct DftMetadata { + height: u32, + width: u32, +} + +#[derive(Serialize, Deserialize)] +struct DftPoint { + re: f32, + im: f32, +} + +#[derive(Serialize, Deserialize)] +struct DftSource { + metadata: DftMetadata, + points: Vec, +} + +#[derive(Serialize, Deserialize)] +struct DftEpicycle { + re: f32, + im: f32, + freq: f32, + amp: f32, + phase: f32, +} + +#[derive(Serialize, Deserialize)] +struct DftResult { + metadata: DftMetadata, + epicycles: Vec, +} + +const MISSING_FILE: &str = "Missing file: "; +const INVALID_FILE: &str = "Invalid file: "; + +fn read_source(filename: &str) -> Result { + let file = std::fs::File::open(filename).map_err(|_| MISSING_FILE.to_string() + filename)?; + let reader = std::io::BufReader::new(file); + let source: DftSource = + serde_json::from_reader(reader).map_err(|_| INVALID_FILE.to_string() + filename)?; + Ok(source) +} + +fn dft_algorithm(source: DftSource) -> Result { + let DftSource { metadata, points } = source; + let n = points.len(); + let mut epicycles = Vec::with_capacity(n); + for k in 0..n { + let mut re = 0.; + let mut im = 0.; + for (i, point) in points.iter().enumerate() { + let angle = 2. * std::f32::consts::PI * k as f32 * i as f32 / n as f32; + re += point.re * angle.cos() + point.im * angle.sin(); + im += point.im * angle.cos() - point.re * angle.sin(); + } + re /= n as f32; + im /= n as f32; + let freq = k as f32; + let amp = (re * re + im * im).sqrt(); + let phase = im.atan2(re); + epicycles.push(DftEpicycle { + re, + im, + freq, + amp, + phase, + }); + } + Ok(DftResult { + metadata, + epicycles, + }) +} + +fn calculate_n(expected_points: usize, actual_points: usize) -> usize { + if actual_points < expected_points { + return actual_points; + } + return actual_points / expected_points; +} + +fn take_every_nth(source: Vec, n: usize) -> Vec { + source.into_iter().step_by(n).collect() +} + +fn save_result(result: DftResult, filename: &str) -> Result<(), String> { + let file = std::fs::File::create(filename).map_err(|_| MISSING_FILE.to_string() + filename)?; + let writer = std::io::BufWriter::new(file); + serde_json::to_writer_pretty(writer, &result) + .map_err(|_| INVALID_FILE.to_string() + filename)?; + Ok(()) +} + +fn main() -> Result<(), String> { + println!("Generating DFT data..."); + + const EXPECTED_POINTS: usize = 1000; + const SOURCE_FILE: &str = "assets/dft_source.json"; + const RESULT_FILE: &str = "assets/dft_result.json"; + + let source = read_source(SOURCE_FILE)?; + let number_of_points = source.points.len(); + let source = DftSource { + points: take_every_nth( + source.points, + calculate_n(EXPECTED_POINTS, number_of_points), + ), + ..source + }; + let result = dft_algorithm(source)?; + save_result(result, RESULT_FILE) +} diff --git a/assets/dft_result.json b/assets/dft_result.json new file mode 100644 index 0000000..dce8202 --- /dev/null +++ b/assets/dft_result.json @@ -0,0 +1,7113 @@ +{ + "metadata": { + "height": 800, + "width": 800 + }, + "epicycles": [ + { + "re": -1.879803, + "im": 79.24335, + "freq": 0.0, + "amp": 79.26564, + "phase": 1.5945138 + }, + { + "re": 23.700554, + "im": -87.805786, + "freq": 1.0, + "amp": 90.94818, + "phase": -1.307159 + }, + { + "re": -102.57039, + "im": 23.985806, + "freq": 2.0, + "amp": 105.33757, + "phase": 2.9118733 + }, + { + "re": 19.417248, + "im": 81.002785, + "freq": 3.0, + "amp": 83.29754, + "phase": 1.3355248 + }, + { + "re": 6.641316, + "im": 56.868675, + "freq": 4.0, + "amp": 57.25516, + "phase": 1.4545395 + }, + { + "re": 49.109325, + "im": -22.933617, + "freq": 5.0, + "amp": 54.200336, + "phase": -0.43689352 + }, + { + "re": 26.222347, + "im": 13.165003, + "freq": 6.0, + "amp": 29.341589, + "phase": 0.4652885 + }, + { + "re": -16.761253, + "im": -1.0173748, + "freq": 7.0, + "amp": 16.7921, + "phase": -3.080969 + }, + { + "re": 0.20778044, + "im": 2.3615942, + "freq": 8.0, + "amp": 2.370717, + "phase": 1.4830391 + }, + { + "re": -4.305301, + "im": 35.3308, + "freq": 9.0, + "amp": 35.592148, + "phase": 1.6920553 + }, + { + "re": -5.584786, + "im": -10.820705, + "freq": 10.0, + "amp": 12.176925, + "phase": -2.047257 + }, + { + "re": 3.159791, + "im": 26.199778, + "freq": 11.0, + "amp": 26.389631, + "phase": 1.4507723 + }, + { + "re": 18.69604, + "im": 3.4831078, + "freq": 12.0, + "amp": 19.017727, + "phase": 0.1841903 + }, + { + "re": -4.2724414, + "im": 6.816108, + "freq": 13.0, + "amp": 8.044445, + "phase": 2.1307 + }, + { + "re": 5.5469875, + "im": -5.5100617, + "freq": 14.0, + "amp": 7.818558, + "phase": -0.7820586 + }, + { + "re": -2.9174852, + "im": 5.0070906, + "freq": 15.0, + "amp": 5.7950563, + "phase": 2.0983763 + }, + { + "re": 7.162214, + "im": 22.239681, + "freq": 16.0, + "amp": 23.36452, + "phase": 1.259238 + }, + { + "re": -0.5632188, + "im": -2.4691355, + "freq": 17.0, + "amp": 2.532557, + "phase": -1.7950629 + }, + { + "re": 9.161129, + "im": 1.0208719, + "freq": 18.0, + "amp": 9.217834, + "phase": 0.11097731 + }, + { + "re": -5.332523, + "im": -0.79966307, + "freq": 19.0, + "amp": 5.392148, + "phase": -2.9927423 + }, + { + "re": 0.42700344, + "im": 2.8344266, + "freq": 20.0, + "amp": 2.86641, + "phase": 1.4212718 + }, + { + "re": 10.318708, + "im": 0.13205391, + "freq": 21.0, + "amp": 10.319553, + "phase": 0.012796825 + }, + { + "re": -1.9509548, + "im": 7.834047, + "freq": 22.0, + "amp": 8.073321, + "phase": 1.8148669 + }, + { + "re": 7.8945994, + "im": 3.0634534, + "freq": 23.0, + "amp": 8.4681425, + "phase": 0.37015733 + }, + { + "re": 3.964319, + "im": 4.2492223, + "freq": 24.0, + "amp": 5.8113437, + "phase": 0.8200713 + }, + { + "re": 5.2294164, + "im": 1.4783813, + "freq": 25.0, + "amp": 5.434373, + "phase": 0.27551514 + }, + { + "re": -3.4267898, + "im": 6.017219, + "freq": 26.0, + "amp": 6.9245806, + "phase": 2.0884852 + }, + { + "re": 0.247999, + "im": 1.866811, + "freq": 27.0, + "amp": 1.8832119, + "phase": 1.4387233 + }, + { + "re": 6.1609015, + "im": 5.008719, + "freq": 28.0, + "amp": 7.9400234, + "phase": 0.6826085 + }, + { + "re": 4.5275187, + "im": -1.4573798, + "freq": 29.0, + "amp": 4.7562995, + "phase": -0.3114198 + }, + { + "re": -4.7233334, + "im": 6.387201, + "freq": 30.0, + "amp": 7.9439416, + "phase": 2.2075434 + }, + { + "re": 2.5762143, + "im": 2.1760445, + "freq": 31.0, + "amp": 3.372247, + "phase": 0.7013901 + }, + { + "re": 2.691163, + "im": 0.80221033, + "freq": 32.0, + "amp": 2.8081844, + "phase": 0.2897041 + }, + { + "re": 1.9414302, + "im": 0.9516719, + "freq": 33.0, + "amp": 2.1621356, + "phase": 0.45576978 + }, + { + "re": 3.5829587, + "im": 6.327919, + "freq": 34.0, + "amp": 7.271874, + "phase": 1.0555898 + }, + { + "re": 0.2739463, + "im": 0.08804671, + "freq": 35.0, + "amp": 0.2877478, + "phase": 0.3109736 + }, + { + "re": -1.6896436, + "im": 2.5946536, + "freq": 36.0, + "amp": 3.096308, + "phase": 2.148016 + }, + { + "re": 3.1030955, + "im": 5.185057, + "freq": 37.0, + "amp": 6.042683, + "phase": 1.0315033 + }, + { + "re": 2.9995277, + "im": 1.0695271, + "freq": 38.0, + "amp": 3.1845024, + "phase": 0.3425115 + }, + { + "re": -2.370281, + "im": 0.29860586, + "freq": 39.0, + "amp": 2.389016, + "phase": 3.0162737 + }, + { + "re": 3.4141836, + "im": 6.0373483, + "freq": 40.0, + "amp": 6.935865, + "phase": 1.0561229 + }, + { + "re": -1.0512666, + "im": 0.015479517, + "freq": 41.0, + "amp": 1.0513805, + "phase": 3.126869 + }, + { + "re": 0.9120619, + "im": -0.90595436, + "freq": 42.0, + "amp": 1.2855389, + "phase": -0.7820387 + }, + { + "re": 3.2477813, + "im": -0.030162217, + "freq": 43.0, + "amp": 3.2479215, + "phase": -0.009286755 + }, + { + "re": 3.859374, + "im": 2.2595594, + "freq": 44.0, + "amp": 4.472178, + "phase": 0.5296694 + }, + { + "re": 0.29019988, + "im": 0.66777664, + "freq": 45.0, + "amp": 0.7281082, + "phase": 1.1608425 + }, + { + "re": 2.118842, + "im": 2.7909343, + "freq": 46.0, + "amp": 3.5041125, + "phase": 0.92144126 + }, + { + "re": 1.7557806, + "im": 0.9574191, + "freq": 47.0, + "amp": 1.9998541, + "phase": 0.49922407 + }, + { + "re": 1.4670237, + "im": 1.4415518, + "freq": 48.0, + "amp": 2.0567524, + "phase": 0.77664083 + }, + { + "re": 1.6999589, + "im": 3.046371, + "freq": 49.0, + "amp": 3.4885867, + "phase": 1.0618109 + }, + { + "re": 0.24646412, + "im": 2.5208516, + "freq": 50.0, + "amp": 2.5328715, + "phase": 1.4733359 + }, + { + "re": -0.07578898, + "im": 2.1629581, + "freq": 51.0, + "amp": 2.1642857, + "phase": 1.6058215 + }, + { + "re": 2.6047165, + "im": 0.9753815, + "freq": 52.0, + "amp": 2.7813516, + "phase": 0.35830367 + }, + { + "re": -0.19145295, + "im": 0.3154354, + "freq": 53.0, + "amp": 0.36899015, + "phase": 2.1163092 + }, + { + "re": -0.1182263, + "im": 1.4194524, + "freq": 54.0, + "amp": 1.4243674, + "phase": 1.6538945 + }, + { + "re": 1.080965, + "im": 1.8599851, + "freq": 55.0, + "amp": 2.1512856, + "phase": 1.0443385 + }, + { + "re": 1.9262701, + "im": 1.0790749, + "freq": 56.0, + "amp": 2.207922, + "phase": 0.51063204 + }, + { + "re": -0.087295614, + "im": -0.48907676, + "freq": 57.0, + "amp": 0.4968064, + "phase": -1.7474269 + }, + { + "re": 1.0324075, + "im": 1.7055448, + "freq": 58.0, + "amp": 1.9936771, + "phase": 1.0264711 + }, + { + "re": 0.8158896, + "im": 1.1832701, + "freq": 59.0, + "amp": 1.4372905, + "phase": 0.96713793 + }, + { + "re": 1.3078762, + "im": 0.5896021, + "freq": 60.0, + "amp": 1.4346327, + "phase": 0.42352632 + }, + { + "re": 0.9687706, + "im": 0.88893074, + "freq": 61.0, + "amp": 1.3148059, + "phase": 0.7424468 + }, + { + "re": 0.90342975, + "im": 0.8218276, + "freq": 62.0, + "amp": 1.221305, + "phase": 0.73813486 + }, + { + "re": 1.5645087, + "im": 0.9083908, + "freq": 63.0, + "amp": 1.809105, + "phase": 0.5260503 + }, + { + "re": 0.5395027, + "im": 0.77325255, + "freq": 64.0, + "amp": 0.94285876, + "phase": 0.96161187 + }, + { + "re": 0.977844, + "im": 1.6655385, + "freq": 65.0, + "amp": 1.9313719, + "phase": 1.0399133 + }, + { + "re": 1.4434532, + "im": 1.8572652, + "freq": 66.0, + "amp": 2.3522313, + "phase": 0.91011775 + }, + { + "re": 0.6491068, + "im": 0.71828836, + "freq": 67.0, + "amp": 0.96813107, + "phase": 0.83594877 + }, + { + "re": -0.3533758, + "im": 1.7325763, + "freq": 68.0, + "amp": 1.7682463, + "phase": 1.7719964 + }, + { + "re": 1.0883384, + "im": 0.35439718, + "freq": 69.0, + "amp": 1.1445863, + "phase": 0.3148029 + }, + { + "re": -0.017506136, + "im": 1.0520859, + "freq": 70.0, + "amp": 1.0522316, + "phase": 1.5874342 + }, + { + "re": 1.8362223, + "im": 0.72164685, + "freq": 71.0, + "amp": 1.9729385, + "phase": 0.37446278 + }, + { + "re": 0.58162004, + "im": 1.0341506, + "freq": 72.0, + "amp": 1.1864861, + "phase": 1.0584728 + }, + { + "re": 0.9276812, + "im": 0.6016984, + "freq": 73.0, + "amp": 1.1057276, + "phase": 0.5753937 + }, + { + "re": 0.5913266, + "im": 1.1985476, + "freq": 74.0, + "amp": 1.3364818, + "phase": 1.1124673 + }, + { + "re": 0.17244807, + "im": 0.847351, + "freq": 75.0, + "amp": 0.8647208, + "phase": 1.370024 + }, + { + "re": 0.5395713, + "im": 1.2370955, + "freq": 76.0, + "amp": 1.3496453, + "phase": 1.1595113 + }, + { + "re": 0.65685374, + "im": 0.55994546, + "freq": 77.0, + "amp": 0.86313134, + "phase": 0.705924 + }, + { + "re": 0.124588385, + "im": 1.1790357, + "freq": 78.0, + "amp": 1.1856, + "phase": 1.4655173 + }, + { + "re": 0.925794, + "im": 1.381038, + "freq": 79.0, + "amp": 1.6626366, + "phase": 0.98024046 + }, + { + "re": 0.7440601, + "im": 1.1365331, + "freq": 80.0, + "amp": 1.3584304, + "phase": 0.9911415 + }, + { + "re": 0.48535717, + "im": 1.0098954, + "freq": 81.0, + "amp": 1.1204733, + "phase": 1.1227877 + }, + { + "re": 0.057819296, + "im": 1.4508481, + "freq": 82.0, + "amp": 1.4519998, + "phase": 1.5309653 + }, + { + "re": 0.4823723, + "im": 0.7479949, + "freq": 83.0, + "amp": 0.8900446, + "phase": 0.99802375 + }, + { + "re": 0.29468974, + "im": 0.74345386, + "freq": 84.0, + "amp": 0.7997285, + "phase": 1.1934152 + }, + { + "re": 0.08727827, + "im": 0.5803152, + "freq": 85.0, + "amp": 0.5868417, + "phase": 1.4215171 + }, + { + "re": 0.46258533, + "im": 0.65204483, + "freq": 86.0, + "amp": 0.7994671, + "phase": 0.95376426 + }, + { + "re": 1.1472265, + "im": 0.8423654, + "freq": 87.0, + "amp": 1.4232737, + "phase": 0.6333528 + }, + { + "re": 0.42835826, + "im": 0.90630805, + "freq": 88.0, + "amp": 1.0024396, + "phase": 1.1292746 + }, + { + "re": 0.034588147, + "im": 0.8422686, + "freq": 89.0, + "amp": 0.8429785, + "phase": 1.5297539 + }, + { + "re": 0.6723361, + "im": 0.49488905, + "freq": 90.0, + "amp": 0.83483595, + "phase": 0.63452864 + }, + { + "re": 0.7676791, + "im": 0.729842, + "freq": 91.0, + "amp": 1.0592452, + "phase": 0.7601371 + }, + { + "re": 1.0713917, + "im": 1.2841893, + "freq": 92.0, + "amp": 1.67243, + "phase": 0.87549126 + }, + { + "re": 0.3017908, + "im": 0.66859126, + "freq": 93.0, + "amp": 0.7335475, + "phase": 1.1467928 + }, + { + "re": 0.31517357, + "im": 0.61323786, + "freq": 94.0, + "amp": 0.68948895, + "phase": 1.0960511 + }, + { + "re": 0.4181278, + "im": 1.1665086, + "freq": 95.0, + "amp": 1.2391824, + "phase": 1.226619 + }, + { + "re": 0.62411106, + "im": 0.29400814, + "freq": 96.0, + "amp": 0.6898952, + "phase": 0.4402476 + }, + { + "re": 0.67103183, + "im": 0.93452835, + "freq": 97.0, + "amp": 1.1504899, + "phase": 0.94806314 + }, + { + "re": 0.5418825, + "im": 0.6098242, + "freq": 98.0, + "amp": 0.8157954, + "phase": 0.844322 + }, + { + "re": 0.0742625, + "im": 1.2210082, + "freq": 99.0, + "amp": 1.2232645, + "phase": 1.5100505 + }, + { + "re": 0.71964747, + "im": 0.7471125, + "freq": 100.0, + "amp": 1.0373378, + "phase": 0.80412096 + }, + { + "re": 0.1926941, + "im": 0.7620655, + "freq": 101.0, + "amp": 0.78605014, + "phase": 1.3231299 + }, + { + "re": 0.22844623, + "im": 0.6045689, + "freq": 102.0, + "amp": 0.64629036, + "phase": 1.2095151 + }, + { + "re": 0.36095336, + "im": 0.48550662, + "freq": 103.0, + "amp": 0.6049827, + "phase": 0.93149585 + }, + { + "re": 0.6938336, + "im": 0.5880071, + "freq": 104.0, + "amp": 0.90948194, + "phase": 0.7030268 + }, + { + "re": 0.4718111, + "im": 0.50240856, + "freq": 105.0, + "amp": 0.68921703, + "phase": 0.81679505 + }, + { + "re": 0.41465253, + "im": 0.8468476, + "freq": 106.0, + "amp": 0.94291437, + "phase": 1.1154691 + }, + { + "re": 0.3342497, + "im": 0.91357744, + "freq": 107.0, + "amp": 0.9728035, + "phase": 1.2200549 + }, + { + "re": 0.052741576, + "im": 0.3054727, + "freq": 108.0, + "amp": 0.30999234, + "phase": 1.3998263 + }, + { + "re": 0.45093706, + "im": 0.90468705, + "freq": 109.0, + "amp": 1.0108427, + "phase": 1.1083932 + }, + { + "re": 0.2048042, + "im": 0.49755102, + "freq": 110.0, + "amp": 0.5380537, + "phase": 1.1803092 + }, + { + "re": 0.39812028, + "im": 0.4807066, + "freq": 111.0, + "amp": 0.6241623, + "phase": 0.8790964 + }, + { + "re": 0.6848878, + "im": 0.9551653, + "freq": 112.0, + "amp": 1.1753349, + "phase": 0.94872814 + }, + { + "re": 0.09377778, + "im": 0.51740545, + "freq": 113.0, + "amp": 0.5258352, + "phase": 1.3914965 + }, + { + "re": 0.24093415, + "im": 0.9204775, + "freq": 114.0, + "amp": 0.9514873, + "phase": 1.3147906 + }, + { + "re": 0.3661817, + "im": 0.42770576, + "freq": 115.0, + "amp": 0.5630464, + "phase": 0.8627408 + }, + { + "re": 0.20906346, + "im": 0.92902696, + "freq": 116.0, + "amp": 0.9522598, + "phase": 1.3494487 + }, + { + "re": 0.31405857, + "im": 0.60934645, + "freq": 117.0, + "amp": 0.6855187, + "phase": 1.094903 + }, + { + "re": 0.28600353, + "im": 1.259923, + "freq": 118.0, + "amp": 1.2919768, + "phase": 1.3475783 + }, + { + "re": -0.0039700307, + "im": 0.40088686, + "freq": 119.0, + "amp": 0.40090653, + "phase": 1.5806991 + }, + { + "re": 0.16746235, + "im": 0.7654467, + "freq": 120.0, + "amp": 0.7835511, + "phase": 1.3554126 + }, + { + "re": 0.6503506, + "im": 0.5248704, + "freq": 121.0, + "amp": 0.83573014, + "phase": 0.6790296 + }, + { + "re": -0.014367701, + "im": 0.7444889, + "freq": 122.0, + "amp": 0.7446275, + "phase": 1.5900927 + }, + { + "re": 0.09413637, + "im": 0.6210634, + "freq": 123.0, + "amp": 0.62815714, + "phase": 1.4203684 + }, + { + "re": 0.36835855, + "im": 0.6800866, + "freq": 124.0, + "amp": 0.7734377, + "phase": 1.0743983 + }, + { + "re": 0.2652555, + "im": 0.77356756, + "freq": 125.0, + "amp": 0.8177819, + "phase": 1.2404616 + }, + { + "re": 0.21984662, + "im": 0.6366495, + "freq": 126.0, + "amp": 0.6735393, + "phase": 1.2382985 + }, + { + "re": 0.44066727, + "im": 0.524385, + "freq": 127.0, + "amp": 0.68495786, + "phase": 0.87193096 + }, + { + "re": 0.2766136, + "im": 0.4652721, + "freq": 128.0, + "amp": 0.54128844, + "phase": 1.034416 + }, + { + "re": 0.26398095, + "im": 0.30540913, + "freq": 129.0, + "amp": 0.40368387, + "phase": 0.85802907 + }, + { + "re": 0.37202927, + "im": 0.64998484, + "freq": 130.0, + "amp": 0.7489233, + "phase": 1.0509437 + }, + { + "re": 0.5973101, + "im": 0.7299925, + "freq": 131.0, + "amp": 0.9432224, + "phase": 0.8850311 + }, + { + "re": 0.1011475, + "im": 0.5712951, + "freq": 132.0, + "amp": 0.58018005, + "phase": 1.3955628 + }, + { + "re": 0.17191465, + "im": 0.57676923, + "freq": 133.0, + "amp": 0.60184497, + "phase": 1.2811158 + }, + { + "re": 0.19006781, + "im": 0.46943063, + "freq": 134.0, + "amp": 0.5064493, + "phase": 1.1860814 + }, + { + "re": 0.06841261, + "im": 0.6470062, + "freq": 135.0, + "amp": 0.650613, + "phase": 1.4654506 + }, + { + "re": 0.59265363, + "im": 0.41619942, + "freq": 136.0, + "amp": 0.7241963, + "phase": 0.61224395 + }, + { + "re": 0.30876037, + "im": 0.6921794, + "freq": 137.0, + "amp": 0.75792164, + "phase": 1.1512156 + }, + { + "re": 0.18073535, + "im": 0.336366, + "freq": 138.0, + "amp": 0.3818473, + "phase": 1.0777422 + }, + { + "re": 0.0676258, + "im": 0.70090824, + "freq": 139.0, + "amp": 0.7041631, + "phase": 1.4746109 + }, + { + "re": 0.34923652, + "im": 0.84261876, + "freq": 140.0, + "amp": 0.91212523, + "phase": 1.1778821 + }, + { + "re": 0.1265596, + "im": 0.47022903, + "freq": 141.0, + "amp": 0.4869627, + "phase": 1.307882 + }, + { + "re": 0.33284855, + "im": 0.58407235, + "freq": 142.0, + "amp": 0.6722564, + "phase": 1.0528218 + }, + { + "re": 0.15564407, + "im": 0.55247486, + "freq": 143.0, + "amp": 0.57398045, + "phase": 1.2961919 + }, + { + "re": 0.2487079, + "im": 0.27905306, + "freq": 144.0, + "amp": 0.37379974, + "phase": 0.8428328 + }, + { + "re": 0.29711938, + "im": 0.6470493, + "freq": 145.0, + "amp": 0.7120061, + "phase": 1.1403253 + }, + { + "re": 0.40024427, + "im": 0.5831611, + "freq": 146.0, + "amp": 0.70729935, + "phase": 0.96930003 + }, + { + "re": 0.26844522, + "im": 0.50783664, + "freq": 147.0, + "amp": 0.57442224, + "phase": 1.0845271 + }, + { + "re": 0.19532536, + "im": 0.6850119, + "freq": 148.0, + "amp": 0.71231544, + "phase": 1.2930262 + }, + { + "re": 0.12598091, + "im": 0.4983797, + "freq": 149.0, + "amp": 0.51405597, + "phase": 1.323202 + }, + { + "re": 0.07886538, + "im": 0.68700206, + "freq": 150.0, + "amp": 0.69151396, + "phase": 1.4565002 + }, + { + "re": 0.15576552, + "im": 0.57483345, + "freq": 151.0, + "amp": 0.59556395, + "phase": 1.306176 + }, + { + "re": 0.41950178, + "im": 0.4197178, + "freq": 152.0, + "amp": 0.5934179, + "phase": 0.78565556 + }, + { + "re": 0.033576038, + "im": 0.50430316, + "freq": 153.0, + "amp": 0.5054197, + "phase": 1.5043154 + }, + { + "re": 0.30120343, + "im": 0.5846389, + "freq": 154.0, + "amp": 0.6576672, + "phase": 1.0950662 + }, + { + "re": 0.34038007, + "im": 0.51217204, + "freq": 155.0, + "amp": 0.6149624, + "phase": 0.9842387 + }, + { + "re": 0.19141431, + "im": 0.50850105, + "freq": 156.0, + "amp": 0.54333484, + "phase": 1.2107738 + }, + { + "re": 0.21986182, + "im": 0.59810954, + "freq": 157.0, + "amp": 0.6372396, + "phase": 1.2185339 + }, + { + "re": 0.376596, + "im": 0.65876347, + "freq": 158.0, + "amp": 0.7588108, + "phase": 1.0514674 + }, + { + "re": 0.02800912, + "im": 0.43957055, + "freq": 159.0, + "amp": 0.44046202, + "phase": 1.507163 + }, + { + "re": 0.10606592, + "im": 0.6642148, + "freq": 160.0, + "amp": 0.67263013, + "phase": 1.4124471 + }, + { + "re": 0.07627445, + "im": 0.5803852, + "freq": 161.0, + "amp": 0.5853758, + "phase": 1.4401248 + }, + { + "re": 0.10663651, + "im": 0.6990388, + "freq": 162.0, + "amp": 0.7071256, + "phase": 1.4194161 + }, + { + "re": 0.17066668, + "im": 0.39324734, + "freq": 163.0, + "amp": 0.4286847, + "phase": 1.1613331 + }, + { + "re": 0.29492387, + "im": 0.37635994, + "freq": 164.0, + "amp": 0.47814944, + "phase": 0.90612215 + }, + { + "re": 0.03054338, + "im": 0.53159124, + "freq": 165.0, + "amp": 0.53246796, + "phase": 1.5134029 + }, + { + "re": 0.2810551, + "im": 0.6867876, + "freq": 166.0, + "amp": 0.74207085, + "phase": 1.1823572 + }, + { + "re": 0.12422937, + "im": 0.5523311, + "freq": 167.0, + "amp": 0.56612945, + "phase": 1.3495597 + }, + { + "re": 0.17471541, + "im": 0.46301326, + "freq": 168.0, + "amp": 0.49488056, + "phase": 1.209972 + }, + { + "re": 0.028712653, + "im": 0.57974875, + "freq": 169.0, + "amp": 0.58045936, + "phase": 1.5213107 + }, + { + "re": 0.07645049, + "im": 0.35677677, + "freq": 170.0, + "amp": 0.3648758, + "phase": 1.3597075 + }, + { + "re": 0.20873605, + "im": 0.5075692, + "freq": 171.0, + "amp": 0.54881436, + "phase": 1.1806325 + }, + { + "re": 0.24648744, + "im": 0.5347486, + "freq": 172.0, + "amp": 0.58882266, + "phase": 1.1388813 + }, + { + "re": 0.12354938, + "im": 0.31582606, + "freq": 173.0, + "amp": 0.33913207, + "phase": 1.197904 + }, + { + "re": 0.2416476, + "im": 0.54897314, + "freq": 174.0, + "amp": 0.5998042, + "phase": 1.1561377 + }, + { + "re": 0.07597144, + "im": 0.47968957, + "freq": 175.0, + "amp": 0.48566836, + "phase": 1.4137247 + }, + { + "re": 0.19007286, + "im": 0.5356654, + "freq": 176.0, + "amp": 0.56838816, + "phase": 1.2298206 + }, + { + "re": 0.1375825, + "im": 0.40471703, + "freq": 177.0, + "amp": 0.42746323, + "phase": 1.2431049 + }, + { + "re": 0.17772801, + "im": 0.4191496, + "freq": 178.0, + "amp": 0.45527315, + "phase": 1.1697557 + }, + { + "re": 0.14469938, + "im": 0.60657847, + "freq": 179.0, + "amp": 0.6235987, + "phase": 1.3366227 + }, + { + "re": 0.08718435, + "im": 0.4719831, + "freq": 180.0, + "amp": 0.4799679, + "phase": 1.388136 + }, + { + "re": 0.17170638, + "im": 0.442458, + "freq": 181.0, + "amp": 0.47460738, + "phase": 1.2006133 + }, + { + "re": 0.065896384, + "im": 0.43479428, + "freq": 182.0, + "amp": 0.4397595, + "phase": 1.4203835 + }, + { + "re": 0.14606968, + "im": 0.45982823, + "freq": 183.0, + "amp": 0.48247108, + "phase": 1.2632163 + }, + { + "re": 0.20879526, + "im": 0.42868578, + "freq": 184.0, + "amp": 0.47683012, + "phase": 1.117555 + }, + { + "re": 0.015824744, + "im": 0.50360805, + "freq": 185.0, + "amp": 0.5038566, + "phase": 1.5393839 + }, + { + "re": 0.13906446, + "im": 0.5698844, + "freq": 186.0, + "amp": 0.5866065, + "phase": 1.3314517 + }, + { + "re": 0.11602504, + "im": 0.4110832, + "freq": 187.0, + "amp": 0.42714307, + "phase": 1.2957096 + }, + { + "re": 0.075737745, + "im": 0.45108128, + "freq": 188.0, + "amp": 0.45739534, + "phase": 1.4044453 + }, + { + "re": 0.13725318, + "im": 0.52926767, + "freq": 189.0, + "amp": 0.5467748, + "phase": 1.3170592 + }, + { + "re": 0.12757798, + "im": 0.5301321, + "freq": 190.0, + "amp": 0.5452671, + "phase": 1.3346338 + }, + { + "re": 0.15812288, + "im": 0.5235128, + "freq": 191.0, + "amp": 0.54687154, + "phase": 1.2774671 + }, + { + "re": 0.1254014, + "im": 0.35160884, + "freq": 192.0, + "amp": 0.37330186, + "phase": 1.2282093 + }, + { + "re": 0.16418223, + "im": 0.46733662, + "freq": 193.0, + "amp": 0.4953376, + "phase": 1.2329508 + }, + { + "re": 0.10533719, + "im": 0.42165366, + "freq": 194.0, + "amp": 0.43461215, + "phase": 1.3259878 + }, + { + "re": 0.119766325, + "im": 0.45152783, + "freq": 195.0, + "amp": 0.4671417, + "phase": 1.31152 + }, + { + "re": 0.17436436, + "im": 0.38050976, + "freq": 196.0, + "amp": 0.41855776, + "phase": 1.1411121 + }, + { + "re": 0.019134974, + "im": 0.5161467, + "freq": 197.0, + "amp": 0.5165013, + "phase": 1.5337405 + }, + { + "re": 0.1445443, + "im": 0.45820516, + "freq": 198.0, + "amp": 0.48046333, + "phase": 1.2652192 + }, + { + "re": 0.08654935, + "im": 0.4013562, + "freq": 199.0, + "amp": 0.410582, + "phase": 1.3584064 + }, + { + "re": 0.0529396, + "im": 0.55244786, + "freq": 200.0, + "amp": 0.5549786, + "phase": 1.4752607 + }, + { + "re": 0.118788496, + "im": 0.33515728, + "freq": 201.0, + "amp": 0.35558558, + "phase": 1.2301838 + }, + { + "re": 0.09121927, + "im": 0.41958246, + "freq": 202.0, + "amp": 0.42938375, + "phase": 1.3567227 + }, + { + "re": 0.096057035, + "im": 0.37757403, + "freq": 203.0, + "amp": 0.3896012, + "phase": 1.3216753 + }, + { + "re": 0.028407965, + "im": 0.36456406, + "freq": 204.0, + "amp": 0.36566922, + "phase": 1.4930303 + }, + { + "re": 0.16942479, + "im": 0.41839015, + "freq": 205.0, + "amp": 0.45139238, + "phase": 1.1860347 + }, + { + "re": 0.1290736, + "im": 0.5114224, + "freq": 206.0, + "amp": 0.5274589, + "phase": 1.3235774 + }, + { + "re": 0.0240641, + "im": 0.45751005, + "freq": 207.0, + "amp": 0.45814246, + "phase": 1.5182468 + }, + { + "re": 0.0118010705, + "im": 0.42456904, + "freq": 208.0, + "amp": 0.424733, + "phase": 1.5430081 + }, + { + "re": -0.03027468, + "im": 0.4753942, + "freq": 209.0, + "amp": 0.47635722, + "phase": 1.6343937 + }, + { + "re": 0.11722769, + "im": 0.33978125, + "freq": 210.0, + "amp": 0.35943517, + "phase": 1.2385745 + }, + { + "re": 0.04946739, + "im": 0.4242726, + "freq": 211.0, + "amp": 0.42714664, + "phase": 1.4547269 + }, + { + "re": 0.14063314, + "im": 0.47697568, + "freq": 212.0, + "amp": 0.49727607, + "phase": 1.284077 + }, + { + "re": 0.08384288, + "im": 0.31556153, + "freq": 213.0, + "amp": 0.3265099, + "phase": 1.311102 + }, + { + "re": 0.14379334, + "im": 0.53448707, + "freq": 214.0, + "amp": 0.5534916, + "phase": 1.3079883 + }, + { + "re": -0.010638619, + "im": 0.48773617, + "freq": 215.0, + "amp": 0.48785216, + "phase": 1.5926051 + }, + { + "re": 0.035184152, + "im": 0.40759978, + "freq": 216.0, + "amp": 0.40911552, + "phase": 1.4846895 + }, + { + "re": -0.0007803762, + "im": 0.45085642, + "freq": 217.0, + "amp": 0.4508571, + "phase": 1.5725272 + }, + { + "re": -0.019166822, + "im": 0.3677358, + "freq": 218.0, + "amp": 0.36823496, + "phase": 1.6228703 + }, + { + "re": 0.107521445, + "im": 0.46002167, + "freq": 219.0, + "amp": 0.47242016, + "phase": 1.341187 + }, + { + "re": 0.029946346, + "im": 0.34832516, + "freq": 220.0, + "amp": 0.34961006, + "phase": 1.4850348 + }, + { + "re": 0.16049604, + "im": 0.3758825, + "freq": 221.0, + "amp": 0.4087134, + "phase": 1.1672459 + }, + { + "re": -0.010640069, + "im": 0.30736306, + "freq": 222.0, + "amp": 0.30754718, + "phase": 1.6053997 + }, + { + "re": 0.07388435, + "im": 0.4766952, + "freq": 223.0, + "amp": 0.482387, + "phase": 1.417027 + }, + { + "re": 0.10080082, + "im": 0.43235573, + "freq": 224.0, + "amp": 0.44395077, + "phase": 1.3417447 + }, + { + "re": 0.036013998, + "im": 0.4648211, + "freq": 225.0, + "amp": 0.46621418, + "phase": 1.4934715 + }, + { + "re": 0.04150396, + "im": 0.3615992, + "freq": 226.0, + "amp": 0.3639733, + "phase": 1.4565176 + }, + { + "re": -0.005196792, + "im": 0.44984823, + "freq": 227.0, + "amp": 0.44987825, + "phase": 1.5823481 + }, + { + "re": -0.0030511152, + "im": 0.46365193, + "freq": 228.0, + "amp": 0.46366197, + "phase": 1.5773768 + }, + { + "re": 0.085662074, + "im": 0.34296837, + "freq": 229.0, + "amp": 0.3535043, + "phase": 1.3260373 + }, + { + "re": 0.061204888, + "im": 0.3377067, + "freq": 230.0, + "amp": 0.3432082, + "phase": 1.3915057 + }, + { + "re": 0.06690922, + "im": 0.44313625, + "freq": 231.0, + "amp": 0.4481591, + "phase": 1.4209381 + }, + { + "re": 0.025574865, + "im": 0.4332555, + "freq": 232.0, + "amp": 0.43400967, + "phase": 1.5118352 + }, + { + "re": 0.08852915, + "im": 0.35513887, + "freq": 233.0, + "amp": 0.36600688, + "phase": 1.326495 + }, + { + "re": -0.07673745, + "im": 0.42657554, + "freq": 234.0, + "amp": 0.4334228, + "phase": 1.7487844 + }, + { + "re": -0.020602563, + "im": 0.42681208, + "freq": 235.0, + "amp": 0.42730904, + "phase": 1.6190296 + }, + { + "re": 0.030292396, + "im": 0.29858038, + "freq": 236.0, + "amp": 0.3001131, + "phase": 1.4696876 + }, + { + "re": -0.06741867, + "im": 0.4226642, + "freq": 237.0, + "amp": 0.42800733, + "phase": 1.7289726 + }, + { + "re": 0.029681103, + "im": 0.42614126, + "freq": 238.0, + "amp": 0.42717367, + "phase": 1.5012578 + }, + { + "re": 0.107213974, + "im": 0.36173174, + "freq": 239.0, + "amp": 0.37728596, + "phase": 1.2826539 + }, + { + "re": 0.063774794, + "im": 0.40720412, + "freq": 240.0, + "amp": 0.41216794, + "phase": 1.415442 + }, + { + "re": -0.008831934, + "im": 0.3487178, + "freq": 241.0, + "amp": 0.34882963, + "phase": 1.5961177 + }, + { + "re": 0.14899257, + "im": 0.3954948, + "freq": 242.0, + "amp": 0.42262858, + "phase": 1.2105147 + }, + { + "re": 0.014167854, + "im": 0.4047359, + "freq": 243.0, + "amp": 0.4049838, + "phase": 1.5358055 + }, + { + "re": -0.010708158, + "im": 0.3377948, + "freq": 244.0, + "amp": 0.3379645, + "phase": 1.6024859 + }, + { + "re": -0.0006493827, + "im": 0.44402564, + "freq": 245.0, + "amp": 0.4440261, + "phase": 1.5722588 + }, + { + "re": -0.009518169, + "im": 0.39541, + "freq": 246.0, + "amp": 0.39552453, + "phase": 1.5948633 + }, + { + "re": -0.05074861, + "im": 0.41626105, + "freq": 247.0, + "amp": 0.41934317, + "phase": 1.6921129 + }, + { + "re": 0.07708742, + "im": 0.35654226, + "freq": 248.0, + "amp": 0.36478055, + "phase": 1.3578655 + }, + { + "re": 0.04722776, + "im": 0.49802843, + "freq": 249.0, + "amp": 0.5002627, + "phase": 1.4762496 + }, + { + "re": 0.0038205814, + "im": 0.30835924, + "freq": 250.0, + "amp": 0.3083829, + "phase": 1.558407 + }, + { + "re": 0.026113661, + "im": 0.41350284, + "freq": 251.0, + "amp": 0.41432658, + "phase": 1.5077277 + }, + { + "re": 0.042301252, + "im": 0.41058913, + "freq": 252.0, + "amp": 0.41276243, + "phase": 1.4681327 + }, + { + "re": -0.0452349, + "im": 0.39277533, + "freq": 253.0, + "amp": 0.39537153, + "phase": 1.6854585 + }, + { + "re": 0.047003437, + "im": 0.34473616, + "freq": 254.0, + "amp": 0.34792578, + "phase": 1.4352858 + }, + { + "re": 0.047124755, + "im": 0.39197597, + "freq": 255.0, + "amp": 0.39479858, + "phase": 1.451147 + }, + { + "re": -0.07098335, + "im": 0.34653306, + "freq": 256.0, + "amp": 0.3537284, + "phase": 1.77284 + }, + { + "re": 0.03742624, + "im": 0.34113595, + "freq": 257.0, + "amp": 0.34318283, + "phase": 1.4615227 + }, + { + "re": 0.013040475, + "im": 0.40382582, + "freq": 258.0, + "amp": 0.4040363, + "phase": 1.5385152 + }, + { + "re": -0.04209011, + "im": 0.39161804, + "freq": 259.0, + "amp": 0.39387342, + "phase": 1.6778628 + }, + { + "re": 0.014891496, + "im": 0.41642284, + "freq": 260.0, + "amp": 0.41668904, + "phase": 1.535051 + }, + { + "re": 0.07173359, + "im": 0.40444186, + "freq": 261.0, + "amp": 0.4107541, + "phase": 1.3952575 + }, + { + "re": -0.06492631, + "im": 0.3486877, + "freq": 262.0, + "amp": 0.3546809, + "phase": 1.75489 + }, + { + "re": 0.07369294, + "im": 0.35444275, + "freq": 263.0, + "amp": 0.36202255, + "phase": 1.3658047 + }, + { + "re": 0.046606604, + "im": 0.40635723, + "freq": 264.0, + "amp": 0.40902123, + "phase": 1.4566016 + }, + { + "re": 0.0058299643, + "im": 0.37690896, + "freq": 265.0, + "amp": 0.37695405, + "phase": 1.5553297 + }, + { + "re": 0.036331784, + "im": 0.4217502, + "freq": 266.0, + "amp": 0.42331222, + "phase": 1.4848632 + }, + { + "re": 0.051605545, + "im": 0.33283976, + "freq": 267.0, + "amp": 0.33681664, + "phase": 1.4169749 + }, + { + "re": 0.03673191, + "im": 0.41807076, + "freq": 268.0, + "amp": 0.4196813, + "phase": 1.4831609 + }, + { + "re": -0.07309311, + "im": 0.35112908, + "freq": 269.0, + "amp": 0.35865617, + "phase": 1.7760313 + }, + { + "re": -0.02500197, + "im": 0.34133488, + "freq": 270.0, + "amp": 0.3422493, + "phase": 1.6439134 + }, + { + "re": 0.016243191, + "im": 0.38224337, + "freq": 271.0, + "amp": 0.38258833, + "phase": 1.5283275 + }, + { + "re": 0.030972118, + "im": 0.3508672, + "freq": 272.0, + "amp": 0.35223156, + "phase": 1.4827515 + }, + { + "re": 0.062129576, + "im": 0.33085135, + "freq": 273.0, + "amp": 0.33663437, + "phase": 1.3851712 + }, + { + "re": -0.00022411745, + "im": 0.43891194, + "freq": 274.0, + "amp": 0.438912, + "phase": 1.571307 + }, + { + "re": -0.05463239, + "im": 0.27733457, + "freq": 275.0, + "amp": 0.2826644, + "phase": 1.7652968 + }, + { + "re": 0.0005105601, + "im": 0.31855786, + "freq": 276.0, + "amp": 0.31855828, + "phase": 1.5691936 + }, + { + "re": 0.013454961, + "im": 0.3854804, + "freq": 277.0, + "amp": 0.38571516, + "phase": 1.5359061 + }, + { + "re": 0.052535642, + "im": 0.300066, + "freq": 278.0, + "amp": 0.30463025, + "phase": 1.3974727 + }, + { + "re": 0.058909837, + "im": 0.31180933, + "freq": 279.0, + "amp": 0.31732544, + "phase": 1.3840683 + }, + { + "re": -0.031307977, + "im": 0.37510374, + "freq": 280.0, + "amp": 0.376408, + "phase": 1.6540681 + }, + { + "re": 0.013210501, + "im": 0.4114926, + "freq": 281.0, + "amp": 0.41170457, + "phase": 1.5387034 + }, + { + "re": 0.03402592, + "im": 0.2653691, + "freq": 282.0, + "amp": 0.26754162, + "phase": 1.443271 + }, + { + "re": -0.027801467, + "im": 0.32757476, + "freq": 283.0, + "amp": 0.3287524, + "phase": 1.655464 + }, + { + "re": -0.050166737, + "im": 0.34465012, + "freq": 284.0, + "amp": 0.34828207, + "phase": 1.7153397 + }, + { + "re": -0.052125752, + "im": 0.37312806, + "freq": 285.0, + "amp": 0.37675142, + "phase": 1.7095973 + }, + { + "re": 0.021738749, + "im": 0.31379485, + "freq": 286.0, + "amp": 0.31454694, + "phase": 1.5016298 + }, + { + "re": -0.084067546, + "im": 0.31971222, + "freq": 287.0, + "amp": 0.33058017, + "phase": 1.8279233 + }, + { + "re": 0.017002622, + "im": 0.31695783, + "freq": 288.0, + "amp": 0.31741354, + "phase": 1.5172045 + }, + { + "re": -0.008945715, + "im": 0.36616626, + "freq": 289.0, + "amp": 0.36627552, + "phase": 1.5952222 + }, + { + "re": -0.006757015, + "im": 0.32507527, + "freq": 290.0, + "amp": 0.32514548, + "phase": 1.5915793 + }, + { + "re": -0.042418562, + "im": 0.33728763, + "freq": 291.0, + "amp": 0.33994454, + "phase": 1.6959032 + }, + { + "re": -0.022711817, + "im": 0.34931365, + "freq": 292.0, + "amp": 0.3500512, + "phase": 1.6357234 + }, + { + "re": -0.10674974, + "im": 0.26227254, + "freq": 293.0, + "amp": 0.28316495, + "phase": 1.9573383 + }, + { + "re": 0.018435461, + "im": 0.3172021, + "freq": 294.0, + "amp": 0.31773737, + "phase": 1.5127426 + }, + { + "re": -0.0124861915, + "im": 0.30568498, + "freq": 295.0, + "amp": 0.30593988, + "phase": 1.6116202 + }, + { + "re": 0.010230743, + "im": 0.28794754, + "freq": 296.0, + "amp": 0.28812924, + "phase": 1.5352814 + }, + { + "re": 0.02102077, + "im": 0.30158734, + "freq": 297.0, + "amp": 0.30231902, + "phase": 1.5012084 + }, + { + "re": -0.008447357, + "im": 0.27888536, + "freq": 298.0, + "amp": 0.27901325, + "phase": 1.6010767 + }, + { + "re": 0.057560097, + "im": 0.36967376, + "freq": 299.0, + "amp": 0.37412813, + "phase": 1.4163315 + }, + { + "re": -0.0052682515, + "im": 0.44189304, + "freq": 300.0, + "amp": 0.44192445, + "phase": 1.5827178 + }, + { + "re": -0.030883309, + "im": 0.2976865, + "freq": 301.0, + "amp": 0.2992842, + "phase": 1.6741709 + }, + { + "re": -0.116292164, + "im": 0.28097978, + "freq": 302.0, + "amp": 0.30409458, + "phase": 1.9632114 + }, + { + "re": -0.018697273, + "im": 0.34817007, + "freq": 303.0, + "amp": 0.34867173, + "phase": 1.6244463 + }, + { + "re": -0.017919999, + "im": 0.27382132, + "freq": 304.0, + "amp": 0.2744071, + "phase": 1.6361473 + }, + { + "re": 0.042560212, + "im": 0.36700875, + "freq": 305.0, + "amp": 0.36946827, + "phase": 1.4553468 + }, + { + "re": -0.06668168, + "im": 0.35867178, + "freq": 306.0, + "amp": 0.36481762, + "phase": 1.7546105 + }, + { + "re": 0.029278193, + "im": 0.31938967, + "freq": 307.0, + "amp": 0.3207288, + "phase": 1.4793826 + }, + { + "re": -0.1259846, + "im": 0.35568312, + "freq": 308.0, + "amp": 0.3773362, + "phase": 1.911212 + }, + { + "re": -0.033758752, + "im": 0.3834355, + "freq": 309.0, + "amp": 0.38491872, + "phase": 1.6586127 + }, + { + "re": -0.023241479, + "im": 0.27069694, + "freq": 310.0, + "amp": 0.27169284, + "phase": 1.6564442 + }, + { + "re": -0.017248454, + "im": 0.2627656, + "freq": 311.0, + "amp": 0.2633311, + "phase": 1.6363442 + }, + { + "re": -0.017434435, + "im": 0.33416772, + "freq": 312.0, + "amp": 0.3346222, + "phase": 1.6229217 + }, + { + "re": -0.008436587, + "im": 0.30544367, + "freq": 313.0, + "amp": 0.30556017, + "phase": 1.59841 + }, + { + "re": -0.018076008, + "im": 0.38924992, + "freq": 314.0, + "amp": 0.3896694, + "phase": 1.617201 + }, + { + "re": -0.05927668, + "im": 0.2751758, + "freq": 315.0, + "amp": 0.2814879, + "phase": 1.7829679 + }, + { + "re": -0.10177434, + "im": 0.33466294, + "freq": 316.0, + "amp": 0.3497961, + "phase": 1.8660195 + }, + { + "re": -0.032691978, + "im": 0.29408726, + "freq": 317.0, + "amp": 0.29589877, + "phase": 1.6815059 + }, + { + "re": -0.06904084, + "im": 0.36377874, + "freq": 318.0, + "amp": 0.37027237, + "phase": 1.7583536 + }, + { + "re": -0.06202461, + "im": 0.30333793, + "freq": 319.0, + "amp": 0.3096142, + "phase": 1.7724897 + }, + { + "re": -0.0061986903, + "im": 0.3265073, + "freq": 320.0, + "amp": 0.32656613, + "phase": 1.5897789 + }, + { + "re": -0.024384564, + "im": 0.32295948, + "freq": 321.0, + "amp": 0.32387874, + "phase": 1.6461568 + }, + { + "re": 0.0047483356, + "im": 0.29524943, + "freq": 322.0, + "amp": 0.2952876, + "phase": 1.5547153 + }, + { + "re": -0.07652661, + "im": 0.3447912, + "freq": 323.0, + "amp": 0.35318166, + "phase": 1.7892064 + }, + { + "re": -0.08010384, + "im": 0.2954139, + "freq": 324.0, + "amp": 0.3060817, + "phase": 1.8355871 + }, + { + "re": -0.050109975, + "im": 0.3229983, + "freq": 325.0, + "amp": 0.32686222, + "phase": 1.7247094 + }, + { + "re": 0.023235232, + "im": 0.34556273, + "freq": 326.0, + "amp": 0.346343, + "phase": 1.5036585 + }, + { + "re": -0.046562217, + "im": 0.25025284, + "freq": 327.0, + "amp": 0.2545477, + "phase": 1.7547535 + }, + { + "re": -0.052822422, + "im": 0.3291201, + "freq": 328.0, + "amp": 0.33333203, + "phase": 1.729935 + }, + { + "re": -0.108135246, + "im": 0.291187, + "freq": 329.0, + "amp": 0.31061727, + "phase": 1.926372 + }, + { + "re": -0.03560572, + "im": 0.25108138, + "freq": 330.0, + "amp": 0.25359342, + "phase": 1.7116665 + }, + { + "re": -0.043431338, + "im": 0.34924772, + "freq": 331.0, + "amp": 0.35193786, + "phase": 1.694518 + }, + { + "re": -0.0549353, + "im": 0.3320939, + "freq": 332.0, + "amp": 0.33660695, + "phase": 1.7347327 + }, + { + "re": -0.10554348, + "im": 0.28488395, + "freq": 333.0, + "amp": 0.30380633, + "phase": 1.9255973 + }, + { + "re": -0.04139473, + "im": 0.341614, + "freq": 334.0, + "amp": 0.34411284, + "phase": 1.6913824 + }, + { + "re": -0.09552743, + "im": 0.26550505, + "freq": 335.0, + "amp": 0.28216738, + "phase": 1.9161705 + }, + { + "re": -0.06519849, + "im": 0.233246, + "freq": 336.0, + "amp": 0.242187, + "phase": 1.843366 + }, + { + "re": -0.041634794, + "im": 0.32966518, + "freq": 337.0, + "amp": 0.3322839, + "phase": 1.6964253 + }, + { + "re": -0.04000619, + "im": 0.3136674, + "freq": 338.0, + "amp": 0.31620836, + "phase": 1.6976547 + }, + { + "re": -0.088201955, + "im": 0.2899548, + "freq": 339.0, + "amp": 0.30307323, + "phase": 1.8660946 + }, + { + "re": -0.06717022, + "im": 0.3115814, + "freq": 340.0, + "amp": 0.3187394, + "phase": 1.7831253 + }, + { + "re": -0.08334827, + "im": 0.2805651, + "freq": 341.0, + "amp": 0.29268366, + "phase": 1.8595654 + }, + { + "re": -0.0762499, + "im": 0.28564656, + "freq": 342.0, + "amp": 0.29564843, + "phase": 1.8316519 + }, + { + "re": -0.051383514, + "im": 0.2860595, + "freq": 343.0, + "amp": 0.29063776, + "phase": 1.7485262 + }, + { + "re": -0.066526, + "im": 0.25518906, + "freq": 344.0, + "amp": 0.26371798, + "phase": 1.8258134 + }, + { + "re": -0.07036911, + "im": 0.24516109, + "freq": 345.0, + "amp": 0.25506032, + "phase": 1.8503139 + }, + { + "re": -0.016568467, + "im": 0.31634474, + "freq": 346.0, + "amp": 0.31677833, + "phase": 1.6231232 + }, + { + "re": -0.013001936, + "im": 0.2967378, + "freq": 347.0, + "amp": 0.29702252, + "phase": 1.6145846 + }, + { + "re": -0.14884336, + "im": 0.24242458, + "freq": 348.0, + "amp": 0.28447148, + "phase": 2.1214304 + }, + { + "re": -0.050221484, + "im": 0.31947812, + "freq": 349.0, + "amp": 0.32340142, + "phase": 1.7267188 + }, + { + "re": -0.058422223, + "im": 0.3099039, + "freq": 350.0, + "amp": 0.3153626, + "phase": 1.7571267 + }, + { + "re": -0.13125467, + "im": 0.24843848, + "freq": 351.0, + "amp": 0.28097948, + "phase": 2.0568414 + }, + { + "re": -0.106881484, + "im": 0.31618983, + "freq": 352.0, + "amp": 0.33376586, + "phase": 1.8967674 + }, + { + "re": -0.02586987, + "im": 0.3333785, + "freq": 353.0, + "amp": 0.33438072, + "phase": 1.6482402 + }, + { + "re": -0.034886576, + "im": 0.24565017, + "freq": 354.0, + "amp": 0.24811506, + "phase": 1.7118702 + }, + { + "re": -0.026505478, + "im": 0.30975762, + "freq": 355.0, + "amp": 0.31088957, + "phase": 1.6561568 + }, + { + "re": -0.094664, + "im": 0.27956992, + "freq": 356.0, + "amp": 0.29516202, + "phase": 1.8972845 + }, + { + "re": -0.07820886, + "im": 0.3064323, + "freq": 357.0, + "amp": 0.31625524, + "phase": 1.8206855 + }, + { + "re": -0.055986542, + "im": 0.32651854, + "freq": 358.0, + "amp": 0.33128363, + "phase": 1.74061 + }, + { + "re": -0.0795565, + "im": 0.283872, + "freq": 359.0, + "amp": 0.29480937, + "phase": 1.8440412 + }, + { + "re": -0.035795614, + "im": 0.27367267, + "freq": 360.0, + "amp": 0.27600372, + "phase": 1.7008551 + }, + { + "re": -0.086620085, + "im": 0.23981588, + "freq": 361.0, + "amp": 0.2549798, + "phase": 1.9174086 + }, + { + "re": -0.040834103, + "im": 0.27539462, + "freq": 362.0, + "amp": 0.2784055, + "phase": 1.7179986 + }, + { + "re": -0.08941051, + "im": 0.250045, + "freq": 363.0, + "amp": 0.2655499, + "phase": 1.9142058 + }, + { + "re": -0.04972622, + "im": 0.26691452, + "freq": 364.0, + "amp": 0.27150702, + "phase": 1.754985 + }, + { + "re": -0.073994346, + "im": 0.2974355, + "freq": 365.0, + "amp": 0.30650127, + "phase": 1.8146211 + }, + { + "re": -0.07877894, + "im": 0.28744644, + "freq": 366.0, + "amp": 0.29804626, + "phase": 1.8382928 + }, + { + "re": -0.06715753, + "im": 0.27518007, + "freq": 367.0, + "amp": 0.28325644, + "phase": 1.8101666 + }, + { + "re": -0.10891229, + "im": 0.24465154, + "freq": 368.0, + "amp": 0.26779893, + "phase": 1.9896289 + }, + { + "re": -0.08893256, + "im": 0.22875333, + "freq": 369.0, + "amp": 0.24543244, + "phase": 1.9415848 + }, + { + "re": -0.10986189, + "im": 0.26248682, + "freq": 370.0, + "amp": 0.28455046, + "phase": 1.9671847 + }, + { + "re": -0.08310687, + "im": 0.22292852, + "freq": 371.0, + "amp": 0.2379157, + "phase": 1.9276333 + }, + { + "re": -0.072937205, + "im": 0.30061048, + "freq": 372.0, + "amp": 0.30933234, + "phase": 1.8088268 + }, + { + "re": -0.06837806, + "im": 0.21717982, + "freq": 373.0, + "amp": 0.22768977, + "phase": 1.8758165 + }, + { + "re": -0.07792602, + "im": 0.23321193, + "freq": 374.0, + "amp": 0.24588671, + "phase": 1.8932749 + }, + { + "re": -0.082213536, + "im": 0.21911325, + "freq": 375.0, + "amp": 0.23402923, + "phase": 1.9297513 + }, + { + "re": -0.1230517, + "im": 0.2584773, + "freq": 376.0, + "amp": 0.28627303, + "phase": 2.0151124 + }, + { + "re": -0.08811109, + "im": 0.24670729, + "freq": 377.0, + "amp": 0.26196957, + "phase": 1.913825 + }, + { + "re": -0.0965124, + "im": 0.28824216, + "freq": 378.0, + "amp": 0.3039707, + "phase": 1.8938941 + }, + { + "re": -0.08029029, + "im": 0.30299044, + "freq": 379.0, + "amp": 0.31344816, + "phase": 1.8298353 + }, + { + "re": -0.1477129, + "im": 0.2878529, + "freq": 380.0, + "amp": 0.32354042, + "phase": 2.0449119 + }, + { + "re": -0.09596317, + "im": 0.30364743, + "freq": 381.0, + "amp": 0.31845045, + "phase": 1.8768983 + }, + { + "re": -0.11969734, + "im": 0.22647911, + "freq": 382.0, + "amp": 0.2561645, + "phase": 2.056994 + }, + { + "re": -0.101007335, + "im": 0.23712943, + "freq": 383.0, + "amp": 0.2577457, + "phase": 1.9734787 + }, + { + "re": -0.117067486, + "im": 0.24768096, + "freq": 384.0, + "amp": 0.27395377, + "phase": 2.012329 + }, + { + "re": -0.13528277, + "im": 0.2830656, + "freq": 385.0, + "amp": 0.31373167, + "phase": 2.0166245 + }, + { + "re": -0.065628186, + "im": 0.2557177, + "freq": 386.0, + "amp": 0.26400492, + "phase": 1.8220174 + }, + { + "re": -0.16650043, + "im": 0.23159084, + "freq": 387.0, + "amp": 0.285231, + "phase": 2.1941223 + }, + { + "re": -0.07467407, + "im": 0.25871468, + "freq": 388.0, + "amp": 0.26927587, + "phase": 1.851794 + }, + { + "re": -0.09560446, + "im": 0.25730807, + "freq": 389.0, + "amp": 0.27449524, + "phase": 1.9265445 + }, + { + "re": -0.09136725, + "im": 0.2311145, + "freq": 390.0, + "amp": 0.2485194, + "phase": 1.9472731 + }, + { + "re": -0.06994184, + "im": 0.2426185, + "freq": 391.0, + "amp": 0.25249872, + "phase": 1.8514656 + }, + { + "re": -0.09994831, + "im": 0.3102404, + "freq": 392.0, + "amp": 0.32594287, + "phase": 1.8824611 + }, + { + "re": -0.112456806, + "im": 0.21751128, + "freq": 393.0, + "amp": 0.2448626, + "phase": 2.0479639 + }, + { + "re": -0.12465627, + "im": 0.22507475, + "freq": 394.0, + "amp": 0.25728938, + "phase": 2.0765858 + }, + { + "re": -0.12155418, + "im": 0.27635378, + "freq": 395.0, + "amp": 0.30190533, + "phase": 1.9851774 + }, + { + "re": -0.059492942, + "im": 0.19709866, + "freq": 396.0, + "amp": 0.20588174, + "phase": 1.8639435 + }, + { + "re": -0.092809536, + "im": 0.23000148, + "freq": 397.0, + "amp": 0.24802074, + "phase": 1.954331 + }, + { + "re": -0.09182411, + "im": 0.27752873, + "freq": 398.0, + "amp": 0.29232493, + "phase": 1.8903223 + }, + { + "re": -0.119620256, + "im": 0.26976672, + "freq": 399.0, + "amp": 0.29509842, + "phase": 1.9881657 + }, + { + "re": -0.103123516, + "im": 0.2567136, + "freq": 400.0, + "amp": 0.276652, + "phase": 1.9527729 + }, + { + "re": -0.16378026, + "im": 0.25167632, + "freq": 401.0, + "amp": 0.3002748, + "phase": 2.147704 + }, + { + "re": -0.106192335, + "im": 0.22305474, + "freq": 402.0, + "amp": 0.24704297, + "phase": 2.0151272 + }, + { + "re": -0.08976094, + "im": 0.2212125, + "freq": 403.0, + "amp": 0.23872998, + "phase": 1.9562651 + }, + { + "re": -0.11371546, + "im": 0.27133703, + "freq": 404.0, + "amp": 0.2942023, + "phase": 1.967653 + }, + { + "re": -0.13169128, + "im": 0.26068667, + "freq": 405.0, + "amp": 0.29206187, + "phase": 2.0385718 + }, + { + "re": -0.13881788, + "im": 0.27147666, + "freq": 406.0, + "amp": 0.3049098, + "phase": 2.0434775 + }, + { + "re": -0.05482384, + "im": 0.28365895, + "freq": 407.0, + "amp": 0.2889084, + "phase": 1.761716 + }, + { + "re": -0.122877955, + "im": 0.2019161, + "freq": 408.0, + "amp": 0.23636645, + "phase": 2.1174858 + }, + { + "re": -0.14337018, + "im": 0.20957838, + "freq": 409.0, + "amp": 0.25392538, + "phase": 2.1707635 + }, + { + "re": -0.12988134, + "im": 0.26090455, + "freq": 410.0, + "amp": 0.29144526, + "phase": 2.0326917 + }, + { + "re": -0.07689959, + "im": 0.23493306, + "freq": 411.0, + "amp": 0.24719849, + "phase": 1.8871301 + }, + { + "re": -0.09127217, + "im": 0.21275523, + "freq": 412.0, + "amp": 0.2315068, + "phase": 1.9760507 + }, + { + "re": -0.11970719, + "im": 0.2610933, + "freq": 413.0, + "amp": 0.2872273, + "phase": 2.0006833 + }, + { + "re": -0.051697332, + "im": 0.22688304, + "freq": 414.0, + "amp": 0.23269835, + "phase": 1.7948302 + }, + { + "re": -0.09344767, + "im": 0.19751248, + "freq": 415.0, + "amp": 0.2185032, + "phase": 2.012712 + }, + { + "re": -0.15218478, + "im": 0.27646577, + "freq": 416.0, + "amp": 0.31558442, + "phase": 2.0739965 + }, + { + "re": -0.08615189, + "im": 0.23366888, + "freq": 417.0, + "amp": 0.24904476, + "phase": 1.9240254 + }, + { + "re": -0.122132994, + "im": 0.24299842, + "freq": 418.0, + "amp": 0.27196452, + "phase": 2.036528 + }, + { + "re": -0.13414583, + "im": 0.22814758, + "freq": 419.0, + "amp": 0.26466286, + "phase": 2.1023293 + }, + { + "re": -0.18661758, + "im": 0.26196775, + "freq": 420.0, + "amp": 0.32164145, + "phase": 2.1897752 + }, + { + "re": -0.0688816, + "im": 0.2545771, + "freq": 421.0, + "amp": 0.26373127, + "phase": 1.8350418 + }, + { + "re": -0.12643424, + "im": 0.231951, + "freq": 422.0, + "amp": 0.26417205, + "phase": 2.0698624 + }, + { + "re": -0.13130662, + "im": 0.26974484, + "freq": 423.0, + "amp": 0.30000618, + "phase": 2.0238128 + }, + { + "re": -0.08806122, + "im": 0.23958516, + "freq": 424.0, + "amp": 0.25525638, + "phase": 1.9230257 + }, + { + "re": -0.1171997, + "im": 0.21096253, + "freq": 425.0, + "amp": 0.24133164, + "phase": 2.0778885 + }, + { + "re": -0.13366055, + "im": 0.21286985, + "freq": 426.0, + "amp": 0.25135377, + "phase": 2.1314769 + }, + { + "re": -0.07000197, + "im": 0.19170052, + "freq": 427.0, + "amp": 0.20408176, + "phase": 1.9209151 + }, + { + "re": -0.08695519, + "im": 0.2070738, + "freq": 428.0, + "amp": 0.2245902, + "phase": 1.9683595 + }, + { + "re": -0.14777072, + "im": 0.24841584, + "freq": 429.0, + "amp": 0.28904432, + "phase": 2.107422 + }, + { + "re": -0.08547853, + "im": 0.27980193, + "freq": 430.0, + "amp": 0.29256743, + "phase": 1.8672881 + }, + { + "re": -0.111139864, + "im": 0.23174603, + "freq": 431.0, + "amp": 0.2570181, + "phase": 2.0179715 + }, + { + "re": -0.15087105, + "im": 0.24525914, + "freq": 432.0, + "amp": 0.2879481, + "phase": 2.1222808 + }, + { + "re": -0.13649161, + "im": 0.2134422, + "freq": 433.0, + "amp": 0.2533526, + "phase": 2.139739 + }, + { + "re": -0.16350847, + "im": 0.23075545, + "freq": 434.0, + "amp": 0.28281283, + "phase": 2.1872568 + }, + { + "re": -0.13679095, + "im": 0.20534487, + "freq": 435.0, + "amp": 0.24673523, + "phase": 2.1584427 + }, + { + "re": -0.14514512, + "im": 0.24936986, + "freq": 436.0, + "amp": 0.28853497, + "phase": 2.097911 + }, + { + "re": -0.15052031, + "im": 0.26648217, + "freq": 437.0, + "amp": 0.30605412, + "phase": 2.084963 + }, + { + "re": -0.16698967, + "im": 0.22699775, + "freq": 438.0, + "amp": 0.28180405, + "phase": 2.2050467 + }, + { + "re": -0.1428172, + "im": 0.23040998, + "freq": 439.0, + "amp": 0.2710821, + "phase": 2.1256762 + }, + { + "re": -0.14270462, + "im": 0.21690276, + "freq": 440.0, + "amp": 0.2596371, + "phase": 2.152719 + }, + { + "re": -0.10152683, + "im": 0.19566709, + "freq": 441.0, + "amp": 0.2204389, + "phase": 2.04943 + }, + { + "re": -0.14654256, + "im": 0.17701773, + "freq": 442.0, + "amp": 0.22980426, + "phase": 2.2622845 + }, + { + "re": -0.1635808, + "im": 0.21816707, + "freq": 443.0, + "amp": 0.27268213, + "phase": 2.2141669 + }, + { + "re": -0.13533853, + "im": 0.25944802, + "freq": 444.0, + "amp": 0.2926257, + "phase": 2.0516057 + }, + { + "re": -0.14440788, + "im": 0.25446546, + "freq": 445.0, + "amp": 0.29258555, + "phase": 2.0869722 + }, + { + "re": -0.050830342, + "im": 0.2394579, + "freq": 446.0, + "amp": 0.24479342, + "phase": 1.7799641 + }, + { + "re": -0.13446397, + "im": 0.20583814, + "freq": 447.0, + "amp": 0.24586561, + "phase": 2.1494536 + }, + { + "re": -0.1838553, + "im": 0.20941411, + "freq": 448.0, + "amp": 0.27867013, + "phase": 2.291295 + }, + { + "re": -0.11809219, + "im": 0.2368006, + "freq": 449.0, + "amp": 0.26461348, + "phase": 2.0334024 + }, + { + "re": -0.17052488, + "im": 0.1802043, + "freq": 450.0, + "amp": 0.2480974, + "phase": 2.3286035 + }, + { + "re": -0.19268093, + "im": 0.21888477, + "freq": 451.0, + "amp": 0.29161015, + "phase": 2.2926116 + }, + { + "re": -0.14465426, + "im": 0.22454128, + "freq": 452.0, + "amp": 0.2671023, + "phase": 2.1430984 + }, + { + "re": -0.14989877, + "im": 0.23751001, + "freq": 453.0, + "amp": 0.280857, + "phase": 2.1337886 + }, + { + "re": -0.14796892, + "im": 0.16867383, + "freq": 454.0, + "amp": 0.22437838, + "phase": 2.2908986 + }, + { + "re": -0.14397618, + "im": 0.28035912, + "freq": 455.0, + "amp": 0.31516722, + "phase": 2.0452187 + }, + { + "re": -0.14156774, + "im": 0.22099717, + "freq": 456.0, + "amp": 0.26245221, + "phase": 2.1405253 + }, + { + "re": -0.15956908, + "im": 0.2494849, + "freq": 457.0, + "amp": 0.2961503, + "phase": 2.1398215 + }, + { + "re": -0.105480365, + "im": 0.2052752, + "freq": 458.0, + "amp": 0.23078997, + "phase": 2.0454612 + }, + { + "re": -0.14212698, + "im": 0.20136705, + "freq": 459.0, + "amp": 0.24647266, + "phase": 2.1854115 + }, + { + "re": -0.15444559, + "im": 0.21843639, + "freq": 460.0, + "amp": 0.26752177, + "phase": 2.1862388 + }, + { + "re": -0.16692334, + "im": 0.22690819, + "freq": 461.0, + "amp": 0.2816926, + "phase": 2.2050452 + }, + { + "re": -0.12952986, + "im": 0.2613799, + "freq": 462.0, + "amp": 0.29171464, + "phase": 2.0308871 + }, + { + "re": -0.16546933, + "im": 0.19653265, + "freq": 463.0, + "amp": 0.25691473, + "phase": 2.2705944 + }, + { + "re": -0.1489733, + "im": 0.19710632, + "freq": 464.0, + "amp": 0.24707073, + "phase": 2.2180002 + }, + { + "re": -0.15381481, + "im": 0.22327365, + "freq": 465.0, + "amp": 0.2711275, + "phase": 2.1740386 + }, + { + "re": -0.16097546, + "im": 0.22235899, + "freq": 466.0, + "amp": 0.2745116, + "phase": 2.197412 + }, + { + "re": -0.1563767, + "im": 0.21898398, + "freq": 467.0, + "amp": 0.26908672, + "phase": 2.1909237 + }, + { + "re": -0.16229644, + "im": 0.19091071, + "freq": 468.0, + "amp": 0.2505734, + "phase": 2.2753584 + }, + { + "re": -0.15218377, + "im": 0.23492797, + "freq": 469.0, + "amp": 0.2799126, + "phase": 2.1456158 + }, + { + "re": -0.14391245, + "im": 0.20689969, + "freq": 470.0, + "amp": 0.25202832, + "phase": 2.1785405 + }, + { + "re": -0.14813782, + "im": 0.22741102, + "freq": 471.0, + "amp": 0.27140483, + "phase": 2.1481621 + }, + { + "re": -0.14012577, + "im": 0.19442995, + "freq": 472.0, + "amp": 0.23966275, + "phase": 2.1952806 + }, + { + "re": -0.16604055, + "im": 0.25462264, + "freq": 473.0, + "amp": 0.30397722, + "phase": 2.1486497 + }, + { + "re": -0.15806657, + "im": 0.21169122, + "freq": 474.0, + "amp": 0.26419353, + "phase": 2.2121723 + }, + { + "re": -0.13346492, + "im": 0.18205878, + "freq": 475.0, + "amp": 0.22573942, + "phase": 2.2033849 + }, + { + "re": -0.15136336, + "im": 0.20804083, + "freq": 476.0, + "amp": 0.2572778, + "phase": 2.1997843 + }, + { + "re": -0.117466606, + "im": 0.23029304, + "freq": 477.0, + "amp": 0.25852135, + "phase": 2.042471 + }, + { + "re": -0.14982867, + "im": 0.18517217, + "freq": 478.0, + "amp": 0.23819606, + "phase": 2.2510805 + }, + { + "re": -0.13804659, + "im": 0.20115055, + "freq": 479.0, + "amp": 0.24396394, + "phase": 2.1722581 + }, + { + "re": -0.11644996, + "im": 0.18206294, + "freq": 480.0, + "amp": 0.2161192, + "phase": 2.1398354 + }, + { + "re": -0.12256982, + "im": 0.25691122, + "freq": 481.0, + "amp": 0.28465196, + "phase": 2.0159488 + }, + { + "re": -0.17668809, + "im": 0.15805846, + "freq": 482.0, + "amp": 0.23706783, + "phase": 2.4117901 + }, + { + "re": -0.14948304, + "im": 0.20263852, + "freq": 483.0, + "amp": 0.25180855, + "phase": 2.206368 + }, + { + "re": -0.18765804, + "im": 0.23456584, + "freq": 484.0, + "amp": 0.3003942, + "phase": 2.245551 + }, + { + "re": -0.18697977, + "im": 0.23109756, + "freq": 485.0, + "amp": 0.29726675, + "phase": 2.251058 + }, + { + "re": -0.12703845, + "im": 0.2218018, + "freq": 486.0, + "amp": 0.25560674, + "phase": 2.0909429 + }, + { + "re": -0.18684764, + "im": 0.21477704, + "freq": 487.0, + "amp": 0.2846774, + "phase": 2.286765 + }, + { + "re": -0.20629263, + "im": 0.19211183, + "freq": 488.0, + "amp": 0.2818929, + "phase": 2.3917735 + }, + { + "re": -0.19729377, + "im": 0.20279336, + "freq": 489.0, + "amp": 0.28293106, + "phase": 2.3424494 + }, + { + "re": -0.16255313, + "im": 0.17325789, + "freq": 490.0, + "amp": 0.23757486, + "phase": 2.324328 + }, + { + "re": -0.13652599, + "im": 0.19090283, + "freq": 491.0, + "amp": 0.23469818, + "phase": 2.1916242 + }, + { + "re": -0.233399, + "im": 0.2317004, + "freq": 492.0, + "amp": 0.32887712, + "phase": 2.3598466 + }, + { + "re": -0.14748085, + "im": 0.1892807, + "freq": 493.0, + "amp": 0.23995371, + "phase": 2.2327032 + }, + { + "re": -0.1613174, + "im": 0.18381548, + "freq": 494.0, + "amp": 0.24456376, + "phase": 2.2910998 + }, + { + "re": -0.15067063, + "im": 0.17493801, + "freq": 495.0, + "amp": 0.23087864, + "phase": 2.281803 + }, + { + "re": -0.14692187, + "im": 0.18863204, + "freq": 496.0, + "amp": 0.23909847, + "phase": 2.2325263 + }, + { + "re": -0.13513361, + "im": 0.21836643, + "freq": 497.0, + "amp": 0.25679758, + "phase": 2.1249528 + }, + { + "re": -0.18590538, + "im": 0.22602268, + "freq": 498.0, + "amp": 0.2926552, + "phase": 2.2591116 + }, + { + "re": -0.1909447, + "im": 0.17779903, + "freq": 499.0, + "amp": 0.26090685, + "phase": 2.3918293 + }, + { + "re": -0.17733, + "im": 0.24458253, + "freq": 500.0, + "amp": 0.30210352, + "phase": 2.1981251 + }, + { + "re": -0.15627557, + "im": 0.19562976, + "freq": 501.0, + "amp": 0.25038582, + "phase": 2.2448256 + }, + { + "re": -0.1778838, + "im": 0.2316154, + "freq": 502.0, + "amp": 0.29204166, + "phase": 2.225727 + }, + { + "re": -0.17587103, + "im": 0.17219034, + "freq": 503.0, + "amp": 0.24613032, + "phase": 2.3667688 + }, + { + "re": -0.17605321, + "im": 0.22422817, + "freq": 504.0, + "amp": 0.28508422, + "phase": 2.2364178 + }, + { + "re": -0.1842244, + "im": 0.19183172, + "freq": 505.0, + "amp": 0.26596624, + "phase": 2.335968 + }, + { + "re": -0.2176059, + "im": 0.20003965, + "freq": 506.0, + "amp": 0.2955811, + "phase": 2.39823 + }, + { + "re": -0.1426485, + "im": 0.1920789, + "freq": 507.0, + "amp": 0.23925489, + "phase": 2.2095804 + }, + { + "re": -0.19971985, + "im": 0.17982116, + "freq": 508.0, + "amp": 0.26874462, + "phase": 2.4085748 + }, + { + "re": -0.16217886, + "im": 0.17503506, + "freq": 509.0, + "amp": 0.23861948, + "phase": 2.318088 + }, + { + "re": -0.16109976, + "im": 0.21576197, + "freq": 510.0, + "amp": 0.26927006, + "phase": 2.2121532 + }, + { + "re": -0.17566065, + "im": 0.16417475, + "freq": 511.0, + "amp": 0.24043714, + "phase": 2.38998 + }, + { + "re": -0.17500946, + "im": 0.15639795, + "freq": 512.0, + "amp": 0.23470968, + "phase": 2.4122946 + }, + { + "re": -0.18203735, + "im": 0.19987188, + "freq": 513.0, + "amp": 0.2703449, + "phase": 2.30953 + }, + { + "re": -0.15257359, + "im": 0.17989483, + "freq": 514.0, + "amp": 0.23588313, + "phase": 2.2742019 + }, + { + "re": -0.18442804, + "im": 0.179085, + "freq": 515.0, + "amp": 0.2570703, + "phase": 2.3708918 + }, + { + "re": -0.22969699, + "im": 0.18861187, + "freq": 516.0, + "amp": 0.29721227, + "phase": 2.4540977 + }, + { + "re": -0.1503452, + "im": 0.16108936, + "freq": 517.0, + "amp": 0.2203485, + "phase": 2.3217092 + }, + { + "re": -0.18046999, + "im": 0.20587325, + "freq": 518.0, + "amp": 0.27377585, + "phase": 2.290536 + }, + { + "re": -0.17836928, + "im": 0.14475943, + "freq": 519.0, + "amp": 0.22971916, + "phase": 2.4598355 + }, + { + "re": -0.20388564, + "im": 0.19372854, + "freq": 520.0, + "amp": 0.2812474, + "phase": 2.3817341 + }, + { + "re": -0.19504961, + "im": 0.2100638, + "freq": 521.0, + "amp": 0.28665513, + "phase": 2.3191497 + }, + { + "re": -0.16585144, + "im": 0.14565943, + "freq": 522.0, + "amp": 0.2207337, + "phase": 2.4209235 + }, + { + "re": -0.16719383, + "im": 0.17342253, + "freq": 523.0, + "amp": 0.24089241, + "phase": 2.33791 + }, + { + "re": -0.18406886, + "im": 0.19216587, + "freq": 524.0, + "amp": 0.26609972, + "phase": 2.3346767 + }, + { + "re": -0.15384123, + "im": 0.21444468, + "freq": 525.0, + "amp": 0.26391977, + "phase": 2.1931007 + }, + { + "re": -0.1721853, + "im": 0.17965055, + "freq": 526.0, + "amp": 0.24884151, + "phase": 2.3349798 + }, + { + "re": -0.20027643, + "im": 0.16444428, + "freq": 527.0, + "amp": 0.25913814, + "phase": 2.4541256 + }, + { + "re": -0.1646919, + "im": 0.187306, + "freq": 528.0, + "amp": 0.24941324, + "phase": 2.2920377 + }, + { + "re": -0.19053106, + "im": 0.16580008, + "freq": 529.0, + "amp": 0.2525703, + "phase": 2.425488 + }, + { + "re": -0.19253339, + "im": 0.23083974, + "freq": 530.0, + "amp": 0.3005929, + "phase": 2.2659612 + }, + { + "re": -0.16915947, + "im": 0.2062954, + "freq": 531.0, + "amp": 0.26678213, + "phase": 2.257606 + }, + { + "re": -0.18394303, + "im": 0.13466063, + "freq": 532.0, + "amp": 0.22796606, + "phase": 2.5096607 + }, + { + "re": -0.18881093, + "im": 0.1566364, + "freq": 533.0, + "amp": 0.24532536, + "phase": 2.4490652 + }, + { + "re": -0.20686008, + "im": 0.2081448, + "freq": 534.0, + "amp": 0.29345417, + "phase": 2.3530989 + }, + { + "re": -0.16227618, + "im": 0.14779912, + "freq": 535.0, + "amp": 0.21949519, + "phase": 2.4028494 + }, + { + "re": -0.22523147, + "im": 0.15977961, + "freq": 536.0, + "amp": 0.27614984, + "phase": 2.5245845 + }, + { + "re": -0.17316085, + "im": 0.17574692, + "freq": 537.0, + "amp": 0.24672183, + "phase": 2.3487828 + }, + { + "re": -0.18877685, + "im": 0.17521608, + "freq": 538.0, + "amp": 0.25756043, + "phase": 2.3934329 + }, + { + "re": -0.16171914, + "im": 0.18791682, + "freq": 539.0, + "amp": 0.247923, + "phase": 2.281406 + }, + { + "re": -0.22133692, + "im": 0.19192316, + "freq": 540.0, + "amp": 0.29295823, + "phase": 2.4272497 + }, + { + "re": -0.20089103, + "im": 0.16717483, + "freq": 541.0, + "amp": 0.26135156, + "phase": 2.4475431 + }, + { + "re": -0.20121557, + "im": 0.15424755, + "freq": 542.0, + "amp": 0.25353503, + "phase": 2.4875655 + }, + { + "re": -0.17474851, + "im": 0.1644683, + "freq": 543.0, + "amp": 0.23997264, + "phase": 2.3864908 + }, + { + "re": -0.18136643, + "im": 0.17747356, + "freq": 544.0, + "amp": 0.25375313, + "phase": 2.3670425 + }, + { + "re": -0.16886832, + "im": 0.17237587, + "freq": 545.0, + "amp": 0.24130882, + "phase": 2.3459163 + }, + { + "re": -0.24210626, + "im": 0.18347998, + "freq": 546.0, + "amp": 0.3037768, + "phase": 2.493087 + }, + { + "re": -0.17995405, + "im": 0.16073026, + "freq": 547.0, + "amp": 0.24128339, + "phase": 2.4125617 + }, + { + "re": -0.20212221, + "im": 0.15640324, + "freq": 548.0, + "amp": 0.2555687, + "phase": 2.4830294 + }, + { + "re": -0.15868749, + "im": 0.14073558, + "freq": 549.0, + "amp": 0.21210428, + "phase": 2.4160779 + }, + { + "re": -0.17940621, + "im": 0.17107734, + "freq": 550.0, + "amp": 0.24789926, + "phase": 2.3799539 + }, + { + "re": -0.24031417, + "im": 0.1676887, + "freq": 551.0, + "amp": 0.29303652, + "phase": 2.532352 + }, + { + "re": -0.21976916, + "im": 0.18499948, + "freq": 552.0, + "amp": 0.28726867, + "phase": 2.4418843 + }, + { + "re": -0.22442105, + "im": 0.17618306, + "freq": 553.0, + "amp": 0.2853161, + "phase": 2.4760308 + }, + { + "re": -0.19108123, + "im": 0.1450875, + "freq": 554.0, + "amp": 0.23992169, + "phase": 2.4921677 + }, + { + "re": -0.22478007, + "im": 0.14429645, + "freq": 555.0, + "amp": 0.26710963, + "phase": 2.570901 + }, + { + "re": -0.17985773, + "im": 0.15689386, + "freq": 556.0, + "amp": 0.23867235, + "phase": 2.4242814 + }, + { + "re": -0.19947028, + "im": 0.14151138, + "freq": 557.0, + "amp": 0.24456874, + "phase": 2.524562 + }, + { + "re": -0.25219128, + "im": 0.19042242, + "freq": 558.0, + "amp": 0.31600812, + "phase": 2.4948537 + }, + { + "re": -0.21886224, + "im": 0.17694771, + "freq": 559.0, + "amp": 0.2814448, + "phase": 2.4616969 + }, + { + "re": -0.14993839, + "im": 0.14493701, + "freq": 560.0, + "amp": 0.20853838, + "phase": 2.373154 + }, + { + "re": -0.21089263, + "im": 0.12427319, + "freq": 561.0, + "amp": 0.24478465, + "phase": 2.6090984 + }, + { + "re": -0.20234245, + "im": 0.19627039, + "freq": 562.0, + "amp": 0.28189453, + "phase": 2.3714263 + }, + { + "re": -0.18979575, + "im": 0.21306117, + "freq": 563.0, + "amp": 0.2853375, + "phase": 2.2985075 + }, + { + "re": -0.19314212, + "im": 0.14440903, + "freq": 564.0, + "amp": 0.24115938, + "phase": 2.4995763 + }, + { + "re": -0.20847693, + "im": 0.15125594, + "freq": 565.0, + "amp": 0.25756744, + "phase": 2.5139382 + }, + { + "re": -0.2144398, + "im": 0.13066965, + "freq": 566.0, + "amp": 0.25111547, + "phase": 2.5943239 + }, + { + "re": -0.1988532, + "im": 0.14676553, + "freq": 567.0, + "amp": 0.24714917, + "phase": 2.5057774 + }, + { + "re": -0.2204171, + "im": 0.16533367, + "freq": 568.0, + "amp": 0.27553388, + "phase": 2.4980311 + }, + { + "re": -0.2515861, + "im": 0.16315348, + "freq": 569.0, + "amp": 0.2998577, + "phase": 2.566273 + }, + { + "re": -0.2016991, + "im": 0.19958532, + "freq": 570.0, + "amp": 0.28375486, + "phase": 2.361462 + }, + { + "re": -0.2313639, + "im": 0.16536607, + "freq": 571.0, + "amp": 0.28438562, + "phase": 2.5210395 + }, + { + "re": -0.23348628, + "im": 0.14014201, + "freq": 572.0, + "amp": 0.27231532, + "phase": 2.601015 + }, + { + "re": -0.2359221, + "im": 0.09622526, + "freq": 573.0, + "amp": 0.25479117, + "phase": 2.7543213 + }, + { + "re": -0.25588566, + "im": 0.1813754, + "freq": 574.0, + "amp": 0.3136471, + "phase": 2.5249755 + }, + { + "re": -0.1906157, + "im": 0.1640726, + "freq": 575.0, + "amp": 0.2515038, + "phase": 2.4308903 + }, + { + "re": -0.20896468, + "im": 0.12858449, + "freq": 576.0, + "amp": 0.2453573, + "phase": 2.5899696 + }, + { + "re": -0.22606404, + "im": 0.16546918, + "freq": 577.0, + "amp": 0.28015175, + "phase": 2.5097394 + }, + { + "re": -0.1857992, + "im": 0.1318906, + "freq": 578.0, + "amp": 0.22785187, + "phase": 2.524283 + }, + { + "re": -0.2438722, + "im": 0.17675954, + "freq": 579.0, + "amp": 0.3011936, + "phase": 2.5144129 + }, + { + "re": -0.2052616, + "im": 0.16252078, + "freq": 580.0, + "amp": 0.2618116, + "phase": 2.4718878 + }, + { + "re": -0.18855621, + "im": 0.1712427, + "freq": 581.0, + "amp": 0.25471064, + "phase": 2.4042773 + }, + { + "re": -0.19451872, + "im": 0.18445507, + "freq": 582.0, + "amp": 0.26806942, + "phase": 2.3827434 + }, + { + "re": -0.21992028, + "im": 0.12576655, + "freq": 583.0, + "amp": 0.25334197, + "phase": 2.6221113 + }, + { + "re": -0.20464672, + "im": 0.14860262, + "freq": 584.0, + "amp": 0.25290912, + "phase": 2.5135362 + }, + { + "re": -0.21829776, + "im": 0.10769816, + "freq": 585.0, + "amp": 0.24341899, + "phase": 2.6832757 + }, + { + "re": -0.21555693, + "im": 0.16731259, + "freq": 586.0, + "amp": 0.27287048, + "phase": 2.4815412 + }, + { + "re": -0.22648281, + "im": 0.17690285, + "freq": 587.0, + "amp": 0.28738314, + "phase": 2.4784908 + }, + { + "re": -0.17639174, + "im": 0.16812834, + "freq": 588.0, + "amp": 0.24368255, + "phase": 2.380175 + }, + { + "re": -0.20136325, + "im": 0.1356998, + "freq": 589.0, + "amp": 0.24282008, + "phase": 2.5485954 + }, + { + "re": -0.30373448, + "im": 0.14318097, + "freq": 590.0, + "amp": 0.33579075, + "phase": 2.7010841 + }, + { + "re": -0.2142787, + "im": 0.1375879, + "freq": 591.0, + "amp": 0.25464836, + "phase": 2.5707927 + }, + { + "re": -0.22694017, + "im": 0.11950565, + "freq": 592.0, + "amp": 0.25648284, + "phase": 2.6568959 + }, + { + "re": -0.26804036, + "im": 0.15917839, + "freq": 593.0, + "amp": 0.3117425, + "phase": 2.6057003 + }, + { + "re": -0.21264392, + "im": 0.1803521, + "freq": 594.0, + "amp": 0.27882668, + "phase": 2.4381785 + }, + { + "re": -0.13527125, + "im": 0.15804149, + "freq": 595.0, + "amp": 0.20802745, + "phase": 2.2787187 + }, + { + "re": -0.22103328, + "im": 0.11531302, + "freq": 596.0, + "amp": 0.24930464, + "phase": 2.6607363 + }, + { + "re": -0.20676914, + "im": 0.12738186, + "freq": 597.0, + "amp": 0.24285719, + "phase": 2.5894492 + }, + { + "re": -0.19257513, + "im": 0.12687716, + "freq": 598.0, + "amp": 0.23061438, + "phase": 2.5590246 + }, + { + "re": -0.24132895, + "im": 0.13428378, + "freq": 599.0, + "amp": 0.2761735, + "phase": 2.6338227 + }, + { + "re": -0.2808172, + "im": 0.13319053, + "freq": 600.0, + "amp": 0.31080222, + "phase": 2.6987188 + }, + { + "re": -0.21101137, + "im": 0.12726308, + "freq": 601.0, + "amp": 0.24641772, + "phase": 2.5988896 + }, + { + "re": -0.27828658, + "im": 0.10948526, + "freq": 602.0, + "amp": 0.29904923, + "phase": 2.766766 + }, + { + "re": -0.21720226, + "im": 0.091268234, + "freq": 603.0, + "amp": 0.23559862, + "phase": 2.7437954 + }, + { + "re": -0.21596938, + "im": 0.18093465, + "freq": 604.0, + "amp": 0.28174478, + "phase": 2.4442363 + }, + { + "re": -0.22480102, + "im": 0.12614854, + "freq": 605.0, + "amp": 0.25777695, + "phase": 2.6302245 + }, + { + "re": -0.2914292, + "im": 0.08991618, + "freq": 606.0, + "amp": 0.30498508, + "phase": 2.8423238 + }, + { + "re": -0.22582687, + "im": 0.15005565, + "freq": 607.0, + "amp": 0.27113554, + "phase": 2.555111 + }, + { + "re": -0.25544167, + "im": 0.14979702, + "freq": 608.0, + "amp": 0.29612428, + "phase": 2.6112156 + }, + { + "re": -0.21376298, + "im": 0.12741992, + "freq": 609.0, + "amp": 0.24885829, + "phase": 2.6040602 + }, + { + "re": -0.2351369, + "im": 0.142659, + "freq": 610.0, + "amp": 0.275029, + "phase": 2.5962567 + }, + { + "re": -0.23920959, + "im": 0.17236722, + "freq": 611.0, + "amp": 0.2948418, + "phase": 2.5171945 + }, + { + "re": -0.27661577, + "im": 0.11423223, + "freq": 612.0, + "amp": 0.2992746, + "phase": 2.749961 + }, + { + "re": -0.25778294, + "im": 0.13700573, + "freq": 613.0, + "amp": 0.29192913, + "phase": 2.6530817 + }, + { + "re": -0.23372482, + "im": 0.123340584, + "freq": 614.0, + "amp": 0.26427296, + "phase": 2.656018 + }, + { + "re": -0.25608847, + "im": 0.101016626, + "freq": 615.0, + "amp": 0.27529195, + "phase": 2.7658713 + }, + { + "re": -0.18963496, + "im": 0.13534513, + "freq": 616.0, + "amp": 0.23298009, + "phase": 2.5217218 + }, + { + "re": -0.23625799, + "im": 0.0985941, + "freq": 617.0, + "amp": 0.25600514, + "phase": 2.746249 + }, + { + "re": -0.29484358, + "im": 0.12720397, + "freq": 618.0, + "amp": 0.32111305, + "phase": 2.7342894 + }, + { + "re": -0.1982311, + "im": 0.1416371, + "freq": 619.0, + "amp": 0.24363218, + "phase": 2.521198 + }, + { + "re": -0.29139268, + "im": 0.14884955, + "freq": 620.0, + "amp": 0.32720923, + "phase": 2.6693256 + }, + { + "re": -0.27636582, + "im": 0.12391738, + "freq": 621.0, + "amp": 0.30287552, + "phase": 2.7200854 + }, + { + "re": -0.29355982, + "im": 0.0988901, + "freq": 622.0, + "amp": 0.30976865, + "phase": 2.8166668 + }, + { + "re": -0.1885248, + "im": 0.10432298, + "freq": 623.0, + "amp": 0.21546434, + "phase": 2.63617 + }, + { + "re": -0.3111699, + "im": 0.10642388, + "freq": 624.0, + "amp": 0.32886586, + "phase": 2.8120515 + }, + { + "re": -0.22386062, + "im": 0.14443353, + "freq": 625.0, + "amp": 0.26641062, + "phase": 2.5686035 + }, + { + "re": -0.21685502, + "im": 0.18313122, + "freq": 626.0, + "amp": 0.28383648, + "phase": 2.440308 + }, + { + "re": -0.23712727, + "im": 0.05739503, + "freq": 627.0, + "amp": 0.24397445, + "phase": 2.9041166 + }, + { + "re": -0.23593093, + "im": 0.1428441, + "freq": 628.0, + "amp": 0.27580398, + "phase": 2.5971763 + }, + { + "re": -0.2733109, + "im": 0.10198293, + "freq": 629.0, + "amp": 0.29171798, + "phase": 2.7844546 + }, + { + "re": -0.27400264, + "im": 0.13835658, + "freq": 630.0, + "amp": 0.30695274, + "phase": 2.673996 + }, + { + "re": -0.23781012, + "im": 0.11129693, + "freq": 631.0, + "amp": 0.26256552, + "phase": 2.703865 + }, + { + "re": -0.27878174, + "im": 0.14185901, + "freq": 632.0, + "amp": 0.31279904, + "phase": 2.6708875 + }, + { + "re": -0.22617465, + "im": 0.09458495, + "freq": 633.0, + "amp": 0.24515563, + "phase": 2.7455006 + }, + { + "re": -0.28914356, + "im": 0.13206379, + "freq": 634.0, + "amp": 0.31787553, + "phase": 2.713147 + }, + { + "re": -0.2521331, + "im": 0.07354766, + "freq": 635.0, + "amp": 0.26264113, + "phase": 2.8577662 + }, + { + "re": -0.2728195, + "im": 0.13544083, + "freq": 636.0, + "amp": 0.3045894, + "phase": 2.6807902 + }, + { + "re": -0.27775258, + "im": 0.13053164, + "freq": 637.0, + "amp": 0.30689576, + "phase": 2.7022674 + }, + { + "re": -0.26723617, + "im": 0.07484062, + "freq": 638.0, + "amp": 0.2775181, + "phase": 2.8685336 + }, + { + "re": -0.23966564, + "im": 0.12440369, + "freq": 639.0, + "amp": 0.27002943, + "phase": 2.6628041 + }, + { + "re": -0.23777272, + "im": 0.11828541, + "freq": 640.0, + "amp": 0.26556978, + "phase": 2.679969 + }, + { + "re": -0.2406661, + "im": 0.08977651, + "freq": 641.0, + "amp": 0.2568657, + "phase": 2.784547 + }, + { + "re": -0.24776837, + "im": 0.08193965, + "freq": 642.0, + "amp": 0.26096603, + "phase": 2.8222044 + }, + { + "re": -0.2550715, + "im": 0.100509346, + "freq": 643.0, + "amp": 0.2741598, + "phase": 2.7662315 + }, + { + "re": -0.22269477, + "im": 0.101946644, + "freq": 644.0, + "amp": 0.24492055, + "phase": 2.7122824 + }, + { + "re": -0.21614417, + "im": 0.095089346, + "freq": 645.0, + "amp": 0.23613617, + "phase": 2.7271404 + }, + { + "re": -0.2764436, + "im": 0.07218988, + "freq": 646.0, + "amp": 0.2857139, + "phase": 2.8861592 + }, + { + "re": -0.22405483, + "im": 0.15590432, + "freq": 647.0, + "amp": 0.2729592, + "phase": 2.5336702 + }, + { + "re": -0.25591573, + "im": 0.069495335, + "freq": 648.0, + "amp": 0.26518384, + "phase": 2.8764315 + }, + { + "re": -0.2248183, + "im": 0.108850054, + "freq": 649.0, + "amp": 0.24978311, + "phase": 2.6906898 + }, + { + "re": -0.26441628, + "im": 0.08303538, + "freq": 650.0, + "amp": 0.27714768, + "phase": 2.837312 + }, + { + "re": -0.2195763, + "im": 0.11213238, + "freq": 651.0, + "amp": 0.24655105, + "phase": 2.6694407 + }, + { + "re": -0.2242819, + "im": 0.0900105, + "freq": 652.0, + "amp": 0.24166974, + "phase": 2.7599423 + }, + { + "re": -0.26341462, + "im": 0.11150723, + "freq": 653.0, + "amp": 0.28604394, + "phase": 2.7411504 + }, + { + "re": -0.3298216, + "im": 0.12000859, + "freq": 654.0, + "amp": 0.35097626, + "phase": 2.792625 + }, + { + "re": -0.27599484, + "im": 0.08698157, + "freq": 655.0, + "amp": 0.28937683, + "phase": 2.8362894 + }, + { + "re": -0.27230898, + "im": 0.069579534, + "freq": 656.0, + "amp": 0.2810578, + "phase": 2.8914285 + }, + { + "re": -0.2604245, + "im": 0.047278065, + "freq": 657.0, + "amp": 0.2646812, + "phase": 2.962006 + }, + { + "re": -0.32487682, + "im": 0.07863197, + "freq": 658.0, + "amp": 0.33425727, + "phase": 2.9041233 + }, + { + "re": -0.21951015, + "im": 0.080438755, + "freq": 659.0, + "amp": 0.2337843, + "phase": 2.7903419 + }, + { + "re": -0.33175692, + "im": 0.09983958, + "freq": 660.0, + "amp": 0.34645432, + "phase": 2.8492718 + }, + { + "re": -0.22571272, + "im": 0.07726233, + "freq": 661.0, + "amp": 0.23857011, + "phase": 2.8117905 + }, + { + "re": -0.27900496, + "im": 0.12257559, + "freq": 662.0, + "amp": 0.3047434, + "phase": 2.7276464 + }, + { + "re": -0.3151083, + "im": 0.053787872, + "freq": 663.0, + "amp": 0.31966603, + "phase": 2.9725256 + }, + { + "re": -0.3521957, + "im": 0.1213358, + "freq": 664.0, + "amp": 0.37251064, + "phase": 2.809815 + }, + { + "re": -0.2737742, + "im": 0.110481225, + "freq": 665.0, + "amp": 0.29522604, + "phase": 2.758031 + }, + { + "re": -0.28006628, + "im": 0.120730676, + "freq": 666.0, + "amp": 0.30498037, + "phase": 2.7345843 + }, + { + "re": -0.33653474, + "im": 0.03702046, + "freq": 667.0, + "amp": 0.3385648, + "phase": 3.0320282 + }, + { + "re": -0.2555695, + "im": 0.09878866, + "freq": 668.0, + "amp": 0.27399808, + "phase": 2.7727404 + }, + { + "re": -0.27428082, + "im": 0.06884282, + "freq": 669.0, + "amp": 0.28278843, + "phase": 2.8956788 + }, + { + "re": -0.3057456, + "im": 0.090933844, + "freq": 670.0, + "amp": 0.3189817, + "phase": 2.8525076 + }, + { + "re": -0.2975175, + "im": 0.09857903, + "freq": 671.0, + "amp": 0.3134238, + "phase": 2.8216383 + }, + { + "re": -0.30643263, + "im": 0.079496324, + "freq": 672.0, + "amp": 0.3165764, + "phase": 2.887763 + }, + { + "re": -0.2751365, + "im": 0.064241305, + "freq": 673.0, + "amp": 0.2825368, + "phase": 2.9122133 + }, + { + "re": -0.29181036, + "im": 0.12968186, + "freq": 674.0, + "amp": 0.31932846, + "phase": 2.7234015 + }, + { + "re": -0.25499186, + "im": 0.08763519, + "freq": 675.0, + "amp": 0.26963082, + "phase": 2.8105607 + }, + { + "re": -0.2825241, + "im": 0.03670716, + "freq": 676.0, + "amp": 0.28489873, + "phase": 3.0123906 + }, + { + "re": -0.2856097, + "im": 0.1083434, + "freq": 677.0, + "amp": 0.3054688, + "phase": 2.7790217 + }, + { + "re": -0.30103117, + "im": 0.053812176, + "freq": 678.0, + "amp": 0.30580306, + "phase": 2.9647017 + }, + { + "re": -0.32414815, + "im": 0.08211001, + "freq": 679.0, + "amp": 0.3343861, + "phase": 2.893501 + }, + { + "re": -0.27947515, + "im": 0.13838531, + "freq": 680.0, + "amp": 0.31186032, + "phase": 2.6818235 + }, + { + "re": -0.30536938, + "im": 0.10725952, + "freq": 681.0, + "amp": 0.32365885, + "phase": 2.803809 + }, + { + "re": -0.32516494, + "im": 0.05341834, + "freq": 682.0, + "amp": 0.32952353, + "phase": 2.9787662 + }, + { + "re": -0.27639696, + "im": 0.119230285, + "freq": 683.0, + "amp": 0.30101684, + "phase": 2.7343361 + }, + { + "re": -0.2989048, + "im": 0.1317147, + "freq": 684.0, + "amp": 0.32663873, + "phase": 2.7265348 + }, + { + "re": -0.30068716, + "im": 0.09384226, + "freq": 685.0, + "amp": 0.3149907, + "phase": 2.839079 + }, + { + "re": -0.246017, + "im": 0.09085964, + "freq": 686.0, + "amp": 0.2622591, + "phase": 2.7878087 + }, + { + "re": -0.29873246, + "im": 0.034268387, + "freq": 687.0, + "amp": 0.30069155, + "phase": 3.0273793 + }, + { + "re": -0.3151524, + "im": 0.054019287, + "freq": 688.0, + "amp": 0.31974852, + "phase": 2.9718354 + }, + { + "re": -0.2928939, + "im": 0.06662558, + "freq": 689.0, + "amp": 0.3003761, + "phase": 2.9179251 + }, + { + "re": -0.3328327, + "im": 0.03527612, + "freq": 690.0, + "amp": 0.3346969, + "phase": 3.0359993 + }, + { + "re": -0.29497027, + "im": 0.122610025, + "freq": 691.0, + "amp": 0.31943807, + "phase": 2.7476518 + }, + { + "re": -0.28197867, + "im": 0.10274, + "freq": 692.0, + "amp": 0.30011243, + "phase": 2.7921882 + }, + { + "re": -0.33619696, + "im": 0.04036844, + "freq": 693.0, + "amp": 0.33861187, + "phase": 3.022091 + }, + { + "re": -0.31029794, + "im": 0.14200121, + "freq": 694.0, + "amp": 0.34124646, + "phase": 2.7124128 + }, + { + "re": -0.3003923, + "im": 0.04793198, + "freq": 695.0, + "amp": 0.3041924, + "phase": 2.983362 + }, + { + "re": -0.28890786, + "im": 0.053801965, + "freq": 696.0, + "amp": 0.2938748, + "phase": 2.9574764 + }, + { + "re": -0.31469506, + "im": 0.032092795, + "freq": 697.0, + "amp": 0.31632724, + "phase": 3.0399635 + }, + { + "re": -0.31979913, + "im": 0.038172986, + "freq": 698.0, + "amp": 0.32206935, + "phase": 3.0227892 + }, + { + "re": -0.31290832, + "im": 0.059895024, + "freq": 699.0, + "amp": 0.31858912, + "phase": 2.9524662 + }, + { + "re": -0.26398045, + "im": 0.013524583, + "freq": 700.0, + "amp": 0.26432666, + "phase": 3.090404 + }, + { + "re": -0.2897766, + "im": 0.08900631, + "freq": 701.0, + "amp": 0.3031379, + "phase": 2.8435848 + }, + { + "re": -0.26758426, + "im": 0.10697467, + "freq": 702.0, + "amp": 0.28817514, + "phase": 2.7612765 + }, + { + "re": -0.36928883, + "im": 0.102883875, + "freq": 703.0, + "amp": 0.38335276, + "phase": 2.8698826 + }, + { + "re": -0.3235218, + "im": 0.12149137, + "freq": 704.0, + "amp": 0.3455814, + "phase": 2.7823596 + }, + { + "re": -0.3844185, + "im": 0.13099882, + "freq": 705.0, + "amp": 0.40612593, + "phase": 2.8131628 + }, + { + "re": -0.43714818, + "im": 0.10203851, + "freq": 706.0, + "amp": 0.4488991, + "phase": 2.9122798 + }, + { + "re": -0.34173974, + "im": 0.08841614, + "freq": 707.0, + "amp": 0.35299215, + "phase": 2.8884206 + }, + { + "re": -0.31075123, + "im": 0.05430922, + "freq": 708.0, + "amp": 0.31546128, + "phase": 2.9685726 + }, + { + "re": -0.25902283, + "im": -0.0025383409, + "freq": 709.0, + "amp": 0.25903526, + "phase": -3.1317933 + }, + { + "re": -0.34657964, + "im": 0.116951026, + "freq": 710.0, + "amp": 0.36577997, + "phase": 2.8161476 + }, + { + "re": -0.31746206, + "im": 0.10699233, + "freq": 711.0, + "amp": 0.33500674, + "phase": 2.8165243 + }, + { + "re": -0.27431533, + "im": 0.050896768, + "freq": 712.0, + "amp": 0.2789971, + "phase": 2.9581378 + }, + { + "re": -0.37044457, + "im": 0.082187444, + "freq": 713.0, + "amp": 0.37945217, + "phase": 2.9232674 + }, + { + "re": -0.34063697, + "im": 0.09686625, + "freq": 714.0, + "amp": 0.3541421, + "phase": 2.8645382 + }, + { + "re": -0.2676572, + "im": 0.019274572, + "freq": 715.0, + "amp": 0.2683503, + "phase": 3.0697045 + }, + { + "re": -0.33400136, + "im": -0.0002545042, + "freq": 716.0, + "amp": 0.33400145, + "phase": -3.1408308 + }, + { + "re": -0.29317266, + "im": 0.057073258, + "freq": 717.0, + "amp": 0.29867637, + "phase": 2.949323 + }, + { + "re": -0.33777395, + "im": 0.09375287, + "freq": 718.0, + "amp": 0.35054365, + "phase": 2.870847 + }, + { + "re": -0.29331607, + "im": 0.061017156, + "freq": 719.0, + "amp": 0.29959542, + "phase": 2.9364924 + }, + { + "re": -0.27490905, + "im": 0.11572788, + "freq": 720.0, + "amp": 0.2982749, + "phase": 2.7431421 + }, + { + "re": -0.36188546, + "im": 0.05612783, + "freq": 721.0, + "amp": 0.36621225, + "phase": 2.9877203 + }, + { + "re": -0.41255328, + "im": 0.07425959, + "freq": 722.0, + "amp": 0.41918337, + "phase": 2.9634998 + }, + { + "re": -0.3204211, + "im": 0.097682945, + "freq": 723.0, + "amp": 0.33498004, + "phase": 2.845685 + }, + { + "re": -0.3301721, + "im": -0.038802538, + "freq": 724.0, + "amp": 0.33244434, + "phase": -3.0246072 + }, + { + "re": -0.38468987, + "im": -0.010088384, + "freq": 725.0, + "amp": 0.38482213, + "phase": -3.1153738 + }, + { + "re": -0.35733935, + "im": 0.10792283, + "freq": 726.0, + "amp": 0.37328106, + "phase": 2.8482857 + }, + { + "re": -0.29573053, + "im": 0.03037551, + "freq": 727.0, + "amp": 0.29728642, + "phase": 3.0392382 + }, + { + "re": -0.31539294, + "im": 0.08828371, + "freq": 728.0, + "amp": 0.327516, + "phase": 2.8686614 + }, + { + "re": -0.4159721, + "im": 0.056963652, + "freq": 729.0, + "amp": 0.41985434, + "phase": 3.0054982 + }, + { + "re": -0.32425326, + "im": 0.05923506, + "freq": 730.0, + "amp": 0.32961944, + "phase": 2.9609036 + }, + { + "re": -0.25958374, + "im": -0.006696402, + "freq": 731.0, + "amp": 0.2596701, + "phase": -3.1158016 + }, + { + "re": -0.35693064, + "im": 0.0797994, + "freq": 732.0, + "amp": 0.3657423, + "phase": 2.9216385 + }, + { + "re": -0.31714326, + "im": 0.00077381416, + "freq": 733.0, + "amp": 0.31714422, + "phase": 3.1391528 + }, + { + "re": -0.32396936, + "im": 0.08337155, + "freq": 734.0, + "amp": 0.334525, + "phase": 2.889714 + }, + { + "re": -0.38248658, + "im": 0.014906598, + "freq": 735.0, + "amp": 0.38277695, + "phase": 3.1026394 + }, + { + "re": -0.3674551, + "im": 0.08091917, + "freq": 736.0, + "amp": 0.37625945, + "phase": 2.924837 + }, + { + "re": -0.31395128, + "im": -0.008712597, + "freq": 737.0, + "amp": 0.31407216, + "phase": -3.1138484 + }, + { + "re": -0.40939286, + "im": 0.04175231, + "freq": 738.0, + "amp": 0.41151643, + "phase": 3.0399582 + }, + { + "re": -0.3926252, + "im": 0.0060424805, + "freq": 739.0, + "amp": 0.3926717, + "phase": 3.126204 + }, + { + "re": -0.28932926, + "im": 0.035688065, + "freq": 740.0, + "amp": 0.29152197, + "phase": 3.0188649 + }, + { + "re": -0.33096835, + "im": 0.0093001835, + "freq": 741.0, + "amp": 0.33109897, + "phase": 3.1135 + }, + { + "re": -0.42565858, + "im": 0.11577712, + "freq": 742.0, + "amp": 0.44112307, + "phase": 2.876022 + }, + { + "re": -0.25842145, + "im": -0.045003477, + "freq": 743.0, + "amp": 0.2623108, + "phase": -2.9691741 + }, + { + "re": -0.39004195, + "im": 0.06521606, + "freq": 744.0, + "amp": 0.39545652, + "phase": 2.9759226 + }, + { + "re": -0.4226482, + "im": -0.031110475, + "freq": 745.0, + "amp": 0.42379165, + "phase": -3.0681167 + }, + { + "re": -0.31334257, + "im": 0.08325929, + "freq": 746.0, + "amp": 0.32421547, + "phase": 2.8818805 + }, + { + "re": -0.31705412, + "im": 0.027817618, + "freq": 747.0, + "amp": 0.3182721, + "phase": 3.054079 + }, + { + "re": -0.35915005, + "im": -0.08237208, + "freq": 748.0, + "amp": 0.3684751, + "phase": -2.9161391 + }, + { + "re": -0.3545833, + "im": 0.048598047, + "freq": 749.0, + "amp": 0.35789815, + "phase": 3.0053844 + }, + { + "re": -0.41792166, + "im": 0.0370056, + "freq": 750.0, + "amp": 0.41955683, + "phase": 3.0532763 + }, + { + "re": -0.3109531, + "im": 0.044109456, + "freq": 751.0, + "amp": 0.31406605, + "phase": 3.0006804 + }, + { + "re": -0.3433166, + "im": -0.027388489, + "freq": 752.0, + "amp": 0.34440735, + "phase": -3.061985 + }, + { + "re": -0.4283187, + "im": 0.086676195, + "freq": 753.0, + "amp": 0.43700078, + "phase": 2.9419253 + }, + { + "re": -0.3283276, + "im": 0.11118985, + "freq": 754.0, + "amp": 0.3466442, + "phase": 2.8150601 + }, + { + "re": -0.36339405, + "im": -0.007977094, + "freq": 755.0, + "amp": 0.36348158, + "phase": -3.1196446 + }, + { + "re": -0.3866062, + "im": -0.027531205, + "freq": 756.0, + "amp": 0.38758522, + "phase": -3.0705001 + }, + { + "re": -0.35289475, + "im": 0.02482995, + "freq": 757.0, + "amp": 0.3537672, + "phase": 3.0713477 + }, + { + "re": -0.27086136, + "im": 0.03107481, + "freq": 758.0, + "amp": 0.27263808, + "phase": 3.0273662 + }, + { + "re": -0.2999507, + "im": 0.075688615, + "freq": 759.0, + "amp": 0.30935284, + "phase": 2.8944159 + }, + { + "re": -0.46442318, + "im": 0.103291415, + "freq": 760.0, + "amp": 0.47577095, + "phase": 2.9227467 + }, + { + "re": -0.42603153, + "im": -0.022658216, + "freq": 761.0, + "amp": 0.42663363, + "phase": -3.0884583 + }, + { + "re": -0.37329185, + "im": 0.004776185, + "freq": 762.0, + "amp": 0.3733224, + "phase": 3.1287985 + }, + { + "re": -0.35491928, + "im": -0.01775275, + "freq": 763.0, + "amp": 0.35536298, + "phase": -3.0916152 + }, + { + "re": -0.40921885, + "im": 0.042901635, + "freq": 764.0, + "amp": 0.41146156, + "phase": 3.0371363 + }, + { + "re": -0.34880796, + "im": 0.012922167, + "freq": 765.0, + "amp": 0.34904724, + "phase": 3.104563 + }, + { + "re": -0.37779495, + "im": -0.043300316, + "freq": 766.0, + "amp": 0.38026828, + "phase": -3.0274773 + }, + { + "re": -0.30422893, + "im": 0.117311925, + "freq": 767.0, + "amp": 0.32606336, + "phase": 2.7735577 + }, + { + "re": -0.3639402, + "im": -0.0136695765, + "freq": 768.0, + "amp": 0.36419684, + "phase": -3.1040504 + }, + { + "re": -0.367839, + "im": 0.03973751, + "freq": 769.0, + "amp": 0.3699792, + "phase": 3.0339804 + }, + { + "re": -0.4012857, + "im": 0.0401953, + "freq": 770.0, + "amp": 0.4032938, + "phase": 3.0417593 + }, + { + "re": -0.37977552, + "im": -0.005697641, + "freq": 771.0, + "amp": 0.37981826, + "phase": -3.1265912 + }, + { + "re": -0.40650702, + "im": 0.07434911, + "freq": 772.0, + "amp": 0.4132502, + "phase": 2.9606946 + }, + { + "re": -0.32523724, + "im": 0.039308466, + "freq": 773.0, + "amp": 0.32760406, + "phase": 3.021315 + }, + { + "re": -0.39295927, + "im": -0.031091198, + "freq": 774.0, + "amp": 0.39418733, + "phase": -3.0626364 + }, + { + "re": -0.54602516, + "im": 0.06743223, + "freq": 775.0, + "amp": 0.5501732, + "phase": 3.0187182 + }, + { + "re": -0.3962799, + "im": 0.036165144, + "freq": 776.0, + "amp": 0.39792672, + "phase": 3.0505831 + }, + { + "re": -0.35742217, + "im": -0.044987343, + "freq": 777.0, + "amp": 0.36024222, + "phase": -3.0163848 + }, + { + "re": -0.44086292, + "im": 0.02267193, + "freq": 778.0, + "amp": 0.4414455, + "phase": 3.0902116 + }, + { + "re": -0.4278511, + "im": -0.0048636226, + "freq": 779.0, + "amp": 0.42787874, + "phase": -3.1302257 + }, + { + "re": -0.32174155, + "im": 0.044557825, + "freq": 780.0, + "amp": 0.3248123, + "phase": 3.0039785 + }, + { + "re": -0.46404165, + "im": -0.10176886, + "freq": 781.0, + "amp": 0.47507006, + "phase": -2.925701 + }, + { + "re": -0.36252707, + "im": 0.029585965, + "freq": 782.0, + "amp": 0.3637323, + "phase": 3.0601628 + }, + { + "re": -0.39772606, + "im": -0.011103584, + "freq": 783.0, + "amp": 0.39788103, + "phase": -3.1136823 + }, + { + "re": -0.40392676, + "im": -0.06696685, + "freq": 784.0, + "amp": 0.40944034, + "phase": -2.9772975 + }, + { + "re": -0.42552978, + "im": -0.01852138, + "freq": 785.0, + "amp": 0.42593265, + "phase": -3.0980947 + }, + { + "re": -0.30411765, + "im": 0.12839268, + "freq": 786.0, + "amp": 0.33010942, + "phase": 2.7421122 + }, + { + "re": -0.4352518, + "im": -0.03526151, + "freq": 787.0, + "amp": 0.43667778, + "phase": -3.0607553 + }, + { + "re": -0.4242949, + "im": 0.0015137076, + "freq": 788.0, + "amp": 0.4242976, + "phase": 3.138025 + }, + { + "re": -0.39094698, + "im": -0.036024798, + "freq": 789.0, + "amp": 0.39260328, + "phase": -3.0497046 + }, + { + "re": -0.3242131, + "im": -0.060105752, + "freq": 790.0, + "amp": 0.3297375, + "phase": -2.9582841 + }, + { + "re": -0.345076, + "im": -0.047245946, + "freq": 791.0, + "amp": 0.3482953, + "phase": -3.0055242 + }, + { + "re": -0.33871403, + "im": 0.002735414, + "freq": 792.0, + "amp": 0.3387251, + "phase": 3.133517 + }, + { + "re": -0.4099711, + "im": -0.024884813, + "freq": 793.0, + "amp": 0.41072562, + "phase": -3.0809681 + }, + { + "re": -0.37437835, + "im": -0.0070565245, + "freq": 794.0, + "amp": 0.37444484, + "phase": -3.1227462 + }, + { + "re": -0.36448288, + "im": 0.022995062, + "freq": 795.0, + "amp": 0.36520752, + "phase": 3.0785866 + }, + { + "re": -0.36051175, + "im": -0.08687169, + "freq": 796.0, + "amp": 0.3708307, + "phase": -2.9051328 + }, + { + "re": -0.5178329, + "im": -0.059899766, + "freq": 797.0, + "amp": 0.5212858, + "phase": -3.0264306 + }, + { + "re": -0.4186921, + "im": -0.018497009, + "freq": 798.0, + "amp": 0.4191005, + "phase": -3.0974433 + }, + { + "re": -0.428391, + "im": 0.03789623, + "freq": 799.0, + "amp": 0.43006393, + "phase": 3.0533605 + }, + { + "re": -0.30438593, + "im": -0.16945969, + "freq": 800.0, + "amp": 0.3483782, + "phase": -2.6336 + }, + { + "re": -0.44369346, + "im": 0.07948716, + "freq": 801.0, + "amp": 0.45075727, + "phase": 2.9643242 + }, + { + "re": -0.4391525, + "im": -0.059358712, + "freq": 802.0, + "amp": 0.443146, + "phase": -3.0072403 + }, + { + "re": -0.36681205, + "im": 0.020605959, + "freq": 803.0, + "amp": 0.36739036, + "phase": 3.085476 + }, + { + "re": -0.49206188, + "im": -0.01152896, + "freq": 804.0, + "amp": 0.49219692, + "phase": -3.118167 + }, + { + "re": -0.5610304, + "im": -0.11105464, + "freq": 805.0, + "amp": 0.5719163, + "phase": -2.9461713 + }, + { + "re": -0.39293376, + "im": -0.025625797, + "freq": 806.0, + "amp": 0.3937685, + "phase": -3.0764682 + }, + { + "re": -0.52462065, + "im": -0.0500046, + "freq": 807.0, + "amp": 0.5269984, + "phase": -3.046564 + }, + { + "re": -0.51285315, + "im": 0.023934208, + "freq": 808.0, + "amp": 0.51341134, + "phase": 3.0949578 + }, + { + "re": -0.29530293, + "im": -0.031879608, + "freq": 809.0, + "amp": 0.29701874, + "phase": -3.0340536 + }, + { + "re": -0.40237468, + "im": -0.09539626, + "freq": 810.0, + "amp": 0.41352853, + "phase": -2.9088075 + }, + { + "re": -0.4515692, + "im": -0.062548466, + "freq": 811.0, + "amp": 0.45588052, + "phase": -3.003955 + }, + { + "re": -0.43593782, + "im": 0.09404872, + "freq": 812.0, + "amp": 0.44596744, + "phase": 2.9291103 + }, + { + "re": -0.39993823, + "im": -0.035700988, + "freq": 813.0, + "amp": 0.4015285, + "phase": -3.0525625 + }, + { + "re": -0.4497747, + "im": -0.020185048, + "freq": 814.0, + "amp": 0.4502274, + "phase": -3.0967445 + }, + { + "re": -0.58568126, + "im": -0.05562008, + "freq": 815.0, + "amp": 0.5883163, + "phase": -3.04691 + }, + { + "re": -0.34715906, + "im": -0.1052278, + "freq": 816.0, + "amp": 0.36275652, + "phase": -2.847284 + }, + { + "re": -0.45277068, + "im": -0.052647423, + "freq": 817.0, + "amp": 0.45582128, + "phase": -3.025834 + }, + { + "re": -0.4561367, + "im": -0.10120707, + "freq": 818.0, + "amp": 0.46722966, + "phase": -2.923251 + }, + { + "re": -0.5401009, + "im": -0.1645737, + "freq": 819.0, + "amp": 0.564618, + "phase": -2.8458211 + }, + { + "re": -0.39660662, + "im": -0.019786064, + "freq": 820.0, + "amp": 0.39709988, + "phase": -3.0917456 + }, + { + "re": -0.42306235, + "im": -0.23421553, + "freq": 821.0, + "amp": 0.48356867, + "phase": -2.635975 + }, + { + "re": -0.46684086, + "im": -0.07240865, + "freq": 822.0, + "amp": 0.4724229, + "phase": -2.9877152 + }, + { + "re": -0.3926935, + "im": -0.1689565, + "freq": 823.0, + "amp": 0.42749792, + "phase": -2.7352834 + }, + { + "re": -0.43294045, + "im": -0.02554164, + "freq": 824.0, + "amp": 0.4336932, + "phase": -3.0826652 + }, + { + "re": -0.5378915, + "im": -0.09830964, + "freq": 825.0, + "amp": 0.5468016, + "phase": -2.9608192 + }, + { + "re": -0.3139063, + "im": -0.13617106, + "freq": 826.0, + "amp": 0.34216914, + "phase": -2.732296 + }, + { + "re": -0.6892968, + "im": 0.022634814, + "freq": 827.0, + "amp": 0.6896683, + "phase": 3.1087668 + }, + { + "re": -0.24313098, + "im": -0.107274055, + "freq": 828.0, + "amp": 0.26574498, + "phase": -2.7260647 + }, + { + "re": -0.38683972, + "im": -0.18948252, + "freq": 829.0, + "amp": 0.43075353, + "phase": -2.6861207 + }, + { + "re": -0.57330996, + "im": -0.06294394, + "freq": 830.0, + "amp": 0.5767549, + "phase": -3.0322402 + }, + { + "re": -0.5023714, + "im": -0.106014796, + "freq": 831.0, + "amp": 0.5134356, + "phase": -2.9336154 + }, + { + "re": -0.32507023, + "im": 0.008816036, + "freq": 832.0, + "amp": 0.32518977, + "phase": 3.1144788 + }, + { + "re": -0.5906087, + "im": -0.11412465, + "freq": 833.0, + "amp": 0.60153395, + "phase": -2.950713 + }, + { + "re": -0.5427581, + "im": 0.052229173, + "freq": 834.0, + "amp": 0.5452653, + "phase": 3.0456588 + }, + { + "re": -0.40650803, + "im": -0.11592821, + "freq": 835.0, + "amp": 0.4227152, + "phase": -2.8637865 + }, + { + "re": -0.63067293, + "im": -0.14869577, + "freq": 836.0, + "amp": 0.64796513, + "phase": -2.910048 + }, + { + "re": -0.47140574, + "im": -0.026008202, + "freq": 837.0, + "amp": 0.47212264, + "phase": -3.086477 + }, + { + "re": -0.4206032, + "im": -0.029091923, + "freq": 838.0, + "amp": 0.4216081, + "phase": -3.0725355 + }, + { + "re": -0.588999, + "im": -0.09709877, + "freq": 839.0, + "amp": 0.59694886, + "phase": -2.9782083 + }, + { + "re": -0.42053765, + "im": -0.18759494, + "freq": 840.0, + "amp": 0.46048212, + "phase": -2.7220004 + }, + { + "re": -0.5159538, + "im": 0.022073234, + "freq": 841.0, + "amp": 0.5164257, + "phase": 3.0988374 + }, + { + "re": -0.66258436, + "im": -0.04687116, + "freq": 842.0, + "amp": 0.6642401, + "phase": -3.0709703 + }, + { + "re": -0.49665594, + "im": -0.1986699, + "freq": 843.0, + "amp": 0.5349176, + "phase": -2.761073 + }, + { + "re": -0.47242337, + "im": -0.06694555, + "freq": 844.0, + "amp": 0.4771431, + "phase": -3.0008233 + }, + { + "re": -0.558377, + "im": -0.18863645, + "freq": 845.0, + "amp": 0.58937985, + "phase": -2.8158007 + }, + { + "re": -0.536521, + "im": -0.2370001, + "freq": 846.0, + "amp": 0.58653545, + "phase": -2.7256331 + }, + { + "re": -0.62985975, + "im": -0.12316497, + "freq": 847.0, + "amp": 0.64178884, + "phase": -2.9484859 + }, + { + "re": -0.5086826, + "im": -0.082749315, + "freq": 848.0, + "amp": 0.51536924, + "phase": -2.9803314 + }, + { + "re": -0.3043452, + "im": -0.120779, + "freq": 849.0, + "amp": 0.32743484, + "phase": -2.7638059 + }, + { + "re": -0.45105535, + "im": -0.4077849, + "freq": 850.0, + "amp": 0.6080621, + "phase": -2.4065344 + }, + { + "re": -0.6176814, + "im": 0.11510315, + "freq": 851.0, + "amp": 0.62831444, + "phase": 2.9573586 + }, + { + "re": -0.46913224, + "im": 0.106265426, + "freq": 852.0, + "amp": 0.48101705, + "phase": 2.9188368 + }, + { + "re": -0.6518248, + "im": -0.0779107, + "freq": 853.0, + "amp": 0.65646446, + "phase": -3.02263 + }, + { + "re": -0.40564367, + "im": -0.21513925, + "freq": 854.0, + "amp": 0.4591641, + "phase": -2.653949 + }, + { + "re": -0.61639017, + "im": -0.14903332, + "freq": 855.0, + "amp": 0.6341512, + "phase": -2.9043615 + }, + { + "re": -0.62771386, + "im": -0.16678181, + "freq": 856.0, + "amp": 0.6494928, + "phase": -2.8818955 + }, + { + "re": -0.4893854, + "im": -0.12366986, + "freq": 857.0, + "amp": 0.50476956, + "phase": -2.8940701 + }, + { + "re": -0.6037131, + "im": -0.2485001, + "freq": 858.0, + "amp": 0.65285665, + "phase": -2.7511098 + }, + { + "re": -0.56954753, + "im": -0.0067985044, + "freq": 859.0, + "amp": 0.5695881, + "phase": -3.1296566 + }, + { + "re": -0.52229446, + "im": -0.07273271, + "freq": 860.0, + "amp": 0.5273344, + "phase": -3.0032263 + }, + { + "re": -0.52514, + "im": -0.27716467, + "freq": 861.0, + "amp": 0.5937948, + "phase": -2.6559594 + }, + { + "re": -0.86661553, + "im": -0.15737449, + "freq": 862.0, + "amp": 0.880789, + "phase": -2.9619536 + }, + { + "re": -0.657574, + "im": 0.028829316, + "freq": 863.0, + "amp": 0.6582057, + "phase": 3.0977788 + }, + { + "re": -0.41927856, + "im": -0.12018332, + "freq": 864.0, + "amp": 0.43616343, + "phase": -2.8624344 + }, + { + "re": -0.5383453, + "im": -0.3181728, + "freq": 865.0, + "amp": 0.62533957, + "phase": -2.6078024 + }, + { + "re": -0.46561816, + "im": 0.008551531, + "freq": 866.0, + "amp": 0.4656967, + "phase": 3.1232288 + }, + { + "re": -0.6123275, + "im": -0.051557068, + "freq": 867.0, + "amp": 0.6144942, + "phase": -3.0575924 + }, + { + "re": -0.47766888, + "im": -0.29769632, + "freq": 868.0, + "amp": 0.5628416, + "phase": -2.584269 + }, + { + "re": -0.68648833, + "im": -0.22056389, + "freq": 869.0, + "amp": 0.7210511, + "phase": -2.8307173 + }, + { + "re": -0.5875982, + "im": 0.060351025, + "freq": 870.0, + "amp": 0.59068936, + "phase": 3.0392435 + }, + { + "re": -0.6573557, + "im": -0.29693687, + "freq": 871.0, + "amp": 0.72130996, + "phase": -2.7173142 + }, + { + "re": -0.5457619, + "im": -0.0053148936, + "freq": 872.0, + "amp": 0.54578775, + "phase": -3.1318545 + }, + { + "re": -0.7454246, + "im": -0.38194317, + "freq": 873.0, + "amp": 0.8375789, + "phase": -2.6680875 + }, + { + "re": -0.5518374, + "im": -0.13160749, + "freq": 874.0, + "amp": 0.5673139, + "phase": -2.9074762 + }, + { + "re": -0.6849013, + "im": -0.07423299, + "freq": 875.0, + "amp": 0.6889124, + "phase": -3.0336292 + }, + { + "re": -0.5413736, + "im": -0.19358559, + "freq": 876.0, + "amp": 0.57494414, + "phase": -2.7981791 + }, + { + "re": -0.7205849, + "im": -0.082479306, + "freq": 877.0, + "amp": 0.72528994, + "phase": -3.027627 + }, + { + "re": -0.5055191, + "im": -0.12628433, + "freq": 878.0, + "amp": 0.521054, + "phase": -2.8967917 + }, + { + "re": -0.48089537, + "im": -0.30757725, + "freq": 879.0, + "amp": 0.5708451, + "phase": -2.5725684 + }, + { + "re": -0.91719615, + "im": -0.0053942655, + "freq": 880.0, + "amp": 0.917212, + "phase": -3.1357114 + }, + { + "re": -0.74407536, + "im": -0.18227322, + "freq": 881.0, + "amp": 0.7660755, + "phase": -2.9013574 + }, + { + "re": -0.6722226, + "im": -0.34497073, + "freq": 882.0, + "amp": 0.7555713, + "phase": -2.6674573 + }, + { + "re": -0.6586089, + "im": -0.11574918, + "freq": 883.0, + "amp": 0.6687029, + "phase": -2.9676213 + }, + { + "re": -0.8624377, + "im": -0.18886049, + "freq": 884.0, + "amp": 0.88287437, + "phase": -2.926011 + }, + { + "re": -0.44124338, + "im": -0.29806456, + "freq": 885.0, + "amp": 0.5324831, + "phase": -2.5474923 + }, + { + "re": -0.8120342, + "im": -0.31944713, + "freq": 886.0, + "amp": 0.8726087, + "phase": -2.7667964 + }, + { + "re": -0.7014839, + "im": -0.18718566, + "freq": 887.0, + "amp": 0.72602904, + "phase": -2.8808262 + }, + { + "re": -0.63528293, + "im": -0.4866622, + "freq": 888.0, + "amp": 0.80026525, + "phase": -2.4878948 + }, + { + "re": -0.74123687, + "im": -0.18278793, + "freq": 889.0, + "amp": 0.7634419, + "phase": -2.899818 + }, + { + "re": -0.91654587, + "im": -0.11095787, + "freq": 890.0, + "amp": 0.92323774, + "phase": -3.021118 + }, + { + "re": -0.40838856, + "im": -0.25105602, + "freq": 891.0, + "amp": 0.47938538, + "phase": -2.5903997 + }, + { + "re": -0.6422713, + "im": -0.34810406, + "freq": 892.0, + "amp": 0.7305401, + "phase": -2.6449206 + }, + { + "re": -0.53033125, + "im": -0.1513732, + "freq": 893.0, + "amp": 0.55151165, + "phase": -2.8635545 + }, + { + "re": -0.76709175, + "im": -0.47164625, + "freq": 894.0, + "amp": 0.90048873, + "phase": -2.5903256 + }, + { + "re": -0.7196754, + "im": -0.06642019, + "freq": 895.0, + "amp": 0.7227339, + "phase": -3.0495615 + }, + { + "re": -0.8201968, + "im": -0.24874736, + "freq": 896.0, + "amp": 0.85708696, + "phase": -2.8471315 + }, + { + "re": -0.5199668, + "im": -0.5388312, + "freq": 897.0, + "amp": 0.748802, + "phase": -2.3383796 + }, + { + "re": -0.7977219, + "im": -0.51061285, + "freq": 898.0, + "amp": 0.9471461, + "phase": -2.5722165 + }, + { + "re": -0.767125, + "im": 0.14679804, + "freq": 899.0, + "amp": 0.7810444, + "phase": 2.952517 + }, + { + "re": -0.4976467, + "im": -0.27223843, + "freq": 900.0, + "amp": 0.56724423, + "phase": -2.641016 + }, + { + "re": -0.85537183, + "im": -0.27335393, + "freq": 901.0, + "amp": 0.8979885, + "phase": -2.8322768 + }, + { + "re": -0.7817267, + "im": -0.23118947, + "freq": 902.0, + "amp": 0.81519645, + "phase": -2.8540468 + }, + { + "re": -0.5954817, + "im": -0.45177025, + "freq": 903.0, + "amp": 0.7474589, + "phase": -2.49257 + }, + { + "re": -0.6781414, + "im": -0.26880634, + "freq": 904.0, + "amp": 0.7294742, + "phase": -2.764205 + }, + { + "re": -0.82250756, + "im": -0.16514964, + "freq": 905.0, + "amp": 0.83892375, + "phase": -2.9434395 + }, + { + "re": -0.60847235, + "im": -0.26064563, + "freq": 906.0, + "amp": 0.6619477, + "phase": -2.7368789 + }, + { + "re": -0.86301374, + "im": -0.37590092, + "freq": 907.0, + "amp": 0.9413258, + "phase": -2.7308052 + }, + { + "re": -1.0336454, + "im": -0.5113034, + "freq": 908.0, + "amp": 1.153193, + "phase": -2.682226 + }, + { + "re": -0.5963992, + "im": -0.24037911, + "freq": 909.0, + "amp": 0.64301956, + "phase": -2.758459 + }, + { + "re": -0.33817485, + "im": -0.57983655, + "freq": 910.0, + "amp": 0.6712471, + "phase": -2.0987895 + }, + { + "re": -0.8469892, + "im": -0.022444697, + "freq": 911.0, + "amp": 0.8472865, + "phase": -3.1150994 + }, + { + "re": -0.88636625, + "im": -0.65925246, + "freq": 912.0, + "amp": 1.1046534, + "phase": -2.502091 + }, + { + "re": -0.7289255, + "im": -0.4108613, + "freq": 913.0, + "amp": 0.83674335, + "phase": -2.6283276 + }, + { + "re": -0.7191898, + "im": -0.16527355, + "freq": 914.0, + "amp": 0.73793584, + "phase": -2.9157093 + }, + { + "re": -0.76102704, + "im": -0.2958445, + "freq": 915.0, + "amp": 0.81650853, + "phase": -2.7708275 + }, + { + "re": -0.7882974, + "im": -0.3504934, + "freq": 916.0, + "amp": 0.86270416, + "phase": -2.723221 + }, + { + "re": -0.67382467, + "im": -0.04728784, + "freq": 917.0, + "amp": 0.6754819, + "phase": -3.0715294 + }, + { + "re": -1.0407763, + "im": -0.54365593, + "freq": 918.0, + "amp": 1.1742134, + "phase": -2.6602204 + }, + { + "re": -0.5399558, + "im": -0.66231894, + "freq": 919.0, + "amp": 0.8545283, + "phase": -2.2547674 + }, + { + "re": -1.0917144, + "im": 0.16525938, + "freq": 920.0, + "amp": 1.1041516, + "phase": 2.9913573 + }, + { + "re": -1.269487, + "im": -0.6429131, + "freq": 921.0, + "amp": 1.4230019, + "phase": -2.67281 + }, + { + "re": -1.039596, + "im": -0.59565246, + "freq": 922.0, + "amp": 1.1981492, + "phase": -2.6212888 + }, + { + "re": -0.5416529, + "im": -0.24614616, + "freq": 923.0, + "amp": 0.59495866, + "phase": -2.7150564 + }, + { + "re": -1.0734348, + "im": -1.0427654, + "freq": 924.0, + "amp": 1.4965367, + "phase": -2.370686 + }, + { + "re": -0.96564287, + "im": -0.45117632, + "freq": 925.0, + "amp": 1.0658454, + "phase": -2.7045038 + }, + { + "re": -0.5375265, + "im": -0.065110214, + "freq": 926.0, + "amp": 0.5414555, + "phase": -3.0210507 + }, + { + "re": -1.4140263, + "im": -0.7049023, + "freq": 927.0, + "amp": 1.5799866, + "phase": -2.67914 + }, + { + "re": -0.9279151, + "im": -0.2700704, + "freq": 928.0, + "amp": 0.9664183, + "phase": -2.8583663 + }, + { + "re": -0.2948219, + "im": -0.7681415, + "freq": 929.0, + "amp": 0.8227766, + "phase": -1.93727 + }, + { + "re": -0.88030845, + "im": -0.38447282, + "freq": 930.0, + "amp": 0.9606052, + "phase": -2.7298136 + }, + { + "re": -0.63466907, + "im": -0.6419415, + "freq": 931.0, + "amp": 0.90271467, + "phase": -2.350498 + }, + { + "re": -0.59602964, + "im": -0.5343354, + "freq": 932.0, + "amp": 0.8004784, + "phase": -2.4107194 + }, + { + "re": -0.3837279, + "im": -0.93642, + "freq": 933.0, + "amp": 1.0119928, + "phase": -1.9597068 + }, + { + "re": -1.0332521, + "im": -0.4618036, + "freq": 934.0, + "amp": 1.1317563, + "phase": -2.7212849 + }, + { + "re": 0.09579308, + "im": -0.26016068, + "freq": 935.0, + "amp": 0.2772362, + "phase": -1.2179941 + }, + { + "re": -0.8189777, + "im": -1.0233775, + "freq": 936.0, + "amp": 1.3107349, + "phase": -2.2457016 + }, + { + "re": -1.48069, + "im": 0.17798898, + "freq": 937.0, + "amp": 1.4913493, + "phase": 3.0219598 + }, + { + "re": -0.85273314, + "im": -0.84599864, + "freq": 938.0, + "amp": 1.2011942, + "phase": -2.360159 + }, + { + "re": -0.6513028, + "im": -0.47527042, + "freq": 939.0, + "amp": 0.80627376, + "phase": -2.511196 + }, + { + "re": -1.3857578, + "im": -1.2279098, + "freq": 940.0, + "amp": 1.8515095, + "phase": -2.4165144 + }, + { + "re": -0.40151238, + "im": 0.14261295, + "freq": 941.0, + "amp": 0.42608762, + "phase": 2.8003023 + }, + { + "re": -0.29699972, + "im": -1.1107739, + "freq": 942.0, + "amp": 1.1497946, + "phase": -1.8320653 + }, + { + "re": -1.087797, + "im": -0.05234541, + "freq": 943.0, + "amp": 1.0890558, + "phase": -3.0935092 + }, + { + "re": -0.9225582, + "im": -0.6878479, + "freq": 944.0, + "amp": 1.1507599, + "phase": -2.5009215 + }, + { + "re": -1.3149774, + "im": 0.4122778, + "freq": 945.0, + "amp": 1.3780924, + "phase": 2.8377745 + }, + { + "re": -1.0203825, + "im": -0.82169956, + "freq": 946.0, + "amp": 1.3101033, + "phase": -2.4636369 + }, + { + "re": -1.5171812, + "im": -0.6371066, + "freq": 947.0, + "amp": 1.6455222, + "phase": -2.744026 + }, + { + "re": -1.3040605, + "im": -0.45499393, + "freq": 948.0, + "amp": 1.3811564, + "phase": -2.8058932 + }, + { + "re": -0.52114874, + "im": -0.17175747, + "freq": 949.0, + "amp": 0.54872274, + "phase": -2.8232286 + }, + { + "re": -1.2549907, + "im": -1.4145828, + "freq": 950.0, + "amp": 1.8910438, + "phase": -2.2964838 + }, + { + "re": -2.1065943, + "im": -0.4025984, + "freq": 951.0, + "amp": 2.1447203, + "phase": -2.9527564 + }, + { + "re": -0.5774765, + "im": -0.18152753, + "freq": 952.0, + "amp": 0.6053357, + "phase": -2.8370268 + }, + { + "re": -1.3136375, + "im": 0.14026411, + "freq": 953.0, + "amp": 1.3211046, + "phase": 3.0352204 + }, + { + "re": -0.99052584, + "im": -0.076319546, + "freq": 954.0, + "amp": 0.99346167, + "phase": -3.0646951 + }, + { + "re": -2.0591958, + "im": -0.5040733, + "freq": 955.0, + "amp": 2.1199946, + "phase": -2.9015222 + }, + { + "re": -1.5851264, + "im": -0.52489066, + "freq": 956.0, + "amp": 1.6697712, + "phase": -2.821822 + }, + { + "re": -0.85887915, + "im": 0.44442275, + "freq": 957.0, + "amp": 0.9670496, + "phase": 2.6640866 + }, + { + "re": -1.5088733, + "im": -1.2043419, + "freq": 958.0, + "amp": 1.9305797, + "phase": -2.4679668 + }, + { + "re": -1.3950622, + "im": 0.008753381, + "freq": 959.0, + "amp": 1.3950897, + "phase": 3.1353183 + }, + { + "re": -1.2322816, + "im": -1.3657274, + "freq": 960.0, + "amp": 1.8394916, + "phase": -2.304875 + }, + { + "re": -3.4699645, + "im": 0.60370785, + "freq": 961.0, + "amp": 3.5220897, + "phase": 2.9693358 + }, + { + "re": -0.44338965, + "im": -0.63308436, + "freq": 962.0, + "amp": 0.7729102, + "phase": -2.1817667 + }, + { + "re": -0.9331538, + "im": -1.2380586, + "freq": 963.0, + "amp": 1.5503435, + "phase": -2.2166762 + }, + { + "re": -2.4822738, + "im": -1.4731605, + "freq": 964.0, + "amp": 2.8865004, + "phase": -2.6059868 + }, + { + "re": -2.2266436, + "im": 0.67411965, + "freq": 965.0, + "amp": 2.326452, + "phase": 2.8476136 + }, + { + "re": -0.21493986, + "im": -0.39961693, + "freq": 966.0, + "amp": 0.45375416, + "phase": -2.0642748 + }, + { + "re": -1.3682898, + "im": -0.9705595, + "freq": 967.0, + "amp": 1.6775585, + "phase": -2.524637 + }, + { + "re": -0.6251952, + "im": 0.04086673, + "freq": 968.0, + "amp": 0.62652946, + "phase": 3.0763192 + }, + { + "re": -3.7772412, + "im": -3.1409624, + "freq": 969.0, + "amp": 4.9125547, + "phase": -2.4479082 + }, + { + "re": -1.4482003, + "im": -2.0235486, + "freq": 970.0, + "amp": 2.4883797, + "phase": -2.1919641 + }, + { + "re": 1.5615581, + "im": 0.09062043, + "freq": 971.0, + "amp": 1.5641854, + "phase": 0.05796704 + }, + { + "re": -0.23715514, + "im": -0.19783533, + "freq": 972.0, + "amp": 0.30883875, + "phase": -2.446342 + }, + { + "re": -4.52329, + "im": -2.6757784, + "freq": 973.0, + "amp": 5.255468, + "phase": -2.6074052 + }, + { + "re": -1.3279413, + "im": 2.289387, + "freq": 974.0, + "amp": 2.6466434, + "phase": 2.0964117 + }, + { + "re": -2.232349, + "im": -3.7042136, + "freq": 975.0, + "amp": 4.324879, + "phase": -2.113163 + }, + { + "re": -3.615199, + "im": -1.1056157, + "freq": 976.0, + "amp": 3.7804828, + "phase": -2.844801 + }, + { + "re": 0.36174753, + "im": 1.1342915, + "freq": 977.0, + "amp": 1.190579, + "phase": 1.262074 + }, + { + "re": -1.5538124, + "im": -3.9770029, + "freq": 978.0, + "amp": 4.269764, + "phase": -1.9432592 + }, + { + "re": -4.1706667, + "im": -4.1657987, + "freq": 979.0, + "amp": 5.894772, + "phase": -2.3567784 + }, + { + "re": -2.9150996, + "im": 3.6991062, + "freq": 980.0, + "amp": 4.7096915, + "phase": 2.2382112 + }, + { + "re": 0.5275526, + "im": -3.6530466, + "freq": 981.0, + "amp": 3.6909432, + "phase": -1.4273734 + }, + { + "re": -0.5532541, + "im": -5.3521214, + "freq": 982.0, + "amp": 5.3806405, + "phase": -1.6738014 + }, + { + "re": -4.9841104, + "im": 4.9679823, + "freq": 983.0, + "amp": 7.0372014, + "phase": 2.357815 + }, + { + "re": -1.1615355, + "im": -3.1199682, + "freq": 984.0, + "amp": 3.329169, + "phase": -1.9271897 + }, + { + "re": -4.733437, + "im": -2.1762636, + "freq": 985.0, + "amp": 5.209755, + "phase": -2.7106488 + }, + { + "re": -4.4509106, + "im": -3.7348838, + "freq": 986.0, + "amp": 5.8103323, + "phase": -2.4434443 + }, + { + "re": -0.9372056, + "im": 3.6355422, + "freq": 987.0, + "amp": 3.7544003, + "phase": 1.823093 + }, + { + "re": -2.005237, + "im": -3.1601865, + "freq": 988.0, + "amp": 3.7426937, + "phase": -2.1362202 + }, + { + "re": -5.154665, + "im": -2.7874672, + "freq": 989.0, + "amp": 5.8600807, + "phase": -2.6458666 + }, + { + "re": -2.844637, + "im": -3.7331522, + "freq": 990.0, + "amp": 4.6934404, + "phase": -2.221929 + }, + { + "re": -2.4956918, + "im": 3.0673826, + "freq": 991.0, + "amp": 3.9544044, + "phase": 2.2537887 + }, + { + "re": -0.91820425, + "im": -5.4258933, + "freq": 992.0, + "amp": 5.5030375, + "phase": -1.7384344 + }, + { + "re": 0.9260261, + "im": -1.6982663, + "freq": 993.0, + "amp": 1.93433, + "phase": -1.0715863 + }, + { + "re": -5.9205866, + "im": -2.1369734, + "freq": 994.0, + "amp": 6.2944417, + "phase": -2.7952056 + }, + { + "re": -4.076943, + "im": 5.1172724, + "freq": 995.0, + "amp": 6.5427775, + "phase": 2.2435234 + }, + { + "re": 0.20816419, + "im": -9.983172, + "freq": 996.0, + "amp": 9.985343, + "phase": -1.5499479 + }, + { + "re": -8.779271, + "im": 2.0364, + "freq": 997.0, + "amp": 9.012354, + "phase": 2.913668 + }, + { + "re": 2.4654932, + "im": -11.465033, + "freq": 998.0, + "amp": 11.727133, + "phase": -1.3589776 + }, + { + "re": -3.411975, + "im": 4.7234383, + "freq": 999.0, + "amp": 5.8268723, + "phase": 2.1963654 + }, + { + "re": 0.89463705, + "im": -11.810566, + "freq": 1000.0, + "amp": 11.844401, + "phase": -1.4951918 + }, + { + "re": -4.552063, + "im": -7.7135334, + "freq": 1001.0, + "amp": 8.956554, + "phase": -2.103934 + }, + { + "re": -3.7791607, + "im": 5.103878, + "freq": 1002.0, + "amp": 6.3507185, + "phase": 2.2081566 + }, + { + "re": -2.6722744, + "im": -3.3427658, + "freq": 1003.0, + "amp": 4.2796183, + "phase": -2.2451837 + }, + { + "re": -10.332575, + "im": -9.363082, + "freq": 1004.0, + "amp": 13.943795, + "phase": -2.4053786 + }, + { + "re": -9.648448, + "im": -5.8094196, + "freq": 1005.0, + "amp": 11.262411, + "phase": -2.5996237 + }, + { + "re": -17.182796, + "im": -6.061157, + "freq": 1006.0, + "amp": 18.220488, + "phase": -2.8024738 + }, + { + "re": 16.767656, + "im": 5.2283087, + "freq": 1007.0, + "amp": 17.56387, + "phase": 0.30225536 + }, + { + "re": -18.510786, + "im": -29.372398, + "freq": 1008.0, + "amp": 34.71868, + "phase": -2.1331334 + }, + { + "re": -22.221453, + "im": 7.1908617, + "freq": 1009.0, + "amp": 23.355972, + "phase": 2.8286276 + }, + { + "re": -19.977821, + "im": -0.068474114, + "freq": 1010.0, + "amp": 19.97794, + "phase": -3.1381652 + }, + { + "re": -8.775413, + "im": 36.08185, + "freq": 1011.0, + "amp": 37.133644, + "phase": 1.8093728 + }, + { + "re": -14.257203, + "im": 15.474762, + "freq": 1012.0, + "amp": 21.041294, + "phase": 2.3152661 + }, + { + "re": -30.259256, + "im": -19.037022, + "freq": 1013.0, + "amp": 35.749557, + "phase": -2.5800285 + }, + { + "re": -83.09586, + "im": -12.673558, + "freq": 1014.0, + "amp": 84.05678, + "phase": -2.9902418 + } + ] +} \ No newline at end of file diff --git a/assets/dft_source.json b/assets/dft_source.json new file mode 100644 index 0000000..f34743d --- /dev/null +++ b/assets/dft_source.json @@ -0,0 +1,28420 @@ +{ + "metadata": { + "height": 800, + "width": 800 + }, + "points": [ + { + "re": -384, + "im": 396 + }, + { + "re": -384, + "im": 396 + }, + { + "re": -384, + "im": 396 + }, + { + "re": -384, + "im": 396 + }, + { + "re": -384, + "im": 396 + }, + { + "re": -384, + "im": 396 + }, + { + "re": -384, + "im": 396 + }, + { + "re": -384, + "im": 394 + }, + { + "re": -383, + "im": 392 + }, + { + "re": -383, + "im": 391 + }, + { + "re": -381, + "im": 390 + }, + { + "re": -381, + "im": 388 + }, + { + "re": -380, + "im": 386 + }, + { + "re": -380, + "im": 385 + }, + { + "re": -379, + "im": 384 + }, + { + "re": -378, + "im": 383 + }, + { + "re": -377, + "im": 381 + }, + { + "re": -376, + "im": 380 + }, + { + "re": -376, + "im": 380 + }, + { + "re": -376, + "im": 379 + }, + { + "re": -376, + "im": 378 + }, + { + "re": -376, + "im": 377 + }, + { + "re": -376, + "im": 377 + }, + { + "re": -375, + "im": 376 + }, + { + "re": -375, + "im": 375 + }, + { + "re": -375, + "im": 375 + }, + { + "re": -375, + "im": 373 + }, + { + "re": -375, + "im": 373 + }, + { + "re": -375, + "im": 372 + }, + { + "re": -375, + "im": 370 + }, + { + "re": -375, + "im": 369 + }, + { + "re": -375, + "im": 367 + }, + { + "re": -375, + "im": 364 + }, + { + "re": -374, + "im": 363 + }, + { + "re": -374, + "im": 361 + }, + { + "re": -374, + "im": 359 + }, + { + "re": -374, + "im": 357 + }, + { + "re": -374, + "im": 355 + }, + { + "re": -374, + "im": 354 + }, + { + "re": -374, + "im": 352 + }, + { + "re": -374, + "im": 351 + }, + { + "re": -374, + "im": 350 + }, + { + "re": -374, + "im": 350 + }, + { + "re": -374, + "im": 348 + }, + { + "re": -374, + "im": 347 + }, + { + "re": -374, + "im": 347 + }, + { + "re": -374, + "im": 346 + }, + { + "re": -374, + "im": 346 + }, + { + "re": -374, + "im": 346 + }, + { + "re": -374, + "im": 344 + }, + { + "re": -374, + "im": 342 + }, + { + "re": -374, + "im": 341 + }, + { + "re": -374, + "im": 339 + }, + { + "re": -373, + "im": 338 + }, + { + "re": -373, + "im": 337 + }, + { + "re": -372, + "im": 336 + }, + { + "re": -372, + "im": 335 + }, + { + "re": -372, + "im": 333 + }, + { + "re": -372, + "im": 331 + }, + { + "re": -371, + "im": 330 + }, + { + "re": -371, + "im": 329 + }, + { + "re": -371, + "im": 328 + }, + { + "re": -371, + "im": 327 + }, + { + "re": -371, + "im": 324 + }, + { + "re": -370, + "im": 323 + }, + { + "re": -369, + "im": 322 + }, + { + "re": -369, + "im": 321 + }, + { + "re": -369, + "im": 319 + }, + { + "re": -368, + "im": 317 + }, + { + "re": -367, + "im": 315 + }, + { + "re": -367, + "im": 313 + }, + { + "re": -366, + "im": 310 + }, + { + "re": -366, + "im": 309 + }, + { + "re": -366, + "im": 308 + }, + { + "re": -366, + "im": 307 + }, + { + "re": -366, + "im": 306 + }, + { + "re": -365, + "im": 305 + }, + { + "re": -364, + "im": 304 + }, + { + "re": -364, + "im": 303 + }, + { + "re": -364, + "im": 302 + }, + { + "re": -364, + "im": 301 + }, + { + "re": -363, + "im": 300 + }, + { + "re": -363, + "im": 299 + }, + { + "re": -363, + "im": 299 + }, + { + "re": -363, + "im": 299 + }, + { + "re": -363, + "im": 298 + }, + { + "re": -363, + "im": 297 + }, + { + "re": -362, + "im": 295 + }, + { + "re": -362, + "im": 294 + }, + { + "re": -362, + "im": 294 + }, + { + "re": -362, + "im": 293 + }, + { + "re": -361, + "im": 293 + }, + { + "re": -360, + "im": 292 + }, + { + "re": -359, + "im": 290 + }, + { + "re": -358, + "im": 288 + }, + { + "re": -356, + "im": 286 + }, + { + "re": -356, + "im": 286 + }, + { + "re": -356, + "im": 285 + }, + { + "re": -355, + "im": 285 + }, + { + "re": -355, + "im": 284 + }, + { + "re": -354, + "im": 284 + }, + { + "re": -354, + "im": 283 + }, + { + "re": -354, + "im": 282 + }, + { + "re": -353, + "im": 282 + }, + { + "re": -352, + "im": 282 + }, + { + "re": -351, + "im": 281 + }, + { + "re": -349, + "im": 280 + }, + { + "re": -348, + "im": 279 + }, + { + "re": -347, + "im": 278 + }, + { + "re": -347, + "im": 278 + }, + { + "re": -347, + "im": 278 + }, + { + "re": -347, + "im": 278 + }, + { + "re": -347, + "im": 278 + }, + { + "re": -346, + "im": 278 + }, + { + "re": -344, + "im": 277 + }, + { + "re": -343, + "im": 276 + }, + { + "re": -342, + "im": 275 + }, + { + "re": -341, + "im": 274 + }, + { + "re": -340, + "im": 273 + }, + { + "re": -340, + "im": 273 + }, + { + "re": -340, + "im": 273 + }, + { + "re": -340, + "im": 273 + }, + { + "re": -339, + "im": 273 + }, + { + "re": -338, + "im": 273 + }, + { + "re": -337, + "im": 272 + }, + { + "re": -336, + "im": 271 + }, + { + "re": -335, + "im": 270 + }, + { + "re": -334, + "im": 270 + }, + { + "re": -334, + "im": 270 + }, + { + "re": -333, + "im": 269 + }, + { + "re": -331, + "im": 269 + }, + { + "re": -329, + "im": 268 + }, + { + "re": -327, + "im": 268 + }, + { + "re": -326, + "im": 266 + }, + { + "re": -326, + "im": 266 + }, + { + "re": -325, + "im": 266 + }, + { + "re": -325, + "im": 266 + }, + { + "re": -325, + "im": 266 + }, + { + "re": -323, + "im": 265 + }, + { + "re": -322, + "im": 265 + }, + { + "re": -321, + "im": 264 + }, + { + "re": -319, + "im": 264 + }, + { + "re": -318, + "im": 263 + }, + { + "re": -318, + "im": 262 + }, + { + "re": -318, + "im": 262 + }, + { + "re": -317, + "im": 262 + }, + { + "re": -315, + "im": 261 + }, + { + "re": -314, + "im": 261 + }, + { + "re": -313, + "im": 260 + }, + { + "re": -312, + "im": 260 + }, + { + "re": -311, + "im": 259 + }, + { + "re": -310, + "im": 258 + }, + { + "re": -310, + "im": 258 + }, + { + "re": -308, + "im": 257 + }, + { + "re": -307, + "im": 257 + }, + { + "re": -307, + "im": 257 + }, + { + "re": -307, + "im": 257 + }, + { + "re": -307, + "im": 257 + }, + { + "re": -307, + "im": 257 + }, + { + "re": -307, + "im": 257 + }, + { + "re": -306, + "im": 256 + }, + { + "re": -306, + "im": 256 + }, + { + "re": -305, + "im": 255 + }, + { + "re": -305, + "im": 255 + }, + { + "re": -305, + "im": 255 + }, + { + "re": -305, + "im": 255 + }, + { + "re": -305, + "im": 254 + }, + { + "re": -304, + "im": 253 + }, + { + "re": -304, + "im": 253 + }, + { + "re": -304, + "im": 253 + }, + { + "re": -304, + "im": 253 + }, + { + "re": -304, + "im": 252 + }, + { + "re": -303, + "im": 251 + }, + { + "re": -303, + "im": 249 + }, + { + "re": -303, + "im": 248 + }, + { + "re": -303, + "im": 247 + }, + { + "re": -303, + "im": 247 + }, + { + "re": -303, + "im": 247 + }, + { + "re": -303, + "im": 246 + }, + { + "re": -303, + "im": 246 + }, + { + "re": -303, + "im": 245 + }, + { + "re": -303, + "im": 245 + }, + { + "re": -303, + "im": 244 + }, + { + "re": -303, + "im": 243 + }, + { + "re": -303, + "im": 241 + }, + { + "re": -303, + "im": 241 + }, + { + "re": -303, + "im": 240 + }, + { + "re": -303, + "im": 240 + }, + { + "re": -303, + "im": 239 + }, + { + "re": -303, + "im": 239 + }, + { + "re": -302, + "im": 237 + }, + { + "re": -302, + "im": 237 + }, + { + "re": -302, + "im": 236 + }, + { + "re": -302, + "im": 236 + }, + { + "re": -302, + "im": 235 + }, + { + "re": -302, + "im": 235 + }, + { + "re": -301, + "im": 234 + }, + { + "re": -301, + "im": 233 + }, + { + "re": -300, + "im": 233 + }, + { + "re": -300, + "im": 232 + }, + { + "re": -300, + "im": 232 + }, + { + "re": -300, + "im": 232 + }, + { + "re": -300, + "im": 232 + }, + { + "re": -300, + "im": 232 + }, + { + "re": -300, + "im": 232 + }, + { + "re": -300, + "im": 232 + }, + { + "re": -298, + "im": 232 + }, + { + "re": -298, + "im": 232 + }, + { + "re": -297, + "im": 232 + }, + { + "re": -296, + "im": 232 + }, + { + "re": -294, + "im": 232 + }, + { + "re": -293, + "im": 232 + }, + { + "re": -292, + "im": 232 + }, + { + "re": -292, + "im": 232 + }, + { + "re": -292, + "im": 232 + }, + { + "re": -292, + "im": 232 + }, + { + "re": -290, + "im": 232 + }, + { + "re": -288, + "im": 233 + }, + { + "re": -287, + "im": 234 + }, + { + "re": -286, + "im": 234 + }, + { + "re": -286, + "im": 234 + }, + { + "re": -286, + "im": 234 + }, + { + "re": -286, + "im": 234 + }, + { + "re": -286, + "im": 234 + }, + { + "re": -285, + "im": 235 + }, + { + "re": -284, + "im": 236 + }, + { + "re": -282, + "im": 236 + }, + { + "re": -282, + "im": 236 + }, + { + "re": -281, + "im": 237 + }, + { + "re": -281, + "im": 237 + }, + { + "re": -281, + "im": 237 + }, + { + "re": -280, + "im": 237 + }, + { + "re": -278, + "im": 237 + }, + { + "re": -278, + "im": 237 + }, + { + "re": -277, + "im": 238 + }, + { + "re": -276, + "im": 238 + }, + { + "re": -275, + "im": 238 + }, + { + "re": -274, + "im": 238 + }, + { + "re": -273, + "im": 238 + }, + { + "re": -273, + "im": 238 + }, + { + "re": -272, + "im": 238 + }, + { + "re": -271, + "im": 238 + }, + { + "re": -270, + "im": 238 + }, + { + "re": -268, + "im": 238 + }, + { + "re": -268, + "im": 237 + }, + { + "re": -267, + "im": 237 + }, + { + "re": -265, + "im": 237 + }, + { + "re": -264, + "im": 236 + }, + { + "re": -263, + "im": 235 + }, + { + "re": -261, + "im": 235 + }, + { + "re": -260, + "im": 235 + }, + { + "re": -258, + "im": 233 + }, + { + "re": -256, + "im": 232 + }, + { + "re": -255, + "im": 231 + }, + { + "re": -254, + "im": 231 + }, + { + "re": -253, + "im": 229 + }, + { + "re": -251, + "im": 229 + }, + { + "re": -251, + "im": 228 + }, + { + "re": -250, + "im": 228 + }, + { + "re": -249, + "im": 228 + }, + { + "re": -249, + "im": 227 + }, + { + "re": -248, + "im": 227 + }, + { + "re": -246, + "im": 226 + }, + { + "re": -245, + "im": 225 + }, + { + "re": -244, + "im": 224 + }, + { + "re": -243, + "im": 223 + }, + { + "re": -242, + "im": 223 + }, + { + "re": -241, + "im": 223 + }, + { + "re": -240, + "im": 223 + }, + { + "re": -239, + "im": 222 + }, + { + "re": -238, + "im": 222 + }, + { + "re": -236, + "im": 221 + }, + { + "re": -236, + "im": 220 + }, + { + "re": -234, + "im": 219 + }, + { + "re": -234, + "im": 219 + }, + { + "re": -232, + "im": 218 + }, + { + "re": -232, + "im": 218 + }, + { + "re": -231, + "im": 218 + }, + { + "re": -229, + "im": 217 + }, + { + "re": -227, + "im": 216 + }, + { + "re": -224, + "im": 215 + }, + { + "re": -222, + "im": 213 + }, + { + "re": -220, + "im": 212 + }, + { + "re": -219, + "im": 211 + }, + { + "re": -218, + "im": 211 + }, + { + "re": -218, + "im": 211 + }, + { + "re": -216, + "im": 210 + }, + { + "re": -215, + "im": 210 + }, + { + "re": -214, + "im": 209 + }, + { + "re": -212, + "im": 208 + }, + { + "re": -212, + "im": 207 + }, + { + "re": -211, + "im": 207 + }, + { + "re": -210, + "im": 207 + }, + { + "re": -210, + "im": 207 + }, + { + "re": -210, + "im": 207 + }, + { + "re": -209, + "im": 207 + }, + { + "re": -208, + "im": 206 + }, + { + "re": -208, + "im": 206 + }, + { + "re": -207, + "im": 206 + }, + { + "re": -207, + "im": 205 + }, + { + "re": -206, + "im": 205 + }, + { + "re": -206, + "im": 205 + }, + { + "re": -205, + "im": 204 + }, + { + "re": -204, + "im": 204 + }, + { + "re": -202, + "im": 203 + }, + { + "re": -201, + "im": 202 + }, + { + "re": -201, + "im": 202 + }, + { + "re": -199, + "im": 201 + }, + { + "re": -199, + "im": 200 + }, + { + "re": -198, + "im": 200 + }, + { + "re": -197, + "im": 199 + }, + { + "re": -196, + "im": 199 + }, + { + "re": -195, + "im": 198 + }, + { + "re": -194, + "im": 197 + }, + { + "re": -193, + "im": 197 + }, + { + "re": -192, + "im": 196 + }, + { + "re": -192, + "im": 196 + }, + { + "re": -191, + "im": 196 + }, + { + "re": -190, + "im": 195 + }, + { + "re": -189, + "im": 195 + }, + { + "re": -187, + "im": 194 + }, + { + "re": -186, + "im": 193 + }, + { + "re": -185, + "im": 192 + }, + { + "re": -183, + "im": 191 + }, + { + "re": -183, + "im": 191 + }, + { + "re": -182, + "im": 190 + }, + { + "re": -182, + "im": 190 + }, + { + "re": -180, + "im": 190 + }, + { + "re": -178, + "im": 189 + }, + { + "re": -177, + "im": 188 + }, + { + "re": -176, + "im": 187 + }, + { + "re": -175, + "im": 186 + }, + { + "re": -175, + "im": 186 + }, + { + "re": -174, + "im": 186 + }, + { + "re": -174, + "im": 186 + }, + { + "re": -174, + "im": 186 + }, + { + "re": -173, + "im": 185 + }, + { + "re": -172, + "im": 184 + }, + { + "re": -170, + "im": 183 + }, + { + "re": -170, + "im": 183 + }, + { + "re": -170, + "im": 182 + }, + { + "re": -170, + "im": 182 + }, + { + "re": -170, + "im": 182 + }, + { + "re": -170, + "im": 182 + }, + { + "re": -169, + "im": 182 + }, + { + "re": -168, + "im": 181 + }, + { + "re": -168, + "im": 180 + }, + { + "re": -166, + "im": 179 + }, + { + "re": -166, + "im": 178 + }, + { + "re": -166, + "im": 178 + }, + { + "re": -166, + "im": 177 + }, + { + "re": -166, + "im": 177 + }, + { + "re": -165, + "im": 176 + }, + { + "re": -165, + "im": 175 + }, + { + "re": -165, + "im": 173 + }, + { + "re": -165, + "im": 172 + }, + { + "re": -165, + "im": 171 + }, + { + "re": -165, + "im": 171 + }, + { + "re": -165, + "im": 171 + }, + { + "re": -165, + "im": 171 + }, + { + "re": -165, + "im": 170 + }, + { + "re": -164, + "im": 169 + }, + { + "re": -164, + "im": 168 + }, + { + "re": -164, + "im": 167 + }, + { + "re": -164, + "im": 166 + }, + { + "re": -164, + "im": 166 + }, + { + "re": -164, + "im": 166 + }, + { + "re": -164, + "im": 166 + }, + { + "re": -163, + "im": 165 + }, + { + "re": -163, + "im": 165 + }, + { + "re": -162, + "im": 163 + }, + { + "re": -162, + "im": 163 + }, + { + "re": -162, + "im": 161 + }, + { + "re": -161, + "im": 161 + }, + { + "re": -161, + "im": 160 + }, + { + "re": -161, + "im": 160 + }, + { + "re": -161, + "im": 159 + }, + { + "re": -161, + "im": 159 + }, + { + "re": -160, + "im": 158 + }, + { + "re": -160, + "im": 158 + }, + { + "re": -160, + "im": 157 + }, + { + "re": -160, + "im": 157 + }, + { + "re": -159, + "im": 156 + }, + { + "re": -158, + "im": 155 + }, + { + "re": -158, + "im": 154 + }, + { + "re": -158, + "im": 154 + }, + { + "re": -158, + "im": 154 + }, + { + "re": -157, + "im": 154 + }, + { + "re": -157, + "im": 153 + }, + { + "re": -157, + "im": 153 + }, + { + "re": -156, + "im": 152 + }, + { + "re": -156, + "im": 152 + }, + { + "re": -155, + "im": 150 + }, + { + "re": -155, + "im": 150 + }, + { + "re": -154, + "im": 150 + }, + { + "re": -154, + "im": 149 + }, + { + "re": -154, + "im": 148 + }, + { + "re": -153, + "im": 148 + }, + { + "re": -153, + "im": 148 + }, + { + "re": -153, + "im": 146 + }, + { + "re": -152, + "im": 146 + }, + { + "re": -152, + "im": 146 + }, + { + "re": -152, + "im": 146 + }, + { + "re": -152, + "im": 146 + }, + { + "re": -152, + "im": 145 + }, + { + "re": -152, + "im": 145 + }, + { + "re": -152, + "im": 144 + }, + { + "re": -152, + "im": 144 + }, + { + "re": -152, + "im": 144 + }, + { + "re": -151, + "im": 142 + }, + { + "re": -151, + "im": 141 + }, + { + "re": -151, + "im": 140 + }, + { + "re": -151, + "im": 139 + }, + { + "re": -151, + "im": 138 + }, + { + "re": -151, + "im": 138 + }, + { + "re": -150, + "im": 138 + }, + { + "re": -150, + "im": 138 + }, + { + "re": -150, + "im": 138 + }, + { + "re": -150, + "im": 137 + }, + { + "re": -150, + "im": 136 + }, + { + "re": -150, + "im": 136 + }, + { + "re": -150, + "im": 134 + }, + { + "re": -150, + "im": 133 + }, + { + "re": -150, + "im": 132 + }, + { + "re": -150, + "im": 131 + }, + { + "re": -150, + "im": 130 + }, + { + "re": -150, + "im": 128 + }, + { + "re": -150, + "im": 127 + }, + { + "re": -150, + "im": 125 + }, + { + "re": -149, + "im": 125 + }, + { + "re": -149, + "im": 125 + }, + { + "re": -149, + "im": 125 + }, + { + "re": -149, + "im": 124 + }, + { + "re": -149, + "im": 124 + }, + { + "re": -149, + "im": 123 + }, + { + "re": -149, + "im": 123 + }, + { + "re": -149, + "im": 121 + }, + { + "re": -149, + "im": 121 + }, + { + "re": -149, + "im": 120 + }, + { + "re": -149, + "im": 119 + }, + { + "re": -149, + "im": 119 + }, + { + "re": -149, + "im": 118 + }, + { + "re": -149, + "im": 117 + }, + { + "re": -149, + "im": 116 + }, + { + "re": -149, + "im": 116 + }, + { + "re": -149, + "im": 115 + }, + { + "re": -149, + "im": 114 + }, + { + "re": -149, + "im": 113 + }, + { + "re": -149, + "im": 112 + }, + { + "re": -149, + "im": 112 + }, + { + "re": -149, + "im": 112 + }, + { + "re": -149, + "im": 112 + }, + { + "re": -149, + "im": 112 + }, + { + "re": -149, + "im": 111 + }, + { + "re": -149, + "im": 109 + }, + { + "re": -149, + "im": 108 + }, + { + "re": -149, + "im": 108 + }, + { + "re": -149, + "im": 107 + }, + { + "re": -149, + "im": 106 + }, + { + "re": -149, + "im": 106 + }, + { + "re": -149, + "im": 105 + }, + { + "re": -149, + "im": 105 + }, + { + "re": -149, + "im": 104 + }, + { + "re": -149, + "im": 104 + }, + { + "re": -149, + "im": 103 + }, + { + "re": -149, + "im": 102 + }, + { + "re": -149, + "im": 101 + }, + { + "re": -149, + "im": 101 + }, + { + "re": -149, + "im": 101 + }, + { + "re": -149, + "im": 101 + }, + { + "re": -149, + "im": 100 + }, + { + "re": -148, + "im": 100 + }, + { + "re": -148, + "im": 99 + }, + { + "re": -147, + "im": 98 + }, + { + "re": -147, + "im": 96 + }, + { + "re": -147, + "im": 96 + }, + { + "re": -146, + "im": 95 + }, + { + "re": -146, + "im": 95 + }, + { + "re": -146, + "im": 95 + }, + { + "re": -145, + "im": 95 + }, + { + "re": -145, + "im": 95 + }, + { + "re": -145, + "im": 94 + }, + { + "re": -145, + "im": 94 + }, + { + "re": -145, + "im": 93 + }, + { + "re": -144, + "im": 92 + }, + { + "re": -144, + "im": 91 + }, + { + "re": -143, + "im": 91 + }, + { + "re": -143, + "im": 91 + }, + { + "re": -143, + "im": 91 + }, + { + "re": -143, + "im": 91 + }, + { + "re": -143, + "im": 91 + }, + { + "re": -143, + "im": 91 + }, + { + "re": -143, + "im": 91 + }, + { + "re": -143, + "im": 90 + }, + { + "re": -142, + "im": 89 + }, + { + "re": -142, + "im": 88 + }, + { + "re": -141, + "im": 88 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 87 + }, + { + "re": -141, + "im": 86 + }, + { + "re": -141, + "im": 86 + }, + { + "re": -141, + "im": 86 + }, + { + "re": -141, + "im": 85 + }, + { + "re": -142, + "im": 85 + }, + { + "re": -142, + "im": 84 + }, + { + "re": -142, + "im": 84 + }, + { + "re": -143, + "im": 83 + }, + { + "re": -143, + "im": 83 + }, + { + "re": -143, + "im": 83 + }, + { + "re": -143, + "im": 83 + }, + { + "re": -144, + "im": 83 + }, + { + "re": -144, + "im": 83 + }, + { + "re": -144, + "im": 82 + }, + { + "re": -145, + "im": 82 + }, + { + "re": -145, + "im": 81 + }, + { + "re": -145, + "im": 80 + }, + { + "re": -146, + "im": 80 + }, + { + "re": -146, + "im": 80 + }, + { + "re": -147, + "im": 80 + }, + { + "re": -147, + "im": 80 + }, + { + "re": -147, + "im": 80 + }, + { + "re": -148, + "im": 79 + }, + { + "re": -148, + "im": 79 + }, + { + "re": -149, + "im": 79 + }, + { + "re": -150, + "im": 79 + }, + { + "re": -151, + "im": 79 + }, + { + "re": -151, + "im": 79 + }, + { + "re": -151, + "im": 79 + }, + { + "re": -152, + "im": 79 + }, + { + "re": -152, + "im": 78 + }, + { + "re": -153, + "im": 78 + }, + { + "re": -154, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 78 + }, + { + "re": -155, + "im": 77 + }, + { + "re": -155, + "im": 76 + }, + { + "re": -156, + "im": 75 + }, + { + "re": -156, + "im": 74 + }, + { + "re": -156, + "im": 73 + }, + { + "re": -156, + "im": 73 + }, + { + "re": -156, + "im": 72 + }, + { + "re": -156, + "im": 72 + }, + { + "re": -156, + "im": 71 + }, + { + "re": -156, + "im": 70 + }, + { + "re": -156, + "im": 68 + }, + { + "re": -156, + "im": 67 + }, + { + "re": -156, + "im": 65 + }, + { + "re": -156, + "im": 64 + }, + { + "re": -156, + "im": 63 + }, + { + "re": -156, + "im": 62 + }, + { + "re": -156, + "im": 61 + }, + { + "re": -156, + "im": 59 + }, + { + "re": -156, + "im": 58 + }, + { + "re": -156, + "im": 58 + }, + { + "re": -156, + "im": 57 + }, + { + "re": -156, + "im": 56 + }, + { + "re": -156, + "im": 55 + }, + { + "re": -156, + "im": 54 + }, + { + "re": -156, + "im": 54 + }, + { + "re": -156, + "im": 53 + }, + { + "re": -156, + "im": 52 + }, + { + "re": -156, + "im": 52 + }, + { + "re": -156, + "im": 51 + }, + { + "re": -156, + "im": 51 + }, + { + "re": -156, + "im": 51 + }, + { + "re": -156, + "im": 50 + }, + { + "re": -156, + "im": 50 + }, + { + "re": -156, + "im": 49 + }, + { + "re": -157, + "im": 48 + }, + { + "re": -157, + "im": 47 + }, + { + "re": -157, + "im": 46 + }, + { + "re": -157, + "im": 46 + }, + { + "re": -157, + "im": 45 + }, + { + "re": -158, + "im": 43 + }, + { + "re": -159, + "im": 42 + }, + { + "re": -159, + "im": 41 + }, + { + "re": -160, + "im": 39 + }, + { + "re": -160, + "im": 39 + }, + { + "re": -160, + "im": 38 + }, + { + "re": -161, + "im": 37 + }, + { + "re": -161, + "im": 37 + }, + { + "re": -161, + "im": 36 + }, + { + "re": -161, + "im": 35 + }, + { + "re": -162, + "im": 34 + }, + { + "re": -163, + "im": 34 + }, + { + "re": -163, + "im": 33 + }, + { + "re": -163, + "im": 33 + }, + { + "re": -163, + "im": 33 + }, + { + "re": -163, + "im": 33 + }, + { + "re": -163, + "im": 33 + }, + { + "re": -163, + "im": 33 + }, + { + "re": -164, + "im": 31 + }, + { + "re": -165, + "im": 30 + }, + { + "re": -166, + "im": 28 + }, + { + "re": -167, + "im": 27 + }, + { + "re": -168, + "im": 25 + }, + { + "re": -168, + "im": 25 + }, + { + "re": -168, + "im": 24 + }, + { + "re": -169, + "im": 23 + }, + { + "re": -169, + "im": 22 + }, + { + "re": -171, + "im": 21 + }, + { + "re": -171, + "im": 20 + }, + { + "re": -172, + "im": 19 + }, + { + "re": -172, + "im": 18 + }, + { + "re": -172, + "im": 18 + }, + { + "re": -172, + "im": 18 + }, + { + "re": -173, + "im": 17 + }, + { + "re": -173, + "im": 17 + }, + { + "re": -174, + "im": 16 + }, + { + "re": -174, + "im": 15 + }, + { + "re": -175, + "im": 14 + }, + { + "re": -175, + "im": 14 + }, + { + "re": -176, + "im": 13 + }, + { + "re": -176, + "im": 13 + }, + { + "re": -176, + "im": 13 + }, + { + "re": -176, + "im": 12 + }, + { + "re": -177, + "im": 11 + }, + { + "re": -177, + "im": 10 + }, + { + "re": -177, + "im": 10 + }, + { + "re": -178, + "im": 9 + }, + { + "re": -178, + "im": 8 + }, + { + "re": -178, + "im": 8 + }, + { + "re": -178, + "im": 7 + }, + { + "re": -179, + "im": 6 + }, + { + "re": -179, + "im": 6 + }, + { + "re": -179, + "im": 5 + }, + { + "re": -180, + "im": 4 + }, + { + "re": -180, + "im": 4 + }, + { + "re": -180, + "im": 3 + }, + { + "re": -180, + "im": 1 + }, + { + "re": -180, + "im": 0 + }, + { + "re": -180, + "im": -1 + }, + { + "re": -180, + "im": -3 + }, + { + "re": -180, + "im": -3 + }, + { + "re": -180, + "im": -3 + }, + { + "re": -180, + "im": -3 + }, + { + "re": -180, + "im": -3 + }, + { + "re": -180, + "im": -4 + }, + { + "re": -180, + "im": -5 + }, + { + "re": -180, + "im": -5 + }, + { + "re": -180, + "im": -6 + }, + { + "re": -180, + "im": -7 + }, + { + "re": -180, + "im": -7 + }, + { + "re": -180, + "im": -8 + }, + { + "re": -180, + "im": -9 + }, + { + "re": -180, + "im": -9 + }, + { + "re": -180, + "im": -11 + }, + { + "re": -180, + "im": -11 + }, + { + "re": -180, + "im": -11 + }, + { + "re": -180, + "im": -11 + }, + { + "re": -180, + "im": -11 + }, + { + "re": -180, + "im": -12 + }, + { + "re": -180, + "im": -12 + }, + { + "re": -180, + "im": -12 + }, + { + "re": -180, + "im": -12 + }, + { + "re": -180, + "im": -12 + }, + { + "re": -180, + "im": -13 + }, + { + "re": -180, + "im": -13 + }, + { + "re": -180, + "im": -13 + }, + { + "re": -180, + "im": -15 + }, + { + "re": -180, + "im": -15 + }, + { + "re": -180, + "im": -15 + }, + { + "re": -180, + "im": -16 + }, + { + "re": -180, + "im": -16 + }, + { + "re": -180, + "im": -17 + }, + { + "re": -180, + "im": -19 + }, + { + "re": -180, + "im": -19 + }, + { + "re": -180, + "im": -20 + }, + { + "re": -180, + "im": -20 + }, + { + "re": -180, + "im": -20 + }, + { + "re": -180, + "im": -20 + }, + { + "re": -180, + "im": -20 + }, + { + "re": -180, + "im": -21 + }, + { + "re": -180, + "im": -21 + }, + { + "re": -180, + "im": -21 + }, + { + "re": -180, + "im": -21 + }, + { + "re": -180, + "im": -21 + }, + { + "re": -180, + "im": -21 + }, + { + "re": -181, + "im": -22 + }, + { + "re": -181, + "im": -23 + }, + { + "re": -181, + "im": -24 + }, + { + "re": -182, + "im": -24 + }, + { + "re": -182, + "im": -24 + }, + { + "re": -182, + "im": -25 + }, + { + "re": -182, + "im": -25 + }, + { + "re": -182, + "im": -27 + }, + { + "re": -183, + "im": -27 + }, + { + "re": -184, + "im": -28 + }, + { + "re": -184, + "im": -29 + }, + { + "re": -185, + "im": -30 + }, + { + "re": -185, + "im": -31 + }, + { + "re": -185, + "im": -31 + }, + { + "re": -185, + "im": -32 + }, + { + "re": -185, + "im": -33 + }, + { + "re": -185, + "im": -35 + }, + { + "re": -185, + "im": -36 + }, + { + "re": -185, + "im": -37 + }, + { + "re": -185, + "im": -39 + }, + { + "re": -185, + "im": -40 + }, + { + "re": -185, + "im": -41 + }, + { + "re": -185, + "im": -42 + }, + { + "re": -185, + "im": -43 + }, + { + "re": -185, + "im": -44 + }, + { + "re": -185, + "im": -45 + }, + { + "re": -185, + "im": -46 + }, + { + "re": -185, + "im": -46 + }, + { + "re": -185, + "im": -48 + }, + { + "re": -185, + "im": -48 + }, + { + "re": -185, + "im": -49 + }, + { + "re": -185, + "im": -50 + }, + { + "re": -185, + "im": -51 + }, + { + "re": -185, + "im": -52 + }, + { + "re": -185, + "im": -53 + }, + { + "re": -185, + "im": -54 + }, + { + "re": -185, + "im": -55 + }, + { + "re": -185, + "im": -56 + }, + { + "re": -185, + "im": -56 + }, + { + "re": -185, + "im": -58 + }, + { + "re": -185, + "im": -59 + }, + { + "re": -185, + "im": -60 + }, + { + "re": -185, + "im": -62 + }, + { + "re": -185, + "im": -64 + }, + { + "re": -185, + "im": -66 + }, + { + "re": -185, + "im": -67 + }, + { + "re": -185, + "im": -69 + }, + { + "re": -184, + "im": -71 + }, + { + "re": -184, + "im": -73 + }, + { + "re": -183, + "im": -74 + }, + { + "re": -183, + "im": -77 + }, + { + "re": -183, + "im": -78 + }, + { + "re": -183, + "im": -80 + }, + { + "re": -183, + "im": -81 + }, + { + "re": -182, + "im": -82 + }, + { + "re": -182, + "im": -82 + }, + { + "re": -182, + "im": -83 + }, + { + "re": -182, + "im": -84 + }, + { + "re": -182, + "im": -86 + }, + { + "re": -182, + "im": -87 + }, + { + "re": -181, + "im": -89 + }, + { + "re": -181, + "im": -91 + }, + { + "re": -181, + "im": -92 + }, + { + "re": -181, + "im": -93 + }, + { + "re": -181, + "im": -94 + }, + { + "re": -180, + "im": -95 + }, + { + "re": -180, + "im": -95 + }, + { + "re": -179, + "im": -96 + }, + { + "re": -179, + "im": -98 + }, + { + "re": -179, + "im": -99 + }, + { + "re": -179, + "im": -99 + }, + { + "re": -179, + "im": -100 + }, + { + "re": -179, + "im": -100 + }, + { + "re": -179, + "im": -101 + }, + { + "re": -179, + "im": -102 + }, + { + "re": -179, + "im": -103 + }, + { + "re": -178, + "im": -104 + }, + { + "re": -178, + "im": -105 + }, + { + "re": -178, + "im": -105 + }, + { + "re": -178, + "im": -106 + }, + { + "re": -178, + "im": -106 + }, + { + "re": -178, + "im": -107 + }, + { + "re": -178, + "im": -107 + }, + { + "re": -178, + "im": -108 + }, + { + "re": -177, + "im": -109 + }, + { + "re": -177, + "im": -110 + }, + { + "re": -177, + "im": -111 + }, + { + "re": -176, + "im": -111 + }, + { + "re": -176, + "im": -112 + }, + { + "re": -175, + "im": -114 + }, + { + "re": -175, + "im": -115 + }, + { + "re": -175, + "im": -116 + }, + { + "re": -174, + "im": -117 + }, + { + "re": -174, + "im": -119 + }, + { + "re": -174, + "im": -119 + }, + { + "re": -173, + "im": -120 + }, + { + "re": -173, + "im": -121 + }, + { + "re": -173, + "im": -123 + }, + { + "re": -172, + "im": -124 + }, + { + "re": -172, + "im": -124 + }, + { + "re": -171, + "im": -125 + }, + { + "re": -171, + "im": -126 + }, + { + "re": -171, + "im": -126 + }, + { + "re": -171, + "im": -126 + }, + { + "re": -170, + "im": -127 + }, + { + "re": -170, + "im": -128 + }, + { + "re": -169, + "im": -129 + }, + { + "re": -168, + "im": -131 + }, + { + "re": -168, + "im": -132 + }, + { + "re": -167, + "im": -133 + }, + { + "re": -166, + "im": -134 + }, + { + "re": -166, + "im": -135 + }, + { + "re": -165, + "im": -136 + }, + { + "re": -165, + "im": -136 + }, + { + "re": -165, + "im": -136 + }, + { + "re": -164, + "im": -137 + }, + { + "re": -164, + "im": -138 + }, + { + "re": -163, + "im": -139 + }, + { + "re": -162, + "im": -140 + }, + { + "re": -162, + "im": -141 + }, + { + "re": -162, + "im": -141 + }, + { + "re": -162, + "im": -142 + }, + { + "re": -161, + "im": -142 + }, + { + "re": -160, + "im": -143 + }, + { + "re": -160, + "im": -144 + }, + { + "re": -160, + "im": -145 + }, + { + "re": -159, + "im": -146 + }, + { + "re": -158, + "im": -147 + }, + { + "re": -158, + "im": -147 + }, + { + "re": -158, + "im": -148 + }, + { + "re": -158, + "im": -148 + }, + { + "re": -157, + "im": -149 + }, + { + "re": -157, + "im": -149 + }, + { + "re": -157, + "im": -150 + }, + { + "re": -157, + "im": -151 + }, + { + "re": -157, + "im": -151 + }, + { + "re": -156, + "im": -151 + }, + { + "re": -156, + "im": -152 + }, + { + "re": -156, + "im": -153 + }, + { + "re": -155, + "im": -153 + }, + { + "re": -155, + "im": -155 + }, + { + "re": -154, + "im": -155 + }, + { + "re": -154, + "im": -156 + }, + { + "re": -154, + "im": -157 + }, + { + "re": -153, + "im": -158 + }, + { + "re": -153, + "im": -160 + }, + { + "re": -152, + "im": -161 + }, + { + "re": -152, + "im": -162 + }, + { + "re": -152, + "im": -162 + }, + { + "re": -152, + "im": -162 + }, + { + "re": -151, + "im": -164 + }, + { + "re": -151, + "im": -164 + }, + { + "re": -150, + "im": -165 + }, + { + "re": -150, + "im": -166 + }, + { + "re": -150, + "im": -167 + }, + { + "re": -149, + "im": -168 + }, + { + "re": -149, + "im": -169 + }, + { + "re": -149, + "im": -170 + }, + { + "re": -148, + "im": -172 + }, + { + "re": -148, + "im": -174 + }, + { + "re": -146, + "im": -176 + }, + { + "re": -146, + "im": -177 + }, + { + "re": -146, + "im": -177 + }, + { + "re": -146, + "im": -178 + }, + { + "re": -146, + "im": -179 + }, + { + "re": -146, + "im": -180 + }, + { + "re": -145, + "im": -181 + }, + { + "re": -145, + "im": -183 + }, + { + "re": -145, + "im": -184 + }, + { + "re": -144, + "im": -185 + }, + { + "re": -144, + "im": -186 + }, + { + "re": -144, + "im": -187 + }, + { + "re": -144, + "im": -188 + }, + { + "re": -144, + "im": -189 + }, + { + "re": -144, + "im": -190 + }, + { + "re": -144, + "im": -190 + }, + { + "re": -143, + "im": -191 + }, + { + "re": -143, + "im": -191 + }, + { + "re": -143, + "im": -192 + }, + { + "re": -143, + "im": -192 + }, + { + "re": -143, + "im": -193 + }, + { + "re": -143, + "im": -193 + }, + { + "re": -143, + "im": -193 + }, + { + "re": -143, + "im": -193 + }, + { + "re": -143, + "im": -193 + }, + { + "re": -143, + "im": -193 + }, + { + "re": -143, + "im": -193 + }, + { + "re": -143, + "im": -194 + }, + { + "re": -143, + "im": -196 + }, + { + "re": -143, + "im": -197 + }, + { + "re": -143, + "im": -197 + }, + { + "re": -143, + "im": -198 + }, + { + "re": -143, + "im": -198 + }, + { + "re": -142, + "im": -199 + }, + { + "re": -142, + "im": -201 + }, + { + "re": -142, + "im": -202 + }, + { + "re": -142, + "im": -203 + }, + { + "re": -141, + "im": -203 + }, + { + "re": -141, + "im": -203 + }, + { + "re": -141, + "im": -203 + }, + { + "re": -141, + "im": -203 + }, + { + "re": -141, + "im": -203 + }, + { + "re": -141, + "im": -205 + }, + { + "re": -141, + "im": -206 + }, + { + "re": -141, + "im": -207 + }, + { + "re": -140, + "im": -207 + }, + { + "re": -140, + "im": -207 + }, + { + "re": -140, + "im": -208 + }, + { + "re": -140, + "im": -209 + }, + { + "re": -140, + "im": -210 + }, + { + "re": -139, + "im": -211 + }, + { + "re": -139, + "im": -212 + }, + { + "re": -139, + "im": -213 + }, + { + "re": -139, + "im": -213 + }, + { + "re": -138, + "im": -214 + }, + { + "re": -138, + "im": -214 + }, + { + "re": -137, + "im": -216 + }, + { + "re": -136, + "im": -218 + }, + { + "re": -136, + "im": -219 + }, + { + "re": -135, + "im": -220 + }, + { + "re": -135, + "im": -221 + }, + { + "re": -135, + "im": -222 + }, + { + "re": -134, + "im": -223 + }, + { + "re": -133, + "im": -224 + }, + { + "re": -133, + "im": -225 + }, + { + "re": -132, + "im": -227 + }, + { + "re": -132, + "im": -227 + }, + { + "re": -131, + "im": -228 + }, + { + "re": -131, + "im": -229 + }, + { + "re": -131, + "im": -229 + }, + { + "re": -131, + "im": -230 + }, + { + "re": -131, + "im": -231 + }, + { + "re": -129, + "im": -232 + }, + { + "re": -129, + "im": -233 + }, + { + "re": -129, + "im": -234 + }, + { + "re": -128, + "im": -235 + }, + { + "re": -128, + "im": -235 + }, + { + "re": -128, + "im": -236 + }, + { + "re": -127, + "im": -236 + }, + { + "re": -127, + "im": -237 + }, + { + "re": -127, + "im": -238 + }, + { + "re": -126, + "im": -239 + }, + { + "re": -126, + "im": -239 + }, + { + "re": -125, + "im": -240 + }, + { + "re": -125, + "im": -240 + }, + { + "re": -125, + "im": -240 + }, + { + "re": -125, + "im": -240 + }, + { + "re": -125, + "im": -240 + }, + { + "re": -125, + "im": -241 + }, + { + "re": -125, + "im": -242 + }, + { + "re": -124, + "im": -243 + }, + { + "re": -124, + "im": -243 + }, + { + "re": -124, + "im": -244 + }, + { + "re": -123, + "im": -244 + }, + { + "re": -123, + "im": -244 + }, + { + "re": -123, + "im": -245 + }, + { + "re": -123, + "im": -246 + }, + { + "re": -121, + "im": -246 + }, + { + "re": -121, + "im": -247 + }, + { + "re": -121, + "im": -248 + }, + { + "re": -120, + "im": -248 + }, + { + "re": -120, + "im": -248 + }, + { + "re": -120, + "im": -248 + }, + { + "re": -120, + "im": -249 + }, + { + "re": -119, + "im": -250 + }, + { + "re": -118, + "im": -251 + }, + { + "re": -118, + "im": -252 + }, + { + "re": -117, + "im": -252 + }, + { + "re": -117, + "im": -252 + }, + { + "re": -117, + "im": -252 + }, + { + "re": -117, + "im": -252 + }, + { + "re": -117, + "im": -253 + }, + { + "re": -116, + "im": -254 + }, + { + "re": -115, + "im": -255 + }, + { + "re": -115, + "im": -255 + }, + { + "re": -113, + "im": -256 + }, + { + "re": -113, + "im": -256 + }, + { + "re": -113, + "im": -256 + }, + { + "re": -112, + "im": -257 + }, + { + "re": -112, + "im": -257 + }, + { + "re": -111, + "im": -258 + }, + { + "re": -110, + "im": -259 + }, + { + "re": -110, + "im": -259 + }, + { + "re": -110, + "im": -259 + }, + { + "re": -109, + "im": -260 + }, + { + "re": -108, + "im": -260 + }, + { + "re": -107, + "im": -261 + }, + { + "re": -106, + "im": -262 + }, + { + "re": -105, + "im": -263 + }, + { + "re": -104, + "im": -263 + }, + { + "re": -103, + "im": -264 + }, + { + "re": -102, + "im": -265 + }, + { + "re": -102, + "im": -265 + }, + { + "re": -101, + "im": -265 + }, + { + "re": -101, + "im": -265 + }, + { + "re": -101, + "im": -265 + }, + { + "re": -101, + "im": -265 + }, + { + "re": -101, + "im": -265 + }, + { + "re": -101, + "im": -265 + }, + { + "re": -100, + "im": -266 + }, + { + "re": -100, + "im": -267 + }, + { + "re": -99, + "im": -267 + }, + { + "re": -99, + "im": -267 + }, + { + "re": -99, + "im": -267 + }, + { + "re": -98, + "im": -268 + }, + { + "re": -98, + "im": -268 + }, + { + "re": -97, + "im": -268 + }, + { + "re": -96, + "im": -269 + }, + { + "re": -95, + "im": -269 + }, + { + "re": -94, + "im": -269 + }, + { + "re": -94, + "im": -270 + }, + { + "re": -92, + "im": -271 + }, + { + "re": -92, + "im": -271 + }, + { + "re": -91, + "im": -272 + }, + { + "re": -90, + "im": -272 + }, + { + "re": -88, + "im": -273 + }, + { + "re": -88, + "im": -273 + }, + { + "re": -87, + "im": -274 + }, + { + "re": -86, + "im": -275 + }, + { + "re": -86, + "im": -275 + }, + { + "re": -85, + "im": -275 + }, + { + "re": -84, + "im": -276 + }, + { + "re": -83, + "im": -276 + }, + { + "re": -81, + "im": -277 + }, + { + "re": -80, + "im": -278 + }, + { + "re": -79, + "im": -279 + }, + { + "re": -78, + "im": -279 + }, + { + "re": -77, + "im": -279 + }, + { + "re": -76, + "im": -280 + }, + { + "re": -75, + "im": -280 + }, + { + "re": -73, + "im": -281 + }, + { + "re": -72, + "im": -281 + }, + { + "re": -70, + "im": -282 + }, + { + "re": -70, + "im": -283 + }, + { + "re": -70, + "im": -283 + }, + { + "re": -69, + "im": -283 + }, + { + "re": -68, + "im": -284 + }, + { + "re": -66, + "im": -284 + }, + { + "re": -65, + "im": -285 + }, + { + "re": -63, + "im": -285 + }, + { + "re": -63, + "im": -285 + }, + { + "re": -63, + "im": -285 + }, + { + "re": -63, + "im": -285 + }, + { + "re": -62, + "im": -285 + }, + { + "re": -61, + "im": -286 + }, + { + "re": -59, + "im": -286 + }, + { + "re": -58, + "im": -286 + }, + { + "re": -56, + "im": -287 + }, + { + "re": -55, + "im": -288 + }, + { + "re": -54, + "im": -288 + }, + { + "re": -53, + "im": -288 + }, + { + "re": -51, + "im": -288 + }, + { + "re": -49, + "im": -289 + }, + { + "re": -46, + "im": -289 + }, + { + "re": -44, + "im": -289 + }, + { + "re": -42, + "im": -290 + }, + { + "re": -41, + "im": -290 + }, + { + "re": -40, + "im": -290 + }, + { + "re": -39, + "im": -290 + }, + { + "re": -38, + "im": -290 + }, + { + "re": -37, + "im": -290 + }, + { + "re": -36, + "im": -290 + }, + { + "re": -36, + "im": -290 + }, + { + "re": -35, + "im": -290 + }, + { + "re": -33, + "im": -290 + }, + { + "re": -32, + "im": -290 + }, + { + "re": -31, + "im": -291 + }, + { + "re": -30, + "im": -291 + }, + { + "re": -29, + "im": -291 + }, + { + "re": -29, + "im": -291 + }, + { + "re": -29, + "im": -291 + }, + { + "re": -27, + "im": -291 + }, + { + "re": -25, + "im": -291 + }, + { + "re": -22, + "im": -291 + }, + { + "re": -20, + "im": -291 + }, + { + "re": -18, + "im": -291 + }, + { + "re": -17, + "im": -291 + }, + { + "re": -16, + "im": -291 + }, + { + "re": -15, + "im": -291 + }, + { + "re": -15, + "im": -291 + }, + { + "re": -13, + "im": -291 + }, + { + "re": -12, + "im": -291 + }, + { + "re": -11, + "im": -291 + }, + { + "re": -11, + "im": -291 + }, + { + "re": -9, + "im": -291 + }, + { + "re": -9, + "im": -291 + }, + { + "re": -8, + "im": -291 + }, + { + "re": -7, + "im": -291 + }, + { + "re": -5, + "im": -291 + }, + { + "re": -4, + "im": -291 + }, + { + "re": -3, + "im": -291 + }, + { + "re": -3, + "im": -291 + }, + { + "re": -3, + "im": -291 + }, + { + "re": -2, + "im": -290 + }, + { + "re": -1, + "im": -290 + }, + { + "re": 0, + "im": -290 + }, + { + "re": 1, + "im": -290 + }, + { + "re": 3, + "im": -290 + }, + { + "re": 4, + "im": -289 + }, + { + "re": 4, + "im": -289 + }, + { + "re": 5, + "im": -289 + }, + { + "re": 6, + "im": -288 + }, + { + "re": 7, + "im": -287 + }, + { + "re": 8, + "im": -287 + }, + { + "re": 9, + "im": -286 + }, + { + "re": 11, + "im": -286 + }, + { + "re": 12, + "im": -285 + }, + { + "re": 13, + "im": -284 + }, + { + "re": 15, + "im": -284 + }, + { + "re": 16, + "im": -282 + }, + { + "re": 17, + "im": -282 + }, + { + "re": 18, + "im": -281 + }, + { + "re": 19, + "im": -281 + }, + { + "re": 21, + "im": -280 + }, + { + "re": 22, + "im": -278 + }, + { + "re": 23, + "im": -277 + }, + { + "re": 24, + "im": -276 + }, + { + "re": 26, + "im": -275 + }, + { + "re": 28, + "im": -274 + }, + { + "re": 32, + "im": -272 + }, + { + "re": 33, + "im": -272 + }, + { + "re": 33, + "im": -271 + }, + { + "re": 34, + "im": -270 + }, + { + "re": 37, + "im": -269 + }, + { + "re": 40, + "im": -268 + }, + { + "re": 42, + "im": -268 + }, + { + "re": 44, + "im": -267 + }, + { + "re": 44, + "im": -266 + }, + { + "re": 45, + "im": -266 + }, + { + "re": 46, + "im": -265 + }, + { + "re": 48, + "im": -265 + }, + { + "re": 50, + "im": -264 + }, + { + "re": 53, + "im": -264 + }, + { + "re": 55, + "im": -263 + }, + { + "re": 57, + "im": -262 + }, + { + "re": 58, + "im": -262 + }, + { + "re": 59, + "im": -261 + }, + { + "re": 61, + "im": -260 + }, + { + "re": 62, + "im": -260 + }, + { + "re": 64, + "im": -259 + }, + { + "re": 66, + "im": -258 + }, + { + "re": 66, + "im": -258 + }, + { + "re": 66, + "im": -258 + }, + { + "re": 67, + "im": -257 + }, + { + "re": 68, + "im": -257 + }, + { + "re": 70, + "im": -256 + }, + { + "re": 71, + "im": -255 + }, + { + "re": 73, + "im": -254 + }, + { + "re": 74, + "im": -253 + }, + { + "re": 75, + "im": -252 + }, + { + "re": 75, + "im": -252 + }, + { + "re": 77, + "im": -251 + }, + { + "re": 78, + "im": -250 + }, + { + "re": 79, + "im": -249 + }, + { + "re": 82, + "im": -247 + }, + { + "re": 83, + "im": -246 + }, + { + "re": 85, + "im": -245 + }, + { + "re": 85, + "im": -244 + }, + { + "re": 86, + "im": -244 + }, + { + "re": 87, + "im": -243 + }, + { + "re": 89, + "im": -241 + }, + { + "re": 90, + "im": -241 + }, + { + "re": 91, + "im": -240 + }, + { + "re": 92, + "im": -239 + }, + { + "re": 93, + "im": -238 + }, + { + "re": 94, + "im": -237 + }, + { + "re": 95, + "im": -235 + }, + { + "re": 96, + "im": -233 + }, + { + "re": 98, + "im": -231 + }, + { + "re": 99, + "im": -229 + }, + { + "re": 101, + "im": -227 + }, + { + "re": 102, + "im": -225 + }, + { + "re": 103, + "im": -224 + }, + { + "re": 103, + "im": -223 + }, + { + "re": 104, + "im": -222 + }, + { + "re": 105, + "im": -221 + }, + { + "re": 106, + "im": -219 + }, + { + "re": 107, + "im": -218 + }, + { + "re": 109, + "im": -216 + }, + { + "re": 111, + "im": -215 + }, + { + "re": 111, + "im": -214 + }, + { + "re": 111, + "im": -214 + }, + { + "re": 112, + "im": -212 + }, + { + "re": 113, + "im": -211 + }, + { + "re": 114, + "im": -210 + }, + { + "re": 115, + "im": -207 + }, + { + "re": 117, + "im": -206 + }, + { + "re": 118, + "im": -204 + }, + { + "re": 119, + "im": -203 + }, + { + "re": 120, + "im": -202 + }, + { + "re": 121, + "im": -200 + }, + { + "re": 122, + "im": -199 + }, + { + "re": 123, + "im": -197 + }, + { + "re": 124, + "im": -196 + }, + { + "re": 124, + "im": -194 + }, + { + "re": 126, + "im": -192 + }, + { + "re": 127, + "im": -190 + }, + { + "re": 128, + "im": -188 + }, + { + "re": 128, + "im": -186 + }, + { + "re": 129, + "im": -185 + }, + { + "re": 129, + "im": -184 + }, + { + "re": 131, + "im": -182 + }, + { + "re": 131, + "im": -181 + }, + { + "re": 132, + "im": -179 + }, + { + "re": 133, + "im": -177 + }, + { + "re": 135, + "im": -175 + }, + { + "re": 136, + "im": -174 + }, + { + "re": 137, + "im": -173 + }, + { + "re": 137, + "im": -172 + }, + { + "re": 139, + "im": -170 + }, + { + "re": 141, + "im": -167 + }, + { + "re": 143, + "im": -166 + }, + { + "re": 144, + "im": -163 + }, + { + "re": 145, + "im": -162 + }, + { + "re": 146, + "im": -161 + }, + { + "re": 148, + "im": -159 + }, + { + "re": 149, + "im": -157 + }, + { + "re": 151, + "im": -156 + }, + { + "re": 152, + "im": -155 + }, + { + "re": 153, + "im": -153 + }, + { + "re": 153, + "im": -152 + }, + { + "re": 155, + "im": -150 + }, + { + "re": 156, + "im": -148 + }, + { + "re": 157, + "im": -146 + }, + { + "re": 159, + "im": -144 + }, + { + "re": 160, + "im": -142 + }, + { + "re": 161, + "im": -141 + }, + { + "re": 161, + "im": -140 + }, + { + "re": 161, + "im": -139 + }, + { + "re": 162, + "im": -137 + }, + { + "re": 164, + "im": -135 + }, + { + "re": 165, + "im": -133 + }, + { + "re": 167, + "im": -130 + }, + { + "re": 168, + "im": -128 + }, + { + "re": 169, + "im": -127 + }, + { + "re": 170, + "im": -125 + }, + { + "re": 170, + "im": -124 + }, + { + "re": 172, + "im": -122 + }, + { + "re": 172, + "im": -120 + }, + { + "re": 173, + "im": -120 + }, + { + "re": 173, + "im": -119 + }, + { + "re": 174, + "im": -118 + }, + { + "re": 174, + "im": -116 + }, + { + "re": 175, + "im": -115 + }, + { + "re": 176, + "im": -113 + }, + { + "re": 176, + "im": -111 + }, + { + "re": 177, + "im": -109 + }, + { + "re": 177, + "im": -107 + }, + { + "re": 178, + "im": -104 + }, + { + "re": 178, + "im": -101 + }, + { + "re": 179, + "im": -97 + }, + { + "re": 180, + "im": -95 + }, + { + "re": 180, + "im": -93 + }, + { + "re": 181, + "im": -92 + }, + { + "re": 181, + "im": -91 + }, + { + "re": 181, + "im": -89 + }, + { + "re": 181, + "im": -87 + }, + { + "re": 181, + "im": -85 + }, + { + "re": 182, + "im": -82 + }, + { + "re": 183, + "im": -79 + }, + { + "re": 184, + "im": -77 + }, + { + "re": 184, + "im": -75 + }, + { + "re": 185, + "im": -73 + }, + { + "re": 185, + "im": -72 + }, + { + "re": 185, + "im": -70 + }, + { + "re": 185, + "im": -68 + }, + { + "re": 185, + "im": -67 + }, + { + "re": 186, + "im": -64 + }, + { + "re": 187, + "im": -62 + }, + { + "re": 188, + "im": -60 + }, + { + "re": 188, + "im": -59 + }, + { + "re": 188, + "im": -58 + }, + { + "re": 188, + "im": -58 + }, + { + "re": 188, + "im": -58 + }, + { + "re": 188, + "im": -57 + }, + { + "re": 188, + "im": -56 + }, + { + "re": 188, + "im": -54 + }, + { + "re": 188, + "im": -52 + }, + { + "re": 188, + "im": -50 + }, + { + "re": 188, + "im": -48 + }, + { + "re": 188, + "im": -47 + }, + { + "re": 188, + "im": -45 + }, + { + "re": 188, + "im": -44 + }, + { + "re": 188, + "im": -43 + }, + { + "re": 188, + "im": -41 + }, + { + "re": 188, + "im": -39 + }, + { + "re": 188, + "im": -38 + }, + { + "re": 188, + "im": -37 + }, + { + "re": 188, + "im": -36 + }, + { + "re": 188, + "im": -35 + }, + { + "re": 188, + "im": -33 + }, + { + "re": 188, + "im": -31 + }, + { + "re": 187, + "im": -30 + }, + { + "re": 187, + "im": -29 + }, + { + "re": 187, + "im": -28 + }, + { + "re": 186, + "im": -25 + }, + { + "re": 186, + "im": -22 + }, + { + "re": 185, + "im": -20 + }, + { + "re": 185, + "im": -17 + }, + { + "re": 184, + "im": -16 + }, + { + "re": 184, + "im": -14 + }, + { + "re": 183, + "im": -13 + }, + { + "re": 182, + "im": -12 + }, + { + "re": 181, + "im": -10 + }, + { + "re": 181, + "im": -8 + }, + { + "re": 179, + "im": -7 + }, + { + "re": 179, + "im": -6 + }, + { + "re": 179, + "im": -6 + }, + { + "re": 179, + "im": -6 + }, + { + "re": 179, + "im": -5 + }, + { + "re": 177, + "im": -5 + }, + { + "re": 177, + "im": -4 + }, + { + "re": 175, + "im": -4 + }, + { + "re": 174, + "im": -2 + }, + { + "re": 174, + "im": -2 + }, + { + "re": 173, + "im": -2 + }, + { + "re": 172, + "im": -1 + }, + { + "re": 171, + "im": -1 + }, + { + "re": 169, + "im": 0 + }, + { + "re": 168, + "im": 0 + }, + { + "re": 167, + "im": 0 + }, + { + "re": 166, + "im": 1 + }, + { + "re": 165, + "im": 2 + }, + { + "re": 164, + "im": 2 + }, + { + "re": 162, + "im": 3 + }, + { + "re": 161, + "im": 4 + }, + { + "re": 160, + "im": 4 + }, + { + "re": 160, + "im": 5 + }, + { + "re": 158, + "im": 5 + }, + { + "re": 157, + "im": 6 + }, + { + "re": 156, + "im": 7 + }, + { + "re": 156, + "im": 8 + }, + { + "re": 155, + "im": 8 + }, + { + "re": 154, + "im": 8 + }, + { + "re": 154, + "im": 8 + }, + { + "re": 153, + "im": 9 + }, + { + "re": 153, + "im": 10 + }, + { + "re": 152, + "im": 11 + }, + { + "re": 151, + "im": 13 + }, + { + "re": 150, + "im": 13 + }, + { + "re": 150, + "im": 15 + }, + { + "re": 149, + "im": 16 + }, + { + "re": 149, + "im": 17 + }, + { + "re": 149, + "im": 17 + }, + { + "re": 149, + "im": 19 + }, + { + "re": 149, + "im": 20 + }, + { + "re": 148, + "im": 21 + }, + { + "re": 147, + "im": 23 + }, + { + "re": 146, + "im": 24 + }, + { + "re": 146, + "im": 25 + }, + { + "re": 145, + "im": 25 + }, + { + "re": 145, + "im": 27 + }, + { + "re": 145, + "im": 27 + }, + { + "re": 144, + "im": 28 + }, + { + "re": 144, + "im": 29 + }, + { + "re": 143, + "im": 30 + }, + { + "re": 142, + "im": 32 + }, + { + "re": 141, + "im": 33 + }, + { + "re": 140, + "im": 34 + }, + { + "re": 139, + "im": 35 + }, + { + "re": 138, + "im": 36 + }, + { + "re": 138, + "im": 36 + }, + { + "re": 137, + "im": 37 + }, + { + "re": 137, + "im": 37 + }, + { + "re": 136, + "im": 38 + }, + { + "re": 135, + "im": 39 + }, + { + "re": 134, + "im": 40 + }, + { + "re": 133, + "im": 40 + }, + { + "re": 132, + "im": 41 + }, + { + "re": 132, + "im": 41 + }, + { + "re": 131, + "im": 41 + }, + { + "re": 131, + "im": 41 + }, + { + "re": 131, + "im": 41 + }, + { + "re": 130, + "im": 41 + }, + { + "re": 129, + "im": 43 + }, + { + "re": 128, + "im": 44 + }, + { + "re": 128, + "im": 45 + }, + { + "re": 127, + "im": 46 + }, + { + "re": 126, + "im": 46 + }, + { + "re": 126, + "im": 47 + }, + { + "re": 126, + "im": 48 + }, + { + "re": 125, + "im": 50 + }, + { + "re": 125, + "im": 52 + }, + { + "re": 124, + "im": 54 + }, + { + "re": 124, + "im": 55 + }, + { + "re": 124, + "im": 57 + }, + { + "re": 124, + "im": 58 + }, + { + "re": 124, + "im": 60 + }, + { + "re": 124, + "im": 61 + }, + { + "re": 124, + "im": 64 + }, + { + "re": 124, + "im": 67 + }, + { + "re": 125, + "im": 69 + }, + { + "re": 125, + "im": 70 + }, + { + "re": 125, + "im": 70 + }, + { + "re": 125, + "im": 71 + }, + { + "re": 125, + "im": 73 + }, + { + "re": 125, + "im": 75 + }, + { + "re": 125, + "im": 77 + }, + { + "re": 125, + "im": 79 + }, + { + "re": 125, + "im": 81 + }, + { + "re": 125, + "im": 82 + }, + { + "re": 125, + "im": 83 + }, + { + "re": 125, + "im": 84 + }, + { + "re": 124, + "im": 85 + }, + { + "re": 124, + "im": 87 + }, + { + "re": 123, + "im": 88 + }, + { + "re": 123, + "im": 89 + }, + { + "re": 123, + "im": 90 + }, + { + "re": 123, + "im": 91 + }, + { + "re": 123, + "im": 93 + }, + { + "re": 122, + "im": 95 + }, + { + "re": 121, + "im": 97 + }, + { + "re": 121, + "im": 97 + }, + { + "re": 121, + "im": 98 + }, + { + "re": 121, + "im": 98 + }, + { + "re": 121, + "im": 98 + }, + { + "re": 121, + "im": 98 + }, + { + "re": 121, + "im": 98 + }, + { + "re": 121, + "im": 98 + }, + { + "re": 121, + "im": 99 + }, + { + "re": 121, + "im": 99 + }, + { + "re": 122, + "im": 100 + }, + { + "re": 123, + "im": 100 + }, + { + "re": 124, + "im": 101 + }, + { + "re": 126, + "im": 101 + }, + { + "re": 126, + "im": 101 + }, + { + "re": 127, + "im": 102 + }, + { + "re": 129, + "im": 102 + }, + { + "re": 132, + "im": 102 + }, + { + "re": 134, + "im": 102 + }, + { + "re": 136, + "im": 102 + }, + { + "re": 137, + "im": 102 + }, + { + "re": 139, + "im": 102 + }, + { + "re": 139, + "im": 102 + }, + { + "re": 139, + "im": 102 + }, + { + "re": 140, + "im": 102 + }, + { + "re": 143, + "im": 103 + }, + { + "re": 146, + "im": 103 + }, + { + "re": 149, + "im": 103 + }, + { + "re": 152, + "im": 103 + }, + { + "re": 153, + "im": 103 + }, + { + "re": 154, + "im": 103 + }, + { + "re": 154, + "im": 103 + }, + { + "re": 155, + "im": 103 + }, + { + "re": 156, + "im": 103 + }, + { + "re": 159, + "im": 103 + }, + { + "re": 161, + "im": 103 + }, + { + "re": 164, + "im": 103 + }, + { + "re": 167, + "im": 103 + }, + { + "re": 169, + "im": 104 + }, + { + "re": 170, + "im": 104 + }, + { + "re": 170, + "im": 104 + }, + { + "re": 172, + "im": 104 + }, + { + "re": 174, + "im": 104 + }, + { + "re": 177, + "im": 104 + }, + { + "re": 179, + "im": 105 + }, + { + "re": 181, + "im": 105 + }, + { + "re": 182, + "im": 106 + }, + { + "re": 182, + "im": 106 + }, + { + "re": 183, + "im": 106 + }, + { + "re": 185, + "im": 106 + }, + { + "re": 188, + "im": 106 + }, + { + "re": 191, + "im": 106 + }, + { + "re": 193, + "im": 106 + }, + { + "re": 194, + "im": 106 + }, + { + "re": 195, + "im": 106 + }, + { + "re": 197, + "im": 106 + }, + { + "re": 199, + "im": 107 + }, + { + "re": 202, + "im": 107 + }, + { + "re": 206, + "im": 107 + }, + { + "re": 210, + "im": 107 + }, + { + "re": 213, + "im": 107 + }, + { + "re": 214, + "im": 107 + }, + { + "re": 214, + "im": 107 + }, + { + "re": 217, + "im": 108 + }, + { + "re": 222, + "im": 108 + }, + { + "re": 225, + "im": 109 + }, + { + "re": 227, + "im": 109 + }, + { + "re": 228, + "im": 109 + }, + { + "re": 229, + "im": 109 + }, + { + "re": 230, + "im": 110 + }, + { + "re": 232, + "im": 110 + }, + { + "re": 234, + "im": 110 + }, + { + "re": 236, + "im": 111 + }, + { + "re": 237, + "im": 111 + }, + { + "re": 237, + "im": 111 + }, + { + "re": 237, + "im": 111 + }, + { + "re": 237, + "im": 111 + }, + { + "re": 239, + "im": 111 + }, + { + "re": 240, + "im": 111 + }, + { + "re": 242, + "im": 112 + }, + { + "re": 243, + "im": 112 + }, + { + "re": 244, + "im": 112 + }, + { + "re": 244, + "im": 112 + }, + { + "re": 244, + "im": 112 + }, + { + "re": 244, + "im": 113 + }, + { + "re": 246, + "im": 114 + }, + { + "re": 248, + "im": 115 + }, + { + "re": 250, + "im": 116 + }, + { + "re": 250, + "im": 116 + }, + { + "re": 250, + "im": 116 + }, + { + "re": 250, + "im": 116 + }, + { + "re": 250, + "im": 118 + }, + { + "re": 251, + "im": 120 + }, + { + "re": 252, + "im": 122 + }, + { + "re": 252, + "im": 124 + }, + { + "re": 253, + "im": 125 + }, + { + "re": 253, + "im": 126 + }, + { + "re": 253, + "im": 128 + }, + { + "re": 253, + "im": 130 + }, + { + "re": 253, + "im": 132 + }, + { + "re": 253, + "im": 135 + }, + { + "re": 253, + "im": 138 + }, + { + "re": 253, + "im": 140 + }, + { + "re": 253, + "im": 142 + }, + { + "re": 253, + "im": 143 + }, + { + "re": 253, + "im": 144 + }, + { + "re": 253, + "im": 145 + }, + { + "re": 253, + "im": 147 + }, + { + "re": 253, + "im": 148 + }, + { + "re": 253, + "im": 150 + }, + { + "re": 253, + "im": 152 + }, + { + "re": 253, + "im": 154 + }, + { + "re": 253, + "im": 156 + }, + { + "re": 253, + "im": 157 + }, + { + "re": 253, + "im": 158 + }, + { + "re": 253, + "im": 159 + }, + { + "re": 253, + "im": 160 + }, + { + "re": 253, + "im": 162 + }, + { + "re": 253, + "im": 164 + }, + { + "re": 253, + "im": 167 + }, + { + "re": 254, + "im": 170 + }, + { + "re": 254, + "im": 172 + }, + { + "re": 254, + "im": 173 + }, + { + "re": 254, + "im": 174 + }, + { + "re": 254, + "im": 175 + }, + { + "re": 254, + "im": 176 + }, + { + "re": 254, + "im": 178 + }, + { + "re": 255, + "im": 181 + }, + { + "re": 256, + "im": 184 + }, + { + "re": 256, + "im": 185 + }, + { + "re": 256, + "im": 186 + }, + { + "re": 256, + "im": 188 + }, + { + "re": 256, + "im": 189 + }, + { + "re": 256, + "im": 190 + }, + { + "re": 256, + "im": 192 + }, + { + "re": 256, + "im": 193 + }, + { + "re": 256, + "im": 195 + }, + { + "re": 256, + "im": 196 + }, + { + "re": 256, + "im": 198 + }, + { + "re": 256, + "im": 199 + }, + { + "re": 256, + "im": 201 + }, + { + "re": 256, + "im": 201 + }, + { + "re": 256, + "im": 202 + }, + { + "re": 256, + "im": 204 + }, + { + "re": 256, + "im": 206 + }, + { + "re": 256, + "im": 209 + }, + { + "re": 256, + "im": 212 + }, + { + "re": 256, + "im": 214 + }, + { + "re": 256, + "im": 216 + }, + { + "re": 256, + "im": 217 + }, + { + "re": 256, + "im": 218 + }, + { + "re": 256, + "im": 220 + }, + { + "re": 256, + "im": 222 + }, + { + "re": 256, + "im": 223 + }, + { + "re": 257, + "im": 224 + }, + { + "re": 257, + "im": 225 + }, + { + "re": 259, + "im": 226 + }, + { + "re": 259, + "im": 227 + }, + { + "re": 260, + "im": 228 + }, + { + "re": 261, + "im": 230 + }, + { + "re": 263, + "im": 231 + }, + { + "re": 263, + "im": 231 + }, + { + "re": 264, + "im": 232 + }, + { + "re": 264, + "im": 232 + }, + { + "re": 264, + "im": 232 + }, + { + "re": 265, + "im": 232 + }, + { + "re": 266, + "im": 234 + }, + { + "re": 267, + "im": 234 + }, + { + "re": 268, + "im": 235 + }, + { + "re": 269, + "im": 235 + }, + { + "re": 269, + "im": 235 + }, + { + "re": 269, + "im": 235 + }, + { + "re": 269, + "im": 235 + }, + { + "re": 271, + "im": 235 + }, + { + "re": 272, + "im": 235 + }, + { + "re": 273, + "im": 236 + }, + { + "re": 276, + "im": 236 + }, + { + "re": 279, + "im": 236 + }, + { + "re": 282, + "im": 236 + }, + { + "re": 285, + "im": 237 + }, + { + "re": 286, + "im": 237 + }, + { + "re": 287, + "im": 237 + }, + { + "re": 288, + "im": 238 + }, + { + "re": 289, + "im": 238 + }, + { + "re": 292, + "im": 238 + }, + { + "re": 296, + "im": 239 + }, + { + "re": 300, + "im": 239 + }, + { + "re": 302, + "im": 239 + }, + { + "re": 304, + "im": 239 + }, + { + "re": 304, + "im": 239 + }, + { + "re": 305, + "im": 239 + }, + { + "re": 305, + "im": 239 + }, + { + "re": 306, + "im": 239 + }, + { + "re": 308, + "im": 239 + }, + { + "re": 310, + "im": 239 + }, + { + "re": 312, + "im": 239 + }, + { + "re": 313, + "im": 239 + }, + { + "re": 314, + "im": 239 + }, + { + "re": 314, + "im": 239 + }, + { + "re": 314, + "im": 239 + }, + { + "re": 315, + "im": 239 + }, + { + "re": 316, + "im": 239 + }, + { + "re": 317, + "im": 239 + }, + { + "re": 318, + "im": 239 + }, + { + "re": 318, + "im": 239 + }, + { + "re": 318, + "im": 239 + }, + { + "re": 318, + "im": 239 + }, + { + "re": 318, + "im": 239 + }, + { + "re": 319, + "im": 239 + }, + { + "re": 320, + "im": 239 + }, + { + "re": 321, + "im": 239 + }, + { + "re": 321, + "im": 239 + }, + { + "re": 322, + "im": 239 + }, + { + "re": 322, + "im": 240 + }, + { + "re": 323, + "im": 240 + }, + { + "re": 323, + "im": 240 + }, + { + "re": 323, + "im": 240 + }, + { + "re": 323, + "im": 240 + }, + { + "re": 324, + "im": 241 + }, + { + "re": 325, + "im": 242 + }, + { + "re": 326, + "im": 243 + }, + { + "re": 327, + "im": 244 + }, + { + "re": 328, + "im": 244 + }, + { + "re": 328, + "im": 244 + }, + { + "re": 328, + "im": 244 + }, + { + "re": 328, + "im": 244 + }, + { + "re": 328, + "im": 244 + }, + { + "re": 328, + "im": 244 + }, + { + "re": 328, + "im": 245 + }, + { + "re": 328, + "im": 246 + }, + { + "re": 329, + "im": 247 + }, + { + "re": 329, + "im": 247 + }, + { + "re": 329, + "im": 248 + }, + { + "re": 329, + "im": 249 + }, + { + "re": 329, + "im": 249 + }, + { + "re": 330, + "im": 250 + }, + { + "re": 331, + "im": 251 + }, + { + "re": 332, + "im": 252 + }, + { + "re": 333, + "im": 254 + }, + { + "re": 333, + "im": 256 + }, + { + "re": 333, + "im": 257 + }, + { + "re": 334, + "im": 259 + }, + { + "re": 334, + "im": 259 + }, + { + "re": 334, + "im": 259 + }, + { + "re": 334, + "im": 260 + }, + { + "re": 335, + "im": 261 + }, + { + "re": 335, + "im": 263 + }, + { + "re": 335, + "im": 264 + }, + { + "re": 336, + "im": 264 + }, + { + "re": 336, + "im": 265 + }, + { + "re": 337, + "im": 265 + }, + { + "re": 337, + "im": 266 + }, + { + "re": 337, + "im": 268 + }, + { + "re": 338, + "im": 270 + }, + { + "re": 338, + "im": 272 + }, + { + "re": 339, + "im": 275 + }, + { + "re": 341, + "im": 277 + }, + { + "re": 341, + "im": 278 + }, + { + "re": 342, + "im": 279 + }, + { + "re": 342, + "im": 279 + }, + { + "re": 342, + "im": 280 + }, + { + "re": 342, + "im": 281 + }, + { + "re": 343, + "im": 283 + }, + { + "re": 344, + "im": 284 + }, + { + "re": 344, + "im": 285 + }, + { + "re": 345, + "im": 286 + }, + { + "re": 345, + "im": 287 + }, + { + "re": 346, + "im": 289 + }, + { + "re": 346, + "im": 290 + }, + { + "re": 347, + "im": 292 + }, + { + "re": 348, + "im": 293 + }, + { + "re": 348, + "im": 295 + }, + { + "re": 349, + "im": 296 + }, + { + "re": 349, + "im": 298 + }, + { + "re": 350, + "im": 301 + }, + { + "re": 351, + "im": 304 + }, + { + "re": 352, + "im": 306 + }, + { + "re": 353, + "im": 308 + }, + { + "re": 354, + "im": 310 + }, + { + "re": 355, + "im": 310 + }, + { + "re": 355, + "im": 312 + }, + { + "re": 356, + "im": 314 + }, + { + "re": 356, + "im": 316 + }, + { + "re": 358, + "im": 320 + }, + { + "re": 359, + "im": 322 + }, + { + "re": 359, + "im": 324 + }, + { + "re": 360, + "im": 324 + }, + { + "re": 360, + "im": 325 + }, + { + "re": 360, + "im": 326 + }, + { + "re": 361, + "im": 327 + }, + { + "re": 361, + "im": 328 + }, + { + "re": 362, + "im": 330 + }, + { + "re": 362, + "im": 331 + }, + { + "re": 363, + "im": 333 + }, + { + "re": 363, + "im": 335 + }, + { + "re": 363, + "im": 337 + }, + { + "re": 363, + "im": 337 + }, + { + "re": 363, + "im": 338 + }, + { + "re": 364, + "im": 339 + }, + { + "re": 364, + "im": 341 + }, + { + "re": 364, + "im": 342 + }, + { + "re": 365, + "im": 344 + }, + { + "re": 366, + "im": 345 + }, + { + "re": 366, + "im": 346 + }, + { + "re": 366, + "im": 347 + }, + { + "re": 367, + "im": 348 + }, + { + "re": 367, + "im": 349 + }, + { + "re": 367, + "im": 350 + }, + { + "re": 368, + "im": 351 + }, + { + "re": 370, + "im": 352 + }, + { + "re": 371, + "im": 353 + }, + { + "re": 372, + "im": 354 + }, + { + "re": 372, + "im": 354 + }, + { + "re": 374, + "im": 354 + }, + { + "re": 374, + "im": 354 + }, + { + "re": 374, + "im": 354 + }, + { + "re": 375, + "im": 354 + }, + { + "re": 376, + "im": 355 + }, + { + "re": 377, + "im": 356 + }, + { + "re": 379, + "im": 358 + }, + { + "re": 382, + "im": 359 + }, + { + "re": 383, + "im": 360 + }, + { + "re": 383, + "im": 361 + }, + { + "re": 384, + "im": 361 + }, + { + "re": 384, + "im": 361 + }, + { + "re": 384, + "im": 361 + }, + { + "re": 385, + "im": 361 + }, + { + "re": 387, + "im": 361 + }, + { + "re": 388, + "im": 361 + }, + { + "re": 389, + "im": 361 + }, + { + "re": 389, + "im": 361 + }, + { + "re": 389, + "im": 361 + }, + { + "re": 390, + "im": 361 + }, + { + "re": 391, + "im": 361 + }, + { + "re": 391, + "im": 361 + }, + { + "re": 391, + "im": 361 + }, + { + "re": 391, + "im": 361 + }, + { + "re": 391, + "im": 361 + }, + { + "re": 391, + "im": 361 + }, + { + "re": 391, + "im": 361 + }, + { + "re": 392, + "im": 361 + }, + { + "re": 392, + "im": 361 + }, + { + "re": 392, + "im": 361 + }, + { + "re": 393, + "im": 361 + }, + { + "re": 393, + "im": 362 + }, + { + "re": 393, + "im": 363 + }, + { + "re": 393, + "im": 366 + }, + { + "re": 393, + "im": 368 + }, + { + "re": 393, + "im": 370 + }, + { + "re": 393, + "im": 372 + }, + { + "re": 393, + "im": 373 + }, + { + "re": 395, + "im": 373 + }, + { + "re": 396, + "im": 374 + }, + { + "re": 396, + "im": 374 + }, + { + "re": 397, + "im": 375 + }, + { + "re": 397, + "im": 375 + }, + { + "re": 397, + "im": 376 + }, + { + "re": 397, + "im": 376 + }, + { + "re": 398, + "im": 378 + }, + { + "re": 398, + "im": 380 + }, + { + "re": 399, + "im": 380 + }, + { + "re": 399, + "im": 381 + }, + { + "re": 399, + "im": 382 + }, + { + "re": 399, + "im": 382 + }, + { + "re": 399, + "im": 383 + }, + { + "re": 398, + "im": 384 + }, + { + "re": 396, + "im": 385 + }, + { + "re": 394, + "im": 387 + }, + { + "re": 392, + "im": 389 + }, + { + "re": 390, + "im": 391 + }, + { + "re": 390, + "im": 391 + }, + { + "re": 390, + "im": 391 + }, + { + "re": 390, + "im": 392 + }, + { + "re": 389, + "im": 392 + }, + { + "re": 387, + "im": 393 + }, + { + "re": 385, + "im": 393 + }, + { + "re": 384, + "im": 393 + }, + { + "re": 383, + "im": 394 + }, + { + "re": 383, + "im": 394 + }, + { + "re": 383, + "im": 394 + }, + { + "re": 381, + "im": 394 + }, + { + "re": 380, + "im": 394 + }, + { + "re": 379, + "im": 394 + }, + { + "re": 377, + "im": 394 + }, + { + "re": 375, + "im": 394 + }, + { + "re": 373, + "im": 394 + }, + { + "re": 372, + "im": 394 + }, + { + "re": 371, + "im": 394 + }, + { + "re": 369, + "im": 394 + }, + { + "re": 368, + "im": 394 + }, + { + "re": 366, + "im": 394 + }, + { + "re": 364, + "im": 394 + }, + { + "re": 364, + "im": 394 + }, + { + "re": 363, + "im": 394 + }, + { + "re": 363, + "im": 394 + }, + { + "re": 362, + "im": 394 + }, + { + "re": 361, + "im": 394 + }, + { + "re": 360, + "im": 394 + }, + { + "re": 359, + "im": 394 + }, + { + "re": 358, + "im": 394 + }, + { + "re": 358, + "im": 394 + }, + { + "re": 358, + "im": 394 + }, + { + "re": 358, + "im": 394 + }, + { + "re": 358, + "im": 394 + }, + { + "re": 358, + "im": 392 + }, + { + "re": 358, + "im": 389 + }, + { + "re": 358, + "im": 388 + }, + { + "re": 359, + "im": 386 + }, + { + "re": 359, + "im": 386 + }, + { + "re": 359, + "im": 385 + }, + { + "re": 359, + "im": 383 + }, + { + "re": 357, + "im": 380 + }, + { + "re": 356, + "im": 378 + }, + { + "re": 355, + "im": 377 + }, + { + "re": 353, + "im": 375 + }, + { + "re": 352, + "im": 373 + }, + { + "re": 351, + "im": 370 + }, + { + "re": 349, + "im": 368 + }, + { + "re": 348, + "im": 367 + }, + { + "re": 348, + "im": 367 + }, + { + "re": 347, + "im": 365 + }, + { + "re": 346, + "im": 364 + }, + { + "re": 345, + "im": 361 + }, + { + "re": 343, + "im": 359 + }, + { + "re": 342, + "im": 356 + }, + { + "re": 341, + "im": 355 + }, + { + "re": 340, + "im": 353 + }, + { + "re": 339, + "im": 351 + }, + { + "re": 339, + "im": 350 + }, + { + "re": 338, + "im": 348 + }, + { + "re": 336, + "im": 345 + }, + { + "re": 334, + "im": 340 + }, + { + "re": 331, + "im": 337 + }, + { + "re": 330, + "im": 335 + }, + { + "re": 330, + "im": 334 + }, + { + "re": 330, + "im": 334 + }, + { + "re": 330, + "im": 334 + }, + { + "re": 328, + "im": 332 + }, + { + "re": 327, + "im": 330 + }, + { + "re": 326, + "im": 326 + }, + { + "re": 324, + "im": 323 + }, + { + "re": 323, + "im": 319 + }, + { + "re": 323, + "im": 318 + }, + { + "re": 323, + "im": 317 + }, + { + "re": 322, + "im": 316 + }, + { + "re": 322, + "im": 315 + }, + { + "re": 322, + "im": 315 + }, + { + "re": 320, + "im": 314 + }, + { + "re": 319, + "im": 311 + }, + { + "re": 318, + "im": 308 + }, + { + "re": 317, + "im": 304 + }, + { + "re": 316, + "im": 302 + }, + { + "re": 315, + "im": 301 + }, + { + "re": 314, + "im": 299 + }, + { + "re": 314, + "im": 298 + }, + { + "re": 312, + "im": 295 + }, + { + "re": 310, + "im": 293 + }, + { + "re": 309, + "im": 290 + }, + { + "re": 307, + "im": 287 + }, + { + "re": 306, + "im": 284 + }, + { + "re": 304, + "im": 281 + }, + { + "re": 303, + "im": 280 + }, + { + "re": 301, + "im": 278 + }, + { + "re": 300, + "im": 277 + }, + { + "re": 298, + "im": 275 + }, + { + "re": 296, + "im": 273 + }, + { + "re": 295, + "im": 270 + }, + { + "re": 294, + "im": 269 + }, + { + "re": 293, + "im": 268 + }, + { + "re": 291, + "im": 267 + }, + { + "re": 290, + "im": 266 + }, + { + "re": 289, + "im": 265 + }, + { + "re": 287, + "im": 263 + }, + { + "re": 285, + "im": 260 + }, + { + "re": 283, + "im": 257 + }, + { + "re": 282, + "im": 257 + }, + { + "re": 282, + "im": 256 + }, + { + "re": 281, + "im": 255 + }, + { + "re": 280, + "im": 255 + }, + { + "re": 279, + "im": 253 + }, + { + "re": 277, + "im": 251 + }, + { + "re": 275, + "im": 249 + }, + { + "re": 274, + "im": 248 + }, + { + "re": 273, + "im": 247 + }, + { + "re": 272, + "im": 246 + }, + { + "re": 271, + "im": 245 + }, + { + "re": 270, + "im": 244 + }, + { + "re": 268, + "im": 243 + }, + { + "re": 265, + "im": 240 + }, + { + "re": 264, + "im": 239 + }, + { + "re": 261, + "im": 237 + }, + { + "re": 260, + "im": 236 + }, + { + "re": 260, + "im": 236 + }, + { + "re": 258, + "im": 234 + }, + { + "re": 256, + "im": 232 + }, + { + "re": 254, + "im": 230 + }, + { + "re": 253, + "im": 229 + }, + { + "re": 252, + "im": 229 + }, + { + "re": 252, + "im": 229 + }, + { + "re": 251, + "im": 228 + }, + { + "re": 249, + "im": 227 + }, + { + "re": 248, + "im": 226 + }, + { + "re": 246, + "im": 225 + }, + { + "re": 245, + "im": 224 + }, + { + "re": 244, + "im": 223 + }, + { + "re": 242, + "im": 223 + }, + { + "re": 242, + "im": 223 + }, + { + "re": 241, + "im": 222 + }, + { + "re": 240, + "im": 221 + }, + { + "re": 238, + "im": 220 + }, + { + "re": 236, + "im": 219 + }, + { + "re": 235, + "im": 219 + }, + { + "re": 233, + "im": 218 + }, + { + "re": 231, + "im": 217 + }, + { + "re": 229, + "im": 216 + }, + { + "re": 227, + "im": 215 + }, + { + "re": 224, + "im": 214 + }, + { + "re": 222, + "im": 212 + }, + { + "re": 220, + "im": 212 + }, + { + "re": 218, + "im": 211 + }, + { + "re": 215, + "im": 210 + }, + { + "re": 212, + "im": 209 + }, + { + "re": 208, + "im": 208 + }, + { + "re": 204, + "im": 208 + }, + { + "re": 201, + "im": 208 + }, + { + "re": 198, + "im": 208 + }, + { + "re": 196, + "im": 207 + }, + { + "re": 194, + "im": 207 + }, + { + "re": 192, + "im": 207 + }, + { + "re": 188, + "im": 207 + }, + { + "re": 185, + "im": 206 + }, + { + "re": 182, + "im": 206 + }, + { + "re": 180, + "im": 206 + }, + { + "re": 180, + "im": 206 + }, + { + "re": 179, + "im": 206 + }, + { + "re": 179, + "im": 206 + }, + { + "re": 178, + "im": 206 + }, + { + "re": 176, + "im": 205 + }, + { + "re": 174, + "im": 205 + }, + { + "re": 173, + "im": 204 + }, + { + "re": 173, + "im": 204 + }, + { + "re": 173, + "im": 204 + }, + { + "re": 173, + "im": 204 + }, + { + "re": 171, + "im": 204 + }, + { + "re": 171, + "im": 204 + }, + { + "re": 170, + "im": 203 + }, + { + "re": 169, + "im": 203 + }, + { + "re": 168, + "im": 202 + }, + { + "re": 166, + "im": 201 + }, + { + "re": 165, + "im": 200 + }, + { + "re": 164, + "im": 199 + }, + { + "re": 162, + "im": 199 + }, + { + "re": 161, + "im": 199 + }, + { + "re": 161, + "im": 199 + }, + { + "re": 159, + "im": 199 + }, + { + "re": 157, + "im": 199 + }, + { + "re": 154, + "im": 199 + }, + { + "re": 151, + "im": 199 + }, + { + "re": 148, + "im": 198 + }, + { + "re": 146, + "im": 198 + }, + { + "re": 145, + "im": 198 + }, + { + "re": 145, + "im": 198 + }, + { + "re": 145, + "im": 198 + }, + { + "re": 145, + "im": 198 + }, + { + "re": 145, + "im": 198 + }, + { + "re": 145, + "im": 198 + }, + { + "re": 144, + "im": 199 + }, + { + "re": 142, + "im": 201 + }, + { + "re": 141, + "im": 202 + }, + { + "re": 141, + "im": 202 + }, + { + "re": 141, + "im": 203 + }, + { + "re": 141, + "im": 203 + }, + { + "re": 141, + "im": 205 + }, + { + "re": 141, + "im": 207 + }, + { + "re": 141, + "im": 210 + }, + { + "re": 141, + "im": 213 + }, + { + "re": 141, + "im": 214 + }, + { + "re": 141, + "im": 215 + }, + { + "re": 141, + "im": 215 + }, + { + "re": 141, + "im": 215 + }, + { + "re": 141, + "im": 216 + }, + { + "re": 141, + "im": 218 + }, + { + "re": 143, + "im": 219 + }, + { + "re": 144, + "im": 221 + }, + { + "re": 148, + "im": 224 + }, + { + "re": 151, + "im": 226 + }, + { + "re": 153, + "im": 227 + }, + { + "re": 155, + "im": 228 + }, + { + "re": 158, + "im": 229 + }, + { + "re": 160, + "im": 230 + }, + { + "re": 164, + "im": 231 + }, + { + "re": 168, + "im": 232 + }, + { + "re": 172, + "im": 232 + }, + { + "re": 174, + "im": 233 + }, + { + "re": 175, + "im": 234 + }, + { + "re": 176, + "im": 234 + }, + { + "re": 178, + "im": 235 + }, + { + "re": 180, + "im": 236 + }, + { + "re": 183, + "im": 238 + }, + { + "re": 186, + "im": 239 + }, + { + "re": 188, + "im": 239 + }, + { + "re": 189, + "im": 240 + }, + { + "re": 190, + "im": 240 + }, + { + "re": 191, + "im": 241 + }, + { + "re": 193, + "im": 242 + }, + { + "re": 195, + "im": 243 + }, + { + "re": 198, + "im": 244 + }, + { + "re": 200, + "im": 246 + }, + { + "re": 202, + "im": 246 + }, + { + "re": 203, + "im": 247 + }, + { + "re": 205, + "im": 248 + }, + { + "re": 206, + "im": 248 + }, + { + "re": 208, + "im": 250 + }, + { + "re": 211, + "im": 251 + }, + { + "re": 213, + "im": 252 + }, + { + "re": 215, + "im": 253 + }, + { + "re": 215, + "im": 254 + }, + { + "re": 216, + "im": 254 + }, + { + "re": 217, + "im": 255 + }, + { + "re": 219, + "im": 256 + }, + { + "re": 223, + "im": 258 + }, + { + "re": 228, + "im": 261 + }, + { + "re": 232, + "im": 263 + }, + { + "re": 234, + "im": 263 + }, + { + "re": 235, + "im": 264 + }, + { + "re": 235, + "im": 264 + }, + { + "re": 237, + "im": 265 + }, + { + "re": 238, + "im": 267 + }, + { + "re": 239, + "im": 268 + }, + { + "re": 240, + "im": 268 + }, + { + "re": 241, + "im": 269 + }, + { + "re": 242, + "im": 271 + }, + { + "re": 243, + "im": 273 + }, + { + "re": 244, + "im": 275 + }, + { + "re": 244, + "im": 276 + }, + { + "re": 244, + "im": 277 + }, + { + "re": 245, + "im": 279 + }, + { + "re": 245, + "im": 280 + }, + { + "re": 247, + "im": 281 + }, + { + "re": 247, + "im": 283 + }, + { + "re": 247, + "im": 283 + }, + { + "re": 247, + "im": 283 + }, + { + "re": 247, + "im": 284 + }, + { + "re": 247, + "im": 285 + }, + { + "re": 247, + "im": 287 + }, + { + "re": 247, + "im": 289 + }, + { + "re": 246, + "im": 290 + }, + { + "re": 246, + "im": 292 + }, + { + "re": 245, + "im": 292 + }, + { + "re": 245, + "im": 292 + }, + { + "re": 245, + "im": 293 + }, + { + "re": 245, + "im": 293 + }, + { + "re": 244, + "im": 293 + }, + { + "re": 243, + "im": 294 + }, + { + "re": 241, + "im": 294 + }, + { + "re": 240, + "im": 295 + }, + { + "re": 240, + "im": 296 + }, + { + "re": 239, + "im": 296 + }, + { + "re": 238, + "im": 296 + }, + { + "re": 236, + "im": 296 + }, + { + "re": 235, + "im": 296 + }, + { + "re": 234, + "im": 296 + }, + { + "re": 233, + "im": 296 + }, + { + "re": 231, + "im": 297 + }, + { + "re": 229, + "im": 297 + }, + { + "re": 228, + "im": 297 + }, + { + "re": 227, + "im": 297 + }, + { + "re": 225, + "im": 297 + }, + { + "re": 224, + "im": 297 + }, + { + "re": 224, + "im": 297 + }, + { + "re": 223, + "im": 297 + }, + { + "re": 222, + "im": 297 + }, + { + "re": 220, + "im": 297 + }, + { + "re": 219, + "im": 297 + }, + { + "re": 219, + "im": 296 + }, + { + "re": 217, + "im": 296 + }, + { + "re": 217, + "im": 296 + }, + { + "re": 216, + "im": 295 + }, + { + "re": 214, + "im": 295 + }, + { + "re": 212, + "im": 294 + }, + { + "re": 211, + "im": 294 + }, + { + "re": 210, + "im": 294 + }, + { + "re": 209, + "im": 293 + }, + { + "re": 208, + "im": 293 + }, + { + "re": 207, + "im": 293 + }, + { + "re": 206, + "im": 293 + }, + { + "re": 206, + "im": 293 + }, + { + "re": 205, + "im": 292 + }, + { + "re": 205, + "im": 292 + }, + { + "re": 205, + "im": 292 + }, + { + "re": 205, + "im": 292 + }, + { + "re": 204, + "im": 292 + }, + { + "re": 203, + "im": 292 + }, + { + "re": 202, + "im": 291 + }, + { + "re": 202, + "im": 291 + }, + { + "re": 201, + "im": 291 + }, + { + "re": 200, + "im": 291 + }, + { + "re": 200, + "im": 291 + }, + { + "re": 199, + "im": 290 + }, + { + "re": 197, + "im": 290 + }, + { + "re": 195, + "im": 289 + }, + { + "re": 192, + "im": 289 + }, + { + "re": 191, + "im": 289 + }, + { + "re": 191, + "im": 289 + }, + { + "re": 190, + "im": 289 + }, + { + "re": 190, + "im": 289 + }, + { + "re": 189, + "im": 288 + }, + { + "re": 187, + "im": 288 + }, + { + "re": 186, + "im": 288 + }, + { + "re": 184, + "im": 288 + }, + { + "re": 183, + "im": 288 + }, + { + "re": 183, + "im": 287 + }, + { + "re": 182, + "im": 287 + }, + { + "re": 180, + "im": 287 + }, + { + "re": 178, + "im": 287 + }, + { + "re": 176, + "im": 286 + }, + { + "re": 175, + "im": 286 + }, + { + "re": 175, + "im": 286 + }, + { + "re": 174, + "im": 286 + }, + { + "re": 173, + "im": 286 + }, + { + "re": 171, + "im": 285 + }, + { + "re": 168, + "im": 284 + }, + { + "re": 166, + "im": 284 + }, + { + "re": 164, + "im": 282 + }, + { + "re": 162, + "im": 282 + }, + { + "re": 161, + "im": 281 + }, + { + "re": 160, + "im": 281 + }, + { + "re": 158, + "im": 280 + }, + { + "re": 157, + "im": 280 + }, + { + "re": 154, + "im": 280 + }, + { + "re": 153, + "im": 279 + }, + { + "re": 151, + "im": 278 + }, + { + "re": 150, + "im": 278 + }, + { + "re": 147, + "im": 277 + }, + { + "re": 145, + "im": 277 + }, + { + "re": 142, + "im": 277 + }, + { + "re": 138, + "im": 277 + }, + { + "re": 137, + "im": 277 + }, + { + "re": 134, + "im": 277 + }, + { + "re": 133, + "im": 277 + }, + { + "re": 131, + "im": 277 + }, + { + "re": 129, + "im": 277 + }, + { + "re": 127, + "im": 277 + }, + { + "re": 125, + "im": 277 + }, + { + "re": 124, + "im": 277 + }, + { + "re": 122, + "im": 277 + }, + { + "re": 122, + "im": 277 + }, + { + "re": 121, + "im": 277 + }, + { + "re": 121, + "im": 277 + }, + { + "re": 119, + "im": 277 + }, + { + "re": 117, + "im": 277 + }, + { + "re": 115, + "im": 277 + }, + { + "re": 112, + "im": 277 + }, + { + "re": 110, + "im": 277 + }, + { + "re": 108, + "im": 277 + }, + { + "re": 107, + "im": 277 + }, + { + "re": 107, + "im": 277 + }, + { + "re": 105, + "im": 277 + }, + { + "re": 103, + "im": 277 + }, + { + "re": 98, + "im": 277 + }, + { + "re": 92, + "im": 279 + }, + { + "re": 88, + "im": 279 + }, + { + "re": 88, + "im": 280 + }, + { + "re": 87, + "im": 280 + }, + { + "re": 87, + "im": 280 + }, + { + "re": 87, + "im": 280 + }, + { + "re": 85, + "im": 281 + }, + { + "re": 84, + "im": 283 + }, + { + "re": 82, + "im": 284 + }, + { + "re": 82, + "im": 284 + }, + { + "re": 81, + "im": 285 + }, + { + "re": 81, + "im": 287 + }, + { + "re": 82, + "im": 289 + }, + { + "re": 83, + "im": 290 + }, + { + "re": 83, + "im": 291 + }, + { + "re": 84, + "im": 293 + }, + { + "re": 84, + "im": 293 + }, + { + "re": 86, + "im": 295 + }, + { + "re": 87, + "im": 297 + }, + { + "re": 88, + "im": 298 + }, + { + "re": 89, + "im": 298 + }, + { + "re": 90, + "im": 299 + }, + { + "re": 91, + "im": 300 + }, + { + "re": 92, + "im": 301 + }, + { + "re": 93, + "im": 301 + }, + { + "re": 94, + "im": 302 + }, + { + "re": 95, + "im": 303 + }, + { + "re": 96, + "im": 303 + }, + { + "re": 96, + "im": 304 + }, + { + "re": 98, + "im": 304 + }, + { + "re": 100, + "im": 305 + }, + { + "re": 103, + "im": 306 + }, + { + "re": 108, + "im": 308 + }, + { + "re": 112, + "im": 308 + }, + { + "re": 115, + "im": 309 + }, + { + "re": 116, + "im": 309 + }, + { + "re": 116, + "im": 309 + }, + { + "re": 116, + "im": 309 + }, + { + "re": 117, + "im": 309 + }, + { + "re": 120, + "im": 310 + }, + { + "re": 124, + "im": 311 + }, + { + "re": 128, + "im": 312 + }, + { + "re": 131, + "im": 313 + }, + { + "re": 133, + "im": 313 + }, + { + "re": 133, + "im": 313 + }, + { + "re": 135, + "im": 313 + }, + { + "re": 136, + "im": 314 + }, + { + "re": 140, + "im": 316 + }, + { + "re": 143, + "im": 317 + }, + { + "re": 148, + "im": 318 + }, + { + "re": 151, + "im": 320 + }, + { + "re": 153, + "im": 321 + }, + { + "re": 154, + "im": 321 + }, + { + "re": 154, + "im": 321 + }, + { + "re": 156, + "im": 321 + }, + { + "re": 159, + "im": 322 + }, + { + "re": 162, + "im": 323 + }, + { + "re": 164, + "im": 323 + }, + { + "re": 166, + "im": 323 + }, + { + "re": 167, + "im": 323 + }, + { + "re": 168, + "im": 323 + }, + { + "re": 169, + "im": 324 + }, + { + "re": 171, + "im": 325 + }, + { + "re": 174, + "im": 325 + }, + { + "re": 178, + "im": 325 + }, + { + "re": 182, + "im": 326 + }, + { + "re": 185, + "im": 326 + }, + { + "re": 186, + "im": 326 + }, + { + "re": 187, + "im": 327 + }, + { + "re": 188, + "im": 327 + }, + { + "re": 189, + "im": 327 + }, + { + "re": 191, + "im": 328 + }, + { + "re": 191, + "im": 329 + }, + { + "re": 193, + "im": 329 + }, + { + "re": 193, + "im": 329 + }, + { + "re": 193, + "im": 329 + }, + { + "re": 194, + "im": 329 + }, + { + "re": 196, + "im": 330 + }, + { + "re": 198, + "im": 332 + }, + { + "re": 202, + "im": 334 + }, + { + "re": 205, + "im": 335 + }, + { + "re": 208, + "im": 336 + }, + { + "re": 210, + "im": 337 + }, + { + "re": 212, + "im": 337 + }, + { + "re": 212, + "im": 337 + }, + { + "re": 214, + "im": 337 + }, + { + "re": 215, + "im": 338 + }, + { + "re": 218, + "im": 338 + }, + { + "re": 221, + "im": 339 + }, + { + "re": 224, + "im": 341 + }, + { + "re": 227, + "im": 342 + }, + { + "re": 228, + "im": 342 + }, + { + "re": 228, + "im": 342 + }, + { + "re": 228, + "im": 342 + }, + { + "re": 230, + "im": 342 + }, + { + "re": 231, + "im": 342 + }, + { + "re": 232, + "im": 343 + }, + { + "re": 234, + "im": 343 + }, + { + "re": 235, + "im": 344 + }, + { + "re": 235, + "im": 345 + }, + { + "re": 236, + "im": 345 + }, + { + "re": 236, + "im": 345 + }, + { + "re": 238, + "im": 345 + }, + { + "re": 239, + "im": 346 + }, + { + "re": 241, + "im": 347 + }, + { + "re": 243, + "im": 347 + }, + { + "re": 243, + "im": 348 + }, + { + "re": 243, + "im": 348 + }, + { + "re": 243, + "im": 348 + }, + { + "re": 243, + "im": 348 + }, + { + "re": 243, + "im": 348 + }, + { + "re": 244, + "im": 348 + }, + { + "re": 244, + "im": 348 + }, + { + "re": 244, + "im": 348 + }, + { + "re": 244, + "im": 348 + }, + { + "re": 244, + "im": 349 + }, + { + "re": 242, + "im": 349 + }, + { + "re": 241, + "im": 349 + }, + { + "re": 239, + "im": 349 + }, + { + "re": 236, + "im": 349 + }, + { + "re": 233, + "im": 348 + }, + { + "re": 231, + "im": 348 + }, + { + "re": 227, + "im": 347 + }, + { + "re": 224, + "im": 346 + }, + { + "re": 220, + "im": 346 + }, + { + "re": 218, + "im": 346 + }, + { + "re": 216, + "im": 346 + }, + { + "re": 214, + "im": 346 + }, + { + "re": 212, + "im": 345 + }, + { + "re": 211, + "im": 344 + }, + { + "re": 209, + "im": 344 + }, + { + "re": 208, + "im": 344 + }, + { + "re": 207, + "im": 344 + }, + { + "re": 206, + "im": 344 + }, + { + "re": 204, + "im": 344 + }, + { + "re": 202, + "im": 343 + }, + { + "re": 199, + "im": 343 + }, + { + "re": 196, + "im": 342 + }, + { + "re": 194, + "im": 341 + }, + { + "re": 191, + "im": 340 + }, + { + "re": 188, + "im": 339 + }, + { + "re": 186, + "im": 339 + }, + { + "re": 183, + "im": 338 + }, + { + "re": 180, + "im": 337 + }, + { + "re": 178, + "im": 336 + }, + { + "re": 176, + "im": 336 + }, + { + "re": 173, + "im": 335 + }, + { + "re": 171, + "im": 335 + }, + { + "re": 168, + "im": 334 + }, + { + "re": 166, + "im": 333 + }, + { + "re": 162, + "im": 333 + }, + { + "re": 160, + "im": 332 + }, + { + "re": 158, + "im": 331 + }, + { + "re": 156, + "im": 331 + }, + { + "re": 154, + "im": 331 + }, + { + "re": 152, + "im": 331 + }, + { + "re": 149, + "im": 331 + }, + { + "re": 147, + "im": 330 + }, + { + "re": 145, + "im": 330 + }, + { + "re": 143, + "im": 330 + }, + { + "re": 141, + "im": 329 + }, + { + "re": 138, + "im": 329 + }, + { + "re": 136, + "im": 329 + }, + { + "re": 132, + "im": 329 + }, + { + "re": 128, + "im": 329 + }, + { + "re": 124, + "im": 329 + }, + { + "re": 120, + "im": 328 + }, + { + "re": 118, + "im": 328 + }, + { + "re": 117, + "im": 328 + }, + { + "re": 115, + "im": 328 + }, + { + "re": 113, + "im": 328 + }, + { + "re": 111, + "im": 328 + }, + { + "re": 108, + "im": 328 + }, + { + "re": 105, + "im": 328 + }, + { + "re": 103, + "im": 327 + }, + { + "re": 99, + "im": 327 + }, + { + "re": 97, + "im": 327 + }, + { + "re": 95, + "im": 326 + }, + { + "re": 93, + "im": 326 + }, + { + "re": 90, + "im": 326 + }, + { + "re": 88, + "im": 326 + }, + { + "re": 86, + "im": 326 + }, + { + "re": 84, + "im": 326 + }, + { + "re": 83, + "im": 326 + }, + { + "re": 81, + "im": 326 + }, + { + "re": 79, + "im": 326 + }, + { + "re": 78, + "im": 327 + }, + { + "re": 77, + "im": 327 + }, + { + "re": 76, + "im": 328 + }, + { + "re": 76, + "im": 329 + }, + { + "re": 76, + "im": 329 + }, + { + "re": 76, + "im": 330 + }, + { + "re": 76, + "im": 331 + }, + { + "re": 77, + "im": 333 + }, + { + "re": 78, + "im": 334 + }, + { + "re": 79, + "im": 335 + }, + { + "re": 80, + "im": 337 + }, + { + "re": 82, + "im": 338 + }, + { + "re": 83, + "im": 340 + }, + { + "re": 84, + "im": 340 + }, + { + "re": 85, + "im": 341 + }, + { + "re": 86, + "im": 342 + }, + { + "re": 88, + "im": 342 + }, + { + "re": 91, + "im": 345 + }, + { + "re": 94, + "im": 346 + }, + { + "re": 96, + "im": 347 + }, + { + "re": 98, + "im": 348 + }, + { + "re": 99, + "im": 348 + }, + { + "re": 99, + "im": 348 + }, + { + "re": 100, + "im": 349 + }, + { + "re": 102, + "im": 349 + }, + { + "re": 105, + "im": 350 + }, + { + "re": 110, + "im": 351 + }, + { + "re": 113, + "im": 351 + }, + { + "re": 116, + "im": 352 + }, + { + "re": 117, + "im": 353 + }, + { + "re": 118, + "im": 353 + }, + { + "re": 119, + "im": 353 + }, + { + "re": 120, + "im": 353 + }, + { + "re": 123, + "im": 353 + }, + { + "re": 127, + "im": 353 + }, + { + "re": 130, + "im": 354 + }, + { + "re": 132, + "im": 354 + }, + { + "re": 133, + "im": 354 + }, + { + "re": 134, + "im": 354 + }, + { + "re": 135, + "im": 354 + }, + { + "re": 136, + "im": 354 + }, + { + "re": 139, + "im": 354 + }, + { + "re": 140, + "im": 354 + }, + { + "re": 143, + "im": 355 + }, + { + "re": 145, + "im": 355 + }, + { + "re": 146, + "im": 355 + }, + { + "re": 146, + "im": 355 + }, + { + "re": 147, + "im": 355 + }, + { + "re": 148, + "im": 355 + }, + { + "re": 149, + "im": 355 + }, + { + "re": 150, + "im": 356 + }, + { + "re": 153, + "im": 356 + }, + { + "re": 154, + "im": 357 + }, + { + "re": 156, + "im": 358 + }, + { + "re": 157, + "im": 358 + }, + { + "re": 158, + "im": 358 + }, + { + "re": 160, + "im": 359 + }, + { + "re": 162, + "im": 359 + }, + { + "re": 165, + "im": 361 + }, + { + "re": 167, + "im": 362 + }, + { + "re": 168, + "im": 362 + }, + { + "re": 170, + "im": 362 + }, + { + "re": 171, + "im": 363 + }, + { + "re": 173, + "im": 364 + }, + { + "re": 177, + "im": 366 + }, + { + "re": 181, + "im": 369 + }, + { + "re": 185, + "im": 371 + }, + { + "re": 189, + "im": 372 + }, + { + "re": 190, + "im": 372 + }, + { + "re": 191, + "im": 372 + }, + { + "re": 192, + "im": 372 + }, + { + "re": 193, + "im": 372 + }, + { + "re": 194, + "im": 373 + }, + { + "re": 195, + "im": 374 + }, + { + "re": 198, + "im": 375 + }, + { + "re": 202, + "im": 377 + }, + { + "re": 204, + "im": 378 + }, + { + "re": 205, + "im": 378 + }, + { + "re": 205, + "im": 378 + }, + { + "re": 206, + "im": 378 + }, + { + "re": 207, + "im": 378 + }, + { + "re": 209, + "im": 379 + }, + { + "re": 211, + "im": 380 + }, + { + "re": 214, + "im": 381 + }, + { + "re": 214, + "im": 381 + }, + { + "re": 215, + "im": 381 + }, + { + "re": 215, + "im": 381 + }, + { + "re": 215, + "im": 381 + }, + { + "re": 216, + "im": 382 + }, + { + "re": 218, + "im": 383 + }, + { + "re": 220, + "im": 383 + }, + { + "re": 222, + "im": 384 + }, + { + "re": 224, + "im": 385 + }, + { + "re": 224, + "im": 386 + }, + { + "re": 225, + "im": 386 + }, + { + "re": 226, + "im": 386 + }, + { + "re": 226, + "im": 387 + }, + { + "re": 227, + "im": 387 + }, + { + "re": 228, + "im": 388 + }, + { + "re": 229, + "im": 389 + }, + { + "re": 230, + "im": 389 + }, + { + "re": 230, + "im": 390 + }, + { + "re": 231, + "im": 390 + }, + { + "re": 231, + "im": 390 + }, + { + "re": 231, + "im": 390 + }, + { + "re": 231, + "im": 390 + }, + { + "re": 232, + "im": 392 + }, + { + "re": 233, + "im": 393 + }, + { + "re": 234, + "im": 395 + }, + { + "re": 234, + "im": 395 + }, + { + "re": 234, + "im": 395 + }, + { + "re": 234, + "im": 395 + }, + { + "re": 234, + "im": 395 + }, + { + "re": 234, + "im": 396 + }, + { + "re": 234, + "im": 396 + }, + { + "re": 233, + "im": 396 + }, + { + "re": 232, + "im": 396 + }, + { + "re": 229, + "im": 397 + }, + { + "re": 227, + "im": 397 + }, + { + "re": 223, + "im": 397 + }, + { + "re": 220, + "im": 397 + }, + { + "re": 217, + "im": 397 + }, + { + "re": 214, + "im": 397 + }, + { + "re": 211, + "im": 397 + }, + { + "re": 208, + "im": 396 + }, + { + "re": 204, + "im": 394 + }, + { + "re": 202, + "im": 394 + }, + { + "re": 200, + "im": 394 + }, + { + "re": 198, + "im": 394 + }, + { + "re": 196, + "im": 393 + }, + { + "re": 195, + "im": 393 + }, + { + "re": 192, + "im": 393 + }, + { + "re": 189, + "im": 392 + }, + { + "re": 186, + "im": 392 + }, + { + "re": 183, + "im": 391 + }, + { + "re": 181, + "im": 391 + }, + { + "re": 179, + "im": 391 + }, + { + "re": 178, + "im": 391 + }, + { + "re": 176, + "im": 391 + }, + { + "re": 174, + "im": 391 + }, + { + "re": 172, + "im": 391 + }, + { + "re": 170, + "im": 391 + }, + { + "re": 168, + "im": 391 + }, + { + "re": 166, + "im": 391 + }, + { + "re": 165, + "im": 391 + }, + { + "re": 162, + "im": 392 + }, + { + "re": 159, + "im": 392 + }, + { + "re": 158, + "im": 392 + }, + { + "re": 156, + "im": 392 + }, + { + "re": 154, + "im": 392 + }, + { + "re": 153, + "im": 392 + }, + { + "re": 150, + "im": 392 + }, + { + "re": 148, + "im": 392 + }, + { + "re": 146, + "im": 393 + }, + { + "re": 144, + "im": 393 + }, + { + "re": 143, + "im": 393 + }, + { + "re": 142, + "im": 393 + }, + { + "re": 141, + "im": 394 + }, + { + "re": 140, + "im": 394 + }, + { + "re": 138, + "im": 394 + }, + { + "re": 136, + "im": 394 + }, + { + "re": 134, + "im": 394 + }, + { + "re": 133, + "im": 394 + }, + { + "re": 132, + "im": 395 + }, + { + "re": 132, + "im": 395 + }, + { + "re": 129, + "im": 395 + }, + { + "re": 128, + "im": 395 + }, + { + "re": 125, + "im": 395 + }, + { + "re": 122, + "im": 395 + }, + { + "re": 121, + "im": 395 + }, + { + "re": 121, + "im": 395 + }, + { + "re": 120, + "im": 395 + }, + { + "re": 117, + "im": 395 + }, + { + "re": 114, + "im": 395 + }, + { + "re": 112, + "im": 395 + }, + { + "re": 111, + "im": 395 + }, + { + "re": 111, + "im": 395 + }, + { + "re": 111, + "im": 395 + }, + { + "re": 111, + "im": 395 + }, + { + "re": 111, + "im": 395 + }, + { + "re": 109, + "im": 395 + }, + { + "re": 108, + "im": 395 + }, + { + "re": 107, + "im": 395 + }, + { + "re": 107, + "im": 395 + }, + { + "re": 107, + "im": 395 + }, + { + "re": 106, + "im": 395 + }, + { + "re": 106, + "im": 394 + }, + { + "re": 106, + "im": 390 + }, + { + "re": 105, + "im": 388 + }, + { + "re": 105, + "im": 386 + }, + { + "re": 105, + "im": 385 + }, + { + "re": 105, + "im": 384 + }, + { + "re": 105, + "im": 383 + }, + { + "re": 104, + "im": 381 + }, + { + "re": 104, + "im": 380 + }, + { + "re": 104, + "im": 378 + }, + { + "re": 104, + "im": 377 + }, + { + "re": 104, + "im": 376 + }, + { + "re": 104, + "im": 376 + }, + { + "re": 104, + "im": 376 + }, + { + "re": 104, + "im": 375 + }, + { + "re": 104, + "im": 373 + }, + { + "re": 103, + "im": 372 + }, + { + "re": 103, + "im": 369 + }, + { + "re": 103, + "im": 367 + }, + { + "re": 103, + "im": 366 + }, + { + "re": 103, + "im": 365 + }, + { + "re": 103, + "im": 365 + }, + { + "re": 103, + "im": 365 + }, + { + "re": 103, + "im": 365 + }, + { + "re": 103, + "im": 363 + }, + { + "re": 103, + "im": 361 + }, + { + "re": 103, + "im": 361 + }, + { + "re": 103, + "im": 361 + }, + { + "re": 103, + "im": 361 + }, + { + "re": 103, + "im": 361 + }, + { + "re": 103, + "im": 361 + }, + { + "re": 103, + "im": 360 + }, + { + "re": 103, + "im": 359 + }, + { + "re": 103, + "im": 358 + }, + { + "re": 103, + "im": 357 + }, + { + "re": 103, + "im": 357 + }, + { + "re": 103, + "im": 356 + }, + { + "re": 103, + "im": 355 + }, + { + "re": 103, + "im": 354 + }, + { + "re": 102, + "im": 353 + }, + { + "re": 101, + "im": 352 + }, + { + "re": 101, + "im": 352 + }, + { + "re": 101, + "im": 352 + }, + { + "re": 101, + "im": 352 + }, + { + "re": 101, + "im": 352 + }, + { + "re": 100, + "im": 352 + }, + { + "re": 100, + "im": 352 + }, + { + "re": 99, + "im": 351 + }, + { + "re": 97, + "im": 350 + }, + { + "re": 96, + "im": 350 + }, + { + "re": 96, + "im": 349 + }, + { + "re": 95, + "im": 349 + }, + { + "re": 95, + "im": 349 + }, + { + "re": 95, + "im": 349 + }, + { + "re": 94, + "im": 349 + }, + { + "re": 93, + "im": 348 + }, + { + "re": 92, + "im": 347 + }, + { + "re": 92, + "im": 347 + }, + { + "re": 92, + "im": 347 + }, + { + "re": 92, + "im": 347 + }, + { + "re": 92, + "im": 347 + }, + { + "re": 92, + "im": 347 + }, + { + "re": 90, + "im": 346 + }, + { + "re": 89, + "im": 346 + }, + { + "re": 88, + "im": 344 + }, + { + "re": 87, + "im": 343 + }, + { + "re": 87, + "im": 343 + }, + { + "re": 87, + "im": 343 + }, + { + "re": 86, + "im": 343 + }, + { + "re": 85, + "im": 343 + }, + { + "re": 84, + "im": 342 + }, + { + "re": 83, + "im": 342 + }, + { + "re": 82, + "im": 340 + }, + { + "re": 81, + "im": 340 + }, + { + "re": 81, + "im": 339 + }, + { + "re": 80, + "im": 339 + }, + { + "re": 80, + "im": 338 + }, + { + "re": 79, + "im": 337 + }, + { + "re": 78, + "im": 336 + }, + { + "re": 78, + "im": 336 + }, + { + "re": 78, + "im": 336 + }, + { + "re": 78, + "im": 336 + }, + { + "re": 78, + "im": 336 + }, + { + "re": 78, + "im": 334 + }, + { + "re": 78, + "im": 332 + }, + { + "re": 77, + "im": 331 + }, + { + "re": 77, + "im": 330 + }, + { + "re": 77, + "im": 330 + }, + { + "re": 77, + "im": 330 + }, + { + "re": 77, + "im": 330 + }, + { + "re": 77, + "im": 330 + }, + { + "re": 77, + "im": 330 + }, + { + "re": 77, + "im": 329 + }, + { + "re": 77, + "im": 328 + }, + { + "re": 77, + "im": 327 + }, + { + "re": 76, + "im": 327 + }, + { + "re": 76, + "im": 327 + }, + { + "re": 76, + "im": 327 + }, + { + "re": 76, + "im": 327 + }, + { + "re": 76, + "im": 327 + }, + { + "re": 78, + "im": 326 + }, + { + "re": 79, + "im": 324 + }, + { + "re": 80, + "im": 323 + }, + { + "re": 80, + "im": 323 + }, + { + "re": 80, + "im": 323 + }, + { + "re": 80, + "im": 323 + }, + { + "re": 80, + "im": 323 + }, + { + "re": 80, + "im": 323 + }, + { + "re": 82, + "im": 322 + }, + { + "re": 83, + "im": 321 + }, + { + "re": 83, + "im": 321 + }, + { + "re": 83, + "im": 321 + }, + { + "re": 83, + "im": 321 + }, + { + "re": 84, + "im": 321 + }, + { + "re": 84, + "im": 321 + }, + { + "re": 86, + "im": 321 + }, + { + "re": 87, + "im": 320 + }, + { + "re": 87, + "im": 320 + }, + { + "re": 87, + "im": 320 + }, + { + "re": 87, + "im": 320 + }, + { + "re": 88, + "im": 320 + }, + { + "re": 90, + "im": 320 + }, + { + "re": 91, + "im": 320 + }, + { + "re": 92, + "im": 320 + }, + { + "re": 92, + "im": 320 + }, + { + "re": 92, + "im": 320 + }, + { + "re": 92, + "im": 320 + }, + { + "re": 92, + "im": 320 + }, + { + "re": 94, + "im": 320 + }, + { + "re": 96, + "im": 320 + }, + { + "re": 98, + "im": 320 + }, + { + "re": 99, + "im": 320 + }, + { + "re": 99, + "im": 320 + }, + { + "re": 99, + "im": 320 + }, + { + "re": 99, + "im": 320 + }, + { + "re": 99, + "im": 320 + }, + { + "re": 100, + "im": 319 + }, + { + "re": 102, + "im": 319 + }, + { + "re": 103, + "im": 319 + }, + { + "re": 103, + "im": 318 + }, + { + "re": 104, + "im": 318 + }, + { + "re": 104, + "im": 318 + }, + { + "re": 105, + "im": 317 + }, + { + "re": 105, + "im": 317 + }, + { + "re": 106, + "im": 317 + }, + { + "re": 106, + "im": 317 + }, + { + "re": 106, + "im": 316 + }, + { + "re": 106, + "im": 315 + }, + { + "re": 106, + "im": 314 + }, + { + "re": 106, + "im": 313 + }, + { + "re": 106, + "im": 311 + }, + { + "re": 105, + "im": 310 + }, + { + "re": 105, + "im": 309 + }, + { + "re": 105, + "im": 309 + }, + { + "re": 104, + "im": 309 + }, + { + "re": 104, + "im": 307 + }, + { + "re": 103, + "im": 306 + }, + { + "re": 101, + "im": 305 + }, + { + "re": 100, + "im": 303 + }, + { + "re": 99, + "im": 303 + }, + { + "re": 99, + "im": 303 + }, + { + "re": 98, + "im": 302 + }, + { + "re": 96, + "im": 302 + }, + { + "re": 95, + "im": 302 + }, + { + "re": 94, + "im": 302 + }, + { + "re": 94, + "im": 302 + }, + { + "re": 94, + "im": 302 + }, + { + "re": 93, + "im": 302 + }, + { + "re": 93, + "im": 301 + }, + { + "re": 92, + "im": 301 + }, + { + "re": 90, + "im": 300 + }, + { + "re": 89, + "im": 299 + }, + { + "re": 89, + "im": 299 + }, + { + "re": 89, + "im": 299 + }, + { + "re": 88, + "im": 298 + }, + { + "re": 87, + "im": 297 + }, + { + "re": 85, + "im": 296 + }, + { + "re": 85, + "im": 295 + }, + { + "re": 84, + "im": 295 + }, + { + "re": 84, + "im": 295 + }, + { + "re": 83, + "im": 295 + }, + { + "re": 83, + "im": 294 + }, + { + "re": 81, + "im": 293 + }, + { + "re": 81, + "im": 292 + }, + { + "re": 81, + "im": 291 + }, + { + "re": 80, + "im": 290 + }, + { + "re": 80, + "im": 290 + }, + { + "re": 80, + "im": 290 + }, + { + "re": 80, + "im": 290 + }, + { + "re": 80, + "im": 289 + }, + { + "re": 80, + "im": 288 + }, + { + "re": 80, + "im": 287 + }, + { + "re": 80, + "im": 286 + }, + { + "re": 80, + "im": 285 + }, + { + "re": 80, + "im": 285 + }, + { + "re": 80, + "im": 284 + }, + { + "re": 80, + "im": 283 + }, + { + "re": 80, + "im": 282 + }, + { + "re": 80, + "im": 281 + }, + { + "re": 81, + "im": 280 + }, + { + "re": 81, + "im": 280 + }, + { + "re": 81, + "im": 280 + }, + { + "re": 81, + "im": 280 + }, + { + "re": 81, + "im": 280 + }, + { + "re": 83, + "im": 279 + }, + { + "re": 84, + "im": 278 + }, + { + "re": 86, + "im": 277 + }, + { + "re": 87, + "im": 276 + }, + { + "re": 87, + "im": 276 + }, + { + "re": 87, + "im": 276 + }, + { + "re": 88, + "im": 276 + }, + { + "re": 89, + "im": 275 + }, + { + "re": 91, + "im": 275 + }, + { + "re": 93, + "im": 274 + }, + { + "re": 95, + "im": 274 + }, + { + "re": 96, + "im": 273 + }, + { + "re": 96, + "im": 273 + }, + { + "re": 97, + "im": 273 + }, + { + "re": 98, + "im": 273 + }, + { + "re": 98, + "im": 273 + }, + { + "re": 98, + "im": 273 + }, + { + "re": 99, + "im": 273 + }, + { + "re": 100, + "im": 273 + }, + { + "re": 102, + "im": 273 + }, + { + "re": 104, + "im": 272 + }, + { + "re": 104, + "im": 272 + }, + { + "re": 104, + "im": 272 + }, + { + "re": 105, + "im": 272 + }, + { + "re": 105, + "im": 272 + }, + { + "re": 105, + "im": 272 + }, + { + "re": 105, + "im": 272 + }, + { + "re": 106, + "im": 272 + }, + { + "re": 106, + "im": 271 + }, + { + "re": 107, + "im": 270 + }, + { + "re": 107, + "im": 270 + }, + { + "re": 107, + "im": 269 + }, + { + "re": 107, + "im": 269 + }, + { + "re": 107, + "im": 269 + }, + { + "re": 107, + "im": 267 + }, + { + "re": 108, + "im": 265 + }, + { + "re": 108, + "im": 264 + }, + { + "re": 108, + "im": 262 + }, + { + "re": 108, + "im": 260 + }, + { + "re": 108, + "im": 259 + }, + { + "re": 108, + "im": 258 + }, + { + "re": 108, + "im": 257 + }, + { + "re": 108, + "im": 256 + }, + { + "re": 108, + "im": 254 + }, + { + "re": 108, + "im": 253 + }, + { + "re": 108, + "im": 252 + }, + { + "re": 108, + "im": 251 + }, + { + "re": 108, + "im": 251 + }, + { + "re": 107, + "im": 249 + }, + { + "re": 107, + "im": 248 + }, + { + "re": 107, + "im": 247 + }, + { + "re": 107, + "im": 245 + }, + { + "re": 107, + "im": 243 + }, + { + "re": 107, + "im": 241 + }, + { + "re": 107, + "im": 240 + }, + { + "re": 107, + "im": 239 + }, + { + "re": 107, + "im": 237 + }, + { + "re": 107, + "im": 235 + }, + { + "re": 107, + "im": 233 + }, + { + "re": 107, + "im": 231 + }, + { + "re": 107, + "im": 229 + }, + { + "re": 107, + "im": 228 + }, + { + "re": 107, + "im": 227 + }, + { + "re": 107, + "im": 226 + }, + { + "re": 107, + "im": 224 + }, + { + "re": 107, + "im": 223 + }, + { + "re": 107, + "im": 222 + }, + { + "re": 107, + "im": 221 + }, + { + "re": 107, + "im": 219 + }, + { + "re": 107, + "im": 218 + }, + { + "re": 107, + "im": 217 + }, + { + "re": 107, + "im": 216 + }, + { + "re": 107, + "im": 215 + }, + { + "re": 107, + "im": 214 + }, + { + "re": 107, + "im": 214 + }, + { + "re": 107, + "im": 212 + }, + { + "re": 107, + "im": 211 + }, + { + "re": 107, + "im": 210 + }, + { + "re": 107, + "im": 208 + }, + { + "re": 107, + "im": 207 + }, + { + "re": 107, + "im": 206 + }, + { + "re": 107, + "im": 204 + }, + { + "re": 107, + "im": 202 + }, + { + "re": 107, + "im": 200 + }, + { + "re": 107, + "im": 198 + }, + { + "re": 107, + "im": 196 + }, + { + "re": 107, + "im": 196 + }, + { + "re": 107, + "im": 195 + }, + { + "re": 107, + "im": 194 + }, + { + "re": 107, + "im": 193 + }, + { + "re": 107, + "im": 191 + }, + { + "re": 107, + "im": 189 + }, + { + "re": 107, + "im": 187 + }, + { + "re": 107, + "im": 186 + }, + { + "re": 107, + "im": 186 + }, + { + "re": 107, + "im": 185 + }, + { + "re": 107, + "im": 183 + }, + { + "re": 107, + "im": 181 + }, + { + "re": 107, + "im": 179 + }, + { + "re": 107, + "im": 177 + }, + { + "re": 107, + "im": 176 + }, + { + "re": 107, + "im": 175 + }, + { + "re": 107, + "im": 174 + }, + { + "re": 107, + "im": 174 + }, + { + "re": 107, + "im": 172 + }, + { + "re": 107, + "im": 170 + }, + { + "re": 107, + "im": 169 + }, + { + "re": 107, + "im": 167 + }, + { + "re": 107, + "im": 166 + }, + { + "re": 107, + "im": 166 + }, + { + "re": 107, + "im": 165 + }, + { + "re": 107, + "im": 165 + }, + { + "re": 107, + "im": 163 + }, + { + "re": 107, + "im": 162 + }, + { + "re": 107, + "im": 161 + }, + { + "re": 107, + "im": 161 + }, + { + "re": 107, + "im": 160 + }, + { + "re": 107, + "im": 159 + }, + { + "re": 107, + "im": 158 + }, + { + "re": 107, + "im": 157 + }, + { + "re": 107, + "im": 155 + }, + { + "re": 107, + "im": 154 + }, + { + "re": 107, + "im": 153 + }, + { + "re": 107, + "im": 152 + }, + { + "re": 107, + "im": 151 + }, + { + "re": 107, + "im": 150 + }, + { + "re": 107, + "im": 149 + }, + { + "re": 107, + "im": 148 + }, + { + "re": 107, + "im": 145 + }, + { + "re": 107, + "im": 143 + }, + { + "re": 107, + "im": 141 + }, + { + "re": 107, + "im": 140 + }, + { + "re": 107, + "im": 140 + }, + { + "re": 107, + "im": 138 + }, + { + "re": 107, + "im": 138 + }, + { + "re": 107, + "im": 136 + }, + { + "re": 107, + "im": 135 + }, + { + "re": 107, + "im": 134 + }, + { + "re": 107, + "im": 134 + }, + { + "re": 107, + "im": 133 + }, + { + "re": 107, + "im": 133 + }, + { + "re": 107, + "im": 132 + }, + { + "re": 107, + "im": 130 + }, + { + "re": 107, + "im": 128 + }, + { + "re": 107, + "im": 127 + }, + { + "re": 107, + "im": 126 + }, + { + "re": 107, + "im": 126 + }, + { + "re": 107, + "im": 126 + }, + { + "re": 107, + "im": 125 + }, + { + "re": 107, + "im": 124 + }, + { + "re": 107, + "im": 123 + }, + { + "re": 107, + "im": 121 + }, + { + "re": 107, + "im": 120 + }, + { + "re": 107, + "im": 120 + }, + { + "re": 107, + "im": 119 + }, + { + "re": 107, + "im": 119 + }, + { + "re": 107, + "im": 118 + }, + { + "re": 107, + "im": 117 + }, + { + "re": 108, + "im": 116 + }, + { + "re": 108, + "im": 115 + }, + { + "re": 108, + "im": 113 + }, + { + "re": 108, + "im": 113 + }, + { + "re": 108, + "im": 113 + }, + { + "re": 108, + "im": 113 + }, + { + "re": 108, + "im": 112 + }, + { + "re": 108, + "im": 112 + }, + { + "re": 108, + "im": 111 + }, + { + "re": 108, + "im": 110 + }, + { + "re": 108, + "im": 108 + }, + { + "re": 107, + "im": 107 + }, + { + "re": 107, + "im": 105 + }, + { + "re": 107, + "im": 105 + }, + { + "re": 106, + "im": 104 + }, + { + "re": 105, + "im": 104 + }, + { + "re": 104, + "im": 103 + }, + { + "re": 104, + "im": 101 + }, + { + "re": 103, + "im": 100 + }, + { + "re": 103, + "im": 100 + }, + { + "re": 102, + "im": 99 + }, + { + "re": 101, + "im": 98 + }, + { + "re": 100, + "im": 97 + }, + { + "re": 99, + "im": 96 + }, + { + "re": 99, + "im": 96 + }, + { + "re": 99, + "im": 96 + }, + { + "re": 99, + "im": 95 + }, + { + "re": 98, + "im": 94 + }, + { + "re": 97, + "im": 92 + }, + { + "re": 97, + "im": 91 + }, + { + "re": 96, + "im": 89 + }, + { + "re": 96, + "im": 88 + }, + { + "re": 96, + "im": 87 + }, + { + "re": 96, + "im": 87 + }, + { + "re": 96, + "im": 86 + }, + { + "re": 96, + "im": 85 + }, + { + "re": 96, + "im": 83 + }, + { + "re": 96, + "im": 81 + }, + { + "re": 96, + "im": 79 + }, + { + "re": 96, + "im": 77 + }, + { + "re": 96, + "im": 75 + }, + { + "re": 96, + "im": 74 + }, + { + "re": 96, + "im": 73 + }, + { + "re": 96, + "im": 71 + }, + { + "re": 96, + "im": 68 + }, + { + "re": 96, + "im": 66 + }, + { + "re": 96, + "im": 63 + }, + { + "re": 96, + "im": 61 + }, + { + "re": 96, + "im": 59 + }, + { + "re": 96, + "im": 59 + }, + { + "re": 96, + "im": 58 + }, + { + "re": 96, + "im": 57 + }, + { + "re": 96, + "im": 55 + }, + { + "re": 96, + "im": 55 + }, + { + "re": 96, + "im": 54 + }, + { + "re": 96, + "im": 53 + }, + { + "re": 96, + "im": 53 + }, + { + "re": 96, + "im": 51 + }, + { + "re": 96, + "im": 51 + }, + { + "re": 96, + "im": 51 + }, + { + "re": 96, + "im": 51 + }, + { + "re": 96, + "im": 51 + }, + { + "re": 96, + "im": 51 + }, + { + "re": 96, + "im": 51 + }, + { + "re": 96, + "im": 51 + }, + { + "re": 96, + "im": 51 + }, + { + "re": 96, + "im": 55 + }, + { + "re": 96, + "im": 59 + }, + { + "re": 96, + "im": 62 + }, + { + "re": 96, + "im": 66 + }, + { + "re": 96, + "im": 69 + }, + { + "re": 96, + "im": 72 + }, + { + "re": 96, + "im": 74 + }, + { + "re": 96, + "im": 75 + }, + { + "re": 96, + "im": 77 + }, + { + "re": 96, + "im": 79 + }, + { + "re": 96, + "im": 80 + }, + { + "re": 96, + "im": 81 + }, + { + "re": 96, + "im": 82 + }, + { + "re": 96, + "im": 83 + }, + { + "re": 96, + "im": 84 + }, + { + "re": 96, + "im": 85 + }, + { + "re": 96, + "im": 87 + }, + { + "re": 96, + "im": 89 + }, + { + "re": 95, + "im": 91 + }, + { + "re": 94, + "im": 93 + }, + { + "re": 94, + "im": 95 + }, + { + "re": 93, + "im": 96 + }, + { + "re": 93, + "im": 97 + }, + { + "re": 93, + "im": 98 + }, + { + "re": 93, + "im": 100 + }, + { + "re": 92, + "im": 103 + }, + { + "re": 92, + "im": 105 + }, + { + "re": 92, + "im": 107 + }, + { + "re": 91, + "im": 108 + }, + { + "re": 91, + "im": 108 + }, + { + "re": 90, + "im": 110 + }, + { + "re": 90, + "im": 111 + }, + { + "re": 89, + "im": 112 + }, + { + "re": 88, + "im": 114 + }, + { + "re": 87, + "im": 116 + }, + { + "re": 87, + "im": 119 + }, + { + "re": 86, + "im": 121 + }, + { + "re": 85, + "im": 123 + }, + { + "re": 83, + "im": 126 + }, + { + "re": 82, + "im": 128 + }, + { + "re": 81, + "im": 131 + }, + { + "re": 80, + "im": 133 + }, + { + "re": 79, + "im": 135 + }, + { + "re": 78, + "im": 135 + }, + { + "re": 78, + "im": 136 + }, + { + "re": 77, + "im": 137 + }, + { + "re": 76, + "im": 139 + }, + { + "re": 76, + "im": 140 + }, + { + "re": 75, + "im": 142 + }, + { + "re": 74, + "im": 143 + }, + { + "re": 72, + "im": 145 + }, + { + "re": 71, + "im": 146 + }, + { + "re": 71, + "im": 147 + }, + { + "re": 70, + "im": 148 + }, + { + "re": 70, + "im": 149 + }, + { + "re": 70, + "im": 149 + }, + { + "re": 68, + "im": 151 + }, + { + "re": 68, + "im": 152 + }, + { + "re": 67, + "im": 154 + }, + { + "re": 66, + "im": 157 + }, + { + "re": 65, + "im": 158 + }, + { + "re": 65, + "im": 158 + }, + { + "re": 63, + "im": 163 + }, + { + "re": 62, + "im": 165 + }, + { + "re": 60, + "im": 169 + }, + { + "re": 58, + "im": 172 + }, + { + "re": 56, + "im": 176 + }, + { + "re": 55, + "im": 177 + }, + { + "re": 54, + "im": 181 + }, + { + "re": 53, + "im": 182 + }, + { + "re": 51, + "im": 184 + }, + { + "re": 50, + "im": 186 + }, + { + "re": 49, + "im": 189 + }, + { + "re": 46, + "im": 192 + }, + { + "re": 43, + "im": 197 + }, + { + "re": 42, + "im": 201 + }, + { + "re": 39, + "im": 204 + }, + { + "re": 35, + "im": 207 + }, + { + "re": 33, + "im": 210 + }, + { + "re": 30, + "im": 214 + }, + { + "re": 27, + "im": 217 + }, + { + "re": 25, + "im": 221 + }, + { + "re": 23, + "im": 223 + }, + { + "re": 22, + "im": 225 + }, + { + "re": 21, + "im": 226 + }, + { + "re": 19, + "im": 227 + }, + { + "re": 19, + "im": 228 + }, + { + "re": 18, + "im": 230 + }, + { + "re": 17, + "im": 232 + }, + { + "re": 16, + "im": 234 + }, + { + "re": 15, + "im": 236 + }, + { + "re": 14, + "im": 238 + }, + { + "re": 13, + "im": 240 + }, + { + "re": 13, + "im": 242 + }, + { + "re": 12, + "im": 243 + }, + { + "re": 10, + "im": 246 + }, + { + "re": 9, + "im": 248 + }, + { + "re": 8, + "im": 250 + }, + { + "re": 6, + "im": 252 + }, + { + "re": 6, + "im": 254 + }, + { + "re": 5, + "im": 256 + }, + { + "re": 5, + "im": 257 + }, + { + "re": 4, + "im": 259 + }, + { + "re": 2, + "im": 261 + }, + { + "re": 1, + "im": 263 + }, + { + "re": 1, + "im": 265 + }, + { + "re": 0, + "im": 267 + }, + { + "re": 0, + "im": 268 + }, + { + "re": -1, + "im": 269 + }, + { + "re": -2, + "im": 271 + }, + { + "re": -3, + "im": 273 + }, + { + "re": -3, + "im": 275 + }, + { + "re": -5, + "im": 277 + }, + { + "re": -6, + "im": 280 + }, + { + "re": -6, + "im": 281 + }, + { + "re": -7, + "im": 282 + }, + { + "re": -7, + "im": 283 + }, + { + "re": -7, + "im": 284 + }, + { + "re": -8, + "im": 285 + }, + { + "re": -9, + "im": 287 + }, + { + "re": -10, + "im": 289 + }, + { + "re": -10, + "im": 290 + }, + { + "re": -11, + "im": 292 + }, + { + "re": -11, + "im": 292 + }, + { + "re": -11, + "im": 292 + }, + { + "re": -11, + "im": 292 + }, + { + "re": -11, + "im": 292 + }, + { + "re": -15, + "im": 298 + }, + { + "re": -16, + "im": 300 + }, + { + "re": -16, + "im": 301 + }, + { + "re": -17, + "im": 303 + }, + { + "re": -17, + "im": 305 + }, + { + "re": -19, + "im": 306 + }, + { + "re": -19, + "im": 309 + }, + { + "re": -21, + "im": 311 + }, + { + "re": -22, + "im": 313 + }, + { + "re": -23, + "im": 314 + }, + { + "re": -24, + "im": 317 + }, + { + "re": -24, + "im": 318 + }, + { + "re": -25, + "im": 320 + }, + { + "re": -26, + "im": 321 + }, + { + "re": -27, + "im": 323 + }, + { + "re": -28, + "im": 325 + }, + { + "re": -29, + "im": 327 + }, + { + "re": -29, + "im": 328 + }, + { + "re": -29, + "im": 329 + }, + { + "re": -29, + "im": 329 + }, + { + "re": -29, + "im": 329 + }, + { + "re": -29, + "im": 329 + }, + { + "re": -34, + "im": 336 + }, + { + "re": -34, + "im": 337 + }, + { + "re": -35, + "im": 338 + }, + { + "re": -35, + "im": 339 + }, + { + "re": -35, + "im": 340 + }, + { + "re": -36, + "im": 341 + }, + { + "re": -36, + "im": 343 + }, + { + "re": -37, + "im": 345 + }, + { + "re": -39, + "im": 347 + }, + { + "re": -39, + "im": 348 + }, + { + "re": -39, + "im": 350 + }, + { + "re": -40, + "im": 351 + }, + { + "re": -41, + "im": 353 + }, + { + "re": -43, + "im": 355 + }, + { + "re": -43, + "im": 356 + }, + { + "re": -44, + "im": 358 + }, + { + "re": -44, + "im": 359 + }, + { + "re": -44, + "im": 360 + }, + { + "re": -45, + "im": 362 + }, + { + "re": -45, + "im": 363 + }, + { + "re": -45, + "im": 364 + }, + { + "re": -45, + "im": 366 + }, + { + "re": -46, + "im": 366 + }, + { + "re": -46, + "im": 367 + }, + { + "re": -47, + "im": 367 + }, + { + "re": -47, + "im": 369 + }, + { + "re": -48, + "im": 371 + }, + { + "re": -48, + "im": 372 + }, + { + "re": -48, + "im": 374 + }, + { + "re": -49, + "im": 375 + }, + { + "re": -49, + "im": 377 + }, + { + "re": -49, + "im": 378 + }, + { + "re": -49, + "im": 379 + }, + { + "re": -50, + "im": 379 + }, + { + "re": -50, + "im": 381 + }, + { + "re": -51, + "im": 382 + }, + { + "re": -51, + "im": 383 + }, + { + "re": -51, + "im": 383 + }, + { + "re": -51, + "im": 383 + }, + { + "re": -51, + "im": 384 + }, + { + "re": -52, + "im": 385 + }, + { + "re": -53, + "im": 387 + }, + { + "re": -53, + "im": 388 + }, + { + "re": -53, + "im": 389 + }, + { + "re": -54, + "im": 389 + }, + { + "re": -54, + "im": 389 + }, + { + "re": -54, + "im": 390 + }, + { + "re": -54, + "im": 390 + }, + { + "re": -54, + "im": 390 + }, + { + "re": -54, + "im": 391 + }, + { + "re": -55, + "im": 392 + }, + { + "re": -56, + "im": 393 + }, + { + "re": -56, + "im": 394 + }, + { + "re": -57, + "im": 395 + }, + { + "re": -57, + "im": 395 + }, + { + "re": -57, + "im": 396 + }, + { + "re": -58, + "im": 396 + }, + { + "re": -58, + "im": 397 + }, + { + "re": -59, + "im": 397 + }, + { + "re": -61, + "im": 398 + }, + { + "re": -62, + "im": 399 + }, + { + "re": -65, + "im": 399 + }, + { + "re": -66, + "im": 400 + }, + { + "re": -69, + "im": 400 + }, + { + "re": -71, + "im": 400 + }, + { + "re": -73, + "im": 400 + }, + { + "re": -75, + "im": 400 + }, + { + "re": -77, + "im": 400 + }, + { + "re": -78, + "im": 400 + }, + { + "re": -80, + "im": 400 + }, + { + "re": -82, + "im": 400 + }, + { + "re": -84, + "im": 400 + }, + { + "re": -86, + "im": 400 + }, + { + "re": -87, + "im": 400 + }, + { + "re": -89, + "im": 400 + }, + { + "re": -91, + "im": 400 + }, + { + "re": -93, + "im": 400 + }, + { + "re": -95, + "im": 400 + }, + { + "re": -97, + "im": 400 + }, + { + "re": -99, + "im": 400 + }, + { + "re": -102, + "im": 400 + }, + { + "re": -103, + "im": 400 + }, + { + "re": -105, + "im": 400 + }, + { + "re": -107, + "im": 400 + }, + { + "re": -110, + "im": 400 + }, + { + "re": -111, + "im": 400 + }, + { + "re": -113, + "im": 400 + }, + { + "re": -116, + "im": 400 + }, + { + "re": -120, + "im": 400 + }, + { + "re": -122, + "im": 400 + }, + { + "re": -124, + "im": 400 + }, + { + "re": -126, + "im": 400 + }, + { + "re": -127, + "im": 400 + }, + { + "re": -129, + "im": 400 + }, + { + "re": -131, + "im": 400 + }, + { + "re": -134, + "im": 400 + }, + { + "re": -136, + "im": 400 + }, + { + "re": -138, + "im": 400 + }, + { + "re": -140, + "im": 400 + }, + { + "re": -141, + "im": 400 + }, + { + "re": -142, + "im": 400 + }, + { + "re": -143, + "im": 400 + }, + { + "re": -145, + "im": 400 + }, + { + "re": -147, + "im": 400 + }, + { + "re": -149, + "im": 400 + }, + { + "re": -151, + "im": 400 + }, + { + "re": -153, + "im": 400 + }, + { + "re": -154, + "im": 400 + }, + { + "re": -155, + "im": 400 + }, + { + "re": -157, + "im": 400 + }, + { + "re": -159, + "im": 400 + }, + { + "re": -161, + "im": 400 + }, + { + "re": -163, + "im": 400 + }, + { + "re": -165, + "im": 400 + }, + { + "re": -168, + "im": 400 + }, + { + "re": -169, + "im": 400 + }, + { + "re": -172, + "im": 400 + }, + { + "re": -173, + "im": 400 + }, + { + "re": -174, + "im": 400 + }, + { + "re": -176, + "im": 400 + }, + { + "re": -178, + "im": 400 + }, + { + "re": -179, + "im": 400 + }, + { + "re": -180, + "im": 400 + }, + { + "re": -180, + "im": 400 + }, + { + "re": -180, + "im": 400 + }, + { + "re": -181, + "im": 400 + }, + { + "re": -181, + "im": 400 + }, + { + "re": -181, + "im": 400 + }, + { + "re": -181, + "im": 400 + }, + { + "re": -181, + "im": 400 + }, + { + "re": -181, + "im": 400 + }, + { + "re": -181, + "im": 400 + }, + { + "re": -181, + "im": 400 + }, + { + "re": -182, + "im": 399 + }, + { + "re": -182, + "im": 396 + }, + { + "re": -182, + "im": 394 + }, + { + "re": -182, + "im": 393 + }, + { + "re": -182, + "im": 393 + }, + { + "re": -182, + "im": 392 + }, + { + "re": -182, + "im": 389 + }, + { + "re": -182, + "im": 387 + }, + { + "re": -182, + "im": 385 + }, + { + "re": -182, + "im": 383 + }, + { + "re": -182, + "im": 382 + }, + { + "re": -182, + "im": 381 + }, + { + "re": -181, + "im": 380 + }, + { + "re": -181, + "im": 378 + }, + { + "re": -180, + "im": 375 + }, + { + "re": -180, + "im": 372 + }, + { + "re": -179, + "im": 371 + }, + { + "re": -179, + "im": 370 + }, + { + "re": -179, + "im": 369 + }, + { + "re": -179, + "im": 368 + }, + { + "re": -178, + "im": 367 + }, + { + "re": -177, + "im": 365 + }, + { + "re": -177, + "im": 363 + }, + { + "re": -176, + "im": 361 + }, + { + "re": -175, + "im": 359 + }, + { + "re": -174, + "im": 356 + }, + { + "re": -174, + "im": 355 + }, + { + "re": -173, + "im": 353 + }, + { + "re": -173, + "im": 352 + }, + { + "re": -173, + "im": 352 + }, + { + "re": -173, + "im": 351 + }, + { + "re": -172, + "im": 349 + }, + { + "re": -172, + "im": 347 + }, + { + "re": -170, + "im": 344 + }, + { + "re": -170, + "im": 342 + }, + { + "re": -169, + "im": 338 + }, + { + "re": -169, + "im": 336 + }, + { + "re": -169, + "im": 334 + }, + { + "re": -169, + "im": 332 + }, + { + "re": -169, + "im": 331 + }, + { + "re": -169, + "im": 330 + }, + { + "re": -169, + "im": 328 + }, + { + "re": -168, + "im": 326 + }, + { + "re": -168, + "im": 324 + }, + { + "re": -168, + "im": 322 + }, + { + "re": -168, + "im": 319 + }, + { + "re": -168, + "im": 318 + }, + { + "re": -168, + "im": 317 + }, + { + "re": -168, + "im": 315 + }, + { + "re": -168, + "im": 314 + }, + { + "re": -168, + "im": 312 + }, + { + "re": -167, + "im": 309 + }, + { + "re": -167, + "im": 307 + }, + { + "re": -167, + "im": 303 + }, + { + "re": -167, + "im": 302 + }, + { + "re": -167, + "im": 299 + }, + { + "re": -167, + "im": 298 + }, + { + "re": -166, + "im": 296 + }, + { + "re": -165, + "im": 294 + }, + { + "re": -165, + "im": 291 + }, + { + "re": -165, + "im": 288 + }, + { + "re": -165, + "im": 285 + }, + { + "re": -165, + "im": 283 + }, + { + "re": -165, + "im": 281 + }, + { + "re": -164, + "im": 280 + }, + { + "re": -163, + "im": 277 + }, + { + "re": -162, + "im": 275 + }, + { + "re": -161, + "im": 272 + }, + { + "re": -161, + "im": 268 + }, + { + "re": -160, + "im": 265 + }, + { + "re": -159, + "im": 261 + }, + { + "re": -158, + "im": 260 + }, + { + "re": -157, + "im": 258 + }, + { + "re": -157, + "im": 257 + }, + { + "re": -157, + "im": 256 + }, + { + "re": -156, + "im": 254 + }, + { + "re": -155, + "im": 251 + }, + { + "re": -154, + "im": 248 + }, + { + "re": -154, + "im": 245 + }, + { + "re": -153, + "im": 244 + }, + { + "re": -153, + "im": 242 + }, + { + "re": -153, + "im": 240 + }, + { + "re": -152, + "im": 238 + }, + { + "re": -152, + "im": 234 + }, + { + "re": -150, + "im": 230 + }, + { + "re": -149, + "im": 226 + }, + { + "re": -148, + "im": 223 + }, + { + "re": -147, + "im": 221 + }, + { + "re": -147, + "im": 219 + }, + { + "re": -146, + "im": 219 + }, + { + "re": -146, + "im": 218 + }, + { + "re": -146, + "im": 217 + }, + { + "re": -146, + "im": 216 + }, + { + "re": -146, + "im": 213 + }, + { + "re": -146, + "im": 211 + }, + { + "re": -145, + "im": 209 + }, + { + "re": -145, + "im": 208 + }, + { + "re": -145, + "im": 207 + }, + { + "re": -145, + "im": 207 + }, + { + "re": -145, + "im": 206 + }, + { + "re": -145, + "im": 205 + }, + { + "re": -145, + "im": 203 + }, + { + "re": -145, + "im": 200 + }, + { + "re": -145, + "im": 198 + }, + { + "re": -145, + "im": 196 + }, + { + "re": -145, + "im": 193 + }, + { + "re": -145, + "im": 191 + }, + { + "re": -145, + "im": 190 + }, + { + "re": -145, + "im": 189 + }, + { + "re": -145, + "im": 186 + }, + { + "re": -144, + "im": 184 + }, + { + "re": -144, + "im": 181 + }, + { + "re": -144, + "im": 178 + }, + { + "re": -144, + "im": 177 + }, + { + "re": -143, + "im": 175 + }, + { + "re": -143, + "im": 175 + }, + { + "re": -143, + "im": 174 + }, + { + "re": -142, + "im": 171 + }, + { + "re": -141, + "im": 169 + }, + { + "re": -141, + "im": 166 + }, + { + "re": -141, + "im": 163 + }, + { + "re": -140, + "im": 161 + }, + { + "re": -140, + "im": 160 + }, + { + "re": -140, + "im": 158 + }, + { + "re": -140, + "im": 156 + }, + { + "re": -140, + "im": 153 + }, + { + "re": -140, + "im": 150 + }, + { + "re": -140, + "im": 146 + }, + { + "re": -140, + "im": 144 + }, + { + "re": -140, + "im": 143 + }, + { + "re": -140, + "im": 142 + }, + { + "re": -140, + "im": 141 + }, + { + "re": -140, + "im": 140 + }, + { + "re": -140, + "im": 139 + }, + { + "re": -140, + "im": 138 + }, + { + "re": -140, + "im": 138 + }, + { + "re": -140, + "im": 138 + }, + { + "re": -140, + "im": 138 + }, + { + "re": -140, + "im": 138 + }, + { + "re": -140, + "im": 138 + }, + { + "re": -140, + "im": 138 + }, + { + "re": -140, + "im": 138 + }, + { + "re": -140, + "im": 139 + }, + { + "re": -140, + "im": 139 + }, + { + "re": -140, + "im": 141 + }, + { + "re": -140, + "im": 143 + }, + { + "re": -140, + "im": 145 + }, + { + "re": -140, + "im": 149 + }, + { + "re": -140, + "im": 151 + }, + { + "re": -140, + "im": 153 + }, + { + "re": -140, + "im": 156 + }, + { + "re": -140, + "im": 158 + }, + { + "re": -140, + "im": 160 + }, + { + "re": -139, + "im": 162 + }, + { + "re": -139, + "im": 165 + }, + { + "re": -138, + "im": 166 + }, + { + "re": -138, + "im": 169 + }, + { + "re": -138, + "im": 170 + }, + { + "re": -138, + "im": 172 + }, + { + "re": -138, + "im": 174 + }, + { + "re": -138, + "im": 176 + }, + { + "re": -138, + "im": 178 + }, + { + "re": -138, + "im": 179 + }, + { + "re": -138, + "im": 180 + }, + { + "re": -137, + "im": 182 + }, + { + "re": -137, + "im": 183 + }, + { + "re": -137, + "im": 185 + }, + { + "re": -137, + "im": 186 + }, + { + "re": -136, + "im": 189 + }, + { + "re": -135, + "im": 191 + }, + { + "re": -133, + "im": 193 + }, + { + "re": -133, + "im": 195 + }, + { + "re": -133, + "im": 195 + }, + { + "re": -133, + "im": 195 + }, + { + "re": -133, + "im": 195 + }, + { + "re": -133, + "im": 195 + }, + { + "re": -132, + "im": 195 + }, + { + "re": -132, + "im": 195 + }, + { + "re": -131, + "im": 196 + }, + { + "re": -131, + "im": 197 + }, + { + "re": -129, + "im": 197 + }, + { + "re": -129, + "im": 198 + }, + { + "re": -127, + "im": 198 + }, + { + "re": -125, + "im": 198 + }, + { + "re": -124, + "im": 198 + }, + { + "re": -124, + "im": 199 + }, + { + "re": -123, + "im": 199 + }, + { + "re": -123, + "im": 199 + }, + { + "re": -122, + "im": 199 + }, + { + "re": -120, + "im": 200 + }, + { + "re": -119, + "im": 201 + }, + { + "re": -116, + "im": 201 + }, + { + "re": -115, + "im": 202 + }, + { + "re": -114, + "im": 202 + }, + { + "re": -113, + "im": 202 + }, + { + "re": -113, + "im": 202 + }, + { + "re": -112, + "im": 202 + }, + { + "re": -110, + "im": 203 + }, + { + "re": -107, + "im": 204 + }, + { + "re": -103, + "im": 205 + }, + { + "re": -100, + "im": 205 + }, + { + "re": -99, + "im": 206 + }, + { + "re": -99, + "im": 206 + }, + { + "re": -99, + "im": 206 + }, + { + "re": -98, + "im": 206 + }, + { + "re": -97, + "im": 206 + }, + { + "re": -95, + "im": 206 + }, + { + "re": -92, + "im": 207 + }, + { + "re": -91, + "im": 208 + }, + { + "re": -90, + "im": 208 + }, + { + "re": -89, + "im": 208 + }, + { + "re": -88, + "im": 208 + }, + { + "re": -87, + "im": 209 + }, + { + "re": -86, + "im": 209 + }, + { + "re": -83, + "im": 210 + }, + { + "re": -82, + "im": 210 + }, + { + "re": -80, + "im": 210 + }, + { + "re": -80, + "im": 210 + }, + { + "re": -80, + "im": 211 + }, + { + "re": -79, + "im": 211 + }, + { + "re": -77, + "im": 211 + }, + { + "re": -75, + "im": 212 + }, + { + "re": -74, + "im": 213 + }, + { + "re": -74, + "im": 213 + }, + { + "re": -74, + "im": 213 + }, + { + "re": -74, + "im": 213 + }, + { + "re": -73, + "im": 213 + }, + { + "re": -71, + "im": 213 + }, + { + "re": -69, + "im": 215 + }, + { + "re": -65, + "im": 217 + }, + { + "re": -62, + "im": 218 + }, + { + "re": -62, + "im": 218 + }, + { + "re": -62, + "im": 218 + }, + { + "re": -62, + "im": 218 + }, + { + "re": -62, + "im": 218 + }, + { + "re": -61, + "im": 218 + }, + { + "re": -58, + "im": 220 + }, + { + "re": -57, + "im": 222 + }, + { + "re": -56, + "im": 223 + }, + { + "re": -55, + "im": 225 + }, + { + "re": -55, + "im": 226 + }, + { + "re": -55, + "im": 227 + }, + { + "re": -55, + "im": 227 + }, + { + "re": -55, + "im": 229 + }, + { + "re": -55, + "im": 231 + }, + { + "re": -55, + "im": 234 + }, + { + "re": -55, + "im": 238 + }, + { + "re": -55, + "im": 240 + }, + { + "re": -55, + "im": 242 + }, + { + "re": -55, + "im": 244 + }, + { + "re": -55, + "im": 245 + }, + { + "re": -55, + "im": 246 + }, + { + "re": -55, + "im": 249 + }, + { + "re": -55, + "im": 251 + }, + { + "re": -55, + "im": 255 + }, + { + "re": -54, + "im": 258 + }, + { + "re": -54, + "im": 260 + }, + { + "re": -54, + "im": 262 + }, + { + "re": -54, + "im": 263 + }, + { + "re": -54, + "im": 263 + }, + { + "re": -53, + "im": 264 + }, + { + "re": -52, + "im": 267 + }, + { + "re": -51, + "im": 269 + }, + { + "re": -51, + "im": 272 + }, + { + "re": -50, + "im": 274 + }, + { + "re": -50, + "im": 276 + }, + { + "re": -50, + "im": 279 + }, + { + "re": -49, + "im": 281 + }, + { + "re": -49, + "im": 283 + }, + { + "re": -48, + "im": 285 + }, + { + "re": -48, + "im": 286 + }, + { + "re": -48, + "im": 287 + }, + { + "re": -46, + "im": 289 + }, + { + "re": -45, + "im": 291 + }, + { + "re": -44, + "im": 294 + }, + { + "re": -43, + "im": 296 + }, + { + "re": -43, + "im": 298 + }, + { + "re": -42, + "im": 298 + }, + { + "re": -42, + "im": 300 + }, + { + "re": -42, + "im": 300 + }, + { + "re": -41, + "im": 301 + }, + { + "re": -40, + "im": 302 + }, + { + "re": -39, + "im": 304 + }, + { + "re": -37, + "im": 306 + }, + { + "re": -36, + "im": 308 + }, + { + "re": -36, + "im": 308 + }, + { + "re": -35, + "im": 309 + }, + { + "re": -34, + "im": 310 + }, + { + "re": -34, + "im": 310 + }, + { + "re": -34, + "im": 312 + }, + { + "re": -33, + "im": 312 + }, + { + "re": -32, + "im": 313 + }, + { + "re": -32, + "im": 313 + }, + { + "re": -32, + "im": 313 + }, + { + "re": -32, + "im": 313 + }, + { + "re": -31, + "im": 314 + }, + { + "re": -30, + "im": 314 + }, + { + "re": -29, + "im": 315 + }, + { + "re": -28, + "im": 316 + }, + { + "re": -28, + "im": 316 + }, + { + "re": -28, + "im": 316 + }, + { + "re": -28, + "im": 316 + }, + { + "re": -28, + "im": 316 + }, + { + "re": -28, + "im": 315 + }, + { + "re": -26, + "im": 313 + }, + { + "re": -24, + "im": 310 + }, + { + "re": -23, + "im": 307 + }, + { + "re": -22, + "im": 306 + }, + { + "re": -21, + "im": 305 + }, + { + "re": -21, + "im": 303 + }, + { + "re": -21, + "im": 300 + }, + { + "re": -21, + "im": 297 + }, + { + "re": -21, + "im": 294 + }, + { + "re": -20, + "im": 293 + }, + { + "re": -20, + "im": 291 + }, + { + "re": -19, + "im": 290 + }, + { + "re": -18, + "im": 289 + }, + { + "re": -18, + "im": 286 + }, + { + "re": -17, + "im": 282 + }, + { + "re": -16, + "im": 278 + }, + { + "re": -15, + "im": 277 + }, + { + "re": -15, + "im": 277 + }, + { + "re": -14, + "im": 277 + }, + { + "re": -13, + "im": 276 + }, + { + "re": -12, + "im": 276 + }, + { + "re": -11, + "im": 274 + }, + { + "re": -9, + "im": 273 + }, + { + "re": -8, + "im": 270 + }, + { + "re": -7, + "im": 270 + }, + { + "re": -6, + "im": 269 + }, + { + "re": -5, + "im": 269 + }, + { + "re": -4, + "im": 268 + }, + { + "re": -4, + "im": 266 + }, + { + "re": -3, + "im": 265 + }, + { + "re": -2, + "im": 263 + }, + { + "re": 0, + "im": 261 + }, + { + "re": 0, + "im": 258 + }, + { + "re": 1, + "im": 256 + }, + { + "re": 2, + "im": 253 + }, + { + "re": 3, + "im": 252 + }, + { + "re": 4, + "im": 252 + }, + { + "re": 4, + "im": 251 + }, + { + "re": 5, + "im": 249 + }, + { + "re": 7, + "im": 246 + }, + { + "re": 7, + "im": 243 + }, + { + "re": 8, + "im": 240 + }, + { + "re": 9, + "im": 237 + }, + { + "re": 9, + "im": 235 + }, + { + "re": 11, + "im": 232 + }, + { + "re": 11, + "im": 231 + }, + { + "re": 12, + "im": 228 + }, + { + "re": 13, + "im": 226 + }, + { + "re": 13, + "im": 224 + }, + { + "re": 14, + "im": 222 + }, + { + "re": 15, + "im": 219 + }, + { + "re": 16, + "im": 217 + }, + { + "re": 17, + "im": 215 + }, + { + "re": 18, + "im": 214 + }, + { + "re": 18, + "im": 212 + }, + { + "re": 20, + "im": 209 + }, + { + "re": 20, + "im": 207 + }, + { + "re": 21, + "im": 203 + }, + { + "re": 22, + "im": 199 + }, + { + "re": 24, + "im": 198 + }, + { + "re": 25, + "im": 196 + }, + { + "re": 26, + "im": 194 + }, + { + "re": 27, + "im": 193 + }, + { + "re": 28, + "im": 192 + }, + { + "re": 29, + "im": 189 + }, + { + "re": 29, + "im": 187 + }, + { + "re": 30, + "im": 185 + }, + { + "re": 32, + "im": 182 + }, + { + "re": 33, + "im": 179 + }, + { + "re": 33, + "im": 177 + }, + { + "re": 34, + "im": 175 + }, + { + "re": 35, + "im": 174 + }, + { + "re": 36, + "im": 173 + }, + { + "re": 37, + "im": 171 + }, + { + "re": 38, + "im": 169 + }, + { + "re": 39, + "im": 166 + }, + { + "re": 40, + "im": 165 + }, + { + "re": 41, + "im": 163 + }, + { + "re": 41, + "im": 162 + }, + { + "re": 42, + "im": 160 + }, + { + "re": 44, + "im": 158 + }, + { + "re": 45, + "im": 157 + }, + { + "re": 45, + "im": 155 + }, + { + "re": 46, + "im": 153 + }, + { + "re": 48, + "im": 150 + }, + { + "re": 48, + "im": 148 + }, + { + "re": 49, + "im": 147 + }, + { + "re": 50, + "im": 146 + }, + { + "re": 50, + "im": 145 + }, + { + "re": 51, + "im": 143 + }, + { + "re": 52, + "im": 141 + }, + { + "re": 53, + "im": 138 + }, + { + "re": 53, + "im": 137 + }, + { + "re": 54, + "im": 136 + }, + { + "re": 54, + "im": 134 + }, + { + "re": 55, + "im": 134 + }, + { + "re": 55, + "im": 133 + }, + { + "re": 56, + "im": 132 + }, + { + "re": 57, + "im": 130 + }, + { + "re": 57, + "im": 129 + }, + { + "re": 57, + "im": 128 + }, + { + "re": 58, + "im": 127 + }, + { + "re": 58, + "im": 125 + }, + { + "re": 59, + "im": 124 + }, + { + "re": 61, + "im": 121 + }, + { + "re": 62, + "im": 119 + }, + { + "re": 63, + "im": 116 + }, + { + "re": 64, + "im": 115 + }, + { + "re": 65, + "im": 114 + }, + { + "re": 66, + "im": 112 + }, + { + "re": 67, + "im": 112 + }, + { + "re": 67, + "im": 111 + }, + { + "re": 68, + "im": 109 + }, + { + "re": 69, + "im": 108 + }, + { + "re": 69, + "im": 108 + }, + { + "re": 69, + "im": 108 + }, + { + "re": 69, + "im": 108 + }, + { + "re": 69, + "im": 108 + }, + { + "re": 70, + "im": 106 + }, + { + "re": 70, + "im": 105 + }, + { + "re": 70, + "im": 104 + }, + { + "re": 70, + "im": 104 + }, + { + "re": 70, + "im": 104 + }, + { + "re": 71, + "im": 102 + }, + { + "re": 71, + "im": 100 + }, + { + "re": 71, + "im": 98 + }, + { + "re": 71, + "im": 96 + }, + { + "re": 71, + "im": 95 + }, + { + "re": 71, + "im": 95 + }, + { + "re": 71, + "im": 95 + }, + { + "re": 71, + "im": 95 + }, + { + "re": 71, + "im": 95 + }, + { + "re": 71, + "im": 95 + }, + { + "re": 71, + "im": 95 + }, + { + "re": 70, + "im": 95 + }, + { + "re": 68, + "im": 96 + }, + { + "re": 67, + "im": 97 + }, + { + "re": 66, + "im": 97 + }, + { + "re": 64, + "im": 98 + }, + { + "re": 63, + "im": 100 + }, + { + "re": 62, + "im": 100 + }, + { + "re": 60, + "im": 102 + }, + { + "re": 59, + "im": 103 + }, + { + "re": 58, + "im": 104 + }, + { + "re": 56, + "im": 105 + }, + { + "re": 55, + "im": 106 + }, + { + "re": 53, + "im": 108 + }, + { + "re": 51, + "im": 109 + }, + { + "re": 50, + "im": 110 + }, + { + "re": 49, + "im": 111 + }, + { + "re": 48, + "im": 111 + }, + { + "re": 47, + "im": 111 + }, + { + "re": 46, + "im": 112 + }, + { + "re": 44, + "im": 113 + }, + { + "re": 41, + "im": 115 + }, + { + "re": 38, + "im": 117 + }, + { + "re": 37, + "im": 118 + }, + { + "re": 36, + "im": 118 + }, + { + "re": 35, + "im": 118 + }, + { + "re": 34, + "im": 119 + }, + { + "re": 32, + "im": 119 + }, + { + "re": 29, + "im": 120 + }, + { + "re": 25, + "im": 120 + }, + { + "re": 22, + "im": 121 + }, + { + "re": 20, + "im": 122 + }, + { + "re": 17, + "im": 122 + }, + { + "re": 14, + "im": 122 + }, + { + "re": 11, + "im": 122 + }, + { + "re": 8, + "im": 122 + }, + { + "re": 4, + "im": 123 + }, + { + "re": 0, + "im": 123 + }, + { + "re": -5, + "im": 123 + }, + { + "re": -9, + "im": 123 + }, + { + "re": -12, + "im": 123 + }, + { + "re": -14, + "im": 123 + }, + { + "re": -15, + "im": 123 + }, + { + "re": -17, + "im": 123 + }, + { + "re": -19, + "im": 123 + }, + { + "re": -21, + "im": 123 + }, + { + "re": -24, + "im": 123 + }, + { + "re": -27, + "im": 123 + }, + { + "re": -28, + "im": 123 + }, + { + "re": -29, + "im": 123 + }, + { + "re": -30, + "im": 123 + }, + { + "re": -31, + "im": 123 + }, + { + "re": -32, + "im": 123 + }, + { + "re": -34, + "im": 123 + }, + { + "re": -37, + "im": 123 + }, + { + "re": -39, + "im": 123 + }, + { + "re": -40, + "im": 123 + }, + { + "re": -41, + "im": 123 + }, + { + "re": -43, + "im": 123 + }, + { + "re": -45, + "im": 123 + }, + { + "re": -46, + "im": 123 + }, + { + "re": -47, + "im": 123 + }, + { + "re": -48, + "im": 123 + }, + { + "re": -49, + "im": 123 + }, + { + "re": -50, + "im": 123 + }, + { + "re": -53, + "im": 123 + }, + { + "re": -54, + "im": 123 + }, + { + "re": -55, + "im": 123 + }, + { + "re": -56, + "im": 123 + }, + { + "re": -57, + "im": 123 + }, + { + "re": -59, + "im": 122 + }, + { + "re": -61, + "im": 122 + }, + { + "re": -61, + "im": 122 + }, + { + "re": -62, + "im": 121 + }, + { + "re": -63, + "im": 121 + }, + { + "re": -64, + "im": 121 + }, + { + "re": -65, + "im": 121 + }, + { + "re": -68, + "im": 120 + }, + { + "re": -69, + "im": 120 + }, + { + "re": -70, + "im": 120 + }, + { + "re": -70, + "im": 120 + }, + { + "re": -71, + "im": 120 + }, + { + "re": -71, + "im": 120 + }, + { + "re": -72, + "im": 120 + }, + { + "re": -73, + "im": 120 + }, + { + "re": -74, + "im": 120 + }, + { + "re": -75, + "im": 119 + }, + { + "re": -77, + "im": 119 + }, + { + "re": -77, + "im": 119 + }, + { + "re": -78, + "im": 118 + }, + { + "re": -78, + "im": 118 + }, + { + "re": -79, + "im": 118 + }, + { + "re": -81, + "im": 117 + }, + { + "re": -83, + "im": 116 + }, + { + "re": -86, + "im": 116 + }, + { + "re": -89, + "im": 116 + }, + { + "re": -91, + "im": 116 + }, + { + "re": -94, + "im": 116 + }, + { + "re": -96, + "im": 115 + }, + { + "re": -97, + "im": 115 + }, + { + "re": -99, + "im": 115 + }, + { + "re": -101, + "im": 115 + }, + { + "re": -103, + "im": 115 + }, + { + "re": -104, + "im": 115 + }, + { + "re": -105, + "im": 114 + }, + { + "re": -105, + "im": 114 + }, + { + "re": -105, + "im": 114 + }, + { + "re": -106, + "im": 113 + }, + { + "re": -107, + "im": 113 + }, + { + "re": -107, + "im": 113 + }, + { + "re": -109, + "im": 113 + }, + { + "re": -109, + "im": 113 + }, + { + "re": -110, + "im": 112 + }, + { + "re": -110, + "im": 112 + }, + { + "re": -110, + "im": 112 + }, + { + "re": -110, + "im": 112 + }, + { + "re": -110, + "im": 112 + }, + { + "re": -110, + "im": 112 + }, + { + "re": -110, + "im": 112 + }, + { + "re": -110, + "im": 112 + }, + { + "re": -110, + "im": 112 + }, + { + "re": -110, + "im": 112 + }, + { + "re": -110, + "im": 112 + }, + { + "re": -110, + "im": 112 + }, + { + "re": -110, + "im": 112 + }, + { + "re": -111, + "im": 110 + }, + { + "re": -111, + "im": 108 + }, + { + "re": -111, + "im": 107 + }, + { + "re": -111, + "im": 105 + }, + { + "re": -111, + "im": 104 + }, + { + "re": -111, + "im": 103 + }, + { + "re": -111, + "im": 101 + }, + { + "re": -111, + "im": 100 + }, + { + "re": -112, + "im": 99 + }, + { + "re": -112, + "im": 98 + }, + { + "re": -112, + "im": 96 + }, + { + "re": -112, + "im": 94 + }, + { + "re": -112, + "im": 92 + }, + { + "re": -112, + "im": 91 + }, + { + "re": -112, + "im": 90 + }, + { + "re": -112, + "im": 88 + }, + { + "re": -112, + "im": 87 + }, + { + "re": -112, + "im": 86 + }, + { + "re": -112, + "im": 85 + }, + { + "re": -113, + "im": 84 + }, + { + "re": -114, + "im": 82 + }, + { + "re": -114, + "im": 82 + }, + { + "re": -114, + "im": 80 + }, + { + "re": -115, + "im": 80 + }, + { + "re": -115, + "im": 79 + }, + { + "re": -116, + "im": 78 + }, + { + "re": -116, + "im": 77 + }, + { + "re": -117, + "im": 75 + }, + { + "re": -118, + "im": 74 + }, + { + "re": -118, + "im": 72 + }, + { + "re": -119, + "im": 71 + }, + { + "re": -119, + "im": 70 + }, + { + "re": -120, + "im": 68 + }, + { + "re": -120, + "im": 68 + }, + { + "re": -121, + "im": 66 + }, + { + "re": -122, + "im": 65 + }, + { + "re": -123, + "im": 63 + }, + { + "re": -124, + "im": 62 + }, + { + "re": -124, + "im": 61 + }, + { + "re": -124, + "im": 61 + }, + { + "re": -124, + "im": 59 + }, + { + "re": -125, + "im": 58 + }, + { + "re": -126, + "im": 56 + }, + { + "re": -126, + "im": 54 + }, + { + "re": -127, + "im": 53 + }, + { + "re": -127, + "im": 52 + }, + { + "re": -127, + "im": 51 + }, + { + "re": -128, + "im": 50 + }, + { + "re": -128, + "im": 49 + }, + { + "re": -129, + "im": 47 + }, + { + "re": -130, + "im": 46 + }, + { + "re": -130, + "im": 44 + }, + { + "re": -131, + "im": 43 + }, + { + "re": -131, + "im": 41 + }, + { + "re": -132, + "im": 40 + }, + { + "re": -132, + "im": 39 + }, + { + "re": -132, + "im": 38 + }, + { + "re": -133, + "im": 37 + }, + { + "re": -134, + "im": 35 + }, + { + "re": -134, + "im": 33 + }, + { + "re": -134, + "im": 32 + }, + { + "re": -134, + "im": 31 + }, + { + "re": -135, + "im": 31 + }, + { + "re": -135, + "im": 31 + }, + { + "re": -135, + "im": 30 + }, + { + "re": -135, + "im": 30 + }, + { + "re": -135, + "im": 29 + }, + { + "re": -135, + "im": 28 + }, + { + "re": -136, + "im": 28 + }, + { + "re": -136, + "im": 28 + }, + { + "re": -136, + "im": 28 + }, + { + "re": -136, + "im": 26 + }, + { + "re": -137, + "im": 26 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -137, + "im": 25 + }, + { + "re": -138, + "im": 25 + }, + { + "re": -139, + "im": 25 + }, + { + "re": -140, + "im": 25 + }, + { + "re": -140, + "im": 25 + }, + { + "re": -141, + "im": 25 + }, + { + "re": -142, + "im": 25 + }, + { + "re": -142, + "im": 25 + }, + { + "re": -142, + "im": 25 + }, + { + "re": -142, + "im": 25 + }, + { + "re": -143, + "im": 25 + }, + { + "re": -143, + "im": 25 + }, + { + "re": -144, + "im": 25 + }, + { + "re": -145, + "im": 25 + }, + { + "re": -146, + "im": 25 + }, + { + "re": -146, + "im": 25 + }, + { + "re": -146, + "im": 25 + }, + { + "re": -147, + "im": 25 + }, + { + "re": -148, + "im": 25 + }, + { + "re": -150, + "im": 25 + }, + { + "re": -151, + "im": 25 + }, + { + "re": -152, + "im": 25 + }, + { + "re": -152, + "im": 25 + }, + { + "re": -152, + "im": 25 + }, + { + "re": -152, + "im": 25 + }, + { + "re": -152, + "im": 25 + }, + { + "re": -152, + "im": 25 + }, + { + "re": -152, + "im": 25 + }, + { + "re": -153, + "im": 25 + }, + { + "re": -153, + "im": 25 + }, + { + "re": -153, + "im": 25 + }, + { + "re": -153, + "im": 25 + }, + { + "re": -153, + "im": 25 + }, + { + "re": -153, + "im": 25 + }, + { + "re": -153, + "im": 25 + }, + { + "re": -153, + "im": 25 + }, + { + "re": -154, + "im": 25 + }, + { + "re": -155, + "im": 24 + }, + { + "re": -155, + "im": 24 + }, + { + "re": -155, + "im": 23 + }, + { + "re": -155, + "im": 23 + }, + { + "re": -155, + "im": 23 + }, + { + "re": -155, + "im": 23 + }, + { + "re": -155, + "im": 23 + }, + { + "re": -155, + "im": 22 + }, + { + "re": -156, + "im": 21 + }, + { + "re": -156, + "im": 20 + }, + { + "re": -157, + "im": 20 + }, + { + "re": -157, + "im": 19 + }, + { + "re": -157, + "im": 19 + }, + { + "re": -157, + "im": 19 + }, + { + "re": -157, + "im": 18 + }, + { + "re": -158, + "im": 16 + }, + { + "re": -159, + "im": 14 + }, + { + "re": -159, + "im": 13 + }, + { + "re": -159, + "im": 13 + }, + { + "re": -159, + "im": 13 + }, + { + "re": -159, + "im": 13 + }, + { + "re": -159, + "im": 13 + }, + { + "re": -159, + "im": 12 + }, + { + "re": -159, + "im": 12 + }, + { + "re": -159, + "im": 12 + }, + { + "re": -159, + "im": 12 + }, + { + "re": -159, + "im": 12 + }, + { + "re": -159, + "im": 10 + }, + { + "re": -159, + "im": 10 + }, + { + "re": -159, + "im": 9 + }, + { + "re": -159, + "im": 8 + }, + { + "re": -159, + "im": 7 + }, + { + "re": -159, + "im": 6 + }, + { + "re": -159, + "im": 6 + }, + { + "re": -159, + "im": 5 + }, + { + "re": -159, + "im": 5 + }, + { + "re": -160, + "im": 4 + }, + { + "re": -160, + "im": 2 + }, + { + "re": -160, + "im": 1 + }, + { + "re": -160, + "im": 0 + }, + { + "re": -160, + "im": 0 + }, + { + "re": -160, + "im": 0 + }, + { + "re": -160, + "im": 0 + }, + { + "re": -160, + "im": 0 + }, + { + "re": -160, + "im": 0 + }, + { + "re": -160, + "im": 0 + }, + { + "re": -160, + "im": -1 + }, + { + "re": -160, + "im": -1 + }, + { + "re": -160, + "im": -1 + }, + { + "re": -160, + "im": -1 + }, + { + "re": -160, + "im": -1 + }, + { + "re": -160, + "im": -1 + }, + { + "re": -160, + "im": -1 + }, + { + "re": -160, + "im": -1 + }, + { + "re": -159, + "im": -1 + }, + { + "re": -158, + "im": -1 + }, + { + "re": -156, + "im": -1 + }, + { + "re": -154, + "im": -1 + }, + { + "re": -153, + "im": -1 + }, + { + "re": -153, + "im": -1 + }, + { + "re": -153, + "im": -1 + }, + { + "re": -153, + "im": -1 + }, + { + "re": -152, + "im": -1 + }, + { + "re": -151, + "im": -1 + }, + { + "re": -149, + "im": -1 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": 0 + }, + { + "re": -148, + "im": -1 + }, + { + "re": -148, + "im": -2 + }, + { + "re": -148, + "im": -3 + }, + { + "re": -148, + "im": -4 + }, + { + "re": -148, + "im": -5 + }, + { + "re": -148, + "im": -5 + }, + { + "re": -148, + "im": -5 + }, + { + "re": -148, + "im": -5 + }, + { + "re": -148, + "im": -6 + }, + { + "re": -148, + "im": -7 + }, + { + "re": -148, + "im": -8 + }, + { + "re": -148, + "im": -9 + }, + { + "re": -148, + "im": -9 + }, + { + "re": -148, + "im": -11 + }, + { + "re": -148, + "im": -12 + }, + { + "re": -148, + "im": -13 + }, + { + "re": -148, + "im": -14 + }, + { + "re": -148, + "im": -15 + }, + { + "re": -148, + "im": -16 + }, + { + "re": -148, + "im": -17 + }, + { + "re": -148, + "im": -19 + }, + { + "re": -148, + "im": -20 + }, + { + "re": -147, + "im": -23 + }, + { + "re": -147, + "im": -25 + }, + { + "re": -147, + "im": -27 + }, + { + "re": -147, + "im": -29 + }, + { + "re": -147, + "im": -31 + }, + { + "re": -147, + "im": -32 + }, + { + "re": -147, + "im": -33 + }, + { + "re": -147, + "im": -34 + }, + { + "re": -147, + "im": -34 + }, + { + "re": -147, + "im": -35 + }, + { + "re": -147, + "im": -36 + }, + { + "re": -147, + "im": -38 + }, + { + "re": -147, + "im": -39 + }, + { + "re": -147, + "im": -40 + }, + { + "re": -147, + "im": -41 + }, + { + "re": -146, + "im": -42 + }, + { + "re": -146, + "im": -44 + }, + { + "re": -146, + "im": -46 + }, + { + "re": -146, + "im": -47 + }, + { + "re": -146, + "im": -48 + }, + { + "re": -146, + "im": -49 + }, + { + "re": -145, + "im": -50 + }, + { + "re": -145, + "im": -50 + }, + { + "re": -145, + "im": -51 + }, + { + "re": -145, + "im": -53 + }, + { + "re": -145, + "im": -53 + }, + { + "re": -145, + "im": -55 + }, + { + "re": -145, + "im": -56 + }, + { + "re": -145, + "im": -57 + }, + { + "re": -145, + "im": -57 + }, + { + "re": -145, + "im": -58 + }, + { + "re": -145, + "im": -60 + }, + { + "re": -144, + "im": -62 + }, + { + "re": -144, + "im": -64 + }, + { + "re": -144, + "im": -66 + }, + { + "re": -144, + "im": -68 + }, + { + "re": -144, + "im": -69 + }, + { + "re": -144, + "im": -70 + }, + { + "re": -144, + "im": -71 + }, + { + "re": -143, + "im": -73 + }, + { + "re": -143, + "im": -76 + }, + { + "re": -143, + "im": -79 + }, + { + "re": -143, + "im": -81 + }, + { + "re": -143, + "im": -82 + }, + { + "re": -143, + "im": -83 + }, + { + "re": -142, + "im": -85 + }, + { + "re": -142, + "im": -86 + }, + { + "re": -142, + "im": -87 + }, + { + "re": -142, + "im": -89 + }, + { + "re": -142, + "im": -90 + }, + { + "re": -142, + "im": -90 + }, + { + "re": -141, + "im": -91 + }, + { + "re": -141, + "im": -92 + }, + { + "re": -141, + "im": -92 + }, + { + "re": -141, + "im": -94 + }, + { + "re": -141, + "im": -96 + }, + { + "re": -141, + "im": -97 + }, + { + "re": -141, + "im": -99 + }, + { + "re": -141, + "im": -100 + }, + { + "re": -140, + "im": -101 + }, + { + "re": -140, + "im": -102 + }, + { + "re": -140, + "im": -103 + }, + { + "re": -140, + "im": -104 + }, + { + "re": -140, + "im": -106 + }, + { + "re": -140, + "im": -107 + }, + { + "re": -140, + "im": -108 + }, + { + "re": -140, + "im": -110 + }, + { + "re": -140, + "im": -111 + }, + { + "re": -140, + "im": -113 + }, + { + "re": -140, + "im": -115 + }, + { + "re": -140, + "im": -118 + }, + { + "re": -140, + "im": -120 + }, + { + "re": -140, + "im": -122 + }, + { + "re": -140, + "im": -123 + }, + { + "re": -140, + "im": -124 + }, + { + "re": -140, + "im": -126 + }, + { + "re": -139, + "im": -128 + }, + { + "re": -139, + "im": -130 + }, + { + "re": -139, + "im": -132 + }, + { + "re": -139, + "im": -133 + }, + { + "re": -139, + "im": -134 + }, + { + "re": -139, + "im": -135 + }, + { + "re": -139, + "im": -136 + }, + { + "re": -138, + "im": -137 + }, + { + "re": -138, + "im": -139 + }, + { + "re": -138, + "im": -140 + }, + { + "re": -137, + "im": -142 + }, + { + "re": -137, + "im": -143 + }, + { + "re": -137, + "im": -144 + }, + { + "re": -137, + "im": -145 + }, + { + "re": -137, + "im": -145 + }, + { + "re": -136, + "im": -146 + }, + { + "re": -136, + "im": -147 + }, + { + "re": -136, + "im": -148 + }, + { + "re": -136, + "im": -148 + }, + { + "re": -136, + "im": -149 + }, + { + "re": -136, + "im": -149 + }, + { + "re": -136, + "im": -149 + }, + { + "re": -135, + "im": -150 + }, + { + "re": -135, + "im": -151 + }, + { + "re": -135, + "im": -152 + }, + { + "re": -135, + "im": -152 + }, + { + "re": -135, + "im": -152 + }, + { + "re": -135, + "im": -152 + }, + { + "re": -135, + "im": -152 + }, + { + "re": -135, + "im": -152 + }, + { + "re": -135, + "im": -152 + }, + { + "re": -135, + "im": -154 + }, + { + "re": -135, + "im": -155 + }, + { + "re": -134, + "im": -156 + }, + { + "re": -134, + "im": -157 + }, + { + "re": -134, + "im": -157 + }, + { + "re": -133, + "im": -158 + }, + { + "re": -133, + "im": -158 + }, + { + "re": -133, + "im": -160 + }, + { + "re": -132, + "im": -161 + }, + { + "re": -132, + "im": -161 + }, + { + "re": -132, + "im": -162 + }, + { + "re": -132, + "im": -162 + }, + { + "re": -132, + "im": -163 + }, + { + "re": -131, + "im": -164 + }, + { + "re": -131, + "im": -165 + }, + { + "re": -130, + "im": -166 + }, + { + "re": -129, + "im": -167 + }, + { + "re": -129, + "im": -168 + }, + { + "re": -129, + "im": -168 + }, + { + "re": -128, + "im": -168 + }, + { + "re": -128, + "im": -168 + }, + { + "re": -126, + "im": -170 + }, + { + "re": -125, + "im": -170 + }, + { + "re": -124, + "im": -171 + }, + { + "re": -123, + "im": -172 + }, + { + "re": -123, + "im": -172 + }, + { + "re": -122, + "im": -173 + }, + { + "re": -121, + "im": -173 + }, + { + "re": -120, + "im": -173 + }, + { + "re": -120, + "im": -174 + }, + { + "re": -119, + "im": -174 + }, + { + "re": -117, + "im": -174 + }, + { + "re": -117, + "im": -174 + }, + { + "re": -116, + "im": -174 + }, + { + "re": -116, + "im": -174 + }, + { + "re": -115, + "im": -175 + }, + { + "re": -113, + "im": -175 + }, + { + "re": -112, + "im": -175 + }, + { + "re": -111, + "im": -176 + }, + { + "re": -110, + "im": -176 + }, + { + "re": -110, + "im": -176 + }, + { + "re": -110, + "im": -176 + }, + { + "re": -110, + "im": -176 + }, + { + "re": -109, + "im": -176 + }, + { + "re": -107, + "im": -176 + }, + { + "re": -106, + "im": -176 + }, + { + "re": -105, + "im": -176 + }, + { + "re": -104, + "im": -176 + }, + { + "re": -104, + "im": -176 + }, + { + "re": -104, + "im": -176 + }, + { + "re": -103, + "im": -176 + }, + { + "re": -102, + "im": -176 + }, + { + "re": -100, + "im": -176 + }, + { + "re": -99, + "im": -176 + }, + { + "re": -98, + "im": -176 + }, + { + "re": -96, + "im": -176 + }, + { + "re": -95, + "im": -176 + }, + { + "re": -94, + "im": -176 + }, + { + "re": -93, + "im": -176 + }, + { + "re": -92, + "im": -175 + }, + { + "re": -91, + "im": -175 + }, + { + "re": -90, + "im": -175 + }, + { + "re": -90, + "im": -175 + }, + { + "re": -90, + "im": -175 + }, + { + "re": -88, + "im": -175 + }, + { + "re": -85, + "im": -174 + }, + { + "re": -82, + "im": -173 + }, + { + "re": -79, + "im": -172 + }, + { + "re": -78, + "im": -172 + }, + { + "re": -77, + "im": -172 + }, + { + "re": -77, + "im": -172 + }, + { + "re": -77, + "im": -172 + }, + { + "re": -75, + "im": -171 + }, + { + "re": -72, + "im": -170 + }, + { + "re": -68, + "im": -168 + }, + { + "re": -67, + "im": -167 + }, + { + "re": -66, + "im": -167 + }, + { + "re": -66, + "im": -167 + }, + { + "re": -66, + "im": -167 + }, + { + "re": -65, + "im": -167 + }, + { + "re": -63, + "im": -166 + }, + { + "re": -61, + "im": -165 + }, + { + "re": -59, + "im": -163 + }, + { + "re": -58, + "im": -163 + }, + { + "re": -57, + "im": -163 + }, + { + "re": -57, + "im": -162 + }, + { + "re": -55, + "im": -162 + }, + { + "re": -55, + "im": -161 + }, + { + "re": -54, + "im": -161 + }, + { + "re": -53, + "im": -161 + }, + { + "re": -52, + "im": -161 + }, + { + "re": -51, + "im": -160 + }, + { + "re": -50, + "im": -160 + }, + { + "re": -50, + "im": -159 + }, + { + "re": -49, + "im": -159 + }, + { + "re": -48, + "im": -159 + }, + { + "re": -46, + "im": -159 + }, + { + "re": -46, + "im": -158 + }, + { + "re": -45, + "im": -158 + }, + { + "re": -44, + "im": -157 + }, + { + "re": -42, + "im": -157 + }, + { + "re": -40, + "im": -157 + }, + { + "re": -38, + "im": -156 + }, + { + "re": -36, + "im": -156 + }, + { + "re": -33, + "im": -154 + }, + { + "re": -32, + "im": -154 + }, + { + "re": -28, + "im": -153 + }, + { + "re": -25, + "im": -153 + }, + { + "re": -23, + "im": -152 + }, + { + "re": -20, + "im": -151 + }, + { + "re": -17, + "im": -150 + }, + { + "re": -16, + "im": -150 + }, + { + "re": -14, + "im": -150 + }, + { + "re": -12, + "im": -150 + }, + { + "re": -10, + "im": -149 + }, + { + "re": -8, + "im": -149 + }, + { + "re": -6, + "im": -149 + }, + { + "re": -5, + "im": -148 + }, + { + "re": -4, + "im": -148 + }, + { + "re": -3, + "im": -147 + }, + { + "re": -1, + "im": -146 + }, + { + "re": 2, + "im": -145 + }, + { + "re": 4, + "im": -145 + }, + { + "re": 5, + "im": -144 + }, + { + "re": 6, + "im": -144 + }, + { + "re": 7, + "im": -144 + }, + { + "re": 8, + "im": -144 + }, + { + "re": 11, + "im": -142 + }, + { + "re": 12, + "im": -141 + }, + { + "re": 14, + "im": -141 + }, + { + "re": 15, + "im": -140 + }, + { + "re": 15, + "im": -140 + }, + { + "re": 16, + "im": -140 + }, + { + "re": 16, + "im": -139 + }, + { + "re": 18, + "im": -137 + }, + { + "re": 20, + "im": -136 + }, + { + "re": 22, + "im": -134 + }, + { + "re": 23, + "im": -133 + }, + { + "re": 24, + "im": -132 + }, + { + "re": 24, + "im": -131 + }, + { + "re": 25, + "im": -131 + }, + { + "re": 26, + "im": -130 + }, + { + "re": 27, + "im": -129 + }, + { + "re": 28, + "im": -127 + }, + { + "re": 30, + "im": -125 + }, + { + "re": 31, + "im": -125 + }, + { + "re": 32, + "im": -124 + }, + { + "re": 32, + "im": -123 + }, + { + "re": 33, + "im": -123 + }, + { + "re": 34, + "im": -121 + }, + { + "re": 34, + "im": -120 + }, + { + "re": 36, + "im": -119 + }, + { + "re": 37, + "im": -119 + }, + { + "re": 38, + "im": -117 + }, + { + "re": 38, + "im": -117 + }, + { + "re": 38, + "im": -117 + }, + { + "re": 38, + "im": -117 + }, + { + "re": 40, + "im": -116 + }, + { + "re": 41, + "im": -115 + }, + { + "re": 43, + "im": -114 + }, + { + "re": 44, + "im": -113 + }, + { + "re": 45, + "im": -113 + }, + { + "re": 45, + "im": -113 + }, + { + "re": 45, + "im": -113 + }, + { + "re": 45, + "im": -113 + }, + { + "re": 45, + "im": -112 + }, + { + "re": 46, + "im": -112 + }, + { + "re": 48, + "im": -111 + }, + { + "re": 50, + "im": -111 + }, + { + "re": 51, + "im": -111 + }, + { + "re": 51, + "im": -111 + }, + { + "re": 52, + "im": -111 + }, + { + "re": 52, + "im": -110 + }, + { + "re": 52, + "im": -110 + }, + { + "re": 53, + "im": -109 + }, + { + "re": 54, + "im": -109 + }, + { + "re": 55, + "im": -108 + }, + { + "re": 56, + "im": -107 + }, + { + "re": 57, + "im": -105 + }, + { + "re": 58, + "im": -103 + }, + { + "re": 59, + "im": -101 + }, + { + "re": 59, + "im": -100 + }, + { + "re": 61, + "im": -99 + }, + { + "re": 61, + "im": -97 + }, + { + "re": 63, + "im": -95 + }, + { + "re": 65, + "im": -93 + }, + { + "re": 66, + "im": -91 + }, + { + "re": 66, + "im": -91 + }, + { + "re": 67, + "im": -90 + }, + { + "re": 67, + "im": -90 + }, + { + "re": 67, + "im": -89 + }, + { + "re": 68, + "im": -88 + }, + { + "re": 70, + "im": -86 + }, + { + "re": 70, + "im": -85 + }, + { + "re": 71, + "im": -85 + }, + { + "re": 71, + "im": -84 + }, + { + "re": 71, + "im": -84 + }, + { + "re": 71, + "im": -84 + }, + { + "re": 71, + "im": -83 + }, + { + "re": 72, + "im": -82 + }, + { + "re": 73, + "im": -81 + }, + { + "re": 74, + "im": -80 + }, + { + "re": 75, + "im": -78 + }, + { + "re": 75, + "im": -77 + }, + { + "re": 76, + "im": -76 + }, + { + "re": 77, + "im": -74 + }, + { + "re": 77, + "im": -72 + }, + { + "re": 78, + "im": -70 + }, + { + "re": 79, + "im": -68 + }, + { + "re": 80, + "im": -66 + }, + { + "re": 81, + "im": -65 + }, + { + "re": 82, + "im": -64 + }, + { + "re": 82, + "im": -63 + }, + { + "re": 82, + "im": -62 + }, + { + "re": 83, + "im": -61 + }, + { + "re": 85, + "im": -58 + }, + { + "re": 87, + "im": -56 + }, + { + "re": 89, + "im": -54 + }, + { + "re": 89, + "im": -54 + }, + { + "re": 90, + "im": -54 + }, + { + "re": 90, + "im": -54 + }, + { + "re": 90, + "im": -53 + }, + { + "re": 90, + "im": -53 + }, + { + "re": 91, + "im": -52 + }, + { + "re": 92, + "im": -51 + }, + { + "re": 92, + "im": -50 + }, + { + "re": 93, + "im": -49 + }, + { + "re": 94, + "im": -48 + }, + { + "re": 94, + "im": -47 + }, + { + "re": 94, + "im": -46 + }, + { + "re": 94, + "im": -44 + }, + { + "re": 94, + "im": -42 + }, + { + "re": 94, + "im": -39 + }, + { + "re": 95, + "im": -35 + }, + { + "re": 95, + "im": -31 + }, + { + "re": 95, + "im": -29 + }, + { + "re": 95, + "im": -25 + }, + { + "re": 95, + "im": -22 + }, + { + "re": 95, + "im": -21 + }, + { + "re": 95, + "im": -20 + }, + { + "re": 95, + "im": -18 + }, + { + "re": 95, + "im": -17 + }, + { + "re": 95, + "im": -16 + }, + { + "re": 95, + "im": -14 + }, + { + "re": 95, + "im": -13 + }, + { + "re": 95, + "im": -12 + }, + { + "re": 95, + "im": -10 + }, + { + "re": 95, + "im": -9 + }, + { + "re": 95, + "im": -7 + }, + { + "re": 95, + "im": -5 + }, + { + "re": 95, + "im": -4 + }, + { + "re": 95, + "im": -2 + }, + { + "re": 95, + "im": -1 + }, + { + "re": 95, + "im": -1 + }, + { + "re": 95, + "im": 0 + }, + { + "re": 95, + "im": 0 + }, + { + "re": 95, + "im": 2 + }, + { + "re": 95, + "im": 2 + }, + { + "re": 95, + "im": 3 + }, + { + "re": 95, + "im": 4 + }, + { + "re": 95, + "im": 4 + }, + { + "re": 95, + "im": 5 + }, + { + "re": 95, + "im": 6 + }, + { + "re": 95, + "im": 7 + }, + { + "re": 95, + "im": 8 + }, + { + "re": 95, + "im": 9 + }, + { + "re": 95, + "im": 9 + }, + { + "re": 95, + "im": 11 + }, + { + "re": 95, + "im": 11 + }, + { + "re": 95, + "im": 12 + }, + { + "re": 95, + "im": 13 + }, + { + "re": 95, + "im": 13 + }, + { + "re": 95, + "im": 14 + }, + { + "re": 95, + "im": 15 + }, + { + "re": 95, + "im": 16 + }, + { + "re": 95, + "im": 17 + }, + { + "re": 95, + "im": 19 + }, + { + "re": 95, + "im": 20 + }, + { + "re": 95, + "im": 23 + }, + { + "re": 95, + "im": 24 + }, + { + "re": 95, + "im": 26 + }, + { + "re": 95, + "im": 28 + }, + { + "re": 95, + "im": 29 + }, + { + "re": 95, + "im": 31 + }, + { + "re": 95, + "im": 31 + }, + { + "re": 95, + "im": 31 + }, + { + "re": 95, + "im": 31 + }, + { + "re": 95, + "im": 31 + }, + { + "re": 95, + "im": 31 + }, + { + "re": 95, + "im": 31 + }, + { + "re": 95, + "im": 32 + }, + { + "re": 95, + "im": 33 + }, + { + "re": 96, + "im": 34 + }, + { + "re": 96, + "im": 36 + }, + { + "re": 96, + "im": 36 + }, + { + "re": 97, + "im": 37 + }, + { + "re": 97, + "im": 37 + }, + { + "re": 97, + "im": 38 + }, + { + "re": 98, + "im": 38 + }, + { + "re": 98, + "im": 38 + }, + { + "re": 99, + "im": 38 + }, + { + "re": 100, + "im": 39 + }, + { + "re": 102, + "im": 40 + }, + { + "re": 103, + "im": 40 + }, + { + "re": 103, + "im": 41 + }, + { + "re": 104, + "im": 41 + }, + { + "re": 105, + "im": 41 + }, + { + "re": 106, + "im": 41 + }, + { + "re": 107, + "im": 41 + }, + { + "re": 108, + "im": 41 + }, + { + "re": 110, + "im": 41 + }, + { + "re": 112, + "im": 41 + }, + { + "re": 113, + "im": 41 + }, + { + "re": 115, + "im": 42 + }, + { + "re": 117, + "im": 42 + }, + { + "re": 119, + "im": 42 + }, + { + "re": 121, + "im": 42 + }, + { + "re": 123, + "im": 42 + }, + { + "re": 124, + "im": 42 + }, + { + "re": 124, + "im": 42 + }, + { + "re": 125, + "im": 42 + }, + { + "re": 126, + "im": 42 + }, + { + "re": 127, + "im": 42 + }, + { + "re": 129, + "im": 42 + }, + { + "re": 130, + "im": 42 + }, + { + "re": 131, + "im": 42 + }, + { + "re": 131, + "im": 41 + }, + { + "re": 132, + "im": 41 + }, + { + "re": 133, + "im": 41 + }, + { + "re": 134, + "im": 40 + }, + { + "re": 136, + "im": 39 + }, + { + "re": 137, + "im": 39 + }, + { + "re": 138, + "im": 38 + }, + { + "re": 138, + "im": 38 + }, + { + "re": 139, + "im": 37 + }, + { + "re": 139, + "im": 36 + }, + { + "re": 139, + "im": 35 + }, + { + "re": 140, + "im": 34 + }, + { + "re": 140, + "im": 33 + }, + { + "re": 140, + "im": 33 + }, + { + "re": 140, + "im": 32 + }, + { + "re": 140, + "im": 32 + }, + { + "re": 140, + "im": 30 + }, + { + "re": 140, + "im": 28 + }, + { + "re": 140, + "im": 27 + }, + { + "re": 140, + "im": 26 + }, + { + "re": 140, + "im": 25 + }, + { + "re": 140, + "im": 25 + }, + { + "re": 140, + "im": 24 + }, + { + "re": 140, + "im": 23 + }, + { + "re": 140, + "im": 21 + }, + { + "re": 140, + "im": 20 + }, + { + "re": 140, + "im": 17 + }, + { + "re": 140, + "im": 14 + }, + { + "re": 140, + "im": 13 + }, + { + "re": 140, + "im": 12 + }, + { + "re": 140, + "im": 11 + }, + { + "re": 140, + "im": 10 + }, + { + "re": 140, + "im": 8 + }, + { + "re": 140, + "im": 7 + }, + { + "re": 140, + "im": 6 + }, + { + "re": 140, + "im": 4 + }, + { + "re": 140, + "im": 3 + }, + { + "re": 140, + "im": 2 + }, + { + "re": 140, + "im": 1 + }, + { + "re": 140, + "im": 0 + }, + { + "re": 140, + "im": -1 + }, + { + "re": 140, + "im": -3 + }, + { + "re": 140, + "im": -5 + }, + { + "re": 140, + "im": -7 + }, + { + "re": 141, + "im": -8 + }, + { + "re": 141, + "im": -9 + }, + { + "re": 141, + "im": -10 + }, + { + "re": 141, + "im": -12 + }, + { + "re": 141, + "im": -13 + }, + { + "re": 141, + "im": -15 + }, + { + "re": 141, + "im": -16 + }, + { + "re": 141, + "im": -16 + }, + { + "re": 141, + "im": -17 + }, + { + "re": 140, + "im": -17 + }, + { + "re": 140, + "im": -17 + }, + { + "re": 139, + "im": -19 + }, + { + "re": 138, + "im": -19 + }, + { + "re": 138, + "im": -20 + }, + { + "re": 137, + "im": -21 + }, + { + "re": 136, + "im": -21 + }, + { + "re": 136, + "im": -23 + }, + { + "re": 135, + "im": -24 + }, + { + "re": 134, + "im": -25 + }, + { + "re": 132, + "im": -27 + }, + { + "re": 132, + "im": -28 + }, + { + "re": 132, + "im": -28 + }, + { + "re": 132, + "im": -28 + }, + { + "re": 131, + "im": -28 + }, + { + "re": 130, + "im": -29 + }, + { + "re": 130, + "im": -29 + }, + { + "re": 130, + "im": -29 + }, + { + "re": 130, + "im": -29 + }, + { + "re": 129, + "im": -29 + }, + { + "re": 128, + "im": -29 + }, + { + "re": 128, + "im": -30 + }, + { + "re": 128, + "im": -30 + }, + { + "re": 128, + "im": -30 + }, + { + "re": 127, + "im": -30 + }, + { + "re": 126, + "im": -31 + }, + { + "re": 125, + "im": -32 + }, + { + "re": 123, + "im": -33 + }, + { + "re": 122, + "im": -34 + }, + { + "re": 122, + "im": -34 + }, + { + "re": 122, + "im": -34 + }, + { + "re": 122, + "im": -34 + }, + { + "re": 121, + "im": -35 + }, + { + "re": 121, + "im": -35 + }, + { + "re": 120, + "im": -36 + }, + { + "re": 118, + "im": -36 + }, + { + "re": 117, + "im": -37 + }, + { + "re": 117, + "im": -38 + }, + { + "re": 117, + "im": -38 + }, + { + "re": 117, + "im": -38 + }, + { + "re": 117, + "im": -38 + }, + { + "re": 117, + "im": -38 + }, + { + "re": 116, + "im": -38 + }, + { + "re": 114, + "im": -38 + }, + { + "re": 113, + "im": -38 + }, + { + "re": 113, + "im": -38 + }, + { + "re": 112, + "im": -38 + }, + { + "re": 111, + "im": -38 + }, + { + "re": 109, + "im": -38 + }, + { + "re": 108, + "im": -38 + }, + { + "re": 105, + "im": -37 + }, + { + "re": 104, + "im": -36 + }, + { + "re": 103, + "im": -35 + }, + { + "re": 103, + "im": -35 + }, + { + "re": 103, + "im": -35 + }, + { + "re": 102, + "im": -34 + }, + { + "re": 101, + "im": -33 + }, + { + "re": 100, + "im": -31 + }, + { + "re": 100, + "im": -30 + }, + { + "re": 99, + "im": -29 + }, + { + "re": 99, + "im": -26 + }, + { + "re": 98, + "im": -24 + }, + { + "re": 97, + "im": -22 + }, + { + "re": 96, + "im": -19 + }, + { + "re": 96, + "im": -16 + }, + { + "re": 96, + "im": -14 + }, + { + "re": 96, + "im": -11 + }, + { + "re": 96, + "im": -9 + }, + { + "re": 96, + "im": -7 + }, + { + "re": 96, + "im": -6 + }, + { + "re": 96, + "im": -4 + }, + { + "re": 96, + "im": -2 + }, + { + "re": 96, + "im": 1 + }, + { + "re": 96, + "im": 4 + }, + { + "re": 95, + "im": 7 + }, + { + "re": 95, + "im": 10 + }, + { + "re": 94, + "im": 12 + }, + { + "re": 94, + "im": 13 + }, + { + "re": 94, + "im": 14 + }, + { + "re": 94, + "im": 15 + }, + { + "re": 94, + "im": 17 + }, + { + "re": 93, + "im": 19 + }, + { + "re": 93, + "im": 20 + }, + { + "re": 93, + "im": 21 + }, + { + "re": 93, + "im": 22 + }, + { + "re": 92, + "im": 24 + }, + { + "re": 92, + "im": 25 + }, + { + "re": 92, + "im": 26 + }, + { + "re": 92, + "im": 28 + }, + { + "re": 92, + "im": 29 + }, + { + "re": 92, + "im": 32 + }, + { + "re": 91, + "im": 36 + }, + { + "re": 91, + "im": 38 + }, + { + "re": 89, + "im": 40 + }, + { + "re": 89, + "im": 43 + }, + { + "re": 88, + "im": 45 + }, + { + "re": 87, + "im": 48 + }, + { + "re": 87, + "im": 50 + }, + { + "re": 87, + "im": 52 + }, + { + "re": 87, + "im": 54 + }, + { + "re": 86, + "im": 55 + }, + { + "re": 85, + "im": 57 + }, + { + "re": 83, + "im": 60 + }, + { + "re": 83, + "im": 62 + }, + { + "re": 83, + "im": 64 + }, + { + "re": 83, + "im": 65 + }, + { + "re": 82, + "im": 65 + }, + { + "re": 82, + "im": 66 + }, + { + "re": 82, + "im": 67 + }, + { + "re": 81, + "im": 68 + }, + { + "re": 81, + "im": 69 + }, + { + "re": 80, + "im": 71 + }, + { + "re": 80, + "im": 73 + }, + { + "re": 79, + "im": 74 + }, + { + "re": 79, + "im": 75 + }, + { + "re": 79, + "im": 75 + }, + { + "re": 79, + "im": 76 + }, + { + "re": 79, + "im": 76 + }, + { + "re": 79, + "im": 76 + }, + { + "re": 78, + "im": 77 + }, + { + "re": 78, + "im": 78 + }, + { + "re": 78, + "im": 78 + }, + { + "re": 78, + "im": 79 + }, + { + "re": 78, + "im": 79 + }, + { + "re": 77, + "im": 79 + }, + { + "re": 77, + "im": 80 + }, + { + "re": 77, + "im": 80 + }, + { + "re": 76, + "im": 81 + }, + { + "re": 76, + "im": 81 + }, + { + "re": 76, + "im": 82 + }, + { + "re": 76, + "im": 83 + }, + { + "re": 75, + "im": 83 + }, + { + "re": 75, + "im": 83 + }, + { + "re": 75, + "im": 85 + }, + { + "re": 74, + "im": 85 + }, + { + "re": 74, + "im": 86 + }, + { + "re": 73, + "im": 87 + }, + { + "re": 73, + "im": 87 + }, + { + "re": 73, + "im": 89 + }, + { + "re": 72, + "im": 89 + }, + { + "re": 72, + "im": 89 + }, + { + "re": 72, + "im": 89 + }, + { + "re": 72, + "im": 90 + }, + { + "re": 72, + "im": 90 + }, + { + "re": 72, + "im": 90 + }, + { + "re": 72, + "im": 91 + }, + { + "re": 72, + "im": 91 + }, + { + "re": 72, + "im": 91 + }, + { + "re": 71, + "im": 92 + }, + { + "re": 71, + "im": 92 + }, + { + "re": 71, + "im": 93 + }, + { + "re": 71, + "im": 93 + }, + { + "re": 71, + "im": 93 + }, + { + "re": 71, + "im": 94 + }, + { + "re": 70, + "im": 95 + }, + { + "re": 70, + "im": 95 + }, + { + "re": 70, + "im": 95 + }, + { + "re": 70, + "im": 96 + }, + { + "re": 70, + "im": 96 + }, + { + "re": 70, + "im": 96 + }, + { + "re": 68, + "im": 97 + }, + { + "re": 67, + "im": 98 + }, + { + "re": 66, + "im": 99 + }, + { + "re": 64, + "im": 99 + }, + { + "re": 64, + "im": 100 + }, + { + "re": 63, + "im": 100 + }, + { + "re": 63, + "im": 100 + }, + { + "re": 63, + "im": 100 + }, + { + "re": 63, + "im": 100 + }, + { + "re": 63, + "im": 100 + }, + { + "re": 62, + "im": 101 + }, + { + "re": 60, + "im": 102 + }, + { + "re": 60, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 102 + }, + { + "re": 59, + "im": 103 + }, + { + "re": 59, + "im": 104 + }, + { + "re": 59, + "im": 106 + }, + { + "re": 59, + "im": 107 + }, + { + "re": 59, + "im": 108 + }, + { + "re": 59, + "im": 110 + }, + { + "re": 59, + "im": 111 + }, + { + "re": 58, + "im": 114 + }, + { + "re": 58, + "im": 116 + }, + { + "re": 58, + "im": 116 + }, + { + "re": 58, + "im": 117 + }, + { + "re": 58, + "im": 118 + }, + { + "re": 57, + "im": 119 + }, + { + "re": 57, + "im": 120 + }, + { + "re": 57, + "im": 122 + }, + { + "re": 56, + "im": 123 + }, + { + "re": 56, + "im": 124 + }, + { + "re": 55, + "im": 126 + }, + { + "re": 53, + "im": 128 + }, + { + "re": 51, + "im": 131 + }, + { + "re": 50, + "im": 134 + }, + { + "re": 49, + "im": 138 + }, + { + "re": 47, + "im": 141 + }, + { + "re": 47, + "im": 145 + }, + { + "re": 45, + "im": 148 + }, + { + "re": 43, + "im": 151 + }, + { + "re": 41, + "im": 154 + }, + { + "re": 39, + "im": 157 + }, + { + "re": 39, + "im": 160 + }, + { + "re": 38, + "im": 162 + }, + { + "re": 37, + "im": 164 + }, + { + "re": 37, + "im": 165 + }, + { + "re": 36, + "im": 167 + }, + { + "re": 35, + "im": 168 + }, + { + "re": 34, + "im": 169 + }, + { + "re": 34, + "im": 170 + }, + { + "re": 34, + "im": 171 + }, + { + "re": 34, + "im": 173 + }, + { + "re": 33, + "im": 174 + }, + { + "re": 32, + "im": 176 + }, + { + "re": 31, + "im": 177 + }, + { + "re": 31, + "im": 179 + }, + { + "re": 30, + "im": 180 + }, + { + "re": 30, + "im": 182 + }, + { + "re": 29, + "im": 184 + }, + { + "re": 29, + "im": 185 + }, + { + "re": 27, + "im": 187 + }, + { + "re": 27, + "im": 189 + }, + { + "re": 27, + "im": 190 + }, + { + "re": 26, + "im": 191 + }, + { + "re": 26, + "im": 192 + }, + { + "re": 25, + "im": 193 + }, + { + "re": 23, + "im": 194 + }, + { + "re": 22, + "im": 195 + }, + { + "re": 21, + "im": 197 + }, + { + "re": 20, + "im": 198 + }, + { + "re": 19, + "im": 199 + }, + { + "re": 18, + "im": 199 + }, + { + "re": 17, + "im": 201 + }, + { + "re": 17, + "im": 201 + }, + { + "re": 16, + "im": 202 + }, + { + "re": 14, + "im": 203 + }, + { + "re": 13, + "im": 204 + }, + { + "re": 12, + "im": 205 + }, + { + "re": 12, + "im": 205 + }, + { + "re": 12, + "im": 205 + }, + { + "re": 12, + "im": 205 + }, + { + "re": 12, + "im": 205 + }, + { + "re": 11, + "im": 206 + }, + { + "re": 10, + "im": 207 + }, + { + "re": 8, + "im": 209 + }, + { + "re": 6, + "im": 210 + }, + { + "re": 5, + "im": 212 + }, + { + "re": 3, + "im": 213 + }, + { + "re": 2, + "im": 214 + }, + { + "re": 0, + "im": 215 + }, + { + "re": -1, + "im": 216 + }, + { + "re": -3, + "im": 217 + }, + { + "re": -7, + "im": 219 + }, + { + "re": -10, + "im": 220 + }, + { + "re": -12, + "im": 221 + }, + { + "re": -15, + "im": 222 + }, + { + "re": -16, + "im": 222 + }, + { + "re": -17, + "im": 223 + }, + { + "re": -20, + "im": 223 + }, + { + "re": -23, + "im": 223 + }, + { + "re": -26, + "im": 224 + }, + { + "re": -29, + "im": 225 + }, + { + "re": -32, + "im": 225 + }, + { + "re": -35, + "im": 225 + }, + { + "re": -37, + "im": 226 + }, + { + "re": -39, + "im": 226 + }, + { + "re": -40, + "im": 226 + }, + { + "re": -42, + "im": 226 + }, + { + "re": -44, + "im": 226 + }, + { + "re": -46, + "im": 226 + }, + { + "re": -48, + "im": 226 + }, + { + "re": -50, + "im": 226 + }, + { + "re": -51, + "im": 226 + }, + { + "re": -52, + "im": 227 + }, + { + "re": -52, + "im": 227 + }, + { + "re": -52, + "im": 227 + }, + { + "re": -53, + "im": 227 + }, + { + "re": -53, + "im": 227 + }, + { + "re": -54, + "im": 227 + }, + { + "re": -56, + "im": 227 + }, + { + "re": -56, + "im": 227 + }, + { + "re": -56, + "im": 227 + }, + { + "re": -56, + "im": 227 + }, + { + "re": -56, + "im": 227 + }, + { + "re": -57, + "im": 227 + }, + { + "re": -57, + "im": 227 + }, + { + "re": -57, + "im": 227 + }, + { + "re": -57, + "im": 226 + }, + { + "re": -57, + "im": 225 + }, + { + "re": -58, + "im": 225 + }, + { + "re": -58, + "im": 223 + }, + { + "re": -58, + "im": 220 + }, + { + "re": -58, + "im": 216 + }, + { + "re": -58, + "im": 213 + }, + { + "re": -58, + "im": 211 + }, + { + "re": -59, + "im": 210 + }, + { + "re": -59, + "im": 210 + }, + { + "re": -60, + "im": 208 + }, + { + "re": -60, + "im": 206 + }, + { + "re": -61, + "im": 204 + }, + { + "re": -61, + "im": 203 + }, + { + "re": -62, + "im": 202 + }, + { + "re": -62, + "im": 201 + }, + { + "re": -63, + "im": 200 + }, + { + "re": -64, + "im": 199 + }, + { + "re": -64, + "im": 198 + }, + { + "re": -65, + "im": 196 + }, + { + "re": -65, + "im": 195 + }, + { + "re": -66, + "im": 195 + }, + { + "re": -67, + "im": 194 + }, + { + "re": -68, + "im": 191 + }, + { + "re": -69, + "im": 188 + }, + { + "re": -70, + "im": 185 + }, + { + "re": -72, + "im": 183 + }, + { + "re": -72, + "im": 181 + }, + { + "re": -73, + "im": 180 + }, + { + "re": -73, + "im": 178 + }, + { + "re": -74, + "im": 176 + }, + { + "re": -75, + "im": 174 + }, + { + "re": -76, + "im": 171 + }, + { + "re": -77, + "im": 169 + }, + { + "re": -78, + "im": 167 + }, + { + "re": -79, + "im": 166 + }, + { + "re": -79, + "im": 165 + }, + { + "re": -79, + "im": 164 + }, + { + "re": -80, + "im": 163 + }, + { + "re": -81, + "im": 161 + }, + { + "re": -81, + "im": 159 + }, + { + "re": -82, + "im": 157 + }, + { + "re": -83, + "im": 156 + }, + { + "re": -84, + "im": 154 + }, + { + "re": -84, + "im": 153 + }, + { + "re": -85, + "im": 152 + }, + { + "re": -85, + "im": 150 + }, + { + "re": -86, + "im": 149 + }, + { + "re": -86, + "im": 148 + }, + { + "re": -87, + "im": 147 + }, + { + "re": -87, + "im": 146 + }, + { + "re": -88, + "im": 145 + }, + { + "re": -88, + "im": 144 + }, + { + "re": -89, + "im": 144 + }, + { + "re": -89, + "im": 144 + }, + { + "re": -89, + "im": 144 + }, + { + "re": -90, + "im": 142 + }, + { + "re": -90, + "im": 142 + }, + { + "re": -91, + "im": 141 + }, + { + "re": -92, + "im": 139 + }, + { + "re": -93, + "im": 138 + }, + { + "re": -93, + "im": 137 + }, + { + "re": -94, + "im": 136 + }, + { + "re": -94, + "im": 136 + }, + { + "re": -94, + "im": 136 + }, + { + "re": -95, + "im": 135 + }, + { + "re": -95, + "im": 134 + }, + { + "re": -96, + "im": 133 + }, + { + "re": -97, + "im": 133 + }, + { + "re": -97, + "im": 132 + }, + { + "re": -98, + "im": 132 + }, + { + "re": -98, + "im": 131 + }, + { + "re": -98, + "im": 131 + }, + { + "re": -98, + "im": 131 + }, + { + "re": -98, + "im": 131 + }, + { + "re": -99, + "im": 129 + }, + { + "re": -99, + "im": 128 + }, + { + "re": -101, + "im": 127 + }, + { + "re": -101, + "im": 125 + }, + { + "re": -102, + "im": 125 + }, + { + "re": -102, + "im": 124 + }, + { + "re": -102, + "im": 124 + }, + { + "re": -102, + "im": 124 + }, + { + "re": -103, + "im": 122 + }, + { + "re": -103, + "im": 121 + }, + { + "re": -104, + "im": 120 + }, + { + "re": -105, + "im": 119 + }, + { + "re": -105, + "im": 118 + }, + { + "re": -105, + "im": 118 + }, + { + "re": -105, + "im": 118 + }, + { + "re": -105, + "im": 118 + }, + { + "re": -105, + "im": 117 + }, + { + "re": -106, + "im": 116 + }, + { + "re": -107, + "im": 115 + }, + { + "re": -107, + "im": 114 + }, + { + "re": -107, + "im": 113 + }, + { + "re": -107, + "im": 113 + }, + { + "re": -107, + "im": 113 + }, + { + "re": -108, + "im": 112 + }, + { + "re": -108, + "im": 109 + }, + { + "re": -109, + "im": 108 + }, + { + "re": -109, + "im": 107 + }, + { + "re": -109, + "im": 106 + }, + { + "re": -109, + "im": 105 + }, + { + "re": -110, + "im": 104 + }, + { + "re": -110, + "im": 103 + }, + { + "re": -110, + "im": 101 + }, + { + "re": -110, + "im": 100 + }, + { + "re": -111, + "im": 99 + }, + { + "re": -111, + "im": 98 + }, + { + "re": -111, + "im": 97 + }, + { + "re": -111, + "im": 96 + }, + { + "re": -111, + "im": 94 + }, + { + "re": -111, + "im": 92 + }, + { + "re": -112, + "im": 91 + }, + { + "re": -112, + "im": 90 + }, + { + "re": -113, + "im": 89 + }, + { + "re": -113, + "im": 88 + }, + { + "re": -113, + "im": 88 + }, + { + "re": -113, + "im": 87 + }, + { + "re": -114, + "im": 87 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -114, + "im": 86 + }, + { + "re": -113, + "im": 86 + }, + { + "re": -113, + "im": 84 + }, + { + "re": -112, + "im": 84 + }, + { + "re": -112, + "im": 84 + }, + { + "re": -112, + "im": 84 + }, + { + "re": -111, + "im": 83 + }, + { + "re": -111, + "im": 82 + }, + { + "re": -109, + "im": 80 + }, + { + "re": -108, + "im": 79 + }, + { + "re": -106, + "im": 78 + }, + { + "re": -106, + "im": 77 + }, + { + "re": -106, + "im": 77 + }, + { + "re": -106, + "im": 76 + }, + { + "re": -104, + "im": 75 + }, + { + "re": -103, + "im": 74 + }, + { + "re": -101, + "im": 72 + }, + { + "re": -99, + "im": 70 + }, + { + "re": -97, + "im": 68 + }, + { + "re": -96, + "im": 66 + }, + { + "re": -95, + "im": 65 + }, + { + "re": -94, + "im": 64 + }, + { + "re": -94, + "im": 63 + }, + { + "re": -92, + "im": 61 + }, + { + "re": -91, + "im": 58 + }, + { + "re": -90, + "im": 56 + }, + { + "re": -88, + "im": 55 + }, + { + "re": -88, + "im": 54 + }, + { + "re": -88, + "im": 54 + }, + { + "re": -87, + "im": 53 + }, + { + "re": -87, + "im": 51 + }, + { + "re": -85, + "im": 50 + }, + { + "re": -84, + "im": 48 + }, + { + "re": -84, + "im": 47 + }, + { + "re": -83, + "im": 46 + }, + { + "re": -83, + "im": 46 + }, + { + "re": -83, + "im": 46 + }, + { + "re": -83, + "im": 46 + }, + { + "re": -82, + "im": 45 + }, + { + "re": -79, + "im": 44 + }, + { + "re": -78, + "im": 43 + }, + { + "re": -77, + "im": 42 + }, + { + "re": -77, + "im": 42 + }, + { + "re": -77, + "im": 42 + }, + { + "re": -77, + "im": 42 + }, + { + "re": -76, + "im": 41 + }, + { + "re": -75, + "im": 41 + }, + { + "re": -73, + "im": 39 + }, + { + "re": -71, + "im": 39 + }, + { + "re": -70, + "im": 38 + }, + { + "re": -70, + "im": 38 + }, + { + "re": -70, + "im": 38 + }, + { + "re": -70, + "im": 38 + }, + { + "re": -67, + "im": 38 + }, + { + "re": -65, + "im": 37 + }, + { + "re": -62, + "im": 36 + }, + { + "re": -60, + "im": 35 + }, + { + "re": -59, + "im": 35 + }, + { + "re": -58, + "im": 35 + }, + { + "re": -58, + "im": 35 + }, + { + "re": -58, + "im": 35 + }, + { + "re": -58, + "im": 35 + }, + { + "re": -55, + "im": 35 + }, + { + "re": -53, + "im": 35 + }, + { + "re": -51, + "im": 34 + }, + { + "re": -49, + "im": 34 + }, + { + "re": -48, + "im": 34 + }, + { + "re": -48, + "im": 33 + }, + { + "re": -48, + "im": 33 + }, + { + "re": -48, + "im": 33 + }, + { + "re": -46, + "im": 33 + }, + { + "re": -44, + "im": 33 + }, + { + "re": -42, + "im": 33 + }, + { + "re": -42, + "im": 33 + }, + { + "re": -42, + "im": 33 + }, + { + "re": -42, + "im": 33 + }, + { + "re": -42, + "im": 33 + }, + { + "re": -42, + "im": 33 + }, + { + "re": -42, + "im": 33 + }, + { + "re": -41, + "im": 33 + }, + { + "re": -39, + "im": 33 + }, + { + "re": -38, + "im": 33 + }, + { + "re": -38, + "im": 33 + }, + { + "re": -37, + "im": 33 + }, + { + "re": -37, + "im": 33 + }, + { + "re": -37, + "im": 33 + }, + { + "re": -36, + "im": 34 + }, + { + "re": -34, + "im": 34 + }, + { + "re": -34, + "im": 34 + }, + { + "re": -33, + "im": 34 + }, + { + "re": -33, + "im": 34 + }, + { + "re": -33, + "im": 34 + }, + { + "re": -32, + "im": 34 + }, + { + "re": -32, + "im": 35 + }, + { + "re": -30, + "im": 35 + }, + { + "re": -29, + "im": 36 + }, + { + "re": -28, + "im": 36 + }, + { + "re": -26, + "im": 37 + }, + { + "re": -25, + "im": 37 + }, + { + "re": -24, + "im": 37 + }, + { + "re": -24, + "im": 37 + }, + { + "re": -24, + "im": 37 + }, + { + "re": -24, + "im": 37 + }, + { + "re": -22, + "im": 37 + }, + { + "re": -21, + "im": 38 + }, + { + "re": -19, + "im": 38 + }, + { + "re": -17, + "im": 38 + }, + { + "re": -17, + "im": 38 + }, + { + "re": -17, + "im": 39 + }, + { + "re": -17, + "im": 39 + }, + { + "re": -16, + "im": 39 + }, + { + "re": -15, + "im": 39 + }, + { + "re": -13, + "im": 39 + }, + { + "re": -12, + "im": 39 + }, + { + "re": -12, + "im": 39 + }, + { + "re": -12, + "im": 39 + }, + { + "re": -11, + "im": 39 + }, + { + "re": -10, + "im": 40 + }, + { + "re": -9, + "im": 40 + }, + { + "re": -8, + "im": 41 + }, + { + "re": -8, + "im": 41 + }, + { + "re": -7, + "im": 41 + }, + { + "re": -7, + "im": 41 + }, + { + "re": -7, + "im": 41 + }, + { + "re": -5, + "im": 41 + }, + { + "re": -4, + "im": 42 + }, + { + "re": -3, + "im": 42 + }, + { + "re": -1, + "im": 43 + }, + { + "re": -1, + "im": 43 + }, + { + "re": 0, + "im": 44 + }, + { + "re": 1, + "im": 44 + }, + { + "re": 2, + "im": 45 + }, + { + "re": 3, + "im": 45 + }, + { + "re": 3, + "im": 46 + }, + { + "re": 4, + "im": 46 + }, + { + "re": 4, + "im": 46 + }, + { + "re": 4, + "im": 46 + }, + { + "re": 4, + "im": 46 + }, + { + "re": 5, + "im": 47 + }, + { + "re": 6, + "im": 48 + }, + { + "re": 7, + "im": 49 + }, + { + "re": 7, + "im": 49 + }, + { + "re": 7, + "im": 50 + }, + { + "re": 8, + "im": 50 + }, + { + "re": 8, + "im": 52 + }, + { + "re": 9, + "im": 53 + }, + { + "re": 10, + "im": 54 + }, + { + "re": 11, + "im": 56 + }, + { + "re": 11, + "im": 56 + }, + { + "re": 11, + "im": 56 + }, + { + "re": 11, + "im": 56 + }, + { + "re": 11, + "im": 56 + }, + { + "re": 11, + "im": 56 + }, + { + "re": 11, + "im": 56 + }, + { + "re": 11, + "im": 56 + }, + { + "re": 10, + "im": 56 + }, + { + "re": 9, + "im": 56 + }, + { + "re": 9, + "im": 56 + }, + { + "re": 8, + "im": 56 + }, + { + "re": 7, + "im": 56 + }, + { + "re": 6, + "im": 56 + }, + { + "re": 5, + "im": 56 + }, + { + "re": 4, + "im": 56 + }, + { + "re": 1, + "im": 56 + }, + { + "re": 0, + "im": 56 + }, + { + "re": 0, + "im": 56 + }, + { + "re": -1, + "im": 56 + }, + { + "re": -2, + "im": 56 + }, + { + "re": -3, + "im": 56 + }, + { + "re": -4, + "im": 55 + }, + { + "re": -5, + "im": 55 + }, + { + "re": -6, + "im": 55 + }, + { + "re": -7, + "im": 55 + }, + { + "re": -8, + "im": 54 + }, + { + "re": -9, + "im": 54 + }, + { + "re": -10, + "im": 54 + }, + { + "re": -11, + "im": 53 + }, + { + "re": -12, + "im": 53 + }, + { + "re": -14, + "im": 52 + }, + { + "re": -15, + "im": 51 + }, + { + "re": -15, + "im": 51 + }, + { + "re": -16, + "im": 51 + }, + { + "re": -17, + "im": 50 + }, + { + "re": -19, + "im": 50 + }, + { + "re": -19, + "im": 49 + }, + { + "re": -20, + "im": 48 + }, + { + "re": -21, + "im": 47 + }, + { + "re": -22, + "im": 47 + }, + { + "re": -23, + "im": 47 + }, + { + "re": -24, + "im": 46 + }, + { + "re": -25, + "im": 46 + }, + { + "re": -27, + "im": 45 + }, + { + "re": -29, + "im": 43 + }, + { + "re": -30, + "im": 43 + }, + { + "re": -31, + "im": 42 + }, + { + "re": -32, + "im": 42 + }, + { + "re": -33, + "im": 42 + }, + { + "re": -34, + "im": 42 + }, + { + "re": -36, + "im": 41 + }, + { + "re": -37, + "im": 39 + }, + { + "re": -40, + "im": 38 + }, + { + "re": -41, + "im": 38 + }, + { + "re": -42, + "im": 38 + }, + { + "re": -43, + "im": 38 + }, + { + "re": -44, + "im": 38 + }, + { + "re": -45, + "im": 38 + }, + { + "re": -47, + "im": 38 + }, + { + "re": -49, + "im": 38 + }, + { + "re": -50, + "im": 38 + }, + { + "re": -52, + "im": 38 + }, + { + "re": -53, + "im": 38 + }, + { + "re": -54, + "im": 38 + }, + { + "re": -56, + "im": 38 + }, + { + "re": -56, + "im": 38 + }, + { + "re": -57, + "im": 38 + }, + { + "re": -57, + "im": 38 + }, + { + "re": -58, + "im": 38 + }, + { + "re": -60, + "im": 38 + }, + { + "re": -62, + "im": 38 + }, + { + "re": -64, + "im": 38 + }, + { + "re": -65, + "im": 38 + }, + { + "re": -66, + "im": 38 + }, + { + "re": -66, + "im": 38 + }, + { + "re": -67, + "im": 38 + }, + { + "re": -68, + "im": 38 + }, + { + "re": -70, + "im": 39 + }, + { + "re": -71, + "im": 39 + }, + { + "re": -72, + "im": 39 + }, + { + "re": -72, + "im": 40 + }, + { + "re": -72, + "im": 40 + }, + { + "re": -73, + "im": 40 + }, + { + "re": -74, + "im": 40 + }, + { + "re": -75, + "im": 41 + }, + { + "re": -76, + "im": 41 + }, + { + "re": -76, + "im": 41 + }, + { + "re": -76, + "im": 41 + }, + { + "re": -77, + "im": 41 + }, + { + "re": -77, + "im": 42 + }, + { + "re": -77, + "im": 42 + }, + { + "re": -78, + "im": 42 + }, + { + "re": -78, + "im": 42 + }, + { + "re": -78, + "im": 42 + }, + { + "re": -78, + "im": 42 + }, + { + "re": -78, + "im": 42 + }, + { + "re": -78, + "im": 42 + }, + { + "re": -78, + "im": 43 + }, + { + "re": -78, + "im": 43 + }, + { + "re": -78, + "im": 43 + }, + { + "re": -78, + "im": 43 + }, + { + "re": -78, + "im": 43 + }, + { + "re": -78, + "im": 44 + }, + { + "re": -78, + "im": 44 + }, + { + "re": -78, + "im": 45 + }, + { + "re": -77, + "im": 46 + }, + { + "re": -77, + "im": 46 + }, + { + "re": -77, + "im": 46 + }, + { + "re": -76, + "im": 46 + }, + { + "re": -75, + "im": 46 + }, + { + "re": -75, + "im": 47 + }, + { + "re": -74, + "im": 48 + }, + { + "re": -73, + "im": 48 + }, + { + "re": -72, + "im": 48 + }, + { + "re": -71, + "im": 49 + }, + { + "re": -69, + "im": 49 + }, + { + "re": -68, + "im": 50 + }, + { + "re": -66, + "im": 50 + }, + { + "re": -64, + "im": 50 + }, + { + "re": -61, + "im": 51 + }, + { + "re": -58, + "im": 52 + }, + { + "re": -56, + "im": 52 + }, + { + "re": -54, + "im": 52 + }, + { + "re": -53, + "im": 52 + }, + { + "re": -52, + "im": 52 + }, + { + "re": -52, + "im": 52 + }, + { + "re": -51, + "im": 52 + }, + { + "re": -50, + "im": 52 + }, + { + "re": -48, + "im": 53 + }, + { + "re": -46, + "im": 53 + }, + { + "re": -45, + "im": 53 + }, + { + "re": -45, + "im": 53 + }, + { + "re": -45, + "im": 53 + }, + { + "re": -44, + "im": 53 + }, + { + "re": -42, + "im": 53 + }, + { + "re": -39, + "im": 54 + }, + { + "re": -37, + "im": 54 + }, + { + "re": -36, + "im": 54 + }, + { + "re": -35, + "im": 54 + }, + { + "re": -35, + "im": 54 + }, + { + "re": -35, + "im": 54 + }, + { + "re": -34, + "im": 54 + }, + { + "re": -33, + "im": 54 + }, + { + "re": -30, + "im": 54 + }, + { + "re": -28, + "im": 55 + }, + { + "re": -27, + "im": 55 + }, + { + "re": -26, + "im": 56 + }, + { + "re": -26, + "im": 56 + }, + { + "re": -25, + "im": 56 + }, + { + "re": -25, + "im": 56 + }, + { + "re": -23, + "im": 56 + }, + { + "re": -21, + "im": 57 + }, + { + "re": -20, + "im": 57 + }, + { + "re": -19, + "im": 57 + }, + { + "re": -18, + "im": 57 + }, + { + "re": -18, + "im": 57 + }, + { + "re": -17, + "im": 57 + }, + { + "re": -16, + "im": 57 + }, + { + "re": -14, + "im": 57 + }, + { + "re": -12, + "im": 58 + }, + { + "re": -12, + "im": 58 + }, + { + "re": -11, + "im": 58 + }, + { + "re": -10, + "im": 58 + }, + { + "re": -9, + "im": 58 + }, + { + "re": -8, + "im": 58 + }, + { + "re": -6, + "im": 59 + }, + { + "re": -4, + "im": 60 + }, + { + "re": -3, + "im": 60 + }, + { + "re": -3, + "im": 60 + }, + { + "re": -3, + "im": 60 + }, + { + "re": -3, + "im": 60 + }, + { + "re": -2, + "im": 60 + }, + { + "re": -1, + "im": 60 + }, + { + "re": 0, + "im": 60 + }, + { + "re": 1, + "im": 60 + }, + { + "re": 3, + "im": 61 + }, + { + "re": 4, + "im": 61 + }, + { + "re": 4, + "im": 61 + }, + { + "re": 4, + "im": 61 + }, + { + "re": 4, + "im": 61 + }, + { + "re": 4, + "im": 61 + }, + { + "re": 5, + "im": 61 + }, + { + "re": 7, + "im": 61 + }, + { + "re": 9, + "im": 61 + }, + { + "re": 11, + "im": 60 + }, + { + "re": 11, + "im": 60 + }, + { + "re": 11, + "im": 60 + }, + { + "re": 11, + "im": 60 + }, + { + "re": 11, + "im": 60 + }, + { + "re": 11, + "im": 60 + }, + { + "re": 11, + "im": 59 + }, + { + "re": 11, + "im": 59 + }, + { + "re": 11, + "im": 59 + }, + { + "re": 11, + "im": 59 + }, + { + "re": 10, + "im": 58 + }, + { + "re": 10, + "im": 58 + }, + { + "re": 10, + "im": 58 + }, + { + "re": 9, + "im": 57 + }, + { + "re": 8, + "im": 56 + }, + { + "re": 8, + "im": 55 + }, + { + "re": 7, + "im": 55 + }, + { + "re": 7, + "im": 55 + }, + { + "re": 7, + "im": 55 + }, + { + "re": 7, + "im": 55 + }, + { + "re": 7, + "im": 55 + }, + { + "re": 6, + "im": 55 + }, + { + "re": 6, + "im": 54 + }, + { + "re": 5, + "im": 53 + }, + { + "re": 5, + "im": 53 + }, + { + "re": 5, + "im": 53 + }, + { + "re": 5, + "im": 53 + }, + { + "re": 5, + "im": 53 + }, + { + "re": 5, + "im": 53 + }, + { + "re": 5, + "im": 53 + }, + { + "re": 4, + "im": 51 + }, + { + "re": 4, + "im": 49 + }, + { + "re": 4, + "im": 48 + }, + { + "re": 3, + "im": 47 + }, + { + "re": 3, + "im": 47 + }, + { + "re": 3, + "im": 47 + }, + { + "re": 3, + "im": 47 + }, + { + "re": 3, + "im": 47 + }, + { + "re": 3, + "im": 47 + }, + { + "re": 3, + "im": 47 + }, + { + "re": 3, + "im": 47 + }, + { + "re": 3, + "im": 47 + }, + { + "re": 3, + "im": 47 + }, + { + "re": 3, + "im": 47 + }, + { + "re": 3, + "im": 47 + }, + { + "re": 3, + "im": 47 + }, + { + "re": 2, + "im": 47 + }, + { + "re": 2, + "im": 47 + }, + { + "re": 2, + "im": 47 + }, + { + "re": 2, + "im": 47 + }, + { + "re": 1, + "im": 47 + }, + { + "re": 1, + "im": 47 + }, + { + "re": 1, + "im": 47 + }, + { + "re": 0, + "im": 46 + }, + { + "re": -1, + "im": 45 + }, + { + "re": -2, + "im": 44 + }, + { + "re": -2, + "im": 43 + }, + { + "re": -2, + "im": 43 + }, + { + "re": -2, + "im": 43 + }, + { + "re": -3, + "im": 43 + }, + { + "re": -3, + "im": 43 + }, + { + "re": -3, + "im": 42 + }, + { + "re": -4, + "im": 42 + }, + { + "re": -5, + "im": 41 + }, + { + "re": -6, + "im": 41 + }, + { + "re": -7, + "im": 40 + }, + { + "re": -8, + "im": 39 + }, + { + "re": -8, + "im": 39 + }, + { + "re": -9, + "im": 39 + }, + { + "re": -10, + "im": 39 + }, + { + "re": -11, + "im": 38 + }, + { + "re": -12, + "im": 38 + }, + { + "re": -13, + "im": 38 + }, + { + "re": -14, + "im": 37 + }, + { + "re": -14, + "im": 37 + }, + { + "re": -15, + "im": 37 + }, + { + "re": -15, + "im": 37 + }, + { + "re": -15, + "im": 37 + }, + { + "re": -16, + "im": 36 + }, + { + "re": -17, + "im": 35 + }, + { + "re": -18, + "im": 34 + }, + { + "re": -19, + "im": 34 + }, + { + "re": -19, + "im": 33 + }, + { + "re": -19, + "im": 33 + }, + { + "re": -20, + "im": 33 + }, + { + "re": -20, + "im": 32 + }, + { + "re": -21, + "im": 31 + }, + { + "re": -22, + "im": 29 + }, + { + "re": -23, + "im": 28 + }, + { + "re": -24, + "im": 26 + }, + { + "re": -24, + "im": 26 + }, + { + "re": -24, + "im": 24 + }, + { + "re": -24, + "im": 23 + }, + { + "re": -25, + "im": 22 + }, + { + "re": -25, + "im": 21 + }, + { + "re": -25, + "im": 20 + }, + { + "re": -26, + "im": 18 + }, + { + "re": -26, + "im": 17 + }, + { + "re": -26, + "im": 16 + }, + { + "re": -26, + "im": 15 + }, + { + "re": -26, + "im": 13 + }, + { + "re": -26, + "im": 12 + }, + { + "re": -26, + "im": 10 + }, + { + "re": -26, + "im": 10 + }, + { + "re": -26, + "im": 9 + }, + { + "re": -26, + "im": 8 + }, + { + "re": -26, + "im": 7 + }, + { + "re": -26, + "im": 6 + }, + { + "re": -26, + "im": 5 + }, + { + "re": -26, + "im": 5 + }, + { + "re": -26, + "im": 5 + }, + { + "re": -26, + "im": 4 + }, + { + "re": -26, + "im": 4 + }, + { + "re": -26, + "im": 3 + }, + { + "re": -26, + "im": 3 + }, + { + "re": -25, + "im": 3 + }, + { + "re": -25, + "im": 1 + }, + { + "re": -25, + "im": 1 + }, + { + "re": -24, + "im": 0 + }, + { + "re": -24, + "im": -1 + }, + { + "re": -23, + "im": -2 + }, + { + "re": -22, + "im": -3 + }, + { + "re": -22, + "im": -3 + }, + { + "re": -22, + "im": -3 + }, + { + "re": -22, + "im": -3 + }, + { + "re": -21, + "im": -3 + }, + { + "re": -21, + "im": -4 + }, + { + "re": -21, + "im": -5 + }, + { + "re": -20, + "im": -5 + }, + { + "re": -20, + "im": -6 + }, + { + "re": -20, + "im": -6 + }, + { + "re": -20, + "im": -6 + }, + { + "re": -20, + "im": -6 + }, + { + "re": -20, + "im": -6 + }, + { + "re": -20, + "im": -7 + }, + { + "re": -20, + "im": -8 + }, + { + "re": -20, + "im": -9 + }, + { + "re": -19, + "im": -9 + }, + { + "re": -19, + "im": -9 + }, + { + "re": -19, + "im": -9 + }, + { + "re": -19, + "im": -9 + }, + { + "re": -19, + "im": -9 + }, + { + "re": -19, + "im": -11 + }, + { + "re": -20, + "im": -13 + }, + { + "re": -20, + "im": -15 + }, + { + "re": -20, + "im": -15 + }, + { + "re": -20, + "im": -15 + }, + { + "re": -21, + "im": -16 + }, + { + "re": -21, + "im": -16 + }, + { + "re": -21, + "im": -17 + }, + { + "re": -22, + "im": -18 + }, + { + "re": -23, + "im": -20 + }, + { + "re": -23, + "im": -21 + }, + { + "re": -23, + "im": -23 + }, + { + "re": -23, + "im": -24 + }, + { + "re": -23, + "im": -24 + }, + { + "re": -24, + "im": -25 + }, + { + "re": -24, + "im": -27 + }, + { + "re": -24, + "im": -28 + }, + { + "re": -25, + "im": -29 + }, + { + "re": -25, + "im": -30 + }, + { + "re": -25, + "im": -32 + }, + { + "re": -26, + "im": -34 + }, + { + "re": -26, + "im": -35 + }, + { + "re": -27, + "im": -37 + }, + { + "re": -27, + "im": -39 + }, + { + "re": -27, + "im": -41 + }, + { + "re": -27, + "im": -43 + }, + { + "re": -27, + "im": -45 + }, + { + "re": -27, + "im": -47 + }, + { + "re": -28, + "im": -48 + }, + { + "re": -28, + "im": -49 + }, + { + "re": -28, + "im": -50 + }, + { + "re": -28, + "im": -52 + }, + { + "re": -28, + "im": -53 + }, + { + "re": -29, + "im": -54 + }, + { + "re": -29, + "im": -56 + }, + { + "re": -29, + "im": -56 + }, + { + "re": -29, + "im": -56 + }, + { + "re": -29, + "im": -57 + }, + { + "re": -29, + "im": -57 + }, + { + "re": -29, + "im": -58 + }, + { + "re": -29, + "im": -59 + }, + { + "re": -29, + "im": -60 + }, + { + "re": -29, + "im": -61 + }, + { + "re": -29, + "im": -63 + }, + { + "re": -29, + "im": -64 + }, + { + "re": -29, + "im": -65 + }, + { + "re": -29, + "im": -65 + }, + { + "re": -29, + "im": -67 + }, + { + "re": -29, + "im": -69 + }, + { + "re": -29, + "im": -71 + }, + { + "re": -29, + "im": -73 + }, + { + "re": -29, + "im": -74 + }, + { + "re": -29, + "im": -75 + }, + { + "re": -28, + "im": -77 + }, + { + "re": -28, + "im": -77 + }, + { + "re": -28, + "im": -79 + }, + { + "re": -28, + "im": -81 + }, + { + "re": -27, + "im": -81 + }, + { + "re": -27, + "im": -82 + }, + { + "re": -27, + "im": -83 + }, + { + "re": -27, + "im": -83 + }, + { + "re": -27, + "im": -83 + }, + { + "re": -27, + "im": -83 + }, + { + "re": -26, + "im": -85 + }, + { + "re": -25, + "im": -86 + }, + { + "re": -25, + "im": -87 + }, + { + "re": -24, + "im": -89 + }, + { + "re": -24, + "im": -90 + }, + { + "re": -24, + "im": -91 + }, + { + "re": -23, + "im": -92 + }, + { + "re": -22, + "im": -92 + }, + { + "re": -21, + "im": -94 + }, + { + "re": -20, + "im": -96 + }, + { + "re": -20, + "im": -97 + }, + { + "re": -18, + "im": -98 + }, + { + "re": -18, + "im": -99 + }, + { + "re": -18, + "im": -99 + }, + { + "re": -17, + "im": -100 + }, + { + "re": -16, + "im": -101 + }, + { + "re": -15, + "im": -102 + }, + { + "re": -14, + "im": -103 + }, + { + "re": -13, + "im": -103 + }, + { + "re": -13, + "im": -104 + }, + { + "re": -12, + "im": -105 + }, + { + "re": -11, + "im": -105 + }, + { + "re": -11, + "im": -105 + }, + { + "re": -11, + "im": -105 + }, + { + "re": -11, + "im": -105 + }, + { + "re": -11, + "im": -105 + }, + { + "re": -11, + "im": -105 + }, + { + "re": -11, + "im": -105 + }, + { + "re": -11, + "im": -105 + }, + { + "re": -9, + "im": -105 + }, + { + "re": -7, + "im": -105 + }, + { + "re": -5, + "im": -105 + }, + { + "re": -5, + "im": -105 + }, + { + "re": -4, + "im": -105 + }, + { + "re": -3, + "im": -105 + }, + { + "re": -1, + "im": -105 + }, + { + "re": 1, + "im": -105 + }, + { + "re": 3, + "im": -105 + }, + { + "re": 5, + "im": -105 + }, + { + "re": 6, + "im": -105 + }, + { + "re": 7, + "im": -105 + }, + { + "re": 8, + "im": -105 + }, + { + "re": 12, + "im": -105 + }, + { + "re": 14, + "im": -105 + }, + { + "re": 16, + "im": -105 + }, + { + "re": 17, + "im": -105 + }, + { + "re": 17, + "im": -105 + }, + { + "re": 17, + "im": -105 + }, + { + "re": 18, + "im": -105 + }, + { + "re": 19, + "im": -105 + }, + { + "re": 21, + "im": -106 + }, + { + "re": 23, + "im": -106 + }, + { + "re": 24, + "im": -106 + }, + { + "re": 26, + "im": -106 + }, + { + "re": 27, + "im": -106 + }, + { + "re": 28, + "im": -106 + }, + { + "re": 29, + "im": -107 + }, + { + "re": 30, + "im": -107 + }, + { + "re": 32, + "im": -107 + }, + { + "re": 34, + "im": -107 + }, + { + "re": 36, + "im": -107 + }, + { + "re": 36, + "im": -107 + }, + { + "re": 37, + "im": -107 + }, + { + "re": 38, + "im": -107 + }, + { + "re": 38, + "im": -107 + }, + { + "re": 40, + "im": -107 + }, + { + "re": 42, + "im": -107 + }, + { + "re": 44, + "im": -107 + }, + { + "re": 45, + "im": -107 + }, + { + "re": 46, + "im": -107 + }, + { + "re": 46, + "im": -107 + }, + { + "re": 46, + "im": -107 + }, + { + "re": 47, + "im": -107 + }, + { + "re": 49, + "im": -107 + }, + { + "re": 50, + "im": -107 + }, + { + "re": 53, + "im": -107 + }, + { + "re": 54, + "im": -107 + }, + { + "re": 55, + "im": -107 + }, + { + "re": 55, + "im": -107 + }, + { + "re": 55, + "im": -107 + }, + { + "re": 55, + "im": -107 + }, + { + "re": 55, + "im": -107 + }, + { + "re": 55, + "im": -107 + }, + { + "re": 58, + "im": -104 + }, + { + "re": 58, + "im": -103 + }, + { + "re": 59, + "im": -102 + }, + { + "re": 59, + "im": -102 + }, + { + "re": 59, + "im": -101 + }, + { + "re": 59, + "im": -101 + }, + { + "re": 59, + "im": -101 + }, + { + "re": 59, + "im": -101 + }, + { + "re": 59, + "im": -101 + }, + { + "re": 59, + "im": -101 + }, + { + "re": 59, + "im": -101 + }, + { + "re": 58, + "im": -99 + }, + { + "re": 57, + "im": -99 + }, + { + "re": 57, + "im": -99 + }, + { + "re": 57, + "im": -99 + }, + { + "re": 56, + "im": -98 + }, + { + "re": 56, + "im": -98 + }, + { + "re": 55, + "im": -98 + }, + { + "re": 54, + "im": -97 + }, + { + "re": 52, + "im": -97 + }, + { + "re": 51, + "im": -97 + }, + { + "re": 50, + "im": -97 + }, + { + "re": 49, + "im": -96 + }, + { + "re": 46, + "im": -96 + }, + { + "re": 44, + "im": -96 + }, + { + "re": 42, + "im": -96 + }, + { + "re": 41, + "im": -96 + }, + { + "re": 39, + "im": -96 + }, + { + "re": 38, + "im": -95 + }, + { + "re": 36, + "im": -95 + }, + { + "re": 34, + "im": -95 + }, + { + "re": 31, + "im": -95 + }, + { + "re": 29, + "im": -94 + }, + { + "re": 27, + "im": -94 + }, + { + "re": 26, + "im": -94 + }, + { + "re": 25, + "im": -94 + }, + { + "re": 23, + "im": -94 + }, + { + "re": 22, + "im": -94 + }, + { + "re": 20, + "im": -94 + }, + { + "re": 18, + "im": -94 + }, + { + "re": 18, + "im": -94 + }, + { + "re": 17, + "im": -94 + }, + { + "re": 17, + "im": -94 + }, + { + "re": 17, + "im": -94 + }, + { + "re": 17, + "im": -94 + }, + { + "re": 15, + "im": -94 + }, + { + "re": 14, + "im": -94 + }, + { + "re": 13, + "im": -94 + }, + { + "re": 12, + "im": -94 + }, + { + "re": 12, + "im": -94 + }, + { + "re": 12, + "im": -94 + }, + { + "re": 11, + "im": -94 + }, + { + "re": 10, + "im": -94 + }, + { + "re": 9, + "im": -95 + }, + { + "re": 8, + "im": -95 + }, + { + "re": 6, + "im": -95 + }, + { + "re": 6, + "im": -95 + }, + { + "re": 5, + "im": -95 + }, + { + "re": 5, + "im": -95 + }, + { + "re": 5, + "im": -95 + }, + { + "re": 5, + "im": -95 + }, + { + "re": 5, + "im": -95 + }, + { + "re": 4, + "im": -95 + }, + { + "re": 3, + "im": -95 + }, + { + "re": 3, + "im": -95 + }, + { + "re": 2, + "im": -95 + }, + { + "re": 2, + "im": -96 + }, + { + "re": 1, + "im": -96 + }, + { + "re": 1, + "im": -96 + }, + { + "re": 0, + "im": -96 + }, + { + "re": 0, + "im": -96 + }, + { + "re": -1, + "im": -96 + }, + { + "re": -2, + "im": -96 + }, + { + "re": -3, + "im": -96 + }, + { + "re": -4, + "im": -96 + }, + { + "re": -5, + "im": -96 + }, + { + "re": -6, + "im": -96 + }, + { + "re": -7, + "im": -96 + }, + { + "re": -8, + "im": -96 + }, + { + "re": -10, + "im": -96 + }, + { + "re": -10, + "im": -96 + }, + { + "re": -10, + "im": -96 + }, + { + "re": -10, + "im": -96 + }, + { + "re": -11, + "im": -96 + }, + { + "re": -12, + "im": -96 + }, + { + "re": -15, + "im": -96 + }, + { + "re": -16, + "im": -96 + }, + { + "re": -17, + "im": -96 + }, + { + "re": -17, + "im": -96 + }, + { + "re": -17, + "im": -96 + }, + { + "re": -17, + "im": -96 + }, + { + "re": -19, + "im": -96 + }, + { + "re": -20, + "im": -96 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -21, + "im": -95 + }, + { + "re": -20, + "im": -94 + }, + { + "re": -18, + "im": -93 + }, + { + "re": -17, + "im": -93 + }, + { + "re": -17, + "im": -93 + }, + { + "re": -16, + "im": -93 + }, + { + "re": -15, + "im": -93 + }, + { + "re": -13, + "im": -93 + }, + { + "re": -13, + "im": -93 + }, + { + "re": -12, + "im": -92 + }, + { + "re": -10, + "im": -92 + }, + { + "re": -7, + "im": -91 + }, + { + "re": -4, + "im": -91 + }, + { + "re": -2, + "im": -91 + }, + { + "re": 0, + "im": -91 + }, + { + "re": 0, + "im": -91 + }, + { + "re": 1, + "im": -91 + }, + { + "re": 1, + "im": -91 + }, + { + "re": 3, + "im": -90 + }, + { + "re": 5, + "im": -90 + }, + { + "re": 8, + "im": -89 + }, + { + "re": 9, + "im": -89 + }, + { + "re": 11, + "im": -89 + }, + { + "re": 12, + "im": -89 + }, + { + "re": 13, + "im": -89 + }, + { + "re": 15, + "im": -88 + }, + { + "re": 17, + "im": -88 + }, + { + "re": 18, + "im": -88 + }, + { + "re": 21, + "im": -88 + }, + { + "re": 22, + "im": -88 + }, + { + "re": 22, + "im": -88 + }, + { + "re": 24, + "im": -88 + }, + { + "re": 25, + "im": -88 + }, + { + "re": 26, + "im": -88 + }, + { + "re": 28, + "im": -88 + }, + { + "re": 29, + "im": -88 + }, + { + "re": 30, + "im": -88 + }, + { + "re": 30, + "im": -88 + }, + { + "re": 30, + "im": -88 + }, + { + "re": 31, + "im": -88 + }, + { + "re": 33, + "im": -88 + }, + { + "re": 36, + "im": -88 + }, + { + "re": 39, + "im": -87 + }, + { + "re": 42, + "im": -87 + }, + { + "re": 44, + "im": -87 + }, + { + "re": 44, + "im": -87 + }, + { + "re": 44, + "im": -87 + }, + { + "re": 44, + "im": -87 + }, + { + "re": 45, + "im": -87 + }, + { + "re": 46, + "im": -87 + }, + { + "re": 48, + "im": -86 + }, + { + "re": 49, + "im": -86 + }, + { + "re": 50, + "im": -85 + }, + { + "re": 51, + "im": -84 + }, + { + "re": 51, + "im": -83 + }, + { + "re": 51, + "im": -83 + }, + { + "re": 52, + "im": -82 + }, + { + "re": 53, + "im": -82 + }, + { + "re": 53, + "im": -80 + }, + { + "re": 54, + "im": -79 + }, + { + "re": 55, + "im": -78 + }, + { + "re": 55, + "im": -76 + }, + { + "re": 57, + "im": -75 + }, + { + "re": 57, + "im": -75 + }, + { + "re": 57, + "im": -74 + }, + { + "re": 57, + "im": -73 + }, + { + "re": 58, + "im": -72 + }, + { + "re": 58, + "im": -71 + }, + { + "re": 59, + "im": -68 + }, + { + "re": 60, + "im": -67 + }, + { + "re": 61, + "im": -66 + }, + { + "re": 61, + "im": -65 + }, + { + "re": 61, + "im": -64 + }, + { + "re": 61, + "im": -64 + }, + { + "re": 61, + "im": -63 + }, + { + "re": 61, + "im": -63 + }, + { + "re": 61, + "im": -62 + }, + { + "re": 61, + "im": -62 + }, + { + "re": 62, + "im": -62 + }, + { + "re": 62, + "im": -62 + }, + { + "re": 62, + "im": -62 + }, + { + "re": 62, + "im": -62 + }, + { + "re": 62, + "im": -62 + }, + { + "re": 62, + "im": -62 + }, + { + "re": 62, + "im": -62 + }, + { + "re": 62, + "im": -62 + }, + { + "re": 62, + "im": -62 + }, + { + "re": 62, + "im": -62 + }, + { + "re": 62, + "im": -62 + }, + { + "re": 60, + "im": -61 + }, + { + "re": 60, + "im": -61 + }, + { + "re": 60, + "im": -61 + }, + { + "re": 60, + "im": -61 + }, + { + "re": 59, + "im": -61 + }, + { + "re": 58, + "im": -61 + }, + { + "re": 57, + "im": -61 + }, + { + "re": 56, + "im": -61 + }, + { + "re": 56, + "im": -62 + }, + { + "re": 56, + "im": -62 + }, + { + "re": 56, + "im": -62 + }, + { + "re": 55, + "im": -62 + }, + { + "re": 54, + "im": -63 + }, + { + "re": 53, + "im": -65 + }, + { + "re": 51, + "im": -66 + }, + { + "re": 51, + "im": -67 + }, + { + "re": 50, + "im": -67 + }, + { + "re": 50, + "im": -67 + }, + { + "re": 49, + "im": -67 + }, + { + "re": 49, + "im": -67 + }, + { + "re": 48, + "im": -68 + }, + { + "re": 46, + "im": -69 + }, + { + "re": 46, + "im": -70 + }, + { + "re": 45, + "im": -71 + }, + { + "re": 44, + "im": -71 + }, + { + "re": 43, + "im": -71 + }, + { + "re": 43, + "im": -71 + }, + { + "re": 42, + "im": -72 + }, + { + "re": 41, + "im": -73 + }, + { + "re": 40, + "im": -73 + }, + { + "re": 39, + "im": -73 + }, + { + "re": 38, + "im": -74 + }, + { + "re": 37, + "im": -74 + }, + { + "re": 35, + "im": -74 + }, + { + "re": 34, + "im": -75 + }, + { + "re": 33, + "im": -75 + }, + { + "re": 32, + "im": -76 + }, + { + "re": 31, + "im": -76 + }, + { + "re": 30, + "im": -77 + }, + { + "re": 30, + "im": -77 + }, + { + "re": 29, + "im": -77 + }, + { + "re": 28, + "im": -77 + }, + { + "re": 27, + "im": -77 + }, + { + "re": 26, + "im": -77 + }, + { + "re": 25, + "im": -78 + }, + { + "re": 23, + "im": -78 + }, + { + "re": 23, + "im": -78 + }, + { + "re": 22, + "im": -78 + }, + { + "re": 22, + "im": -78 + }, + { + "re": 21, + "im": -78 + }, + { + "re": 20, + "im": -78 + }, + { + "re": 19, + "im": -78 + }, + { + "re": 17, + "im": -78 + }, + { + "re": 16, + "im": -78 + }, + { + "re": 16, + "im": -78 + }, + { + "re": 16, + "im": -78 + }, + { + "re": 16, + "im": -78 + }, + { + "re": 15, + "im": -78 + }, + { + "re": 13, + "im": -78 + }, + { + "re": 11, + "im": -78 + }, + { + "re": 9, + "im": -78 + }, + { + "re": 9, + "im": -78 + }, + { + "re": 8, + "im": -78 + }, + { + "re": 8, + "im": -78 + }, + { + "re": 8, + "im": -78 + }, + { + "re": 6, + "im": -78 + }, + { + "re": 5, + "im": -78 + }, + { + "re": 2, + "im": -78 + }, + { + "re": 1, + "im": -78 + }, + { + "re": 0, + "im": -78 + }, + { + "re": 0, + "im": -78 + }, + { + "re": 0, + "im": -78 + }, + { + "re": 0, + "im": -78 + }, + { + "re": 0, + "im": -77 + }, + { + "re": -2, + "im": -77 + }, + { + "re": -3, + "im": -77 + }, + { + "re": -4, + "im": -76 + }, + { + "re": -5, + "im": -76 + }, + { + "re": -5, + "im": -76 + }, + { + "re": -5, + "im": -76 + }, + { + "re": -5, + "im": -76 + }, + { + "re": -5, + "im": -76 + }, + { + "re": -7, + "im": -75 + }, + { + "re": -8, + "im": -74 + }, + { + "re": -9, + "im": -72 + }, + { + "re": -9, + "im": -71 + }, + { + "re": -10, + "im": -71 + }, + { + "re": -10, + "im": -71 + }, + { + "re": -10, + "im": -71 + }, + { + "re": -10, + "im": -71 + }, + { + "re": -10, + "im": -71 + }, + { + "re": -10, + "im": -71 + }, + { + "re": -10, + "im": -71 + }, + { + "re": -10, + "im": -71 + }, + { + "re": -10, + "im": -71 + }, + { + "re": -10, + "im": -71 + }, + { + "re": -9, + "im": -71 + }, + { + "re": -9, + "im": -71 + }, + { + "re": -9, + "im": -71 + }, + { + "re": -9, + "im": -71 + }, + { + "re": -9, + "im": -71 + }, + { + "re": -9, + "im": -71 + }, + { + "re": -8, + "im": -71 + }, + { + "re": -6, + "im": -70 + }, + { + "re": -5, + "im": -70 + }, + { + "re": -4, + "im": -70 + }, + { + "re": -3, + "im": -70 + }, + { + "re": -2, + "im": -70 + }, + { + "re": -1, + "im": -70 + }, + { + "re": 0, + "im": -70 + }, + { + "re": 1, + "im": -70 + }, + { + "re": 1, + "im": -70 + }, + { + "re": 1, + "im": -70 + }, + { + "re": 1, + "im": -70 + }, + { + "re": 3, + "im": -70 + }, + { + "re": 4, + "im": -69 + }, + { + "re": 5, + "im": -69 + }, + { + "re": 5, + "im": -69 + }, + { + "re": 5, + "im": -69 + }, + { + "re": 5, + "im": -69 + }, + { + "re": 7, + "im": -68 + }, + { + "re": 8, + "im": -68 + }, + { + "re": 11, + "im": -67 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 13, + "im": -66 + }, + { + "re": 12, + "im": -66 + }, + { + "re": 12, + "im": -66 + }, + { + "re": 12, + "im": -66 + }, + { + "re": 12, + "im": -66 + }, + { + "re": 11, + "im": -66 + }, + { + "re": 10, + "im": -67 + }, + { + "re": 9, + "im": -69 + }, + { + "re": 9, + "im": -70 + }, + { + "re": 9, + "im": -70 + }, + { + "re": 9, + "im": -70 + }, + { + "re": 9, + "im": -70 + }, + { + "re": 9, + "im": -70 + }, + { + "re": 9, + "im": -70 + }, + { + "re": 9, + "im": -71 + }, + { + "re": 9, + "im": -73 + }, + { + "re": 9, + "im": -74 + }, + { + "re": 9, + "im": -74 + }, + { + "re": 9, + "im": -74 + }, + { + "re": 9, + "im": -74 + }, + { + "re": 9, + "im": -74 + }, + { + "re": 9, + "im": -75 + }, + { + "re": 9, + "im": -75 + }, + { + "re": 9, + "im": -76 + }, + { + "re": 9, + "im": -76 + }, + { + "re": 9, + "im": -76 + }, + { + "re": 9, + "im": -76 + }, + { + "re": 11, + "im": -76 + }, + { + "re": 13, + "im": -76 + }, + { + "re": 15, + "im": -77 + }, + { + "re": 16, + "im": -78 + }, + { + "re": 17, + "im": -78 + }, + { + "re": 17, + "im": -78 + }, + { + "re": 18, + "im": -79 + }, + { + "re": 18, + "im": -79 + }, + { + "re": 18, + "im": -79 + }, + { + "re": 18, + "im": -79 + }, + { + "re": 18, + "im": -79 + }, + { + "re": 18, + "im": -79 + }, + { + "re": 18, + "im": -79 + }, + { + "re": 18, + "im": -79 + }, + { + "re": 19, + "im": -79 + }, + { + "re": 20, + "im": -79 + }, + { + "re": 20, + "im": -79 + }, + { + "re": 22, + "im": -79 + }, + { + "re": 23, + "im": -79 + }, + { + "re": 24, + "im": -79 + }, + { + "re": 24, + "im": -79 + }, + { + "re": 24, + "im": -79 + }, + { + "re": 24, + "im": -78 + }, + { + "re": 25, + "im": -76 + }, + { + "re": 26, + "im": -75 + }, + { + "re": 26, + "im": -74 + }, + { + "re": 27, + "im": -74 + }, + { + "re": 27, + "im": -74 + }, + { + "re": 27, + "im": -74 + }, + { + "re": 27, + "im": -74 + }, + { + "re": 27, + "im": -74 + }, + { + "re": 27, + "im": -72 + }, + { + "re": 27, + "im": -72 + }, + { + "re": 27, + "im": -72 + }, + { + "re": 27, + "im": -72 + }, + { + "re": 27, + "im": -72 + }, + { + "re": 27, + "im": -72 + }, + { + "re": 27, + "im": -72 + }, + { + "re": 27, + "im": -72 + }, + { + "re": 27, + "im": -71 + }, + { + "re": 27, + "im": -70 + }, + { + "re": 27, + "im": -69 + }, + { + "re": 27, + "im": -68 + }, + { + "re": 26, + "im": -68 + }, + { + "re": 25, + "im": -67 + }, + { + "re": 23, + "im": -66 + }, + { + "re": 22, + "im": -66 + }, + { + "re": 21, + "im": -66 + }, + { + "re": 20, + "im": -65 + }, + { + "re": 19, + "im": -64 + }, + { + "re": 17, + "im": -64 + }, + { + "re": 15, + "im": -64 + }, + { + "re": 14, + "im": -64 + }, + { + "re": 14, + "im": -64 + }, + { + "re": 14, + "im": -64 + }, + { + "re": 14, + "im": -64 + }, + { + "re": 14, + "im": -64 + }, + { + "re": 14, + "im": -64 + }, + { + "re": 14, + "im": -64 + }, + { + "re": 14, + "im": -64 + }, + { + "re": 14, + "im": -64 + }, + { + "re": 15, + "im": -65 + }, + { + "re": 16, + "im": -66 + }, + { + "re": 16, + "im": -66 + }, + { + "re": 17, + "im": -66 + }, + { + "re": 18, + "im": -67 + }, + { + "re": 19, + "im": -67 + }, + { + "re": 21, + "im": -67 + }, + { + "re": 21, + "im": -67 + }, + { + "re": 22, + "im": -67 + }, + { + "re": 22, + "im": -67 + }, + { + "re": 22, + "im": -67 + }, + { + "re": 22, + "im": -67 + }, + { + "re": 24, + "im": -67 + }, + { + "re": 26, + "im": -67 + }, + { + "re": 28, + "im": -67 + }, + { + "re": 28, + "im": -67 + }, + { + "re": 28, + "im": -67 + }, + { + "re": 28, + "im": -67 + }, + { + "re": 28, + "im": -67 + }, + { + "re": 30, + "im": -67 + }, + { + "re": 32, + "im": -67 + }, + { + "re": 34, + "im": -67 + }, + { + "re": 36, + "im": -67 + }, + { + "re": 36, + "im": -67 + }, + { + "re": 36, + "im": -67 + }, + { + "re": 36, + "im": -67 + }, + { + "re": 36, + "im": -67 + }, + { + "re": 36, + "im": -67 + }, + { + "re": 38, + "im": -67 + }, + { + "re": 39, + "im": -67 + }, + { + "re": 40, + "im": -66 + }, + { + "re": 40, + "im": -66 + }, + { + "re": 40, + "im": -66 + }, + { + "re": 41, + "im": -66 + }, + { + "re": 41, + "im": -66 + }, + { + "re": 41, + "im": -66 + }, + { + "re": 42, + "im": -66 + }, + { + "re": 43, + "im": -65 + }, + { + "re": 44, + "im": -65 + }, + { + "re": 44, + "im": -65 + }, + { + "re": 44, + "im": -65 + }, + { + "re": 44, + "im": -65 + }, + { + "re": 44, + "im": -65 + }, + { + "re": 45, + "im": -64 + }, + { + "re": 46, + "im": -64 + }, + { + "re": 48, + "im": -64 + }, + { + "re": 48, + "im": -64 + }, + { + "re": 48, + "im": -64 + }, + { + "re": 48, + "im": -64 + }, + { + "re": 50, + "im": -64 + }, + { + "re": 52, + "im": -63 + }, + { + "re": 54, + "im": -63 + }, + { + "re": 56, + "im": -63 + }, + { + "re": 56, + "im": -63 + }, + { + "re": 56, + "im": -63 + }, + { + "re": 56, + "im": -63 + }, + { + "re": 57, + "im": -63 + }, + { + "re": 57, + "im": -63 + }, + { + "re": 57, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 58, + "im": -63 + }, + { + "re": 56, + "im": -63 + }, + { + "re": 55, + "im": -63 + }, + { + "re": 54, + "im": -63 + }, + { + "re": 52, + "im": -63 + }, + { + "re": 52, + "im": -63 + }, + { + "re": 52, + "im": -63 + }, + { + "re": 52, + "im": -63 + }, + { + "re": 52, + "im": -63 + }, + { + "re": 51, + "im": -63 + }, + { + "re": 50, + "im": -64 + }, + { + "re": 49, + "im": -65 + }, + { + "re": 48, + "im": -65 + }, + { + "re": 47, + "im": -66 + }, + { + "re": 47, + "im": -66 + }, + { + "re": 46, + "im": -67 + }, + { + "re": 45, + "im": -67 + }, + { + "re": 45, + "im": -68 + }, + { + "re": 43, + "im": -68 + }, + { + "re": 42, + "im": -69 + }, + { + "re": 41, + "im": -69 + }, + { + "re": 39, + "im": -70 + }, + { + "re": 38, + "im": -71 + }, + { + "re": 35, + "im": -73 + }, + { + "re": 34, + "im": -74 + }, + { + "re": 33, + "im": -74 + }, + { + "re": 33, + "im": -74 + }, + { + "re": 33, + "im": -74 + }, + { + "re": 31, + "im": -74 + }, + { + "re": 30, + "im": -75 + }, + { + "re": 29, + "im": -75 + }, + { + "re": 29, + "im": -75 + }, + { + "re": 27, + "im": -75 + }, + { + "re": 26, + "im": -76 + }, + { + "re": 25, + "im": -76 + }, + { + "re": 22, + "im": -76 + }, + { + "re": 21, + "im": -76 + }, + { + "re": 19, + "im": -76 + }, + { + "re": 19, + "im": -76 + }, + { + "re": 19, + "im": -76 + }, + { + "re": 19, + "im": -76 + }, + { + "re": 19, + "im": -76 + }, + { + "re": 18, + "im": -76 + }, + { + "re": 17, + "im": -76 + }, + { + "re": 16, + "im": -76 + }, + { + "re": 14, + "im": -76 + }, + { + "re": 13, + "im": -76 + }, + { + "re": 13, + "im": -76 + }, + { + "re": 12, + "im": -76 + }, + { + "re": 11, + "im": -76 + }, + { + "re": 10, + "im": -76 + }, + { + "re": 8, + "im": -76 + }, + { + "re": 6, + "im": -76 + }, + { + "re": 4, + "im": -75 + }, + { + "re": 2, + "im": -75 + }, + { + "re": 0, + "im": -75 + }, + { + "re": 0, + "im": -75 + }, + { + "re": -2, + "im": -75 + }, + { + "re": -2, + "im": -75 + }, + { + "re": -3, + "im": -75 + }, + { + "re": -3, + "im": -75 + }, + { + "re": -5, + "im": -75 + }, + { + "re": -5, + "im": -75 + }, + { + "re": -5, + "im": -75 + }, + { + "re": -6, + "im": -75 + }, + { + "re": -6, + "im": -75 + }, + { + "re": -6, + "im": -74 + }, + { + "re": -6, + "im": -74 + }, + { + "re": -6, + "im": -74 + }, + { + "re": -6, + "im": -74 + }, + { + "re": -7, + "im": -74 + }, + { + "re": -7, + "im": -74 + }, + { + "re": -9, + "im": -74 + }, + { + "re": -10, + "im": -74 + }, + { + "re": -11, + "im": -74 + }, + { + "re": -11, + "im": -74 + }, + { + "re": -11, + "im": -74 + }, + { + "re": -11, + "im": -74 + }, + { + "re": -12, + "im": -74 + }, + { + "re": -13, + "im": -74 + }, + { + "re": -15, + "im": -74 + }, + { + "re": -15, + "im": -74 + }, + { + "re": -15, + "im": -74 + }, + { + "re": -15, + "im": -74 + }, + { + "re": -15, + "im": -74 + }, + { + "re": -15, + "im": -74 + }, + { + "re": -16, + "im": -74 + }, + { + "re": -16, + "im": -74 + }, + { + "re": -17, + "im": -74 + }, + { + "re": -17, + "im": -74 + }, + { + "re": -17, + "im": -74 + }, + { + "re": -17, + "im": -74 + }, + { + "re": -17, + "im": -74 + }, + { + "re": -17, + "im": -74 + }, + { + "re": -17, + "im": -74 + }, + { + "re": -19, + "im": -74 + }, + { + "re": -20, + "im": -74 + }, + { + "re": -22, + "im": -74 + }, + { + "re": -23, + "im": -74 + }, + { + "re": -24, + "im": -74 + }, + { + "re": -25, + "im": -74 + }, + { + "re": -27, + "im": -74 + }, + { + "re": -28, + "im": -75 + }, + { + "re": -29, + "im": -75 + }, + { + "re": -30, + "im": -75 + }, + { + "re": -31, + "im": -75 + }, + { + "re": -32, + "im": -76 + }, + { + "re": -34, + "im": -76 + }, + { + "re": -36, + "im": -77 + }, + { + "re": -36, + "im": -77 + }, + { + "re": -36, + "im": -77 + }, + { + "re": -36, + "im": -77 + }, + { + "re": -37, + "im": -77 + }, + { + "re": -38, + "im": -78 + }, + { + "re": -39, + "im": -78 + }, + { + "re": -40, + "im": -79 + }, + { + "re": -40, + "im": -79 + }, + { + "re": -40, + "im": -79 + }, + { + "re": -41, + "im": -79 + }, + { + "re": -41, + "im": -80 + }, + { + "re": -43, + "im": -81 + }, + { + "re": -47, + "im": -83 + }, + { + "re": -50, + "im": -85 + }, + { + "re": -54, + "im": -87 + }, + { + "re": -58, + "im": -89 + }, + { + "re": -60, + "im": -90 + }, + { + "re": -63, + "im": -92 + }, + { + "re": -66, + "im": -95 + }, + { + "re": -68, + "im": -97 + }, + { + "re": -69, + "im": -99 + }, + { + "re": -69, + "im": -99 + }, + { + "re": -70, + "im": -100 + }, + { + "re": -70, + "im": -101 + }, + { + "re": -70, + "im": -102 + }, + { + "re": -70, + "im": -102 + }, + { + "re": -71, + "im": -103 + }, + { + "re": -71, + "im": -104 + }, + { + "re": -71, + "im": -105 + }, + { + "re": -71, + "im": -106 + }, + { + "re": -71, + "im": -106 + }, + { + "re": -71, + "im": -107 + }, + { + "re": -72, + "im": -107 + }, + { + "re": -72, + "im": -107 + }, + { + "re": -72, + "im": -108 + }, + { + "re": -72, + "im": -108 + }, + { + "re": -72, + "im": -110 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -73, + "im": -111 + }, + { + "re": -74, + "im": -112 + }, + { + "re": -75, + "im": -112 + }, + { + "re": -76, + "im": -113 + }, + { + "re": -77, + "im": -113 + }, + { + "re": -77, + "im": -114 + }, + { + "re": -78, + "im": -114 + }, + { + "re": -78, + "im": -114 + }, + { + "re": -78, + "im": -114 + }, + { + "re": -78, + "im": -114 + }, + { + "re": -78, + "im": -114 + }, + { + "re": -79, + "im": -114 + }, + { + "re": -80, + "im": -115 + }, + { + "re": -81, + "im": -115 + }, + { + "re": -81, + "im": -115 + }, + { + "re": -81, + "im": -115 + }, + { + "re": -81, + "im": -115 + }, + { + "re": -82, + "im": -115 + }, + { + "re": -82, + "im": -115 + }, + { + "re": -82, + "im": -116 + }, + { + "re": -84, + "im": -116 + }, + { + "re": -86, + "im": -116 + }, + { + "re": -87, + "im": -117 + }, + { + "re": -88, + "im": -117 + }, + { + "re": -88, + "im": -117 + }, + { + "re": -89, + "im": -117 + }, + { + "re": -89, + "im": -117 + }, + { + "re": -91, + "im": -118 + }, + { + "re": -92, + "im": -118 + }, + { + "re": -93, + "im": -118 + }, + { + "re": -94, + "im": -118 + }, + { + "re": -94, + "im": -118 + }, + { + "re": -94, + "im": -118 + }, + { + "re": -94, + "im": -118 + }, + { + "re": -95, + "im": -118 + }, + { + "re": -95, + "im": -119 + }, + { + "re": -97, + "im": -119 + }, + { + "re": -98, + "im": -119 + }, + { + "re": -99, + "im": -119 + }, + { + "re": -99, + "im": -119 + }, + { + "re": -99, + "im": -119 + }, + { + "re": -99, + "im": -119 + }, + { + "re": -99, + "im": -119 + }, + { + "re": -101, + "im": -119 + }, + { + "re": -102, + "im": -119 + }, + { + "re": -103, + "im": -119 + }, + { + "re": -105, + "im": -119 + }, + { + "re": -106, + "im": -119 + }, + { + "re": -107, + "im": -120 + }, + { + "re": -109, + "im": -120 + }, + { + "re": -110, + "im": -120 + }, + { + "re": -112, + "im": -120 + }, + { + "re": -114, + "im": -120 + }, + { + "re": -116, + "im": -120 + }, + { + "re": -118, + "im": -120 + }, + { + "re": -120, + "im": -120 + }, + { + "re": -123, + "im": -120 + }, + { + "re": -126, + "im": -120 + }, + { + "re": -128, + "im": -120 + }, + { + "re": -130, + "im": -120 + }, + { + "re": -130, + "im": -120 + }, + { + "re": -131, + "im": -120 + }, + { + "re": -131, + "im": -120 + }, + { + "re": -132, + "im": -120 + }, + { + "re": -134, + "im": -119 + }, + { + "re": -135, + "im": -119 + }, + { + "re": -135, + "im": -119 + }, + { + "re": -135, + "im": -119 + }, + { + "re": -135, + "im": -119 + }, + { + "re": -135, + "im": -119 + }, + { + "re": -135, + "im": -119 + }, + { + "re": -135, + "im": -119 + }, + { + "re": -135, + "im": -119 + }, + { + "re": -135, + "im": -118 + }, + { + "re": -135, + "im": -116 + }, + { + "re": -135, + "im": -115 + }, + { + "re": -135, + "im": -114 + }, + { + "re": -135, + "im": -113 + }, + { + "re": -135, + "im": -112 + }, + { + "re": -135, + "im": -112 + }, + { + "re": -135, + "im": -111 + }, + { + "re": -135, + "im": -111 + }, + { + "re": -135, + "im": -110 + }, + { + "re": -135, + "im": -109 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -135, + "im": -108 + }, + { + "re": -134, + "im": -108 + }, + { + "re": -134, + "im": -108 + }, + { + "re": -133, + "im": -108 + }, + { + "re": -132, + "im": -108 + }, + { + "re": -131, + "im": -108 + }, + { + "re": -129, + "im": -108 + }, + { + "re": -127, + "im": -108 + }, + { + "re": -124, + "im": -108 + }, + { + "re": -123, + "im": -108 + }, + { + "re": -121, + "im": -108 + }, + { + "re": -120, + "im": -108 + }, + { + "re": -119, + "im": -108 + }, + { + "re": -117, + "im": -109 + }, + { + "re": -116, + "im": -110 + }, + { + "re": -115, + "im": -110 + }, + { + "re": -113, + "im": -111 + }, + { + "re": -112, + "im": -111 + }, + { + "re": -112, + "im": -111 + }, + { + "re": -111, + "im": -111 + }, + { + "re": -111, + "im": -111 + }, + { + "re": -110, + "im": -111 + }, + { + "re": -108, + "im": -111 + }, + { + "re": -107, + "im": -111 + }, + { + "re": -106, + "im": -111 + }, + { + "re": -104, + "im": -111 + }, + { + "re": -104, + "im": -111 + }, + { + "re": -103, + "im": -111 + }, + { + "re": -103, + "im": -111 + }, + { + "re": -101, + "im": -111 + }, + { + "re": -99, + "im": -111 + }, + { + "re": -98, + "im": -111 + }, + { + "re": -96, + "im": -111 + }, + { + "re": -95, + "im": -111 + }, + { + "re": -95, + "im": -111 + }, + { + "re": -95, + "im": -111 + }, + { + "re": -95, + "im": -111 + }, + { + "re": -94, + "im": -111 + }, + { + "re": -92, + "im": -111 + }, + { + "re": -91, + "im": -111 + }, + { + "re": -90, + "im": -111 + }, + { + "re": -89, + "im": -111 + }, + { + "re": -88, + "im": -111 + }, + { + "re": -88, + "im": -111 + }, + { + "re": -88, + "im": -111 + }, + { + "re": -88, + "im": -111 + }, + { + "re": -87, + "im": -111 + }, + { + "re": -84, + "im": -109 + }, + { + "re": -82, + "im": -109 + }, + { + "re": -81, + "im": -108 + }, + { + "re": -80, + "im": -108 + }, + { + "re": -80, + "im": -108 + }, + { + "re": -80, + "im": -108 + }, + { + "re": -80, + "im": -108 + }, + { + "re": -79, + "im": -108 + }, + { + "re": -78, + "im": -107 + }, + { + "re": -78, + "im": -107 + }, + { + "re": -77, + "im": -107 + }, + { + "re": -77, + "im": -107 + }, + { + "re": -77, + "im": -107 + }, + { + "re": -76, + "im": -106 + }, + { + "re": -75, + "im": -106 + }, + { + "re": -74, + "im": -105 + }, + { + "re": -73, + "im": -104 + }, + { + "re": -73, + "im": -104 + }, + { + "re": -72, + "im": -104 + }, + { + "re": -72, + "im": -103 + }, + { + "re": -71, + "im": -101 + }, + { + "re": -69, + "im": -100 + }, + { + "re": -68, + "im": -99 + }, + { + "re": -67, + "im": -97 + }, + { + "re": -67, + "im": -97 + }, + { + "re": -66, + "im": -96 + }, + { + "re": -66, + "im": -96 + }, + { + "re": -66, + "im": -96 + }, + { + "re": -65, + "im": -94 + }, + { + "re": -65, + "im": -93 + }, + { + "re": -64, + "im": -92 + }, + { + "re": -64, + "im": -92 + }, + { + "re": -64, + "im": -92 + }, + { + "re": -64, + "im": -91 + }, + { + "re": -64, + "im": -91 + }, + { + "re": -64, + "im": -90 + }, + { + "re": -63, + "im": -90 + }, + { + "re": -63, + "im": -88 + }, + { + "re": -63, + "im": -88 + }, + { + "re": -63, + "im": -88 + }, + { + "re": -63, + "im": -87 + }, + { + "re": -63, + "im": -87 + }, + { + "re": -63, + "im": -87 + }, + { + "re": -63, + "im": -86 + }, + { + "re": -63, + "im": -86 + }, + { + "re": -64, + "im": -85 + }, + { + "re": -64, + "im": -84 + }, + { + "re": -64, + "im": -83 + }, + { + "re": -64, + "im": -83 + }, + { + "re": -65, + "im": -82 + }, + { + "re": -65, + "im": -82 + }, + { + "re": -65, + "im": -82 + }, + { + "re": -65, + "im": -81 + }, + { + "re": -65, + "im": -81 + }, + { + "re": -66, + "im": -80 + }, + { + "re": -66, + "im": -80 + }, + { + "re": -66, + "im": -79 + }, + { + "re": -67, + "im": -79 + }, + { + "re": -67, + "im": -79 + }, + { + "re": -67, + "im": -79 + }, + { + "re": -67, + "im": -79 + }, + { + "re": -67, + "im": -79 + }, + { + "re": -68, + "im": -78 + }, + { + "re": -69, + "im": -77 + }, + { + "re": -69, + "im": -76 + }, + { + "re": -70, + "im": -75 + }, + { + "re": -71, + "im": -75 + }, + { + "re": -72, + "im": -74 + }, + { + "re": -72, + "im": -74 + }, + { + "re": -73, + "im": -74 + }, + { + "re": -73, + "im": -74 + }, + { + "re": -73, + "im": -73 + }, + { + "re": -74, + "im": -73 + }, + { + "re": -75, + "im": -72 + }, + { + "re": -77, + "im": -71 + }, + { + "re": -78, + "im": -71 + }, + { + "re": -78, + "im": -71 + }, + { + "re": -78, + "im": -71 + }, + { + "re": -78, + "im": -71 + }, + { + "re": -78, + "im": -71 + }, + { + "re": -79, + "im": -71 + }, + { + "re": -80, + "im": -70 + }, + { + "re": -82, + "im": -70 + }, + { + "re": -83, + "im": -69 + }, + { + "re": -84, + "im": -69 + }, + { + "re": -85, + "im": -68 + }, + { + "re": -85, + "im": -68 + }, + { + "re": -85, + "im": -68 + }, + { + "re": -86, + "im": -68 + }, + { + "re": -87, + "im": -68 + }, + { + "re": -88, + "im": -68 + }, + { + "re": -89, + "im": -68 + }, + { + "re": -89, + "im": -68 + }, + { + "re": -89, + "im": -68 + }, + { + "re": -89, + "im": -68 + }, + { + "re": -91, + "im": -68 + }, + { + "re": -93, + "im": -68 + }, + { + "re": -93, + "im": -68 + }, + { + "re": -93, + "im": -68 + }, + { + "re": -94, + "im": -68 + }, + { + "re": -95, + "im": -68 + }, + { + "re": -97, + "im": -69 + }, + { + "re": -98, + "im": -69 + }, + { + "re": -99, + "im": -69 + }, + { + "re": -99, + "im": -69 + }, + { + "re": -99, + "im": -69 + }, + { + "re": -99, + "im": -69 + }, + { + "re": -100, + "im": -70 + }, + { + "re": -102, + "im": -70 + }, + { + "re": -103, + "im": -71 + }, + { + "re": -105, + "im": -71 + }, + { + "re": -105, + "im": -71 + }, + { + "re": -106, + "im": -71 + }, + { + "re": -106, + "im": -71 + }, + { + "re": -106, + "im": -71 + }, + { + "re": -107, + "im": -71 + }, + { + "re": -108, + "im": -72 + }, + { + "re": -109, + "im": -72 + }, + { + "re": -111, + "im": -72 + }, + { + "re": -111, + "im": -72 + }, + { + "re": -111, + "im": -72 + }, + { + "re": -111, + "im": -72 + }, + { + "re": -111, + "im": -72 + }, + { + "re": -114, + "im": -73 + }, + { + "re": -116, + "im": -73 + }, + { + "re": -118, + "im": -73 + }, + { + "re": -120, + "im": -73 + }, + { + "re": -120, + "im": -73 + }, + { + "re": -120, + "im": -73 + }, + { + "re": -120, + "im": -73 + }, + { + "re": -120, + "im": -74 + }, + { + "re": -122, + "im": -74 + }, + { + "re": -123, + "im": -74 + }, + { + "re": -123, + "im": -74 + }, + { + "re": -123, + "im": -74 + }, + { + "re": -123, + "im": -74 + }, + { + "re": -123, + "im": -74 + }, + { + "re": -123, + "im": -74 + }, + { + "re": -123, + "im": -74 + }, + { + "re": -123, + "im": -74 + }, + { + "re": -123, + "im": -74 + }, + { + "re": -123, + "im": -75 + }, + { + "re": -123, + "im": -77 + }, + { + "re": -123, + "im": -79 + }, + { + "re": -122, + "im": -81 + }, + { + "re": -122, + "im": -82 + }, + { + "re": -121, + "im": -83 + }, + { + "re": -120, + "im": -84 + }, + { + "re": -120, + "im": -86 + }, + { + "re": -119, + "im": -86 + }, + { + "re": -119, + "im": -87 + }, + { + "re": -119, + "im": -87 + }, + { + "re": -118, + "im": -87 + }, + { + "re": -118, + "im": -87 + }, + { + "re": -117, + "im": -88 + }, + { + "re": -115, + "im": -89 + }, + { + "re": -114, + "im": -89 + }, + { + "re": -113, + "im": -90 + }, + { + "re": -112, + "im": -90 + }, + { + "re": -112, + "im": -90 + }, + { + "re": -111, + "im": -90 + }, + { + "re": -111, + "im": -91 + }, + { + "re": -109, + "im": -91 + }, + { + "re": -107, + "im": -92 + }, + { + "re": -106, + "im": -92 + }, + { + "re": -104, + "im": -92 + }, + { + "re": -103, + "im": -92 + }, + { + "re": -103, + "im": -92 + }, + { + "re": -103, + "im": -92 + }, + { + "re": -103, + "im": -92 + }, + { + "re": -101, + "im": -93 + }, + { + "re": -99, + "im": -93 + }, + { + "re": -99, + "im": -93 + }, + { + "re": -98, + "im": -93 + }, + { + "re": -98, + "im": -93 + }, + { + "re": -97, + "im": -93 + }, + { + "re": -96, + "im": -93 + }, + { + "re": -96, + "im": -93 + }, + { + "re": -94, + "im": -93 + }, + { + "re": -93, + "im": -93 + }, + { + "re": -92, + "im": -93 + }, + { + "re": -91, + "im": -93 + }, + { + "re": -90, + "im": -92 + }, + { + "re": -89, + "im": -92 + }, + { + "re": -89, + "im": -92 + }, + { + "re": -89, + "im": -92 + }, + { + "re": -88, + "im": -92 + }, + { + "re": -87, + "im": -91 + }, + { + "re": -86, + "im": -91 + }, + { + "re": -84, + "im": -90 + }, + { + "re": -83, + "im": -88 + }, + { + "re": -83, + "im": -88 + }, + { + "re": -83, + "im": -88 + }, + { + "re": -83, + "im": -88 + }, + { + "re": -83, + "im": -88 + }, + { + "re": -83, + "im": -88 + }, + { + "re": -82, + "im": -87 + }, + { + "re": -82, + "im": -86 + }, + { + "re": -81, + "im": -85 + }, + { + "re": -80, + "im": -84 + }, + { + "re": -80, + "im": -83 + }, + { + "re": -80, + "im": -83 + }, + { + "re": -80, + "im": -83 + }, + { + "re": -80, + "im": -83 + }, + { + "re": -80, + "im": -83 + }, + { + "re": -80, + "im": -82 + }, + { + "re": -80, + "im": -81 + }, + { + "re": -80, + "im": -81 + }, + { + "re": -79, + "im": -80 + }, + { + "re": -79, + "im": -80 + }, + { + "re": -79, + "im": -79 + }, + { + "re": -79, + "im": -79 + }, + { + "re": -79, + "im": -78 + }, + { + "re": -79, + "im": -78 + }, + { + "re": -79, + "im": -76 + }, + { + "re": -80, + "im": -76 + }, + { + "re": -80, + "im": -75 + }, + { + "re": -81, + "im": -75 + }, + { + "re": -81, + "im": -74 + }, + { + "re": -81, + "im": -74 + }, + { + "re": -82, + "im": -73 + }, + { + "re": -83, + "im": -72 + }, + { + "re": -84, + "im": -72 + }, + { + "re": -85, + "im": -71 + }, + { + "re": -85, + "im": -71 + }, + { + "re": -85, + "im": -71 + }, + { + "re": -85, + "im": -71 + }, + { + "re": -86, + "im": -71 + }, + { + "re": -87, + "im": -71 + }, + { + "re": -87, + "im": -71 + }, + { + "re": -88, + "im": -71 + }, + { + "re": -88, + "im": -71 + }, + { + "re": -88, + "im": -71 + }, + { + "re": -89, + "im": -71 + }, + { + "re": -90, + "im": -71 + }, + { + "re": -91, + "im": -71 + }, + { + "re": -91, + "im": -71 + }, + { + "re": -91, + "im": -71 + }, + { + "re": -92, + "im": -71 + }, + { + "re": -93, + "im": -71 + }, + { + "re": -94, + "im": -73 + }, + { + "re": -94, + "im": -74 + }, + { + "re": -95, + "im": -76 + }, + { + "re": -95, + "im": -78 + }, + { + "re": -96, + "im": -79 + }, + { + "re": -97, + "im": -80 + }, + { + "re": -97, + "im": -81 + }, + { + "re": -97, + "im": -81 + }, + { + "re": -97, + "im": -81 + }, + { + "re": -97, + "im": -81 + }, + { + "re": -98, + "im": -81 + }, + { + "re": -98, + "im": -82 + }, + { + "re": -98, + "im": -82 + }, + { + "re": -98, + "im": -82 + }, + { + "re": -98, + "im": -83 + }, + { + "re": -98, + "im": -83 + }, + { + "re": -98, + "im": -83 + }, + { + "re": -98, + "im": -84 + }, + { + "re": -98, + "im": -85 + }, + { + "re": -98, + "im": -86 + }, + { + "re": -98, + "im": -86 + }, + { + "re": -98, + "im": -87 + }, + { + "re": -98, + "im": -87 + }, + { + "re": -98, + "im": -87 + }, + { + "re": -98, + "im": -87 + }, + { + "re": -98, + "im": -88 + }, + { + "re": -98, + "im": -89 + }, + { + "re": -98, + "im": -89 + }, + { + "re": -98, + "im": -89 + }, + { + "re": -98, + "im": -89 + }, + { + "re": -98, + "im": -89 + }, + { + "re": -98, + "im": -89 + }, + { + "re": -98, + "im": -90 + }, + { + "re": -98, + "im": -90 + }, + { + "re": -98, + "im": -90 + }, + { + "re": -97, + "im": -90 + }, + { + "re": -96, + "im": -90 + }, + { + "re": -94, + "im": -90 + }, + { + "re": -92, + "im": -90 + }, + { + "re": -91, + "im": -90 + }, + { + "re": -91, + "im": -90 + }, + { + "re": -91, + "im": -90 + }, + { + "re": -91, + "im": -90 + }, + { + "re": -91, + "im": -90 + }, + { + "re": -90, + "im": -90 + }, + { + "re": -87, + "im": -89 + }, + { + "re": -86, + "im": -88 + }, + { + "re": -85, + "im": -88 + }, + { + "re": -85, + "im": -88 + }, + { + "re": -85, + "im": -88 + }, + { + "re": -85, + "im": -88 + }, + { + "re": -85, + "im": -88 + }, + { + "re": -85, + "im": -88 + }, + { + "re": -84, + "im": -87 + }, + { + "re": -83, + "im": -86 + }, + { + "re": -82, + "im": -86 + }, + { + "re": -82, + "im": -85 + }, + { + "re": -81, + "im": -85 + }, + { + "re": -81, + "im": -84 + }, + { + "re": -80, + "im": -84 + }, + { + "re": -79, + "im": -84 + }, + { + "re": -78, + "im": -84 + }, + { + "re": -76, + "im": -83 + }, + { + "re": -74, + "im": -83 + }, + { + "re": -73, + "im": -83 + }, + { + "re": -72, + "im": -83 + }, + { + "re": -71, + "im": -83 + }, + { + "re": -71, + "im": -83 + }, + { + "re": -70, + "im": -83 + }, + { + "re": -69, + "im": -83 + }, + { + "re": -67, + "im": -83 + }, + { + "re": -66, + "im": -83 + }, + { + "re": -65, + "im": -83 + }, + { + "re": -64, + "im": -83 + }, + { + "re": -64, + "im": -83 + }, + { + "re": -64, + "im": -83 + }, + { + "re": -64, + "im": -83 + }, + { + "re": -63, + "im": -83 + }, + { + "re": -61, + "im": -85 + }, + { + "re": -59, + "im": -85 + }, + { + "re": -57, + "im": -86 + }, + { + "re": -57, + "im": -86 + }, + { + "re": -57, + "im": -86 + }, + { + "re": -57, + "im": -86 + }, + { + "re": -57, + "im": -86 + }, + { + "re": -57, + "im": -86 + }, + { + "re": -56, + "im": -86 + }, + { + "re": -54, + "im": -86 + }, + { + "re": -54, + "im": -86 + }, + { + "re": -54, + "im": -86 + }, + { + "re": -54, + "im": -86 + }, + { + "re": -53, + "im": -86 + }, + { + "re": -53, + "im": -86 + }, + { + "re": -52, + "im": -86 + }, + { + "re": -50, + "im": -84 + }, + { + "re": -50, + "im": -83 + }, + { + "re": -49, + "im": -82 + }, + { + "re": -49, + "im": -80 + }, + { + "re": -49, + "im": -79 + }, + { + "re": -48, + "im": -77 + }, + { + "re": -48, + "im": -76 + }, + { + "re": -48, + "im": -75 + }, + { + "re": -48, + "im": -74 + }, + { + "re": -48, + "im": -72 + }, + { + "re": -46, + "im": -70 + }, + { + "re": -45, + "im": -68 + }, + { + "re": -45, + "im": -65 + }, + { + "re": -45, + "im": -64 + }, + { + "re": -45, + "im": -63 + }, + { + "re": -45, + "im": -62 + }, + { + "re": -45, + "im": -62 + }, + { + "re": -45, + "im": -61 + }, + { + "re": -45, + "im": -61 + }, + { + "re": -45, + "im": -59 + }, + { + "re": -45, + "im": -58 + }, + { + "re": -45, + "im": -57 + }, + { + "re": -45, + "im": -55 + }, + { + "re": -45, + "im": -54 + }, + { + "re": -45, + "im": -53 + }, + { + "re": -45, + "im": -52 + }, + { + "re": -45, + "im": -51 + }, + { + "re": -46, + "im": -50 + }, + { + "re": -46, + "im": -49 + }, + { + "re": -47, + "im": -47 + }, + { + "re": -47, + "im": -46 + }, + { + "re": -47, + "im": -46 + }, + { + "re": -47, + "im": -46 + }, + { + "re": -47, + "im": -45 + }, + { + "re": -47, + "im": -45 + }, + { + "re": -48, + "im": -44 + }, + { + "re": -48, + "im": -43 + }, + { + "re": -49, + "im": -41 + }, + { + "re": -49, + "im": -39 + }, + { + "re": -49, + "im": -39 + }, + { + "re": -49, + "im": -39 + }, + { + "re": -49, + "im": -39 + }, + { + "re": -49, + "im": -39 + }, + { + "re": -49, + "im": -39 + }, + { + "re": -50, + "im": -38 + }, + { + "re": -50, + "im": -37 + }, + { + "re": -50, + "im": -36 + }, + { + "re": -51, + "im": -35 + }, + { + "re": -52, + "im": -34 + }, + { + "re": -52, + "im": -33 + }, + { + "re": -53, + "im": -33 + }, + { + "re": -54, + "im": -31 + }, + { + "re": -54, + "im": -31 + }, + { + "re": -54, + "im": -30 + }, + { + "re": -54, + "im": -29 + }, + { + "re": -54, + "im": -29 + }, + { + "re": -54, + "im": -29 + }, + { + "re": -55, + "im": -28 + }, + { + "re": -56, + "im": -28 + }, + { + "re": -56, + "im": -28 + }, + { + "re": -56, + "im": -27 + }, + { + "re": -56, + "im": -26 + }, + { + "re": -56, + "im": -26 + }, + { + "re": -56, + "im": -26 + }, + { + "re": -57, + "im": -26 + }, + { + "re": -57, + "im": -25 + }, + { + "re": -58, + "im": -25 + }, + { + "re": -59, + "im": -24 + }, + { + "re": -59, + "im": -24 + }, + { + "re": -59, + "im": -24 + }, + { + "re": -60, + "im": -24 + }, + { + "re": -60, + "im": -24 + }, + { + "re": -60, + "im": -23 + }, + { + "re": -61, + "im": -22 + }, + { + "re": -61, + "im": -22 + }, + { + "re": -62, + "im": -22 + }, + { + "re": -62, + "im": -22 + }, + { + "re": -62, + "im": -22 + }, + { + "re": -62, + "im": -21 + }, + { + "re": -62, + "im": -21 + }, + { + "re": -64, + "im": -20 + }, + { + "re": -64, + "im": -20 + }, + { + "re": -64, + "im": -20 + }, + { + "re": -64, + "im": -20 + }, + { + "re": -64, + "im": -20 + }, + { + "re": -64, + "im": -20 + }, + { + "re": -64, + "im": -19 + }, + { + "re": -64, + "im": -18 + }, + { + "re": -64, + "im": -18 + }, + { + "re": -64, + "im": -18 + }, + { + "re": -64, + "im": -18 + }, + { + "re": -64, + "im": -17 + }, + { + "re": -64, + "im": -15 + }, + { + "re": -64, + "im": -13 + }, + { + "re": -64, + "im": -12 + }, + { + "re": -63, + "im": -11 + }, + { + "re": -63, + "im": -10 + }, + { + "re": -62, + "im": -10 + }, + { + "re": -62, + "im": -9 + }, + { + "re": -62, + "im": -9 + }, + { + "re": -62, + "im": -8 + }, + { + "re": -62, + "im": -6 + }, + { + "re": -61, + "im": -6 + }, + { + "re": -61, + "im": -5 + }, + { + "re": -61, + "im": -5 + }, + { + "re": -61, + "im": -5 + }, + { + "re": -61, + "im": -5 + }, + { + "re": -61, + "im": -5 + }, + { + "re": -61, + "im": -4 + }, + { + "re": -61, + "im": -4 + }, + { + "re": -61, + "im": -3 + }, + { + "re": -61, + "im": -3 + }, + { + "re": -61, + "im": -3 + }, + { + "re": -60, + "im": -2 + }, + { + "re": -59, + "im": -1 + }, + { + "re": -58, + "im": 0 + }, + { + "re": -58, + "im": 0 + }, + { + "re": -58, + "im": 0 + }, + { + "re": -58, + "im": 0 + }, + { + "re": -58, + "im": 0 + }, + { + "re": -58, + "im": 1 + }, + { + "re": -57, + "im": 3 + }, + { + "re": -55, + "im": 5 + }, + { + "re": -54, + "im": 7 + }, + { + "re": -53, + "im": 8 + }, + { + "re": -53, + "im": 8 + }, + { + "re": -53, + "im": 8 + }, + { + "re": -53, + "im": 8 + }, + { + "re": -53, + "im": 8 + }, + { + "re": -53, + "im": 8 + }, + { + "re": -53, + "im": 8 + }, + { + "re": -52, + "im": 8 + }, + { + "re": -50, + "im": 8 + }, + { + "re": -50, + "im": 9 + }, + { + "re": -49, + "im": 9 + }, + { + "re": -49, + "im": 9 + }, + { + "re": -49, + "im": 9 + }, + { + "re": -49, + "im": 9 + }, + { + "re": -49, + "im": 8 + }, + { + "re": -48, + "im": 6 + }, + { + "re": -48, + "im": 6 + }, + { + "re": -48, + "im": 6 + }, + { + "re": -48, + "im": 6 + }, + { + "re": -48, + "im": 6 + }, + { + "re": -48, + "im": 6 + }, + { + "re": -49, + "im": 5 + }, + { + "re": -50, + "im": 4 + }, + { + "re": -51, + "im": 4 + }, + { + "re": -52, + "im": 3 + }, + { + "re": -52, + "im": 3 + }, + { + "re": -52, + "im": 3 + }, + { + "re": -53, + "im": 3 + }, + { + "re": -54, + "im": 2 + }, + { + "re": -54, + "im": 1 + }, + { + "re": -55, + "im": 0 + }, + { + "re": -55, + "im": 0 + }, + { + "re": -56, + "im": 0 + }, + { + "re": -56, + "im": 0 + }, + { + "re": -56, + "im": -1 + }, + { + "re": -57, + "im": -1 + }, + { + "re": -57, + "im": -1 + }, + { + "re": -57, + "im": -2 + }, + { + "re": -58, + "im": -3 + }, + { + "re": -58, + "im": -3 + }, + { + "re": -58, + "im": -3 + }, + { + "re": -58, + "im": -3 + }, + { + "re": -58, + "im": -3 + }, + { + "re": -58, + "im": -3 + }, + { + "re": -58, + "im": -3 + }, + { + "re": -58, + "im": -3 + }, + { + "re": -58, + "im": -3 + }, + { + "re": -58, + "im": -3 + }, + { + "re": -58, + "im": -3 + }, + { + "re": -58, + "im": -2 + }, + { + "re": -58, + "im": -2 + }, + { + "re": -58, + "im": -2 + }, + { + "re": -58, + "im": -2 + }, + { + "re": -58, + "im": -2 + }, + { + "re": -58, + "im": -1 + }, + { + "re": -58, + "im": -1 + }, + { + "re": -58, + "im": -1 + }, + { + "re": -57, + "im": 0 + }, + { + "re": -57, + "im": 1 + }, + { + "re": -57, + "im": 2 + }, + { + "re": -57, + "im": 2 + }, + { + "re": -57, + "im": 2 + }, + { + "re": -57, + "im": 2 + }, + { + "re": -57, + "im": 3 + }, + { + "re": -55, + "im": 5 + }, + { + "re": -54, + "im": 7 + }, + { + "re": -54, + "im": 8 + }, + { + "re": -54, + "im": 8 + }, + { + "re": -54, + "im": 8 + }, + { + "re": -54, + "im": 8 + }, + { + "re": -54, + "im": 8 + }, + { + "re": -54, + "im": 8 + }, + { + "re": -53, + "im": 9 + }, + { + "re": -52, + "im": 10 + }, + { + "re": -51, + "im": 12 + }, + { + "re": -50, + "im": 12 + }, + { + "re": -50, + "im": 12 + }, + { + "re": -50, + "im": 12 + }, + { + "re": -50, + "im": 12 + }, + { + "re": -50, + "im": 12 + }, + { + "re": -50, + "im": 12 + }, + { + "re": -49, + "im": 12 + }, + { + "re": -48, + "im": 13 + }, + { + "re": -46, + "im": 13 + }, + { + "re": -45, + "im": 14 + }, + { + "re": -44, + "im": 14 + }, + { + "re": -43, + "im": 14 + }, + { + "re": -42, + "im": 14 + }, + { + "re": -42, + "im": 14 + }, + { + "re": -41, + "im": 14 + }, + { + "re": -40, + "im": 14 + }, + { + "re": -38, + "im": 14 + }, + { + "re": -38, + "im": 14 + }, + { + "re": -38, + "im": 14 + }, + { + "re": -38, + "im": 14 + }, + { + "re": -37, + "im": 14 + }, + { + "re": -36, + "im": 14 + }, + { + "re": -36, + "im": 14 + }, + { + "re": -34, + "im": 13 + }, + { + "re": -34, + "im": 13 + }, + { + "re": -33, + "im": 13 + }, + { + "re": -32, + "im": 13 + }, + { + "re": -31, + "im": 13 + }, + { + "re": -30, + "im": 13 + }, + { + "re": -28, + "im": 13 + }, + { + "re": -28, + "im": 13 + }, + { + "re": -28, + "im": 12 + }, + { + "re": -28, + "im": 12 + }, + { + "re": -27, + "im": 12 + }, + { + "re": -26, + "im": 12 + }, + { + "re": -24, + "im": 12 + }, + { + "re": -23, + "im": 11 + }, + { + "re": -22, + "im": 11 + }, + { + "re": -22, + "im": 11 + }, + { + "re": -22, + "im": 11 + }, + { + "re": -22, + "im": 10 + }, + { + "re": -22, + "im": 10 + }, + { + "re": -22, + "im": 10 + }, + { + "re": -21, + "im": 10 + }, + { + "re": -21, + "im": 10 + }, + { + "re": -20, + "im": 9 + }, + { + "re": -20, + "im": 8 + }, + { + "re": -20, + "im": 7 + }, + { + "re": -20, + "im": 6 + }, + { + "re": -20, + "im": 5 + }, + { + "re": -20, + "im": 4 + }, + { + "re": -20, + "im": 4 + }, + { + "re": -20, + "im": 3 + }, + { + "re": -20, + "im": 2 + }, + { + "re": -21, + "im": 0 + }, + { + "re": -21, + "im": 0 + }, + { + "re": -22, + "im": 0 + }, + { + "re": -22, + "im": 0 + }, + { + "re": -22, + "im": 0 + }, + { + "re": -22, + "im": 0 + }, + { + "re": -22, + "im": -1 + }, + { + "re": -23, + "im": -2 + }, + { + "re": -24, + "im": -3 + }, + { + "re": -24, + "im": -3 + }, + { + "re": -25, + "im": -4 + }, + { + "re": -26, + "im": -4 + }, + { + "re": -26, + "im": -4 + }, + { + "re": -26, + "im": -4 + }, + { + "re": -27, + "im": -4 + }, + { + "re": -27, + "im": -4 + }, + { + "re": -28, + "im": -5 + }, + { + "re": -29, + "im": -5 + }, + { + "re": -29, + "im": -5 + }, + { + "re": -29, + "im": -5 + }, + { + "re": -29, + "im": -5 + }, + { + "re": -29, + "im": -5 + }, + { + "re": -30, + "im": -5 + }, + { + "re": -31, + "im": -5 + }, + { + "re": -31, + "im": -5 + }, + { + "re": -31, + "im": -3 + }, + { + "re": -31, + "im": -2 + }, + { + "re": -31, + "im": -1 + }, + { + "re": -30, + "im": -1 + }, + { + "re": -30, + "im": -1 + }, + { + "re": -30, + "im": -1 + }, + { + "re": -30, + "im": -1 + }, + { + "re": -30, + "im": 0 + }, + { + "re": -30, + "im": 1 + }, + { + "re": -30, + "im": 2 + }, + { + "re": -30, + "im": 2 + }, + { + "re": -30, + "im": 3 + }, + { + "re": -29, + "im": 3 + }, + { + "re": -29, + "im": 3 + }, + { + "re": -29, + "im": 3 + }, + { + "re": -29, + "im": 3 + }, + { + "re": -29, + "im": 4 + }, + { + "re": -29, + "im": 4 + }, + { + "re": -29, + "im": 5 + }, + { + "re": -29, + "im": 5 + }, + { + "re": -29, + "im": 5 + }, + { + "re": -28, + "im": 6 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + }, + { + "re": -28, + "im": 7 + } + ] +} diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000..0f8a880 Binary files /dev/null and b/assets/icon.png differ diff --git a/gui.png b/gui.png new file mode 100644 index 0000000..b30374b Binary files /dev/null and b/gui.png differ diff --git a/src/constants.rs b/src/constants.rs new file mode 100644 index 0000000..7f0bca6 --- /dev/null +++ b/src/constants.rs @@ -0,0 +1,21 @@ +pub const APP_NAME: &str = "JP2GMD - Matrix Calculator"; +pub const DEFAULT_WIDTH: f32 = 800.0; +pub const DEFAULT_HEIGHT: f32 = 600.0; +pub const DEFAULT_LEFT_PANEL_WIDTH: f32 = DEFAULT_WIDTH * 0.20; + +pub const TEXT_COLOR: egui::Color32 = egui::Color32::LIGHT_GRAY; +pub const FONT_ID: egui::FontId = egui::FontId::proportional(18.); + +pub const MATRIX_HPADDING: f32 = 15.; +pub const MATRIX_VPADDING: f32 = 8.; +pub const FRACTION_FONT_SIZE_RATIO: f32 = 0.8; +pub const FRACTION_HMARGIN: f32 = 2.; +pub const FRACTION_VMARGIN: f32 = 1.; +pub const FRACTION_LINE_WIDTH: f32 = 1.; +pub const VALUE_PADDING: f32 = 15.; + +pub const FLOAT_STRING_PRECISION: usize = 3; + +pub const ICON_PATH: &str = "assets/icon.png"; +#[cfg(feature = "fft")] +pub const DFT_PATH: &str = "assets/dft_result.json"; diff --git a/src/editor_gui.rs b/src/editor_gui.rs new file mode 100644 index 0000000..396b196 --- /dev/null +++ b/src/editor_gui.rs @@ -0,0 +1,232 @@ +use crate::env_gui::insert_to_env; +use crate::environment::{Environment, Identifier, Type}; +use crate::locale::Locale; +use crate::matrices::Matrix; +use crate::parser::parse_expression; +use crate::traits::MatrixNumber; +use crate::{State, WindowState}; +use anyhow::bail; +use egui::{Sense, Ui}; +use std::collections::HashMap; + +pub enum EditorType { + Matrix(usize, usize, Vec), + Scalar(String), +} + +pub struct EditorContent { + identifier_name: String, + editor_type: EditorType, +} + +#[derive(Default)] +pub struct EditorState { + editor_content: Option, +} + +pub fn display_editor(ctx: &egui::Context, state: &mut State, locale: &Locale) { + if let Some(editor_content) = &mut state.editor.editor_content { + let result = display_editor_is_some::( + ctx, + editor_content, + &mut state.env, + &mut state.windows, + locale, + ); + match result { + Ok(true) => { + state.editor.editor_content = None; + } + Ok(false) => {} + Err(_) => { + panic!("It shouldn't return Err") + } + } + } +} + +pub fn set_editor_to_matrix(state: &mut EditorState, def: &str) { + const DEFAULT_ROWS: usize = 2; + const DEFAULT_COLS: usize = 3; + state.editor_content = Some(EditorContent { + identifier_name: "".to_string(), + editor_type: EditorType::Matrix( + DEFAULT_ROWS, + DEFAULT_COLS, + vec![String::from(def); DEFAULT_ROWS * DEFAULT_COLS], + ), + }); +} + +pub fn set_editor_to_existing_matrix( + state: &mut EditorState, + matrix: &Matrix, + name: String, +) { + let (w, h) = matrix.get_shape(); + let data: Vec = matrix.clone().into(); + let data = data.iter().map(|el| el.to_string()).collect(); + state.editor_content = Some(EditorContent { + identifier_name: name, + editor_type: EditorType::Matrix(w, h, data), + }); +} + +pub fn set_editor_to_scalar(state: &mut EditorState, def: &str) { + state.editor_content = Some(EditorContent { + identifier_name: "".to_string(), + editor_type: EditorType::Scalar(String::from(def)), + }); +} + +pub fn set_editor_to_existing_scalar( + state: &mut EditorState, + value: &K, + name: String, +) { + state.editor_content = Some(EditorContent { + identifier_name: name, + editor_type: EditorType::Scalar(value.to_string()), + }) +} + +fn display_editor_is_some( + ctx: &egui::Context, + content: &mut EditorContent, + env: &mut Environment, + windows: &mut HashMap, + locale: &Locale, +) -> anyhow::Result { + let mut handled: anyhow::Result = Ok(false); + let mut editor_opened = true; + + egui::Window::new(locale.get_translated("Editor")) + .open(&mut editor_opened) + .show(ctx, |ui| { + let EditorContent { + identifier_name, + editor_type, + } = content; + ui.label(locale.get_translated("Identifier:")); + ui.text_edit_singleline(identifier_name); + let result = match editor_type { + EditorType::Matrix(h, w, data) => { + display_matrix_editor((h, w), data, ui, locale); + parse_matrix_data::((h, w), data, env) + } + EditorType::Scalar(data) => { + display_scalar_editor(data, ui, locale); + parse_scalar_data::(data, env) + } + }; + let mut err_msg = if Identifier::is_valid(identifier_name) { + None + } else { + Some(locale.get_translated("Identifier is invalid!")) + }; + if let Err(err) = &result { + err_msg = Some( + locale.get_translated("Matrix is invalid!") + "\n" + err.to_string().as_str(), + ); + }; + ui.horizontal(|ui| { + let sense = if err_msg.is_some() { + Sense::hover() + } else { + Sense::click() + }; + let add_button = + ui.add(egui::Button::new(locale.get_translated("Add")).sense(sense)); + if let Some(some) = &err_msg { + ui.label(locale.get_translated("Error ") + some); + } else if add_button.clicked() { + insert_to_env( + env, + Identifier::new(identifier_name.to_string()).expect("Should work"), + result.expect("There should be a value."), + windows, + ); + handled = Ok(true); + }; + }) + }); + + // Editor was closed + if !editor_opened { + handled = Ok(true); + } + + handled +} + +fn parse_matrix_data( + (h, w): (&mut usize, &mut usize), + data: &mut [String], + env: &Environment, +) -> anyhow::Result> { + let mut result: Vec = vec![]; + for element in data.iter() { + result.push(parse_scalar_with_env(element, env)?) + } + Ok(Type::Matrix(Matrix::from_vec(result, (*h, *w))?)) +} + +fn parse_scalar_data( + data: &mut str, + env: &Environment, +) -> anyhow::Result> { + Ok(Type::Scalar(parse_scalar_with_env(data, env)?)) +} + +fn parse_scalar_with_env(data: &str, env: &Environment) -> anyhow::Result { + match parse_expression(data, env)? { + Type::Scalar(scalar) => Ok(scalar), + Type::Matrix(_) => bail!("Invalid expression! Result is not a scalar."), + } +} + +fn display_matrix_editor( + (h, w): (&mut usize, &mut usize), + data: &mut Vec, + ui: &mut Ui, + locale: &Locale, +) { + ui.label(locale.get_translated("Enter the matrix:")); + egui::Grid::new("dimensions").show(ui, |ui| { + ui.label(locale.get_translated("Height")); + ui.add(egui::DragValue::new(h)); + ui.end_row(); + ui.label(locale.get_translated("Width")); + ui.add(egui::DragValue::new(w)); + ui.end_row(); + }); + ui.separator(); + if data.len() != *h * *w { + data.resize(*h * *w, String::from("0")); + } + + egui::Grid::new("matrix_editor").show(ui, |ui| { + ui.label(""); + for j in 0..*w { + ui.label(format!("{}", j + 1).as_str()); + } + ui.end_row(); + for i in 0..*h { + ui.label(format!("{}", i + 1).as_str()); + for j in 0..*w { + display_k_editor((i, j), data, ui, *w); + } + ui.end_row(); + } + }); +} + +fn display_k_editor((i, j): (usize, usize), data: &mut [String], ui: &mut Ui, width: usize) { + let id = i * width + j; + ui.add(egui::TextEdit::singleline(&mut data[id])); +} + +fn display_scalar_editor(data: &mut String, ui: &mut Ui, locale: &Locale) { + ui.label(locale.get_translated("Enter the scalar:")); + ui.add(egui::TextEdit::singleline(data)); +} diff --git a/src/env_gui.rs b/src/env_gui.rs new file mode 100644 index 0000000..fffa508 --- /dev/null +++ b/src/env_gui.rs @@ -0,0 +1,14 @@ +use crate::environment::{Environment, Identifier, Type}; +use crate::traits::MatrixNumber; +use crate::WindowState; +use std::collections::HashMap; + +pub fn insert_to_env( + env: &mut Environment, + identifier: Identifier, + value: Type, + windows: &mut HashMap, +) { + env.insert(identifier.clone(), value); + windows.insert(identifier, WindowState { is_open: true }); +} diff --git a/src/environment.rs b/src/environment.rs new file mode 100644 index 0000000..4b84af5 --- /dev/null +++ b/src/environment.rs @@ -0,0 +1,224 @@ +use std::collections::btree_map::IterMut; +use std::collections::BTreeMap; + +use anyhow::{bail, Context}; + +use crate::locale::Locale; +use crate::traits::{GuiDisplayable, LaTeXable}; +use crate::{matrices::Matrix, traits::MatrixNumber}; + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Ord, PartialOrd)] +pub struct Identifier { + id: String, +} + +impl Identifier { + pub const RESULT: &'static str = "$"; + + pub fn new(id: String) -> anyhow::Result { + if Self::is_valid(&id) { + Ok(Self { id }) + } else { + bail!("Invalid identifier.") + } + } + + fn new_unsafe(id: String) -> Self { + Self { id } + } + + pub fn result() -> Self { + Self { + id: Self::RESULT.to_string(), + } + } + + pub fn is_result(&self) -> bool { + self.id == Self::RESULT + } + + pub fn is_valid(id: &str) -> bool { + id.chars().all(|c| c.is_alphanumeric() || c == '_') + && id.starts_with(|c: char| c.is_alphabetic() || c == '_') + } +} + +impl ToString for Identifier { + fn to_string(&self) -> String { + self.id.clone() + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum Type { + Scalar(T), + Matrix(Matrix), +} + +impl Type { + pub fn from_scalar_option(opt: Option) -> anyhow::Result { + match opt { + Some(val) => Ok(Self::Scalar(val)), + None => Err(anyhow::anyhow!( + "Arithmetic operation resulted in overflow!" + )), + } + } + + pub fn from_matrix_result(opt: anyhow::Result>) -> anyhow::Result { + Ok(Self::Matrix(opt?)) + } + + pub fn into_scalar(self) -> anyhow::Result { + match self { + Type::Scalar(s) => Ok(s), + Type::Matrix(_) => bail!("Expected scalar, got matrix."), + } + } + + pub fn into_matrix(self) -> anyhow::Result> { + match self { + Type::Matrix(m) => Ok(m), + Type::Scalar(_) => bail!("Expected matrix, got scalar."), + } + } +} + +impl ToString for Type { + fn to_string(&self) -> String { + match self { + Type::Scalar(s) => s.to_string(), + Type::Matrix(m) => m.to_string(), + } + } +} + +impl GuiDisplayable for Type { + fn display_string(&self, locale: &Locale) -> String { + match self { + Type::Scalar(s) => s.display_string(locale), + Type::Matrix(m) => m.display_string(locale), + } + } + + fn to_shape( + &self, + ctx: &egui::Context, + font_id: egui::FontId, + color: egui::Color32, + ) -> egui::Shape { + match self { + Type::Scalar(s) => s.to_shape(ctx, font_id, color), + Type::Matrix(m) => m.to_shape(ctx, font_id, color), + } + } +} + +impl LaTeXable for Type { + fn to_latex(&self) -> String { + match self { + Type::Scalar(s) => s as &dyn LaTeXable, + Type::Matrix(m) => m, + } + .to_latex() + } +} + +pub type Callable = dyn Fn(Type) -> anyhow::Result>; + +fn builtin_functions() -> BTreeMap>> { + BTreeMap::from([ + ( + Identifier::new_unsafe("transpose".to_string()), + Box::new(|t: Type| Ok(Type::Matrix(t.into_matrix()?.transpose()))) + as Box>, + ), + ( + Identifier::new_unsafe("identity".to_string()), + Box::new(|t: Type| { + Ok(Type::Matrix(Matrix::identity( + t.into_scalar()? + .to_usize() + .context("Invalid identity argument")?, + ))) + }) as Box>, + ), + ( + Identifier::new_unsafe("inverse".to_string()), + Box::new(|t: Type| Ok(Type::Matrix(t.into_matrix()?.inverse()?.result))) + as Box>, + ), + ]) +} + +pub struct Environment { + env: BTreeMap>, + fun: BTreeMap>>, +} + +impl Environment { + pub fn new() -> Self { + Self { + env: BTreeMap::new(), + fun: builtin_functions(), + } + } + + pub fn insert(&mut self, id: Identifier, value: Type) { + self.env.insert(id, value); + } + + pub fn get_value(&self, id: &Identifier) -> Option<&Type> { + self.env.get(id) + } + + pub fn get_function(&self, id: &Identifier) -> Option<&Callable> { + self.fun.get(id).map(|f| f.as_ref()) + } + + pub fn iter_mut(&mut self) -> IterMut<'_, Identifier, Type> { + self.env.iter_mut() + } +} + +impl Default for Environment { + fn default() -> Self { + Self::new() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_identifier_validation() { + assert!(Identifier::is_valid("f32_sdsa3_")); + assert!(Identifier::is_valid("_fsd3_")); + assert!(!Identifier::is_valid("4fd")); + assert!(!Identifier::is_valid("")); + assert!(!Identifier::is_valid("gdfg+gdf")); + } + + #[test] + fn test_identifier_new() { + assert!(matches!(Identifier::new("pociąg".to_string()), Ok(_))); + assert!(matches!(Identifier::new("32".to_string()), Err(_))); + assert!(matches!(Identifier::new("".to_string()), Err(_))); + } + + #[test] + fn test_env_contains_std_fun() { + let env = Environment::::new(); + + assert!(env + .get_function(&Identifier::new_unsafe("transpose".to_string())) + .is_some()); + assert!(env + .get_function(&Identifier::new_unsafe("identity".to_string())) + .is_some()); + assert!(env + .get_function(&Identifier::new_unsafe("inverse".to_string())) + .is_some()); + } +} diff --git a/src/float.rs b/src/float.rs new file mode 100644 index 0000000..e7ce891 --- /dev/null +++ b/src/float.rs @@ -0,0 +1,310 @@ +use crate::constants::FLOAT_STRING_PRECISION; +use crate::locale::Locale; +use crate::traits::{GuiDisplayable, LaTeXable}; +use eframe::epaint::{Color32, FontId, Shape, TextShape}; +use egui::{pos2, Context}; +use num_traits::{ + CheckedAdd, CheckedDiv, CheckedMul, CheckedSub, FromPrimitive, Num, One, Signed, ToPrimitive, + Zero, +}; +use std::ops::{Add, Div, Mul, Neg, Rem, Sub}; +use std::str::FromStr; + +#[derive(Debug, Clone, Copy)] +pub struct Float64 { + value: f64, +} + +impl Num for Float64 { + type FromStrRadixErr = ::FromStrRadixErr; + + fn from_str_radix(str: &str, radix: u32) -> Result { + ::from_str_radix(str, radix).map(|v| v.into()) + } +} + +impl PartialEq for Float64 { + fn eq(&self, other: &Self) -> bool { + ::eq(&self.value, &other.value) + } +} + +impl From for f64 { + fn from(value: Float64) -> Self { + value.value + } +} + +impl From for Float64 { + fn from(value: f64) -> Self { + Float64 { value } + } +} + +impl Zero for Float64 { + fn zero() -> Self { + ::zero().into() + } + + fn is_zero(&self) -> bool { + ::is_zero(&self.value) + } +} + +impl Add for Float64 { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + self.value.add(rhs.value).into() + } +} + +impl One for Float64 { + fn one() -> Self { + ::one().into() + } +} + +impl Mul for Float64 { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + self.value.mul(rhs.value).into() + } +} + +impl Sub for Float64 { + type Output = Self; + + fn sub(self, rhs: Self) -> Self::Output { + self.value.sub(rhs.value).into() + } +} + +impl Div for Float64 { + type Output = Self; + + fn div(self, rhs: Self) -> Self::Output { + self.value.div(rhs.value).into() + } +} + +impl Rem for Float64 { + type Output = Self; + + fn rem(self, rhs: Self) -> Self::Output { + self.value.rem(rhs.value).into() + } +} + +impl CheckedAdd for Float64 { + fn checked_add(&self, v: &Self) -> Option { + Some(self.value.add(v.value).into()) + } +} + +impl CheckedSub for Float64 { + fn checked_sub(&self, v: &Self) -> Option { + Some(self.value.sub(v.value).into()) + } +} + +impl CheckedMul for Float64 { + fn checked_mul(&self, v: &Self) -> Option { + Some(self.value.mul(v.value).into()) + } +} + +impl CheckedDiv for Float64 { + fn checked_div(&self, v: &Self) -> Option { + if v.is_zero() { + return None; + } + Some(self.value.div(v.value).into()) + } +} + +impl FromPrimitive for Float64 { + fn from_i64(n: i64) -> Option { + Some((n as f64).into()) + } + + fn from_u64(n: u64) -> Option { + Some((n as f64).into()) + } +} + +impl ToPrimitive for Float64 { + fn to_i64(&self) -> Option { + Some(self.value as i64) + } + + fn to_u64(&self) -> Option { + Some(self.value as u64) + } +} + +impl Signed for Float64 { + fn abs(&self) -> Self { + self.value.abs().into() + } + + fn abs_sub(&self, other: &Self) -> Self { + (self.value - other.value).abs().into() + } + + fn signum(&self) -> Self { + self.value.signum().into() + } + + fn is_positive(&self) -> bool { + self.value.is_sign_positive() + } + + fn is_negative(&self) -> bool { + self.value.is_sign_negative() + } +} + +impl Neg for Float64 { + type Output = Self; + + fn neg(self) -> Self::Output { + self.value.neg().into() + } +} + +impl FromStr for Float64 { + type Err = (); + + fn from_str(s: &str) -> Result { + s.parse::().map(|v| v.into()).map_err(|_| ()) + } +} + +impl ToString for Float64 { + fn to_string(&self) -> String { + self.value.to_string() + } +} + +impl LaTeXable for Float64 { + fn to_latex(&self) -> String { + self.value.to_latex() + } +} + +impl GuiDisplayable for Float64 { + fn display_string(&self, locale: &Locale) -> String { + self.value.display_string(locale) + } + + fn to_shape(&self, ctx: &Context, font_id: FontId, color: Color32) -> Shape { + self.value.to_shape(ctx, font_id, color) + } +} + +impl LaTeXable for f64 { + fn to_latex(&self) -> String { + trim_trailing_zeros_float_str(&format!("{:.*}", FLOAT_STRING_PRECISION, self)) + } +} + +/// Trims trailing zeros from a float string. +/// # Arguments +/// * `s` - String to trim zeros from +/// # Returns +/// A string representing the same floating point number, but without trailing zeros +/// # Examples +/// ```rust +/// # use crate::jp2gmd_lib::trim_trailing_zeros_float_str; +/// assert_eq!(trim_trailing_zeros_float_str("10.0"), "10"); +/// assert_eq!(trim_trailing_zeros_float_str("123.450"), "123.45"); +/// assert_eq!(trim_trailing_zeros_float_str("1.0"), "1"); +/// ``` +pub fn trim_trailing_zeros_float_str(s: &str) -> String { + let mut s = s.to_string(); + if s.contains('.') { + s = s.trim_end_matches('0').to_string(); + if s.ends_with('.') { + s.pop(); + } + } + s +} + +impl GuiDisplayable for f64 { + fn display_string(&self, _locale: &Locale) -> String { + self.to_latex() + } + + fn to_shape(&self, ctx: &Context, font_id: FontId, color: Color32) -> Shape { + let text_shape = TextShape::new( + pos2(0., 0.), + ctx.fonts(|f| f.layout_no_wrap(self.to_latex(), font_id, color)), + ); + Shape::Text(text_shape) + } +} + +#[cfg(test)] +mod test { + use super::*; + use crate::locale::Language; + + #[test] + fn test_zeros() { + assert_eq!(Float64::from_str("0").unwrap(), 0.0.into()); + assert_eq!(Float64::from_str("0.0").unwrap(), 0.0.into()); + assert_eq!(Float64::from_str("0.00").unwrap(), 0.0.into()); + assert_eq!(Float64::from_str("0.000").unwrap(), 0.0.into()); + } + + #[test] + fn test_zeros_to_string() { + assert_eq!(Float64::from_str("0").unwrap().to_string(), "0"); + assert_eq!(Float64::from_str("0.0").unwrap().to_string(), "0"); + assert_eq!(Float64::from_str("0.00").unwrap().to_string(), "0"); + assert_eq!(Float64::from_str("0.000").unwrap().to_string(), "0"); + } + + #[test] + fn test_trim_trailing_zeros_float_str() { + assert_eq!(trim_trailing_zeros_float_str("10.0"), "10"); + assert_eq!(trim_trailing_zeros_float_str("123.450"), "123.45"); + assert_eq!(trim_trailing_zeros_float_str("1.0"), "1"); + } + + #[test] + fn test_float64_from_str() { + assert_eq!(Float64::from_str("10.0").unwrap(), 10.0.into()); + assert_eq!(Float64::from_str("123.450").unwrap(), 123.45.into()); + assert_eq!(Float64::from_str("1.0").unwrap(), 1.0.into()); + } + + #[test] + fn test_float64_to_latex() { + assert_eq!(Float64::from_str("10.0").unwrap().to_latex(), "10"); + assert_eq!(Float64::from_str("123.450").unwrap().to_latex(), "123.45"); + assert_eq!(Float64::from_str("1.0").unwrap().to_latex(), "1"); + } + + #[test] + fn test_float64_display_string() { + let locale = Locale::new(Language::English); + assert_eq!( + Float64::from_str("10.0").unwrap().display_string(&locale), + "10" + ); + assert_eq!( + Float64::from_str("123.450") + .unwrap() + .display_string(&locale), + "123.45" + ); + assert_eq!( + Float64::from_str("1.0").unwrap().display_string(&locale), + "1" + ); + } +} diff --git a/src/fourier.rs b/src/fourier.rs new file mode 100644 index 0000000..ccfbd66 --- /dev/null +++ b/src/fourier.rs @@ -0,0 +1,138 @@ +use eframe::epaint::{Color32, Shape}; +use egui::{Painter, Pos2, Stroke, Ui}; +use itertools::Itertools; +use serde::{Deserialize, Serialize}; +use std::f32::consts::PI; +use std::fs::File; +use std::io::BufReader; + +pub struct Fourier { + data: FourierData, + time: f32, + path: Vec<(f32, f32)>, +} + +#[derive(Serialize, Deserialize)] +struct FourierData { + epicycles: Vec, + metadata: FourierMetadata, +} + +#[derive(Serialize, Deserialize)] +struct FourierMetadata { + height: f32, + width: f32, +} + +#[derive(Serialize, Deserialize)] +struct FourierEpicycle { + re: f32, + im: f32, + freq: f32, + amp: f32, + phase: f32, +} + +impl Fourier { + pub fn from_json_file(file: String) -> anyhow::Result { + let file = File::open(file)?; + let reader = BufReader::new(file); + let mut fourier: FourierData = serde_json::from_reader(reader)?; + fourier.epicycles.sort_by(|a, b| b.amp.total_cmp(&a.amp)); + + Ok(Fourier { + data: fourier, + time: 0.0, + path: vec![], + }) + } + + pub fn ui(&mut self, ui: &mut Ui, left_offset: f32, top_offset: f32) { + let left_offset = left_offset + ui.available_rect_before_wrap().width() / 2.; + let top_offset = top_offset + ui.available_rect_before_wrap().height() / 2.; + + let img_scalar = Self::img_scalars( + (&self.data.metadata.width, &self.data.metadata.height), + ( + &ui.available_rect_before_wrap().width(), + &ui.available_rect_before_wrap().height(), + ), + ); + + ui.ctx().request_repaint(); + let painter = Painter::new( + ui.ctx().clone(), + ui.layer_id(), + ui.available_rect_before_wrap(), + ); + let ((x, y), epicycles) = + self.epi_cycles(left_offset, top_offset, 0.0, img_scalar, self.time); + self.time += PI * 2. / self.data.epicycles.len() as f32; + self.path.push(( + (x - left_offset) / img_scalar, + (y - top_offset) / img_scalar, + )); + + let mut path_shapes = vec![]; + for ((x, y), (a, b)) in self + .path + .iter() + .map(|(x, y)| (x * img_scalar + left_offset, y * img_scalar + top_offset)) + .tuple_windows() + { + path_shapes.push(Shape::line_segment( + [Pos2::new(x, y), Pos2::new(a, b)], + Stroke::new(1.0, Color32::WHITE), + )); + } + painter.extend(path_shapes); + painter.extend(epicycles); + + ui.expand_to_include_rect(painter.clip_rect()); + + if self.time > PI * 2. { + self.time = 0.0; + self.path.clear(); + } + } + + fn epi_cycles( + &mut self, + mut x: f32, + mut y: f32, + rotation: f32, + scale: f32, + time: f32, + ) -> ((f32, f32), Vec) { + let mut shapes = vec![]; + let mut prevx = x; + let mut prevy = y; + for epicycle in &self.data.epicycles { + let freq = epicycle.freq; + let radius = epicycle.amp * scale; + let phase = epicycle.phase; + x += radius * (rotation + freq * time + phase).cos(); + y += radius * (rotation + freq * time + phase).sin(); + shapes.push(Shape::line_segment( + [Pos2::new(prevx, prevy), Pos2::new(x, y)], + Stroke::new(0.01, Color32::WHITE), + )); + shapes.push(Shape::circle_stroke( + Pos2::new(prevx, prevy), + radius, + Stroke::new(0.01, Color32::WHITE), + )); + prevx = x; + prevy = y; + } + ((x, y), shapes) + } + + fn img_scalars((ori_x, ori_y): (&f32, &f32), (width, height): (&f32, &f32)) -> f32 { + if width * ori_y > height * ori_x { + height / ori_y + } else { + width / ori_x + } + } +} diff --git a/src/fractal_clock.rs b/src/fractal_clock.rs new file mode 100644 index 0000000..d4ffff2 --- /dev/null +++ b/src/fractal_clock.rs @@ -0,0 +1,167 @@ +// This file was yonked from https://github.com/emilk/egui +// We are not the authors of this file. + +use egui::*; +use std::f32::consts::TAU; + +#[derive(PartialEq)] +pub struct FractalClock { + paused: bool, + time: f64, + zoom: f32, + start_line_width: f32, + depth: usize, + length_factor: f32, + luminance_factor: f32, + width_factor: f32, + line_count: usize, +} + +impl Default for FractalClock { + fn default() -> Self { + Self { + paused: false, + time: 0.0, + zoom: 0.25, + start_line_width: 2.5, + depth: 9, + length_factor: 0.8, + luminance_factor: 0.8, + width_factor: 0.9, + line_count: 0, + } + } +} + +impl FractalClock { + pub fn ui(&mut self, ui: &mut Ui, seconds_since_midnight: Option) { + if !self.paused { + self.time = seconds_since_midnight.unwrap_or_else(|| ui.input(|i| i.time)); + ui.ctx().request_repaint(); + } + + let painter = Painter::new( + ui.ctx().clone(), + ui.layer_id(), + ui.available_rect_before_wrap(), + ); + self.paint(&painter); + // Make sure we allocate what we used (everything) + ui.expand_to_include_rect(painter.clip_rect()); + } + + fn paint(&mut self, painter: &Painter) { + struct Hand { + length: f32, + angle: f32, + vec: Vec2, + } + + impl Hand { + fn from_length_angle(length: f32, angle: f32) -> Self { + Self { + length, + angle, + vec: length * Vec2::angled(angle), + } + } + } + + let angle_from_period = + |period| TAU * (self.time.rem_euclid(period) / period) as f32 - TAU / 4.0; + + let hands = [ + // Second hand: + Hand::from_length_angle(self.length_factor, angle_from_period(60.0)), + // Minute hand: + Hand::from_length_angle(self.length_factor, angle_from_period(60.0 * 60.0)), + // Hour hand: + Hand::from_length_angle(0.5, angle_from_period(12.0 * 60.0 * 60.0)), + ]; + + let mut shapes: Vec = Vec::new(); + + let rect = painter.clip_rect(); + let to_screen = emath::RectTransform::from_to( + Rect::from_center_size(Pos2::ZERO, rect.square_proportions() / self.zoom), + rect, + ); + + let mut paint_line = |points: [Pos2; 2], color: Color32, width: f32| { + let line = [to_screen * points[0], to_screen * points[1]]; + + // culling + if rect.intersects(Rect::from_two_pos(line[0], line[1])) { + shapes.push(Shape::line_segment(line, (width, color))); + } + }; + + let hand_rotations = [ + hands[0].angle - hands[2].angle + TAU / 2.0, + hands[1].angle - hands[2].angle + TAU / 2.0, + ]; + + let hand_rotors = [ + hands[0].length * emath::Rot2::from_angle(hand_rotations[0]), + hands[1].length * emath::Rot2::from_angle(hand_rotations[1]), + ]; + + #[derive(Clone, Copy)] + struct Node { + pos: Pos2, + dir: Vec2, + } + + let mut nodes = Vec::new(); + + let mut width = self.start_line_width; + + for (i, hand) in hands.iter().enumerate() { + let center = pos2(0.0, 0.0); + let end = center + hand.vec; + paint_line([center, end], Color32::from_additive_luminance(255), width); + if i < 2 { + nodes.push(Node { + pos: end, + dir: hand.vec, + }); + } + } + + let mut luminance = 0.7; // Start dimmer than main hands + + let mut new_nodes = Vec::new(); + for _ in 0..self.depth { + new_nodes.clear(); + new_nodes.reserve(nodes.len() * 2); + + luminance *= self.luminance_factor; + width *= self.width_factor; + + let luminance_u8 = (255.0 * luminance).round() as u8; + if luminance_u8 == 0 { + break; + } + + for &rotor in &hand_rotors { + for a in &nodes { + let new_dir = rotor * a.dir; + let b = Node { + pos: a.pos + new_dir, + dir: new_dir, + }; + paint_line( + [a.pos, b.pos], + Color32::from_additive_luminance(luminance_u8), + width, + ); + new_nodes.push(b); + } + } + + std::mem::swap(&mut nodes, &mut new_nodes); + } + self.line_count = shapes.len(); + painter.extend(shapes); + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..8761141 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,560 @@ +mod constants; +mod editor_gui; +mod env_gui; +mod environment; +mod float; +#[cfg(feature = "fft")] +mod fourier; +#[cfg(feature = "clock")] +mod fractal_clock; +mod locale; +mod matrices; +mod matrix_algorithms; +mod parser; +mod rationals; +mod traits; + +#[cfg(feature = "fft")] +use crate::constants::DFT_PATH; +use crate::constants::{ + APP_NAME, DEFAULT_HEIGHT, DEFAULT_LEFT_PANEL_WIDTH, DEFAULT_WIDTH, ICON_PATH, +}; +use crate::editor_gui::{ + display_editor, set_editor_to_existing_matrix, set_editor_to_existing_scalar, + set_editor_to_matrix, set_editor_to_scalar, EditorState, +}; +use crate::environment::{Environment, Identifier, Type}; +use crate::locale::{Language, Locale}; +use crate::matrix_algorithms::Aftermath; +use crate::parser::parse_instruction; +use crate::traits::{GuiDisplayable, LaTeXable, MatrixNumber}; +use arboard::Clipboard; +use constants::{FONT_ID, TEXT_COLOR, VALUE_PADDING}; +use eframe::{egui, IconData}; + +use egui::{gui_zoom, vec2, Align2, Context, Response, Sense, Ui}; +use env_gui::insert_to_env; +use std::collections::HashMap; +use std::default::Default; +use std::time::Duration; +use traits::BoxedShape; + +#[cfg(feature = "fft")] +use crate::fourier::Fourier; +#[cfg(feature = "clock")] +use crate::fractal_clock::FractalClock; +use clap::builder::TypedValueParser; +use clap::{arg, Parser}; +use egui_toast::{Toast, ToastKind, ToastOptions, Toasts}; +use num_rational::Rational64; + +pub use float::trim_trailing_zeros_float_str; +pub use matrices::*; + +use crate::float::Float64; + +/// Field for matrices. +type F = Rational64; + +/// Approximate field for matrices. +type R = Float64; + +pub fn run_application() -> Result<(), eframe::Error> { + let options = eframe::NativeOptions { + initial_window_size: Some(vec2(DEFAULT_WIDTH, DEFAULT_HEIGHT)), + icon_data: load_icon(ICON_PATH), + ..Default::default() + }; + let args = MatrixAppArgs::parse(); + let locale = Locale::new(args.language); + + match args.approx { + true => exec_app::(locale, options), + false => exec_app::(locale, options), + } +} + +fn exec_app( + locale: Locale, + options: eframe::NativeOptions, +) -> Result<(), eframe::Error> { + eframe::run_native( + &locale.get_translated(APP_NAME), + options, + Box::new(|_cc| Box::>::new(MatrixApp::new(locale))), + ) +} + +fn load_icon(path: &str) -> Option { + let image = image::open(path).ok()?.into_rgba8(); + let (width, height) = image.dimensions(); + Some(IconData { + rgba: image.into_raw(), + width, + height, + }) +} + +#[derive(Parser, Debug)] +#[command( + author, + version, + about, + long_about = "**Just Pure 2D Graphics Matrix Display** is a powerful matrix calculator written in Rust using egui." +)] +struct MatrixAppArgs { + #[arg( + long, + default_value_t = Language::English, + value_parser = clap::builder::PossibleValuesParser::new(["English", "Polish", "Spanish"]) + .map(| s | Language::of(Some(s))), + )] + language: Language, + + #[arg(long, default_value = "false")] + approx: bool, +} + +pub struct WindowState { + is_open: bool, +} + +#[derive(Default)] +struct ShellState { + text: String, +} + +pub struct State { + env: Environment, + windows: HashMap, + shell: ShellState, + editor: EditorState, + toasts: Toasts, + clipboard: Clipboard, + #[cfg(feature = "clock")] + clock: FractalClock, + #[cfg(feature = "fft")] + fourier: Option, +} + +impl Default for State { + fn default() -> Self { + Self { + env: Default::default(), + windows: Default::default(), + shell: Default::default(), + editor: Default::default(), + toasts: Default::default(), + #[cfg(feature = "clock")] + clock: Default::default(), + clipboard: Clipboard::new().expect("Failed to create Clipboard context!"), + #[cfg(feature = "fft")] + fourier: Fourier::from_json_file(DFT_PATH.to_string()).ok(), + } + } +} + +struct MatrixApp { + state: State, + locale: Locale, +} + +impl MatrixApp { + fn new(locale: Locale) -> Self { + Self { + state: State::default(), + locale, + } + } + + // Get Translated + fn gt(&self, str: &str) -> String { + self.locale.get_translated(str) + } +} + +impl eframe::App for MatrixApp { + fn update(&mut self, ctx: &Context, frame: &mut eframe::Frame) { + if !frame.is_web() { + gui_zoom::zoom_with_keyboard_shortcuts(ctx, frame.info().native_pixels_per_point); + } + + self.state.toasts = Toasts::default() + .anchor(Align2::RIGHT_BOTTOM, (-10.0, -40.0)) + .direction(egui::Direction::BottomUp); + + let (_top_menu, new_locale) = display_menu_bar(ctx, &mut self.state, &self.locale); + display_editor::(ctx, &mut self.state, &self.locale); + + let _left_panel = egui::SidePanel::left("objects") + .resizable(true) + .default_width(DEFAULT_LEFT_PANEL_WIDTH) + .show(ctx, |ui| { + egui::trace!(ui); + ui.vertical_centered(|ui| { + ui.heading(self.gt("objects")); + }); + + ui.separator(); + + self.state.env.iter_mut().for_each(|element| { + ui.horizontal(|ui| { + display_env_element(&mut self.state.windows, ui, element, &self.locale); + }); + }); + }) + .response; + + let mut windows_result = None; + for (id, window) in self.state.windows.iter_mut() { + if window.is_open { + let element = self.state.env.get_value(id).unwrap(); + let local_result = display_env_element_window( + ctx, + (id, element), + &self.locale, + &mut self.state.clipboard, + &mut self.state.editor, + &mut self.state.toasts, + &mut window.is_open, + ); + windows_result = windows_result.or(local_result); + } + } + + if let Some(value) = windows_result { + insert_to_env( + &mut self.state.env, + Identifier::result(), + value, + &mut self.state.windows, + ); + } + + display_shell::(ctx, &mut self.state, &self.locale); + + // Center panel has to be added last, otherwise the side panel will be on top of it. + egui::CentralPanel::default().show(ctx, |ui| { + ui.heading(self.gt(APP_NAME)); + #[cfg(feature = "fft")] + match &mut self.state.fourier { + Some(fourier) => { + fourier.ui(ui, _left_panel.rect.width(), _top_menu.rect.height()); + } + None => { + #[cfg(feature = "clock")] + self.state.clock.ui(ui, Some(seconds_since_midnight())); + } + } + #[cfg(feature = "clock")] + #[cfg(not(feature = "fft"))] + self.state.clock.ui(ui, Some(seconds_since_midnight())); + }); + + self.state.toasts.show(ctx); + + if let Some(new_locale) = new_locale { + self.locale = new_locale + } + } +} + +#[cfg(feature = "clock")] +fn seconds_since_midnight() -> f64 { + use chrono::Timelike; + let time = chrono::Local::now().time(); + time.num_seconds_from_midnight() as f64 + 1e-9 * (time.nanosecond() as f64) +} + +fn display_menu_bar( + ctx: &Context, + state: &mut State, + locale: &Locale, +) -> (Response, Option) { + let mut new_locale = None; + ( + egui::TopBottomPanel::top("menu_bar") + .show(ctx, |ui| { + egui::menu::bar(ui, |ui| { + display_add_matrix_button(ui, state, locale); + display_add_scalar_button(ui, state, locale); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + display_zoom_panel(ui, ctx); + ui.separator(); + new_locale = Some(display_language_panel(ui, locale)); + ui.allocate_space(ui.available_size()); + }); + }) + }) + .response, + new_locale, + ) +} + +fn display_zoom_panel(ui: &mut Ui, ctx: &Context) { + if ui.button("+").clicked() { + gui_zoom::zoom_in(ctx); + } + if ui + .button(format!("{} %", (ctx.pixels_per_point() * 100.).round())) + .clicked() + { + ctx.set_pixels_per_point(1.); + } + if ui.button("-").clicked() { + gui_zoom::zoom_out(ctx); + } +} + +fn display_language_panel(ui: &mut Ui, locale: &Locale) -> Locale { + let mut selected = locale.get_language(); + egui::ComboBox::from_label(locale.get_translated("Language")) + .selected_text(locale.get_translated_from(selected.to_string())) + .show_ui(ui, |ui| { + ui.selectable_value( + &mut selected, + Language::English, + locale.get_translated("English"), + ); + ui.selectable_value( + &mut selected, + Language::Polish, + locale.get_translated("Polish"), + ); + ui.selectable_value( + &mut selected, + Language::Spanish, + locale.get_translated("Spanish"), + ); + }); + Locale::new(selected) +} + +fn display_add_matrix_button(ui: &mut Ui, state: &mut State, locale: &Locale) { + if ui.button(locale.get_translated("Add Matrix")).clicked() { + set_editor_to_matrix(&mut state.editor, &K::zero().to_string()); + } +} + +fn display_add_scalar_button(ui: &mut Ui, state: &mut State, locale: &Locale) { + if ui.button(locale.get_translated("Add Scalar")).clicked() { + set_editor_to_scalar(&mut state.editor, &K::zero().to_string()); + } +} + +fn display_env_element( + windows: &mut HashMap, + ui: &mut Ui, + (identifier, value): (&Identifier, &mut Type), + locale: &Locale, +) { + let mut is_open = windows.get(identifier).unwrap().is_open; + ui.horizontal(|ui| { + ui.checkbox(&mut is_open, identifier.to_string()); + ui.label(value.display_string(locale)); + }); + windows.insert(identifier.clone(), WindowState { is_open }); +} + +fn display_env_element_window( + ctx: &Context, + (identifier, value): (&Identifier, &Type), + locale: &Locale, + clipboard: &mut Clipboard, + editor: &mut EditorState, + toasts: &mut Toasts, + is_open: &mut bool, +) -> Option> { + let mut window_result = None; + + egui::Window::new(identifier.to_string()) + .open(is_open) + .resizable(false) + .show(ctx, |ui| { + ui.horizontal(|ui| { + if ui.button("LaTeX").clicked() { + let latex = value.to_latex(); + set_clipboard(Ok(latex), clipboard, toasts, locale); + } + let mut update_by_result = |matrix_op_res| match matrix_op_res { + Ok(Aftermath { result, steps }) => { + window_result = Some(Type::Matrix(result)); + Ok(steps.join("\n")) + } + Err(err) => Err(err), + }; + if let Type::Matrix(m) = value { + if ui.button(locale.get_translated("Echelon")).clicked() { + let echelon = update_by_result(m.echelon()); + set_clipboard(echelon, clipboard, toasts, locale); + } + } + if ui.button(locale.get_translated("Inverse")).clicked() { + let inverse = match value { + Type::Scalar(s) => match K::one().checked_div(s) { + Some(inv) => { + window_result = Some(Type::Scalar(inv.clone())); + Ok(inv.to_latex()) + } + None => Err(anyhow::Error::msg( + locale.get_translated("Failed to calculate inverse"), + )), + }, + Type::Matrix(m) => update_by_result(m.inverse()), + }; + set_clipboard(inverse, clipboard, toasts, locale); + } + if let Type::Matrix(m) = value { + if ui.button(locale.get_translated("Transpose")).clicked() { + let transpose = m.transpose(); + window_result = Some(Type::Matrix(transpose)); + } + } + }); + let mut value_shape = value.to_shape(ctx, FONT_ID, TEXT_COLOR); + let value_rect = value_shape.get_rect(); + + ui.set_min_width(value_rect.width() + 2. * VALUE_PADDING); + ui.set_max_width(ui.min_size().x); + ui.separator(); + + let bar_height = ui.min_size().y; + + ui.add_space(value_rect.height() + VALUE_PADDING); + + value_shape.translate( + ui.clip_rect().min.to_vec2() + + vec2( + (ui.min_size().x - value_rect.width()) / 2., + bar_height + VALUE_PADDING, + ), + ); + ui.painter().add(value_shape); + + if !identifier.is_result() { + ui.separator(); + if ui.button(locale.get_translated("Edit")).clicked() { + match value { + Type::Scalar(s) => { + set_editor_to_existing_scalar(editor, s, identifier.to_string()) + } + Type::Matrix(m) => { + set_editor_to_existing_matrix(editor, m, identifier.to_string()) + } + } + } + }; + }); + + window_result +} + +fn set_clipboard( + message: anyhow::Result, + clipboard: &mut Clipboard, + toasts: &mut Toasts, + locale: &Locale, +) { + const CLIPBOARD_TOAST_DURATION: Duration = Duration::from_secs(5); + match message { + Ok(latex) => match clipboard.set_text(latex) { + Ok(_) => { + toasts_info( + toasts, + locale.get_translated("LaTeX copied to clipboard"), + CLIPBOARD_TOAST_DURATION, + ); + } + Err(e) => { + toasts_error( + toasts, + locale.get_translated("Failed to copy LaTeX to clipboard") + + "\n" + + e.to_string().as_str(), + CLIPBOARD_TOAST_DURATION, + ); + } + }, + Err(e) => { + toasts_error( + toasts, + locale.get_translated("Failed to generate LaTeX") + "\n" + e.to_string().as_str(), + CLIPBOARD_TOAST_DURATION, + ); + } + } +} + +fn display_shell( + ctx: &Context, + State { + shell, + env, + windows, + toasts, + .. + }: &mut State, + locale: &Locale, +) { + let mut run_shell_command = |shell_text: &mut String| match parse_instruction(shell_text, env) { + Ok(identifier) => { + shell_text.clear(); + windows.insert(identifier, WindowState { is_open: true }); + } + Err(error) => { + println!("{error}"); + toasts_error(toasts, error.to_string(), Duration::from_secs(5)); + } + }; + + egui::TopBottomPanel::bottom("shell") + .resizable(false) + .default_height(128.0) + .show(ctx, |ui| { + let button_sense = if shell.text.is_empty() { + Sense::hover() + } else { + Sense::click() + }; + + ui.horizontal(|ui| { + ui.with_layout(egui::Layout::right_to_left(egui::Align::BOTTOM), |ui| { + if ui + .add(egui::Button::new(locale.get_translated("Run")).sense(button_sense)) + .clicked() + { + run_shell_command(&mut shell.text); + } + + let response = ui.add( + egui::TextEdit::singleline(&mut shell.text) + .desired_rows(1) + .desired_width(ui.available_width()) + .code_editor(), + ); + if response.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)) { + run_shell_command(&mut shell.text); + response.request_focus(); + } + }); + }); + }); +} + +fn toasts_add_kind(toasts: &mut Toasts, text: String, duration: Duration, kind: ToastKind) { + toasts.add(Toast { + text: text.into(), + kind, + options: ToastOptions::default() + .duration(duration) + .show_progress(true), + }); +} + +fn toasts_info(toasts: &mut Toasts, text: String, duration: Duration) { + toasts_add_kind(toasts, text, duration, ToastKind::Info); +} + +fn toasts_error(toasts: &mut Toasts, text: String, duration: Duration) { + toasts_add_kind(toasts, text, duration, ToastKind::Error); +} diff --git a/src/locale.rs b/src/locale.rs new file mode 100644 index 0000000..74b84c3 --- /dev/null +++ b/src/locale.rs @@ -0,0 +1,174 @@ +use lazy_static::lazy_static; +use std::collections::HashMap; +use std::fmt::Display; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum Language { + English, + Spanish, + Polish, +} + +impl Display for Language { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Language::English => write!(f, "English"), + Language::Spanish => write!(f, "Spanish"), + Language::Polish => write!(f, "Polish"), + } + } +} + +impl Language { + pub fn of(str: Option) -> Language { + str.map_or(Language::English, |str| match str.to_lowercase().as_str() { + "en" | "english" => Language::English, + "es" | "spanish" => Language::Spanish, + "pl" | "polish" => Language::Polish, + _ => Language::English, + }) + } +} + +pub struct Locale { + language: Language, + translation_map: &'static HashMap, +} + +impl Locale { + pub fn new(language: Language) -> Self { + Self { + language, + translation_map: match language { + Language::English => &TRANS_EN_MAP, + Language::Polish => &TRANS_PL_MAP, + Language::Spanish => &TRANS_ES_MAP, + }, + } + } + + fn unwrap_or_default(str: Option<&String>, default: &str) -> String { + match str { + Some(str) => str.to_string(), + None => default.to_string(), + } + } + + pub fn get_language(&self) -> Language { + self.language + } + + pub fn get_translated(&self, s: &str) -> String { + Self::unwrap_or_default(self.translation_map.get(s), s) + } + + pub fn get_translated_from(&self, s: String) -> String { + self.get_translated(&s) + } +} + +lazy_static! { + pub static ref TRANS_EN_RAW: Vec<(&'static str, &'static str)> = vec![ + ("objects", "Objects"), + ("matrix", "Matrix"), + ("Add Matrix", "Add Matrix"), + ("Add Scalar", "Add Scalar"), + ("JP2GMD - Matrix Calculator", "JP2GMD - Matrix Calculator"), + ("Echelon", "Echelon"), + ("Inverse", "Inverse"), + ("Transpose", "Transpose"), + ("Run", "Run"), + ("Editor", "Editor"), + ("Identifier:", "Identifier:"), + ("Matrix is invalid!", "Matrix is invalid!"), + ("Add", "Add"), + ("Error", "Error"), + ("Enter the matrix:", "Enter the matrix:"), + ("Enter the scalar:", "Enter the scalar:"), + ("Height", "Height"), + ("Width", "Width"), + ("Edit", "Edit"), + ("Error ", "Error "), + ("Identifier is invalid!", "Identifier is invalid!"), + ("LaTeX copied to clipboard", "LaTeX copied to clipboard"), + ("Failed to generate LaTeX", "Failed to generate LaTeX"), + ("Language", "Language"), + ("English", "English"), + ("Polish", "Polish"), + ("Spanish", "Spanish"), + ]; + pub static ref TRANS_PL_RAW: Vec<(&'static str, &'static str)> = + vec![ + ("objects", "Obiekty"), + ("matrix", "Macierz"), + ("Add Matrix", "Dodaj Macierz"), + ("Add Scalar", "Dodaj Skalar"), + ( + "JP2GMD - Matrix Calculator", + "Jaki Potężny 2-wymiarowy Generator Macierzy Diagonalizowalnych - Kalkulator Macierzy" + ), + ("Echelon", "Schodkuj"), + ("Inverse", "Odwrotność"), + ("Transpose", "Transponuj"), + ("Run", "Uruchom"), + ("Editor", "Edytor"), + ("Identifier:", "Identyfikator:"), + ("Matrix is invalid!", "Macierz jest niepoprawna!"), + ("Add", "Dodaj"), + ("Error", "Błąd"), + ("Enter the matrix:", "Wprowadź macierz:"), + ("Enter the scalar:", "Wprowadź skalar:"), + ("Height", "Wysokość"), + ("Width", "Szerokość"), + ("Edit", "Edytuj"), + ("Error ", "Błąd "), + ("Identifier is invalid!", "Identyfikator jest niepoprawny!"), + ("LaTeX copied to clipboard", "Skopiowano LaTeX'a do schowka"), + ("Failed to generate LaTeX", "Nie udało się wygenerować LaTeX'a"), + ("Language", "Język"), + ("English", "Angielski"), + ("Polish", "Polski"), + ("Spanish", "Hiszpański"), + ]; + pub static ref TRANS_ES_RAW: Vec<(&'static str, &'static str)> = vec![ + ("objects", "Objetos"), + ("matrix", "Matriz"), + ("Add Matrix", "Añadir Matriz"), + ("Add Scalar", "Añadir Escalar"), + ( + "JP2GMD - Matrix Calculator", + "JP2GMD - Calculadora de Matrices" + ), + ("Echelon", "Echelon"), + ("Inverse", "Inversa"), + ("Transpose", "Transpuesta"), + ("Run", "Ejecutar"), + ("Editor", "Editor"), + ("Identifier:", "Identificador:"), + ("Matrix is invalid!", "¡La matriz es inválida!"), + ("Add", "Añadir"), + ("Error", "Error"), + ("Enter the matrix:", "Introduzca la matriz:"), + ("Enter the scalar:", "Introduzca el escalar:"), + ("Height", "Altura"), + ("Width", "Anchura"), + ("Editor", "Editar"), + ("Error ", "Error "), + ("Identifier is invalid!", "¡El identificador es inválido!"), + ("LaTeX copied to clipboard", "LaTeX copiado al portapapeles"), + ("Failed to generate LaTeX", "No se pudo generar LaTeX"), + ("Language", "Idioma"), + ("English", "Inglés"), + ("Polish", "Polaco"), + ("Spanish", "Español"), + ]; + pub static ref TRANS_EN_MAP: HashMap = gen_map(&TRANS_EN_RAW); + pub static ref TRANS_PL_MAP: HashMap = gen_map(&TRANS_PL_RAW); + pub static ref TRANS_ES_MAP: HashMap = gen_map(&TRANS_ES_RAW); +} + +fn gen_map(vec: &[(&'static str, &'static str)]) -> HashMap { + vec.iter() + .map(|(k, v)| (k.to_string(), v.to_string())) + .collect() +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..f3f341d --- /dev/null +++ b/src/main.rs @@ -0,0 +1,3 @@ +fn main() -> Result<(), eframe::Error> { + jp2gmd_lib::run_application() +} diff --git a/src/matrices.rs b/src/matrices.rs new file mode 100644 index 0000000..1b44332 --- /dev/null +++ b/src/matrices.rs @@ -0,0 +1,1119 @@ +use crate::constants::{MATRIX_HPADDING, MATRIX_VPADDING}; +use crate::locale::Locale; +use crate::traits::{BoxedShape, LaTeXable}; +use crate::traits::{GuiDisplayable, MatrixNumber}; +use anyhow::{bail, Context}; +use egui::{pos2, Color32, FontId, Rect}; +use std::ops::{Add, Mul, Neg, Sub}; + +/// A matrix of type `T`. +/// Matrices are immutable. +/// Empty matrices have shape (0, 0), so be careful. +#[derive(Debug, Clone, Default)] +pub struct Matrix { + data: Vec>, + + /// Index of a column that is followed by a vertical separator (counting + /// from 0). This only affects exporting to LaTeX. + separator: Option, +} + +impl Matrix { + /// Creates a new matrix from a 2D vector. + /// The matrix is not checked for validity. + /// If you want to check for validity, use `Matrix::new`. + /// Calling methods on an invalid matrix will result in undefined behavior. + /// # Arguments + /// * `data` - The data of the matrix. + /// # Returns + /// A new matrix. + /// # Examples + /// ``` + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::new_unsafe(vec![vec![1, 2, 3], vec![4, 5, 6]]); + /// // m corresponds to the matrix + /// // | 1 2 3 | + /// // | 4 5 6 | + /// ``` + pub fn new_unsafe(data: Vec>) -> Self { + Self { + data, + separator: None, + } + } + + /// Creates a new matrix from a 2D vector. + /// The matrix is checked for validity. + /// If you don't want to check for validity, use `Matrix::new_unsafe`. + /// # Arguments + /// * `data` - The data of the matrix. + /// # Returns + /// A new matrix. + /// # Examples + /// ``` + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::new(vec![vec![1, 2, 3], vec![4, 5, 6]]); + /// // m corresponds to the matrix + /// // | 1 2 3 | + /// // | 4 5 6 | + /// ``` + /// # Errors + /// If the data is not a valid matrix. + /// ``` + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::new(vec![vec![1, 2, 3], vec![4, 5]]); + /// // m is an error + /// ``` + pub fn new(data: Vec>) -> anyhow::Result { + let matrix = Self { + data, + separator: None, + }; + if !matrix.is_valid() { + bail!("Invalid matrix.") + } else if matrix.is_empty() { + Ok(Self::empty()) + } else { + Ok(matrix) + } + } + + /// Creates a new matrix from a 2D vector. + /// The matrix is checked for validity. + /// The initial data is passed as a vector of flattened rows. + /// The shape of the matrix is passed as a tuple. + /// # Arguments + /// * `data` - The data of the matrix. + /// * `(rows, cols)` - The shape of the matrix. + /// # Returns + /// A new matrix. + /// # Examples + /// ``` + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::from_vec(vec![1, 2, 3, 4, 5, 6], (2, 3)); + /// // m corresponds to the matrix + /// // | 1 2 3 | + /// // | 4 5 6 | + /// ``` + /// # Errors + /// If the data is not a valid matrix. + pub fn from_vec(data: Vec, (rows, cols): (usize, usize)) -> anyhow::Result { + if data.len() != rows * cols { + bail!("Invalid size.") + } else if rows == 0 || cols == 0 { + Ok(Self::empty()) + } else { + Self::new(data.chunks(cols).map(|c| c.to_vec()).collect()) + } + } + + /// Gets the index of a column that is followed by a vertical separator (if any). + /// # Returns + /// The index of the separator (or None if there is no separator). + pub fn get_separator(&self) -> Option { + self.separator + } + + /// Sets the index of a column that is followed by a vertical separator + /// (counting from 0). + /// # Arguments + /// * `separator` - The index of the separator (or None if there is no separator). + /// # Examples + /// ``` + /// # use jp2gmd_lib::Matrix; + /// let mut m = Matrix::new(vec![vec![1, 2, 3], vec![4, 5, 6]]).unwrap(); + /// // m corresponds to the matrix + /// // | 1 2 3 | + /// // | 4 5 6 | + /// m.set_separator(Some(1)); + /// // m corresponds to the matrix + /// // | 1 2 | 3 | + /// // | 4 5 | 6 | + /// ``` + pub fn set_separator(&mut self, separator: Option) { + self.separator = separator; + } + + /// Creates a new matrix by setting the index of a column that is followed + /// by a vertical separator (counting from 0). + /// # Arguments + /// * `separator` - The index of the separator (or None if there is no separator). + /// # Returns + /// A new matrix. + pub fn with_separator(mut self, separator: Option) -> Self { + self.set_separator(separator); + self + } + + /// Creates a new matrix by reshaping an existing matrix. + /// If new shape is not compatible with the old shape, an error is returned. + /// # Arguments + /// * `matrix` - The matrix to reshape. + /// * `(rows, cols)` - The new shape of the matrix. + /// # Returns + /// A new matrix. + /// # Examples + /// ``` + /// # use anyhow::Context; + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::new(vec![vec![1, 2, 3], vec![4, 5, 6]]).expect("Invalid matrix."); + /// // m corresponds to the matrix + /// // | 1 2 3 | + /// // | 4 5 6 | + /// let m = Matrix::reshape(&m, (3, 2)).expect("Invalid size."); + /// // m corresponds to the matrix + /// // | 1 2 | + /// // | 3 4 | + /// // | 5 6 | + /// ``` + pub fn reshape(&self, (rows, cols): (usize, usize)) -> anyhow::Result { + let (h, w) = self.get_shape(); + if h * w != rows * cols { + bail!("Invalid size.") + } else { + Self::from_vec(self.data.iter().flatten().cloned().collect(), (rows, cols)) + } + } + + /// Creates a new matrix of shape (h, w) with given supplier. + /// # Arguments + /// * `(h, w)` - The shape of the matrix - height and width. + /// * `supplier` - The supplier of the matrix. + /// # Returns + /// A new matrix of shape (h, w) with given supplier. + /// # Examples + /// ``` + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::filled((2, 3), |i, j| (i + j) as i64); + /// // m corresponds to the matrix + /// // | 0 1 2 | + /// // | 1 2 3 | + /// let m = Matrix::filled((2, 3), |i, j| (i * j) as i64); + /// // m corresponds to the matrix + /// // | 0 0 0 | + /// // | 0 1 2 | + /// ``` + pub fn filled((h, w): (usize, usize), supp: F) -> Self + where + F: Fn(usize, usize) -> T, + { + if h == 0 || w == 0 { + return Self::empty(); + } + let mut data = vec![vec![T::zero(); w]; h]; + for (i, row) in data.iter_mut().enumerate().take(h) { + for (j, elem) in row.iter_mut().enumerate().take(w) { + *elem = supp(i, j); + } + } + Self { + data, + separator: None, + } + } + + /// Creates zero matrix of shape (h, w). + /// # Arguments + /// * `(h, w)` - The shape of the matrix - height and width. + /// # Returns + /// A zero matrix of shape (h, w). + /// # Examples + /// ``` + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::::zeros((2, 3)); + /// // m corresponds to the matrix + /// // | 0 0 0 | + /// // | 0 0 0 | + /// ``` + pub fn zeros((h, w): (usize, usize)) -> Self { + Self::filled((h, w), |_, _| T::zero()) + } + + /// Creates ones matrix of shape (h, w). + /// # Arguments + /// * `(h, w)` - The shape of the matrix - height and width. + /// # Returns + /// A ones matrix of shape (h, w). + /// # Examples + /// ``` + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::::ones((2, 3)); + /// // m corresponds to the matrix + /// // | 1 1 1 | + /// // | 1 1 1 | + /// ``` + pub fn ones((h, w): (usize, usize)) -> Self { + Self::filled((h, w), |_, _| T::one()) + } + + /// Creates identity (square) matrix of shape (n, n). + /// # Arguments + /// * `n` - The length of the side of the matrix. + /// # Returns + /// An identity matrix of shape (n, n). + /// # Examples + /// ``` + /// # use num_rational::Rational64; + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::::identity(3); + /// // m corresponds to the matrix + /// // | 1 0 0 | + /// // | 0 1 0 | + /// // | 0 0 1 | + /// ``` + pub fn identity(n: usize) -> Self { + Self::filled((n, n), |i, j| if i == j { T::one() } else { T::zero() }) + } + + /// Creates empty matrix of shape (0, 0). + /// # Returns + /// An empty matrix of shape (0, 0). + pub fn empty() -> Self { + Self::new_unsafe(vec![]) + } + + /// Returns the shape of the matrix. + /// If the matrix is not valid, the behavior is undefined. + /// If the matrix is empty, the shape is (0, 0). + /// # Returns + /// A tuple of the form `(height, width)`. + /// # Examples + /// ``` + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::new(vec![vec![1, 2, 3], vec![4, 5, 6]]).unwrap(); + /// assert_eq!(m.get_shape(), (2, 3)); + /// ``` + pub fn get_shape(&self) -> (usize, usize) { + if self.is_empty() { + (0, 0) + } else { + (self.data.len(), self.data[0].len()) + } + } + + /// Checks if matrix is empty. + /// Matrix is empty if it has no rows or no columns. + /// Matrix has to be valid. Otherwise, the behavior is undefined. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// assert!(!m.is_empty()); + /// let m = Matrix::::new(vec![vec![], vec![], vec![]]).unwrap(); + /// assert!(m.is_empty()); + /// let m = Matrix::::new(vec![]).unwrap(); + /// assert!(m.is_empty()); + /// ``` + pub fn is_empty(&self) -> bool { + self.data.is_empty() || self.data[0].is_empty() + } + + /// Checks if matrix is valid. + /// Matrix is valid if all rows have the same length. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::new_unsafe(vec![vec![1, 2], vec![3, 4]]); + /// assert!(m.is_valid()); + /// let m = Matrix::new_unsafe(vec![vec![1, 2], vec![3, 4, 5]]); + /// assert!(!m.is_valid()); + /// ``` + pub fn is_valid(&self) -> bool { + return if self.data.is_empty() { + true + } else { + !self + .data + .iter() + .skip(1) + .fold((false, self.data[0].len()), |(acc, row_len), next| { + (acc || row_len != next.len(), row_len) + }) + .0 // does any row have different length? + }; + } + + /// Returns the raw data of the matrix. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// assert_eq!(m.get_data(), &vec![vec![1, 2], vec![3, 4]]); + /// ``` + pub fn get_data(&self) -> &Vec> { + &self.data + } + + /// Returns the raw data of the matrix and consumes the matrix. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// assert_eq!(m.consume(), vec![vec![1, 2], vec![3, 4]]); + /// ``` + pub fn consume(self) -> Vec> { + self.data + } + + /// Checks if two matrices have the same shape. + /// Shape of a matrix is a tuple of the form `(height, width)`. + /// # Arguments + /// * `other` - The other matrix. + /// # Returns + /// `true` if the matrices have the same shape, `false` otherwise. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m1 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m2 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// assert!(m1.same_shapes(&m2)); + /// let m1 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m2 = Matrix::new(vec![vec![1, 2, 3], vec![4, 5, 6]]).unwrap(); + /// assert!(!m1.same_shapes(&m2)); + /// ``` + pub fn same_shapes(&self, other: &Self) -> bool { + let self_shape = self.get_shape(); + let other_shape = other.get_shape(); + self_shape == other_shape + } + + /// Return the shape of a matrix after multiplication. + /// # Arguments + /// * `other` - The other matrix. + /// # Returns + /// A tuple of the form `(height, width)`. + /// # Errors + /// Returns `Err` if the matrices cannot be multiplied - e.g. if they have incompatible shapes. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m1 = Matrix::new(vec![vec![1, 2, 3], vec![4, 5, 6]]).unwrap(); + /// let m2 = Matrix::new(vec![vec![1, 2], vec![3, 4], vec![5, 6]]).unwrap(); + /// assert_eq!(m1.result_shape_for_mul(&m2).unwrap(), (2, 2)); + /// let m1 = Matrix::new(vec![vec![1, 2, 3], vec![4, 5, 6]]).unwrap(); + /// let m2 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// assert!(m1.result_shape_for_mul(&m2).is_err()); + /// ``` + pub fn result_shape_for_mul(&self, other: &Self) -> anyhow::Result<(usize, usize)> { + let (h, self_w) = self.get_shape(); + let (other_h, w) = other.get_shape(); + if self_w == other_h { + Ok((h, w)) + } else { + Err(anyhow::anyhow!( + "Cannot multiply matrices of shapes ({h}, {self_w}) and ({other_h}, {w})" + )) + } + } + + /// Performs element-wise operation on two matrices. + /// # Arguments + /// * `other` - The other matrix. + /// * `op` - The operation to perform. + /// # Returns + /// A new matrix with the result of the operation. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m1 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m2 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m3 = m1.checked_operation_on_two(&m2, |a, b| Some(a + b)).unwrap(); + /// assert_eq!(m3, Matrix::new(vec![vec![2, 4], vec![6, 8]]).unwrap()); + /// ``` + pub fn checked_operation_on_two(&self, other: &Self, operation: F) -> anyhow::Result + where + F: Fn(&T, &T) -> Option, + { + self.same_shapes(other) + .then_some(()) + .context("Matrices have different shapes!")?; + let data = self + .data + .iter() + .zip(other.data.iter()) + .map(|(row_self, row_other)| { + row_self + .iter() + .zip(row_other.iter()) + .map(|(elem_self, elem_other)| operation(elem_self, elem_other)) + .collect::>>() + }) + .collect::>>>() + .ok_or_else(|| anyhow::anyhow!("Operation failed!"))?; + Self::new(data) + } + + /// Performs matrix operation element-wise. + /// # Arguments + /// * `op` - The operation to perform. + /// # Returns + /// A new matrix with the result of the operation. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m2 = m.checked_operation(|a| Some(a + 1)).unwrap(); + /// assert_eq!(m2, Matrix::new(vec![vec![2, 3], vec![4, 5]]).unwrap()); + /// ``` + pub fn checked_operation(&self, operation: F) -> anyhow::Result + where + F: Fn(&T) -> Option, + { + // In order to avoid code duplication, we use `checked_operation_on_two` + // with `self` as the second argument and ignore it later. + // It is more memory efficient as we don't need to allocate a new matrix. + // First approach was to use some mock matrix, but it was less efficient. + self.checked_operation_on_two(self, |a, _| operation(a)) + } + + /// Performs matrix addition. + /// # Arguments + /// * `other` - The other matrix. + /// # Returns + /// A new matrix with the result of the addition. + /// # Errors + /// Returns `Err` if the matrices have different shapes. + /// # Examples + /// ``` + /// # use jp2gmd_lib::Matrix; + /// let m1 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m2 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m3 = m1.checked_add(&m2).unwrap(); + /// assert_eq!(m3, Matrix::new(vec![vec![2, 4], vec![6, 8]]).unwrap()); + /// ``` + pub fn checked_add(&self, rhs: &Self) -> anyhow::Result { + self.checked_operation_on_two(rhs, |a, b| a.checked_add(b)) + } + + /// Performs matrix subtraction. + /// # Arguments + /// * `other` - The other matrix. + /// # Returns + /// A new matrix with the result of the subtraction. + /// # Errors + /// Returns `Err` if the matrices have different shapes. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m1 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m2 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m3 = m1.checked_sub(&m2).unwrap(); + /// assert_eq!(m3, Matrix::new(vec![vec![0, 0], vec![0, 0]]).unwrap()); + /// ``` + pub fn checked_sub(&self, v: &Self) -> anyhow::Result { + self.checked_operation_on_two(v, |a, b| a.checked_sub(b)) + } + + /// Performs matrix negation. + /// # Returns + /// A new matrix with the result of the negation. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m1 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m2 = m1.checked_neg().unwrap(); + /// assert_eq!(m2, Matrix::new(vec![vec![-1, -2], vec![-3, -4]]).unwrap()); + /// ``` + pub fn checked_neg(&self) -> anyhow::Result { + Self::zeros(self.get_shape()).checked_sub(self) + } + + /// Performs matrix multiplication. + /// # Arguments + /// * `other` - The other matrix. + /// # Returns + /// A new matrix with the result of the multiplication. + /// # Errors + /// Returns `Err` if height of the first matrix is not equal to the width of the second matrix. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m1 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m2 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m3 = m1.checked_mul(&m2).unwrap(); + /// assert_eq!(m3, Matrix::new(vec![vec![7, 10], vec![15, 22]]).unwrap()); + /// ``` + pub fn checked_mul(&self, v: &Self) -> anyhow::Result { + const OVERFLOW_MSG: &str = "Overflow during matrix multiplication!"; + let (h, w) = self.result_shape_for_mul(v)?; + + let mut res = Matrix::::zeros((h, w)).data; + for (i, item) in self.data.iter().enumerate() { + for j in 0..w { + for (k, item_item) in item.iter().enumerate() { + res[i][j] = (item_item.checked_mul(&v.data[k][j]).context(OVERFLOW_MSG)?) + .checked_add(&res[i][j]) + .context(OVERFLOW_MSG)?; + } + } + } + Self::new(res) + } + + /// Performs matrix multiplication by a scalar. + /// # Arguments + /// * `other` - The scalar. + /// # Returns + /// A new matrix with the result of the multiplication. + /// # Errors + /// Returns `Err` if the multiplication overflows. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m1 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m2 = m1.checked_mul_scl(&2).unwrap(); + /// assert_eq!(m2, Matrix::new(vec![vec![2, 4], vec![6, 8]]).unwrap()); + /// ``` + pub fn checked_mul_scl(&self, other: &T) -> anyhow::Result { + self.checked_operation(|a| a.checked_mul(other)) + } + + /// Performs matrix to the power. + /// # Arguments + /// * `exponent` - The power to raise the matrix to. + /// # Returns + /// $M^{exponent}$ where $M$ is the matrix. + pub fn checked_pow(&self, mut exponent: usize) -> anyhow::Result { + let (h, w) = self.get_shape(); + if h != w { + bail!("Only square matrices can be used in exponentiation!"); + } + + let mut pow2 = self.clone(); + let mut result = Self::identity(h); + while exponent > 0 { + if exponent % 2 == 1 { + result = result + .checked_mul(&pow2) + .context("Multiplication failed!")?; + } + pow2 = pow2.checked_mul(&pow2).context("Multiplication failed!")?; + exponent /= 2; + } + + Ok(result) + } + + /// Concats two matrices horizontally. Assumes that both matrices have the + /// same number of rows. + /// # Arguments + /// * `other` - The other matrix. + /// # Returns + /// A new matrix with the result of the operation. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m1 = Matrix::new(vec![vec![1, 2], vec![3, 4]]).unwrap(); + /// let m2 = Matrix::new(vec![vec![5, 6], vec![7, 8]]).unwrap(); + /// let m3 = m1.concat(m2).unwrap(); + /// assert_eq!(m3, Matrix::new(vec![vec![1, 2, 5, 6], vec![3, 4, 7, 8]]).unwrap()); + /// ``` + pub fn concat(mut self, other: Self) -> anyhow::Result { + let (rows, columns) = self.get_shape(); + if rows != other.get_shape().0 { + bail!("Cannot concatenate matrices with different number of rows!"); + } + + std::iter::zip(self.data.iter_mut(), other.data).for_each(|(a, b)| a.extend(b)); + Ok(self.with_separator(Some(columns))) + } + + /// Splits the matrix horizontally at the given column. Drops the separator. + /// # Arguments + /// * `column` - The column to split at. + /// # Returns + /// A tuple of two matrices. + /// # Examples + /// ```rust + /// # use jp2gmd_lib::Matrix; + /// let m1 = Matrix::new(vec![vec![1, 2, 3, 4], vec![5, 6, 7, 8]]).unwrap(); + /// let (m2, m3) = m1.split(2).unwrap(); + /// assert_eq!(m2, Matrix::new(vec![vec![1, 2], vec![5, 6]]).unwrap()); + /// assert_eq!(m3, Matrix::new(vec![vec![3, 4], vec![7, 8]]).unwrap()); + /// ``` + pub fn split(mut self, column: usize) -> anyhow::Result<(Self, Self)> { + let (_, columns) = self.get_shape(); + if column > columns { + bail!("Cannot split matrix at column {}!", column); + } + + let right = Self::new_unsafe( + self.data + .iter_mut() + .map(|row| row.split_off(column)) + .collect(), + ); + self.separator = None; + Ok((self, right)) + } +} + +impl PartialEq for Matrix { + fn eq(&self, other: &Self) -> bool { + if self.is_empty() && other.is_empty() { + return true; + } + if self.get_shape() != other.get_shape() { + return false; + } + self.data == other.data + } +} + +impl Eq for Matrix {} + +impl LaTeXable for Matrix { + fn to_latex(&self) -> String { + let mut column_format = "c".repeat(self.data[0].len()); + if let Some(s) = self.separator { + column_format.insert(s, '|') + } + + format!( + r"\left[\begin{{array}}{{{}}}{}\end{{array}}\right]", + column_format, + &self + .data + .iter() + .map(|row| { + row.iter() + .map(|elem| elem.to_latex()) + .collect::>() + .join(" & ") + }) + .collect::>() + .join(r"\\") + ) + } + + fn to_latex_single(&self) -> String { + self.to_latex() + } +} + +impl GuiDisplayable for Matrix { + fn display_string(&self, locale: &Locale) -> String { + let (h, w) = self.get_shape(); + let name = locale.get_translated("matrix"); + format!("{name}::<{h}, {w}>") + } + + fn to_shape(&self, ctx: &egui::Context, font_id: FontId, color: Color32) -> egui::Shape { + let (rows, cols) = self.get_shape(); + let mut shapes: Vec> = self + .get_data() + .iter() + .map(|row| { + row.iter() + .map(|element| element.to_shape(ctx, font_id.clone(), color)) + .collect() + }) + .collect(); + + let mut row_heights = vec![0_f32; rows]; + let mut column_widths = vec![0_f32; cols]; + for (i, row) in shapes.iter().enumerate() { + for (j, shape) in row.iter().enumerate() { + let rect = shape.get_rect(); + row_heights[i] = row_heights[i].max(rect.height()); + column_widths[j] = column_widths[j].max(rect.width()); + } + } + + let mut upper_left = pos2(0., 0.); + for (i, row) in shapes.iter_mut().enumerate() { + for (j, shape) in row.iter_mut().enumerate() { + let rect = shape.get_rect().size(); + shape.translate( + egui::Align2::CENTER_CENTER + .align_size_within_rect( + rect, + Rect { + min: upper_left, + max: pos2( + upper_left.x + column_widths[j], + upper_left.y + row_heights[i], + ), + }, + ) + .min + .to_vec2(), + ); + upper_left.x += column_widths[j] + MATRIX_HPADDING; + } + upper_left.x = 0.; + upper_left.y += row_heights[i] + MATRIX_VPADDING; + } + + egui::Shape::Vec(shapes.into_iter().flat_map(|row| row.into_iter()).collect()) + } +} + +impl Add for Matrix { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + self.checked_add(&rhs).expect("Addition failed!") + } +} + +impl Sub for Matrix { + type Output = Self; + + fn sub(self, rhs: Self) -> Self::Output { + self.checked_sub(&rhs).expect("Matrix subtraction failed!") + } +} + +impl Neg for Matrix +where + T: Neg, +{ + type Output = Self; + + fn neg(self) -> Self::Output { + self.checked_operation(|a| Some(-a.clone())) + .expect("Negation failed!") + } +} + +impl Mul for Matrix { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + self.checked_mul(&rhs) + .expect("Matrix multiplication failed!") + } +} + +impl Mul for Matrix { + type Output = Self; + + fn mul(self, rhs: T) -> Self::Output { + self.checked_mul_scl(&rhs) + .expect("Matrix multiplication failed!") + } +} + +impl ToString for Matrix { + fn to_string(&self) -> String { + self.data + .iter() + .map(|row| { + row.iter() + .map(|elem| elem.to_string()) + .collect::>() + .join(" ") + }) + .collect::>() + .join("\n") + } +} + +impl From> for Vec { + fn from(value: Matrix) -> Self { + value.data.into_iter().flatten().collect() + } +} + +/// Create a matrix row (vector) of Rational64 numbers passed as integers. +/// # uses ri! macro. +/// # used as helper macro for rm! macro. +/// rv stands for Rational Vector. +/// Example: +/// ``` +/// # use jp2gmd_lib::{rv, ri}; +/// # use num_rational::Rational64; +/// rv!(1, 2, 3); // Creates a row vector [ri!(1), ri!(2), ri!(3)] +/// ``` +#[macro_export] +macro_rules! rv { + ($($x:expr),+ $(,)?) => ( + vec![ + $(ri!($x)),+ + ] + ); +} + +/// Create a matrix of Rational64 numbers passed as integers. +/// # uses ri! and rv! macros. +/// rm stands for Rational Matrix. +/// Example: +/// ``` +/// # use jp2gmd_lib::*; +/// # use num_rational::Rational64; +/// // Creates a matrix +/// // | 1 2 3 | +/// // | 4 5 6 | +/// // values of the matrix are Rational64 numbers +/// rm!(1, 2, 3; 4, 5, 6); +/// ``` +#[macro_export] +macro_rules! rm { + ($($($x:expr),+ $(,)?);+ $(;)?) => ( + Matrix::::new_unsafe(vec![ + $(rv!($($x),+)),+ + ]) + ); +} + +/// Create a matrix row (vector) of i32 numbers passed as integers. +/// im stands for Integer Matrix. +/// Example: +/// ``` +/// # use jp2gmd_lib::{im, Matrix}; +/// // Creates a matrix +/// // | 1 2 3 | +/// // | 4 5 6 | +/// // values of the matrix are i32 numbers +/// im!(1, 2, 3; 4, 5, 6); +/// ``` +#[macro_export] +macro_rules! im { + ($($($x:expr),+ $(,)?);+ $(;)?) => ( + Matrix::new_unsafe(vec![ + $(vec![ + $($x),+ + ]),+ + ]) + ); +} + +#[cfg(test)] +mod tests { + use crate::ri; + use num_rational::Rational64; + + use super::*; + + #[test] + fn test_matrix() { + let matrix = im![1, 2, 3; 4, 5, 6]; + assert_eq!( + matrix.to_latex(), + r"\left[\begin{array}{ccc}1 & 2 & 3\\4 & 5 & 6\end{array}\right]" + ); + } + + #[test] + fn test_new_unsafe() { + let matrix = Matrix::new_unsafe(vec![vec![1, 2, 3], vec![4, 5, 6]]); + let matrix2 = Matrix::new(vec![vec![1, 2, 3], vec![4, 5, 6]]).unwrap(); + assert_eq!(matrix, matrix2); + } + + #[test] + fn test_new() { + let matrix = Matrix::new(vec![vec![1, 2, 3], vec![4, 5, 6]]).unwrap(); + assert_eq!(matrix, im![1, 2, 3; 4, 5, 6]); + let invalid = Matrix::new(vec![vec![1, 2, 3], vec![4, 5]]); + assert!(invalid.is_err()); + } + + #[test] + fn test_is_valid() { + let matrix = Matrix::new_unsafe(vec![vec![1, 2, 3], vec![4, 5, 6]]); + assert!(matrix.is_valid()); + let matrix = Matrix::new_unsafe(vec![vec![1, 2, 3], vec![4, 5]]); + assert!(!matrix.is_valid()); + } + + #[test] + fn test_filled() { + let matrix = Matrix::filled((4, 5), |x, y| ri!((x * y) as i64)); + assert_eq!( + matrix, + rm![ + 0, 0, 0, 0, 0; + 0, 1, 2, 3, 4; + 0, 2, 4, 6, 8; + 0, 3, 6, 9, 12; + ] + ); + let matrix = Matrix::filled((4, 5), |x, y| ri!((x + y) as i64)); + assert_eq!( + matrix, + rm![ + 0, 1, 2, 3, 4; + 1, 2, 3, 4, 5; + 2, 3, 4, 5, 6; + 3, 4, 5, 6, 7; + ] + ); + } + + #[test] + fn test_zeros() { + let matrix = Matrix::zeros((4, 5)); + assert_eq!( + matrix, + rm![ + 0, 0, 0, 0, 0; + 0, 0, 0, 0, 0; + 0, 0, 0, 0, 0; + 0, 0, 0, 0, 0; + ] + ); + } + + #[test] + fn test_ones() { + let matrix = Matrix::ones((4, 5)); + assert_eq!( + matrix, + rm![ + 1, 1, 1, 1, 1; + 1, 1, 1, 1, 1; + 1, 1, 1, 1, 1; + 1, 1, 1, 1, 1; + ] + ); + } + + #[test] + fn test_identity() { + let matrix = Matrix::identity(4); + assert_eq!( + matrix, + rm![ + 1, 0, 0, 0; + 0, 1, 0, 0; + 0, 0, 1, 0; + 0, 0, 0, 1; + ] + ); + } + + #[test] + fn test_empty() { + let matrix = Matrix::::empty(); + + assert_eq!(matrix, Matrix::zeros((0, 0))); + assert_eq!(matrix, Matrix::zeros((0, 7))); + assert_eq!(matrix, Matrix::zeros((2, 0))); + + assert_eq!(matrix, Matrix::new_unsafe(vec![])); + assert_eq!(matrix, Matrix::new_unsafe(vec![vec![]])); + } + + #[test] + fn test_simple_addition() { + let m = im![1, 2, 3; 4, 5, 6]; + let n = im![1, 2, 3; 4, 5, 6]; + + let result = m + n; + assert_eq!( + result.to_latex(), + r"\left[\begin{array}{ccc}2 & 4 & 6\\8 & 10 & 12\end{array}\right]" + ); + } + + #[test] + fn test_simple_subtraction() { + let m = im![1, 2, 3; 4, 5, 6]; + let n = im![1, 2, 3; 4, 5, 6]; + + let result = m - n; + assert_eq!( + result.to_latex(), + r"\left[\begin{array}{ccc}0 & 0 & 0\\0 & 0 & 0\end{array}\right]" + ); + } + + #[test] + fn test_simple_negation() { + let m = im![1, 2, 3; 4, 5, 6]; + + let result = -m; + assert_eq!( + result.to_latex(), + r"\left[\begin{array}{ccc}-1 & -2 & -3\\-4 & -5 & -6\end{array}\right]" + ); + } + + #[test] + fn test_simple_multiplication() { + let m = im![1, 2, 3; 4, 5, 6]; + let n = im![1, 2; 3, 4; 5, 6]; + + let result = m * n; + assert_eq!( + result.to_latex(), + r"\left[\begin{array}{cc}22 & 28\\49 & 64\end{array}\right]" + ); + } + + #[test] + fn test_simple_multiplication_with_scalar() { + let m = im![1, 2, 3; 4, 5, 6]; + + let result = m * 2; + assert_eq!( + result.to_latex(), + r"\left[\begin{array}{ccc}2 & 4 & 6\\8 & 10 & 12\end{array}\right]" + ); + } + + #[test] + fn test_simple_multiplication_with_rational() { + let m = rm![1, 2, 3; 4, 5, 6]; + + let result = m * ri!(2); + assert_eq!( + result.to_latex(), + r"\left[\begin{array}{ccc}2 & 4 & 6\\8 & 10 & 12\end{array}\right]" + ); + } + + #[test] + fn test_simple_exponentiation() { + let m = im![1, 1; 1, 0]; + assert_eq!(m.checked_pow(0).unwrap(), im![1, 0; 0, 1]); + assert_eq!(m.checked_pow(1).unwrap(), im![1, 1; 1, 0]); + assert_eq!(m.checked_pow(2).unwrap(), im![2, 1; 1, 1]); + assert_eq!(m.checked_pow(9).unwrap(), im![55, 34; 34, 21]); + assert_eq!(m.checked_pow(10).unwrap(), im![89, 55; 55, 34]); + + let m2 = Matrix::new(vec![ + vec![Rational64::new(1, 1), Rational64::new(1, 2)], + vec![Rational64::new(1, 3), Rational64::new(1, 4)], + ]) + .context("Failed to create matrix - something is wrong with the test") + .unwrap(); + assert_eq!(m2.checked_pow(0).unwrap(), rm![1, 0; 0, 1]); + assert_eq!(m2.checked_pow(1).unwrap(), m2); + assert_eq!(m2.checked_pow(2).unwrap(), m2.clone() * m2.clone()); + assert_eq!(m2.checked_pow(3).unwrap(), m2.clone() * m2.clone() * m2); + } + + #[test] + fn test_from_vec() { + let m = Matrix::from_vec(rv![1, 2, 3, 4, 5, 6], (2, 3)).expect("Failed to create matrix"); + assert_eq!( + m, + rm![ + 1, 2, 3; + 4, 5, 6; + ] + ); + + let m = Matrix::from_vec(vec![1, 2, 3, 4, 5, 6], (2, 3)).expect("Failed to create matrix"); + assert_eq!( + m, + im![ + 1, 2, 3; + 4, 5, 6; + ] + ); + } + + #[test] + fn test_reshape() { + let m = im![1, 2, 3, 4, 5, 6]; + let reshape = |m: &Matrix, shape| m.reshape(shape).expect("Failed to reshape matrix"); + assert_eq!(reshape(&m, (2, 3)), im![1, 2, 3; 4, 5, 6]); + assert_eq!(reshape(&m, (3, 2)), im![1, 2; 3, 4; 5, 6]); + assert_eq!(reshape(&m, (6, 1)), im![1; 2; 3; 4; 5; 6]); + assert_eq!(reshape(&m, (1, 6)), im![1, 2, 3, 4, 5, 6]); + } +} diff --git a/src/matrix_algorithms.rs b/src/matrix_algorithms.rs new file mode 100644 index 0000000..3bec91e --- /dev/null +++ b/src/matrix_algorithms.rs @@ -0,0 +1,352 @@ +use crate::matrices::Matrix; +use crate::traits::{LaTeXable, MatrixNumber}; +use anyhow::Context; + +#[derive(Debug, Clone)] +pub struct Aftermath { + pub result: Matrix, + pub steps: Vec, +} + +impl Matrix { + /// Returns a copy of the matrix which is in the row echelon form along + /// with all steps represented in human-friendly LaTeX notation. + /// Uses Gaussian elimination combined with some heuristics aiming at + /// making the number of steps as small as possible. + pub fn echelon(&self) -> anyhow::Result> { + const CONTEXT: &str = "Calculations error!"; + + if self.is_empty() { + return Ok(Aftermath { + result: self.clone(), + steps: vec![], + }); + } + + let (rows, cols) = self.get_shape(); + + let mut steps = vec![self.to_latex()]; + let mut c = 0; + let mut i = 0; + let mut data = self.deep_matrix_data_clone(); + + while c < cols && i < rows { + let mut j = i; + for k in i + 1..rows { + if Self::nice(&data[k][c]).context(CONTEXT)? + < Self::nice(&data[j][c]).context(CONTEXT)? + { + j = k; + } + } + + if !data[j][c].is_zero() { + if i != j { + data.swap(i, j); + data = Self::push_step( + &mut steps, + format!(r"w_{{{}}} \leftrightarrow w_{{{}}}", i + 1, j + 1).as_str(), + data, + self.get_separator(), + ); + } + + if !data[i][c].is_one() { + let d = data[i][c].clone(); + for j in c..cols { + data[i][j] = data[i][j].checked_div(&d).context(CONTEXT)?; + } + + data = Self::push_step( + &mut steps, + format!(r"w_{{{}}} : {}", i + 1, d.to_latex_single()).as_str(), + data, + self.get_separator(), + ); + } + + let mut step_ops: Vec = Vec::new(); + for j in 0..rows { + if j != i && !data[j][c].is_zero() { + let p = data[j][c].checked_div(&data[i][c]).context(CONTEXT)?; + for k in c..cols { + data[j][k] = data[j][k] + .checked_sub(&data[i][k].checked_mul(&p).context(CONTEXT)?) + .context(CONTEXT)?; + } + + step_ops.push(format!( + "w_{{{}}} {}w_{{{}}}", + j + 1, + Self::sub_coefficient_to_latex(&p).context(CONTEXT)?, + i + 1 + )); + } + } + + if !step_ops.is_empty() { + data = Self::push_step( + &mut steps, + format!(r"\substack{{{}}}", &step_ops.join(r"\\")).as_str(), + data, + self.get_separator(), + ); + } + + i += 1; + } + + c += 1; + } + + Ok(Aftermath { + result: Self::new_unsafe(data), + steps, + }) + } + + /// Returns the inverse of the matrix along with all steps represented in + /// human-friendly LaTeX notation. + pub fn inverse(&self) -> anyhow::Result> { + if self.is_empty() { + anyhow::bail!("Cannot calculate inverse of an empty matrix!"); + } + + let (rows, cols) = self.get_shape(); + if rows != cols { + anyhow::bail!("Matrix is not square!"); + } + + let extended_matrix = self.clone().concat(Matrix::identity(rows))?; + let echelon_aftermath = extended_matrix.with_separator(Some(rows)).echelon()?; + let (left, right) = echelon_aftermath.result.split(rows)?; + if left != Matrix::identity(rows) { + anyhow::bail!("Matrix is not invertible!"); + } + + Ok(Aftermath { + result: right, + steps: echelon_aftermath.steps, + }) + } + + /// Returns the transpose of the matrix. + /// The transpose of a matrix is an operator which flips a matrix over its + /// diagonal, that is it switches the row and column indices of the matrix + /// by producing another matrix denoted as A^T. + pub fn transpose(&self) -> Matrix { + let (rows, cols) = self.get_shape(); + let mut data = Matrix::zeros((cols, rows)).consume(); + for i in 0..rows { + for (j, col) in data.iter_mut().enumerate() { + col[i] = self.get_data()[i][j].clone(); + } + } + Self::new_unsafe(data) + } + + /// Returns a deep copy of matrix data vector. + fn deep_matrix_data_clone(&self) -> Vec> { + self.get_data().iter().map(|row| row.to_vec()).collect() + } + + /// Inserts the LaTeX representation of a single echelonization step with + /// transitions `transitions` and matrix containing `data` with separator + /// `separator` into `steps`. + fn push_step( + steps: &mut Vec, + transitions: &str, + data: Vec>, + separator: Option, + ) -> Vec> { + let temp_matrix = Self::new_unsafe(data).with_separator(separator); + steps.push(format!( + r"\xrightarrow{{{}}} {}", + transitions, + temp_matrix.to_latex(), + )); + temp_matrix.consume() + } + + /// Returns an integer representing how nice a row starting with the given + /// coefficient is to be used in a step of Gaussian elimination. The smaller + /// value means the better choice. + fn nice(coefficient: &T) -> Option { + if coefficient.is_zero() { + // should not be chosen if there is any row with nonzero leading coefficient + Some(1000) + } else if coefficient.is_one() { + // the easiest one, does not need to be changed + Some(0) + } else if (T::zero().checked_sub(coefficient)?).is_one() { + // we only have to negate all elements + Some(1) + } else { + // if there is no better choice... + Some(2) + } + } + + /// How the substraction of an identifier multiplied by the given coefficient + /// should be printed in LaTeX. + /// For example, `sub_coefficient_to_latex(1)` returns `- `, as it is not + /// necessary to write `- 1w`, but `- w` is sufficient and + /// `sub_coefficient_to_latex(-5)` returns `+ 5`, because `+ 5w` is easier + /// to read than `- (-5)w`. + /// Assumes that the coefficient is nonzero. + fn sub_coefficient_to_latex(coefficient: &T) -> Option { + if coefficient.is_one() { + Some("- ".to_string()) + } else if (T::zero().checked_sub(coefficient)?).is_one() { + Some("+ ".to_string()) + } else if coefficient.is_positive() { + Some(format!("- {}", coefficient.to_latex())) + } else if coefficient.is_negative() { + Some(format!( + "+ {}", + (T::zero().checked_sub(coefficient)?.to_latex()) + )) + } else { + unreachable!("Should not be used for zero coefficient!") + } + } +} + +#[cfg(test)] +mod tests { + use crate::traits::LaTeXable; + use crate::{matrices::Matrix, ri, rm, rv}; + use num_rational::Rational64; + use num_traits::One; + + #[test] + fn test_echelon_rational1() { + let m = rm![-2, 1; 1, 1]; + let expected = rm![1, 0; 0, 1]; + + let aftermath = m.echelon().unwrap(); + + assert_eq!(aftermath.result.to_latex(), expected.to_latex()); + assert_eq!( + aftermath.steps, + vec![ + r"\left[\begin{array}{cc}-2 & 1\\1 & 1\end{array}\right]", + r"\xrightarrow{w_{1} \leftrightarrow w_{2}} \left[\begin{array}{cc}1 & 1\\-2 & 1\end{array}\right]", + r"\xrightarrow{\substack{w_{2} + 2w_{1}}} \left[\begin{array}{cc}1 & 1\\0 & 3\end{array}\right]", + r"\xrightarrow{w_{2} : 3} \left[\begin{array}{cc}1 & 1\\0 & 1\end{array}\right]", + r"\xrightarrow{\substack{w_{1} - w_{2}}} \left[\begin{array}{cc}1 & 0\\0 & 1\end{array}\right]", + ] + ); + } + + #[test] + fn test_echelon_rational2() { + let m = rm![4, 3; 2, 1]; + let expected = rm![1, 0; 0, 1]; + + let aftermath = m.echelon().unwrap(); + + assert_eq!(aftermath.result.to_latex(), expected.to_latex()); + assert_eq!( + aftermath.steps, + vec![ + r"\left[\begin{array}{cc}4 & 3\\2 & 1\end{array}\right]", + r"\xrightarrow{w_{1} : 4} \left[\begin{array}{cc}1 & \frac{3}{4}\\2 & 1\end{array}\right]", + r"\xrightarrow{\substack{w_{2} - 2w_{1}}} \left[\begin{array}{cc}1 & \frac{3}{4}\\0 & -\frac{1}{2}\end{array}\right]", + r"\xrightarrow{w_{2} : \left(-\frac{1}{2}\right)} \left[\begin{array}{cc}1 & \frac{3}{4}\\0 & 1\end{array}\right]", + r"\xrightarrow{\substack{w_{1} - \frac{3}{4}w_{2}}} \left[\begin{array}{cc}1 & 0\\0 & 1\end{array}\right]", + ] + ); + } + + #[test] + fn test_echelon_rational3() { + let id = rm![1, 0; 0, 1]; + + let aftermath = id.echelon().unwrap(); + + assert_eq!(aftermath.result.to_latex(), id.to_latex()); + assert_eq!( + aftermath.steps, + vec![r"\left[\begin{array}{cc}1 & 0\\0 & 1\end{array}\right]"] + ); + } + + #[test] + fn test_echelon_rational4() { + let m = rm![1, -1, 1; 1, 1, -1; -1, 1, -1]; + let expected = rm![1, 0, 0; 0, 1, -1; 0, 0, 0]; + + let aftermath = m.echelon().unwrap(); + + assert_eq!(aftermath.result.to_latex(), expected.to_latex()); + assert_eq!( + aftermath.steps, + vec![ + r"\left[\begin{array}{ccc}1 & -1 & 1\\1 & 1 & -1\\-1 & 1 & -1\end{array}\right]", + r"\xrightarrow{\substack{w_{2} - w_{1}\\w_{3} + w_{1}}} \left[\begin{array}{ccc}1 & -1 & 1\\0 & 2 & -2\\0 & 0 & 0\end{array}\right]", + r"\xrightarrow{w_{2} : 2} \left[\begin{array}{ccc}1 & -1 & 1\\0 & 1 & -1\\0 & 0 & 0\end{array}\right]", + r"\xrightarrow{\substack{w_{1} + w_{2}}} \left[\begin{array}{ccc}1 & 0 & 0\\0 & 1 & -1\\0 & 0 & 0\end{array}\right]", + ] + ); + } + + #[test] + fn test_inverse_rational1() { + let m = rm![1, 2; 3, 4]; + let expected = Matrix::new(vec![ + vec![(-2).into(), 1.into()], + vec![Rational64::new(3, 2), Rational64::new(-1, 2)], + ]) + .unwrap(); + + let aftermath = m.inverse().unwrap(); + + assert_eq!(aftermath.result.to_latex(), expected.to_latex()); + assert_eq!( + aftermath.steps, + vec![ + r"\left[\begin{array}{cc|cc}1 & 2 & 1 & 0\\3 & 4 & 0 & 1\end{array}\right]", + r"\xrightarrow{\substack{w_{2} - 3w_{1}}} \left[\begin{array}{cc|cc}1 & 2 & 1 & 0\\0 & -2 & -3 & 1\end{array}\right]", + r"\xrightarrow{w_{2} : \left(-2\right)} \left[\begin{array}{cc|cc}1 & 2 & 1 & 0\\0 & 1 & \frac{3}{2} & -\frac{1}{2}\end{array}\right]", + r"\xrightarrow{\substack{w_{1} - 2w_{2}}} \left[\begin{array}{cc|cc}1 & 0 & -2 & 1\\0 & 1 & \frac{3}{2} & -\frac{1}{2}\end{array}\right]", + ] + ); + } + + #[test] + fn test_transpose_rational1() { + let m = rm![1, 2; 3, 4]; + let expected = rm![1, 3; 2, 4]; + + let transposition = m.transpose(); + + assert_eq!(transposition, expected); + } + + #[test] + fn test_transpose_rational2() { + let m = rm![1, 2, 3; 4, 5, 6]; + let expected = rm![1, 4; 2, 5; 3, 6]; + + let transposition = m.transpose(); + + assert_eq!(transposition, expected); + } + + #[test] + fn test_transpose_rational_null_matrix() { + let expected = Matrix::empty(); + let test_null_matrix = |cols, rows| { + let m = Matrix::::filled((cols, rows), |_, _| Rational64::one()); + + let transposition = m.transpose(); + + assert_eq!(transposition, expected); + }; + + test_null_matrix(0, 0); + test_null_matrix(0, 7); + test_null_matrix(7, 0); + } +} diff --git a/src/parser.rs b/src/parser.rs new file mode 100644 index 0000000..ebfdf05 --- /dev/null +++ b/src/parser.rs @@ -0,0 +1,689 @@ +use std::collections::VecDeque; +use std::fmt::{Display, Formatter}; + +use anyhow::{bail, Context}; +use num_traits::checked_pow; + +use crate::environment::{Environment, Identifier, Type}; +use crate::traits::MatrixNumber; + +#[derive(Debug, Clone, PartialEq, Eq)] +enum Token { + Integer(u64), + Identifier(Identifier), + Operator(char), + LeftBracket, + RightBracket, +} + +impl Display for Token { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + Token::Integer(i) => write!(f, "int {i}"), + Token::Identifier(id) => write!(f, "id {}", id.to_string()), + Token::Operator(op) => write!(f, "operator \"{op}\""), + Token::LeftBracket => write!(f, "( bracket"), + Token::RightBracket => write!(f, ") bracket"), + } + } +} + +struct Tokenizer<'a> { + raw: &'a str, +} + +impl<'a> Tokenizer<'a> { + fn new(raw: &'a str) -> Self { + Tokenizer { raw } + } + + fn next_token(&mut self) -> anyhow::Result> { + self.raw = self.raw.trim_start(); + if self.raw.is_empty() { + Ok(None) + } else if self.raw.starts_with('(') { + self.raw = &self.raw[1..]; + Ok(Some(Token::LeftBracket)) + } else if self.raw.starts_with(')') { + self.raw = &self.raw[1..]; + Ok(Some(Token::RightBracket)) + } else if self.raw.starts_with(|c| "+-*/^=".contains(c)) { + let op = self.raw.chars().next().unwrap(); + self.raw = &self.raw[1..]; + Ok(Some(Token::Operator(op))) + } else if self.raw.starts_with(|c: char| c.is_ascii_digit()) { + let i = self + .raw + .find(|c: char| !c.is_ascii_digit()) + .unwrap_or(self.raw.len()); + let num = &self.raw[..i]; + self.raw = &self.raw[i..]; + Ok(Some(Token::Integer(num.parse::()?))) + } else if let Some(rest) = self.raw.strip_prefix(Identifier::RESULT) { + self.raw = rest; + Ok(Some(Token::Identifier(Identifier::result()))) + } else { + let i = self + .raw + .find(|c: char| !c.is_alphanumeric() && c != '_') + .unwrap_or(self.raw.len()); + let id = Identifier::new(self.raw[..i].to_string())?; + self.raw = &self.raw[i..]; + Ok(Some(Token::Identifier(id))) + } + } +} + +#[derive(Clone, PartialEq, Eq)] +enum WorkingToken { + Type(Type), + Function(Identifier), + UnaryOp(char), + BinaryOp(char), + LeftBracket, + RightBracket, +} + +impl Display for WorkingToken { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + WorkingToken::Type(_) => write!(f, "value token"), + WorkingToken::Function(_) => write!(f, "function token"), + WorkingToken::UnaryOp(op) => write!(f, "unary operator \"{op}\""), + WorkingToken::BinaryOp(op) => write!(f, "binary operator \"{op}\""), + WorkingToken::LeftBracket => write!(f, "( bracket"), + WorkingToken::RightBracket => write!(f, ") bracket"), + } + } +} + +fn binary_op(left: Type, right: Type, op: char) -> anyhow::Result> { + match op { + '+' => match (left, right) { + (Type::Matrix(l), Type::Matrix(r)) => Type::from_matrix_result(l.checked_add(&r)), + (Type::Scalar(l), Type::Scalar(r)) => Type::from_scalar_option(l.checked_add(&r)), + _ => bail!("Adding scalar to matrix is not supported!"), + }, + '-' => match (left, right) { + (Type::Matrix(l), Type::Matrix(r)) => Type::from_matrix_result(l.checked_sub(&r)), + (Type::Scalar(l), Type::Scalar(r)) => Type::from_scalar_option(l.checked_sub(&r)), + _ => bail!("Substraction of scalar and matrix is not supported!"), + }, + '*' => match (left, right) { + (Type::Matrix(l), Type::Matrix(r)) => Type::from_matrix_result(l.checked_mul(&r)), + (Type::Scalar(l), Type::Scalar(r)) => Type::from_scalar_option(l.checked_mul(&r)), + (Type::Matrix(l), Type::Scalar(r)) => Type::from_matrix_result(l.checked_mul_scl(&r)), + (Type::Scalar(l), Type::Matrix(r)) => Type::from_matrix_result(r.checked_mul_scl(&l)), + }, + '/' => match (left, right) { + (Type::Scalar(l), Type::Scalar(r)) => { + if !r.is_zero() { + Type::from_scalar_option(l.checked_div(&r)) + } else { + bail!("Division by zero!") + } + } + (Type::Matrix(_), Type::Matrix(_)) => { + bail!("WTF dividing by matrix? You should use the `inverse` function instead!") + } + (Type::Matrix(_), Type::Scalar(_)) => { + bail!("Diving matrix by scalar is not supported yet...") + } + (Type::Scalar(_), Type::Matrix(_)) => { + bail!("Diving scalar by matrix does not make sense!") + } + }, + '^' => { + if let Type::Scalar(exp) = right { + let exp = exp + .to_usize() + .context("Exponent should be a nonnegative integer.")?; + match left { + Type::Scalar(base) => Type::from_scalar_option(checked_pow(base, exp)), + Type::Matrix(base) => Type::from_matrix_result(base.checked_pow(exp)), + } + } else { + bail!("Exponent cannot be a matrix!"); + } + } + _ => unimplemented!(), + } +} + +fn unary_op(arg: Type, op: char) -> anyhow::Result> { + match op { + '+' => Ok(arg), + '-' => match arg { + Type::Matrix(m) => Type::from_matrix_result(m.checked_neg()), + Type::Scalar(s) => Type::from_scalar_option(T::zero().checked_sub(&s)), + }, + _ => unimplemented!(), + } +} + +/* + ::= "0" | "1" | ... | "9" + ::= + + ::= "a" | "ą" | "b" | ... | "ż" + ::= ( | "_") ( | | "_")* | "$" + ::= "+" | "-" + ::= "+" | "-" | "*" | "/" + ::= | | + | "(" ")" | | "(" ")" + */ +pub fn parse_expression( + raw: &str, + env: &Environment, +) -> anyhow::Result> { + let mut tokenizer = Tokenizer::new(raw); + let mut operators: VecDeque> = VecDeque::new(); + let mut outputs: VecDeque> = VecDeque::new(); + let mut prev_token = None; + + fn precedence(c: &char) -> u8 { + match c { + '+' | '-' => 0, + '*' | '/' => 1, + '^' => 2, + _ => unreachable!(), + } + } + + fn validate_neighbours( + previous: &Option<&WorkingToken>, + current: &Token, + ) -> bool { + match current { + Token::Integer(_) | Token::Identifier(_) | Token::LeftBracket => matches!( + previous, + None | Some(WorkingToken::LeftBracket) + | Some(WorkingToken::BinaryOp(_)) + | Some(WorkingToken::UnaryOp(_)) + | Some(WorkingToken::Function(_)) + ), + Token::Operator(_) => matches!( + previous, + None | Some(WorkingToken::RightBracket) + | Some(WorkingToken::Type(_)) + | Some(WorkingToken::BinaryOp(_)) + | Some(WorkingToken::LeftBracket) + ), + Token::RightBracket => matches!( + previous, + Some(WorkingToken::RightBracket) | Some(WorkingToken::Type(_)) + ), + } + } + + while let Some(token) = tokenizer.next_token()? { + if !validate_neighbours(&prev_token, &token) { + match prev_token { + Some(prev_token) => { + bail!("Invalid expression! The {token} cannot follow {prev_token}") + } + None => bail!("Invalid expression! The {token} cannot be the first token!"), + } + } + + prev_token = match &token { + Token::Integer(num) => { + outputs.push_back(WorkingToken::Type(Type::Scalar( + T::from_u64(*num).context(format!( + "Number conversion failed! {num:?} cannot be parsed into {:?}", + std::any::type_name::() + ))?, + ))); + outputs.back() + } + Token::Identifier(id) => { + if let Some(value) = env.get_value(id) { + outputs.push_back(WorkingToken::Type(value.clone())); + outputs.back() + } else if env.get_function(id).is_some() { + operators.push_front(WorkingToken::Function(id.clone())); + operators.front() + } else { + bail!( + "Undefined identifier! Object \"{}\" is unknown.", + id.to_string() + ) + } + } + Token::LeftBracket => { + operators.push_front(WorkingToken::LeftBracket); + operators.front() + } + Token::RightBracket => { + let mut left_found = false; + while let Some(op) = operators.pop_front() { + if matches!(op, WorkingToken::LeftBracket) { + left_found = true; + break; + } + outputs.push_back(op); + } + if !left_found { + bail!("Mismatched brackets!"); + } + if let Some(op) = operators.pop_front() { + match op { + WorkingToken::UnaryOp(_) | WorkingToken::Function(_) => { + outputs.push_back(op) + } + _ => operators.push_front(op), + } + } + Some(&WorkingToken::RightBracket) + } + Token::Operator(op) + if matches!( + prev_token, + None | Some(WorkingToken::LeftBracket) | Some(WorkingToken::BinaryOp(_)) + ) => + { + if "+-".contains(*op) { + operators.push_front(WorkingToken::UnaryOp(*op)); + operators.front() + } else { + bail!("Operator {op} cannot be used as a unary operator.") + } + } + Token::Operator(op) if "+-*/^".contains(*op) => { + while let Some(stack_token) = operators.pop_front() { + if let WorkingToken::BinaryOp(stack_op) = stack_token { + if precedence(&stack_op) >= precedence(op) { + outputs.push_back(WorkingToken::BinaryOp(stack_op)); + } else { + operators.push_front(WorkingToken::BinaryOp(stack_op)); + break; + } + } else if let WorkingToken::UnaryOp(stack_op) = stack_token { + outputs.push_back(WorkingToken::UnaryOp(stack_op)) + } else { + operators.push_front(stack_token); + break; + } + } + operators.push_front(WorkingToken::BinaryOp(*op)); + operators.front() + } + Token::Operator(_) => bail!("Assignment is not allowed in expressions!"), + }; + } + + while let Some(token) = operators.pop_front() { + if matches!(token, WorkingToken::LeftBracket) { + bail!("Mismatched brackets!"); + } + outputs.push_back(token); + } + + let mut val_stack: VecDeque> = VecDeque::new(); + while let Some(token) = outputs.pop_front() { + match token { + WorkingToken::Type(value) => val_stack.push_front(value), + WorkingToken::BinaryOp(op) => { + let right = val_stack.pop_front().context("Invalid expression!")?; + let left = val_stack.pop_front().context("Invalid expression!")?; + val_stack.push_front(binary_op(left, right, op)?) + } + WorkingToken::UnaryOp(op) => { + let arg = val_stack.pop_front().context("Invalid expression!")?; + val_stack.push_front(unary_op(arg, op)?); + } + WorkingToken::Function(id) => { + let arg = val_stack.pop_front().context("Invalid expression!")?; + val_stack.push_front(env.get_function(&id).unwrap()(arg)?); + } + _ => unreachable!(), + } + } + + val_stack.pop_front().context("Invalid expression!") +} + +/* + ::= = | + */ +pub fn parse_instruction( + raw: &str, + env: &mut Environment, +) -> anyhow::Result { + let mut tokenizer = Tokenizer::new(raw); + if let Some(Token::Identifier(id)) = tokenizer.next_token()? { + if tokenizer.next_token()? == Some(Token::Operator('=')) { + let value = parse_expression(tokenizer.raw, env)?; + env.insert(id.clone(), value); + return Ok(id); + } + } + + let value = parse_expression(raw, env)?; + env.insert(Identifier::result(), value); + Ok(Identifier::result()) +} + +#[cfg(test)] +mod tests { + use crate::matrices::Matrix; + use num_rational::Rational64; + + use crate::im; + + use super::*; + + #[test] + fn test_expression_simple() { + let mut env = Environment::new(); + env.insert(Identifier::new("a".to_string()).unwrap(), Type::Scalar(2)); + env.insert(Identifier::new("b".to_string()).unwrap(), Type::Scalar(3)); + assert_eq!(parse_expression("a+b*b", &env).unwrap(), Type::Scalar(11)); + assert_eq!(parse_expression("(a+b)*b", &env).unwrap(), Type::Scalar(15)); + } + + #[test] + fn test_expression_numbers() { + let env = Environment::new(); + + let test_expr = |raw, a, b| { + assert_eq!( + parse_expression(raw, &env).unwrap(), + Type::Scalar(Rational64::new(a, b)) + ) + }; + + test_expr("2+2", 4, 1); + test_expr("(2-6*9)/5", -52, 5); + test_expr("2-6*9/5", -44, 5); + test_expr("(2-6)*9/5", -36, 5); + test_expr("(2-6*9/5)", -44, 5); + test_expr("1/2^8", 1, 256); + } + + #[test] + fn test_expression_unary() { + let mut env = Environment::new(); + env.insert(Identifier::new("x".to_string()).unwrap(), Type::Scalar(-5)); + let a = im![1, 2, 3; 4, 5, 6]; + env.insert( + Identifier::new("A".to_string()).unwrap(), + Type::Matrix(a.clone()), + ); + + let test_expr = |raw, expected| assert_eq!(parse_expression(raw, &env).unwrap(), expected); + + test_expr("-1", Type::Scalar(-1)); + test_expr("-x", Type::Scalar(5)); + test_expr("-1+3", Type::Scalar(2)); + test_expr("-(1+3)", Type::Scalar(-4)); + test_expr("2+(-2)", Type::Scalar(0)); + test_expr("1 - -1", Type::Scalar(2)); + test_expr("+1 + +1", Type::Scalar(2)); + test_expr("2 * -3", Type::Scalar(-6)); + test_expr("+2 * +3", Type::Scalar(6)); + + test_expr("-A", Type::Matrix(a.checked_neg().unwrap())); + test_expr("+A + -A - -A", Type::Matrix(a.clone())); + test_expr("+A - +A + +A", Type::Matrix(a)); + } + + #[test] + fn test_expression_identifiers() { + let mut env = Environment::new(); + env.insert( + Identifier::new("_i_love_rust_69".to_string()).unwrap(), + Type::Scalar(69), + ); + env.insert( + Identifier::new("_i_love_rust_42".to_string()).unwrap(), + Type::Scalar(42), + ); + assert_eq!( + parse_expression("_i_love_rust_69-_i_love_rust_42", &env).unwrap(), + Type::Scalar(27) + ); + } + + #[test] + fn test_expression_whitespaces() { + let mut env = Environment::new(); + env.insert(Identifier::new("a".to_string()).unwrap(), Type::Scalar(2)); + assert_eq!( + parse_expression("a + 1+2\t*a", &env).unwrap(), + Type::Scalar(7) + ); + } + + #[test] + fn test_expression_matrices() { + let mut env = Environment::new(); + let a = im![1, 2, 3; 4, 5, 6]; + let b = im![1, 2; 3, 4; 5, 6]; + let i2 = im![1, 0; 0, 1]; + + env.insert( + Identifier::new("A".to_string()).unwrap(), + Type::Matrix(a.clone()), + ); + env.insert( + Identifier::new("B".to_string()).unwrap(), + Type::Matrix(b.clone()), + ); + env.insert( + Identifier::new("Id_2".to_string()).unwrap(), + Type::Matrix(i2.clone()), + ); + + let test_expr = |raw, expected| { + assert_eq!(parse_expression(raw, &env).unwrap(), Type::Matrix(expected)) + }; + + test_expr("A+A", a.clone() + a.clone()); + test_expr("A*B", a.clone() * b.clone()); + test_expr("A*B*Id_2", a * b * i2.clone()); + test_expr("Id_2-Id_2", i2.clone() - i2); + } + + #[test] + fn test_expression_matrices_scalar() { + let mut env = Environment::new(); + let a = im![1, 2, 3; 4, 5, 6]; + let b = im![1, 2; 3, 4; 5, 6]; + let c = im![2, 3; 0, -1]; + let i2 = im![1, 0; 0, 1]; + + env.insert( + Identifier::new("A".to_string()).unwrap(), + Type::Matrix(a.clone()), + ); + env.insert( + Identifier::new("B".to_string()).unwrap(), + Type::Matrix(b.clone()), + ); + env.insert( + Identifier::new("C".to_string()).unwrap(), + Type::Matrix(c.clone()), + ); + env.insert( + Identifier::new("Id_2".to_string()).unwrap(), + Type::Matrix(i2.clone()), + ); + env.insert(Identifier::new("a".to_string()).unwrap(), Type::Scalar(2)); + + let test_expr = |raw, expected| { + assert_eq!(parse_expression(raw, &env).unwrap(), Type::Matrix(expected)) + }; + + test_expr("A+a*A", a.clone() + a.clone() * 2); + test_expr("A*2*B", a.clone() * b.clone() * 2); + test_expr("A*B*a*Id_2", a * b * i2.clone() * 2); + test_expr("2*Id_2-Id_2", i2.clone() * 2 - i2.clone()); + test_expr("C^0", i2); + test_expr("C^1", c.clone()); + test_expr("C^2", c.clone() * c); + } + + #[test] + fn test_nested_multiplication() { + let mut env = Environment::new(); + let fib = im![0, 1; 1, 1]; + + env.insert(Identifier::new("A".to_string()).unwrap(), Type::Matrix(fib)); + + let test_expr = |raw, expected| { + assert_eq!(parse_expression(raw, &env).unwrap(), Type::Matrix(expected)) + }; + + test_expr("A^10", im![34, 55; 55, 89]); + test_expr("A*A*A*A*A*A*A*A*A*A", im![34, 55; 55, 89]); + test_expr("A*A*A*A*(A*A*A)*A*A*A", im![34, 55; 55, 89]); + test_expr("A*A*A*A*(A*(A*A))*A*A*A", im![34, 55; 55, 89]); + test_expr("A*A*(A*A)*(A*(A*A))*A*A*A", im![34, 55; 55, 89]); + } + + #[test] + fn test_invalid_expressions() { + let env = Environment::::new(); + + let test_invalid_expr = |raw| assert!(matches!(parse_expression(raw, &env), Err(_))); + + test_invalid_expr("2**3"); + test_invalid_expr("2*(3*)5"); + test_invalid_expr("3*()4"); + test_invalid_expr("(2+(3-)3)"); + test_invalid_expr("()"); + } + + #[test] + fn test_assignments_fibonacci() { + let mut env = Environment::::new(); + + let mut exec = |raw| parse_instruction(raw, &mut env).unwrap(); + + exec("a = 0"); + exec("b = 1"); + for _ in 0..10 { + exec("c = a + b"); + exec("a = b"); + exec("b = c"); + } + + assert_eq!( + *env.get_value(&Identifier::new("b".to_string()).unwrap()) + .unwrap(), + Type::::Scalar(89) + ); + } + + #[test] + fn test_expression_as_instruction() { + let mut env = Environment::::new(); + + let mut exec = |raw| parse_instruction(raw, &mut env).unwrap(); + + exec("2 + 2"); + exec("a = $ ^ $"); + + assert_eq!( + *env.get_value(&Identifier::new("a".to_string()).unwrap()) + .unwrap(), + Type::::Scalar(256) + ); + } + + #[test] + fn test_expression_functions() { + let mut env = Environment::new(); + + let a = im![1, 2, 3; 4, 5, 6]; + let at = im![1, 4; 2, 5; 3, 6]; + let b = im![1, 2; 3, 4]; + + env.insert(Identifier::new("A".to_string()).unwrap(), Type::Matrix(a)); + env.insert( + Identifier::new("B".to_string()).unwrap(), + Type::Matrix(b.clone()), + ); + + assert_eq!( + parse_expression("transpose(A)", &env).unwrap(), + Type::Matrix(at) + ); + assert_eq!( + parse_expression("identity(4)", &env).unwrap(), + Type::Matrix(Matrix::identity(4)) + ); + assert_eq!( + parse_expression("inverse(B)", &env).unwrap(), + Type::Matrix(b.inverse().unwrap().result) + ); + } + + #[test] + fn test_nested_functions() { + let mut env = Environment::new(); + + let a = im![1, 2, 3; 4, 5, 6]; + let att = im![1, 2, 3; 4, 5, 6]; + + env.insert(Identifier::new("A".to_string()).unwrap(), Type::Matrix(a)); + + assert_eq!( + parse_expression("transpose(transpose(A))", &env).unwrap(), + Type::Matrix(att) + ) + } + + #[test] + fn test_expr_with_function() { + let mut env = Environment::new(); + + let a = im![1, 2, 3; 4, 5, 6]; + let b = im![1, 2; 3, 4]; + + env.insert(Identifier::new("A".to_string()).unwrap(), Type::Matrix(a)); + env.insert( + Identifier::new("B".to_string()).unwrap(), + Type::Matrix(b.clone()), + ); + + assert_eq!( + parse_expression("transpose(A) * B", &env).unwrap(), + Type::Matrix(im![13, 18; 17, 24; 21, 30]) + ); + } + + #[test] + fn test_expr_in_function() { + let mut env = Environment::new(); + + let a = im![1, 2, 3; 4, 5, 6]; + let i = Matrix::identity(2); + let at = im![1, 4; 2, 5; 3, 6]; + + env.insert(Identifier::new("A".to_string()).unwrap(), Type::Matrix(a)); + env.insert(Identifier::new("I".to_string()).unwrap(), Type::Matrix(i)); + + assert_eq!( + parse_expression("transpose(I * A)", &env).unwrap(), + Type::Matrix(at) + ); + } + + #[test] + fn test_complex_nested_function_with_expr() { + let mut env = Environment::new(); + + let a = im![1, 2, 3; 4, 5, 6]; + + env.insert(Identifier::new("A".to_string()).unwrap(), Type::Matrix(a)); + + assert_eq!( + parse_expression( + "transpose(transpose(identity(2137 - 2135 + 1 - 1 + (42 - 420) * 0) * A) + transpose(identity(2) * A))", + &env + ).unwrap(), + Type::Matrix(im![2, 4, 6; 8, 10, 12]) + ); + } +} diff --git a/src/rationals.rs b/src/rationals.rs new file mode 100644 index 0000000..a0ec972 --- /dev/null +++ b/src/rationals.rs @@ -0,0 +1,152 @@ +use crate::{ + constants::{ + FRACTION_FONT_SIZE_RATIO, FRACTION_HMARGIN, FRACTION_LINE_WIDTH, FRACTION_VMARGIN, + }, + traits::{BoxedShape, GuiDisplayable, LaTeXable}, +}; +use egui::{pos2, vec2, FontId, Rect, Rounding, Shape}; +use num_rational::Rational64; +use num_traits::sign::Signed; + +impl LaTeXable for Rational64 { + fn to_latex(&self) -> String { + match self.is_integer() { + true => format!("{}", self.numer()), + false => format!( + "{}\\frac{{{}}}{{{}}}", + if self.is_positive() { "" } else { "-" }, + self.numer().unsigned_abs(), + self.denom().unsigned_abs() + ), + } + } + + fn to_latex_single(&self) -> String { + if self.is_positive() { + self.to_latex() + } else { + format!(r"\left({}\right)", self.to_latex()) + } + } +} + +impl GuiDisplayable for Rational64 { + fn display_string(&self, _locale: &crate::locale::Locale) -> String { + self.to_string() + } + + fn to_shape( + &self, + ctx: &egui::Context, + font_id: egui::FontId, + color: egui::Color32, + ) -> egui::Shape { + if self.is_integer() { + self.numer().to_shape(ctx, font_id, color) + } else { + let mut num_shape = self.numer().to_shape( + ctx, + FontId { + size: font_id.size * FRACTION_FONT_SIZE_RATIO, + family: font_id.family.clone(), + }, + color, + ); + let mut denom_shape = self.denom().to_shape( + ctx, + FontId { + size: font_id.size * FRACTION_FONT_SIZE_RATIO, + family: font_id.family, + }, + color, + ); + + let num_rect = num_shape.get_rect(); + let denom_rect = denom_shape.get_rect(); + let single_width = num_rect.width().max(denom_rect.width()) + 2. * FRACTION_HMARGIN; + + num_shape.translate(vec2((single_width - num_rect.width()) / 2., 0.)); + denom_shape.translate(vec2( + (single_width - denom_rect.width()) / 2., + num_rect.height() + 2. * FRACTION_VMARGIN + FRACTION_LINE_WIDTH, + )); + + let line_shape = Shape::rect_filled( + Rect { + min: pos2(0., num_rect.height() + FRACTION_VMARGIN), + max: pos2( + single_width, + num_rect.height() + FRACTION_VMARGIN + FRACTION_LINE_WIDTH, + ), + }, + Rounding::none(), + color, + ); + + Shape::Vec(vec![num_shape, denom_shape, line_shape]) + } + } +} + +// Macro to generate a Rational64 from a integer. +// `ri!(1)` is equivalent to `Rational64::from_integer(1)`, but shorter. +// ri stands for Rational from Integer. +#[macro_export] +macro_rules! ri { + ($($t:expr),*) => { + $( + Rational64::from_integer($t) + )* + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::traits::MatrixNumber; + use num_rational::Rational64; + + #[test] + fn test_simple_fraction() { + let r = Rational64::new(7, 21); + assert_eq!(r.to_latex(), "\\frac{1}{3}"); + } + + #[test] + fn test_negative_fraction() { + let r = Rational64::new(-42, 2 * 42); + assert_eq!(r.to_latex(), "-\\frac{1}{2}"); + } + + #[test] + fn test_negative_denominator() { + let r = Rational64::new(151, -2 * 151); + assert_eq!(r.to_latex(), "-\\frac{1}{2}"); + } + + #[test] + fn test_negative_numerator_and_denominator() { + let r = Rational64::new(-10, -20); + assert_eq!(r.to_latex(), "\\frac{1}{2}"); + } + + #[test] + fn test_fraction_normalization() { + let r = Rational64::new(4, 1); + assert_eq!(r.to_latex(), "4"); + } + + #[test] + fn test_fraction_zero() { + let r = Rational64::new(0, 1); + assert_eq!(r.to_latex(), "0"); + } + + #[test] + fn test_matrix_num() { + fn test(_: T) {} + + let r = Rational64::new(4, 1); + test(r); + } +} diff --git a/src/traits.rs b/src/traits.rs new file mode 100644 index 0000000..9a141ca --- /dev/null +++ b/src/traits.rs @@ -0,0 +1,130 @@ +use eframe::epaint::TextShape; +use egui::{pos2, Color32, FontId, Shape}; +use num_traits::{ + CheckedAdd, CheckedDiv, CheckedMul, CheckedSub, FromPrimitive, Signed, ToPrimitive, +}; +use std::str::FromStr; + +use crate::locale::Locale; +use num_traits::Num; + +pub trait LaTeXable { + fn to_latex(&self) -> String; + fn to_latex_single(&self) -> String { + self.to_latex() + } +} + +pub trait CheckedOps: CheckedAdd + CheckedSub + CheckedMul + CheckedDiv {} + +impl CheckedOps for T where T: CheckedAdd + CheckedSub + CheckedMul + CheckedDiv {} + +pub trait GuiDisplayable { + fn display_string(&self, locale: &Locale) -> String; + + fn to_shape(&self, ctx: &egui::Context, font_id: FontId, color: Color32) -> Shape; +} + +pub trait BoxedShape { + fn get_rect(&self) -> egui::Rect; +} + +impl BoxedShape for Shape { + fn get_rect(&self) -> egui::Rect { + match self { + Shape::Text(text_shape) => text_shape.galley.rect, + _ => self.visual_bounding_rect(), + } + } +} + +pub trait MatrixNumber: + Num + + CheckedOps + + FromPrimitive + + ToPrimitive + + Signed + + LaTeXable + + GuiDisplayable + + Clone + + FromStr + + ToString +{ +} + +impl MatrixNumber for T where + T: Num + + CheckedOps + + FromPrimitive + + ToPrimitive + + Signed + + LaTeXable + + GuiDisplayable + + Clone + + FromStr + + ToString +{ +} + +#[macro_export] +macro_rules! to_string_to_latex { + ($($t:ty),*) => { + $( + impl LaTeXable for $t { + fn to_latex(&self) -> String { + self.to_string() + } + } + )* + } +} + +#[macro_export] +macro_rules! gui_displayable_for_primitive { + ($($t:ty),*) => { + $( + impl GuiDisplayable for $t { + fn display_string(&self, _locale: &Locale) -> String { + self.to_string() + } + + fn to_shape(&self, ctx: &egui::Context, font_id: FontId, color: Color32) -> Shape { + let text_shape = TextShape::new( + pos2(0., 0.), + ctx.fonts(|f| f.layout_no_wrap(self.to_string(), font_id, color)), + ); + Shape::Text(text_shape) + } + } + )* + } +} + +// We add LaTeX support for all the basic types +to_string_to_latex!(i8, i16, i32, i64, i128, isize); + +// We add display support for all the basic types +gui_displayable_for_primitive!(i8, i16, i32, i64, i128, isize); + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_matrix_number() { + fn test() { + let t = T::one(); + assert_eq!(t.to_latex(), t.to_string()); + } + + macro_rules! test_matrix_number { + ($($t:ty),*) => { + $( + test::<$t>(); + )* + } + } + + test_matrix_number!(i8, i16, i32, i64, i128, isize); + } +}