From 7d0a973638031448119442d2537c03a99caa076d Mon Sep 17 00:00:00 2001 From: SirBlobby Date: Sun, 9 Aug 2026 17:09:16 -0400 Subject: [PATCH] Add kiosk desktop app Tauri app for the Pi. Media runs through the native LiveKit SDK because WebKitGTK has no WebRTC, with frames encoded in Rust and drawn to a canvas under the annotation overlay. --- apps/kiosk-client/.vscode/extensions.json | 7 + apps/kiosk-client/.vscode/settings.json | 3 + apps/kiosk-client/package.json | 41 + apps/kiosk-client/src-tauri/.gitignore | 7 + apps/kiosk-client/src-tauri/Cargo.lock | 6287 +++++++++++++++++ apps/kiosk-client/src-tauri/Cargo.toml | 29 + apps/kiosk-client/src-tauri/build.rs | 3 + .../src-tauri/capabilities/default.json | 10 + apps/kiosk-client/src-tauri/icons/128x128.png | Bin 0 -> 1572 bytes .../src-tauri/icons/128x128@2x.png | Bin 0 -> 2537 bytes apps/kiosk-client/src-tauri/icons/32x32.png | Bin 0 -> 1010 bytes apps/kiosk-client/src-tauri/icons/64x64.png | Bin 0 -> 1218 bytes .../src-tauri/icons/Square107x107Logo.png | Bin 0 -> 2345 bytes .../src-tauri/icons/Square142x142Logo.png | Bin 0 -> 2601 bytes .../src-tauri/icons/Square150x150Logo.png | Bin 0 -> 2710 bytes .../src-tauri/icons/Square284x284Logo.png | Bin 0 -> 3526 bytes .../src-tauri/icons/Square30x30Logo.png | Bin 0 -> 1337 bytes .../src-tauri/icons/Square310x310Logo.png | Bin 0 -> 3621 bytes .../src-tauri/icons/Square44x44Logo.png | Bin 0 -> 1870 bytes .../src-tauri/icons/Square71x71Logo.png | Bin 0 -> 2377 bytes .../src-tauri/icons/Square89x89Logo.png | Bin 0 -> 2323 bytes .../src-tauri/icons/StoreLogo.png | Bin 0 -> 1797 bytes .../android/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../icons/android/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2116 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 2633 bytes .../android/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 2267 bytes .../icons/android/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1972 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2768 bytes .../android/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2117 bytes .../android/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2080 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 3435 bytes .../mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 2995 bytes .../android/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 3299 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 3816 bytes .../mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 3858 bytes .../android/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 2258 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 3590 bytes .../mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 2546 bytes .../android/values/ic_launcher_background.xml | 4 + apps/kiosk-client/src-tauri/icons/icon.icns | Bin 0 -> 25758 bytes apps/kiosk-client/src-tauri/icons/icon.ico | Bin 0 -> 9800 bytes apps/kiosk-client/src-tauri/icons/icon.png | Bin 0 -> 3570 bytes .../src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin 0 -> 887 bytes .../icons/ios/AppIcon-20x20@2x-1.png | Bin 0 -> 1545 bytes .../src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin 0 -> 1545 bytes .../src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin 0 -> 2028 bytes .../src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin 0 -> 1240 bytes .../icons/ios/AppIcon-29x29@2x-1.png | Bin 0 -> 2104 bytes .../src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin 0 -> 2104 bytes .../src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin 0 -> 2358 bytes .../src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin 0 -> 1545 bytes .../icons/ios/AppIcon-40x40@2x-1.png | Bin 0 -> 1410 bytes .../src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin 0 -> 1410 bytes .../src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin 0 -> 2279 bytes .../src-tauri/icons/ios/AppIcon-512@2x.png | Bin 0 -> 5812 bytes .../src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin 0 -> 2279 bytes .../src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin 0 -> 3168 bytes .../src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin 0 -> 2293 bytes .../src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin 0 -> 2715 bytes .../icons/ios/AppIcon-83.5x83.5@2x.png | Bin 0 -> 2783 bytes apps/kiosk-client/src-tauri/src/config.rs | 157 + apps/kiosk-client/src-tauri/src/lib.rs | 48 + apps/kiosk-client/src-tauri/src/main.rs | 6 + apps/kiosk-client/src-tauri/src/metrics.rs | 154 + .../kiosk-client/src-tauri/src/room/client.rs | 180 + .../kiosk-client/src-tauri/src/room/events.rs | 56 + .../kiosk-client/src-tauri/src/room/frames.rs | 131 + apps/kiosk-client/src-tauri/src/room/mod.rs | 38 + apps/kiosk-client/src-tauri/src/room/video.rs | 156 + apps/kiosk-client/src-tauri/tauri.conf.json | 39 + apps/kiosk-client/src/app.css | 33 + apps/kiosk-client/src/app.html | 13 + apps/kiosk-client/src/lib/api.ts | 86 + .../src/lib/components/JoinBadge.svelte | 24 + .../src/lib/components/TitleBar.svelte | 50 + .../src/lib/components/VideoCanvas.svelte | 84 + apps/kiosk-client/src/lib/kiosk.svelte.ts | 293 + apps/kiosk-client/src/lib/native-room.ts | 160 + apps/kiosk-client/src/routes/+layout.svelte | 7 + apps/kiosk-client/src/routes/+layout.ts | 5 + apps/kiosk-client/src/routes/+page.svelte | 117 + apps/kiosk-client/static/logo.svg | 24 + apps/kiosk-client/svelte.config.js | 18 + apps/kiosk-client/tsconfig.json | 19 + apps/kiosk-client/vite.config.js | 36 + 85 files changed, 8330 insertions(+) create mode 100644 apps/kiosk-client/.vscode/extensions.json create mode 100644 apps/kiosk-client/.vscode/settings.json create mode 100644 apps/kiosk-client/package.json create mode 100644 apps/kiosk-client/src-tauri/.gitignore create mode 100644 apps/kiosk-client/src-tauri/Cargo.lock create mode 100644 apps/kiosk-client/src-tauri/Cargo.toml create mode 100644 apps/kiosk-client/src-tauri/build.rs create mode 100644 apps/kiosk-client/src-tauri/capabilities/default.json create mode 100644 apps/kiosk-client/src-tauri/icons/128x128.png create mode 100644 apps/kiosk-client/src-tauri/icons/128x128@2x.png create mode 100644 apps/kiosk-client/src-tauri/icons/32x32.png create mode 100644 apps/kiosk-client/src-tauri/icons/64x64.png create mode 100644 apps/kiosk-client/src-tauri/icons/Square107x107Logo.png create mode 100644 apps/kiosk-client/src-tauri/icons/Square142x142Logo.png create mode 100644 apps/kiosk-client/src-tauri/icons/Square150x150Logo.png create mode 100644 apps/kiosk-client/src-tauri/icons/Square284x284Logo.png create mode 100644 apps/kiosk-client/src-tauri/icons/Square30x30Logo.png create mode 100644 apps/kiosk-client/src-tauri/icons/Square310x310Logo.png create mode 100644 apps/kiosk-client/src-tauri/icons/Square44x44Logo.png create mode 100644 apps/kiosk-client/src-tauri/icons/Square71x71Logo.png create mode 100644 apps/kiosk-client/src-tauri/icons/Square89x89Logo.png create mode 100644 apps/kiosk-client/src-tauri/icons/StoreLogo.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 apps/kiosk-client/src-tauri/icons/android/values/ic_launcher_background.xml create mode 100644 apps/kiosk-client/src-tauri/icons/icon.icns create mode 100644 apps/kiosk-client/src-tauri/icons/icon.ico create mode 100644 apps/kiosk-client/src-tauri/icons/icon.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-20x20@1x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-20x20@2x-1.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-20x20@2x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-20x20@3x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-29x29@1x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-29x29@2x-1.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-29x29@2x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-29x29@3x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-40x40@1x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-40x40@2x-1.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-40x40@2x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-40x40@3x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-512@2x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-60x60@2x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-60x60@3x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-76x76@1x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-76x76@2x.png create mode 100644 apps/kiosk-client/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png create mode 100644 apps/kiosk-client/src-tauri/src/config.rs create mode 100644 apps/kiosk-client/src-tauri/src/lib.rs create mode 100644 apps/kiosk-client/src-tauri/src/main.rs create mode 100644 apps/kiosk-client/src-tauri/src/metrics.rs create mode 100644 apps/kiosk-client/src-tauri/src/room/client.rs create mode 100644 apps/kiosk-client/src-tauri/src/room/events.rs create mode 100644 apps/kiosk-client/src-tauri/src/room/frames.rs create mode 100644 apps/kiosk-client/src-tauri/src/room/mod.rs create mode 100644 apps/kiosk-client/src-tauri/src/room/video.rs create mode 100644 apps/kiosk-client/src-tauri/tauri.conf.json create mode 100644 apps/kiosk-client/src/app.css create mode 100644 apps/kiosk-client/src/app.html create mode 100644 apps/kiosk-client/src/lib/api.ts create mode 100644 apps/kiosk-client/src/lib/components/JoinBadge.svelte create mode 100644 apps/kiosk-client/src/lib/components/TitleBar.svelte create mode 100644 apps/kiosk-client/src/lib/components/VideoCanvas.svelte create mode 100644 apps/kiosk-client/src/lib/kiosk.svelte.ts create mode 100644 apps/kiosk-client/src/lib/native-room.ts create mode 100644 apps/kiosk-client/src/routes/+layout.svelte create mode 100644 apps/kiosk-client/src/routes/+layout.ts create mode 100644 apps/kiosk-client/src/routes/+page.svelte create mode 100644 apps/kiosk-client/static/logo.svg create mode 100644 apps/kiosk-client/svelte.config.js create mode 100644 apps/kiosk-client/tsconfig.json create mode 100644 apps/kiosk-client/vite.config.js diff --git a/apps/kiosk-client/.vscode/extensions.json b/apps/kiosk-client/.vscode/extensions.json new file mode 100644 index 0000000..61343e9 --- /dev/null +++ b/apps/kiosk-client/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "svelte.svelte-vscode", + "tauri-apps.tauri-vscode", + "rust-lang.rust-analyzer" + ] +} diff --git a/apps/kiosk-client/.vscode/settings.json b/apps/kiosk-client/.vscode/settings.json new file mode 100644 index 0000000..2f86c50 --- /dev/null +++ b/apps/kiosk-client/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "svelte.enable-ts-plugin": true +} diff --git a/apps/kiosk-client/package.json b/apps/kiosk-client/package.json new file mode 100644 index 0000000..6e25956 --- /dev/null +++ b/apps/kiosk-client/package.json @@ -0,0 +1,41 @@ +{ + "name": "@pistation/kiosk-client", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "tauri": "tauri", + "tauri:dev": "tauri dev", + "tauri:build": "tauri build" + }, + "dependencies": { + "@excalidraw/excalidraw": "^0.17.6", + "@pistation/client-core": "workspace:*", + "@pistation/shared-types": "workspace:*", + "@pistation/ui": "workspace:*", + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-opener": "^2", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@iconify/svelte": "^4.0.2", + "@sveltejs/adapter-static": "^3.0.6", + "@sveltejs/kit": "^2.9.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@tailwindcss/vite": "^4.0.0", + "@tauri-apps/cli": "^2", + "@types/node": "^22.10.2", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "tailwindcss": "^4.0.0", + "typescript": "~5.6.2", + "vite": "^6.0.3" + } +} diff --git a/apps/kiosk-client/src-tauri/.gitignore b/apps/kiosk-client/src-tauri/.gitignore new file mode 100644 index 0000000..b21bd68 --- /dev/null +++ b/apps/kiosk-client/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/apps/kiosk-client/src-tauri/Cargo.lock b/apps/kiosk-client/src-tauri/Cargo.lock new file mode 100644 index 0000000..78c2a89 --- /dev/null +++ b/apps/kiosk-client/src-tauri/Cargo.lock @@ -0,0 +1,6287 @@ +# This file is automatically @generated by Cargo. +# 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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +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 = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-compression" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3976abdc8fe7d1133d43d304afd42abdf5bc3e1319d263d223bde07b5efc4be8" +dependencies = [ + "compression-codecs", + "compression-core", + "futures-io", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[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 = "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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "bmrng" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54df9073108f1558f90ae6c5bf5ab9c917c4185f5527b280c87a993cbead0ac" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "brotli" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +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 = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[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.1", + "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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" +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.20", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "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.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[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" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "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", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link 0.2.1", +] + +[[package]] +name = "clap" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +dependencies = [ + "anstyle", + "clap_lex", + "strsim 0.11.1", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "compression-codecs" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" +dependencies = [ + "compression-core", + "flate2", +] + +[[package]] +name = "compression-core" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[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.1", + "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.1", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ctor" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "352d39c2f7bef1d6ad73db6f5160efcaed66d94ef8c6c573a8410c00bf909a98" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" + +[[package]] +name = "cxx" +version = "1.0.199" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824894a4a85dca76d4c95c2b9098c036f5a29f627b30c12780774f6654e60974" +dependencies = [ + "cc", + "cxx-build", + "cxxbridge-cmd", + "cxxbridge-flags", + "cxxbridge-macro", + "foldhash", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.199" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1ae0b651ea5b0000b19513aef5a03f194d7e3486f2d9258b658da8677fe9036" +dependencies = [ + "cc", + "codespan-reporting", + "indexmap 2.14.0", + "proc-macro2", + "quote", + "scratch", + "syn 3.0.3", +] + +[[package]] +name = "cxxbridge-cmd" +version = "1.0.199" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb05f91d3fb8435d9bab6ac5ce6ac1868be774325fb7fb2a91be39393b21388e" +dependencies = [ + "clap", + "codespan-reporting", + "indexmap 2.14.0", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.199" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf293202e0e3e98495785745389e8d0755b217e66f19194a5c695c25e03282ef" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.199" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca001d746947c7249ed9d332a10f7a59daedbafeb0ec68c5c18a7db7a93f6ccc" +dependencies = [ + "indexmap 2.14.0", + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "darling" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +dependencies = [ + "darling_core 0.14.4", + "darling_macro 0.14.4", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", +] + +[[package]] +name = "darling_core" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.119", +] + +[[package]] +name = "darling_macro" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +dependencies = [ + "darling_core 0.14.4", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", + "quote", + "syn 2.0.119", +] + +[[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.20", +] + +[[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 = "device-info" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ca8e71544c1b67dcdbc2699ab258828aff985e5bc8d5f6b486d90d7df2f848" +dependencies = [ + "core-foundation", + "jni", + "libc", + "thiserror 2.0.20", + "wasm-bindgen", + "web-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +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.1", + "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.3", +] + +[[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.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +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 = "dtor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1057d6c64987086ff8ed0fd3fbf377a6b7d205cc7715868cd401705f715cbe4" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" + +[[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 = "either" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" + +[[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.4+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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "equivalent" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +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.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[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.3", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "from_variants" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e859c8f2057687618905dbe99fc76e836e0a69738865ef90e46fc214a41bbf2" +dependencies = [ + "from_variants_impl", +] + +[[package]] +name = "from_variants_impl" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a5e644a80e6d96b2b4910fa7993301d7b7926c045b475b62202b20a36ce69e" +dependencies = [ + "darling 0.14.4", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "futures-channel" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" + +[[package]] +name = "futures-executor" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6754879cc9f2c66f88c6e5c35344bb0bdb0708b0352b1201815667c7eabc7458" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "futures-sink" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" + +[[package]] +name = "futures-task" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" + +[[package]] +name = "futures-util" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[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.1", + "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 = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "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 0.62.2", +] + +[[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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +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 = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "zune-core", + "zune-jpeg", +] + +[[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]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[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.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link 0.2.1", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + +[[package]] +name = "jiff-static" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" +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 = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "jsonwebtoken" +version = "10.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eba32bfb4ffdeaca3e34431072faf01745c9b26d25504aa7a6cf5684334fc4fc" +dependencies = [ + "base64 0.22.1", + "getrandom 0.2.17", + "js-sys", + "serde", + "serde_json", + "signature", + "zeroize", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.13.1", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[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 0.7.4", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[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 = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.1", +] + +[[package]] +name = "libredox" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2026a5056764a10b2bf5d56488cba40da507f5493a6a429340e2004d9ed085fa" +dependencies = [ + "libc", +] + +[[package]] +name = "libwebrtc" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4dc5f7413688583d411233f1b38aa909239c243079d5d55dd19686c33253df" +dependencies = [ + "cxx", + "jni", + "js-sys", + "lazy_static", + "livekit-runtime", + "log", + "parking_lot", + "rtrb", + "serde", + "serde_json", + "thiserror 2.0.20", + "tokio", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webrtc-sys", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82" +dependencies = [ + "cc", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "livekit" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44208faa5d473486f5276d809e1f1a4d52a3642485327deea026706f1fc476cf" +dependencies = [ + "base64 0.22.1", + "bmrng", + "bytes", + "chrono", + "flate2", + "futures-util", + "lazy_static", + "libloading 0.8.9", + "libwebrtc", + "livekit-api", + "livekit-common", + "livekit-data-stream", + "livekit-datatrack", + "livekit-protocol", + "livekit-runtime", + "log", + "parking_lot", + "prost", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tokio-stream", +] + +[[package]] +name = "livekit-api" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "106fcb7c471981f5b6bf5794a7dd4081873bd9d69a0573403c9db345e5d92f13" +dependencies = [ + "base64 0.21.7", + "bytes", + "device-info", + "flate2", + "hmac", + "http", + "jsonwebtoken", + "livekit-common", + "livekit-net", + "livekit-protocol", + "livekit-runtime", + "log", + "os_info", + "parking_lot", + "pbjson-types", + "prost", + "rand 0.9.5", + "reqwest 0.12.28", + "scopeguard", + "serde", + "serde_json", + "sha2", + "signature", + "thiserror 2.0.20", + "tokio", + "url", +] + +[[package]] +name = "livekit-common" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f903bfee33454f21c553dbf14d6f4ffbf062157b23b04fde9821cbb94ff01169" +dependencies = [ + "livekit-protocol", +] + +[[package]] +name = "livekit-data-stream" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dfdf91af5f2dade508e2f81c7f63c79f77461f3d15cabe6b7059fe5f2839d58" +dependencies = [ + "async-compression", + "bmrng", + "bytes", + "chrono", + "from_variants", + "futures-util", + "livekit-common", + "livekit-protocol", + "log", + "parking_lot", + "prost", + "thiserror 2.0.20", + "tokio", + "tokio-stream", + "uuid", +] + +[[package]] +name = "livekit-datatrack" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "376a22d6dae592bff4068a551343461b8e683ffe70aab92e037fb91cb9237ad2" +dependencies = [ + "anyhow", + "bytes", + "from_variants", + "futures-core", + "futures-util", + "indexmap 2.14.0", + "livekit-protocol", + "livekit-runtime", + "log", + "rand 0.9.5", + "thiserror 2.0.20", + "tokio", + "tokio-stream", +] + +[[package]] +name = "livekit-net" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46155c42ad7acccca96a0d8be2bd0f379565f93e85144fb3aa6fa406371fee22" +dependencies = [ + "async-trait", + "base64 0.21.7", + "bytes", + "futures-util", + "http", + "livekit-runtime", + "log", + "reqwest 0.12.28", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "tokio-tungstenite", + "url", +] + +[[package]] +name = "livekit-protocol" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "526f22bddf409e5f15449d55cf341647d7c16a1f43df9db9b05be106e4208e1c" +dependencies = [ + "pbjson", + "pbjson-types", + "prost", + "serde", +] + +[[package]] +name = "livekit-runtime" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532e84c6cdc5fe774f2b5d9912597b5f3bea561927a48296d03e24549d21c3f6" +dependencies = [ + "tokio", + "tokio-stream", +] + +[[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.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +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 = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "muda" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd04e60bc0b07438a6771710ee1698f98f6ebbc7f89b61264af1563b8aeb878" +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.20", + "windows-sys 0.61.2", +] + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.1", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[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 = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags 2.13.1", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[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.1", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[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.1", + "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.1", + "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.1", + "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.1", + "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.1", + "block2", + "libc", + "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.1", + "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.1", + "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.1", + "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.1", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "open" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cfef937e9c486488c7e3d949ae31c0f1d06bdacd75b99c086cb35356e30408" +dependencies = [ + "dunce", + "is-wsl", + "libc", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "os_info" +version = "3.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf20a545b305cf1da722b236b5155c9bb35f1d5ceb28c048bd96ca842f41b5b" +dependencies = [ + "android_system_properties", + "log", + "nix", + "objc2", + "objc2-foundation", + "objc2-ui-kit", + "serde", + "windows-sys 0.61.2", +] + +[[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 0.2.1", +] + +[[package]] +name = "pbjson" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1030c719b0ec2a2d25a5df729d6cff1acf3cc230bf766f4f97833591f7577b90" +dependencies = [ + "base64 0.21.7", + "serde", +] + +[[package]] +name = "pbjson-build" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2580e33f2292d34be285c5bc3dba5259542b083cfad6037b6d70345f24dcb735" +dependencies = [ + "heck 0.4.1", + "itertools 0.11.0", + "prost", + "prost-types", +] + +[[package]] +name = "pbjson-types" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18f596653ba4ac51bdecbb4ef6773bc7f56042dc13927910de1684ad3d32aa12" +dependencies = [ + "bytes", + "chrono", + "pbjson", + "pbjson-build", + "prost", + "prost-build", + "serde", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.14.0", +] + +[[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 = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pistation" +version = "0.1.0" +dependencies = [ + "futures-util", + "image", + "livekit", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-opener", + "tokio", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plist" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da1d65da6dd5d1e44199ac0f58712d241c0f439f80adea8924d832384087f85" +dependencies = [ + "base64 0.22.1", + "indexmap 2.14.0", + "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", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "portable-atomic" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.119", +] + +[[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 0.25.13+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]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" +dependencies = [ + "bytes", + "heck 0.5.0", + "itertools 0.12.1", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.119", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost", +] + +[[package]] +name = "pxfm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" + +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.20", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" +dependencies = [ + "bytes", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.2", + "rand_pcg", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.20", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[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.1", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.20", +] + +[[package]] +name = "ref-cast" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.12.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64 0.22.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 = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rtrb" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ade083ccbb4bf536df69d1f6432cc23deb7acccff86b183f3923a6fd56a1153" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.13.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +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 = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[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 = "scratch" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.13.1", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.13.1", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "jiff", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8705578779c2b6bd90d84d66eb2e206b708b1a4d7b9f17641b293545bf1c7e46" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[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", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "rand_core 0.6.4", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "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.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +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", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +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.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[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.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9" +dependencies = [ + "bitflags 2.13.1", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "once_cell", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "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.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "667b20e2726d572dea2de7370da16e188eb06008faf9a92fab7cdc46791190b5" +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 0.13.4", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.20", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9ce40b16101cb6ea63d3e221567affd1c3a9205f95d7bc574941a10636b632" +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.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08279169ff42f8fc45a1dbc9dcae888893ba95288142e5880c59b93a26d2cfc5" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png 0.17.16", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.119", + "tauri-utils", + "thiserror 2.0.20", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b394794f399a421811d06966343e7933fcae92d59f5180b9388d1174497a45" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74be5dd4bed9afbd145e5716b5fa2ec28cbc29c34ffa61c258c9273d896c8020" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "walkdir", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e1bea14edce6b793a04e2417e3fd924b9bc4faae83cdee7d714156cceeed29" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.20", + "url", + "windows", + "zbus", +] + +[[package]] +name = "tauri-runtime" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0b4bc95aed361b0019067d189a1174a603d460d0f6c72606512d59fc9c12ec8" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.20", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e6fac707727b7a2f48e4ded90976324267371073edbb415ffb73bb0458d203f" +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.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e176a18e67764923c4f1ce66f25ae4abe5f688384d5eb1a0fa6c77f3d90f887" +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.20", + "toml 1.1.4+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.4+spec-1.1.0", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "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 = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[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]] +name = "thiserror" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl 2.0.20", +] + +[[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]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", +] + +[[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 = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.14.0", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml" +version = "1.1.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" +dependencies = [ + "indexmap 2.14.0", + "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 = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +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.0", + "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.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.1", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "045979e3f037cd18ad1cb2a419dfda133c5c29c9f3453370079f2255d46c257e" +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.20", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.5", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.20", + "url", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[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.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "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.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +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.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" +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 = "webrtc-sys" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21841b34f7edacb80525d1de89b886589e44b08b015548bfaca7beb0ba0332ef" +dependencies = [ + "cc", + "cxx", + "cxx-build", + "glob", + "log", + "pkg-config", + "webrtc-sys-build", +] + +[[package]] +name = "webrtc-sys-build" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d46da6b5a5cbd091fae0400f77189f4ca4807c0d9442b85838a584f28720570" +dependencies = [ + "anyhow", + "fs2", + "regex", + "reqwest 0.12.28", + "scratch", + "semver", + "zip", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[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.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.20", + "windows", + "windows-core 0.61.2", +] + +[[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.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[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 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "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.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[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.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[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 = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wry" +version = "0.55.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" +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.20", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe18fb60dc696039e738717b76eaea21e7a4489bbb1885020b43c94236d7e98a" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 1.0.4", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe96480bed92df2b442a1a30df364e12d08eed03aeb061f2b8dc6afb2be91119" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" +dependencies = [ + "serde", + "winnow 1.0.4", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +dependencies = [ + "proc-macro2", + "quote", + "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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "byteorder", + "crc32fast", + "crossbeam-utils", + "flate2", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zune-core" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" + +[[package]] +name = "zune-jpeg" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" +dependencies = [ + "zune-core", +] + +[[package]] +name = "zvariant" +version = "5.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee2a0bcd2a907786a456fff45aaaaf54c9ba5f50b71ae9ec1a4edd200c94911" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 1.0.4", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38a708216a18780796770bfe3f4739c7c83a3e8f789b755534bbbc06e4e23e12" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90cb9383f9b45290407a1258b202d3f8f01db719eb60b4e4055c6375af4fc7c7" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.119", + "winnow 1.0.4", +] diff --git a/apps/kiosk-client/src-tauri/Cargo.toml b/apps/kiosk-client/src-tauri/Cargo.toml new file mode 100644 index 0000000..d545147 --- /dev/null +++ b/apps/kiosk-client/src-tauri/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "pistation" +version = "0.1.0" +description = "A Tauri App" +authors = ["you"] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +# The `_lib` suffix may seem redundant but it is necessary +# to make the lib name unique and wouldn't conflict with the bin name. +# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 +name = "pistation_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +tauri-plugin-opener = "2" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +livekit = { version = "0.8", features = ["rustls-tls-native-roots"] } +tokio = { version = "1", features = ["rt-multi-thread", "sync", "macros"] } +futures-util = "0.3" +image = { version = "0.25", default-features = false, features = ["jpeg"] } + diff --git a/apps/kiosk-client/src-tauri/build.rs b/apps/kiosk-client/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/apps/kiosk-client/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/apps/kiosk-client/src-tauri/capabilities/default.json b/apps/kiosk-client/src-tauri/capabilities/default.json new file mode 100644 index 0000000..4cdbf49 --- /dev/null +++ b/apps/kiosk-client/src-tauri/capabilities/default.json @@ -0,0 +1,10 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": [ + "core:default", + "opener:default" + ] +} diff --git a/apps/kiosk-client/src-tauri/icons/128x128.png b/apps/kiosk-client/src-tauri/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..3633d54831601f9e4a2aa02cad7731ec3c9ed23d GIT binary patch literal 1572 zcmZuxYdF&j9R5$cxFjQ*a$LI5g@gyCm`g)r?pBn`=ur_$;N;`m-=E59EHvcIsY1@?-9I5VsuX0GCf)Ad zd8z+}OMXWRuXf`eJ4~LasN&`xt!t*1JI}n4`TbUO)uA9+NgZxqWEE@Z+nu=sr~s;f z$&YjYS@a!1)ogMPNfShtDQt!L;31)F&*pU^k`2C?O&WY1-s~&CXiFM~ysvyXj z*M@_nywCedq9Ws0kgK&p>Q z>fzcMZO(p`hRXr>I;Wb(Y*oGlz2a@+?{h&=2hf?PboC(9l~y2ZONIbr*+J! zfW8f8Z538a71kPz4@XZS!M#D%DN9;JpkNQkqU5C<>U=_xv(+WE@U*ds0G5!|0cP|k z5s7^bh)`Lm#k$A|_eUaQ3lOcDHWD(pBp;D|64o#i4xD7%-!}C5vq$Fq)X3Mko^dip zto*WxD`Iw&{Px-7loI`t#-(?Tt3n2)eK}7Jvx1n;mqNKS^l+I$V@5aRSGh=0a4x+I z#nN?4ezujc0*QoePTqN$mbX1w)*;op19Za=s#CC056}*Tpj}>KB~A@z+;`K;jLaaW z((b;9cS>yOlIGi}JSRWcK~R*ZK~sGKV#dCCT5E8TX#ls86iiT9jxOniAmFhBhhk>? zyt*M<9*cU|y=(kHfUKY==G>H;7$p|QoYWYs?n&T zIOe)}(nQC@0sY;eunbfM^(gP$#=2d4lmXXsv(?}#yVEgycu?p>Y;Tz11|hl9D&L9y zHn_H|^w>sjQ~s4atlmi50O|aG4IhM`K=$op%lBFTo|o{CFYaBy{pI=k?bzR5R(-s3 z#oYwh5C{MRaKHrsKrY2#tJn`-?9WucGlja((Eh~HwvXmPr3q90yVv5X4^CFJ)SaTd zQC(|VElyH91}#~@IHyM;<1r-3MyoHxh2YkK67MSOxZ0YSxA_L1AgQY`a5AieWQroL zwJn|zrkESs^CiI)*6r5QX;qw*V&7HI-_0rJn<+|e*&`Xf?jnYO(Bjx>$M<%Y(%U)0 zM1i=Rg-jjH)6!DYgmpHqifkY9t>fq0T$$^nD_aa(IAi=9X5fzWeud}4xBL{mb(cLc zEv#o-L0?b&!3%;Iw*4guK4!mmyjkzMsZOrur*iu3ak7sMqPD;=-Hf+)LU8>19o&%u z*iQylsL-rDr|>Z7*nt35%UE zs!2X9dmy_nbjb89!S1J;_vYDRl+aME#Ai-V)V vAS0C{ZR%^*JKdmYgL41J$v*>F-%1H9JL1J0m+Q=~q(6Xm_eIsX;j;e$xMJw0 literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/128x128@2x.png b/apps/kiosk-client/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb650350c1e2ff48d9352c7059c5e9a8f6b7120 GIT binary patch literal 2537 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 literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/64x64.png b/apps/kiosk-client/src-tauri/icons/64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..a21a7a58cd358d63e48bcaf4db3359f14ca94db4 GIT binary patch literal 1218 zcmV;z1U>tSP)2hzLByerO2uLd=Wi%X4t)_}iIt8S$LZ0FgYS zbmS`7H>N+*N4xX^=6=9q?h+8SXGlC@-ps*>1|W7``c?x31JUaA(th9tBDD|Bgx=kZ zPo{(RlKDgj)Yg71#jGWr8wbcU!u+2vZ@{~q@OP=;OFN?UWPH#&V|e}X7wGMSM+QPH zd12nWxd3!^pid8g!V(pvR_P<@(cFu9s1OOFmAo+TI6C<<3>0F{mW2w8k1N38LMt1i zrzB{0(ORv=s-bXbMJ)4_Tw?s9(P#vYAf7Qf!_UlSvlzIh>6Z;3q~}{_E+7;0JP*d> zG5q}T6-Ipa`E#VMG9jfkOeYg~`|blwr&BvF%rrqi;j`8{dpR_j42fi9axY(u84y1) zL9JCx(-wW}*`VMpl99=IDG5P%k6NUEl5`luXbDqM6XrxwP16tcfVKgk&_gU6pscaB z=vxIq6i}>jWRTKEO73Bc^sNIRepp;lWRSAllv$Ee)AX$YU?-rI4MM~Zmjx=W>)NrV z=w&XCT@I@1`j3K^ydz?!3Vm@X?DpFWxXuQ9f#zd-1hqY~c|Bx3!I_?aKdY3cZ)`3g zk{9M}KF@i*JME2!VOfE7DNK~P-V3onOUp#Ql*P>~8~A_cM6gtZiDH#!$s)Fi>K`RJxF zFJr6J{5qKnV5%w|TxPq$vZ`;Va{&o*#Lt%nLRI!G)JlpTTIj?Q#h~z79;+*WSki0I zheY1pw8RTNTn2WoOJ1V_0FfW|Y@I!8W5jhzHZF`;i5_rGdKn8hMplUviU9~CF^D%A zy08 z_9iK^wn&`d^IRu>+~3}=mwc4*9{i+{61+>)b literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/Square107x107Logo.png b/apps/kiosk-client/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..225e74f7392ac3d6e93dd53ddb8c0950c0a2fa6a GIT binary patch literal 2345 zcmV+^3D)+BP) z4ls2LIV=JOi;2Nvu$UMuCI*YaVq&nE7%T>hse{4tJh5*GY!*?xbS?)jSe9JwccKwc zjT$h;Kn>)-M6+@^&l<8U@9>B6IoFaO2nl&?Ww8X?OQxnC&Ks8j;Qd6z;=m{O^STho)d{-XVPT6S7pw3veq?0?BJv z465Zy4>Bb8ML6gf7>KkGmip?TW-(ap*Q`L^q79}y+aD`hpLd#srqc zh0K#~r45$lK&9}HlAm&iq}k-;L|GR}g)OHGEIR|z zVnfkHvq)~WDNw``$d$eqM?RZmt56@UKwdK0QFkFI++`lMa$UEj{5;P?c`Yw2+qPTE z4>~bLLV~SUt57HujN5j1cP{~j_z{RRGc%F+5hxD|n1nt%J8R4@o6UmbII#fc#06A; ze?RQp`IHiJxQ`aByb^xBI1c%Iz6MypudlBU_Uze>29BrUXwFB_kjMD=Z!kSQy-2_W zR8LP2?B4ZK?YUtKili7Ef_~}JWtf_piUqK?gGE9njUu2%hEG7%qo3*7GW6=Z_Phd@ zFHb0qAfXairBVsDZQTmrocbF5JS%^ECaOo=>#kKQ#|;>GW+8zZDd}BpfWM#$Yfin+c_Ugv*e^ zNHc!T^}hbOVf+^QwuUr|VrLYDrRX^YW&K#6#^{|F!;Kp^Ad|_|VubXytE&sHT)hf= zUw+jn_et`9s(kKGzhqGs(Tygc&`Y9Xs zzkUeLkBvcZZ?8WkqQJds5waTxVDRlTMgbW+4KP0P9^Ct56r6OQDlcCXYZg@@QE>~I z$R;%yjTDD|M?jg>V4$JhSQF`4u3Q);B8(pv@3>gf25ZzB1fgeW=uU0AH4{NZA{5j` zWgns~d#pMnkSp3&3!xKhH0vYRU@$RQ3>FiE#l&DSSWLh*7_F;?Xmt(7LLVh-7RZH^ zcxz5&ku`@`2e8oR%KGhDGI58t#FrwW9UnqJvs#P#h{ldC#ri0OWD*+`jTwTl^_^lN zZJ@pHBF4$di6h}iL0H;xNE_KqqwZ8QK>$BkgF(@A3d+g|QTO^93>9(5h-_)*23$OS zC{onja=KNlu;alZVbXR^+8Rnb4xt74r=X^TqUSBiXQ{}00jBSat?ztR02uALrLCc@ ztihl(N6RwB2$+-V8>N6LCyss{odmuUD`%tR|**(TU_}a(o@f27v>)ObiwigT-JmF<1;%Xnx0Qc8dQh9%C;eopR+D`N{;I z%kPC_YIK5qxj<(L{P=KNkdCzYEa%-c5g4jq3Ojj zlm2_)3(b`B@He78jg0Js-8kT3FSCf+W2S8}I(8eyP!LJGW=evK^6n$K*W;j9)11(o z>9SM89z8BfZ+$FZuq_xv?b1HW6Qe!C_29*CKNY_mcwc4;{nG8Eo9Ub;dv)YF)JjO+ zt!*wGS85TdZ$Z1!FJ(EAx9<%_wg$b#85T!Q32Rs_r4ZpZ4~3Mqz$b~Dh#L%U@;{REOZTWLm-9>o81N9S;XqLNXAdl?(UPw z2d|ekX`3TsEvF7`lAUw;U;^lkkK{9H8!npqS!EXnzxzy#vt}94!JK?FgU>HlK&Gqu zgQk)N%PYzmy!m5Gl(9zb4j%LVw7SGYse=Ai`!Y66r$FGbE7k9Z#GQ4ZS>(4_a$nAK z`l{j*hE}$tUKEUP7#C_Tq&ArdohVVb3JinObVE1(lf{_im1#%rJU3)jgZEkcYZksZ z1}+8O_1SHS=(lE@pLhcq5n-6pvs9q9f-%W;XJANm<25Zf5#8HpGegMXpiP6vDxi)1 zUUy)LAR8qk=B47E`u%?T{a%NfRh=&_udYC|VqI{tziI0Cx&sTRl}%lEa3-!<>5gz9 z=GUyk3~X8_VEL94CDzIV@~h&kN*BvcG zFIQ)fblSW_$l-T{%i$&_j=D2gObiwigT-JmF<49t7K6paU@TkJ_!uo658!1Fl8k3N1_cAP z_&O8*Y7GIL|Fl;X6#9%Uhp|Y!l_l-7rR>@AJD8%=@?=(Hk-dDeL{YgXysxOE<70S~ z99whea@e)-));K^dYA~)zqd?2cIv(zmnH9PRU=xZ^}x)ixw{_{m<3S_%%Sub@}hxQ?KpW zF(yLj;muPvGOhReoP1+CtjByaGil@Z0hGtU_3bFun0usk0k#7nA4;!woZCONjik}( z{v|`<=A;!c9|nVQ%a;QK?dC2y>SXg-u}RCKFCSjkv>{I^#UO`0L){JYbvFdorlLh{{GQv2Uzo%B>~2Ah zlt1q*ZO+#$Tg2V>fTs2SS%331{ujF)}mo6X?>Q_htqdE2Lm(B)y&|1Va zq={~d#rJqC?7*luOBu>!ku-wjak5lA+g}*YcJTxKd7>M!A*7!`pLr2_d>GfOI+0vH zMx&DexDk@2wfy*b{eXJutcU9U2F5jRzZbt+WzupWXrp4X>6mQ%1>NH}AJksu7m>O! zi24kdbE6id7^%SuDT}_16WmWV?F=KIOk{+*4^Xzg>YZ2oBOJ%dlrT}nS!tA-eD`Sr z!0#YolQ*SzU|#k%I2*?t-=I=v(gEX^F~7Uf$l`_Ici( z@LL(hxz;6XsS{HaudX2If2jY$myJ!}nE4X}s1Rpi6gqbl2n`-LReD`KkNB+w)`HSL zxoM{MNOIaCcs(WG(}Bj2IQk=6Cu~X5af+C8X~eu#bYWp}se!8W?qo+~$ku!BM4s`s zqx(9n&VR{5G`V?>JTBVA1)OkX&3LrzehC~1T>tXKjy>po8vJxU;_orUd5JrsmmW!q zyB_m&Fy>N6pP2G*P{hPDypSoftw!03f%JC&4#%~I%a-Tj!SU+ zGbPdSe3|of1sss*Qua$dEX(ADsSUZG8*8hf4PQXyJA4J2!>FY=)(24{%T7RJ6{(0Q zs1O++Efz8gX~vWeLD+n{9JYP)iS+mOWMuojBDdTc7Kj1+4N;KJMoLcvUye_7J@>E_ z@{d?bf@d!O)XstF9?B27}P$t;gCSASs=A@Y&Lif=_lYYgBky?m0Tu4=|Zh4O`7`|Sc$`R-+mr;Me zN<+NT+$fJdbYL1>|2B5)veH0pBR3*l&YP>N5JoICleFo}%YY(-lQh~73D%PIc(!Ja zwxJCg^;&rguk@SKuX1!;& zx*352I84Ib)=k>(84ftJ@&?wXDHiJCxbGT2nkD9nnqBQ|Nh4Sy(S$W&6(&XK(8`o5*wTK$490^UId)D;)^m9UZ2rS zdloCk?jG5o-J2rlrRBUVSpz0`R1M;2h|ub%-GK`r%B*%)UWP_QP`*rs{rC2{+_?NT z9Vr@8v=HsAvN*{xb&@wVfpJk7cMKo*Rg=lN1WmVsTNsO&qYb8bvysn6(XIml_hTxV zL1V>>t4MA^N4Q&4pJ?kIi-fK7XdqVeh%uR2OqS@OyG9^|q_pova~=naN^c%&sxT=2sanGZehP#YSbArf*Pp z>f1T$ie9^ga$R(XHz5*_cmKtLjNF!3^Z-7CC~^3}(D_9i?O(pnX}+RVC{*x`#nnl$ zZ?Tr2;kH|%ihaFA+9Rm+eS$tpG=((L8`TBrZx er0(S$awO~3ZcA&N)F2$$DD?c#2hlDx>%Q*aecvf|a0?Ld2oL}OfUGRfJM6vq zpNF4!?>6EIp8^1Yo>u40oUYT^1e;VD3yDrIL^SnZy_Mhj>;dKi+V&fFMK(ocx;mWU zkOQhbr!)8!;in;@@enV5w+eA_RX#<{R$0X}sSvS)+ETs>;^OgQeA8(Lcmky7{LL$b zQws#bqeUo_m`~BqBBW!6QX2zy;{0`MrXSsCMzq8XdTuj`8IUXcfFBQtwk7~1{~$s5 zz0ClE`;el0@YVqyb^bm0YqAITCP5Y&THxjzrmBYbgr5Y-DmP50zE)GCr`{kQVLYDX zT*0A|n1Y8UPl1fSC2s!V+AtzL?`ABV`k~zFaJ8Fb`}4T(kB+aYJ)bxN{M6|Rmn5mi?gL!-zhvtDxD!z!5j9alm+(1nU6!tjk*XKh`(Ly}E| zCik9TRleMdiQil!Sk+_0FVwy3dEOfS@Apr-lGLm6lJsmsQ8!XP-H%Jd42KOB*(J5t z#@mb)rZYGS^oV|jc(hPUQB`ecbx6D#3ss!9ODKW3O%0`D50~w8S~lsMuATh*#5M!( z2NkE}euG?XkaOMTbCH;OAM+wVr&`IVGc)j`nNqqa!q?0=sfUw0IV1ZPaqK5`h%S(8sMm6!9ddv*MzIT3?(qs! zhJ$KHUxlwh0};LXK42IQ_liV1F@UNaEnZuT4h^Qcgo$b#pcvN{gW$54A_>aF>m zd(750e7!idFM?V>9y+^th2PffcWP;_sE}kt&JtD$p|S69%{VD7+6r|y36GZ?*ZXkE zwv`^Y@R#B8hA(rA&7sQrVqt)wQywfQ6}Pw*>&1wJEI(H8qo@HuE##>Bio7{n;1zeh ziTe6;N!>w59|Q6$GWh}5L#M`In7F?@T4UH>R_V4(vQG%V|$=XDSugTYsk1Hdol&b(1Ah3K}j`@exYI zn?AZ@j$)gtnb)BLTHVtizlnW>WajX(Nj04l_PKQT8Pb%|`uXrow+EClZ(>`ga;IXa zvQKZOLK$#4>rJ(idY~PYqtexij<~!Z6|wh1cf$TPHs}}lur?-%5u+5s$QgL zA$NSb!2n`ajp7A@QLzPR0b{VH!yidGt%2P)l+S2a6(sO1f<9qBh|Jt+-u?fthgEBW* zzV&7fj5}UCxmSlx1=62O2Q)4^v+#ZRs*^>MzhKm^(|b)%7^I zwufMG0@2C48>5KuDl)xO;KCiGOM8QiTBh>xWm*HoVmrkS z)Z%t=ZQ$QkjEtdt)01#E@3C%Wk47ID)F!&0b%M{cwAOt>hyEl97C`l9C(FMUFL7;r z)>2{bBC&{uc8MfaH|t|mZ-);AsPt>|15X-0jyKc`v!8fHT3?2g7=m9i{suiTuJU0S2n zoj!-fHqQn+$U)^C<#LwitDA|+FpZ?GRyrsJx0)SxDdoqi#A9{zVs-`;V41r0Wy{qt z;_Kbo4>J(AYe$8=)1+lamTY;uTy#1}Zoo^nKh=JHxm)~e1tyIS-Yta1?FwY7mVk1C z#Pj+wt9ff3NucqrLAR)p^8o4wOJd2Lxf`6B(|PfpSm~Co!jP`^avDy z-hAOf4&KY~CS~Hm?*@*)ToA$gEk7Qn(Lj82i+pi7`!Z6yPd9SQazrFnd+Ad`1Albs zt6A%a^`0oiOW?Rzd>DfNcTE1X27B4Kw-MHSc*Pn^agE*M(V3Zt->+wz3K3}*>{1)w z{+(-Rs;F9WaQcDtqeRU$*6F;)lC`g^PLz(yMhkqMuv#AD={e0UnGYY>ST(DM&rGG~ zD5WUrahkiYR>*S4&n4_k2m zG?`qWbD_TT@K(&K{h>8rP~uS>rjA0R1e8-NwI|pzFn3xFr^1b!LCy+tm+p@`$`Hka zA?3b%6#Om?|7{A(<)8hhV^gB^7@SWGUBz^c+~@BXLa<_;P1S{4<4Rje6o zjebei(_Z#^IdE=e{I#6^dwo!hx=>sh7f!nq-{qBDUF?Y72Ai;AT^*T}kPPHv;;W^h&73qt|p z&o$YH&OHemp+Q)*@r@x{|JbuN;qKoXIyBxqM{10m7FuIzfkP+AO@*QTCyW-t1rHAf z!EC&7;Lq$+2(M$8L8Puwz3h}fRN!y-L&woB8oh@XepRAR?bTPmAQ0TqcR=(;?w8la z;Kb6+vRAV^>#Yuv_ZpKQB11k@Z&~7e8o2H!qXmVlrLtxsqXNUR1%UFiJs{Ru2)49} zQaRiVoiQ@i4LAzRVxt}ynMcN83%skY@*iJvnwm=<+<%i2j)7aupZF*nP+nn;*>5D7 q_?h=tN&64=|3`?wnp{`o5x@fO&0<6s8=PS>8C;S_wd@5c5 literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/Square284x284Logo.png b/apps/kiosk-client/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2577aab29fb5684ed25fef3e273453fdc5a6dba1 GIT binary patch literal 3526 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 literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/Square310x310Logo.png b/apps/kiosk-client/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..025c48b8834560b4314d3c7f618719370e2edd7f GIT binary patch literal 3621 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 x`(MB6|K0~SU9vPOyKwWte*m&K6hi<2 literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/Square44x44Logo.png b/apps/kiosk-client/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7ba7baef59d0eefe27fcf32682ed91c22333dd88 GIT binary patch literal 1870 zcmV-U2eJ5xP)ES8=z*Xd;3konJ#aG~GzN(4CSZ)Hcro$d zK}7KYCI%%c7j_B6i(E`Vqk&EEum)v;*`Jx7?ymBERo%1mx9ko(D`;pk^h{OttFOL# z?|ZL$UHXq*?tQ@j8epZwrV(=PMUZ2|6q1x0-$jI$@3!IIy(~s|cv#7i5vjKAQ>%oa zA=1L*Wr%ihR!0`C?LuH8+8 zYj!A@2DY}chUX-=ly6?9zsFBeGV=hp1vOwn7_@FM`w~95!Z2)@JYIz3IFS%3^J$SP z$E_^{n_eydMSTx%BoL_l+v#xRH_}ZRcHLBgv<(Dcl-c_x=hQzo53u-VCAN@<#!nj)o@*#RLPUR2d!F!P8-Bn~s7 z4kN>g0^g@%u}I&Z{EGVfixdPtv#DssiXy%9?jbsK=zU73({%Xbk7&!5%~UE)89RkS zp3a;ZrQI(NQKeF$J$r`ejn`kJ>(?ilbxE$9pc^+PY3sJ_G&woRi%syHBAQz-Ez?P6 z3t$HZiiS08e=d`vY$nT$Xfr{fP@vv?&PW~>*? z0<7=*1~BpD9LHqm6YS$QK+$h525j4e8H2HLf9%V!sh6vkfExfPKJkQLF7|)4g_>%8 zweN90jmF0P2v*o!mf{Bi1fMlqicfT9v+NSa=QZ{A7RX_6{k{2GKibfTF&K-h*jJb{ z%r-@LT|yfsDy#+wFzd6S^+^UWIyT0UpEf>u8W+=Xl8cCJe$kr=%))8X!xxI>54^%ng$`U>AmR9D(8jbX3@ZADUm&c+IW0E5rM4ZtkGKC|IzQcX2j z$cy6&fiiuM(!i=GIQ81CXUyc61HLD$?}={eFdIY$1MpZ!p#}&r>yyGT3$Ufqbd>3O zOq)r$JVu2cp?nRzs%6-54YSmN690b>p9RqmjnB%6+1Mq}hT;ih zq=TXgi6dEa2^|)QsLQF@R$aa+WSWBxIt%H78X&-MH3yx;eS+&&Tekk(5_B3hS7t!~ z3k<+gJ1@+4;!qyT)ynm(m+ML2r8gBZabZ=FOv&~Phn&hCb8?YESPf<9sXLenZ;qOy zM?)mS&TTPJ;o#(y1hy8yBBW$04^gM2IsJ9`)(S9vuf>Bj;y1x+c1OEq-b>(6%$Q=p zYc5(-Z20PINq@;RRdgrShy^S78I);T`KUH%&aKd44tTE5C%jpGipM0h?&xq~>Y}Pg zX;#In_zkRGeYf`fe*FWp`K({DE|B0dnOQ%5@_=}*Ywy;gG6jbjv1xc=KX{P$VrsH+ z2YOsBPaKw9((u+bIE4A%Z0C+wRc1O64S|s_lD4A;Dvp91G{e) z+Ze@*mWmSG`N!7>E2BmREc)y!iL`p^$E)n&B;~QU1Bp6 zIA-4?ADf=k<6N}N=r%8QS>J>fLN|YJPN=@8b8PF!dfSW3O&uwV67k;}y7!lW&TMw( z5^Q+qPVHRj*Rp4jmIQoyg2W>?ggP!o*je_!|986kfE%uV0M*WDqE&`mGynhq07*qo IM6N<$f+Z!3#Q*>R literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/Square71x71Logo.png b/apps/kiosk-client/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f42e3e4725639e7e7ded536841687396ad2a9634 GIT binary patch literal 2377 zcmV-P3AXl$P)UL+)+9BvMWL?8izAbt)JNiZfBYcDK2voqaYmG@P5&vy6pbkBNbJp0pS z&3dN0tLoKPuipFKt7@C7(zn{_3A5JtfAep@muS2gcd0?vg0v2;kv3KFNAJHCCWIAR zT{B)Cjb-|4-ii6ivxvg_CWU7%Q_j?Wy@~ z&Cxn<0h1+V-)^99itA~mQrDrGf<$h;P)9YXAYDgrKT?Roz5?{qN6vU0#^&f@!iUKC zXa$3;jMeJxPq23Rw9#ty$C!nv)f}3dn&R)<5`FXahFQM-ji#h}eJ0gctJ$PZ$Lnt> zxJ*w^lWp6nzT(L?f3%EdevGk|0mk>~$dMy-*Ijo~5ClEm9|Ag#O}&M1pZ}5;78cB4p-C^jc!o|a z-al2#BRp`>?|It17-bc-*Zw9@-zD`d(_G>!*(}&3m0EEbdg*+hc|Dom6bm78Z z>G0vhrmu-cKmHZHmr){!}F(#VLt zJ$@#-^JlK7PL=GcGJ*RH92ih|B^W~3i=@iK)f+nkGAD8jIp4=8X+L6D-(y$>bxC2| zZqmSmGeM4F-1kVqfgIp5aM$ok{Yw2%o%xJTaiqDqIhuAI^T{i?pYmc{AMKzVnY*cP zUyx@M_}Ig04EPEN9(WAgY}PAbrZJ$uz4<1)=b9mW7;q5y^y=Ajw7>+?^Zg!I?l6H{ zVKS#v@j%M2ur24|Z0a#(+$+l_~c4s6888cMIN`(+Tu@C~tK|+-DG7Zd9E9;9! zKm)W4s7=j7#1791ki-0$tnjz*^5QB=lqa+2diQ~YWH{2fNNr}lRh-I1tdtcV?mF~JZmze&{ocMD z_D0y&aWdX2+}CA$Y@EWx!GShF5bP2l8D7M55JZLm=x$x`nAmIe<2kX$=_oboZLLx3 z>&-%*qx`Mz&euc(PwXpU`vkiLWegcH5n?5P1m+8ZHwZ(<^P2s)#iZ`Dx1OPYzx`|} zL$;jy&@SEH(LOWv-+jRL$xdS{FyEcVRyydgwb4VwR$@fpL}yVztctdSkv5jvkIlA8MU=ufSeRt*< z{osKYw?h@Zw@;wNuR#{30k5U@9XP@m zdNHiGiVSiUK19wzhX)A7_$`bWC^i{m(IQ%1dH`@t7Qr%7+epofRWLP(`j1xzCQWu2 za`YM>JBJ>$I^iL$brybXQM(S~(|X~Ni11L^X2B`9Q52uYJCAXfs`Z0U=~;h<>aGcU z#~}%yhprhXIwJ%62gjw092w{oNDK=2ArtS*%A$MtLQ`}E(#T^0sg2BPlQz#kCpNB+ zOOLoLFKerPJAG!^bSs0SD5=(*$zX6Khhv|+pVD_%SH(n5iObwKN7VQ}D=W(M*}6l! zrBfrK=eU@9W0Wg=A*9rm^BW^_e6!JrRx9t1s%ry0zYs0&MuYXKabsV18o9w;KBuiK zA8K)QN#qU$_b#repxF?%C|TCH-y~sUW=}Q9I=ZC$wu$~$9~tfPo9J6H5B^^NhYj*~ z*tV#oD@FFyg3Sr&zvurXPEIlu8(I0uAEPjD~ zSC6;iB%k11+8Vd>t3c_t=o179Y3P!aioEuQc;mwJqP@G86$~1`A1Pg$=X}fgscCGw zl|!%NE$uAV;orE<+O)u1<7cg+hN8SNxEc4q$XC9M<=Is>$E`CaKCQE$I9uY8E`f(% znJ7qvn724M9UPR!#{AderMQm%cl*8-!VYMJvx7w|3XVA21B4jJ&Dgu%TZ#CsBW;M? z_zixzMJ~q?VvGiyXnosDv=+Rtf7s!T0_^ACD3^j`gZwgKU@eKYq&$1tl^?jh@;E%0 vL}@gn+BYPyI%QFTQ-M=~Q2N(3{;RGjq@U?wK>^ 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 literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/apps/kiosk-client/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..2ffbf24 --- /dev/null +++ b/apps/kiosk-client/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/apps/kiosk-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/apps/kiosk-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a30d5f183aba6e5c06b7bbf00bbbe745a6f377 GIT binary patch literal 2116 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 EzoJm@yZ`_I literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/apps/kiosk-client/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..12923fd03e8f714ffda34922179b913e9dd3a74c GIT binary patch literal 2267 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 Wc|7IK2Z^o#0000;zgZ+8-jAqDBZwr16nRE&W$i ztoo;zHj-j$K+ME8{_s(XNU2mO^oLj<6K8VgzRo#&udcPvIro{Fxpz8a63Bt!+;jFm zd#~rWzO~1Nv;1<;DR54K)2IO6d@HV&Aaw8mtw@Fy?e@k2Z_P~l<6FbESKw?7q1*S- z&Qp26#~8GTVdxZwTXgOpx8bf;^T3wv3v@cHE5aSzQ^fyEf!lUb&}SZ6WFcI9+zxlx zot7H!xJ(4_>SO4yIE4QG$`;S@OUag$Y=nKnlbz8X$DY`-UniQ$s4PK!hUxqQK?fCF z_x*d!igVz~&5xUp|N01c`3VFvEz^ck*s^jg9D(Dw;3#F^MLGgws4LKwLU5gUJ8cYT zo+FA-hxI+zYd@fZur>>$lh@%LzoKyeqv#E#fPD1Hv1h=|mcjMQv6#Fu^1@^17eVno zwYcI9>x~99>J6(=xljb(bHPx1JP0GGRu`-`gRu0uH3WmhCl>jiWENy0}&$u@C`FOiaLQ2M@qF--Bk;&L15egT4Enh9{od z3t1NI+28GjsT-!CQmNSSQmF*fN2lTLd$&S^75&A}?}J}%dl2U4zP96jCIcsCXW^$? zZh=|8XZYDrnoK5%HH2Gs(~Yn0z&D47QBfk%U934iJ^>d@j6oxa?7OV*LO!3j9+J5u z^P1M8%fxFz7U5(BGB~Fqc(vZ*MS#bdKr!#dmEZT96}jC1E0*y*fE)Ngy#yl*Xwbp z3cS{8Rf}Y@2hlPm_Ot&eSob|Mga^>Vn=CGyKJnx}``oGmyrBq|V|Ww`zVQ1OA!69< zECep+L7`CK#C71v^ieqUm%}z`(}Wf1ESHLj0%YNO&2m75?Q*hs$8}njRAA8-r49u! zDRPvcPS(pN+@ZtVcxvXi3JS!rFGw;nG6KK(_0#sAqK(A2gpF8Ugx|e$2V8yC)ix|_ zesH+G_x}5^W9M#gu?gS4>|VHV!#(V!xK1eLL)4sukB;2W_jxW}{=g~>SO;unXL?}3 z^E{ZEnzA_G$y_AnC2Yjws{ZvZV)7Vbe>XGG(k1^UzZV3i2)~6iPAN%5?H$3gJn3mbwe$ z>Vyzlmtz8VN;#aknqhFdoy1Au`j~OvWhE42x+JVz)g+V(NfOH#a&JFE4}E4TFzXly8^+4EtOs%g z$1CW+z{1zWS~j0!I^BH|g57zA$!QC}5-Z=vc{s^}CrKfy;HP|c@h3Tah>u{}YvIy9 zAu%Kuj=ab=Q0dH+CWTt!az$Jz>akYFYgA_H*Kd92^$XT-+#FPmb+unm>Wi6o55M)? zH9yIg*5?qLT?e>Eyai^-rjM;d6a}VP|B{wX;%gt6q2|d?O^V4~>oGn@frjuzOYCHTwMnZWPGtbxbO%J%r=K$qWfm}Y|!w-SH@w{<; zCq5YHb%72bQ=Y`P9?Q@`D8v&7p@jM$JNeNJnBD)FQ33+mn9UWyA5Yy)U+HCh>t6eUqDyG!dxqy&k>j>BH< zIO+-x<72f(l(K5!ehe)}EkNcuZt3phwdrqrie^m};J6k5VH=Vw@WyehQh{u~nZQz? zE~?&9yi|AFsALVJNlvynPnB7756ryru)u~c6>xvU$$f<-IMKCE47=FFjZ-#GJ-8RK z$m0bK)3T;r`;6~E&Y1sFjvaE~a6`cfu2Jp^4H2!If;U>@?xnSUIX=2a)r~aG*XV&#Uz8j(=ZVd8z00000NkvXXu0mjfGBFmA literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/apps/kiosk-client/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..141bc80b7bded68a56f100a23e096d3052f7276f GIT binary patch literal 2080 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 literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/apps/kiosk-client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec50e0bd04f58aeefba7aa14393992f638782b8 GIT binary patch literal 3299 zcmZ{nXD}RU8-|x`B9^GZ(PFI1FvP6hw zl~tn!(WAs-^@w~q=gc>Az8~L@_kL!s=b2~TnfJ$izj6AyS~ox(AOHYx0|D1C{8dx` zI@hoL(hbe!KLG&RN`%IJGpNL5BHr-jAw>#^_}hyamJ(M52Uo6%4V#E;@W%?y8= zwZjJfcrD*0SgI|jpkC>CqVPwDos7ypuI2bg$ZpF9k&fa$(9@F|z;GQ9{*M5Fl&au= z*bdKB=XJT@(xF}{9cojL}+emQqBjT51r$P zxCJM%p))L%H!Bh_Q@UX?`w4UV_lJ;ZNO>&eT zcY}cFW<_sjVmRmFkch_Z5_yqp;afiILpY?u5A+F^0i6nky=PJb_zZhp@P?YH0lHBH*3c8YPrhYw^i(B zWG`p%$jnWGeHzK{4eY0QtIMK+ccl(kBFwKVr|{G3H&V@ZFG?Vk;rC}Otp!sZD05u6 zT>o?+a!No@Xgf4mAKUz}6OL#M)G+JI?p0Jv-dIEC66^C%2;sb+KMw$U2=HE8NTJh0}koy8EWUEVq$6b6&mJ7OHm}3)=0{Q$c3HFfTg3yKbXD~}?VVO^zRTZeJ zF#-Xk6tc=lMpvVTO5vTE_M;#z-REc8R;A^g`?BPj^~GKU#FFYX9svl3h$F0-82474R}eHE{HwDbJCHQuT4P}8=Mv?0B`;R~e2cf}k%uNRi9NI1duJou?rkyQP)c!kN95i@eA8P^?f5grHAyyi zG{Ir3?=nE?N#R(%zZIOy*H1#;6j#JBd=@YpR)H_cw=*ci6O zKlzPCwHtW^*Vq@QGVqB4qGhX$w{5@Nt`s;BL9|)t-|4us+v7#KXjF~TUZs&{OPRYy zH?f(>-d0ClniB9jP6*=|Jk9MEVlB#&JH#qGrBKnnKZZL0O*2ukmzFvM0@b6e;+NC> zz$qA4o%XzV4eI?uTwHV{CG5Zm=69~M6#(AkONR$0vm+0qG~#z12zOfb;3KYb&TejE znJTp6mM4+@$2^y`T`*1$4Z6Zr|aBJ0wAG= z57p14qK%VzjJ;#2yi6-HzP@)~Nx9dHL_m~|fL${t#esR%>b9?v&3#o}WpwCfgxxUm zqfeVon{Mr7GQFjEXO#P@)(D5@(N(^zo-(EWb`?SX%(8)%ShvqyP)7PPH0Bvd8CCt2yN~Y!YM9 zG;Bi~=IQVp7#urZgga5`nv~+u%+20nFV#xCck!&oV)-cdkfd$V-{Th3^js$M4$_im zPCC#$J&13H8NsWmR!{CjDb2b)a8`l@Mk!i_Zi!UjpIu(iG}_{m!4tCYq|frBmnJp~ zQ-Glx$?#iUO`I-q@1*<}>qoN8^0MmQ&u-<3;(qDI`w7YNHEq_gMzhu_+a2o$r0fC#ntgn<=;$n@6ddYq%cdLYv`5^#6 z$t!Z@FGJvGWn!Y?9k1WDp&l4r>D>SAvqV_}Rs37R3T<2@9#5d5v1Ih3jf44PX6n43 zehyk3t&e(}ILI5mv#geCVr*ldFVfAW0{sj*tfY4^>+!SKpGGB7_m9ldt4kXX8shu| z+GCgsFsqVRMdWGJDkJ(us7vSXR510BfoQ+*Q*1h9?*sjQ!&O}-BiRl!Hpfa#Uk);; zzj2WeOfLYV=ur`vp*I{kIQC4QC-~4*xC-KR> z*h5B^>7A4qQwBxORgEoAI_KKA7Pl0tu#e1AblNkVdfi+WRoRux=JUbh0-T^dJYM2YYN22GJcJp_oJfcm( zpLU?5v)j4lTMw2kyVCP=Rt=VzY1TN1uj%-a_MyV3P9_frB`hdR#W9(@DJ{LoA*S$* zK-E8tEQ`LY1lNRM8V8y)b6mJxmnTGpM3Yuu?7o&eas1-Y3v{ zFxPBVz00m_A{}r&n*5T_5~&(CXTQMjUiEFz=jJWhz&?zW#q=(0684Zt9nqW~u%}ch z>)LGA3@fYC6WR(?a`Z|rck~>Nzh6|cL0hnRdNlK@w#G7O2)n&AISvKQ|E8m(pBJ&n zcba$67t~!31xfD2Vl-3W)R*+Kb>0gg?j*GbhzGo!l@jt!yL5A?Ei+rh&HQtYJez7;Zn-N~X5sQeAI*zBRO)8S&aZ=@k1Veu$zWC}BG-)Z7RivyHBv zVrAP6cJmwt6>IQF*RywqT}o%2ee=%AcpsT!c>#yt;hv(Z=q`UdjXtRjyPRBMBUD`8 zBGWX}n74m_`DuB9%C(lP!kl0M4{gC8(U95`zHX<$242lJKR*eNq^a`oQpG9pbg~UB zN%@MUV-KZ^ah*7e@|TVlq)rc?xHFqiG8qBhZP-Xumem33=jA)AKDTyS(SfeDcv9$K zdsFVJna+#p{;;K7UboWf5KHu9|IKK}pgAv2k5T_QC3o^1A3CCX9IUzYF5N%iudm1qvrF!t9u`dd&1wqrV=`A@SGnHV94ziwO+y-!>mLl?ksIVx3z}Dqh;p>Vp~=JE`q!DW)IYrHW(km z@Zz-{P$BoyCV?8&$Mh>7a%cgUb_xmJHLif7( zUTxs50@#eMreH8_}XW->8-s3&N^zGE{9R4|>ajRg}= zP@F_YVDSY=FD;i*y>J%#gaJsn8*FmYjrN6nY~S|DSmOFAfO*U2#85r5#b5bFAz8>+=FYJkZss IQF{{cA40k_s{jB1 literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/apps/kiosk-client/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..e39df73fe6e1cd770dfc59e2883974e28cd5db1c GIT binary patch literal 3816 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∈lKX z8=z#M+>`0Jk!)A9+iB)egE;D|xdYXcB6)vK$n{RXuYeHMP_8xgph6UXJ0m@PO`~qH z@4QJnNzrv;`h5-I=xLYAIef-EP{qOH=aQ z728rEIqy_2yzu46QSR-=S}OhrIsQm_wY_ckc6;68#~RLBjS_4};t|U&nK0iCOse9Z z_i<~J!|I1xn=>EdQ=&nFm4Mh`3e$XWYOv`=!#;C*QN)0)M%YImo3hTsk&~0?qM;y^ zfpl7MLvC07B*NsYwshBp&hklpn}H#%b>VH8~(|=dr=z@BS_Q z{QxzRAKm?-l&7A)9wnr2zp2+*=u4LZyO6^PQpBXp%#5Fr29_^|J@uT&v+2L)#n5Cc zd_4J^~!~tiNs+;nfsfM@$Rkw5d!CW+dpUxG(#Vb zru2<1EsceNrKqN}aH%_H>x|0Q{d+?4*wy6)*rySk7Q2J%X8-C{x_7zo#cmtA zKXvuW0R>Udi{}e3RQJ5-DLlsQ)#`OOJr?(gxBP`3+S6LGr|9&G+_Ikuj~H_f`7^Jf6(zSIZ6^&{?rA)oH%Xn$^2zq0P?PZR;7l+^Zx(}w?f?j literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/apps/kiosk-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..894119b427e8ed316f6fdbb4c41832630e13f76e GIT binary patch literal 2258 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 literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/apps/kiosk-client/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..728623d527767f3a00156047a3e9a86b8a0481ac GIT binary patch literal 2546 zcmb7GdpOgL7yoX_NFlj|mRasiM8c4{TN#VJ=8}}~x^GIDnT_OXG zJO9vaKUqZhhjeC!Kmb6r0c~x8iyodWz+Cgi%XIeBS1N*nVvtH+``{{KqrPV}eh;}^ zuKO;wClkR;L=lxO!EpP9D`>2R&|WD?IX&1=Jyvb;Fvv?GNA$T+4+5v_-c^E3F&NE$ zRI&Dm(~KYWLN_J{ap^HtEWV(tq#}>Y52KT})+R_)UF{x`=@m)`WWJudE(lIjtAJ2jHp@e8Y5Rza<+^Pl z+*jH6&nSTqZCB@$X$=Ee9O~Esa6L#O&QK*6O(%V}>pMido4!rvZD#C!F7e=~RCK!1 zZ6>QQ4}=Me>c`O3>RLP3|9lN6ex*zaO(aX)@{t$2fd6CMD@`rg$`WzU6sq-F2Hxd+ zY#>J{O2xq&({^fL2=PkRHSU#Ij%9B8mU@*}1Kvhga**q52vRVf6d;LoAI0a9&1$t|#>gXDE{_&&cHfI?)4UgHA<_9#`F>(5F zY;J{MLh#ms-+$23{|T^ml@GXo zpIyM?3*4P#E`FNq>lQ)g?n!RvWg`);kiZ}hX_xZV?emNzf?1)#cctxx1YX@U9w!Ac zf_F2CLWatR5Z>VD$XMYk@moye_dwZ|N`$9<;gBlV5FBu~XqK%tfo|sIGZgASgh6j& zpd|yBQD5x<7fy@kgPXNYAwRvcScQ!qh`J6ZDbMbR4|;O!hb7`Q35kIu)!|g`H?IKb z%@ya5lW$gC`F_5yjJRXm9E?6ZLs_K30+g7cOM7~I;ajF&(OzIb$fzFdw&UMt4)%+~ z(*l1OW7}QQ?qEDjInjNNg@QWbAVM%dp_gtmL9#7_z1q@myG_x$yDp;uRaMVDfn(1~ z0xg#I2zws`@{ur_^KSMM!>wEVjRzKolx*q<7e+xPQ3kdEW=L68EwNZ!@(JM|=O@@e<0Na?x@Z(Q!2Z2v5+ub+`tekJ&^L>oxnd8J)5 zzm`n-z1a>RlS$ahIs4T?y*eWq~{M)ocyb;Xm<7eV7@vd`9ecIbKEsl;s%M$3nWn`g7NXbVIACD}v!W5?Rnt)We8`7y@) zQh93biW4g;P5-p|X$5QPC8zJtWDi*ke~9G!2T$=$=F0k{CzaU9I&%N?(idJ#l#5~z z^25xg%4EIhX(P*d!|yZbZnL>3N`kzJI32r9dMxkB$HObQrA7NvlcwU|Wyqr2; zRP!RbO3geX?O)jItj*lYn5$-F1(f(TDYBiS&QRnWRB)@mnzQ^ZiYL=|dmB^3@Q)^S zj(GXJ^Dt=H?1c^vnNl$9RYs?o9H`#aqvM<@lRoQYKGJr*xh8EaCr%Mld}1BsXbhZHM+D_>ogvlOl3<|`K^)RBi^wyh7Z|P%&#CThRp-?G)T~w6_~j! zfjO)RY%g=hk9D_NP;RCT-`HH!CQaaVn%?=L$4Aj3bzi8EklTKK)214v2@{DF)9)K& zgjSaq5%0@(J~j(NS0KSEt>hE-R)hZA>Dz_$Thh_#-IXD9*UX&lk6pfcB*k30E{<)I z%kp)LwAhz1(b{b?#Yp2YE=l`8&X_@b=N-~$*GtBdM>->g3@Qcf!ZG1>J=T|4fX-F(aP>zu-d&@L}q zKz;mCYZB`|_4~J}f~|6EFDgDT@2@zOVFgSN-e{bVL8RQEpfUFiNmaq6tzH9;L`-9Pg!-o? z!m!yX>Vq|1dQK&Or}rIUnvNuGLE8QrBtYZk4nPgsvZ5*v1S)NPy3wH%>4*&oF literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/android/values/ic_launcher_background.xml b/apps/kiosk-client/src-tauri/icons/android/values/ic_launcher_background.xml new file mode 100644 index 0000000..ea9c223 --- /dev/null +++ b/apps/kiosk-client/src-tauri/icons/android/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #fff + \ No newline at end of file diff --git a/apps/kiosk-client/src-tauri/icons/icon.icns b/apps/kiosk-client/src-tauri/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..f19056ce4fd48aec14b44d43962daa76cfe782bd GIT binary patch literal 25758 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 literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/icon.ico b/apps/kiosk-client/src-tauri/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7d881111f1f6681f2cd648c19014d63f5f040fee GIT binary patch literal 9800 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 Nu@eA4fBzqf{|E6={pSDx literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/icon.png b/apps/kiosk-client/src-tauri/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1873c0612a63e975875b31a9a131693f220c2dda GIT binary patch literal 3570 zcmd5;eK?fq8h>Vx2{Ep;qI{)}Iw!Ozaarc$^l?eaBx$xrQTkY)2{j1sTdTC$j8t@* zY3P(xB4;Ti-s$U9m`0^$jj2%#8OC7DFdt^lyS1IwUTvN2+CTQM_j&K<>;C=j`~E%m zcdG;arkL28005@=FJHO_04zGh0^B6@Gm_k@M(wr!OaHMpSs)eO44mm_%Ne@Fwy&5R zp4hzEfkQ?1xvqS%Uu!EId2;tnf zaqK;fA>-Dkvkl;^Qa9Z^{t0?$>@$v)Y6&cTfVk>9zn(g`9RoTrGH`tDb!AN$zrkv} z8a!*)?Y8A-BLH-~8~~wLl2TY1^>Psgz+KfSs!vkV|q| zj@ts9s-Jq;4sM}x;%lo+0e-L-@)S+3H*N9TIM#j)qG?4)dJw}Qcp%jqH#k_G9&D4< zx|86~Lm(a}Ob*dtwY84R7n%by zYzH&@H7Y8CqL3~(c}E54rpOz&&9q|rOeTee3Y-9r=y=c<@c7dn0N^`r$% z?&E~o0QazZ^TbX~rFWH0)q0`$NXyT`5LVj37X)0M7UkO#WTv^dWI3Wkt^)?10Z>vM zKPz`WPC6OHXC*v5!$Xd5(e3LAgRnPcV2%^OMNL20(nDf$n@NM(l{T-+_thG`o{!qq zBM5>xDCboX(%lN09@=eYumujvZ2|N*wt2l%sP^ zgJ|*U21@qbS@mg()btn#DLrssTXGtr4ZbP7LP%e3UwH2C=2GLS#W&Urs69e60%W3w z3-^{06q|53Flzw#rmH=K>yl{k=QAu`XkA!PZ5t*zPc6N-2w-CkTN8QDWiO295>1@I z@*t8yOT)U-kP9v?nqgg?ilVJ=bMojEft2)zQlTX<%ut8T|Dq4FKj+jkY19#v6% z^w(aCeOFRTx25Wp%MRCJ^A%=-`JS?G9RaS^03Sk2YbJGTy?j7+O>|fwKN}URibBkw z({efED?LloLF-^^jX)gdBw~brSB0N?h{-A4 zmdivbBgVKI^QuKfp(HaC7`7%OidC(J1oGhgv~UC9*lmn8giU`Dl|K~D zZ#OSk4i3D}%mhB+8FTogV*8bZ?IirI?=qfR7l1QvV?S(?C(tyvjLCL)eEG6}MMH+* zQQV}6LG{oj7r~-1YrSvjy^vE`=5X0I*CJ_>XZbT9OsVg68@!|q*(j^qN5`y~Qk0!) zU13UQWj9DutM8IZDiyZV>6%^5S$-*_3HNSMX6`Lqqf-Q}KM_KFT{m)uXe4`jpu*5( z-($A6&%4kfA~nB9+&@&}OM+$_9y;r)E7{q&?77zM1(X@y;A2nUzC>3XXFQN)2A5XV zNSdlitfZAxgL8)vqXmcYi@k|~s;+Z0+Jj}=21U0c7yj71wLdVhAK+I})37#+BOkS& zfb0v#rB35M!{(eG;&^A6OUkZ=Q~8s|WbY->1ghS&Y(FK|d$!+Xc49yr(Oth^TH?zV zVs)elnG5K*F z{LQo)H;H}&CoY7dp!myEpR!KydfR%LX&LfU9(H*am;`IVF}*U^{CbMuVtXwyXn2m7 z{L4MqtIsW{H(j&V6{tdG!pwv&0-M_X?5QdLTO$?IfigIWLAwRXb z8v|*g%P)r|*48Tn3^1Ink|W=+`$Af;lCWUl)uICVWqWF5oGlLg<=g9X1{Be)jSfkc@8oewwx@6D{1q%F^1uiXL9KQd* DB+qa9 literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/ios/AppIcon-20x20@1x.png b/apps/kiosk-client/src-tauri/icons/ios/AppIcon-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..01225f36ede55d7b7a3285322ea81605dc2cf197 GIT binary patch literal 887 zcmV--1Bm>IP)?YSc5=A ztt>?>8)zbipCT>ubKl2z&pqvZ?)8}!71ZH=&S#%>*4}I1eQiz6(}2g1e`rz)&;{WU zk`My_qY*dQ4AwQ|VfwSwp&|(4sn_szK>BxMCY8xTZ!7aeOM`^X3y%jR#%CcGKMupP zLc&$9In9z1e4wk80kAF0%q!0`^R{I}sSKi(dquKJqNM>oV6+5yKX?-pPcLaZ923Qn zO$25kl}drZOG-)%;PUda0SSl01gfy&q~WH%>gwhWv2WK!KbHKU17R0LpoE3e*cRNq z*NHbHqd0x$Jd(A0(ceF0Ztn9Oudxl=@*dvH7{&`fC?+B_sfd|CZA}uPLJNs_456Yz zl*LPp8TaEnM{CJs(%5QGnY|F-0|o)MEZ@!c%U6&{B+%8>joA+$aP`^^V>3N7gWjHQ zbaZIUfBu40Iz{PX<;B_n$fpj|z)~p(J-vO#BAanAIPwug<23d%kXdE& z&oKNEkinEo0+bfx{@pv+oQN4_4A%YRk+ErQJ%)EqGxoQ&V`(mpm$wfg=S(5*Zyu0C zASgv-0ljTdst41YHrBcmrY}ihUr1gP(l&e7NajUxa}HECjfJ^MoI868;Yb8yV`Erc zTtaKxakF9g^$^nTIG)ev`QnkwaH-Q0hd=iRMyp_yt>}7mvUWs$_fGq3P9l9 z8XE&bT3UrZ28Y7{o;@t^X~CnsQtLo;Q`%u-7I^TYz!&8}4%Jnp_A30!5&$dDLPgvk z*!*oa)QI3%`BMeiS*7u?-|ru7w6VQH{I=Q%Qx91+&0mT@A(46ZR^wKuKr{j@tUx=; zcQQgb951FKLK<8+p>c4Jz-o>|MEO8;IaIb^9GRPd$Hj}@5ssqzGt@9z5%jGZVQ=feb@j1 N002ovPDHLkV1oQXmD&IR literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/apps/kiosk-client/src-tauri/icons/ios/AppIcon-20x20@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb6063f780941ef6e451851d9fe5e3ca8169a5c GIT binary patch literal 1545 zcmV+k2KM=hP)ptlwf3|TDjZKoOx!k8>m(adE zm_!UKY}0R-KcpyVai@`hRQTIz`xr0d)GhEY?h1s&ILFxJ+lUOyp*!z?hJTg?i*~jx zGy^3y+eL`k=u4M6@MRwJI!vIrUX|Mv0Fr81_Z)Q!z9Bn295>7IP$1aK1#>$ zdx~Y2_vS%GF!5*#xFD-jET~qik--z{MMo@nZEcMr7G5rwsl+#%Ahm`;opzhrd>ag8 zx3MuV3|fgJUt~gd4x)y}0v;5IAm8`MbzPddc!5SnTxk~yHm$5Q>GYW?nxFrbUVrUX zI{WfVw7lGu8AeB4diTBe>CLyMX?*-%y7<}7v5!9f1T~vYX+sud_H+7NnFOncfJVb5 z&-2N)3z?>%HODDarCelWuJq$K`tT0l^c!pB)WS^xL8l?bPtEdcDqIY?__@ zN&-UXSA6I2V#*BEYp-&B`9|t<*=Vwg^<;Jxi7d#>2T)Anri5!{#5`6z)~&MB3RvyQJtSZ(AlO zx^o_AH8VCs^v68RN7=CkGMI&}$F_YC+}emz&P~CzxEdQ9AC_Q;IJs=G=E7)yCrTzq vm{Ynz01y2c^+By=7|ykB)WrXrQ~rMeDb(JnHWqc100000NkvXXu0mjf2rB0> literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/ios/AppIcon-20x20@2x.png b/apps/kiosk-client/src-tauri/icons/ios/AppIcon-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb6063f780941ef6e451851d9fe5e3ca8169a5c GIT binary patch literal 1545 zcmV+k2KM=hP)ptlwf3|TDjZKoOx!k8>m(adE zm_!UKY}0R-KcpyVai@`hRQTIz`xr0d)GhEY?h1s&ILFxJ+lUOyp*!z?hJTg?i*~jx zGy^3y+eL`k=u4M6@MRwJI!vIrUX|Mv0Fr81_Z)Q!z9Bn295>7IP$1aK1#>$ zdx~Y2_vS%GF!5*#xFD-jET~qik--z{MMo@nZEcMr7G5rwsl+#%Ahm`;opzhrd>ag8 zx3MuV3|fgJUt~gd4x)y}0v;5IAm8`MbzPddc!5SnTxk~yHm$5Q>GYW?nxFrbUVrUX zI{WfVw7lGu8AeB4diTBe>CLyMX?*-%y7<}7v5!9f1T~vYX+sud_H+7NnFOncfJVb5 z&-2N)3z?>%HODDarCelWuJq$K`tT0l^c!pB)WS^xL8l?bPtEdcDqIY?__@ zN&-UXSA6I2V#*BEYp-&B`9|t<*=Vwg^<;Jxi7d#>2T)Anri5!{#5`6z)~&MB3RvyQJtSZ(AlO zx^o_AH8VCs^v68RN7=CkGMI&}$F_YC+}emz&P~CzxEdQ9AC_Q;IJs=G=E7)yCrTzq vm{Ynz01y2c^+By=7|ykB)WrXrQ~rMeDb(JnHWqc100000NkvXXu0mjf2rB0> literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/ios/AppIcon-20x20@3x.png b/apps/kiosk-client/src-tauri/icons/ios/AppIcon-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..88b9a18b0b9e1091af0c1f04b5f8fb0687410c44 GIT binary patch literal 2028 zcmV-P)#G zoUtZv#oM%d?;+a##4F@>oK$#LrdDIlwid6@{GVs2Sl-EXPO5I|ry1j`FS0d{+CDP( zyZ!zaby_#6@!$bPdzL=Uc09PhVU-kjtx}Do=k_$S&34^Pc{kVq8oVWRLElWJZm{+= z&G6Y{xx_C^ZcXkhdR9;H-t)YUqPgE5vUtF@*r z6jiHJR45dZoac7iwrOQ$CG1-+Pte3fIYml%F}QAdd0EjECsrt02Ps)=kP=7}V-Pqq zGec*-`hQA`LC0}v$Br5L_}Fne_Q`RYot>qnr6u~}^AmLN;B$Px%p5WTu6tCg zRq5QhIeP8&LwsMO`T2Qz^Y9z={(JAzty>GMWzBH$Encwy78dA*7hj?UzNRhU$b4yV z7GP%?oNYT1zz$88OH`?p6*oj60RU64PAVeJKzt$Qm5HKi3!E7>24nFK;&)qtT>-E{ z!3yUdN$?;Cw1Kk#YsWau%8iKy_e4Ze9M|6x=&Sdq(g6$@ZPC7N;LxM5=Agb}PC2S* zNeuSnV!x<%?PY>~USD64=$rOD4i85S7zzp^jGtb4HxOOr?L;;P#FTycn0bO|`*mKd zZ%pKSA|A{+GQe_xI71sN<$_;NsZ=VY<0V|{^%`*yM$`3bqA%K_eK8hgrcp~y%yWuS zDJ_w)3~(r5XJLAvQI&!c6mk{>&&{1@ds@-$tz@DsJ$?T}!AE0s!g<;qpn z2YoSS?)-Vx-fT8`E)n|qFlWtXOU>;&HFESE#>AKmP6h0&GCe5{3kcVMi^U?HJasyz z&7*w*wpy)r0rO&={r-o9`H_K1f*Au1c>=lIS{j7IsYr^KFPb1;??HfSG#U}Eh*)3j zS!K?GzLm-(FF+vXz3=Bb$FVnGX@MAcP^lS_fNS8aR#2;}t7-w#I1EPwqOF(Nb=Ju4 z*a?4G24TEmP2|a?z=5*>`|LAMBZopdhKk<%+~^~45H8t@7-oFB*5nRnk?5pb%t|k5nqbt%vDsFd0eC%3|9L zaq(0_X`wA#AinykB`icSp|qr1%WaZ!?_r(wK&B$gENOQU+{2!Q=~4DL!z`f>I4U@| z>L(9>%`{8WvvcR_tvn_P#32WTv`jz81MVVhHn~zpUag(W|X7*cBiedEf?uJZ(>cuI;n|W0?`Icp|F-#_rlgX=f_BPqP^^BVJ)7-pXL}t9P@L_vk26Ht*Ehb> zGPb2h73e&%&W~xd?aw}BVKDlv&bBUD7)12w;aW%1&Bfsk9HiyIN<~4Reob`shWgkp z_3DEtcC5rByNKR-mA}|`D5f_UszXiYs?p^qA0Km!WM}gNE{vbDz`N zXcL5dyk!as1EMJCFtzJn9gaKfu?*Z$&vkdD+p&ou~sfH~!1|$Zl+rqlbM7 z5hC74COt&mW@`3|Etmk%-+G|vE?*mkmpxX$o97aDeGlVHr%@y^C`q!;b7lSN#YUX;wT3+nS?4_b%lk)s95;A(eR2a% zVh;019(Uu&@vw7R!x?q4sfWsY4|{JqhiUvb4`aY%z+=FhT>b|^D*t86&I)t@0000< KMNUMnLSTZ=tlXsl literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/ios/AppIcon-29x29@1x.png b/apps/kiosk-client/src-tauri/icons/ios/AppIcon-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..920393bd814ac73fcbcae261f0f1c33824b79b5a GIT binary patch literal 1240 zcmV;}1Sk86P)fF)AiVuxjs}!cP+=Gv{&S}ucF<+OV#(mA3$z0j!i2$p4y3e0U>ak?2AQO? z^j=w1_~0AJfE(3lM0u_Mjo_;;eQo_T;8*Q;d%q&kdQ2T1(tyVD!p~T^Z~{(*ModT( zH5$yb5fg^8TDOEFwhv~B|1E}p9q)Jhl_K7jPVh~NO)g7PdU3KXyYipxJ9MC>&-36o4pvuJ5r$Tc+~$6z9Mo2qkjOoN?A;@1Q0TVu zptgSl$Kw*ihKFo8l}h2{$?tIA@J>-SD>RWvNdLhD&q!EoUb@6=vMH>sdCJt*d`wL2 zLtkH?P{b?ODP<2C@Y9dphfhwpq=@GZ9ma{zf5-5X?;)1$BSwHfXV2m6mrp@Ev5iBw zxsIqjE*C|mrE*1L$ds~&47j+sDBmizx!``zpmVDpgH#zZ0lxRA~Cg(x008zL|fT4#PC5 zv{1N0G5n%Uy^%;1*Jr=BAa(Uh{bq}5J<+bkp_ots>Ah#a89O-5tCW;QN27Vx@O~CtQ>uRSY_!_$p3`Ba40FBWD5jE6kz6t`sW{(2uu18&_JU9g zj@?C>`l%i&wk5O@{^Y=8~&a?4_sRU6%ojdavNpM#6#=t zv^mm^-e)HXpa-IE5rc2w{P)_>Jti6jNF(n>A$p^DNdqC!nU5fp5Lq6li+HwArA>Yw1FC@KXDJ`}aI zwy4!=E27X?P?5HR(1NyAtWdGFA=zXx97;0A=Ko1YH^z^iP3k`VyO6LM2PhUwO$4ER`XRC5){u zMs16zQf7INlv`y@SpLmR!%rEMOJw;N1hBNtx^QXNBcb?jF@J&FYJq>Vu43~FjzyQO zM3z#ymD*J;G0XCT8zrmc%;*jp`|BIBlYRV~ca>&WNlqnC1GhXvcW&NG%3-sTHP`+SF)>Ni zYSom5dfA?y9zHY1yF|nqV*^zY>04@$n>G#8rr}|It*sSW__=d`(7uoNQ#zg2<0D%( z)6j+uRAj|yFCgDK8D99wUw)xOUw%cIOoqzkGHu)X9Iah@Ye+FhmdB5dj?&Siqx#xw zs(-4x6i@@@1q0-cS6+^k`SIuD^x;Q)*iu=xdYMK>w$M{gY>AXT@agBY|G+2g0lnIi z+qOMV_uqR@%lQu<`I>UMTm;a0;JT7s1(w1wHlEjU6==S%ub15~uU!wW3u{kJPBzIR zh6irw(_@ecSPbrU**N+9WX<}4toELm)Xk31K>P`@aND+P3qoqQEE&q+sK-7y$OS+H zYKE~ezs9}(Gpw3yW~|Kz7A}m<*T*mI0^DX0m?F8CjHtMp@UmE5^dIxL0b~90dUo$YRd8EiO9_NYqJ` z5M);*k02(Yc`Wq!i4!`$K&TOyr%s)sA6BoTNhFv+mU(6`1IHL-Ad7o&FOEX75K2ZK z_4oJbIWcz}umW8`hgD{?s=qr)^xhF7r|fE0{OcFb7z)_0Y2l1J3aV5pp~7CT2rM|T zIL1*E9mk231<0_aAPcvSk_E_QGFb-{gv6;#7z(&gQ$Ray(Tk4~Jv78v47S*=3o?K@ z*{EG%wnhL(A=ib~8x5g15Uy7jyFKg?nkYmFgDNV|UAPz(rjCLP_%(25;enM<)Pvfn zDIj}*6!o%DNQx~4rsFG2P_;b4V5-#A>Of7ld)W2Uv363im=P8ZS_j6X3x0?&z73yL%o6FMo$BxnN-5>CEj$N=stM7h|ax3m2*C{e=SEiGeQYLb`{1=;jXY`qby<= zv<_oJ`a2bF&FQ^mmAf3ybj57=Nh^Rviac0Z$i<_8VXB5YDVr#uY@&d*=UDZ7T7c87 zN@>-Aaxk0rW&B3glA?fWF*@~OS{KwjT)WCoG<6iv{2!E@@Ua{$06TFV{&iD_J|$-(u04T$(0YXuP(*m_UV2 zE+uj+Q+}Fn(BfR2XI?wP3=(U^T1A`8Y)2CUOSkveKJYrN9(q;B&ei?a%;5w!sMlPp zy|c9_T&nlR+n2`6Cey?A9M!bFn?;NYe(&Nfp;v06Ej?@k3e8AAF9^ajY)3vtwUN&-p6WD$0m3rZEA%Zy<)}ltq7srJt@)E}{n@vQNQe4yj z67^tU>k_}%zAzSDvxDv*=IFGlckH^J^1nv{mu{u)(DzDBOKr!!JmKH#sl|*@_#rEL z-OY+7i-IyMn%^RH}8w{P)_>Jti6jNF(n>A$p^DNdqC!nU5fp5Lq6li+HwArA>Yw1FC@KXDJ`}aI zwy4!=E27X?P?5HR(1NyAtWdGFA=zXx97;0A=Ko1YH^z^iP3k`VyO6LM2PhUwO$4ER`XRC5){u zMs16zQf7INlv`y@SpLmR!%rEMOJw;N1hBNtx^QXNBcb?jF@J&FYJq>Vu43~FjzyQO zM3z#ymD*J;G0XCT8zrmc%;*jp`|BIBlYRV~ca>&WNlqnC1GhXvcW&NG%3-sTHP`+SF)>Ni zYSom5dfA?y9zHY1yF|nqV*^zY>04@$n>G#8rr}|It*sSW__=d`(7uoNQ#zg2<0D%( z)6j+uRAj|yFCgDK8D99wUw)xOUw%cIOoqzkGHu)X9Iah@Ye+FhmdB5dj?&Siqx#xw zs(-4x6i@@@1q0-cS6+^k`SIuD^x;Q)*iu=xdYMK>w$M{gY>AXT@agBY|G+2g0lnIi z+qOMV_uqR@%lQu<`I>UMTm;a0;JT7s1(w1wHlEjU6==S%ub15~uU!wW3u{kJPBzIR zh6irw(_@ecSPbrU**N+9WX<}4toELm)Xk31K>P`@aND+P3qoqQEE&q+sK-7y$OS+H zYKE~ezs9}(Gpw3yW~|Kz7A}m<*T*mI0^DX0m?F8CjHtMp@UmE5^dIxL0b~90dUo$YRd8EiO9_NYqJ` z5M);*k02(Yc`Wq!i4!`$K&TOyr%s)sA6BoTNhFv+mU(6`1IHL-Ad7o&FOEX75K2ZK z_4oJbIWcz}umW8`hgD{?s=qr)^xhF7r|fE0{OcFb7z)_0Y2l1J3aV5pp~7CT2rM|T zIL1*E9mk231<0_aAPcvSk_E_QGFb-{gv6;#7z(&gQ$Ray(Tk4~Jv78v47S*=3o?K@ z*{EG%wnhL(A=ib~8x5g15Uy7jyFKg?nkYmFgDNV|UAPz(rjCLP_%(25;enM<)Pvfn zDIj}*6!o%DNQx~4rsFG2P_;b4V5-#A>Of7ld)W2Uv363im=P8ZS_j6X3x0?&z73yL%o6FMo$BxnN-5>CEj$N=stM7h|ax3m2*C{e=SEiGeQYLb`{1=;jXY`qby<= zv<_oJ`a2bF&FQ^mmAf3ybj57=Nh^Rviac0Z$i<_8VXB5YDVr#uY@&d*=UDZ7T7c87 zN@>-Aaxk0rW&B3glA?fWF*@~OS{KwjT)WCoG<6iv{2!E@@Ua{$06TFV{&iD_J|$-(u04T$(0YXuP(*m_UV2 zE+uj+Q+}Fn(BfR2XI?wP3=(U^T1A`8Y)2CUOSkveKJYrN9(q;B&ei?a%;5w!sMlPp zy|c9_T&nlR+n2`6Cey?A9M!bFn?;NYe(&Nfp;v06Ej?@k3e8AAF9^ajY)3vtwUN&-p6WD$0m3rZEA%Zy<)}ltq7srJt@)E}{n@vQNQe4yj z67^tU>k_}%zAzSDvxDv*=IFGlckH^J^1nv{mu{u)(DzDBOKr!!JmKH#sl|*@_#rEL z-OY+7i-IyMn%^RH}8)1OH?`<r%gOJ@^Jy>N`k=GS_eBf(u{m zID!Iyp8o#nl=?SZjNC%trv1f#ci;0eRh=Cag_3$Z1p{!C*--f!uX@9>)84&z(d^Eh{5{ZGF#ITI4N5Y4wSa zCxjBSkP{!Arl+5IPQ4HePkhP@^zrxJrCmF>lWtN527EbPy!;p4ckmE3_@(0c_$)3i z(u*%VPe-48ocs^~3au{Sar+)Sa+J=TIZKn1ljscxaGx8Cc?F7uFGL$k$#Yr(bP8ib_a zv7k7Z)w3oQ1RHAB$J&U{&^fLXB>XjtMuB2w(kPMKcg1tEcrqeDw6my0Pp^oj4@6!F z5Wr*eN^PRXQP}Di0A4#aHAQ2UlKS*2sJD^_D~*Nkhx?*TPi@O>1KL{zzTTiM7Fq#9 zT0~wT@;V+1%K`wOef~KI17&65>FR07*7p7fCuxSGHa`foK}3ne)hisfhDn`R#F6TL zxUUK#7C4Y`HA{s_U9=bN9<&9EmC4Tm4-t@IM5LbWRf!%>R)16c3UmunH56Kb3BiY@Wl4q@?)`+@Yuf<8>h%eu;hrlwj@pEl z1(>d`uEVshWDSTwrs0{~Tx`Jq85whv9#z=(Ef*RKm0arzvC!> zzq%^dVC{=>OXKvzxo7F>AD@y}t{bg>3~eO>jl&88gl_1uI=K(z9vpTi5y{uy2f*&W zX;ym=TvI8zD~9#TRq%*P)fpO_tdZZWF=Nnka+hhegDIcnz+FQzJ{K0qZHja9`gxVBhuuPbn6qL)goo}1DyZTOo+c}h6a zum$zeY65B66+cHhnvhp+K5&r<191p>1v;La<`O_Q%<3cpgqX)xdh%S<>&|OK8%oSy znJX}n&E~m682~deMHfdN+*pr|Q;d)aV-lf3k6jBM?t{oH<-2(i+A8apF<5@<3N`;- zG>Xt7Xsa~%oMUgW+lC^Q6o=d`q!^iM3(#Xzp$0%hD?muwkG6p8Vvs}5fUnc9U%g4c zef^fPw&0d(0}mz&OJ{0m)~-xdF=z$rQN?7~VQ(w1KUJ*X{M=qX`G4O-sHCb*py#Ih zf#CfIoLN4IbfdykmR4kz$6@n;z?Dl%Q^=FV+?G$vz>NLCW$d-?~!cOYr#h@m%7+}9?cUcQHQHw#dg=9jr z#R@kT+^q<%BjTMd%DoK9%|?B&5obuL`M^ivB>Dii$tQ$VIYF_t5N{z80xD5i^tj>PT+ns{mYlu(^E8K%e4oGDL zNR$*sZOzfV*cMZ>yKl=LL1OI@uUV%I4Wk@;hiGmAOXEF;C6kwFww&WH(deJfltyGK z^H2^a5JLMpKH5M_C&5VFUhjBl$`+?bV5CVooWKzlo26TO+6{I?eEW_g$$0pHemn7* z5Ti2cEETihT5xmdO6ak0{Yu~UiYtzVriw^hW zznx@1LA8=BB=k@=FLn|XMg6Y~R_+Y?;(~7t8QDj-CHE#-VM@eBDR{OkShoBhQllyfi;M1&07*qoM6N<$f+^p4asU7T literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/ios/AppIcon-40x40@1x.png b/apps/kiosk-client/src-tauri/icons/ios/AppIcon-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3bb6063f780941ef6e451851d9fe5e3ca8169a5c GIT binary patch literal 1545 zcmV+k2KM=hP)ptlwf3|TDjZKoOx!k8>m(adE zm_!UKY}0R-KcpyVai@`hRQTIz`xr0d)GhEY?h1s&ILFxJ+lUOyp*!z?hJTg?i*~jx zGy^3y+eL`k=u4M6@MRwJI!vIrUX|Mv0Fr81_Z)Q!z9Bn295>7IP$1aK1#>$ zdx~Y2_vS%GF!5*#xFD-jET~qik--z{MMo@nZEcMr7G5rwsl+#%Ahm`;opzhrd>ag8 zx3MuV3|fgJUt~gd4x)y}0v;5IAm8`MbzPddc!5SnTxk~yHm$5Q>GYW?nxFrbUVrUX zI{WfVw7lGu8AeB4diTBe>CLyMX?*-%y7<}7v5!9f1T~vYX+sud_H+7NnFOncfJVb5 z&-2N)3z?>%HODDarCelWuJq$K`tT0l^c!pB)WS^xL8l?bPtEdcDqIY?__@ zN&-UXSA6I2V#*BEYp-&B`9|t<*=Vwg^<;Jxi7d#>2T)Anri5!{#5`6z)~&MB3RvyQJtSZ(AlO zx^o_AH8VCs^v68RN7=CkGMI&}$F_YC+}emz&P~CzxEdQ9AC_Q;IJs=G=E7)yCrTzq vm{Ynz01y2c^+By=7|ykB)WrXrQ~rMeDb(JnHWqc100000NkvXXu0mjf2rB0> literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/apps/kiosk-client/src-tauri/icons/ios/AppIcon-40x40@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..de772bfdfb9ef931e3019c8d9769321997b0063e GIT binary patch literal 1410 zcmV-|1%3L7P)60d*lV+NmOp=zx<9q7EfIgnuFi<9f79F8vTVoCJ8^{h;W-d!j)k;GwJx(d`w{ zt8XpcJlkMZ%0Ms=;H7LdUkZ3AQIug~tVb6Hu3#R(vnJ=SJDAIwFeq9Bf;%7R@*zzh z?EI>D3YXQNt$BdK)BQk8>1>*RtLp!hp(4`BbFX{V)n8>C^8nu8zkI^S34gaf{8-Mo z<65(%cr>ODzWkk!w`6z*S$F4?8OY27c$*$6^K3q!|R*rc9FN)&* zk&1FPJv)khOysU?w*m+^NV#67>W+o2V_pWH-CHGHrhXUJIt<%KLB#sMZo~vU!SQ%} zFcic?m`o~Eh0iQiuTN-y}hNOepGvWE&KKX#B&Uedj~6 z6-Amv(iZ>)z`8>5+}SR35vtC0X&V%P@VEB4423&^Iw9Ex10Wg-XSHw{svO#FHgshh z1c0uA9AhF(f~W5rQo+U;(}`_eK-SK{NzR00gZi#)gBt@8pZXNAr%u~APCOs72^&BJ z_op)9DYjg`| zetw(X#YZA%i5epSO6jMZMfrkxmbv(u)K-dyzcOR{%!Zd1j|+Vzm^Pv3_#qm_<< z%av_&cNK51r4-nAAn^Qn;T>7(aW_(U5qd)QsTyl zANYha>O(53e zZ5s#*;Macj(WY%@!9Y0T!)xU{c<&k3vk$*b{Us?xRA@_6Vn|~EqFW*q@Batp&p4f{>L>MStSc(8B01AKtpp?_fJN>dHjuJ*( Q#{d8T07*qoM6N<$f?brC`v3p{ literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/ios/AppIcon-40x40@2x.png b/apps/kiosk-client/src-tauri/icons/ios/AppIcon-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..de772bfdfb9ef931e3019c8d9769321997b0063e GIT binary patch literal 1410 zcmV-|1%3L7P)60d*lV+NmOp=zx<9q7EfIgnuFi<9f79F8vTVoCJ8^{h;W-d!j)k;GwJx(d`w{ zt8XpcJlkMZ%0Ms=;H7LdUkZ3AQIug~tVb6Hu3#R(vnJ=SJDAIwFeq9Bf;%7R@*zzh z?EI>D3YXQNt$BdK)BQk8>1>*RtLp!hp(4`BbFX{V)n8>C^8nu8zkI^S34gaf{8-Mo z<65(%cr>ODzWkk!w`6z*S$F4?8OY27c$*$6^K3q!|R*rc9FN)&* zk&1FPJv)khOysU?w*m+^NV#67>W+o2V_pWH-CHGHrhXUJIt<%KLB#sMZo~vU!SQ%} zFcic?m`o~Eh0iQiuTN-y}hNOepGvWE&KKX#B&Uedj~6 z6-Amv(iZ>)z`8>5+}SR35vtC0X&V%P@VEB4423&^Iw9Ex10Wg-XSHw{svO#FHgshh z1c0uA9AhF(f~W5rQo+U;(}`_eK-SK{NzR00gZi#)gBt@8pZXNAr%u~APCOs72^&BJ z_op)9DYjg`| zetw(X#YZA%i5epSO6jMZMfrkxmbv(u)K-dyzcOR{%!Zd1j|+Vzm^Pv3_#qm_<< z%av_&cNK51r4-nAAn^Qn;T>7(aW_(U5qd)QsTyl zANYha>O(53e zZ5s#*;Macj(WY%@!9Y0T!)xU{c<&k3vk$*b{Us?xRA@_6Vn|~EqFW*q@Batp&p4f{>L>MStSc(8B01AKtpp?_fJN>dHjuJ*( Q#{d8T07*qoM6N<$f?brC`v3p{ literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/ios/AppIcon-40x40@3x.png b/apps/kiosk-client/src-tauri/icons/ios/AppIcon-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..288b5cb25fa3c6e13800a9804444bdf2dbd21cc8 GIT binary patch literal 2279 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 D*V8Ft literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/ios/AppIcon-76x76@1x.png b/apps/kiosk-client/src-tauri/icons/ios/AppIcon-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..76942c991302101e62d77dc343c400612c8cf559 GIT binary patch literal 2293 zcmVUZP1A|mBh=dS5*Mygc;io^tPEUSJ zx)SC%k_Mf()2ou5e*J!%==}GB+O6&-Z&jNVzcj@)ySkurW?9gIhb05noBbYOQbTLKIKw1SNu>ucsZ`kVE)`%<1q`_s^ z@7|!>znr5|H)2(k(uq__%Zisi!!Xpxo9wn7JE>qW3WZ)(ao8ns zoOrjyG$XnxMW=5vTVE0#nwgo2lrr3FHrHu=z1hu&hSuwKDi({OjYeL}vS@X6wWnOQ zTA_)FN@QnoZ)IgAwOQUw11NL`V4eHsYue4gKl_x99z887e^|g7b)oMyY@7%dVZ@%$5z4z`r{CkO| zsL%(L$%F9E(h|M!;!Cu|-%*2-d9(rm0jxa?3RJTnur}2yWhE7kBYXIAeY#H5Q#I8g zzuMWhP1T8#%H!=S>OftnllYl_wF5B4qM6vXZcBIvk_E7=KnY{}#+`%2cyEc0^l2Mt z_1Po8>8A&(bKM-kVm`aQF&9^SConS?G|W`IdWB*EZ8 zO2LipQHOiMV$GYXw6JiAs+Ee89L<%Abo%sJx_tRNYPDKi&hSL+bR4c+F4K)0KX-{I z%AyX`h16&?x*=p&UXTwYxY1ZwZPV_U+Nh^9W8u;zI)C8;8KLD!0SVU&ZA`;EN?9dmWAgzhFFDmJIUTDu zYWdG&t7JzdCnqOk2h_IP*&6+%1~EzGAjp?Pxg>xE8GS@h(y&db8hx2C1O!JqD#+`q z7SzxSK(pCY(i5eU@G)V_dh8U(v24c*jfo+KhI@uN5etdTGFkx|0Xu=H1Ds^#_lbV$ zfSC>k9ySYV2+0Ci9~?hM2j}K!t+Cb@D?^@IwMJJK7wP?D$2pvX&Kn#`=CJbqc@7|3M9ZDk|wp4nj1DIs_$fDNqN@hOU9f2a*M_o_*$NaugIk zwewtar4VxC@Um8A*Q2!OktaFC9O7$oL2I2kp;3$tJ#ULjBAx}{f@VB)7CcK+2hk&; zkSqYRyu2DHVfFf?%HuER@M<#_oZGDp6>9cddr>fzWF_f=+zzG>-UC|`WW-&Y6=bJW z*t+xWkB3o5!u&w0E()RJ`YcL)Dk(I*iCO{5eaYPU&H>wmdEEhksi*@R_aIK?lG-4m zsn~xA@eRKx^vowab^4e8)U0TxzEYp6YlPJuELb20A4DsVKt81}S^=H~laARij8-6z zznorR2AHK#S|ROvs#0yH1s13TmcrtQt2gT4GI)?uq&VV=yc#rYVJLRCF#HfpTqS!0 zX>BhXn7F!~#v&`$4U@P=h&s5AG$alTKB;S@0ke5K(iHvq(-(B>+L=VIkp@(b4sk_i zvB;W);QAeDxI0Ol@7{9QhE*c7P>yfAbh0I`ni!gTl#Br%DuT5`Zn0b98 zBOSohf~nPDf9-B(q{nf)(_PiaBm)u+7^9BZ+wOfw=&{2evfZdE@sQ3m|L4;F(KU;@8cl~ zs04N_84puN-=I9@&iCMeL7zceu&*sEo8=^Yjv=zMX}}<8)-?T72MBn%Mkb8njVC#+*m*om zNsgMEqn$nJv8hRR3Az5CBPq6Sbxvvsl4uUYNOl`4lIdAD$ST8QMsA+MCh8u>BxVj{ zM)~zGNw@#S!fv$m;9j{XXr-ZfSkPiVuHhc?T)T;rvNF=<>HYhf670J_eb7XjZ+B|* zN{7iCC_ed8(&9})t+hn{EHC-Tt0nquBsmW2XyOen`SvTK+oqAWVIaNgkiGODg&u6D zW0JZ+1@P>W`9CuHUh|PP0}!H1%!lF;3vrrR*`66Q+N zb5E)FJxDg_!s)#1!%O13F97KnQ1`wQ@?sFz&IY}l!>vntp2HJ^d}5zIubZ}ni?mgOuA{B P00000NkvXXu0mjfk#Sl3 literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/ios/AppIcon-76x76@2x.png b/apps/kiosk-client/src-tauri/icons/ios/AppIcon-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..aa8bf5ca1ab7f1cb91b2667782b3fffc0feda96e GIT binary patch literal 2715 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 VMQiEFc9j4C002ovPDHLkV1hd-6O#Y{ literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/apps/kiosk-client/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6f530ac5ea465f0141b03c7fba7feca04cae051 GIT binary patch literal 2783 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 literal 0 HcmV?d00001 diff --git a/apps/kiosk-client/src-tauri/src/config.rs b/apps/kiosk-client/src-tauri/src/config.rs new file mode 100644 index 0000000..f72b90d --- /dev/null +++ b/apps/kiosk-client/src-tauri/src/config.rs @@ -0,0 +1,157 @@ +use std::fs; +use std::path::PathBuf; + +use serde::{Deserialize, Serialize}; +use tauri::{AppHandle, Manager}; + +const CONFIG_FILE_NAME: &str = "kiosk.json"; +const PROVISION_PATHS: [&str; 2] = ["/boot/firmware/pistation.json", "/boot/pistation.json"]; + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct KioskConfig { + #[serde(default)] + pub server_url: String, + #[serde(default)] + pub enrollment_token: String, + #[serde(default)] + pub kiosk_token: String, + #[serde(default)] + pub kiosk_id: String, + #[serde(default)] + pub room_name: String, + #[serde(default)] + pub livekit_url: String, + #[serde(default)] + pub join_url: String, +} + +fn config_path(app: &AppHandle) -> Result { + let directory = app + .path() + .app_config_dir() + .map_err(|error| format!("no config directory: {error}"))?; + + fs::create_dir_all(&directory).map_err(|error| format!("cannot create config dir: {error}"))?; + Ok(directory.join(CONFIG_FILE_NAME)) +} + +fn read_provisioned() -> Option { + for path in PROVISION_PATHS { + let Ok(contents) = fs::read_to_string(path) else { + continue; + }; + if let Ok(config) = serde_json::from_str::(&contents) { + return Some(config); + } + } + None +} + +fn env_value(key: &str) -> Option { + std::env::var(key).ok().filter(|value| !value.is_empty()) +} + +/// Works out the effective configuration. +/// +/// Addresses come from, in order of increasing authority: what was saved last, the file on +/// the boot partition, then the environment. Someone who edits the boot file or sets a +/// variable is stating where this screen should point, and that has to beat whatever was +/// saved on a previous run, otherwise a kiosk can never be moved to a new server. +/// +/// Credentials work the other way. The kiosk token is earned at enrolment and is only +/// discarded when it is provably useless, which is when the server address changes. +fn merge_provisioned(mut config: KioskConfig) -> KioskConfig { + let provisioned = read_provisioned(); + + let mut server_url = config.server_url.clone(); + let mut join_url = config.join_url.clone(); + let mut enrollment_token = config.enrollment_token.clone(); + + if let Some(provisioned) = provisioned { + if !provisioned.server_url.is_empty() { + server_url = provisioned.server_url; + } + if !provisioned.join_url.is_empty() { + join_url = provisioned.join_url; + } + if !provisioned.enrollment_token.is_empty() { + enrollment_token = provisioned.enrollment_token; + } + } + + if let Some(value) = env_value("PISTATION_SERVER_URL") { + server_url = value; + } + if let Some(value) = env_value("PISTATION_JOIN_URL") { + join_url = value; + } + if let Some(value) = env_value("PISTATION_ENROLLMENT_TOKEN") { + enrollment_token = value; + } + + // A token issued by one server means nothing to another, so pointing somewhere new + // has to force a fresh enrolment rather than looping on rejected requests. + let is_moving = !config.server_url.is_empty() && config.server_url != server_url; + if is_moving { + eprintln!( + "[pistation] server changed from {} to {}, re-enrolling", + config.server_url, server_url + ); + config.kiosk_token.clear(); + config.kiosk_id.clear(); + } + + config.server_url = server_url; + config.join_url = join_url; + + // An enrolment token is only of use while there is no kiosk token to replace it. + config.enrollment_token = if config.kiosk_token.is_empty() { + enrollment_token + } else { + String::new() + }; + + config +} + +#[tauri::command] +pub fn load_config(app: AppHandle) -> Result { + let path = config_path(&app)?; + + let stored = fs::read_to_string(&path) + .ok() + .and_then(|contents| serde_json::from_str::(&contents).ok()) + .unwrap_or_default(); + + Ok(merge_provisioned(stored)) +} + +#[tauri::command] +pub fn save_config(app: AppHandle, config: KioskConfig) -> Result<(), String> { + let path = config_path(&app)?; + let contents = serde_json::to_string_pretty(&config) + .map_err(|error| format!("cannot serialize config: {error}"))?; + + fs::write(&path, contents).map_err(|error| format!("cannot write config: {error}")) +} + +#[tauri::command] +pub fn hardware_id() -> String { + for path in ["/etc/machine-id", "/var/lib/dbus/machine-id"] { + if let Ok(contents) = fs::read_to_string(path) { + let trimmed = contents.trim(); + if !trimmed.is_empty() { + return trimmed.to_string(); + } + } + } + + hostname() +} + +fn hostname() -> String { + fs::read_to_string("/etc/hostname") + .map(|value| value.trim().to_string()) + .unwrap_or_else(|_| "unknown-kiosk".to_string()) +} diff --git a/apps/kiosk-client/src-tauri/src/lib.rs b/apps/kiosk-client/src-tauri/src/lib.rs new file mode 100644 index 0000000..5cfe19d --- /dev/null +++ b/apps/kiosk-client/src-tauri/src/lib.rs @@ -0,0 +1,48 @@ +mod config; +mod metrics; +mod room; + +use tauri::Manager; + +#[tauri::command] +fn is_kiosk_mode() -> bool { + kiosk_mode_enabled() +} + +fn kiosk_mode_enabled() -> bool { + match std::env::var("PISTATION_KIOSK").ok().as_deref() { + Some("1") | Some("true") => true, + Some("0") | Some("false") => false, + _ => !cfg!(debug_assertions), + } +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .plugin(tauri_plugin_opener::init()) + .manage(room::RoomHandle::default()) + .invoke_handler(tauri::generate_handler![ + config::load_config, + config::save_config, + config::hardware_id, + metrics::collect_metrics, + is_kiosk_mode, + room::room_connect, + room::room_disconnect, + room::video_subscribe, + room::video_unsubscribe + ]) + .setup(|app| { + if let Some(window) = app.get_webview_window("main") { + if kiosk_mode_enabled() { + let _ = window.set_fullscreen(true); + let _ = window.set_always_on_top(true); + let _ = window.set_cursor_visible(false); + } + } + Ok(()) + }) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/apps/kiosk-client/src-tauri/src/main.rs b/apps/kiosk-client/src-tauri/src/main.rs new file mode 100644 index 0000000..d096d0c --- /dev/null +++ b/apps/kiosk-client/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() { + pistation_lib::run() +} diff --git a/apps/kiosk-client/src-tauri/src/metrics.rs b/apps/kiosk-client/src-tauri/src/metrics.rs new file mode 100644 index 0000000..d26a152 --- /dev/null +++ b/apps/kiosk-client/src-tauri/src/metrics.rs @@ -0,0 +1,154 @@ +use std::fs; +use std::sync::Mutex; + +use serde::Serialize; + +/// Previous CPU sample, so usage can be reported as a delta between heartbeats rather +/// than as the meaningless since-boot average. +static LAST_CPU_SAMPLE: Mutex> = Mutex::new(None); + +#[derive(Clone, Copy)] +struct CpuSample { + total: u64, + idle: u64, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +pub struct WifiMetrics { + pub interface: String, + pub link_quality: f32, + pub signal_dbm: f32, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Metrics { + pub cpu_percent: Option, + pub memory_used_bytes: u64, + pub memory_total_bytes: u64, + pub uptime_seconds: u64, + pub temperature_celsius: Option, + pub wifi: Option, +} + +#[tauri::command] +pub fn collect_metrics() -> Metrics { + let memory = read_memory().unwrap_or((0, 0)); + + Metrics { + cpu_percent: read_cpu_percent(), + memory_used_bytes: memory.0, + memory_total_bytes: memory.1, + uptime_seconds: read_uptime().unwrap_or(0), + temperature_celsius: read_temperature(), + wifi: read_wifi(), + } +} + +fn read_cpu_percent() -> Option { + let contents = fs::read_to_string("/proc/stat").ok()?; + let line = contents.lines().next()?; + if !line.starts_with("cpu ") { + return None; + } + + let values: Vec = line + .split_whitespace() + .skip(1) + .filter_map(|value| value.parse().ok()) + .collect(); + + if values.len() < 5 { + return None; + } + + let total: u64 = values.iter().sum(); + let idle = values[3] + values[4]; + let sample = CpuSample { total, idle }; + + let mut guard = LAST_CPU_SAMPLE.lock().ok()?; + let previous = guard.replace(sample); + + let previous = previous?; + let total_delta = total.checked_sub(previous.total)?; + let idle_delta = idle.checked_sub(previous.idle)?; + + if total_delta == 0 { + return None; + } + + let busy = total_delta.saturating_sub(idle_delta) as f32; + Some((busy / total_delta as f32) * 100.0) +} + +fn read_memory() -> Option<(u64, u64)> { + let contents = fs::read_to_string("/proc/meminfo").ok()?; + let mut total_kb = 0u64; + let mut available_kb = 0u64; + + for line in contents.lines() { + let mut parts = line.split_whitespace(); + let key = parts.next()?; + let value: u64 = parts.next().and_then(|value| value.parse().ok())?; + + match key { + "MemTotal:" => total_kb = value, + "MemAvailable:" => available_kb = value, + _ => {} + } + + if total_kb > 0 && available_kb > 0 { + break; + } + } + + if total_kb == 0 { + return None; + } + + let used_kb = total_kb.saturating_sub(available_kb); + Some((used_kb * 1024, total_kb * 1024)) +} + +fn read_uptime() -> Option { + let contents = fs::read_to_string("/proc/uptime").ok()?; + let seconds: f64 = contents.split_whitespace().next()?.parse().ok()?; + Some(seconds as u64) +} + +fn read_temperature() -> Option { + let raw = fs::read_to_string("/sys/class/thermal/thermal_zone0/temp").ok()?; + let millidegrees: f32 = raw.trim().parse().ok()?; + Some(millidegrees / 1000.0) +} + +fn read_wifi() -> Option { + let contents = fs::read_to_string("/proc/net/wireless").ok()?; + + for line in contents.lines().skip(2) { + let Some((interface, rest)) = line.split_once(':') else { + continue; + }; + + let values: Vec<&str> = rest.split_whitespace().collect(); + if values.len() < 3 { + continue; + } + + let link_quality = parse_wireless_number(values[1])?; + let signal_dbm = parse_wireless_number(values[2])?; + + return Some(WifiMetrics { + interface: interface.trim().to_string(), + link_quality, + signal_dbm, + }); + } + + None +} + +fn parse_wireless_number(raw: &str) -> Option { + raw.trim_end_matches('.').parse().ok() +} diff --git a/apps/kiosk-client/src-tauri/src/room/client.rs b/apps/kiosk-client/src-tauri/src/room/client.rs new file mode 100644 index 0000000..d500f73 --- /dev/null +++ b/apps/kiosk-client/src-tauri/src/room/client.rs @@ -0,0 +1,180 @@ +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::Arc; + +use livekit::track::{RemoteTrack, TrackSource}; +use livekit::{Room, RoomEvent, RoomOptions}; +use tauri::{AppHandle, Emitter}; +use tokio::sync::Mutex; + +use super::events::{ + DataPayload, ParticipantView, ParticipantsPayload, StatusPayload, DATA_EVENT, + PARTICIPANTS_EVENT, STATUS_EVENT, +}; +use super::video; + +/// Bumped on every connect attempt. Tasks belonging to a superseded connection compare +/// against this before emitting anything, so a room we deliberately replaced cannot +/// report itself as disconnected and trigger a pointless reconnect. +static GENERATION: AtomicU64 = AtomicU64::new(0); + +pub fn is_current(generation: u64) -> bool { + GENERATION.load(Ordering::SeqCst) == generation +} + +#[derive(Default)] +pub struct RoomHandle { + room: Mutex>>, +} + +impl RoomHandle { + pub async fn connect(&self, app: AppHandle, url: String, token: String) -> Result<(), String> { + let generation = GENERATION.fetch_add(1, Ordering::SeqCst) + 1; + + self.close_current().await; + video::stop(&app); + + emit_status(&app, generation, StatusPayload::new("connecting")); + + let (room, mut events) = Room::connect(&url, &token, RoomOptions::default()) + .await + .map_err(|error| error.to_string())?; + + if !is_current(generation) { + let _ = room.close().await; + return Ok(()); + } + + *self.room.lock().await = Some(Arc::new(room)); + emit_status(&app, generation, StatusPayload::new("connected")); + + let room_for_task = self.room.lock().await.clone(); + + tauri::async_runtime::spawn(async move { + if let Some(room) = room_for_task.as_ref() { + emit_participants(&app, generation, room); + } + + while let Some(event) = events.recv().await { + if !is_current(generation) { + return; + } + + if matches!( + event, + RoomEvent::ParticipantConnected(_) | RoomEvent::ParticipantDisconnected(_) + ) { + if let Some(room) = room_for_task.as_ref() { + emit_participants(&app, generation, room); + } + } + + handle_event(&app, generation, event); + } + + if is_current(generation) { + video::stop(&app); + emit_status(&app, generation, StatusPayload::new("disconnected")); + } + }); + + Ok(()) + } + + pub async fn disconnect(&self) { + GENERATION.fetch_add(1, Ordering::SeqCst); + self.close_current().await; + } + + async fn close_current(&self) { + let existing = self.room.lock().await.take(); + if let Some(room) = existing { + let _ = room.close().await; + } + } +} + +fn handle_event(app: &AppHandle, generation: u64, event: RoomEvent) { + match event { + RoomEvent::Connected { .. } => emit_status(app, generation, StatusPayload::new("connected")), + + RoomEvent::Reconnecting => { + emit_status(app, generation, StatusPayload::new("reconnecting")) + } + + RoomEvent::Reconnected => emit_status(app, generation, StatusPayload::new("connected")), + + RoomEvent::Disconnected { reason } => { + video::stop(app); + emit_status( + app, + generation, + StatusPayload::with_detail("disconnected", format!("{reason:?}")), + ); + } + + RoomEvent::DataReceived { payload, .. } => { + if let Ok(envelope) = String::from_utf8(payload.to_vec()) { + let _ = app.emit(DATA_EVENT, DataPayload { envelope }); + } + } + + RoomEvent::TrackSubscribed { + track, publication, .. + } => { + let priority = match publication.source() { + TrackSource::Screenshare => video::PRIORITY_SCREEN, + TrackSource::Camera => video::PRIORITY_CAMERA, + _ => return, + }; + + if let RemoteTrack::Video(video_track) = track { + video::start( + app.clone(), + generation, + video_track, + priority, + publication.sid().to_string(), + ); + } + } + + RoomEvent::TrackUnsubscribed { publication, .. } => { + video::stop_track(app, &publication.sid().to_string()); + } + + _ => {} + } +} + +fn emit_participants(app: &AppHandle, generation: u64, room: &Room) { + if !is_current(generation) { + return; + } + + let participants = room + .remote_participants() + .values() + .map(|participant| { + let identity = participant.identity().to_string(); + let name = participant.name(); + + ParticipantView { + display_name: if name.is_empty() { + identity.clone() + } else { + name + }, + identity, + } + }) + .collect(); + + let _ = app.emit(PARTICIPANTS_EVENT, ParticipantsPayload { participants }); +} + +fn emit_status(app: &AppHandle, generation: u64, payload: StatusPayload) { + if !is_current(generation) { + return; + } + let _ = app.emit(STATUS_EVENT, payload); +} diff --git a/apps/kiosk-client/src-tauri/src/room/events.rs b/apps/kiosk-client/src-tauri/src/room/events.rs new file mode 100644 index 0000000..278e2d5 --- /dev/null +++ b/apps/kiosk-client/src-tauri/src/room/events.rs @@ -0,0 +1,56 @@ +use serde::Serialize; + +pub const STATUS_EVENT: &str = "room://status"; +pub const DATA_EVENT: &str = "room://data"; +pub const VIDEO_EVENT: &str = "room://video"; +pub const PARTICIPANTS_EVENT: &str = "room://participants"; + +#[derive(Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ParticipantView { + pub identity: String, + pub display_name: String, +} + +#[derive(Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ParticipantsPayload { + pub participants: Vec, +} + +#[derive(Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct StatusPayload { + pub status: &'static str, + pub detail: Option, +} + +impl StatusPayload { + pub fn new(status: &'static str) -> Self { + Self { + status, + detail: None, + } + } + + pub fn with_detail(status: &'static str, detail: String) -> Self { + Self { + status, + detail: Some(detail), + } + } +} + +#[derive(Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct DataPayload { + pub envelope: String, +} + +#[derive(Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct VideoPayload { + pub active: bool, + pub width: u32, + pub height: u32, +} diff --git a/apps/kiosk-client/src-tauri/src/room/frames.rs b/apps/kiosk-client/src-tauri/src/room/frames.rs new file mode 100644 index 0000000..9eeeb1a --- /dev/null +++ b/apps/kiosk-client/src-tauri/src/room/frames.rs @@ -0,0 +1,131 @@ +use std::sync::Mutex; +use std::time::{Duration, Instant}; + +use image::codecs::jpeg::JpegEncoder; +use image::ExtendedColorType; +use tauri::ipc::{Channel, InvokeResponseBody}; + +/// Where encoded frames go. The webview opens this channel once and keeps it for the life +/// of the app, so video never has to travel as an event payload. +static SINK: Mutex>> = Mutex::new(None); +static LAST_SENT: Mutex> = Mutex::new(None); + +const DEFAULT_MAX_WIDTH: u32 = 1920; +const DEFAULT_FPS: u32 = 60; +const DEFAULT_QUALITY: u8 = 85; + +/// Read once at startup. A Pi will not keep up with the desktop defaults, so these are +/// tunable without a rebuild: PISTATION_VIDEO_MAX_WIDTH, _FPS and _QUALITY. +pub struct VideoSettings { + pub max_width: u32, + pub frame_interval: Duration, + pub quality: u8, +} + +fn settings() -> &'static VideoSettings { + static SETTINGS: std::sync::OnceLock = std::sync::OnceLock::new(); + + SETTINGS.get_or_init(|| { + let max_width = env_number("PISTATION_VIDEO_MAX_WIDTH", DEFAULT_MAX_WIDTH as u64) as u32; + let fps = (env_number("PISTATION_VIDEO_FPS", DEFAULT_FPS as u64) as u32).clamp(1, 120); + let quality = env_number("PISTATION_VIDEO_QUALITY", DEFAULT_QUALITY as u64).clamp(1, 100); + + VideoSettings { + max_width: max_width.max(160), + frame_interval: Duration::from_secs_f64(1.0 / fps as f64), + quality: quality as u8, + } + }) +} + +fn env_number(key: &str, fallback: u64) -> u64 { + std::env::var(key) + .ok() + .and_then(|value| value.parse().ok()) + .unwrap_or(fallback) +} + +pub fn set_sink(channel: Option>) { + if let Ok(mut guard) = SINK.lock() { + *guard = channel; + } + if let Ok(mut guard) = LAST_SENT.lock() { + *guard = None; + } +} + +pub fn has_sink() -> bool { + SINK.lock().map(|guard| guard.is_some()).unwrap_or(false) +} + +/// Returns the size this frame should be encoded at, or None when it should be dropped +/// because the previous one went out too recently. +pub fn next_target(width: u32, height: u32) -> Option<(u32, u32)> { + if width == 0 || height == 0 || !has_sink() { + return None; + } + + let config = settings(); + let mut guard = LAST_SENT.lock().ok()?; + + if let Some(last) = *guard { + if last.elapsed() < config.frame_interval { + return None; + } + } + + *guard = Some(Instant::now()); + + if width <= config.max_width { + return Some((width, height)); + } + + let scaled_height = ((height as f32) * (config.max_width as f32 / width as f32)).round() as u32; + Some((config.max_width, scaled_height.max(1))) +} + +/// Packs RGB into `rgb` from an R,G,B,A source and encodes into `encoded`. +/// +/// Both buffers are owned by the caller and reused across frames. At sixty frames a second +/// the allocations alone were costing more than the encode. +pub fn send(source: &[u8], rgb: &mut Vec, encoded: &mut Vec, width: u32, height: u32) { + let pixels = (width as usize) * (height as usize); + rgb.clear(); + rgb.reserve(pixels * 3); + + for pixel in source.chunks_exact(4) { + rgb.extend_from_slice(&pixel[..3]); + } + + encoded.clear(); + let mut encoder = JpegEncoder::new_with_quality(&mut *encoded, settings().quality); + + if let Err(error) = encoder.encode(rgb, width, height, ExtendedColorType::Rgb8) { + report_once(&format!("jpeg encode failed: {error}")); + return; + } + + let Ok(guard) = SINK.lock() else { + return; + }; + + if let Some(channel) = guard.as_ref() { + if let Err(error) = channel.send(InvokeResponseBody::Raw(std::mem::take(encoded))) { + report_once(&format!("could not push a frame to the webview: {error}")); + } + } +} + +/// Frames arrive many times a second, so a failure that repeats must not flood the log. +fn report_once(message: &str) { + static REPORTED: Mutex> = Mutex::new(None); + + if let Ok(mut guard) = REPORTED.lock() { + if guard.as_deref() == Some(message) { + return; + } + *guard = Some(message.to_string()); + } + + eprintln!("[pistation] {message}"); +} diff --git a/apps/kiosk-client/src-tauri/src/room/mod.rs b/apps/kiosk-client/src-tauri/src/room/mod.rs new file mode 100644 index 0000000..e15e8ff --- /dev/null +++ b/apps/kiosk-client/src-tauri/src/room/mod.rs @@ -0,0 +1,38 @@ +pub mod client; +mod events; +mod frames; +mod video; + +pub use client::RoomHandle; + +use tauri::ipc::{Channel, InvokeResponseBody}; +use tauri::{AppHandle, State}; + +/// The webview opens one channel for decoded video and keeps it open. Frames are JPEG +/// encoded in Rust and drawn onto a canvas, which keeps the annotation overlay working +/// exactly as it does in the browser. +#[tauri::command] +pub fn video_subscribe(channel: Channel) { + frames::set_sink(Some(channel)); +} + +#[tauri::command] +pub fn video_unsubscribe() { + frames::set_sink(None); +} + +#[tauri::command] +pub async fn room_connect( + app: AppHandle, + handle: State<'_, RoomHandle>, + url: String, + token: String, +) -> Result<(), String> { + handle.connect(app, url, token).await +} + +#[tauri::command] +pub async fn room_disconnect(handle: State<'_, RoomHandle>) -> Result<(), String> { + handle.disconnect().await; + Ok(()) +} diff --git a/apps/kiosk-client/src-tauri/src/room/video.rs b/apps/kiosk-client/src-tauri/src/room/video.rs new file mode 100644 index 0000000..a4602c2 --- /dev/null +++ b/apps/kiosk-client/src-tauri/src/room/video.rs @@ -0,0 +1,156 @@ +use std::sync::atomic::{AtomicBool, AtomicU64, AtomicU8, Ordering}; +use std::sync::Mutex; + +use futures_util::StreamExt; +use livekit::track::RemoteVideoTrack; +use livekit::webrtc::video_frame::native::VideoFrameBufferExt; +use livekit::webrtc::video_frame::VideoFormatType; +use livekit::webrtc::video_stream::native::NativeVideoStream; +use tauri::{AppHandle, Emitter}; + +use super::client::is_current; +use super::events::{VideoPayload, VIDEO_EVENT}; +use super::frames; + +static IS_STREAMING: AtomicBool = AtomicBool::new(false); + +/// Bumped whenever the displayed track changes, so a frame loop for a track we have moved +/// off stops without having to be cancelled directly. +static STREAM_EPOCH: AtomicU64 = AtomicU64::new(0); +static CURRENT_PRIORITY: AtomicU8 = AtomicU8::new(0); +static CURRENT_SID: Mutex> = Mutex::new(None); + +/// A shared screen always wins over a camera, so plugging in a presentation takes the +/// display back from whoever was pointing a phone at the room. +pub const PRIORITY_CAMERA: u8 = 1; +pub const PRIORITY_SCREEN: u8 = 2; + +/// Consumes decoded frames from the subscribed screen share. +/// +/// Frames are converted to BGRA, which on a little endian machine is the same layout as +/// cairo's ARgb32, and handed to the native drawing surface sitting under the webview. +pub fn start( + app: AppHandle, + generation: u64, + track: RemoteVideoTrack, + priority: u8, + sid: String, +) { + // A camera must not displace a screen share that is already on the display. + if IS_STREAMING.load(Ordering::SeqCst) && CURRENT_PRIORITY.load(Ordering::SeqCst) > priority { + return; + } + + let epoch = STREAM_EPOCH.fetch_add(1, Ordering::SeqCst) + 1; + CURRENT_PRIORITY.store(priority, Ordering::SeqCst); + IS_STREAMING.store(true, Ordering::SeqCst); + + if let Ok(mut guard) = CURRENT_SID.lock() { + *guard = Some(sid); + } + + tauri::async_runtime::spawn(async move { + let mut stream = NativeVideoStream::new(track.rtc_track()); + let mut last_size = (0u32, 0u32); + + // Reused across frames so a sixty frame per second stream does not allocate + // several megabytes per frame. + let mut rgba = Vec::new(); + let mut rgb = Vec::new(); + let mut encoded = Vec::new(); + + while let Some(frame) = stream.next().await { + if STREAM_EPOCH.load(Ordering::SeqCst) != epoch || !is_current(generation) { + return; + } + + let width = frame.buffer.width(); + let height = frame.buffer.height(); + if width == 0 || height == 0 { + continue; + } + + if (width, height) != last_size { + last_size = (width, height); + let _ = app.emit( + VIDEO_EVENT, + VideoPayload { + active: true, + width, + height, + }, + ); + } + + let Some((target_width, target_height)) = frames::next_target(width, height) else { + continue; + }; + + // to_argb converts, it does not resample, so the buffer has to be scaled + // first. Doing it in I420 is cheaper than scaling four channels of RGBA. + let mut i420 = frame.buffer.to_i420(); + let source = if (target_width, target_height) == (width, height) { + i420 + } else { + i420.scale(target_width as i32, target_height as i32) + }; + + let stride = target_width * 4; + rgba.resize((stride * target_height) as usize, 0); + + // libyuv names formats after the 32 bit word, not the byte order. On little + // endian its "RGBA" lands in memory as A,B,G,R, so taking the first three + // bytes as red, green and blue picked up alpha as red and tinted everything. + // "ABGR" is the one that lays out as R,G,B,A in memory. + source.to_argb( + VideoFormatType::ABGR, + &mut rgba, + stride, + target_width as i32, + target_height as i32, + ); + + frames::send(&rgba, &mut rgb, &mut encoded, target_width, target_height); + } + + // The stream ended on its own rather than being replaced. + if STREAM_EPOCH.load(Ordering::SeqCst) == epoch && is_current(generation) { + stop(&app); + } + }); +} + +/// Clears the display only if the track that went away is the one being shown. A camera +/// leaving must not blank a screen share that took over from it. +pub fn stop_track(app: &AppHandle, sid: &str) { + let is_current_track = CURRENT_SID + .lock() + .map(|guard| guard.as_deref() == Some(sid)) + .unwrap_or(false); + + if is_current_track { + stop(app); + } +} + +pub fn stop(app: &AppHandle) { + STREAM_EPOCH.fetch_add(1, Ordering::SeqCst); + CURRENT_PRIORITY.store(0, Ordering::SeqCst); + + if let Ok(mut guard) = CURRENT_SID.lock() { + *guard = None; + } + + if !IS_STREAMING.swap(false, Ordering::SeqCst) { + return; + } + + let _ = app.emit( + VIDEO_EVENT, + VideoPayload { + active: false, + width: 0, + height: 0, + }, + ); +} diff --git a/apps/kiosk-client/src-tauri/tauri.conf.json b/apps/kiosk-client/src-tauri/tauri.conf.json new file mode 100644 index 0000000..a94721e --- /dev/null +++ b/apps/kiosk-client/src-tauri/tauri.conf.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "pistation-kiosk", + "version": "0.1.0", + "identifier": "co.sirblob.pistation", + "build": { + "beforeDevCommand": "bun run dev", + "devUrl": "http://localhost:1420", + "beforeBuildCommand": "bun run build", + "frontendDist": "../build" + }, + "app": { + "windows": [ + { + "title": "PiStation", + "width": 1280, + "height": 720, + "fullscreen": false, + "decorations": false, + "resizable": true, + "focus": true + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": ["deb", "appimage"], + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } +} diff --git a/apps/kiosk-client/src/app.css b/apps/kiosk-client/src/app.css new file mode 100644 index 0000000..7652e23 --- /dev/null +++ b/apps/kiosk-client/src/app.css @@ -0,0 +1,33 @@ +@import "tailwindcss"; + +@source "../../../packages/ui/src"; + +@theme { + --color-surface-0: #0b0d10; + --color-surface-1: #14181d; + --color-surface-2: #1c2229; + --color-ink-0: #f4f6f8; + --color-ink-1: #a8b3c0; + --color-ink-2: #6b7885; + --color-accent: #4f7cff; + --color-danger: #ff3b52; + --color-success: #21c17a; + --font-sans: "Inter", system-ui, sans-serif; + --font-mono: "JetBrains Mono", "SF Mono", Menlo, monospace; +} + +* { + border-radius: 0 !important; +} + +html, +body { + height: 100%; + margin: 0; + overflow: hidden; + background-color: var(--color-surface-0); + color: var(--color-ink-0); + font-family: var(--font-sans); + user-select: none; + -webkit-font-smoothing: antialiased; +} diff --git a/apps/kiosk-client/src/app.html b/apps/kiosk-client/src/app.html new file mode 100644 index 0000000..71b5b8b --- /dev/null +++ b/apps/kiosk-client/src/app.html @@ -0,0 +1,13 @@ + + + + + + + PiStation Kiosk + %sveltekit.head% + + +

