diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 72e9c7a1..34698b80 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -11,10 +11,32 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - - name: Dart and Flutter Package Publisher + - name: Replace symlinks before publish + run: ./scripts/replace_symlinks_before_publish.sh + + - name: Publish agent_dart + uses: k-paxian/dart-package-publisher@master + with: + credentialJson: ${{ secrets.CREDENTIAL_JSON }} + force: true + relativePath: packages/agent_dart + skipTests: true + suppressBuildRunner: true + + - name: Publish agent_dart_base + uses: k-paxian/dart-package-publisher@master + with: + credentialJson: ${{ secrets.CREDENTIAL_JSON }} + force: true + relativePath: packages/agent_dart_base + skipTests: true + suppressBuildRunner: true + + - name: Publish agent_dart_ffi uses: k-paxian/dart-package-publisher@master with: credentialJson: ${{ secrets.CREDENTIAL_JSON }} force: true + relativePath: packages/agent_dart_ffi skipTests: true suppressBuildRunner: true diff --git a/.github/workflows/runnable.yml b/.github/workflows/runnable.yml index 408cb371..74792ea6 100644 --- a/.github/workflows/runnable.yml +++ b/.github/workflows/runnable.yml @@ -14,19 +14,25 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, macos-latest, windows-latest] + os: [macos-latest] steps: - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable + components: rustfmt, clippy - uses: actions/setup-java@v2 with: distribution: 'adopt' - java-version: '11' + java-version: '17' - uses: subosito/flutter-action@v2 with: channel: 'stable' - - run: dart --version - - run: flutter --version - - run: flutter pub get - - run: flutter test ./test/agent_dart_test.dart # This is the only test that's runnable on actions. - - run: dart pub publish --dry-run + - uses: bluefireteam/melos-action@v3 + - name: Replace symlinks + run: ./scripts/replace_symlinks_before_publish.sh + - run: cargo build --package=agent_dart + - run: cd packages/agent_dart_base && dart test ./test/agent_dart_base_test.dart + - name: Publish dry run + run: melos run publish-dry-run if: github.repository == 'AstroxNetwork/agent_dart' diff --git a/.gitignore b/.gitignore index 84d6396b..8527aaa2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ .dart_tool/ .idea/ .vscode/ -.iml .packages .pub/ @@ -10,21 +9,31 @@ build/ .env -pubspec.lock -rust/target -rust/Cargo.lock +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.atom/ +.buildlog/ +.history +.svn/ -_main.dart +# IntelliJ related +*.ipr +*.iws + +# Flutter/Dart/Pub related +pubspec_overrides.yaml +**/doc/api/ +.pub-cache/ +.flutter-plugins +.flutter-plugins-dependencies +**/pubspec.lock # build files /platform-build/ /target/ -# rust/headers/ -# rust/dylib/ -# macos/cli/ -# macos/libagent_dart.a -# ios/libagent_dart.a -# android/src/main/jniLibs/ -# linux/libagent_dart.so -# windows/agent_dart.dll +/Cargo.lock +/platform-build diff --git a/.pubignore b/.pubignore deleted file mode 100644 index d0d88e7c..00000000 --- a/.pubignore +++ /dev/null @@ -1,31 +0,0 @@ -.DS_Store -.dart_tool/ -.idea/ -.vscode/ -.iml - -.packages -.pub/ - -build/ -example/build - -.env -pubspec.lock - -rust/target -rust/Cargo.lock - -_main.dart - -# build files -/platform-build/ -/target/ -/test/_dylib/ - -# Specified to pub.dev -/.github/ -/rust/ -/protobuf/ -/scripts/ -/CODEOWNERS diff --git a/CHANGELOG.md b/CHANGELOG.md index d38d1421..4d69bc79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ that can be found in the LICENSE file. --> # Changelog +## 1.0.0-dev.25 + +- Prepare for monorepo. + ## 1.0.0-dev.24 - Implement subaccount as `Principal.subAccount`, which also removes the `subAccount` parameter diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index ddefd358..00000000 --- a/Cargo.lock +++ /dev/null @@ -1,2033 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array", -] - -[[package]] -name = "aes" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" -dependencies = [ - "cfg-if", - "cipher 0.3.0", - "cpufeatures", - "ctr 0.8.0", - "opaque-debug", -] - -[[package]] -name = "aes" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" -dependencies = [ - "cfg-if", - "cipher 0.4.4", - "cpufeatures", -] - -[[package]] -name = "aes-gcm" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" -dependencies = [ - "aead", - "aes 0.8.3", - "cipher 0.4.4", - "ctr 0.9.2", - "ghash", - "subtle", -] - -[[package]] -name = "agent_dart" -version = "0.0.1" -dependencies = [ - "aes 0.7.5", - "aes-gcm", - "anyhow", - "bip32", - "bip39", - "block-modes", - "bytebuffer", - "ed_compact", - "flutter_rust_bridge", - "flutter_rust_bridge_codegen", - "flutter_rust_bridge_macros", - "hmac", - "k256", - "p256", - "pbkdf2", - "rand", - "scrypt", - "serde", - "serde_bytes", - "serde_cbor", - "serde_json", - "serde_with", - "sha2 0.10.8", -] - -[[package]] -name = "aho-corasick" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" -dependencies = [ - "memchr", -] - -[[package]] -name = "allo-isolate" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56b7997817c178b853573e8bdfb6c3afe02810b43f17d766d6703560074b0c3" -dependencies = [ - "anyhow", - "atomic", - "backtrace", - "chrono", -] - -[[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.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" - -[[package]] -name = "anstyle-parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "anyhow" -version = "1.0.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" -dependencies = [ - "backtrace", -] - -[[package]] -name = "atomic" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bip32" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" -dependencies = [ - "bs58", - "hmac", - "k256", - "once_cell", - "pbkdf2", - "rand_core 0.6.4", - "ripemd", - "sha2 0.10.8", - "subtle", - "zeroize", -] - -[[package]] -name = "bip39" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29b9e657de8ff1c3488a4ab77cb51d604eab53415ce34f0bc800f2eac9b13c28" -dependencies = [ - "bitcoin_hashes", - "rand_core 0.4.2", - "serde", - "unicode-normalization", -] - -[[package]] -name = "bitcoin_hashes" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[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-modes" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb03d1bed155d89dce0f845b7899b18a9a163e148fd004e1c28421a783e2d8e" -dependencies = [ - "block-padding", - "cipher 0.3.0", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" -dependencies = [ - "sha2 0.9.9", -] - -[[package]] -name = "build-target" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832133bbabbbaa9fbdba793456a2827627a7d2b8fb96032fa1e7666d7895832b" - -[[package]] -name = "bumpalo" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" - -[[package]] -name = "bytebuffer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e822a21389d388828152aeae8bb43049196b09076e2a138f53351d8cf6576cf3" -dependencies = [ - "byteorder", -] - -[[package]] -name = "bytemuck" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" - -[[package]] -name = "byteorder" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29b2aa490a8f546381308d68fc79e6bd753cd3ad839f7a7172897f1feedfa175" - -[[package]] -name = "camino" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", -] - -[[package]] -name = "cbindgen" -version = "0.24.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b922faaf31122819ec80c4047cc684c6979a087366c069611e33649bf98e18d" -dependencies = [ - "clap 3.2.25", - "heck", - "indexmap", - "log", - "proc-macro2", - "quote", - "serde", - "serde_json", - "syn 1.0.109", - "tempfile", - "toml", -] - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-targets", -] - -[[package]] -name = "cipher" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" -dependencies = [ - "generic-array", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "clap" -version = "3.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" -dependencies = [ - "atty", - "bitflags 1.3.2", - "clap_lex 0.2.4", - "indexmap", - "strsim", - "termcolor", - "textwrap", -] - -[[package]] -name = "clap" -version = "4.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45" -dependencies = [ - "anstream", - "anstyle", - "clap_lex 0.5.1", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] - -[[package]] -name = "clap_lex" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "colored" -version = "1.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f741c91823341bebf717d4c71bda820630ce065443b58bd1b7451af008355" -dependencies = [ - "is-terminal", - "lazy_static", - "winapi", -] - -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if", - "wasm-bindgen", -] - -[[package]] -name = "const-oid" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" - -[[package]] -name = "convert_case" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb4a24b1aaf0fd0ce8b45161144d6f42cd91677fd5940fd431183eb023b3a2b8" - -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "cpufeatures" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" -dependencies = [ - "libc", -] - -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "ct-codecs" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3b7eb4404b8195a9abb6356f4ac07d8ba267045c8d6d220ac4dc992e6cc75df" - -[[package]] -name = "ctr" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" -dependencies = [ - "cipher 0.3.0", -] - -[[package]] -name = "ctr" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher 0.4.4", -] - -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "dart-sys" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d8b5680b5c2cc52f50acb2457d9b3a3b58adcca785db13a0e3655626f601de6" -dependencies = [ - "cc", -] - -[[package]] -name = "delegate-attr" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51aac4c99b2e6775164b412ea33ae8441b2fde2dbf05a20bc0052a63d08c475b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "crypto-common", - "subtle", -] - -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der", - "elliptic-curve", - "rfc6979", - "signature", -] - -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature", -] - -[[package]] -name = "ed_compact" -version = "0.1.0" -dependencies = [ - "ct-codecs", - "ed25519", - "flutter_rust_bridge_codegen", - "flutter_rust_bridge_macros", - "getrandom", -] - -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct", - "crypto-bigint", - "der", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "hkdf", - "pem-rfc7468", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "enum-iterator" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7add3873b5dd076766ee79c8e406ad1a472c385476b9e38849f8eec24f1be689" -dependencies = [ - "enum-iterator-derive", -] - -[[package]] -name = "enum-iterator-derive" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "enum_dispatch" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e" -dependencies = [ - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "errno" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add4f07d43996f76ef320709726a556a9d4f965d9410d8d0271132d2f8293480" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "fastrand" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" - -[[package]] -name = "fern" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f0c14694cbd524c8720dd69b0e3179344f04ebb5f90f2e4a440c6ea3b2f1ee" -dependencies = [ - "chrono", - "colored", - "log", -] - -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "flutter_rust_bridge" -version = "1.82.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a5a7a1cd030cd63f53eafe2496eb4e40f520800e6e9b78cae6f3f3ba7f3c2b" -dependencies = [ - "allo-isolate", - "anyhow", - "backtrace", - "build-target", - "bytemuck", - "cc", - "chrono", - "console_error_panic_hook", - "dart-sys", - "flutter_rust_bridge_macros", - "js-sys", - "lazy_static", - "libc", - "log", - "parking_lot", - "threadpool", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "flutter_rust_bridge_codegen" -version = "1.82.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5cefe80a6230c66eff7172db1d3979071ad0091b657ad6b683e692dee7875c8" -dependencies = [ - "anyhow", - "atty", - "cargo_metadata", - "cbindgen", - "chrono", - "clap 4.4.6", - "convert_case", - "delegate-attr", - "enum-iterator", - "enum_dispatch", - "fern", - "itertools", - "lazy_static", - "log", - "pathdiff", - "quote", - "regex", - "serde", - "serde_yaml", - "strum_macros", - "syn 2.0.37", - "tempfile", - "thiserror", - "toml", - "topological-sort", -] - -[[package]] -name = "flutter_rust_bridge_macros" -version = "1.82.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7fe743d921bedf4578b9472346d03a9643a01cd565ca7df7961baebad534ba5" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "ghash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d930750de5717d2dd0b8c0d42c076c0e884c81a73e6cab859bbd2339c71e3e40" -dependencies = [ - "opaque-debug", - "polyval", -] - -[[package]] -name = "gimli" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" - -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "half" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" - -[[package]] -name = "hkdf" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows", -] - -[[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 = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi 0.3.3", - "rustix", - "windows-sys", -] - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "js-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "sha2 0.10.8", - "sha3", -] - -[[package]] -name = "keccak" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.148" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3852614a3bd9ca9804678ba6be5e3b8ce76dfc902cae004e3e0c44051b6e88db" - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "maybe-uninit" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" - -[[package]] -name = "memchr" -version = "2.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "num-traits" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.3", - "libc", -] - -[[package]] -name = "object" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "os_str_bytes" -version = "6.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" - -[[package]] -name = "p256" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" -dependencies = [ - "ecdsa", - "elliptic-curve", - "sha2 0.10.8", -] - -[[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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec 1.11.1", - "windows-targets", -] - -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "pathdiff" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", - "hmac", - "password-hash", - "sha2 0.10.8", -] - -[[package]] -name = "pem-rfc7468" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" -dependencies = [ - "base64ct", -] - -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "polyval" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52cff9d1d4dee5fe6d03729099f4a310a41179e0a10dbf542039873f2e826fb" -dependencies = [ - "cfg-if", - "cpufeatures", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "1.0.67" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -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 0.6.4", -] - -[[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 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[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 = "regex" -version = "1.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint", - "hmac", - "zeroize", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustix" -version = "0.38.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f9da0cbd88f9f09e7814e388301c8414c51c62aa6ce1e4b5c551d49d96e531" -dependencies = [ - "bitflags 2.4.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "salsa20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher 0.4.4", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scrypt" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" -dependencies = [ - "hmac", - "password-hash", - "pbkdf2", - "salsa20", - "sha2 0.10.8", -] - -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "semver" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_bytes" -version = "0.11.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_cbor" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" -dependencies = [ - "half", - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "serde_json" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" -dependencies = [ - "serde", - "serde_with_macros", -] - -[[package]] -name = "serde_with_macros" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "serde_yaml" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" -dependencies = [ - "indexmap", - "ryu", - "serde", - "yaml-rust", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "smallvec" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" -dependencies = [ - "maybe-uninit", -] - -[[package]] -name = "smallvec" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" - -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[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.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tempfile" -version = "3.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" -dependencies = [ - "cfg-if", - "fastrand", - "redox_syscall", - "rustix", - "windows-sys", -] - -[[package]] -name = "termcolor" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "textwrap" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" - -[[package]] -name = "thiserror" -version = "1.0.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "topological-sort" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[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.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09c8070a9942f5e7cfccd93f490fdebd230ee3c3c9f107cb25bad5351ef671cf" -dependencies = [ - "smallvec 0.6.14", -] - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle", -] - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[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.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.37", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" - -[[package]] -name = "web-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[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.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[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_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[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_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[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_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "zeroize" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" diff --git a/Cargo.toml b/Cargo.toml index 2277a01c..5e7e9026 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,13 @@ [workspace] members = [ - "rust/agent_dart", - "rust/ed_compact", + "packages/agent_dart_ffi/native/agent_dart", + "packages/agent_dart_ffi/native/ed_compact", +] +exclude = [ + "packages/agent_dart/native", + "packages/agent_dart_base/native", ] [profile.release] lto = true -opt-level = 'z' \ No newline at end of file +opt-level = 'z' diff --git a/README.md b/README.md index 6d0d5869..6eb974a3 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ An agent library built for Internet Computer for Dart and Flutter apps. -**Join the Discord channel: [![Discord](https://img.shields.io/discord/845497925298815036?color=purple&logo=discord&style=flat-square)](https://discord.gg/aNzRuePmUY)** +**Join the Discord channel: [![Discord](https://img.shields.io/discord/845497925298815036?color=purple&logo=discord&style=flat-square)](https://discord.gg/xRVJfPnKGd)** --- @@ -13,7 +13,7 @@ An agent library built for Internet Computer for Dart and Flutter apps. - [Agent Dart](#agent-dart) - [📃 Table of content](#-table-of-content) - - [⚡️ Quick start](#️-quick-start) + - [⚡️ Quick start](#-quick-start) - [For Dart/Flutter app](#for-dartflutter-app) - [For iOS projects](#for-ios-projects) - [For developing the plugin](#for-developing-the-plugin) @@ -22,11 +22,11 @@ An agent library built for Internet Computer for Dart and Flutter apps. - [📖 Documentation](#-documentation) - [🔧 Helpers/Tooling](#-helperstooling) - [💡 Examples](#-examples) - - [🧘‍♂️ Motivation](#️-motivation) + - [🧘‍♂️ Motivation](#-motivation) - [🏆 Milestones](#-milestones) - [👨‍💻 Contributing](#-contributing) - [🔗 Reference and related projects](#-reference-and-related-projects) - - [⚠️ FAQ](#️-faq) + - [⚠️ FAQ](#-faq) - [Build rust libraries for iOS/MacOS](#build-rust-libraries-for-iosmacos) - [Network problem in macOS](#network-problem-in-macos) @@ -69,9 +69,7 @@ make sure you've done the following setup the build settings. ## 🚦 Prerequisites - [CMake](https://cmake.org/) v3.2+ -- [Xcode](https://developer.apple.com/xcode/) v13+ - [Rust](https://www.rust-lang.org/) v1.64+ -- [Node.js](https://nodejs.org/) v16+ ## 🧰 Resources @@ -129,28 +127,20 @@ we will document them as much as possible. By contributing to agent_dart, you agree that your contributions will be licensed under its MIT License. 1. Fork this library and add your own branch like `{feat|fix|test|dep}-{detail}`. - 2. Follow the [Prerequisites](#-prerequisites). - 3. Build rust dependencies for all supported platforms: - -```shell -sh ./scripts/bootstrap -``` - + ```shell + sh ./scripts/bootstrap + ``` 4. Start the example. - -```shell -cd example -flutter run -``` - + ```shell + cd example + flutter run + ``` 5. Tests. (Unit Test and Integration Test) - -```shell -flutter test -``` - + ```shell + flutter test + ``` 6. Commit and make a pull request. ## 🔗 Reference and related projects diff --git a/agent_dart_workspace.iml b/agent_dart_workspace.iml new file mode 100644 index 00000000..7fea928f --- /dev/null +++ b/agent_dart_workspace.iml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/analysis_options.yaml b/analysis_options.yaml index 721f086b..9611fdcd 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,16 +1,20 @@ include: package:lints/recommended.yaml analyzer: + errors: + invalid_annotation_target: ignore exclude: - - 'lib/protobuf/**.dart' - - 'rust/bridge/ffi/**.dart' + - 'packages/**/**.g.dart' + - 'packages/**/**.freezed.dart' + - 'packages/**/bridge_generated.dart' + - 'packages/**/types.pb*.dart' # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options linter: rules: avoid_print: false - avoid_redundant_argument_values: true + avoid_redundant_argument_values: false always_declare_return_types: true directives_ordering: true prefer_const_constructors: true @@ -20,8 +24,9 @@ linter: prefer_final_in_for_each: true prefer_final_locals: true prefer_single_quotes: true - require_trailing_commas: true + require_trailing_commas: false sort_constructors_first: true sort_unnamed_constructors_first: true unnecessary_await_in_return: true + unnecessary_library_name: false unnecessary_parenthesis: true diff --git a/android/.gitignore b/android/.gitignore deleted file mode 100644 index cabef984..00000000 --- a/android/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -*.iml -.gradle -/local.properties -.idea/ -.DS_Store -/build -/captures -/src/main/jniLibs/ -/.cxx diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt deleted file mode 100644 index 7170d2d0..00000000 --- a/android/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -set(LibraryVersion "agent_dart-v1.0.0") # generated; do not edit - -# Unlike the Windows & Linux CMakeLists.txt, this Android equivalent is just here -# to download the Android binaries into src/main/jniLibs/ and does not build anything. -# The binary download/extraction is difficult to do concisely in Groovy/Gradle, -# at least across host platforms, so we are just reusing our Linux/Windows logic. - -# The Flutter tooling requires that developers have CMake 3.10 or later -# installed. You should not increase this version, as doing so will cause -# the plugin to fail to compile for some customers of the plugin. -cmake_minimum_required(VERSION 3.10) - -# Project-level configuration. -set(PROJECT_NAME "agent_dart") # Should match the name field in the pubspec.yaml. -project(PROJECT_NAME) - -# Download the binaries if they are not already present. -set(LibRoot "${CMAKE_CURRENT_SOURCE_DIR}/src/main/jniLibs") -set(ArchivePath "${CMAKE_CURRENT_SOURCE_DIR}/${LibraryVersion}.tar.gz") -if(NOT EXISTS ${ArchivePath}) - file(DOWNLOAD - "https://github.com/AstroxNetwork/agent_dart/releases/download/${LibraryVersion}/android.tar.gz" - ${ArchivePath} - TLS_VERIFY ON - ) -endif() - -# Extract the binaries, overriding any already present. -file(REMOVE_RECURSE ${LibRoot}) -file(MAKE_DIRECTORY ${LibRoot}) -execute_process( - COMMAND ${CMAKE_COMMAND} -E tar xzf ${ArchivePath} - WORKING_DIRECTORY ${LibRoot} -) diff --git a/android/agent_dart-v1.0.0.tar.gz b/android/agent_dart-v1.0.0.tar.gz deleted file mode 100644 index b2a97700..00000000 Binary files a/android/agent_dart-v1.0.0.tar.gz and /dev/null differ diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index 6aa637e8..00000000 --- a/android/build.gradle +++ /dev/null @@ -1,47 +0,0 @@ -group 'com.astrox.agent_dart' -version '1.0-SNAPSHOT' - -buildscript { - ext.kotlin_version = '1.7.10' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.2.2' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -rootProject.allprojects { - repositories { - google() - mavenCentral() - } -} - -apply plugin: 'com.android.library' -apply plugin: 'kotlin-android' - -android { - compileSdkVersion 33 - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - defaultConfig { - minSdkVersion 23 - } - - // Trigger the binary download/update over in CMakeLists.txt - externalNativeBuild { - cmake { - path "CMakeLists.txt" - } - } -} - -dependencies { -} diff --git a/android/src/main/kotlin/com/astrox/agent_dart/AgentDartPlugin.kt b/android/src/main/kotlin/com/astrox/agent_dart/AgentDartPlugin.kt deleted file mode 100644 index 29f095db..00000000 --- a/android/src/main/kotlin/com/astrox/agent_dart/AgentDartPlugin.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.astrox.agent_dart - -import androidx.annotation.NonNull - -import io.flutter.embedding.engine.plugins.FlutterPlugin -import io.flutter.plugin.common.MethodCall -import io.flutter.plugin.common.MethodChannel -import io.flutter.plugin.common.MethodChannel.MethodCallHandler -import io.flutter.plugin.common.MethodChannel.Result - -/** AgentDartPlugin */ -class AgentDartPlugin: FlutterPlugin, MethodCallHandler { - /// The MethodChannel that will the communication between Flutter and native Android - /// - /// This local reference serves to register the plugin with the Flutter Engine and unregister it - /// when the Flutter Engine is detached from the Activity - private lateinit var channel : MethodChannel - - override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { - channel = MethodChannel(flutterPluginBinding.binaryMessenger, "agent_dart") - channel.setMethodCallHandler(this) - } - - override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) { - if (call.method == "getPlatformVersion") { - result.success("Android ${android.os.Build.VERSION.RELEASE}") - } else { - result.notImplemented() - } - } - - override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) { - channel.setMethodCallHandler(null) - } -} diff --git a/example/.metadata b/example/.metadata deleted file mode 100644 index a8ebbd60..00000000 --- a/example/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: fa5883b78e566877613ad1ccb48dd92075cb5c23 - channel: dev - -project_type: app diff --git a/example/README.md b/example/README.md deleted file mode 100644 index 5425e790..00000000 --- a/example/README.md +++ /dev/null @@ -1,72 +0,0 @@ -# agent_dart_example - -**This example is pretty outdated, hang tight** -## IMPORTANT NOTICE -This example is for showing how interaction is done only. -For more complex examples, please stay tuned, we will update the README of the root -## how to run example - -1. use [create-ic-app](https://github.com/MioQuispe/create-ic-app) to bootstrap a local canister project - - Follow instructions here: - [https://github.com/MioQuispe/create-ic-app#get-started](https://github.com/MioQuispe/create-ic-app#get-started) - - It will runs a example `counter` canister on your machine. - - **The counter function is included `caller`, the authorization won't make difference** - -2. dfx port is running randomly. You should be seeing that after you run: - ``` - dfx start --background - ``` - Usually, it is 5 digits integer. like `60916` - -3. write down the counter(*NOT* front end assets) canister id: - - eg: - ```bash - Installing canisters... - Creating UI canister on the local network. - The UI canister on the "local" network is "r7inp-6aaaa-aaaaa-aaabq-cai" # <<< !NOT! this one - Installing code for canister assets, with canister_id rrkah-fqaaa-aaaaa-aaaaq-cai # <<< !NOT! this one - ... - ... - Installing code for canister counter, with canister_id ryjl3-tyaaa-aaaaa-aaaba-cai # <<< THIS IS CORRECT !! - Deployed canisters. - ``` - -4. go back to `agent_example`, change `lib/main.dart` - - ```dart - void initCounter() { - _counter = AgentFactory.create( - canisterId: "ryjl3-tyaaa-aaaaa-aaaba-cai", // << change this - url: "http://localhost:60916", //<< change the port - idl: idl - ) - .hook(Counter()); - } - ``` - -5. run flutter - - use android emulator or ios emulator to run - - ```bash - flutter run - ``` - - if you want to run flutter on macos, please do the following: - - - first `flutter run -d macos`, it will build and run first. - - Then you will came up with an error: - ``` - SocketException: Connection failed (OS Error: Operation not permitted, errno = 1) - ``` - - - Go to file `DebugProfile.entitlements` and `ReleaseProfile.entitlements` under directory macos/Runner/, add the following: - ``` - com.apple.security.network.client - - ``` - \ No newline at end of file diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml deleted file mode 100644 index 5e2133eb..00000000 --- a/example/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: ../analysis_options.yaml diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index b92ff900..00000000 --- a/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/android/gradle.properties b/example/android/gradle.properties deleted file mode 100644 index 94adc3a3..00000000 --- a/example/android/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.useAndroidX=true -android.enableJetifier=true diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 53d5a7cf..00000000 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Fri Jun 23 08:50:38 CEST 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock deleted file mode 100644 index dfc3275c..00000000 --- a/example/ios/Podfile.lock +++ /dev/null @@ -1,28 +0,0 @@ -PODS: - - agent_dart (1.0.0): - - Flutter - - Flutter (1.0.0) - - url_launcher_ios (0.0.1): - - Flutter - -DEPENDENCIES: - - agent_dart (from `.symlinks/plugins/agent_dart/ios`) - - Flutter (from `Flutter`) - - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - -EXTERNAL SOURCES: - agent_dart: - :path: ".symlinks/plugins/agent_dart/ios" - Flutter: - :path: Flutter - url_launcher_ios: - :path: ".symlinks/plugins/url_launcher_ios/ios" - -SPEC CHECKSUMS: - agent_dart: b46ed8b9fdc343017e835108e2275124166df4f7 - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 - url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 - -PODFILE CHECKSUM: b445309b99f7b7cf3037931b19a826b77cf32add - -COCOAPODS: 1.12.1 diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist deleted file mode 100644 index f2a3f1d6..00000000 --- a/example/ios/Runner/Info.plist +++ /dev/null @@ -1,58 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - agent_dart_example - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - CFBundleURLTypes - - - CFBundleURLName - identity - CFBundleURLSchemes - - identity - - - - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - CADisableMinimumFrameDurationOnPhone - - - diff --git a/example/lib/counter.dart b/example/lib/counter.dart deleted file mode 100644 index d0d5f22a..00000000 --- a/example/lib/counter.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:agent_dart/agent_dart.dart'; - -import 'init.dart'; - -class CounterMethod { - const CounterMethod._(); - - static const add = 'increment'; - static const count = 'getValue'; -} - -final idl = IDL.Service({ - CounterMethod.count: IDL.Func([], [IDL.Nat], ['query']), - CounterMethod.add: IDL.Func([], [], []), -}); - -class Counter extends ActorHook { - Counter(); - - factory Counter.create(CanisterActor _actor) { - return Counter()..setActor(_actor); - } - - void setActor(CanisterActor _actor) { - actor = _actor; - } - - Future count() async { - final res = await actor.getFunc(CounterMethod.count)!([]); - if (res != null) { - return (res as BigInt).toInt(); - } - throw StateError('Request failed with the result: $res.'); - } - - Future add() async { - await actor.getFunc(CounterMethod.add)!([]); - } -} diff --git a/example/lib/init.dart b/example/lib/init.dart deleted file mode 100644 index c827f1f4..00000000 --- a/example/lib/init.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:agent_dart/agent_dart.dart'; - -class AgentFactory { - AgentFactory({ - required String canisterId, - required String url, - required Service idl, - Identity? identity, - bool? debug = true, - }) { - _setCanisterId(canisterId); - _identity = identity ?? const AnonymousIdentity(); - _idl = idl; - _debug = debug ?? true; - _initAgent(url); - _createActor(); - } - - late final Principal _canisterId; - late Identity _identity; - late HttpAgent _agent; - late final bool _debug; - late CanisterActor _actor; - - Identity get identity => _identity; - late Service _idl; - - CanisterActor get actor => _actor; - - static Future create({ - required String canisterId, - required String url, - required Service idl, - Identity? identity, - bool? debug = true, - }) async { - final newIdentity = identity ?? await Ed25519KeyIdentity.generate(null); - return AgentFactory( - canisterId: canisterId, - url: url, - idl: idl, - identity: newIdentity, - debug: debug, - ); - } - - T hook(T target) { - target.actor = actor; - return target; - } - - void _setCanisterId(String canisterId) { - _canisterId = Principal.fromText(canisterId); - } - - void _initAgent(String url) async { - final uri = Uri.parse(url); - final port = uri.port; - final protocol = uri.scheme; - final host = uri.host; - _agent = HttpAgent( - defaultProtocol: protocol, - defaultHost: host, - defaultPort: port, - options: HttpAgentOptions(identity: _identity), - ); - if (_debug) { - await _agent.fetchRootKey(); - } - _agent.addTransform( - HttpAgentRequestTransformFn(call: makeNonceTransform()), - ); - } - - void _createActor() { - _actor = Actor.createActor( - _idl, - ActorConfig.fromJson({'canisterId': _canisterId, 'agent': _agent}), - ); - } -} - -abstract class ActorHook { - late final CanisterActor actor; -} diff --git a/example/lib/main.dart b/example/lib/main.dart deleted file mode 100644 index b9eb034b..00000000 --- a/example/lib/main.dart +++ /dev/null @@ -1,97 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'counter.dart'; -import 'init.dart'; - -void main() { - runApp(const MyApp()); -} - -class MyApp extends StatefulWidget { - const MyApp({Key? key}) : super(key: key); - - @override - State createState() => _MyAppState(); -} - -class _MyAppState extends State { - int _count = 0; - bool _loading = false; - - Counter? _counter; - final _scaffoldKey = GlobalKey(); - - @override - void initState() { - super.initState(); - loading(true); - readCount(); - } - - Future initCounter() async { - _counter = (await AgentFactory.create( - canisterId: 'sbzkb-zqaaa-aaaaa-aaaiq-cai', - url: 'https://03af-58-62-205-141.ngrok.io', - // For Android emulator, please use 10.0.2.2 as endpoint - idl: idl, - )) - .hook(Counter()); - } - - void loading(bool state) { - setState(() { - _loading = state; - }); - } - - Future readCount() async { - if (_counter == null) { - await initCounter(); - } - final int c = await _counter!.count(); - loading(false); - setState(() { - _count = c; - }); - } - - void increase() async { - loading(true); - await _counter!.add(); - readCount(); - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - key: _scaffoldKey, - appBar: AppBar( - title: const Text('Dfinity flutter Dapp'), - ), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text(_loading ? 'loading contract count' : '$_count'), - Container( - height: 30, - ), - Container( - height: 30, - ), - const Text('Please Login 👆'), - Container(height: 30), - ], - ), - ), - floatingActionButton: FloatingActionButton( - child: const Icon(Icons.add), - onPressed: () async { - increase(); - }, - ), - ), - ); - } -} diff --git a/example/linux/flutter/generated_plugin_registrant.cc b/example/linux/flutter/generated_plugin_registrant.cc deleted file mode 100644 index f6f23bfe..00000000 --- a/example/linux/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - -#include - -void fl_register_plugins(FlPluginRegistry* registry) { - g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); - url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); -} diff --git a/example/macos/Podfile.lock b/example/macos/Podfile.lock deleted file mode 100644 index 87525661..00000000 --- a/example/macos/Podfile.lock +++ /dev/null @@ -1,28 +0,0 @@ -PODS: - - agent_dart (1.0.0): - - FlutterMacOS - - FlutterMacOS (1.0.0) - - url_launcher_macos (0.0.1): - - FlutterMacOS - -DEPENDENCIES: - - agent_dart (from `Flutter/ephemeral/.symlinks/plugins/agent_dart/macos`) - - FlutterMacOS (from `Flutter/ephemeral`) - - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - -EXTERNAL SOURCES: - agent_dart: - :path: Flutter/ephemeral/.symlinks/plugins/agent_dart/macos - FlutterMacOS: - :path: Flutter/ephemeral - url_launcher_macos: - :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos - -SPEC CHECKSUMS: - agent_dart: baeff650d9d637f215d23b2f9ef9a9e5c34e7f42 - FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 - -PODFILE CHECKSUM: 94c13412ea7d37a22dbff0ae1c74b259b3120765 - -COCOAPODS: 1.12.1 diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png deleted file mode 100644 index 3c4935a7..00000000 Binary files a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png and /dev/null differ diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png deleted file mode 100644 index ed4cc164..00000000 Binary files a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png and /dev/null differ diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png deleted file mode 100644 index 483be613..00000000 Binary files a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png and /dev/null differ diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png deleted file mode 100644 index bcbf36df..00000000 Binary files a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png and /dev/null differ diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png deleted file mode 100644 index 9c0a6528..00000000 Binary files a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png and /dev/null differ diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png deleted file mode 100644 index e71a7261..00000000 Binary files a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png and /dev/null differ diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png deleted file mode 100644 index 8a31fe2d..00000000 Binary files a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png and /dev/null differ diff --git a/example/macos/Runner/DebugProfile.entitlements b/example/macos/Runner/DebugProfile.entitlements deleted file mode 100644 index 867a0baa..00000000 --- a/example/macos/Runner/DebugProfile.entitlements +++ /dev/null @@ -1,14 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.cs.allow-jit - - com.apple.security.network.server - - com.apple.security.network.client - - - diff --git a/example/macos/Runner/Info.plist b/example/macos/Runner/Info.plist deleted file mode 100644 index 4804dd54..00000000 --- a/example/macos/Runner/Info.plist +++ /dev/null @@ -1,43 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - CFBundleURLTypes - - - CFBundleURLName - identity - CFBundleURLSchemes - - identity - - - - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSHumanReadableCopyright - $(PRODUCT_COPYRIGHT) - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart deleted file mode 100644 index a0ac1742..00000000 --- a/example/test/widget_test.dart +++ /dev/null @@ -1,27 +0,0 @@ -// // This is a basic Flutter widget test. -// // -// // To perform an interaction with a widget in your test, use the WidgetTester -// // utility that Flutter provides. For example, you can send tap and scroll -// // gestures. You can also use WidgetTester to find child widgets in the widget -// // tree, read text, and verify that the values of widget properties are correct. - -// import 'package:flutter/material.dart'; -// import 'package:flutter_test/flutter_test.dart'; - -// import 'package:agent_dart_example/main.dart'; - -// void main() { -// testWidgets('Verify Platform version', (WidgetTester tester) async { -// // Build our app and trigger a frame. -// await tester.pumpWidget(const MyApp()); - -// // Verify that platform version is retrieved. -// expect( -// find.byWidgetPredicate( -// (Widget widget) => widget is Text && -// widget.data!.startsWith('Running on:'), -// ), -// findsOneWidget, -// ); -// }); -// } diff --git a/example/web/favicon.png b/example/web/favicon.png deleted file mode 100644 index 8aaa46ac..00000000 Binary files a/example/web/favicon.png and /dev/null differ diff --git a/example/web/icons/Icon-192.png b/example/web/icons/Icon-192.png deleted file mode 100644 index b749bfef..00000000 Binary files a/example/web/icons/Icon-192.png and /dev/null differ diff --git a/example/web/icons/Icon-512.png b/example/web/icons/Icon-512.png deleted file mode 100644 index 88cfd48d..00000000 Binary files a/example/web/icons/Icon-512.png and /dev/null differ diff --git a/example/web/index.html b/example/web/index.html deleted file mode 100644 index 16dc0f55..00000000 --- a/example/web/index.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - agent_dart_example - - - - - - - diff --git a/example/web/manifest.json b/example/web/manifest.json deleted file mode 100644 index 58fc0c98..00000000 --- a/example/web/manifest.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "agent_dart_example", - "short_name": "agent_dart_example", - "start_url": ".", - "display": "standalone", - "background_color": "#0175C2", - "theme_color": "#0175C2", - "description": "Demonstrates how to use the agent_dart plugin.", - "orientation": "portrait-primary", - "prefer_related_applications": false, - "icons": [ - { - "src": "icons/Icon-192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "icons/Icon-512.png", - "sizes": "512x512", - "type": "image/png" - } - ] -} diff --git a/example/windows/runner/CMakeLists.txt b/example/windows/runner/CMakeLists.txt deleted file mode 100644 index 0b899a0b..00000000 --- a/example/windows/runner/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -cmake_minimum_required(VERSION 3.15) -project(runner LANGUAGES CXX) - -add_executable(${BINARY_NAME} WIN32 - "flutter_window.cpp" - "main.cpp" - "utils.cpp" - "win32_window.cpp" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" - "Runner.rc" - "runner.exe.manifest" -) -apply_standard_settings(${BINARY_NAME}) -target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") -target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) -target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") -add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/example/windows/runner/run_loop.cpp b/example/windows/runner/run_loop.cpp deleted file mode 100644 index 2d6636ab..00000000 --- a/example/windows/runner/run_loop.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include "run_loop.h" - -#include - -#include - -RunLoop::RunLoop() {} - -RunLoop::~RunLoop() {} - -void RunLoop::Run() { - bool keep_running = true; - TimePoint next_flutter_event_time = TimePoint::clock::now(); - while (keep_running) { - std::chrono::nanoseconds wait_duration = - std::max(std::chrono::nanoseconds(0), - next_flutter_event_time - TimePoint::clock::now()); - ::MsgWaitForMultipleObjects( - 0, nullptr, FALSE, static_cast(wait_duration.count() / 1000), - QS_ALLINPUT); - bool processed_events = false; - MSG message; - // All pending Windows messages must be processed; MsgWaitForMultipleObjects - // won't return again for items left in the queue after PeekMessage. - while (::PeekMessage(&message, nullptr, 0, 0, PM_REMOVE)) { - processed_events = true; - if (message.message == WM_QUIT) { - keep_running = false; - break; - } - ::TranslateMessage(&message); - ::DispatchMessage(&message); - // Allow Flutter to process messages each time a Windows message is - // processed, to prevent starvation. - next_flutter_event_time = - std::min(next_flutter_event_time, ProcessFlutterMessages()); - } - // If the PeekMessage loop didn't run, process Flutter messages. - if (!processed_events) { - next_flutter_event_time = - std::min(next_flutter_event_time, ProcessFlutterMessages()); - } - } -} - -void RunLoop::RegisterFlutterInstance( - flutter::FlutterEngine* flutter_instance) { - flutter_instances_.insert(flutter_instance); -} - -void RunLoop::UnregisterFlutterInstance( - flutter::FlutterEngine* flutter_instance) { - flutter_instances_.erase(flutter_instance); -} - -RunLoop::TimePoint RunLoop::ProcessFlutterMessages() { - TimePoint next_event_time = TimePoint::max(); - for (auto instance : flutter_instances_) { - std::chrono::nanoseconds wait_duration = instance->ProcessMessages(); - if (wait_duration != std::chrono::nanoseconds::max()) { - next_event_time = - std::min(next_event_time, TimePoint::clock::now() + wait_duration); - } - } - return next_event_time; -} diff --git a/example/windows/runner/run_loop.h b/example/windows/runner/run_loop.h deleted file mode 100644 index 000d3624..00000000 --- a/example/windows/runner/run_loop.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef RUNNER_RUN_LOOP_H_ -#define RUNNER_RUN_LOOP_H_ - -#include - -#include -#include - -// A runloop that will service events for Flutter instances as well -// as native messages. -class RunLoop { - public: - RunLoop(); - ~RunLoop(); - - // Prevent copying - RunLoop(RunLoop const&) = delete; - RunLoop& operator=(RunLoop const&) = delete; - - // Runs the run loop until the application quits. - void Run(); - - // Registers the given Flutter instance for event servicing. - void RegisterFlutterInstance( - flutter::FlutterEngine* flutter_instance); - - // Unregisters the given Flutter instance from event servicing. - void UnregisterFlutterInstance( - flutter::FlutterEngine* flutter_instance); - - private: - using TimePoint = std::chrono::steady_clock::time_point; - - // Processes all currently pending messages for registered Flutter instances. - TimePoint ProcessFlutterMessages(); - - std::set flutter_instances_; -}; - -#endif // RUNNER_RUN_LOOP_H_ diff --git a/ios/Classes/EnforceBundling.swift b/ios/Classes/EnforceBundling.swift deleted file mode 100644 index 67e89f5d..00000000 --- a/ios/Classes/EnforceBundling.swift +++ /dev/null @@ -1,4 +0,0 @@ -public func dummyMethodToEnforceBundling() -> Int64 { - return dummy_method_to_enforce_bundling() -} -let dummyVar = dummyMethodToEnforceBundling(); \ No newline at end of file diff --git a/ios/Classes/bridge_generated.h b/ios/Classes/bridge_generated.h deleted file mode 100644 index 1c22a210..00000000 --- a/ios/Classes/bridge_generated.h +++ /dev/null @@ -1,522 +0,0 @@ -#include -#include -#include -typedef struct _Dart_Handle* Dart_Handle; - -#define ECB 0 - -#define CBC 1 - -#define CFB1 2 - -#define CFB2 3 - -#define CFB4 5 - -#define OFB1 14 - -#define OFB2 15 - -#define OFB4 17 - -#define OFB8 21 - -#define OFB16 29 - -#define CTR1 30 - -#define CTR2 31 - -#define CTR4 33 - -#define CTR8 37 - -#define CTR16 45 - -#define CHUNK 64 - -#define MODBYTES 48 - -#define BASEBITS 58 - -#define NLEN (1 + (((8 * MODBYTES) - 1) / BASEBITS)) - -#define DNLEN (2 * NLEN) - -#define HBITS (BASEBITS / 2) - - - -#define BIGBITS (MODBYTES * 8) - - - - - -#define BLS_OK 0 - -#define BLS_FAIL -1 - -#define WEIERSTRASS 0 - -#define EDWARDS 1 - -#define MONTGOMERY 2 - -#define NOT 0 - -#define BN 1 - -#define BLS12 2 - -#define BLS24 3 - -#define BLS48 4 - -#define D_TYPE 0 - -#define M_TYPE 1 - -#define POSITIVEX 0 - -#define NEGATIVEX 1 - -#define CURVETYPE WEIERSTRASS - -#define CURVE_A 0 - -#define CURVE_PAIRING_TYPE BLS12 - -#define SEXTIC_TWIST M_TYPE - -#define SIGN_OF_X NEGATIVEX - -#define ATE_BITS 65 - -#define G2_TABLE 69 - -#define HTC_ISO 11 - -#define HTC_ISO_G2 3 - -#define ALLOW_ALT_COMPRESS true - -#define HASH_TYPE 32 - -#define AESKEY 16 - -#define NOT_SPECIAL 0 - -#define PSEUDO_MERSENNE 1 - -#define MONTGOMERY_FRIENDLY 2 - -#define GENERALISED_MERSENNE 3 - -#define NEGATOWER 0 - -#define POSITOWER 1 - -#define MODBITS 381 - -#define PM1D2 1 - -#define RIADZ 11 - -#define RIADZG2A -2 - -#define RIADZG2B -1 - -#define MODTYPE NOT_SPECIAL - -#define QNRI 0 - -#define TOWER NEGATOWER - -#define FEXCESS (((int32_t)1 << 25) - 1) - - - -#define BIG_ENDIAN_SIGN false - -#define ZERO 0 - -#define ONE 1 - -#define SPARSEST 2 - -#define SPARSER 3 - -#define SPARSE 4 - -#define DENSE 5 - - - - - -#define BAD_PARAMS -11 - -#define INVALID_POINT -14 - -#define WRONG_ORDER -18 - -#define BAD_PIN -19 - -#define MAXPIN 10000 - -#define PBLEN 14 - -#define CURVE_COF_I 0 - -#define CURVE_B_I 4 - -#define USE_GLV true - -#define USE_GS_G2 true - -#define USE_GS_GT true - -#define GT_STRONG false - -#define MC_SHA2 2 - -#define MC_SHA3 3 - -#define HASH224 28 - -#define HASH256 32 - -#define HASH384 48 - -#define HASH512 64 - -#define SHAKE128 16 - -#define SHAKE256 32 - -#define KEY_LENGTH 32 - -#define KEY_LENGTH_AES (KEY_LENGTH / 2) - -typedef struct DartCObject DartCObject; - -typedef int64_t DartPort; - -typedef bool (*DartPostCObjectFnType)(DartPort port_id, void *message); - -typedef struct wire_uint_8_list { - uint8_t *ptr; - int32_t len; -} wire_uint_8_list; - -typedef struct wire_PhraseToSeedReq { - struct wire_uint_8_list *phrase; - struct wire_uint_8_list *password; -} wire_PhraseToSeedReq; - -typedef struct wire_SeedToKeyReq { - struct wire_uint_8_list *seed; - struct wire_uint_8_list *path; -} wire_SeedToKeyReq; - -typedef struct wire_BLSVerifyReq { - struct wire_uint_8_list *signature; - struct wire_uint_8_list *message; - struct wire_uint_8_list *public_key; -} wire_BLSVerifyReq; - -typedef struct wire_ED25519FromSeedReq { - struct wire_uint_8_list *seed; -} wire_ED25519FromSeedReq; - -typedef struct wire_ED25519SignReq { - struct wire_uint_8_list *seed; - struct wire_uint_8_list *message; -} wire_ED25519SignReq; - -typedef struct wire_ED25519VerifyReq { - struct wire_uint_8_list *sig; - struct wire_uint_8_list *message; - struct wire_uint_8_list *pub_key; -} wire_ED25519VerifyReq; - -typedef struct wire_Secp256k1FromSeedReq { - struct wire_uint_8_list *seed; -} wire_Secp256k1FromSeedReq; - -typedef struct wire_Secp256k1SignWithSeedReq { - struct wire_uint_8_list *msg; - struct wire_uint_8_list *seed; -} wire_Secp256k1SignWithSeedReq; - -typedef struct wire_Secp256k1VerifyReq { - struct wire_uint_8_list *message_hash; - struct wire_uint_8_list *signature_bytes; - struct wire_uint_8_list *public_key_bytes; -} wire_Secp256k1VerifyReq; - -typedef struct wire_Secp256k1ShareSecretReq { - struct wire_uint_8_list *seed; - struct wire_uint_8_list *public_key_raw_bytes; -} wire_Secp256k1ShareSecretReq; - -typedef struct wire_Secp256k1RecoverReq { - struct wire_uint_8_list *message_pre_hashed; - struct wire_uint_8_list *signature_bytes; - uint8_t *chain_id; -} wire_Secp256k1RecoverReq; - -typedef struct wire_P256FromSeedReq { - struct wire_uint_8_list *seed; -} wire_P256FromSeedReq; - -typedef struct wire_P256SignWithSeedReq { - struct wire_uint_8_list *msg; - struct wire_uint_8_list *seed; -} wire_P256SignWithSeedReq; - -typedef struct wire_P256VerifyReq { - struct wire_uint_8_list *message_hash; - struct wire_uint_8_list *signature_bytes; - struct wire_uint_8_list *public_key_bytes; -} wire_P256VerifyReq; - -typedef struct wire_P256ShareSecretReq { - struct wire_uint_8_list *seed; - struct wire_uint_8_list *public_key_raw_bytes; -} wire_P256ShareSecretReq; - -typedef struct wire_SchnorrFromSeedReq { - struct wire_uint_8_list *seed; -} wire_SchnorrFromSeedReq; - -typedef struct wire_SchnorrSignWithSeedReq { - struct wire_uint_8_list *msg; - struct wire_uint_8_list *seed; - struct wire_uint_8_list *aux_rand; -} wire_SchnorrSignWithSeedReq; - -typedef struct wire_SchnorrVerifyReq { - struct wire_uint_8_list *message_hash; - struct wire_uint_8_list *signature_bytes; - struct wire_uint_8_list *public_key_bytes; -} wire_SchnorrVerifyReq; - -typedef struct wire_AesEncryptReq { - struct wire_uint_8_list *key; - struct wire_uint_8_list *iv; - struct wire_uint_8_list *message; -} wire_AesEncryptReq; - -typedef struct wire_AesDecryptReq { - struct wire_uint_8_list *key; - struct wire_uint_8_list *iv; - struct wire_uint_8_list *cipher_text; -} wire_AesDecryptReq; - -typedef struct wire_PBKDFDeriveReq { - struct wire_uint_8_list *password; - struct wire_uint_8_list *salt; - uint32_t c; -} wire_PBKDFDeriveReq; - -typedef struct wire_ScriptDeriveReq { - struct wire_uint_8_list *password; - struct wire_uint_8_list *salt; - uint32_t n; - uint32_t p; - uint32_t r; -} wire_ScriptDeriveReq; - -typedef struct DartCObject *WireSyncReturn; - -typedef int64_t Chunk; - -#define BMASK ((1 << BASEBITS) - 1) - -#define HMASK ((1 << HBITS) - 1) - - - -#define TMASK ((1 << TBITS) - 1) - -#define MCONST 140737475470229501 - -void store_dart_post_cobject(DartPostCObjectFnType ptr); - -Dart_Handle get_dart_object(uintptr_t ptr); - -void drop_dart_object(uintptr_t ptr); - -uintptr_t new_dart_opaque(Dart_Handle handle); - -intptr_t init_frb_dart_api_dl(void *obj); - -void wire_mnemonic_phrase_to_seed(int64_t port_, struct wire_PhraseToSeedReq *req); - -void wire_mnemonic_seed_to_key(int64_t port_, struct wire_SeedToKeyReq *req); - -void wire_bls_init(int64_t port_); - -void wire_bls_verify(int64_t port_, struct wire_BLSVerifyReq *req); - -void wire_ed25519_from_seed(int64_t port_, struct wire_ED25519FromSeedReq *req); - -void wire_ed25519_sign(int64_t port_, struct wire_ED25519SignReq *req); - -void wire_ed25519_verify(int64_t port_, struct wire_ED25519VerifyReq *req); - -void wire_secp256k1_from_seed(int64_t port_, struct wire_Secp256k1FromSeedReq *req); - -void wire_secp256k1_sign(int64_t port_, struct wire_Secp256k1SignWithSeedReq *req); - -void wire_secp256k1_sign_recoverable(int64_t port_, struct wire_Secp256k1SignWithSeedReq *req); - -void wire_secp256k1_verify(int64_t port_, struct wire_Secp256k1VerifyReq *req); - -void wire_secp256k1_get_shared_secret(int64_t port_, struct wire_Secp256k1ShareSecretReq *req); - -void wire_secp256k1_recover(int64_t port_, struct wire_Secp256k1RecoverReq *req); - -void wire_p256_from_seed(int64_t port_, struct wire_P256FromSeedReq *req); - -void wire_p256_sign(int64_t port_, struct wire_P256SignWithSeedReq *req); - -void wire_p256_verify(int64_t port_, struct wire_P256VerifyReq *req); - -void wire_p256_get_shared_secret(int64_t port_, struct wire_P256ShareSecretReq *req); - -void wire_schnorr_from_seed(int64_t port_, struct wire_SchnorrFromSeedReq *req); - -void wire_schnorr_sign(int64_t port_, struct wire_SchnorrSignWithSeedReq *req); - -void wire_schnorr_verify(int64_t port_, struct wire_SchnorrVerifyReq *req); - -void wire_aes_128_ctr_encrypt(int64_t port_, struct wire_AesEncryptReq *req); - -void wire_aes_128_ctr_decrypt(int64_t port_, struct wire_AesDecryptReq *req); - -void wire_aes_256_cbc_encrypt(int64_t port_, struct wire_AesEncryptReq *req); - -void wire_aes_256_cbc_decrypt(int64_t port_, struct wire_AesDecryptReq *req); - -void wire_aes_256_gcm_encrypt(int64_t port_, struct wire_AesEncryptReq *req); - -void wire_aes_256_gcm_decrypt(int64_t port_, struct wire_AesDecryptReq *req); - -void wire_pbkdf2_derive_key(int64_t port_, struct wire_PBKDFDeriveReq *req); - -void wire_scrypt_derive_key(int64_t port_, struct wire_ScriptDeriveReq *req); - -struct wire_AesDecryptReq *new_box_autoadd_aes_decrypt_req_0(void); - -struct wire_AesEncryptReq *new_box_autoadd_aes_encrypt_req_0(void); - -struct wire_BLSVerifyReq *new_box_autoadd_bls_verify_req_0(void); - -struct wire_ED25519FromSeedReq *new_box_autoadd_ed_25519_from_seed_req_0(void); - -struct wire_ED25519SignReq *new_box_autoadd_ed_25519_sign_req_0(void); - -struct wire_ED25519VerifyReq *new_box_autoadd_ed_25519_verify_req_0(void); - -struct wire_P256FromSeedReq *new_box_autoadd_p_256_from_seed_req_0(void); - -struct wire_P256ShareSecretReq *new_box_autoadd_p_256_share_secret_req_0(void); - -struct wire_P256SignWithSeedReq *new_box_autoadd_p_256_sign_with_seed_req_0(void); - -struct wire_P256VerifyReq *new_box_autoadd_p_256_verify_req_0(void); - -struct wire_PBKDFDeriveReq *new_box_autoadd_pbkdf_derive_req_0(void); - -struct wire_PhraseToSeedReq *new_box_autoadd_phrase_to_seed_req_0(void); - -struct wire_SchnorrFromSeedReq *new_box_autoadd_schnorr_from_seed_req_0(void); - -struct wire_SchnorrSignWithSeedReq *new_box_autoadd_schnorr_sign_with_seed_req_0(void); - -struct wire_SchnorrVerifyReq *new_box_autoadd_schnorr_verify_req_0(void); - -struct wire_ScriptDeriveReq *new_box_autoadd_script_derive_req_0(void); - -struct wire_Secp256k1FromSeedReq *new_box_autoadd_secp_256_k_1_from_seed_req_0(void); - -struct wire_Secp256k1RecoverReq *new_box_autoadd_secp_256_k_1_recover_req_0(void); - -struct wire_Secp256k1ShareSecretReq *new_box_autoadd_secp_256_k_1_share_secret_req_0(void); - -struct wire_Secp256k1SignWithSeedReq *new_box_autoadd_secp_256_k_1_sign_with_seed_req_0(void); - -struct wire_Secp256k1VerifyReq *new_box_autoadd_secp_256_k_1_verify_req_0(void); - -struct wire_SeedToKeyReq *new_box_autoadd_seed_to_key_req_0(void); - -uint8_t *new_box_autoadd_u8_0(uint8_t value); - -struct wire_uint_8_list *new_uint_8_list_0(int32_t len); - -void free_WireSyncReturn(WireSyncReturn ptr); - -static int64_t dummy_method_to_enforce_bundling(void) { - int64_t dummy_var = 0; - dummy_var ^= ((int64_t) (void*) wire_mnemonic_phrase_to_seed); - dummy_var ^= ((int64_t) (void*) wire_mnemonic_seed_to_key); - dummy_var ^= ((int64_t) (void*) wire_bls_init); - dummy_var ^= ((int64_t) (void*) wire_bls_verify); - dummy_var ^= ((int64_t) (void*) wire_ed25519_from_seed); - dummy_var ^= ((int64_t) (void*) wire_ed25519_sign); - dummy_var ^= ((int64_t) (void*) wire_ed25519_verify); - dummy_var ^= ((int64_t) (void*) wire_secp256k1_from_seed); - dummy_var ^= ((int64_t) (void*) wire_secp256k1_sign); - dummy_var ^= ((int64_t) (void*) wire_secp256k1_sign_recoverable); - dummy_var ^= ((int64_t) (void*) wire_secp256k1_verify); - dummy_var ^= ((int64_t) (void*) wire_secp256k1_get_shared_secret); - dummy_var ^= ((int64_t) (void*) wire_secp256k1_recover); - dummy_var ^= ((int64_t) (void*) wire_p256_from_seed); - dummy_var ^= ((int64_t) (void*) wire_p256_sign); - dummy_var ^= ((int64_t) (void*) wire_p256_verify); - dummy_var ^= ((int64_t) (void*) wire_p256_get_shared_secret); - dummy_var ^= ((int64_t) (void*) wire_schnorr_from_seed); - dummy_var ^= ((int64_t) (void*) wire_schnorr_sign); - dummy_var ^= ((int64_t) (void*) wire_schnorr_verify); - dummy_var ^= ((int64_t) (void*) wire_aes_128_ctr_encrypt); - dummy_var ^= ((int64_t) (void*) wire_aes_128_ctr_decrypt); - dummy_var ^= ((int64_t) (void*) wire_aes_256_cbc_encrypt); - dummy_var ^= ((int64_t) (void*) wire_aes_256_cbc_decrypt); - dummy_var ^= ((int64_t) (void*) wire_aes_256_gcm_encrypt); - dummy_var ^= ((int64_t) (void*) wire_aes_256_gcm_decrypt); - dummy_var ^= ((int64_t) (void*) wire_pbkdf2_derive_key); - dummy_var ^= ((int64_t) (void*) wire_scrypt_derive_key); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_aes_decrypt_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_aes_encrypt_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_bls_verify_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_ed_25519_from_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_ed_25519_sign_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_ed_25519_verify_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_p_256_from_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_p_256_share_secret_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_p_256_sign_with_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_p_256_verify_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_pbkdf_derive_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_phrase_to_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_schnorr_from_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_schnorr_sign_with_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_schnorr_verify_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_script_derive_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_secp_256_k_1_from_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_secp_256_k_1_recover_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_secp_256_k_1_share_secret_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_secp_256_k_1_sign_with_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_secp_256_k_1_verify_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_seed_to_key_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_u8_0); - dummy_var ^= ((int64_t) (void*) new_uint_8_list_0); - dummy_var ^= ((int64_t) (void*) free_WireSyncReturn); - dummy_var ^= ((int64_t) (void*) store_dart_post_cobject); - dummy_var ^= ((int64_t) (void*) get_dart_object); - dummy_var ^= ((int64_t) (void*) drop_dart_object); - dummy_var ^= ((int64_t) (void*) new_dart_opaque); - return dummy_var; -} diff --git a/ios/Frameworks/agent_dart-v1.0.0.zip b/ios/Frameworks/agent_dart-v1.0.0.zip deleted file mode 100644 index bd564d7a..00000000 Binary files a/ios/Frameworks/agent_dart-v1.0.0.zip and /dev/null differ diff --git a/ios/agent_dart.podspec b/ios/agent_dart.podspec deleted file mode 100644 index 8fc1add3..00000000 --- a/ios/agent_dart.podspec +++ /dev/null @@ -1,33 +0,0 @@ -release_tag_name = 'agent_dart-v1.0.0' # generated; do not edit - -# We cannot distribute the XCFramework alongside the library directly, -# so we have to fetch the correct version here. -framework_name = 'AgentDart.xcframework' -local_zip_name = "#{release_tag_name}.zip" -` -cd Frameworks - -if [ -f #{local_zip_name} ] -then - rm -rf #{framework_name} - unzip #{local_zip_name} -fi - -cd - -` - -Pod::Spec.new do |spec| - spec.name = 'agent_dart' - spec.version = '1.0.0' - spec.license = { :file => '../LICENSE' } - spec.homepage = 'https://github.com/AstroxNetwork/agent_dart' - spec.authors = { 'AstroX Dev' => 'dev@astrox.network' } - spec.summary = 'iOS Flutter bindings for agent_dart' - - spec.source = { :path => '.' } - spec.source_files = 'Classes/**/*' - spec.public_header_files = 'Classes/**/*.h' - spec.vendored_frameworks = "Frameworks/#{framework_name}" - - spec.ios.deployment_target = '11.0' -end diff --git a/lib/agent/crypto/keystore/key_store.dart b/lib/agent/crypto/keystore/key_store.dart deleted file mode 100644 index f5389b11..00000000 --- a/lib/agent/crypto/keystore/key_store.dart +++ /dev/null @@ -1,31 +0,0 @@ -library key_store; - -import 'dart:convert'; -import 'dart:core'; -import 'dart:typed_data'; - -import 'package:agent_dart/agent/cbor.dart'; -import 'package:agent_dart/agent/crypto/random.dart'; -import 'package:agent_dart/bridge/ffi/ffi.dart'; -import 'package:agent_dart/identity/p256.dart'; -import 'package:agent_dart/identity/secp256k1.dart'; -import 'package:agent_dart/principal/utils/sha256.dart'; -import 'package:agent_dart/utils/extension.dart'; -import 'package:agent_dart/utils/u8a.dart'; -import 'package:collection/collection.dart'; -import 'package:meta/meta.dart'; -import 'package:pointycastle/export.dart'; -import 'package:uuid/uuid.dart'; - -part 'key_derivator.dart'; - -part 'function.dart'; - -part 'util.dart'; - -@immutable -abstract class KeyStore { - const KeyStore(); - - Map get keyStoreMap; -} diff --git a/lib/bridge/bls.base.dart b/lib/bridge/bls.base.dart deleted file mode 100644 index e3709cfb..00000000 --- a/lib/bridge/bls.base.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'dart:typed_data'; - -import 'bls.stub.dart' - if (dart.library.io) 'bls.ffi.dart' - if (dart.library.html) 'bls.web.dart'; - -abstract class BaseBLS { - /// factory constructor to return the correct implementation. - factory BaseBLS() => createBLS(); - - bool get isInit; - - Future blsInit(); - - Future blsVerify(Uint8List pk, Uint8List sig, Uint8List msg); -} diff --git a/lib/bridge/bls.ffi.dart b/lib/bridge/bls.ffi.dart deleted file mode 100644 index 85a6ad4d..00000000 --- a/lib/bridge/bls.ffi.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'dart:typed_data'; - -import 'package:agent_dart/bridge/bls.base.dart'; -import 'ffi/ffi.dart'; - -class FFIBls implements BaseBLS { - late bool _isInit = false; - - @override - Future blsInit() async { - _isInit = await AgentDartFFI.impl.blsInit(); - return _isInit; - } - - @override - Future blsVerify( - Uint8List pk, - Uint8List sig, - Uint8List msg, - ) { - return AgentDartFFI.impl.blsVerify( - req: BLSVerifyReq(signature: sig, message: msg, publicKey: pk), - ); - } - - @override - bool get isInit => _isInit; -} - -BaseBLS createBLS() => FFIBls(); diff --git a/lib/bridge/bls.stub.dart b/lib/bridge/bls.stub.dart deleted file mode 100644 index e0661ff3..00000000 --- a/lib/bridge/bls.stub.dart +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'bls.base.dart'; - -/// Implemented in `browser_client.dart` and `io_client.dart`. -BaseBLS createBLS() => throw UnsupportedError( - 'Cannot create a client without dart:html or dart:io.', - ); diff --git a/lib/bridge/bls.web.dart b/lib/bridge/bls.web.dart deleted file mode 100644 index f826e802..00000000 --- a/lib/bridge/bls.web.dart +++ /dev/null @@ -1,886 +0,0 @@ -import 'dart:typed_data'; - -import 'package:agent_dart/agent_dart.dart'; -import 'package:agent_dart/bridge/bls.base.dart'; -import 'package:agent_dart/bridge/wasm_interop.dart'; - -final _wasmBytesBase64 = ''' - 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 - g8AAEF8CQAJAIAZB6AFqEFoNACAGQShqEIQBDQAgBkGIPWoQS0EAIQcgBkGIwwBqQTgQchogBkG4IWpBOBByGiAGQYjA - AGoQSyAGQcjEAGoQSyAGQcjJAGoQSyAGQcjMAGoQSyAGQagGahBLIAZBsAxqEEsgBkHIzwBqEEsgBkHQ1QBqEEsgBkHY - 2wBqEEsgBkG4FWoQSyAGQZgjaiAGQcjJAGpBwAEQZxogBkHYJGogBkHIzABqQcABEGcaIAZBmCZqIAZBqAZqQcABEGca - IAZB2CdqIAZBsAxqQcABEGcaIAZBmClqIAZByM8AakHAARBnGiAGQdgqaiAGQdDVAGpBwAEQZxogBkGYLGogBkHY2wBq - QcABEGcaIAZB2C1qIAZBuBVqQcABEGcaIAZBuBVqQecAEHIaIAZBiMAAaiAGQShqEH8gBkGIwABqEBggBkGYI2ogBkEo - ahB/A0AgB0HACkYEQCAGQbghaiAGQegBahBrIAYpA7ghIRcgBkG4IWpBARCdASAGQbghahBEIAYpA7ghIRYgBkGIwwBq - IAZBuCFqEGsgBkGIwwBqQQEQnQEgBkGIwwBqEEQgBkG4IWogBkGIwwBqIBdCAoGnEE8gBkGIwABqIAZBKGogFkICgacQ - bSAGQcjEAGogBkGIwABqEH8gBkG4IWoQKUEDaiIJQQJ2IgdBAWohAkEAIQgCQAJAAkADQAJAIAZBuCFqQQUQjAEhAyAC - IAhGBEAgCUGYA0kNASACQecAQbCEwAAQPAALIAhB5wBGDQIgBkG4FWogCGogA0FwaiIDOgAAIAZBuCFqIANBGHRBGHUQ - ngEgBkG4IWoQRCAGQbghakEEEDsgCEEBaiEIDAELCyAGQbgVaiACaiADOgAAIANBGHRBGHVBf2oiA0EBdiECIANBD0sN - ASAGQYg9aiAGQZgjaiACQcABbGoQfwNAIAdBf0YEQCAGQYg9aiAGQcjEAGoQcyAGQZgjaiAGQYg9akHAARBnGgwICyAH - QeYASw0DIAZBiMAAaiAGQZgjaiAGQbgVaiAHaiwAABAfIAdBf2ohByAGQYg9ahAYIAZBiD1qEBggBkGIPWoQGCAGQYg9 - ahAYIAZBiD1qIAZBiMAAahAMDAALAAtB5wBB5wBBoITAABA8AAsgAkEIQcCEwAAQPAALIAdB5wBB0ITAABA8AAUgBkHI - xABqIAZBmCNqIAdqIgIQfyACQcABaiICIAZByMQAahB/IAIgBkGIwABqEAwgB0HAAWohBwwBCwALAAsgBkGYI2oQSwsgB - kEoaiAGQZgjahB/IAZBKGoQRyAMEAlBACEHIAZBqAZqQTAQchogBkGwDGpBoKfAABBfAkACQAJAAkACQANAAkAgB0EwRg - RAIAYgBi0AqAZBH3E6AKgGIAZByM8AaiAGQagGahBdIAENAUEAQQBB8ILAABA8AAsgASAHRg0CIAZBqAZqIAdqIAAgB2o - tAAA6AAAgB0EBaiEHDAELC0EAIQcCQCAALAAAIgJBAE4EQCAAQTBqIQAgAUEwIAFBMEsbQVBqIQIDQCAHQTBGBEAgBkHY - 2wBqIAZBqAZqEF0gBkHoAWoQSyAGQegBaiAGQcjPAGoQtAEgBkGoAmoiACAGQdjbAGoQtAEgBkHoAmoQaSAGQegBahBEI - AZBuBVqIAZB6AFqEE0gBkGYI2ogABCFASAGQZgjahADIAZBmCNqIAZBuBVqEFkNAyAGQegBahCUAQwDCyACIAdGDQQgBk - GoBmogB2ogACAHai0AADoAACAHQQFqIQcMAAsACyAGQZgjahBLIAZB0NUAakE4EHIaIAZBATYCiFYgBkGYI2ogBkHIzwB - qELQBIAZBmCNqEEQgBkGYJGoQaSAGQdjbAGogBkGYI2oQTQJAIAZB2NsAaiAGQdDVAGoQXEEBRwRAIAZBmCNqEJQBDAEL - IAZBuBVqIAZB2NsAaiAGQdDVAGoQIyAGQbgVahBYBEAgBkG4FWoQQSAGQbgVahBECyAGQdgjaiAGQbgVahClAQsgAkEgc - UEFdiAGQdgjahBMQQFGRwRAIAZBmCNqEKYBCyAGQegBaiAGQZgjakHAARBnGgsgBkHQPGpB8IHAABBfIAZB6AFqEIQBRQ - 0CDAMLIAEgAUHggsAAEDwACyAHQTBqIAFBgIPAABA8AAsgBkGoA2oQSyAGQagDaiAGQegBahB/IAZBuBJqEEsgBkG4Emo - gBkHoAWoQfyAGQbgSahBHIAZByMcAakHwgcAAEF8gBkGYI2pBqILAABBfIAZBiMMAaiAGQZgjahCLAUEAIQAgBkG4IWpB - OBByGiAGQfAhakE4EHIhCSAGQdjbAGpB8IHAABBfIAZBuBVqQYCAwAAQXyAGQZgjakE4EHIaIAZBkCNqIQsgBkGwFWohC - gJAAkADQCAAQQdGDQIgAEEBaiEBIAZBuBVqIABBA3RqIQxCACEXQQAhAwNAIANBf2ohByAKIANBA3RqIQIgCyAAIANqQQ - N0aiEIA0AgB0EGRgRAIAEhAAwDCyAIQQhqIQggAkEIaiECIAAgB0EBaiIHakEGSw0ACyAAQQZNBEAgB0EGSw0DIAdBAWo - hAyAGQQhqIAIpAwAiFiAWQj+HIAwpAwAiFiAWQj+HEDEgCCAGKQMIIhkgF3wiFiAIKQMAIhp8IhhC//////////8DgzcD - ACAYIBZUrSAWIBlUrSAGQRBqKQMAIBdCP4d8fCAaQj+HfHxCBoYgGEI6iIQhFwwBCwsLIABBB0G0ncAAEDwACyAHQQdBx - J3AABA8AAsgBkG4IWogBkHQPGoQayAGQbghaiAGQZgjahAkIAkgBkHQPGoQayAJIAZBmCNqEBwgCSAGQdjbAGoQYyAGQb - gSaiAGQYjDAGoQSCAGQbghahApIQAgBkGIyABqIAZBuCFqIAZByMcAahCNASAGQYjIAGoQKSAASQRAIAZBuCFqIAZBiMg - AahBrIAZBqANqEKYBCyAJECkhACAGQYjIAGogCSAGQcjHAGoQjQEgBkGIyABqECkgAEkEQCAJIAZBiMgAahBrIAZBuBJq - EKYBCyAGQbghahBEIAkQREEAIQcgBkHIyABqQTgQchogBkGIyQBqQTgQchogBkGYO2pBOBByGiAGQYg9ahBLIAZBiMAAa - hBLIAZByMQAahBLIAZByMkAahBLIAZByMwAahBLIAZBqAZqEEsgBkGwDGoQSyAGQcjPAGoQSyAGQdDVAGoQSyAGQdjbAG - oQSyAGQbgVahBLIAZBmCNqIAZByMkAakHAARBnGiAGQdgkaiAGQcjMAGpBwAEQZyEAIAZBmCZqIAZBqAZqQcABEGchASA - GQdgnaiAGQbAMakHAARBnIQsgBkGYKWogBkHIzwBqQcABEGchCiAGQdgqaiAGQdDVAGpBwAEQZyECIAZBmCxqIAZB2NsA - akHAARBnIQMgBkHYLWogBkG4FWpBwAEQZyEIIAZBuBVqQcwBEHIaIAZByMgAaiAGQbghahBrIAZBiMkAaiAJEGsgACAGQ - agDahB/IAAgBkG4EmoQcyABIAZBqANqEH8gASAGQbgSahAMIAZBiD1qIAZBuBJqEH8gBkGIPWoQGCAGQcjEAGogABB/IA - ZBmCNqIAZByMQAahB/IAZBmCNqIAZBiD1qEHMgBkHIxABqIAEQfyALIAZByMQAahB/IAsgBkGIPWoQDCAGQYjAAGogBkG - oA2oQfyAGQYjAAGoQGCAGQcjEAGogABB/IAIgBkHIxABqEH8gAiAGQYjAAGoQDCAGQcjEAGogARB/IAMgBkHIxABqEH8g - AyAGQYjAAGoQDCAGQcjEAGogAhB/IAogBkHIxABqEH8gCiAGQYg9ahBzIAZByMQAaiADEH8gCCAGQcjEAGoQfyAIIAZBi - D1qEAwgBikDyEghFyAGQcjIAGpBARCdASAGQcjIAGoQRCAGKQPISCEWIAZBmDtqIAZByMgAahBrIAZBmDtqQQEQnQEgBk - GYO2oQRCAGQcjIAGogBkGYO2ogF0ICgacQTyAGQYjAAGogBkGoA2ogFkICgacQbSAGQcjEAGogBkGIwABqEH8gBikDiEk - hFyAGQYjJAGpBARCdASAGQYjJAGoQRCAGKQOISSEWIAZBmDtqIAZBiMkAahBrIAZBmDtqQQEQnQEgBkGYO2oQRCAGQYjJ - AGogBkGYO2ogF0ICgacQTyAGQYg9aiAGQbgSaiAWQgKBpxBtIAZByMQAaiAGQYg9ahAMIAZBmDtqIAZByMgAahBrIAZBm - DtqIAZBiMkAahBhIAZBmDtqEEQgBkGYO2oQKUEBaiICQQF2IghBAWohAAJAAkACQAJAA0ACQCAGQcjIAGpBAxCMASEBIA - AgB0YEQCAGQYjJAGpBAxCMASEDIAJBlgNJDQEgAEHMAUG0g8AAEDwACyAGQcjIAGogAUF8aiIBEJ4BIAZByMgAahBEIAZ - ByMgAakECEDsgBkGIyQBqIAZBiMkAakEDEIwBQXxqIgMQngEgBkGIyQBqEEQgBkGIyQBqQQIQOyAHQcwBRg0CIAZBuBVq - IAdqIAMgAUECdGo6AAAgB0EBaiEHDAELCyAGQbgVaiAAaiADIAFBAnRqIgA6AAAgAEEYdEEYdUF/aiIBQQF2IQAgAUEPS - w0BIAZBiD1qIAZBmCNqIABBwAFsahB/A0AgCEF/Rg0EIAhBywFLDQMgBkGIwABqIAZBmCNqIAZBuBVqIAhqLAAAEB8gCE - F/aiEIIAZBiD1qEBggBkGIPWoQGCAGQYg9aiAGQYjAAGoQDAwACwALQcwBQcwBQaSDwAAQPAALIABBCEHEg8AAEDwACyA - IQcwBQdSDwAAQPAALIAZBiD1qIAZByMQAahBzIAZBqANqIAZBiD1qQcABEGcaQX8hByAGQagDahCEAUUNASAGQegBahCm - AUEAIQcgBkHIzwBqQeAAEHIaIAUEQANAIAdB4ABGBEAgBiAGLQDIT0EfcToAyE8gBkHQ1QBqIAZByM8AahAhAkACQAJAI - AQsAAAiA0F/SgRAIARB4ABqIQAgBUHgACAFQeAASxtBoH9qIQFBACEHA0AgB0HgAEYEQCAGQZgjaiAGQcjPAGoQISAGQa - gDaiAGQdDVAGogBkGYI2oQPwwDCyABIAdGDQMgBkHIzwBqIAdqIAAgB2otAAA6AAAgB0EBaiEHDAALAAsgBkGYI2oQKiA - GQYjAAGpBOBByGiAGQQE2AsBAIAZBmCNqIAZB0NUAahCQASAGQZgkaiIBELABIAZBmCVqELABIAZBmCNqEKgBIAZB2NsA - aiAGQZgjahAmIAZBuBVqIAZB2NsAahBeIAZBuBVqEKYBIAZBuBVqIAZB2NsAahAPIAZBsAxqIAZBuBVqQcAAEGcaAkAgB - kGwDGogBkGIwABqEFxBAUcEQCAGQZgjahCYAQwBCyAGQdjbAGoQhwFFBEAgBkHIxABqIAZBmNwAaiIAEIUBIAZByMkAai - AGQdjbAGoQhQEgBkHIzABqIAZB2NsAahCFASAGQagGakE4EHIaIAZBATYC4AYgBkGwDGpBOBByGiAGQQE2AugMIAZByMQ - AahADIAZByMkAahADIAZByMQAaiAGQcjJAGoQeCAGQcjEAGoQRCAGQbgVaiAGQcjEAGogBkGIwABqECMgBkHIyQBqIAZB - uBVqEKUBIAZByMQAaiAGQcjJAGoQpQEgBkHIyQBqIAZB2NsAahClASAGQcjJAGogBkHIxABqEHggBkHIyQBqEEQgBkHIy - QBqEEIgBkHIxABqIAAQpQEgBkHIxABqEEIgBkHIyQBqIAZBsAxqEFwhAiAGQcjMAGogBkGwDGoQpQEgBkHIzABqEEEgBk - HIzABqEEQgBkGoBmogBkHIyQBqEKUBIAZBqAZqEEEgBkGoBmoQRCAGQcjJAGogBkGoBmpBASACayICEHkgBkGwDGogBkH - IzABqIAIQeSAGQbgVaiAGQcjJAGogBkGwDGoQIyAGQdjbAGogBkG4FWoQpQEgBkHIzABqIAZByMkAahClASAGQcjMAGog - BkGwDGoQNCAGQcjMAGogBkHY2wBqEEggACAGQcjMAGoQpQEgACAGQcjEAGoQSCAGQagGaiAGQdjbAGoQpQEgBkHY2wBqI - AAgAhB5IAAgBkGoBmogAhB5IAZB2NsAahCJASEAIAZBuBVqIAZB2NsAahBeIAZBuBVqEDogBkG4FWoQqAEgBkHY2wBqIA - ZBuBVqIAAQjwELIAZB2NsAahCJAQRAIAZB2NsAahA6CyAGQdjbAGoQqwEgASAGQdjbAGoQkAELQQAhAgJAIAEQhwENACA - GQdgkahBMIgINACABEEwhAgsgA0EgcUEFdiACQQFGRwRAIAZBmCNqEJwBCyAGQagDaiAGQZgjakGAAxBnGgsgBkHIyABq - QfCBwAAQXyAGQagDahCIAQ0FIAZBuBJqECogBkG4FWoQKiAGQdDVAGoQKiAGQdjbAGoQKiAGQZgjahAqIAZBuBhqIAZB0 - NUAakGAAxBnIQ0gBkG4G2ogBkHY2wBqQYADEGchCSAGQbgeaiAGQZgjakGAAxBnIQAgBkHY2wBqQbiAwAAQXyAGQZgjak - HwgMAAEF8gBkGIwwBqIAZB2NsAaiAGQZgjahBJIAZBiMkAakHwgcAAEF9BACEHIAZBuCFqQTgQchogBkHwIWpBqAEQciE - DIAZBsAxqQfCBwAAQXyAGQcjPAGpBgIDAABBfIAZB4CJqIQEgBkGoImohDyAGQdDVAGogBkHIyABqEF8DQCAHQagBRg0C - IAZBuCFqIAdqIgIgBkHQ1QBqEGsgAiAGQcjPAGoQJCAHQThqIQcgBkHQ1QBqIAZByM8AahAcDAALAAsgB0HgAGogBUGwp - MAAEDwACyABIAZB0NUAahBrQQAhByAGQdjbAGpBOBByGiAGQZgjaiADIAZBsAxqEI0BIAZB2NsAaiAGQZgjahBrIAMgBk - HY2wBqEGsgBkGYI2ogASAGQbAMahCNASAGQdjbAGogBkGYI2oQayABIAZB2NsAahBrIAZBiD1qECogBkGIwwBqEEAgBkG - IwwBqEKgBIAZBmDtqQTgQchogBkG4FWogBkGoA2oQfgNAIAdBgAlGBEACQCAGQbgVaiECQQAhBwNAIAdB4AFHBEAgBkG4 - IWogB2oiBBApIQUgBkGYI2ogBCAGQYjJAGoQjQEgBkGYO2ogBkGYI2oQayAGQZg7ahApIAVJBEAgBCAGQZg7ahBrIAIQn - AELIAQQRCAHQThqIQcgAkGAA2ohAgwBCwsgBkHIxABqECogBkGIwABqECogBkGYI2oQKiAGQcjJAGoQKiAGQcjMAGoQKi - AGQagGahAqIAZBsAxqECogBkHIzwBqECogBkHQ1QBqECogBkHY2wBqECogBkGYJmogBkHIyQBqQYADEGchAiAGQZgpaiA - GQcjMAGpBgAMQZyEEIAZBmCxqIAZBqAZqQYADEGchBSAGQZgvaiAGQbAMakGAAxBnIQsgBkGYMmogBkHIzwBqQYADEGch - CiAGQZg1aiAGQdDVAGpBgAMQZyEIIAZBmDhqIAZB2NsAakGAAxBnIQxBACEHIAZBqAZqQTgQchogBkGwDGogBkG4IWoQX - yAGQcjPAGogAxBfIAZB0NUAaiAPEF8gBkHY2wBqIAEQXyAGQegMaiAGQcjPAGpBOBBnGiAGQaANaiAGQdDVAGpBOBBnGi - AGQdgNaiAGQdjbAGpBOBBnGiAGQdDVAGpBlwMQchogBkHY2wBqQZcDEHIaA0AgB0HgAUYEQAJAIAZBmCNqIAZBuBVqEH4 - gBkHIxABqIAZBmCNqEH4gAiAGQcjEAGoQfiACIA0QCyAEIAZByMQAahB+IAQgCRALIAZByMQAaiACEH4gBSAGQcjEAGoQ - fiAFIAkQCyAGQcjEAGogBkGYI2oQfiALIAZByMQAahB+IAsgABALIAZByMQAaiACEH4gCiAGQcjEAGoQfiAKIAAQCyAGQ - cjEAGogBBB+IAggBkHIxABqEH4gCCAAEAsgBkHIxABqIAUQfiAMIAZByMQAahB+IAwgABALIAZBsAxqQQEgBikDsAxCAo - GnayIFEJ0BIAZBsAxqEEQgBkGoBmoQdEEAIQAgBkGwDGohAgJAAkACQAJAA38gAEEERgR/IAZBqAZqECkiA0GXA08NAiA - DQQFqIQkgBkHY2wBqIANqQQE6AAAgBkHY2wBqIQggAwVBACEHA0AgB0E4RwRAIAZBqAZqIAdqIgEgASkDACACIAdqKQMA - hDcDACAHQQhqIQcMAQsLIAJBOGohAiAAQQFqIQAMAQsLIQcDQCAHBEAgBkGwDGpBARA7IAggBikDsAxCAoGnQQF0QX9qO - gAAIAdBf2ohByAIQQFqIQgMAQsLQQAhBwNAIAcgCUYEQCAGQYjAAGogBkGYI2ogBkHQ1QBqIANqLQAAQRl0QRh1QQFyEC - AgA0F/aiEHA0AgB0F/Rg0GIAZBiMAAahAUIAdBlgNLDQUgBkHIxABqIAZBmCNqIAZB2NsAaiAHai0AACAGQdDVAGogB2o - tAABBAXRqQRh0QRh1ECAgB0F/aiEHIAZBiMAAaiAGQcjEAGoQCwwACwALIAdBlwNGDQIgB0EBaiEBQQAhACAGQdDVAGog - B2oiC0EAOgAAIAZB2NsAaiAHai0AACEKQQEhAkE4IQcDQCAHQeABRgRAIAEhBwwCBSAGQbAMaiAHaiIEKQMAIRcgBEEBE - DsgBCAKIBdCAoGnbCIIQRh0QRl1EJ4BIAQQRCALIAAgAiAIbGoiADoAACAHQThqIQcgAkEBdCECDAELAAsACwALIANBlw - NBkKXAABA8AAtBlwNBlwNBoKXAABA8AAsgB0GXA0GwpcAAEDwACyAGQcjEAGogBkGIwABqEH4gBkHIzwBqECogBkHIzwB - qIAZBuBVqEH4gBkHIzwBqEJwBIAZByMQAaiAGQcjPAGoQCyAGQYjAAGogBkHIxABqIAUQbyAGQbgSaiAGQYjAAGoQfkF/ - IQcgBkG4EmoQiAFFDQogBkG4EmoQOCAGQbgVakG4gMAAEF8gBkGYI2pB8IDAABBfIAZBmDtqIAZBuBVqIAZBmCNqEEkgB - kGYPGpBOBByGiAGQdA8akE4EHIaIAZBiD1qECogBkHoAWoQhAFFBEAgBkEoahCEAQ0BIAZBiMAAahAqIAZBiMAAaiAGQb - gSahB+IAZBiMAAahBKIAZBiMMAahBLIAZBiMMAaiAGQegBahB/IAZBiMMAahBHIAZByMQAahAqIAZByMQAaiAGQagDahB - +IAZByMQAahBKIAZBuCFqEEsgBkG4IWogBkEoahB/IAZBuCFqEEcgBkGYI2ogBkGIwwBqEIUBIAZByMcAaiAGQZgjahCF - ASAGQZgjaiAGQcjDAGoQhQEgBkGIyABqIAZBmCNqEIUBIAZBmCNqIAZBuCFqEIUBIAZByMgAaiAGQZgjahCFASAGQZgja - iAGQfghahCFASAGQYjJAGogBkGYI2oQhQEgBkHIyQBqECogBkHIzABqECogBkHQ1QBqEGAgBkHIyQBqIAZBiMAAahB+IA - ZByMwAaiAGQcjEAGoQfiAGQbAMahAqIAZBsAxqIAZBiMAAahB+IAZBsAxqEJwBIAZByM8AahAqIAZByM8AaiAGQcjEAGo - QfiAGQcjPAGoQnAEgBkHQPGogBkGYPGoQVEF/aiEHA0AgB0EBTQRAIAZB0NUAahCTASAGQagGaiAGQdDVAGpBiAYQZxoM - BgsgBkHQ1QBqEBsgBkHY2wBqIAZByMkAaiAGQcjHAGogBkGIyABqEBcgBkG4FWogBkHIzABqIAZByMgAaiAGQYjJAGoQF - yAGQdjbAGogBkG4FWoQBiAGQdDVAGogBkHY2wBqEAQCQAJAIAZB0DxqIAdBf2oiBxBXIAZBmDxqIAcQV2tBAWoOAwECAA - ILIAZB2NsAaiAGQcjJAGogBkGIwABqIAZByMcAaiAGQYjIAGoQFiAGQZgjaiAGQcjMAGogBkHIxABqIAZByMgAaiAGQYj - JAGoQFiAGQdjbAGogBkGYI2oQBiAGQdDVAGogBkHY2wBqEAQMAQsgBkHY2wBqIAZByMkAaiAGQbAMaiAGQcjHAGogBkGI - yABqEBYgBkGYI2ogBkHIzABqIAZByM8AaiAGQcjIAGogBkGIyQBqEBYgBkHY2wBqIAZBmCNqEAYgBkHQ1QBqIAZB2NsAa - hAEDAALAAsgBkGoBmogBkGoA2ogBkEoahAQDAMLBSAGQbAMaiAHahBEIAdBOGohBwwBCwsgBkGoBmogBkG4EmogBkHoAW - oQEAsFIAZBiD1qIAZBuBVqIAdqIgIQfiACQYADaiIEIAZBiD1qEH4gBkGYI2ogBkGIwwBqEF4gBkGYI2oQMiAEEKYBIAJ - BgARqIgUQpgEgAkGABWoiAhCmASACEKsBIAQgBkGYI2oQDyAFIAZBmCNqEA8gBSAGQYjDAGoQDyAHQYADaiEHDAELCyAG - QbgVakG4gMAAEF8gBkGYI2pB8IDAABBfIAZByMQAaiAGQbgVaiAGQZgjahBJIAZBiMAAakGAgMAAEF8gBkGwDGogBkGoB - moQaiAGQcjPAGogBkGwDGoQaiAGQdDVAGogBkHIzwBqEI4BIAZB2NsAaiAGQcjRAGoiARCOASAGQbgVaiAGQcjPAGoQjg - EgBkGYI2oQLyAGQcjPAGoQmQEgBkHQ1QBqECIgBkHY2wBqIAZByNMAaiIAEBkgBkHY2wBqEGYgBkHQ1QBqIAZB2NsAahC - BASAGQdDVAGoQrAEgBkHY2wBqIAAQkgEgBkHY2wBqECIgBkHY2wBqEGYgBkG4FWogARAZIAZB2NsAaiAGQbgVahCBASAG - QdjbAGoQrAEgBkG4FWogARCSASAGQbgVahAiIAZBmCNqIAZByM8AahCSASAGQZgjaiAAEBkgBkG4FWogBkGYI2oQgQEgB - kG4FWoQrAEgBkGYI2ogARCSASAGQZgjaiAGQbgVahAZIAZBmCNqEGYgBkHIzwBqIAZB0NUAahAZIAZBmCNqIAZByM8Aah - CWASAAIAZB2NsAahAZIAAQZiAGQZgjaiAAEJYBIAZBmCNqEKwBIAZByMkAaiAGQZgjahBeIAZByMwAaiAGQZgkaiICEF4 - gBkHIyQBqEDIgBkHIzABqEDIgBkHIzABqEFUgBkHIzABqEKgBIAZByMkAaiAGQcjMAGoQfSAGQcjJAGoQQCAGQZgjaiAG - QcjJAGoQDyAGQcjJAGoQOiAGQcjJAGoQqAEgAiAGQcjJAGoQDyAGQcjPAGogBkHQ1QBqEJIBIAZByM8AaiAGQZgjahAZI - AEgBkHY2wBqEJIBIAEgBkGYI2oQGSAAIAZBuBVqEJIBIAAgBkGYI2oQGSAGQQU2AshVIAZBsAxqEJMBIAZBsAxqIAZByM - 8AahAOIAZByM8AaiAGQbAMahBsIAZBsAxqIAZByMQAahA3IAZBsAxqIAZByMQAahA3IAZBsAxqIAZByM8AahAOIAZB0NU - AaiAGQbAMahBqIAZB0NUAahAaIAZB0NUAaiAGQbAMahAOIAZBmCNqIAZBsAxqIAZBiMAAahAdIAZB2NsAaiAGQZgjahBq - IAZB2NsAahCTASAGQbgVaiAGQbAMahBqIAZBuBVqEJMBIAZBsAxqIAZB2NsAahBsIAZBsAxqIAZBuBVqEA4gBkGYI2ogB - kGwDGogBkGIwABqEB0gBkHY2wBqIAZBmCNqEGwgBkHY2wBqEJMBIAZBuBVqIAZBsAxqEGwgBkG4FWoQkwEgBkGwDGogBk - HY2wBqEGwgBkGwDGogBkG4FWoQDiAGQZgjaiAGQbAMaiAGQYjAAGoQHSAGQdjbAGogBkGYI2oQbCAGQdjbAGoQkwEgBkG - 4FWogBkGwDGoQbCAGQbgVaiAGQcjEAGoQNyAGQbAMaiAGQdjbAGoQbCAGQbAMaiAGQbgVahAOIAZBmCNqIAZBsAxqIAZB - iMAAahAdIAZB2NsAaiAGQZgjahBsIAZBmCNqIAZB2NsAaiAGQYjAAGoQHSAGQdjbAGogBkGYI2oQbCAGQbgVaiAGQbAMa - hBsIAZBuBVqIAZByMQAahA3IAZBuBVqIAZByMQAahA3IAZB2NsAaiAGQbgVahAOIAZBuBVqIAZBsAxqEGwgBkG4FWoQkw - EgBkGwDGogBkHY2wBqEGwgBkGwDGogBkG4FWoQDiAGQbAMaiAGQdDVAGoQDiAGQbAMahCaASAGQagGaiAGQbAMakGIBhB - nGiAGQZgjahBuIAZBqAZqIAZBmCNqEHtFDQMgBkGoB2ogAhB7RQ0DIAZBqAhqEIYBRQ0DQQAhByAGQagKahCGAUUNAwwE - CyAFIAdHBEAgBkHIzwBqIAdqIAQgB2otAAA6AAAgB0EBaiEHDAELCyAFIAVBoKTAABA8AAtBAEEAQZCkwAAQPAALQX8hB - wsgBkHg4QBqJAAgBw8LQQAhByAGQbAMakE4EHIaA0AgB0E4RwRAIAZBsAxqIAdqIAZByM8AaiAHaikDADcDACAHQQhqIQ - cMAQsLIAZBmCNqIAZBsAxqEIsBIAZBqANqIAlBBnRqIAZBmCNqQcAAEGcaIAMgCmohAyALIQkMAAsACyAHIAlqIQkgAiE - DDAALAAtBK0EBQaS5wQAoAgAiAEEBIAAbEQAAAAvBKgIIfwF+AkACQAJAAkAgAEH1AU8EQCAAQc3/e08NAiAAQQtqIgBB - eHEhBkHYtcEAKAIAIgdFDQFBHyEIQQAgBmshBQJAAkAgBkH///8HTQRAIAZBBiAAQQh2ZyIAa0EfcXZBAXEgAEEBdGtBP - mohCAsgCEECdEHkt8EAaigCACIABEAgBkEAQRkgCEEBdmtBH3EgCEEfRht0IQMDQAJAIABBBGooAgBBeHEiBCAGSQ0AIA - QgBmsiBCAFTw0AIAAhAiAEIgUNAEEAIQUMAwsgAEEUaigCACIEIAEgBCAAIANBHXZBBHFqQRBqKAIAIgBHGyABIAQbIQE - gA0EBdCEDIAANAAsgAQRAIAEhAAwCCyACDQILQQAhAkECIAhBH3F0IgBBACAAa3IgB3EiAEUNAyAAQQAgAGtxaEECdEHk - t8EAaigCACIARQ0DCwNAIAAgAiAAQQRqKAIAQXhxIgEgBk8gASAGayIDIAVJcSIEGyECIAMgBSAEGyEFIAAoAhAiAQR/I - AEFIABBFGooAgALIgANAAsgAkUNAgtB5LjBACgCACIAIAZPQQAgBSAAIAZrTxsNASACKAIYIQcCQAJAIAIgAigCDCIBRg - RAIAJBFEEQIAJBFGoiAygCACIBG2ooAgAiAA0BQQAhAQwCCyACKAIIIgAgATYCDCABIAA2AggMAQsgAyACQRBqIAEbIQM - DQCADIQQgACIBQRRqIgMoAgAiAEUEQCABQRBqIQMgASgCECEACyAADQALIARBADYCAAsCQCAHRQ0AAkAgAiACKAIcQQJ0 - QeS3wQBqIgAoAgBHBEAgB0EQQRQgBygCECACRhtqIAE2AgAgAUUNAgwBCyAAIAE2AgAgAQ0AQdi1wQBB2LXBACgCAEF+I - AIoAhx3cTYCAAwBCyABIAc2AhggAigCECIABEAgASAANgIQIAAgATYCGAsgAkEUaigCACIARQ0AIAFBFGogADYCACAAIA - E2AhgLAkAgBUEQTwRAIAIgBkEDcjYCBCACIAZqIgcgBUEBcjYCBCAFIAdqIAU2AgAgBUGAAk8EQEEfIQAgB0IANwIQIAV - B////B00EQCAFQQYgBUEIdmciAGtBH3F2QQFxIABBAXRrQT5qIQALIAcgADYCHCAAQQJ0QeS3wQBqIQQCQAJAAkACQEHY - tcEAKAIAIgNBASAAQR9xdCIBcQRAIAQoAgAiA0EEaigCAEF4cSAFRw0BIAMhAAwCC0HYtcEAIAEgA3I2AgAgBCAHNgIAI - AcgBDYCGAwDCyAFQQBBGSAAQQF2a0EfcSAAQR9GG3QhAQNAIAMgAUEddkEEcWpBEGoiBCgCACIARQ0CIAFBAXQhASAAIQ - MgAEEEaigCAEF4cSAFRw0ACwsgACgCCCIBIAc2AgwgACAHNgIIIAdBADYCGCAHIAA2AgwgByABNgIIDAQLIAQgBzYCACA - HIAM2AhgLIAcgBzYCDCAHIAc2AggMAgsgBUEDdiIBQQN0Qdy1wQBqIQACf0HUtcEAKAIAIgNBASABdCIBcQRAIAAoAggM - AQtB1LXBACABIANyNgIAIAALIQUgACAHNgIIIAUgBzYCDCAHIAA2AgwgByAFNgIIDAELIAIgBSAGaiIAQQNyNgIEIAAgA - moiACAAKAIEQQFyNgIECyACQQhqDwsCQAJAQdS1wQAoAgAiB0EQIABBC2pBeHEgAEELSRsiBkEDdiIBdiICQQNxRQRAIA - ZB5LjBACgCAE0NAyACDQFB2LXBACgCACIARQ0DIABBACAAa3FoQQJ0QeS3wQBqKAIAIgFBBGooAgBBeHEgBmshBSABIQM - DQCABKAIQIgBFBEAgAUEUaigCACIARQ0ECyAAQQRqKAIAQXhxIAZrIgIgBSACIAVJIgIbIQUgACADIAIbIQMgACEBDAAL - AAsCQCACQX9zQQFxIAFqIgVBA3QiAEHktcEAaigCACIDQQhqIgIoAgAiASAAQdy1wQBqIgBHBEAgASAANgIMIAAgATYCC - AwBC0HUtcEAIAdBfiAFd3E2AgALIAMgBUEDdCIAQQNyNgIEIAAgA2oiACAAKAIEQQFyNgIEIAIPCwJAQQIgAXQiAEEAIA - BrciACIAF0cSIAQQAgAGtxaCIBQQN0IgBB5LXBAGooAgAiA0EIaiIEKAIAIgIgAEHctcEAaiIARwRAIAIgADYCDCAAIAI - 2AggMAQtB1LXBACAHQX4gAXdxNgIACyADIAZBA3I2AgQgAyAGaiIFIAFBA3QiACAGayIHQQFyNgIEIAAgA2ogBzYCAEHk - uMEAKAIAIgAEQCAAQQN2IgJBA3RB3LXBAGohAEHsuMEAKAIAIQgCf0HUtcEAKAIAIgFBASACQR9xdCICcQRAIAAoAggMA - QtB1LXBACABIAJyNgIAIAALIQMgACAINgIIIAMgCDYCDCAIIAA2AgwgCCADNgIIC0HsuMEAIAU2AgBB5LjBACAHNgIAIA - QPCyADKAIYIQcCQAJAIAMgAygCDCIBRgRAIANBFEEQIANBFGoiASgCACICG2ooAgAiAA0BQQAhAQwCCyADKAIIIgAgATY - CDCABIAA2AggMAQsgASADQRBqIAIbIQIDQCACIQQgACIBQRRqIgIoAgAiAEUEQCABQRBqIQIgASgCECEACyAADQALIARB - ADYCAAsgB0UNAyADIAMoAhxBAnRB5LfBAGoiACgCAEcEQCAHQRBBFCAHKAIQIANGG2ogATYCACABRQ0EDAMLIAAgATYCA - CABDQJB2LXBAEHYtcEAKAIAQX4gAygCHHdxNgIADAMLAkACQAJAAkACQEHkuMEAKAIAIgEgBkkEQEHouMEAKAIAIgAgBk - sNA0EAIQUgBkGvgARqIgJBEHZAACIAQX9GDQYgAEEQdCIDRQ0GQfS4wQAgAkGAgHxxIgVB9LjBACgCAGoiAjYCAEH4uME - AQfi4wQAoAgAiACACIAAgAksbNgIAQfC4wQAoAgAiBEUNAUH8uMEAIQADQCAAKAIAIgEgACgCBCICaiADRg0DIAAoAggi - AA0ACwwEC0HsuMEAKAIAIQMCfyABIAZrIgJBD00EQEHsuMEAQQA2AgBB5LjBAEEANgIAIAMgAUEDcjYCBCABIANqIgJBB - GohACACKAIEQQFyDAELQeS4wQAgAjYCAEHsuMEAIAMgBmoiADYCACAAIAJBAXI2AgQgASADaiACNgIAIANBBGohACAGQQ - NyCyEGIAAgBjYCACADQQhqDwtBkLnBACgCACIAQQAgACADTRtFBEBBkLnBACADNgIAC0GUucEAQf8fNgIAQYC5wQAgBTY - CAEH8uMEAIAM2AgBB6LXBAEHctcEANgIAQfC1wQBB5LXBADYCAEHktcEAQdy1wQA2AgBB+LXBAEHstcEANgIAQey1wQBB - 5LXBADYCAEGAtsEAQfS1wQA2AgBB9LXBAEHstcEANgIAQYi2wQBB/LXBADYCAEH8tcEAQfS1wQA2AgBBkLbBAEGEtsEAN - gIAQYS2wQBB/LXBADYCAEGYtsEAQYy2wQA2AgBBjLbBAEGEtsEANgIAQaC2wQBBlLbBADYCAEGUtsEAQYy2wQA2AgBBiL - nBAEEANgIAQai2wQBBnLbBADYCAEGctsEAQZS2wQA2AgBBpLbBAEGctsEANgIAQbC2wQBBpLbBADYCAEGstsEAQaS2wQA - 2AgBBuLbBAEGstsEANgIAQbS2wQBBrLbBADYCAEHAtsEAQbS2wQA2AgBBvLbBAEG0tsEANgIAQci2wQBBvLbBADYCAEHE - tsEAQby2wQA2AgBB0LbBAEHEtsEANgIAQcy2wQBBxLbBADYCAEHYtsEAQcy2wQA2AgBB1LbBAEHMtsEANgIAQeC2wQBB1 - LbBADYCAEHctsEAQdS2wQA2AgBB6LbBAEHctsEANgIAQfC2wQBB5LbBADYCAEHktsEAQdy2wQA2AgBB+LbBAEHstsEANg - IAQey2wQBB5LbBADYCAEGAt8EAQfS2wQA2AgBB9LbBAEHstsEANgIAQYi3wQBB/LbBADYCAEH8tsEAQfS2wQA2AgBBkLf - BAEGEt8EANgIAQYS3wQBB/LbBADYCAEGYt8EAQYy3wQA2AgBBjLfBAEGEt8EANgIAQaC3wQBBlLfBADYCAEGUt8EAQYy3 - wQA2AgBBqLfBAEGct8EANgIAQZy3wQBBlLfBADYCAEGwt8EAQaS3wQA2AgBBpLfBAEGct8EANgIAQbi3wQBBrLfBADYCA - EGst8EAQaS3wQA2AgBBwLfBAEG0t8EANgIAQbS3wQBBrLfBADYCAEHIt8EAQby3wQA2AgBBvLfBAEG0t8EANgIAQdC3wQ - BBxLfBADYCAEHEt8EAQby3wQA2AgBB2LfBAEHMt8EANgIAQcy3wQBBxLfBADYCAEHgt8EAQdS3wQA2AgBB1LfBAEHMt8E - ANgIAQfC4wQAgAzYCAEHct8EAQdS3wQA2AgBB6LjBACAFQVhqIgA2AgAgAyAAQQFyNgIEIAAgA2pBKDYCBEGMucEAQYCA - gAE2AgAMAwsgAEEMaigCACADIARNciABIARLcg0BIAAgAiAFajYCBEHwuMEAQfC4wQAoAgAiA0EPakF4cSIBQXhqNgIAQ - ei4wQBB6LjBACgCACAFaiICIAMgAWtqQQhqIgA2AgAgAUF8aiAAQQFyNgIAIAIgA2pBKDYCBEGMucEAQYCAgAE2AgAMAg - tB6LjBACAAIAZrIgI2AgBB8LjBAEHwuMEAKAIAIgEgBmoiADYCACAAIAJBAXI2AgQgASAGQQNyNgIEIAFBCGohBQwCC0G - QucEAQZC5wQAoAgAiACADIAAgA0kbNgIAIAMgBWohAUH8uMEAIQACQANAIAEgACgCAEcEQCAAKAIIIgANAQwCCwsgAEEM - aigCAA0AIAAgAzYCACAAIAAoAgQgBWo2AgQgAyAGQQNyNgIEIAMgBmohBCABIANrIAZrIQYCQAJAIAFB8LjBACgCAEcEQ - EHsuMEAKAIAIAFGDQEgAUEEaigCACIAQQNxQQFGBEAgASAAQXhxIgAQFSAAIAZqIQYgACABaiEBCyABIAEoAgRBfnE2Ag - QgBCAGQQFyNgIEIAQgBmogBjYCACAGQYACTwRAQR8hBSAEQgA3AhAgBkH///8HTQRAIAZBBiAGQQh2ZyIAa0EfcXZBAXE - gAEEBdGtBPmohBQsgBCAFNgIcIAVBAnRB5LfBAGohAQJAAkACQAJAQdi1wQAoAgAiAkEBIAVBH3F0IgBxBEAgASgCACIC - QQRqKAIAQXhxIAZHDQEgAiEFDAILQdi1wQAgACACcjYCACABIAQ2AgAgBCABNgIYDAMLIAZBAEEZIAVBAXZrQR9xIAVBH - 0YbdCEBA0AgAiABQR12QQRxakEQaiIAKAIAIgVFDQIgAUEBdCEBIAUiAkEEaigCAEF4cSAGRw0ACwsgBSgCCCIAIAQ2Ag - wgBSAENgIIIARBADYCGCAEIAU2AgwgBCAANgIIDAULIAAgBDYCACAEIAI2AhgLIAQgBDYCDCAEIAQ2AggMAwsgBkEDdiI - CQQN0Qdy1wQBqIQACf0HUtcEAKAIAIgFBASACdCICcQRAIAAoAggMAQtB1LXBACABIAJyNgIAIAALIQUgACAENgIIIAUg - BDYCDCAEIAA2AgwgBCAFNgIIDAILQfC4wQAgBDYCAEHouMEAQei4wQAoAgAgBmoiADYCACAEIABBAXI2AgQMAQtB7LjBA - CAENgIAQeS4wQBB5LjBACgCACAGaiIANgIAIAQgAEEBcjYCBCAAIARqIAA2AgALIANBCGoPC0H8uMEAIQADQAJAIAAoAg - AiAiAETQRAIAIgACgCBGoiAiAESw0BCyAAKAIIIQAMAQsLQfC4wQAgAzYCAEHouMEAIAVBWGoiADYCACADIABBAXI2AgQ - gACADakEoNgIEQYy5wQBBgICAATYCACAEIAJBYGpBeHFBeGoiACAAIARBEGpJGyIBQRs2AgRB/LjBACkCACEJIAFBEGpB - hLnBACkCADcCACABIAk3AghBgLnBACAFNgIAQfy4wQAgAzYCAEGEucEAIAFBCGo2AgBBiLnBAEEANgIAIAFBHGohAANAI - ABBBzYCACACIABBBGoiAEsNAAsgASAERg0AIAEgASgCBEF+cTYCBCAEIAEgBGsiBUEBcjYCBCABIAU2AgAgBUGAAk8EQE - EfIQAgBEIANwIQIAVB////B00EQCAFQQYgBUEIdmciAGtBH3F2QQFxIABBAXRrQT5qIQALIARBHGogADYCACAAQQJ0QeS - 3wQBqIQMCQAJAAkACQEHYtcEAKAIAIgFBASAAQR9xdCICcQRAIAMoAgAiAkEEaigCAEF4cSAFRw0BIAIhAAwCC0HYtcEA - IAEgAnI2AgAgAyAENgIAIARBGGogAzYCAAwDCyAFQQBBGSAAQQF2a0EfcSAAQR9GG3QhAQNAIAIgAUEddkEEcWpBEGoiA - ygCACIARQ0CIAFBAXQhASAAIQIgAEEEaigCAEF4cSAFRw0ACwsgACgCCCICIAQ2AgwgACAENgIIIARBGGpBADYCACAEIA - A2AgwgBCACNgIIDAMLIAMgBDYCACAEQRhqIAI2AgALIAQgBDYCDCAEIAQ2AggMAQsgBUEDdiICQQN0Qdy1wQBqIQACf0H - UtcEAKAIAIgFBASACdCICcQRAIAAoAggMAQtB1LXBACABIAJyNgIAIAALIQEgACAENgIIIAEgBDYCDCAEIAA2AgwgBCAB - NgIIC0EAIQVB6LjBACgCACIAIAZNDQBB6LjBACAAIAZrIgI2AgBB8LjBAEHwuMEAKAIAIgEgBmoiADYCACAAIAJBAXI2A - gQgASAGQQNyNgIEIAFBCGoPCyAFDwsgASAHNgIYIAMoAhAiAARAIAEgADYCECAAIAE2AhgLIANBFGooAgAiAEUNACABQR - RqIAA2AgAgACABNgIYCwJAIAVBEE8EQCADIAZBA3I2AgQgAyAGaiIEIAVBAXI2AgQgBCAFaiAFNgIAQeS4wQAoAgAiAAR - AIABBA3YiAkEDdEHctcEAaiEAQey4wQAoAgAhBwJ/QdS1wQAoAgAiAUEBIAJBH3F0IgJxBEAgACgCCAwBC0HUtcEAIAEg - AnI2AgAgAAshAiAAIAc2AgggAiAHNgIMIAcgADYCDCAHIAI2AggLQey4wQAgBDYCAEHkuMEAIAU2AgAMAQsgAyAFIAZqI - gBBA3I2AgQgACADaiIAIAAoAgRBAXI2AgQLIANBCGoLtA8BA38jAEGAC2siAiQAIAJBCGoQSyACQcgBakE4EHIaIAJBAT - YCgAIgAkGIAmpBOBByGiACQQE2AsACIAJByAJqQTgQchogAkEBNgKAAyACQYgDakE4EHIaIAJBATYCwAMgAkHIA2pBOBB - yGiACQQE2AoAEIAJBiARqQQEQigEgAkHIBGpBOBByGiACQQE2AoAFIAJBiAVqQTgQchogAkEBNgLABSACQcgFaiABEIUB - IAJBiAZqQTgQchogAkEBNgLABiACQcgGakE4EHIaIAJBATYCgAcgAkGIB2pBOBByGiACQQE2AsAHIAJByAdqQTgQchogA - kEBNgKACCACQcgFahBYIQMgAkHICWpB4ITAABBfIAJBiApqIAJByAlqEIsBIAJByAFqIAJBiApqEKUBIAJByAlqQZiFwA - AQXyACQYgKaiACQcgJahCLASACQYgCaiACQYgKahClASACQcgFahADIAJByAVqQQsQUiACQYgGaiACQcgFahClASACQYg - GaiACQYgEahB4IAJBiAZqEEQgAkGIBmogAkHIBWoQSCACQYgFaiACQcgBahClASACQYgFaiACQYgGahBIIAJBiAZqIAJB - iARqEHggAkGIBmoQRCACQYgGaiACQYgCahBIIAJBiAZqEEEgAkGIBmoQRCACQYgDaiACQYgGahClASACQcgDaiACQcgFa - hClASACQcgDaiACQYgDahBIIAJByAdqIAJBiANqEKUBIAJByAdqEAMgAkHIBmogAkGIBWoQpQEgAkHIBmoQAyACQYgGai - ACQcgBahClASACQYgGaiACQcgGahBIIAJByAdqIAJBiAZqEHggAkHIB2oQRCACQcgHaiACQYgDahBIIAJByAZqIAJBiAV - qEEggAkGIBmogAkGIAmoQpQEgAkGIBmogAkHIBmoQSCACQcgHaiACQYgGahB4IAJByAdqEEQgAkGIBmogAkHIB2oQpQEg - AkGIBmogAkGIBWoQSCACQYgGaiACQYgHahBcIQQgAkGIBWogAkGIBmoQpQEgAkGIBWogAkGIB2oQNCACQYgFaiACQcgHa - hBIIAJBiANqIAJBiAVqEEggAkHIA2ogAkGIBWoQSCACQcgFaiABEEggAkHIBmogAkGIBWoQpQEgAkHIBmoQAyACQYgFai - ACQcgGahClASACQYgFaiACQcgFahBIIAJByAVqIAJBiAZqEKUBIAJByAVqQQsQUiACQcgJakHQhcAAEF8gAkGICmogAkH - ICWoQiwEgAkHIAmogAkGICmoQpQEgAkHIAmogAkGIB2oQSCACQYgDaiACQcgDakEBIARrIgEQeSACQcgGaiACQYgFaiAB - EHkgAkGIBmogAkHIBWogARB5IAJBiAdqIAJByAJqIAEQeSACQYgKaiACQYgGaiACQYgHahAjIAJByARqIAJBiApqEKUBI - AJByARqIAJByAZqEEggAkHIBGoQWCEBIAJBiAZqIAJByARqEKUBIAJBiAZqEEEgAkGIBmoQRCACQcgEaiACQYgGaiABIA - NzEHkgAkGICmpBiIbAABBfIAJBiAhqIAJBiApqEIsBQTghAQNAIAFBoAVGRQRAIAJBiAhqIAJBiANqEEggAkHICWogAUG - IhsAAahBfIAFBOGohASACQYgKaiACQcgJahCLASACQYgGaiACQYgKahClASACQYgIaiACQYgGahB4IAJBiAhqEEQMAQsL - IAJByAhqIAJBiANqEIUBIAJByAlqQaiLwAAQXyACQYgKaiACQcgJahCLASACQYgGaiACQYgKahClASACQcgIaiACQYgGa - hB4IAJByAhqEERBACEBA0AgAUH4A0ZFBEAgAkHICGogAkGIA2oQSCACQcgJaiABQeCLwABqEF8gAUE4aiEBIAJBiApqIA - JByAlqEIsBIAJBiAZqIAJBiApqEKUBIAJByAhqIAJBiAZqEHggAkHICGoQRAwBCwsgAkGICmpB2I/AABBfIAJBiAlqIAJ - BiApqEIsBQQAhAQNAIAFByAZGBEACQCACQcgJaiACQYgDahCFASACQcgKakHYlsAAEF8gAkGICmogAkHICmoQiwEgAkGI - BmogAkGICmoQpQEgAkHICWogAkGIBmoQeCACQcgJahBEQQAhAQNAIAFBkAZGDQEgAkHICWogAkGIA2oQSCACQcgKaiABQ - ZCXwABqEF8gAUE4aiEBIAJBiApqIAJByApqEIsBIAJBiAZqIAJBiApqEKUBIAJByAlqIAJBiAZqEHggAkHICWoQRAwACw - ALBSACQYgJaiACQYgDahBIIAJByAlqIAFBkJDAAGoQXyABQThqIQEgAkGICmogAkHICWoQiwEgAkGIBmogAkGICmoQpQE - gAkGICWogAkGIBmoQeCACQYgJahBEDAELCyACQYgJaiACQcgEahBIIAJBiAZqIAJBiAhqEKUBIAJBiAZqIAJByAlqEEgg - AkEIaiACQYgGahClASACQYgGaiACQYgJahClASACQYgGaiACQcgIahBIIAJByABqIAJBiAZqEKUBIAJBiAZqIAJByAhqE - KUBIAJBiAZqIAJByAlqEEggAkGIAWogAkGIBmoQpQEgACACQQhqQcABEGcaIAJBgAtqJAALzQ0CE38IfiMAQYADayIBJA - AgADQCOCIUIBR+QoCAgBBaBEAgABASCyABQeABakHoABByGiABQcgBaiAAKQMAIhggGEI/hyIZIBggGRAxIAEgASkDyAE - iFEL//////////wODNwPYASABQdABaikDACIXQgaGIBRCOoiEIRUgF0I6iCEaIABBCGoiCyEFIAAhBkEBIQcDQCAHQQZP - BEAgAEEYaiEMIABBKGohCyAAQRBqIQcgACkDMCEYQQQhBkEAIQkgAUGgAWohDUEDIQpBAiEIQQchBQJAAkADQCAFQQpLD - QIgBiAIIAYgCEsbIQ4gBiAKIAYgCksbQQN0QWhqIQ8gAUGYAWogBUEDdCIQIABqQVBqKQMAIhQgFEI/hyAYIBhCP4ciGR - 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 - OBByGiACQQE2AvgMIAJBgA1qQTgQchogAkG4DWpBATYCACACQYAIakE4EHIaIAJBATYCuAggAkHACGpBOBByGiACQfgIa - kEBNgIAIAJBgApqIABBgANqIgMQXiACQYAIaiACQYAKahCQASACQYAKaiABQYADaiIFEF4gAkGACGogAkGACmoQDyACQc - AMahCpASAERQRAIAJBgApqIAMQXiACQcAMaiACQYAKahCQASACQYAKaiABQYACahBeIAJBwAxqIAJBgApqEA8LIAAoAoA - GQQRHBEAgAkGACmogAEGAAmoQXiACQcAMaiACQYAKahCQASACQYAKaiAFEF4gAkHADGogAkGACmoQDwsgAkGABGogAkHA - DGogAkGACGoQoQEgAkGABGoQZgsgAkGACGogABCOASACQYAKaiABEI4BIAJBgAhqIABBgAJqIgQQlgEgAkGACGoQrAEgA - kGACmogAUGAAmoiBRCWASACQYAKahCsASACQYACaiACQYAIahCSASACQYACaiACQYAKahAZIAJBgAhqIAQQkgEgAkGACG - ogAEGABGoiAxCWASACQYAIahCsASACQYAKaiAFEJIBIAJBgApqIAFBgARqIgUQlgEgAkGACmoQrAEgAkGABmogAkGACGo - QkgEgAkGABmogAkGACmoQGSACQYAIaiACEJIBIAJBgAhqECsgAkGACmogAkGABGoQkgEgAkGACmoQKyACQYACaiACQYAI - ahCWASAEIAJBgAJqEJIBIAQgAkGACmoQlgEgAkGABmogAkGACmoQlgEgAkGABGogAkGACGoQlgEgAkGACGogABCSASACQ - YAIaiADEJYBIAJBgAhqEKwBIAJBgApqIAEQkgEgAkGACmogBRCWASACQYAKahCsASACQYAIaiACQYAKahAZIAJBgARqIA - JBgAhqEJYBIAJBgAhqIAMQkgEgAkGACGogBRAZIAJBgApqIAJBgAhqEJIBIAJBgApqECsgAyACQYAEahCSASADIAJBgAp - qEJYBIAJBgAZqIAJBgApqEJYBIAJBgAhqEGYgBCACQYAIahCWAQwDCyAAIAEQBgwECyACQcAMaiABQYAFahBeIAJBgAxq - IAJBwAxqQcAAEGcaIAJBgAZqIAJBgAxqEKMBCyACQYAGahBmIAJBgAhqIAIQkgEgAkGACGoQKyACQYACaiACQYAIahCWA - SAFIAJBgAJqEJIBIAJBgARqIAJBgAhqEJIBIAJBgAhqIAAQkgEgAkGACGogAxCWASACQYAIahCsASACQYAKaiABEJIBIA - JBgApqIAFBgARqEJYBIAJBgApqEKwBIAJBgAhqIAJBgApqEBkgAkGABGogAkGACGoQlgEgAkGACGogAxCSAQJAIARBAkc - EQCACQcAMaiABQYAFahBeIAJBgAhqIAJBwAxqEKIBDAELIAJBwAxqIAFBgAVqEF4gAkGADGogAkHADGpBwAAQZxogAkGA - CGogAkGADGoQowELIAJBgAhqEGYgAkGACmogAkGACGoQkgEgAkGACmoQKyADIAJBgARqEJIBIAMgAkGACmoQlgEgAkGAB - mogAkGACmoQlgEgAkGACGoQZiAFIAJBgAhqEJYBCyACQYAGahCsASACQYAGahBmIAAgAhCSASAAIAJBgAZqEJYBIABBBT - YCgAYgABCZAQwBCyAAIAEQbAsgAkHADWokAAuaCQIPfwt+IwBBwAJrIgIkACACQeAAakGgp8AAEF8gAEE4EHIhDCACQZg - BakHwABByGiACQZACakEwEHIaIAwQdCACIAEpAwAiFEL9//P/z///+QF+Qv//////////A4MiETcDiAIgAkHQAGogEUIA - IAIpA2AiGCAYQj+HIhoQMSAUIAIpA1AiEXwiFiARVK0gAkHYAGopAwAgFEI/h3x8IhRCOocgASkDCCIRQj+HfCARIBRCB - oYgFkI6iIQiEXwiEiARVK18IRNBASEDAkADQAJAIANBB0YEQCACQZACaiEJIAJB6ABqIQpBByEEIAJB4ABqIQ0gAkGIAm - ohDkEGIQ8MAQsgA0EBdiIAQQFqIQUgCiAAayEGIAkgAEEDdCIHayEAIAdBCGohCCACQUBrIANBA3QiBCACQeAAamopAwA - iFiAWQj+HIhQgAikDiAIiESARQj+HEDEgAkHIAGopAwAgEiAVfCIRIBJUrSATIBd8fHwgESACKQNAfCITIBFUrXwhEiAD - QQFqIQcDQCADIAVNBEAgAkGIAmogBGogE0L9//P/z///+QF+Qv//////////A4MiETcDACACQTBqIBFCACAYIBoQMSACQ - SBqIBFCACAWIBQQMSACQZgBaiADQQR0aiIAIAJBKGopAwAiGzcDCCAAIAIpAyAiGTcDACACKQMwIhEgE3wiFiARVK0gAk - E4aikDACASfHwiFEI6hyABIAdBA3RqKQMAIhFCP4d8IBEgFEIGhiAWQjqIhCIRfCISIBFUrXwhEyAVIBl8IhUgGVStIBc - gG3x8IRcgCUEIaiEJIApBAWohCiAHIQMMAwsgBkEGSw0DIAJBEGogAkHgAGogCGopAwAgAkHgAGogAGopAwB9IhEgEUI/ - hyACQYgCaiAAaikDACACQYgCaiAIaikDAH0iESARQj+HEDEgAikDECIRIBN8IhMgEVStIAJBGGopAwAgEnx8IRIgBUEBa - iEFIABBeGohACAGQX9qIQYgCEEIaiEIDAALAAsLA0ACQCAEQQ1HBEAgDyAEQQF2IgBrIQUgDiAAQQN0IgtrIRAgDSALay - EIIBMgF3wgEiAVfCITIBJUrXwhEiAEQQFqIQdBMCEAIAkhBiAKIQMDQCAAIAtGDQIgBUEGTQRAIAIgAyALaikDACAAIAh - qKQMAfSIRIBFCP4cgACAQaikDACAGIAtqKQMAfSIRIBFCP4cQMSACKQMAIhEgE3wiEyARVK0gAkEIaikDACASfHwhEiAF - QX9qIQUgBkEIaiEGIANBCGohAyAAQXhqIQAMAQsLIAVBB0HknsAAEDwACyAMIBJC//////////8DgzcDMCACQcACaiQAD - wsgBEEDdCAMakFIaiATQv//////////A4M3AwAgEkI6hyABIAdBA3RqKQMAIhFCP4d8IBEgEkIGhiATQjqIhCIRfCISIB - FUrXwhEyAXIARBBHQgAmpBOGoiAEEIaikDAH0gFSAAKQMAIhFUrX0hFyAOQQhqIQ4gDUEIaiENIA9BAWohDyAVIBF9IRU - gByEEDAALAAsgBkEHQdSewAAQPAAL+QkBBH8jAEGACWsiAiQAIAJBgAhqIAAQXiACIAJBgAhqEF4gAkGACGogAEGAAWoi - BBBeIAJBgAFqIAJBgAhqEF4gAkGACGogARBeIAIgAkGACGoQDyACQYAIaiABQYABaiIFEF4gAkGAAWogAkGACGoQDyAAK - AKABiEDAkACQCABKAKABkECRwRAIANBAkYNASACQYAIaiAAQYAFahBeIAJBgAJqIAJBgAhqEF4gAkGACGogAUGABWoQXi - ACQYACaiACQYAIahAPDAILIANBAkYEQCACQYAIaiAAQYAFahBeIAJBgAdqIAJBgAhqQcAAEGcaIAJBgAZqIAJBgAdqEIU - BIAJBgAhqIAFBgAVqEF4gAkGAB2ogAkGACGpBwAAQZxogAkGABmogAkGAB2oQSCACQYAIakE4EHIaIAJBATYCuAggAkHA - CGpBOBByIAJB+AhqQQE2AgAgAkGACGogAkGABmoQpQEQsgEgAkGAAmogAkGACGpBgAEQZxoMAgsgAkGACGogAEGABWoQX - iACQYACaiACQYAIahBeIAJBgAhqIAFBgAVqEF4gAkGAB2ogAkGACGpBwAAQZxogAkGAAmogAkGAB2oQoAEMAQsgAkGACG - ogAUGABWoQXiACQYACaiACQYAIahBeIAJBgAhqIABBgAVqEF4gAkGAB2ogAkGACGpBwAAQZxogAkGAAmogAkGAB2oQoAE - LIAJBgAhqIAAQXiACQYADaiACQYAIahBeIAJBgAhqIAEQXiACQYAEaiACQYAIahBeIAJBgAhqIAQQXiACQYADaiACQYAI - ahCVASACQYADahCoASACQYAIaiAFEF4gAkGABGogAkGACGoQlQEgAkGABGoQqAEgAkGABWogAkGAA2oQXiACQYAFaiACQ - YAEahAPIAJBgAZqIAIQXiACQYAGaiACQYABahCVASACQYAGahA6IAJBgAVqIAJBgAZqEJUBIAJBgAhqIAAQXiACQYADai - ACQYAIahCQASACQYAIaiAAQYAFaiIDEF4gAkGAA2ogAkGACGoQlQEgAkGAA2oQqAEgAkGACGogARBeIAJBgARqIAJBgAh - qEJABIAJBgAhqIAFBgAVqIgEQXiACQYAEaiACQYAIahCVASACQYAEahCoASACQYAHaiACQYADahBeIAJBgAdqIAJBgARq - EA8gAkGABmogAhCQASACQYAGaiACQYACahCVASACQYAGahA6IAJBgAdqIAJBgAZqEJUBIAJBgAhqIAQQXiACQYADaiACQ - YAIahCQASACQYAIaiADEF4gAkGAA2ogAkGACGoQlQEgAkGAA2oQqAEgAkGACGogBRBeIAJBgARqIAJBgAhqEJABIAJBgA - hqIAEQXiACQYAEaiACQYAIahCVASACQYAEahCoASACQYAIaiACQYADahBeIAJBgAhqIAJBgARqEA8gAkGABmogAkGAAWo - QkAEgAkGABmogAkGAAmoQlQEgAkGABmoQOiACQYAIaiACQYAGahCVASACQYABahBVIAIgAkGAAWoQlQEgACACIAJBgAVq - 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 - GogAkGABWoQfSACQYAEahCoASACQYAFaiAAEJABIAJBgAVqIAQQlQEgAkGABWoQqAEgAkGABmogARBeIAJBgAZqIAYQlQ - EgAkGABmoQqAEgAkGABWogAkGABmoQDyACQYAGaiACEJABIAJBgAZqIAJBgAJqEJUBIAJBgAZqIAJBgAVqELUBIAJBgAZ - qEKgBIAJBgAVqIAIQkAEgAkGABWogAhCVASACIAJBgAVqEJUBIAIQqAEgAkGAAmpBDBCfASACQYACahBVIAJBgAJqEKgB - IAJBgAdqIAJBgAFqEF4gAkGAB2ogAkGAAmoQlQEgAkGAB2oQqAEgAkGAAWogAkGAAmoQfSACQYABahCoASACQYAGakEME - J8BIAJBgAZqEFUgAkGABmoQqAEgAkGABWogAkGABmoQkAEgAkGABWogAkGABGoQDyACQYACaiACQYADahCQASACQYACai - ACQYABahAPIAJBgAVqIAJBgAJqELUBIAJBgAZqIAIQDyACQYABaiACQYAHahAPIAJBgAZqIAJBgAFqEJUBIAIgAkGAA2o - QDyACQYAHaiACQYAEahAPIAJBgAdqIAIQlQEgACACQYAFahCQASAAEKgBIAMgAkGABmoQkAEgAxCoASAEIAJBgAdqEJAB - IAQQqAEgAkGACGokAAv2BQEFfyMAQYAEayICJAAgAiAAEIUBIAIgARBIIAJBQGsgAEFAayIDEIUBIAJBQGsgAUFAayIFE - EggAkGAAWogAEGAAWoiBBCFASACQYABaiABQYABaiIGEEggAkHAAWogABCFASACQcABaiADEHggAkHAAWoQRCACQYACai - ABEIUBIAJBgAJqIAUQeCACQYACahBEIAJBwAFqIAJBgAJqEEggAkGAAmogAhClASACQYACaiACQUBrEHggAkHAAWogAkG - AAmoQgAEgAkHAAWoQRCACQYACaiADEKUBIAJBgAJqIAQQeCACQYACahBEIAJBwAJqIAUQhQEgAkHAAmogBhB4IAJBwAJq - EEQgAkGAAmogAkHAAmoQSCACQcACaiACQUBrEKUBIAJBwAJqIAJBgAFqEHggAkGAAmogAkHAAmoQgAEgAkGAAmoQRCACQ - cACaiAAEKUBIAJBwAJqIAQQeCACQcACahBEIAJBgANqIAEQhQEgAkGAA2ogBhB4IAJBgANqEEQgAkHAAmogAkGAA2oQSC - ACQYADaiACEKUBIAJBgANqIAJBgAFqEHggAkGAA2ogAkHAAmoQswEgAkGAA2oQRCACQcACaiACEKUBIAJBwAJqIAIQeCA - CIAJBwAJqEHggAhBEIAJBgAFqQQwQUiACQcADaiACQUBrEIUBIAJBwANqIAJBgAFqEHggAkHAA2oQRCACQUBrIAJBgAFq - EIABIAJBQGsQRCACQYADakEMEFIgAkHAAmogAkGAA2oQpQEgAkHAAmogAkGAAmoQSCACQYABaiACQcABahClASACQYABa - iACQUBrEEggAkHAAmogAkGAAWoQswEgAkGAA2ogAhBIIAJBQGsgAkHAA2oQSCACQYADaiACQUBrEHggAiACQcABahBIIA - JBwANqIAJBgAJqEEggAkHAA2ogAhB4IAAgAkHAAmoQpQEgABBEIAMgAkGAA2oQpQEgAxBEIAQgAkHAA2oQpQEgBBBEIAJ - BgARqJAALxQUBBH8jAEHwEmsiACQAIAAQOEF/IQEgABCIAUUEQCAAQYADakE4EHIaIABBuANqQTgQchogAEG4A2ogAEGA - A2oQVCAAQfAKakG4gMAAEF8gAEHwDWpB8IDAABBfIABB8ANqIABB8ApqIABB8A1qEEkgAEHwBGpBOBByGiAAQQE2AqgFI - ABBsAVqQTgQchogAEHoBWpBATYCACAAQfAFakE4EHIaIABBATYCqAYgAEGwBmpBOBByGiAAQegGakEBNgIAIABB8AZqQT - gQchogAEEBNgKoByAAQbAHakE4EHIaIABB6AdqQQE2AgBBf2ohAyAAQfAHahAqIABB8AdqIAAQfiAAQfAKahAqIABB8Ap - qIABB8AdqEH4gAEHwDWoQKiAAQfANaiAAQfAHahB+IABB8A1qEJwBAkACQAJAA0AgAiEBIANBAkkNAyAAQfAKaiAAQfAE - aiAAQfAFaiAAQfAGahAlIAFBxABNBEAgAEHwEGogAEHwBGogAEHwBWogAEHwBmoQRiABQQh0QdCrwABqIABB8BBqEJIBI - AFBAWohAgJAAkAgAEG4A2ogA0F/aiIDEFcgAEGAA2ogAxBXa0EBag4DAQMAAwsgAEHwCmogAEHwB2ogAEHwBGogAEHwBW - ogAEHwBmoQHiABQcMASw0DIABB8BBqIABB8ARqIABB8AVqIABB8AZqEEYgAkEIdEHQq8AAaiAAQfAQahCSASABQQJqIQI - MAgsgAEHwCmogAEHwDWogAEHwBGogAEHwBWogAEHwBmoQHiABQcMASw0DIABB8BBqIABB8ARqIABB8AVqIABB8AZqEEYg - AkEIdEHQq8AAaiAAQfAQahCSASABQQJqIQIMAQsLIAFBxQBBvIHAABA8AAtBxQBBxQBBzIHAABA8AAtBxQBBxQBB3IHAA - BA8AAtBACEBCyAAQfASaiQAIAEL8gQBBH8jAEGADGsiAiQAIAIgABCOASACQYACahAvIAJBgARqIABBgAJqIgMQjgEgAk - GABmoQLyACQYAIaiAAEI4BIAJBgApqIAEQjgEgAiABEBkgAkGABGogAUGAAmoiBBAZIAJBgAhqIAMQlgEgAkGACmogBBC - WASACQYAIahCsASACQYAKahCsASACQYACaiACQYAIahCSASACQYACaiACQYAKahAZIAJBgAhqIAMQkgEgAkGACGogAEGA - BGoiBRCWASACQYAKaiAEEJIBIAJBgApqIAFBgARqIgQQlgEgAkGACGoQrAEgAkGACmoQrAEgAkGABmogAkGACGoQkgEgA - kGABmogAkGACmoQGSACQYAIaiACEJIBIAJBgAhqECsgAkGACmogAkGABGoQkgEgAkGACmoQKyACQYACaiACQYAIahCWAS - ADIAJBgAJqEJIBIAMgAkGACmoQlgEgAkGABmogAkGACmoQlgEgAkGABGogAkGACGoQlgEgAkGACGogABCSASACQYAIaiA - FEJYBIAJBgAhqEKwBIAJBgApqIAEQkgEgAkGACmogBBCWASACQYAKahCsASACQYAIaiACQYAKahAZIAJBgARqIAJBgAhq - EJYBIAJBgAhqIAUQkgEgAkGACGogBBAZIAJBgApqIAJBgAhqEJIBIAJBgApqECsgBSACQYAEahCSASAFIAJBgApqEJYBI - AJBgAZqIAJBgApqEJYBIAJBgAhqEGYgAyACQYAIahCWASACQYAGahCsASACQYAGahBmIAAgAhCSASAAIAJBgAZqEJYBIA - BBBTYCgAYgABCZASACQYAMaiQAC68EAQV/IwBBkAZrIgIkACAAQUBrIQQCQCABQfgAaigCACABKAI4aqwgAEH4AGooAgA - iAyAAKAI4IgVqrH5CgICAEFMNACAFQQJOBH8gABASIAAoAngFIAMLQQJIDQAgBBASCyACQaCnwAAQX0EAIQMgAkE4akHw - ABByGiABQUBrIQUDQCADQThGBEAgAkHwAGohBkEAIQMDQCADQThGRQRAIAMgBmogAiADaikDADcDACADQQhqIQMMAQsLI - AJBqAFqIAAQXyACQeABaiABEF8gAkGYAmogACABEAggAkGIA2ogBCAFEAggAkGoAWogBBBhIAJBqAFqEEQgAkHgAWogBR - BhIAJB4AFqEEQgAkH4A2ogAkGoAWogAkHgAWoQCEEAIQMgAkHoBGpB8AAQchoDQCADQfAARkUEQCACQegEaiADaiACQZg - CaiADaikDADcDACADQQhqIQMMAQsLIAJB6ARqIAJBiANqEGVBACEDA0AgA0HwAEZFBEAgAkGIA2ogA2oiASACQThqIANq - KQMAIAEpAwB9NwMAIANBCGohAwwBCwsgAkGYAmogAkGIA2oQZSACQZgCahBFIAJB+ANqIAJB6ARqEGQgAkH4A2oQRSACQ - dgFaiACQZgCahAFIAAgAkHYBWoQayAAQQM2AjggAkHYBWogAkH4A2oQBSAEIAJB2AVqEGsgAEECNgJ4IAJBkAZqJAAFIA - JBOGogA2pCADcDACADQQhqIQMMAQsLC5QEAQF/IwBB0CJrIgMkACADQcAWakG4gMAAEF8gA0HIHGpB8IDAABBfIANBCGo - gA0HAFmogA0HIHGoQSSADQYgBakE4EHIaIANBwAFqQTgQchogA0H4AWoQKgJAIAIQhAFFBEAgA0H4BGoQKiADQfgEaiAB - EH4gA0H4BGoQSiADQfgHahBLIANB+AdqIAIQfyADQfgHahBHIANByBxqIANB+AdqEIUBIANBuAlqIANByBxqEIUBIANBy - BxqIANBuAhqEIUBIANB+AlqIANByBxqEIUBIANBuApqECogA0G4DWoQYCADQbgKaiADQfgEahB+IANBwBNqECogA0HAE2 - ogA0H4BGoQfiADQcATahCcASADQcABaiADQYgBahBUQX9qIQIDQCACQQFNBEAgA0G4DWoQkwEgACADQbgNakGIBhBnGgw - DBSADQbgNahAbIANBwBZqIANBuApqIANBuAlqIANB+AlqEBcCQAJAAkAgA0HAAWogAkF/aiICEFcgA0GIAWogAhBXa0EB - ag4DAQIAAgsgA0HIHGogA0G4CmogA0H4BGogA0G4CWogA0H4CWoQFiADQcAWaiADQcgcahAGDAELIANByBxqIANBuApqI - ANBwBNqIANBuAlqIANB+AlqEBYgA0HAFmogA0HIHGoQBgsgA0G4DWogA0HAFmoQBAwBCwALAAsgABBgCyADQdAiaiQAC8 - MDARV/A0AgAUHAAUYEQAJAIABBKGohCyAAQRRqKAIAIgwhCCAAQRBqKAIAIg0hAyAAQQxqKAIAIg4hAiAAKAIIIg8hASA - AQRhqKAIAIhAhCiAAQRxqKAIAIhEhBCAAQSBqKAIAIhIhByAAQSRqKAIAIhMhBgNAIAchCSAEIQcgCiEEIAVBgAJGDQEg - AiADcSEUIAIgA3MhFSAFIAtqKAIAIAVB9J7AAGooAgAgBEEadyAEQRV3cyAEQQd3cyAGaiAJIARBf3NxIAQgB3FyampqI - gYgCGohCiAFQQRqIQUgAyEIIAIhAyABIQIgAUEedyABQRN3cyABQQp3cyAUIAEgFXFzaiAGaiEBIAkhBgwACwALBSAAIA - FqIgNB6ABqIANBzABqKAIAIANBKGooAgAgA0EsaigCACICQRl3IAJBDndzIAJBA3ZzIANB4ABqKAIAIgJBD3cgAkENd3M - gAkEKdnNqamo2AgAgAUEEaiEBDAELCyAAIAYgE2o2AiQgACAJIBJqNgIgIAAgByARajYCHCAAIAQgEGo2AhggACAIIAxq - NgIUIAAgAyANajYCECAAIAIgDmo2AgwgACABIA9qNgIIC9YDAgZ/An4jAEHwAGsiASQAIAFBoKfAABBfIAFBOGogARBfI - AAQRAJAAkACQCABAn8gACgCOCICQRBMBEAgAkF/ahA5DAELIAEpAzAiCEIBfCIHIAhUDQEgACkDMCIIQoCAgICAgICAgH - 9RQQAgB0J/URsNAiABQThqIAggB3+nECghByABIAEpA2ggB0I6hnw3A2ggACABQThqEGIgABBEQQILIgMQLSAAQQhqIQQ - DQCADRQ0DIAEgASkDCEI5hkKAgICAgICAgAKDIAEpAwBCAYeEIgc3AwAgASAAKQMAIAd9IgdC//////////8DgzcDOEEA - IQIDQCAHQjqHIQcgAkEoRkUEQCABIAJqIgVBCGoiBiAFQRBqKQMAQjmGQoCAgICAgICAAoMgBikDAEIBh4QiCDcDACABI - AJqQUBrIAIgBGopAwAgCH0gB3wiB0L//////////wODNwMAIAJBCGohAgwBCwsgASABKQMwQgGHIgg3AzAgASAAKQMwIA - h9IAd8Igc3A2ggACABQThqIAdCP4enQQFqEE8gA0F/aiEDDAALAAtBoKLAAEEZQbyiwAAQWwALQdCiwABBH0G8osAAEFs - ACyAAQQE2AjggAUHwAGokAAuhAwEBfyMAQZADayIGJAAgBkEIakHAABByGiAGQcgAakGoAhByGiAGQcgAahBDA0AgAQRA - IAZByABqQQAQPiABQX9qIQEMAQUCQCACBEAgBkHIAGogAiADEHoLIAQEQCAGQcgAaiAEIAUQegsgBkGIA2pCADcDACAGQ - YADakIANwMAIAZB+AJqQgA3AwAgBkIANwPwAiAGKAJIIQEgBigCTCECIAZByABqQYABED4DQCAGKAJIQf8DcUHAA0ZFBE - AgBkHIAGpBABA+DAELCyAGQawBaiABNgIAIAZBqAFqIAI2AgAgBkHIAGoQEUEAIQJBACEBA0AgAUEgRkUEQCAGQfACaiA - BaiABQXxxIAZqQdAAaigCACACQX9zQRhxdjoAACACQQhqIQIgAUEBaiEBDAELCyAGQcgAahBDQQAhAQNAIAFBIEZFBEAg - BkEIaiABaiAGQfACaiABai0AADoAACABQQFqIQEMAQsLQQAhAQNAIAFBIEYNASAAIAFqIAZBCGogAWotAAA6AAAgAUEBa - iEBDAALAAsLCyAGQZADaiQAC6EDAQN/IwBBgAZrIgEkACABIABBgAFqIgMQXiABQYABaiADEF4gAUGAAWoQMiABQYACai - ABEF4gAUGAAmogAEGAAmoiAhAPIAFBgANqIAIQXiABQYADahAyIAIgAUGAAWoQkAEgAiABQYABahCVASACEKgBIAIQpwE - gAhCnASACEKgBIAFBgANqQQwQnwEgAUGAA2oQVSABQYADahCoASABQYAEaiABQYADahBeIAFBgARqIAIQDyABQYAFaiAB - QYABahBeIAFBgAVqIAFBgANqEJUBIAFBgAVqEKgBIAIgAUGAAmoQDyABQYACaiABQYADahCQASABQYACaiABQYADahCVA - SABQYADaiABQYACahCVASABQYADahCoASABQYABaiABQYADahB9IAFBgAFqEKgBIAFBgAVqIAFBgAFqEA8gAUGABWogAU - GABGoQlQEgAUGAAmogABCQASABQYACaiABEA8gACABQYABahCQASAAEKgBIAAgAUGAAmoQDyAAEKcBIAAQqAEgAyABQYA - FahCQASADEKgBIAFBgAZqJAALhQMBBH8CQAJAIAFBgAJPBEAgAEEYaigCACEEAkACQCAAIAAoAgwiAkYEQCAAQRRBECAA - QRRqIgIoAgAiAxtqKAIAIgENAUEAIQIMAgsgACgCCCIBIAI2AgwgAiABNgIIDAELIAIgAEEQaiADGyEDA0AgAyEFIAEiA - kEUaiIDKAIAIgFFBEAgAkEQaiEDIAIoAhAhAQsgAQ0ACyAFQQA2AgALIARFDQIgACAAQRxqKAIAQQJ0QeS3wQBqIgEoAg - BHBEAgBEEQQRQgBCgCECAARhtqIAI2AgAgAkUNAwwCCyABIAI2AgAgAg0BQdi1wQBB2LXBACgCAEF+IAAoAhx3cTYCAA8 - LIABBDGooAgAiAiAAQQhqKAIAIgBHBEAgACACNgIMIAIgADYCCA8LQdS1wQBB1LXBACgCAEF+IAFBA3Z3cTYCAAwBCyAC - IAQ2AhggACgCECIBBEAgAiABNgIQIAEgAjYCGAsgAEEUaigCACIARQ0AIAJBFGogADYCACAAIAI2AhgLC7MCAQF/IwBBg - AtrIgUkACAFEC8gBUGAAmoQLyAFQYAEahAvIAVBgAZqQTgQchogBUEBNgK4BiAFQcAGakE4EHIaIAVB+AZqQQE2AgAgBU - GAB2pBOBByGiAFQQE2ArgHIAVBwAdqQTgQchogBUH4B2pBATYCACAFQYAIakE4EHIaIAVBATYCuAggBUHACGpBOBByGiA - FQfgIakEBNgIAIAEgAiAFQYAGaiAFQYAHaiAFQYAIahAeIAVBgAhqIAMQoAEgBUGABmogBBCgASAFQYAJaiAFQYAGaiAF - QYAHahCRASAFIAVBgAlqEJIBIAVBgAlqIAVBgAhqEJsBIAVBgARqIAVBgAlqEJIBIAVBgARqEGYgACAFIAVBgAJqIAVBg - ARqEHYgAEEDNgKABiAFQYALaiQAC7ECAQF/IwBBgAtrIgQkACAEEC8gBEGAAmoQLyAEQYAEahAvIARBgAZqQTgQchogBE - EBNgK4BiAEQcAGakE4EHIaIARB+AZqQQE2AgAgBEGAB2pBOBByGiAEQQE2ArgHIARBwAdqQTgQchogBEH4B2pBATYCACA - EQYAIakE4EHIaIARBATYCuAggBEHACGpBOBByGiAEQfgIakEBNgIAIAEgBEGABmogBEGAB2ogBEGACGoQJSAEQYAIaiAC - EKABIARBgAZqIAMQoAEgBEGACWogBEGABmogBEGAB2oQkQEgBCAEQYAJahCSASAEQYAJaiAEQYAIahCbASAEQYAEaiAEQ - YAJahCSASAEQYAEahBmIAAgBCAEQYACaiAEQYAEahB2IABBAzYCgAYgBEGAC2okAAvJAgEDfyMAQcACayIBJAAgASAAQU - BrIgMQhQEgARADIAFBQGsgAxCFASABQUBrIABBgAFqIgIQSCABQYABaiACEIUBIAFBgAFqEAMgAiABEKUBIAIgARB4IAI - QRCACEE4gAhBOIAIQRCABQYABakEMEFIgAUHAAWogAUGAAWoQhQEgAUHAAWogAhBIIAFBgAJqIAEQhQEgAUGAAmogAUGA - AWoQeCABQYACahBEIAIgAUFAaxBIIAFBQGsgAUGAAWoQpQEgAUFAayABQYABahB4IAFBgAFqIAFBQGsQeCABIAFBgAFqE - IABIAEQRCABQYACaiABEEggAUGAAmogAUHAAWoQeCABQUBrIAAQpQEgAUFAayADEEggACABEKUBIAAQRCAAIAFBQGsQSC - AAEE4gABBEIAMgAUGAAmoQpQEgAxBEIAFBwAJqJAALrQIBA38jAEGABGsiAiQAIAIgABBeIAJBgAFqIABBgAFqIgMQXiA - CQYACakE4EHIaIAJBATYCuAIgAkHAAmpBOBByGiACQfgCakEBNgIAIAJBgANqIAMQXiACIAEQDyACQYABaiABQYABaiIE - EA8gAkGAAmogBBCQASACQYACaiABEJUBIAJBgANqIAAQlQEgAkGAAmoQqAEgAkGAA2oQqAEgAkGAA2ogAkGAAmoQDyACQ - YACaiACEJABIAJBgAJqEDogAkGAA2ogAkGAAmoQlQEgAkGAA2oQqAEgAkGAAmogAkGAAWoQkAEgAkGAAmoQOiADIAJBgA - NqEJABIAMgAkGAAmoQlQEgAkGAAWoQVSAAIAJBgAFqEJABIAAgAhCVASAAEKwBIAJBgARqJAALvQIBA38jAEGACGsiASQ - AIAEgABCOASABQYACaiAAQYAEaiICEI4BIAFBgARqIABBgAJqIgMQjgEgAUGABmoQLyAAECIgAUGABmogABCSASABQYAG - aiAAEJYBIAAgAUGABmoQlgEgABCsASABELYBIAEQrwEgACABEJYBIAFBgAJqECIgAUGAAmoQZiABQYAGaiABQYACahCSA - SABQYAGaiABQYACahCWASABQYACaiABQYAGahCWASABQYACahCsASABQYAEahAiIAFBgAZqIAFBgARqEJIBIAFBgAZqIA - FBgARqEJYBIAFBgARqIAFBgAZqEJYBIAFBgARqEKwBIAMQrgEgAxCvASACELYBIAIQrwEgAyABQYACahCWASACIAFBgAR - qEJYBIABBBTYCgAYgABCaASABQYAIaiQAC7ICAQN/IwBBgAhrIgEkACAAKAKABkEBRwRAIAEgABCOASABQYACaiAAQYAC - aiIDEI4BIAFBgARqIABBgARqIgIQjgEgAUGABmogABCOASABECIgAUGAAmogAhAZIAFBgAJqEK8BIAFBgAJqEKwBIAFBg - ARqECIgAUGABmogAxAZIAFBgAZqEK8BIAIgABCWASACIAMQlgEgAhCsASACECIgACABEJIBIAEgAUGAAmoQlgEgARCsAS - ABIAFBgARqEJYBIAEgAUGABmoQlgEgARCsASABECsgAUGAAmoQZiABQYAEahBmIAAgAUGAAmoQlgEgAyABQYAEahCSASA - DIAFBgAZqEJYBIAIgARCWASAAQQRBBSAAKAKABkF+cUECRhs2AoAGIAAQmQELIAFBgAhqJAALigIBAn8jAEHgAWsiAiQA - IAAQRCACQQhqQTAQchogAkIBNwMAIAJBOGogABBfIAJB8ABqIAEQXyACQagBakE4EHIaIAAQdANAIAJBOGogAkHwAGoQN - UF/TARAA0ACQCADQQBMDQAgAkHwAGpBARA7IAJBARA7IAJBqAFqIAJBOGoQayACQagBaiACQfAAahBiIAJBqAFqEEQgAk - E4aiACQagBaiACKQPYAUI/h6dBAWoiARBPIAJBqAFqIAAQayACQagBaiACEGEgAkGoAWoQRCAAIAJBqAFqIAEQTyADQX9 - qIQMMAQsLBSACQQEQLSACQfAAakEBEC0gA0EBaiEDDAELCyACQeABaiQAC54CAQF/IwBBgA1rIgMkACADIAEQaiADEJkB - IANBiAZqIAIQXyADQYgGahBEIANBwAZqIANBiAZqEF8gA0HABmpBAxAoGiADQcAGahBEIANB+AZqIAMQagJAIANBwAZqE - FpFBEAgA0HABmoQKUF/aiECA0AgAkEBTQRAIANB+AZqEJoBDAMLIANB+AZqEBoCQAJAIANBwAZqIAJBf2oiAhBXIANBiA - ZqIAIQV2tBAWoOAwECAAILIANB+AZqIAMQDgwBCyADEJMBIANB+AZqIAMQDiADEJMBDAALAAsgA0H4BmoQsAEgA0H4B2o - QqQEgA0H4CGoQrQEgA0H4CmoQrQEgA0EBNgL4DAsgACADQfgGakGIBhBnGiADQYANaiQAC5ACAQJ/IwBBgAJrIgUkACAF - QYABaiAAEF4gAiAFQYABahCQASAFQYABaiAAQYABahBeIAQgBUGAAWoQkAEgBUGAAWogAEGAAmoiBhBeIAUgBUGAAWoQX - iAFQYABaiAGEF4gAyAFQYABahCQASAFQYABaiABQYABaiIGEF4gBSAFQYABahAPIAVBgAFqIAEQXiADIAVBgAFqEA8gAi - ADEH0gAhCoASAEIAUQfSAEEKgBIAUgAhCQASACEFUgAhCoASAFQYABaiAGEF4gBSAFQYABahAPIAMgBBCQASAFQYABaiA - BEF4gAyAFQYABahAPIAMgBRB9IAMQqAEgBBA6IAQQqAEgACABEAsgBUGAAmokAAvkAQECfyMAQcABayIDJAAgAxBLIAAg - ASACQR91IgQgAnMgBEF/c2pBAm0iAkF/akEfdhBtIAAgAUHAAWogAkEBc0F/akEfdhBtIAAgAUGAA2ogAkECc0F/akEfd - hBtIAAgAUHABGogAkEDc0F/akEfdhBtIAAgAUGABmogAkEEc0F/akEfdhBtIAAgAUHAB2ogAkEFc0F/akEfdhBtIAAgAU - GACWogAkEGc0F/akEfdhBtIAAgAUHACmogAkEHc0F/akEfdhBtIAMgABB/IAMQpgEgACADIARBAXEQbSADQcABaiQAC+Q - BAQJ/IwBBgANrIgMkACADECogACABIAJBH3UiBCACcyAEQX9zakECbSICQX9qQR92EG8gACABQYADaiACQQFzQX9qQR92 - EG8gACABQYAGaiACQQJzQX9qQR92EG8gACABQYAJaiACQQNzQX9qQR92EG8gACABQYAMaiACQQRzQX9qQR92EG8gACABQ - YAPaiACQQVzQX9qQR92EG8gACABQYASaiACQQZzQX9qQR92EG8gACABQYAVaiACQQdzQX9qQR92EG8gAyAAEH4gAxCcAS - AAIAMgBEEBcRBvIANBgANqJAALvAEBAn8jAEGwAWsiAiQAIAJBMBByIQIDQCADQTBGBEACQCABQTBqIQEgAkEwaiACEHV - BACEDA0AgA0EwRg0BIAIgA2ogASADai0AADoAACADQQFqIQMMAAsACwUgAiADaiABIANqLQAAOgAAIANBAWohAwwBCwsg - AkHwAGogAhB1IABBOBByIgBBATYCOCAAQUBrQTgQciAAQfgAakEBNgIAIAAgAkHwAGoQpQEgAkEwahClASACQbABaiQAC - 9QBAQJ/IwBBgANrIgEkACABIAAQXiABQYABaiAAQYABaiICEF4gAUGAAmogABBeIAFBgAJqIAIQDyABIAIQlQEgAUGAAW - oQVSABQYABaiAAEJUBIAEQqAEgAUGAAWoQqAEgACABEJABIAAgAUGAAWoQDyABQYABaiABQYACahCQASABQYABahBVIAF - BgAFqIAFBgAJqEJUBIAFBgAFqEKgBIAFBgAFqEDogACABQYABahCVASABQYACahCnASACIAFBgAJqEJABIAAQrAEgAUGA - A2okAAvEAQEBfyMAQYADayIDJAAgA0EIaiABEIUBAkAgAkUEQCADQQhqEAcMAQsgA0EIaiACEKUBCyADQcgAakHYo8AAE - F8gA0GAAWogA0HIAGoQiwEgA0HAAWogA0EIahCFASADQcABahADIANBwAFqIAEQSCAAIAEQhQEgACADQQhqEEggA0GAAm - ogA0HAAWoQhQEgABBYIQEgA0HAAmogABCFASADQcACahBBIANBwAJqEEQgACADQcACaiABEHkgA0GAA2okAAufAQEBfyM - AQfAAayICJAAgAiABEF9BACEBIAJBOGpBOBByGiAAEEQCQCAAIAIQNUEASA0AA0AgAkEBEC0gAUEBaiEBIAAgAhA1QX9K - DQALA0AgAUEATA0BIAJBARA7IAJBOGogABBrIAJBOGogAhBiIAJBOGoQRCAAIAJBOGogAikDaEI/h6dBAWoQTyABQX9qI - QEMAAsACyACQfAAaiQAC7IBAQF/IwBBgAJrIgQkACAEQYABaiAAEF4gAyAEQYABahCQASAEQYABaiAAQYABahBeIAQgBE - GAAWoQXiAEQYABaiAAQYACahBeIAIgBEGAAWoQkAEgASAEEJABIAEgAhAPIAMQMiAEEDIgAhAyIAEQpwEgARA6IAEQqAE - gARBVIAEQqAEgAkEMEJ8BIANBAxCfASACEFUgAhCoASACIAQQfSACEKgBIAAQFCAEQYACaiQAC58BAQJ/IwBBgAJrIgIk - ACAAIAEQXiAAEDIgAkGIAWpB2KTAABBfIAJBCGpBOBByGiACQQE2AkAgAkHIAGpBOBByIAJBgAFqQQE2AgAgAkHAAWogA - kGIAWoQiwEgAkEIaiACQcABahClARCyASACQQhqEKgBIAJBCGoQVSACQQhqEKgBIAAgARAPIAAgAkEIahCVASAAEKsBIA - JBgAJqJAALowEBAX8jAEEwayIGJAAgBkEQaiAAIAEQsQEgBiAGKAIUIgA2AhwgBiAGKAIQIgE2AhggBkEIaiACIAMQsQE - gBiAGKAIMIgI2AiQgBiAGKAIIIgM2AiAgBiAEIAUQsQEgBiAGKAIEIgQ2AiwgBiAGKAIAIgU2AiggASAAIAMgAiAFIAQQ - ACAGQShqEKQBIAZBIGoQpAEgBkEYahCkASAGQTBqJAALiAECA38DfiMAQRBrIgIkAAN+IANBOEYEfiACQRBqJAAgBgUgA - iAAIANqIgQpAwAiBSAFQj+HIAGsIgUgBUI/hxAxIAQgAikDACIHIAZ8IgVC//////////8DgzcDACAFIAdUrSACQQhqKQ - MAIAZCP4d8fEIGhiAFQjqIhCEGIANBCGohAwwBCwsLhAECA38BfiMAQUBqIgEkACABQQhqIAAQXyABQQhqEEQgAUE4aiE - CQQYhA0HcAiEAAn8DQEEAIANBAEgNARogAikDACIEUARAIAJBeGohAiAAQUZqIQAgA0F/aiEDDAELCwN/IARQBH8gAAUg - AEEBaiEAIARCAn8hBAwBCwsLIAFBQGskAAuHAQEBfyMAQcABayIBJAAgAEE4EHIiAEEBNgI4IABBQGtBOBByGiAAQfgAa - kEBNgIAIAEQUCABQYgBakE4EHIaIABBgAFqIAFBgAEQZxogAEGAAmpBOBByGiAAQbgCakEBNgIAIABBvAJqIAFBhAFqQT - wQZxogAEH4AmpBATYCACABQcABaiQAC48BAQJ/IwBBgAJrIgEkACAAEKwBIAEgABBeIAFBgAFqQTgQchogAUEBNgK4ASA - BQcABakE4EHIaIAFB+AFqQQE2AgAgASAAQYABaiICEJUBIAEQOiABQYABaiABEJABIAFBgAFqIAIQlQEgAiABEJABIAIg - ABCVASAAIAFBgAFqEJABIAAQrAEgAUGAAmokAAt9AgF/An4jAEGAAWsiASQAIAFBCGogABCFASABQQhqEBIgAUHIAGogA - UEIahCDAUEIIQADQCAAQThGRQRAIAFByABqIABqKQMAIAKEIQIgAEEIaiEADAELCyABKQNIIQMgAUGAAWokACACQn98IA - NCAYVCf3yDQjqIp0EBcQuJAQIBfwJ+IAAgACkDMCABQT9xrSIDhiAAKQMoQTogAWtBP3GtIgSHhDcDMCAAQShqIQFBBiE - CA0AgAkEBTQRAIAAgACkDACADhkL//////////wODNwMABSABIAEpAwAgA4ZC//////////8DgyABQXhqIgEpAwAgBIeE - NwMAIAJBf2ohAgwBCwsLiQECAX8CfiAAIAApA2BBOiABQTpwIgFrrSIEhyAAKQNoIAGtIgOGhDcDaCAAQeAAaiEBQQ0hA - gNAIAJBAU0EQCAAIAApAwAgA4ZC//////////8DgzcDAAUgASABKQMAIAOGQv//////////A4MgAUF4aiIBKQMAIASHhD - cDACACQX9qIQIMAQsLC3EBAX8jAEFAaiIBJAAgAEE4EHIiAEEBNgI4IABBQGtBOBByGiAAQfgAakEBNgIAIAFBCGpBOBB - yGiAAQYABakE4EHIaIABBuAFqQQE2AgAgAEG8AWogAUEEakE8EGcaIABB+AFqQQE2AgAgAUFAayQAC4EBAgF/AX4gAEHw - ABByIQADQCACQThGBEACQCAAIAEpAzAiA0I6hzcDOCAAIANC//////////8DgzcDMCAAQUBrIQBBACECA0AgAkEwRg0BI - AAgAmpCADcDACACQQhqIQIMAAsACwUgACACaiABIAJqKQMANwMAIAJBCGohAgwBCwsLdQECfiAAIANCIIgiBSABQiCIIg - Z+IAIgA358IAEgBH58IANC/////w+DIgIgAUL/////D4MiAX4iA0IgiCACIAZ+fCICQiCIfCABIAV+IAJC/////w+DfCI - BQiCIfDcDCCAAIANC/////w+DIAFCIIaENwMAC3YBAn8jAEHAAWsiASQAIAEgABCFASABQUBrIAAQhQEgAUGAAWogAEFA - ayICEIUBIAEgAhB4IAFBQGsgABB4IAFBQGsQRCACIAFBQGsQSCABQYABahBBIAAgAUGAAWoQeCABEEQgABBEIAAgARBII - AFBwAFqJAALkwEBAn9B0LXBAEHQtcEAKAIAQQFqNgIAAkACQEGYucEAKAIAQQFGBEBBnLnBAEGcucEAKAIAQQFqIgA2Ag - AgAEECSw0CQaC5wQAoAgAiAUF/Sg0BDAILQZi5wQBCgYCAgBA3AwBBoLnBACgCACIAQQBIDQFBoLnBACAANgIAAAtBoLn - BACABNgIAIABBAUsNAAALAAtnAQJ/IwBBQGoiAiQAIAAQRCACIAAQhQECQCABRQRAIAAQBwwBCyAAIAEQpQELQQAhAQNA - IAFBAUsgA3JFBEAgABADIAFBAEchAyABIAFFaiEBDAELCyAAIAIQSCAAEBIgAkFAayQAC18CAX8EfkIBIQNBMCECA38gA - kF4RgR/IARCAYYgA3ynQX9qBSABIAJqKQMAIgUgACACaikDACIGfUI6hyADgyAEhCEEIAJBeGohAiAFIAaFQn98QjqHIA - ODIQMMAQsLC2ACAX8EfkIBIQNB6AAhAgN/IAJBeEYEfyAEQgGGIAN8p0F/agUgASACaikDACIFIAAgAmopAwAiBn1COoc - gA4MgBIQhBCACQXhqIQIgBSAGhUJ/fEI6hyADgyEDDAELCwt3AQN/IwBBgAJrIgIkACACIAEQXiACQYABaiABEF4gAhAy - IAJBgAFqIAIQDyAAIAJBgAFqEJcBIABBgAJqIgMgAkGAAWoQlwEgAEGABGoiBCACQYABahCXASADIAEQogEgBCACEKIBI - ABBBTYCgAYgAkGAAmokAAt6AQF/IwBB4ANrIgEkACABQYABakHApcAAEF8gAUG4AWpB+KXAABBfIAEgAUGAAWogAUG4AW - oQSSABQfACakGwpsAAEF8gAUGoA2pB6KbAABBfIAFB8AFqIAFB8AJqIAFBqANqEEkgACABIAFB8AFqED8gAUHgA2okAAt - nACAAQQF2IAByIgBBAnYgAHIiAEEEdiAAciIAQQh2IAByIgBBEHYgAHIiACAAQQF2QdWq1aoFcWsiAEECdkGz5syZA3Eg - AEGz5syZA3FqIgBBBHYgAGpBj568+ABxQYGChAhsQRh2C2cBAn8jAEGAAWsiASQAIAEgABCFASABQUBrQTgQchogAUEBN - gJ4IAEgAEFAayICEHggARBBIAFBQGsgARClASABQUBrIAIQeCACIAEQpQEgAiAAEHggACABQUBrEKUBIAFBgAFqJAALaA - IBfwJ+IAFBP3GtIQNBOiABa0E/ca0hBEEAIQEDQCABQTBGBEAgACAAKQMwIAOHNwMwBSAAIAFqIgIgAkEIaikDACAEhkL - //////////wODIAIpAwAgA4eENwMAIAFBCGohAQwBCwsLbAEBfyMAQTBrIgMkACADIAE2AgQgAyAANgIAIANBHGpBAjYC - ACADQSxqQQI2AgAgA0ICNwIMIANBlKjAADYCCCADQQI2AiQgAyADQSBqNgIYIAMgAzYCKCADIANBBGo2AiAgA0EIaiACE - HAAC2wBAX8jAEEwayIDJAAgAyABNgIEIAMgADYCACADQRxqQQI2AgAgA0EsakECNgIAIANCAjcCDCADQbCqwAA2AgggA0 - ECNgIkIAMgA0EgajYCGCADIANBBGo2AiggAyADNgIgIANBCGogAhBwAAtlAQJ/IAAgACgCACICQQhqIgM2AgAgACACQQN - 2QTxxakEoaiICIAFB/wFxIAIoAgBBCHRyNgIAAkACQCADRQRAIABBADYCACAAIAAoAgRBAWo2AgQMAQsgA0H/A3ENAQsg - ABARCwtnAQF/IwBBgAJrIgMkACAAECogACABEJABIABBgAFqIgEgAhCQASAAQYACahCwASAAEKgBIAMgABAmIANBgAFqI - AEQXiADQYABahAyIANBgAFqIAMQe0UEQCAAEJgBCyADQYACaiQAC18BAn8jAEGAAWsiASQAIAAQqAEgASAAEIUBIAFBQG - sgAEFAayICEIUBIAEQAyABQUBrEAMgASABQUBrEHggAUEAEDQgACABEEggARBBIAEQRCACIAEQSCABQYABaiQAC10BAn8 - jAEFAaiIBJAAgAUEIakGgp8AAEF8gAUEIaiAAKAI4QX9qEDkiAhAtIAAgAUEIahBjIABBASACQQFqQR9xdCICNgI4IAJB - gICAEE4EQCAAEBILIAFBQGskAAtfAgF/AX4jAEHwAGsiASQAIAFBoKfAABBfIAApAwAhAiABQThqIAAQXyAAQQEQOyABQ - ThqIAEQYSABQThqEEQgAUE4akEBEDsgACABQThqIAJCAoGnEE8gAUHwAGokAAt7AQJ/IABBKGohAgNAIAFBgAJGBEAgAE - LnzKfQ1tDrs7t/NwIIIABCADcCACAAQSBqQquzj/yRo7Pw2wA3AgAgAEEYakL/pLmIxZHagpt/NwIAIABBEGpC8ua746O - n/aelfzcCAAUgASACakEANgIAIAFBBGohAQwBCwsLaQICfwF+IAAgACkDACIDQv//////////A4M3AwBBCCEBA0AgA0I6 - hyEDIAFBMEYEQCAAIAApAzAgA3w3AzAFIAAgAWoiAiACKQMAIAN8IgNC//////////8DgzcDACABQQhqIQEMAQsLC2oCA - n8BfiAAIAApAwAiA0L//////////wODNwMAQQghAQNAIANCOochAyABQegARgRAIAAgACkDaCADfDcDaAUgACABaiICIA - IpAwAgA3wiA0L//////////wODNwMAIAFBCGohAQwBCwsLWQEBfyMAQYADayIEJAAgBCADEF4gBBBAIARBgAFqIAEQXiA - EQYACaiACEF4gBEGAAWogBBAPIARBgAJqIAQQDyAAIARBgAFqIARBgAJqEJEBIARBgANqJAALWQECfyMAQUBqIgEkAAJA - IAAQhAENACABQQEQigEgAEGAAWoiAiABEFkNACACQQAQNCAAIAIQSCAAEBIgAEFAayIAIAIQSCAAEBIgAiABEKUBCyABQ - UBrJAALVwEBfyMAQbABayICJAAgATQCOCAANAI4fkKAgIAQWQRAIAAQEgsgAkEIaiAAIAEQCCACQfgAaiACQQhqEAUgAC - ACQfgAahBrIABBAjYCOCACQbABaiQAC08BAn8jAEFAaiIDJAAgAEE4EHIiAEEBNgI4IABBQGtBOBByIABB+ABqQQE2AgA - gAyABEIsBIAAgAxClASADIAIQiwEgAxClASADQUBrJAALWQECfyMAQYABayIBJAACQCAAEIgBDQAgARBQIABBgAJqIgIg - ARB7DQAgAhBAIAAgAhAPIAAQqwEgAEGAAWoiACACEA8gABCrASACIAEQkAELIAFBgAFqJAALSwEBfyMAQUBqIgEkACAAQ - TgQciIAQQE2AjggAUEBEIoBIABBQGsgAUHAABBnGiAAQYABakE4EHIaIABBuAFqQQE2AgAgAUFAayQAC0sBAn8jAEHwAG - siASQAIAAQd0UEQCABQaCnwAAQXyABQThqIAAQgwEgASABQThqEGIgARBEIAFBOGogARA1IQILIAFB8ABqJAAgAgtPAQF - /IwBBgAFrIgIkACAAIAEQhQEgABADIAJByABqQdikwAAQXyACQQhqIAJByABqEIsBIAAgARBIIAAgAkEIahB4IAAQEiAC - QYABaiQAC0kBAn8DQCABQThGRQRAIAAgAWoiAiACKQMAQgGGNwMAIAFBCGohAQwBCwsgACAAKAI4QQF0IgE2AjggAUGAg - IAQTgRAIAAQEgsLQgIBfwJ+QQAgAmusIQQDQCADQThHBEAgACADaiICIAIpAwAiBSABIANqKQMAhSAEgyAFhTcDACADQQ - hqIQMMAQsLC0YBAn8jAEFAaiIBJAAgAEE4EHIiAEEBNgI4IABBQGtBOBByIABB+ABqQQE2AgAgAUEBEIoBIAAgARClARC - yASABQUBrJAALTgEBfyMAQYAEayIBJAAgABAvIAEQLyABQYACahAvIABBgAJqIAFBgAIQZxogAEGABGogAUGAAmpBgAIQ - ZxogAEEANgKABiABQYAEaiQAC0sBAX8jAEFAaiICJAACQCAAKAI4IAFsQYCAgBBOBEAgAiABEIoBIAAgAhBIDAELIAAgA - RAoGiAAIAAoAjggAWw2AjgLIAJBQGskAAtKAAJ/IAFBgIDEAEcEQEEBIAAoAhggASAAQRxqKAIAKAIQEQMADQEaCyACRQ - RAQQAPCyAAKAIYIAJBACAAQRxqKAIAKAIMEQUACwtCAQF/IwBBQGoiAiQAIAJBCGpBgIDAABBfIAEgAkEIahBrIAEQRCA - AIAEQayAAQQMQKBogABBEIAAQKSACQUBrJAALSQECfyMAQcABayIBJAAgASAAEF4gAUGAAWogABCFASAAIABBQGsiAhCl - ASAAEEEgAiABQYABahClASAAIAEQlQEgAUHAAWokAAtIAQF/IwBB4AFrIgEkACABQeihwAAQXyABQThqIAAgARAIIAFBq - AFqIAFBOGoQBSAAIAFBqAFqEGsgAEECNgI4IAFB4AFqJAALPgEBfyABQTpuIQIgAUGVA00EQCAAIAJBA3RqKQMAQgEgAU - H//wNxQTpwrYaDQgBVDwsgAkEHQdSdwAAQPAALQAIBfwF+IwBBgAFrIgEkACABQQhqIAAQhQEgAUEIahASIAFByABqIAF - BCGoQgwEgASkDSCABQYABaiQAQgKBpws8AQF/IwBBgAFrIgIkACACIAAQhQEgAkFAayABEIUBIAIQEiACQUBrEBIgAiAC - QUBrEDUgAkGAAWokAEULPAIBfwF+A38gAUE4RgR/IAJCf3xCgICAgICAgIAEg0I6iKcFIAAgAWopAwAgAoQhAiABQQhqI - QEMAQsLC0cBAX8jAEEgayIDJAAgA0EUakEANgIAIANB9KrAADYCECADQgE3AgQgAyABNgIcIAMgADYCGCADIANBGGo2Ag - AgAyACEHAACzkBAX8jAEFAaiICJAAgAiAAEIUBIAIQByABBEAgASACEKUBCyACEAMgAiAAEEggAhAsIAJBQGskAAs6AQF - /IABBOBByIQADQCACQTBGRQRAIABBCBAtIAAgACkDACABIAJqMQAAfDcDACACQQFqIQIMAQsLCzQBAX8gAEE4EHIiAEEB - NgI4IABBQGtBOBByIABB+ABqQQE2AgAgACABEKUBIAFBQGsQpQELMAEBfyAAQTgQciEAA0AgAkE4RwRAIAAgAmogASACa - ikDADcDACACQQhqIQIMAQsLCz8BAX8jAEGAAmsiASQAIAAQUSABEG4gACABEJIBIABBgAJqEK0BIABBgARqEK0BIABBAT - YCgAYgAUGAAmokAAswAQJ/A0AgAkE4RwRAIAAgAmoiAyADKQMAIAEgAmopAwB8NwMAIAJBCGohAgwBCwsLMAECfwNAIAJ - BOEcEQCAAIAJqIgMgAykDACABIAJqKQMAfTcDACACQQhqIQIMAQsLCzABAn8DQCACQThHBEAgACACaiIDIAEgAmopAwAg - AykDAH03AwAgAkEIaiECDAELCwsxAQJ/A0AgAkHwAEcEQCAAIAJqIgMgAykDACABIAJqKQMAfTcDACACQQhqIQIMAQsLC - zEBAn8DQCACQfAARwRAIAAgAmoiAyADKQMAIAEgAmopAwB8NwMAIAJBCGohAgwBCwsLOQECfyMAQYABayIBJAAgASAAQY - ABaiICEF4gAiAAEJABIAEQVSAAIAEQkAEgABCsASABQYABaiQACzMBAX8gAgRAIAAhAwNAIAMgAS0AADoAACABQQFqIQE - gA0EBaiEDIAJBf2oiAg0ACwsgAAtIAQN/IwBBEGsiASQAIAAoAgwhAyAAKAIIIgJFBEBB9KrAAEErQaCrwAAQWwALIAEg - AzYCCCABIAA2AgQgASACNgIAIAEQcQALMgEBfyAAQgE3AwBBCCEBA0AgAUE4RkUEQCAAIAFqQgA3AwAgAUEIaiEBDAELC - yAAEFYLNwAgABBRIAAgARCSASAAQYACaiABQYACahCSASAAQYAEaiABQYAEahCSASAAIAEoAoAGNgKABgsoAQF/A0AgAk - E4RwRAIAAgAmogASACaikDADcDACACQQhqIQIMAQsLCzMAIAAgARCSASAAQYACaiABQYACahCSASAAQYAEaiABQYAEahC - SASAAIAEoAoAGNgKABgsoACAAIAEgAhB5IABBQGsgAUFAayACEHkgAEGAAWogAUGAAWogAhB5Cy4BAX8jAEGAAWsiASQA - IAAQLyABEFAgACABEJABIABBgAFqEKkBIAFBgAFqJAALLQAgACABIAIQjwEgAEGAAWogAUGAAWogAhCPASAAQYACaiABQ - YACaiACEI8BCzQBAX8jAEEQayICJAAgAiABNgIMIAIgADYCCCACQaSowAA2AgQgAkH0qsAANgIAIAIQaAALPgEBfyMAQR - BrIgEkACABQQhqIABBCGooAgA2AgAgASAAKQIANwMAIAEoAgAiAEEUaigCABogACgCBBoQMwALKQEBfyABBEAgACECA0A - gAkEAOgAAIAJBAWohAiABQX9qIgENAAsLIAALKwEBfyMAQcABayICJAAgAhBLIAIgARB/IAIQpgEgACACEAwgAkHAAWok - AAsiAQF/A0AgAUE4RwRAIAAgAWpCADcDACABQQhqIQEMAQsLCycBAX8jAEFAaiICJAAgAkEIaiABEF0gACACQQhqEIsBI - AJBQGskAAsrACAAEFEgACABEJIBIABBgAJqIAIQkgEgAEGABGogAxCSASAAQQU2AoAGCyMBAX8jAEFAaiIBJAAgASAAEI - UBIAEQEiABEFogAUFAayQACykAIAAgARBhIAAgACgCOCABKAI4aiIBNgI4IAFBgICAEE4EQCAAEBILCyUAIAAgASACEE8 - gAEEAIAJrIAAoAjgiACABKAI4c3EgAHM2AjgLIwADQCACBEAgACABLQAAED4gAkF/aiECIAFBAWohAQwBCwsLIgACQCAA - IAEQWUUNACAAQUBrIAFBQGsQWUUNAEEBDwtBAAskAAJAIABBfE0EQCAARQRAQQQhAAwCCyAAEAEiAA0BCwALIAALJwEBf - yMAQYABayICJAAgAiABEF4gAhA6IAAgAhCVASACQYABaiQACycAIAAgARCQASAAQYABaiABQYABahCQASAAQYACaiABQY - ACahCQAQslACAAIAEQpQEgAEFAayABQUBrEKUBIABBgAFqIAFBgAFqEKUBCyUBAX8jAEFAaiICJAAgAiABEIUBIAIQQSA - AIAIQeCACQUBrJAALKAEBfyMAQYACayICJAAgAiABEI4BIAIQKyAAIAIQlgEgAkGAAmokAAsjAEGEAiACSQRAIAJBhAIg - AxA9AAsgACACNgIEIAAgATYCAAsiAQF/IwBB8ABrIgIkACACIAEQMCAAIAIQBSACQfAAaiQACxwAAkAgABB3RQ0AIABBg - AFqEHdFDQBBAQ8LQQALHwAgAEE4EHIiAEEBNgI4IAAgARBrIAAgASgCODYCOAseAAJAIAAQhwFFDQAgAEGAAWoQhwFFDQ - BBAQ8LQQALGwACQCAAEHdFDQAgAEFAaxB3RQ0AQQEPC0EACx4AAkAgABCHAUUNACAAQYACahCHAUUNAEEBDwtBAAsaAQF - /IAAQWCIBIABBQGsQWCABcyAAEHdxcwsaACAAQTgQciIAQQE2AjggACABEJ0BIAAQVgsZACAAQTgQciIAQQE2AjggACAB - EGsgABBWCxcAIAAQRCAAKAIAQX8gAUEfcXRBf3NxCxoAIAAgARBfIAAgAhAkIAAgAhBjIAAgAhAkCxwAIAAQLyAAIAEQk - AEgAEGAAWogAUGAAWoQkAELGAAgACABIAIQeSAAQUBrIAFBQGsgAhB5CxYAIAAgARClASAAQUBrIAFBQGsQpQELGAAgAB - AvIAAgARCQASAAQYABaiACEJABCxgAIAAgARCQASAAQYABaiABQYABahCQAQsZACAAEK4BIABBgAJqELYBIABBgARqEK4 - BCxcAIAAQsgEgAEFAaxBpIABBgAFqELIBCxQAIAAgARB4IABBQGsgAUFAaxB4CxgAIAAgARCVASAAQYABaiABQYABahCV - AQsYACAAEKYBIABBgAFqIgAQpgEgACABEA8LGQAgABCpASAAQYABahCwASAAQYACahCpAQsZACAAEKwBIABBgAJqEKwBI - ABBgARqEKwBCxkAIAAQqgEgAEGAAmoQqgEgAEGABGoQqgELFgAgABAvIAAgARCQASAAQYABahCpAQsWACAAQYABaiIAEK - gBIAAQOiAAEKgBCxQAIAAQRCAAIAApAwAgAax8NwMACxQAIAAQRCAAIAApAwAgAax9NwMACxEAIAAgARBSIABBQGsgARB - SCxEAIAAgARBIIABBQGsgARBICxQAIAAgARCQASAAQYABaiACEJABCxIAIAAgARAPIABBgAFqIAEQDwsUACAAIAEQoAEg - AEGAAWogARCgAQsRACAAKAIEBEAgACgCABAJCwsSACAAIAEQayAAIAEoAjg2AjgLDwAgAEFAayIAEEEgABBECw0AIAAQT - iAAQUBrEE4LDQAgABBEIABBQGsQRAsPACAAELIBIABBQGsQsgELEAAgABCrASAAQYABahCrAQsNACAAEBIgAEFAaxASCx - AAIAAQqAEgAEGAAWoQqAELEAAgABCpASAAQYABahCpAQsPACAAQYABahA6IAAQrAELEAAgABCnASAAQYABahCnAQsOACA - AEGkgAEFAaxCyAQsQACAAIAI2AgQgACABNgIACw0AIAAQdCAAQQE2AjgLDAAgABBBIAAgARB4CwwAIAAgARBrIAAQVgsN - ACAAEDogACABEJUBCwsAIAAQOiAAEKwBCwwAQunQotvMouq7RgsDAAELAwABCwv+PZoCAEGCgMAACwcBAAAAAQI0AEG4g - MAAC9sBuF8jku11BwFjT+D5WE+pA2dPnKtLeD0Akew9ffXy9AMD1g8fDSwgAK1vjPCZwa4A8DtNkAEAAADzStxtEor3AI - uwH1tTsFYDgvLFYx+X7AAysL/NHtseAkehVLifHyMCQHo6ogw4sQGz4sMPAAAAAHNyYy9ibHMxMjM4MS9wYWlyLnJzqAA - QABQAAAAHAQAACQAAAKgAEAAUAAAADAEAAA0AAACoABAAFAAAABEBAAANAAAAAAAAAAEAAAD///8Dv/+W/78AaQM7VYAd - moCAAefMIPV1pkwBp+1zAEGogsAACyz+//7///8BAosAgILYBPYB4Y1oiW++kwLOdqvfPagdAMZpulHOdt8Dy1nGFwBB4 - ILAAAuRAZABEAATAAAA0AEAABgAAACQARAAEwAAANQBAAARAAAAkAEQABMAAADWAQAAHAAAAHNyYy9ibHMxMjM4MS9lY3 - AucnMAkAEQABMAAAAZBQAADQAAAJABEAATAAAAGwUAAAkAAACQARAAEwAAABwFAAARAAAAkAEQABMAAAAfBQAAHAAAAAA - AAAABAAEAAAABAjQAQaCEwAALuSCQARAAEwAAAGcEAAARAAAAkAEQABMAAABsBAAADQAAAJABEAATAAAAbgQAABUAAACQ - ARAAEwAAAHAEAAAgAAAAHUxYLQgo9ADXXz44aOPbAInJGoj9roEBomOjmrkPTgGY6rCCSW3JAoBOWs9QOu4AimlEAQAAA - ADgKxeO6UjMAXSpOluMVsgAolXvNe/8FADngsIBPcnDA8EWIDvuPnUAusRiAAwgWgDRCCkuAQAAALgh6L1iEMUA3/4Vlz - tIpQGLCDH8A9S9AbsR/Cc0UtIDHfAS2hvXowEqPc423S/bAshidB8AAAAAKdKiiy66yAHqR06TLeDGAiSMtsYkvPEDAo/ - w3iCL+AGd1zE97u2BA4ilRy+cg4kDSMIIbgAAAAB7+wUWP99nAjJ7Fwrjx90CaW+GFDsANgMrVFv+4Zl3A8x9+g1bVtIB - Aju2nPiBcwIH2iEDAQAAAJ4MOb5nECQDX97JALfLQgIx+rexS69LAYydZXIx6AACyy7dIo8TXQHUDYML8enzAuH4sWkBA - AAAF+OXhGqYcQFbpdOtpXylAPrkHV2MkmwBFovSVX2eswF1O8QNmb5jAc0s5B7x42kCH8/TgAAAAACOyPDjGFbLAOdrHT - 0yPvIBmzNTJw/vYgALmsY2bZ2sAuVtNVN+EdEAIQ4duvj2agBw54F7AQAAAITtOaEl8tcBt7JLQTBKlADaqLKGnI8hAiN - AhjM+PJkAhhWxv1LmigOwyY1aShP5A1Nl7dYAAAAAgyllb8bBEwFzRs+5ckvDAQgK+Wh+CbkCTntu5kll9wGxPNu1Sqf3 - AwZIdMD/xFwDUDIMYwEAAADZlYis6UwVARTxnQfMG4oChYnB+oJZtgK7IfzsX0loAZnbmVSOEeQDLK2Q2RB9ZgCjJpfpA - AAAAGFomx1kiLMB8WQcxDiXuAEzNQgzG58oA8zGl/w2qpUB5PXXElTlBwN0goHTbRvzA2ZxjncBAAAAsNyerJ2fFwD4p1 - yCSo8PA1jJJY7GHlAC46GVD2alzAEkA84bmgrRATESRAc7nl0C2wVA1QAAAAC7g8uz8e40ALrVMMa8qTwCg7SGHg3HMwK - X1V8Qqr1sAecXfByoRyECrC5iwcvqUAI+7ZRyAQAAALdJRnNiFqwCq1uLuXy1MABhhSxO22y1A4nJfwFciyICPjBrhRWY - 2QEHRAIu0MygA7HyBRoBAAAACt3saNGEYwELQBne0pLTATFZwTGPlzMBfdvdQN9bugO0gvaAZqWzAo9b2xG1SnoCqxP8l - QAAAABB1qF5Oux2AxHckO6qpJkAOFCDmPNn2gBA0K3ZhMV1AI1/4Myjx68Bz4Kkl+BTaQNqzw6hAAAAAF5azL2b2fcBxL - R4RCdSbgH6gMUimN8cAltmoKIpbwgDY39umQHPdABs/SyMLCpZA6nCekoBAAAAOkrobkl0JQA7G3jD49TsAKfO6e0qBnM - AuDglhk69ZgJXD1chZ1ngAxiDz0OGTVoAz6osdwAAAAClBGOfovktAHDEowjxkjQAQPeCiUvyzgMOKTS1cjqnAzVXOenG - BgUD30NOVe6ZOQGOXzXnAAAAAB6iMjVbOZ0DVAdezQfqpgC9qW0wO4NOAK017oqBhGYBx9//faDnQwNXx5sCKkWKACAWj - joBAAAA2CzGjZPoDQMEcT27D0m1AZcE/dYovIoCMlNFlcVa/AAkCFtU60B8A/urDrK/uGIBGlglNAAAAAAZPrhcujnCAD - +3PyWfJfQAas3qrBEL4ACZ8kczxmm9AUGJbx+Z8r8BivlNoJfI6AHlL5ayAAAAAP87K8huJ8gBeboJLBshqgI9cfWLxIg - lAJsEMADCMygD6EFwNjblmAJEHC3SEGfVAt6lYSUBAAAAHBvSQPr5PAEmfg+Nb6A1AlUrxor8F4YAVnLqIm2NLgHv1QFv - +tNLA4u5LIZrxj8DSNWojAAAAAAEtshpvla0AMEdB7C/n0ABZisb8FqpTwG3XuVoWRI+Ah0Yy7Uu30IDzkKpk/PAQwLp5 - GteAQAAAEsidVRxHmsC4e1rXtkmQQC6Rs6nltP1AKxmo5WhXwcCPWde/KPESAN9VqhAxDORA0WWElwAAAAAMwGY2/XT2Q - IQmcoIRyvkA2zMWQbE0zICmU8AVjA1IAA7e3XcFeN7AisAv9ymskcDSjlaJAAAAAD4HpcL8ARMAYN8hGRkcBQCbPAzRnu - ADgGcADvCmtCoALGnekQ/9QQAWEJVdObkBgDByoKxAAAAAI5NB9CkyAcCs4E10QZ9cwKdJEP2EfnnA6+5GAnDq+ICWTVS - zO3S/gNQMEaut73NAwipRosBAAAAMsER0BpxEwA6v+6PM5fOAxsDYZ44FuQDYET/JL2yLQPLL82T+0MdA+NCf4NvNN8Ae - eQTlwEAAAAwHHPK66qvA8qbrlN3FdwDs7lDTR7t5wFhGvjba0WeAgwqxCNKoa0Dea+OSG2vYQChp7vhAAAAAIel23tXDj - cA2OiB4XGAlAGd5qsM8qHmAi16sAl3nlkAvTqPu6FNHgKIJyP6EpplA4sBxJ8AAAAAKftwGKNMXgFoTfq3P1SRAS9kQsg - mbNoADvR/YPeO/wIFChd0xqYsAa9Jpvcbrs4AU418mAAAAADy1ulfhfhhAbJX0IORsB4CenTzNNbEEwDFSC0Thq8oA7hb - 5zxreScA9F2yLO8G6wO8ubBKAAAAAPClMzaxOrIBphygVrLJ2AMD4kRVrdPDAUHZ9d62vlID0Kd0oKbwuAFHeISI2tIYA - KT8A2YBAAAA2/7o8uzatgEQKhBkAjf+Ae7CrVETIv0DDObhQjmP7wM2VRnEKRWiAvjTK9fEP/gD3j/AjAAAAADL9OWwd1 - w1Ail7h7GnrhYA5J3PUTLAPgKSJ3DkrTvkAqcq1FdndNgCRh0mXggHJgJuN4YfAAAAAPbhLcdA4t8A7kgBLIqFVAMmfdo - AFLnkAxINi3OMYlkD4lIllEk7agAy4Si9mZulArqGxwwAAAAAlsZBLlrnlwD4L+qLZcRZAWxN03q2PjQCQT704DyVsAHp - IxKDRvt2A7UNRHUEljsBEGqZNAEAAAAzuweXcUWYAq/w6M6mux4D0Dw9VFbJ9gJKrUiloSI5AhOtEfrcgEkBwkdnCbiT6 - AKBfNmQAAAAAI9LYx06RxUAEeAlTTxcvQDKBaLKVmPNAzvJTOHOiZcBD8RxwRl4DQJXCcmaD3C3AYEd+uAAAAAA9wbtJh - Pc+gE0IDPFYe9FASDkgCSUJ98A0i0Hn6ScUwJbVr/yds1TAUP3otjOk8sCDkBgJgAAAADMRTNXOLGZAkewQu742AEAMGm - 42QCa7wJz9ZkIfCtmA0YzVJYUX7QAUUzY8PifHQMUlWutAAAAAJIQVuIptYQCpfqu3xsmWgJvURN56oyoAT4wSgs5vysC - /5R/RwzFSAIHS2H9z0AHAnS2y6wAAAAAqGqPupy0+AAAgcHg06dwARqHXGpjbrMBZDmkmIbt5gDQbZwdkdIaACgEPFJvA - akDniUvTQAAAABVP5G4i/RuAI3XbEr1qBcCc7xPfernkgEhTO0e9oSPAfcWMpCEStkDZYGgOoebwgHaXKVnAQAAAEpdU1 - WdPSMD2iCS5O69+AMshbQ5v8RQAxWvgmS9GpMDDPv5xEzX0QNT+YbGSBjbANOObIYBAAAA2S6BFVpB7gAYuXcAAmw9AJI - rE1djIP0AzfpfP33oewE3pOVu/6a7An4374D6qY8Di/A+agEAAABcd2oSmRMaAU/ux2JpAKcCXx0FoADEWwJNd73jMzTq - A/3sXkuC6awAzaHu8Mt2pgIIfABmAQAAAKy3+ap/R8YCgDhz6ndu4wCfRKb18LaHAbMXB2JDVRkDUgG3gjF4rAK6mexny - 7ZhAJdSno0AAAAAHQClESMUOQJ2e7v0A3fFAiBqkeyd/KABu1DB7qY9fAKc0cbcjSL4AkQyAyz50BcBlQcOvgAAAAAWVF - 9EmG3SAGrrpaCwPNkAJxf0anKeSAL2SDhM83ZvA8UV0dG07YkD70iDfOWUYwKHKH1rAQAAAPJnvz21OCUCR+Jbvo01XwF - nyi7NedJdAtYwxPy5RlUBhcR4V7GObgGfq+rbiTaQAQYz31gAAAAAPaBJLiwQ9gJMjafU2IEJAYr3AT5FbzUAhJJyVhPH - 3ANPyIW4SMNDAFsvg4YHSOAAwnUtlgEAAADBYzawU5JHAUAbCIO9I9oAf6Dncr61MgIMu5svYOKVA20aYOnq0PoAUASGl - CwmpwLDxBJhAQAAAHNyYy9ibHMxMjM4MS9iaWcucnMAoA4QABMAAADMAQAALQAAAKAOEAATAAAAzAEAADUAAACgDhAAEw - AAABkCAAANAAAAoA4QABMAAAA4AwAAGAAAAKAOEAATAAAAOAMAACEAAACgDhAAEwAAAEIDAAAhAAAAoA4QABMAAABbAwA - AFwAAAKAOEAATAAAAZAMAABcAAACgDhAAEwAAAHIDAAAwAAAAoA4QABMAAAB7AwAAMAAAAKAOEAATAAAApwMAABgAAACg - DhAAEwAAALUDAAAYAAAAmC+KQpFEN3HP+8C1pdu16VvCVjnxEfFZpII/ktVeHKuYqgfYAVuDEr6FMSTDfQxVdF2+cv6x3 - oCnBtybdPGbwcFpm+SGR77vxp3BD8yhDCRvLOktqoR0StypsFzaiPl2UlE+mG3GMajIJwOwx39Zv/ML4MZHkafVUWPKBm - cpKRSFCrcnOCEbLvxtLE0TDThTVHMKZbsKanYuycKBhSxykqHov6JLZhqocItLwqNRbMcZ6JLRJAaZ1oU1DvRwoGoQFsG - kGQhsNx5Md0gntbywNLMMHDlKqthOT8qcW/NvLmjugo90b2OleBR4yIQIAseM+v++kOtsUKT3o/m+8nhxxkJMU19TSUdf - QkxTMTIzODFHMV9YTUQ6U0hBLTI1Nl9TU1dVX1JPX05VTF8A0BAQABMAAAA/AAAALgAAANAQEAATAAAAPQAAABUAAADQE - BAAEwAAAD0AAAANAAAAc3JjL2JsczEyMzgxL2Jscy5ycwAAAAAArve+1aE5BgLok91iZEwkAdIsbk61CS0C2+VwMbbEEQ - GZYzb76G2KA7ycH+3PFk8AK2qmngEAAABhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvAAAAbxEQABIAAAB8AQAAFAAAAAA - AAABhdHRlbXB0IHRvIGRpdmlkZSB3aXRoIG92ZXJmbG93c3JjL2JsczEyMzgxL2ZwLnJzAAAAbxEQABIAAAASAgAADQAA - AG8REAASAAAAHgIAACYAAABvERAAEgAAAB4CAAAjAAAAbxEQABIAAAAkAgAAFwAAAG8REAASAAAAJAIAABQAAAAAAAAAq - qr//////gHu//9UrP//AupBYg9rDyoBw5z9ShTOEwJLd2TXrEtDAu3pxpKm+V8Cox4RoAEAAABAEhAAFAAAABUBAAATAA - AAQBIQABQAAAAeAQAAGAAAAEASEAAUAAAAJAEAABwAAABzcmMvYmxzMTIzODEvZWNwMi5ycwAAAAAEAEGQpcAAC7wGQBI - QABQAAADmAgAACQAAAEASEAAUAAAA7gIAAA0AAABAEhAAFAAAAP4CAAAhAAAAuL0hwchWgAD1+24BqskAA7pwFz2uR7YA - RNEK7ADpUwN65MZREMUtA0kBgkmkwiMALyuqJAAAAAB+KwRdBX2sAflVF+WERDwDNJME9ce9GwJp12rYgmRCA9BrWWVPJ - 4gA6DRrH9hnnAAFtgI+AQAAAAEouAiGVJMBeKIo6w5zsgIjyRINFpWmAQq1nU73MqoCm/2tGjUu2gJxczJjhFufAHdSXc - 4AAAAAvnlf8F8HqQJqaAc710nDAfOzmulytSoB0pm8jp0W+gEoPsuZi8IrAKw0qwwzzakDAkpsYAAAAACrqv/////+Ae7 - //1Ss//8C6kFiD2sPKgHDnP1KFM4TAkt3ZNesS0MC7enGkqb5XwKjHhGgAQAAAAgUEAALAAAAjwEAAA8AAAAIFBAACwAA - AKcBAAATAAAACBQQAAsAAACqAQAADQAAAHNyYy9obWFjLnJzADQUEAAgAAAAVBQQABIAAAADAAAAAAAAAAEAAAAEAAAAa - W5kZXggb3V0IG9mIGJvdW5kczogdGhlIGxlbiBpcyAgYnV0IHRoZSBpbmRleCBpcyAwMDAxMDIwMzA0MDUwNjA3MDgwOT - EwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ - 0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5 - ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OQAAQBUQABAAAABQFRAAIgAAAHJhbmdlIGVuZCBpb - mRleCAgb3V0IG9mIHJhbmdlIGZvciBzbGljZSBvZiBsZW5ndGggAABjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIG - EgYE5vbmVgIHZhbHVlALAVEAAcAAAA7gEAAB4AAABsaWJyYXJ5L3N0ZC9zcmMvcGFuaWNraW5nLnJzAEGIrMAACwEBAEH - IrMAACwEBAEGIrcAACwEBAEHIrcAACwEBAEGIrsAACwEBAEHIrsAACwEBAEGIr8AACwEBAEHIr8AACwEBAEGIsMAACwEB - AEHIsMAACwEBAEGIscAACwEBAEHIscAACwEBAEGIssAACwEBAEHIssAACwEBAEGIs8AACwEBAEHIs8AACwEBAEGItMAAC - wEBAEHItMAACwEBAEGItcAACwEBAEHItcAACwEBAEGItsAACwEBAEHItsAACwEBAEGIt8AACwEBAEHIt8AACwEBAEGIuM - AACwEBAEHIuMAACwEBAEGIucAACwEBAEHIucAACwEBAEGIusAACwEBAEHIusAACwEBAEGIu8AACwEBAEHIu8AACwEBAEG - IvMAACwEBAEHIvMAACwEBAEGIvcAACwEBAEHIvcAACwEBAEGIvsAACwEBAEHIvsAACwEBAEGIv8AACwEBAEHIv8AACwEB - AEGIwMAACwEBAEHIwMAACwEBAEGIwcAACwEBAEHIwcAACwEBAEGIwsAACwEBAEHIwsAACwEBAEGIw8AACwEBAEHIw8AAC - wEBAEGIxMAACwEBAEHIxMAACwEBAEGIxcAACwEBAEHIxcAACwEBAEGIxsAACwEBAEHIxsAACwEBAEGIx8AACwEBAEHIx8 - AACwEBAEGIyMAACwEBAEHIyMAACwEBAEGIycAACwEBAEHIycAACwEBAEGIysAACwEBAEHIysAACwEBAEGIy8AACwEBAEH - Iy8AACwEBAEGIzMAACwEBAEHIzMAACwEBAEGIzcAACwEBAEHIzcAACwEBAEGIzsAACwEBAEHIzsAACwEBAEGIz8AACwEB - AEHIz8AACwEBAEGI0MAACwEBAEHI0MAACwEBAEGI0cAACwEBAEHI0cAACwEBAEGI0sAACwEBAEHI0sAACwEBAEGI08AAC - wEBAEHI08AACwEBAEGI1MAACwEBAEHI1MAACwEBAEGI1cAACwEBAEHI1cAACwEBAEGI1sAACwEBAEHI1sAACwEBAEGI18 - AACwEBAEHI18AACwEBAEGI2MAACwEBAEHI2MAACwEBAEGI2cAACwEBAEHI2cAACwEBAEGI2sAACwEBAEHI2sAACwEBAEG - I28AACwEBAEHI28AACwEBAEGI3MAACwEBAEHI3MAACwEBAEGI3cAACwEBAEHI3cAACwEBAEGI3sAACwEBAEHI3sAACwEB - AEGI38AACwEBAEHI38AACwEBAEGI4MAACwEBAEHI4MAACwEBAEGI4cAACwEBAEHI4cAACwEBAEGI4sAACwEBAEHI4sAAC - wEBAEGI48AACwEBAEHI48AACwEBAEGI5MAACwEBAEHI5MAACwEBAEGI5cAACwEBAEHI5cAACwEBAEGI5sAACwEBAEHI5s - AACwEBAEGI58AACwEBAEHI58AACwEBAEGI6MAACwEBAEHI6MAACwEBAEGI6cAACwEBAEHI6cAACwEBAEGI6sAACwEBAEH - I6sAACwEBAEGI68AACwEBAEHI68AACwEBAEGI7MAACwEBAEHI7MAACwEBAEGI7cAACwEBAEHI7cAACwEBAEGI7sAACwEB - AEHI7sAACwEBAEGI78AACwEBAEHI78AACwEBAEGI8MAACwEBAEHI8MAACwEBAEGI8cAACwEBAEHI8cAACwEBAEGI8sAAC - wEBAEHI8sAACwEBAEGI88AACwEBAEHI88AACwEBAEGI9MAACwEBAEHI9MAACwEBAEGI9cAACwEBAEHI9cAACwEBAEGI9s - AACwEBAEHI9sAACwEBAEGI98AACwEBAEHI98AACwEBAEGI+MAACwEBAEHI+MAACwEBAEGI+cAACwEBAEHI+cAACwEBAEG - I+sAACwEBAEHI+sAACwEBAEGI+8AACwEBAEHI+8AACwEBAEGI/MAACwEBAEHI/MAACwEBAEGI/cAACwEBAEHI/cAACwEB - AEGI/sAACwEBAEHI/sAACwEBAEGI/8AACwEBAEHI/8AACwEBAEGIgMEACwEBAEHIgMEACwEBAEGIgcEACwEBAEHIgcEAC - wEBAEGIgsEACwEBAEHIgsEACwEBAEGIg8EACwEBAEHIg8EACwEBAEGIhMEACwEBAEHIhMEACwEBAEGIhcEACwEBAEHIhc - EACwEBAEGIhsEACwEBAEHIhsEACwEBAEGIh8EACwEBAEHIh8EACwEBAEGIiMEACwEBAEHIiMEACwEBAEGIicEACwEBAEH - IicEACwEBAEGIisEACwEBAEHIisEACwEBAEGIi8EACwEBAEHIi8EACwEBAEGIjMEACwEBAEHIjMEACwEBAEGIjcEACwEB - AEHIjcEACwEBAEGIjsEACwEBAEHIjsEACwEBAEGIj8EACwEBAEHIj8EACwEBAEGIkMEACwEBAEHIkMEACwEBAEGIkcEAC - wEBAEHIkcEACwEBAEGIksEACwEBAEHIksEACwEBAEGIk8EACwEBAEHIk8EACwEBAEGIlMEACwEBAEHIlMEACwEBAEGIlc - EACwEBAEHIlcEACwEBAEGIlsEACwEBAEHIlsEACwEBAEGIl8EACwEBAEHIl8EACwEBAEGImMEACwEBAEHImMEACwEBAEG - ImcEACwEBAEHImcEACwEBAEGImsEACwEBAEHImsEACwEBAEGIm8EACwEBAEHIm8EACwEBAEGInMEACwEBAEHInMEACwEB - AEGIncEACwEBAEHIncEACwEBAEGInsEACwEBAEHInsEACwEBAEGIn8EACwEBAEHIn8EACwEBAEGIoMEACwEBAEHIoMEAC - wEBAEGIocEACwEBAEHIocEACwEBAEGIosEACwEBAEHIosEACwEBAEGIo8EACwEBAEHIo8EACwEBAEGIpMEACwEBAEHIpM - EACwEBAEGIpcEACwEBAEHIpcEACwEBAEGIpsEACwEBAEHIpsEACwEBAEGIp8EACwEBAEHIp8EACwEBAEGIqMEACwEBAEH - IqMEACwEBAEGIqcEACwEBAEHIqcEACwEBAEGIqsEACwEBAEHIqsEACwEBAEGIq8EACwEBAEHIq8EACwEBAEGIrMEACwEB - AEHIrMEACwEBAEGIrcEACwEBAEHIrcEACwEBAEGIrsEACwEBAEHIrsEACwEBAEGIr8EACwEBAEHIr8EACwEBAEGIsMEAC - wEBAEHIsMEACwEBAEGIscEACwEBAEHIscEACwEBAEGIssEACwEBAEHIssEACwEBAEGIs8EACwEBAEHIs8EACwEBAEGItM - EACwEBAEHItMEACwEBAEGItcEACwEBAEHItcEACwEBAHsJcHJvZHVjZXJzAghsYW5ndWFnZQEEUnVzdAAMcHJvY2Vzc2V - kLWJ5AwVydXN0Yx0xLjQ5LjAgKGUxODg0YThlMyAyMDIwLTEyLTI5KQZ3YWxydXMGMC4xOC4wDHdhc20tYmluZGdlbhIw - LjIuNzAgKGI2MzU1YzI3MCk= -''' - .replaceAll(RegExp(r'\n+'), '') - .replaceAll(RegExp(r'\s+'), '') - .trim() - .replaceAll('r[^0-9a-zA-Z/+]', ''); - -final _moduleBytes = base64Decode(_wasmBytesBase64); - -typedef BLSVerifyFunc = int Function(int, int, int, int, int, int); - -class WebBls implements BaseBLS { - WebBls(); - - Instance? instance; - Uint8List? cacheGetUint8Memory0; - late bool _isInit; - - Future initInstance() async { - instance = await Instance.fromBytesAsync(_moduleBytes); - } - - @override - Future blsInit() async { - final blsInitFunc = instance!.functions['bls_init']! as int Function(); - return _isInit = blsInitFunc() == 0 ? true : false; - } - - @override - Future blsVerify(Uint8List pk, Uint8List sig, Uint8List msg) async { - await initInstance(); - if (!await blsInit()) { - throw StateError('cannot initialize BLS on Web.'); - } - final blsVerifyFunc = instance!.functions['bls_verify']! as int Function( - int, - int, - int, - int, - int, - int, - ); - - final set0 = passArray8ToWasm0(sig, _malloc); - final set1 = passArray8ToWasm0(msg, _malloc); - final set2 = passArray8ToWasm0(pk, _malloc); - - return blsVerifyFunc( - set0.first, - set0.last, - set1.first, - set1.last, - set2.first, - set2.last, - ) == - 0; - } - - Uint8List get memory => - instance!.memories['memory']!.jsObject.buffer.asUint8List(); - - int _malloc(int a) { - final mal = instance!.functions['__wbindgen_malloc']! as int Function(int); - return mal(a); - } - - Uint8List getUint8Memory0() { - if (cacheGetUint8Memory0 == null || !u8aEq(cacheGetUint8Memory0!, memory)) { - cacheGetUint8Memory0 = memory; - } - return cacheGetUint8Memory0!; - } - - List passArray8ToWasm0(Uint8List arg, int Function(int) malloc) { - final ptr = malloc(arg.length * 1); - getUint8Memory0().setAll(ptr ~/ 1, arg); - return [ptr, arg.length]; - } - - @override - bool get isInit => _isInit; -} - -BaseBLS createBLS() => WebBls(); diff --git a/lib/bridge/ffi/ffi.dart b/lib/bridge/ffi/ffi.dart deleted file mode 100644 index 45c02bf4..00000000 --- a/lib/bridge/ffi/ffi.dart +++ /dev/null @@ -1,2 +0,0 @@ -export 'ffi_bridge.dart'; -export 'ffi_helper.dart'; diff --git a/lib/bridge/ffi/ffi_bridge.dart b/lib/bridge/ffi/ffi_bridge.dart deleted file mode 100644 index d290cb71..00000000 --- a/lib/bridge/ffi/ffi_bridge.dart +++ /dev/null @@ -1,2824 +0,0 @@ -// AUTO GENERATED FILE, DO NOT EDIT. -// Generated by `flutter_rust_bridge`@ 1.82.6. -// ignore_for_file: non_constant_identifier_names, unused_element, duplicate_ignore, directives_ordering, curly_braces_in_flow_control_structures, unnecessary_lambdas, slash_for_doc_comments, prefer_const_literals_to_create_immutables, implicit_dynamic_list_literal, duplicate_import, unused_import, unnecessary_import, prefer_single_quotes, prefer_const_constructors, use_super_parameters, always_use_package_imports, annotate_overrides, invalid_use_of_protected_member, constant_identifier_names, invalid_use_of_internal_member, prefer_is_empty, unnecessary_const - -import 'dart:convert'; -import 'dart:async'; -import 'package:meta/meta.dart'; -import 'package:flutter_rust_bridge/flutter_rust_bridge.dart'; -import 'package:uuid/uuid.dart'; - -import 'dart:ffi' as ffi; - -abstract class AgentDart { - /// -------------------- - /// mnemonic - /// -------------------- - /// create_phrase - /// phrase_to_seed - /// seed_to_key - Future mnemonicPhraseToSeed( - {required PhraseToSeedReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kMnemonicPhraseToSeedConstMeta; - - Future mnemonicSeedToKey( - {required SeedToKeyReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kMnemonicSeedToKeyConstMeta; - - /// -------------------- - /// bls - /// -------------------- - /// bls_init - /// bls_verify - Future blsInit({dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kBlsInitConstMeta; - - Future blsVerify({required BLSVerifyReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kBlsVerifyConstMeta; - - /// -------------- - /// ed25519 - /// -------------------- - /// ed25519_from_seed - /// ed25519_sign - /// ed25519_verify - Future ed25519FromSeed( - {required ED25519FromSeedReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kEd25519FromSeedConstMeta; - - Future ed25519Sign({required ED25519SignReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kEd25519SignConstMeta; - - Future ed25519Verify({required ED25519VerifyReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kEd25519VerifyConstMeta; - - /// --------------------- - /// secp256k1 - /// --------------------- - Future secp256K1FromSeed( - {required Secp256k1FromSeedReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kSecp256K1FromSeedConstMeta; - - Future secp256K1Sign( - {required Secp256k1SignWithSeedReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kSecp256K1SignConstMeta; - - Future secp256K1SignRecoverable( - {required Secp256k1SignWithSeedReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kSecp256K1SignRecoverableConstMeta; - - Future secp256K1Verify({required Secp256k1VerifyReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kSecp256K1VerifyConstMeta; - - Future secp256K1GetSharedSecret( - {required Secp256k1ShareSecretReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kSecp256K1GetSharedSecretConstMeta; - - Future secp256K1Recover( - {required Secp256k1RecoverReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kSecp256K1RecoverConstMeta; - - /// --------------------- - /// secp256k1 - /// --------------------- - Future p256FromSeed( - {required P256FromSeedReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kP256FromSeedConstMeta; - - Future p256Sign( - {required P256SignWithSeedReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kP256SignConstMeta; - - Future p256Verify({required P256VerifyReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kP256VerifyConstMeta; - - Future p256GetSharedSecret( - {required P256ShareSecretReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kP256GetSharedSecretConstMeta; - - /// --------------------- - /// schnorr - /// --------------------- - Future schnorrFromSeed( - {required SchnorrFromSeedReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kSchnorrFromSeedConstMeta; - - Future schnorrSign( - {required SchnorrSignWithSeedReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kSchnorrSignConstMeta; - - Future schnorrVerify({required SchnorrVerifyReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kSchnorrVerifyConstMeta; - - /// --------------------- - /// aes - /// --------------------- - Future aes128CtrEncrypt( - {required AesEncryptReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kAes128CtrEncryptConstMeta; - - Future aes128CtrDecrypt( - {required AesDecryptReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kAes128CtrDecryptConstMeta; - - Future aes256CbcEncrypt( - {required AesEncryptReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kAes256CbcEncryptConstMeta; - - Future aes256CbcDecrypt( - {required AesDecryptReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kAes256CbcDecryptConstMeta; - - Future aes256GcmEncrypt( - {required AesEncryptReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kAes256GcmEncryptConstMeta; - - Future aes256GcmDecrypt( - {required AesDecryptReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kAes256GcmDecryptConstMeta; - - Future pbkdf2DeriveKey( - {required PBKDFDeriveReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kPbkdf2DeriveKeyConstMeta; - - Future scryptDeriveKey( - {required ScriptDeriveReq req, dynamic hint}); - - FlutterRustBridgeTaskConstMeta get kScryptDeriveKeyConstMeta; -} - -class AesDecryptReq { - final Uint8List key; - final Uint8List iv; - final Uint8List cipherText; - - const AesDecryptReq({ - required this.key, - required this.iv, - required this.cipherText, - }); -} - -class AesEncryptReq { - final Uint8List key; - final Uint8List iv; - final Uint8List message; - - const AesEncryptReq({ - required this.key, - required this.iv, - required this.message, - }); -} - -class BLSVerifyReq { - final Uint8List signature; - final Uint8List message; - final Uint8List publicKey; - - const BLSVerifyReq({ - required this.signature, - required this.message, - required this.publicKey, - }); -} - -class ED25519FromSeedReq { - final Uint8List seed; - - const ED25519FromSeedReq({ - required this.seed, - }); -} - -class ED25519Res { - final Uint8List seed; - final Uint8List publicKey; - - const ED25519Res({ - required this.seed, - required this.publicKey, - }); -} - -class ED25519SignReq { - final Uint8List seed; - final Uint8List message; - - const ED25519SignReq({ - required this.seed, - required this.message, - }); -} - -class ED25519VerifyReq { - final Uint8List sig; - final Uint8List message; - final Uint8List pubKey; - - const ED25519VerifyReq({ - required this.sig, - required this.message, - required this.pubKey, - }); -} - -class KeyDerivedRes { - final Uint8List leftBits; - final Uint8List rightBits; - - const KeyDerivedRes({ - required this.leftBits, - required this.rightBits, - }); -} - -class P256FromSeedReq { - final Uint8List seed; - - const P256FromSeedReq({ - required this.seed, - }); -} - -class P256IdentityExport { - final Uint8List privateKeyHash; - final Uint8List derEncodedPublicKey; - - const P256IdentityExport({ - required this.privateKeyHash, - required this.derEncodedPublicKey, - }); -} - -class P256ShareSecretReq { - final Uint8List seed; - final Uint8List publicKeyRawBytes; - - const P256ShareSecretReq({ - required this.seed, - required this.publicKeyRawBytes, - }); -} - -class P256SignWithSeedReq { - final Uint8List msg; - final Uint8List seed; - - const P256SignWithSeedReq({ - required this.msg, - required this.seed, - }); -} - -class P256VerifyReq { - final Uint8List messageHash; - final Uint8List signatureBytes; - final Uint8List publicKeyBytes; - - const P256VerifyReq({ - required this.messageHash, - required this.signatureBytes, - required this.publicKeyBytes, - }); -} - -class PBKDFDeriveReq { - final Uint8List password; - final Uint8List salt; - final int c; - - const PBKDFDeriveReq({ - required this.password, - required this.salt, - required this.c, - }); -} - -class PhraseToSeedReq { - final String phrase; - final String password; - - const PhraseToSeedReq({ - required this.phrase, - required this.password, - }); -} - -class SchnorrFromSeedReq { - final Uint8List seed; - - const SchnorrFromSeedReq({ - required this.seed, - }); -} - -class SchnorrIdentityExport { - final Uint8List privateKeyHash; - final Uint8List publicKeyHash; - - const SchnorrIdentityExport({ - required this.privateKeyHash, - required this.publicKeyHash, - }); -} - -class SchnorrSignWithSeedReq { - final Uint8List msg; - final Uint8List seed; - final Uint8List? auxRand; - - const SchnorrSignWithSeedReq({ - required this.msg, - required this.seed, - this.auxRand, - }); -} - -class SchnorrVerifyReq { - final Uint8List messageHash; - final Uint8List signatureBytes; - final Uint8List publicKeyBytes; - - const SchnorrVerifyReq({ - required this.messageHash, - required this.signatureBytes, - required this.publicKeyBytes, - }); -} - -class ScriptDeriveReq { - final Uint8List password; - final Uint8List salt; - final int n; - final int p; - final int r; - - const ScriptDeriveReq({ - required this.password, - required this.salt, - required this.n, - required this.p, - required this.r, - }); -} - -class Secp256k1FromSeedReq { - final Uint8List seed; - - const Secp256k1FromSeedReq({ - required this.seed, - }); -} - -class Secp256k1IdentityExport { - final Uint8List privateKeyHash; - final Uint8List derEncodedPublicKey; - - const Secp256k1IdentityExport({ - required this.privateKeyHash, - required this.derEncodedPublicKey, - }); -} - -class Secp256k1RecoverReq { - final Uint8List messagePreHashed; - final Uint8List signatureBytes; - final int? chainId; - - const Secp256k1RecoverReq({ - required this.messagePreHashed, - required this.signatureBytes, - this.chainId, - }); -} - -class Secp256k1ShareSecretReq { - final Uint8List seed; - final Uint8List publicKeyRawBytes; - - const Secp256k1ShareSecretReq({ - required this.seed, - required this.publicKeyRawBytes, - }); -} - -class Secp256k1SignWithSeedReq { - final Uint8List msg; - final Uint8List seed; - - const Secp256k1SignWithSeedReq({ - required this.msg, - required this.seed, - }); -} - -class Secp256k1VerifyReq { - final Uint8List messageHash; - final Uint8List signatureBytes; - final Uint8List publicKeyBytes; - - const Secp256k1VerifyReq({ - required this.messageHash, - required this.signatureBytes, - required this.publicKeyBytes, - }); -} - -class SeedToKeyReq { - final Uint8List seed; - final String path; - - const SeedToKeyReq({ - required this.seed, - required this.path, - }); -} - -class SignatureFFI { - /// This is the DER-encoded public key. - final Uint8List? publicKey; - - /// The signature bytes. - final Uint8List? signature; - - const SignatureFFI({ - this.publicKey, - this.signature, - }); -} - -class AgentDartImpl implements AgentDart { - final AgentDartPlatform _platform; - factory AgentDartImpl(ExternalLibrary dylib) => - AgentDartImpl.raw(AgentDartPlatform(dylib)); - - /// Only valid on web/WASM platforms. - factory AgentDartImpl.wasm(FutureOr module) => - AgentDartImpl(module as ExternalLibrary); - AgentDartImpl.raw(this._platform); - Future mnemonicPhraseToSeed( - {required PhraseToSeedReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_phrase_to_seed_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => - _platform.inner.wire_mnemonic_phrase_to_seed(port_, arg0), - parseSuccessData: _wire2api_uint_8_list, - parseErrorData: null, - constMeta: kMnemonicPhraseToSeedConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kMnemonicPhraseToSeedConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "mnemonic_phrase_to_seed", - argNames: ["req"], - ); - - Future mnemonicSeedToKey( - {required SeedToKeyReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_seed_to_key_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => - _platform.inner.wire_mnemonic_seed_to_key(port_, arg0), - parseSuccessData: _wire2api_uint_8_list, - parseErrorData: null, - constMeta: kMnemonicSeedToKeyConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kMnemonicSeedToKeyConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "mnemonic_seed_to_key", - argNames: ["req"], - ); - - Future blsInit({dynamic hint}) { - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_bls_init(port_), - parseSuccessData: _wire2api_bool, - parseErrorData: null, - constMeta: kBlsInitConstMeta, - argValues: [], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kBlsInitConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "bls_init", - argNames: [], - ); - - Future blsVerify({required BLSVerifyReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_bls_verify_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_bls_verify(port_, arg0), - parseSuccessData: _wire2api_bool, - parseErrorData: null, - constMeta: kBlsVerifyConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kBlsVerifyConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "bls_verify", - argNames: ["req"], - ); - - Future ed25519FromSeed( - {required ED25519FromSeedReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_ed_25519_from_seed_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_ed25519_from_seed(port_, arg0), - parseSuccessData: _wire2api_ed_25519_res, - parseErrorData: null, - constMeta: kEd25519FromSeedConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kEd25519FromSeedConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "ed25519_from_seed", - argNames: ["req"], - ); - - Future ed25519Sign({required ED25519SignReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_ed_25519_sign_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_ed25519_sign(port_, arg0), - parseSuccessData: _wire2api_uint_8_list, - parseErrorData: null, - constMeta: kEd25519SignConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kEd25519SignConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "ed25519_sign", - argNames: ["req"], - ); - - Future ed25519Verify({required ED25519VerifyReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_ed_25519_verify_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_ed25519_verify(port_, arg0), - parseSuccessData: _wire2api_bool, - parseErrorData: null, - constMeta: kEd25519VerifyConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kEd25519VerifyConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "ed25519_verify", - argNames: ["req"], - ); - - Future secp256K1FromSeed( - {required Secp256k1FromSeedReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_secp_256_k_1_from_seed_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_secp256k1_from_seed(port_, arg0), - parseSuccessData: _wire2api_secp_256_k_1_identity_export, - parseErrorData: null, - constMeta: kSecp256K1FromSeedConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kSecp256K1FromSeedConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "secp256k1_from_seed", - argNames: ["req"], - ); - - Future secp256K1Sign( - {required Secp256k1SignWithSeedReq req, dynamic hint}) { - var arg0 = - _platform.api2wire_box_autoadd_secp_256_k_1_sign_with_seed_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_secp256k1_sign(port_, arg0), - parseSuccessData: _wire2api_signature_ffi, - parseErrorData: null, - constMeta: kSecp256K1SignConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kSecp256K1SignConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "secp256k1_sign", - argNames: ["req"], - ); - - Future secp256K1SignRecoverable( - {required Secp256k1SignWithSeedReq req, dynamic hint}) { - var arg0 = - _platform.api2wire_box_autoadd_secp_256_k_1_sign_with_seed_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => - _platform.inner.wire_secp256k1_sign_recoverable(port_, arg0), - parseSuccessData: _wire2api_signature_ffi, - parseErrorData: null, - constMeta: kSecp256K1SignRecoverableConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kSecp256K1SignRecoverableConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "secp256k1_sign_recoverable", - argNames: ["req"], - ); - - Future secp256K1Verify( - {required Secp256k1VerifyReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_secp_256_k_1_verify_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_secp256k1_verify(port_, arg0), - parseSuccessData: _wire2api_bool, - parseErrorData: null, - constMeta: kSecp256K1VerifyConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kSecp256K1VerifyConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "secp256k1_verify", - argNames: ["req"], - ); - - Future secp256K1GetSharedSecret( - {required Secp256k1ShareSecretReq req, dynamic hint}) { - var arg0 = - _platform.api2wire_box_autoadd_secp_256_k_1_share_secret_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => - _platform.inner.wire_secp256k1_get_shared_secret(port_, arg0), - parseSuccessData: _wire2api_uint_8_list, - parseErrorData: null, - constMeta: kSecp256K1GetSharedSecretConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kSecp256K1GetSharedSecretConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "secp256k1_get_shared_secret", - argNames: ["req"], - ); - - Future secp256K1Recover( - {required Secp256k1RecoverReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_secp_256_k_1_recover_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_secp256k1_recover(port_, arg0), - parseSuccessData: _wire2api_uint_8_list, - parseErrorData: null, - constMeta: kSecp256K1RecoverConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kSecp256K1RecoverConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "secp256k1_recover", - argNames: ["req"], - ); - - Future p256FromSeed( - {required P256FromSeedReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_p_256_from_seed_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_p256_from_seed(port_, arg0), - parseSuccessData: _wire2api_p_256_identity_export, - parseErrorData: null, - constMeta: kP256FromSeedConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kP256FromSeedConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "p256_from_seed", - argNames: ["req"], - ); - - Future p256Sign( - {required P256SignWithSeedReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_p_256_sign_with_seed_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_p256_sign(port_, arg0), - parseSuccessData: _wire2api_signature_ffi, - parseErrorData: null, - constMeta: kP256SignConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kP256SignConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "p256_sign", - argNames: ["req"], - ); - - Future p256Verify({required P256VerifyReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_p_256_verify_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_p256_verify(port_, arg0), - parseSuccessData: _wire2api_bool, - parseErrorData: null, - constMeta: kP256VerifyConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kP256VerifyConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "p256_verify", - argNames: ["req"], - ); - - Future p256GetSharedSecret( - {required P256ShareSecretReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_p_256_share_secret_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => - _platform.inner.wire_p256_get_shared_secret(port_, arg0), - parseSuccessData: _wire2api_uint_8_list, - parseErrorData: null, - constMeta: kP256GetSharedSecretConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kP256GetSharedSecretConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "p256_get_shared_secret", - argNames: ["req"], - ); - - Future schnorrFromSeed( - {required SchnorrFromSeedReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_schnorr_from_seed_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_schnorr_from_seed(port_, arg0), - parseSuccessData: _wire2api_schnorr_identity_export, - parseErrorData: null, - constMeta: kSchnorrFromSeedConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kSchnorrFromSeedConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "schnorr_from_seed", - argNames: ["req"], - ); - - Future schnorrSign( - {required SchnorrSignWithSeedReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_schnorr_sign_with_seed_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_schnorr_sign(port_, arg0), - parseSuccessData: _wire2api_signature_ffi, - parseErrorData: null, - constMeta: kSchnorrSignConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kSchnorrSignConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "schnorr_sign", - argNames: ["req"], - ); - - Future schnorrVerify({required SchnorrVerifyReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_schnorr_verify_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_schnorr_verify(port_, arg0), - parseSuccessData: _wire2api_bool, - parseErrorData: null, - constMeta: kSchnorrVerifyConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kSchnorrVerifyConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "schnorr_verify", - argNames: ["req"], - ); - - Future aes128CtrEncrypt( - {required AesEncryptReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_aes_encrypt_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_aes_128_ctr_encrypt(port_, arg0), - parseSuccessData: _wire2api_uint_8_list, - parseErrorData: null, - constMeta: kAes128CtrEncryptConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kAes128CtrEncryptConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "aes_128_ctr_encrypt", - argNames: ["req"], - ); - - Future aes128CtrDecrypt( - {required AesDecryptReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_aes_decrypt_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_aes_128_ctr_decrypt(port_, arg0), - parseSuccessData: _wire2api_uint_8_list, - parseErrorData: null, - constMeta: kAes128CtrDecryptConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kAes128CtrDecryptConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "aes_128_ctr_decrypt", - argNames: ["req"], - ); - - Future aes256CbcEncrypt( - {required AesEncryptReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_aes_encrypt_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_aes_256_cbc_encrypt(port_, arg0), - parseSuccessData: _wire2api_uint_8_list, - parseErrorData: null, - constMeta: kAes256CbcEncryptConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kAes256CbcEncryptConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "aes_256_cbc_encrypt", - argNames: ["req"], - ); - - Future aes256CbcDecrypt( - {required AesDecryptReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_aes_decrypt_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_aes_256_cbc_decrypt(port_, arg0), - parseSuccessData: _wire2api_uint_8_list, - parseErrorData: null, - constMeta: kAes256CbcDecryptConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kAes256CbcDecryptConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "aes_256_cbc_decrypt", - argNames: ["req"], - ); - - Future aes256GcmEncrypt( - {required AesEncryptReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_aes_encrypt_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_aes_256_gcm_encrypt(port_, arg0), - parseSuccessData: _wire2api_uint_8_list, - parseErrorData: null, - constMeta: kAes256GcmEncryptConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kAes256GcmEncryptConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "aes_256_gcm_encrypt", - argNames: ["req"], - ); - - Future aes256GcmDecrypt( - {required AesDecryptReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_aes_decrypt_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_aes_256_gcm_decrypt(port_, arg0), - parseSuccessData: _wire2api_uint_8_list, - parseErrorData: null, - constMeta: kAes256GcmDecryptConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kAes256GcmDecryptConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "aes_256_gcm_decrypt", - argNames: ["req"], - ); - - Future pbkdf2DeriveKey( - {required PBKDFDeriveReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_pbkdf_derive_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_pbkdf2_derive_key(port_, arg0), - parseSuccessData: _wire2api_key_derived_res, - parseErrorData: null, - constMeta: kPbkdf2DeriveKeyConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kPbkdf2DeriveKeyConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "pbkdf2_derive_key", - argNames: ["req"], - ); - - Future scryptDeriveKey( - {required ScriptDeriveReq req, dynamic hint}) { - var arg0 = _platform.api2wire_box_autoadd_script_derive_req(req); - return _platform.executeNormal(FlutterRustBridgeTask( - callFfi: (port_) => _platform.inner.wire_scrypt_derive_key(port_, arg0), - parseSuccessData: _wire2api_key_derived_res, - parseErrorData: null, - constMeta: kScryptDeriveKeyConstMeta, - argValues: [req], - hint: hint, - )); - } - - FlutterRustBridgeTaskConstMeta get kScryptDeriveKeyConstMeta => - const FlutterRustBridgeTaskConstMeta( - debugName: "scrypt_derive_key", - argNames: ["req"], - ); - - void dispose() { - _platform.dispose(); - } -// Section: wire2api - - bool _wire2api_bool(dynamic raw) { - return raw as bool; - } - - ED25519Res _wire2api_ed_25519_res(dynamic raw) { - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return ED25519Res( - seed: _wire2api_uint_8_list(arr[0]), - publicKey: _wire2api_uint_8_list(arr[1]), - ); - } - - KeyDerivedRes _wire2api_key_derived_res(dynamic raw) { - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return KeyDerivedRes( - leftBits: _wire2api_uint_8_list(arr[0]), - rightBits: _wire2api_uint_8_list(arr[1]), - ); - } - - Uint8List? _wire2api_opt_uint_8_list(dynamic raw) { - return raw == null ? null : _wire2api_uint_8_list(raw); - } - - P256IdentityExport _wire2api_p_256_identity_export(dynamic raw) { - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return P256IdentityExport( - privateKeyHash: _wire2api_uint_8_list(arr[0]), - derEncodedPublicKey: _wire2api_uint_8_list(arr[1]), - ); - } - - SchnorrIdentityExport _wire2api_schnorr_identity_export(dynamic raw) { - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return SchnorrIdentityExport( - privateKeyHash: _wire2api_uint_8_list(arr[0]), - publicKeyHash: _wire2api_uint_8_list(arr[1]), - ); - } - - Secp256k1IdentityExport _wire2api_secp_256_k_1_identity_export(dynamic raw) { - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return Secp256k1IdentityExport( - privateKeyHash: _wire2api_uint_8_list(arr[0]), - derEncodedPublicKey: _wire2api_uint_8_list(arr[1]), - ); - } - - SignatureFFI _wire2api_signature_ffi(dynamic raw) { - final arr = raw as List; - if (arr.length != 2) - throw Exception('unexpected arr length: expect 2 but see ${arr.length}'); - return SignatureFFI( - publicKey: _wire2api_opt_uint_8_list(arr[0]), - signature: _wire2api_opt_uint_8_list(arr[1]), - ); - } - - int _wire2api_u8(dynamic raw) { - return raw as int; - } - - Uint8List _wire2api_uint_8_list(dynamic raw) { - return raw as Uint8List; - } -} - -// Section: api2wire - -@protected -int api2wire_u32(int raw) { - return raw; -} - -@protected -int api2wire_u8(int raw) { - return raw; -} - -// Section: finalizer - -class AgentDartPlatform extends FlutterRustBridgeBase { - AgentDartPlatform(ffi.DynamicLibrary dylib) : super(AgentDartWire(dylib)); - -// Section: api2wire - - @protected - ffi.Pointer api2wire_String(String raw) { - return api2wire_uint_8_list(utf8.encoder.convert(raw)); - } - - @protected - ffi.Pointer api2wire_box_autoadd_aes_decrypt_req( - AesDecryptReq raw) { - final ptr = inner.new_box_autoadd_aes_decrypt_req_0(); - _api_fill_to_wire_aes_decrypt_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer api2wire_box_autoadd_aes_encrypt_req( - AesEncryptReq raw) { - final ptr = inner.new_box_autoadd_aes_encrypt_req_0(); - _api_fill_to_wire_aes_encrypt_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer api2wire_box_autoadd_bls_verify_req( - BLSVerifyReq raw) { - final ptr = inner.new_box_autoadd_bls_verify_req_0(); - _api_fill_to_wire_bls_verify_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer - api2wire_box_autoadd_ed_25519_from_seed_req(ED25519FromSeedReq raw) { - final ptr = inner.new_box_autoadd_ed_25519_from_seed_req_0(); - _api_fill_to_wire_ed_25519_from_seed_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer api2wire_box_autoadd_ed_25519_sign_req( - ED25519SignReq raw) { - final ptr = inner.new_box_autoadd_ed_25519_sign_req_0(); - _api_fill_to_wire_ed_25519_sign_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer api2wire_box_autoadd_ed_25519_verify_req( - ED25519VerifyReq raw) { - final ptr = inner.new_box_autoadd_ed_25519_verify_req_0(); - _api_fill_to_wire_ed_25519_verify_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer api2wire_box_autoadd_p_256_from_seed_req( - P256FromSeedReq raw) { - final ptr = inner.new_box_autoadd_p_256_from_seed_req_0(); - _api_fill_to_wire_p_256_from_seed_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer - api2wire_box_autoadd_p_256_share_secret_req(P256ShareSecretReq raw) { - final ptr = inner.new_box_autoadd_p_256_share_secret_req_0(); - _api_fill_to_wire_p_256_share_secret_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer - api2wire_box_autoadd_p_256_sign_with_seed_req(P256SignWithSeedReq raw) { - final ptr = inner.new_box_autoadd_p_256_sign_with_seed_req_0(); - _api_fill_to_wire_p_256_sign_with_seed_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer api2wire_box_autoadd_p_256_verify_req( - P256VerifyReq raw) { - final ptr = inner.new_box_autoadd_p_256_verify_req_0(); - _api_fill_to_wire_p_256_verify_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer api2wire_box_autoadd_pbkdf_derive_req( - PBKDFDeriveReq raw) { - final ptr = inner.new_box_autoadd_pbkdf_derive_req_0(); - _api_fill_to_wire_pbkdf_derive_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer api2wire_box_autoadd_phrase_to_seed_req( - PhraseToSeedReq raw) { - final ptr = inner.new_box_autoadd_phrase_to_seed_req_0(); - _api_fill_to_wire_phrase_to_seed_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer - api2wire_box_autoadd_schnorr_from_seed_req(SchnorrFromSeedReq raw) { - final ptr = inner.new_box_autoadd_schnorr_from_seed_req_0(); - _api_fill_to_wire_schnorr_from_seed_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer - api2wire_box_autoadd_schnorr_sign_with_seed_req( - SchnorrSignWithSeedReq raw) { - final ptr = inner.new_box_autoadd_schnorr_sign_with_seed_req_0(); - _api_fill_to_wire_schnorr_sign_with_seed_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer api2wire_box_autoadd_schnorr_verify_req( - SchnorrVerifyReq raw) { - final ptr = inner.new_box_autoadd_schnorr_verify_req_0(); - _api_fill_to_wire_schnorr_verify_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer api2wire_box_autoadd_script_derive_req( - ScriptDeriveReq raw) { - final ptr = inner.new_box_autoadd_script_derive_req_0(); - _api_fill_to_wire_script_derive_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer - api2wire_box_autoadd_secp_256_k_1_from_seed_req( - Secp256k1FromSeedReq raw) { - final ptr = inner.new_box_autoadd_secp_256_k_1_from_seed_req_0(); - _api_fill_to_wire_secp_256_k_1_from_seed_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer - api2wire_box_autoadd_secp_256_k_1_recover_req(Secp256k1RecoverReq raw) { - final ptr = inner.new_box_autoadd_secp_256_k_1_recover_req_0(); - _api_fill_to_wire_secp_256_k_1_recover_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer - api2wire_box_autoadd_secp_256_k_1_share_secret_req( - Secp256k1ShareSecretReq raw) { - final ptr = inner.new_box_autoadd_secp_256_k_1_share_secret_req_0(); - _api_fill_to_wire_secp_256_k_1_share_secret_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer - api2wire_box_autoadd_secp_256_k_1_sign_with_seed_req( - Secp256k1SignWithSeedReq raw) { - final ptr = inner.new_box_autoadd_secp_256_k_1_sign_with_seed_req_0(); - _api_fill_to_wire_secp_256_k_1_sign_with_seed_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer - api2wire_box_autoadd_secp_256_k_1_verify_req(Secp256k1VerifyReq raw) { - final ptr = inner.new_box_autoadd_secp_256_k_1_verify_req_0(); - _api_fill_to_wire_secp_256_k_1_verify_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer api2wire_box_autoadd_seed_to_key_req( - SeedToKeyReq raw) { - final ptr = inner.new_box_autoadd_seed_to_key_req_0(); - _api_fill_to_wire_seed_to_key_req(raw, ptr.ref); - return ptr; - } - - @protected - ffi.Pointer api2wire_box_autoadd_u8(int raw) { - return inner.new_box_autoadd_u8_0(api2wire_u8(raw)); - } - - @protected - ffi.Pointer api2wire_opt_box_autoadd_u8(int? raw) { - return raw == null ? ffi.nullptr : api2wire_box_autoadd_u8(raw); - } - - @protected - ffi.Pointer api2wire_opt_uint_8_list(Uint8List? raw) { - return raw == null ? ffi.nullptr : api2wire_uint_8_list(raw); - } - - @protected - ffi.Pointer api2wire_uint_8_list(Uint8List raw) { - final ans = inner.new_uint_8_list_0(raw.length); - ans.ref.ptr.asTypedList(raw.length).setAll(0, raw); - return ans; - } -// Section: finalizer - -// Section: api_fill_to_wire - - void _api_fill_to_wire_aes_decrypt_req( - AesDecryptReq apiObj, wire_AesDecryptReq wireObj) { - wireObj.key = api2wire_uint_8_list(apiObj.key); - wireObj.iv = api2wire_uint_8_list(apiObj.iv); - wireObj.cipher_text = api2wire_uint_8_list(apiObj.cipherText); - } - - void _api_fill_to_wire_aes_encrypt_req( - AesEncryptReq apiObj, wire_AesEncryptReq wireObj) { - wireObj.key = api2wire_uint_8_list(apiObj.key); - wireObj.iv = api2wire_uint_8_list(apiObj.iv); - wireObj.message = api2wire_uint_8_list(apiObj.message); - } - - void _api_fill_to_wire_bls_verify_req( - BLSVerifyReq apiObj, wire_BLSVerifyReq wireObj) { - wireObj.signature = api2wire_uint_8_list(apiObj.signature); - wireObj.message = api2wire_uint_8_list(apiObj.message); - wireObj.public_key = api2wire_uint_8_list(apiObj.publicKey); - } - - void _api_fill_to_wire_box_autoadd_aes_decrypt_req( - AesDecryptReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_aes_decrypt_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_aes_encrypt_req( - AesEncryptReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_aes_encrypt_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_bls_verify_req( - BLSVerifyReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_bls_verify_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_ed_25519_from_seed_req( - ED25519FromSeedReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_ed_25519_from_seed_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_ed_25519_sign_req( - ED25519SignReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_ed_25519_sign_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_ed_25519_verify_req( - ED25519VerifyReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_ed_25519_verify_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_p_256_from_seed_req( - P256FromSeedReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_p_256_from_seed_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_p_256_share_secret_req( - P256ShareSecretReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_p_256_share_secret_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_p_256_sign_with_seed_req( - P256SignWithSeedReq apiObj, - ffi.Pointer wireObj) { - _api_fill_to_wire_p_256_sign_with_seed_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_p_256_verify_req( - P256VerifyReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_p_256_verify_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_pbkdf_derive_req( - PBKDFDeriveReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_pbkdf_derive_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_phrase_to_seed_req( - PhraseToSeedReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_phrase_to_seed_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_schnorr_from_seed_req( - SchnorrFromSeedReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_schnorr_from_seed_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_schnorr_sign_with_seed_req( - SchnorrSignWithSeedReq apiObj, - ffi.Pointer wireObj) { - _api_fill_to_wire_schnorr_sign_with_seed_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_schnorr_verify_req( - SchnorrVerifyReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_schnorr_verify_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_script_derive_req( - ScriptDeriveReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_script_derive_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_secp_256_k_1_from_seed_req( - Secp256k1FromSeedReq apiObj, - ffi.Pointer wireObj) { - _api_fill_to_wire_secp_256_k_1_from_seed_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_secp_256_k_1_recover_req( - Secp256k1RecoverReq apiObj, - ffi.Pointer wireObj) { - _api_fill_to_wire_secp_256_k_1_recover_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_secp_256_k_1_share_secret_req( - Secp256k1ShareSecretReq apiObj, - ffi.Pointer wireObj) { - _api_fill_to_wire_secp_256_k_1_share_secret_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_secp_256_k_1_sign_with_seed_req( - Secp256k1SignWithSeedReq apiObj, - ffi.Pointer wireObj) { - _api_fill_to_wire_secp_256_k_1_sign_with_seed_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_secp_256_k_1_verify_req( - Secp256k1VerifyReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_secp_256_k_1_verify_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_box_autoadd_seed_to_key_req( - SeedToKeyReq apiObj, ffi.Pointer wireObj) { - _api_fill_to_wire_seed_to_key_req(apiObj, wireObj.ref); - } - - void _api_fill_to_wire_ed_25519_from_seed_req( - ED25519FromSeedReq apiObj, wire_ED25519FromSeedReq wireObj) { - wireObj.seed = api2wire_uint_8_list(apiObj.seed); - } - - void _api_fill_to_wire_ed_25519_sign_req( - ED25519SignReq apiObj, wire_ED25519SignReq wireObj) { - wireObj.seed = api2wire_uint_8_list(apiObj.seed); - wireObj.message = api2wire_uint_8_list(apiObj.message); - } - - void _api_fill_to_wire_ed_25519_verify_req( - ED25519VerifyReq apiObj, wire_ED25519VerifyReq wireObj) { - wireObj.sig = api2wire_uint_8_list(apiObj.sig); - wireObj.message = api2wire_uint_8_list(apiObj.message); - wireObj.pub_key = api2wire_uint_8_list(apiObj.pubKey); - } - - void _api_fill_to_wire_p_256_from_seed_req( - P256FromSeedReq apiObj, wire_P256FromSeedReq wireObj) { - wireObj.seed = api2wire_uint_8_list(apiObj.seed); - } - - void _api_fill_to_wire_p_256_share_secret_req( - P256ShareSecretReq apiObj, wire_P256ShareSecretReq wireObj) { - wireObj.seed = api2wire_uint_8_list(apiObj.seed); - wireObj.public_key_raw_bytes = - api2wire_uint_8_list(apiObj.publicKeyRawBytes); - } - - void _api_fill_to_wire_p_256_sign_with_seed_req( - P256SignWithSeedReq apiObj, wire_P256SignWithSeedReq wireObj) { - wireObj.msg = api2wire_uint_8_list(apiObj.msg); - wireObj.seed = api2wire_uint_8_list(apiObj.seed); - } - - void _api_fill_to_wire_p_256_verify_req( - P256VerifyReq apiObj, wire_P256VerifyReq wireObj) { - wireObj.message_hash = api2wire_uint_8_list(apiObj.messageHash); - wireObj.signature_bytes = api2wire_uint_8_list(apiObj.signatureBytes); - wireObj.public_key_bytes = api2wire_uint_8_list(apiObj.publicKeyBytes); - } - - void _api_fill_to_wire_pbkdf_derive_req( - PBKDFDeriveReq apiObj, wire_PBKDFDeriveReq wireObj) { - wireObj.password = api2wire_uint_8_list(apiObj.password); - wireObj.salt = api2wire_uint_8_list(apiObj.salt); - wireObj.c = api2wire_u32(apiObj.c); - } - - void _api_fill_to_wire_phrase_to_seed_req( - PhraseToSeedReq apiObj, wire_PhraseToSeedReq wireObj) { - wireObj.phrase = api2wire_String(apiObj.phrase); - wireObj.password = api2wire_String(apiObj.password); - } - - void _api_fill_to_wire_schnorr_from_seed_req( - SchnorrFromSeedReq apiObj, wire_SchnorrFromSeedReq wireObj) { - wireObj.seed = api2wire_uint_8_list(apiObj.seed); - } - - void _api_fill_to_wire_schnorr_sign_with_seed_req( - SchnorrSignWithSeedReq apiObj, wire_SchnorrSignWithSeedReq wireObj) { - wireObj.msg = api2wire_uint_8_list(apiObj.msg); - wireObj.seed = api2wire_uint_8_list(apiObj.seed); - wireObj.aux_rand = api2wire_opt_uint_8_list(apiObj.auxRand); - } - - void _api_fill_to_wire_schnorr_verify_req( - SchnorrVerifyReq apiObj, wire_SchnorrVerifyReq wireObj) { - wireObj.message_hash = api2wire_uint_8_list(apiObj.messageHash); - wireObj.signature_bytes = api2wire_uint_8_list(apiObj.signatureBytes); - wireObj.public_key_bytes = api2wire_uint_8_list(apiObj.publicKeyBytes); - } - - void _api_fill_to_wire_script_derive_req( - ScriptDeriveReq apiObj, wire_ScriptDeriveReq wireObj) { - wireObj.password = api2wire_uint_8_list(apiObj.password); - wireObj.salt = api2wire_uint_8_list(apiObj.salt); - wireObj.n = api2wire_u32(apiObj.n); - wireObj.p = api2wire_u32(apiObj.p); - wireObj.r = api2wire_u32(apiObj.r); - } - - void _api_fill_to_wire_secp_256_k_1_from_seed_req( - Secp256k1FromSeedReq apiObj, wire_Secp256k1FromSeedReq wireObj) { - wireObj.seed = api2wire_uint_8_list(apiObj.seed); - } - - void _api_fill_to_wire_secp_256_k_1_recover_req( - Secp256k1RecoverReq apiObj, wire_Secp256k1RecoverReq wireObj) { - wireObj.message_pre_hashed = api2wire_uint_8_list(apiObj.messagePreHashed); - wireObj.signature_bytes = api2wire_uint_8_list(apiObj.signatureBytes); - wireObj.chain_id = api2wire_opt_box_autoadd_u8(apiObj.chainId); - } - - void _api_fill_to_wire_secp_256_k_1_share_secret_req( - Secp256k1ShareSecretReq apiObj, wire_Secp256k1ShareSecretReq wireObj) { - wireObj.seed = api2wire_uint_8_list(apiObj.seed); - wireObj.public_key_raw_bytes = - api2wire_uint_8_list(apiObj.publicKeyRawBytes); - } - - void _api_fill_to_wire_secp_256_k_1_sign_with_seed_req( - Secp256k1SignWithSeedReq apiObj, wire_Secp256k1SignWithSeedReq wireObj) { - wireObj.msg = api2wire_uint_8_list(apiObj.msg); - wireObj.seed = api2wire_uint_8_list(apiObj.seed); - } - - void _api_fill_to_wire_secp_256_k_1_verify_req( - Secp256k1VerifyReq apiObj, wire_Secp256k1VerifyReq wireObj) { - wireObj.message_hash = api2wire_uint_8_list(apiObj.messageHash); - wireObj.signature_bytes = api2wire_uint_8_list(apiObj.signatureBytes); - wireObj.public_key_bytes = api2wire_uint_8_list(apiObj.publicKeyBytes); - } - - void _api_fill_to_wire_seed_to_key_req( - SeedToKeyReq apiObj, wire_SeedToKeyReq wireObj) { - wireObj.seed = api2wire_uint_8_list(apiObj.seed); - wireObj.path = api2wire_String(apiObj.path); - } -} - -// ignore_for_file: camel_case_types, non_constant_identifier_names, avoid_positional_boolean_parameters, annotate_overrides, constant_identifier_names - -// AUTO GENERATED FILE, DO NOT EDIT. -// -// Generated by `package:ffigen`. -// ignore_for_file: type=lint - -/// generated by flutter_rust_bridge -class AgentDartWire implements FlutterRustBridgeWireBase { - @internal - late final dartApi = DartApiDl(init_frb_dart_api_dl); - - /// Holds the symbol lookup function. - final ffi.Pointer Function(String symbolName) - _lookup; - - /// The symbols are looked up in [dynamicLibrary]. - AgentDartWire(ffi.DynamicLibrary dynamicLibrary) - : _lookup = dynamicLibrary.lookup; - - /// The symbols are looked up with [lookup]. - AgentDartWire.fromLookup( - ffi.Pointer Function(String symbolName) - lookup) - : _lookup = lookup; - - void store_dart_post_cobject( - DartPostCObjectFnType ptr, - ) { - return _store_dart_post_cobject( - ptr, - ); - } - - late final _store_dart_post_cobjectPtr = - _lookup>( - 'store_dart_post_cobject'); - late final _store_dart_post_cobject = _store_dart_post_cobjectPtr - .asFunction(); - - Object get_dart_object( - int ptr, - ) { - return _get_dart_object( - ptr, - ); - } - - late final _get_dart_objectPtr = - _lookup>( - 'get_dart_object'); - late final _get_dart_object = - _get_dart_objectPtr.asFunction(); - - void drop_dart_object( - int ptr, - ) { - return _drop_dart_object( - ptr, - ); - } - - late final _drop_dart_objectPtr = - _lookup>( - 'drop_dart_object'); - late final _drop_dart_object = - _drop_dart_objectPtr.asFunction(); - - int new_dart_opaque( - Object handle, - ) { - return _new_dart_opaque( - handle, - ); - } - - late final _new_dart_opaquePtr = - _lookup>( - 'new_dart_opaque'); - late final _new_dart_opaque = - _new_dart_opaquePtr.asFunction(); - - int init_frb_dart_api_dl( - ffi.Pointer obj, - ) { - return _init_frb_dart_api_dl( - obj, - ); - } - - late final _init_frb_dart_api_dlPtr = - _lookup)>>( - 'init_frb_dart_api_dl'); - late final _init_frb_dart_api_dl = _init_frb_dart_api_dlPtr - .asFunction)>(); - - void wire_mnemonic_phrase_to_seed( - int port_, - ffi.Pointer req, - ) { - return _wire_mnemonic_phrase_to_seed( - port_, - req, - ); - } - - late final _wire_mnemonic_phrase_to_seedPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, ffi.Pointer)>>( - 'wire_mnemonic_phrase_to_seed'); - late final _wire_mnemonic_phrase_to_seed = _wire_mnemonic_phrase_to_seedPtr - .asFunction)>(); - - void wire_mnemonic_seed_to_key( - int port_, - ffi.Pointer req, - ) { - return _wire_mnemonic_seed_to_key( - port_, - req, - ); - } - - late final _wire_mnemonic_seed_to_keyPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_mnemonic_seed_to_key'); - late final _wire_mnemonic_seed_to_key = _wire_mnemonic_seed_to_keyPtr - .asFunction)>(); - - void wire_bls_init( - int port_, - ) { - return _wire_bls_init( - port_, - ); - } - - late final _wire_bls_initPtr = - _lookup>( - 'wire_bls_init'); - late final _wire_bls_init = - _wire_bls_initPtr.asFunction(); - - void wire_bls_verify( - int port_, - ffi.Pointer req, - ) { - return _wire_bls_verify( - port_, - req, - ); - } - - late final _wire_bls_verifyPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Int64, ffi.Pointer)>>('wire_bls_verify'); - late final _wire_bls_verify = _wire_bls_verifyPtr - .asFunction)>(); - - void wire_ed25519_from_seed( - int port_, - ffi.Pointer req, - ) { - return _wire_ed25519_from_seed( - port_, - req, - ); - } - - late final _wire_ed25519_from_seedPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_ed25519_from_seed'); - late final _wire_ed25519_from_seed = _wire_ed25519_from_seedPtr - .asFunction)>(); - - void wire_ed25519_sign( - int port_, - ffi.Pointer req, - ) { - return _wire_ed25519_sign( - port_, - req, - ); - } - - late final _wire_ed25519_signPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_ed25519_sign'); - late final _wire_ed25519_sign = _wire_ed25519_signPtr - .asFunction)>(); - - void wire_ed25519_verify( - int port_, - ffi.Pointer req, - ) { - return _wire_ed25519_verify( - port_, - req, - ); - } - - late final _wire_ed25519_verifyPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_ed25519_verify'); - late final _wire_ed25519_verify = _wire_ed25519_verifyPtr - .asFunction)>(); - - void wire_secp256k1_from_seed( - int port_, - ffi.Pointer req, - ) { - return _wire_secp256k1_from_seed( - port_, - req, - ); - } - - late final _wire_secp256k1_from_seedPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Int64, ffi.Pointer)>>( - 'wire_secp256k1_from_seed'); - late final _wire_secp256k1_from_seed = _wire_secp256k1_from_seedPtr - .asFunction)>(); - - void wire_secp256k1_sign( - int port_, - ffi.Pointer req, - ) { - return _wire_secp256k1_sign( - port_, - req, - ); - } - - late final _wire_secp256k1_signPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Int64, ffi.Pointer)>>( - 'wire_secp256k1_sign'); - late final _wire_secp256k1_sign = _wire_secp256k1_signPtr.asFunction< - void Function(int, ffi.Pointer)>(); - - void wire_secp256k1_sign_recoverable( - int port_, - ffi.Pointer req, - ) { - return _wire_secp256k1_sign_recoverable( - port_, - req, - ); - } - - late final _wire_secp256k1_sign_recoverablePtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Int64, ffi.Pointer)>>( - 'wire_secp256k1_sign_recoverable'); - late final _wire_secp256k1_sign_recoverable = - _wire_secp256k1_sign_recoverablePtr.asFunction< - void Function(int, ffi.Pointer)>(); - - void wire_secp256k1_verify( - int port_, - ffi.Pointer req, - ) { - return _wire_secp256k1_verify( - port_, - req, - ); - } - - late final _wire_secp256k1_verifyPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_secp256k1_verify'); - late final _wire_secp256k1_verify = _wire_secp256k1_verifyPtr - .asFunction)>(); - - void wire_secp256k1_get_shared_secret( - int port_, - ffi.Pointer req, - ) { - return _wire_secp256k1_get_shared_secret( - port_, - req, - ); - } - - late final _wire_secp256k1_get_shared_secretPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Int64, ffi.Pointer)>>( - 'wire_secp256k1_get_shared_secret'); - late final _wire_secp256k1_get_shared_secret = - _wire_secp256k1_get_shared_secretPtr.asFunction< - void Function(int, ffi.Pointer)>(); - - void wire_secp256k1_recover( - int port_, - ffi.Pointer req, - ) { - return _wire_secp256k1_recover( - port_, - req, - ); - } - - late final _wire_secp256k1_recoverPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Int64, ffi.Pointer)>>( - 'wire_secp256k1_recover'); - late final _wire_secp256k1_recover = _wire_secp256k1_recoverPtr - .asFunction)>(); - - void wire_p256_from_seed( - int port_, - ffi.Pointer req, - ) { - return _wire_p256_from_seed( - port_, - req, - ); - } - - late final _wire_p256_from_seedPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_p256_from_seed'); - late final _wire_p256_from_seed = _wire_p256_from_seedPtr - .asFunction)>(); - - void wire_p256_sign( - int port_, - ffi.Pointer req, - ) { - return _wire_p256_sign( - port_, - req, - ); - } - - late final _wire_p256_signPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_p256_sign'); - late final _wire_p256_sign = _wire_p256_signPtr - .asFunction)>(); - - void wire_p256_verify( - int port_, - ffi.Pointer req, - ) { - return _wire_p256_verify( - port_, - req, - ); - } - - late final _wire_p256_verifyPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Int64, ffi.Pointer)>>('wire_p256_verify'); - late final _wire_p256_verify = _wire_p256_verifyPtr - .asFunction)>(); - - void wire_p256_get_shared_secret( - int port_, - ffi.Pointer req, - ) { - return _wire_p256_get_shared_secret( - port_, - req, - ); - } - - late final _wire_p256_get_shared_secretPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function( - ffi.Int64, ffi.Pointer)>>( - 'wire_p256_get_shared_secret'); - late final _wire_p256_get_shared_secret = _wire_p256_get_shared_secretPtr - .asFunction)>(); - - void wire_schnorr_from_seed( - int port_, - ffi.Pointer req, - ) { - return _wire_schnorr_from_seed( - port_, - req, - ); - } - - late final _wire_schnorr_from_seedPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_schnorr_from_seed'); - late final _wire_schnorr_from_seed = _wire_schnorr_from_seedPtr - .asFunction)>(); - - void wire_schnorr_sign( - int port_, - ffi.Pointer req, - ) { - return _wire_schnorr_sign( - port_, - req, - ); - } - - late final _wire_schnorr_signPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_schnorr_sign'); - late final _wire_schnorr_sign = _wire_schnorr_signPtr.asFunction< - void Function(int, ffi.Pointer)>(); - - void wire_schnorr_verify( - int port_, - ffi.Pointer req, - ) { - return _wire_schnorr_verify( - port_, - req, - ); - } - - late final _wire_schnorr_verifyPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_schnorr_verify'); - late final _wire_schnorr_verify = _wire_schnorr_verifyPtr - .asFunction)>(); - - void wire_aes_128_ctr_encrypt( - int port_, - ffi.Pointer req, - ) { - return _wire_aes_128_ctr_encrypt( - port_, - req, - ); - } - - late final _wire_aes_128_ctr_encryptPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_aes_128_ctr_encrypt'); - late final _wire_aes_128_ctr_encrypt = _wire_aes_128_ctr_encryptPtr - .asFunction)>(); - - void wire_aes_128_ctr_decrypt( - int port_, - ffi.Pointer req, - ) { - return _wire_aes_128_ctr_decrypt( - port_, - req, - ); - } - - late final _wire_aes_128_ctr_decryptPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_aes_128_ctr_decrypt'); - late final _wire_aes_128_ctr_decrypt = _wire_aes_128_ctr_decryptPtr - .asFunction)>(); - - void wire_aes_256_cbc_encrypt( - int port_, - ffi.Pointer req, - ) { - return _wire_aes_256_cbc_encrypt( - port_, - req, - ); - } - - late final _wire_aes_256_cbc_encryptPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_aes_256_cbc_encrypt'); - late final _wire_aes_256_cbc_encrypt = _wire_aes_256_cbc_encryptPtr - .asFunction)>(); - - void wire_aes_256_cbc_decrypt( - int port_, - ffi.Pointer req, - ) { - return _wire_aes_256_cbc_decrypt( - port_, - req, - ); - } - - late final _wire_aes_256_cbc_decryptPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_aes_256_cbc_decrypt'); - late final _wire_aes_256_cbc_decrypt = _wire_aes_256_cbc_decryptPtr - .asFunction)>(); - - void wire_aes_256_gcm_encrypt( - int port_, - ffi.Pointer req, - ) { - return _wire_aes_256_gcm_encrypt( - port_, - req, - ); - } - - late final _wire_aes_256_gcm_encryptPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_aes_256_gcm_encrypt'); - late final _wire_aes_256_gcm_encrypt = _wire_aes_256_gcm_encryptPtr - .asFunction)>(); - - void wire_aes_256_gcm_decrypt( - int port_, - ffi.Pointer req, - ) { - return _wire_aes_256_gcm_decrypt( - port_, - req, - ); - } - - late final _wire_aes_256_gcm_decryptPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_aes_256_gcm_decrypt'); - late final _wire_aes_256_gcm_decrypt = _wire_aes_256_gcm_decryptPtr - .asFunction)>(); - - void wire_pbkdf2_derive_key( - int port_, - ffi.Pointer req, - ) { - return _wire_pbkdf2_derive_key( - port_, - req, - ); - } - - late final _wire_pbkdf2_derive_keyPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_pbkdf2_derive_key'); - late final _wire_pbkdf2_derive_key = _wire_pbkdf2_derive_keyPtr - .asFunction)>(); - - void wire_scrypt_derive_key( - int port_, - ffi.Pointer req, - ) { - return _wire_scrypt_derive_key( - port_, - req, - ); - } - - late final _wire_scrypt_derive_keyPtr = _lookup< - ffi.NativeFunction< - ffi.Void Function(ffi.Int64, - ffi.Pointer)>>('wire_scrypt_derive_key'); - late final _wire_scrypt_derive_key = _wire_scrypt_derive_keyPtr - .asFunction)>(); - - ffi.Pointer new_box_autoadd_aes_decrypt_req_0() { - return _new_box_autoadd_aes_decrypt_req_0(); - } - - late final _new_box_autoadd_aes_decrypt_req_0Ptr = - _lookup Function()>>( - 'new_box_autoadd_aes_decrypt_req_0'); - late final _new_box_autoadd_aes_decrypt_req_0 = - _new_box_autoadd_aes_decrypt_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer new_box_autoadd_aes_encrypt_req_0() { - return _new_box_autoadd_aes_encrypt_req_0(); - } - - late final _new_box_autoadd_aes_encrypt_req_0Ptr = - _lookup Function()>>( - 'new_box_autoadd_aes_encrypt_req_0'); - late final _new_box_autoadd_aes_encrypt_req_0 = - _new_box_autoadd_aes_encrypt_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer new_box_autoadd_bls_verify_req_0() { - return _new_box_autoadd_bls_verify_req_0(); - } - - late final _new_box_autoadd_bls_verify_req_0Ptr = - _lookup Function()>>( - 'new_box_autoadd_bls_verify_req_0'); - late final _new_box_autoadd_bls_verify_req_0 = - _new_box_autoadd_bls_verify_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer - new_box_autoadd_ed_25519_from_seed_req_0() { - return _new_box_autoadd_ed_25519_from_seed_req_0(); - } - - late final _new_box_autoadd_ed_25519_from_seed_req_0Ptr = _lookup< - ffi.NativeFunction Function()>>( - 'new_box_autoadd_ed_25519_from_seed_req_0'); - late final _new_box_autoadd_ed_25519_from_seed_req_0 = - _new_box_autoadd_ed_25519_from_seed_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer new_box_autoadd_ed_25519_sign_req_0() { - return _new_box_autoadd_ed_25519_sign_req_0(); - } - - late final _new_box_autoadd_ed_25519_sign_req_0Ptr = - _lookup Function()>>( - 'new_box_autoadd_ed_25519_sign_req_0'); - late final _new_box_autoadd_ed_25519_sign_req_0 = - _new_box_autoadd_ed_25519_sign_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer new_box_autoadd_ed_25519_verify_req_0() { - return _new_box_autoadd_ed_25519_verify_req_0(); - } - - late final _new_box_autoadd_ed_25519_verify_req_0Ptr = _lookup< - ffi.NativeFunction Function()>>( - 'new_box_autoadd_ed_25519_verify_req_0'); - late final _new_box_autoadd_ed_25519_verify_req_0 = - _new_box_autoadd_ed_25519_verify_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer new_box_autoadd_p_256_from_seed_req_0() { - return _new_box_autoadd_p_256_from_seed_req_0(); - } - - late final _new_box_autoadd_p_256_from_seed_req_0Ptr = - _lookup Function()>>( - 'new_box_autoadd_p_256_from_seed_req_0'); - late final _new_box_autoadd_p_256_from_seed_req_0 = - _new_box_autoadd_p_256_from_seed_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer - new_box_autoadd_p_256_share_secret_req_0() { - return _new_box_autoadd_p_256_share_secret_req_0(); - } - - late final _new_box_autoadd_p_256_share_secret_req_0Ptr = _lookup< - ffi.NativeFunction Function()>>( - 'new_box_autoadd_p_256_share_secret_req_0'); - late final _new_box_autoadd_p_256_share_secret_req_0 = - _new_box_autoadd_p_256_share_secret_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer - new_box_autoadd_p_256_sign_with_seed_req_0() { - return _new_box_autoadd_p_256_sign_with_seed_req_0(); - } - - late final _new_box_autoadd_p_256_sign_with_seed_req_0Ptr = _lookup< - ffi.NativeFunction Function()>>( - 'new_box_autoadd_p_256_sign_with_seed_req_0'); - late final _new_box_autoadd_p_256_sign_with_seed_req_0 = - _new_box_autoadd_p_256_sign_with_seed_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer new_box_autoadd_p_256_verify_req_0() { - return _new_box_autoadd_p_256_verify_req_0(); - } - - late final _new_box_autoadd_p_256_verify_req_0Ptr = - _lookup Function()>>( - 'new_box_autoadd_p_256_verify_req_0'); - late final _new_box_autoadd_p_256_verify_req_0 = - _new_box_autoadd_p_256_verify_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer new_box_autoadd_pbkdf_derive_req_0() { - return _new_box_autoadd_pbkdf_derive_req_0(); - } - - late final _new_box_autoadd_pbkdf_derive_req_0Ptr = - _lookup Function()>>( - 'new_box_autoadd_pbkdf_derive_req_0'); - late final _new_box_autoadd_pbkdf_derive_req_0 = - _new_box_autoadd_pbkdf_derive_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer new_box_autoadd_phrase_to_seed_req_0() { - return _new_box_autoadd_phrase_to_seed_req_0(); - } - - late final _new_box_autoadd_phrase_to_seed_req_0Ptr = - _lookup Function()>>( - 'new_box_autoadd_phrase_to_seed_req_0'); - late final _new_box_autoadd_phrase_to_seed_req_0 = - _new_box_autoadd_phrase_to_seed_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer - new_box_autoadd_schnorr_from_seed_req_0() { - return _new_box_autoadd_schnorr_from_seed_req_0(); - } - - late final _new_box_autoadd_schnorr_from_seed_req_0Ptr = _lookup< - ffi.NativeFunction Function()>>( - 'new_box_autoadd_schnorr_from_seed_req_0'); - late final _new_box_autoadd_schnorr_from_seed_req_0 = - _new_box_autoadd_schnorr_from_seed_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer - new_box_autoadd_schnorr_sign_with_seed_req_0() { - return _new_box_autoadd_schnorr_sign_with_seed_req_0(); - } - - late final _new_box_autoadd_schnorr_sign_with_seed_req_0Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer - Function()>>('new_box_autoadd_schnorr_sign_with_seed_req_0'); - late final _new_box_autoadd_schnorr_sign_with_seed_req_0 = - _new_box_autoadd_schnorr_sign_with_seed_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer new_box_autoadd_schnorr_verify_req_0() { - return _new_box_autoadd_schnorr_verify_req_0(); - } - - late final _new_box_autoadd_schnorr_verify_req_0Ptr = _lookup< - ffi.NativeFunction Function()>>( - 'new_box_autoadd_schnorr_verify_req_0'); - late final _new_box_autoadd_schnorr_verify_req_0 = - _new_box_autoadd_schnorr_verify_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer new_box_autoadd_script_derive_req_0() { - return _new_box_autoadd_script_derive_req_0(); - } - - late final _new_box_autoadd_script_derive_req_0Ptr = - _lookup Function()>>( - 'new_box_autoadd_script_derive_req_0'); - late final _new_box_autoadd_script_derive_req_0 = - _new_box_autoadd_script_derive_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer - new_box_autoadd_secp_256_k_1_from_seed_req_0() { - return _new_box_autoadd_secp_256_k_1_from_seed_req_0(); - } - - late final _new_box_autoadd_secp_256_k_1_from_seed_req_0Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer - Function()>>('new_box_autoadd_secp_256_k_1_from_seed_req_0'); - late final _new_box_autoadd_secp_256_k_1_from_seed_req_0 = - _new_box_autoadd_secp_256_k_1_from_seed_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer - new_box_autoadd_secp_256_k_1_recover_req_0() { - return _new_box_autoadd_secp_256_k_1_recover_req_0(); - } - - late final _new_box_autoadd_secp_256_k_1_recover_req_0Ptr = _lookup< - ffi.NativeFunction Function()>>( - 'new_box_autoadd_secp_256_k_1_recover_req_0'); - late final _new_box_autoadd_secp_256_k_1_recover_req_0 = - _new_box_autoadd_secp_256_k_1_recover_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer - new_box_autoadd_secp_256_k_1_share_secret_req_0() { - return _new_box_autoadd_secp_256_k_1_share_secret_req_0(); - } - - late final _new_box_autoadd_secp_256_k_1_share_secret_req_0Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer - Function()>>('new_box_autoadd_secp_256_k_1_share_secret_req_0'); - late final _new_box_autoadd_secp_256_k_1_share_secret_req_0 = - _new_box_autoadd_secp_256_k_1_share_secret_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer - new_box_autoadd_secp_256_k_1_sign_with_seed_req_0() { - return _new_box_autoadd_secp_256_k_1_sign_with_seed_req_0(); - } - - late final _new_box_autoadd_secp_256_k_1_sign_with_seed_req_0Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer - Function()>>('new_box_autoadd_secp_256_k_1_sign_with_seed_req_0'); - late final _new_box_autoadd_secp_256_k_1_sign_with_seed_req_0 = - _new_box_autoadd_secp_256_k_1_sign_with_seed_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer - new_box_autoadd_secp_256_k_1_verify_req_0() { - return _new_box_autoadd_secp_256_k_1_verify_req_0(); - } - - late final _new_box_autoadd_secp_256_k_1_verify_req_0Ptr = _lookup< - ffi.NativeFunction Function()>>( - 'new_box_autoadd_secp_256_k_1_verify_req_0'); - late final _new_box_autoadd_secp_256_k_1_verify_req_0 = - _new_box_autoadd_secp_256_k_1_verify_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer new_box_autoadd_seed_to_key_req_0() { - return _new_box_autoadd_seed_to_key_req_0(); - } - - late final _new_box_autoadd_seed_to_key_req_0Ptr = - _lookup Function()>>( - 'new_box_autoadd_seed_to_key_req_0'); - late final _new_box_autoadd_seed_to_key_req_0 = - _new_box_autoadd_seed_to_key_req_0Ptr - .asFunction Function()>(); - - ffi.Pointer new_box_autoadd_u8_0( - int value, - ) { - return _new_box_autoadd_u8_0( - value, - ); - } - - late final _new_box_autoadd_u8_0Ptr = - _lookup Function(ffi.Uint8)>>( - 'new_box_autoadd_u8_0'); - late final _new_box_autoadd_u8_0 = _new_box_autoadd_u8_0Ptr - .asFunction Function(int)>(); - - ffi.Pointer new_uint_8_list_0( - int len, - ) { - return _new_uint_8_list_0( - len, - ); - } - - late final _new_uint_8_list_0Ptr = _lookup< - ffi.NativeFunction< - ffi.Pointer Function( - ffi.Int32)>>('new_uint_8_list_0'); - late final _new_uint_8_list_0 = _new_uint_8_list_0Ptr - .asFunction Function(int)>(); - - void free_WireSyncReturn( - WireSyncReturn ptr, - ) { - return _free_WireSyncReturn( - ptr, - ); - } - - late final _free_WireSyncReturnPtr = - _lookup>( - 'free_WireSyncReturn'); - late final _free_WireSyncReturn = - _free_WireSyncReturnPtr.asFunction(); -} - -final class _Dart_Handle extends ffi.Opaque {} - -final class wire_uint_8_list extends ffi.Struct { - external ffi.Pointer ptr; - - @ffi.Int32() - external int len; -} - -final class wire_PhraseToSeedReq extends ffi.Struct { - external ffi.Pointer phrase; - - external ffi.Pointer password; -} - -final class wire_SeedToKeyReq extends ffi.Struct { - external ffi.Pointer seed; - - external ffi.Pointer path; -} - -final class wire_BLSVerifyReq extends ffi.Struct { - external ffi.Pointer signature; - - external ffi.Pointer message; - - external ffi.Pointer public_key; -} - -final class wire_ED25519FromSeedReq extends ffi.Struct { - external ffi.Pointer seed; -} - -final class wire_ED25519SignReq extends ffi.Struct { - external ffi.Pointer seed; - - external ffi.Pointer message; -} - -final class wire_ED25519VerifyReq extends ffi.Struct { - external ffi.Pointer sig; - - external ffi.Pointer message; - - external ffi.Pointer pub_key; -} - -final class wire_Secp256k1FromSeedReq extends ffi.Struct { - external ffi.Pointer seed; -} - -final class wire_Secp256k1SignWithSeedReq extends ffi.Struct { - external ffi.Pointer msg; - - external ffi.Pointer seed; -} - -final class wire_Secp256k1VerifyReq extends ffi.Struct { - external ffi.Pointer message_hash; - - external ffi.Pointer signature_bytes; - - external ffi.Pointer public_key_bytes; -} - -final class wire_Secp256k1ShareSecretReq extends ffi.Struct { - external ffi.Pointer seed; - - external ffi.Pointer public_key_raw_bytes; -} - -final class wire_Secp256k1RecoverReq extends ffi.Struct { - external ffi.Pointer message_pre_hashed; - - external ffi.Pointer signature_bytes; - - external ffi.Pointer chain_id; -} - -final class wire_P256FromSeedReq extends ffi.Struct { - external ffi.Pointer seed; -} - -final class wire_P256SignWithSeedReq extends ffi.Struct { - external ffi.Pointer msg; - - external ffi.Pointer seed; -} - -final class wire_P256VerifyReq extends ffi.Struct { - external ffi.Pointer message_hash; - - external ffi.Pointer signature_bytes; - - external ffi.Pointer public_key_bytes; -} - -final class wire_P256ShareSecretReq extends ffi.Struct { - external ffi.Pointer seed; - - external ffi.Pointer public_key_raw_bytes; -} - -final class wire_SchnorrFromSeedReq extends ffi.Struct { - external ffi.Pointer seed; -} - -final class wire_SchnorrSignWithSeedReq extends ffi.Struct { - external ffi.Pointer msg; - - external ffi.Pointer seed; - - external ffi.Pointer aux_rand; -} - -final class wire_SchnorrVerifyReq extends ffi.Struct { - external ffi.Pointer message_hash; - - external ffi.Pointer signature_bytes; - - external ffi.Pointer public_key_bytes; -} - -final class wire_AesEncryptReq extends ffi.Struct { - external ffi.Pointer key; - - external ffi.Pointer iv; - - external ffi.Pointer message; -} - -final class wire_AesDecryptReq extends ffi.Struct { - external ffi.Pointer key; - - external ffi.Pointer iv; - - external ffi.Pointer cipher_text; -} - -final class wire_PBKDFDeriveReq extends ffi.Struct { - external ffi.Pointer password; - - external ffi.Pointer salt; - - @ffi.Uint32() - external int c; -} - -final class wire_ScriptDeriveReq extends ffi.Struct { - external ffi.Pointer password; - - external ffi.Pointer salt; - - @ffi.Uint32() - external int n; - - @ffi.Uint32() - external int p; - - @ffi.Uint32() - external int r; -} - -typedef DartPostCObjectFnType = ffi.Pointer< - ffi.NativeFunction< - ffi.Bool Function(DartPort port_id, ffi.Pointer message)>>; -typedef DartPort = ffi.Int64; - -const int ECB = 0; - -const int CBC = 1; - -const int CFB1 = 2; - -const int CFB2 = 3; - -const int CFB4 = 5; - -const int OFB1 = 14; - -const int OFB2 = 15; - -const int OFB4 = 17; - -const int OFB8 = 21; - -const int OFB16 = 29; - -const int CTR1 = 30; - -const int CTR2 = 31; - -const int CTR4 = 33; - -const int CTR8 = 37; - -const int CTR16 = 45; - -const int CHUNK = 64; - -const int MODBYTES = 48; - -const int BASEBITS = 58; - -const int NLEN = 7; - -const int DNLEN = 14; - -const int HBITS = 29; - -const int BIGBITS = 384; - -const int BLS_OK = 0; - -const int BLS_FAIL = -1; - -const int WEIERSTRASS = 0; - -const int EDWARDS = 1; - -const int MONTGOMERY = 2; - -const int NOT = 0; - -const int BN = 1; - -const int BLS12 = 2; - -const int BLS24 = 3; - -const int BLS48 = 4; - -const int D_TYPE = 0; - -const int M_TYPE = 1; - -const int POSITIVEX = 0; - -const int NEGATIVEX = 1; - -const int CURVETYPE = 0; - -const int CURVE_A = 0; - -const int CURVE_PAIRING_TYPE = 2; - -const int SEXTIC_TWIST = 1; - -const int SIGN_OF_X = 1; - -const int ATE_BITS = 65; - -const int G2_TABLE = 69; - -const int HTC_ISO = 11; - -const int HTC_ISO_G2 = 3; - -const int ALLOW_ALT_COMPRESS = 1; - -const int HASH_TYPE = 32; - -const int AESKEY = 16; - -const int NOT_SPECIAL = 0; - -const int PSEUDO_MERSENNE = 1; - -const int MONTGOMERY_FRIENDLY = 2; - -const int GENERALISED_MERSENNE = 3; - -const int NEGATOWER = 0; - -const int POSITOWER = 1; - -const int MODBITS = 381; - -const int PM1D2 = 1; - -const int RIADZ = 11; - -const int RIADZG2A = -2; - -const int RIADZG2B = -1; - -const int MODTYPE = 0; - -const int QNRI = 0; - -const int TOWER = 0; - -const int FEXCESS = 33554431; - -const int BIG_ENDIAN_SIGN = 0; - -const int ZERO = 0; - -const int ONE = 1; - -const int SPARSEST = 2; - -const int SPARSER = 3; - -const int SPARSE = 4; - -const int DENSE = 5; - -const int BAD_PARAMS = -11; - -const int INVALID_POINT = -14; - -const int WRONG_ORDER = -18; - -const int BAD_PIN = -19; - -const int MAXPIN = 10000; - -const int PBLEN = 14; - -const int CURVE_COF_I = 0; - -const int CURVE_B_I = 4; - -const int USE_GLV = 1; - -const int USE_GS_G2 = 1; - -const int USE_GS_GT = 1; - -const int GT_STRONG = 0; - -const int MC_SHA2 = 2; - -const int MC_SHA3 = 3; - -const int HASH224 = 28; - -const int HASH256 = 32; - -const int HASH384 = 48; - -const int HASH512 = 64; - -const int SHAKE128 = 16; - -const int SHAKE256 = 32; - -const int KEY_LENGTH = 32; - -const int KEY_LENGTH_AES = 16; - -const int BMASK = 2147483647; - -const int HMASK = 536870911; - -const int MCONST = 140737475470229501; diff --git a/lib/bridge/ffi/ffi_helper.dart b/lib/bridge/ffi/ffi_helper.dart deleted file mode 100644 index adb0371b..00000000 --- a/lib/bridge/ffi/ffi_helper.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'dart:ffi' show Abi, DynamicLibrary; -import 'dart:io' show Platform; - -import 'ffi_bridge.dart'; - -const _lib = 'agent_dart'; -const _package = _lib; - -final DynamicLibrary _dylib = () { - final isFlutterTest = Platform.environment['FLUTTER_TEST'] != null; - if (isFlutterTest) { - if (Platform.isMacOS) { - final abi = Abi.current() == Abi.macosArm64 - ? 'aarch64-apple-darwin' - : 'x86_64-apple-darwin'; - return DynamicLibrary.open('test/_dylib/$abi/lib$_lib.dylib'); - } else if (Platform.isLinux) { - return DynamicLibrary.open('test/_dylib/lib$_lib.so'); - } else if (Platform.isWindows) { - return DynamicLibrary.open('test/_dylib/$_lib.dll'); - } - throw UnsupportedError( - 'unsupported testing operating system ${Platform.operatingSystem}', - ); - } - - final libPath = switch (Platform.operatingSystem) { - 'macos' || 'ios' => '$_package.framework/$_package', - 'android' || 'linux' => 'lib$_lib.so', - 'windows' => '$_lib.dll', - _ => throw UnsupportedError( - 'unsupported operating system ${Platform.operatingSystem}', - ), - }; - return DynamicLibrary.open(libPath); -}(); - -class AgentDartFFI { - factory AgentDartFFI() => _instance; - - AgentDartFFI._(); - - static final AgentDartFFI _instance = AgentDartFFI._(); - - static AgentDartImpl get impl => _instance._impl; - late final AgentDartImpl _impl = AgentDartImpl(_dylib); -} diff --git a/lib/bridge/wasm_interop.dart b/lib/bridge/wasm_interop.dart deleted file mode 100644 index 326adaaa..00000000 --- a/lib/bridge/wasm_interop.dart +++ /dev/null @@ -1,764 +0,0 @@ -// ignore_for_file: sort_constructors_first, library_private_types_in_public_api -/// Dart wrapper for WebAssembly JavaScript API -@JS() -library wasm_interop; - -import 'dart:async'; -import 'dart:collection'; -import 'dart:typed_data'; -import 'package:js/js.dart'; -import 'package:js/js_util.dart'; -import 'package:meta/meta.dart'; - -/// Compiled WebAssembly module. -/// -/// A [Module] can be compiled from [Uint8List] or [ByteBuffer] source data. -/// When data length exceeds 4 KB, some runtimes may require asynchronous -/// compilation via [Module.fromBufferAsync] or [Module.fromBytesAsync]. -@immutable -class Module { - /// JavaScript `WebAssembly.Module` object - final _Module jsObject; - - const Module._(this.jsObject); - - /// Synchronously compiles WebAssembly [Module] from [Uint8List] source. - /// - /// Throws a [CompileError] on invalid module source. - /// Some runtimes do not allow synchronous compilation of modules - /// bigger than 4 KB in the main thread. In such case, an [ArgumentError] - /// will be thrown. - factory Module.fromBytes(Uint8List bytes) => Module._fromBytesOrBuffer(bytes); - - /// Synchronously compiles WebAssembly [Module] from [ByteBuffer] source. - /// - /// Throws a [CompileError] on invalid module source. - /// Some runtimes do not allow synchronous compilation of modules - /// bigger than 4 KB in the main thread. In such case, an [ArgumentError] - /// will be thrown. - factory Module.fromBuffer(ByteBuffer buffer) => - Module._fromBytesOrBuffer(buffer); - - factory Module._fromBytesOrBuffer(Object bytesOrbuffer) { - try { - return Module._(_Module(bytesOrbuffer)); - // ignore: avoid_catches_without_on_clauses - } catch (e) { - if (instanceof(e, _compileError)) { - throw CompileError(getProperty(e, 'message')); - } - rethrow; - } - } - - /// Builds and returns a list of module's export descriptors. - List get exports => _Module.exports(jsObject).cast(); - - /// Builds and returns a list of module's import descriptors. - List get imports => _Module.imports(jsObject).cast(); - - /// Returns a [List] of module's custom binary sections by [sectionName]. - List customSections(String sectionName) => - _Module.customSections(jsObject, sectionName).cast(); - - /// The equality operator. - /// - /// Returns true if and only if `this` and [other] wrap - /// the same `WebAssembly.Module` object. - @override - bool operator ==(Object other) => - other is Module && other.jsObject == jsObject; - - @override - int get hashCode => jsObject.hashCode; - - /// Asynchronously compiles WebAssembly [Module] from [Uint8List] source. - /// - /// Throws a [CompileError] on invalid module source. - static Future fromBytesAsync(Uint8List bytes) => - _fromBytesOrBufferAsync(bytes); - - /// Asynchronously compiles WebAssembly [Module] from [ByteBuffer] source. - /// - /// Throws a [CompileError] on invalid module source. - static Future fromBufferAsync(ByteBuffer buffer) => - _fromBytesOrBufferAsync(buffer); - - static Future _fromBytesOrBufferAsync(Object bytesOrBuffer) => - promiseToFuture<_Module>(_compile(bytesOrBuffer)) - .then((module) => Module._(module)) - .catchError( - (Object e) => throw CompileError(getProperty(e, 'message')), - test: (e) => instanceof(e, _compileError), - ); - - /// Returns `true` if provided WebAssembly [Uint8List] source is valid. - static bool validateBytes(Uint8List bytes) => _validate(bytes); - - /// Returns `true` if provided WebAssembly [ByteBuffer] source is valid. - static bool validateBuffer(ByteBuffer buffer) => _validate(buffer); -} - -/// Instantiated WebAssembly module. -/// -/// An [Instance] can be compiled and instantiated from [Uint8List] or -/// [ByteBuffer] source data, or from already compiled [Module]. -/// When data length exceeds 4 KB, some runtimes may require asynchronous -/// compilation and instantiation via [Instance.fromBufferAsync], -/// [Instance.fromBytesAsync], or [Instance.fromModuleAsync]. -@immutable -class Instance { - /// JavaScript `WebAssembly.Instance` object - final _Instance jsObject; - - /// WebAssembly [Module] this instance was instantiated from. - final Module module; - - final Map _functions = {}; - final Map _memories = {}; - final Map _tables = {}; - final Map _globals = {}; - - Instance._(this.jsObject, this.module) { - // Fill exports helper maps - final exportsObject = jsObject.exports; - for (final key in _objectKeys(exportsObject).cast()) { - final value = getProperty(exportsObject, key) as Object; - if (value is Function) { - _functions[key] = value; - } else if (value is _Memory && instanceof(value, _memoryConstructor)) { - _memories[key] = Memory._(value); - } else if (value is _Table && instanceof(value, _tableConstructor)) { - _tables[key] = Table._(value); - } else if (value is _Global && instanceof(value, _globalConstructor)) { - _globals[key] = Global._(value); - } - } - } - - /// Synchronously instantiates compiled WebAssembly [Module]. - /// - /// Some runtimes do not allow synchronous instantiation of modules - /// bigger than 4 KB in the main thread. - /// - /// Unexpected imports may cause a [LinkError]. - /// - /// A runtime exception in the start function (when present) will throw a - /// [RuntimeError]. - /// - /// Imports could be provided via either [importMap] parameter like this: - /// ``` - /// final importMap = { - /// 'env': { - /// 'log': allowInterop(print) - /// } - /// } - /// - /// final instance = Instance.fromModule(module, importMap: importMap); - /// ``` - /// - /// or via [importObject] parameter which must be a `JsObject`: - /// ``` - /// import 'package:js/js.dart'; - /// - /// @JS() - /// @anonymous - /// abstract class MyImports { - /// external factory MyImports({MyEnv env}); - /// } - /// - /// @JS() - /// @anonymous - /// abstract class MyEnv { - /// external factory MyEnv({Function log}); - /// } - /// - /// final importObject = MyImports(env: MyEnv(log: allowInterop(print))); - /// final instance = Instance.fromModule(module, importObject: importObject); - factory Instance.fromModule( - Module module, { - Map>? importMap, - Object? importObject, - }) { - try { - return Instance._( - _Instance(module.jsObject, _reifyImports(importMap, importObject)), - module, - ); - // ignore: avoid_catches_without_on_clauses - } catch (e) { - if (instanceof(e, _linkError)) { - throw LinkError(getProperty(e, 'message')); - } else if (instanceof(e, _runtimeError)) { - throw RuntimeError(getProperty(e, 'message')); - } - rethrow; - } - } - - /// A `JsObject` representing instantiated module's exports. - /// - /// This object may be directly cast to an anonymous JS class representing - /// the exported members to avoid accessing them via maps. - Object get exports => jsObject.exports; - - /// An unmodifiable [Map] view of instantiated module's exported functions. - Map get functions => UnmodifiableMapView(_functions); - - /// An unmodifiable [Map] view of instantiated module's exported memories. - Map get memories => UnmodifiableMapView(_memories); - - /// An unmodifiable [Map] view of instantiated module's exported tables. - Map get tables => UnmodifiableMapView(_tables); - - /// An unmodifiable [Map] view of instantiated module's exported globals. - Map get globals => UnmodifiableMapView(_globals); - - /// Asynchronously instantiates compiled WebAssembly [Module] with imports. - /// - /// See [Instance.fromModule] regarding [importMap] and [importObject] usage. - static Future fromModuleAsync( - Module module, { - Map>? importMap, - Object? importObject, - }) => - promiseToFuture<_Instance>( - _instantiateModule( - module.jsObject, - _reifyImports(importMap, importObject), - ), - ).then((instance) => Instance._(instance, module)).catchError((Object e) { - if (instanceof(e, _compileError)) { - throw CompileError(getProperty(e, 'message')); - } else if (instanceof(e, _linkError)) { - throw LinkError(getProperty(e, 'message')); - } else if (instanceof(e, _runtimeError)) { - throw RuntimeError(getProperty(e, 'message')); - } - // ignore: only_throw_errors - throw e; - }); - - /// Asynchronously compiles WebAssembly Module from [Uint8List] source and - /// instantiates it with imports. - /// - /// See [Instance.fromModule] regarding [importMap] and [importObject] usage. - static Future fromBytesAsync( - Uint8List bytes, { - Map>? importMap, - Object? importObject, - }) => - _fromBytesOfBufferAsync(bytes, _reifyImports(importMap, importObject)); - - /// Asynchronously compiles WebAssembly Module from [ByteBuffer] source and - /// instantiates it with imports. - /// - /// See [Instance.fromModule] regarding [importMap] and [importObject] usage. - static Future fromBufferAsync( - ByteBuffer buffer, { - Map>? importMap, - Object? importObject, - }) => - _fromBytesOfBufferAsync(buffer, _reifyImports(importMap, importObject)); - - static Future _fromBytesOfBufferAsync( - Object bytesOrBuffer, - Object imports, - ) => - promiseToFuture<_WebAssemblyInstantiatedSource>( - _instantiate(bytesOrBuffer, imports), - ) - .then( - (source) => Instance._(source.instance, Module._(source.module)), - ) - .catchError((Object e) { - if (instanceof(e, _compileError)) { - throw CompileError(getProperty(e, 'message')); - } else if (instanceof(e, _linkError)) { - throw LinkError(getProperty(e, 'message')); - } else if (instanceof(e, _runtimeError)) { - throw RuntimeError(getProperty(e, 'message')); - } - // ignore: only_throw_errors - throw e; - }); - - static Object _reifyImports( - Map>? importMap, - Object? importObject, - ) { - assert(importMap == null || importObject == null); - assert(importObject is! Map, 'importObject must be a JsObject.'); - if (importObject != null) { - return importObject; - } - if (importMap != null) { - final importObject = newObject() as Object; - importMap.forEach((moduleName, module) { - final moduleObject = newObject() as Object; - module.forEach((name, value) { - if (value is Function) { - setProperty(moduleObject, name, allowInterop(value)); - return; - } - if (value is num) { - setProperty(moduleObject, name, value); - return; - } - if (value is BigInt) { - setProperty(moduleObject, name, value.toJs()); - return; - } - if (value is Memory) { - setProperty(moduleObject, name, value.jsObject); - return; - } - if (value is Table) { - setProperty(moduleObject, name, value.jsObject); - return; - } - if (value is Global) { - setProperty(moduleObject, name, value.jsObject); - return; - } - assert( - false, - '$moduleName/$name value ($value) is of unsupported type.', - ); - }); - setProperty(importObject, moduleName, moduleObject); - }); - return importObject; - } - return _undefined; - } -} - -/// WebAssembly Memory instance. Could be shared between different instantiated -/// modules. -@immutable -class Memory { - /// JavaScript `WebAssembly.Memory` object - final _Memory jsObject; - - /// Creates a [Memory] of [initial] pages. One page is 65536 bytes. - /// - /// If provided, [maximum] must be greater than or equal to [initial]. - Memory({required int initial, int? maximum}) - : jsObject = _Memory(_descriptor(initial, maximum, false)); - - /// Creates a shared [Memory] of [initial] and [maximum] pages. One page is - /// 65536 bytes. - /// - /// [maximum] must be greater than or equal to [initial]. - Memory.shared({required int initial, required int maximum}) - : jsObject = _Memory(_descriptor(initial, maximum, true)); - - const Memory._(this.jsObject); - - /// Returns a [ByteBuffer] backing this memory object. - /// - /// Calling [grow] invalidates [buffer] reference. - ByteBuffer get buffer => jsObject.buffer; - - // https://github.com/dart-lang/sdk/issues/33527 - /// Returns a number of bytes of [ByteBuffer] backing this memory object. - int get lengthInBytes => getProperty(buffer, 'byteLength') as int; - - /// Returns a number of pages backing this memory object. - int get lengthInPages => lengthInBytes >> 16; - - /// Increases size of allocated memory by [delta] pages. One page is 65536 - /// bytes. Returns the original size before grow attempt. - /// - /// New memory size must not exceed `maximum` parameter if it was provided. - int grow(int delta) { - assert(delta >= 0); - return jsObject.grow(delta); - } - - /// The equality operator. - /// - /// Returns true if and only if `this` and [other] wrap - /// the same `WebAssembly.Memory` object. - @override - bool operator ==(Object other) => - other is Memory && other.jsObject == jsObject; - - @override - int get hashCode => jsObject.hashCode; - - static _MemoryDescriptor _descriptor(int initial, int? maximum, bool shared) { - assert(initial >= 0); - assert(maximum == null || maximum >= initial); - assert(!shared || maximum != null); - return _MemoryDescriptor( - initial: initial, - maximum: maximum ?? _undefined, - shared: shared ? true : _undefined, - ); - } -} - -/// WebAssembly Table instance. Could be shared between different instantiated -/// modules. -@immutable -class Table { - /// JavaScript `WebAssembly.Table` object - final _Table jsObject; - - /// Creates a [Table] of [initial] elements of `anyfunc` type. - /// - /// If provided, [maximum] must be greater than or equal to [initial]. If - /// provided, [value] must be a WebAssembly exported function and it will be - /// assigned to all table entries. - Table.funcref({required int initial, int? maximum, Object? value}) - : jsObject = _Table(_descriptor('anyfunc', initial, maximum), value); - - /// Creates a [Table] of [initial] elements of reference type. - /// - /// If provided, [maximum] must be greater than or equal to [initial]. If - /// provided, [value] will be assigned to all table entries. - Table.externref({required int initial, int? maximum, Object? value}) - : jsObject = _Table(_descriptor('externref', initial, maximum), value); - - const Table._(this.jsObject); - - static _TableDescriptor _descriptor( - String element, - int initial, - int? maximum, - ) { - assert(initial >= 0); - assert(maximum == null || maximum >= initial); - return _TableDescriptor( - element: element, - initial: initial, - maximum: maximum ?? _undefined, - ); - } - - /// Returns a table element by its index. - Object? operator [](int index) => jsObject.get(index); - - /// Sets a table element by its index. - void operator []=(int index, Object? value) => jsObject.set(index, value); - - /// Returns the size of [Table]. - int get length => jsObject.length; - - /// Grow the table by [delta] elements. Returns the previous length of the - /// table. New memory size must not exceed `maximum` parameter if it was - /// provided. - int grow(int delta) => jsObject.grow(delta); - - /// The equality operator. - /// - /// Returns true if and only if `this` and [other] wrap - /// the same `WebAssembly.Table` object. - @override - bool operator ==(Object other) => - other is Table && other.jsObject == jsObject; - - @override - int get hashCode => jsObject.hashCode; -} - -/// WebAssembly Global instance. Could be shared between different instantiated -/// modules. -@immutable -class Global { - /// JavaScript `WebAssembly.Global` object - final _Global jsObject; - - /// Creates a [Global] of 32-bit integer type with [value]. - Global.i32({int value = 0, bool mutable = false}) - : jsObject = _Global(_descriptor('i32', mutable), value); - - /// Creates a [Global] of 64-bit integer type with [value]. - Global.i64({BigInt? value, bool mutable = false}) - : jsObject = - _Global(_descriptor('i64', mutable), (value ?? BigInt.zero).toJs()); - - /// Creates a [Global] of single-precision floating point type with [value]. - Global.f32({double value = 0, bool mutable = false}) - : jsObject = _Global(_descriptor('f32', mutable), value); - - /// Creates a [Global] of double-precision floating point type with [value]. - Global.f64({double value = 0, bool mutable = false}) - : jsObject = _Global(_descriptor('f64', mutable), value); - - /// Creates a [Global] of `externref` type with [value]. - Global.externref({Object? value, bool mutable = false}) - : jsObject = _Global(_descriptor('externref', mutable), value); - - const Global._(this.jsObject); - - /// Returns a value stored in [Global]. - /// - /// Automatically converts BigInt values between Dart and JS. - Object? get value { - final v = jsObject.value; - return v != null && JsBigInt.isJsBigInt(v) ? JsBigInt.toBigInt(v) : v; - } - - /// Sets a value stored in [Global]. Attempting to set a value when [Global] - /// is immutable will cause a runtime error. - /// - /// Automatically converts BigInt values between Dart and JS. - set value(Object? value) { - jsObject.value = value is BigInt ? value.toJs() : value; - } - - /// The equality operator. - /// - /// Returns true if and only if `this` and [other] wrap - /// the same `WebAssembly.Global` object. - @override - bool operator ==(Object other) => - other is Global && other.jsObject == jsObject; - - @override - int get hashCode => jsObject.hashCode; - - static _GlobalDescriptor _descriptor(String value, bool mutable) => - _GlobalDescriptor(value: value, mutable: mutable); -} - -/// BigInt interop -extension JsBigInt on BigInt { - /// Convert to JavaScript `BigInt`. - Object toJs() => _jsBigInt(toString()); - - /// Create from JavaScript `BigInt`. - static BigInt toBigInt(Object jsBigInt) => - BigInt.parse(callMethod(jsBigInt, 'toString', const []) as String); - - /// Returns `true` when the argument is a JavaScript `BigInt` value. - static bool isJsBigInt(Object o) => - getProperty(getProperty(o, 'constructor') as Object, 'name') == 'BigInt'; -} - -@JS('BigInt') -external Object Function(String string) get _jsBigInt; - -/// WebAssembly IDL - -/// [Module] imports entry. -@JS() -@anonymous -abstract class ModuleImportDescriptor { - /// Name of imports module, not to confuse with [Module]. - external String get module; - - /// Name of imports entry. - external String get name; -} - -/// [Module] exports entry. -@JS() -@anonymous -abstract class ModuleExportDescriptor { - /// Name of exports entry. - external String get name; -} - -/// Extension converting `kind` string to enum. -extension ModuleImportDescriptorKind on ModuleImportDescriptor { - /// Kind of imports entry. - ImportExportKind get kind => _importExportKindMap[getProperty(this, 'kind')]!; -} - -/// Extension converting `kind` string to enum. -extension ModuleExportDescriptorKind on ModuleExportDescriptor { - /// Kind of exports entry. - ImportExportKind get kind => _importExportKindMap[getProperty(this, 'kind')]!; -} - -/// Possible kinds of import or export entries. -enum ImportExportKind { - /// [Function] - function, - - /// [Global] - global, - - /// [Memory] - memory, - - /// [Table] - table -} - -const _importExportKindMap = { - 'function': ImportExportKind.function, - 'global': ImportExportKind.global, - 'memory': ImportExportKind.memory, - 'table': ImportExportKind.table, -}; - -@JS() -@anonymous -abstract class _MemoryDescriptor { - external factory _MemoryDescriptor({ - required int initial, - Object maximum, - Object shared, - }); -} - -@JS() -@anonymous -abstract class _TableDescriptor { - external factory _TableDescriptor({ - required String element, - required int initial, - Object maximum, - }); -} - -@JS() -@anonymous -abstract class _GlobalDescriptor { - external factory _GlobalDescriptor({ - required String value, - bool mutable = false, - }); -} - -@JS() -@anonymous -abstract class _WebAssemblyInstantiatedSource { - external _Module get module; - - external _Instance get instance; -} - -@JS('WebAssembly.Memory') -external Function get _memoryConstructor; - -@JS('WebAssembly.Table') -external Function get _tableConstructor; - -@JS('WebAssembly.Global') -external Function get _globalConstructor; - -@JS('WebAssembly.validate') -external bool _validate(Object bytesOrBuffer); - -@JS('WebAssembly.compile') -external Object _compile(Object bytesOrBuffer); - -@JS('WebAssembly.instantiate') -external Object _instantiate(Object bytesOrBuffer, Object import); - -@JS('WebAssembly.instantiate') -external Object _instantiateModule(_Module module, Object import); - -@JS('WebAssembly.Module') -class _Module { - external _Module(Object bytesOfBuffer); - - // List<_ModuleExportDescriptor> - external static List exports(_Module module); - - // List<_ModuleImportDescriptor> - external static List imports(_Module module); - - // List - external static List customSections( - _Module module, - String sectionName, - ); -} - -@JS('WebAssembly.Instance') -class _Instance { - external _Instance(_Module module, Object import); - - external Object get exports; -} - -@JS('WebAssembly.Memory') -class _Memory { - external _Memory(_MemoryDescriptor descriptor); - - external ByteBuffer get buffer; - - external int grow(int delta); -} - -@JS('WebAssembly.Table') -class _Table { - external _Table(_TableDescriptor descriptor, Object? value); - - external int grow(int delta); - - external Object? get(int index); - - external void set(int index, Object? value); - - external int get length; -} - -@JS('WebAssembly.Global') -class _Global { - external _Global(_GlobalDescriptor descriptor, Object? v); - - external Object? get value; - - external set value(Object? v); -} - -/// This object is thrown when an exception occurs during compilation. -class CompileError extends Error { - /// Create a new [CompileError] with the given [message]. - CompileError(this.message); - - /// Message describing the problem. - final Object? message; - - @override - String toString() => Error.safeToString(message); -} - -/// This object is thrown when an exception occurs during linking. -class LinkError extends Error { - /// Create a new [LinkError] with the given [message]. - LinkError(this.message); - - /// Message describing the problem. - final Object? message; - - @override - String toString() => Error.safeToString(message); -} - -/// This object is thrown when an exception occurs during runtime. -class RuntimeError extends Error { - /// Create a new [RuntimeError] with the given [message]. - RuntimeError(this.message); - - /// Message describing the problem. - final Object? message; - - @override - String toString() => Error.safeToString(message); -} - -@JS('WebAssembly.CompileError') -external Function get _compileError; - -@JS('WebAssembly.LinkError') -external Function get _linkError; - -@JS('WebAssembly.RuntimeError') -external Function get _runtimeError; - -/// Special JS `undefined` value -@JS('undefined') -external Object get _undefined; - -/// Returns a list of JS object's fields -@JS('Object.keys') -external List _objectKeys(Object value); diff --git a/lib/protobuf/ic_base_types/pb/v1/types.pbenum.dart b/lib/protobuf/ic_base_types/pb/v1/types.pbenum.dart deleted file mode 100644 index 7a5a3ca3..00000000 --- a/lib/protobuf/ic_base_types/pb/v1/types.pbenum.dart +++ /dev/null @@ -1,10 +0,0 @@ -// -// Generated code. Do not modify. -// source: ic_base_types/pb/v1/types.proto -// -// @dart = 2.12 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import diff --git a/lib/protobuf/ic_base_types/pb/v1/types.pbserver.dart b/lib/protobuf/ic_base_types/pb/v1/types.pbserver.dart deleted file mode 100644 index 85ea2055..00000000 --- a/lib/protobuf/ic_base_types/pb/v1/types.pbserver.dart +++ /dev/null @@ -1,13 +0,0 @@ -// -// Generated code. Do not modify. -// source: ic_base_types/pb/v1/types.proto -// -// @dart = 2.12 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names -// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import - -export 'types.pb.dart'; diff --git a/lib/protobuf/ic_ledger/pb/v1/types.pbenum.dart b/lib/protobuf/ic_ledger/pb/v1/types.pbenum.dart deleted file mode 100644 index 0da66b76..00000000 --- a/lib/protobuf/ic_ledger/pb/v1/types.pbenum.dart +++ /dev/null @@ -1,10 +0,0 @@ -// -// Generated code. Do not modify. -// source: ic_ledger/pb/v1/types.proto -// -// @dart = 2.12 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import diff --git a/lib/protobuf/ic_ledger/pb/v1/types.pbserver.dart b/lib/protobuf/ic_ledger/pb/v1/types.pbserver.dart deleted file mode 100644 index c92168d2..00000000 --- a/lib/protobuf/ic_ledger/pb/v1/types.pbserver.dart +++ /dev/null @@ -1,13 +0,0 @@ -// -// Generated code. Do not modify. -// source: ic_ledger/pb/v1/types.proto -// -// @dart = 2.12 - -// ignore_for_file: annotate_overrides, camel_case_types, comment_references -// ignore_for_file: constant_identifier_names -// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes -// ignore_for_file: non_constant_identifier_names, prefer_final_fields -// ignore_for_file: unnecessary_import, unnecessary_this, unused_import - -export 'types.pb.dart'; diff --git a/linux/.gitignore b/linux/.gitignore deleted file mode 100644 index 7e39ecca..00000000 --- a/linux/.gitignore +++ /dev/null @@ -1 +0,0 @@ -agent_dart-v*/ diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt deleted file mode 100644 index 78c858f7..00000000 --- a/linux/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -set(LibraryVersion "agent_dart-v1.0.0") # generated; do not edit - -# The Flutter tooling requires that developers have CMake 3.10 or later -# installed. You should not increase this version, as doing so will cause -# the plugin to fail to compile for some customers of the plugin. -cmake_minimum_required(VERSION 3.10) - -# Project-level configuration. -set(PROJECT_NAME "agent_dart") # Should match the name field in the pubspec.yaml. -project(${PROJECT_NAME} LANGUAGES CXX) - -# Download the binaries if they are not already present. -set(LibRoot "${CMAKE_CURRENT_SOURCE_DIR}/${LibraryVersion}") -set(ArchivePath "${LibRoot}.tar.gz") -if(NOT EXISTS ${ArchivePath}) - file(DOWNLOAD - "https://github.com/AstroxNetwork/agent_dart/releases/download/${LibraryVersion}/linux.tar.gz" - ${ArchivePath} - TLS_VERIFY ON - ) -endif() - -# Extract the binaries, overriding any already present. -file(REMOVE_RECURSE ${LibRoot}) -file(MAKE_DIRECTORY ${LibRoot}) -execute_process( - COMMAND ${CMAKE_COMMAND} -E tar xzf ${ArchivePath} - WORKING_DIRECTORY ${LibRoot} -) - -set(LIBRARY_NAME "agent_dart") # Should match the library name you used to generate. -# List of absolute paths to libraries that should be bundled with the plugin. -# This list could contain prebuilt libraries, or libraries created by an -# external build triggered from this build file. -set(${PROJECT_NAME}_bundled_libraries - "${LibRoot}/${FLUTTER_TARGET_PLATFORM}/lib${LIBRARY_NAME}.so" - PARENT_SCOPE -) diff --git a/linux/agent_dart-v1.0.0.tar.gz b/linux/agent_dart-v1.0.0.tar.gz deleted file mode 100644 index 4eeeb145..00000000 Binary files a/linux/agent_dart-v1.0.0.tar.gz and /dev/null differ diff --git a/linux/agent_dart_plugin.cc b/linux/agent_dart_plugin.cc deleted file mode 100644 index 2a862ba2..00000000 --- a/linux/agent_dart_plugin.cc +++ /dev/null @@ -1,70 +0,0 @@ -#include "include/agent_dart/agent_dart_plugin.h" - -#include -#include -#include - -#include - -#define AGENT_DART_PLUGIN(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj), agent_dart_plugin_get_type(), \ - AgentDartPlugin)) - -struct _AgentDartPlugin { - GObject parent_instance; -}; - -G_DEFINE_TYPE(AgentDartPlugin, agent_dart_plugin, g_object_get_type()) - -// Called when a method call is received from Flutter. -static void agent_dart_plugin_handle_method_call( - AgentDartPlugin* self, - FlMethodCall* method_call) { - g_autoptr(FlMethodResponse) response = nullptr; - - const gchar* method = fl_method_call_get_name(method_call); - - if (strcmp(method, "getPlatformVersion") == 0) { - struct utsname uname_data = {}; - uname(&uname_data); - g_autofree gchar *version = g_strdup_printf("Linux %s", uname_data.version); - g_autoptr(FlValue) result = fl_value_new_string(version); - response = FL_METHOD_RESPONSE(fl_method_success_response_new(result)); - } else { - response = FL_METHOD_RESPONSE(fl_method_not_implemented_response_new()); - } - - fl_method_call_respond(method_call, response, nullptr); -} - -static void agent_dart_plugin_dispose(GObject* object) { - G_OBJECT_CLASS(agent_dart_plugin_parent_class)->dispose(object); -} - -static void agent_dart_plugin_class_init(AgentDartPluginClass* klass) { - G_OBJECT_CLASS(klass)->dispose = agent_dart_plugin_dispose; -} - -static void agent_dart_plugin_init(AgentDartPlugin* self) {} - -static void method_call_cb(FlMethodChannel* channel, FlMethodCall* method_call, - gpointer user_data) { - AgentDartPlugin* plugin = AGENT_DART_PLUGIN(user_data); - agent_dart_plugin_handle_method_call(plugin, method_call); -} - -void agent_dart_plugin_register_with_registrar(FlPluginRegistrar* registrar) { - AgentDartPlugin* plugin = AGENT_DART_PLUGIN( - g_object_new(agent_dart_plugin_get_type(), nullptr)); - - g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new(); - g_autoptr(FlMethodChannel) channel = - fl_method_channel_new(fl_plugin_registrar_get_messenger(registrar), - "agent_dart", - FL_METHOD_CODEC(codec)); - fl_method_channel_set_method_call_handler(channel, method_call_cb, - g_object_ref(plugin), - g_object_unref); - - g_object_unref(plugin); -} diff --git a/linux/include/agent_dart/agent_dart_plugin.h b/linux/include/agent_dart/agent_dart_plugin.h deleted file mode 100644 index 2e22f62b..00000000 --- a/linux/include/agent_dart/agent_dart_plugin.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef FLUTTER_PLUGIN_AGENT_DART_PLUGIN_H_ -#define FLUTTER_PLUGIN_AGENT_DART_PLUGIN_H_ - -#include - -G_BEGIN_DECLS - -#ifdef FLUTTER_PLUGIN_IMPL -#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default"))) -#else -#define FLUTTER_PLUGIN_EXPORT -#endif - -typedef struct _AgentDartPlugin AgentDartPlugin; -typedef struct { - GObjectClass parent_class; -} AgentDartPluginClass; - -FLUTTER_PLUGIN_EXPORT GType agent_dart_plugin_get_type(); - -FLUTTER_PLUGIN_EXPORT void agent_dart_plugin_register_with_registrar( - FlPluginRegistrar* registrar); - -G_END_DECLS - -#endif // FLUTTER_PLUGIN_AGENT_DART_PLUGIN_H_ diff --git a/macos/.gitignore b/macos/.gitignore deleted file mode 100644 index 43a681bb..00000000 --- a/macos/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Frameworks/AgentDart.xcframework diff --git a/macos/Classes/EnforceBundling.swift b/macos/Classes/EnforceBundling.swift deleted file mode 100644 index f95cacb9..00000000 --- a/macos/Classes/EnforceBundling.swift +++ /dev/null @@ -1,4 +0,0 @@ -public func dummyMethodToEnforceBundling() -> Int64 { - return dummy_method_to_enforce_bundling() -} -let dummyVar = dummyMethodToEnforceBundling(); diff --git a/macos/Classes/bridge_generated.h b/macos/Classes/bridge_generated.h deleted file mode 100644 index 1c22a210..00000000 --- a/macos/Classes/bridge_generated.h +++ /dev/null @@ -1,522 +0,0 @@ -#include -#include -#include -typedef struct _Dart_Handle* Dart_Handle; - -#define ECB 0 - -#define CBC 1 - -#define CFB1 2 - -#define CFB2 3 - -#define CFB4 5 - -#define OFB1 14 - -#define OFB2 15 - -#define OFB4 17 - -#define OFB8 21 - -#define OFB16 29 - -#define CTR1 30 - -#define CTR2 31 - -#define CTR4 33 - -#define CTR8 37 - -#define CTR16 45 - -#define CHUNK 64 - -#define MODBYTES 48 - -#define BASEBITS 58 - -#define NLEN (1 + (((8 * MODBYTES) - 1) / BASEBITS)) - -#define DNLEN (2 * NLEN) - -#define HBITS (BASEBITS / 2) - - - -#define BIGBITS (MODBYTES * 8) - - - - - -#define BLS_OK 0 - -#define BLS_FAIL -1 - -#define WEIERSTRASS 0 - -#define EDWARDS 1 - -#define MONTGOMERY 2 - -#define NOT 0 - -#define BN 1 - -#define BLS12 2 - -#define BLS24 3 - -#define BLS48 4 - -#define D_TYPE 0 - -#define M_TYPE 1 - -#define POSITIVEX 0 - -#define NEGATIVEX 1 - -#define CURVETYPE WEIERSTRASS - -#define CURVE_A 0 - -#define CURVE_PAIRING_TYPE BLS12 - -#define SEXTIC_TWIST M_TYPE - -#define SIGN_OF_X NEGATIVEX - -#define ATE_BITS 65 - -#define G2_TABLE 69 - -#define HTC_ISO 11 - -#define HTC_ISO_G2 3 - -#define ALLOW_ALT_COMPRESS true - -#define HASH_TYPE 32 - -#define AESKEY 16 - -#define NOT_SPECIAL 0 - -#define PSEUDO_MERSENNE 1 - -#define MONTGOMERY_FRIENDLY 2 - -#define GENERALISED_MERSENNE 3 - -#define NEGATOWER 0 - -#define POSITOWER 1 - -#define MODBITS 381 - -#define PM1D2 1 - -#define RIADZ 11 - -#define RIADZG2A -2 - -#define RIADZG2B -1 - -#define MODTYPE NOT_SPECIAL - -#define QNRI 0 - -#define TOWER NEGATOWER - -#define FEXCESS (((int32_t)1 << 25) - 1) - - - -#define BIG_ENDIAN_SIGN false - -#define ZERO 0 - -#define ONE 1 - -#define SPARSEST 2 - -#define SPARSER 3 - -#define SPARSE 4 - -#define DENSE 5 - - - - - -#define BAD_PARAMS -11 - -#define INVALID_POINT -14 - -#define WRONG_ORDER -18 - -#define BAD_PIN -19 - -#define MAXPIN 10000 - -#define PBLEN 14 - -#define CURVE_COF_I 0 - -#define CURVE_B_I 4 - -#define USE_GLV true - -#define USE_GS_G2 true - -#define USE_GS_GT true - -#define GT_STRONG false - -#define MC_SHA2 2 - -#define MC_SHA3 3 - -#define HASH224 28 - -#define HASH256 32 - -#define HASH384 48 - -#define HASH512 64 - -#define SHAKE128 16 - -#define SHAKE256 32 - -#define KEY_LENGTH 32 - -#define KEY_LENGTH_AES (KEY_LENGTH / 2) - -typedef struct DartCObject DartCObject; - -typedef int64_t DartPort; - -typedef bool (*DartPostCObjectFnType)(DartPort port_id, void *message); - -typedef struct wire_uint_8_list { - uint8_t *ptr; - int32_t len; -} wire_uint_8_list; - -typedef struct wire_PhraseToSeedReq { - struct wire_uint_8_list *phrase; - struct wire_uint_8_list *password; -} wire_PhraseToSeedReq; - -typedef struct wire_SeedToKeyReq { - struct wire_uint_8_list *seed; - struct wire_uint_8_list *path; -} wire_SeedToKeyReq; - -typedef struct wire_BLSVerifyReq { - struct wire_uint_8_list *signature; - struct wire_uint_8_list *message; - struct wire_uint_8_list *public_key; -} wire_BLSVerifyReq; - -typedef struct wire_ED25519FromSeedReq { - struct wire_uint_8_list *seed; -} wire_ED25519FromSeedReq; - -typedef struct wire_ED25519SignReq { - struct wire_uint_8_list *seed; - struct wire_uint_8_list *message; -} wire_ED25519SignReq; - -typedef struct wire_ED25519VerifyReq { - struct wire_uint_8_list *sig; - struct wire_uint_8_list *message; - struct wire_uint_8_list *pub_key; -} wire_ED25519VerifyReq; - -typedef struct wire_Secp256k1FromSeedReq { - struct wire_uint_8_list *seed; -} wire_Secp256k1FromSeedReq; - -typedef struct wire_Secp256k1SignWithSeedReq { - struct wire_uint_8_list *msg; - struct wire_uint_8_list *seed; -} wire_Secp256k1SignWithSeedReq; - -typedef struct wire_Secp256k1VerifyReq { - struct wire_uint_8_list *message_hash; - struct wire_uint_8_list *signature_bytes; - struct wire_uint_8_list *public_key_bytes; -} wire_Secp256k1VerifyReq; - -typedef struct wire_Secp256k1ShareSecretReq { - struct wire_uint_8_list *seed; - struct wire_uint_8_list *public_key_raw_bytes; -} wire_Secp256k1ShareSecretReq; - -typedef struct wire_Secp256k1RecoverReq { - struct wire_uint_8_list *message_pre_hashed; - struct wire_uint_8_list *signature_bytes; - uint8_t *chain_id; -} wire_Secp256k1RecoverReq; - -typedef struct wire_P256FromSeedReq { - struct wire_uint_8_list *seed; -} wire_P256FromSeedReq; - -typedef struct wire_P256SignWithSeedReq { - struct wire_uint_8_list *msg; - struct wire_uint_8_list *seed; -} wire_P256SignWithSeedReq; - -typedef struct wire_P256VerifyReq { - struct wire_uint_8_list *message_hash; - struct wire_uint_8_list *signature_bytes; - struct wire_uint_8_list *public_key_bytes; -} wire_P256VerifyReq; - -typedef struct wire_P256ShareSecretReq { - struct wire_uint_8_list *seed; - struct wire_uint_8_list *public_key_raw_bytes; -} wire_P256ShareSecretReq; - -typedef struct wire_SchnorrFromSeedReq { - struct wire_uint_8_list *seed; -} wire_SchnorrFromSeedReq; - -typedef struct wire_SchnorrSignWithSeedReq { - struct wire_uint_8_list *msg; - struct wire_uint_8_list *seed; - struct wire_uint_8_list *aux_rand; -} wire_SchnorrSignWithSeedReq; - -typedef struct wire_SchnorrVerifyReq { - struct wire_uint_8_list *message_hash; - struct wire_uint_8_list *signature_bytes; - struct wire_uint_8_list *public_key_bytes; -} wire_SchnorrVerifyReq; - -typedef struct wire_AesEncryptReq { - struct wire_uint_8_list *key; - struct wire_uint_8_list *iv; - struct wire_uint_8_list *message; -} wire_AesEncryptReq; - -typedef struct wire_AesDecryptReq { - struct wire_uint_8_list *key; - struct wire_uint_8_list *iv; - struct wire_uint_8_list *cipher_text; -} wire_AesDecryptReq; - -typedef struct wire_PBKDFDeriveReq { - struct wire_uint_8_list *password; - struct wire_uint_8_list *salt; - uint32_t c; -} wire_PBKDFDeriveReq; - -typedef struct wire_ScriptDeriveReq { - struct wire_uint_8_list *password; - struct wire_uint_8_list *salt; - uint32_t n; - uint32_t p; - uint32_t r; -} wire_ScriptDeriveReq; - -typedef struct DartCObject *WireSyncReturn; - -typedef int64_t Chunk; - -#define BMASK ((1 << BASEBITS) - 1) - -#define HMASK ((1 << HBITS) - 1) - - - -#define TMASK ((1 << TBITS) - 1) - -#define MCONST 140737475470229501 - -void store_dart_post_cobject(DartPostCObjectFnType ptr); - -Dart_Handle get_dart_object(uintptr_t ptr); - -void drop_dart_object(uintptr_t ptr); - -uintptr_t new_dart_opaque(Dart_Handle handle); - -intptr_t init_frb_dart_api_dl(void *obj); - -void wire_mnemonic_phrase_to_seed(int64_t port_, struct wire_PhraseToSeedReq *req); - -void wire_mnemonic_seed_to_key(int64_t port_, struct wire_SeedToKeyReq *req); - -void wire_bls_init(int64_t port_); - -void wire_bls_verify(int64_t port_, struct wire_BLSVerifyReq *req); - -void wire_ed25519_from_seed(int64_t port_, struct wire_ED25519FromSeedReq *req); - -void wire_ed25519_sign(int64_t port_, struct wire_ED25519SignReq *req); - -void wire_ed25519_verify(int64_t port_, struct wire_ED25519VerifyReq *req); - -void wire_secp256k1_from_seed(int64_t port_, struct wire_Secp256k1FromSeedReq *req); - -void wire_secp256k1_sign(int64_t port_, struct wire_Secp256k1SignWithSeedReq *req); - -void wire_secp256k1_sign_recoverable(int64_t port_, struct wire_Secp256k1SignWithSeedReq *req); - -void wire_secp256k1_verify(int64_t port_, struct wire_Secp256k1VerifyReq *req); - -void wire_secp256k1_get_shared_secret(int64_t port_, struct wire_Secp256k1ShareSecretReq *req); - -void wire_secp256k1_recover(int64_t port_, struct wire_Secp256k1RecoverReq *req); - -void wire_p256_from_seed(int64_t port_, struct wire_P256FromSeedReq *req); - -void wire_p256_sign(int64_t port_, struct wire_P256SignWithSeedReq *req); - -void wire_p256_verify(int64_t port_, struct wire_P256VerifyReq *req); - -void wire_p256_get_shared_secret(int64_t port_, struct wire_P256ShareSecretReq *req); - -void wire_schnorr_from_seed(int64_t port_, struct wire_SchnorrFromSeedReq *req); - -void wire_schnorr_sign(int64_t port_, struct wire_SchnorrSignWithSeedReq *req); - -void wire_schnorr_verify(int64_t port_, struct wire_SchnorrVerifyReq *req); - -void wire_aes_128_ctr_encrypt(int64_t port_, struct wire_AesEncryptReq *req); - -void wire_aes_128_ctr_decrypt(int64_t port_, struct wire_AesDecryptReq *req); - -void wire_aes_256_cbc_encrypt(int64_t port_, struct wire_AesEncryptReq *req); - -void wire_aes_256_cbc_decrypt(int64_t port_, struct wire_AesDecryptReq *req); - -void wire_aes_256_gcm_encrypt(int64_t port_, struct wire_AesEncryptReq *req); - -void wire_aes_256_gcm_decrypt(int64_t port_, struct wire_AesDecryptReq *req); - -void wire_pbkdf2_derive_key(int64_t port_, struct wire_PBKDFDeriveReq *req); - -void wire_scrypt_derive_key(int64_t port_, struct wire_ScriptDeriveReq *req); - -struct wire_AesDecryptReq *new_box_autoadd_aes_decrypt_req_0(void); - -struct wire_AesEncryptReq *new_box_autoadd_aes_encrypt_req_0(void); - -struct wire_BLSVerifyReq *new_box_autoadd_bls_verify_req_0(void); - -struct wire_ED25519FromSeedReq *new_box_autoadd_ed_25519_from_seed_req_0(void); - -struct wire_ED25519SignReq *new_box_autoadd_ed_25519_sign_req_0(void); - -struct wire_ED25519VerifyReq *new_box_autoadd_ed_25519_verify_req_0(void); - -struct wire_P256FromSeedReq *new_box_autoadd_p_256_from_seed_req_0(void); - -struct wire_P256ShareSecretReq *new_box_autoadd_p_256_share_secret_req_0(void); - -struct wire_P256SignWithSeedReq *new_box_autoadd_p_256_sign_with_seed_req_0(void); - -struct wire_P256VerifyReq *new_box_autoadd_p_256_verify_req_0(void); - -struct wire_PBKDFDeriveReq *new_box_autoadd_pbkdf_derive_req_0(void); - -struct wire_PhraseToSeedReq *new_box_autoadd_phrase_to_seed_req_0(void); - -struct wire_SchnorrFromSeedReq *new_box_autoadd_schnorr_from_seed_req_0(void); - -struct wire_SchnorrSignWithSeedReq *new_box_autoadd_schnorr_sign_with_seed_req_0(void); - -struct wire_SchnorrVerifyReq *new_box_autoadd_schnorr_verify_req_0(void); - -struct wire_ScriptDeriveReq *new_box_autoadd_script_derive_req_0(void); - -struct wire_Secp256k1FromSeedReq *new_box_autoadd_secp_256_k_1_from_seed_req_0(void); - -struct wire_Secp256k1RecoverReq *new_box_autoadd_secp_256_k_1_recover_req_0(void); - -struct wire_Secp256k1ShareSecretReq *new_box_autoadd_secp_256_k_1_share_secret_req_0(void); - -struct wire_Secp256k1SignWithSeedReq *new_box_autoadd_secp_256_k_1_sign_with_seed_req_0(void); - -struct wire_Secp256k1VerifyReq *new_box_autoadd_secp_256_k_1_verify_req_0(void); - -struct wire_SeedToKeyReq *new_box_autoadd_seed_to_key_req_0(void); - -uint8_t *new_box_autoadd_u8_0(uint8_t value); - -struct wire_uint_8_list *new_uint_8_list_0(int32_t len); - -void free_WireSyncReturn(WireSyncReturn ptr); - -static int64_t dummy_method_to_enforce_bundling(void) { - int64_t dummy_var = 0; - dummy_var ^= ((int64_t) (void*) wire_mnemonic_phrase_to_seed); - dummy_var ^= ((int64_t) (void*) wire_mnemonic_seed_to_key); - dummy_var ^= ((int64_t) (void*) wire_bls_init); - dummy_var ^= ((int64_t) (void*) wire_bls_verify); - dummy_var ^= ((int64_t) (void*) wire_ed25519_from_seed); - dummy_var ^= ((int64_t) (void*) wire_ed25519_sign); - dummy_var ^= ((int64_t) (void*) wire_ed25519_verify); - dummy_var ^= ((int64_t) (void*) wire_secp256k1_from_seed); - dummy_var ^= ((int64_t) (void*) wire_secp256k1_sign); - dummy_var ^= ((int64_t) (void*) wire_secp256k1_sign_recoverable); - dummy_var ^= ((int64_t) (void*) wire_secp256k1_verify); - dummy_var ^= ((int64_t) (void*) wire_secp256k1_get_shared_secret); - dummy_var ^= ((int64_t) (void*) wire_secp256k1_recover); - dummy_var ^= ((int64_t) (void*) wire_p256_from_seed); - dummy_var ^= ((int64_t) (void*) wire_p256_sign); - dummy_var ^= ((int64_t) (void*) wire_p256_verify); - dummy_var ^= ((int64_t) (void*) wire_p256_get_shared_secret); - dummy_var ^= ((int64_t) (void*) wire_schnorr_from_seed); - dummy_var ^= ((int64_t) (void*) wire_schnorr_sign); - dummy_var ^= ((int64_t) (void*) wire_schnorr_verify); - dummy_var ^= ((int64_t) (void*) wire_aes_128_ctr_encrypt); - dummy_var ^= ((int64_t) (void*) wire_aes_128_ctr_decrypt); - dummy_var ^= ((int64_t) (void*) wire_aes_256_cbc_encrypt); - dummy_var ^= ((int64_t) (void*) wire_aes_256_cbc_decrypt); - dummy_var ^= ((int64_t) (void*) wire_aes_256_gcm_encrypt); - dummy_var ^= ((int64_t) (void*) wire_aes_256_gcm_decrypt); - dummy_var ^= ((int64_t) (void*) wire_pbkdf2_derive_key); - dummy_var ^= ((int64_t) (void*) wire_scrypt_derive_key); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_aes_decrypt_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_aes_encrypt_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_bls_verify_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_ed_25519_from_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_ed_25519_sign_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_ed_25519_verify_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_p_256_from_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_p_256_share_secret_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_p_256_sign_with_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_p_256_verify_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_pbkdf_derive_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_phrase_to_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_schnorr_from_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_schnorr_sign_with_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_schnorr_verify_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_script_derive_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_secp_256_k_1_from_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_secp_256_k_1_recover_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_secp_256_k_1_share_secret_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_secp_256_k_1_sign_with_seed_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_secp_256_k_1_verify_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_seed_to_key_req_0); - dummy_var ^= ((int64_t) (void*) new_box_autoadd_u8_0); - dummy_var ^= ((int64_t) (void*) new_uint_8_list_0); - dummy_var ^= ((int64_t) (void*) free_WireSyncReturn); - dummy_var ^= ((int64_t) (void*) store_dart_post_cobject); - dummy_var ^= ((int64_t) (void*) get_dart_object); - dummy_var ^= ((int64_t) (void*) drop_dart_object); - dummy_var ^= ((int64_t) (void*) new_dart_opaque); - return dummy_var; -} diff --git a/macos/Frameworks/agent_dart-v1.0.0.zip b/macos/Frameworks/agent_dart-v1.0.0.zip deleted file mode 100644 index cf78adc1..00000000 Binary files a/macos/Frameworks/agent_dart-v1.0.0.zip and /dev/null differ diff --git a/macos/agent_dart.podspec b/macos/agent_dart.podspec deleted file mode 100644 index 2bfa50cc..00000000 --- a/macos/agent_dart.podspec +++ /dev/null @@ -1,35 +0,0 @@ -release_tag_name = 'agent_dart-v1.0.0' # generated; do not edit - -# We cannot distribute the XCFramework alongside the library directly, -# so we have to fetch the correct version here. -framework_name = 'AgentDart.xcframework' -local_zip_name = "#{release_tag_name}.zip" -` -cd Frameworks - -if [ -f #{local_zip_name} ] -then - rm -rf #{framework_name} - unzip #{local_zip_name} -fi - -cd - -` - -Pod::Spec.new do |spec| - spec.name = 'agent_dart' - spec.version = '1.0.0' - spec.license = { :file => '../LICENSE' } - spec.homepage = 'https://github.com/AstroxNetwork/agent_dart' - spec.authors = { 'AstroX Dev' => 'dev@astrox.network' } - spec.summary = 'macOS Flutter bindings for agent_dart' - - spec.source = { :path => '.' } - spec.source_files = 'Classes/**/*' - spec.public_header_files = 'Classes/**/*.h' - spec.vendored_frameworks = "Frameworks/#{framework_name}" - spec.dependency 'FlutterMacOS' - - spec.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } - spec.osx.deployment_target = '10.15' -end diff --git a/melos.yaml b/melos.yaml new file mode 100644 index 00000000..d145466f --- /dev/null +++ b/melos.yaml @@ -0,0 +1,36 @@ +name: agent_dart_workspace +repository: https://github.com/AstroxNetwork/agent_dart + +packages: + - packages/** + +ignore: + - 'packages/agent_dart/cargokit/build_tool' + +ide: + intellij: + enabled: true + moduleNamePrefix: '' + +command: + bootstrap: + runPubGetInParallel: false + +scripts: + analyze: + exec: flutter analyze . + description: Analyze a specific package in this project. + + check-format: + exec: dart format --set-exit-if-changed . + description: Check the format of a specific package in this project. + + format: + exec: dart format . + description: Format a specific package in this project. + + publish-dry-run: + description: Publish dry-run all packages + exec: dart pub publish --dry-run + packageFilters: + noPrivate: true diff --git a/packages/agent_dart/.gitignore b/packages/agent_dart/.gitignore new file mode 100644 index 00000000..ef9bc8dc --- /dev/null +++ b/packages/agent_dart/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.packages +build/ diff --git a/packages/agent_dart/.metadata b/packages/agent_dart/.metadata new file mode 100644 index 00000000..4cbacfe9 --- /dev/null +++ b/packages/agent_dart/.metadata @@ -0,0 +1,42 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled. + +version: + revision: 135454af32477f815a7525073027a3ff9eff1bfd + channel: stable + +project_type: plugin_ffi + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 135454af32477f815a7525073027a3ff9eff1bfd + base_revision: 135454af32477f815a7525073027a3ff9eff1bfd + - platform: android + create_revision: 135454af32477f815a7525073027a3ff9eff1bfd + base_revision: 135454af32477f815a7525073027a3ff9eff1bfd + - platform: ios + create_revision: 135454af32477f815a7525073027a3ff9eff1bfd + base_revision: 135454af32477f815a7525073027a3ff9eff1bfd + - platform: linux + create_revision: 135454af32477f815a7525073027a3ff9eff1bfd + base_revision: 135454af32477f815a7525073027a3ff9eff1bfd + - platform: macos + create_revision: 135454af32477f815a7525073027a3ff9eff1bfd + base_revision: 135454af32477f815a7525073027a3ff9eff1bfd + - platform: windows + create_revision: 135454af32477f815a7525073027a3ff9eff1bfd + base_revision: 135454af32477f815a7525073027a3ff9eff1bfd + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/packages/agent_dart/CHANGELOG.md b/packages/agent_dart/CHANGELOG.md new file mode 120000 index 00000000..699cc9e7 --- /dev/null +++ b/packages/agent_dart/CHANGELOG.md @@ -0,0 +1 @@ +../../CHANGELOG.md \ No newline at end of file diff --git a/packages/agent_dart/LICENSE b/packages/agent_dart/LICENSE new file mode 120000 index 00000000..30cff740 --- /dev/null +++ b/packages/agent_dart/LICENSE @@ -0,0 +1 @@ +../../LICENSE \ No newline at end of file diff --git a/packages/agent_dart/README.md b/packages/agent_dart/README.md new file mode 120000 index 00000000..fe840054 --- /dev/null +++ b/packages/agent_dart/README.md @@ -0,0 +1 @@ +../../README.md \ No newline at end of file diff --git a/packages/agent_dart/agent_dart.iml b/packages/agent_dart/agent_dart.iml new file mode 100644 index 00000000..64d7623d --- /dev/null +++ b/packages/agent_dart/agent_dart.iml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/agent_dart/analysis_options.yaml b/packages/agent_dart/analysis_options.yaml new file mode 100644 index 00000000..98292077 --- /dev/null +++ b/packages/agent_dart/analysis_options.yaml @@ -0,0 +1,5 @@ +include: ../../analysis_options.yaml + +analyzer: + exclude: + - cargokit/build_tool/** diff --git a/packages/agent_dart/android/.gitignore b/packages/agent_dart/android/.gitignore new file mode 100644 index 00000000..4e6c8415 --- /dev/null +++ b/packages/agent_dart/android/.gitignore @@ -0,0 +1,13 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +/.cxx + +# Ignore Rust binaries +src/main/jniLibs/ +*.tar.gz \ No newline at end of file diff --git a/packages/agent_dart/android/build.gradle b/packages/agent_dart/android/build.gradle new file mode 100644 index 00000000..9994c276 --- /dev/null +++ b/packages/agent_dart/android/build.gradle @@ -0,0 +1,59 @@ +// The Android Gradle Plugin builds the native code with the Android NDK. + +group 'com.astrox.agent_dart' +version '1.0.0-SNAPSHOT' + +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + // The Android Gradle Plugin knows how to build native code with the NDK. + classpath 'com.android.tools.build:gradle:7.3.0' + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: 'com.android.library' + +android { + if (project.android.hasProperty("namespace")) { + namespace 'com.astrox.agent_dart' + } + + // Bumping the plugin compileSdkVersion requires all clients of this plugin + // to bump the version in their app. + compileSdkVersion 33 + + defaultConfig { + minSdkVersion 19 + } + + // Use the NDK version + // declared in /android/app/build.gradle file of the Flutter project. + // Replace it with a version number if this plugin requires a specfic NDK version. + // (e.g. ndkVersion "23.1.7779620") + ndkVersion android.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { +} + +apply from: "../cargokit/gradle/plugin.gradle" +cargokit { + manifestDir = "../native/agent_dart" + libname = "agent_dart" +} diff --git a/android/settings.gradle b/packages/agent_dart/android/settings.gradle similarity index 100% rename from android/settings.gradle rename to packages/agent_dart/android/settings.gradle diff --git a/android/src/main/AndroidManifest.xml b/packages/agent_dart/android/src/main/AndroidManifest.xml similarity index 100% rename from android/src/main/AndroidManifest.xml rename to packages/agent_dart/android/src/main/AndroidManifest.xml diff --git a/packages/agent_dart/cargokit/.gitignore b/packages/agent_dart/cargokit/.gitignore new file mode 100644 index 00000000..cf145183 --- /dev/null +++ b/packages/agent_dart/cargokit/.gitignore @@ -0,0 +1,3 @@ +target +.dart_tool +*.iml diff --git a/packages/agent_dart/cargokit/LICENSE b/packages/agent_dart/cargokit/LICENSE new file mode 100644 index 00000000..d33a5fea --- /dev/null +++ b/packages/agent_dart/cargokit/LICENSE @@ -0,0 +1,42 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +Copyright 2022 Matej Knopp + +================================================================================ + +MIT LICENSE + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +================================================================================ + +APACHE LICENSE, VERSION 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + diff --git a/packages/agent_dart/cargokit/README b/packages/agent_dart/cargokit/README new file mode 100644 index 00000000..398474db --- /dev/null +++ b/packages/agent_dart/cargokit/README @@ -0,0 +1,11 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +Experimental repository to provide glue for seamlessly integrating cargo build +with flutter plugins and packages. + +See https://matejknopp.com/post/flutter_plugin_in_rust_with_no_prebuilt_binaries/ +for a tutorial on how to use Cargokit. + +Example plugin available at https://github.com/irondash/hello_rust_ffi_plugin. + diff --git a/packages/agent_dart/cargokit/build_pod.sh b/packages/agent_dart/cargokit/build_pod.sh new file mode 100644 index 00000000..ed0e0d98 --- /dev/null +++ b/packages/agent_dart/cargokit/build_pod.sh @@ -0,0 +1,58 @@ +#!/bin/sh +set -e + +BASEDIR=$(dirname "$0") + +# Workaround for https://github.com/dart-lang/pub/issues/4010 +BASEDIR=$(cd "$BASEDIR" ; pwd -P) + +# Remove XCode SDK from path. Otherwise this breaks tool compilation when building iOS project +NEW_PATH=`echo $PATH | tr ":" "\n" | grep -v "Contents/Developer/" | tr "\n" ":"` + +export PATH=${NEW_PATH%?} # remove trailing : + +env + +# Platform name (macosx, iphoneos, iphonesimulator) +export CARGOKIT_DARWIN_PLATFORM_NAME=$PLATFORM_NAME + +# Arctive architectures (arm64, armv7, x86_64), space separated. +export CARGOKIT_DARWIN_ARCHS=$ARCHS + +# Current build configuration (Debug, Release) +export CARGOKIT_CONFIGURATION=$CONFIGURATION + +# Path to directory containing Cargo.toml. +export CARGOKIT_MANIFEST_DIR=$PODS_TARGET_SRCROOT/$1 + +# Temporary directory for build artifacts. +export CARGOKIT_TARGET_TEMP_DIR=$TARGET_TEMP_DIR + +# Output directory for final artifacts. +export CARGOKIT_OUTPUT_DIR=$PODS_CONFIGURATION_BUILD_DIR/$PRODUCT_NAME + +# Directory to store built tool artifacts. +export CARGOKIT_TOOL_TEMP_DIR=$TARGET_TEMP_DIR/build_tool + +# Directory inside root project. Not necessarily the top level directory of root project. +export CARGOKIT_ROOT_PROJECT_DIR=$SRCROOT + +FLUTTER_EXPORT_BUILD_ENVIRONMENT=( + "$PODS_ROOT/../Flutter/ephemeral/flutter_export_environment.sh" # macOS + "$PODS_ROOT/../Flutter/flutter_export_environment.sh" # iOS +) + +for path in "${FLUTTER_EXPORT_BUILD_ENVIRONMENT[@]}" +do + if [[ -f "$path" ]]; then + source "$path" + fi +done + +sh "$BASEDIR/run_build_tool.sh" build-pod "$@" + +# Make a symlink from built framework to phony file, which will be used as input to +# build script. This should force rebuild (podspec currently doesn't support alwaysOutOfDate +# attribute on custom build phase) +ln -fs "$OBJROOT/XCBuildData/build.db" "${BUILT_PRODUCTS_DIR}/cargokit_phony" +ln -fs "${BUILT_PRODUCTS_DIR}/${EXECUTABLE_PATH}" "${BUILT_PRODUCTS_DIR}/cargokit_phony_out" diff --git a/packages/agent_dart/cargokit/build_tool/README.md b/packages/agent_dart/cargokit/build_tool/README.md new file mode 100644 index 00000000..a878c279 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/README.md @@ -0,0 +1,5 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +A sample command-line application with an entrypoint in `bin/`, library code +in `lib/`, and example unit test in `test/`. diff --git a/packages/agent_dart/cargokit/build_tool/analysis_options.yaml b/packages/agent_dart/cargokit/build_tool/analysis_options.yaml new file mode 100644 index 00000000..0e16a8b0 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/analysis_options.yaml @@ -0,0 +1,34 @@ +# This is copied from Cargokit (which is the official way to use it currently) +# Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +# This file configures the static analysis results for your project (errors, +# warnings, and lints). +# +# This enables the 'recommended' set of lints from `package:lints`. +# This set helps identify many issues that may lead to problems when running +# or consuming Dart code, and enforces writing Dart using a single, idiomatic +# style and format. +# +# If you want a smaller set of lints you can change this to specify +# 'package:lints/core.yaml'. These are just the most critical lints +# (the recommended set includes the core lints). +# The core lints are also what is used by pub.dev for scoring packages. + +include: package:lints/recommended.yaml + +# Uncomment the following section to specify additional rules. + +linter: + rules: + - prefer_relative_imports + - directives_ordering + +# analyzer: +# exclude: +# - path/to/excluded/files/** + +# For more information about the core and recommended set of lints, see +# https://dart.dev/go/core-lints + +# For additional information about configuring this file, see +# https://dart.dev/guides/language/analysis-options diff --git a/packages/agent_dart/cargokit/build_tool/bin/build_tool.dart b/packages/agent_dart/cargokit/build_tool/bin/build_tool.dart new file mode 100644 index 00000000..268eb524 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/bin/build_tool.dart @@ -0,0 +1,8 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'package:build_tool/build_tool.dart' as build_tool; + +void main(List arguments) { + build_tool.runMain(arguments); +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/build_tool.dart b/packages/agent_dart/cargokit/build_tool/lib/build_tool.dart new file mode 100644 index 00000000..7c1bb750 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/build_tool.dart @@ -0,0 +1,8 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'src/build_tool.dart' as build_tool; + +Future runMain(List args) async { + return build_tool.runMain(args); +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/android_environment.dart b/packages/agent_dart/cargokit/build_tool/lib/src/android_environment.dart new file mode 100644 index 00000000..15fc9eed --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/android_environment.dart @@ -0,0 +1,195 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; +import 'dart:isolate'; +import 'dart:math' as math; + +import 'package:collection/collection.dart'; +import 'package:path/path.dart' as path; +import 'package:version/version.dart'; + +import 'target.dart'; +import 'util.dart'; + +class AndroidEnvironment { + AndroidEnvironment({ + required this.sdkPath, + required this.ndkVersion, + required this.minSdkVersion, + required this.targetTempDir, + required this.target, + }); + + static void clangLinkerWrapper(List args) { + final clang = Platform.environment['_CARGOKIT_NDK_LINK_CLANG']; + if (clang == null) { + throw Exception( + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_CLANG env var"); + } + final target = Platform.environment['_CARGOKIT_NDK_LINK_TARGET']; + if (target == null) { + throw Exception( + "cargo-ndk rustc linker: didn't find _CARGOKIT_NDK_LINK_TARGET env var"); + } + + runCommand(clang, [ + target, + ...args, + ]); + } + + /// Full path to Android SDK. + final String sdkPath; + + /// Full version of Android NDK. + final String ndkVersion; + + /// Minimum supported SDK version. + final int minSdkVersion; + + /// Target directory for build artifacts. + final String targetTempDir; + + /// Target being built. + final Target target; + + bool ndkIsInstalled() { + final ndkPath = path.join(sdkPath, 'ndk', ndkVersion); + final ndkPackageXml = File(path.join(ndkPath, 'package.xml')); + return ndkPackageXml.existsSync(); + } + + void installNdk({ + required String javaHome, + }) { + final sdkManagerExtension = Platform.isWindows ? '.bat' : ''; + final sdkManager = path.join( + sdkPath, + 'cmdline-tools', + 'latest', + 'bin', + 'sdkmanager$sdkManagerExtension', + ); + + log.info('Installing NDK $ndkVersion'); + runCommand(sdkManager, [ + '--install', + 'ndk;$ndkVersion', + ], environment: { + 'JAVA_HOME': javaHome, + }); + } + + Future> buildEnvironment() async { + final hostArch = Platform.isMacOS + ? "darwin-x86_64" + : (Platform.isLinux ? "linux-x86_64" : "windows-x86_64"); + + final ndkPath = path.join(sdkPath, 'ndk', ndkVersion); + final toolchainPath = path.join( + ndkPath, + 'toolchains', + 'llvm', + 'prebuilt', + hostArch, + 'bin', + ); + + final minSdkVersion = + math.max(target.androidMinSdkVersion!, this.minSdkVersion); + + final exe = Platform.isWindows ? '.exe' : ''; + + final arKey = 'AR_${target.rust}'; + final arValue = ['${target.rust}-ar', 'llvm-ar', 'llvm-ar.exe'] + .map((e) => path.join(toolchainPath, e)) + .firstWhereOrNull((element) => File(element).existsSync()); + if (arValue == null) { + throw Exception('Failed to find ar for $target in $toolchainPath'); + } + + final targetArg = '--target=${target.rust}$minSdkVersion'; + + final ccKey = 'CC_${target.rust}'; + final ccValue = path.join(toolchainPath, 'clang$exe'); + final cfFlagsKey = 'CFLAGS_${target.rust}'; + final cFlagsValue = targetArg; + + final cxxKey = 'CXX_${target.rust}'; + final cxxValue = path.join(toolchainPath, 'clang++$exe'); + final cxxFlagsKey = 'CXXFLAGS_${target.rust}'; + final cxxFlagsValue = targetArg; + + final linkerKey = + 'cargo_target_${target.rust.replaceAll('-', '_')}_linker'.toUpperCase(); + + final ranlibKey = 'RANLIB_${target.rust}'; + final ranlibValue = path.join(toolchainPath, 'llvm-ranlib$exe'); + + final ndkVersionParsed = Version.parse(ndkVersion); + final rustFlagsKey = 'CARGO_ENCODED_RUSTFLAGS'; + final rustFlagsValue = _libGccWorkaround(targetTempDir, ndkVersionParsed); + + final runRustTool = + Platform.isWindows ? 'run_build_tool.cmd' : 'run_build_tool.sh'; + + final packagePath = (await Isolate.resolvePackageUri( + Uri.parse('package:build_tool/buildtool.dart')))! + .toFilePath(); + final selfPath = path.canonicalize(path.join( + packagePath, + '..', + '..', + '..', + runRustTool, + )); + + // Make sure that run_build_tool is working properly even initially launched directly + // through dart run. + final toolTempDir = + Platform.environment['CARGOKIT_TOOL_TEMP_DIR'] ?? targetTempDir; + + return { + arKey: arValue, + ccKey: ccValue, + cfFlagsKey: cFlagsValue, + cxxKey: cxxValue, + cxxFlagsKey: cxxFlagsValue, + ranlibKey: ranlibValue, + rustFlagsKey: rustFlagsValue, + linkerKey: selfPath, + // Recognized by main() so we know when we're acting as a wrapper + '_CARGOKIT_NDK_LINK_TARGET': targetArg, + '_CARGOKIT_NDK_LINK_CLANG': ccValue, + 'CARGOKIT_TOOL_TEMP_DIR': toolTempDir, + }; + } + + // Workaround for libgcc missing in NDK23, inspired by cargo-ndk + String _libGccWorkaround(String buildDir, Version ndkVersion) { + final workaroundDir = path.join( + buildDir, + 'cargokit', + 'libgcc_workaround', + '${ndkVersion.major}', + ); + Directory(workaroundDir).createSync(recursive: true); + if (ndkVersion.major >= 23) { + File(path.join(workaroundDir, 'libgcc.a')) + .writeAsStringSync('INPUT(-lunwind)'); + } else { + // Other way around, untested, forward libgcc.a from libunwind once Rust + // gets updated for NDK23+. + File(path.join(workaroundDir, 'libunwind.a')) + .writeAsStringSync('INPUT(-lgcc)'); + } + + var rustFlags = Platform.environment['CARGO_ENCODED_RUSTFLAGS'] ?? ''; + if (rustFlags.isNotEmpty) { + rustFlags = '$rustFlags\x1f'; + } + rustFlags = '$rustFlags-L\x1f$workaroundDir'; + return rustFlags; + } +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/artifacts_provider.dart b/packages/agent_dart/cargokit/build_tool/lib/src/artifacts_provider.dart new file mode 100644 index 00000000..e608cece --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/artifacts_provider.dart @@ -0,0 +1,266 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:ed25519_edwards/ed25519_edwards.dart'; +import 'package:http/http.dart'; +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as path; + +import 'builder.dart'; +import 'crate_hash.dart'; +import 'options.dart'; +import 'precompile_binaries.dart'; +import 'rustup.dart'; +import 'target.dart'; + +class Artifact { + /// File system location of the artifact. + final String path; + + /// Actual file name that the artifact should have in destination folder. + final String finalFileName; + + AritifactType get type { + if (finalFileName.endsWith('.dll') || + finalFileName.endsWith('.dll.lib') || + finalFileName.endsWith('.pdb') || + finalFileName.endsWith('.so') || + finalFileName.endsWith('.dylib')) { + return AritifactType.dylib; + } else if (finalFileName.endsWith('.lib') || finalFileName.endsWith('.a')) { + return AritifactType.staticlib; + } else { + throw Exception('Unknown artifact type for $finalFileName'); + } + } + + Artifact({ + required this.path, + required this.finalFileName, + }); +} + +final _log = Logger('artifacts_provider'); + +class ArtifactProvider { + ArtifactProvider({ + required this.environment, + required this.userOptions, + }); + + final BuildEnvironment environment; + final CargokitUserOptions userOptions; + + Future>> getArtifacts(List targets) async { + final result = await _getPrecompiledArtifacts(targets); + + final pendingTargets = List.of(targets); + pendingTargets.removeWhere((element) => result.containsKey(element)); + + if (pendingTargets.isEmpty) { + return result; + } + + final rustup = Rustup(); + for (final target in targets) { + final builder = RustBuilder(target: target, environment: environment); + builder.prepare(rustup); + _log.info('Building ${environment.crateInfo.packageName} for $target'); + final targetDir = await builder.build(); + // For local build accept both static and dynamic libraries. + final artifactNames = { + ...getArtifactNames( + target: target, + libraryName: environment.crateInfo.packageName, + aritifactType: AritifactType.dylib, + remote: false, + ), + ...getArtifactNames( + target: target, + libraryName: environment.crateInfo.packageName, + aritifactType: AritifactType.staticlib, + remote: false, + ) + }; + final artifacts = artifactNames + .map((artifactName) => Artifact( + path: path.join(targetDir, artifactName), + finalFileName: artifactName, + )) + .where((element) => File(element.path).existsSync()) + .toList(); + result[target] = artifacts; + } + return result; + } + + Future>> _getPrecompiledArtifacts( + List targets) async { + if (userOptions.usePrecompiledBinaries == false) { + _log.info('Precompiled binaries are disabled'); + return {}; + } + if (environment.crateOptions.precompiledBinaries == null) { + _log.fine('Precompiled binaries not enabled for this crate'); + return {}; + } + + final start = Stopwatch()..start(); + final crateHash = CrateHash.compute(environment.manifestDir, + tempStorage: environment.targetTempDir); + _log.fine( + 'Computed crate hash $crateHash in ${start.elapsedMilliseconds}ms'); + + final downloadedArtifactsDir = + path.join(environment.targetTempDir, 'precompiled', crateHash); + Directory(downloadedArtifactsDir).createSync(recursive: true); + + final res = >{}; + + for (final target in targets) { + final requiredArtifacts = getArtifactNames( + target: target, + libraryName: environment.crateInfo.packageName, + remote: true, + ); + final artifactsForTarget = []; + + for (final artifact in requiredArtifacts) { + final fileName = PrecompileBinaries.fileName(target, artifact); + final downloadedPath = path.join(downloadedArtifactsDir, fileName); + if (!File(downloadedPath).existsSync()) { + final signatureFileName = + PrecompileBinaries.signatureFileName(target, artifact); + await _tryDownloadArtifacts( + crateHash: crateHash, + fileName: fileName, + signatureFileName: signatureFileName, + finalPath: downloadedPath, + ); + } + if (File(downloadedPath).existsSync()) { + artifactsForTarget.add(Artifact( + path: downloadedPath, + finalFileName: artifact, + )); + } else { + break; + } + } + + // Only provide complete set of artifacts. + if (artifactsForTarget.length == requiredArtifacts.length) { + _log.fine('Found precompiled artifacts for $target'); + res[target] = artifactsForTarget; + } + } + + return res; + } + + static Future _get(Uri url, {Map? headers}) async { + int attempt = 0; + const maxAttempts = 10; + while (true) { + try { + return await get(url, headers: headers); + } on SocketException catch (e) { + // Try to detect reset by peer error and retry. + if (attempt++ < maxAttempts && + (e.osError?.errorCode == 54 || e.osError?.errorCode == 10054)) { + _log.severe( + 'Failed to download $url: $e, attempt $attempt of $maxAttempts, will retry...'); + await Future.delayed(Duration(seconds: 1)); + continue; + } else { + rethrow; + } + } + } + } + + Future _tryDownloadArtifacts({ + required String crateHash, + required String fileName, + required String signatureFileName, + required String finalPath, + }) async { + final precompiledBinaries = environment.crateOptions.precompiledBinaries!; + final prefix = precompiledBinaries.uriPrefix; + final url = Uri.parse('$prefix$crateHash/$fileName'); + final signatureUrl = Uri.parse('$prefix$crateHash/$signatureFileName'); + _log.fine('Downloading signature from $signatureUrl'); + final signature = await _get(signatureUrl); + if (signature.statusCode == 404) { + _log.warning( + 'Precompiled binaries not available for crate hash $crateHash ($fileName)'); + return; + } + if (signature.statusCode != 200) { + _log.severe( + 'Failed to download signature $signatureUrl: status ${signature.statusCode}'); + return; + } + _log.fine('Downloading binary from $url'); + final res = await _get(url); + if (res.statusCode != 200) { + _log.severe('Failed to download binary $url: status ${res.statusCode}'); + return; + } + if (verify( + precompiledBinaries.publicKey, res.bodyBytes, signature.bodyBytes)) { + File(finalPath).writeAsBytesSync(res.bodyBytes); + } else { + _log.shout('Signature verification failed! Ignoring binary.'); + } + } +} + +enum AritifactType { + staticlib, + dylib, +} + +AritifactType artifactTypeForTarget(Target target) { + if (target.darwinPlatform != null) { + return AritifactType.staticlib; + } else { + return AritifactType.dylib; + } +} + +List getArtifactNames({ + required Target target, + required String libraryName, + required bool remote, + AritifactType? aritifactType, +}) { + aritifactType ??= artifactTypeForTarget(target); + if (target.darwinArch != null) { + if (aritifactType == AritifactType.staticlib) { + return ['lib$libraryName.a']; + } else { + return ['lib$libraryName.dylib']; + } + } else if (target.rust.contains('-windows-')) { + if (aritifactType == AritifactType.staticlib) { + return ['$libraryName.lib']; + } else { + return [ + '$libraryName.dll', + '$libraryName.dll.lib', + if (!remote) '$libraryName.pdb' + ]; + } + } else if (target.rust.contains('-linux-')) { + if (aritifactType == AritifactType.staticlib) { + return ['lib$libraryName.a']; + } else { + return ['lib$libraryName.so']; + } + } else { + throw Exception("Unsupported target: ${target.rust}"); + } +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/build_cmake.dart b/packages/agent_dart/cargokit/build_tool/lib/src/build_cmake.dart new file mode 100644 index 00000000..6f3b2a4e --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/build_cmake.dart @@ -0,0 +1,40 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:path/path.dart' as path; + +import 'artifacts_provider.dart'; +import 'builder.dart'; +import 'environment.dart'; +import 'options.dart'; +import 'target.dart'; + +class BuildCMake { + final CargokitUserOptions userOptions; + + BuildCMake({required this.userOptions}); + + Future build() async { + final targetPlatform = Environment.targetPlatform; + final target = Target.forFlutterName(Environment.targetPlatform); + if (target == null) { + throw Exception("Unknown target platform: $targetPlatform"); + } + + final environment = BuildEnvironment.fromEnvironment(isAndroid: false); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); + final artifacts = await provider.getArtifacts([target]); + + final libs = artifacts[target]!; + + for (final lib in libs) { + if (lib.type == AritifactType.dylib) { + File(lib.path) + .copySync(path.join(Environment.outputDir, lib.finalFileName)); + } + } + } +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/build_gradle.dart b/packages/agent_dart/cargokit/build_tool/lib/src/build_gradle.dart new file mode 100644 index 00000000..7e61fcbb --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/build_gradle.dart @@ -0,0 +1,49 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as path; + +import 'artifacts_provider.dart'; +import 'builder.dart'; +import 'environment.dart'; +import 'options.dart'; +import 'target.dart'; + +final log = Logger('build_gradle'); + +class BuildGradle { + BuildGradle({required this.userOptions}); + + final CargokitUserOptions userOptions; + + Future build() async { + final targets = Environment.targetPlatforms.map((arch) { + final target = Target.forFlutterName(arch); + if (target == null) { + throw Exception( + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); + } + return target; + }).toList(); + + final environment = BuildEnvironment.fromEnvironment(isAndroid: true); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); + final artifacts = await provider.getArtifacts(targets); + + for (final target in targets) { + final libs = artifacts[target]!; + final outputDir = path.join(Environment.outputDir, target.android!); + Directory(outputDir).createSync(recursive: true); + + for (final lib in libs) { + if (lib.type == AritifactType.dylib) { + File(lib.path).copySync(path.join(outputDir, lib.finalFileName)); + } + } + } + } +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/build_pod.dart b/packages/agent_dart/cargokit/build_tool/lib/src/build_pod.dart new file mode 100644 index 00000000..8a9c0db5 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/build_pod.dart @@ -0,0 +1,89 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:path/path.dart' as path; + +import 'artifacts_provider.dart'; +import 'builder.dart'; +import 'environment.dart'; +import 'options.dart'; +import 'target.dart'; +import 'util.dart'; + +class BuildPod { + BuildPod({required this.userOptions}); + + final CargokitUserOptions userOptions; + + Future build() async { + final targets = Environment.darwinArchs.map((arch) { + final target = Target.forDarwin( + platformName: Environment.darwinPlatformName, darwinAarch: arch); + if (target == null) { + throw Exception( + "Unknown darwin target or platform: $arch, ${Environment.darwinPlatformName}"); + } + return target; + }).toList(); + + final environment = BuildEnvironment.fromEnvironment(isAndroid: false); + final provider = + ArtifactProvider(environment: environment, userOptions: userOptions); + final artifacts = await provider.getArtifacts(targets); + + void performLipo(String targetFile, Iterable sourceFiles) { + runCommand("lipo", [ + '-create', + ...sourceFiles, + '-output', + targetFile, + ]); + } + + final outputDir = Environment.outputDir; + + Directory(outputDir).createSync(recursive: true); + + final staticLibs = artifacts.values + .expand((element) => element) + .where((element) => element.type == AritifactType.staticlib) + .toList(); + final dynamicLibs = artifacts.values + .expand((element) => element) + .where((element) => element.type == AritifactType.dylib) + .toList(); + + final libName = environment.crateInfo.packageName; + + // If there is static lib, use it and link it with pod + if (staticLibs.isNotEmpty) { + final finalTargetFile = path.join(outputDir, "lib$libName.a"); + performLipo(finalTargetFile, staticLibs.map((e) => e.path)); + } else { + // Otherwise try to replace bundle dylib with our dylib + final bundlePaths = [ + '$libName.framework/Versions/A/$libName', + '$libName.framework/$libName', + ]; + + for (final bundlePath in bundlePaths) { + final targetFile = path.join(outputDir, bundlePath); + if (File(targetFile).existsSync()) { + performLipo(targetFile, dynamicLibs.map((e) => e.path)); + + // Replace absolute id with @rpath one so that it works properly + // when moved to Frameworks. + runCommand("install_name_tool", [ + '-id', + '@rpath/$bundlePath', + targetFile, + ]); + return; + } + } + throw Exception('Unable to find bundle for dynamic library'); + } + } +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/build_tool.dart b/packages/agent_dart/cargokit/build_tool/lib/src/build_tool.dart new file mode 100644 index 00000000..c8f36981 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/build_tool.dart @@ -0,0 +1,271 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:args/command_runner.dart'; +import 'package:ed25519_edwards/ed25519_edwards.dart'; +import 'package:github/github.dart'; +import 'package:hex/hex.dart'; +import 'package:logging/logging.dart'; + +import 'android_environment.dart'; +import 'build_cmake.dart'; +import 'build_gradle.dart'; +import 'build_pod.dart'; +import 'logging.dart'; +import 'options.dart'; +import 'precompile_binaries.dart'; +import 'target.dart'; +import 'util.dart'; +import 'verify_binaries.dart'; + +final log = Logger('build_tool'); + +abstract class BuildCommand extends Command { + Future runBuildCommand(CargokitUserOptions options); + + @override + Future run() async { + final options = CargokitUserOptions.load(); + + if (options.verboseLogging || + Platform.environment['CARGOKIT_VERBOSE'] == '1') { + enableVerboseLogging(); + } + + await runBuildCommand(options); + } +} + +class BuildPodCommand extends BuildCommand { + @override + final name = 'build-pod'; + + @override + final description = 'Build cocoa pod library'; + + @override + Future runBuildCommand(CargokitUserOptions options) async { + final build = BuildPod(userOptions: options); + await build.build(); + } +} + +class BuildGradleCommand extends BuildCommand { + @override + final name = 'build-gradle'; + + @override + final description = 'Build android library'; + + @override + Future runBuildCommand(CargokitUserOptions options) async { + final build = BuildGradle(userOptions: options); + await build.build(); + } +} + +class BuildCMakeCommand extends BuildCommand { + @override + final name = 'build-cmake'; + + @override + final description = 'Build CMake library'; + + @override + Future runBuildCommand(CargokitUserOptions options) async { + final build = BuildCMake(userOptions: options); + await build.build(); + } +} + +class GenKeyCommand extends Command { + @override + final name = 'gen-key'; + + @override + final description = 'Generate key pair for signing precompiled binaries'; + + @override + void run() { + final kp = generateKey(); + final private = HEX.encode(kp.privateKey.bytes); + final public = HEX.encode(kp.publicKey.bytes); + print("Private Key: $private"); + print("Public Key: $public"); + } +} + +class PrecompileBinariesCommand extends Command { + PrecompileBinariesCommand() { + argParser + ..addOption( + 'repository', + mandatory: true, + help: 'Github repository slug in format owner/name', + ) + ..addOption( + 'manifest-dir', + mandatory: true, + help: 'Directory containing Cargo.toml', + ) + ..addMultiOption('target', + help: 'Rust target triple of artifact to build.\n' + 'Can be specified multiple times or omitted in which case\n' + 'all targets for current platform will be built.') + ..addOption( + 'android-sdk-location', + help: 'Location of Android SDK (if available)', + ) + ..addOption( + 'android-ndk-version', + help: 'Android NDK version (if available)', + ) + ..addOption( + 'android-min-sdk-version', + help: 'Android minimum rquired version (if available)', + ) + ..addOption( + 'temp-dir', + help: 'Directory to store temporary build artifacts', + ) + ..addFlag( + "verbose", + abbr: "v", + defaultsTo: false, + help: "Enable verbose logging", + ); + } + + @override + final name = 'precompile-binaries'; + + @override + final description = 'Prebuild and upload binaries\n' + 'Private key must be passed through PRIVATE_KEY environment variable. ' + 'Use gen_key through generate priave key.\n' + 'Github token must be passed as GITHUB_TOKEN environment variable.\n'; + + @override + Future run() async { + final verbose = argResults!['verbose'] as bool; + if (verbose) { + enableVerboseLogging(); + } + + final privateKeyString = Platform.environment['PRIVATE_KEY']; + if (privateKeyString == null) { + throw ArgumentError('Missing PRIVATE_KEY environment variable'); + } + final githubToken = Platform.environment['GITHUB_TOKEN']; + if (githubToken == null) { + throw ArgumentError('Missing GITHUB_TOKEN environment variable'); + } + final privateKey = HEX.decode(privateKeyString); + if (privateKey.length != 64) { + throw ArgumentError('Private key must be 64 bytes long'); + } + final manifestDir = argResults!['manifest-dir'] as String; + if (!Directory(manifestDir).existsSync()) { + throw ArgumentError('Manifest directory does not exist: $manifestDir'); + } + String? androidMinSdkVersionString = + argResults!['android-min-sdk-version'] as String?; + int? androidMinSdkVersion; + if (androidMinSdkVersionString != null) { + androidMinSdkVersion = int.tryParse(androidMinSdkVersionString); + if (androidMinSdkVersion == null) { + throw ArgumentError( + 'Invalid android-min-sdk-version: $androidMinSdkVersionString'); + } + } + final targetStrigns = argResults!['target'] as List; + final targets = targetStrigns.map((target) { + final res = Target.forRustTriple(target); + if (res == null) { + throw ArgumentError('Invalid target: $target'); + } + return res; + }).toList(growable: false); + final precompileBinaries = PrecompileBinaries( + privateKey: PrivateKey(privateKey), + githubToken: githubToken, + manifestDir: manifestDir, + repositorySlug: RepositorySlug.full(argResults!['repository'] as String), + targets: targets, + androidSdkLocation: argResults!['android-sdk-location'] as String?, + androidNdkVersion: argResults!['android-ndk-version'] as String?, + androidMinSdkVersion: androidMinSdkVersion, + tempDir: argResults!['temp-dir'] as String?, + ); + + await precompileBinaries.run(); + } +} + +class VerifyBinariesCommand extends Command { + VerifyBinariesCommand() { + argParser.addOption( + 'manifest-dir', + mandatory: true, + help: 'Directory containing Cargo.toml', + ); + } + + @override + final name = "verify-binaries"; + + @override + final description = 'Verifies published binaries\n' + 'Checks whether there is a binary published for each targets\n' + 'and checks the signature.'; + + @override + Future run() async { + final manifestDir = argResults!['manifest-dir'] as String; + final verifyBinaries = VerifyBinaries( + manifestDir: manifestDir, + ); + await verifyBinaries.run(); + } +} + +Future runMain(List args) async { + try { + // Init logging before options are loaded + initLogging(); + + if (Platform.environment['_CARGOKIT_NDK_LINK_TARGET'] != null) { + return AndroidEnvironment.clangLinkerWrapper(args); + } + + final runner = CommandRunner('build_tool', 'Cargokit built_tool') + ..addCommand(BuildPodCommand()) + ..addCommand(BuildGradleCommand()) + ..addCommand(BuildCMakeCommand()) + ..addCommand(GenKeyCommand()) + ..addCommand(PrecompileBinariesCommand()) + ..addCommand(VerifyBinariesCommand()); + + await runner.run(args); + } on ArgumentError catch (e) { + stderr.writeln(e.toString()); + exit(1); + } catch (e, s) { + log.severe(kDoubleSeparator); + log.severe('Cargokit BuildTool failed with error:'); + log.severe(kSeparator); + log.severe(e); + // This tells user to install Rust, there's no need to pollute the log with + // stack trace. + if (e is! RustupNotFoundException) { + log.severe(kSeparator); + log.severe(s); + log.severe(kSeparator); + log.severe('BuildTool arguments: $args'); + } + log.severe(kDoubleSeparator); + exit(1); + } +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/builder.dart b/packages/agent_dart/cargokit/build_tool/lib/src/builder.dart new file mode 100644 index 00000000..84c46e4f --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/builder.dart @@ -0,0 +1,198 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'package:collection/collection.dart'; +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as path; + +import 'android_environment.dart'; +import 'cargo.dart'; +import 'environment.dart'; +import 'options.dart'; +import 'rustup.dart'; +import 'target.dart'; +import 'util.dart'; + +final _log = Logger('builder'); + +enum BuildConfiguration { + debug, + release, + profile, +} + +extension on BuildConfiguration { + bool get isDebug => this == BuildConfiguration.debug; + String get rustName => switch (this) { + BuildConfiguration.debug => 'debug', + BuildConfiguration.release => 'release', + BuildConfiguration.profile => 'release', + }; +} + +class BuildException implements Exception { + final String message; + + BuildException(this.message); + + @override + String toString() { + return 'BuildException: $message'; + } +} + +class BuildEnvironment { + final BuildConfiguration configuration; + final CargokitCrateOptions crateOptions; + final String targetTempDir; + final String manifestDir; + final CrateInfo crateInfo; + + final bool isAndroid; + final String? androidSdkPath; + final String? androidNdkVersion; + final int? androidMinSdkVersion; + final String? javaHome; + + BuildEnvironment({ + required this.configuration, + required this.crateOptions, + required this.targetTempDir, + required this.manifestDir, + required this.crateInfo, + required this.isAndroid, + this.androidSdkPath, + this.androidNdkVersion, + this.androidMinSdkVersion, + this.javaHome, + }); + + static BuildConfiguration parseBuildConfiguration(String value) { + // XCode configuration adds the flavor to configuration name. + final firstSegment = value.split('-').first; + final buildConfiguration = BuildConfiguration.values.firstWhereOrNull( + (e) => e.name == firstSegment, + ); + if (buildConfiguration == null) { + _log.warning('Unknown build configuraiton $value, will assume release'); + return BuildConfiguration.release; + } + return buildConfiguration; + } + + static BuildEnvironment fromEnvironment({ + required bool isAndroid, + }) { + final buildConfiguration = + parseBuildConfiguration(Environment.configuration); + final manifestDir = Environment.manifestDir; + final crateOptions = CargokitCrateOptions.load( + manifestDir: manifestDir, + ); + final crateInfo = CrateInfo.load(manifestDir); + return BuildEnvironment( + configuration: buildConfiguration, + crateOptions: crateOptions, + targetTempDir: Environment.targetTempDir, + manifestDir: manifestDir, + crateInfo: crateInfo, + isAndroid: isAndroid, + androidSdkPath: isAndroid ? Environment.sdkPath : null, + androidNdkVersion: isAndroid ? Environment.ndkVersion : null, + androidMinSdkVersion: + isAndroid ? int.parse(Environment.minSdkVersion) : null, + javaHome: isAndroid ? Environment.javaHome : null, + ); + } +} + +class RustBuilder { + final Target target; + final BuildEnvironment environment; + + RustBuilder({ + required this.target, + required this.environment, + }); + + void prepare( + Rustup rustup, + ) { + final toolchain = _toolchain; + if (rustup.installedTargets(toolchain) == null) { + rustup.installToolchain(toolchain); + } + if (toolchain == 'nightly') { + rustup.installRustSrcForNightly(); + } + if (!rustup.installedTargets(toolchain)!.contains(target.rust)) { + rustup.installTarget(target.rust, toolchain: toolchain); + } + } + + CargoBuildOptions? get _buildOptions => + environment.crateOptions.cargo[environment.configuration]; + + String get _toolchain => _buildOptions?.toolchain.name ?? 'stable'; + + /// Returns the path of directory containing build artifacts. + Future build() async { + final extraArgs = _buildOptions?.flags ?? []; + final manifestPath = path.join(environment.manifestDir, 'Cargo.toml'); + runCommand( + 'rustup', + [ + 'run', + _toolchain, + 'cargo', + 'build', + ...extraArgs, + '--manifest-path', + manifestPath, + '-p', + environment.crateInfo.packageName, + if (!environment.configuration.isDebug) '--release', + '--target', + target.rust, + '--target-dir', + environment.targetTempDir, + ], + environment: await _buildEnvironment(), + ); + return path.join( + environment.targetTempDir, + target.rust, + environment.configuration.rustName, + ); + } + + Future> _buildEnvironment() async { + if (target.android == null) { + return {}; + } else { + final sdkPath = environment.androidSdkPath; + final ndkVersion = environment.androidNdkVersion; + final minSdkVersion = environment.androidMinSdkVersion; + if (sdkPath == null) { + throw BuildException('androidSdkPath is not set'); + } + if (ndkVersion == null) { + throw BuildException('androidNdkVersion is not set'); + } + if (minSdkVersion == null) { + throw BuildException('androidMinSdkVersion is not set'); + } + final env = AndroidEnvironment( + sdkPath: sdkPath, + ndkVersion: ndkVersion, + minSdkVersion: minSdkVersion, + targetTempDir: environment.targetTempDir, + target: target, + ); + if (!env.ndkIsInstalled() && environment.javaHome != null) { + env.installNdk(javaHome: environment.javaHome!); + } + return env.buildEnvironment(); + } + } +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/cargo.dart b/packages/agent_dart/cargokit/build_tool/lib/src/cargo.dart new file mode 100644 index 00000000..0d8958ff --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/cargo.dart @@ -0,0 +1,48 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:path/path.dart' as path; +import 'package:toml/toml.dart'; + +class ManifestException { + ManifestException(this.message, {required this.fileName}); + + final String? fileName; + final String message; + + @override + String toString() { + if (fileName != null) { + return 'Failed to parse package manifest at $fileName: $message'; + } else { + return 'Failed to parse package manifest: $message'; + } + } +} + +class CrateInfo { + CrateInfo({required this.packageName}); + + final String packageName; + + static CrateInfo parseManifest(String manifest, {final String? fileName}) { + final toml = TomlDocument.parse(manifest); + final package = toml.toMap()['package']; + if (package == null) { + throw ManifestException('Missing package section', fileName: fileName); + } + final name = package['name']; + if (name == null) { + throw ManifestException('Missing package name', fileName: fileName); + } + return CrateInfo(packageName: name); + } + + static CrateInfo load(String manifestDir) { + final manifestFile = File(path.join(manifestDir, 'Cargo.toml')); + final manifest = manifestFile.readAsStringSync(); + return parseManifest(manifest, fileName: manifestFile.path); + } +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/crate_hash.dart b/packages/agent_dart/cargokit/build_tool/lib/src/crate_hash.dart new file mode 100644 index 00000000..0c4d88d1 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/crate_hash.dart @@ -0,0 +1,124 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:collection/collection.dart'; +import 'package:convert/convert.dart'; +import 'package:crypto/crypto.dart'; +import 'package:path/path.dart' as path; + +class CrateHash { + /// Computes a hash uniquely identifying crate content. This takes into account + /// content all all .rs files inside the src directory, as well as Cargo.toml, + /// Cargo.lock, build.rs and cargokit.yaml. + /// + /// If [tempStorage] is provided, computed hash is stored in a file in that directory + /// and reused on subsequent calls if the crate content hasn't changed. + static String compute(String manifestDir, {String? tempStorage}) { + return CrateHash._( + manifestDir: manifestDir, + tempStorage: tempStorage, + )._compute(); + } + + CrateHash._({ + required this.manifestDir, + required this.tempStorage, + }); + + String _compute() { + final files = getFiles(); + final tempStorage = this.tempStorage; + if (tempStorage != null) { + final quickHash = _computeQuickHash(files); + final quickHashFolder = Directory(path.join(tempStorage, 'crate_hash')); + quickHashFolder.createSync(recursive: true); + final quickHashFile = File(path.join(quickHashFolder.path, quickHash)); + if (quickHashFile.existsSync()) { + return quickHashFile.readAsStringSync(); + } + final hash = _computeHash(files); + quickHashFile.writeAsStringSync(hash); + return hash; + } else { + return _computeHash(files); + } + } + + /// Computes a quick hash based on files stat (without reading contents). This + /// is used to cache the real hash, which is slower to compute since it involves + /// reading every single file. + String _computeQuickHash(List files) { + final output = AccumulatorSink(); + final input = sha256.startChunkedConversion(output); + + final data = ByteData(8); + for (final file in files) { + input.add(utf8.encode(file.path)); + final stat = file.statSync(); + data.setUint64(0, stat.size); + input.add(data.buffer.asUint8List()); + data.setUint64(0, stat.modified.millisecondsSinceEpoch); + input.add(data.buffer.asUint8List()); + } + + input.close(); + return base64Url.encode(output.events.single.bytes); + } + + String _computeHash(List files) { + final output = AccumulatorSink(); + final input = sha256.startChunkedConversion(output); + + void addTextFile(File file) { + // text Files are hashed by lines in case we're dealing with github checkout + // that auto-converts line endings. + final splitter = LineSplitter(); + if (file.existsSync()) { + final data = file.readAsStringSync(); + final lines = splitter.convert(data); + for (final line in lines) { + input.add(utf8.encode(line)); + } + } + } + + for (final file in files) { + addTextFile(file); + } + + input.close(); + final res = output.events.single; + + // Truncate to 128bits. + final hash = res.bytes.sublist(0, 16); + return hex.encode(hash); + } + + List getFiles() { + final src = Directory(path.join(manifestDir, 'src')); + final files = src + .listSync(recursive: true, followLinks: false) + .whereType() + .toList(); + files.sortBy((element) => element.path); + void addFile(String relative) { + final file = File(path.join(manifestDir, relative)); + if (file.existsSync()) { + files.add(file); + } + } + + addFile('Cargo.toml'); + addFile('Cargo.lock'); + addFile('build.rs'); + addFile('cargokit.yaml'); + return files; + } + + final String manifestDir; + final String? tempStorage; +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/environment.dart b/packages/agent_dart/cargokit/build_tool/lib/src/environment.dart new file mode 100644 index 00000000..996483a1 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/environment.dart @@ -0,0 +1,68 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +extension on String { + String resolveSymlink() => File(this).resolveSymbolicLinksSync(); +} + +class Environment { + /// Current build configuration (debug or release). + static String get configuration => + _getEnv("CARGOKIT_CONFIGURATION").toLowerCase(); + + static bool get isDebug => configuration == 'debug'; + static bool get isRelease => configuration == 'release'; + + /// Temporary directory where Rust build artifacts are placed. + static String get targetTempDir => _getEnv("CARGOKIT_TARGET_TEMP_DIR"); + + /// Final output directory where the build artifacts are placed. + static String get outputDir => _getEnvPath('CARGOKIT_OUTPUT_DIR'); + + /// Path to the crate manifest (containing Cargo.toml). + static String get manifestDir => _getEnvPath('CARGOKIT_MANIFEST_DIR'); + + /// Directory inside root project. Not necessarily root folder. Symlinks are + /// not resolved on purpose. + static String get rootProjectDir => _getEnv('CARGOKIT_ROOT_PROJECT_DIR'); + + // Pod + + /// Platform name (macosx, iphoneos, iphonesimulator). + static String get darwinPlatformName => + _getEnv("CARGOKIT_DARWIN_PLATFORM_NAME"); + + /// List of architectures to build for (arm64, armv7, x86_64). + static List get darwinArchs => + _getEnv("CARGOKIT_DARWIN_ARCHS").split(' '); + + // Gradle + static String get minSdkVersion => _getEnv("CARGOKIT_MIN_SDK_VERSION"); + static String get ndkVersion => _getEnv("CARGOKIT_NDK_VERSION"); + static String get sdkPath => _getEnvPath("CARGOKIT_SDK_DIR"); + static String get javaHome => _getEnvPath("CARGOKIT_JAVA_HOME"); + static List get targetPlatforms => + _getEnv("CARGOKIT_TARGET_PLATFORMS").split(','); + + // CMAKE + static String get targetPlatform => _getEnv("CARGOKIT_TARGET_PLATFORM"); + + static String _getEnv(String key) { + final res = Platform.environment[key]; + if (res == null) { + throw Exception("Missing environment variable $key"); + } + return res; + } + + static String _getEnvPath(String key) { + final res = _getEnv(key); + if (Directory(res).existsSync()) { + return res.resolveSymlink(); + } else { + return res; + } + } +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/logging.dart b/packages/agent_dart/cargokit/build_tool/lib/src/logging.dart new file mode 100644 index 00000000..5edd4fd1 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/logging.dart @@ -0,0 +1,52 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:logging/logging.dart'; + +const String kSeparator = "--"; +const String kDoubleSeparator = "=="; + +bool _lastMessageWasSeparator = false; + +void _log(LogRecord rec) { + final prefix = '${rec.level.name}: '; + final out = rec.level == Level.SEVERE ? stderr : stdout; + if (rec.message == kSeparator) { + if (!_lastMessageWasSeparator) { + out.write(prefix); + out.writeln('-' * 80); + _lastMessageWasSeparator = true; + } + return; + } else if (rec.message == kDoubleSeparator) { + out.write(prefix); + out.writeln('=' * 80); + _lastMessageWasSeparator = true; + return; + } + out.write(prefix); + out.writeln(rec.message); + _lastMessageWasSeparator = false; +} + +void initLogging() { + Logger.root.level = Level.INFO; + Logger.root.onRecord.listen((LogRecord rec) { + final lines = rec.message.split('\n'); + for (final line in lines) { + if (line.isNotEmpty || lines.length == 1 || line != lines.last) { + _log(LogRecord( + rec.level, + line, + rec.loggerName, + )); + } + } + }); +} + +void enableVerboseLogging() { + Logger.root.level = Level.ALL; +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/options.dart b/packages/agent_dart/cargokit/build_tool/lib/src/options.dart new file mode 100644 index 00000000..22aef1d3 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/options.dart @@ -0,0 +1,309 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:collection/collection.dart'; +import 'package:ed25519_edwards/ed25519_edwards.dart'; +import 'package:hex/hex.dart'; +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as path; +import 'package:source_span/source_span.dart'; +import 'package:yaml/yaml.dart'; + +import 'builder.dart'; +import 'environment.dart'; +import 'rustup.dart'; + +final _log = Logger('options'); + +/// A class for exceptions that have source span information attached. +class SourceSpanException implements Exception { + // This is a getter so that subclasses can override it. + /// A message describing the exception. + String get message => _message; + final String _message; + + // This is a getter so that subclasses can override it. + /// The span associated with this exception. + /// + /// This may be `null` if the source location can't be determined. + SourceSpan? get span => _span; + final SourceSpan? _span; + + SourceSpanException(this._message, this._span); + + /// Returns a string representation of `this`. + /// + /// [color] may either be a [String], a [bool], or `null`. If it's a string, + /// it indicates an ANSI terminal color escape that should be used to + /// highlight the span's text. If it's `true`, it indicates that the text + /// should be highlighted using the default color. If it's `false` or `null`, + /// it indicates that the text shouldn't be highlighted. + @override + String toString({Object? color}) { + if (span == null) return message; + return 'Error on ${span!.message(message, color: color)}'; + } +} + +enum Toolchain { + stable, + beta, + nightly, +} + +class CargoBuildOptions { + final Toolchain toolchain; + final List flags; + + CargoBuildOptions({ + required this.toolchain, + required this.flags, + }); + + static Toolchain _toolchainFromNode(YamlNode node) { + if (node case YamlScalar(value: String name)) { + final toolchain = + Toolchain.values.firstWhereOrNull((element) => element.name == name); + if (toolchain != null) { + return toolchain; + } + } + throw SourceSpanException( + 'Unknown toolchain. Must be one of ${Toolchain.values.map((e) => e.name)}.', + node.span); + } + + static CargoBuildOptions parse(YamlNode node) { + if (node is! YamlMap) { + throw SourceSpanException('Cargo options must be a map', node.span); + } + Toolchain toolchain = Toolchain.stable; + List flags = []; + for (final MapEntry(:key, :value) in node.nodes.entries) { + if (key case YamlScalar(value: 'toolchain')) { + toolchain = _toolchainFromNode(value); + } else if (key case YamlScalar(value: 'extra_flags')) { + if (value case YamlList(nodes: List list)) { + if (list.every((element) { + if (element case YamlScalar(value: String _)) { + return true; + } + return false; + })) { + flags = list.map((e) => e.value as String).toList(); + continue; + } + } + throw SourceSpanException( + 'Extra flags must be a list of strings', value.span); + } else { + throw SourceSpanException( + 'Unknown cargo option type. Must be "toolchain" or "extra_flags".', + key.span); + } + } + return CargoBuildOptions(toolchain: toolchain, flags: flags); + } +} + +extension on YamlMap { + /// Map that extracts keys so that we can do map case check on them. + Map get valueMap => + nodes.map((key, value) => MapEntry(key.value, value)); +} + +class PrecompiledBinaries { + final String uriPrefix; + final PublicKey publicKey; + + PrecompiledBinaries({ + required this.uriPrefix, + required this.publicKey, + }); + + static PublicKey _publicKeyFromHex(String key, SourceSpan? span) { + final bytes = HEX.decode(key); + if (bytes.length != 32) { + throw SourceSpanException( + 'Invalid public key. Must be 32 bytes long.', span); + } + return PublicKey(bytes); + } + + static PrecompiledBinaries parse(YamlNode node) { + if (node case YamlMap(valueMap: Map map)) { + if (map + case { + 'url_prefix': YamlNode urlPrefixNode, + 'public_key': YamlNode publicKeyNode, + }) { + final urlPrefix = switch (urlPrefixNode) { + YamlScalar(value: String urlPrefix) => urlPrefix, + _ => throw SourceSpanException( + 'Invalid URL prefix value.', urlPrefixNode.span), + }; + final publicKey = switch (publicKeyNode) { + YamlScalar(value: String publicKey) => + _publicKeyFromHex(publicKey, publicKeyNode.span), + _ => throw SourceSpanException( + 'Invalid public key value.', publicKeyNode.span), + }; + return PrecompiledBinaries( + uriPrefix: urlPrefix, + publicKey: publicKey, + ); + } + } + throw SourceSpanException( + 'Invalid precompiled binaries value. ' + 'Expected Map with "url_prefix" and "public_key".', + node.span); + } +} + +/// Cargokit options specified for Rust crate. +class CargokitCrateOptions { + CargokitCrateOptions({ + this.cargo = const {}, + this.precompiledBinaries, + }); + + final Map cargo; + final PrecompiledBinaries? precompiledBinaries; + + static CargokitCrateOptions parse(YamlNode node) { + if (node is! YamlMap) { + throw SourceSpanException('Cargokit options must be a map', node.span); + } + final options = {}; + PrecompiledBinaries? precompiledBinaries; + + for (final entry in node.nodes.entries) { + if (entry + case MapEntry( + key: YamlScalar(value: 'cargo'), + value: YamlNode node, + )) { + if (node is! YamlMap) { + throw SourceSpanException('Cargo options must be a map', node.span); + } + for (final MapEntry(:YamlNode key, :value) in node.nodes.entries) { + if (key case YamlScalar(value: String name)) { + final configuration = BuildConfiguration.values + .firstWhereOrNull((element) => element.name == name); + if (configuration != null) { + options[configuration] = CargoBuildOptions.parse(value); + continue; + } + } + throw SourceSpanException( + 'Unknown build configuration. Must be one of ${BuildConfiguration.values.map((e) => e.name)}.', + key.span); + } + } else if (entry.key case YamlScalar(value: 'precompiled_binaries')) { + precompiledBinaries = PrecompiledBinaries.parse(entry.value); + } else { + throw SourceSpanException( + 'Unknown cargokit option type. Must be "cargo" or "precompiled_binaries".', + entry.key.span); + } + } + return CargokitCrateOptions( + cargo: options, + precompiledBinaries: precompiledBinaries, + ); + } + + static CargokitCrateOptions load({ + required String manifestDir, + }) { + final uri = Uri.file(path.join(manifestDir, "cargokit.yaml")); + final file = File.fromUri(uri); + if (file.existsSync()) { + final contents = loadYamlNode(file.readAsStringSync(), sourceUrl: uri); + return parse(contents); + } else { + return CargokitCrateOptions(); + } + } +} + +class CargokitUserOptions { + // When Rustup is installed always build locally unless user opts into + // using precompiled binaries. + static bool defaultUsePrecompiledBinaries() { + return Rustup.executablePath() == null; + } + + CargokitUserOptions({ + required this.usePrecompiledBinaries, + required this.verboseLogging, + }); + + CargokitUserOptions._() + : usePrecompiledBinaries = defaultUsePrecompiledBinaries(), + verboseLogging = false; + + static CargokitUserOptions parse(YamlNode node) { + if (node is! YamlMap) { + throw SourceSpanException('Cargokit options must be a map', node.span); + } + bool usePrecompiledBinaries = defaultUsePrecompiledBinaries(); + bool verboseLogging = false; + + for (final entry in node.nodes.entries) { + if (entry.key case YamlScalar(value: 'use_precompiled_binaries')) { + if (entry.value case YamlScalar(value: bool value)) { + usePrecompiledBinaries = value; + continue; + } + throw SourceSpanException( + 'Invalid value for "use_precompiled_binaries". Must be a boolean.', + entry.value.span); + } else if (entry.key case YamlScalar(value: 'verbose_logging')) { + if (entry.value case YamlScalar(value: bool value)) { + verboseLogging = value; + continue; + } + throw SourceSpanException( + 'Invalid value for "verbose_logging". Must be a boolean.', + entry.value.span); + } else { + throw SourceSpanException( + 'Unknown cargokit option type. Must be "use_precompiled_binaries" or "verbose_logging".', + entry.key.span); + } + } + return CargokitUserOptions( + usePrecompiledBinaries: usePrecompiledBinaries, + verboseLogging: verboseLogging, + ); + } + + static CargokitUserOptions load() { + String fileName = "cargokit_options.yaml"; + var userProjectDir = Directory(Environment.rootProjectDir); + + while (userProjectDir.parent.path != userProjectDir.path) { + final configFile = File(path.join(userProjectDir.path, fileName)); + if (configFile.existsSync()) { + final contents = loadYamlNode( + configFile.readAsStringSync(), + sourceUrl: configFile.uri, + ); + final res = parse(contents); + if (res.verboseLogging) { + _log.info('Found user options file at ${configFile.path}'); + } + return res; + } + userProjectDir = userProjectDir.parent; + } + return CargokitUserOptions._(); + } + + final bool usePrecompiledBinaries; + final bool verboseLogging; +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/precompile_binaries.dart b/packages/agent_dart/cargokit/build_tool/lib/src/precompile_binaries.dart new file mode 100644 index 00000000..c27f4195 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/precompile_binaries.dart @@ -0,0 +1,202 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:ed25519_edwards/ed25519_edwards.dart'; +import 'package:github/github.dart'; +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as path; + +import 'artifacts_provider.dart'; +import 'builder.dart'; +import 'cargo.dart'; +import 'crate_hash.dart'; +import 'options.dart'; +import 'rustup.dart'; +import 'target.dart'; + +final _log = Logger('precompile_binaries'); + +class PrecompileBinaries { + PrecompileBinaries({ + required this.privateKey, + required this.githubToken, + required this.repositorySlug, + required this.manifestDir, + required this.targets, + this.androidSdkLocation, + this.androidNdkVersion, + this.androidMinSdkVersion, + this.tempDir, + }); + + final PrivateKey privateKey; + final String githubToken; + final RepositorySlug repositorySlug; + final String manifestDir; + final List targets; + final String? androidSdkLocation; + final String? androidNdkVersion; + final int? androidMinSdkVersion; + final String? tempDir; + + static String fileName(Target target, String name) { + return '${target.rust}_$name'; + } + + static String signatureFileName(Target target, String name) { + return '${target.rust}_$name.sig'; + } + + Future run() async { + final crateInfo = CrateInfo.load(manifestDir); + + final targets = List.of(this.targets); + if (targets.isEmpty) { + targets.addAll([ + ...Target.buildableTargets(), + if (androidSdkLocation != null) ...Target.androidTargets(), + ]); + } + + _log.info('Precompiling binaries for $targets'); + + final hash = CrateHash.compute(manifestDir); + _log.info('Computed crate hash: $hash'); + + final String tagName = 'precompiled_$hash'; + + final github = GitHub(auth: Authentication.withToken(githubToken)); + final repo = github.repositories; + final release = await _getOrCreateRelease( + repo: repo, + tagName: tagName, + packageName: crateInfo.packageName, + hash: hash, + ); + + final tempDir = this.tempDir != null + ? Directory(this.tempDir!) + : Directory.systemTemp.createTempSync('precompiled_'); + + tempDir.createSync(recursive: true); + + final crateOptions = CargokitCrateOptions.load( + manifestDir: manifestDir, + ); + + final buildEnvironment = BuildEnvironment( + configuration: BuildConfiguration.release, + crateOptions: crateOptions, + targetTempDir: tempDir.path, + manifestDir: manifestDir, + crateInfo: crateInfo, + isAndroid: androidSdkLocation != null, + androidSdkPath: androidSdkLocation, + androidNdkVersion: androidNdkVersion, + androidMinSdkVersion: androidMinSdkVersion, + ); + + final rustup = Rustup(); + + for (final target in targets) { + final artifactNames = getArtifactNames( + target: target, + libraryName: crateInfo.packageName, + remote: true, + ); + + if (artifactNames.every((name) { + final fileName = PrecompileBinaries.fileName(target, name); + return (release.assets ?? []).any((e) => e.name == fileName); + })) { + _log.info("All artifacts for $target already exist - skipping"); + continue; + } + + _log.info('Building for $target'); + + final builder = + RustBuilder(target: target, environment: buildEnvironment); + builder.prepare(rustup); + final res = await builder.build(); + + final assets = []; + for (final name in artifactNames) { + final file = File(path.join(res, name)); + if (!file.existsSync()) { + throw Exception('Missing artifact: ${file.path}'); + } + + final data = file.readAsBytesSync(); + final create = CreateReleaseAsset( + name: PrecompileBinaries.fileName(target, name), + contentType: "application/octet-stream", + assetData: data, + ); + final signature = sign(privateKey, data); + final signatureCreate = CreateReleaseAsset( + name: signatureFileName(target, name), + contentType: "application/octet-stream", + assetData: signature, + ); + bool verified = verify(public(privateKey), data, signature); + if (!verified) { + throw Exception('Signature verification failed'); + } + assets.add(create); + assets.add(signatureCreate); + } + _log.info('Uploading assets: ${assets.map((e) => e.name)}'); + for (final asset in assets) { + // This seems to be failing on CI so do it one by one + int retryCount = 0; + while (true) { + try { + await repo.uploadReleaseAssets(release, [asset]); + break; + } on Exception catch (e) { + if (retryCount == 10) { + rethrow; + } + ++retryCount; + _log.shout( + 'Upload failed (attempt $retryCount, will retry): ${e.toString()}'); + await Future.delayed(Duration(seconds: 2)); + } + } + } + } + + _log.info('Cleaning up'); + tempDir.deleteSync(recursive: true); + } + + Future _getOrCreateRelease({ + required RepositoriesService repo, + required String tagName, + required String packageName, + required String hash, + }) async { + Release release; + try { + _log.info('Fetching release $tagName'); + release = await repo.getReleaseByTagName(repositorySlug, tagName); + } on ReleaseNotFound { + _log.info('Release not found - creating release $tagName'); + release = await repo.createRelease( + repositorySlug, + CreateRelease.from( + tagName: tagName, + name: 'Precompiled binaries ${hash.substring(0, 8)}', + targetCommitish: null, + isDraft: false, + isPrerelease: false, + body: 'Precompiled binaries for crate $packageName, ' + 'crate hash $hash.', + )); + } + return release; + } +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/rustup.dart b/packages/agent_dart/cargokit/build_tool/lib/src/rustup.dart new file mode 100644 index 00000000..0ac8d086 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/rustup.dart @@ -0,0 +1,136 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:collection/collection.dart'; +import 'package:path/path.dart' as path; + +import 'util.dart'; + +class _Toolchain { + _Toolchain( + this.name, + this.targets, + ); + + final String name; + final List targets; +} + +class Rustup { + List? installedTargets(String toolchain) { + final targets = _installedTargets(toolchain); + return targets != null ? List.unmodifiable(targets) : null; + } + + void installToolchain(String toolchain) { + log.info("Installing Rust toolchain: $toolchain"); + runCommand("rustup", ['toolchain', 'install', toolchain]); + _installedToolchains + .add(_Toolchain(toolchain, _getInstalledTargets(toolchain))); + } + + void installTarget( + String target, { + required String toolchain, + }) { + log.info("Installing Rust target: $target"); + runCommand("rustup", [ + 'target', + 'add', + '--toolchain', + toolchain, + target, + ]); + _installedTargets(toolchain)?.add(target); + } + + final List<_Toolchain> _installedToolchains; + + Rustup() : _installedToolchains = _getInstalledToolchains(); + + List? _installedTargets(String toolchain) => _installedToolchains + .firstWhereOrNull( + (e) => e.name == toolchain || e.name.startsWith('$toolchain-')) + ?.targets; + + static List<_Toolchain> _getInstalledToolchains() { + String extractToolchainName(String line) { + // ignore (default) after toolchain name + final parts = line.split(' '); + return parts[0]; + } + + final res = runCommand("rustup", ['toolchain', 'list']); + + // To list all non-custom toolchains, we need to filter out lines that + // don't start with "stable", "beta", or "nightly". + Pattern nonCustom = RegExp(r"^(stable|beta|nightly)"); + final lines = res.stdout + .toString() + .split('\n') + .where((e) => e.isNotEmpty && e.startsWith(nonCustom)) + .map(extractToolchainName) + .toList(growable: true); + + return lines + .map( + (name) => _Toolchain( + name, + _getInstalledTargets(name), + ), + ) + .toList(growable: true); + } + + static List _getInstalledTargets(String toolchain) { + final res = runCommand("rustup", [ + 'target', + 'list', + '--toolchain', + toolchain, + '--installed', + ]); + final lines = res.stdout + .toString() + .split('\n') + .where((e) => e.isNotEmpty) + .toList(growable: true); + return lines; + } + + bool _didInstallRustSrcForNightly = false; + + void installRustSrcForNightly() { + if (_didInstallRustSrcForNightly) { + return; + } + // Useful for -Z build-std + runCommand( + "rustup", + ['component', 'add', 'rust-src', '--toolchain', 'nightly'], + ); + _didInstallRustSrcForNightly = true; + } + + static String? executablePath() { + final envPath = Platform.environment['PATH']; + final envPathSeparator = Platform.isWindows ? ';' : ':'; + final home = Platform.isWindows + ? Platform.environment['USERPROFILE'] + : Platform.environment['HOME']; + final paths = [ + if (home != null) path.join(home, '.cargo', 'bin'), + if (envPath != null) ...envPath.split(envPathSeparator), + ]; + for (final p in paths) { + final rustup = Platform.isWindows ? 'rustup.exe' : 'rustup'; + final rustupPath = path.join(p, rustup); + if (File(rustupPath).existsSync()) { + return rustupPath; + } + } + return null; + } +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/target.dart b/packages/agent_dart/cargokit/build_tool/lib/src/target.dart new file mode 100644 index 00000000..6fbc58b6 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/target.dart @@ -0,0 +1,140 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:collection/collection.dart'; + +import 'util.dart'; + +class Target { + Target({ + required this.rust, + this.flutter, + this.android, + this.androidMinSdkVersion, + this.darwinPlatform, + this.darwinArch, + }); + + static final all = [ + Target( + rust: 'armv7-linux-androideabi', + flutter: 'android-arm', + android: 'armeabi-v7a', + androidMinSdkVersion: 16, + ), + Target( + rust: 'aarch64-linux-android', + flutter: 'android-arm64', + android: 'arm64-v8a', + androidMinSdkVersion: 21, + ), + Target( + rust: 'i686-linux-android', + flutter: 'android-x86', + android: 'x86', + androidMinSdkVersion: 16, + ), + Target( + rust: 'x86_64-linux-android', + flutter: 'android-x64', + android: 'x86_64', + androidMinSdkVersion: 21, + ), + Target( + rust: 'x86_64-pc-windows-msvc', + flutter: 'windows-x64', + ), + Target( + rust: 'x86_64-unknown-linux-gnu', + flutter: 'linux-x64', + ), + Target( + rust: 'aarch64-unknown-linux-gnu', + flutter: 'linux-arm64', + ), + Target( + rust: 'x86_64-apple-darwin', + darwinPlatform: 'macosx', + darwinArch: 'x86_64', + ), + Target( + rust: 'aarch64-apple-darwin', + darwinPlatform: 'macosx', + darwinArch: 'arm64', + ), + Target( + rust: 'aarch64-apple-ios', + darwinPlatform: 'iphoneos', + darwinArch: 'arm64', + ), + Target( + rust: 'aarch64-apple-ios-sim', + darwinPlatform: 'iphonesimulator', + darwinArch: 'arm64', + ), + Target( + rust: 'x86_64-apple-ios', + darwinPlatform: 'iphonesimulator', + darwinArch: 'x86_64', + ), + ]; + + static Target? forFlutterName(String flutterName) { + return all.firstWhereOrNull((element) => element.flutter == flutterName); + } + + static Target? forDarwin({ + required String platformName, + required String darwinAarch, + }) { + return all.firstWhereOrNull((element) => // + element.darwinPlatform == platformName && + element.darwinArch == darwinAarch); + } + + static Target? forRustTriple(String triple) { + return all.firstWhereOrNull((element) => element.rust == triple); + } + + static List androidTargets() { + return all + .where((element) => element.android != null) + .toList(growable: false); + } + + /// Returns buildable targets on current host platform ignoring Android targets. + static List buildableTargets() { + if (Platform.isLinux) { + // Right now we don't support cross-compiling on Linux. So we just return + // the host target. + final arch = runCommand('arch', []).stdout as String; + if (arch.trim() == 'aarch64') { + return [Target.forRustTriple('aarch64-unknown-linux-gnu')!]; + } else { + return [Target.forRustTriple('x86_64-unknown-linux-gnu')!]; + } + } + return all.where((target) { + if (Platform.isWindows) { + return target.rust.contains('-windows-'); + } else if (Platform.isMacOS) { + return target.darwinPlatform != null; + } + return false; + }).toList(growable: false); + } + + @override + String toString() { + return rust; + } + + final String? flutter; + final String rust; + final String? android; + final int? androidMinSdkVersion; + final String? darwinPlatform; + final String? darwinArch; +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/util.dart b/packages/agent_dart/cargokit/build_tool/lib/src/util.dart new file mode 100644 index 00000000..8bb6a872 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/util.dart @@ -0,0 +1,172 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:convert'; +import 'dart:io'; + +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as path; + +import 'logging.dart'; +import 'rustup.dart'; + +final log = Logger("process"); + +class CommandFailedException implements Exception { + final String executable; + final List arguments; + final ProcessResult result; + + CommandFailedException({ + required this.executable, + required this.arguments, + required this.result, + }); + + @override + String toString() { + final stdout = result.stdout.toString().trim(); + final stderr = result.stderr.toString().trim(); + return [ + "External Command: $executable ${arguments.map((e) => '"$e"').join(' ')}", + "Returned Exit Code: ${result.exitCode}", + kSeparator, + "STDOUT:", + if (stdout.isNotEmpty) stdout, + kSeparator, + "STDERR:", + if (stderr.isNotEmpty) stderr, + ].join('\n'); + } +} + +class TestRunCommandArgs { + final String executable; + final List arguments; + final String? workingDirectory; + final Map? environment; + final bool includeParentEnvironment; + final bool runInShell; + final Encoding? stdoutEncoding; + final Encoding? stderrEncoding; + + TestRunCommandArgs({ + required this.executable, + required this.arguments, + this.workingDirectory, + this.environment, + this.includeParentEnvironment = true, + this.runInShell = false, + this.stdoutEncoding, + this.stderrEncoding, + }); +} + +class TestRunCommandResult { + TestRunCommandResult({ + this.pid = 1, + this.exitCode = 0, + this.stdout = '', + this.stderr = '', + }); + + final int pid; + final int exitCode; + final String stdout; + final String stderr; +} + +TestRunCommandResult Function(TestRunCommandArgs args)? testRunCommandOverride; + +ProcessResult runCommand( + String executable, + List arguments, { + String? workingDirectory, + Map? environment, + bool includeParentEnvironment = true, + bool runInShell = false, + Encoding? stdoutEncoding = systemEncoding, + Encoding? stderrEncoding = systemEncoding, +}) { + if (testRunCommandOverride != null) { + final result = testRunCommandOverride!(TestRunCommandArgs( + executable: executable, + arguments: arguments, + workingDirectory: workingDirectory, + environment: environment, + includeParentEnvironment: includeParentEnvironment, + runInShell: runInShell, + stdoutEncoding: stdoutEncoding, + stderrEncoding: stderrEncoding, + )); + return ProcessResult( + result.pid, + result.exitCode, + result.stdout, + result.stderr, + ); + } + log.finer('Running command $executable ${arguments.join(' ')}'); + final res = Process.runSync( + _resolveExecutable(executable), + arguments, + workingDirectory: workingDirectory, + environment: environment, + includeParentEnvironment: includeParentEnvironment, + runInShell: runInShell, + stderrEncoding: stderrEncoding, + stdoutEncoding: stdoutEncoding, + ); + if (res.exitCode != 0) { + throw CommandFailedException( + executable: executable, + arguments: arguments, + result: res, + ); + } else { + return res; + } +} + +class RustupNotFoundException implements Exception { + @override + String toString() { + return [ + ' ', + 'rustup not found in PATH.', + ' ', + 'Maybe you need to install Rust? It only takes a minute:', + ' ', + if (Platform.isWindows) 'https://www.rust-lang.org/tools/install', + if (hasHomebrewRustInPath()) ...[ + '\$ brew unlink rust # Unlink homebrew Rust from PATH', + ], + if (!Platform.isWindows) + "\$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh", + ' ', + ].join('\n'); + } + + static bool hasHomebrewRustInPath() { + if (!Platform.isMacOS) { + return false; + } + final envPath = Platform.environment['PATH'] ?? ''; + final paths = envPath.split(':'); + return paths.any((p) { + return p.contains('homebrew') && File(path.join(p, 'rustc')).existsSync(); + }); + } +} + +String _resolveExecutable(String executable) { + if (executable == 'rustup') { + final resolved = Rustup.executablePath(); + if (resolved != null) { + return resolved; + } + throw RustupNotFoundException(); + } else { + return executable; + } +} diff --git a/packages/agent_dart/cargokit/build_tool/lib/src/verify_binaries.dart b/packages/agent_dart/cargokit/build_tool/lib/src/verify_binaries.dart new file mode 100644 index 00000000..2366b57b --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/lib/src/verify_binaries.dart @@ -0,0 +1,84 @@ +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import 'dart:io'; + +import 'package:ed25519_edwards/ed25519_edwards.dart'; +import 'package:http/http.dart'; + +import 'artifacts_provider.dart'; +import 'cargo.dart'; +import 'crate_hash.dart'; +import 'options.dart'; +import 'precompile_binaries.dart'; +import 'target.dart'; + +class VerifyBinaries { + VerifyBinaries({ + required this.manifestDir, + }); + + final String manifestDir; + + Future run() async { + final crateInfo = CrateInfo.load(manifestDir); + + final config = CargokitCrateOptions.load(manifestDir: manifestDir); + final precompiledBinaries = config.precompiledBinaries; + if (precompiledBinaries == null) { + stdout.writeln('Crate does not support precompiled binaries.'); + } else { + final crateHash = CrateHash.compute(manifestDir); + stdout.writeln('Crate hash: $crateHash'); + + for (final target in Target.all) { + final message = 'Checking ${target.rust}...'; + stdout.write(message.padRight(40)); + stdout.flush(); + + final artifacts = getArtifactNames( + target: target, + libraryName: crateInfo.packageName, + remote: true, + ); + + final prefix = precompiledBinaries.uriPrefix; + + bool ok = true; + + for (final artifact in artifacts) { + final fileName = PrecompileBinaries.fileName(target, artifact); + final signatureFileName = + PrecompileBinaries.signatureFileName(target, artifact); + + final url = Uri.parse('$prefix$crateHash/$fileName'); + final signatureUrl = + Uri.parse('$prefix$crateHash/$signatureFileName'); + + final signature = await get(signatureUrl); + if (signature.statusCode != 200) { + stdout.writeln('MISSING'); + ok = false; + break; + } + final asset = await get(url); + if (asset.statusCode != 200) { + stdout.writeln('MISSING'); + ok = false; + break; + } + + if (!verify(precompiledBinaries.publicKey, asset.bodyBytes, + signature.bodyBytes)) { + stdout.writeln('INVALID SIGNATURE'); + ok = false; + } + } + + if (ok) { + stdout.writeln('OK'); + } + } + } + } +} diff --git a/packages/agent_dart/cargokit/build_tool/pubspec.yaml b/packages/agent_dart/cargokit/build_tool/pubspec.yaml new file mode 100644 index 00000000..18c61e33 --- /dev/null +++ b/packages/agent_dart/cargokit/build_tool/pubspec.yaml @@ -0,0 +1,33 @@ +# This is copied from Cargokit (which is the official way to use it currently) +# Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +name: build_tool +description: Cargokit build_tool. Facilitates the build of Rust crate during Flutter application build. +publish_to: none +version: 1.0.0 + +environment: + sdk: ">=3.0.0 <4.0.0" + +# Add regular dependencies here. +dependencies: + # these are pinned on purpose because the bundle_tool_runner doesn't have + # pubspec.lock. See run_build_tool.sh + logging: 1.2.0 + path: 1.8.0 + version: 3.0.0 + collection: 1.18.0 + ed25519_edwards: 0.3.1 + hex: 0.2.0 + yaml: 3.1.2 + source_span: 1.10.0 + github: 9.17.0 + args: 2.4.2 + crypto: 3.0.3 + convert: 3.1.1 + http: 1.1.0 + toml: 0.14.0 + +dev_dependencies: + lints: ^2.1.0 + test: ^1.24.0 diff --git a/packages/agent_dart/cargokit/cmake/cargokit.cmake b/packages/agent_dart/cargokit/cmake/cargokit.cmake new file mode 100644 index 00000000..ddd05df9 --- /dev/null +++ b/packages/agent_dart/cargokit/cmake/cargokit.cmake @@ -0,0 +1,99 @@ +SET(cargokit_cmake_root "${CMAKE_CURRENT_LIST_DIR}/..") + +# Workaround for https://github.com/dart-lang/pub/issues/4010 +get_filename_component(cargokit_cmake_root "${cargokit_cmake_root}" REALPATH) + +if(WIN32) + # REALPATH does not properly resolve symlinks on windows :-/ + execute_process(COMMAND powershell -ExecutionPolicy Bypass -File "${CMAKE_CURRENT_LIST_DIR}/resolve_symlinks.ps1" "${cargokit_cmake_root}" OUTPUT_VARIABLE cargokit_cmake_root OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() + +# Arguments +# - target: CMAKE target to which rust library is linked +# - manifest_dir: relative path from current folder to directory containing cargo manifest +# - lib_name: cargo package name +# - any_symbol_name: name of any exported symbol from the library. +# used on windows to force linking with library. +function(apply_cargokit target manifest_dir lib_name any_symbol_name) + + set(CARGOKIT_LIB_NAME "${lib_name}") + set(CARGOKIT_LIB_FULL_NAME "${CMAKE_SHARED_MODULE_PREFIX}${CARGOKIT_LIB_NAME}${CMAKE_SHARED_MODULE_SUFFIX}") + if (CMAKE_CONFIGURATION_TYPES) + set(CARGOKIT_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/$") + set(OUTPUT_LIB "${CMAKE_CURRENT_BINARY_DIR}/$/${CARGOKIT_LIB_FULL_NAME}") + else() + set(CARGOKIT_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}") + set(OUTPUT_LIB "${CMAKE_CURRENT_BINARY_DIR}/${CARGOKIT_LIB_FULL_NAME}") + endif() + set(CARGOKIT_TEMP_DIR "${CMAKE_CURRENT_BINARY_DIR}/cargokit_build") + + if (FLUTTER_TARGET_PLATFORM) + set(CARGOKIT_TARGET_PLATFORM "${FLUTTER_TARGET_PLATFORM}") + else() + set(CARGOKIT_TARGET_PLATFORM "windows-x64") + endif() + + set(CARGOKIT_ENV + "CARGOKIT_CMAKE=${CMAKE_COMMAND}" + "CARGOKIT_CONFIGURATION=$" + "CARGOKIT_MANIFEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/${manifest_dir}" + "CARGOKIT_TARGET_TEMP_DIR=${CARGOKIT_TEMP_DIR}" + "CARGOKIT_OUTPUT_DIR=${CARGOKIT_OUTPUT_DIR}" + "CARGOKIT_TARGET_PLATFORM=${CARGOKIT_TARGET_PLATFORM}" + "CARGOKIT_TOOL_TEMP_DIR=${CARGOKIT_TEMP_DIR}/tool" + "CARGOKIT_ROOT_PROJECT_DIR=${CMAKE_SOURCE_DIR}" + ) + + if (WIN32) + set(SCRIPT_EXTENSION ".cmd") + set(IMPORT_LIB_EXTENSION ".lib") + else() + set(SCRIPT_EXTENSION ".sh") + set(IMPORT_LIB_EXTENSION "") + execute_process(COMMAND chmod +x "${cargokit_cmake_root}/run_build_tool${SCRIPT_EXTENSION}") + endif() + + # Using generators in custom command is only supported in CMake 3.20+ + if (CMAKE_CONFIGURATION_TYPES AND ${CMAKE_VERSION} VERSION_LESS "3.20.0") + foreach(CONFIG IN LISTS CMAKE_CONFIGURATION_TYPES) + add_custom_command( + OUTPUT + "${CMAKE_CURRENT_BINARY_DIR}/${CONFIG}/${CARGOKIT_LIB_FULL_NAME}" + "${CMAKE_CURRENT_BINARY_DIR}/_phony_" + COMMAND ${CMAKE_COMMAND} -E env ${CARGOKIT_ENV} + "${cargokit_cmake_root}/run_build_tool${SCRIPT_EXTENSION}" build-cmake + VERBATIM + ) + endforeach() + else() + add_custom_command( + OUTPUT + ${OUTPUT_LIB} + "${CMAKE_CURRENT_BINARY_DIR}/_phony_" + COMMAND ${CMAKE_COMMAND} -E env ${CARGOKIT_ENV} + "${cargokit_cmake_root}/run_build_tool${SCRIPT_EXTENSION}" build-cmake + VERBATIM + ) + endif() + + + set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/_phony_" PROPERTIES SYMBOLIC TRUE) + + if (TARGET ${target}) + # If we have actual cmake target provided create target and make existing + # target depend on it + add_custom_target("${target}_cargokit" DEPENDS ${OUTPUT_LIB}) + add_dependencies("${target}" "${target}_cargokit") + target_link_libraries("${target}" PRIVATE "${OUTPUT_LIB}${IMPORT_LIB_EXTENSION}") + if(WIN32) + target_link_options(${target} PRIVATE "/INCLUDE:${any_symbol_name}") + endif() + else() + # Otherwise (FFI) just use ALL to force building always + add_custom_target("${target}_cargokit" ALL DEPENDS ${OUTPUT_LIB}) + endif() + + # Allow adding the output library to plugin bundled libraries + set("${target}_cargokit_lib" ${OUTPUT_LIB} PARENT_SCOPE) + +endfunction() diff --git a/packages/agent_dart/cargokit/cmake/resolve_symlinks.ps1 b/packages/agent_dart/cargokit/cmake/resolve_symlinks.ps1 new file mode 100644 index 00000000..3d10d283 --- /dev/null +++ b/packages/agent_dart/cargokit/cmake/resolve_symlinks.ps1 @@ -0,0 +1,27 @@ +function Resolve-Symlinks { + [CmdletBinding()] + [OutputType([string])] + param( + [Parameter(Position = 0, Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] + [string] $Path + ) + + [string] $separator = '/' + [string[]] $parts = $Path.Split($separator) + + [string] $realPath = '' + foreach ($part in $parts) { + if ($realPath -and !$realPath.EndsWith($separator)) { + $realPath += $separator + } + $realPath += $part + $item = Get-Item $realPath + if ($item.Target) { + $realPath = $item.Target.Replace('\', '/') + } + } + $realPath +} + +$path=Resolve-Symlinks -Path $args[0] +Write-Host $path diff --git a/packages/agent_dart/cargokit/gradle/plugin.gradle b/packages/agent_dart/cargokit/gradle/plugin.gradle new file mode 100644 index 00000000..55f2637e --- /dev/null +++ b/packages/agent_dart/cargokit/gradle/plugin.gradle @@ -0,0 +1,180 @@ +//package cargokit.gradle +/// This is copied from Cargokit (which is the official way to use it currently) +/// Details: https://fzyzcjy.github.io/flutter_rust_bridge/manual/integrate/builtin + +import java.nio.file.Paths +import org.apache.tools.ant.taskdefs.condition.Os + +CargoKitPlugin.file = buildscript.sourceFile + +apply plugin: CargoKitPlugin + +class CargoKitExtension { + String manifestDir; // Relative path to folder containing Cargo.toml + String libname; // Library name within Cargo.toml. Must be a cdylib +} + +abstract class CargoKitBuildTask extends DefaultTask { + + @Input + String buildMode + + @Input + String buildDir + + @Input + String outputDir + + @Input + String ndkVersion + + @Input + String sdkDirectory + + @Input + int compileSdkVersion; + + @Input + int minSdkVersion; + + @Input + String pluginFile + + @Input + List targetPlatforms + + @TaskAction + def build() { + if (project.cargokit.manifestDir == null) { + throw new GradleException("Property 'manifestDir' must be set on cargokit extension"); + } + + if (project.cargokit.libname == null) { + throw new GradleException("Property 'libname' must be set on cargokit extension"); + } + + def executableName = Os.isFamily(Os.FAMILY_WINDOWS) ? "run_build_tool.cmd" : "run_build_tool.sh" + def path = Paths.get(new File(pluginFile).parent, "..", executableName); + + def manifestDir = Paths.get(project.buildscript.sourceFile.parent, project.cargokit.manifestDir) + + def rootProjectDir = project.rootProject.projectDir + + if (!Os.isFamily(Os.FAMILY_WINDOWS)) { + project.exec { + commandLine 'chmod', '+x', path + } + } + + project.exec { + executable path + args "build-gradle" + environment "CARGOKIT_ROOT_PROJECT_DIR", rootProjectDir + environment "CARGOKIT_TOOL_TEMP_DIR", "${buildDir}/build_tool" + environment "CARGOKIT_MANIFEST_DIR", manifestDir + environment "CARGOKIT_CONFIGURATION", buildMode + environment "CARGOKIT_TARGET_TEMP_DIR", buildDir + environment "CARGOKIT_OUTPUT_DIR", outputDir + environment "CARGOKIT_NDK_VERSION", ndkVersion + environment "CARGOKIT_SDK_DIR", sdkDirectory + environment "CARGOKIT_COMPILE_SDK_VERSION", compileSdkVersion + environment "CARGOKIT_MIN_SDK_VERSION", minSdkVersion + environment "CARGOKIT_TARGET_PLATFORMS", targetPlatforms.join(",") + environment "CARGOKIT_JAVA_HOME", System.properties['java.home'] + } + } +} + +class CargoKitPlugin implements Plugin { + + static String file; + + private Plugin findFlutterPlugin(Project rootProject) { + _findFlutterPlugin(rootProject.childProjects) + } + + private Plugin _findFlutterPlugin(Map projects) { + for (project in projects) { + for (plugin in project.value.getPlugins()) { + if (plugin.class.name == "FlutterPlugin") { + return plugin; + } + } + def plugin = _findFlutterPlugin(project.value.childProjects); + if (plugin != null) { + return plugin; + } + } + return null; + } + + @Override + void apply(Project project) { + def plugin = findFlutterPlugin(project.rootProject); + + project.extensions.create("cargokit", CargoKitExtension) + + if (plugin == null) { + print("Flutter plugin not found, CargoKit plugin will not be applied.") + return; + } + + def cargoBuildDir = "${project.buildDir}/build" + + // Determine if the project is an application or library + def isApplication = plugin.project.plugins.hasPlugin('com.android.application') + def variants = isApplication ? plugin.project.android.applicationVariants : plugin.project.android.libraryVariants + + variants.all { variant -> + + final buildType = variant.buildType.name + + def cargoOutputDir = "${project.buildDir}/jniLibs/${buildType}"; + def jniLibs = project.android.sourceSets.maybeCreate(buildType).jniLibs; + jniLibs.srcDir(new File(cargoOutputDir)) + + def platforms = plugin.getTargetPlatforms().collect() + + // Same thing addFlutterDependencies does in flutter.gradle + if (buildType == "debug") { + platforms.add("android-x86") + platforms.add("android-x64") + } + + // The task name depends on plugin properties, which are not available + // at this point + project.getGradle().afterProject { + def taskName = "cargokitCargoBuild${project.cargokit.libname.capitalize()}${buildType.capitalize()}"; + + if (project.tasks.findByName(taskName)) { + return + } + + if (plugin.project.android.ndkVersion == null) { + throw new GradleException("Please set 'android.ndkVersion' in 'app/build.gradle'.") + } + + def task = project.tasks.create(taskName, CargoKitBuildTask.class) { + buildMode = variant.buildType.name + buildDir = cargoBuildDir + outputDir = cargoOutputDir + ndkVersion = plugin.project.android.ndkVersion + sdkDirectory = plugin.project.android.sdkDirectory + minSdkVersion = plugin.project.android.defaultConfig.minSdkVersion.apiLevel as int + compileSdkVersion = plugin.project.android.compileSdkVersion.substring(8) as int + targetPlatforms = platforms + pluginFile = CargoKitPlugin.file + } + def onTask = { newTask -> + if (newTask.name == "merge${buildType.capitalize()}NativeLibs") { + newTask.dependsOn task + // Fix gradle 7.4.2 not picking up JNI library changes + newTask.outputs.upToDateWhen { false } + } + } + project.tasks.each onTask + project.tasks.whenTaskAdded onTask + } + } + } +} diff --git a/packages/agent_dart/cargokit/run_build_tool.cmd b/packages/agent_dart/cargokit/run_build_tool.cmd new file mode 100644 index 00000000..c45d0aa8 --- /dev/null +++ b/packages/agent_dart/cargokit/run_build_tool.cmd @@ -0,0 +1,91 @@ +@echo off +setlocal + +setlocal ENABLEDELAYEDEXPANSION + +SET BASEDIR=%~dp0 + +if not exist "%CARGOKIT_TOOL_TEMP_DIR%" ( + mkdir "%CARGOKIT_TOOL_TEMP_DIR%" +) +cd /D "%CARGOKIT_TOOL_TEMP_DIR%" + +SET BUILD_TOOL_PKG_DIR=%BASEDIR%build_tool +SET DART=%FLUTTER_ROOT%\bin\cache\dart-sdk\bin\dart + +set BUILD_TOOL_PKG_DIR_POSIX=%BUILD_TOOL_PKG_DIR:\=/% + +( + echo name: build_tool_runner + echo version: 1.0.0 + echo publish_to: none + echo. + echo environment: + echo sdk: '^>=3.0.0 ^<4.0.0' + echo. + echo dependencies: + echo build_tool: + echo path: %BUILD_TOOL_PKG_DIR_POSIX% +) >pubspec.yaml + +if not exist bin ( + mkdir bin +) + +( + echo import 'package:build_tool/build_tool.dart' as build_tool; + echo void main^(List^ args^) ^{ + echo build_tool.runMain^(args^); + echo ^} +) >bin\build_tool_runner.dart + +SET PRECOMPILED=bin\build_tool_runner.dill + +REM To detect changes in package we compare output of DIR /s (recursive) +set PREV_PACKAGE_INFO=.dart_tool\package_info.prev +set CUR_PACKAGE_INFO=.dart_tool\package_info.cur + +DIR "%BUILD_TOOL_PKG_DIR%" /s > "%CUR_PACKAGE_INFO%_orig" + +REM Last line in dir output is free space on harddrive. That is bound to +REM change between invocation so we need to remove it +( + Set "Line=" + For /F "UseBackQ Delims=" %%A In ("%CUR_PACKAGE_INFO%_orig") Do ( + SetLocal EnableDelayedExpansion + If Defined Line Echo !Line! + EndLocal + Set "Line=%%A") +) >"%CUR_PACKAGE_INFO%" +DEL "%CUR_PACKAGE_INFO%_orig" + +REM Compare current directory listing with previous +FC /B "%CUR_PACKAGE_INFO%" "%PREV_PACKAGE_INFO%" > nul 2>&1 + +If %ERRORLEVEL% neq 0 ( + REM Changed - copy current to previous and remove precompiled kernel + if exist "%PREV_PACKAGE_INFO%" ( + DEL "%PREV_PACKAGE_INFO%" + ) + MOVE /Y "%CUR_PACKAGE_INFO%" "%PREV_PACKAGE_INFO%" + if exist "%PRECOMPILED%" ( + DEL "%PRECOMPILED%" + ) +) + +REM There is no CUR_PACKAGE_INFO it was renamed in previous step to %PREV_PACKAGE_INFO% +REM which means we need to do pub get and precompile +if not exist "%PRECOMPILED%" ( + echo Running pub get in "%cd%" + "%DART%" pub get --no-precompile + "%DART%" compile kernel bin/build_tool_runner.dart +) + +"%DART%" "%PRECOMPILED%" %* + +REM 253 means invalid snapshot version. +If %ERRORLEVEL% equ 253 ( + "%DART%" pub get --no-precompile + "%DART%" compile kernel bin/build_tool_runner.dart + "%DART%" "%PRECOMPILED%" %* +) diff --git a/packages/agent_dart/cargokit/run_build_tool.sh b/packages/agent_dart/cargokit/run_build_tool.sh new file mode 100755 index 00000000..6e594a23 --- /dev/null +++ b/packages/agent_dart/cargokit/run_build_tool.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash + +set -e + +BASEDIR=$(dirname "$0") + +mkdir -p "$CARGOKIT_TOOL_TEMP_DIR" + +cd "$CARGOKIT_TOOL_TEMP_DIR" + +# Write a very simple bin package in temp folder that depends on build_tool package +# from Cargokit. This is done to ensure that we don't pollute Cargokit folder +# with .dart_tool contents. + +BUILD_TOOL_PKG_DIR="$BASEDIR/build_tool" + +if [[ -z $FLUTTER_ROOT ]]; then # not defined + DART=dart +else + DART="$FLUTTER_ROOT/bin/cache/dart-sdk/bin/dart" +fi + +cat << EOF > "pubspec.yaml" +name: build_tool_runner +version: 1.0.0 +publish_to: none + +environment: + sdk: '>=3.0.0 <4.0.0' + +dependencies: + build_tool: + path: "$BUILD_TOOL_PKG_DIR" +EOF + +mkdir -p "bin" + +cat << EOF > "bin/build_tool_runner.dart" +import 'package:build_tool/build_tool.dart' as build_tool; +void main(List args) { + build_tool.runMain(args); +} +EOF + +# Create alias for `shasum` if it does not exist and `sha1sum` exists +if ! [ -x "$(command -v shasum)" ] && [ -x "$(command -v sha1sum)" ]; then + shopt -s expand_aliases + alias shasum="sha1sum" +fi + +# Dart run will not cache any package that has a path dependency, which +# is the case for our build_tool_runner. So instead we precompile the package +# ourselves. +# To invalidate the cached kernel we use the hash of ls -LR of the build_tool +# package directory. This should be good enough, as the build_tool package +# itself is not meant to have any path dependencies. + +if [[ "$OSTYPE" == "darwin"* ]]; then + PACKAGE_HASH=$(ls -lTR "$BUILD_TOOL_PKG_DIR" | shasum) +else + PACKAGE_HASH=$(ls -lR --full-time "$BUILD_TOOL_PKG_DIR" | shasum) +fi + +PACKAGE_HASH_FILE=".package_hash" + +if [ -f "$PACKAGE_HASH_FILE" ]; then + EXISTING_HASH=$(cat "$PACKAGE_HASH_FILE") + if [ "$PACKAGE_HASH" != "$EXISTING_HASH" ]; then + rm "$PACKAGE_HASH_FILE" + fi +fi + +# Run pub get if needed. +if [ ! -f "$PACKAGE_HASH_FILE" ]; then + "$DART" pub get --no-precompile + "$DART" compile kernel bin/build_tool_runner.dart + echo "$PACKAGE_HASH" > "$PACKAGE_HASH_FILE" +fi + +set +e + +"$DART" bin/build_tool_runner.dill "$@" + +exit_code=$? + +# 253 means invalid snapshot version. +if [ $exit_code == 253 ]; then + "$DART" pub get --no-precompile + "$DART" compile kernel bin/build_tool_runner.dart + "$DART" bin/build_tool_runner.dill "$@" + exit_code=$? +fi + +exit $exit_code diff --git a/example/.gitignore b/packages/agent_dart/example/.gitignore similarity index 92% rename from example/.gitignore rename to packages/agent_dart/example/.gitignore index 0fa6b675..732936d3 100644 --- a/example/.gitignore +++ b/packages/agent_dart/example/.gitignore @@ -8,9 +8,9 @@ .buildlog/ .history .svn/ +migrate_working_dir/ # IntelliJ related -*.iml *.ipr *.iws .idea/ @@ -31,9 +31,6 @@ .pub/ /build/ -# Web related -lib/generated_plugin_registrant.dart - # Symbolication related app.*.symbols diff --git a/packages/agent_dart/example/README.md b/packages/agent_dart/example/README.md new file mode 100644 index 00000000..aacd071b --- /dev/null +++ b/packages/agent_dart/example/README.md @@ -0,0 +1,16 @@ +# flutter_agent_dart_example + +Demonstrates how to use the flutter_agent_dart plugin. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/packages/agent_dart/example/agent_dart_example.iml b/packages/agent_dart/example/agent_dart_example.iml new file mode 100644 index 00000000..13c613d9 --- /dev/null +++ b/packages/agent_dart/example/agent_dart_example.iml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/agent_dart/example/analysis_options.yaml b/packages/agent_dart/example/analysis_options.yaml new file mode 100644 index 00000000..61b6c4de --- /dev/null +++ b/packages/agent_dart/example/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/example/android/.gitignore b/packages/agent_dart/example/android/.gitignore similarity index 100% rename from example/android/.gitignore rename to packages/agent_dart/example/android/.gitignore diff --git a/example/android/app/build.gradle b/packages/agent_dart/example/android/app/build.gradle similarity index 70% rename from example/android/app/build.gradle rename to packages/agent_dart/example/android/app/build.gradle index ba78c912..2ca4dfbe 100644 --- a/example/android/app/build.gradle +++ b/packages/agent_dart/example/android/app/build.gradle @@ -26,15 +26,16 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 33 + compileSdkVersion flutter.compileSdkVersion + ndkVersion flutter.ndkVersion compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { - jvmTarget = '11' + jvmTarget = '1.8' } sourceSets { @@ -43,9 +44,11 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.astrox.agent_dart_example" - minSdkVersion 23 - targetSdkVersion 31 + applicationId "com.astrox.agent_dart.flutter_agent_dart_example" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName } @@ -64,4 +67,5 @@ flutter { } dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } diff --git a/example/android/app/src/debug/AndroidManifest.xml b/packages/agent_dart/example/android/app/src/debug/AndroidManifest.xml similarity index 50% rename from example/android/app/src/debug/AndroidManifest.xml rename to packages/agent_dart/example/android/app/src/debug/AndroidManifest.xml index ef863c50..a57f5708 100644 --- a/example/android/app/src/debug/AndroidManifest.xml +++ b/packages/agent_dart/example/android/app/src/debug/AndroidManifest.xml @@ -1,6 +1,7 @@ - diff --git a/packages/agent_dart/example/android/app/src/main/AndroidManifest.xml b/packages/agent_dart/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..1a026a00 --- /dev/null +++ b/packages/agent_dart/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + diff --git a/example/android/app/src/main/kotlin/com/astrox/agent_dart_example/MainActivity.kt b/packages/agent_dart/example/android/app/src/main/kotlin/com/astrox/agent_dart/flutter_agent_dart_example/MainActivity.kt similarity index 62% rename from example/android/app/src/main/kotlin/com/astrox/agent_dart_example/MainActivity.kt rename to packages/agent_dart/example/android/app/src/main/kotlin/com/astrox/agent_dart/flutter_agent_dart_example/MainActivity.kt index 4966841b..3275bd0c 100644 --- a/example/android/app/src/main/kotlin/com/astrox/agent_dart_example/MainActivity.kt +++ b/packages/agent_dart/example/android/app/src/main/kotlin/com/astrox/agent_dart/flutter_agent_dart_example/MainActivity.kt @@ -1,4 +1,4 @@ -package com.astrox.agent_dart_example +package com.astrox.agent_dart.flutter_agent_dart_example import io.flutter.embedding.android.FlutterActivity diff --git a/example/android/app/src/main/res/drawable-v21/launch_background.xml b/packages/agent_dart/example/android/app/src/main/res/drawable-v21/launch_background.xml similarity index 100% rename from example/android/app/src/main/res/drawable-v21/launch_background.xml rename to packages/agent_dart/example/android/app/src/main/res/drawable-v21/launch_background.xml diff --git a/example/android/app/src/main/res/drawable/launch_background.xml b/packages/agent_dart/example/android/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from example/android/app/src/main/res/drawable/launch_background.xml rename to packages/agent_dart/example/android/app/src/main/res/drawable/launch_background.xml diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/agent_dart/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to packages/agent_dart/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/agent_dart/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to packages/agent_dart/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/agent_dart/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to packages/agent_dart/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/agent_dart/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to packages/agent_dart/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/agent_dart/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to packages/agent_dart/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/example/android/app/src/main/res/values-night/styles.xml b/packages/agent_dart/example/android/app/src/main/res/values-night/styles.xml similarity index 94% rename from example/android/app/src/main/res/values-night/styles.xml rename to packages/agent_dart/example/android/app/src/main/res/values-night/styles.xml index 449a9f93..06952be7 100644 --- a/example/android/app/src/main/res/values-night/styles.xml +++ b/packages/agent_dart/example/android/app/src/main/res/values-night/styles.xml @@ -3,14 +3,14 @@