From e6472e81edaa31100a1ec2a0a9b2fddf496189f1 Mon Sep 17 00:00:00 2001 From: Julian Date: Sat, 3 Oct 2026 01:05:32 +0200 Subject: [PATCH] mobile app --- Cargo.lock | 3647 ++++++++++++++++- Cargo.toml | 4 +- app/.gitignore | 10 + app/bun.lock | 208 + app/package.json | 26 + app/src-tauri/.gitignore | 7 + app/src-tauri/Cargo.toml | 16 + app/src-tauri/build.rs | 3 + app/src-tauri/capabilities/default.json | 7 + app/src-tauri/gen/android/.editorconfig | 12 + app/src-tauri/gen/android/.gitignore | 20 + app/src-tauri/gen/android/app/.gitignore | 6 + .../gen/android/app/build.gradle.kts | 84 + .../gen/android/app/proguard-rules.pro | 21 + .../android/app/src/main/AndroidManifest.xml | 38 + .../java/dev/framemate/app/MainActivity.kt | 43 + .../drawable-v24/ic_launcher_foreground.xml | 30 + .../res/drawable/ic_launcher_background.xml | 170 + .../app/src/main/res/layout/activity_main.xml | 18 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2437 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 2189 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 2281 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1635 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 1427 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 1529 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3361 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 2844 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 3114 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4958 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 4585 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 4474 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 6550 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 6498 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 6203 bytes .../app/src/main/res/values-night/themes.xml | 6 + .../app/src/main/res/values/colors.xml | 10 + .../res/values/ic_launcher_background.xml | 4 + .../app/src/main/res/values/strings.xml | 4 + .../app/src/main/res/values/themes.xml | 6 + .../app/src/main/res/xml/file_paths.xml | 5 + app/src-tauri/gen/android/build.gradle.kts | 22 + .../gen/android/buildSrc/build.gradle.kts | 23 + .../dev/framemate/app/kotlin/BuildTask.kt | 75 + .../dev/framemate/app/kotlin/RustPlugin.kt | 86 + app/src-tauri/gen/android/gradle.properties | 26 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 48462 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + app/src-tauri/gen/android/gradlew | 248 ++ app/src-tauri/gen/android/gradlew.bat | 82 + app/src-tauri/gen/android/settings.gradle | 3 + app/src-tauri/icons/128x128.png | Bin 0 -> 1953 bytes app/src-tauri/icons/128x128@2x.png | Bin 0 -> 3799 bytes app/src-tauri/icons/32x32.png | Bin 0 -> 556 bytes app/src-tauri/icons/64x64.png | Bin 0 -> 1037 bytes app/src-tauri/icons/android-foreground.svg | 46 + app/src-tauri/icons/icon.icns | Bin 0 -> 47478 bytes app/src-tauri/icons/icon.ico | Bin 0 -> 8637 bytes app/src-tauri/icons/icon.png | Bin 0 -> 7827 bytes app/src-tauri/src/lib.rs | 6 + app/src-tauri/src/main.rs | 6 + app/src-tauri/tauri.conf.json | 35 + app/src/app.css | 74 + app/src/app.d.ts | 16 + app/src/app.html | 14 + app/src/lib/agent.svelte.ts | 87 + app/src/lib/components/Battery.svelte | 17 + app/src/lib/components/GameArt.svelte | 46 + app/src/lib/components/Icon.svelte | 22 + app/src/lib/components/Progress.svelte | 24 + app/src/lib/components/Row.svelte | 33 + app/src/lib/components/Section.svelte | 32 + app/src/lib/format.ts | 40 + app/src/lib/icons/back.svg | 1 + app/src/lib/icons/bell-badge.svg | 1 + app/src/lib/icons/cast.svg | 1 + app/src/lib/icons/controller.svg | 1 + app/src/lib/icons/download.svg | 1 + app/src/lib/icons/friends.svg | 1 + app/src/lib/icons/headset.svg | 1 + app/src/lib/icons/home.svg | 1 + app/src/lib/icons/library.svg | 1 + app/src/lib/icons/performance.svg | 1 + app/src/lib/icons/settings.svg | 1 + app/src/lib/icons/storage.svg | 1 + app/src/lib/types.ts | 117 + app/src/routes/+layout.svelte | 126 + app/src/routes/+layout.ts | 5 + app/src/routes/+page.svelte | 176 + app/src/routes/downloads/+page.svelte | 91 + app/src/routes/settings/+page.svelte | 81 + app/src/routes/system/+page.svelte | 64 + app/src/routes/view/+page.svelte | 188 + app/static/favicon.svg | 95 + app/svelte.config.js | 18 + app/tsconfig.json | 19 + app/vite.config.js | 32 + assets/framemate-black.png | Bin 0 -> 15947 bytes assets/framemate-black.svg | 95 + assets/framemate-white.png | Bin 0 -> 15830 bytes assets/framemate-white.svg | 94 + assets/logo.png | Bin 8542 -> 0 bytes assets/logo.svg | 69 - crates/agent/src/config.rs | 58 +- crates/agent/src/dashboard.html | 2 +- crates/agent/src/server.rs | 9 +- scripts/deploy.sh | 2 +- 107 files changed, 6724 insertions(+), 108 deletions(-) create mode 100644 app/.gitignore create mode 100644 app/bun.lock create mode 100644 app/package.json create mode 100644 app/src-tauri/.gitignore create mode 100644 app/src-tauri/Cargo.toml create mode 100644 app/src-tauri/build.rs create mode 100644 app/src-tauri/capabilities/default.json create mode 100644 app/src-tauri/gen/android/.editorconfig create mode 100644 app/src-tauri/gen/android/.gitignore create mode 100644 app/src-tauri/gen/android/app/.gitignore create mode 100644 app/src-tauri/gen/android/app/build.gradle.kts create mode 100644 app/src-tauri/gen/android/app/proguard-rules.pro create mode 100644 app/src-tauri/gen/android/app/src/main/AndroidManifest.xml create mode 100644 app/src-tauri/gen/android/app/src/main/java/dev/framemate/app/MainActivity.kt create mode 100644 app/src-tauri/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src-tauri/gen/android/app/src/main/res/values-night/themes.xml create mode 100644 app/src-tauri/gen/android/app/src/main/res/values/colors.xml create mode 100644 app/src-tauri/gen/android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 app/src-tauri/gen/android/app/src/main/res/values/strings.xml create mode 100644 app/src-tauri/gen/android/app/src/main/res/values/themes.xml create mode 100644 app/src-tauri/gen/android/app/src/main/res/xml/file_paths.xml create mode 100644 app/src-tauri/gen/android/build.gradle.kts create mode 100644 app/src-tauri/gen/android/buildSrc/build.gradle.kts create mode 100644 app/src-tauri/gen/android/buildSrc/src/main/java/dev/framemate/app/kotlin/BuildTask.kt create mode 100644 app/src-tauri/gen/android/buildSrc/src/main/java/dev/framemate/app/kotlin/RustPlugin.kt create mode 100644 app/src-tauri/gen/android/gradle.properties create mode 100644 app/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 app/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 app/src-tauri/gen/android/gradlew create mode 100644 app/src-tauri/gen/android/gradlew.bat create mode 100644 app/src-tauri/gen/android/settings.gradle create mode 100644 app/src-tauri/icons/128x128.png create mode 100644 app/src-tauri/icons/128x128@2x.png create mode 100644 app/src-tauri/icons/32x32.png create mode 100644 app/src-tauri/icons/64x64.png create mode 100644 app/src-tauri/icons/android-foreground.svg create mode 100644 app/src-tauri/icons/icon.icns create mode 100644 app/src-tauri/icons/icon.ico create mode 100644 app/src-tauri/icons/icon.png create mode 100644 app/src-tauri/src/lib.rs create mode 100644 app/src-tauri/src/main.rs create mode 100644 app/src-tauri/tauri.conf.json create mode 100644 app/src/app.css create mode 100644 app/src/app.d.ts create mode 100644 app/src/app.html create mode 100644 app/src/lib/agent.svelte.ts create mode 100644 app/src/lib/components/Battery.svelte create mode 100644 app/src/lib/components/GameArt.svelte create mode 100644 app/src/lib/components/Icon.svelte create mode 100644 app/src/lib/components/Progress.svelte create mode 100644 app/src/lib/components/Row.svelte create mode 100644 app/src/lib/components/Section.svelte create mode 100644 app/src/lib/format.ts create mode 100644 app/src/lib/icons/back.svg create mode 100644 app/src/lib/icons/bell-badge.svg create mode 100644 app/src/lib/icons/cast.svg create mode 100644 app/src/lib/icons/controller.svg create mode 100644 app/src/lib/icons/download.svg create mode 100644 app/src/lib/icons/friends.svg create mode 100644 app/src/lib/icons/headset.svg create mode 100644 app/src/lib/icons/home.svg create mode 100644 app/src/lib/icons/library.svg create mode 100644 app/src/lib/icons/performance.svg create mode 100644 app/src/lib/icons/settings.svg create mode 100644 app/src/lib/icons/storage.svg create mode 100644 app/src/lib/types.ts create mode 100644 app/src/routes/+layout.svelte create mode 100644 app/src/routes/+layout.ts create mode 100644 app/src/routes/+page.svelte create mode 100644 app/src/routes/downloads/+page.svelte create mode 100644 app/src/routes/settings/+page.svelte create mode 100644 app/src/routes/system/+page.svelte create mode 100644 app/src/routes/view/+page.svelte create mode 100644 app/static/favicon.svg create mode 100644 app/svelte.config.js create mode 100644 app/tsconfig.json create mode 100644 app/vite.config.js create mode 100644 assets/framemate-black.png create mode 100644 assets/framemate-black.svg create mode 100644 assets/framemate-white.png create mode 100644 assets/framemate-white.svg delete mode 100644 assets/logo.png delete mode 100644 assets/logo.svg diff --git a/Cargo.lock b/Cargo.lock index e8f01b6..4c61777 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + [[package]] name = "aho-corasick" version = "1.1.5" @@ -11,6 +17,30 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2fb6cfd47bf496ff64095c20eaba0c201404ee38714d4142fcfa1dc334fcc7a" + +[[package]] +name = "alloc-stdlib" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5c1865780388bfa186411ab5f247819487fc4864c6e9c3106611fa347586e1" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.104" @@ -51,6 +81,29 @@ dependencies = [ "syn 3.0.6", ] +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -70,7 +123,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" dependencies = [ "axum-core", - "base64", + "base64 0.22.1", "bytes", "form_urlencoded", "futures-util", @@ -118,17 +171,53 @@ dependencies = [ "tracing", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" +dependencies = [ + "serde_core", +] [[package]] name = "block-buffer" @@ -148,17 +237,176 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "brotli" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8b851b75c23ca7873623d612fe49bd1989aeb03d08fb9432187eb253d3d4c6b" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941cd9bd4ddab83cb46fa5a2d428f1c857b24ac78cb876cf7beb710840934bd7" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + [[package]] name = "bumpalo" version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.13.2", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbad30e4b4c14a39e3cc8aed085a12a327257c316619c93581e017bc52be591" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.21", +] + +[[package]] +name = "cargo_toml" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f4b26e751e711a5302649417f2da046dce6391b2ea30a4820f37462314f0b9" +dependencies = [ + "semver", + "serde", + "toml 1.1.6+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f360145194ee8e21db5ee7f3fcd4fe52210864c75c985dae33218202c8bbe040" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a347dcabdae9c31b0825fd6a8bed285ec9c2acb89c47827126d52fa4f59cece3" +dependencies = [ + "fnv", + "uuid", + "web-time", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] [[package]] name = "cfg-if" @@ -177,12 +425,84 @@ dependencies = [ "rand_core 0.10.1", ] +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "combine" +version = "4.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfc320937d09e6de266b31b9afb480f197d7a861be86be7cb2ea7e5d1bfffc5e" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "const-oid" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" +[[package]] +name = "cookie" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.13.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.2", + "core-foundation", + "libc", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -201,6 +521,30 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" + [[package]] name = "crypto-common" version = "0.1.7" @@ -220,12 +564,147 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "cssparser" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9cdaae01d5ed7882b04d795e7f752f46ff52d2fa3b50a20d28c464510bba98" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d045de693cb712d0b22c6a64be5b953f67b3ce00ab5ad3dd5d8b441886ab8e1a" +dependencies = [ + "quote", + "syn 3.0.6", +] + +[[package]] +name = "ctor" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914a755b7c2d4af2bdcff7ce1739e2db9a1b81a9b07123d8015786ae03c0980d" + +[[package]] +name = "darling" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 3.0.6", +] + +[[package]] +name = "darling_macro" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" +dependencies = [ + "darling_core", + "quote", + "syn 3.0.6", +] + [[package]] name = "data-encoding" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" +[[package]] +name = "dbus" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.21", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", +] + [[package]] name = "digest" version = "0.10.7" @@ -247,6 +726,144 @@ dependencies = [ "crypto-common 0.2.2", ] +[[package]] +name = "dirs" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d57d423b3c82e89b9a24ca3091fee61f456a26edbd28d26c65906f4bc1dcd8f" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.2", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dom_query" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac5fca71e65e94cc718a6e2af65d6e0f9c6027751c2aa562fbb5087fda639bc" +dependencies = [ + "bit-set", + "cssparser", + "foldhash", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.6+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + [[package]] name = "endi" version = "1.1.1" @@ -280,6 +897,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + [[package]] name = "errno" version = "0.3.14" @@ -287,7 +915,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -316,6 +944,81 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484" + +[[package]] +name = "flate2" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "crc32fast", + "miniz_oxide 0.9.1", + "zlib-rs", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -342,6 +1045,14 @@ dependencies = [ "zbus", ] +[[package]] +name = "framemate-app" +version = "0.1.0" +dependencies = [ + "tauri", + "tauri-build", +] + [[package]] name = "futures-channel" version = "0.3.34" @@ -357,6 +1068,17 @@ version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-io" version = "0.3.34" @@ -406,13 +1128,114 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-core", + "futures-io", "futures-macro", "futures-sink", "futures-task", + "memchr", "pin-project-lite", "slab", ] +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -447,18 +1270,194 @@ dependencies = [ "rand_core 0.10.1", ] +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.13.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "html5ever" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8" +dependencies = [ + "log", + "markup5ever", +] + [[package]] name = "http" version = "1.5.0" @@ -531,6 +1530,7 @@ dependencies = [ "pin-project-lite", "smallvec", "tokio", + "want", ] [[package]] @@ -539,13 +1539,177 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" dependencies = [ + "base64 0.23.1", "bytes", + "futures-channel", + "futures-util", "http", "http-body", + "httparse", "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", + "socket2", "tokio", "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png 0.17.16", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", ] [[package]] @@ -555,15 +1719,153 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.17.1", + "serde", + "serde_core", ] +[[package]] +name = "infer" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4200d433cbd5178df7797c9c2e75b348b728e39631cf14520d1e2fc424201f4" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" + [[package]] name = "itoa" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jiff" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1baf72f08796de0260609515130699b890ac25f30e610ad894bc5856cafdb" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link", +] + +[[package]] +name = "jiff-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e52fe76043ccecc9005d2305ebaadf7d7fc0cc89ca6baa10a94d6bc68c7128c" +dependencies = [ + "defmt", + "log", +] + +[[package]] +name = "jiff-static" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "378268a1116ad67ae6228701118ac9f491d78fda38a40a1f1a9e1348de6f7212" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + [[package]] name = "js-sys" version = "0.3.106" @@ -575,30 +1877,140 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json-patch" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7421438de105a0827e44fadd05377727847d717c80ce29a229f85fd04c427b72" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 2.0.21", +] + +[[package]] +name = "jsonptr" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5a3cc660ba5d72bce0b3bb295bf20847ccbb40fd423f3f05b61273672e561fe" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d" +dependencies = [ + "bitflags 2.13.2", + "serde", +] + [[package]] name = "lazy_static" version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb" +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + [[package]] name = "libc" version = "0.2.190" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78" +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" +dependencies = [ + "libc", +] + [[package]] name = "linux-raw-sys" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" +[[package]] +name = "markup5ever" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + [[package]] name = "matchers" version = "0.2.0" @@ -635,6 +2047,26 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + [[package]] name = "mio" version = "1.2.3" @@ -643,16 +2075,306 @@ checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.61.2", ] +[[package]] +name = "muda" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cca139e57da4383727f189e43e66e84fa372347027fc996f9f1a007ec0a37996" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.21", + "windows-sys 0.61.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.2", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nu-ansi-term" version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.2", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.2", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", ] [[package]] @@ -661,6 +2383,12 @@ version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "ordered-stream" version = "0.2.0" @@ -671,24 +2399,200 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + [[package]] name = "parking" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + [[package]] name = "percent-encoding" version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project-lite" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plist" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896bade328c13f7042a297ea5ac5b0951f6cf989dea5f32c2fd98da398195cb" +dependencies = [ + "base64 0.23.1", + "indexmap 2.14.2", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.21" @@ -698,13 +2602,63 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + [[package]] name = "proc-macro-crate" version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit", + "toml_edit 0.25.15+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", ] [[package]] @@ -716,6 +2670,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.47" @@ -783,6 +2746,63 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "redox_users" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0" +dependencies = [ + "libredox", + "thiserror 2.0.21", +] + +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + [[package]] name = "regex-automata" version = "0.4.18" @@ -800,17 +2820,66 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" +[[package]] +name = "reqwest" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16a1cfa75cc186dd73d5818e510e042e40927bccc9c236b061cea97e1eb08029" +dependencies = [ + "base64 0.23.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ - "bitflags", + "bitflags 2.13.2", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -825,6 +2894,101 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.119", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8adfa1c298912827b8a28b223b3b874357397ae706e6190acd9bf28cee99114d" +dependencies = [ + "bitflags 2.13.2", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + [[package]] name = "serde" version = "1.0.229" @@ -835,6 +2999,18 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + [[package]] name = "serde_core" version = "1.0.229" @@ -855,6 +3031,17 @@ dependencies = [ "syn 3.0.6", ] +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "serde_json" version = "1.0.151" @@ -890,6 +3077,24 @@ dependencies = [ "syn 3.0.6", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -902,6 +3107,70 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9adc193c780ef8f159aee8b61e2d5801aaa555e6eb0947fe45530ec506296f" +dependencies = [ + "base64 0.23.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.2", + "jiff", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e17bbc68e28663bbbb90df47e058aa7eda4fb445b89fe70457bb94fbccf6e49" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "sha1" version = "0.10.7" @@ -924,6 +3193,17 @@ dependencies = [ "digest 0.11.3", ] +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -933,6 +3213,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + [[package]] name = "signal-hook-registry" version = "1.4.8" @@ -943,6 +3229,18 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + [[package]] name = "slab" version = "0.4.12" @@ -962,7 +3260,112 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e45c444e496845d3f2a351146bff59aae4975b2280238df1dfaa0c7d1846f38e" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", ] [[package]] @@ -992,6 +3395,303 @@ name = "sync_wrapper" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.37.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37f381f4e048e6cdf038b5705f8cf14ad108279d46eb968140a7b291aba9400" +dependencies = [ + "bitflags 2.13.2", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed99ee9694a2deb776d91cae48ac7411ddfc89ecae2f9b5041111d8c88f2ace9" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.21", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59563ca5b331fd97f27ee9672ec8d36d33bb3c9e2c9f6710a1a5687256052e45" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e50213e463086ecc283d7e9f51c30cc0fd304ad457425158018be26dbf0d0a80" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.18.1", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.119", + "tauri-utils", + "thiserror 2.0.21", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8129fb43bb6e0d6b73ad3315cd172beaab17cd28899c594b1b32c80edbbfd99c" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a57a2a9b8c8b7fc00d35b510fe808ded7f9f1b44fc1cdda6aee38632ea5413" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.21", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e7e0c9f80a5130773cfabb6df4dc924518fb1b2c923726966804634b57d22" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ff55a614843b9a3f010f211df637c94df2607175b8d0f6e0f4a7c19e18621ee" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dom_query", + "dunce", + "glob", + "http", + "infer", + "json-patch", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.21", + "toml 1.1.6+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc65d45c68858bfe420dd29e834b5d15dbecf8a07a8a16cf4d532c7b1f69d4b6" +dependencies = [ + "dunce", + "embed-resource", + "toml 1.1.6+spec-1.1.0", +] [[package]] name = "tempfile" @@ -1003,7 +3703,25 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08" +dependencies = [ + "new_debug_unreachable", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", ] [[package]] @@ -1012,7 +3730,18 @@ version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.21", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -1035,6 +3764,52 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" + [[package]] name = "tokio" version = "1.53.1" @@ -1049,7 +3824,7 @@ dependencies = [ "socket2", "tokio-macros", "tracing", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -1087,6 +3862,55 @@ dependencies = [ "tungstenite 0.30.0", ] +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "1.1.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" +dependencies = [ + "indexmap 2.14.2", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + [[package]] name = "toml_datetime" version = "1.1.1+spec-1.1.0" @@ -1096,16 +3920,40 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.2", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.14.2", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + [[package]] name = "toml_edit" version = "0.25.15+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1340ea94a5856333492c9064b02c778b191dd2c853778d9609debdcdfea3a614" dependencies = [ - "indexmap", - "toml_datetime", + "indexmap 2.14.2", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow", + "winnow 1.0.4", ] [[package]] @@ -1114,9 +3962,15 @@ version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ - "winnow", + "winnow 1.0.4", ] +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + [[package]] name = "tower" version = "0.5.3" @@ -1133,6 +3987,24 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.2", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -1207,6 +4079,34 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "tray-icon" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b9c52859a94554803ccd4a24b98f74148ebc73b90676d783f3490b1bff9d72" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png 0.18.1", + "serde", + "thiserror 2.0.21", + "windows-sys 0.61.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "tungstenite" version = "0.29.0" @@ -1220,7 +4120,7 @@ dependencies = [ "log", "rand 0.9.5", "sha1 0.10.7", - "thiserror", + "thiserror 2.0.21", ] [[package]] @@ -1236,9 +4136,15 @@ dependencies = [ "log", "rand 0.10.3", "sha1 0.11.0", - "thiserror", + "thiserror 2.0.21", ] +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typenum" version = "1.20.1" @@ -1253,7 +4159,7 @@ checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", - "windows-sys", + "windows-sys 0.61.2", ] [[package]] @@ -1262,12 +4168,50 @@ version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df16f50ef4cc145211879a3867ba757076b25dfee812040dcb0658bd9ae7904b" +dependencies = [ + "icu_properties", + "regex", + "serde", + "url", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "uuid" version = "1.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" dependencies = [ + "getrandom 0.4.3", "js-sys", "serde_core", "wasm-bindgen", @@ -1279,12 +4223,57 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -1313,6 +4302,17 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e" +dependencies = [ + "js-sys", + "tokio", + "wasm-bindgen", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.129" @@ -1345,12 +4345,295 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8b815c1b593dc0baf78dd0f4fc8fdb2de53198fb1163738093e9a311c33fb3" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f89fca7a704cee10dcb3654c1dbb8941d1783132f1917358af75bec37a7d7e6" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "webview2-com-sys" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a07132775117d6065853d9d1178157b8c90e228de47129d6bce2c7edebedfb" +dependencies = [ + "thiserror 2.0.21", + "windows", + "windows-core", +] + +[[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.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[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 = "window-vibrancy" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "111e51caca442cafd9bab396628ac4d814880eaea4e63dfd76a12e9f342b5580" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "windows-sys 0.61.2", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -1360,6 +4643,154 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winnow" version = "1.0.4" @@ -1369,12 +4800,116 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + [[package]] name = "wit-bindgen" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "wry" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a819957a01b3119af85e638a38d242af76dbc87d130dca67bfd0441072e21ff0" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.21", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", + "synstructure", +] + [[package]] name = "zbus" version = "5.19.0" @@ -1398,8 +4933,8 @@ dependencies = [ "tracing", "uds_windows", "uuid", - "windows-sys", - "winnow", + "windows-sys 0.61.2", + "winnow 1.0.4", "zbus_macros", "zbus_names", "zvariant", @@ -1411,7 +4946,7 @@ version = "5.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 3.5.0", "proc-macro2", "quote", "syn 3.0.6", @@ -1427,7 +4962,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" dependencies = [ "serde", - "winnow", + "winnow 1.0.4", "zvariant", ] @@ -1460,6 +4995,66 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "zlib-rs" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" + [[package]] name = "zmij" version = "1.0.23" @@ -1475,7 +5070,7 @@ dependencies = [ "endi", "enumflags2", "serde", - "winnow", + "winnow 1.0.4", "zcheapstr", "zvariant_derive", "zvariant_utils", @@ -1487,7 +5082,7 @@ version = "5.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "864155e69b4352db0c7f374917bf45d1e0c8d17659c8b3dbf9795f3673f8c497" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 3.5.0", "proc-macro2", "quote", "syn 3.0.6", @@ -1504,5 +5099,5 @@ dependencies = [ "quote", "serde", "syn 3.0.6", - "winnow", + "winnow 1.0.4", ] diff --git a/Cargo.toml b/Cargo.toml index dcb611d..b9d65ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,8 @@ [workspace] resolver = "3" -members = ["crates/agent"] +members = ["crates/agent", "app/src-tauri"] +# `cargo build` at the root builds only the agent (the app is built via the Tauri CLI). +default-members = ["crates/agent"] [workspace.package] version = "0.1.0" diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..6635cf5 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/app/bun.lock b/app/bun.lock new file mode 100644 index 0000000..6724abc --- /dev/null +++ b/app/bun.lock @@ -0,0 +1,208 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "app", + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.65.1", + "@sveltejs/vite-plugin-svelte": "^7.1.2", + "@tauri-apps/cli": "^2", + "svelte": "^5.56.3", + "svelte-check": "^4.6.0", + "typescript": "~6.0.3", + "vite": "^8.0.16", + }, + }, + }, + "packages": { + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.6.0", "", {}, "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@oxc-project/types": ["@oxc-project/types@0.152.0", "", {}, "sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw=="], + + "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], + + "@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.12", "", { "os": "android", "cpu": "arm" }, "sha512-dB/a1214qKfHMXCpgqR4OZT+jS4kTyEXbQGJPqzobt5EwH5rX080pxE37alt3RzvR1bf1Yz/yGqRfrYAxuPw0A=="], + + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.12", "", { "os": "android", "cpu": "arm64" }, "sha512-7KHFgQ5VJxIHcLlrwrc3Xbds7oTNQT7Pgi9gQCJKrd2VGab/UksIOYp6VD8MzCstGxOKMgNamPwUCfxPdP1OHg=="], + + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-3YIhqHD96nA5SaYNRBR16HnGv4oavZvXfD/ayHM+oYZ0WD/8lBAtf6zQua4kEyAvpqrluKXl0lnOBoiNby7x9w=="], + + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-UuuJ35MFw4gmFOrE9pEqIV+K3syIKveph+Qc1/ljHZVdoDW4pz/JHR/eMVom+TZGl/5OOvGJOWaOCVt3ZfqhxA=="], + + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-uMvssit0a4W+/7D8CbHUvG719mH3R2jwXAlh/XcPvuHTE0g++LymF88DCGNX0HM2rBOn0xrzgXktIB6fLSJBTQ=="], + + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.12", "", { "os": "linux", "cpu": "arm" }, "sha512-XcFu0R0xWnwzSf4IQgFH1rJIckPN1pLy2R+4r9IDB7Yfu/ys9cVqfa4pBrMHj7a3gl8mIR4nRNPg0e5IvEVs6g=="], + + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-260UrKgn8tz39ak+SMDOirKzr7V04M9dWPw5llW00SwBivCZoWcRBKV1d8cXnRkUmSZA3BdiUmBHWk7734Ulpw=="], + + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-5YK1I9SqDkbPgc1IA8BgDl34suqUS2q0KWnBrirm0E51YjOs6eo6dV6jbQfNE/argHRSvd0QUGgtpIoYx+WWpw=="], + + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Rkcrmp7eFRg74yL5fXEU91JEWbdEPLevWwGtXpmhbjlD1StScbWTmO94Bhly+Mo+ketKYkdmM1vNUKeWSlx8cQ=="], + + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-qvK4DuAsQc2BSjlx+Xr+IzOIvvxbGZqxFwdWfG6F518Erj0GGISyQbJ6pIappnOxlNPzNHvo/L0BwB30GZ+zVw=="], + + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.12", "", { "os": "linux", "cpu": "x64" }, "sha512-Q9uLBO53Xd4QIq1WOycVQyPP1O4HhraEV2qqb3uTrnVw6QZih9duY4vNXOivL1xoUS1/z+W8eF4NMfl2a8Sdjw=="], + + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.12", "", { "os": "linux", "cpu": "x64" }, "sha512-3IBxWFMjbOZskDPKv8Lf9BCnahlKuHthWkYnyIxOH/QcJrFcS4EmcenthApkwr/5+nEqZlLzeYbxeMaX7A5u4g=="], + + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.12", "", { "os": "none", "cpu": "arm64" }, "sha512-xtX61xg4LKPkPWilZU1ynKClz5Gj4bf74LML4r3eVLWumKnGjoEr1OSHQhMdbBDoYTi+yjrujvpZe2pUnqCrrA=="], + + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-At7fPB6PCaIjzgIhEZFxuT+BBFqiQibJDT4d3PhiR3f4E7bbMZF4aKblbFfEM3sETRDd1YiQx/+U/g/B/ou5Ew=="], + + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.12", "", { "os": "win32", "cpu": "x64" }, "sha512-WIw2haVKwjuYdXkHaoC0mF8Le71TuCBxjrdKqLbJGctbBABj+ClfmNvtbOnzpq3RokNo5+V1qhtSzJyXorsklQ=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + + "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.13", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ=="], + + "@sveltejs/adapter-static": ["@sveltejs/adapter-static@3.0.10", "", { "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew=="], + + "@sveltejs/kit": ["@sveltejs/kit@2.70.3", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.9", "@types/cookie": "^0.6.0", "acorn": "^8.16.0", "cookie": "^0.6.0", "devalue": "^5.8.1", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3 || ^6.0.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-UDvEYuZqAMbfB/oXIoqKvbKcb7YczK5zYrzmsGV1zRJk03jntwp8dXiYoIJotxAndsKvcPFtx9H1GRSKFdSHgg=="], + + "@sveltejs/load-config": ["@sveltejs/load-config@0.2.3", "", {}, "sha512-VT3qmUb8pRV2QrZjd8iAmtg8lf4W0TIjZbvXtz5MKei/q96teWZgGJyyidJzOjzZzvdq616eSRVeMYIQChUTAQ=="], + + "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@7.3.1", "", { "dependencies": { "deepmerge": "^4.3.1", "magic-string": "^1.0.0", "obug": "^2.1.0", "vitefu": "^1.1.2" }, "peerDependencies": { "svelte": "^5.46.4", "vite": "^8.0.0-beta.7 || ^8.0.0" } }, "sha512-ZPsLN8B1e/En+Ak5s4V7srFDT532oS0qieLsQwu63NGKsS+iAjoO2Js1BochlHlglcU+Pt7WAO3C5Ee+4f6gVA=="], + + "@tauri-apps/cli": ["@tauri-apps/cli@2.12.1", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.12.1", "@tauri-apps/cli-darwin-x64": "2.12.1", "@tauri-apps/cli-linux-arm-gnueabihf": "2.12.1", "@tauri-apps/cli-linux-arm64-gnu": "2.12.1", "@tauri-apps/cli-linux-arm64-musl": "2.12.1", "@tauri-apps/cli-linux-riscv64-gnu": "2.12.1", "@tauri-apps/cli-linux-x64-gnu": "2.12.1", "@tauri-apps/cli-linux-x64-musl": "2.12.1", "@tauri-apps/cli-win32-arm64-msvc": "2.12.1", "@tauri-apps/cli-win32-ia32-msvc": "2.12.1", "@tauri-apps/cli-win32-x64-msvc": "2.12.1" }, "bin": { "tauri": "tauri.js" } }, "sha512-kEDEiGzG+yAc5FeLxtXpES/VN+F2C8H0r4gDVtfRLKxT9np9101d9REG/Kgo2lr0hKi0IpDsODiHnU3+naOmLg=="], + + "@tauri-apps/cli-darwin-arm64": ["@tauri-apps/cli-darwin-arm64@2.12.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-8bMnbpJ2jKO/ufrOPL65EMHC3ptw7fzeraoQkwibyfGLqIl+UCWsC0152kmNbW6r9NvVQduXqAZF5mH1QgTWhw=="], + + "@tauri-apps/cli-darwin-x64": ["@tauri-apps/cli-darwin-x64@2.12.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-G+2qte8GNqNlEZ9ftd21rbu/APVkl3r/nzNDI7LVxEoqJWVNe9GbEgQUMH1r4PHT20Z2UxR3KjCkltIb0e/Wjg=="], + + "@tauri-apps/cli-linux-arm-gnueabihf": ["@tauri-apps/cli-linux-arm-gnueabihf@2.12.1", "", { "os": "linux", "cpu": "arm" }, "sha512-5b3n4DaTW+A1Zntnh4Yn44VyLrlPEpB8kMOBRfWkzNnzolBk+AYhKIfKjCLmoC8Mob3ETodxAEOMkE2YPKEWzQ=="], + + "@tauri-apps/cli-linux-arm64-gnu": ["@tauri-apps/cli-linux-arm64-gnu@2.12.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-APArHhDu+8pXSCkCQmvaz1nD3d8WTmlCoSS/oG475TJ6AATBvyQOAmf5qELgsQ4s2+8MOsop0Zd699RKELF1Cw=="], + + "@tauri-apps/cli-linux-arm64-musl": ["@tauri-apps/cli-linux-arm64-musl@2.12.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-JaCxcLoV0oGtllVkLr4UAHWG/wTfkEunnUqnsEsGYOp0VRxnUwHg63wFBD0jU2ul5eFfSLIDS4RF2gfzsSo5Jg=="], + + "@tauri-apps/cli-linux-riscv64-gnu": ["@tauri-apps/cli-linux-riscv64-gnu@2.12.1", "", { "os": "linux", "cpu": "none" }, "sha512-K5+VXM7+SGVDwZleA2+lMgvbTVuA5e1tkiVEawu1Yxj26ZyEfO8h8xTC1rBdRX2xgJDSwCk6vPUBCS6i+Z5slQ=="], + + "@tauri-apps/cli-linux-x64-gnu": ["@tauri-apps/cli-linux-x64-gnu@2.12.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Z1QGPr49HJZMktu+Spu6Q1b/f9ANadXvqZZZt2645ua1x1ev6prOgp85eiGv2jRzohFEMLo6aJyaLjLUX5KIvA=="], + + "@tauri-apps/cli-linux-x64-musl": ["@tauri-apps/cli-linux-x64-musl@2.12.1", "", { "os": "linux", "cpu": "x64" }, "sha512-nHuEhRPOMSJ/8RRhtMRxB9B9lVr7xxpe4DapBz8x1GIau3vdzjHHJ1hAfmw+PyayPLZ6XoaVIHPgI17rX6ii8w=="], + + "@tauri-apps/cli-win32-arm64-msvc": ["@tauri-apps/cli-win32-arm64-msvc@2.12.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-I0oPk2uGh86R8dAs2X5OxSP+/GqSc8jh1Px3l8EqrocSNivsRHDTh2k3PVOqdv163dlV6PIVvmhZAbH/lPfZrA=="], + + "@tauri-apps/cli-win32-ia32-msvc": ["@tauri-apps/cli-win32-ia32-msvc@2.12.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-baNZRBfepAJ5qNFRMwzgBk94xQmkcmTZrNDjZjnzrq2vAaTC3NAhallb/zo3hyoCGQlMS13sdovktrg46NZz6Q=="], + + "@tauri-apps/cli-win32-x64-msvc": ["@tauri-apps/cli-win32-x64-msvc@2.12.1", "", { "os": "win32", "cpu": "x64" }, "sha512-dIFaKslrzcbesb+bBh+E1R9km241pHyj32w6D9FPtvQeYpRUFbiCLEa/2S+S0UnIytfxepp4P+X8IerGqnXeYg=="], + + "@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="], + + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + + "acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], + + "aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="], + + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "devalue": ["devalue@5.9.4", "", {}, "sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg=="], + + "esm-env": ["esm-env@1.2.2", "", {}, "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA=="], + + "esrap": ["esrap@2.4.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { "@typescript-eslint/types": "^8.2.0" }, "optionalPeers": ["@typescript-eslint/types"] }, "sha512-CQPcneEHw/czj32uwQC52nYnax8H4SXt25FCM+LIwGZ49cMIxpOj3bP8wmzcI+Z0HIy5KkClaPhRLfCySzwHPA=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], + + "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], + + "lightningcss": ["lightningcss@1.33.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.33.0", "lightningcss-darwin-arm64": "1.33.0", "lightningcss-darwin-x64": "1.33.0", "lightningcss-freebsd-x64": "1.33.0", "lightningcss-linux-arm-gnueabihf": "1.33.0", "lightningcss-linux-arm64-gnu": "1.33.0", "lightningcss-linux-arm64-musl": "1.33.0", "lightningcss-linux-x64-gnu": "1.33.0", "lightningcss-linux-x64-musl": "1.33.0", "lightningcss-win32-arm64-msvc": "1.33.0", "lightningcss-win32-x64-msvc": "1.33.0" } }, "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.33.0", "", { "os": "android", "cpu": "arm64" }, "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.33.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.33.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.33.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.33.0", "", { "os": "linux", "cpu": "arm" }, "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.33.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.33.0", "", { "os": "win32", "cpu": "x64" }, "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA=="], + + "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + + "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], + + "nanoid": ["nanoid@3.3.19", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug=="], + + "obug": ["obug@2.2.1", "", {}, "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], + + "postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "rolldown": ["rolldown@1.2.12", "", { "dependencies": { "@oxc-project/types": "=0.152.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.12", "@rolldown/binding-android-arm64": "1.2.12", "@rolldown/binding-darwin-arm64": "1.2.12", "@rolldown/binding-darwin-x64": "1.2.12", "@rolldown/binding-freebsd-x64": "1.2.12", "@rolldown/binding-linux-arm-gnueabihf": "1.2.12", "@rolldown/binding-linux-arm64-gnu": "1.2.12", "@rolldown/binding-linux-arm64-musl": "1.2.12", "@rolldown/binding-linux-ppc64-gnu": "1.2.12", "@rolldown/binding-linux-s390x-gnu": "1.2.12", "@rolldown/binding-linux-x64-gnu": "1.2.12", "@rolldown/binding-linux-x64-musl": "1.2.12", "@rolldown/binding-openharmony-arm64": "1.2.12", "@rolldown/binding-win32-arm64-msvc": "1.2.12", "@rolldown/binding-win32-x64-msvc": "1.2.12" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-8wafseiaG80xmXSfqidUNqZcylTlhmPZZt+za2m+js2sFZ8dTNlhIOV2WcbIPx2hgwPBJpEUGFAMZ9bgBBLTSQ=="], + + "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], + + "set-cookie-parser": ["set-cookie-parser@3.1.2", "", {}, "sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw=="], + + "sirv": ["sirv@3.0.2", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g=="], + + "source-map-js": ["source-map-js@1.2.2", "", {}, "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw=="], + + "svelte": ["svelte@5.57.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "@jridgewell/sourcemap-codec": "^1.6.0", "@sveltejs/acorn-typescript": "^1.0.13", "@types/estree": "^1.0.9", "acorn": "^8.18.0", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.9.2", "esm-env": "^1.2.1", "esrap": "^2.3.6", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-Uqj49lWKB+iSSnneuwiYYJ7MZgkB+eXr0LXBhv4uDuAkXqnWmq65Sxflfvp0Lc6MdKjMUxGaeOKWJqz5SNiVIA=="], + + "svelte-check": ["svelte-check@4.7.6", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "@sveltejs/load-config": "^0.2.3", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.0.0 || ^6.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-t2scM//ZuVbSY/T2w6FSBw1v9s2NEmh/g+sy1lqtosW5ylBV5AF4wFb1Ts9Kf3MbfPDUDJDZ9L436YT0SPTdvw=="], + + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + + "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], + + "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + + "vite": ["vite@8.3.2", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", "postcss": "^8.5.28", "rolldown": "~1.2.11", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-SQr1x6W5vVSbROg7vsyXIaxK9b0G7zsT68acdWWRmnBUsgDieLCRG+Rep9WdZgcposvv/GSnr4GUUBqB3vXq6w=="], + + "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], + + "zimmerframe": ["zimmerframe@1.1.5", "", {}, "sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA=="], + + "@sveltejs/vite-plugin-svelte/magic-string": ["magic-string@1.4.2", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.6.0" } }, "sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g=="], + } +} diff --git a/app/package.json b/app/package.json new file mode 100644 index 0000000..2825a25 --- /dev/null +++ b/app/package.json @@ -0,0 +1,26 @@ +{ + "name": "framemate-app", + "version": "0.1.0", + "description": "", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "tauri": "tauri" + }, + "license": "MIT", + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.65.1", + "@sveltejs/vite-plugin-svelte": "^7.1.2", + "svelte": "^5.56.3", + "svelte-check": "^4.6.0", + "typescript": "~6.0.3", + "vite": "^8.0.16", + "@tauri-apps/cli": "^2" + } +} diff --git a/app/src-tauri/.gitignore b/app/src-tauri/.gitignore new file mode 100644 index 0000000..b21bd68 --- /dev/null +++ b/app/src-tauri/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas diff --git a/app/src-tauri/Cargo.toml b/app/src-tauri/Cargo.toml new file mode 100644 index 0000000..227bd37 --- /dev/null +++ b/app/src-tauri/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "framemate-app" +description = "FrameMate companion app" +version.workspace = true +edition.workspace = true + +[lib] +# Unique lib name avoids a bin/lib name clash (cargo#8519). +name = "framemate_app_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } diff --git a/app/src-tauri/build.rs b/app/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/app/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/app/src-tauri/capabilities/default.json b/app/src-tauri/capabilities/default.json new file mode 100644 index 0000000..c2ca36e --- /dev/null +++ b/app/src-tauri/capabilities/default.json @@ -0,0 +1,7 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": ["core:default"] +} diff --git a/app/src-tauri/gen/android/.editorconfig b/app/src-tauri/gen/android/.editorconfig new file mode 100644 index 0000000..ebe51d3 --- /dev/null +++ b/app/src-tauri/gen/android/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = false \ No newline at end of file diff --git a/app/src-tauri/gen/android/.gitignore b/app/src-tauri/gen/android/.gitignore new file mode 100644 index 0000000..1c636c3 --- /dev/null +++ b/app/src-tauri/gen/android/.gitignore @@ -0,0 +1,20 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +build +/captures +.externalNativeBuild +.cxx +local.properties +key.properties +keystore.properties + +/.tauri +/tauri.settings.gradle \ No newline at end of file diff --git a/app/src-tauri/gen/android/app/.gitignore b/app/src-tauri/gen/android/app/.gitignore new file mode 100644 index 0000000..6c4d56b --- /dev/null +++ b/app/src-tauri/gen/android/app/.gitignore @@ -0,0 +1,6 @@ +/src/main/**/generated +/src/main/jniLibs/**/*.so +/src/main/assets/tauri.conf.json +/tauri.build.gradle.kts +/proguard-tauri.pro +/tauri.properties \ No newline at end of file diff --git a/app/src-tauri/gen/android/app/build.gradle.kts b/app/src-tauri/gen/android/app/build.gradle.kts new file mode 100644 index 0000000..4d5596d --- /dev/null +++ b/app/src-tauri/gen/android/app/build.gradle.kts @@ -0,0 +1,84 @@ +import java.util.Properties +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("rust") +} + +val tauriProperties = Properties().apply { + val propFile = file("tauri.properties") + if (propFile.exists()) { + propFile.inputStream().use { load(it) } + } +} + +android { + compileSdk = 37 + namespace = "dev.framemate.app" + defaultConfig { + // The agent on the Frame speaks plain http/ws on the LAN. + manifestPlaceholders["usesCleartextTraffic"] = "true" + applicationId = "dev.framemate.app" + minSdk = 24 + targetSdk = 37 + versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt() + versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0") + } + buildTypes { + getByName("debug") { + manifestPlaceholders["usesCleartextTraffic"] = "true" + isDebuggable = true + isJniDebuggable = true + isMinifyEnabled = false + packaging { + jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so") + jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so") + jniLibs.keepDebugSymbols.add("*/x86/*.so") + jniLibs.keepDebugSymbols.add("*/x86_64/*.so") + } + } + getByName("release") { + optimization { + enable = true + } + proguardFiles( + *fileTree(".") { + include("**/*.pro") + exclude("build/**") + }.files.toTypedArray() + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + buildFeatures { + buildConfig = true + } +} + +kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_1_8 + } +} + +rust { + rootDirRel = "../../../" +} + +dependencies { + implementation("androidx.webkit:webkit:1.14.0") + implementation("androidx.appcompat:appcompat:1.7.1") + implementation("androidx.activity:activity-ktx:1.10.1") + implementation("com.google.android.material:material:1.12.0") + implementation("androidx.lifecycle:lifecycle-process:2.10.0") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.4") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0") +} + +apply(from = file("tauri.build.gradle.kts")) diff --git a/app/src-tauri/gen/android/app/proguard-rules.pro b/app/src-tauri/gen/android/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/src-tauri/gen/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src-tauri/gen/android/app/src/main/AndroidManifest.xml b/app/src-tauri/gen/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..6c04b7d --- /dev/null +++ b/app/src-tauri/gen/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src-tauri/gen/android/app/src/main/java/dev/framemate/app/MainActivity.kt b/app/src-tauri/gen/android/app/src/main/java/dev/framemate/app/MainActivity.kt new file mode 100644 index 0000000..f999043 --- /dev/null +++ b/app/src-tauri/gen/android/app/src/main/java/dev/framemate/app/MainActivity.kt @@ -0,0 +1,43 @@ +package dev.framemate.app + +import android.content.pm.ActivityInfo +import android.os.Bundle +import android.webkit.JavascriptInterface +import android.webkit.WebView +import androidx.activity.enableEdgeToEdge +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.WindowInsetsControllerCompat + +class MainActivity : TauriActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() + super.onCreate(savedInstanceState) + } + + override fun onWebViewCreate(webView: WebView) { + super.onWebViewCreate(webView) + webView.addJavascriptInterface(FullscreenBridge(), "FrameMateAndroid") + } + + /** + * The app is portrait-only (see AndroidManifest). The headset view calls + * `FrameMateAndroid.setFullscreen(true)` to go landscape without system bars. + * WebViews can't do this themselves: the Screen Orientation API is browser-only. + */ + inner class FullscreenBridge { + @JavascriptInterface + fun setFullscreen(enabled: Boolean) = runOnUiThread { + requestedOrientation = + if (enabled) ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE + else ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + val bars = WindowCompat.getInsetsController(window, window.decorView) + if (enabled) { + bars.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + bars.hide(WindowInsetsCompat.Type.systemBars()) + } else { + bars.show(WindowInsetsCompat.Type.systemBars()) + } + } + } +} diff --git a/app/src-tauri/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src-tauri/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src-tauri/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml b/app/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src-tauri/gen/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml b/app/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..4fc2444 --- /dev/null +++ b/app/src-tauri/gen/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/app/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..2ffbf24 --- /dev/null +++ b/app/src-tauri/gen/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ba85cd63ff52ad63142c6e3a07f13553274817c6 GIT binary patch literal 2437 zcmV;033~R4P)0_9@FCbURELYfd_2nGavLIVN;d8r{m;Q?Zl zCj`+Kc);+`z7QVDwHHt@La3x^DHswVy#Ot}?2P|^=A3c5mv(n&FSBM(@@KX)yEA9L z^ZnOzPHm8BV>Vj`f($?zfHDAO0LlQAw#{zhw=xGkb0)HEc76m7rl zF{q>%g{3GfP-dZcED9I_(u48`%4L+_qXo(yrAqlxrl9D+3zJu(nZ%rTWAL< zzNf0m!IYlm_xoXFWW?C#29z3uR+s`vQ1LX%W)6-dKoA|Ud_04FRTM=vyz^(=R5(zE zV+BZ1(8mqk8v-CB3yO=2p|G$JN=r+@;c$T6Zig8&WL)r4*&Z08-Qdi6JgW@f!7-+KwGNpscJc>QPOW{UNeA zolfZK>CpnW(a$AqC^G=0m;q>_K$&!lUb3K|fU!orbf8fVr#>`_$!-D96dm*NkY!9$ zV~-+^0Hf_8n!8Y}CnSJ%0R{F)3WG7Rr`TJVT>TQ8+P^go4vh zIh|k;Ju{^xSL$#mH4}PIYDJAytFEpN?%cTpw{G2nlP6C?PEHO3kY1dQ;e@V}x6I4S zgZlbrZG6Jo|e#LOT{B|;fY(HZJ2wXIvXvKJC<`}Xbd z{P}Y@aNxkW-bh?OeE2X_S6A!j32?G27cX86$s+nYULlAr7Gp_m_Uzd#j1NpkMH3!w z)v8sx%4vBb!2J318H*zEEM(7Cu3V|JRv6lW!i7=i_wCyUhYlTr{rmUB z@#DvJPz11h_wHraw`|!0=gysj2M-=F8O1aii*p52z&U*>xXRy$>}gBDof9%%yMKxDj^m-pzhT%prgz zW=qgx`A5L!aDsE@3h=zU9y|-ygX}E=br_Rpg{u`;Gh&O1xYKV^F|!&|S|V%@x%-BO z2JrcOj48Wz?Si(pHYhJI*OTDR&Q3UW>Xdd5Mf;s+-iMI8WHY!ItVNY_fHLqBlvlmn zC`)mh9ZlKXykJyIOAD-9w@%NKyk0LXT)0pNhYWFbO%2?;cTZE*;+ZgM+s`oZ(_g@| zXalH&{osGqqp^jv3oJG_Zwe$b##gUih2_ha!@PO(pt7=(74x4wc>=%Pz70(+tPB@;gR5nOX>&}qjfJL@Y>6(p zMr3=i6|DJ+#X0KGK*|hqQUDUE1kFB-$0TNBkUf+>xZhdBf6oVB(ouxfyJ3FUC7VmSRs#0Eri#GiT1I!dN&J3tJoJOmWS8553k}mT*$~0RNYT z`4%r8O112p}q1NEUJH)`){RxX!nhVp-Iu z)r~E>U_Yfw@0zueRRR<4xl%E4Xf{x!0(h15v2~G?Ck8&OHMdm4oodH=BSBPEsV94{+=AD2iSGA@ODO^aMLI7QHPFN$O)-aBVBnZg#%`}F z!vVdP;#fgZxdR9}3NKN*$755Z0R4&5N0SfuvMi#b73|DaJDov`4OsGtE4#uM#_)SZ zWjLSZVe?i&PxQwJ9Ge{nW)PRs{L^lng%uI$-ze>70TKq}2H#HP70jXK{nTiYws9E@ z*&JE|N7FeW(+&Rlbz7r85hxj7DhpTZV?Ek*$pi0AMg9>4XRxDHxHIuiHolLnjf17c zV>3%VXxoTXOfw`iD@QdJg$KZfHEHc-q}a=o5}ySL-fSos^exJlW;e4K@BB7O6AI1j zsiaEC94S=FK{kf~9IGZo3ke`ZKF4Af#UHmyB^hXD=d_Nhe86v`EJhg`Z_ik?8|pqr z`N?p8B>p*q6essDSgNW4o9bS0O}G}xu0tt?{i?LI>o{n8Rnx5zC_6#h+7;I=nSmhD z=9W#IrjxlITd}F!os-A9f^wES8(XAX#HAS16D7bCx-GoxxzEhjaLMFGSsOQWR&FvE zC6*1yQnGfVvlW3%%lvbb3_uxxG5}=&O276mP;=oxsdyY700000NkvXXu0mjf DyJl{S literal 0 HcmV?d00001 diff --git a/app/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src-tauri/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..1c50778cdb4165f3dcaab4e25e409a608a6aae09 GIT binary patch literal 2189 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 D?1x0J literal 0 HcmV?d00001 diff --git a/app/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..42d819b5b1ecbe6d4a4392dad8ceecfb744478af GIT binary patch literal 1635 zcmV-p2AuhcP)~1!jtZ6oX7&Ih}6iYPNN*XFOd1x(K2qbE(Efy@a55*@H3exxZ&{njP z_N9+Pi4ly7X@nXSD%b}fOe9Dl`p}ftKTOg5?C#9;oICe!)->6jB)f~2+~woW&J1_X z|2^ki126e7RvB1jU}eMf@s1z_)U{hc+AJktCmV6uG~~=<*eQ@@*lCO;GjW-X_+rB6 zgeF3yfDHUi7$6L1(uBxDd?Vp|!n;Duy{fNW*Of?rmaD<*(wHH9MfgT(-}b|RNSn_S zJ|HBN{fh$n01GgruJ;i77c!@X2nr~IcMqty_m= zGMO_iu;h9DYuB#f?%lg_x)oGr)Jd3JiVtieq6}IvPDBTfA3u)WyLY3aqM{(;KXBjx zGhne`h=y0`R;^zKw2JDqmRRy#U0srR+qUy&_tI`iv#fzcB9U$(EVZcLDC8=KDN0xC z?CfmHflbp)ceH#C?RWNKQOL^RK#o!$B9Vx+b(X#+K0O-cbZ1rT8;0R~w_7Z{rl`}4 z&6oJh%nTksevDu+DF18o%0?hF&hN6hXd#8eVT3{x6{M_E}}R^lfoCna&wXfzegcyL6ks;Wx)z>OO>e3_}WTvfB=&zw1fhYufO z`}XZ9E-uD}3m2pWGmZB4c2rhY;>wjPc=YH|>i)fZ_X?YhvXmGH4<5wO&=C6j`@x}B zO2x9I*=g{5JUTi$R6eK>jYq`c41Su-9in3e~>{$(s-TYqk_q?v%Wwziacbar;8 ze1=UyLp$caefz*6nFniaFLeAHwVE>K3%;XV0Etcz9Sc z!`Ez5+8?wQcxHd$ar*RWOiWD3bq5B{6(Iv17+h)HO8Vm&-rX2W*G{ zr6yI42vpX~*(zU;Ky@RYTsns7-+x^h13K#HNU_-9yhZ!Pi4!N#+S-cl?rz+?c~cU9 z>eMN;w6tI|F)=c7OG1Q75N-Pm;n&|oX#ExhY8oL(=uX0g5fpg(+fRUGKxC|=EWhD1 zqZG(Ym{CsZjvhTKL+il60PftmBR4>fP=}8k!EMr%NlU%5^Gg&pcOY2bLK?8(%uK<4 z`otrYweGBen@spB0xjeyf6=wU_3PKMZQC~N-Mbe}O-(p=?i_|LU&b(nO>^xg)O_?U zLL1&8!h>+8CW&}Q+Pg3nDX#Y)B0Z~j^UFZGzp%E($H&pr)AQW($eUfL+TRNisel`w zf}5C@(MQ0<3)PjF%T(vgF8cO{Cy=hKU!pts=Fd=r7s23+3Hk!zhZ9 zUC-u>@SK~_Jg=9|$k8SC@pmx7YdqqG@v=0wJn_f&9D`X}MfN_E7vl56fG`6xl9auF z7)7tOlg&@%+-&m40B?MDg6zE%kvBRate|A(rRj|d!*i*Uw?0Iup;gBDd`dsJ3@GUf zDSRhRv&v=ofGZP2E^d-)Wx2Sym_V&XdZTgG-j;OhnpV#|xR}xHloaQxIN^MrQ)0a% zFG=oB5@xZ9#Qkwk{DOWi9?Ehe{=u<002ovPDHLkV1h`;EVcju literal 0 HcmV?d00001 diff --git a/app/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..ad2edbc93debfc06b607bcf3b9212a531402632a GIT binary patch literal 1427 zcmZ{kc|6k%0LJGSwq7d3L`(HfE9Z*{nX8GPxf*knW1ATvM{IH*g-FPmOj3)mG4~Oc z4piSmtixZ$3m9LlwVrC8&8m@TGoFJ#Lms`G*`!k^y|&j{~R|-CCYXw46i4b35S32 z%z~rUg*A;8*i3Shf154ZN@zoqQw%!W_c^qP&&U$rADYgHnLa{*u|=AZF)Zec=sU46 z0rNA$5_kTY)*!@A>(}QV584)wpJ^%@gj_)A#!Ntp*zv*>&0td$(e?;@_r}E zW-MMge3DSSXxp~5mQ`vw5{)V^i(u@$IGA(N9oG*4%JSdOE~=3CRF1TQO8Lv{FS6qk zM}#JDU6U?zgrAzz={X;SxoVKgQLlS>?erXno@0RY7oZ|Rhs&Yuh8QFcH?a*|m1 zG=0{3AdE<%)lZt80Se=!Dc^}Lf=DmE#)7=o)=;mZNPxSF&zH)-0?a_X;) zHCyLp^syzrYs@3DDUs_f>U&-{5Y7M-^=v4G&&7kb_#-q~-2)y6qXnB)-HqA_6XAYm zyGFfw3{IykX}-z#IZt|jO#RZ-)85Z;AfpS=B!q1%Q6EBZLL zQBA4tLO4{{#c%CmG>=2pibRYFY}*mD)#FqtI#70Wb*-OAzmZ#yOb0lUooDp6=kfDY zNh+E`vlqPD-;EpqHG}V zNJDbuzu~3^j)>4lk~H`v$kNDU^McqCd$#^t_v$ zYFTVk?z`pg-$`#uN$maIxpu` zbQ?$SuBdYiB$i9cNJG`1@7>nUk>W*o%w{!2Je3Sf`Tgz-)Mfep`*#A#ZnciK&U~3X z{9HjP!bxU;W5rcr873+E5-Zn>7P4z9zw!zcxmIs{0i-JcgWXY{lq>f_1TgUnO(5UcSw~o zAW9QAhPq||-P18^!p(ie?XB+o3~jx+w#@a=G{GjPamrAYH&sE4 z1Fz?@)tjgpwBE%g2Pc7Vr^Z~;f;*iZ(hRX3)qiHy|0G+Q Z^)Uawh7z^+>E5L*2r#q3RGAVI{sSq!tkD1f literal 0 HcmV?d00001 diff --git a/app/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src-tauri/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..26b5e62630b0ad0f1937dbeea4c33a3e1ca7f805 GIT binary patch literal 1529 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 literal 0 HcmV?d00001 diff --git a/app/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src-tauri/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..38aefdd8a8eda42abbc0b87f85d85b419985e16b GIT binary patch literal 3114 zcmV+_4At|AP)XJn-NL5IjU61QG~@1cGo&Mh-Zz1|Qg-neNnA-8CNLtH;wb-EF$0(%928 zHC_MxfAv?jLSD1ADIN(t26zncn#TZ-0baAG`9I?Oi8*1y%#*>7R|CFuAU)213=C*@ zfnY|)q6yMmXd&2GVL;r)X4>aw252;P8gm;1#uD)}Mz73pm9asIuW6dcgbXu48wIn- z=kp2X;O`*^=GPTPp+F!o?B}d#s;W{n8XfYU@P0fVXHH{)2I7RnVbO8pd3kx{_xo|P z6buGw_UzeWa%doCcXv0{)zwjXc{%m=_6|!}j8RxvNHsMzVthGH2DF#nzI{t~@7^7f z0r+jqXWhDW%n^A&ety2Tc=2LtXlS4*Q>M_QNs|QOYiny=YiAZLSYXQ3u3fv9+06iL z*|KGH;>3wTr8Zeo2a_hemx@WrwD~dPuP`rYJG7Pynih-2m|YCepo%kR&J_Q^q$JyD z*miVRdRh~Vh8a!reasdOfT<}iE*5`-_--XQxotf_hMLfT($Z3olB3LflyrYA6beyQ zRaI8)^H^enV#SYmgdaT<{F#mzyk;!}dOv&vPB#*Xj7k%n#5jw!IEt9WY6fV=!2Mco zZmw{`NZkJ9}1jCZy2TZ1`t1B(7z;`7aVwSo14nk=J z6J~KM8EOM+$(9NF&I;+l1X@~J=uT;h+_E9G?S*a{vB)@js*u5(`P~>FMd`l#$%wniURJY647Na`p}_ z!~LX!N6F7g&BFIh+-EuO%^A}GISDi72WIBcqelrJ0CmR%Dk>^y)~s37-rg?M`qisf zf=KBwL1Hy99caL-fX-rkY3jfnGxzW4vXp{?0@Ip+&p^5*aWMJSt5?&;jT@=5vQpUA zCr_Txkt0Xw)TvWuB8_2*kMCmKUAuPC+_`hby2JD5&*{dE8?<}(ZhG+Gf$dE2r<;7i z;ZcgKO;Q6^u3SmSj~`E5!-C7ii4$qsv}x4b+)S4*UmlfTkl%rsJAC*sEnT`aac%0< zsiKb?H;z`VS|ylnh3~PgI2V&lrO8~Oq@+Yhzl?xnd=0Y$M(o_VGhxG1ZPM<8!Aq7b z5$|E#WM6>yv5p~q0yz*3WvNKCnFc~Xe*9ScJ$?FgnlWQW!s)_fpi6>7v+zE~Pc>na zI6ZztG6O`$I1m6Z17pMQe1Pj`oz_aWlP@?}G`z~clbI+@flSm!lM~3+(a|v=yv3_z z@|!nrY==Y?JJNZyhYugpty{PHg{bIK8j&xg8=0Lyf4(1+!0 z(CEqsow<_%GPB&jf4_)GWO^?p6NK5ib!$JUz^oaPW5C2*y?RwRc^Pub4#?x+!GnUy z1HxTNXvL?$0@BfBS3l^QJIm80W^?Dx9a^zs1#REHo$BlB1u-sNx+KCzL?<8S8N-E) z(p1Uoc*S@-cI=?rw{O#$HETr349P!w^e8noHHq_N32oT0VaQAtjuf%{l`B`Mt*vd)1TC2{ z^XJbOkr|{Pl8(=xIdewzf#2cg$QR(k%)hG|SuvMb%dmC@5501Lxx!EZ=SK#UL673izXFJNMr&(DdjORN&gqnv3!rJTASQ>gND z3fIi#*Ezj=cv)g^H#aY@4L@LDMd*BdXbB61#Oqkwq}MNO1a1T3BWs0}&zUoaPM$m| zGGzDOOCyRJ~(V|6(@D&n&?bDw@;WAByuQyM3;_MMm>;l^qia=x^UqF?b)-Z z4-*p3Ro9IC#?=&=_d5!56QkrsNbT(4&h&de4@LL`*MV{AB9_C2s(3wc;DC_oy?gfx zQzKDS_yG`KRx#s$NdCEV=ZM#93S?C}T1aeo@*FDs>aP^4n$4YR5vg4r6o1#In-d!d zZ%G~iBFO?=t2IF~0mO!5ZES3$W5tVNQ)2h9NSu?Pb{v3&V*5o#(%WCWXE{PkWc z{lmYwz5h~#k7~zT-PG`FWb?XoS{eWen=oNQ#!OMNCLn7@xVmlIHoR8k;_s;W_5{V%C_ z<=?o2t>B^Ldp&D)U=@br8DQQVA`@0cR9^J+KU2ZdKZ=M)>+R~pa;*Q+wD-99U0wi{ zfD1Iz%@qhQh#&3l1JW|3ok$qnmWWxtwFrrlrf1YJIgy3mW`+1LX-aOsu6b!}gU%`% zikKYrG?tnGO=l>i9>k|uZ{~^5#|Qoc_=3_5VYA8rfMh6uvdk124jMMU@MnJ#NTpRc zy*cXn-L)Q&T*zzH2G6|Dzs{P?9}`iKbtND?`z`&9ihs4=Ks4P)d|Ot;EHOQZ_qpvY z`R4B;&L=o_mu?bq-EzN9$-j+?zEqXWkh{Zo!Kh+ z5Q5wWtf`u>$zf%SU_(OYq-n_3o85`qW}F*qO8Rg48WQ#HpH1v$e3O< z1qReD;z?JrK4C{hKANbSU}4mcJ0Vo$_zK{F7pkLdS`TB~=DOfRsOMlcs z=Ernf=-x!k@DY9vIfN>Hq-VZN`KV9KV%bh~&`=^Ss+8ld!+lsLqM%?_BMdI_sKpm0 z;_j0EfV&rDjE`Vv3N}aRNj!7j!B|G=dbaa`w0=<@9boF_atkQ%X{~^r9d)*lW+aJG ze!R{=h=*k(5o4n*F*J9;pMH&n$BAu0*qP!i6QpB7(N~Z3<)?ir2}xQbQNC9kKKsT|HTCMt^;%0;34Z!*G8?t+Tdl7 zKEL3#FOMIE({ev;znHcL7^jD8@>qf4GypqXu|MfU+|1|`fw zs97`XjLjEkF=2Z2%4c2r2EApYPRQ(Z`~_v4nbiW?9snmZ{T{oYT<@<0V&g&F*i)?P zX=(e`1%&^H_dsXz zo*zI?T)@aci<0+9bMl^|}q>iZjWF9RL6T07*qoM6N<$ Ef@41HKmY&$ literal 0 HcmV?d00001 diff --git a/app/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..27a57f998bcbde70f9a98a0fc06099c4b6ed4ca5 GIT binary patch literal 4958 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 literal 0 HcmV?d00001 diff --git a/app/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..b47f7522d6fa4af8ada6914ebcf3bbd5edcce6c2 GIT binary patch literal 4585 zcmdT|i$9a?8yB)lGB4sK=R+byIfNmHG!qgLZ4S$XOlVssB+0}aCZ{63jD;f2A(lx_ zwAB%)4ip*Iy;E%k=r96ARq=kW#=X! zu)}Wq-X#J^d>0(LfQLu`%)w6J*Y@XO3ng1XK;i+^?u7fb!ev%$+5uc__t&>L-h=CF zMboA!(=f&a{6caEG}Gpjo@O|n@rewy2_K9cJ_+2?&;F-3x~^Al(B*~|0An-I-lcgB^qUu{cGD$r0FNF&0{o?+dP zrmnlMu6C)Z>}IGdqxs)FZ*_g>w`@h91C>_Cs3sbZs_I1CWNvsy@^(OjVD~cX4)J*? zXi#8A5nXG;`0&t*4cDhS=sIeR_r^b^P=b)s#Lp+2I5w;EsiztC=ec6m%7O+exL-)9 zlGp4t`5S)10jeDOX+{mXTIl7kDze_g4n$tFfWSdj@KChJf}lVl!P;rAaCoPHsYF8l zfZZQSvb8XNFYrG5XW|B}W`<<)kOw9Ne})w7xM2(ozyxb?K#Nx~psvPFx%`B<#QX{2 z0J&9gg5vh8vLFP|jkLh*5J02=gD^n%i@y@`yDt41h$QS<1<;BK{`b8Dw!(ODLcR#Z z?jcCxKlM}9F~N4AsU6U_P`o!obgcLuS&g(0h6hL)T$-KN*Y#d2lSb!T>Q_wqhlS=g ziG>CxNq!i0lrv-34%+jcDP|sPm~Z-?8uv5fVwm1Y*M|~r#}_Df=yo7e$s$<0aY%j4 z5L4O>SbH4&DX7^$gZ%L*b?zoJv^%vz^mQt&rdKd3!unVEe8V>{O6%pPjvJb=m#km5 zjHDf>i;$?dB6UJig5BUD(`cN&IB1uxA7)p_vD-dB3Y;O5??ha+05&8bcKGC%+JFf= z;Q)PcvH%3&LQNIS1J&)2+CyQHB_s&C#m_!*WKQ8J0maN!E@|r=<756EhZamnS*W;)Fi+2|cQv3YwRV)P8I*lANPbAM^yS5*;rb@oh|;#J;mC=T~@5~kil zOPpC*1t}ahKg`C_yhPW*39|ay;5>OqY>Z6xU3Qc8RbCiLZ}EyzIF9#-2Lgg9P3C*j zec#!yCRl&g=v99O)_dZpkskY--eXYg9bh&>fqHIU<-vFoCZn0phI_e~V5TvcD9F66 zaKMXUNC&!QuEqGN+wf?T^|qiJOfz7&U%+-c=(FF~kN5rM9`N6~c+RV4B@^llS|_t- z8t&EIOWJxOx_F{k6+CUfbLy30M*Io4(soQdy?tio%Plg+>_T^5|I(Gbg%e8KOT;RV z<>BA;(e>H-W?tNQ*n0N9+_(1ck*vWsZ8?(VL?`K8@~)0+XCNIp*x-0LL!9X~cav=1 zcey&T`P*tRG^4I*iF2@n%n-j@{;{Sez9T5Lp}Ir$_em*xV)w~`wj znfF+JTb=fj9hR3+R?cvWI{e4KTeVF{A^H30oP@5I-c`)Z$H#e_zOqOYOTd?XtVS49 z{@pO@Xbin*CoA@4U#@%^$EN}@np*_wmJt!rtA1p*9OCR~tP$+S7$X^@;&V+KF7ww| zEoigmNyF*=f?rFjZ(ZVBv|(-9Sq@bFwV~(-rSqI=();?Tw`{@@i@B{aqHTFqAU4M- zuV?w$?duHnsGr(=<(A|9-dPfauXsza=Lms6M#4Jceb%D!Z7eHQ_B3nnN!&;6;FFAc zk~W9#!U(@V=8LT&VlOQ0~&{Gsf{SB*pBj zpGuNVpzB`meKv~p>Z9o78kkw=VEb8;wHCy>MClB;9P)N4=UWdkG9EUBY5Lq$ zNS_rBc>e18asH_+JONiEbvt#loEG2TM`uEXIF|WEzSrIxT77fiY*oC#B{xp^j=w*~ znxZW>I_Bt-)O$C<774Ox)@hz(>kYQ_gQ`>Op}5w`KKjT&5B12#UGiwn7i18MRsmNc z7U3V#-((ntAEok4(lgu~)WC@V5hV@LcFGSH+zY>x6r*@C8W2Ae4B`Cz?h;~9yhwGg z&l99aIc}sTYQ@}$Yf^B&=kL1R9YDu;q52)%N@9`xG(y#vv+7tZZuYAEQJ-&d`eur^ z@*JDbG8A+Xyv@60?i2c|WEj6tT;aHD>-lfKn4dWYwr-S;vide4(CznhSmo8h86LVD zOEY7&FY{QN@?&oX-=Z+-sDsX}#`1@Qb71Rb&L^n{*VgC1y!u4TIPmDBPH;)LbAMU# z?~Uh+Hx=~L_%!Nq;clM`mrr9C`s(3YpOC1vOXi{|$gA;@N8HTdD4CEqw*Hnnn>V+) zLJ|zAl!;9^i7sVYU-0aFm}T8U8TMKr{_OIa8fa08lgOul32mk)C2CI5`WRnbH)5dN z*JxevCmj;n0LcFAr{p($@fPgD!{6|2vvHQX5C3;n?TuS=Er z_dSmuoQ^IwwJcMn0|?cQXHWoGlMSBD+(Wf&1da`N{Jtm;AM$ z{q?J0wL#l7&r0~L#p$K*ga4e|+yUi6;V^{p;ia0#_>e1gMC&vM@mf*MpoO4un`Mat zcvka%DbVkJAUhBHd_SD0ao-6Jo1B#!vH2CSXmok$+A7%mND~cvy1t@YL;t$0 zBg3ZD?KQ8~v$l5HUO`=dA|__5x;@-zw3OrwgNxp&xZ-=y5-d$fl5;P(SI|;hGAl!6 zw>u*J(-Z>$tP|wEkuw!hMlL5$XWM0$GY+C5(YYY5-&I4QJuHUksQUk>m@Qc;S zy~a0guCA}ahPvlfs{MKgm<1@j9pm4d_4yJuhyt3)WjmtlZ{w#L$6qz`H~RAf8NRhn>6i@(Ws+{Z=Gk z>hnt9Z^t_*>pcq$TJ9?!o6`_0t1go#$M*SxAw1QV#C#H2biX-04kZdi`L+T{0&1;o*l5)}U8U>yc_M(p zZrv`v*{ch8jilNJPY4?P1;CU_)Yfa&3FOGL?`rn3@C$z0L**j3E4-fo>0rbS?H`V zi}I6y82?~h=QwkF-dJ>?_=8@$ipaJxWAMyY?ib_KuoI{>L(sOw5Zt)*xabhIS8e?8 z4t(-}l)OT(7ort6XEONFc<8qBuA$<1I zw%|K>yW}KRosD$;Cs~$geYpCmbz%5?2-><>$OKQ=)_R6=CZ8sLtM2o}4NE0waRb=| zugeB49e4CZgDKbNRYcUlsbQvMX%n<`CWzNw0n?Hfto;xv-l1zQo(_wPn_Rw2IuF6@ z4zyL?@54!We&om%10n5bga4Fgjh4?U5~MvSE9lb4P6!y>b_`7D%;mos<5=e4B!&-K;{PYLcnll;r8N4!QbebKqXN5-wF${ zlE9uC2=Lh zq&|m<`jg#Oz@C{#QRg&z&__A3amBPk)^khcj0m5|ti} z%lq{jv_Z>$ON9LVun(<}xhH|}YW&&CzdvddLNF;5O5J=)#o!S}hELkFUcpEd+-r26&#_#6; E0Iw-Xwg3PC literal 0 HcmV?d00001 diff --git a/app/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src-tauri/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..f96a29d1e231865b5d9abbcecb451422b3a13b35 GIT binary patch literal 4474 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 M07*qoM6N<$g1M=M$^ZZW literal 0 HcmV?d00001 diff --git a/app/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..78cd650b3370373d28f1f7933ef06b0f6acfdf5f GIT binary patch literal 6550 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 TI&MiW6~cjZaIq)bVlVz5@xL!Z literal 0 HcmV?d00001 diff --git a/app/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src-tauri/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..20e6e17acffc25c9c5e113253230062136577bc9 GIT binary patch literal 6203 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 literal 0 HcmV?d00001 diff --git a/app/src-tauri/gen/android/app/src/main/res/values-night/themes.xml b/app/src-tauri/gen/android/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..31bc77a --- /dev/null +++ b/app/src-tauri/gen/android/app/src/main/res/values-night/themes.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src-tauri/gen/android/app/src/main/res/values/colors.xml b/app/src-tauri/gen/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..f8c6127 --- /dev/null +++ b/app/src-tauri/gen/android/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src-tauri/gen/android/app/src/main/res/values/ic_launcher_background.xml b/app/src-tauri/gen/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..9bc5213 --- /dev/null +++ b/app/src-tauri/gen/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #000000 + \ No newline at end of file diff --git a/app/src-tauri/gen/android/app/src/main/res/values/strings.xml b/app/src-tauri/gen/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..b8fdaa3 --- /dev/null +++ b/app/src-tauri/gen/android/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + "FrameMate" + "FrameMate" + \ No newline at end of file diff --git a/app/src-tauri/gen/android/app/src/main/res/values/themes.xml b/app/src-tauri/gen/android/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..31bc77a --- /dev/null +++ b/app/src-tauri/gen/android/app/src/main/res/values/themes.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src-tauri/gen/android/app/src/main/res/xml/file_paths.xml b/app/src-tauri/gen/android/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..782d63b --- /dev/null +++ b/app/src-tauri/gen/android/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src-tauri/gen/android/build.gradle.kts b/app/src-tauri/gen/android/build.gradle.kts new file mode 100644 index 0000000..7bd0788 --- /dev/null +++ b/app/src-tauri/gen/android/build.gradle.kts @@ -0,0 +1,22 @@ +buildscript { + repositories { + google() + mavenCentral() + } + dependencies { + classpath("com.android.tools.build:gradle:9.3.1") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.10") + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +tasks.register("clean").configure { + delete("build") +} + diff --git a/app/src-tauri/gen/android/buildSrc/build.gradle.kts b/app/src-tauri/gen/android/buildSrc/build.gradle.kts new file mode 100644 index 0000000..cc18ea8 --- /dev/null +++ b/app/src-tauri/gen/android/buildSrc/build.gradle.kts @@ -0,0 +1,23 @@ +plugins { + `kotlin-dsl` +} + +gradlePlugin { + plugins { + create("pluginsForCoolKids") { + id = "rust" + implementationClass = "RustPlugin" + } + } +} + +repositories { + google() + mavenCentral() +} + +dependencies { + compileOnly(gradleApi()) + implementation("com.android.tools.build:gradle:9.3.1") +} + diff --git a/app/src-tauri/gen/android/buildSrc/src/main/java/dev/framemate/app/kotlin/BuildTask.kt b/app/src-tauri/gen/android/buildSrc/src/main/java/dev/framemate/app/kotlin/BuildTask.kt new file mode 100644 index 0000000..1605780 --- /dev/null +++ b/app/src-tauri/gen/android/buildSrc/src/main/java/dev/framemate/app/kotlin/BuildTask.kt @@ -0,0 +1,75 @@ +import java.io.File +import org.apache.tools.ant.taskdefs.condition.Os +import org.gradle.api.DefaultTask +import org.gradle.api.GradleException +import org.gradle.api.logging.LogLevel +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.TaskAction +import javax.inject.Inject +import org.gradle.process.ExecOperations + +abstract class BuildTask : DefaultTask() { + @get:Inject + abstract val execOperations: ExecOperations + + @Input + var rootDirRel: String? = null + @Input + var projectDir: String? = null + @Input + var target: String? = null + @Input + var release: Boolean? = null + + @TaskAction + fun assemble() { + val executable = """bun"""; + try { + runTauriCli(executable) + } catch (e: Exception) { + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + // Try different Windows-specific extensions + val fallbacks = listOf( + "$executable.exe", + "$executable.cmd", + "$executable.bat", + ) + + var lastException: Exception = e + for (fallback in fallbacks) { + try { + runTauriCli(fallback) + return + } catch (fallbackException: Exception) { + lastException = fallbackException + } + } + throw lastException + } else { + throw e; + } + } + } + + fun runTauriCli(executable: String) { + val rootDirRel = rootDirRel ?: throw GradleException("rootDirRel cannot be null") + val target = target ?: throw GradleException("target cannot be null") + val release = release ?: throw GradleException("release cannot be null") + val args = listOf("tauri", "android", "android-studio-script"); + + execOperations.exec { + workingDir(File(projectDir, rootDirRel)) + executable(executable) + args(args) + if (logger.isEnabled(LogLevel.DEBUG)) { + args("-vv") + } else if (logger.isEnabled(LogLevel.INFO)) { + args("-v") + } + if (release) { + args("--release") + } + args(listOf("--target", target)) + }.assertNormalExitValue() + } +} \ No newline at end of file diff --git a/app/src-tauri/gen/android/buildSrc/src/main/java/dev/framemate/app/kotlin/RustPlugin.kt b/app/src-tauri/gen/android/buildSrc/src/main/java/dev/framemate/app/kotlin/RustPlugin.kt new file mode 100644 index 0000000..3309f1c --- /dev/null +++ b/app/src-tauri/gen/android/buildSrc/src/main/java/dev/framemate/app/kotlin/RustPlugin.kt @@ -0,0 +1,86 @@ +import com.android.build.api.dsl.ApplicationExtension +import org.gradle.api.DefaultTask +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.get + +const val TASK_GROUP = "rust" + +open class Config { + lateinit var rootDirRel: String +} + +open class RustPlugin : Plugin { + private lateinit var config: Config + + override fun apply(project: Project) = with(project) { + config = extensions.create("rust", Config::class.java) + + val defaultAbiList = listOf("arm64-v8a", "armeabi-v7a", "x86", "x86_64"); + val abiList = (findProperty("abiList") as? String)?.split(',') ?: defaultAbiList + + val defaultArchList = listOf("arm64", "arm", "x86", "x86_64"); + val archList = (findProperty("archList") as? String)?.split(',') ?: defaultArchList + + val targetsList = (findProperty("targetList") as? String)?.split(',') ?: listOf("aarch64", "armv7", "i686", "x86_64") + + extensions.configure { + @Suppress("UnstableApiUsage") + flavorDimensions.add("abi") + productFlavors { + create("universal") { + dimension = "abi" + ndk { + abiFilters += abiList + } + } + defaultArchList.forEachIndexed { index, arch -> + create(arch) { + dimension = "abi" + ndk { + abiFilters.add(defaultAbiList[index]) + } + } + } + } + } + + afterEvaluate { + for (profile in listOf("debug", "release")) { + val profileCapitalized = profile.replaceFirstChar { it.uppercase() } + val buildTask = tasks.maybeCreate( + "rustBuildUniversal$profileCapitalized", + DefaultTask::class.java + ).apply { + group = TASK_GROUP + description = "Build dynamic library in $profile mode for all targets" + } + + tasks["mergeUniversal${profileCapitalized}JniLibFolders"].dependsOn(buildTask) + + for (targetPair in targetsList.withIndex()) { + val targetName = targetPair.value + val targetArch = archList[targetPair.index] + val targetArchCapitalized = targetArch.replaceFirstChar { it.uppercase() } + val targetBuildTask = project.tasks.register( + "rustBuild$targetArchCapitalized$profileCapitalized", + BuildTask::class.java + ) { + group = TASK_GROUP + description = "Build dynamic library in $profile mode for $targetArch" + rootDirRel = config.rootDirRel + projectDir = project.projectDir.path + target = targetName + release = profile == "release" + } + + buildTask.dependsOn(targetBuildTask) + tasks["merge$targetArchCapitalized${profileCapitalized}JniLibFolders"].dependsOn( + targetBuildTask + ) + } + } + } + } +} \ No newline at end of file diff --git a/app/src-tauri/gen/android/gradle.properties b/app/src-tauri/gen/android/gradle.properties new file mode 100644 index 0000000..9e6e7b9 --- /dev/null +++ b/app/src-tauri/gen/android/gradle.properties @@ -0,0 +1,26 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +org.gradle.configuration-cache=true +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official + +# Our old plugin template had a bug that caused missing `consumer-rules.pro` files +# so we have to disable it for now. +# See https://github.com/tauri-apps/tauri/pull/15828#issuecomment-5199937796 +android.proguard.failOnMissingFiles=false + +# Keeping Gradle 9 compatible with current plugins +# TODO: Remove this in v3 +android.builtInKotlin=false +android.newDsl=false diff --git a/app/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.jar b/app/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..b1b8ef56b44f16b14dc800fa8103a6d89abb526f GIT binary patch literal 48462 zcma&NV{|3jwk;gnwr$(CRk3Z`Sy9Ed?Nn^ruGlsztklcC=e7I2x9>aqJFB(1eyu-q z%|3b`eLzVT6buar3JMAc2#EOW{C^)LAZQ?YaW!FjX$1*JIcZUG1yyl%HEd!6f#E+}*Jo*NafvM<-FbE0;-_L#rp}qdn%JEoAVNlEB#J^Oq`mU_#*ev4HLmc> zjXz_hFft^><#omb;Zer-%wm4hxo!wjuX3hBldg(^-RiOleKin`>KHfL3P*{k?(rji(#j2Cc0K509#>qu=-T&B!-5EBi(+ zIuTD-qfcAYgS@`Fb2^-p)4#o6A3z0&fp?~cV=CRsAeCmO4ZQ5kKgC%0el=Q&Rhd#k zaGmAbUW8uKC}-C0s~2);d{;mpsNBx9rn__66W{AhaSvJEK+c0b6ARO+l(CI7E|S5x zhaYP--@F<|99X&)9`q^2(^-Zu^Tzfm)v|gkTJHQ!G*zIg5hzoygeXZoYUEJ;iFkE# zq^r$*c|>Hmn3GapzcDYnjgSFiO^NFyTR5AH#mh%zRToMpEi(r)1$5)h455DuV}0al z!*psWuL@Ke-2gvftfMEGf9YEi^<{B@qru zINgo+YsE&LN?)1qItJoNhISp-fZ86`XR#*6xcvM~_7=JHUX;K9*=Gu5X~ zix|O2d=&C#u_w{=B$eCpJ4L*6i7={j+{Og~`Emz@&98}6s<-p^)`0fXE4cJBP{>)Ltb>JwcqI>yz z0-r-SEhC@p)XOoh|1|XgjFaREHfsu4dAGVz*k#m+V<4 zHqvlud6=;#QWHUoTR_a8Y8+heN?M%n1@0YLiaN@GuOPNd26tik7eKulTx?mM-R!1H znB6+H{^krFXg_b{y=QeCT~qR3T4}l+b!Oz9;~|3*6F<3?#|DYYW&1RtFE)ILZ!`85 zVmvrZkLTzf31unH7Cc5E0iFShqlBE9hgEnRJH1juII*vyp&xd!g`q}X_6WT6E$hhQ`Vdp9k^<)VS?lj!cTh z7FQcQAVA@jL^cXod8cnhKG2TS9+;QU6Kq>}UOY3&TL9gXbl{Fv8@WsF=z7>X0To@$ zY@Oi1uc|MdJ$>Kn{@!g_e`-I&Tpwfg9cr>(iakDX1qciCG_1y!Di#4_)lE!bWJbrp z5aUonb6m-?tiQyR_`P#~SOu+tb_ev6JO>EbEhHK@KbeT0_FDo>dl9bMg)>xmCNB*g zG5NC8ABavuTEZVGW6jP*nAqRt3W?7Iigc-EE~zpNJXRAE z>`~RO9$892j&I1kV;9U)xT8^}IeV`n{}QDtj2o-RBt`DGZUOO;O*lFCb_vpyGh*;95PfeGu!dyrmZ9VJ3Z*upg z6R-3Lr%_55$Hw1^{+KWx0#z`T7O6sXo1h;m?B_ur`X2bFz-SzDrL zpk^@B<+I6imc@7vip za%1jMB7q@1j# zz{u?YojZMW{5j$@h=v4iu2mTu7IzI|)Sxn!74=*J>1a&?Xjt z2%JhSi#4huEcD9qdR9Lj4vwmfnL{%+vQ{f-KgYeqin(OPd8+(g*Uq#TLxQjD4 zLCL%ul(V&PAPlAx8D`@K8Rc`{GPecQ<)d=KWel0ejFeeXGQ6o7601B!!I@RY&eDriADD6wP6DcFKDLZ|lO#YwnrNCZ)zRJpdxX_nPZa4j#$j6v!h|6p!dH}MY6#B`@%6=) z-HigguDACKBULnon^FKzazF|Y1{t(U5rUGnEU|}djVsWT-F>@@mNx?_$kF51QF4C5 zStKR$^3(fw85(4HGs9{mUTtn1)3PwxTN?6}j;32&vJ^BiPHfndLkdU5sOemXKGyCZ z@<7j(k>DNeo~QXyJkFWk!7(y1SB%nA3{v~P2c8ooKa4auM!el!Q_=;lJ$c5ADqE+^ zX8*|A99v;jWPrm(8=h;2ZAj|(vVbx~wQ{N%v;eYLD_BB2LAEWCs@xauyBDl(_HIBvA(XJ7B1E;O zJYCJ8xFJh7f5sr;Y#Wp_`$4Z_H4e9bGiBp?Qu&2!@%Bl2dT5evfFO*^hLDiBu2%Jl z*WAlL5PaQ7skJa(qVysky}DQquZ8U?2@UyJ8zB#=U_E>MgE%XA$CtfL31m$rATJvC zs@!crc0=128PM=Zp zW_5Czv9))n_8Ru?{pxM2F8^r%*O41}RnONbSj*piG%`nyF>6ky=|;B&k8iot(J=kyoU3p<_zaAX(1ijzf*uXA zZ_5jeC{Lks+&QeFIlmzZi3+fsF4fNW^~kvC4Q*T-vrNP!x9xnen12lZQM=1_MdW76LKX(GuW`%T~dM^YX6+ras|Xy4Qhfcq=D+z-P-ea z`T;^gj3+grr3^hwqcNTJErl$z+k>{bYFm6QV%7Opth?9+>|Dn)O@`7F@=j-XSqGPW zjUAu%b3Er@;j1%RZxVDhI3sakg-gvTLOSV7;FV6ED=(5;UG??=WADZw^=$4AyFh#}VMe3afM^pF zFa}-nM8X=K?Jy02*o02@6k{ z%O!hBhjXlXKdhy3A{xGB<##e|j3^dFv~~%v2_H{t(mN7NVeS~51?D&Ozbxa`qwZ_4 z;C#Q#fL1sua%ggucgIEHZtcY=Ag&GgE|h7Q{77D!WUq`;SSGEE0pU;aoj<7-JCAvf zduN=(tx3Mb+EUXKoax|v;8b@#HJ&Q|!g4ryrl|R>WlAv?IH`bk)I24;eE4NIq@SLK31LD4+w~#3iN{=<`<1R!t^$@K5>U6%W=%8_ANuR5 zs(IDuI18ftirTDARnGmF%;iz+4{MlMihJw_l!0Y)NttXC_t+s)V<EY>=Xin*nGX79k6vQ?beRk zy_J>@YSC_gMIG$yjO-y&o>S6xtfT27aSs>e|`x(f2R1bM}*518~%x>1Yct=18b&Z>GiS*>VB$+i2876zL)1cT zN33g=g|>xWE2)dds5m2+8Vy)m-u@NHOlGYxxjam21r1;xWtT0TgqKZrl}*LSkqFt4 zNTI1=3o%C*!-i;iWnlca$stRdwITA1?#fD~5OIqIQAM18BwO_u>hqL&OAANiF|8rG z_IZ9mp?FA-{Gq9+Ky<#NgL1gWJixfO0ziP$4T4G>vsvqC-NQh+A64F4! z-(t<=AbPSG%`mTl6BJtH~3RmvPhQlE-EUkEoBIP(_WMN zK~Fe!siee{M*ns1hkp5(2}vX#%u+T!Abh=<_gEx_QW?h4V@B>uOCEetEe01tl)^`V z(=cOLmuOB;8&&m%_6pcyrt83UXkJ`f9I&0KxY09}RTTs!l^_7~8$tPA%Hm#&$k0;# zF;O0zCGo0IN)X~SyKDoY1DW{Ulce|V9w=ld;U`z$t$>8U!Gu8V?_LAJAudt3eI#*! z2i9~F=kP5m>!bmb%1e~b1!1gz01Py(Yw5gOsFN#o1a&d|=PpgN(#UVreY9^99I0iG zaYE@>(C^V7pnoB~#w$2C1_TIb1N5Je&iao?S2A*TF>@vpHg`31{uk<9{zf_}s&z%dL-Fo)C$yl$%pAdqU!HJgp zh_{m1imk{&{ScyeuziqZHu5cto0{S}^BlXu% z0~;>_yHGd#?Kt8ErxK)z6ojj5SacQobw)-8`c!$HOI*V6eyqou{1Upm%_p!BY^t(D zDtn(oQ!jff`ddGSD;P8Hes!v)OKW-*>mS&#i0ow87;h>(=Cu0>b4)|=EegbN5=Xkh z9Ge13=3z#sk+fT<)PuUUf_%Nx@l!P?t*mni^94p^Ax6b2SVL5U>9dHH!H4DL4}@?@ z?Gpq$C**OmWliYA{5s<|EZ@QI2{-K#brFxfA~AIqq&-WSALHWQ8}%mvaNFasrtnE{ zg=sB4-RF!?)nf{>Wo~kNFgYefoFHBcSr*;iF9B!R=5Np|jv>Uf+mcarG-XGy*kP{z zISVyoPcl_9cOg-@613Qx16OGF#sH&2NTHDa_}vyidmxS~pMfY#AeQvu?AXpWNzi7A z*6&7a7!C9HRU+N{>WYTh0GXoBnXw{lQby^XShgDOw@e8TP}9Y*oFV4MVF#@Ds2A+A zXBEt3a@-IIl)TOcXx;0P;|ihR%Tq@DXeG5p-O{!T7Sg$s1 z8OA4iOx-!>6eK^x{jU-0SvByimK|nZik5zKIvvWVGE)4=x^&5Nx%Qgje!k3VoizaB zip#?$u(R8u{wUFC>tVR8oA%7fs?xEu(gYn>y6BB%vwPR9&RoZE%%RK! zl#Qnkl^+Y*Y4L{Xk(YX&aGj|zSpqO_;C3CTepA!L#4EXO|(eA`Fi+2EQ3!C zo^SpVP?{chQ3uaxu7y>w213e22cdA#l-M2kStPE%sq6vE4M*?3At!S7tIp(tQg(Ml zECjeJw8)*#LYYk_+Txv3rxsH9jJZBRrHp29yJ(^;_PEdn%#U1q`r89}38;XeF{ee& zsZEsUbJ{LtwOjU{vjL(Wvs2!Bx;#^Mzld&TjS@oo3kk=0P36MC-Ie6eHNN&{8b^s z0@jcbdejrrj!>r#Wu=3H1dgjeOI}NkhmE}K+UK&M>%7b!n&{0Zixk%^)6#@=V~IZN zxG>9kl&STQth}qScidfg58d2dF|v_U<@+V^eE@$4x;7oS3)MvWusA?9+%rN>aY#eA_6 zic@S(@e9$9tQM-&-7>X8~#n{5G}nuOu=dSyN+b~jA;_SExZ1H9Q1A}}Rz;XtXUIOP0~ zZzS|~T+%de-nGI$s?wxaJoe+99vmo%xm8o8SNEsAqAE)4LNvHc-1AX24C4k4u3vZmov^_VcxgGxapV(8)_K(^8= z2d{xCrmk(x&514Ly?e{Mf6}h3=oeP7+ZE{%B^c-kK8g0W{tYw3q%zty_Rd@1nbnyHMwabNp-sSyzpV4v>QsnKcQjF67%g~n&3t^1MesVxCzfJ5b=SOI#YfPP^^JGQw=9L1RCMFbrU{8O0LWOUdBK#j&{`tzXX zpe2_{+-8$a+o#%8MUlL4$yK`*--z&3{@Y?jP!m{g5nM+Ht=bD3o}Ok~sBQ_!^!->! z?NDVtyLXzmGYCEmjSCDK*q?Aq1;8fz9l9|z@~l{)R6GfKELc^(nV+TjjI^n0M+S0i z@YOu*Tk>|M6a0_n$(E;#^1Zgif<-CpYiMvyT+Y*9Z?&~IKSwsLa5Q#p_?FqK3lKIw zlp6Hk%lio6)yq>m-`QT2Nj-q!aX7~Hlm^Xh6FNbw z$#ri(Kk*GUHXORu@`aYQU@ zB~S-oIO^~abRPocemkm!W73dbb!j^_xgo_@#W#6p12>w^{){VfeX?U71Xyn9&E zHa1#*!4c;?r}jv7dMN`g#&R_S215)dccDOJr=uz%LIz@zia+LIFjRakROr?P zQ|Xw0Pa8o7&W=fw17`+SqepsQ-Os5v3ncD5|N?N(AHH&`>hLY+CLOluJ z_ErpaT49zK(UcdNmQ%iA-`jS`A_1c|$W86{d_T_T2V-HH3xUqpX0QJSH%i>1i>#vK z&y{;5)^pMB=u;&_DEWakQU>j&+opIrBf~2GUh{`kG{|Z&2Z}5dwG}>Y{W_uQHaR$_ zYH%}$c`CGC-FGCetRdQ@RZ2-%ucC_|R?mHzYEnqC%u9zRBH8wx7po`=EVPMpq+hL2 zTdjVhQn$)++17^cn;<3=bxJy0Z$U;i3AqJMPJO&SuieU&0eVX?eLEEI7Av@#PV_ZQ zsa>I>B5HE996O$z6HyJfhEt^aC><@AnzeN`xs@lv>^pPFtcodrcGyqPSB?#C`Piu0 zh5=hAW|OtT9hs*G?7}@*mG_f7ae@-Nz4{qvne66kco^uD$(JbCo2ttqUm-SMy@kx% z!eDt?5>w5)M!E#C!b#Iu9GqyhUs|QoYWHtR{4espRS-LUt=viY2iygF=-j3kcU#uF z{ka2=zsOuLR}s;&PbbrB`zty&NfZpV*Y;~i*W$EH0JOGS&FMS%VK@)f*%OOrcU3P9 zq4zjhMpx}oc`PWtP!o5Bdlp=(A***TZwVwuZbuB1Pibv5uiHvW{PsE-k5IfCgUz~l z0nMeZU0R>(ajoQ0G%Il)z0BgRR*bsdz5NcqJ<)niF6|PUO0i}<4)q>6wx4K(5>Y_I z4$WMkbCOQFs(krBnl zx85i0*7%Zm(&nKNP?AQ}d~6@?D9dO%@}ouN2paSR;zyUqJuw)1SRy=g%o;g(BD|Bh ztnKV(4fcBgDJ~M@%}n-6ow3xOhnC>C^d?PbS(9=TnO)k5p+W;pu2F4eiG7ts zJVL4M(NiZPQDy*9`H>-P0GWY#=UTnh8feiNF}hCs`8^ZDKy;XIL^9K4Ps&y^#DQSE z-?J z@YOQ9NQi>ZP>^ix5K`R07kWj?`R(B?E*OyR1$Vd;8p%2Y2zEYt4CJM~gVX%MO(E1B zzXhsHn~R1ifq9~dtzuH!*3&W;r`D(Sjrc)m#EI%`Car;CMWcU0c+0r?O!)HpjEvyP zb^;pO-Bn6e-+>dS^o{q&8yEH9v}vuXX`W;NPRlwJdX|59`z?~z{pFE!^u{3k{KkJ55^ zD;F0ldy9W*`d5YP|0(E6|K%}9|D^SIq>wO)4^cJ+yCa&xl*3}hpvcQ1eP_k;@>tz= zOZnw)#fxHc81jPcTM#)jgy|0?n0(jd3IPu-lJ&Tm`#F1)o$GTwYp@dlqy-qiHFCHS zKgikMUx|%x=_%B)>n_y^+HvD2=nP`}-G_0A7)I$yc4`tXS-On8qOkNp>Q^$|Ew%Jm zYx34*(*Z3SF}xw$CA?nG9O3ZH7l)@Dp4EyH>8eXDb}AFz)k*T53iA~gRu&e15u@|% z9Rw?69nQOeJhv^^unjd-VGFwbDzf9K{i(U{xxHyM@-aI+0qP{TU0G~w+Fs>taL#Ik z4+92(Z7n%+okd478;__0GkE`&(C`k8h@?UNnM=F%A~2|TKo)q9F<5`s)KwxJRw~k; z4giS~|8AIVG;rde6I^W6m9fliR^7YT*>&x7wv^?xu(5p45n{|2F>x%?9Jq+~Tqo9# zChbeGm@9!(s;uIKae_4h@`~yIj`Tqct+-M>d>~2PCiQ?UmFUioyy&~h_DTBQ--W|q zqA^UaJMTz4tEggQ*_cQ_LA7j7bLyz8#cpGggy;YBVk!%oSdufoh5-FYAQ)v=d$Bi`G$^~ zm!O;En#M9uCykPzLZ5SHa%?hDHP5P;T4HN0L6J*r9DAvC1WWPOrd{*obfr3yJ?Kl3 z^_6dnXRoi4<$Tr!=4mhHg6ig~BatHR zv%ZMJr-`8w_JyFEzUSQdp0HT>|9QQG?IXj$7Rbx4E)%HauDyY!tedHP ztIbq;D)ckd-eirAHOG7icBH23*ApHA@nG*Jdh}~G?L5C^Xw^+nLWG+>hRi&(fnpY5 z?^hj4si6I{m1u^%i_yk$tco}28X8|}g5*tAEZYF37$f(+xT%XvO^`i^Ig}%cydrwF zlpL!xdO->&@q|8MiJrAxt;z2CP*a+EvV`_2& z<1=p{zjhmmYVkpx#RV=#zuy&7^2Trn=H$nT{OBVF*0z|QH!NxBF%gbqT!BEx zKB!SsSUwSo1Zr?kMM%N)@hG=&m`vRQ6QK6=oIvnUI+|C)dGKM@jNwqG2Xi8;YCUHYRh? zbl@DN-za)+0F9kw>Yv=ioL)01uFp7@AVEB0AH-nmB%j$RC_totFy4BKd;OPCMUMBb zu3oUUK`|{AvkM+@KPZD4Tn$(VlQi&aWV*Uf@DO|FQjLOoVw&C@z~Um*h%Ka-C=n4H z@(Lf&MDJXNS{3Hs@J)11(zo9tGp>wS^b9{Q1WN=Ktn>ZieRZS?k`gb7P4n?cl^7^* zG5-oARAG#i<*z`J0ski%;QCLD-T$AbOHq<{KxIb4=QJRn@MGj=ns0WhZX+uX z=oTjz`o-VviMt1mB0W1vA*7oq1ENz{<*-EU)U;r*ODfV!G-?hdnzhM@rRZ=|qaFTN zX*t~$gc-)M7GS{#34R-n`B)eAPfebN46~61R?j^(Pg3TXR1PyQrO7Mf@xf<3VL0`4 zh(i?-SktJu8Oj?KIy4p@%5ZH;P&p5LB8 z^}7P)9h}vUP+1Hd3nNzNcbR`%1>dSZbWhiXe-CcB+s9e)_w<{bypZ(@cQT`P@ch=d zSOPhExgI31MVFPsClEXe>$~qYQ+d}7(!BE*9y%AjQ47BMDt=#>`1ie)|ES{pFFdHa zI)CK`f3x>)DtZnm!f5=e@g;3iK^jf!RU6hpjYu^V#q0uWLuJ-6={Ua3gDi9#*P7;- z`rm*5)n{2QE{UZ01PVy@_9(amogzzOwYcVgp2>LsJ(}hKbX_!ayZ7=U{!p{BHussVj(W z2z3$zu7h$KK<%}P0YBJ+)0unV*xD&6GusXqs=M=Cl&fP@Ttzfq?>H9TW#qDId+C7? zhD;;HOxDJR4dc_xI7-b6N6nZ@bUWueDk<_9Rju2I*o(i)M0&~%C^ zc)a<25M<^NrsjAccydV2HJu_-1W>b;xrB~Mi@c7FrW-94$-GnKXvF7( zA68!d!gkIo8(URS{(u{zRtrF}B$9@*)KH9POqOW-B$za4Sg-A&PM*on$>$o#L7pH~ z&YW8oJX3T!!@2r4Rr6ac0ZDbtB1b5yc$5}7oZSDvGF0FWTpZ#r7@GfM^MmC-p{9Qj z_JmmlTxO(^(NHqBc$ECU$jQp^;)%xnyr$qvNTd`R@j$8JppDCGQAHQ7?fja9McCUZ^;``VW$1+G#=<;K{_OfH- z_$fp~S3K`;jPNNZnkB@=DFQy3{6+Bq9nOf3~dr4q8zD_t{P4-^%<4kj!U z0aj`=#@G*w?!4fpM? z8Pwb15(Ka*TtDN-2aWK>*hh{R_C}*e*vSTkHdM(ETM!JrJ=1h?(_WL}2p#QXjrKZ_ z0k_yu^;~)#*r>sQP7d_4VBRvWJCzw#TxA{*hktwQI3ST{8{>3$KHJIgMGK6I!d}Q zinmfq&RLRxX8P)_@@vVr0gPu7*)uU<%xS{|Eg;*w1}2=C&?7B zSX?OLt-gZO+<4@tLeF+K0~*|xwMD__KxWgGfsUpj)KyeCM3J-f*uxe|xk;Dlqq%1< zL(PaY@U(>Z#k!C!B45JlmE^~wHSH;r1c^kWTG9_VT~1LN6$a6Yg@kNF?&b0hs+5Dw=0j zR(wcEYmdfgojx+Hzu89*C}4$I7^?^vYKhF(`>=MC)VeeFR}}?j#XeLnp8OhW9%9ND zt6utD8DHnQj5@YJv+$USdN{8apQir2)Z{8_s!BABmG2O#pz5lSh|gf#CI8X4I|U4g zhQwk=VEV+j+-KNxuIk96Bi%^(Sf9}A7o$zHJ5mV~)qP))QQY&^>9}z9z9)PWpw>8T z7#NWNEtnUoUl{DP5(lmy<3;tpLJ3hG|;CGB`3**uH0tf9>;7w;Aq9SRVg1FDpI5y~rY#B|eCNpAXD z9692@_%$t2^nu&4lU~(~_iVf|Cs|mXs-xKlY$-~FZB$!oDK#)JgHZCG)ySDURM=@(i zCpd{Er89|l&)(&5>L6LuWY3yC6)`jPz(Po8pY=AYIBnx3y2Qx6*sT42mpR$zwx!!< zHHCc~tbF^-bje?bo#~Q59Dmw_-VcliCn^FfI*EV)U1NkNA`6Cm=^%j`%M?1Zxa=1U zn#DPNc32&XHHfUfmPx*J+3_GA&g-_pd#wO=Q^5bdhzmm)>s@yO0q|>ROV(hkhJWf@ zqWjI#+9Wx%C+!kp&kxX|XPS5m9CBC&3r>}SwdFd#YF_W78A*CN6mFC)qzOjM);Z&v z#MjdXXMw63v*tbvY+$tDmuHNFunOlRM#qe|eV&|$98!xy{n)-=N?lrkr0_}U^sz|x zs0y);(2Dooa;(9zHzRi=I{GSVcv!6jl%ck@)>JODfR? z%aI)0HvbhzY9K7eYsntq#JvWzj$WCuoyGoPY7;LSPfZlFiWU)X?(-p}s4FXQcpIp00;%Jv;k0t@2vBu4i;rh-?{z}cHTLL9Rz zT8r(1Ws*H~EyH+adP$cGv|7HkeS9p6eOEI*`idH3twkEJ*72|ey4JgISglGV0Vo@qe#)f-=|g%l$S&Onwl@mmdn|sjXXYaQ4MlfzjiK1* zY&hWQyc9?G2}2s1fYnQ}LXpq{!&Kr97d?=a?_xXAU0SXrZE?T+=9os2*v9%Csph*M zW{}m4+PIRmHEI;<=c5$PMrfg#MTs);4Tb_0**o}*cimSWRcxo(;G&&NV+-?W7v*%4ACG#t5J zQP=$g-(mN*;B6s)d9JNkF0#Zz_WA>J;{=2a!IJsiqCV!YLjJ(wUJ`3b$>qcZ!HjDT z2xm;fMSbtJ|3o~tc!jJ+U8a)vX@NcxU8y#u!Puq%R~{sps0msRFO2!GM4}786S7* zxgNmf{q@|Sdnf6_he>gEGX7Hn)uih5nL&&t4`O{?V;;bdl1U~9RAnjNmt~1UPC3mh zrR8ZtHzz1(yOYSK$OjKf;InJ+7mH$WfqI^OG3dhA+S!YmIgRv>2H78?<6A=~%E{ug^P+^b*+f=j32&Nv&Ypq?DcH&Busg^AUDE|p; z8(tQxZs1+0gUX<5~Ah zT0cGckI5%nM~d`uaMJ$o%2bt^##I0UdaQ2>-bpsP4P1Vk8r7EOSr+a!D*Z4shiKFL z35Lvs^i;#;G{%ksUUo8(Nj2DY?u5->J8kqS_#{B`HqS(UkzR|K5&6XI_#FH4?$ znMXeTb$nmr1`|{n*#5H1T%vtU4-H)vrtAchme!ZG#@c+Hrf4uxx$;VU(Dr~N-ich4 zMKpdwot^bPY#kBILFgi?i3W_kV%vn2J+%R5x}TL8I?B~o#VXlmr?i=y`yJi-><;X* zPCDrsU51x;mkr+t18lPs=6)r^gEh2$saaA!qv_< zKQP13J}ptHaUjT_(*x+P}wfV-}57aU3rp#3AB&~e3%y}0ju#22u5@mUIT!GA{* zd%-e2DTmr#$(P6^$&N0oCgR)F9IPR~!Q!x6YI*7dx6LR6n8tj(#1~!0rofeMtT#g* zW%-p@V09>&o>iz0j66K^soJWg(o9#T(8Xx-P3?;J|t~nIDSGPq(?-B zOoNnc5HZhsW(m6!J+yj~kjmjV6GKvhO>%^v5`O2I@4B$Z!~DgelYWdC4P>YfmI$TR zq`atDEhIt5ua)PS;Yz1`FX@3Na6j^uBx_rNKTmgboWGwE6O5;iQiN6Q8>ZX%ApVJS zTEf6oj=@?7klS(JaijG|(gO@dTgxB3#H)4&?+@VWkTc)dl;qK|uv;WRI*cG2`6PiF z4+svy+Bfn&Fs57Jz6i!C(w$w@VWPAbRGak~oN>3vUg|Mmk0NpfURt0*DSJ_e*Gi8I zqshW4F}L&aS8x~4*#{4vOc`gKW99cx*L^69fgPj#?++q9LidItd}<@&#E{ZGz7g|c zFX$uKJ;Qv^NpN*e&EL;l@1br8j8oxO3e`g<911L_jr~Xb0)t$x$A~dFay9(}gt4&L zyb=1<`|)_7(!^xJ14xLBGKXO3`R^_;F01 zG70TiF<5(=pRsJYj!^XjLl_vFJOQPhN#Pkr#G0-m#xG>q)GAHjE4WFhe7Zi83;gte zdDv6+)qrgh3F0}$gPmtb9-Ff1m|xDD$6jX)Dcd5Ms-(@nKM_3)2+hfh6@Cs@-=%Z_ zIinf|ck6rN{EOadGmJ-rzvxZnAL)(mf108HL2v&m)%=a*?3CnX2ZfOQY?ha_11m@UzRqlkhrVbQ@0M(tSSTerx}IH@Dn2={w$iGqU#`v}PuV7I&A9JYNP%sqMn z1bTq*Ok{V>SlVH8H*4X-lO?VzaDQzAaLvc1tTL+To)YOuj^V8mQ?)K-FT(s_!ds-O zeb$rKRR-~g^+_aiGtH6kbJ)!K^ie;ipJ8e;>iy2}73i(1RY-~!(tk2zPj;pwB4k1a zVa~7lF^EE`UH=#eb**88zBH%!WkO0S?_Zu0KpRtXN+XMsAwfT56IZI}&cs+R5N~p3 zlQH7o$(zsQQBPIRmD)i>TfdcgCSKbVVD;VCmO3l1VNbV&rWc9o>Pk>ex!)Nap%NtP z&kKIFMm@k9-HeXj2$((SmG+a-dXvl7q(7n=8)cELHf!@Le+X)=++(}pKC*dcns?>G zVa*fV{2FDIJNaK_jq)WE9MvxiTm6sI%YUn|S=oP0Z`vE#GMZa`4V5byxmv0@8@Zb~ zyBOJuTAG>Im^uIL@!ZrWJy6xL{%n;pEwY87Y^xYSfmmgRcgcEDfz4TJ#{;n|g>8(> zv$(RLnp4oD1Mj>H@ar|0RCy}E{GwvuKOf1FS}O&z-Q)MmCVEK{p~b2xFj@lTn}#s4xg7h+r;n$TZDlT2AXAv z7R^$J?R|*xL^>7HI}e>7{HszA#Y_e8=~8*3zy_J$ejuhByeI0I!w-&%MW7Q-FGMKU z8qPm&IdU3w#^#`d%Vcn&q^w;EEr|w2F@ax^`R;a@p>l`U-T%~f&^`#zG}qdSV)A<0 z^*U=#=#o&gd{o+*s#j$xf+2y^t1Wj9_h}(DNi^aK#jI}z)v1rk-H)gocbgc`wB*?$ zfg~22r!^VEN+n>U8|3{Ebe#!9k|dF8lV*9c&9H~&g|$Ymc-2O^j9w$Q^I)ldd}5zv zQkBFDS2TxDn`p}-{-`br?tUCgyfr0Wbf3QeATbp=9sN|e90U^eVOu0~VT$1A5))@C zPcwzUn7bP^Gd~hLA@8EwiklMmlc^(;uPE%tLecC-iZ$_~jNJnZYn1A%r}=VE(-LG; znh6Q+b;zKz_N7)0SH7t~u#)e>Pr194w7xp;V&CpmJw5j6zBO%yB zjVf*iveYaWlrE~+p8YYym=-QmTd_F!`)ATishn6(oD}hTE2AqnVPF_os`ca^ET@@Z zoo~4YJASOBn<;8#(#3G>n1E)&@JA^3LV7mK^kaJ$((~ASWup3G(%#8O%xFX8XSiN~ zUF0&gDyT`FzIjtA`<-+9RXEKbwu%RtcrG!#-aoN0aj)i z(G|=#b_!z{o1}cIyw#n=j~Ac|NnR@<-CW$c%JFBFTi5JW0BX#4k2o2w{L0EglSN7E zFUcmFVF&U6NBA7!t`Lut>faDk>pW>Lz9BSzsqWvnI<+L#wg=zw+aeL6=70S773#Rq zG@fVM9=1ZibB`>L>hKz>rHG}`pX;dZD>I!_x~u>jsx3;0d$`Q%t7d<8^lkl8w0WZ3 z(HGiok6h^#G2EzIH}G*;!U8FW>@|C+wE+z{@e{wwWEkzUEiT0aDJo2JwZR{zcX$Bz ze2pzE&vKCc6@vE*GIv1LZ=qSg~HR)Jf|ljt#^m2hZF4z|32*7{hd|u`C7{C zjG>}`{SC3Dnc~5%D4yBa!V@}xSBtQ$ZWY^qs3)9jTuIXYMgPF5E0*&A0B(=JEntcVgC%ZO4UKHyuzuSblKNHWJ}OzVpeS z?8|{P8FtkJ=~%YMf1h*@o-YsZkLVQU!43cY~nWEmBt#&Ar%7WClZK8 zSe-!M)B8((tj^wSIm3?e5oe&mQs6BAE#Y7K*^boU^Z#aITL%-H zul5Gx*FKM}n~RnE*Ko3}nXrk8nTw0Ok-d?{|KMda<$n9cFHzkfb4wa&Dp0x>XjayP zg-KZ^Ayey*gb`NecHls@$a-2|Z!Xe^@P`uYYo`Q*jKzDQGPFf^GDQ5rd(-X3n)&f|bD>?`-DktKL<0hWK!cPS>L^@|VH6## zG*0#NtGfzpZpt+e{yL@K$|Lg*JfO%I+hp&kR;NxOJ+y2H49xZA7=^RKObPZi6 zL&R70!l_{PTFcxI#h+WsO^Y<`hE*z1vg9n7nG-6n0xBU8F8yDd}=?${Kl$qim3(S98@^W*vvSs{l zU}!oUIXap-i#nT`er(?avm4Q4-snuM&-cwu#-M{K8n;l1gP$ z3sw?`ls1z%eb%&mNBvLuEci8}-Q`|kUw6;F0-pHb?+A)+BLSn7_@my}6u%J=Ub~(* zU1n~wcfO|73IBZF;|Bhy$0FeO^>lmmZz?ZuZC8$p6<>B{Lsp-*mS05IVU00ergKWv z(LIsLS=?(>QLLQQ?bdTpyO?iiEL`;>(XJw^lA*7FCd|$g@c3VRy#tUf-Lfs*_HNs@ zZQC|>+qT`k+qP}nwz1o`ZNC1_y*J{2=fCentcZ%LwW?M`<;L&dcdwa@4GT@LCkltq=Xfy+OasOLT!lXrqy` zEW9YuDcfQtJ$oJ|Ln|b|q*_a|YPgCbBBfQ|5;-1(P3R`sK~3T`TtVV6yrtDbioJKI zPDV1BAaj#O~V^ll>$# zNC?nv_r5RiH^A2t<)qzcvns9Qd$_UU$`jN;KUSNqMCQiCFCi3A$*D#(v=FXCqz$SB zyC8vjHyJhMy$5kCi}FBy0NdSCJa6{q(|*9I^zwX1NHX*dHOIDB8bsI3_{(*-kkQV@ng|lWd*nWx!(xQ1stGMcRDjH=YUQvY2^uCZuO%-0Jw5az*F1nW_|h zR~z5DT4j&Z7527|#z9b}pmRW}p^|OrU(TWox^&Kn>YUn%%JlZJ^16vzy|O|GnZsf3 zSXEMjOhuYZlh*ikE0&zHt5va@6&GI{1&D+NPop@Tss&f!V4;}nqX@iOvdonoDa}J_ zE-u%qrrUpYVYSGU5NeXJr?#B#3dkObD8uk*U|u*zS;T2YgAk;_kdF0s4A6A*YGO4)#dKwYLQi+*i=C3N85d93 zAe#Lng7EX?@}-FPvIdp0y!`J@^1tg|IHwZ=C-i6LW7u!d>#==7<(?=6?caFCo;)AM zwwV6XHIU7}%D3 z75#&7SiVq=f6k4N*gy{?o~K9`+fsId8Co*62ksPHLm=SB>G)@44I(Fbs1stfE==|e z5WM)k7Hs~OwT#*$%<~0|BEb_6HV0F0=kYy;P zdAZbN(@{*9FL}4bSi-&#J^2;N`G{J?KFD@i^8BEXQq3$Q#~shvw_cx5r%ZlgHz2&Y z*cU<9UD1(G6qg=Yx{LRix``xh^Yi7@j|r7hm00t{(0ei78ZQbt`JV={$XlXvX91YH zxbI<;-YQG@9xrY>Ar~yWklR>hQ-X6TUxD-S!;~b9lu;Tu@f59S=euifnkTO2C*G;S z@TJZ5{$VG<^ThBbq_74=9q9r7DxC6VBngr@olJ}~W87-NEagn(;M*)7Oj2!(TG+}U zsLu!TV4B7DH{}gtanAHawLkpH5_$jk$0~;0`rM1Hjkl;4D-KsjXTl<*z|E`_8Nlb6 zroi&vNu(socja8wZ}9J>;D}esqgs4BR?_u7ZyELz2k%GQjtG%Vx+yeS&QI*AK1Q~e z;1-8)WjT?WqB>et(n%42u5UPI+!F^B7Hx#oW{i;??}{9#vpvk}lwvHPB$=-+pnIAL zGBd3sTO%TRGFw?`Nh>DzU#VeO7C?`w!-QT4ZgBE!WsS1clJ&i=m$ zHn^;?BNx^_wESMCsSKfxi542WFvUJUh%GpT-JP-b+D|wh`H$h4?*AT6uKyK)=>%&^oOXr5Al10+ld z9x<66pEk?hlV|$s!otJ~_Kz3DcB~XFzWq<@HMwvNFc2}VQuS$6g{U$+nN4G0`E zua0)-H1D8k;mm6E{(!pNomCz*qxv$pI3NvG>(+Q4AcJvK#K8 zb9SOKS@GC!pN|JW#<}*37GFj>D1wi~_)k#-N5izNy0%(q7hMm?oL_Ju8jMFGA9bKb zv$!gbC9lC0>Unx?+*3GF(6ZZH<(4j|5-Om02Y2z2IG_&xn+2Z`6;N1An(~^lQwwUQ zOiKj)?fuj7EGlb8nv@wDs4us&o=Bt%l*TAhB{h=R+Pddpm83-ms{V0T&ofYt=D7dS=Kr=V{~wzR|1=j_+3Fh+3mcp0J6k#Z&$+yVt*OJ$s$BYK zRx!5u|IH#%N;9@dV#r@$o(;Dy3GBon{2-)SK+R!>`0yL(nq~lFeelQy_)_BZt2i}m z8rSXb0|MpaMQpG<_IaUCD@=+=`KtLmC}H1)-vV;8Y!fw&`K2B6oou$QOj%XL`Ye$dX*5~GV? zjoCc8{4m*B_lFn=K@#mp@(*Vga>;sjA3Ds|(a_aGGbuFi)9-z>)&hY^h=PM>jvvAt z$Q7Zfbr%lPeu2OFHW3uNyavs`ezAXnB`OuCGx+U1e%!gwF?S3T3XLaG+BzOfiLB-f zLsTI!R2nT{#3)Z+EHpqiKXE$CK-~2S!*Tvgi)l{*o7SZiuHQf&N=jK$gt6|+nF)`Gm z!Txq?dNfctW^}=z-436nDud8w974=Iuf~cqED93ykXqf1w8FZK9fiO>iyHhGH6`Xa zy99CYP)x3@)FSqPdVt-Br1$H%x6;EwpuBzZ?#_D^RUI0KPMzf^_Q2rPhK)0jFB8Xm zlV*;2seylEHqM|s4!E5>k-zx$17R0R2*LcwM(ea^%K>Rf92id$mc6SChy+Lhh?+zh zvO6({dx7GOFjsuW1#TIks9C3Y1NS^K;IL#Bmt5WRAnNcc>QhlO{Vj2vmon)s*asQd z33&IEDekAAXHibwHHW4Kjin6FB;UgbL))#+*%fRgjq!Uy)J$xt^A4P* z=wpGU$DPMXW)DL%DW!nu39E+G5tKB@YM$r#?rOf~PwEaIWOZ?-rZteokPGZsqWYS4;B z|0LjjIbp)2Q9#;HApIi0rAAv&MKYgXU3KhsoOYe|YT)zr{({<}EXL67@nFgE$g8n) zlwsHK7H3m?1l)9j7MVEeKIFU&$Urel=||l_I+%2%vpEWGJ4%Ae=4~9emV-GN((dey zu%{X&7)-JZ@$2L0Yqtni7;-H%fWs%8= z=kT2S6oOA<-_q!hTShh=6tYB`my{cf^+Lx>yzS~3hAy^=8Fn4^M9*a;F$7-pPb`5WTTi>BH<(hQt<2d>L}bEO@qeR~R5CV6M#}U~hOs$t?sI z7o&N-naKA!$TJ z>&^XTo(>zGjv|b*XTI$ut5?7&&KtRH*Xif1`>gBEp7*Joo(B{{&6%EYr?;2euFLC6 zyxINGDCvA&Z9Ke6+p?I9Q!BMcUI`b0h}(?yqWH@VsM zQOR!?^5j*fLK3_B=$34i3+r{u7IgD)M~W2q7y3L-307k;BupXtBuqlRxD3=-rhwa9 z?bS^@iS*Hnd^;p2cOp}nC~VDSN?;3$3z!yI^$)`1W?UAhtCjjqn>M&ph0;8EaiL{z zu|C4KQm1Ko&6~iXk*x&^ph_a+*qDsevtmcT;T0k>1Tvc@2_|YU#phijBjGm~(FAS> zlUlF>J!lV+cX^mbgNt|q+%c)}o#I2L8tL)BII4PpHABevx1oqq4Fk=enLf)lPJppehzt;iO9UQ2qK{ycJZ}25$Em8#QCj@IGeY)Ih;t1C_j5#Indn9> z?q%Mr*&t<`FGYDnXUw!Q9F(&(vc=j2NyA|}`{O%(aBk4&ic|F*CyG^zcJTh7Jbkku znj-MdZ0aPz3?=kXncCW=-<;dP;J9T1y-C;{aJj^)J(P2N6H-0wO?ZvS=U!GHKVCK< z=aWv?u%5>H&8MwXa49`eLmGW<%;nt}*#2=)K*`axE(dLvH|fGa6F34#8tRY?cr_y0 ze3Ys0rp;JgADiP65s|!r+v;Bhhv}`Vm{n>M24Hc%zOJ&UhG2A;(vSJbsM4>fU{u2_ z-6VIhEcV`qxROML_k8tmxBr)-{ z0Nki4Ka!>@`U^UZ)eJ*+dVEKh%hU52puWKbEG44AD>zWsBPQobQCa)OTlz41wS`U5 zA(_e!#MIkQ_D?<^L@2G~TpSiQGc{2i*D?M}9=ed6<%52)rPN_&_Zz}kJyQ*xrss+n z+*}R)Uzw_8MN}8>Nin$jkrHrz;R3n*HT*JD&M9fIRS?wRHq#A#i(f4q5+z;_5Ij)k z55fi>(u^$A=GCiS!o_k6hWVWf;@9>(C^LB-^lw%JYn+7v`}UC04jw=#dbI?>PxGb< z^hYM;a|^$Xv8HwRyEFBlC0EGDeVFD zsI=F15ChE=aHP6tL~Ao9#WHh`H@ZcicgWiJi5Wg12JkaFg6%fLuw^#2^+FGSBYJC) zcLQaBfXhJJeIf<*h>U>kVP9*cRCfKc<$@qO~wd*)<>-)SK6P zJ@I^4#us1Hf$yt#&=?VaIkhDY^^W;!&OFd#L5S3wEK(42b#OVRSI3Yn=DLC>djb3m zOx*FMX7ymI4;B56>=L7Cv?Opmx_j#kUAIX{b-S2c8Z$v=gOMvo?-ij^Qg7+-IsiMdRFM)v7G{O9O zb{zD!lmDA*H)}70ZFQ4xTkLM$F*jknM@CK!9fA;1rEyA1T;kT|rRhl7MQ@3Z8K3<$ zthbXo^c6w1sy3usEhrD|+wtJ{DqW>!SzzMAYG&n5P_48!FI7^!mt^UsJ=Ii%VFz|f zC`{_0n8zVxPB%8P&U9wpG3=awF3lq(pY)ZY+X0iPX>u?nXvOVKqHlZ!kPr!p?==9sB_~DS`Wz) z-C{l?ZU7>v`xhem*b=STWhZXwe7a@WUN>CeYu(sj2^yMe+X__p(O0XKfx z%AXEQxVFsfTzy)ozm#eCQhr*;4iF$jVCn@40VgXeH%1E z29UQ3y$aVZ3TOp-E~*g`Gz^slv`Lf|RO$MFBa@P)tKRuI=cc?XxIqzmXgmw~OWv_3 z79M~sk*g{jtNxD4ShkFGO@d3`N{)-(L`+B$P3o{T)|L%BE`c71nj=koezdtBY4~a%t^5r3-m!3Kj%V`9dB?v%w?BxOI$&~!jUNWa z@o8Q~I6n%f3*aDLLYK<|4FU2X@*``7jnlDRq5+VebLwb4vJVL_1XDYFTUc;$dW3relP0}p?81NZ&{!uRJU{&9)O%uEL4Mkts~ z&T=;)Kjl_c^Tc3YX*8y9Lb`*cpyU^wFHkn{Z--k1SA~|n0bO2_YwyEVv91paW(>>D z5A?fn$`0!!94mEWTUFmE5+yocu&wZDj;aE3+jOFJ95*T%`pKWaqKNiaixt!T^#`@p zHlA$6Fj^5&7!Hb19 zHyE9zQWe<12XmH)8IDIOtwPeM zHRd&LKn-qMRQRtyy5LYzR9#*8JDBD2K-E^^INa=#S{XA+rW5XKtg>7Nn^Of&Vhir! z+P>KycTUF|e~Hw_vAX%ap<+u9o9)jcAVaw~|4zkmS zZa8>nl~i|D8zjQ^%<{;ZR6cbVD>%?nlBzUD&(9h}VOpBkVW!AuVW!MGuz;OfTWE_| z{yi!0mE#74$DH%4$iv357s-5PS(g3aXJUS?=I-+Jz4Y{Czu2{VMepL1!wV0l8b0k) zSH~&|HJ~YYm{WKY&gKO*WNzB=l|JE3C?T`VIh$Fi$wHFx68QWYRy%ziF%z4Zc<{>B zjkGSyv*i{+F*O@tKQ!EDM%7xw!z{Yx)~Woo$kr{Z7+t7ve;X$MoE{R-LVe22TZY;% zOIFYRqSw}4;Mcno^z?O*G8Q`&wbgNV%>E*DX{fnqK*lP#K0dvcU3endLW%GugLOH< z>Y{oG#ECe$UPvO#$t@?@GA5JFE*6oY@?+$jRxnx(BiZ8q{AuRkwymR+;{*D6-bh*) z-5@PC8lo`?K**Ec9*n$U>OJRjK0H$J@vnMoQZa4ti zMegzJ2oft=1Y+aEG$4JE9{t_I{tH*SwKVixk$IyL|hvQq*qu&_4C6X zp>36)v+qAXl|OfXL8koN-RrhNjjA36)N;pjmTkOO>jg}c>35j<2gH)fb7QYv#8VV2-AXJ1-O{Vpi$uIz3lMp3dl`?Wwpp>|6_$}|ROmbQ- z+O3VID2pdMNR%dc(_#%+-P-%bNIb5Irk&d>rOY(_mq8%P;dkWuH0mR4vhl=r?rV5g z%=n2Yz2%@f5#I6!(KxF>D%1-3IyJU|VW-!(l$}cWBQtobb>#9D+>HlD>@kp+qgiCj zU_Y+2nP+9m^gw~vIRygs?R~aXBZ*Vk8cFZj_&b8(pTaY{Y}cTT z*fRuKeL3=89rk16#2TNQ%KL}Ryx)%5M0MHy=A(uL9M*f_;^wBL-FO~J+@|(7I)GQF zGxu8y$fzRDE)xoI0MCR3S^FKd3Mzir$&35HZu)9V$~5*Kk^r{%vt!7ISD#%fswRS1 z7x8ugQ&u(usOPXbN5Z5URhEFc|NLc;g}f4JzVjlUxu&$T#yH-Omy4s=$~b=B<)v}= z;R7RHY}oe#TExRVjM2_)jF*Q3%G{)3ZZqgSTa^}wnjk_InITrx)tW> zN_A5pLZ9CogVv`5^1_9Jm_n4I&Od-1kC6YSPp-Oxyt0!D zIplg&zC_?4NKvoQui_?BUY3EYOP5n0W0#hYf21a%4Fg1xeEs;w-CE2d_X6pd9A`2e zuiIRY)}Lqe0J(eXdpq{`UG}5w@h=I2qwDlnybY&n3-F)3(mWK*z~Y1=sqQ352UCF4 zQlI=T^y5Lp>gG~>1T94`()}Z4=w<|*zIWTL=+#(!PT$k6nPOoI-RVk#s?iWB=$tTc z;v`#9_oLoCy7W1j8Mn^hfr?}kDKcERb3jxH4>hafqve(?N%m6{o48;*Aj`VQb5)Ul zHK-31_Fm*+OH8EXSzh8{$7fljqN=ahTv<75(Rp-SR$Zz#EMGFOcXfT5%J^HHx8x@r zP2)nIWHes~>%OVy%4>O3(0{X?N*ukyQv5>kKb>M|32-D&p%1(V8j7s?3w|Lp63nOV z937ts^a~AioVI92W$?353}~XMK~{A}5JkKH5b=n9Ciq@IDBAB;Z!IUAV+ciiDvH*j zMD^3Dk+a${QM5$azio{#f^OHOx>LnJ+5kbRm4^N`5ii4(4>XD|b?3s1jrWv1Z}MFy zT9v+!?Ds9SiLUpcRnr?JG+C=^SKkC=BwXt~F8Tyir)=)czcAl$Z)2R5pR!H;e=OVl z8*}D=$~ONscK(|=^G~^sSitaqkw<2U?vov$hY7)fa=I8~62|7IuK10w(qZq9BnSjK zt$S9yI^QU{77(-&cteiu27n8-8*tNC&-dMPS#upD2hi$Q=J$O0#Os?xwTN{WtSzZC zp0+5nsTrDO-C3RykP7Y)6z8U{uiQ@973Pg|STBrbPO4R4VU>jA3ZJD%OK)mD`u%Bq zjUA|-$B9L(11X}nY*naJ%@8ESe`WsFWU8vR= z2;2}9@)$?_zbc_riw26%Kg!e8Kd<=z-OEDxpIr0*^LqcyFQ+uzy_6rD_)MF*+Au)L zK+sV!gc8RX!}1A93BeHY86igj>{s@tCS@2Inb@Wg|3Ir$G(TxPHZ`*>y-_zsskEEv zlcqu`YL%;Yn6XuOyEIg6vQ;HLymz>grb&Gw(*q#A5?6USh=@|D2=%(`I*cmsk7f^9^}}P? z?OW5EW$5ivagZURMyiQ!)dSTd0?Cq6Pu{r&OKRfiuu+&nj(M|bhppFk4ze_}sSz1;);PvKNiaE=q^G|5w^Vy2SN zBs0Xts91C^d0dq<=JmXesd8D;1K5UvF9?WTYl6d%lJqXxN`Pj}5LxPgSRE$%)Se9Nn;^;MLmXCiH$)23AiNRlj3 zB5S`@U11=y{xj(rqgS3zSUD^dhUILAwb|IZt>UN#gv=Rm63ig{MK*6HQPQQC{?1ODO*flB7}Q(AO3hFI}(g&O+0tS_v* zssss=fjAF6c7M%h{bJFcbm>-<=R>Xa4X{qGb3|a97zk+R8pO+p(k2^QM<;%(sz0y~ zRB?%#!Lct8vXEtAzqvF2#xo$NsieLB9TCSs^E_?X{@2BD7<@uv#vvJzQhJD^v3!dT zl|$vIA|g+p5nMz|Au5{UAyp|$2kfI)S~hhN0%yOnr(#(o-&bKg$Y+VeF{*sx3Du~N znZWwrE{QHx{GA?2J*uLTQ+AKA)Nbt+N2AXvftlF`pev3SOJ$4`MSDf=HiGkA5i0UO zd~$T7PLbVXMt2^U57wmD5}@X1U>&QO#B&jZ0J18_+exP+Z@5Me9xd0Jbq&L^e7(>X zNNZ(5fx4(0i?cEE=!j+2!b@EfJXIo&j};GwfS*019h#N=Yt|*|0J4`!D5 zN_q7;3^d-)FNmK&7&H^rwGK+yh}q{Hpt?|PFC?Fm#mlG5xknmlrQ>IgB05c3KF~=a zh6K*nAvP~CiOXlXY$wlxYQ8_)WN;>NeiQS5Mb-&Nuox?GER-8$-`li(QhmzUy}Keq zW@+_RPM`C|bx|r{2{VLpv4kQKehI>QOprT%3zknCxVb_F`5u!3W#trOn>06Z6D*XH z=M)M2!jWK4RGLfuttE%E2P@F6hVZljI&jmjn43^ zPJ~{D)br75_H1XB8(ej-Emk3-$#Qk8x9>hEB<9vjxJQ=EG&)&*v=3TD&pvVnxeR-) z?Lb+YlOky39f%jYERz8;%h7@zQH?O%8>!r^nUZ(>IPqq+lbCHA8Ax24#IZ@dwzGe_ zNr{+ocSoD-L2*Xdg%@t^OiJbgq#@1W&4(>T_SLJKpM5HrJSQaRRfbG&uyI9+T~>My zyWR{C12~~%bhg$$vJk%xRx<*^v~v)B^3%hV33i~-tUvA5Sfb|5i=rmc9n>)2!GqKa z^P&<_F>DtK$|77CJ5xuKX-Q%!OtxP3n%EsDQrn82M%6F*?l55XtzSVcMPQG0ZuQjl zmq*Ic&aackwk$S6PqbQ!TT;VJDSX~x&h0RoXfrD8&a{@qUZfVn6$ilU9V(GVzCpk^ zP$Zf;Ui%dnVGK2;ueF6kZ zFhW{mY7j^Tftei%owFtP`AO&4M?tOT( z;Htw$hS6rDA9#f<0l{2DA~U)NOfScqg!^m^q#5Caibizsnh)JfGIIAiSiC=S%J|_X-AWeS|ich7A5v3!>zaS0qG@+}6 zF+61ADkXR}zFbZ1mX?PdOp=@C9DI^|;2Tz^0qedK3>_4z?WYMY85qL(rt=Zq14q`G zmX)L~hGa0K_F1zeK5O`YjYkt&x-#C=rX%}-v%xC}Z95zssU#Mk{YR8Je z@U4Wha=tl!xo6aPg=VsfWT-Uw*s!bATd!Jrcam6JES#?b>09?3j3HtW9zjdZo{@vm z;Qsw!K~TU*LK!uvRJbS;OkNH2Wt%Y^x3I4&v!zodO!!r6#`%hm7yl~tBXG|sE%(t= zztYj^vC$ivB^+7S$l7s@do8-L_omu&g;hi4Q7^#p%DB);DAqKLC_yf{M--fbVCW4Q zpLSAJpyR=Jw|FpZ7!OY9&`o&H;FE5C-006%H7z?V^+c?EUl19l4m+%pxM%W-d$e~- zt(|&Ex@CFK^ihfbnmM|@OUuO+x=YOaa6Up`MZSv=z+ zj&v;Xfs>|(JoZyyf*n#2H&qEvkEBqz1th01TIY?cy1siJEZd%upf04|88q_e^UcqIJI$qO^tX{0Q=;ytn*d0;d>W zpbMg2hvsXQ_P18QOkwPq?4dM+V|(uRBPZ<<$bpw08v0vS$9$VUpbm=Fv(IMqMe~ij zM>0rOq>iZMoC}d%y?jB;97(AMLyv&6Zzi(5LIvB?<#Ywf0)mZ_~Rdangdl z&@8jcCHuwoEo63_;{rqY2HFx=n@YZylX9a} zl&P9Yv{)Lgc|b3Q1o2l|SANshLidoYfmF5?I`bsF`E$9kGP};}K?$qva#L^~CH` z!TFGfb4WF(Bq_ENC#V_OREgx>tR!Qa(Jg2?b%7g;M5AE-&>&(JHfZkcmN2s4eJeN!nCrcl9Way`gTk=o|nGo|BD1pGHLvB0ih$H-WM^@K##RBrgEQ`4$CSNzg z8QjInTy|bpvXE2PqeM9*$mGvZ!Ps7Fn?$@*V_0OIlsGq$7xq#m0A&oC)8WX5OB{I{& z&m4D92ULj=J&5P>4A>lRn(KPS@|aiq-&TfHnOC`uYpkgbZ!za!sgrKX&HmC&DR$Qw znLUwmqe#(ab!;OBsne)NG--Cm>qV#<+25uf(vCyt?AGIMoJse#4t}n3bFn42(girok)X zsLlF0m3f3uPV@^VjN3J zs7vW$dREOUH=t;vnxK-_6qp*ejG&zM*m*>v9wu&xniWe@+eJ-67VZtoVET-b0X5{6 zr(c*Y=7z@KB`=B#zMR8)M_(&sn@t?LtNkyD`lrk0nJapT+`Ued`PVEyOY{v7f2Alh zxP{mY>C3kmqt~@Sx9=weAH3PUD&9e;-4Z?DM%u2JrA~7?nOo3Fg!@?ilHRb~Q9Vh0 zS~k)vttP$Xy9A>{?$-j{oKIM^!~^qOk9nFfO9U;uX<{Z}MGPU&T0}pPw4d7EHF*^c z(1Qo888T#p5hW(|Q-(yg#r6vVzhg0gpd>56bb9oH0wu}%3M)p2fxFLEy>QG4R_-h8 zU+Al?!eBv?3%sHzLA?4>j0E@%7$S|RYf_S$ylY+ z4n%*ot_mG#p83HvVERPUjJRH!Ay-9T%yQe2biJr+b%|?XeE(`??bZyWEqp{h5`F<$ z|26&q>X&o$0crC>TI-zNN~}*w7-kFnefLs z2fQs{{%-wM-9ryBgJ*Iuv&{5yuKy+Eoc^si>??Jju|gyAn_Uf`ajXB1%g`EBtwiQ1 zx^awk%lc*V?-yf2mx&<2oHk?3d{TaxpMu&Sc>d+t2h>+*DNg;iw%P+Pbq56MHt1{8 zuC!j;1YlpBL2hXi-rks7|L=db0Mz7?nWiEF08stMZRP$Sn6!kAqm#as74d%`|J5u1 zZ`hY{-1iNNl z1=2bj@r1^~3~TeQTAAId%fY2ha|!FRU6VMpiAkkk@VViqVwhBxz8SBI0v70InyyD6 z3Bn|Jj3nVomoatTh{xa7jx;yvi_UnW_#l*M<|9E)rOc4j#iVycL>cKHTtp3#k-nKL z+7?|mS#aSINetxl?nE8)%Zyk>!C1k`<{`huyPwZD2`YbK4!99|Okznl56^r1}88nU&cpyn*~f zRP2FGaX0@#FpvKuii!WfqnQ6~#DBA2l_uoxjK6W&?wmdns)%IKg2?m;9KE4d3H+J4 z{P-@21_oU4WQ76zv4`7rf2c8VBqkLlTWX8sn;VP7*r9$|Zvr<123Vyh&st-dNnOt) zxtL4AjW-w3bde9fPrdt&)f0toUJ2&UdD?Duy5Ap7dEF=0V82i93p+Kxkri{*^!QAa z`)V#?MO?Egc}EaN?0rV`N9>*U}noU~6E-WouZiR;Mgh z;i}OVBurvrDpRj7!i%ICbMj)VT&(w5JB7dEWs8$MSfbZaa1D^jw$rlh41JSI!*+g5 zc`HjldKt~dEdKiq-t`OW#SHiFi#h4kU3|pR`S;CF5SvpIp|Cl8#>|qEO zL6o_yj`uN0$wSqXQfj)_qWIKrnS3$j-u8y`GrF8k5xy*m3E_xC>4xG+3@28lsi2dl zG->G?bNPxG)$u+RlKOK*4722EnDvKFTfCP}MVn#i1AP7T_HVVXeMTs4JO zpT_!OPG@)cEQ+es9a7Q~8ZJxuwg`RN6PqI_ZGrR{=g#vc28nWQy+I8dcb5dFR^-u; z&&P%sTVJJ;F`R;9s*$hDbF31St>mkHWdp=P*}5fF!x?lQhPw$TMi}e=#xDm^PWJok zBklIX+F!cN8)z!@No~Er@9ywmEwj?-&7I}xh?Aw0SPtK(3EQ+5LHqwwu+}k1p;#vH zrvh`dw3QgL-4@kIQ!Av--?{@#~s8|+dQ;(;Mo#ndpY6spn{3TJBv8{Ee0%vgX2)N zCCV1=Y(p9TH+hpYR^mG9QF6nF>tHb9wDPpXRlL7F+QvVV*IK(W=+D|wiR-*I;elS7 zY`O=x^{a5b-2CDtug6c%+y!Jb>;Y$1|5k+KbP-$ndnLz+PK~0IJ6_kenCmP!NG!nT z0oX@l4sD#DBU$@kjnc{sh4baeOf!mqY{x0?+@X-P%tFTkGt+fK8Xnl}SW!g#bX7&^ z+2;eo?q}&im*rirs}E*eubvzp8ZZ##(eDL0O^$sfaX!0;rmj^d#vG<0v5$vbadqkM z;c@S>jXq)Rz%lvuo_XtEk0U!0-X%0LG%_Oo&y;sC!y!Vzbv!1e%gjo7+E(!P5CXQg zglw~&%zv|GAITU4^EUXYL*ba5L|+fG{n2f#<$P`;XXQzw!rFG>1xIQtjYXPCx$0Tg z_y1H9*k8*NMu;cG(T9I5k|_z+!6-KvLctWLG?awCF`Wto6>5{_B*kX_J!#TlRfW|Q zTxT2;H#0}=YR;55U1N;$dTp5H%;k}GCmbbyfA00QK5!SnK;wWT_=y7G3YX(F_2ej zekKG-;-FFYlnsInfBS-ue-l(=JyzlnCV;dv+bFa!pd>$1xZyr37BgGGzr|0+^O~0j z15^}t&e-E6dU|#)QNVmuka5beLq1^$=n5hx6Mg@fLV!rjf(f07zjUyE!{MRr^$O81 z9c&-SdtEZ{pn(T}h6ZnUS7wPMBn?d!5HMe!BHRBbb05=@24O?2h_`+1 zSkky=Y6p<;hK&MFs_UV3Pi4-ZFlQ5qOdAaJ4>=1O04Q<~*!bCF?FPS~o{er4?b z@BAktYAQF=_~SF#TF%vAsN~HdgBetV+7Sn}tl<@KS7SOg0f&fC(;da%oL1YWSL+*m zGM#5P_te#*^#`lcd2E#Bzrd<*Ozyihcs6GM{UIN@;iOnS-MRs~qr?3IfIIow<-ibm z1axfeXk3WdOtrvL9~RrkL@RPE27Wm{vO5xg=Y{Si6xRMyB}nHWVL(7VUs(tiyCf+=eFX z^v*e{k1Tj6MkZdZ0LiaYY^zFpCUo+Dxx=bBlNeU*IS#VeeOAzI)Vt^$zh$j^EZMHM z**h+Kz~xZ6N@mz-#ETTbxO`K|Nr-N;@=2jQ#7ZgkFx(W;GWygjB|Jx@jU+qS`t!IrL_@Mh#X_TZx%@ z^4p_*L+-*ol_Bw(5gpCY^}j0qLkVl4eKqJivQEuSwK~_wQU=a?(Pr}B&EB% zySux)K|s1&x?55}O1is2>5>k~O$h(?yyyFj*W>Z~9|mI&_Fz2Mnsd!nbFSyU4NmP* zk_r34gxePNOJ$h6cykvyCw$qW0>}3|r&9U*AFcQWu@^Z90;YM#zVCO^+rx zNH@pXoqevqr|SqP@$wvXr8J@&d_JP>=uXmMSW8G@sN0shx}NXhJ^U;k3^P3*Y9*{X zT_){Q>`WUL%w79gi?=u4Dq=QB^rnC>Qexc!1mCKET58qi_4>ylhJterN@VVP&{9R} zf`VGjgzL=<92XlYXsi4V{!C1%tpasaKFas6LJV)K-=vfm;P_v(pq!FX4Y?&YsVKhO zR%%faHzRDbQ!M3E;64T2WnRzcuczPxKYjJ4E?oK+r6|}!&xa}zY4)CB2A?|sZ9Z0a z|7}5bo3I!eu5axh5J}j*49lzaa_Zc8rw3g>pdb(cSDK@($H8DyJ~4-_*`cwZ$s? ze5h6-?o%Yb`5-tXa|0?FF6Y2tk6?PhbB~VSfa6cTW01)6;9^4dE+jka44m<(+qOx| zS7+%A4{cV1vYAlL_6DE@7TAVxXLfPEJy)0APHnPc=nL6sYxCkc(#=FY#J=VU)@bgA z0_~_L;7&Dz1PtGWxfn&<4}Ma94p>_udw=f*7k4kv58VQ0lC!J^kehlmGtWV4Mi6UiYHz1L*lE`k@;g5_yK$-= zZtu<-NFGqxlm4JpB#T7g%Ex-iNmQO!&y7g$cHfwbO|=&7md}4l4Mn9|n24rEQ^>Ux zYO+gTedMAD(2~_1Q6k*FOpy38A*yn7gLcbXj?+s+U;2tl$BG4xn$@hHmfNzSfuA*V zDR8OI{FbT?yi6r34Q}@hSTAGKo2ggB19-#DmV2x|Zadz2|rHCQV8f=qYq3S-XQKr)V!L{fbjC(JB{i1oZ ziF#JsGKmxT>@0|5a3}*}b2#dWUIr!i`8n>4;r7E*)&qvB!SvEbZkC%_T$i>HF_iTK znSw(apn9nYdcK)KaXd!E__$?es}T}>(H*ztldjGo3~FxJOQHIwDEbA;V7L2u0y+iR zI z`Ta|+1SVzj1fro-ACvhOxw!`lkeVnt+5zUv+2Q>l6W3DEHS!?GkLeUc=jF=*DYi;4 zgAmXvqwtL98S&@oBP*(OL2;6Q!{jJ!x!SIzc(UKP=n25KVnzea3MJKb=3u8Cm>iLlc zo>?@$-95+WQf~)EAZt_5R=Kx&-+eesXf5(h%iWVsgV-k<5sR4Bt?SzA!_Si!Vs17{ z{6tvfF)5Sptk|88Zta~Yi^wNgFB3D>72<4rA$j}O^elvaJgTjo4ShF~YmiNpHeGbr zyKXGp)-!&Ibd!z^zbI+4QbF?)fGbwcwDyLFza9Z}=ghoEC1>_-5DRf*_-4`0`D_3% z-j$9^NUELnMfu|?&hgFGHu3n@;Oi!chfyGFC1tj zysM2L<;pVB&eZILeivP-DG6^E!_0P@Pv$*0)yMcNP8S ztipdgy#t~iDVyOeruzZb?;xzt0NZ53utk9^3ZvN}(iFQco`XI5+!2~Bt*g7s$UI9V zqTk}E=N|5KTZK~u!6+3ngR++0rc2UcL~b2^1ySOpH^5EkBa;19dk^IoLT_D(^eYV? zh)u!~KjQmm97L8GO!T6q$6zM-+4)P@I(QCal||#8B$YWzh+EnD6~{;lGD;KM(2Z~x zbfm^>#(c>3<`9QS(Mb$0_NoT37Om8`p*ft5u4+)-eY&scXqIdG8ph(=r%k3w~PVLOXd zvY%SJgzTUS)}20bSmIE#Ku2ArE#^+hFkz~5s)Jq}y~;DcyBxahE*PlD`+}A(u^rn<&8zczVDn%^A5dk-Vy_mr0qL*uM z+kH(G>dhnCDc>o`r?(AIs+^*rfe)ECTkV3CYD3Q#19fXQhe<>BD4P`WFJ{4fglrGp zMC#o(hLNzR_6BG%EOWFS0kBYlhLR^aX`ly0}L;y&ATq9Kgir+g(JSTR7eC^Kd70rtk@Qwh@u3M8?jc zvgkQ+ER2q@6iY?Es?2yUOPXy52HHmmw09OlCy8i1JSX$cFQ?Kz?WxLaD*;xXXdOZ= zBkjariS2=U=4{ztOD4WdLby%7@-N=%81G7r_onmAC}*~wh&dH`ElcXAaT1YCg!*3c zydPyIQxoLY1}B)t!AYV-sVm|=v@yqXQI~?W4Le?d1`+uZEGOQ|ee*VGf zrT|&74wW?}lFB{`V02N9RseY6=RHwR+vczuOFPU6KW$IutXl`cwNkIGa12qG zrJ%bP3TNk7J?}yS3x6XEWxoN1EKl;n-Jr)OR82@8A-lLcqJ0m!DhivFnJu)P!CIZozRj3Dupfu>UuxP6njtRWN0x(t)#GPjJ(W*QX;@KZebajIc;dm zCW~hL0jRsrD=aVq-P|3Oy{?-lW2lzd!ihrjVFr)oLbOS5oQOiE*S-!;?Lbx&bB@wB zIBCNkoH#5Y8I#5PlHx>EpLUEIfBnTV;pU3R%nfkZ z!YFhE-!>M@7lKEDX})s?nHWmd;*DDNM6GEm7PaY{ePtQ7vU*E6^Yo7t_xmKXg?pIw zLetbL($kGYR?TwDFJ{6?y@??DP->A;k*WI-u5h`r_Fj=a1?c8CaYv_fx+w3Y&sz)# z5l!Eerg8T>?FtY$ym)%@xf}a@V)bx@rCghzp-=;#(K|s@NOO*IZA)NzB23n8Oyp`N z6Y_)!pjq5GpOl;|9mspLVAjuk4Swf>dB>Z+oWGfksTiJHt6LL8{)`TN&}5mlo&S@f zn?k$j;4E88b8ms}U06xznINvR%znonws$*X0nXu~KR;D&0=; zq1MxLBj~1VFmZ3_rpJ&0B|edG0LL4z$TA%JtOE-~IHfCXompV+wy z8-&6rt-RaR;6BG2HZ5IoYkQ!W1K80!*5H1C5|T&@US7!VmLWU9nG%2IR0sf%g(q;p zir%R2#OCiM-FRbfu?u|_l)-Q7I{}F_K#B)nXF9wXSLm-9xO`&}clEL58GaMK6`1Uo zQKob~3zs=o{h-kD;27bhfCkdw{8=X?mD$rB(iIfJLV2z}Inma$btemM>{3VY_dH`c zRmH*W_;0{4Bi*0y!=kq3gCg}!KzsqQv(?<&2%Y|52_E_JZZE7axCF6;pWKz-h9;(1 zFEg|lBDp{TkLtU9pc8X{8!)$h;lT}wYiX`cFvH{sCC$IJ1nrkGsX1R-c54t zLc9jBHVaK(PZqQAK)*w|rQxaCi@4yDsR;BKp_0+QMY4^V@oQdty=y?g5jigp7$EqZ zjDUR~x@7qfAlguTFi<0JZx{E(?05$3ZrE!(`+7JwC(6-O)0zPfL-;9#k~GMZLtGy?nM#)>2+T`kNj ze-Cd%!Vd{3rx0cOIo+1L-plN7F!@)*0?vWum?{xsvwILKF<=UycOWzqNrt^1DAHo{ z&>l4+Ab^}}aY{#leq4;cq6#<-V$Ho7UKVZ81@Wh+CFOY)SxBEZUOMd5^n&4mJBI5y zhiL&%RP$EK=dU%dsx>v_%dKWSAnH{~OU>To6_twC8@+RTFwOV zjN#5sZh{G`WWFrn$+vV8xa_EdxGegTh$iG5fdf8|IkR2eF_u{^F!2%tv7EYty{ytY zfTzxF4)ngPoP_WTG|Fer08u&Q$%>o}_7yWw_VUke{^I-nDIPLL`#{~ep5)0hW*8ez z$=vvIc7ys0bTt^Z4cC$pSAr8jP+)*}S0n5;J4~41b{%cIM*fv_$1_a{7~CzEGF*%a zmo!~DyV(mH=a!>N6aTXY|l>8fd_G+w#(nF|q5jcLBA z13?#dl>PPCA}RNzqD6oVO(@OKym{I-Pa5JmLRwqW$FBiUBnL+P2)@~J(ec|s_sm!R2@$OKicGYN*2GqU(J&T z{Lqn)*=vxuAX1Gv0Dk!C`pCTtlDrGq_gKcHI?^jian>rS^UL?G0{-ilaNK#DTyw56 z{Mo5FbQ?Hew~5Kllovle5o!-n7?EA%~9 z%jQnBip8H@%a9KGo;gZW59-6s%P>_Y62@fk&z9tt_3vec<8wZNl}y-DPVJOG|Iin_ z626Fx(_8z21@R?Y6h3=m$wyZ(m0~u^gGm$C_>_E9bIWd}w}}Fi6`vO0&SEgSdVWB! z70oGSTwI5)%Dq)n3w0Upp_=|g;_;3OZw=}>WJUsdX*M=A4EsAwYD>0ZPrKc^Y`%(P zR4QJgyJNu4aNup&3279U6_ zdbsfLmw#jb+-(ai0SJf=$M4ESh--^XS307Zgwt`pJ8{}aNm%u@LRcdGx zw~H)F7#NIpX{7#kW5V(1H5 zz5AdL#5;!Xs~elu2h{fX{pR6_V=3+&^ruJ{iTx$`s^O_)RYD@?{ol+}(o43PDCFcy z>6@z&ig(9lnQ&Je#^YG*qG0nV5izc-nDi1Oya!vptC5L&xq!LbWas62!Jk9@Hgg$u zcf|NzytpAfC_?Eo)ZG&ywyD+)KyrtAk@F|5=o#Mda4t2W8yW1la)U@5zE9jn2t8L( zX81%5B2%>F4iIQQ*!=|^;t?PSN?@8gFwrSJ@S3$#y8xt&xUbuD-u=7}9#eLWR72-qTT@xu+BTcA6}iClYMq3D|3PS&w~_olnHK zbbUG}X3XIIUV2VpcbYSqR^lWK`E;G4pb|N_JYdhO-P9g;3Pq zx#XGZHE!5Xc?m~}&3$AbIXJZLI=xQV><&VT5CXbQ&*Kz10ue(bo$2A61QOcN*>`p;EOKRNXLPtn*{8w3F-Cleb(>;Dq;Q;C(4 zd?J7xq=(1C&}V+H(IjuWE!QWIPhSF^7YZk!fUfOIo+QzqwU^5k7P>3Y8U%-;?GA!O zHYcntF5ohIP^By2K2uO|W-gA~czK@O*61M(U{K*rXX`j+=FR!L5*bC z8%ZNoC}V;XL!Kpb>sP)JkSj_sf;rwMx2$<+g%bK77T7~8tSw-VD@GV=JA)2g5Hs@& zN(X^2sMAj;J;5fpbBvQ$s%Wr@mKo`t|+60qbQv%_fRc(1N8*2fDS zc~Y)?i3pyo`Y`?2GK=TmHMB1Sk?@)-KhzR}Oj=qWo(Ut-uUx}_lC%xNatZzBfmEBJ zSB2ILfPtS-VxP5RivoeD?|F1}MKFC}S2DXwe+>&i*)@^(pNc<0Ylm@t;ENoizkQkG z#jnpbKyf#qNVcsT*VPwT{GWW9AfDFmg(z^eN2;&JR3~wRYIg?8~`b z6w+Q}ETeZ#j>1Z?z5425VK$AnXI=J;)o?YW1AC@*n=7rc0xy8rmLo~Jcb!bgn3ceG zv1@S2g~rpP*}ia;hD~CRV%Kn2XA_Ux$o_4-22CZ*sM5r!eGy6Peeyw==5WHgAUBr! zfvRYibkq^Pj~pB0`BIi)Xx#xu3H)+%OM`sS+HY@3+2tFUh{#~*CgyA#2A6>lqfn z6S5O{6{Wk3D3`MS+HG^VfwulGBaN;h`#huNIg<4%zjQE;0edb^GBt_26eM9Eg~2<= z%x&8wNd;sz2J(b`T`Vn+b%GZu!pg_&@u44I_b|jc_M^Ast*GX% z~cER`C{E`DzN*%y4r>@ti4A$Le2~6EEK|BE&%nFopIQQ zN!-D9pX<=ija}?3M}Wur)SnR4!Q^=N{TZI>K-5OX+PuZ@ecEdP)O|3 z;Z49IgbEtgSJg(*(Aa^$Aoi=5ZV6^_E4HzP)mn?bbRzqSk-Q@}P! zU^@l7uS{R0FQ1#*uh%#!jP+VDBI7|deK+xz-o;cMwsFQa_N6oU`m|HL^uTLD=QXI? zqFiDND9*>fT!W9Zuh{5;R})jH-(6Au;dQ~kD`bIM)20??E{+DjC_(m7K9a=~L+3%m zmtNX7LSUw(wb78YdD4gQYKDwb0w6BK=Xyc%RRPAvWSvJs>w0h2R385!%w)PxhWr&M01bMie zx>a1ez2u_4;Q$qR#^a%(z`bD;W}PcbW;gZp$;XJ(jj16;20aY3xp5(V_)^EWM`}Gr zK#ADYB0DVWY&9JP_oH)FDL~K(Y0HNT%jo5+7MAC6`q*B*BqP)IfOA zSs1}p4ht#5?g87B?XYTl`HxLvWh($kg4e|Fz2Zvohr;hXR?n)(=s&V%ugp%$J_YTVFooJk<#&j9b704}aM+b!QM* zY2B{6NUDF@2GpzM?B-{6Ghg#rk|qw*Qr=FO%CA^HN`cxwni?*?^I8;o%^2I|#b!@H z!~kFZVrVLm*xR}zG$0!nJB)j{!+gufR3EieNl0$mvb9e%%PXc-huMH^XTw*p?1 zYyBDhW(uaF%N2hMyCTWakzvUi@hY_+R8p{u`b*vcrP^U z_*g|+yWK|d2olI`sQ^ThBwo*25*7;P@yH3tB(f9HU$-isz0RnuWHIEzUyNIb?n@Re zv$Du(b|ul3b3Fq0U>?6%DxBrqHZ@M!(Q9Sr<$XXSD&RZR=lmi8#WaVOpR03FJ!gJX7}xq)vi!L65L~h`COI7w7PQN!xMG^TmKZsOTAK%u z#7EYSymBa>Y&`4@Ffm&lxog|JGhG>BPx$u;Ig zhanra)@5TBV{@8(le)od=MZScTHK2=8cikHIuNW>^0PQLiQ-@U95r?P0sc?spnX8XB-Fwp8ZN9nk*gQNY==j2)0kCP> zDS3wH9LV%ani_3bU2|xy#zAU$rwL<`uAe~6y>{(&G8kQVUiZh>m`rur~bZ0XVL~QQ(q<_ClM)5o8+`+95hA?X0lOj&2f6?i%}xEm~y3R zZA1w3h^*;MJ*GFdRrP9o(a}EeSy$0MRB1H>ND#EI?o(ILX|D1yXsML7Jz;PiQelZ+ zp!i9t0BZQ}Y0c!zH|4A21GdDR7i)Cpg{XY}^=@lm1vWb9>y^p4F^Fj{5|XH~U(`1y zf0U&kUb4c0uQ(#`!MNRwE;%*DP}`saRhM}Q@8)WSInEKkDq_N)ih@A^4cDIuzpTR1 zg1^TRqQx;vVRq~}7XnA(a3&`_p-X}Rp+M!R82&a9yRuU2)qbcH!*(OuBG-ZxL$7^3 zk&b$I^~5I@OdQRRR`nvwa|Z8Ax*#R#RSH|9#$u7?>1oDhG*RHFDlwSr4bi&61QLwz zDLzl|vh{cbR+{+2Riced&uLkYy9`dK_ScE8u`N&ueqg2cUruA%=)P)#35CF58vwV> zIFPBlmMmvWShXzwjAC;X9Q9dnE`&F@@U8Utn=nx1ySEfLX(0((;LiiMhO*{o z332vyIVs;A+_1A?y(oW|?Fl2oUa(^_iON_+oYqiYgd}-iq2eyFl8e*2C7b|Q$7#)w zm1s2=sH^Fdv2u>d+BWU{?4KqFr-5CP>KbEH1xpYDVVij6M-c8AG=ym^@?d!I(P`9u z(W@77VDq{wy0<#R`)C@Tr;x*YPD61$^u=U&KnFrtLk+}c7XYQ}!}&%5t49-o8#I6j z8$BWc@|_PmISg)MZFq}`=(Tu&Y0*gn=!zUT%R6}HnzGC1I3zr#o#GHqMQG@>OzQj7okNAF z(psjhjkl6sE-6TI^GhnVg0K&Qnd~;28l$D{!$=pSZL9m)_hz5f__8{k;McQxsl7yL zoV4+ZL@DetHhsB+u&|Sr*#=j%+t!eitu!F$RMK>tLL_&GeKR_!oe^eQ=FnS3U9fs4 zI?FrCXlH>RT``+eW}G!(+Yec7JR&Y?WJi( zmoa%r*|6?kWI2MyMWFR&UR94W?=gsTJxJ}_*g_YkdUWL!owBrj-lX=Hx;)8+BIbFr zftcCqOWQ7{96mH7cGBrD==xgg7+$j^gyKT_a)O9QZ?{T>TX!jrkd>J#Cm|;2;tO2| z=43{SY5NJhTQKQ*&oeNy$u#WO!de&b$r+usOzH|f+vA&o_9PCcYXVad((7s>b=O!Z zxvTY)LL%1i&SDV@+C7(o`!I)3_ln}{m?q?=Y~@fKh>zj!lY5>N_O3$Ml2U5KPx+(7 zN0LYrf4JaN?NRvbXSVht{+PCc8`(XyfG??_f2D8e;jKH>`WI|T!;WbjqP9zrm*ZR7KW`bM%aMZ4>;lijsSslVlc+pT}&WfxFuQSMv0}uM1%mqJA$7GWa z6pIIode$f6LrBHlm1tMmunGE`=P4W`HIGYvT#t8kYINF0AA{{c=jGrCMA7YO`<&7m znPRW=3T+R(iyAEZD5LAgt+0a^)JQ95Y} zArV<65fxQBr;(Bl?f2HlYs0 ziGdJ%;O|#epl^W;RG_kRG@~>7OHhi=$l8MLJ1b@ZM>7{2pdviba?Qm47dPlXx4gn5 zAS((u#k2^#&-gl#^es}6f5-WyC+g41pS(8g(F7)M06uYiwe0*BfoQ)={+9!*<1+zM zpe4zFKtG#={Y zWh|VWfPQ@cp#n$BpCHi$Fq3A1NJ*f0`j5@bc=iX#zgcbujwXNJ%$8|Sv|Ql8_W^R* zf9Tq6-~sy2ga7Yw^MCDC&}KYbVj#*CIDmc}rk9j|j8g*IG1;2^%l?~tkPAUa! zoPSK-#rj{#|LUpVSk(V~Fn@15{M8crTjX;6d-DGbxPRIH@BK7?9A#=eKOijruWrUa zH|Ben#;-;|-(p?xH>CfwTj$T*@7>LQyk=br|G@pFquD<@LjKJ8-uCLNSK7B=k^Fbg zA3CS~4E^4B>8qpGw|FJ}1N48^U;fBn>u1XM)-XTrI(OM$QvTNt=KtpC^fUK+i;S=aQLge^)V~~G-zzMBoxuDS=O(|*`v;1gKX3c@GJ`*k za60qfF#ev4`Df+EpE=)Gb$=Bt{1(v`f5!Qj&icO6_{Yu)@%|;?4@$*8G>EADkeqE{m7WL`BO#91q`=2-V`_;N1uP(+}zs&l(<<*~)e?RN~b;0jj z5a;|l`5!F*{S5hjw(!SY+EDOI$ls&#chmVlGroU@`a19UEsRQj$M}a?NO>s;-~$;5 R2np~f1o-$>Q}y+){|A@R9n$~+ literal 0 HcmV?d00001 diff --git a/app/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties b/app/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..b2ee479 --- /dev/null +++ b/app/src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue May 10 19:22:52 CST 2022 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/app/src-tauri/gen/android/gradlew b/app/src-tauri/gen/android/gradlew new file mode 100755 index 0000000..249efbb --- /dev/null +++ b/app/src-tauri/gen/android/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# 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 +# +# https://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. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# gradlew start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh gradlew +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/app/src-tauri/gen/android/gradlew.bat b/app/src-tauri/gen/android/gradlew.bat new file mode 100644 index 0000000..a51ec4f --- /dev/null +++ b/app/src-tauri/gen/android/gradlew.bat @@ -0,0 +1,82 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem gradlew startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +"%COMSPEC%" /c exit 1 + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +"%COMSPEC%" /c exit 1 + +:execute +@rem Setup the command line + + + +@rem Execute gradlew +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel + +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/app/src-tauri/gen/android/settings.gradle b/app/src-tauri/gen/android/settings.gradle new file mode 100644 index 0000000..3939116 --- /dev/null +++ b/app/src-tauri/gen/android/settings.gradle @@ -0,0 +1,3 @@ +include ':app' + +apply from: 'tauri.settings.gradle' diff --git a/app/src-tauri/icons/128x128.png b/app/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..0e3138777f8c6acd31f904efa027f9503e5072f5 GIT binary patch literal 1953 zcmV;S2VVGzP)!9`DV2o&1MVkMW{1@vwt^LBV|-uERh?4P&8`pY06_u}mLaR~T0>5oa@w@_e$;6>4zW@kSG0Yn?K-U-=YkmpHwA%z z=n;TO9y?B3@<@>=0Y*K+Pf!M0V9O&yISB&HdBUfP*9#@5&3k`aMu4Ixd_qq^0~ErN zAk)Om-{cslhXk33YyKg})+mqRl}0u}d&rCBJmGh6T#W%__MGP>NZdeBkp`cUm~G^x zWkNFPJ_%qf_C0$*nvDcbn=1VA@p0qs`RM3K%H^`kOHOz}y5l$mP=cYMAsHMTe0*mU z|JP2rTuw$uM{BF0fbVQXCX2us2UYc)Wnk56z3Ah-k& zBmhAI5Ej?~jQ3Lm5F`LW0uc7b0Yp(nOsQ0o)b-M;AK_frACexX@JEm{fN zzq*hnwFH3h&$8+V#EXlaogF(hfQmYRpxI7nP5>1%S8*{UK_ieb$_5Bp0$>QC*wjxr z!T8(V-BoG?M%8%!{rJWx?#DDOmNnrfS5{VJb#?WL&+!@B#>Pfs_X1mIb8}Osr>ARr zCG+$1M%gmjF9GZ8>otY%3j^PyC564cy_&-JwG_TLDJ-rv0Wgq@i;E5Wp-&Qn4kCsz zcA+6msgBl~0CRJ5E$Q1VW@l$5Y++12EkPR~0`mF1=u(Y@>qq$?rc_61O@QIy;Y8yQ zDh0|VK;nmDql9KvgmG0yDNS()+jJ@jsUEZ_arGo(@bL4~mJ`t02;AD*l9Q8@hW*e7 zeUorW!(e-RyX6|m3IaeQz?wciJ+0dZ-=R+uDi_ND0zJ|oqggB#83#~l7r+3+tg0je zUgI--m*i}NrYRH(Pb>$}LThVlt}$v-I5-pHWQo17vm@@2EMX2ksLTcE00}zuF%81(-2ax!&`pTF9*6gSTV)Zqk+Uw;bqT+mh(h>S~>B_(U z-)t5Jg4DU9)d3;I<)NO#x@G8JeGTLq;t&98z5CUh(tY)ov~}hf2}~LgDvBzD(#An) z-iQY>xoGdoN%z=I=_xE|G1ILe01Q#A+0{7&KWz;644MG_e4`CUB{T;FUoU(cWeI`c zdkS}?=f;9|vpp4FKp3kW_tM+jt7L!<4h}*^IbqO2@JXq8RbD{qY64-Et4a;Sw-1xn zy*T-fgl1b`M4Rw{+SQlbzTQR3;p@?2?>zYU_W#FqcaKB))kzS7a#!=0HS!8 zi=U=O<+scTH1XjKjd0=Wo2eGQc3yx^g_IEfrMK>-TKL)#K$jX85eK!nd$;ag9D z{x|Mw72YKQ5(Kh(sMix75@qMQkCZN9DFNW?+q~{uO#qZ}VN(WSDFJK@_K*PLSMM$x zU&BWN#4!ANZrq{7Z6$yyJ9Wh7ba1NI0BMl#PqXp&#}8kV071Y(i-g4l=o*=% zbWJ0Gs=a|o{LuP0kN~Ro22%Z7z69X>UBY4loV)TeC2KbUMkrZZ34rh~VKD*PI(sQq zn+brk_|uMuKYl|31RbB2cBsk&q?7;*02xaFRY$xNmPZ29j=vO~5Srd4pl`qe0z8QN zlapo%uumHx6-MB3oQ)wzRJt0?{$C!*uScIm{aGo_5&$ibmjs^oBZ{A;<35EmATSgr zW}qUoh};D31O9v1*^7P;E2@5e|Naa2vnDHncA9-?lxv$g?T~ZNSb%Z4I7ffDIqfS^{Pgg!fJT`18WZx#;K+;cZAn0^KPduK#|&~6#30n5ToKbRdGBK*!*LZJ n6GxB$1PMTp00ap@*oA)ppR^%s5kQvI00000NkvXXu0mjf69b8? literal 0 HcmV?d00001 diff --git a/app/src-tauri/icons/128x128@2x.png b/app/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..396c5c4de72ff5dc7a6a1b2aef900d87253e0283 GIT binary patch literal 3799 zcmai1dpOkF*WceU%&3?lw=TvM4oN6Ui#>U#x5da7oLI5j;bRNM)J^;vO*;pQO3i~|$*#3f3pJH{jyi20Ecw&n-4RX4p1j5j8L7GkwRu~}ZhK2ATqa~)_g?XJ|JMBR$d!9#75DX? z`a}?!`TIPD3dgC6Gw023;tQ=UhXgx3#``n<Vf0!Jo5xIq?}kyyYQe#q9`to)M$qB+qBsOyMWH02Tc}y(rYs*KO3)c8Eb5m zmlE_LQS5%20oR0UK6{w|XFPDMG8v-4)HBb!zDD1qp@L zjr%=Qw!%)6?2B4^0nxlUxkGv}kM&7#V~GJf{npz~iyV0hoL+}{-=Is<&Xvj*xsE64 zje)UOFQY(()2-`q{IU&;c@_6(%>`1NN^PZx#v0>|2l$X~#dT%ki8%fRqHU!t4aLW_ zJQ^$u18o=PpqA_Jinhcj&x79#qTnG`Rw&lswHc@|rTaTAY=A_^yC}g<#eZy3Rkfe0 zZ)y_GR5};;T)2AGXeqm@rp8(9cHq)LP3=0jUeD;}*0aLW#6Um4BJ+?l<>h7%#-+Dw zV10(lKGkrKeboepdRs0nZ0NsmVAlsAODI<^j*t5Ut<G<^&iRaR0mh=5b3x+ZcP3knN&N5LJY!8>nb z;O`P?-SO87GR!IGcWvdkN^4WGJUXzg|1w;FUpd-MVwH-JZ z;KdR|(Da0;R9*1I@vl!}_KO!b)W(y_t$STuPz3U}7gr{d?J1PL<^Wwiz24?}x}dIh zpZuGqrGZipH^s!4`xX`!(wz-gY+c^>mHWLqzH%4|orYk&I{#66`oy?VL{T7@JshIS zCd~QwmG!8Fsrk@7Gmn=|4A+KE_F>9%)PFl%yVn`grJ6Cc#=lTqUB~@4-eJ3xclo!O zPm-d9tTTst1p4~=CMPxr=t{f_7}X>HX$+<1iy?5|#*#Z|6^6 z@$okrd@CpCGA!EP)Ud$NxT`lUZv}E@UTICRLz79`H+@r5x>_Yzm-tdRRTNM5oatTf z@RsV^FMD*Xoyw^7t$$y_!X`7Nsa3kyHQ(%Ey|jt7Dz(rf1KrtDj!kEPTYaeWF?;(> zR;RJ#Q?<}&c$iIBEq-F5aP)1(W`|%%`{rtbws*hB{x|eAD}BX~(fZre+c03Q z;g!~)zOQ|~U-$O+_w&9SMuO94;~$@kGtrWRV`9O<{cjxiC+2O~2G`6NG!6}I#i^la z`K2Lt#W8v~+>Ue6PDxVp>R9*$mD8SSypc|-cS$D%CAc}h0B=PpkUALqH!deXKfixA zSD-x@V4UD4@7*phSC4xfjR#s?uQwGoWK-SaR>aOvI3pux&r-;S4LV}Kf}3Ff>GMu1jRR z8Q<<(0TQK!LT@rL1yu+{_S0 zA95Hbryf9$8kc!Bh>m@%EQ-%;;bD$+1a{6ucZCXE-a)WpK{;FG6@Sx%9eJR-axldF zC_iW;LyDo~GO?+sSBBbTZm{ARC_{j>RXQh&x%(Y7?B)Cl8yf0R-m{+bkJwj!o~2EF zy(muan=~{d0_SI+V?vy*6bRZH);sk-%zPoN!_6y!L;_T?N7eM>yA5WhrjLHg=b9#l z_#4ho^@I`)!e0E?3piqfF&b2RButoQPFy`5k*m-j z>816snMfg*vEEL-EbfjpF%s23RlA=@a{ZHj>W6WNu%6W4cscNl5KBIg@bX!K=k-0b zQK`>YxtfH75q4C|PZDO`0lnLd#g??iW)xrl+d)Rdne0qFXQ)gg#ZGN>JZRIiAD#Yw zrPSOPpK5-8TIc?*(rWx{N|SAD>g>0GD4MW7x($bgU0RAplA902JDmPttz973UA*1k zwxB1G^z-v7>t`$&TbeLDDf?cBy$_Rdb+5;odZ1`4zgYr~Bfh&`?xb^^p?6)yrbjJO z)AiMsx}WA{<^(X6io1)=>j@;SLoStsH)|(5PB@Fl-37a&WHE0?tISd*HBsU567t(L zwfOrcoML8!4EX*BIv);)V&O}|%ktZE28?kU<}1sWe4}2hHgi|=*mrPPa79Jd@5l5r z%qe+2<`97qEND<-tpp2f=C%RacRIe+pj!b|t?Q!Sz|v!m4k@m#P?$&S%~8OHF46k9 zMg2y1R^334%OmFahbJq0ydJGd-duVxvZXHUmK)bqDptV^B_kb^=={&2+^j=o^kU67 zM`{Ch8MfB<(KUL$+5IiLXH4SE$$^%SJN+Ky`KPQE3`e_EMJ@G&TF-9-Jom!WOM@o! zuW^1Y(EtwQ&8q|64xMj}qelV9P+?YWtt;MX0nyu{Gj(94H~!5k7W|A$W;FXS?dt*+ zP|?0y!zN@B)o>uvC~DUNgaRrgJPOA78RD9fFn}=Mlf&{AryH~ISU?lP0M-f+52}z* zVC>v0if04_fyy-)fF|UaT+`d=7=2OVdIU!}>+kq^YAzltG|A3k=NtF;#DC{Q@N%fd zy&nrz`N}w8Ix^?~+;8ljTvT$_^MJ@|T-H=?L#>1-Ill!Q1-`+WC^&hw;4 z07p23X4>m^~W#u|W#GZ-`w2CpToLeSjCQo%-n1d0|lGwoZih6f8(9Ssp8 zRXsEjn7>L^BZ9HOUbQ|%pgxH_T4`RAB$f#2nQOpllG2DHf~)}B%|e1I1A+|XnaE4$ z@}cwBHqT2#108-!z`xA?p(6s2f!E|(`Wm7|x)oI<2+b^|sBH&#Wlt^?j$`nEGQb?e zc%aE3@jVHkXlF$b9V=V(fQj*K((F zCKgzp;YwGEt-h);msKEeD-8%`l_5O%mx(OY7i9mdW}pML_t}zr#So4o99~c6G7%5g zkrA=b4xosD{ZC$FV6Yr=I?f=6BU~uYCIb96(bsYP+ztJ%QfOcboWXx;9vr9DQ@Wob zL?Co2s;uj55Z6Qla^ZIpfgFzJb&mX}^nvALfsx)eD>6+_5mo9l0hI*1LnZBwykjd+ zFH%Vn@8fBY?XbLK*f{`M-?h!R*ks`9<{onbLwjqYs*<*L|5&Ra8I7)}TtvCHzmz54 ztZJH;?9c4%i+b=j$?bhEeq8Ula*k0pWAWCCb$Yutf$SpxB-ns(DRWnDceKu~!MN&` zlLE4LXU*w|VK!esIQmS}PZ?w8Bn9`H$-Ll&W_I47H>SNi40JtYaxO96oeTA^>@c|T zv1Kvb;=w-m&fUETFGSq2Ear=<*RvKWc;XJoK_y6fBh+&Hu+k~T9Fs#3fFoJTSG|r? zVzzN6Xpxz8=+KaM1bID zY4+#Usi8Lq<$YT)K%>Lnu41NO=O}Kcv3ELMiuR&s)jiIJJeW`RQ{NyBhzI>`G}h+* z*6DJ&?_VF&T0%-|!nYqL-Ub0Phy*~v#*J}21mcH%v`Nt`# z*I)Eyc*V8Mwi=hVJ=4#IM?YAlVa=}X$if&fQ-3Jk@Bef{3aTh@{CC1ZVcZDoeR@aY zw6f=Zx8h=;d_mX4EUiLZs`246@F=W#{n!iFe4c8^xF-ofiAV8&>!|(^b literal 0 HcmV?d00001 diff --git a/app/src-tauri/icons/32x32.png b/app/src-tauri/icons/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe227794e5dd436adaf0414e69933a1b61736be GIT binary patch literal 556 zcmV+{0@MA8P)iZ$osaC5*N0Ov)lMqYCG|lgBHHHA@2GWb<$*Loh60?rdR=n--F~T3#pB5czwKu!Nb*T1Zaq&NZhPx8ZlZZ6bJ#tN_G>t z$~mOVN8x(FFDLMdZm-p9Bm~+0Ysl=LhTjLguq+E2jmC((*Ds$Tl`BTmi2ec^Uy~nZ zG9C(nAjSg|$R6ATG9HKkW_w0FiDwx34x7qFJkyY6S>MD*kXEAX6W(FYP4 ucZZmaOMa`_u=3m`B_bH~f|{83UhoC5ypK^EfMSOL0000Lf{j@3o38HnPITt&*MYK#oF_i*uiFRFXJW7%1fL`asr}LvGhbfl9;Z zlxW?$$auUa4pJq{4I008qNL7oBd zCPN+o-fVEOD1E=4s0S;(UT@`ri`g*+){V#GYnu-1%5XRYQ53me56~4!k~|Jj51H%r zI<(tu`HJ_;ra-gVl-oH!KVP~XTOt5+UNOGg?M~$`@<%$IHpL0}du&HB8rwk4=kv~t z0L3_bNv#Qz5fW9)$;ru_$FYrd@J!I^@HbO#Rr`+NfKI0a0Fg*!<=jgIy+)A4W?unPj#V z2n!HCDnK~(OjcVWzzX(NR%fc!s?6xj2+l&*wy8?r2y!x4FH=X;P0<7>(LMv z> + + + + + + + + + + + + + + diff --git a/app/src-tauri/icons/icon.icns b/app/src-tauri/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..18b6312ee4e989dc5fdf27ef26062c8c912d83af GIT binary patch literal 47478 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≶!@2g*l7O}xPRnZAg^en7J8G#Hd^ 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 S8`s9BslW1qY530{@c#v}I7#6E literal 0 HcmV?d00001 diff --git a/app/src-tauri/icons/icon.png b/app/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..70998d206ba516147514aaab7dc4291534a41cce GIT binary patch literal 7827 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 literal 0 HcmV?d00001 diff --git a/app/src-tauri/src/lib.rs b/app/src-tauri/src/lib.rs new file mode 100644 index 0000000..3b48e91 --- /dev/null +++ b/app/src-tauri/src/lib.rs @@ -0,0 +1,6 @@ +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/app/src-tauri/src/main.rs b/app/src-tauri/src/main.rs new file mode 100644 index 0000000..48375dd --- /dev/null +++ b/app/src-tauri/src/main.rs @@ -0,0 +1,6 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + framemate_app_lib::run() +} diff --git a/app/src-tauri/tauri.conf.json b/app/src-tauri/tauri.conf.json new file mode 100644 index 0000000..6814264 --- /dev/null +++ b/app/src-tauri/tauri.conf.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "FrameMate", + "version": "0.1.0", + "identifier": "dev.framemate.app", + "build": { + "beforeDevCommand": "bun run dev", + "devUrl": "http://localhost:1420", + "beforeBuildCommand": "bun run build", + "frontendDist": "../build" + }, + "app": { + "windows": [ + { + "title": "FrameMate", + "width": 412, + "height": 892 + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } +} diff --git a/app/src/app.css b/app/src/app.css new file mode 100644 index 0000000..7efd24d --- /dev/null +++ b/app/src/app.css @@ -0,0 +1,74 @@ +/* Colours follow the Steam mobile app / SteamOS: dark blue-grey surfaces, #1a9fff accent. */ +:root { + --bg: #171d25; + --topbar: #171a21; + --surface: #1e252e; + --surface-2: #2a3542; + --divider: #2a313b; + --track: #3d4450; + --text: #dcdedf; + --muted: #8b929a; + --accent: #1a9fff; + --accent-2: #00bbff; + --green: #59bf40; + --yellow: #e5b029; + --red: #e0423c; + --gutter: 16px; + + color-scheme: dark; + font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; + font-size: 15px; + line-height: 1.4; + color: var(--text); + background: var(--bg); + -webkit-tap-highlight-color: transparent; +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + background: var(--bg); + overscroll-behavior: none; +} + +a { + color: inherit; + text-decoration: none; +} + +button, +input { + font: inherit; + color: inherit; +} + +.muted { + color: var(--muted); +} + +/* Steam's blue call-to-action button ("EXPLORE YOUR QUEUE"). */ +.button { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + min-height: 44px; + padding: 0 20px; + border: 0; + border-radius: 2px; + background: linear-gradient(90deg, var(--accent), var(--accent-2)); + color: #fff; + font-weight: 600; + letter-spacing: 0.04em; + text-transform: uppercase; + cursor: pointer; +} + +.empty { + padding: 16px var(--gutter); + background: var(--surface); + color: var(--muted); +} diff --git a/app/src/app.d.ts b/app/src/app.d.ts new file mode 100644 index 0000000..4a2d9f2 --- /dev/null +++ b/app/src/app.d.ts @@ -0,0 +1,16 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +declare global { + namespace App { + interface PageState { + /** Headset view in fullscreen (shallow route, so Back leaves fullscreen). */ + fullscreen?: boolean; + } + } + + interface Window { + /** Native bridge from MainActivity.kt (Android only). */ + FrameMateAndroid?: { setFullscreen(enabled: boolean): void }; + } +} + +export {}; diff --git a/app/src/app.html b/app/src/app.html new file mode 100644 index 0000000..dec94f4 --- /dev/null +++ b/app/src/app.html @@ -0,0 +1,14 @@ + + + + + + + + FrameMate + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/app/src/lib/agent.svelte.ts b/app/src/lib/agent.svelte.ts new file mode 100644 index 0000000..2822891 --- /dev/null +++ b/app/src/lib/agent.svelte.ts @@ -0,0 +1,87 @@ +// Connection to the framemate-agent on the Frame. Holds the latest state pushed over +// `/api/ws` and reconnects on its own. Settings live in localStorage. + +import type { AgentState } from "./types"; + +const STORAGE_KEY = "framemate.connection"; +const DEFAULT_PORT = 7380; +const RETRY_MS = 3000; + +export interface ConnectionSettings { + /** Hostname or IP, optionally with `:port`. */ + host: string; + token: string; +} + +export type ConnectionStatus = "unconfigured" | "connecting" | "connected" | "offline"; + +function loadSettings(): ConnectionSettings { + try { + const saved = JSON.parse(localStorage.getItem(STORAGE_KEY) ?? "null"); + if (saved?.host !== undefined && saved?.token !== undefined) return saved; + } catch {} + return { host: "frame.local", token: "" }; +} + +class Agent { + settings = $state(loadSettings()); + state = $state(null); + status = $state("unconfigured"); + + #socket: WebSocket | null = null; + #retry: ReturnType | undefined; + + get configured() { + return this.settings.host.trim() !== "" && this.settings.token.trim() !== ""; + } + + /** `host:port` of the agent. */ + get authority() { + const host = this.settings.host.trim(); + return /:\d+$/.test(host) ? host : `${host}:${DEFAULT_PORT}`; + } + + /** WebSocket URL for an agent endpoint, with the token attached. */ + socketUrl(path: string) { + return `ws://${this.authority}${path}?token=${encodeURIComponent(this.settings.token.trim())}`; + } + + save(settings: ConnectionSettings) { + this.settings = { host: settings.host.trim(), token: settings.token.trim() }; + try { + localStorage.setItem(STORAGE_KEY, JSON.stringify(this.settings)); + } catch {} + this.state = null; + this.connect(); + } + + connect() { + this.#close(); + if (!this.configured) { + this.status = "unconfigured"; + return; + } + this.status = "connecting"; + const socket = new WebSocket(this.socketUrl("/api/ws")); + this.#socket = socket; + socket.onmessage = event => { + this.state = JSON.parse(event.data); + this.status = "connected"; + }; + socket.onclose = () => { + if (this.#socket !== socket) return; // replaced by a newer connection + this.#socket = null; + this.status = "offline"; + this.#retry = setTimeout(() => this.connect(), RETRY_MS); + }; + } + + #close() { + clearTimeout(this.#retry); + const socket = this.#socket; + this.#socket = null; + socket?.close(); + } +} + +export const agent = new Agent(); diff --git a/app/src/lib/components/Battery.svelte b/app/src/lib/components/Battery.svelte new file mode 100644 index 0000000..c6622b1 --- /dev/null +++ b/app/src/lib/components/Battery.svelte @@ -0,0 +1,17 @@ + + + diff --git a/app/src/lib/components/GameArt.svelte b/app/src/lib/components/GameArt.svelte new file mode 100644 index 0000000..12a4173 --- /dev/null +++ b/app/src/lib/components/GameArt.svelte @@ -0,0 +1,46 @@ + + +
+ {#if failed} + + {:else} + (failed = true)} /> + {/if} +
+ + diff --git a/app/src/lib/components/Icon.svelte b/app/src/lib/components/Icon.svelte new file mode 100644 index 0000000..abd688b --- /dev/null +++ b/app/src/lib/components/Icon.svelte @@ -0,0 +1,22 @@ + + + + + + + diff --git a/app/src/lib/components/Progress.svelte b/app/src/lib/components/Progress.svelte new file mode 100644 index 0000000..3c9b43f --- /dev/null +++ b/app/src/lib/components/Progress.svelte @@ -0,0 +1,24 @@ + + +
+
+
+ + diff --git a/app/src/lib/components/Row.svelte b/app/src/lib/components/Row.svelte new file mode 100644 index 0000000..dcb0392 --- /dev/null +++ b/app/src/lib/components/Row.svelte @@ -0,0 +1,33 @@ + + +
+ {label} + + {#if children}{@render children()}{:else}{value ?? "–"}{/if} + +
+ + diff --git a/app/src/lib/components/Section.svelte b/app/src/lib/components/Section.svelte new file mode 100644 index 0000000..76c1a8a --- /dev/null +++ b/app/src/lib/components/Section.svelte @@ -0,0 +1,32 @@ + + +
+
+

{title}

+ {@render aside?.()} +
+ {@render children()} +
+ + diff --git a/app/src/lib/format.ts b/app/src/lib/format.ts new file mode 100644 index 0000000..2179042 --- /dev/null +++ b/app/src/lib/format.ts @@ -0,0 +1,40 @@ +export function percent(fraction: number | null | undefined): string { + return fraction == null ? "–" : `${Math.round(fraction * 100)}%`; +} + +export function bytes(n: number | null | undefined): string { + if (n == null) return "–"; + const units = ["B", "KB", "MB", "GB", "TB"]; + let i = 0; + while (n >= 1000 && i < units.length - 1) { + n /= 1000; + i++; + } + return `${n.toFixed(i && n < 100 ? 1 : 0)} ${units[i]}`; +} + +export function duration(seconds: number | null | undefined): string { + if (seconds == null || seconds < 0) return "–"; + const h = Math.floor(seconds / 3600); + const m = Math.floor((seconds % 3600) / 60); + if (h) return `${h}h ${m}m`; + if (m) return `${m}m`; + return `${Math.floor(seconds)}s`; +} + +export function since(ms: number | null | undefined): string { + return ms ? duration((Date.now() - ms) / 1000) : "–"; +} + +/** Steam CDN artwork for an app; tools and runtimes have none (handle onerror). */ +export function appArt(appid: number, kind: "header" | "capsule" = "header"): string { + const file = kind === "header" ? "header.jpg" : "capsule_184x69.jpg"; + return `https://cdn.cloudflare.steamstatic.com/steam/apps/${appid}/${file}`; +} + +/** OpenVR EDeviceActivityLevel. */ +export function hmdActivity(level: number | undefined): string { + return ( + { [-1]: "Unknown", 0: "Idle", 1: "In use", 2: "In use", 3: "Standby", 4: "Idle" } as Record + )[level ?? -1] ?? "Unknown"; +} diff --git a/app/src/lib/icons/back.svg b/app/src/lib/icons/back.svg new file mode 100644 index 0000000..8d2446c --- /dev/null +++ b/app/src/lib/icons/back.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/lib/icons/bell-badge.svg b/app/src/lib/icons/bell-badge.svg new file mode 100644 index 0000000..ba3aa73 --- /dev/null +++ b/app/src/lib/icons/bell-badge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/lib/icons/cast.svg b/app/src/lib/icons/cast.svg new file mode 100644 index 0000000..e741aaf --- /dev/null +++ b/app/src/lib/icons/cast.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/lib/icons/controller.svg b/app/src/lib/icons/controller.svg new file mode 100644 index 0000000..28e7b65 --- /dev/null +++ b/app/src/lib/icons/controller.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/lib/icons/download.svg b/app/src/lib/icons/download.svg new file mode 100644 index 0000000..66b27f8 --- /dev/null +++ b/app/src/lib/icons/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/lib/icons/friends.svg b/app/src/lib/icons/friends.svg new file mode 100644 index 0000000..c6d055f --- /dev/null +++ b/app/src/lib/icons/friends.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/lib/icons/headset.svg b/app/src/lib/icons/headset.svg new file mode 100644 index 0000000..6ffcbc0 --- /dev/null +++ b/app/src/lib/icons/headset.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/lib/icons/home.svg b/app/src/lib/icons/home.svg new file mode 100644 index 0000000..c18f791 --- /dev/null +++ b/app/src/lib/icons/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/lib/icons/library.svg b/app/src/lib/icons/library.svg new file mode 100644 index 0000000..effa105 --- /dev/null +++ b/app/src/lib/icons/library.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/lib/icons/performance.svg b/app/src/lib/icons/performance.svg new file mode 100644 index 0000000..c744200 --- /dev/null +++ b/app/src/lib/icons/performance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/lib/icons/settings.svg b/app/src/lib/icons/settings.svg new file mode 100644 index 0000000..48d697d --- /dev/null +++ b/app/src/lib/icons/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/lib/icons/storage.svg b/app/src/lib/icons/storage.svg new file mode 100644 index 0000000..ea82995 --- /dev/null +++ b/app/src/lib/icons/storage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/lib/types.ts b/app/src/lib/types.ts new file mode 100644 index 0000000..baffb2a --- /dev/null +++ b/app/src/lib/types.ts @@ -0,0 +1,117 @@ +// Shape of the agent's `/api/ws` / `/api/state` JSON (see crates/agent/src/hub.rs and +// shim.js). Steam topics are loosely typed on the agent side; every field may be +// missing when Steam isn't connected or an API changed, hence the many optionals. + +export interface AgentState { + agent: { version: string; hostname: string; started_at_ms: number; updated_at_ms: number }; + steam: { + connected: boolean; + error: string | null; + last_event_ms: number | null; + topics: SteamTopics; + topic_errors: Record; + }; + power: { battery: KernelBattery | null; external_power: boolean | null } | null; + steamos: { available: boolean; error: string | null; properties: Record }; + stream: StreamStats | null; +} + +export interface SteamTopics { + battery?: { + has_battery: boolean; + level: number; + seconds_remaining: number; + /** 1 = on battery, 2 = on AC */ + ac_state: number; + battery_state: number; + }; + vr_devices?: VrDevice[]; + vr_state?: { hmd_activity?: number; scene_appid?: number | null; scene_app_name?: string | null }; + running_apps?: { appid: number; name: string | null }[]; + last_app_event?: { appid: number; name: string | null; running: boolean; at_ms: number }; + downloads?: DownloadItem[]; + download_overview?: DownloadOverview; + network?: { + connected: boolean | null; + internet: boolean | null; + steam: boolean | null; + wifi_enabled: boolean | null; + interfaces: { name: string; rx_bytes_per_sec: number; tx_bytes_per_sec: number }[]; + }; + perf?: { + battery_temp_c: number | null; + tdp_limit_w: number | null; + fps_limit: number | null; + low_latency_mode: boolean | null; + }; + system_info?: { + os: string; + os_version: string; + os_variant: string; + os_build: string; + kernel: string; + hostname: string; + steam_version: number; + steam_build_date: string; + gpu: string; + gpu_driver: string; + cpu_cores: number; + ram_mb: number; + }; + user?: { account_name: string | null; persona_name: string | null; persona_state: number | null }; +} + +export interface VrDevice { + path: string; + model: string | null; + serial: string | null; + /** 1 = HMD, 2 = controller */ + device_class: number | null; + /** 0..1 */ + battery: number | null; + charging: boolean | null; + connected: boolean | null; +} + +export interface DownloadItem { + appid: number; + name: string | null; + queue_index: number; + active: boolean; + paused: boolean; + completed: boolean; + completed_time: number; + percent: number | null; + error: string | null; +} + +export interface DownloadOverview { + appid: number | null; + name?: string | null; + state?: string | null; + paused?: boolean; + percent?: number; + bytes_per_sec?: number; + eta_sec?: number; + is_workshop?: boolean; + is_shader?: boolean; +} + +export interface KernelBattery { + status: string | null; + health: string | null; + capacity_percent: number | null; + power_w: number | null; + temp_c: number | null; + cycle_count: number | null; +} + +export interface StreamStats { + viewers: number; + width: number; + height: number; + source_fps: number; + fps: number; + kbit_per_sec: number; + encode_ms: number; +} diff --git a/app/src/routes/+layout.svelte b/app/src/routes/+layout.svelte new file mode 100644 index 0000000..48e39b7 --- /dev/null +++ b/app/src/routes/+layout.svelte @@ -0,0 +1,126 @@ + + +
+ + diff --git a/app/src/routes/+layout.ts b/app/src/routes/+layout.ts new file mode 100644 index 0000000..9d24899 --- /dev/null +++ b/app/src/routes/+layout.ts @@ -0,0 +1,5 @@ +// Tauri doesn't have a Node.js server to do proper SSR +// so we use adapter-static with a fallback to index.html to put the site in SPA mode +// See: https://svelte.dev/docs/kit/single-page-apps +// See: https://v2.tauri.app/start/frontend/sveltekit/ for more info +export const ssr = false; diff --git a/app/src/routes/+page.svelte b/app/src/routes/+page.svelte new file mode 100644 index 0000000..63a56e5 --- /dev/null +++ b/app/src/routes/+page.svelte @@ -0,0 +1,176 @@ + + +{#if !agent.state} +

+ {agent.status === "unconfigured" ? "Set up the connection in Settings." : "Connecting to your Frame…"} +

+{:else} +
+
+ +
+ {#if battery} +
+ {percent(battery.level)} + +
+
+ {charging + ? `Charging · full in ${duration(battery.seconds_remaining)}` + : `About ${duration(battery.seconds_remaining)} left`} +
+ {:else} +
–
+ {/if} +
+ {hmdActivity(topics?.vr_state?.hmd_activity)} + {#if kernel?.power_w != null}· {Math.abs(kernel.power_w).toFixed(1)} W{/if} +
+
+
+
+ + {#if controllers.length} +
+
+ {#each controllers as c (c.path)} +
+ +
+
{controllerName(c.model)}
+
+ {percent(c.battery)} + {c.charging ? "· charging" : c.connected ? "" : "· asleep"} +
+
+ + +
+ {/each} +
+
+ {/if} + +
+ {#if running.length} + {#each running as app (app.appid)} +
+ +
{app.name ?? app.appid}
+
+ {/each} + {:else} +

Nothing running

+ {/if} +
+ +
+ {#snippet aside()}All downloads ›{/snippet} + {#if download?.appid} +
+ +
+
+ {download.name ?? download.appid}{download.is_workshop ? " · Workshop" : ""} + {download.percent ?? 0}% +
+ +
+ {download.paused ? "Paused" : `${bytes(download.bytes_per_sec)}/s`} + {download.eta_sec ? `${duration(download.eta_sec)} left` : ""} +
+
+
+ {:else} +

No active downloads

+ {/if} +
+{/if} + + diff --git a/app/src/routes/downloads/+page.svelte b/app/src/routes/downloads/+page.svelte new file mode 100644 index 0000000..00ec404 --- /dev/null +++ b/app/src/routes/downloads/+page.svelte @@ -0,0 +1,91 @@ + + +
+ {#if queued.length} + {#each queued as item (item.appid)} + {@const live = overview?.appid === item.appid ? overview : null} +
+ +
+
+ {item.name ?? item.appid} + {live?.percent ?? item.percent ?? 0}% +
+ +
+ + {#if item.error}Error: {item.error} + {:else if item.paused}Paused + {:else if live}{bytes(live.bytes_per_sec)}/s + {:else}Queued{/if} + + {live?.eta_sec ? `${duration(live.eta_sec)} left` : ""} +
+
+
+ {/each} + {:else} +

Nothing queued

+ {/if} +
+ +{#if finished.length} +
+ {#each finished as item (item.appid)} +
+ +
+ {item.name ?? item.appid} + Updated {finishedAgo(item.completed_time)} +
+
+ {/each} +
+{/if} + + diff --git a/app/src/routes/settings/+page.svelte b/app/src/routes/settings/+page.svelte new file mode 100644 index 0000000..9e44944 --- /dev/null +++ b/app/src/routes/settings/+page.svelte @@ -0,0 +1,81 @@ + + +
+
+ + + +

{statusText}

+
+
+ +
+ +
+ + diff --git a/app/src/routes/system/+page.svelte b/app/src/routes/system/+page.svelte new file mode 100644 index 0000000..36964d5 --- /dev/null +++ b/app/src/routes/system/+page.svelte @@ -0,0 +1,64 @@ + + +{#if s} +
+ + + + + +
+ +
+ + + + + + +
+ +
+ + + {#each net?.interfaces ?? [] as i (i.name)} + + {/each} +
+ +
+ + + + + + +
+ +
+ + +
+ +
+ + + +
+{:else} +

Not connected

+{/if} diff --git a/app/src/routes/view/+page.svelte b/app/src/routes/view/+page.svelte new file mode 100644 index 0000000..808718f --- /dev/null +++ b/app/src/routes/view/+page.svelte @@ -0,0 +1,188 @@ + + + + +
+ + {#if status}
{status}
{/if} + {#if fullscreen} + + {:else} + + {/if} +
+ +
+ + + + +
+

The headset only renders this view while someone watches. A sleeping headset shows black frames.

+ + diff --git a/app/static/favicon.svg b/app/static/favicon.svg new file mode 100644 index 0000000..3afc621 --- /dev/null +++ b/app/static/favicon.svg @@ -0,0 +1,95 @@ + + + + + Frame-Mate Friendly Frame + A friendly companion version of the Steam Frame-inspired logo, with a smiling face inside the frame. + + + + + + + + + + + + + Frame-Mate Friendly Frame + + + + diff --git a/app/svelte.config.js b/app/svelte.config.js new file mode 100644 index 0000000..a7830ea --- /dev/null +++ b/app/svelte.config.js @@ -0,0 +1,18 @@ +// Tauri doesn't have a Node.js server to do proper SSR +// so we use adapter-static with a fallback to index.html to put the site in SPA mode +// See: https://svelte.dev/docs/kit/single-page-apps +// See: https://v2.tauri.app/start/frontend/sveltekit/ for more info +import adapter from "@sveltejs/adapter-static"; +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + preprocess: vitePreprocess(), + kit: { + adapter: adapter({ + fallback: "index.html", + }), + }, +}; + +export default config; diff --git a/app/tsconfig.json b/app/tsconfig.json new file mode 100644 index 0000000..f4d0a0e --- /dev/null +++ b/app/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/app/vite.config.js b/app/vite.config.js new file mode 100644 index 0000000..482f745 --- /dev/null +++ b/app/vite.config.js @@ -0,0 +1,32 @@ +import { defineConfig } from "vite"; +import { sveltekit } from "@sveltejs/kit/vite"; +// @ts-expect-error type error without @types/node package +import process from "node:process"; +const host = process.env.TAURI_DEV_HOST; + +// https://vite.dev/config/ +export default defineConfig(() => ({ + plugins: [sveltekit()], + + // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` + // + // 1. prevent Vite from obscuring rust errors + clearScreen: false, + // 2. tauri expects a fixed port, fail if that port is not available + server: { + port: 1420, + strictPort: true, + host: host || "127.0.0.1", + hmr: host + ? { + protocol: "ws", + host, + port: 1421, + } + : undefined, + watch: { + // 3. tell Vite to ignore watching `src-tauri` + ignored: ["**/src-tauri/**"], + }, + }, +})); diff --git a/assets/framemate-black.png b/assets/framemate-black.png new file mode 100644 index 0000000000000000000000000000000000000000..316a69142fdbcfd768cdc9ee8601962303392e33 GIT binary patch literal 15947 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 + + + + Frame-Mate Friendly Frame + A friendly companion version of the Steam Frame-inspired logo, with a smiling face inside the frame. + + + + + + + + + + + + + Frame-Mate Friendly Frame + + + + diff --git a/assets/framemate-white.png b/assets/framemate-white.png new file mode 100644 index 0000000000000000000000000000000000000000..1b001ef90de37ea5070fbc427405e0995742e4be GIT binary patch literal 15830 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 literal 0 HcmV?d00001 diff --git a/assets/framemate-white.svg b/assets/framemate-white.svg new file mode 100644 index 0000000..581239b --- /dev/null +++ b/assets/framemate-white.svg @@ -0,0 +1,94 @@ + + + + + Frame-Mate Friendly Frame + A friendly companion version of the Steam Frame-inspired logo, with a smiling face inside the frame. + + + + + + + + + + + + + Frame-Mate Friendly Frame + + + + diff --git a/assets/logo.png b/assets/logo.png deleted file mode 100644 index 28ef5a721c4b3be4cd282232fcac648cc9779291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8542 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 diff --git a/assets/logo.svg b/assets/logo.svg deleted file mode 100644 index f9f3889..0000000 --- a/assets/logo.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - Frame-Mate Friendly Frame - A friendly companion version of the Steam Frame-inspired logo, with a smiling face inside the frame. - - - - - - - - - diff --git a/crates/agent/src/config.rs b/crates/agent/src/config.rs index 6221602..003baf3 100644 --- a/crates/agent/src/config.rs +++ b/crates/agent/src/config.rs @@ -29,6 +29,7 @@ impl Config { Ok(token) if !token.is_empty() => token, _ => load_or_create_token()?, }; + let token = normalize_token(&token); Ok(Self { listen, cdp_url: env_or("FRAMEMATE_CDP", "http://127.0.0.1:8080"), @@ -56,18 +57,48 @@ fn config_dir() -> anyhow::Result { Ok(base.join("framemate")) } +/// Crockford base32: no I, L, O, U, so tokens survive being read aloud or typed on a phone. +const TOKEN_ALPHABET: &[u8; 32] = b"0123456789ABCDEFGHJKMNPQRSTVWXYZ"; +const TOKEN_LEN: usize = 10; // 50 bits + +/// Canonical form for comparison: case, dashes and spaces don't matter, and the +/// look-alikes O/I/L read as 0/1 (Crockford decoding). +pub fn normalize_token(token: &str) -> String { + token + .chars() + .filter(|c| !matches!(c, '-' | ' ')) + .map(|c| match c.to_ascii_uppercase() { + 'O' => '0', + 'I' | 'L' => '1', + c => c, + }) + .collect() +} + +/// `ABCDE-FGHJK` for display. +pub fn format_token(token: &str) -> String { + let (a, b) = token.split_at(token.len() / 2); + format!("{a}-{b}") +} + +fn is_current_format(token: &str) -> bool { + token.len() == TOKEN_LEN && token.bytes().all(|b| TOKEN_ALPHABET.contains(&b)) +} + /// The API token lives in `$XDG_CONFIG_HOME/framemate/token` and is created on first run. -fn load_or_create_token() -> anyhow::Result { +/// Tokens in an older format (32 hex chars) are replaced by a short one. +pub fn load_or_create_token() -> anyhow::Result { let path = config_dir()?.join("token"); if let Ok(token) = std::fs::read_to_string(&path) { - let token = token.trim().to_owned(); - if !token.is_empty() { + let token = normalize_token(token.trim()); + if is_current_format(&token) { return Ok(token); } } - let mut bytes = [0u8; 16]; + let mut bytes = [0u8; TOKEN_LEN]; std::fs::File::open("/dev/urandom")?.read_exact(&mut bytes)?; - let token: String = bytes.iter().map(|b| format!("{b:02x}")).collect(); + // 256 is a multiple of 32, so `% 32` is unbiased. + let token: String = bytes.iter().map(|b| TOKEN_ALPHABET[(b % 32) as usize] as char).collect(); let dir = path.parent().unwrap(); std::fs::create_dir_all(dir)?; @@ -79,10 +110,25 @@ fn load_or_create_token() -> anyhow::Result { .mode(0o600) .open(&path) .with_context(|| format!("writing {}", path.display()))?; - std::io::Write::write_all(&mut file, token.as_bytes())?; + std::io::Write::write_all(&mut file, format_token(&token).as_bytes())?; + tracing::info!("generated a new API token"); Ok(token) } +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn tokens_compare_leniently() { + assert_eq!(normalize_token("abcde-fghjk"), "ABCDEFGHJK"); + assert_eq!(normalize_token("0O1Il-ab cd"), "00111ABCD"); + assert_eq!(format_token("ABCDEFGHJK"), "ABCDE-FGHJK"); + assert!(is_current_format("ABCDEFGHJK")); + assert!(!is_current_format("cbad37e74cbd250279126bbbca61a0a9")); + } +} + pub fn hostname() -> String { std::fs::read_to_string("/proc/sys/kernel/hostname") .map(|h| h.trim().to_owned()) diff --git a/crates/agent/src/dashboard.html b/crates/agent/src/dashboard.html index 3aa4b46..d9be0de 100644 --- a/crates/agent/src/dashboard.html +++ b/crates/agent/src/dashboard.html @@ -4,7 +4,7 @@ FrameMate - +