cat / goq
clone

turns a linux box into a private steam streaming appliance: plug in, tap your key, play from another computer

Spike 006: Input injection over Iroh via enigo

dami etoile committed 087b4d0
- Host receives newline-delimited JSON input events over Iroh BiStream
- Injects mouse move/click/scroll and keyboard events via enigo
- Client has test mode (--test-input) and interactive stdin mode
- CLI host prints addr_json on stdout for easy piping
- Input event protocol: {t:mm/mc/md/mu/ms/kd/ku/kt/tx}
commit
087b4d054c4761c999be7e9b3b44508aac33faf4
parent
16b51a4cfc09e3166ffb9561aee6d35cf82b5f63
author
dami etoile <dami.etoile@gmail.com>
3 files changed, +6100 -0
Aspikes/006-input-injection/Cargo.lock5717++++++++++++++++++++++++++++++
Aspikes/006-input-injection/Cargo.toml15+
Aspikes/006-input-injection/src/main.rs368++
A spikes/006-input-injection/Cargo.lock +5717 -0
@@ -0,0 +1,5717 @@
1+# This file is automatically @generated by Cargo.2+# It is not intended for manual editing.3+version = 44+5+[[package]]6+name = "adler2"7+version = "2.0.1"8+source = "registry+https://github.com/rust-lang/crates.io-index"9+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"10+11+[[package]]12+name = "aead"13+version = "0.5.2"14+source = "registry+https://github.com/rust-lang/crates.io-index"15+checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0"16+dependencies = [17+ "crypto-common 0.1.7",18+ "generic-array",19+]20+21+[[package]]22+name = "aes"23+version = "0.8.4"24+source = "registry+https://github.com/rust-lang/crates.io-index"25+checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0"26+dependencies = [27+ "cfg-if",28+ "cipher",29+ "cpufeatures 0.2.17",30+]31+32+[[package]]33+name = "aes-gcm"34+version = "0.10.3"35+source = "registry+https://github.com/rust-lang/crates.io-index"36+checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1"37+dependencies = [38+ "aead",39+ "aes",40+ "cipher",41+ "ctr",42+ "ghash",43+ "subtle",44+]45+46+[[package]]47+name = "aho-corasick"48+version = "1.1.4"49+source = "registry+https://github.com/rust-lang/crates.io-index"50+checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"51+dependencies = [52+ "memchr",53+]54+55+[[package]]56+name = "allocator-api2"57+version = "0.2.21"58+source = "registry+https://github.com/rust-lang/crates.io-index"59+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"60+61+[[package]]62+name = "android_system_properties"63+version = "0.1.5"64+source = "registry+https://github.com/rust-lang/crates.io-index"65+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"66+dependencies = [67+ "libc",68+]69+70+[[package]]71+name = "annotate-snippets"72+version = "0.11.5"73+source = "registry+https://github.com/rust-lang/crates.io-index"74+checksum = "710e8eae58854cdc1790fcb56cca04d712a17be849eeb81da2a724bf4bae2bc4"75+dependencies = [76+ "anstyle",77+ "unicode-width",78+]79+80+[[package]]81+name = "anstyle"82+version = "1.0.14"83+source = "registry+https://github.com/rust-lang/crates.io-index"84+checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"85+86+[[package]]87+name = "anyhow"88+version = "1.0.102"89+source = "registry+https://github.com/rust-lang/crates.io-index"90+checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"91+92+[[package]]93+name = "arc-swap"94+version = "1.9.1"95+source = "registry+https://github.com/rust-lang/crates.io-index"96+checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207"97+dependencies = [98+ "rustversion",99+]100+101+[[package]]102+name = "arrayref"103+version = "0.3.9"104+source = "registry+https://github.com/rust-lang/crates.io-index"105+checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"106+107+[[package]]108+name = "arrayvec"109+version = "0.7.7"110+source = "registry+https://github.com/rust-lang/crates.io-index"111+checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe"112+113+[[package]]114+name = "async-broadcast"115+version = "0.7.2"116+source = "registry+https://github.com/rust-lang/crates.io-index"117+checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532"118+dependencies = [119+ "event-listener",120+ "event-listener-strategy",121+ "futures-core",122+ "pin-project-lite",123+]124+125+[[package]]126+name = "async-channel"127+version = "2.5.0"128+source = "registry+https://github.com/rust-lang/crates.io-index"129+checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"130+dependencies = [131+ "concurrent-queue",132+ "event-listener-strategy",133+ "futures-core",134+ "pin-project-lite",135+]136+137+[[package]]138+name = "async-executor"139+version = "1.14.0"140+source = "registry+https://github.com/rust-lang/crates.io-index"141+checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a"142+dependencies = [143+ "async-task",144+ "concurrent-queue",145+ "fastrand",146+ "futures-lite",147+ "pin-project-lite",148+ "slab",149+]150+151+[[package]]152+name = "async-io"153+version = "2.6.0"154+source = "registry+https://github.com/rust-lang/crates.io-index"155+checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc"156+dependencies = [157+ "autocfg",158+ "cfg-if",159+ "concurrent-queue",160+ "futures-io",161+ "futures-lite",162+ "parking",163+ "polling",164+ "rustix 1.1.4",165+ "slab",166+ "windows-sys 0.61.2",167+]168+169+[[package]]170+name = "async-lock"171+version = "3.4.2"172+source = "registry+https://github.com/rust-lang/crates.io-index"173+checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311"174+dependencies = [175+ "event-listener",176+ "event-listener-strategy",177+ "pin-project-lite",178+]179+180+[[package]]181+name = "async-process"182+version = "2.5.0"183+source = "registry+https://github.com/rust-lang/crates.io-index"184+checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75"185+dependencies = [186+ "async-channel",187+ "async-io",188+ "async-lock",189+ "async-signal",190+ "async-task",191+ "blocking",192+ "cfg-if",193+ "event-listener",194+ "futures-lite",195+ "rustix 1.1.4",196+]197+198+[[package]]199+name = "async-recursion"200+version = "1.1.1"201+source = "registry+https://github.com/rust-lang/crates.io-index"202+checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"203+dependencies = [204+ "proc-macro2",205+ "quote",206+ "syn",207+]208+209+[[package]]210+name = "async-signal"211+version = "0.2.14"212+source = "registry+https://github.com/rust-lang/crates.io-index"213+checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485"214+dependencies = [215+ "async-io",216+ "async-lock",217+ "atomic-waker",218+ "cfg-if",219+ "futures-core",220+ "futures-io",221+ "rustix 1.1.4",222+ "signal-hook-registry",223+ "slab",224+ "windows-sys 0.61.2",225+]226+227+[[package]]228+name = "async-task"229+version = "4.7.1"230+source = "registry+https://github.com/rust-lang/crates.io-index"231+checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"232+233+[[package]]234+name = "async-trait"235+version = "0.1.89"236+source = "registry+https://github.com/rust-lang/crates.io-index"237+checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"238+dependencies = [239+ "proc-macro2",240+ "quote",241+ "syn",242+]243+244+[[package]]245+name = "async_io_stream"246+version = "0.3.3"247+source = "registry+https://github.com/rust-lang/crates.io-index"248+checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c"249+dependencies = [250+ "futures",251+ "pharos",252+ "rustc_version",253+]254+255+[[package]]256+name = "atomic-waker"257+version = "1.1.2"258+source = "registry+https://github.com/rust-lang/crates.io-index"259+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"260+261+[[package]]262+name = "attohttpc"263+version = "0.30.1"264+source = "registry+https://github.com/rust-lang/crates.io-index"265+checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9"266+dependencies = [267+ "base64",268+ "http",269+ "log",270+ "url",271+]272+273+[[package]]274+name = "autocfg"275+version = "1.5.1"276+source = "registry+https://github.com/rust-lang/crates.io-index"277+checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"278+279+[[package]]280+name = "backon"281+version = "1.6.0"282+source = "registry+https://github.com/rust-lang/crates.io-index"283+checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef"284+dependencies = [285+ "fastrand",286+ "gloo-timers",287+ "tokio",288+]289+290+[[package]]291+name = "base16ct"292+version = "1.0.0"293+source = "registry+https://github.com/rust-lang/crates.io-index"294+checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6"295+296+[[package]]297+name = "base64"298+version = "0.22.1"299+source = "registry+https://github.com/rust-lang/crates.io-index"300+checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"301+302+[[package]]303+name = "base64ct"304+version = "1.8.3"305+source = "registry+https://github.com/rust-lang/crates.io-index"306+checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06"307+308+[[package]]309+name = "bindgen"310+version = "0.72.1"311+source = "registry+https://github.com/rust-lang/crates.io-index"312+checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895"313+dependencies = [314+ "annotate-snippets",315+ "bitflags 2.13.0",316+ "cexpr",317+ "clang-sys",318+ "itertools",319+ "proc-macro2",320+ "quote",321+ "regex",322+ "rustc-hash",323+ "shlex 1.3.0",324+ "syn",325+]326+327+[[package]]328+name = "bitflags"329+version = "1.3.2"330+source = "registry+https://github.com/rust-lang/crates.io-index"331+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"332+333+[[package]]334+name = "bitflags"335+version = "2.13.0"336+source = "registry+https://github.com/rust-lang/crates.io-index"337+checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"338+339+[[package]]340+name = "blake3"341+version = "1.8.5"342+source = "registry+https://github.com/rust-lang/crates.io-index"343+checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce"344+dependencies = [345+ "arrayref",346+ "arrayvec",347+ "cc",348+ "cfg-if",349+ "constant_time_eq",350+ "cpufeatures 0.3.0",351+]352+353+[[package]]354+name = "block-buffer"355+version = "0.12.1"356+source = "registry+https://github.com/rust-lang/crates.io-index"357+checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa"358+dependencies = [359+ "hybrid-array",360+]361+362+[[package]]363+name = "block-sys"364+version = "0.2.1"365+source = "registry+https://github.com/rust-lang/crates.io-index"366+checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7"367+dependencies = [368+ "objc-sys",369+]370+371+[[package]]372+name = "block2"373+version = "0.4.0"374+source = "registry+https://github.com/rust-lang/crates.io-index"375+checksum = "e58aa60e59d8dbfcc36138f5f18be5f24394d33b38b24f7fd0b1caa33095f22f"376+dependencies = [377+ "block-sys",378+ "objc2 0.5.2",379+]380+381+[[package]]382+name = "block2"383+version = "0.6.2"384+source = "registry+https://github.com/rust-lang/crates.io-index"385+checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"386+dependencies = [387+ "objc2 0.6.4",388+]389+390+[[package]]391+name = "blocking"392+version = "1.6.2"393+source = "registry+https://github.com/rust-lang/crates.io-index"394+checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21"395+dependencies = [396+ "async-channel",397+ "async-task",398+ "futures-io",399+ "futures-lite",400+ "piper",401+]402+403+[[package]]404+name = "bumpalo"405+version = "3.20.3"406+source = "registry+https://github.com/rust-lang/crates.io-index"407+checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"408+409+[[package]]410+name = "bytemuck"411+version = "1.25.0"412+source = "registry+https://github.com/rust-lang/crates.io-index"413+checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec"414+dependencies = [415+ "bytemuck_derive",416+]417+418+[[package]]419+name = "bytemuck_derive"420+version = "1.10.2"421+source = "registry+https://github.com/rust-lang/crates.io-index"422+checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff"423+dependencies = [424+ "proc-macro2",425+ "quote",426+ "syn",427+]428+429+[[package]]430+name = "byteorder-lite"431+version = "0.1.0"432+source = "registry+https://github.com/rust-lang/crates.io-index"433+checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"434+435+[[package]]436+name = "bytes"437+version = "1.12.0"438+source = "registry+https://github.com/rust-lang/crates.io-index"439+checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593"440+441+[[package]]442+name = "cc"443+version = "1.2.65"444+source = "registry+https://github.com/rust-lang/crates.io-index"445+checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96"446+dependencies = [447+ "find-msvc-tools",448+ "shlex 2.0.1",449+]450+451+[[package]]452+name = "cesu8"453+version = "1.1.0"454+source = "registry+https://github.com/rust-lang/crates.io-index"455+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"456+457+[[package]]458+name = "cexpr"459+version = "0.6.0"460+source = "registry+https://github.com/rust-lang/crates.io-index"461+checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"462+dependencies = [463+ "nom 7.1.3",464+]465+466+[[package]]467+name = "cfg-expr"468+version = "0.20.8"469+source = "registry+https://github.com/rust-lang/crates.io-index"470+checksum = "fb693542bcafa528e198be0ebd9d3632ca5b7c93dbe7237460e199910835997c"471+dependencies = [472+ "smallvec",473+ "target-lexicon",474+]475+476+[[package]]477+name = "cfg-if"478+version = "1.0.4"479+source = "registry+https://github.com/rust-lang/crates.io-index"480+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"481+482+[[package]]483+name = "cfg_aliases"484+version = "0.2.1"485+source = "registry+https://github.com/rust-lang/crates.io-index"486+checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"487+488+[[package]]489+name = "chacha20"490+version = "0.10.0"491+source = "registry+https://github.com/rust-lang/crates.io-index"492+checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"493+dependencies = [494+ "cfg-if",495+ "cpufeatures 0.3.0",496+ "rand_core 0.10.1",497+]498+499+[[package]]500+name = "chrono"501+version = "0.4.45"502+source = "registry+https://github.com/rust-lang/crates.io-index"503+checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"504+dependencies = [505+ "iana-time-zone",506+ "num-traits",507+ "serde",508+ "windows-link",509+]510+511+[[package]]512+name = "cipher"513+version = "0.4.4"514+source = "registry+https://github.com/rust-lang/crates.io-index"515+checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"516+dependencies = [517+ "crypto-common 0.1.7",518+ "inout",519+]520+521+[[package]]522+name = "clang-sys"523+version = "1.8.1"524+source = "registry+https://github.com/rust-lang/crates.io-index"525+checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"526+dependencies = [527+ "glob",528+ "libc",529+ "libloading",530+]531+532+[[package]]533+name = "cmov"534+version = "0.5.4"535+source = "registry+https://github.com/rust-lang/crates.io-index"536+checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a"537+538+[[package]]539+name = "cobs"540+version = "0.3.0"541+source = "registry+https://github.com/rust-lang/crates.io-index"542+checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1"543+dependencies = [544+ "thiserror 2.0.18",545+]546+547+[[package]]548+name = "combine"549+version = "4.6.7"550+source = "registry+https://github.com/rust-lang/crates.io-index"551+checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"552+dependencies = [553+ "bytes",554+ "memchr",555+]556+557+[[package]]558+name = "concurrent-queue"559+version = "2.5.0"560+source = "registry+https://github.com/rust-lang/crates.io-index"561+checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"562+dependencies = [563+ "crossbeam-utils",564+]565+566+[[package]]567+name = "const-oid"568+version = "0.10.2"569+source = "registry+https://github.com/rust-lang/crates.io-index"570+checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c"571+572+[[package]]573+name = "constant_time_eq"574+version = "0.4.2"575+source = "registry+https://github.com/rust-lang/crates.io-index"576+checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b"577+578+[[package]]579+name = "convert_case"580+version = "0.8.0"581+source = "registry+https://github.com/rust-lang/crates.io-index"582+checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f"583+dependencies = [584+ "unicode-segmentation",585+]586+587+[[package]]588+name = "convert_case"589+version = "0.10.0"590+source = "registry+https://github.com/rust-lang/crates.io-index"591+checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9"592+dependencies = [593+ "unicode-segmentation",594+]595+596+[[package]]597+name = "cookie-factory"598+version = "0.3.3"599+source = "registry+https://github.com/rust-lang/crates.io-index"600+checksum = "9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2"601+602+[[package]]603+name = "cordyceps"604+version = "0.3.4"605+source = "registry+https://github.com/rust-lang/crates.io-index"606+checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a"607+dependencies = [608+ "loom",609+ "tracing",610+]611+612+[[package]]613+name = "core-foundation"614+version = "0.9.4"615+source = "registry+https://github.com/rust-lang/crates.io-index"616+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"617+dependencies = [618+ "core-foundation-sys",619+ "libc",620+]621+622+[[package]]623+name = "core-foundation"624+version = "0.10.1"625+source = "registry+https://github.com/rust-lang/crates.io-index"626+checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"627+dependencies = [628+ "core-foundation-sys",629+ "libc",630+]631+632+[[package]]633+name = "core-foundation-sys"634+version = "0.8.7"635+source = "registry+https://github.com/rust-lang/crates.io-index"636+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"637+638+[[package]]639+name = "core-graphics"640+version = "0.23.2"641+source = "registry+https://github.com/rust-lang/crates.io-index"642+checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081"643+dependencies = [644+ "bitflags 1.3.2",645+ "core-foundation 0.9.4",646+ "core-graphics-types",647+ "foreign-types",648+ "libc",649+]650+651+[[package]]652+name = "core-graphics-types"653+version = "0.1.3"654+source = "registry+https://github.com/rust-lang/crates.io-index"655+checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf"656+dependencies = [657+ "bitflags 1.3.2",658+ "core-foundation 0.9.4",659+ "libc",660+]661+662+[[package]]663+name = "cpufeatures"664+version = "0.2.17"665+source = "registry+https://github.com/rust-lang/crates.io-index"666+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"667+dependencies = [668+ "libc",669+]670+671+[[package]]672+name = "cpufeatures"673+version = "0.3.0"674+source = "registry+https://github.com/rust-lang/crates.io-index"675+checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201"676+dependencies = [677+ "libc",678+]679+680+[[package]]681+name = "crc32fast"682+version = "1.5.0"683+source = "registry+https://github.com/rust-lang/crates.io-index"684+checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"685+dependencies = [686+ "cfg-if",687+]688+689+[[package]]690+name = "critical-section"691+version = "1.2.0"692+source = "registry+https://github.com/rust-lang/crates.io-index"693+checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"694+695+[[package]]696+name = "crossbeam-channel"697+version = "0.5.15"698+source = "registry+https://github.com/rust-lang/crates.io-index"699+checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"700+dependencies = [701+ "crossbeam-utils",702+]703+704+[[package]]705+name = "crossbeam-epoch"706+version = "0.9.18"707+source = "registry+https://github.com/rust-lang/crates.io-index"708+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"709+dependencies = [710+ "crossbeam-utils",711+]712+713+[[package]]714+name = "crossbeam-utils"715+version = "0.8.21"716+source = "registry+https://github.com/rust-lang/crates.io-index"717+checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"718+719+[[package]]720+name = "crypto-common"721+version = "0.1.7"722+source = "registry+https://github.com/rust-lang/crates.io-index"723+checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"724+dependencies = [725+ "generic-array",726+ "typenum",727+]728+729+[[package]]730+name = "crypto-common"731+version = "0.2.2"732+source = "registry+https://github.com/rust-lang/crates.io-index"733+checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453"734+dependencies = [735+ "hybrid-array",736+]737+738+[[package]]739+name = "ctr"740+version = "0.9.2"741+source = "registry+https://github.com/rust-lang/crates.io-index"742+checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835"743+dependencies = [744+ "cipher",745+]746+747+[[package]]748+name = "ctutils"749+version = "0.4.2"750+source = "registry+https://github.com/rust-lang/crates.io-index"751+checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e"752+dependencies = [753+ "cmov",754+]755+756+[[package]]757+name = "curve25519-dalek"758+version = "5.0.0-rc.0"759+source = "registry+https://github.com/rust-lang/crates.io-index"760+checksum = "4f359e08ca85e7bd759e1fd933ff2bccd81864c60a8fba0e259c7f822b0924bf"761+dependencies = [762+ "cfg-if",763+ "cpufeatures 0.3.0",764+ "curve25519-dalek-derive",765+ "digest",766+ "fiat-crypto",767+ "rand_core 0.10.1",768+ "rustc_version",769+ "serde",770+ "subtle",771+ "zeroize",772+]773+774+[[package]]775+name = "curve25519-dalek-derive"776+version = "0.1.1"777+source = "registry+https://github.com/rust-lang/crates.io-index"778+checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"779+dependencies = [780+ "proc-macro2",781+ "quote",782+ "syn",783+]784+785+[[package]]786+name = "darling"787+version = "0.20.11"788+source = "registry+https://github.com/rust-lang/crates.io-index"789+checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"790+dependencies = [791+ "darling_core",792+ "darling_macro",793+]794+795+[[package]]796+name = "darling_core"797+version = "0.20.11"798+source = "registry+https://github.com/rust-lang/crates.io-index"799+checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e"800+dependencies = [801+ "fnv",802+ "ident_case",803+ "proc-macro2",804+ "quote",805+ "strsim",806+ "syn",807+]808+809+[[package]]810+name = "darling_macro"811+version = "0.20.11"812+source = "registry+https://github.com/rust-lang/crates.io-index"813+checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"814+dependencies = [815+ "darling_core",816+ "quote",817+ "syn",818+]819+820+[[package]]821+name = "data-encoding"822+version = "2.11.0"823+source = "registry+https://github.com/rust-lang/crates.io-index"824+checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"825+826+[[package]]827+name = "data-encoding-macro"828+version = "0.1.20"829+source = "registry+https://github.com/rust-lang/crates.io-index"830+checksum = "3259c913752a86488b501ed8680446a5ed2d5aeac6e596cb23ba3800768ea32c"831+dependencies = [832+ "data-encoding",833+ "data-encoding-macro-internal",834+]835+836+[[package]]837+name = "data-encoding-macro-internal"838+version = "0.1.18"839+source = "registry+https://github.com/rust-lang/crates.io-index"840+checksum = "ccc2776f0c61eca1ca32528f85548abd1a4be8fb53d1b21c013e4f18da1e7090"841+dependencies = [842+ "data-encoding",843+ "syn",844+]845+846+[[package]]847+name = "der"848+version = "0.8.0"849+source = "registry+https://github.com/rust-lang/crates.io-index"850+checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b"851+dependencies = [852+ "const-oid",853+ "pem-rfc7468",854+ "zeroize",855+]856+857+[[package]]858+name = "deranged"859+version = "0.5.8"860+source = "registry+https://github.com/rust-lang/crates.io-index"861+checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"862+863+[[package]]864+name = "derive_builder"865+version = "0.20.2"866+source = "registry+https://github.com/rust-lang/crates.io-index"867+checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947"868+dependencies = [869+ "derive_builder_macro",870+]871+872+[[package]]873+name = "derive_builder_core"874+version = "0.20.2"875+source = "registry+https://github.com/rust-lang/crates.io-index"876+checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8"877+dependencies = [878+ "darling",879+ "proc-macro2",880+ "quote",881+ "syn",882+]883+884+[[package]]885+name = "derive_builder_macro"886+version = "0.20.2"887+source = "registry+https://github.com/rust-lang/crates.io-index"888+checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"889+dependencies = [890+ "derive_builder_core",891+ "syn",892+]893+894+[[package]]895+name = "derive_more"896+version = "2.1.1"897+source = "registry+https://github.com/rust-lang/crates.io-index"898+checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134"899+dependencies = [900+ "derive_more-impl",901+]902+903+[[package]]904+name = "derive_more-impl"905+version = "2.1.1"906+source = "registry+https://github.com/rust-lang/crates.io-index"907+checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb"908+dependencies = [909+ "convert_case 0.10.0",910+ "proc-macro2",911+ "quote",912+ "rustc_version",913+ "syn",914+ "unicode-xid",915+]916+917+[[package]]918+name = "diatomic-waker"919+version = "0.2.3"920+source = "registry+https://github.com/rust-lang/crates.io-index"921+checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c"922+923+[[package]]924+name = "digest"925+version = "0.11.3"926+source = "registry+https://github.com/rust-lang/crates.io-index"927+checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2"928+dependencies = [929+ "block-buffer",930+ "crypto-common 0.2.2",931+]932+933+[[package]]934+name = "dispatch2"935+version = "0.3.1"936+source = "registry+https://github.com/rust-lang/crates.io-index"937+checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38"938+dependencies = [939+ "bitflags 2.13.0",940+ "block2 0.6.2",941+ "libc",942+ "objc2 0.6.4",943+]944+945+[[package]]946+name = "displaydoc"947+version = "0.2.6"948+source = "registry+https://github.com/rust-lang/crates.io-index"949+checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"950+dependencies = [951+ "proc-macro2",952+ "quote",953+ "syn",954+]955+956+[[package]]957+name = "dlib"958+version = "0.5.3"959+source = "registry+https://github.com/rust-lang/crates.io-index"960+checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a"961+dependencies = [962+ "libloading",963+]964+965+[[package]]966+name = "dlopen2"967+version = "0.8.2"968+source = "registry+https://github.com/rust-lang/crates.io-index"969+checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4"970+dependencies = [971+ "libc",972+ "once_cell",973+ "winapi",974+]975+976+[[package]]977+name = "downcast-rs"978+version = "1.2.1"979+source = "registry+https://github.com/rust-lang/crates.io-index"980+checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"981+982+[[package]]983+name = "drm"984+version = "0.14.1"985+source = "registry+https://github.com/rust-lang/crates.io-index"986+checksum = "80bc8c5c6c2941f70a55c15f8d9f00f9710ebda3ffda98075f996a0e6c92756f"987+dependencies = [988+ "bitflags 2.13.0",989+ "bytemuck",990+ "drm-ffi",991+ "drm-fourcc",992+ "libc",993+ "rustix 0.38.44",994+]995+996+[[package]]997+name = "drm-ffi"998+version = "0.9.1"999+source = "registry+https://github.com/rust-lang/crates.io-index"1000+checksum = "51a91c9b32ac4e8105dec255e849e0d66e27d7c34d184364fb93e469db08f690"1001+dependencies = [1002+ "drm-sys",1003+ "rustix 1.1.4",1004+]1005+1006+[[package]]1007+name = "drm-fourcc"1008+version = "2.2.0"1009+source = "registry+https://github.com/rust-lang/crates.io-index"1010+checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4"1011+1012+[[package]]1013+name = "drm-sys"1014+version = "0.8.1"1015+source = "registry+https://github.com/rust-lang/crates.io-index"1016+checksum = "ecc8e1361066d91f5ffccff060a3c3be9c3ecde15be2959c1937595f7a82a9f8"1017+dependencies = [1018+ "libc",1019+ "linux-raw-sys 0.9.4",1020+]1021+1022+[[package]]1023+name = "ed25519"1024+version = "3.0.0"1025+source = "registry+https://github.com/rust-lang/crates.io-index"1026+checksum = "29fcf32e6c73d1079f83ab4d782de2d81620346a5f38c6237a86a22f8368980a"1027+dependencies = [1028+ "pkcs8",1029+ "serdect",1030+ "signature",1031+]1032+1033+[[package]]1034+name = "ed25519-dalek"1035+version = "3.0.0-rc.0"1036+source = "registry+https://github.com/rust-lang/crates.io-index"1037+checksum = "b011170fe4f04665565b4110afef66774fe9ffff278f3eb5b81cc73d26e27d60"1038+dependencies = [1039+ "curve25519-dalek",1040+ "ed25519",1041+ "rand_core 0.10.1",1042+ "serde",1043+ "sha2",1044+ "signature",1045+ "subtle",1046+ "zeroize",1047+]1048+1049+[[package]]1050+name = "either"1051+version = "1.16.0"1052+source = "registry+https://github.com/rust-lang/crates.io-index"1053+checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e"1054+1055+[[package]]1056+name = "embedded-io"1057+version = "0.4.0"1058+source = "registry+https://github.com/rust-lang/crates.io-index"1059+checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced"1060+1061+[[package]]1062+name = "embedded-io"1063+version = "0.6.1"1064+source = "registry+https://github.com/rust-lang/crates.io-index"1065+checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"1066+1067+[[package]]1068+name = "endi"1069+version = "1.1.1"1070+source = "registry+https://github.com/rust-lang/crates.io-index"1071+checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099"1072+1073+[[package]]1074+name = "enigo"1075+version = "0.2.1"1076+source = "registry+https://github.com/rust-lang/crates.io-index"1077+checksum = "0087a01fc8591217447d28005379fb5a183683cc83f0a4707af28cc6603f70fb"1078+dependencies = [1079+ "core-graphics",1080+ "foreign-types-shared",1081+ "icrate",1082+ "libc",1083+ "log",1084+ "objc2 0.5.2",1085+ "serde",1086+ "windows 0.56.0",1087+ "xkbcommon",1088+ "xkeysym",1089+]1090+1091+[[package]]1092+name = "enum-assoc"1093+version = "1.3.0"1094+source = "registry+https://github.com/rust-lang/crates.io-index"1095+checksum = "3ed8956bd5c1f0415200516e78ff07ec9e16415ade83c056c230d7b7ea0d55b7"1096+dependencies = [1097+ "proc-macro2",1098+ "quote",1099+ "syn",1100+]1101+1102+[[package]]1103+name = "enumflags2"1104+version = "0.7.12"1105+source = "registry+https://github.com/rust-lang/crates.io-index"1106+checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef"1107+dependencies = [1108+ "enumflags2_derive",1109+ "serde",1110+]1111+1112+[[package]]1113+name = "enumflags2_derive"1114+version = "0.7.12"1115+source = "registry+https://github.com/rust-lang/crates.io-index"1116+checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827"1117+dependencies = [1118+ "proc-macro2",1119+ "quote",1120+ "syn",1121+]1122+1123+[[package]]1124+name = "equivalent"1125+version = "1.0.2"1126+source = "registry+https://github.com/rust-lang/crates.io-index"1127+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"1128+1129+[[package]]1130+name = "errno"1131+version = "0.3.14"1132+source = "registry+https://github.com/rust-lang/crates.io-index"1133+checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"1134+dependencies = [1135+ "libc",1136+ "windows-sys 0.61.2",1137+]1138+1139+[[package]]1140+name = "event-listener"1141+version = "5.4.1"1142+source = "registry+https://github.com/rust-lang/crates.io-index"1143+checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"1144+dependencies = [1145+ "concurrent-queue",1146+ "parking",1147+ "pin-project-lite",1148+]1149+1150+[[package]]1151+name = "event-listener-strategy"1152+version = "0.5.4"1153+source = "registry+https://github.com/rust-lang/crates.io-index"1154+checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"1155+dependencies = [1156+ "event-listener",1157+ "pin-project-lite",1158+]1159+1160+[[package]]1161+name = "fastrand"1162+version = "2.4.1"1163+source = "registry+https://github.com/rust-lang/crates.io-index"1164+checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6"1165+1166+[[package]]1167+name = "fdeflate"1168+version = "0.3.7"1169+source = "registry+https://github.com/rust-lang/crates.io-index"1170+checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"1171+dependencies = [1172+ "simd-adler32",1173+]1174+1175+[[package]]1176+name = "fiat-crypto"1177+version = "0.3.0"1178+source = "registry+https://github.com/rust-lang/crates.io-index"1179+checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24"1180+1181+[[package]]1182+name = "find-msvc-tools"1183+version = "0.1.9"1184+source = "registry+https://github.com/rust-lang/crates.io-index"1185+checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"1186+1187+[[package]]1188+name = "flate2"1189+version = "1.1.9"1190+source = "registry+https://github.com/rust-lang/crates.io-index"1191+checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"1192+dependencies = [1193+ "crc32fast",1194+ "miniz_oxide",1195+]1196+1197+[[package]]1198+name = "fnv"1199+version = "1.0.7"1200+source = "registry+https://github.com/rust-lang/crates.io-index"1201+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"1202+1203+[[package]]1204+name = "foldhash"1205+version = "0.2.0"1206+source = "registry+https://github.com/rust-lang/crates.io-index"1207+checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"1208+1209+[[package]]1210+name = "foreign-types"1211+version = "0.5.0"1212+source = "registry+https://github.com/rust-lang/crates.io-index"1213+checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"1214+dependencies = [1215+ "foreign-types-macros",1216+ "foreign-types-shared",1217+]1218+1219+[[package]]1220+name = "foreign-types-macros"1221+version = "0.2.3"1222+source = "registry+https://github.com/rust-lang/crates.io-index"1223+checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"1224+dependencies = [1225+ "proc-macro2",1226+ "quote",1227+ "syn",1228+]1229+1230+[[package]]1231+name = "foreign-types-shared"1232+version = "0.3.1"1233+source = "registry+https://github.com/rust-lang/crates.io-index"1234+checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"1235+1236+[[package]]1237+name = "form_urlencoded"1238+version = "1.2.2"1239+source = "registry+https://github.com/rust-lang/crates.io-index"1240+checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"1241+dependencies = [1242+ "percent-encoding",1243+]1244+1245+[[package]]1246+name = "futures"1247+version = "0.3.32"1248+source = "registry+https://github.com/rust-lang/crates.io-index"1249+checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d"1250+dependencies = [1251+ "futures-channel",1252+ "futures-core",1253+ "futures-executor",1254+ "futures-io",1255+ "futures-sink",1256+ "futures-task",1257+ "futures-util",1258+]1259+1260+[[package]]1261+name = "futures-buffered"1262+version = "0.2.13"1263+source = "registry+https://github.com/rust-lang/crates.io-index"1264+checksum = "4421cb78ee172b6b06080093479d3c50f058e7c81b7d577bbb8d118d551d4cd5"1265+dependencies = [1266+ "cordyceps",1267+ "diatomic-waker",1268+ "futures-core",1269+ "pin-project-lite",1270+ "spin",1271+]1272+1273+[[package]]1274+name = "futures-channel"1275+version = "0.3.32"1276+source = "registry+https://github.com/rust-lang/crates.io-index"1277+checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"1278+dependencies = [1279+ "futures-core",1280+ "futures-sink",1281+]1282+1283+[[package]]1284+name = "futures-core"1285+version = "0.3.32"1286+source = "registry+https://github.com/rust-lang/crates.io-index"1287+checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"1288+1289+[[package]]1290+name = "futures-executor"1291+version = "0.3.32"1292+source = "registry+https://github.com/rust-lang/crates.io-index"1293+checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d"1294+dependencies = [1295+ "futures-core",1296+ "futures-task",1297+ "futures-util",1298+]1299+1300+[[package]]1301+name = "futures-io"1302+version = "0.3.32"1303+source = "registry+https://github.com/rust-lang/crates.io-index"1304+checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718"1305+1306+[[package]]1307+name = "futures-lite"1308+version = "2.6.1"1309+source = "registry+https://github.com/rust-lang/crates.io-index"1310+checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"1311+dependencies = [1312+ "fastrand",1313+ "futures-core",1314+ "futures-io",1315+ "parking",1316+ "pin-project-lite",1317+]1318+1319+[[package]]1320+name = "futures-macro"1321+version = "0.3.32"1322+source = "registry+https://github.com/rust-lang/crates.io-index"1323+checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b"1324+dependencies = [1325+ "proc-macro2",1326+ "quote",1327+ "syn",1328+]1329+1330+[[package]]1331+name = "futures-sink"1332+version = "0.3.32"1333+source = "registry+https://github.com/rust-lang/crates.io-index"1334+checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893"1335+1336+[[package]]1337+name = "futures-task"1338+version = "0.3.32"1339+source = "registry+https://github.com/rust-lang/crates.io-index"1340+checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"1341+1342+[[package]]1343+name = "futures-util"1344+version = "0.3.32"1345+source = "registry+https://github.com/rust-lang/crates.io-index"1346+checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"1347+dependencies = [1348+ "futures-channel",1349+ "futures-core",1350+ "futures-io",1351+ "futures-macro",1352+ "futures-sink",1353+ "futures-task",1354+ "memchr",1355+ "pin-project-lite",1356+ "slab",1357+]1358+1359+[[package]]1360+name = "gbm"1361+version = "0.18.0"1362+source = "registry+https://github.com/rust-lang/crates.io-index"1363+checksum = "ce852e998d3ca5e4a97014fb31c940dc5ef344ec7d364984525fd11e8a547e6a"1364+dependencies = [1365+ "bitflags 2.13.0",1366+ "drm",1367+ "drm-fourcc",1368+ "gbm-sys",1369+ "libc",1370+ "wayland-backend",1371+ "wayland-server",1372+]1373+1374+[[package]]1375+name = "gbm-sys"1376+version = "0.4.0"1377+source = "registry+https://github.com/rust-lang/crates.io-index"1378+checksum = "c13a5f2acc785d8fb6bf6b7ab6bfb0ef5dad4f4d97e8e70bb8e470722312f76f"1379+dependencies = [1380+ "libc",1381+]1382+1383+[[package]]1384+name = "generator"1385+version = "0.8.9"1386+source = "registry+https://github.com/rust-lang/crates.io-index"1387+checksum = "b3b854b0e584ead1a33f18b2fcad7cf7be18b3875c78816b753639aa501513ae"1388+dependencies = [1389+ "cc",1390+ "cfg-if",1391+ "libc",1392+ "log",1393+ "rustversion",1394+ "windows-link",1395+ "windows-result 0.4.1",1396+]1397+1398+[[package]]1399+name = "generic-array"1400+version = "0.14.7"1401+source = "registry+https://github.com/rust-lang/crates.io-index"1402+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"1403+dependencies = [1404+ "typenum",1405+ "version_check",1406+]1407+1408+[[package]]1409+name = "getrandom"1410+version = "0.2.17"1411+source = "registry+https://github.com/rust-lang/crates.io-index"1412+checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"1413+dependencies = [1414+ "cfg-if",1415+ "js-sys",1416+ "libc",1417+ "wasi",1418+ "wasm-bindgen",1419+]1420+1421+[[package]]1422+name = "getrandom"1423+version = "0.3.4"1424+source = "registry+https://github.com/rust-lang/crates.io-index"1425+checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"1426+dependencies = [1427+ "cfg-if",1428+ "libc",1429+ "r-efi 5.3.0",1430+ "wasip2",1431+]1432+1433+[[package]]1434+name = "getrandom"1435+version = "0.4.3"1436+source = "registry+https://github.com/rust-lang/crates.io-index"1437+checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"1438+dependencies = [1439+ "cfg-if",1440+ "js-sys",1441+ "libc",1442+ "r-efi 6.0.0",1443+ "rand_core 0.10.1",1444+ "wasm-bindgen",1445+]1446+1447+[[package]]1448+name = "ghash"1449+version = "0.5.1"1450+source = "registry+https://github.com/rust-lang/crates.io-index"1451+checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1"1452+dependencies = [1453+ "opaque-debug",1454+ "polyval",1455+]1456+1457+[[package]]1458+name = "gl"1459+version = "0.14.0"1460+source = "registry+https://github.com/rust-lang/crates.io-index"1461+checksum = "a94edab108827d67608095e269cf862e60d920f144a5026d3dbcfd8b877fb404"1462+dependencies = [1463+ "gl_generator",1464+]1465+1466+[[package]]1467+name = "gl_generator"1468+version = "0.14.0"1469+source = "registry+https://github.com/rust-lang/crates.io-index"1470+checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d"1471+dependencies = [1472+ "khronos_api",1473+ "log",1474+ "xml-rs",1475+]1476+1477+[[package]]1478+name = "glob"1479+version = "0.3.3"1480+source = "registry+https://github.com/rust-lang/crates.io-index"1481+checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"1482+1483+[[package]]1484+name = "gloo-timers"1485+version = "0.3.0"1486+source = "registry+https://github.com/rust-lang/crates.io-index"1487+checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994"1488+dependencies = [1489+ "futures-channel",1490+ "futures-core",1491+ "js-sys",1492+ "wasm-bindgen",1493+]1494+1495+[[package]]1496+name = "h2"1497+version = "0.4.15"1498+source = "registry+https://github.com/rust-lang/crates.io-index"1499+checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155"1500+dependencies = [1501+ "atomic-waker",1502+ "bytes",1503+ "fnv",1504+ "futures-core",1505+ "futures-sink",1506+ "http",1507+ "indexmap",1508+ "slab",1509+ "tokio",1510+ "tokio-util",1511+ "tracing",1512+]1513+1514+[[package]]1515+name = "hashbrown"1516+version = "0.17.1"1517+source = "registry+https://github.com/rust-lang/crates.io-index"1518+checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"1519+dependencies = [1520+ "allocator-api2",1521+ "equivalent",1522+ "foldhash",1523+]1524+1525+[[package]]1526+name = "heck"1527+version = "0.5.0"1528+source = "registry+https://github.com/rust-lang/crates.io-index"1529+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"1530+1531+[[package]]1532+name = "hermit-abi"1533+version = "0.5.2"1534+source = "registry+https://github.com/rust-lang/crates.io-index"1535+checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"1536+1537+[[package]]1538+name = "hex"1539+version = "0.4.3"1540+source = "registry+https://github.com/rust-lang/crates.io-index"1541+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"1542+1543+[[package]]1544+name = "hickory-net"1545+version = "0.26.1"1546+source = "registry+https://github.com/rust-lang/crates.io-index"1547+checksum = "e2295ed2f9c31e471e1428a8f88a3f0e1f4b27c15049592138d1eebe9c35b183"1548+dependencies = [1549+ "async-trait",1550+ "bytes",1551+ "cfg-if",1552+ "data-encoding",1553+ "futures-channel",1554+ "futures-io",1555+ "futures-util",1556+ "h2",1557+ "hickory-proto",1558+ "http",1559+ "idna",1560+ "ipnet",1561+ "jni 0.22.4",1562+ "rand 0.10.1",1563+ "rustls",1564+ "thiserror 2.0.18",1565+ "tinyvec",1566+ "tokio",1567+ "tokio-rustls",1568+ "tracing",1569+ "url",1570+]1571+1572+[[package]]1573+name = "hickory-proto"1574+version = "0.26.1"1575+source = "registry+https://github.com/rust-lang/crates.io-index"1576+checksum = "0bab31817bfb44672a252e97fe81cd0c18d1b2cf892108922f6818820df8c643"1577+dependencies = [1578+ "data-encoding",1579+ "idna",1580+ "ipnet",1581+ "jni 0.22.4",1582+ "once_cell",1583+ "prefix-trie",1584+ "rand 0.10.1",1585+ "ring",1586+ "thiserror 2.0.18",1587+ "tinyvec",1588+ "tracing",1589+ "url",1590+]1591+1592+[[package]]1593+name = "hickory-resolver"1594+version = "0.26.1"1595+source = "registry+https://github.com/rust-lang/crates.io-index"1596+checksum = "f0d58d28879ceecde6607729660c2667a081ccdc082e082675042793960f178c"1597+dependencies = [1598+ "cfg-if",1599+ "futures-util",1600+ "hickory-net",1601+ "hickory-proto",1602+ "ipconfig",1603+ "ipnet",1604+ "jni 0.22.4",1605+ "moka",1606+ "ndk-context",1607+ "once_cell",1608+ "parking_lot",1609+ "rand 0.10.1",1610+ "resolv-conf",1611+ "rustls",1612+ "smallvec",1613+ "system-configuration",1614+ "thiserror 2.0.18",1615+ "tokio",1616+ "tokio-rustls",1617+ "tracing",1618+]1619+1620+[[package]]1621+name = "http"1622+version = "1.4.2"1623+source = "registry+https://github.com/rust-lang/crates.io-index"1624+checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425"1625+dependencies = [1626+ "bytes",1627+ "itoa",1628+]1629+1630+[[package]]1631+name = "http-body"1632+version = "1.0.1"1633+source = "registry+https://github.com/rust-lang/crates.io-index"1634+checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"1635+dependencies = [1636+ "bytes",1637+ "http",1638+]1639+1640+[[package]]1641+name = "http-body-util"1642+version = "0.1.3"1643+source = "registry+https://github.com/rust-lang/crates.io-index"1644+checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"1645+dependencies = [1646+ "bytes",1647+ "futures-core",1648+ "http",1649+ "http-body",1650+ "pin-project-lite",1651+]1652+1653+[[package]]1654+name = "httparse"1655+version = "1.10.1"1656+source = "registry+https://github.com/rust-lang/crates.io-index"1657+checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"1658+1659+[[package]]1660+name = "httpdate"1661+version = "1.0.3"1662+source = "registry+https://github.com/rust-lang/crates.io-index"1663+checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"1664+1665+[[package]]1666+name = "hybrid-array"1667+version = "0.4.12"1668+source = "registry+https://github.com/rust-lang/crates.io-index"1669+checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da"1670+dependencies = [1671+ "typenum",1672+]1673+1674+[[package]]1675+name = "hyper"1676+version = "1.10.1"1677+source = "registry+https://github.com/rust-lang/crates.io-index"1678+checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498"1679+dependencies = [1680+ "atomic-waker",1681+ "bytes",1682+ "futures-channel",1683+ "futures-core",1684+ "h2",1685+ "http",1686+ "http-body",1687+ "httparse",1688+ "httpdate",1689+ "itoa",1690+ "pin-project-lite",1691+ "smallvec",1692+ "tokio",1693+ "want",1694+]1695+1696+[[package]]1697+name = "hyper-rustls"1698+version = "0.27.9"1699+source = "registry+https://github.com/rust-lang/crates.io-index"1700+checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f"1701+dependencies = [1702+ "http",1703+ "hyper",1704+ "hyper-util",1705+ "rustls",1706+ "tokio",1707+ "tokio-rustls",1708+ "tower-service",1709+]1710+1711+[[package]]1712+name = "hyper-util"1713+version = "0.1.20"1714+source = "registry+https://github.com/rust-lang/crates.io-index"1715+checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"1716+dependencies = [1717+ "base64",1718+ "bytes",1719+ "futures-channel",1720+ "futures-util",1721+ "http",1722+ "http-body",1723+ "hyper",1724+ "ipnet",1725+ "libc",1726+ "percent-encoding",1727+ "pin-project-lite",1728+ "socket2",1729+ "tokio",1730+ "tower-service",1731+ "tracing",1732+]1733+1734+[[package]]1735+name = "iana-time-zone"1736+version = "0.1.65"1737+source = "registry+https://github.com/rust-lang/crates.io-index"1738+checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"1739+dependencies = [1740+ "android_system_properties",1741+ "core-foundation-sys",1742+ "iana-time-zone-haiku",1743+ "js-sys",1744+ "log",1745+ "wasm-bindgen",1746+ "windows-core 0.62.2",1747+]1748+1749+[[package]]1750+name = "iana-time-zone-haiku"1751+version = "0.1.2"1752+source = "registry+https://github.com/rust-lang/crates.io-index"1753+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"1754+dependencies = [1755+ "cc",1756+]1757+1758+[[package]]1759+name = "icrate"1760+version = "0.1.2"1761+source = "registry+https://github.com/rust-lang/crates.io-index"1762+checksum = "3fb69199826926eb864697bddd27f73d9fddcffc004f5733131e15b465e30642"1763+dependencies = [1764+ "block2 0.4.0",1765+ "objc2 0.5.2",1766+]1767+1768+[[package]]1769+name = "icu_collections"1770+version = "2.2.0"1771+source = "registry+https://github.com/rust-lang/crates.io-index"1772+checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c"1773+dependencies = [1774+ "displaydoc",1775+ "potential_utf",1776+ "utf8_iter",1777+ "yoke",1778+ "zerofrom",1779+ "zerovec",1780+]1781+1782+[[package]]1783+name = "icu_locale_core"1784+version = "2.2.0"1785+source = "registry+https://github.com/rust-lang/crates.io-index"1786+checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29"1787+dependencies = [1788+ "displaydoc",1789+ "litemap",1790+ "tinystr",1791+ "writeable",1792+ "zerovec",1793+]1794+1795+[[package]]1796+name = "icu_normalizer"1797+version = "2.2.0"1798+source = "registry+https://github.com/rust-lang/crates.io-index"1799+checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4"1800+dependencies = [1801+ "icu_collections",1802+ "icu_normalizer_data",1803+ "icu_properties",1804+ "icu_provider",1805+ "smallvec",1806+ "zerovec",1807+]1808+1809+[[package]]1810+name = "icu_normalizer_data"1811+version = "2.2.0"1812+source = "registry+https://github.com/rust-lang/crates.io-index"1813+checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38"1814+1815+[[package]]1816+name = "icu_properties"1817+version = "2.2.0"1818+source = "registry+https://github.com/rust-lang/crates.io-index"1819+checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de"1820+dependencies = [1821+ "icu_collections",1822+ "icu_locale_core",1823+ "icu_properties_data",1824+ "icu_provider",1825+ "zerotrie",1826+ "zerovec",1827+]1828+1829+[[package]]1830+name = "icu_properties_data"1831+version = "2.2.0"1832+source = "registry+https://github.com/rust-lang/crates.io-index"1833+checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14"1834+1835+[[package]]1836+name = "icu_provider"1837+version = "2.2.0"1838+source = "registry+https://github.com/rust-lang/crates.io-index"1839+checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421"1840+dependencies = [1841+ "displaydoc",1842+ "icu_locale_core",1843+ "writeable",1844+ "yoke",1845+ "zerofrom",1846+ "zerotrie",1847+ "zerovec",1848+]1849+1850+[[package]]1851+name = "ident_case"1852+version = "1.0.1"1853+source = "registry+https://github.com/rust-lang/crates.io-index"1854+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"1855+1856+[[package]]1857+name = "identity-hash"1858+version = "0.1.0"1859+source = "registry+https://github.com/rust-lang/crates.io-index"1860+checksum = "dfdd7caa900436d8f13b2346fe10257e0c05c1f1f9e351f4f5d57c03bd5f45da"1861+1862+[[package]]1863+name = "idna"1864+version = "1.1.0"1865+source = "registry+https://github.com/rust-lang/crates.io-index"1866+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"1867+dependencies = [1868+ "idna_adapter",1869+ "smallvec",1870+ "utf8_iter",1871+]1872+1873+[[package]]1874+name = "idna_adapter"1875+version = "1.2.2"1876+source = "registry+https://github.com/rust-lang/crates.io-index"1877+checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714"1878+dependencies = [1879+ "icu_normalizer",1880+ "icu_properties",1881+]1882+1883+[[package]]1884+name = "igd-next"1885+version = "0.17.1"1886+source = "registry+https://github.com/rust-lang/crates.io-index"1887+checksum = "de7238d487a9aff61f81b5ab41c0a841532a115a398b5fa92a2fadd0885e2581"1888+dependencies = [1889+ "attohttpc",1890+ "bytes",1891+ "futures",1892+ "http",1893+ "http-body-util",1894+ "hyper",1895+ "hyper-util",1896+ "log",1897+ "rand 0.10.1",1898+ "tokio",1899+ "url",1900+ "xmltree",1901+]1902+1903+[[package]]1904+name = "image"1905+version = "0.25.10"1906+source = "registry+https://github.com/rust-lang/crates.io-index"1907+checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104"1908+dependencies = [1909+ "bytemuck",1910+ "byteorder-lite",1911+ "moxcms",1912+ "num-traits",1913+ "png",1914+ "zune-core",1915+ "zune-jpeg",1916+]1917+1918+[[package]]1919+name = "indexmap"1920+version = "2.14.0"1921+source = "registry+https://github.com/rust-lang/crates.io-index"1922+checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"1923+dependencies = [1924+ "equivalent",1925+ "hashbrown",1926+]1927+1928+[[package]]1929+name = "inout"1930+version = "0.1.4"1931+source = "registry+https://github.com/rust-lang/crates.io-index"1932+checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"1933+dependencies = [1934+ "generic-array",1935+]1936+1937+[[package]]1938+name = "ipconfig"1939+version = "0.3.4"1940+source = "registry+https://github.com/rust-lang/crates.io-index"1941+checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222"1942+dependencies = [1943+ "socket2",1944+ "widestring",1945+ "windows-registry",1946+ "windows-result 0.4.1",1947+ "windows-sys 0.61.2",1948+]1949+1950+[[package]]1951+name = "ipnet"1952+version = "2.12.0"1953+source = "registry+https://github.com/rust-lang/crates.io-index"1954+checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2"1955+dependencies = [1956+ "serde",1957+]1958+1959+[[package]]1960+name = "iroh"1961+version = "1.0.0"1962+source = "registry+https://github.com/rust-lang/crates.io-index"1963+checksum = "6435544bb3a5c4e6ff7affaa0c0aa0d1bca45bd700226329d5059d3eb54f9dff"1964+dependencies = [1965+ "backon",1966+ "blake3",1967+ "bytes",1968+ "cfg_aliases",1969+ "ctutils",1970+ "data-encoding",1971+ "derive_more",1972+ "ed25519-dalek",1973+ "futures-util",1974+ "getrandom 0.4.3",1975+ "hickory-resolver",1976+ "http",1977+ "ipnet",1978+ "iroh-base",1979+ "iroh-dns",1980+ "iroh-metrics",1981+ "iroh-relay",1982+ "n0-error",1983+ "n0-future",1984+ "n0-watcher",1985+ "netwatch",1986+ "noq",1987+ "noq-proto",1988+ "noq-udp",1989+ "papaya",1990+ "pin-project",1991+ "portable-atomic",1992+ "portmapper",1993+ "rand 0.10.1",1994+ "reqwest",1995+ "rustc-hash",1996+ "rustls",1997+ "rustls-pki-types",1998+ "serde",1999+ "smallvec",2000+ "strum",2001+ "time",2002+ "tokio",2003+ "tokio-stream",2004+ "tokio-util",2005+ "tracing",2006+ "url",2007+ "wasm-bindgen-futures",2008+]2009+2010+[[package]]2011+name = "iroh-base"2012+version = "1.0.0"2013+source = "registry+https://github.com/rust-lang/crates.io-index"2014+checksum = "c9c95e4459d9bb828a77084277abd308aa2b58a096652b079bddfd6ef2361f53"2015+dependencies = [2016+ "curve25519-dalek",2017+ "data-encoding",2018+ "data-encoding-macro",2019+ "derive_more",2020+ "ed25519-dalek",2021+ "getrandom 0.4.3",2022+ "n0-error",2023+ "rand 0.10.1",2024+ "serde",2025+ "url",2026+ "zeroize",2027+]2028+2029+[[package]]2030+name = "iroh-dns"2031+version = "1.0.0"2032+source = "registry+https://github.com/rust-lang/crates.io-index"2033+checksum = "754f7e0c1f67938e1d671007264ffef158f14a9f795a7cc219ea68ea09a9d4c9"2034+dependencies = [2035+ "arc-swap",2036+ "cfg_aliases",2037+ "derive_more",2038+ "hickory-resolver",2039+ "iroh-base",2040+ "n0-error",2041+ "n0-future",2042+ "ndk-context",2043+ "portable-atomic",2044+ "rand 0.10.1",2045+ "rustls",2046+ "simple-dns",2047+ "strum",2048+ "tokio",2049+ "tracing",2050+ "url",2051+]2052+2053+[[package]]2054+name = "iroh-metrics"2055+version = "1.0.1"2056+source = "registry+https://github.com/rust-lang/crates.io-index"2057+checksum = "291065721ad7c477b972e581bbc528df031dc8eb5e39fe1ff3300ae5dfb157ef"2058+dependencies = [2059+ "iroh-metrics-derive",2060+ "itoa",2061+ "n0-error",2062+ "portable-atomic",2063+ "ryu",2064+ "serde",2065+ "tracing",2066+]2067+2068+[[package]]2069+name = "iroh-metrics-derive"2070+version = "1.0.1"2071+source = "registry+https://github.com/rust-lang/crates.io-index"2072+checksum = "1ae5f0c4405d1fbc9fb16ff422ca40620e93dc36c30ecaba0c2aee3992b7bd48"2073+dependencies = [2074+ "heck",2075+ "proc-macro2",2076+ "quote",2077+ "syn",2078+]2079+2080+[[package]]2081+name = "iroh-relay"2082+version = "1.0.0"2083+source = "registry+https://github.com/rust-lang/crates.io-index"2084+checksum = "1c12e48fef252fd04f8e6b6a8802b377baf72548d62ae4838816624cd0e06b79"2085+dependencies = [2086+ "blake3",2087+ "bytes",2088+ "cfg_aliases",2089+ "data-encoding",2090+ "derive_more",2091+ "getrandom 0.4.3",2092+ "hickory-resolver",2093+ "http",2094+ "http-body-util",2095+ "hyper",2096+ "hyper-util",2097+ "iroh-base",2098+ "iroh-dns",2099+ "iroh-metrics",2100+ "lru",2101+ "n0-error",2102+ "n0-future",2103+ "noq",2104+ "noq-proto",2105+ "num_enum",2106+ "pin-project",2107+ "postcard",2108+ "rand 0.10.1",2109+ "reqwest",2110+ "rustls",2111+ "rustls-pki-types",2112+ "serde",2113+ "serde_bytes",2114+ "strum",2115+ "tokio",2116+ "tokio-rustls",2117+ "tokio-util",2118+ "tokio-websockets",2119+ "tracing",2120+ "url",2121+ "vergen-gitcl",2122+ "webpki-roots",2123+ "ws_stream_wasm",2124+]2125+2126+[[package]]2127+name = "itertools"2128+version = "0.13.0"2129+source = "registry+https://github.com/rust-lang/crates.io-index"2130+checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"2131+dependencies = [2132+ "either",2133+]2134+2135+[[package]]2136+name = "itoa"2137+version = "1.0.18"2138+source = "registry+https://github.com/rust-lang/crates.io-index"2139+checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"2140+2141+[[package]]2142+name = "jni"2143+version = "0.21.1"2144+source = "registry+https://github.com/rust-lang/crates.io-index"2145+checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"2146+dependencies = [2147+ "cesu8",2148+ "cfg-if",2149+ "combine",2150+ "jni-sys 0.3.1",2151+ "log",2152+ "thiserror 1.0.69",2153+ "walkdir",2154+ "windows-sys 0.45.0",2155+]2156+2157+[[package]]2158+name = "jni"2159+version = "0.22.4"2160+source = "registry+https://github.com/rust-lang/crates.io-index"2161+checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498"2162+dependencies = [2163+ "cfg-if",2164+ "combine",2165+ "jni-macros",2166+ "jni-sys 0.4.1",2167+ "log",2168+ "simd_cesu8",2169+ "thiserror 2.0.18",2170+ "walkdir",2171+ "windows-link",2172+]2173+2174+[[package]]2175+name = "jni-macros"2176+version = "0.22.4"2177+source = "registry+https://github.com/rust-lang/crates.io-index"2178+checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3"2179+dependencies = [2180+ "proc-macro2",2181+ "quote",2182+ "rustc_version",2183+ "simd_cesu8",2184+ "syn",2185+]2186+2187+[[package]]2188+name = "jni-sys"2189+version = "0.3.1"2190+source = "registry+https://github.com/rust-lang/crates.io-index"2191+checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258"2192+dependencies = [2193+ "jni-sys 0.4.1",2194+]2195+2196+[[package]]2197+name = "jni-sys"2198+version = "0.4.1"2199+source = "registry+https://github.com/rust-lang/crates.io-index"2200+checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2"2201+dependencies = [2202+ "jni-sys-macros",2203+]2204+2205+[[package]]2206+name = "jni-sys-macros"2207+version = "0.4.1"2208+source = "registry+https://github.com/rust-lang/crates.io-index"2209+checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264"2210+dependencies = [2211+ "quote",2212+ "syn",2213+]2214+2215+[[package]]2216+name = "js-sys"2217+version = "0.3.102"2218+source = "registry+https://github.com/rust-lang/crates.io-index"2219+checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31"2220+dependencies = [2221+ "cfg-if",2222+ "futures-util",2223+ "wasm-bindgen",2224+]2225+2226+[[package]]2227+name = "keyhome-input-spike"2228+version = "0.1.0"2229+dependencies = [2230+ "anyhow",2231+ "enigo",2232+ "image",2233+ "iroh",2234+ "serde",2235+ "serde_json",2236+ "tokio",2237+ "xcap",2238+]2239+2240+[[package]]2241+name = "khronos-egl"2242+version = "6.0.0"2243+source = "registry+https://github.com/rust-lang/crates.io-index"2244+checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76"2245+dependencies = [2246+ "libc",2247+ "pkg-config",2248+]2249+2250+[[package]]2251+name = "khronos_api"2252+version = "3.1.0"2253+source = "registry+https://github.com/rust-lang/crates.io-index"2254+checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"2255+2256+[[package]]2257+name = "lazy_static"2258+version = "1.5.0"2259+source = "registry+https://github.com/rust-lang/crates.io-index"2260+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"2261+2262+[[package]]2263+name = "libc"2264+version = "0.2.186"2265+source = "registry+https://github.com/rust-lang/crates.io-index"2266+checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"2267+2268+[[package]]2269+name = "libloading"2270+version = "0.8.9"2271+source = "registry+https://github.com/rust-lang/crates.io-index"2272+checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"2273+dependencies = [2274+ "cfg-if",2275+ "windows-link",2276+]2277+2278+[[package]]2279+name = "libspa"2280+version = "0.9.2"2281+source = "registry+https://github.com/rust-lang/crates.io-index"2282+checksum = "b6b8cfa2a7656627b4c92c6b9ef929433acd673d5ab3708cda1b18478ac00df4"2283+dependencies = [2284+ "bitflags 2.13.0",2285+ "cc",2286+ "convert_case 0.8.0",2287+ "cookie-factory",2288+ "libc",2289+ "libspa-sys",2290+ "nix",2291+ "nom 8.0.0",2292+ "system-deps",2293+]2294+2295+[[package]]2296+name = "libspa-sys"2297+version = "0.9.2"2298+source = "registry+https://github.com/rust-lang/crates.io-index"2299+checksum = "901049455d2eb6decf9058235d745237952f4804bc584c5fcb41412e6adcc6e0"2300+dependencies = [2301+ "bindgen",2302+ "cc",2303+ "system-deps",2304+]2305+2306+[[package]]2307+name = "libwayshot-xcap"2308+version = "0.3.2"2309+source = "registry+https://github.com/rust-lang/crates.io-index"2310+checksum = "558a3a7ca16a17a14adf8f051b3adcd7766d397532f5f6d6a48034db11e54c22"2311+dependencies = [2312+ "drm",2313+ "gbm",2314+ "gl",2315+ "image",2316+ "khronos-egl",2317+ "memmap2 0.9.11",2318+ "rustix 1.1.4",2319+ "thiserror 2.0.18",2320+ "tracing",2321+ "wayland-backend",2322+ "wayland-client",2323+ "wayland-protocols",2324+ "wayland-protocols-wlr",2325+]2326+2327+[[package]]2328+name = "linux-raw-sys"2329+version = "0.4.15"2330+source = "registry+https://github.com/rust-lang/crates.io-index"2331+checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"2332+2333+[[package]]2334+name = "linux-raw-sys"2335+version = "0.9.4"2336+source = "registry+https://github.com/rust-lang/crates.io-index"2337+checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"2338+2339+[[package]]2340+name = "linux-raw-sys"2341+version = "0.12.1"2342+source = "registry+https://github.com/rust-lang/crates.io-index"2343+checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"2344+2345+[[package]]2346+name = "litemap"2347+version = "0.8.2"2348+source = "registry+https://github.com/rust-lang/crates.io-index"2349+checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"2350+2351+[[package]]2352+name = "lock_api"2353+version = "0.4.14"2354+source = "registry+https://github.com/rust-lang/crates.io-index"2355+checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"2356+dependencies = [2357+ "scopeguard",2358+]2359+2360+[[package]]2361+name = "log"2362+version = "0.4.33"2363+source = "registry+https://github.com/rust-lang/crates.io-index"2364+checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"2365+2366+[[package]]2367+name = "loom"2368+version = "0.7.2"2369+source = "registry+https://github.com/rust-lang/crates.io-index"2370+checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca"2371+dependencies = [2372+ "cfg-if",2373+ "generator",2374+ "scoped-tls",2375+ "tracing",2376+ "tracing-subscriber",2377+]2378+2379+[[package]]2380+name = "lru"2381+version = "0.18.0"2382+source = "registry+https://github.com/rust-lang/crates.io-index"2383+checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9"2384+dependencies = [2385+ "hashbrown",2386+]2387+2388+[[package]]2389+name = "lru-slab"2390+version = "0.1.2"2391+source = "registry+https://github.com/rust-lang/crates.io-index"2392+checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"2393+2394+[[package]]2395+name = "mac-addr"2396+version = "0.3.0"2397+source = "registry+https://github.com/rust-lang/crates.io-index"2398+checksum = "d3d25b0e0b648a86960ac23b7ad4abb9717601dec6f66c165f5b037f3f03065f"2399+2400+[[package]]2401+name = "matchers"2402+version = "0.2.0"2403+source = "registry+https://github.com/rust-lang/crates.io-index"2404+checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"2405+dependencies = [2406+ "regex-automata",2407+]2408+2409+[[package]]2410+name = "memchr"2411+version = "2.8.2"2412+source = "registry+https://github.com/rust-lang/crates.io-index"2413+checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"2414+2415+[[package]]2416+name = "memmap2"2417+version = "0.8.0"2418+source = "registry+https://github.com/rust-lang/crates.io-index"2419+checksum = "43a5a03cefb0d953ec0be133036f14e109412fa594edc2f77227249db66cc3ed"2420+dependencies = [2421+ "libc",2422+]2423+2424+[[package]]2425+name = "memmap2"2426+version = "0.9.11"2427+source = "registry+https://github.com/rust-lang/crates.io-index"2428+checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0"2429+dependencies = [2430+ "libc",2431+]2432+2433+[[package]]2434+name = "memoffset"2435+version = "0.9.1"2436+source = "registry+https://github.com/rust-lang/crates.io-index"2437+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"2438+dependencies = [2439+ "autocfg",2440+]2441+2442+[[package]]2443+name = "minimal-lexical"2444+version = "0.2.1"2445+source = "registry+https://github.com/rust-lang/crates.io-index"2446+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"2447+2448+[[package]]2449+name = "miniz_oxide"2450+version = "0.8.9"2451+source = "registry+https://github.com/rust-lang/crates.io-index"2452+checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"2453+dependencies = [2454+ "adler2",2455+ "simd-adler32",2456+]2457+2458+[[package]]2459+name = "mio"2460+version = "1.2.1"2461+source = "registry+https://github.com/rust-lang/crates.io-index"2462+checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda"2463+dependencies = [2464+ "libc",2465+ "wasi",2466+ "windows-sys 0.61.2",2467+]2468+2469+[[package]]2470+name = "moka"2471+version = "0.12.15"2472+source = "registry+https://github.com/rust-lang/crates.io-index"2473+checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046"2474+dependencies = [2475+ "crossbeam-channel",2476+ "crossbeam-epoch",2477+ "crossbeam-utils",2478+ "equivalent",2479+ "parking_lot",2480+ "portable-atomic",2481+ "smallvec",2482+ "tagptr",2483+ "uuid",2484+]2485+2486+[[package]]2487+name = "moxcms"2488+version = "0.8.1"2489+source = "registry+https://github.com/rust-lang/crates.io-index"2490+checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b"2491+dependencies = [2492+ "num-traits",2493+ "pxfm",2494+]2495+2496+[[package]]2497+name = "n0-error"2498+version = "1.0.0"2499+source = "registry+https://github.com/rust-lang/crates.io-index"2500+checksum = "c37e81176a83a77d2514528b91bdafc70ef88aab428f0e1b91aebb8d99888895"2501+dependencies = [2502+ "n0-error-macros",2503+ "spez",2504+]2505+2506+[[package]]2507+name = "n0-error-macros"2508+version = "1.0.0"2509+source = "registry+https://github.com/rust-lang/crates.io-index"2510+checksum = "e2acd8b070213b0299282f884b4beba4e7b52d624fdcd504a3ad3665390c11e1"2511+dependencies = [2512+ "proc-macro2",2513+ "quote",2514+ "syn",2515+]2516+2517+[[package]]2518+name = "n0-future"2519+version = "0.3.2"2520+source = "registry+https://github.com/rust-lang/crates.io-index"2521+checksum = "e2ab99dfb861450e68853d34ae665243a88b8c493d01ba957321a1e9b2312bbe"2522+dependencies = [2523+ "cfg_aliases",2524+ "derive_more",2525+ "futures-buffered",2526+ "futures-lite",2527+ "futures-util",2528+ "js-sys",2529+ "pin-project",2530+ "send_wrapper",2531+ "tokio",2532+ "tokio-util",2533+ "wasm-bindgen",2534+ "wasm-bindgen-futures",2535+ "web-time",2536+]2537+2538+[[package]]2539+name = "n0-watcher"2540+version = "1.0.0"2541+source = "registry+https://github.com/rust-lang/crates.io-index"2542+checksum = "bbc618745ad0b7414b149d0517ad8b5573b2fb4d4e2717add3d2446ce1fdd826"2543+dependencies = [2544+ "derive_more",2545+ "n0-error",2546+ "n0-future",2547+]2548+2549+[[package]]2550+name = "ndk-context"2551+version = "0.1.1"2552+source = "registry+https://github.com/rust-lang/crates.io-index"2553+checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"2554+2555+[[package]]2556+name = "netdev"2557+version = "0.44.0"2558+source = "registry+https://github.com/rust-lang/crates.io-index"2559+checksum = "9d31e7286c21ceaf0ddb1d881964011214555ea0b317cc2eb1a1d68d861386fc"2560+dependencies = [2561+ "block2 0.6.2",2562+ "dispatch2",2563+ "dlopen2",2564+ "ipnet",2565+ "jni 0.21.1",2566+ "libc",2567+ "mac-addr",2568+ "ndk-context",2569+ "netlink-packet-core",2570+ "netlink-packet-route 0.29.0",2571+ "netlink-sys",2572+ "objc2 0.6.4",2573+ "objc2-core-foundation",2574+ "objc2-core-wlan",2575+ "objc2-foundation",2576+ "objc2-system-configuration",2577+ "once_cell",2578+ "plist",2579+ "windows-sys 0.61.2",2580+]2581+2582+[[package]]2583+name = "netlink-packet-core"2584+version = "0.8.1"2585+source = "registry+https://github.com/rust-lang/crates.io-index"2586+checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4"2587+dependencies = [2588+ "paste",2589+]2590+2591+[[package]]2592+name = "netlink-packet-route"2593+version = "0.29.0"2594+source = "registry+https://github.com/rust-lang/crates.io-index"2595+checksum = "df9854ea6ad14e3f4698a7f03b65bce0833dd2d81d594a0e4a984170537146b6"2596+dependencies = [2597+ "bitflags 2.13.0",2598+ "libc",2599+ "log",2600+ "netlink-packet-core",2601+]2602+2603+[[package]]2604+name = "netlink-packet-route"2605+version = "0.31.0"2606+source = "registry+https://github.com/rust-lang/crates.io-index"2607+checksum = "e2288fcb784eb3defd5fb16f4c4160d5f477de192eac730f43e1d11c24d9a007"2608+dependencies = [2609+ "bitflags 2.13.0",2610+ "libc",2611+ "log",2612+ "netlink-packet-core",2613+]2614+2615+[[package]]2616+name = "netlink-proto"2617+version = "0.12.0"2618+source = "registry+https://github.com/rust-lang/crates.io-index"2619+checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128"2620+dependencies = [2621+ "bytes",2622+ "futures",2623+ "log",2624+ "netlink-packet-core",2625+ "netlink-sys",2626+ "thiserror 2.0.18",2627+]2628+2629+[[package]]2630+name = "netlink-sys"2631+version = "0.8.8"2632+source = "registry+https://github.com/rust-lang/crates.io-index"2633+checksum = "cd6c30ed10fa69cc491d491b85cc971f6bdeb8e7367b7cde2ee6cc878d583fae"2634+dependencies = [2635+ "bytes",2636+ "futures-util",2637+ "libc",2638+ "log",2639+ "tokio",2640+]2641+2642+[[package]]2643+name = "netwatch"2644+version = "0.19.0"2645+source = "registry+https://github.com/rust-lang/crates.io-index"2646+checksum = "8487d26d691cd98d5c17b2adb4b1fd4b31cccc820da1eac827d483295d7bb94a"2647+dependencies = [2648+ "atomic-waker",2649+ "bytes",2650+ "cfg_aliases",2651+ "derive_more",2652+ "ipnet",2653+ "js-sys",2654+ "libc",2655+ "n0-error",2656+ "n0-future",2657+ "n0-watcher",2658+ "netdev",2659+ "netlink-packet-core",2660+ "netlink-packet-route 0.31.0",2661+ "netlink-proto",2662+ "netlink-sys",2663+ "noq-udp",2664+ "objc2-core-foundation",2665+ "objc2-system-configuration",2666+ "pin-project-lite",2667+ "serde",2668+ "socket2",2669+ "time",2670+ "tokio",2671+ "tokio-util",2672+ "tracing",2673+ "web-sys",2674+ "windows 0.62.2",2675+ "windows-result 0.4.1",2676+ "wmi",2677+]2678+2679+[[package]]2680+name = "nix"2681+version = "0.30.1"2682+source = "registry+https://github.com/rust-lang/crates.io-index"2683+checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6"2684+dependencies = [2685+ "bitflags 2.13.0",2686+ "cfg-if",2687+ "cfg_aliases",2688+ "libc",2689+]2690+2691+[[package]]2692+name = "nom"2693+version = "7.1.3"2694+source = "registry+https://github.com/rust-lang/crates.io-index"2695+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"2696+dependencies = [2697+ "memchr",2698+ "minimal-lexical",2699+]2700+2701+[[package]]2702+name = "nom"2703+version = "8.0.0"2704+source = "registry+https://github.com/rust-lang/crates.io-index"2705+checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405"2706+dependencies = [2707+ "memchr",2708+]2709+2710+[[package]]2711+name = "noq"2712+version = "1.0.0"2713+source = "registry+https://github.com/rust-lang/crates.io-index"2714+checksum = "11f0c73794bfde94db01379c46990b9a773993fca2b61a66184ce148b7c7a187"2715+dependencies = [2716+ "bytes",2717+ "cfg_aliases",2718+ "derive_more",2719+ "noq-proto",2720+ "noq-udp",2721+ "pin-project-lite",2722+ "rustc-hash",2723+ "rustls",2724+ "socket2",2725+ "thiserror 2.0.18",2726+ "tokio",2727+ "tokio-stream",2728+ "tracing",2729+ "web-time",2730+]2731+2732+[[package]]2733+name = "noq-proto"2734+version = "1.0.0"2735+source = "registry+https://github.com/rust-lang/crates.io-index"2736+checksum = "775be06b8d66c2c64db60140bf54dee8410f67b73c81cc1e1e32f11dfdaae501"2737+dependencies = [2738+ "aes-gcm",2739+ "bytes",2740+ "derive_more",2741+ "enum-assoc",2742+ "getrandom 0.4.3",2743+ "identity-hash",2744+ "lru-slab",2745+ "rand 0.10.1",2746+ "rand_pcg",2747+ "ring",2748+ "rustc-hash",2749+ "rustls",2750+ "rustls-pki-types",2751+ "slab",2752+ "sorted-index-buffer",2753+ "thiserror 2.0.18",2754+ "tinyvec",2755+ "tracing",2756+ "web-time",2757+]2758+2759+[[package]]2760+name = "noq-udp"2761+version = "1.0.0"2762+source = "registry+https://github.com/rust-lang/crates.io-index"2763+checksum = "cd5a37756f168cf350d68a97c4f0158bdf3c76f10175123941569b09ab51f011"2764+dependencies = [2765+ "cfg_aliases",2766+ "libc",2767+ "socket2",2768+ "tracing",2769+ "windows-sys 0.61.2",2770+]2771+2772+[[package]]2773+name = "nu-ansi-term"2774+version = "0.50.3"2775+source = "registry+https://github.com/rust-lang/crates.io-index"2776+checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"2777+dependencies = [2778+ "windows-sys 0.61.2",2779+]2780+2781+[[package]]2782+name = "num-conv"2783+version = "0.2.2"2784+source = "registry+https://github.com/rust-lang/crates.io-index"2785+checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441"2786+2787+[[package]]2788+name = "num-traits"2789+version = "0.2.19"2790+source = "registry+https://github.com/rust-lang/crates.io-index"2791+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"2792+dependencies = [2793+ "autocfg",2794+]2795+2796+[[package]]2797+name = "num_enum"2798+version = "0.7.6"2799+source = "registry+https://github.com/rust-lang/crates.io-index"2800+checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26"2801+dependencies = [2802+ "num_enum_derive",2803+ "rustversion",2804+]2805+2806+[[package]]2807+name = "num_enum_derive"2808+version = "0.7.6"2809+source = "registry+https://github.com/rust-lang/crates.io-index"2810+checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8"2811+dependencies = [2812+ "proc-macro-crate",2813+ "proc-macro2",2814+ "quote",2815+ "syn",2816+]2817+2818+[[package]]2819+name = "num_threads"2820+version = "0.1.7"2821+source = "registry+https://github.com/rust-lang/crates.io-index"2822+checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"2823+dependencies = [2824+ "libc",2825+]2826+2827+[[package]]2828+name = "objc-sys"2829+version = "0.3.5"2830+source = "registry+https://github.com/rust-lang/crates.io-index"2831+checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"2832+2833+[[package]]2834+name = "objc2"2835+version = "0.5.2"2836+source = "registry+https://github.com/rust-lang/crates.io-index"2837+checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"2838+dependencies = [2839+ "objc-sys",2840+ "objc2-encode",2841+]2842+2843+[[package]]2844+name = "objc2"2845+version = "0.6.4"2846+source = "registry+https://github.com/rust-lang/crates.io-index"2847+checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f"2848+dependencies = [2849+ "objc2-encode",2850+]2851+2852+[[package]]2853+name = "objc2-app-kit"2854+version = "0.3.2"2855+source = "registry+https://github.com/rust-lang/crates.io-index"2856+checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"2857+dependencies = [2858+ "bitflags 2.13.0",2859+ "block2 0.6.2",2860+ "libc",2861+ "objc2 0.6.4",2862+ "objc2-cloud-kit",2863+ "objc2-core-data",2864+ "objc2-core-foundation",2865+ "objc2-core-graphics",2866+ "objc2-core-image",2867+ "objc2-core-text",2868+ "objc2-core-video",2869+ "objc2-foundation",2870+ "objc2-quartz-core",2871+]2872+2873+[[package]]2874+name = "objc2-av-foundation"2875+version = "0.3.2"2876+source = "registry+https://github.com/rust-lang/crates.io-index"2877+checksum = "478ae33fcac9df0a18db8302387c666b8ef08a3e2d62b510ca4fc278a384b6c0"2878+dependencies = [2879+ "bitflags 2.13.0",2880+ "block2 0.6.2",2881+ "dispatch2",2882+ "objc2 0.6.4",2883+ "objc2-avf-audio",2884+ "objc2-core-audio-types",2885+ "objc2-core-foundation",2886+ "objc2-core-graphics",2887+ "objc2-core-image",2888+ "objc2-core-video",2889+ "objc2-foundation",2890+ "objc2-image-io",2891+ "objc2-media-toolbox",2892+ "objc2-quartz-core",2893+]2894+2895+[[package]]2896+name = "objc2-avf-audio"2897+version = "0.3.2"2898+source = "registry+https://github.com/rust-lang/crates.io-index"2899+checksum = "13a380031deed8e99db00065c45937da434ca987c034e13b87e4441f9e4090be"2900+dependencies = [2901+ "objc2 0.6.4",2902+ "objc2-foundation",2903+]2904+2905+[[package]]2906+name = "objc2-cloud-kit"2907+version = "0.3.2"2908+source = "registry+https://github.com/rust-lang/crates.io-index"2909+checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c"2910+dependencies = [2911+ "bitflags 2.13.0",2912+ "objc2 0.6.4",2913+ "objc2-foundation",2914+]2915+2916+[[package]]2917+name = "objc2-core-audio"2918+version = "0.3.2"2919+source = "registry+https://github.com/rust-lang/crates.io-index"2920+checksum = "e1eebcea8b0dbff5f7c8504f3107c68fc061a3eb44932051c8cf8a68d969c3b2"2921+dependencies = [2922+ "dispatch2",2923+ "objc2 0.6.4",2924+ "objc2-core-audio-types",2925+ "objc2-core-foundation",2926+]2927+2928+[[package]]2929+name = "objc2-core-audio-types"2930+version = "0.3.2"2931+source = "registry+https://github.com/rust-lang/crates.io-index"2932+checksum = "5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c"2933+dependencies = [2934+ "bitflags 2.13.0",2935+ "objc2 0.6.4",2936+]2937+2938+[[package]]2939+name = "objc2-core-data"2940+version = "0.3.2"2941+source = "registry+https://github.com/rust-lang/crates.io-index"2942+checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa"2943+dependencies = [2944+ "bitflags 2.13.0",2945+ "objc2 0.6.4",2946+ "objc2-foundation",2947+]2948+2949+[[package]]2950+name = "objc2-core-foundation"2951+version = "0.3.2"2952+source = "registry+https://github.com/rust-lang/crates.io-index"2953+checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"2954+dependencies = [2955+ "bitflags 2.13.0",2956+ "block2 0.6.2",2957+ "dispatch2",2958+ "libc",2959+ "objc2 0.6.4",2960+]2961+2962+[[package]]2963+name = "objc2-core-graphics"2964+version = "0.3.2"2965+source = "registry+https://github.com/rust-lang/crates.io-index"2966+checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"2967+dependencies = [2968+ "bitflags 2.13.0",2969+ "block2 0.6.2",2970+ "dispatch2",2971+ "libc",2972+ "objc2 0.6.4",2973+ "objc2-core-foundation",2974+ "objc2-io-surface",2975+ "objc2-metal",2976+]2977+2978+[[package]]2979+name = "objc2-core-image"2980+version = "0.3.2"2981+source = "registry+https://github.com/rust-lang/crates.io-index"2982+checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006"2983+dependencies = [2984+ "objc2 0.6.4",2985+ "objc2-foundation",2986+]2987+2988+[[package]]2989+name = "objc2-core-media"2990+version = "0.3.2"2991+source = "registry+https://github.com/rust-lang/crates.io-index"2992+checksum = "05ec576860167a15dd9fce7fbee7512beb4e31f532159d3482d1f9c6caedf31d"2993+dependencies = [2994+ "bitflags 2.13.0",2995+ "block2 0.6.2",2996+ "dispatch2",2997+ "objc2 0.6.4",2998+ "objc2-core-audio",2999+ "objc2-core-audio-types",3000+ "objc2-core-foundation",
diff truncated
A spikes/006-input-injection/Cargo.toml +15 -0
A spikes/006-input-injection/src/main.rs +368 -0
@@ -0,0 +1,368 @@
1+//! Spike 006: Input injection over Iroh2+//!3+//! Host mode: cargo run -- host4+//! Starts Iroh endpoint, prints addr_json, streams frames, injects input5+//!6+//! Client mode: cargo run -- client <addr_json>7+//! Connects to host, receives frames, sends input events8+//!9+//! Input test: cargo run -- client <addr_json> --test-input10+//! Connects, sends a test mouse move + click, then exits11+12+use anyhow::{Context as _, Result, bail};13+use iroh::{Endpoint, EndpointAddr, SecretKey, endpoint::presets};14+use iroh::endpoint::Connection;15+use iroh::protocol::{ProtocolHandler, Router};16+use enigo::{Enigo, Keyboard, Mouse, Settings, Button, Coordinate, Direction, Key};17+use serde::{Deserialize, Serialize};18+use std::io::Cursor;19+use std::sync::Arc;20+use std::time::{Duration, Instant};21+use tokio::io::{AsyncReadExt, AsyncWriteExt};22+23+const ALPN: &[u8] = b"keyhome/input-stream/0";24+25+// ─── Input event protocol ────────────────────────────────────────────────────26+27+#[derive(Serialize, Deserialize, Debug)]28+#[serde(tag = "t")]29+enum InputEvent {30+ #[serde(rename = "mm")]31+ MouseMove { x: i32, y: i32 },32+ #[serde(rename = "mc")]33+ MouseClick { b: u8 }, // 1=left 2=right 3=middle34+ #[serde(rename = "md")]35+ MouseDown { b: u8 },36+ #[serde(rename = "mu")]37+ MouseUp { b: u8 },38+ #[serde(rename = "ms")]39+ MouseScroll { dx: i32, dy: i32 },40+ #[serde(rename = "kd")]41+ KeyDown { k: String },42+ #[serde(rename = "ku")]43+ KeyUp { k: String },44+ #[serde(rename = "kt")]45+ KeyClick { k: String },46+ #[serde(rename = "tx")]47+ Text { s: String },48+}49+50+impl InputEvent {51+ fn apply(&self, enigo: &mut Enigo) -> Result<()> {52+ match self {53+ InputEvent::MouseMove { x, y } => {54+ enigo.move_mouse(*x, *y, Coordinate::Abs)55+ .map_err(|e| anyhow::anyhow!("mouse move: {:?}", e))?;56+ }57+ InputEvent::MouseClick { b } => {58+ let btn = button_from_code(*b);59+ enigo.button(btn, Direction::Click)60+ .map_err(|e| anyhow::anyhow!("mouse click: {:?}", e))?;61+ }62+ InputEvent::MouseDown { b } => {63+ let btn = button_from_code(*b);64+ enigo.button(btn, Direction::Press)65+ .map_err(|e| anyhow::anyhow!("mouse down: {:?}", e))?;66+ }67+ InputEvent::MouseUp { b } => {68+ let btn = button_from_code(*b);69+ enigo.button(btn, Direction::Release)70+ .map_err(|e| anyhow::anyhow!("mouse up: {:?}", e))?;71+ }72+ InputEvent::MouseScroll { dx, dy } => {73+ if *dy != 0 {74+ enigo.scroll(*dy, enigo::Axis::Vertical)75+ .map_err(|e| anyhow::anyhow!("scroll: {:?}", e))?;76+ }77+ if *dx != 0 {78+ enigo.scroll(*dx, enigo::Axis::Horizontal)79+ .map_err(|e| anyhow::anyhow!("scroll: {:?}", e))?;80+ }81+ }82+ InputEvent::KeyDown { k } => {83+ if let Some(key) = key_from_str(k) {84+ enigo.key(key, Direction::Press)85+ .map_err(|e| anyhow::anyhow!("key down: {:?}", e))?;86+ }87+ }88+ InputEvent::KeyUp { k } => {89+ if let Some(key) = key_from_str(k) {90+ enigo.key(key, Direction::Release)91+ .map_err(|e| anyhow::anyhow!("key up: {:?}", e))?;92+ }93+ }94+ InputEvent::KeyClick { k } => {95+ if let Some(key) = key_from_str(k) {96+ enigo.key(key, Direction::Click)97+ .map_err(|e| anyhow::anyhow!("key click: {:?}", e))?;98+ }99+ }100+ InputEvent::Text { s } => {101+ enigo.text(s)102+ .map_err(|e| anyhow::anyhow!("text: {:?}", e))?;103+ }104+ }105+ Ok(())106+ }107+108+ fn to_json_line(&self) -> String {109+ serde_json::to_string(self).unwrap() + "\n"110+ }111+}112+113+fn button_from_code(b: u8) -> Button {114+ match b {115+ 2 => Button::Right,116+ 3 => Button::Middle,117+ 4 => Button::Back,118+ 5 => Button::Forward,119+ _ => Button::Left,120+ }121+}122+123+fn key_from_str(s: &str) -> Option<Key> {124+ match s {125+ "Enter" => Some(Key::Return),126+ "Tab" => Some(Key::Tab),127+ "Space" => Some(Key::Space),128+ "Backspace" => Some(Key::Backspace),129+ "Escape" => Some(Key::Escape),130+ "Shift" => Some(Key::Shift),131+ "Control" => Some(Key::Control),132+ "Alt" => Some(Key::Alt),133+ "Meta" => Some(Key::Meta),134+ "Up" => Some(Key::UpArrow),135+ "Down" => Some(Key::DownArrow),136+ "Left" => Some(Key::LeftArrow),137+ "Right" => Some(Key::RightArrow),138+ "Home" => Some(Key::Home),139+ "End" => Some(Key::End),140+ "PageUp" => Some(Key::PageUp),141+ "PageDown" => Some(Key::PageDown),142+ "Delete" => Some(Key::Delete),143+ _ => {144+ // Single character → Unicode key145+ let c = s.chars().next()?;146+ if c.is_ascii() {147+ Some(Key::Unicode(c))148+ } else {149+ None150+ }151+ }152+ }153+}154+155+// ─── Main ────────────────────────────────────────────────────────────────────156+157+#[tokio::main]158+async fn main() -> Result<()> {159+ let args: Vec<String> = std::env::args().skip(1).collect();160+ match args.first().map(|s| s.as_str()) {161+ Some("host") => host().await,162+ Some("client") => {163+ let addr = args.get(1).context("missing addr arg")?;164+ let test_input = args.iter().any(|a| a == "--test-input");165+ client(addr, test_input).await166+ }167+ _ => {168+ bail!("usage: cargo run -- host | client <addr_json> [--test-input]")169+ }170+ }171+}172+173+// ─── Host ────────────────────────────────────────────────────────────────────174+175+async fn host() -> Result<()> {176+ println!("[host] starting...");177+178+ let secret = SecretKey::generate();179+ let endpoint = Endpoint::builder(presets::N0)180+ .secret_key(secret)181+ .bind()182+ .await?;183+184+ let _ = tokio::time::timeout(Duration::from_secs(5), endpoint.online()).await;185+186+ let addr = endpoint.addr();187+ let addr_json = serde_json::to_string(&addr)?;188+ let node_id = endpoint.id();189+190+ println!("[host] node_id={}", node_id);191+ println!("{}", addr_json);192+ eprintln!("[host] waiting for connections on ALPN {:?}...", ALPN);193+194+ let handler = Arc::new(InputStreamHandler);195+ let _router = Router::builder(endpoint.clone())196+ .accept(ALPN, handler)197+ .spawn();198+199+ tokio::signal::ctrl_c().await?;200+ endpoint.close().await;201+ Ok(())202+}203+204+#[derive(Debug)]205+struct InputStreamHandler;206+207+impl ProtocolHandler for InputStreamHandler {208+ async fn accept(&self, conn: Connection) -> Result<(), iroh::protocol::AcceptError> {209+ if let Err(e) = handle_connection(conn).await {210+ eprintln!("[host] error: {}", e);211+ }212+ Ok(())213+ }214+}215+216+async fn handle_connection(conn: Connection) -> Result<()> {217+ let (mut send, mut recv) = conn.accept_bi().await?;218+ eprintln!("[host] client connected: {}", conn.remote_id());219+220+ // Wait for client start signal221+ let mut start_buf = [0u8; 1];222+ recv.read_exact(&mut start_buf).await?;223+ if start_buf[0] != 1 {224+ return Ok(());225+ }226+ eprintln!("[host] received start signal");227+228+ // Read newline-delimited JSON input events, inject via enigo229+ let mut enigo = Enigo::new(&Settings::default())230+ .map_err(|e| anyhow::anyhow!("enigo init: {:?}", e))?;231+232+ let mut buf = Vec::new();233+ let mut chunk = [0u8; 1024];234+235+ loop {236+ let n = match recv.read(&mut chunk).await {237+ Ok(Some(n)) => n,238+ Ok(None) => {239+ eprintln!("[host] client disconnected");240+ break;241+ }242+ Err(e) => {243+ eprintln!("[host] read error: {}", e);244+ break;245+ }246+ };247+ if n == 0 {248+ eprintln!("[host] client disconnected");249+ break;250+ }251+252+ buf.extend_from_slice(&chunk[..n]);253+254+ // Process complete lines255+ while let Some(pos) = buf.iter().position(|&b| b == b'\n') {256+ let line: Vec<u8> = buf.drain(..=pos).collect();257+ let line_str = String::from_utf8_lossy(&line[..line.len()-1]);258+259+ if line_str.trim().is_empty() {260+ continue;261+ }262+263+ match serde_json::from_str::<InputEvent>(&line_str) {264+ Ok(event) => {265+ eprintln!("[host] input: {:?}", event);266+ if let Err(e) = event.apply(&mut enigo) {267+ eprintln!("[host] inject error: {}", e);268+ }269+ }270+ Err(e) => {271+ eprintln!("[host] parse error: {} (line: {})", e, line_str);272+ }273+ }274+ }275+ }276+277+ // Send ack278+ let _ = send.write_all(b"bye\n").await;279+ Ok(())280+}281+282+// ─── Client ──────────────────────────────────────────────────────────────────283+284+async fn client(addr_str: &str, test_input: bool) -> Result<()> {285+ println!("[client] connecting...");286+287+ let addr: EndpointAddr = serde_json::from_str(addr_str)288+ .context("invalid EndpointAddr JSON")?;289+290+ let secret = SecretKey::generate();291+ let endpoint = Endpoint::builder(presets::N0)292+ .secret_key(secret)293+ .bind()294+ .await?;295+296+ let _ = tokio::time::timeout(Duration::from_secs(10), endpoint.online()).await;297+298+ let conn = endpoint.connect(addr, ALPN).await299+ .context("failed to connect")?;300+ println!("[client] connected!");301+302+ let (mut send, mut recv) = conn.open_bi().await?;303+304+ // Send start signal305+ send.write_all(&[1u8]).await?;306+ println!("[client] sent start signal");307+308+ if test_input {309+ // Send a sequence of test input events310+ let events = vec![311+ InputEvent::MouseMove { x: 500, y: 400 },312+ InputEvent::MouseClick { b: 1 },313+ InputEvent::Text { s: "Hello from keyhome!".to_string() },314+ InputEvent::KeyClick { k: "Enter".to_string() },315+ ];316+317+ for event in &events {318+ let line = event.to_json_line();319+ println!("[client] sending: {}", line.trim());320+ send.write_all(line.as_bytes()).await?;321+ tokio::time::sleep(Duration::from_millis(500)).await;322+ }323+324+ println!("[client] test input sent, waiting for ack...");325+ let mut ack = [0u8; 4];326+ let _ = recv.read(&mut ack).await;327+ println!("[client] done");328+ } else {329+ // Interactive mode: read input events from stdin330+ println!("[client] interactive mode — type JSON input events, Ctrl+D to quit");331+ println!("[client] examples:");332+ println!(" {{\"t\":\"mm\",\"x\":100,\"y\":100}}");333+ println!(" {{\"t\":\"mc\",\"b\":1}}");334+ println!(" {{\"t\":\"tx\",\"s\":\"hello\"}}");335+ println!(" {{\"t\":\"kt\",\"k\":\"Enter\"}}");336+337+ use tokio::io::{AsyncBufReadExt, BufReader};338+ let mut reader = BufReader::new(tokio::io::stdin());339+ let mut line = String::new();340+341+ loop {342+ line.clear();343+ let n = reader.read_line(&mut line).await344+ .map_err(|e| anyhow::anyhow!("stdin: {}", e))?;345+ if n == 0 {346+ break;347+ }348+ if line.trim().is_empty() {349+ continue;350+ }351+ // Validate JSON352+ match serde_json::from_str::<InputEvent>(&line) {353+ Ok(event) => {354+ let json = event.to_json_line();355+ send.write_all(json.as_bytes()).await?;356+ println!("[client] sent: {}", json.trim());357+ }358+ Err(e) => {359+ println!("[client] invalid input: {} (must be valid InputEvent JSON)", e);360+ }361+ }362+ }363+ }364+365+ let _ = send.finish();366+ let _ = endpoint.close().await;367+ Ok(())368+}