+ + diff --git a/apps/kiosk-client/src/lib/api.ts b/apps/kiosk-client/src/lib/api.ts new file mode 100644 index 0000000..39cb11a --- /dev/null +++ b/apps/kiosk-client/src/lib/api.ts @@ -0,0 +1,86 @@ +import type { KioskLayout, KioskPinResponse, KioskSessionResponse } from "@pistation/shared-types"; + +export interface RegisterResult { + kioskId: string; + kioskToken: string; + roomName: string; + livekitUrl: string; + rotationSeconds: number; +} + +export class KioskApiError extends Error { + readonly status: number; + + constructor(status: number, message: string) { + super(message); + this.status = status; + } +} + +async function request( + serverUrl: string, + path: string, + options: { method?: string; token?: string; body?: unknown } = {} +): Promise { + const headers: Record = {}; + if (options.body !== undefined) headers["content-type"] = "application/json"; + if (options.token) headers["authorization"] = `Bearer ${options.token}`; + + let response: Response; + + try { + response = await fetch(`${serverUrl.replace(/\/$/, "")}${path}`, { + method: options.method ?? "GET", + headers, + body: options.body === undefined ? undefined : JSON.stringify(options.body) + }); + } catch { + throw new KioskApiError(0, `could not reach the server at ${serverUrl}`); + } + + if (response.status === 204) return undefined as T; + + const payload = await response.json().catch(() => null); + + if (!response.ok) { + const message = (payload as { message?: string })?.message ?? `request failed: ${path}`; + throw new KioskApiError(response.status, message); + } + + return payload as T; +} + +export function registerKiosk( + serverUrl: string, + enrollmentToken: string, + hardwareId: string +): Promise { + return request(serverUrl, "/api/kiosk/register", { + method: "POST", + body: { enrollmentToken, hardwareId } + }); +} + +export function fetchPin(serverUrl: string, token: string): Promise { + return request(serverUrl, "/api/kiosk/pin", { token }); +} + +export function fetchSession(serverUrl: string, token: string): Promise { + return request(serverUrl, "/api/kiosk/session", { token }); +} + +export function fetchLayout(serverUrl: string, token: string): Promise { + return request(serverUrl, "/api/kiosk/layout", { token }); +} + +export function sendHeartbeat( + serverUrl: string, + token: string, + metrics: unknown +): Promise { + return request(serverUrl, "/api/kiosk/heartbeat", { + method: "POST", + token, + body: { metrics } + }); +} diff --git a/apps/kiosk-client/src/lib/components/JoinBadge.svelte b/apps/kiosk-client/src/lib/components/JoinBadge.svelte new file mode 100644 index 0000000..d64046e --- /dev/null +++ b/apps/kiosk-client/src/lib/components/JoinBadge.svelte @@ -0,0 +1,24 @@ + + +{#if pin} +
+ {#if joinUrl} +

Join at {joinUrl}

+ {:else} +

Join code

+ {/if} +

+ {formatPin(pin)} +

+
+{/if} diff --git a/apps/kiosk-client/src/lib/components/TitleBar.svelte b/apps/kiosk-client/src/lib/components/TitleBar.svelte new file mode 100644 index 0000000..ee6870b --- /dev/null +++ b/apps/kiosk-client/src/lib/components/TitleBar.svelte @@ -0,0 +1,50 @@ + + +
+ + PiStation kiosk + {status} + +
+ + + +
+
diff --git a/apps/kiosk-client/src/lib/components/VideoCanvas.svelte b/apps/kiosk-client/src/lib/components/VideoCanvas.svelte new file mode 100644 index 0000000..11c2667 --- /dev/null +++ b/apps/kiosk-client/src/lib/components/VideoCanvas.svelte @@ -0,0 +1,84 @@ + + + diff --git a/apps/kiosk-client/src/lib/kiosk.svelte.ts b/apps/kiosk-client/src/lib/kiosk.svelte.ts new file mode 100644 index 0000000..56c58f4 --- /dev/null +++ b/apps/kiosk-client/src/lib/kiosk.svelte.ts @@ -0,0 +1,293 @@ +import type { + DataEnvelope, + KioskLayout, + RoomMode, + WhiteboardElement +} from "@pistation/shared-types"; +import { + isNightModeActive, + isTopic, + mergeWhiteboardElements, + PIN_GRACE_SECONDS +} from "@pistation/shared-types"; +import type { ConnectionStatus } from "@pistation/client-core"; +import type { AnnotationState } from "@pistation/client-core/annotations"; +import { + applyAnnotationEvent, + createAnnotationState, + prunePointers +} from "@pistation/client-core/annotations"; +import { invoke } from "@tauri-apps/api/core"; + +import { NativeRoom, type RoomParticipant } from "./native-room"; + +import { + fetchLayout, + fetchPin, + fetchSession, + KioskApiError, + registerKiosk, + sendHeartbeat +} from "./api"; + +const HEARTBEAT_INTERVAL_MS = 30_000; +const LAYOUT_INTERVAL_MS = 60_000; +const PIN_FALLBACK_INTERVAL_MS = 20_000; + +interface KioskConfig { + serverUrl: string; + enrollmentToken: string; + kioskToken: string; + kioskId: string; + roomName: string; + livekitUrl: string; + joinUrl: string; +} + +export class KioskController { + status = $state("idle"); + provisioningError = $state(null); + pin = $state(null); + layout = $state(null); + mode = $state("idle"); + annotations = $state(createAnnotationState()); + whiteboardElements = $state([]); + participants = $state([]); + isScreenActive = $state(false); + screenWidth = $state(0); + screenHeight = $state(0); + joinUrl = $state(""); + mediaBaseUrl = $state(""); + isNight = $state(false); + connectionError = $state(null); + + private config: KioskConfig | null = null; + private connection: NativeRoom | null = null; + private timers: ReturnType[] = []; + private pinTimer: ReturnType | null = null; + private hasRetriedEnrollment = false; + + async start(): Promise { + try { + this.config = await invoke("load_config"); + } catch { + this.provisioningError = "Could not read the kiosk configuration file."; + return; + } + + if (!this.config.serverUrl) { + this.provisioningError = "No server URL configured. Provision this kiosk first."; + return; + } + + this.joinUrl = this.config.joinUrl; + this.mediaBaseUrl = this.config.serverUrl; + + if (!this.config.kioskToken) { + const registered = await this.register(); + if (!registered) return; + } + + void this.refreshPin(); + void this.refreshLayout(); + void this.connectToRoom(); + + this.addInterval(() => void this.heartbeat(), HEARTBEAT_INTERVAL_MS); + this.addInterval(() => void this.refreshLayout(), LAYOUT_INTERVAL_MS); + this.addInterval(() => { + this.annotations = prunePointers(this.annotations, Date.now()); + }, 1000); + this.addInterval(() => this.evaluateNightMode(), 20_000); + } + + async stop(): Promise { + for (const timer of this.timers) clearInterval(timer); + this.timers = []; + if (this.pinTimer) clearTimeout(this.pinTimer); + this.pinTimer = null; + await this.connection?.stop(); + this.connection = null; + } + + private addInterval(action: () => void, intervalMs: number): void { + this.timers.push(setInterval(action, intervalMs)); + } + + private async register(): Promise { + if (!this.config) return false; + + if (!this.config.enrollmentToken) { + this.provisioningError = "This kiosk has no enrollment token. Add one in the admin panel."; + return false; + } + + try { + const hardwareId = await invoke("hardware_id"); + const result = await registerKiosk( + this.config.serverUrl, + this.config.enrollmentToken, + hardwareId + ); + + this.config = { + ...this.config, + kioskId: result.kioskId, + kioskToken: result.kioskToken, + roomName: result.roomName, + livekitUrl: result.livekitUrl, + enrollmentToken: "" + }; + + await invoke("save_config", { config: this.config }); + this.provisioningError = null; + return true; + } catch (error) { + this.provisioningError = + error instanceof Error ? error.message : "Enrollment failed. Check the token."; + return false; + } + } + + private async handleRejectedToken(): Promise { + if (!this.config) return false; + + if (this.hasRetriedEnrollment) { + this.provisioningError = + "This kiosk's credentials were rejected. Rotate its enrollment token in the admin panel and run the installer again."; + return false; + } + + this.hasRetriedEnrollment = true; + this.config = { ...this.config, kioskToken: "" }; + await invoke("save_config", { config: this.config }); + + this.config = await invoke("load_config"); + if (!(await this.register())) return false; + + void this.refreshPin(); + void this.refreshLayout(); + void this.connectToRoom(); + return true; + } + + private async refreshPin(): Promise { + if (!this.config?.kioskToken) return; + + let delayMs = PIN_FALLBACK_INTERVAL_MS; + + try { + const issued = await fetchPin(this.config.serverUrl, this.config.kioskToken); + this.pin = issued.pin; + delayMs = Math.max(5000, issued.expiresAt - Date.now() - PIN_GRACE_SECONDS * 1000); + } catch (error) { + this.pin = null; + if (error instanceof KioskApiError && error.status === 401) { + if (await this.handleRejectedToken()) return; + } + } + + if (this.pinTimer) clearTimeout(this.pinTimer); + this.pinTimer = setTimeout(() => void this.refreshPin(), delayMs); + } + + private async refreshLayout(): Promise { + if (!this.config?.kioskToken) return; + + const layout = await fetchLayout(this.config.serverUrl, this.config.kioskToken).catch( + () => null + ); + if (!layout) return; + + this.layout = layout; + this.evaluateNightMode(); + } + + private evaluateNightMode(): void { + this.isNight = this.layout ? isNightModeActive(this.layout.nightMode) : false; + } + + private async heartbeat(): Promise { + if (!this.config?.kioskToken) return; + + const metrics = await invoke("collect_metrics").catch(() => null); + await sendHeartbeat(this.config.serverUrl, this.config.kioskToken, metrics).catch( + () => undefined + ); + } + + private async connectToRoom(): Promise { + if (!this.config?.kioskToken) return; + + const config = this.config; + + this.connection = new NativeRoom( + async () => { + const session = await fetchSession(config.serverUrl, config.kioskToken); + return { livekitUrl: session.livekitUrl, accessToken: session.accessToken }; + }, + { + onStatus: (status, detail) => { + this.status = status; + + if (status === "connected") { + this.connectionError = null; + return; + } + + if (status === "disconnected" || status === "failed") { + this.connectionError = detail; + this.isScreenActive = false; + this.mode = "idle"; + this.participants = []; + this.annotations = createAnnotationState(); + } + }, + onEnvelope: (envelope) => this.handleEnvelope(envelope), + onVideo: (active, width, height) => { + this.isScreenActive = active; + this.screenWidth = width; + this.screenHeight = height; + + if (active && this.mode === "idle") this.mode = "presentation"; + if (!active && this.mode === "presentation") this.mode = "idle"; + }, + onParticipants: (participants) => { + this.participants = participants; + } + } + ); + + await this.connection.start(); + } + + private handleEnvelope(envelope: DataEnvelope): void { + if (isTopic(envelope, "annotation")) { + this.annotations = applyAnnotationEvent( + this.annotations, + envelope.payload, + envelope.senderId + ); + return; + } + + if (isTopic(envelope, "control")) { + const event = envelope.payload; + if (event.type === "mode.set") this.mode = event.mode; + if (event.type === "room.state") this.mode = event.state.mode; + return; + } + + if (isTopic(envelope, "whiteboard")) { + const event = envelope.payload; + if (event.type === "whiteboard.patch") { + this.whiteboardElements = mergeWhiteboardElements(this.whiteboardElements, event.elements); + } + if (event.type === "whiteboard.snapshot") { + this.whiteboardElements = event.elements; + } + if (event.type === "whiteboard.clear") { + this.whiteboardElements = []; + } + } + } +} diff --git a/apps/kiosk-client/src/lib/native-room.ts b/apps/kiosk-client/src/lib/native-room.ts new file mode 100644 index 0000000..b1dc87d --- /dev/null +++ b/apps/kiosk-client/src/lib/native-room.ts @@ -0,0 +1,160 @@ +import type { ConnectionStatus } from "@pistation/client-core"; +import type { DataEnvelope } from "@pistation/shared-types"; +import { parseEnvelope } from "@pistation/shared-types"; +import { invoke } from "@tauri-apps/api/core"; +import { listen, type UnlistenFn } from "@tauri-apps/api/event"; + +interface StatusEvent { + status: string; + detail: string | null; +} + +interface DataEvent { + envelope: string; +} + +interface VideoEvent { + active: boolean; + width: number; + height: number; +} + +export interface RoomParticipant { + identity: string; + displayName: string; +} + +interface ParticipantsEvent { + participants: RoomParticipant[]; +} + +export interface Credentials { + livekitUrl: string; + accessToken: string; +} + +export interface NativeRoomHandlers { + onStatus(status: ConnectionStatus, detail: string | null): void; + onEnvelope(envelope: DataEnvelope): void; + onVideo(active: boolean, width: number, height: number): void; + onParticipants(participants: RoomParticipant[]): void; +} + +const RETRY_DELAYS_MS = [1000, 2000, 4000, 8000, 15000, 30000]; + +function toConnectionStatus(status: string): ConnectionStatus { + switch (status) { + case "connecting": + case "connected": + case "reconnecting": + case "disconnected": + return status; + default: + return "failed"; + } +} + +/// Media lives in Rust. This drives the native LiveKit client over Tauri commands and +/// turns its events back into the same shape the web client works with. +export class NativeRoom { + private fetchCredentials: () => Promise; + private handlers: NativeRoomHandlers; + private unlisteners: UnlistenFn[] = []; + private retryIndex = 0; + private retryTimer: ReturnType | null = null; + private stopped = false; + + constructor(fetchCredentials: () => Promise, handlers: NativeRoomHandlers) { + this.fetchCredentials = fetchCredentials; + this.handlers = handlers; + } + + async start(): Promise { + this.stopped = false; + await this.bindEvents(); + await this.attempt(); + } + + async stop(): Promise { + this.stopped = true; + this.clearRetry(); + + for (const unlisten of this.unlisteners) unlisten(); + this.unlisteners = []; + + await invoke("room_disconnect").catch(() => undefined); + } + + private async bindEvents(): Promise { + this.unlisteners.push( + await listen("room://status", (event) => { + const status = toConnectionStatus(event.payload.status); + this.handlers.onStatus(status, event.payload.detail); + + if (status === "connected") { + this.retryIndex = 0; + return; + } + + if (status === "disconnected" || status === "failed") { + this.scheduleRetry(); + } + }) + ); + + this.unlisteners.push( + await listen("room://data", (event) => { + const envelope = parseEnvelope(event.payload.envelope); + if (envelope) this.handlers.onEnvelope(envelope); + }) + ); + + this.unlisteners.push( + await listen("room://video", (event) => { + this.handlers.onVideo(event.payload.active, event.payload.width, event.payload.height); + }) + ); + + this.unlisteners.push( + await listen("room://participants", (event) => { + this.handlers.onParticipants(event.payload.participants); + }) + ); + } + + private async attempt(): Promise { + if (this.stopped) return; + + try { + const credentials = await this.fetchCredentials(); + await invoke("room_connect", { + url: credentials.livekitUrl, + token: credentials.accessToken + }); + } catch (error) { + const detail = error instanceof Error ? error.message : String(error); + console.error(`[pistation] native room connect failed: ${detail}`); + this.handlers.onStatus("failed", detail); + this.scheduleRetry(); + } + } + + private scheduleRetry(): void { + if (this.stopped || this.retryTimer) return; + + const delay = RETRY_DELAYS_MS[Math.min(this.retryIndex, RETRY_DELAYS_MS.length - 1)]; + this.retryIndex += 1; + + this.retryTimer = setTimeout(() => { + this.retryTimer = null; + void this.attempt(); + }, delay); + } + + private clearRetry(): void { + if (this.retryTimer) { + clearTimeout(this.retryTimer); + this.retryTimer = null; + } + } +} diff --git a/apps/kiosk-client/src/routes/+layout.svelte b/apps/kiosk-client/src/routes/+layout.svelte new file mode 100644 index 0000000..801be90 --- /dev/null +++ b/apps/kiosk-client/src/routes/+layout.svelte @@ -0,0 +1,7 @@ + + +{@render children()} diff --git a/apps/kiosk-client/src/routes/+layout.ts b/apps/kiosk-client/src/routes/+layout.ts new file mode 100644 index 0000000..9d24899 --- /dev/null +++ b/apps/kiosk-client/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/apps/kiosk-client/src/routes/+page.svelte b/apps/kiosk-client/src/routes/+page.svelte new file mode 100644 index 0000000..e595156 --- /dev/null +++ b/apps/kiosk-client/src/routes/+page.svelte @@ -0,0 +1,117 @@ + + +{#if controller} + {@const kiosk = controller} + {@const isPresenting = kiosk.mode === "presentation" && kiosk.isScreenActive} +
+ {#if !isKioskMode} + + {/if} + +
+ + + {#if kiosk.provisioningError} +
+ +
+

This kiosk is not set up yet

+

{kiosk.provisioningError}

+
+

+ Add the server URL and enrollment token to /boot/firmware/pistation.json and restart. +

+
+ {:else if kiosk.mode === "whiteboard"} + + {:else if isPresenting} + + {:else if kiosk.layout && kiosk.isNight} + + {:else if kiosk.layout} + + {:else} +
+ +
+ {/if} + + {#if (isPresenting || kiosk.mode === "whiteboard") && !kiosk.provisioningError} + + {/if} + + {#if kiosk.participants.length > 0 && !kiosk.provisioningError} +
+ + {kiosk.participants.length} + + {kiosk.participants.length === 1 ? "person connected" : "people connected"} + +
+ {/if} + + {#if !kiosk.provisioningError && kiosk.status !== "connected" && kiosk.status !== "idle"} +
+ +
+ + {kiosk.status === "connecting" ? "Connecting" : "Reconnecting"} + + {#if kiosk.connectionError} +

{kiosk.connectionError}

+ {/if} +
+
+ {/if} +
+
+{/if} diff --git a/apps/kiosk-client/static/logo.svg b/apps/kiosk-client/static/logo.svg new file mode 100644 index 0000000..166d7b2 --- /dev/null +++ b/apps/kiosk-client/static/logo.svg @@ -0,0 +1,24 @@ + + PiStation + + + + + + + + + + + + + + diff --git a/apps/kiosk-client/svelte.config.js b/apps/kiosk-client/svelte.config.js new file mode 100644 index 0000000..a7830ea --- /dev/null +++ b/apps/kiosk-client/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/apps/kiosk-client/tsconfig.json b/apps/kiosk-client/tsconfig.json new file mode 100644 index 0000000..f4d0a0e --- /dev/null +++ b/apps/kiosk-client/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/apps/kiosk-client/vite.config.js b/apps/kiosk-client/vite.config.js new file mode 100644 index 0000000..aa0abe9 --- /dev/null +++ b/apps/kiosk-client/vite.config.js @@ -0,0 +1,36 @@ +import { sveltekit } from "@sveltejs/kit/vite"; +import tailwindcss from "@tailwindcss/vite"; +import { defineConfig, searchForWorkspaceRoot } from "vite"; + +const host = process.env.TAURI_DEV_HOST; + +export default defineConfig({ + plugins: [tailwindcss(), sveltekit()], + + ssr: { + noExternal: ["@pistation/shared-types", "@pistation/client-core", "@pistation/ui"] + }, + + optimizeDeps: { + include: ["react", "react-dom", "react-dom/client"] + }, + + define: { + "process.env.IS_PREACT": JSON.stringify("false") + }, + + clearScreen: false, + + server: { + port: 1420, + strictPort: true, + host: host || false, + hmr: host ? { protocol: "ws", host, port: 1421 } : undefined, + fs: { + allow: [searchForWorkspaceRoot(process.cwd())] + }, + watch: { + ignored: ["**/src-tauri/**"] + } + } +});