diff --git a/THIRD-PARTY-NOTICES.txt b/THIRD-PARTY-NOTICES.txt index babbd073..d1af6419 100644 --- a/THIRD-PARTY-NOTICES.txt +++ b/THIRD-PARTY-NOTICES.txt @@ -7,7 +7,15 @@ below. Each is distributed under its own permissive license; the full license te follow the manifest. This file is generated by scripts/gen-third-party-notices.py (or `cargo about`, see about.toml) — do not edit by hand. -Total third-party crates: 531 +Total third-party crates: 548 + +---------------------------------------------------------------------------- +VENDORED THIRD-PARTY SOURCE (inside first-party crates) +---------------------------------------------------------------------------- + pyrowave (vendored, crates/pyrowave-sys) — https://github.com/Themaister/pyrowave + Granite subset (vendored, crates/pyrowave-sys) — https://github.com/Themaister/Granite + volk (vendored, crates/pyrowave-sys) — https://github.com/zeux/volk + Vulkan-Headers (vendored, crates/pyrowave-sys) — https://github.com/KhronosGroup/Vulkan-Headers ---------------------------------------------------------------------------- MANIFEST (crate version — SPDX license — source) @@ -26,16 +34,21 @@ MANIFEST (crate version — SPDX license — source) anstyle-parse 1.0.0 — MIT OR Apache-2.0 — https://github.com/rust-cli/anstyle.git anstyle-query 1.1.5 — MIT OR Apache-2.0 — https://github.com/rust-cli/anstyle.git anstyle-wincon 3.0.11 — MIT OR Apache-2.0 — https://github.com/rust-cli/anstyle.git - anyhow 1.0.102 — MIT OR Apache-2.0 — https://github.com/dtolnay/anyhow - arc-swap 1.9.1 — MIT OR Apache-2.0 — https://github.com/vorner/arc-swap + anyhow 1.0.103 — MIT OR Apache-2.0 — https://github.com/dtolnay/anyhow ash 0.38.0+1.3.281 — MIT OR Apache-2.0 — https://github.com/ash-rs/ash - ashpd 0.13.11 — MIT — https://github.com/bilelmoussaoui/ashpd + ashpd 0.13.12 — MIT — https://github.com/bilelmoussaoui/ashpd asn1-rs 0.6.2 — MIT OR Apache-2.0 — https://github.com/rusticata/asn1-rs.git asn1-rs-derive 0.5.1 — MIT OR Apache-2.0 — https://github.com/rusticata/asn1-rs.git asn1-rs-impl 0.2.0 — MIT/Apache-2.0 — https://github.com/rusticata/asn1-rs.git async-broadcast 0.7.2 — MIT OR Apache-2.0 — https://github.com/smol-rs/async-broadcast async-channel 2.5.0 — Apache-2.0 OR MIT — https://github.com/smol-rs/async-channel + async-executor 1.14.0 — Apache-2.0 OR MIT — https://github.com/smol-rs/async-executor + async-io 2.6.0 — Apache-2.0 OR MIT — https://github.com/smol-rs/async-io + async-lock 3.4.2 — Apache-2.0 OR MIT — https://github.com/smol-rs/async-lock + async-process 2.5.0 — Apache-2.0 OR MIT — https://github.com/smol-rs/async-process async-recursion 1.1.1 — MIT OR Apache-2.0 — https://github.com/dcchut/async-recursion + async-signal 0.2.14 — Apache-2.0 OR MIT — https://github.com/smol-rs/async-signal + async-task 4.7.1 — Apache-2.0 OR MIT — https://github.com/smol-rs/async-task async-trait 0.1.89 — MIT OR Apache-2.0 — https://github.com/dtolnay/async-trait atomic-waker 1.1.2 — Apache-2.0 OR MIT — https://github.com/smol-rs/atomic-waker audiopus_sys 0.2.2 — ISC — https://github.com/lakelezz/audiopus_sys.git @@ -44,7 +57,7 @@ MANIFEST (crate version — SPDX license — source) aws-lc-sys 0.41.0 — ISC AND (Apache-2.0 OR ISC) AND Apache-2.0 AND MIT AND BSD-3-Clause AND (Apache-2.0 OR ISC OR MIT) AND (Apache-2.0 OR ISC OR MIT-0) — https://github.com/aws/aws-lc-rs axum 0.8.9 — MIT — https://github.com/tokio-rs/axum axum-core 0.5.6 — MIT — https://github.com/tokio-rs/axum - axum-server 0.7.3 — MIT — https://github.com/programatik29/axum-server + axum-server 0.8.0 — MIT — https://github.com/programatik29/axum-server base64 0.22.1 — MIT OR Apache-2.0 — https://github.com/marshallpierce/rust-base64 base64ct 1.8.3 — Apache-2.0 OR MIT — https://github.com/RustCrypto/formats bindgen 0.72.1 — BSD-3-Clause — https://github.com/rust-lang/rust-bindgen @@ -53,16 +66,17 @@ MANIFEST (crate version — SPDX license — source) bitflags 2.13.0 — MIT OR Apache-2.0 — https://github.com/bitflags/bitflags block-buffer 0.10.4 — MIT OR Apache-2.0 — https://github.com/RustCrypto/utils block-padding 0.3.3 — MIT OR Apache-2.0 — https://github.com/RustCrypto/utils + blocking 1.6.2 — Apache-2.0 OR MIT — https://github.com/smol-rs/blocking bumpalo 3.20.3 — MIT OR Apache-2.0 — https://github.com/fitzgen/bumpalo bytemuck 1.25.0 — Zlib OR Apache-2.0 OR MIT — https://github.com/Lokathor/bytemuck bytemuck_derive 1.10.2 — Zlib OR Apache-2.0 OR MIT — https://github.com/Lokathor/bytemuck - bytes 1.11.1 — MIT — https://github.com/tokio-rs/bytes + bytes 1.12.0 — MIT — https://github.com/tokio-rs/bytes cairo-rs 0.22.0 — MIT — https://github.com/gtk-rs/gtk-rs-core cairo-sys-rs 0.22.0 — MIT — https://github.com/gtk-rs/gtk-rs-core cast 0.3.0 — MIT OR Apache-2.0 — https://github.com/japaric/cast.rs cbc 0.1.2 — MIT OR Apache-2.0 — https://github.com/RustCrypto/block-modes - cbindgen 0.29.3 — MPL-2.0 — https://github.com/mozilla/cbindgen - cc 1.2.63 — MIT OR Apache-2.0 — https://github.com/rust-lang/cc-rs + cbindgen 0.29.4 — MPL-2.0 — https://github.com/mozilla/cbindgen + cc 1.2.65 — MIT OR Apache-2.0 — https://github.com/rust-lang/cc-rs cesu8 1.1.0 — Apache-2.0/MIT — https://github.com/emk/cesu8-rs cexpr 0.6.0 — Apache-2.0/MIT — https://github.com/jethrogb/rust-cexpr cfg-expr 0.20.8 — MIT OR Apache-2.0 — https://github.com/EmbarkStudios/cfg-expr @@ -120,14 +134,15 @@ MANIFEST (crate version — SPDX license — source) ffmpeg-sys-next 8.1.0 — WTFPL — https://github.com/zmwangx/rust-ffmpeg-sys fiat-crypto 0.2.9 — MIT OR Apache-2.0 OR BSD-1-Clause — https://github.com/mit-plv/fiat-crypto field-offset 0.3.6 — MIT OR Apache-2.0 — https://github.com/Diggsey/rust-field-offset + filetime 0.2.29 — MIT/Apache-2.0 — https://github.com/alexcrichton/filetime find-msvc-tools 0.1.9 — MIT OR Apache-2.0 — https://github.com/rust-lang/cc-rs fixedbitset 0.5.7 — MIT OR Apache-2.0 — https://github.com/petgraph/fixedbitset flate2 1.1.9 — MIT OR Apache-2.0 — https://github.com/rust-lang/flate2-rs - flume 0.11.1 — Apache-2.0/MIT — https://github.com/zesterer/flume + flume 0.12.0 — Apache-2.0/MIT — https://github.com/zesterer/flume fnv 1.0.7 — Apache-2.0 / MIT — https://github.com/servo/rust-fnv - foldhash 0.1.5 — Zlib — https://github.com/orlp/foldhash foldhash 0.2.0 — Zlib — https://github.com/orlp/foldhash form_urlencoded 1.2.2 — MIT OR Apache-2.0 — https://github.com/servo/rust-url + fragile 2.1.0 — Apache-2.0 — https://github.com/mitsuhiko/fragile fs-err 3.3.0 — MIT OR Apache-2.0 — https://github.com/andrewhickman/fs-err fs_extra 1.3.0 — MIT — https://github.com/webdesus/fs_extra futures 0.3.32 — MIT OR Apache-2.0 — https://github.com/rust-lang/futures-rs @@ -147,7 +162,7 @@ MANIFEST (crate version — SPDX license — source) generic-array 0.14.7 — MIT — https://github.com/fizyk20/generic-array.git getrandom 0.2.17 — MIT OR Apache-2.0 — https://github.com/rust-random/getrandom getrandom 0.3.4 — MIT OR Apache-2.0 — https://github.com/rust-random/getrandom - getrandom 0.4.2 — MIT OR Apache-2.0 — https://github.com/rust-random/getrandom + getrandom 0.4.3 — MIT OR Apache-2.0 — https://github.com/rust-random/getrandom ghash 0.5.1 — Apache-2.0 OR MIT — https://github.com/RustCrypto/universal-hashes gio 0.22.6 — MIT — https://github.com/gtk-rs/gtk-rs-core gio-sys 0.22.0 — MIT — https://github.com/gtk-rs/gtk-rs-core @@ -163,9 +178,8 @@ MANIFEST (crate version — SPDX license — source) gtk4 0.11.3 — MIT — https://github.com/gtk-rs/gtk4-rs gtk4-macros 0.11.0 — MIT — https://github.com/gtk-rs/gtk4-rs gtk4-sys 0.11.3 — MIT — https://github.com/gtk-rs/gtk4-rs - h2 0.4.14 — MIT — https://github.com/hyperium/h2 + h2 0.4.15 — MIT — https://github.com/hyperium/h2 half 2.7.1 — MIT OR Apache-2.0 — https://github.com/VoidStarKat/half-rs - hashbrown 0.15.5 — MIT OR Apache-2.0 — https://github.com/rust-lang/hashbrown hashbrown 0.16.1 — MIT OR Apache-2.0 — https://github.com/rust-lang/hashbrown hashbrown 0.17.1 — MIT OR Apache-2.0 — https://github.com/rust-lang/hashbrown hashlink 0.12.0 — MIT OR Apache-2.0 — https://github.com/djc/hashlink @@ -188,9 +202,9 @@ MANIFEST (crate version — SPDX license — source) icu_properties 2.2.0 — Unicode-3.0 — https://github.com/unicode-org/icu4x icu_properties_data 2.2.0 — Unicode-3.0 — https://github.com/unicode-org/icu4x icu_provider 2.2.0 — Unicode-3.0 — https://github.com/unicode-org/icu4x - id-arena 2.3.0 — MIT/Apache-2.0 — https://github.com/fitzgen/id-arena idna 1.1.0 — MIT OR Apache-2.0 — https://github.com/servo/rust-url/ idna_adapter 1.2.2 — Apache-2.0 OR MIT — https://github.com/hsivonen/idna_adapter + if-addrs 0.13.4 — MIT OR BSD-3-Clause — https://github.com/messense/if-addrs if-addrs 0.15.0 — MIT OR BSD-3-Clause — https://github.com/messense/if-addrs indexmap 2.14.0 — Apache-2.0 OR MIT — https://github.com/indexmap-rs/indexmap inout 0.1.4 — MIT OR Apache-2.0 — https://github.com/RustCrypto/utils @@ -204,10 +218,10 @@ MANIFEST (crate version — SPDX license — source) jni-sys 0.4.1 — MIT OR Apache-2.0 — https://github.com/jni-rs/jni-sys jni-sys-macros 0.4.1 — MIT OR Apache-2.0 — https://github.com/jni-rs/jni-sys jobserver 0.1.34 — MIT OR Apache-2.0 — https://github.com/rust-lang/jobserver-rs - js-sys 0.3.100 — MIT OR Apache-2.0 — https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/js-sys + js-sys 0.3.103 — MIT OR Apache-2.0 — https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/js-sys khronos-egl 6.0.0 — MIT/Apache-2.0 — https://github.com/timothee-haudebourg/khronos-egl + ksni 0.3.5 — Unlicense — https://github.com/iovxw/ksni lazy_static 1.5.0 — MIT OR Apache-2.0 — https://github.com/rust-lang-nursery/lazy-static.rs - leb128fmt 0.1.0 — MIT OR Apache-2.0 — https://github.com/bluk/leb128fmt libadwaita 0.9.1 — MIT — https://gitlab.gnome.org/World/Rust/libadwaita-rs libadwaita-sys 0.9.1 — MIT — https://gitlab.gnome.org/World/Rust/libadwaita-rs libc 0.2.186 — MIT OR Apache-2.0 — https://github.com/rust-lang/libc @@ -219,13 +233,14 @@ MANIFEST (crate version — SPDX license — source) linux-raw-sys 0.12.1 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/sunfishcode/linux-raw-sys litemap 0.8.2 — Unicode-3.0 — https://github.com/unicode-org/icu4x lock_api 0.4.14 — MIT OR Apache-2.0 — https://github.com/Amanieu/parking_lot - log 0.4.32 — MIT OR Apache-2.0 — https://github.com/rust-lang/log + log 0.4.33 — MIT OR Apache-2.0 — https://github.com/rust-lang/log lru-slab 0.1.2 — MIT OR Apache-2.0 OR Zlib — https://github.com/Ralith/lru-slab + mac_address 1.1.8 — MIT OR Apache-2.0 — https://github.com/rep-nop/mac_address matchers 0.2.0 — MIT — https://github.com/hawkw/matchers matchit 0.8.4 — MIT AND BSD-3-Clause — https://github.com/ibraheemdev/matchit - mdns-sd 0.20.0 — Apache-2.0 OR MIT — https://github.com/keepsimple1/mdns-sd - memchr 2.8.1 — Unlicense OR MIT — https://github.com/BurntSushi/memchr - memmap2 0.9.10 — MIT OR Apache-2.0 — https://github.com/RazrFalcon/memmap2-rs + mdns-sd 0.20.1 — Apache-2.0 OR MIT — https://github.com/keepsimple1/mdns-sd + memchr 2.8.2 — Unlicense OR MIT — https://github.com/BurntSushi/memchr + memmap2 0.9.11 — MIT OR Apache-2.0 — https://github.com/RazrFalcon/memmap2-rs memoffset 0.9.1 — MIT — https://github.com/Gilnaa/memoffset mime 0.3.17 — MIT OR Apache-2.0 — https://github.com/hyperium/mime minimal-lexical 0.2.1 — MIT/Apache-2.0 — https://github.com/Alexhuszagh/minimal-lexical @@ -234,6 +249,7 @@ MANIFEST (crate version — SPDX license — source) nasm-rs 0.3.2 — MIT OR Apache-2.0 — https://github.com/medek/nasm-rs ndk 0.9.0 — MIT OR Apache-2.0 — https://github.com/rust-mobile/ndk ndk-sys 0.6.0+11769913 — MIT OR Apache-2.0 — https://github.com/rust-mobile/ndk + nix 0.29.0 — MIT — https://github.com/nix-rust/nix nix 0.30.1 — MIT — https://github.com/nix-rust/nix nom 7.1.3 — MIT — https://github.com/Geal/nom nom 8.0.0 — MIT — https://github.com/rust-bakery/nom @@ -241,6 +257,7 @@ MANIFEST (crate version — SPDX license — source) num-bigint 0.4.6 — MIT OR Apache-2.0 — https://github.com/rust-num/num-bigint num-bigint-dig 0.8.6 — MIT/Apache-2.0 — https://github.com/dignifiedquire/num-bigint num-conv 0.2.2 — MIT OR Apache-2.0 — https://github.com/jhpratt/num-conv + num-derive 0.4.2 — MIT OR Apache-2.0 — https://github.com/rust-num/num-derive num-integer 0.1.46 — MIT OR Apache-2.0 — https://github.com/rust-num/num-integer num-iter 0.1.45 — MIT OR Apache-2.0 — https://github.com/rust-num/num-iter num-traits 0.2.19 — MIT OR Apache-2.0 — https://github.com/rust-num/num-traits @@ -263,15 +280,18 @@ MANIFEST (crate version — SPDX license — source) parking_lot 0.12.5 — MIT OR Apache-2.0 — https://github.com/Amanieu/parking_lot parking_lot_core 0.9.12 — MIT OR Apache-2.0 — https://github.com/Amanieu/parking_lot paste 1.0.15 — MIT OR Apache-2.0 — https://github.com/dtolnay/paste + pastey 0.2.3 — MIT OR Apache-2.0 — https://github.com/as1100k/pastey pem 3.0.6 — MIT — https://github.com/jcreekmore/pem-rs.git pem-rfc7468 0.7.0 — Apache-2.0 OR MIT — https://github.com/RustCrypto/formats/tree/master/pem-rfc7468 percent-encoding 2.3.2 — MIT OR Apache-2.0 — https://github.com/servo/rust-url/ pin-project-lite 0.2.17 — Apache-2.0 OR MIT — https://github.com/taiki-e/pin-project-lite + piper 0.2.5 — MIT OR Apache-2.0 — https://github.com/smol-rs/piper pipewire 0.9.2 — MIT — https://gitlab.freedesktop.org/pipewire/pipewire-rs pipewire-sys 0.9.2 — MIT — https://gitlab.freedesktop.org/pipewire/pipewire-rs pkcs1 0.7.5 — Apache-2.0 OR MIT — https://github.com/RustCrypto/formats/tree/master/pkcs1 pkcs8 0.10.2 — Apache-2.0 OR MIT — https://github.com/RustCrypto/formats/tree/master/pkcs8 pkg-config 0.3.33 — MIT OR Apache-2.0 — https://github.com/rust-lang/pkg-config-rs + polling 3.11.0 — Apache-2.0 OR MIT — https://github.com/smol-rs/polling polyval 0.6.2 — Apache-2.0 OR MIT — https://github.com/RustCrypto/universal-hashes potential_utf 0.1.5 — Unicode-3.0 — https://github.com/unicode-org/icu4x powerfmt 0.2.0 — MIT OR Apache-2.0 — https://github.com/jhpratt/powerfmt @@ -282,10 +302,10 @@ MANIFEST (crate version — SPDX license — source) proptest 1.11.0 — MIT OR Apache-2.0 — https://github.com/proptest-rs/proptest quick-error 1.2.3 — MIT/Apache-2.0 — http://github.com/tailhook/quick-error quick-xml 0.39.4 — MIT — https://github.com/tafia/quick-xml - quinn 0.11.9 — MIT OR Apache-2.0 — https://github.com/quinn-rs/quinn - quinn-proto 0.11.14 — MIT OR Apache-2.0 — https://github.com/quinn-rs/quinn + quinn 0.11.11 — MIT OR Apache-2.0 — https://github.com/quinn-rs/quinn + quinn-proto 0.11.15 — MIT OR Apache-2.0 — https://github.com/quinn-rs/quinn quinn-udp 0.5.14 — MIT OR Apache-2.0 — https://github.com/quinn-rs/quinn - quote 1.0.45 — MIT OR Apache-2.0 — https://github.com/dtolnay/quote + quote 1.0.46 — MIT OR Apache-2.0 — https://github.com/dtolnay/quote r-efi 5.3.0 — MIT OR Apache-2.0 OR LGPL-2.1-or-later — https://github.com/r-efi/r-efi r-efi 6.0.0 — MIT OR Apache-2.0 OR LGPL-2.1-or-later — https://github.com/r-efi/r-efi rand 0.8.6 — MIT OR Apache-2.0 — https://github.com/rust-random/rand @@ -300,10 +320,13 @@ MANIFEST (crate version — SPDX license — source) readme-rustdocifier 0.1.1 — MIT — https://github.com/malaire/readme-rustdocifier redox_syscall 0.5.18 — MIT — https://gitlab.redox-os.org/redox-os/syscall reed-solomon-simd 3.1.0 — MIT AND BSD-3-Clause — https://github.com/AndersTrier/reed-solomon-simd - regex 1.12.3 — MIT OR Apache-2.0 — https://github.com/rust-lang/regex + regex 1.12.4 — MIT OR Apache-2.0 — https://github.com/rust-lang/regex regex-automata 0.4.14 — MIT OR Apache-2.0 — https://github.com/rust-lang/regex - regex-syntax 0.8.10 — MIT OR Apache-2.0 — https://github.com/rust-lang/regex + regex-syntax 0.8.11 — MIT OR Apache-2.0 — https://github.com/rust-lang/regex reis 0.6.1 — MIT — https://github.com/ids1024/reis + relm4 0.11.0 — Apache-2.0 OR MIT — https://github.com/Relm4/Relm4 + relm4-css 0.11.0 — Apache-2.0 OR MIT — https://github.com/Relm4/Relm4 + relm4-macros 0.11.0 — Apache-2.0 OR MIT — https://github.com/Relm4/Relm4 ring 0.17.14 — Apache-2.0 AND ISC — https://github.com/briansmith/ring roxmltree 0.21.1 — MIT OR Apache-2.0 — https://github.com/RazrFalcon/roxmltree rpkg-config 0.1.2 — Zlib OR MIT OR Apache-2.0 — https://github.com/maia-s/rpkg-config-rs @@ -314,9 +337,8 @@ MANIFEST (crate version — SPDX license — source) rustc_version 0.4.1 — MIT OR Apache-2.0 — https://github.com/djc/rustc-version-rs rusticata-macros 4.1.0 — MIT/Apache-2.0 — https://github.com/rusticata/rusticata-macros.git rustix 1.1.4 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/rustix - rustls 0.23.40 — Apache-2.0 OR ISC OR MIT — https://github.com/rustls/rustls + rustls 0.23.41 — Apache-2.0 OR ISC OR MIT — https://github.com/rustls/rustls rustls-native-certs 0.8.4 — Apache-2.0 OR ISC OR MIT — https://github.com/rustls/rustls-native-certs - rustls-pemfile 2.2.0 — Apache-2.0 OR ISC OR MIT — https://github.com/rustls/pemfile rustls-pki-types 1.14.1 — MIT OR Apache-2.0 — https://github.com/rustls/pki-types rustls-platform-verifier 0.6.2 — MIT OR Apache-2.0 — https://github.com/rustls/rustls-platform-verifier rustls-platform-verifier-android 0.1.1 — MIT OR Apache-2.0 — https://github.com/rustls/rustls-platform-verifier @@ -347,6 +369,7 @@ MANIFEST (crate version — SPDX license — source) serde_json 1.0.150 — MIT OR Apache-2.0 — https://github.com/serde-rs/json serde_path_to_error 0.1.20 — MIT OR Apache-2.0 — https://github.com/dtolnay/path-to-error serde_repr 0.1.20 — MIT OR Apache-2.0 — https://github.com/dtolnay/serde-repr + serde_spanned 0.6.9 — MIT OR Apache-2.0 — https://github.com/toml-rs/toml serde_spanned 1.1.1 — MIT OR Apache-2.0 — https://github.com/toml-rs/toml serde_urlencoded 0.7.1 — MIT/Apache-2.0 — https://github.com/nox/serde_urlencoded sha2 0.10.9 — MIT OR Apache-2.0 — https://github.com/RustCrypto/hashes @@ -357,9 +380,11 @@ MANIFEST (crate version — SPDX license — source) signature 2.2.0 — Apache-2.0 OR MIT — https://github.com/RustCrypto/traits/tree/master/signature simd-adler32 0.3.9 — MIT — https://github.com/mcountryman/simd-adler32 siphasher 1.0.3 — MIT/Apache-2.0 — https://github.com/jedisct1/rust-siphash + skia-bindings 0.87.0 — MIT — https://github.com/rust-skia/rust-skia + skia-safe 0.87.0 — MIT — https://github.com/rust-skia/rust-skia slab 0.4.12 — MIT — https://github.com/tokio-rs/slab - smallvec 1.15.1 — MIT OR Apache-2.0 — https://github.com/servo/rust-smallvec - socket-pktinfo 0.3.2 — MIT — https://github.com/pixsper/socket-pktinfo + smallvec 1.15.2 — MIT OR Apache-2.0 — https://github.com/servo/rust-smallvec + socket-pktinfo 0.4.0 — MIT — https://github.com/pixsper/socket-pktinfo socket2 0.6.4 — MIT OR Apache-2.0 — https://github.com/rust-lang/socket2 spake2 0.4.0 — MIT OR Apache-2.0 — https://github.com/RustCrypto/PAKEs/tree/master/spake2 spin 0.9.8 — MIT — https://github.com/mvdnes/spin-rs.git @@ -368,10 +393,11 @@ MANIFEST (crate version — SPDX license — source) stable_deref_trait 1.2.1 — MIT OR Apache-2.0 — https://github.com/storyyeller/stable_deref_trait strsim 0.11.1 — MIT — https://github.com/rapidfuzz/strsim-rs subtle 2.6.1 — BSD-3-Clause — https://github.com/dalek-cryptography/subtle - syn 2.0.117 — MIT OR Apache-2.0 — https://github.com/dtolnay/syn + syn 2.0.118 — MIT OR Apache-2.0 — https://github.com/dtolnay/syn sync_wrapper 1.0.2 — Apache-2.0 — https://github.com/Actyx/sync_wrapper synstructure 0.13.2 — MIT — https://github.com/mystor/synstructure system-deps 7.0.8 — MIT OR Apache-2.0 — https://github.com/gdesmott/system-deps + tar 0.4.46 — MIT OR Apache-2.0 — https://github.com/composefs/tar-rs target-lexicon 0.13.5 — Apache-2.0 WITH LLVM-exception — https://github.com/bytecodealliance/target-lexicon tempfile 3.27.0 — MIT OR Apache-2.0 — https://github.com/Stebalien/tempfile thiserror 1.0.69 — MIT OR Apache-2.0 — https://github.com/dtolnay/thiserror @@ -379,9 +405,9 @@ MANIFEST (crate version — SPDX license — source) thiserror-impl 1.0.69 — MIT OR Apache-2.0 — https://github.com/dtolnay/thiserror thiserror-impl 2.0.18 — MIT OR Apache-2.0 — https://github.com/dtolnay/thiserror thread_local 1.1.9 — MIT OR Apache-2.0 — https://github.com/Amanieu/thread_local-rs - time 0.3.47 — MIT OR Apache-2.0 — https://github.com/time-rs/time - time-core 0.1.8 — MIT OR Apache-2.0 — https://github.com/time-rs/time - time-macros 0.2.27 — MIT OR Apache-2.0 — https://github.com/time-rs/time + time 0.3.51 — MIT OR Apache-2.0 — https://github.com/time-rs/time + time-core 0.1.9 — MIT OR Apache-2.0 — https://github.com/time-rs/time + time-macros 0.2.30 — MIT OR Apache-2.0 — https://github.com/time-rs/time tinystr 0.8.3 — Unicode-3.0 — https://github.com/unicode-org/icu4x tinytemplate 1.2.1 — Apache-2.0 OR MIT — https://github.com/bheisler/TinyTemplate tinyvec 1.11.0 — Zlib OR Apache-2.0 OR MIT — https://github.com/Lokathor/tinyvec @@ -390,12 +416,16 @@ MANIFEST (crate version — SPDX license — source) tokio-macros 2.7.0 — MIT — https://github.com/tokio-rs/tokio tokio-rustls 0.26.4 — MIT OR Apache-2.0 — https://github.com/rustls/tokio-rustls tokio-util 0.7.18 — MIT — https://github.com/tokio-rs/tokio + toml 0.8.23 — MIT OR Apache-2.0 — https://github.com/toml-rs/toml toml 0.9.12+spec-1.1.0 — MIT OR Apache-2.0 — https://github.com/toml-rs/toml toml 1.1.2+spec-1.1.0 — MIT OR Apache-2.0 — https://github.com/toml-rs/toml + toml_datetime 0.6.11 — MIT OR Apache-2.0 — https://github.com/toml-rs/toml toml_datetime 0.7.5+spec-1.1.0 — MIT OR Apache-2.0 — https://github.com/toml-rs/toml toml_datetime 1.1.1+spec-1.1.0 — MIT OR Apache-2.0 — https://github.com/toml-rs/toml + toml_edit 0.22.27 — MIT OR Apache-2.0 — https://github.com/toml-rs/toml toml_edit 0.25.12+spec-1.1.0 — MIT OR Apache-2.0 — https://github.com/toml-rs/toml toml_parser 1.1.2+spec-1.1.0 — MIT OR Apache-2.0 — https://github.com/toml-rs/toml + toml_write 0.1.2 — MIT OR Apache-2.0 — https://github.com/toml-rs/toml toml_writer 1.1.1+spec-1.1.0 — MIT OR Apache-2.0 — https://github.com/toml-rs/toml tower 0.5.3 — MIT — https://github.com/tower-rs/tower tower-layer 0.3.3 — MIT — https://github.com/tower-rs/tower @@ -411,7 +441,6 @@ MANIFEST (crate version — SPDX license — source) unicode-ident 1.0.24 — (MIT OR Apache-2.0) AND Unicode-3.0 — https://github.com/dtolnay/unicode-ident unicode-segmentation 1.13.3 — MIT OR Apache-2.0 — https://github.com/unicode-rs/unicode-segmentation unicode-width 0.2.2 — MIT OR Apache-2.0 — https://github.com/unicode-rs/unicode-width - unicode-xid 0.2.6 — MIT OR Apache-2.0 — https://github.com/unicode-rs/unicode-xid universal-hash 0.5.1 — MIT OR Apache-2.0 — https://github.com/RustCrypto/traits untrusted 0.9.0 — ISC — https://github.com/briansmith/untrusted ureq 2.12.1 — MIT OR Apache-2.0 — https://github.com/algesten/ureq @@ -422,7 +451,7 @@ MANIFEST (crate version — SPDX license — source) utoipa-axum 0.2.0 — MIT OR Apache-2.0 — https://github.com/juhaku/utoipa utoipa-gen 5.5.0 — MIT OR Apache-2.0 — https://github.com/juhaku/utoipa utoipa-scalar 0.3.0 — MIT OR Apache-2.0 — https://github.com/juhaku/utoipa - uuid 1.23.2 — Apache-2.0 OR MIT — https://github.com/uuid-rs/uuid + uuid 1.23.4 — Apache-2.0 OR MIT — https://github.com/uuid-rs/uuid valuable 0.1.1 — MIT — https://github.com/tokio-rs/valuable vcpkg 0.2.15 — MIT/Apache-2.0 — https://github.com/mcgoo/vcpkg-rs version-compare 0.2.1 — MIT — https://gitlab.com/timvisee/version-compare @@ -431,29 +460,28 @@ MANIFEST (crate version — SPDX license — source) walkdir 2.5.0 — Unlicense/MIT — https://github.com/BurntSushi/walkdir wasapi 0.23.0 — MIT — https://github.com/HEnquist/wasapi-rs wasi 0.11.1+wasi-snapshot-preview1 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasi - wasip2 1.0.3+wasi-0.2.9 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasi-rs - wasip3 0.4.0+wasi-0.3.0-rc-2026-01-06 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasi-rs - wasm-bindgen 0.2.123 — MIT OR Apache-2.0 — https://github.com/wasm-bindgen/wasm-bindgen - wasm-bindgen-macro 0.2.123 — MIT OR Apache-2.0 — https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/macro - wasm-bindgen-macro-support 0.2.123 — MIT OR Apache-2.0 — https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/macro-support - wasm-bindgen-shared 0.2.123 — MIT OR Apache-2.0 — https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/shared - wasm-encoder 0.244.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasm-encoder - wasm-metadata 0.244.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasm-metadata - wasmparser 0.244.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasmparser + wasip2 1.0.4+wasi-0.2.12 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasi-rs + wasm-bindgen 0.2.126 — MIT OR Apache-2.0 — https://github.com/wasm-bindgen/wasm-bindgen + wasm-bindgen-macro 0.2.126 — MIT OR Apache-2.0 — https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/macro + wasm-bindgen-macro-support 0.2.126 — MIT OR Apache-2.0 — https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/macro-support + wasm-bindgen-shared 0.2.126 — MIT OR Apache-2.0 — https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/shared wayland-backend 0.3.15 — MIT — https://github.com/smithay/wayland-rs wayland-client 0.31.14 — MIT — https://github.com/smithay/wayland-rs - wayland-protocols 0.32.12 — MIT — https://github.com/smithay/wayland-rs + wayland-protocols 0.32.13 — MIT — https://github.com/smithay/wayland-rs wayland-protocols-misc 0.3.12 — MIT — https://github.com/smithay/wayland-rs wayland-protocols-wlr 0.3.12 — MIT — https://github.com/smithay/wayland-rs wayland-scanner 0.31.10 — MIT — https://github.com/smithay/wayland-rs wayland-sys 0.31.11 — MIT — https://github.com/smithay/wayland-rs web-time 1.1.0 — MIT OR Apache-2.0 — https://github.com/daxpedda/web-time - webpki-root-certs 1.0.7 — CDLA-Permissive-2.0 — https://github.com/rustls/webpki-roots + webpki-root-certs 1.0.8 — CDLA-Permissive-2.0 — https://github.com/rustls/webpki-roots webpki-roots 0.26.11 — CDLA-Permissive-2.0 — https://github.com/rustls/webpki-roots webpki-roots 1.0.8 — CDLA-Permissive-2.0 — https://github.com/rustls/webpki-roots wide 0.7.33 — Zlib OR Apache-2.0 OR MIT — https://github.com/Lokathor/wide widestring 1.2.1 — MIT OR Apache-2.0 — https://github.com/VoidStarKat/widestring-rs + winapi 0.3.9 — MIT/Apache-2.0 — https://github.com/retep998/winapi-rs + winapi-i686-pc-windows-gnu 0.4.0 — MIT/Apache-2.0 — https://github.com/retep998/winapi-rs winapi-util 0.1.11 — Unlicense OR MIT — https://github.com/BurntSushi/winapi-util + winapi-x86_64-pc-windows-gnu 0.4.0 — MIT/Apache-2.0 — https://github.com/retep998/winapi-rs windows 0.62.2 — MIT OR Apache-2.0 — https://github.com/microsoft/windows-rs windows 0.62.2 — MIT OR Apache-2.0 — https://github.com/microsoft/windows-rs windows-collections 0.3.2 — MIT OR Apache-2.0 — https://github.com/microsoft/windows-rs @@ -471,6 +499,7 @@ MANIFEST (crate version — SPDX license — source) windows-numerics 0.3.1 — MIT OR Apache-2.0 — https://github.com/microsoft/windows-rs windows-numerics 0.3.1 — MIT OR Apache-2.0 — https://github.com/microsoft/windows-rs windows-reactor 0.0.0 — MIT OR Apache-2.0 — https://github.com/microsoft/windows-rs + windows-reactor-setup 0.0.0 — UNKNOWN windows-reference 0.1.0 — MIT OR Apache-2.0 — https://github.com/microsoft/windows-rs windows-result 0.4.1 — MIT OR Apache-2.0 — https://github.com/microsoft/windows-rs windows-result 0.4.1 — MIT OR Apache-2.0 — https://github.com/microsoft/windows-rs @@ -514,15 +543,11 @@ MANIFEST (crate version — SPDX license — source) winnow 0.7.15 — MIT — https://github.com/winnow-rs/winnow winnow 1.0.3 — MIT — https://github.com/winnow-rs/winnow winreg 0.56.0 — MIT — https://github.com/gentoo90/winreg-rs - wit-bindgen 0.51.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wit-bindgen + winresource 0.1.31 — MIT — https://github.com/BenjaminRi/winresource wit-bindgen 0.57.1 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wit-bindgen - wit-bindgen-core 0.51.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wit-bindgen - wit-bindgen-rust 0.51.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wit-bindgen - wit-bindgen-rust-macro 0.51.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wit-bindgen - wit-component 0.244.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wit-component - wit-parser 0.244.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wit-parser writeable 0.6.3 — Unicode-3.0 — https://github.com/unicode-org/icu4x x509-parser 0.16.0 — MIT OR Apache-2.0 — https://github.com/rusticata/x509-parser.git + xattr 1.6.1 — MIT OR Apache-2.0 — https://github.com/Stebalien/xattr xkbcommon 0.8.0 — MIT — https://github.com/rust-x-bindings/xkbcommon-rs xkeysym 0.2.1 — MIT OR Apache-2.0 OR Zlib — https://github.com/notgull/xkeysym yasna 0.5.2 — MIT OR Apache-2.0 — https://github.com/qnighy/yasna.rs @@ -531,11 +556,11 @@ MANIFEST (crate version — SPDX license — source) zbus 5.16.0 — MIT — https://github.com/z-galaxy/zbus/ zbus_macros 5.16.0 — MIT — https://github.com/z-galaxy/zbus/ zbus_names 4.3.2 — MIT — https://github.com/z-galaxy/zbus/ - zerocopy 0.8.50 — BSD-2-Clause OR Apache-2.0 OR MIT — https://github.com/google/zerocopy - zerocopy-derive 0.8.50 — BSD-2-Clause OR Apache-2.0 OR MIT — https://github.com/google/zerocopy + zerocopy 0.8.52 — BSD-2-Clause OR Apache-2.0 OR MIT — https://github.com/google/zerocopy + zerocopy-derive 0.8.52 — BSD-2-Clause OR Apache-2.0 OR MIT — https://github.com/google/zerocopy zerofrom 0.1.8 — Unicode-3.0 — https://github.com/unicode-org/icu4x zerofrom-derive 0.1.7 — Unicode-3.0 — https://github.com/unicode-org/icu4x - zeroize 1.8.2 — Apache-2.0 OR MIT — https://github.com/RustCrypto/utils + zeroize 1.9.0 — Apache-2.0 OR MIT — https://github.com/RustCrypto/utils zerotrie 0.2.4 — Unicode-3.0 — https://github.com/unicode-org/icu4x zerovec 0.11.6 — Unicode-3.0 — https://github.com/unicode-org/icu4x zerovec-derive 0.11.3 — Unicode-3.0 — https://github.com/unicode-org/icu4x @@ -563,13 +588,11 @@ Crates whose package did not embed a license file (SPDX + source only) sdl3-image-src 3.4.4 — Zlib — https://codeberg.org/maia/sdl3-sys-rs sdl3-mixer-src 3.2.4 — Zlib — https://codeberg.org/maia/sdl3-sys-rs sdl3-ttf-src 3.2.2 — Zlib — https://github.com/maia-s/sdl3-sys-rs + skia-bindings 0.87.0 — MIT — https://github.com/rust-skia/rust-skia + skia-safe 0.87.0 — MIT — https://github.com/rust-skia/rust-skia valuable 0.1.1 — MIT — https://github.com/tokio-rs/valuable - wasip3 0.4.0+wasi-0.3.0-rc-2026-01-06 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasi-rs - wasm-encoder 0.244.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasm-encoder - wasm-metadata 0.244.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasm-metadata - wasmparser 0.244.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasmparser - wit-component 0.244.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wit-component - wit-parser 0.244.0 — Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT — https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wit-parser + winapi-i686-pc-windows-gnu 0.4.0 — MIT/Apache-2.0 — https://github.com/retep998/winapi-rs + winapi-x86_64-pc-windows-gnu 0.4.0 — MIT/Apache-2.0 — https://github.com/retep998/winapi-rs yasna 0.5.2 — MIT OR Apache-2.0 — https://github.com/qnighy/yasna.rs ============================================================================ @@ -800,7 +823,7 @@ limitations under the License. ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: adler2 2.0.1, anyhow 1.0.102, async-channel 2.5.0, async-recursion 1.1.1, async-trait 0.1.89, atomic-waker 1.1.2, concurrent-queue 2.5.0, curve25519-dalek-derive 0.1.1, displaydoc 0.2.6, endi 1.1.1, event-listener 5.4.1, event-listener-strategy 0.5.4, fastrand 2.4.1, flume 0.11.1, fs-err 3.3.0, futures-lite 2.6.1, hermit-abi 0.5.2, is-terminal 0.4.17, itoa 1.0.18, khronos-egl 6.0.0, leb128fmt 0.1.0, linux-raw-sys 0.12.1, minimal-lexical 0.2.1, num_enum 0.7.6, num_enum_derive 0.7.6, once_cell 1.21.4, ordered-stream 0.2.0, parking 2.2.1, paste 1.0.15, pin-project-lite 0.2.17, prettyplease 0.2.37, proc-macro-crate 3.5.0, proc-macro2 1.0.106, quote 1.0.45, reis 0.6.1, rsa 0.9.10, rustc-hash 2.1.2, rustix 1.1.4, rustversion 1.0.22, semver 1.0.28, serde 1.0.228, serde_core 1.0.228, serde_derive 1.0.228, serde_json 1.0.150, serde_path_to_error 0.1.20, serde_repr 0.1.20, syn 2.0.117, system-deps 7.0.8, thiserror 1.0.69, thiserror 2.0.18, thiserror-impl 1.0.69, thiserror-impl 2.0.18, unicode-ident 1.0.24, wasi 0.11.1+wasi-snapshot-preview1, wasip2 1.0.3+wasi-0.2.9, wit-bindgen 0.51.0, wit-bindgen 0.57.1, wit-bindgen-core 0.51.0, wit-bindgen-rust 0.51.0, wit-bindgen-rust-macro 0.51.0, zmij 1.0.21, zvariant_utils 3.4.0 +The following license (LICENSE-MIT) applies to: adler2 2.0.1, anyhow 1.0.103, async-channel 2.5.0, async-executor 1.14.0, async-io 2.6.0, async-lock 3.4.2, async-process 2.5.0, async-recursion 1.1.1, async-signal 0.2.14, async-task 4.7.1, async-trait 0.1.89, atomic-waker 1.1.2, blocking 1.6.2, concurrent-queue 2.5.0, curve25519-dalek-derive 0.1.1, displaydoc 0.2.6, endi 1.1.1, event-listener 5.4.1, event-listener-strategy 0.5.4, fastrand 2.4.1, flume 0.12.0, fs-err 3.3.0, futures-lite 2.6.1, hermit-abi 0.5.2, is-terminal 0.4.17, itoa 1.0.18, khronos-egl 6.0.0, linux-raw-sys 0.12.1, minimal-lexical 0.2.1, num_enum 0.7.6, num_enum_derive 0.7.6, once_cell 1.21.4, ordered-stream 0.2.0, parking 2.2.1, paste 1.0.15, pastey 0.2.3, pin-project-lite 0.2.17, piper 0.2.5, polling 3.11.0, prettyplease 0.2.37, proc-macro-crate 3.5.0, proc-macro2 1.0.106, quote 1.0.46, reis 0.6.1, relm4 0.11.0, relm4-css 0.11.0, relm4-macros 0.11.0, rsa 0.9.10, rustc-hash 2.1.2, rustix 1.1.4, rustversion 1.0.22, semver 1.0.28, serde 1.0.228, serde_core 1.0.228, serde_derive 1.0.228, serde_json 1.0.150, serde_path_to_error 0.1.20, serde_repr 0.1.20, syn 2.0.118, system-deps 7.0.8, thiserror 1.0.69, thiserror 2.0.18, thiserror-impl 1.0.69, thiserror-impl 2.0.18, unicode-ident 1.0.24, wasi 0.11.1+wasi-snapshot-preview1, wasip2 1.0.4+wasi-0.2.12, wit-bindgen 0.57.1, zmij 1.0.21, zvariant_utils 3.4.0 ---------------------------------------------------------------------------- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated @@ -1125,7 +1148,7 @@ DEALINGS IN THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (COPYING) applies to: aho-corasick 1.1.4, memchr 2.8.1, same-file 1.0.6, walkdir 2.5.0, winapi-util 0.1.11 +The following license (COPYING) applies to: aho-corasick 1.1.4, memchr 2.8.2, same-file 1.0.6, walkdir 2.5.0, winapi-util 0.1.11 ---------------------------------------------------------------------------- This project is dual-licensed under the Unlicense and MIT licenses. @@ -1133,7 +1156,7 @@ You may use this code under the terms of either license. ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: aho-corasick 1.1.4, memchr 2.8.1, walkdir 2.5.0 +The following license (LICENSE-MIT) applies to: aho-corasick 1.1.4, memchr 2.8.2, walkdir 2.5.0 ---------------------------------------------------------------------------- The MIT License (MIT) @@ -1159,7 +1182,7 @@ THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (UNLICENSE) applies to: aho-corasick 1.1.4, memchr 2.8.1, same-file 1.0.6, walkdir 2.5.0, winapi-util 0.1.11 +The following license (UNLICENSE) applies to: aho-corasick 1.1.4, ksni 0.3.5, memchr 2.8.2, same-file 1.0.6, walkdir 2.5.0, winapi-util 0.1.11 ---------------------------------------------------------------------------- This is free and unencumbered software released into the public domain. @@ -1648,7 +1671,7 @@ SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-APACHE) applies to: annotate-snippets 0.11.5, anstream 1.0.0, anstyle 1.0.14, anstyle-parse 1.0.0, anstyle-query 1.1.5, anstyle-wincon 3.0.11, clap 4.6.1, clap_builder 4.6.0, clap_lex 1.1.0, colorchoice 1.0.5, crc32fast 1.5.0, env_filter 0.1.4, fallible-iterator 0.3.0, fallible-streaming-iterator 0.1.9, hex 0.4.3, is_terminal_polyfill 1.70.2, jni-sys 0.3.1, jni-sys 0.4.1, once_cell_polyfill 1.70.2, quick-error 1.2.3, serde_spanned 1.1.1, toml 0.9.12+spec-1.1.0, toml 1.1.2+spec-1.1.0, toml_datetime 0.7.5+spec-1.1.0, toml_datetime 1.1.1+spec-1.1.0, toml_edit 0.25.12+spec-1.1.0, toml_parser 1.1.2+spec-1.1.0, toml_writer 1.1.1+spec-1.1.0 +The following license (LICENSE-APACHE) applies to: annotate-snippets 0.11.5, anstream 1.0.0, anstyle 1.0.14, anstyle-parse 1.0.0, anstyle-query 1.1.5, anstyle-wincon 3.0.11, clap 4.6.1, clap_builder 4.6.0, clap_lex 1.1.0, colorchoice 1.0.5, crc32fast 1.5.0, env_filter 0.1.4, fallible-iterator 0.3.0, fallible-streaming-iterator 0.1.9, hex 0.4.3, is_terminal_polyfill 1.70.2, jni-sys 0.3.1, jni-sys 0.4.1, once_cell_polyfill 1.70.2, quick-error 1.2.3, serde_spanned 0.6.9, serde_spanned 1.1.1, toml 0.8.23, toml 0.9.12+spec-1.1.0, toml 1.1.2+spec-1.1.0, toml_datetime 0.6.11, toml_datetime 0.7.5+spec-1.1.0, toml_datetime 1.1.1+spec-1.1.0, toml_edit 0.22.27, toml_edit 0.25.12+spec-1.1.0, toml_parser 1.1.2+spec-1.1.0, toml_write 0.1.2, toml_writer 1.1.1+spec-1.1.0, winapi 0.3.9 ---------------------------------------------------------------------------- Apache License Version 2.0, January 2004 @@ -1854,7 +1877,7 @@ Apache License ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: annotate-snippets 0.11.5, anstream 1.0.0, anstyle 1.0.14, anstyle-parse 1.0.0, anstyle-query 1.1.5, anstyle-wincon 3.0.11, clap 4.6.1, clap_builder 4.6.0, clap_lex 1.1.0, colorchoice 1.0.5, env_filter 0.1.4, is_terminal_polyfill 1.70.2, once_cell_polyfill 1.70.2, serde_spanned 1.1.1, toml 0.9.12+spec-1.1.0, toml 1.1.2+spec-1.1.0, toml_datetime 0.7.5+spec-1.1.0, toml_datetime 1.1.1+spec-1.1.0, toml_edit 0.25.12+spec-1.1.0, toml_parser 1.1.2+spec-1.1.0, toml_writer 1.1.1+spec-1.1.0 +The following license (LICENSE-MIT) applies to: annotate-snippets 0.11.5, anstream 1.0.0, anstyle 1.0.14, anstyle-parse 1.0.0, anstyle-query 1.1.5, anstyle-wincon 3.0.11, clap 4.6.1, clap_builder 4.6.0, clap_lex 1.1.0, colorchoice 1.0.5, env_filter 0.1.4, is_terminal_polyfill 1.70.2, once_cell_polyfill 1.70.2, serde_spanned 0.6.9, serde_spanned 1.1.1, toml 0.8.23, toml 0.9.12+spec-1.1.0, toml 1.1.2+spec-1.1.0, toml_datetime 0.6.11, toml_datetime 0.7.5+spec-1.1.0, toml_datetime 1.1.1+spec-1.1.0, toml_edit 0.22.27, toml_edit 0.25.12+spec-1.1.0, toml_parser 1.1.2+spec-1.1.0, toml_write 0.1.2, toml_writer 1.1.1+spec-1.1.0 ---------------------------------------------------------------------------- Copyright (c) Individual contributors @@ -1878,7 +1901,7 @@ SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-APACHE) applies to: anyhow 1.0.102, async-trait 0.1.89, fastbloom 0.14.1, itoa 1.0.18, libc 0.2.186, num_enum 0.7.6, num_enum_derive 0.7.6, paste 1.0.15, prettyplease 0.2.37, proc-macro2 1.0.106, quote 1.0.45, rustc-hash 2.1.2, rustversion 1.0.22, ryu 1.0.23, semver 1.0.28, serde 1.0.228, serde_core 1.0.228, serde_derive 1.0.228, serde_json 1.0.150, serde_path_to_error 0.1.20, serde_repr 0.1.20, serde_urlencoded 0.7.1, syn 2.0.117, thiserror 1.0.69, thiserror 2.0.18, thiserror-impl 1.0.69, thiserror-impl 2.0.18, unicode-ident 1.0.24, utf8parse 0.2.2 +The following license (LICENSE-APACHE) applies to: anyhow 1.0.103, async-trait 0.1.89, fastbloom 0.14.1, itoa 1.0.18, libc 0.2.186, num_enum 0.7.6, num_enum_derive 0.7.6, paste 1.0.15, pastey 0.2.3, prettyplease 0.2.37, proc-macro2 1.0.106, quote 1.0.46, relm4 0.11.0, relm4-css 0.11.0, relm4-macros 0.11.0, rustc-hash 2.1.2, rustversion 1.0.22, ryu 1.0.23, semver 1.0.28, serde 1.0.228, serde_core 1.0.228, serde_derive 1.0.228, serde_json 1.0.150, serde_path_to_error 0.1.20, serde_repr 0.1.20, serde_urlencoded 0.7.1, syn 2.0.118, thiserror 1.0.69, thiserror 2.0.18, thiserror-impl 1.0.69, thiserror-impl 2.0.18, unicode-ident 1.0.24, utf8parse 0.2.2 ---------------------------------------------------------------------------- Apache License Version 2.0, January 2004 @@ -2059,7 +2082,135 @@ END OF TERMS AND CONDITIONS ---------------------------------------------------------------------------- -The following license (LICENSE-APACHE) applies to: arc-swap 1.9.1, asn1-rs 0.6.2, asn1-rs-derive 0.5.1, async-channel 2.5.0, async-recursion 1.1.1, atomic-waker 1.1.2, autocfg 1.5.1, base64 0.22.1, bitflags 2.13.0, bumpalo 3.20.3, cast 0.3.0, cc 1.2.63, cexpr 0.6.0, cfg-if 1.0.4, cmake 0.1.58, concurrent-queue 2.5.0, core-foundation 0.10.1, core-foundation-sys 0.8.7, criterion 0.5.1, criterion-plot 0.5.0, crossbeam-utils 0.8.21, curve25519-dalek-derive 0.1.1, der-parser 9.0.0, displaydoc 0.2.6, either 1.16.0, equivalent 1.0.2, errno 0.3.14, event-listener 5.4.1, event-listener-strategy 0.5.4, fastrand 2.4.1, find-msvc-tools 0.1.9, fixedbitset 0.5.7, flate2 1.1.9, fnv 1.0.7, form_urlencoded 1.2.2, fs-err 3.3.0, futures-lite 2.6.1, glob 0.3.3, hashbrown 0.15.5, hashbrown 0.16.1, hashbrown 0.17.1, heck 0.5.0, hermit-abi 0.5.2, httparse 1.10.1, id-arena 2.3.0, idna 1.1.0, idna_adapter 1.2.2, indexmap 2.14.0, itertools 0.10.5, itertools 0.13.0, jni 0.21.1, jobserver 0.1.34, js-sys 0.3.100, khronos-egl 6.0.0, lazy_static 1.5.0, leb128fmt 0.1.0, linux-raw-sys 0.12.1, lock_api 0.4.14, log 0.4.32, mime 0.3.17, nasm-rs 0.3.2, num-bigint 0.4.6, num-bigint-dig 0.8.6, num-integer 0.1.46, num-iter 0.1.45, num-traits 0.2.19, num_cpus 1.17.0, oid-registry 0.7.1, once_cell 1.21.4, openssl-probe 0.2.1, opus 0.3.1, ordered-stream 0.2.0, parking 2.2.1, parking_lot 0.12.5, parking_lot_core 0.9.12, percent-encoding 2.3.2, pkg-config 0.3.33, proptest 1.11.0, regex 1.12.3, regex-automata 0.4.14, regex-syntax 0.8.10, roxmltree 0.21.1, rsa 0.9.10, rustc_version 0.4.1, rusticata-macros 4.1.0, rustix 1.1.4, rustls 0.23.40, rustls-native-certs 0.8.4, rustls-pemfile 2.2.0, rusty-fork 0.3.1, scopeguard 1.2.0, security-framework 3.7.0, security-framework-sys 2.17.0, signal-hook-registry 1.4.8, smallvec 1.15.1, socket2 0.6.4, stable_deref_trait 1.2.1, system-deps 7.0.8, tempfile 3.27.0, thread_local 1.1.9, tinytemplate 1.2.1, unicode-segmentation 1.13.3, unicode-width 0.2.2, unicode-xid 0.2.6, url 2.5.8, uuid 1.23.2, vcpkg 0.2.15, version_check 0.9.5, wait-timeout 0.2.1, wasi 0.11.1+wasi-snapshot-preview1, wasip2 1.0.3+wasi-0.2.9, wasm-bindgen 0.2.123, wasm-bindgen-macro 0.2.123, wasm-bindgen-macro-support 0.2.123, wasm-bindgen-shared 0.2.123, wit-bindgen 0.51.0, wit-bindgen 0.57.1, wit-bindgen-core 0.51.0, wit-bindgen-rust 0.51.0, wit-bindgen-rust-macro 0.51.0, x509-parser 0.16.0 +The following license (LICENSE-APACHE) applies to: ash 0.38.0+1.3.281 +---------------------------------------------------------------------------- +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must cause any modified files to carry prominent notices stating that You changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +Copyright 2016 Maik Klein + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +---------------------------------------------------------------------------- +The following license (LICENSE-MIT) applies to: ash 0.38.0+1.3.281 +---------------------------------------------------------------------------- +Copyright (c) 2016 ASH + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +---------------------------------------------------------------------------- +The following license (LICENSE) applies to: ashpd 0.13.12 +---------------------------------------------------------------------------- +MIT License + +Copyright (c) 2020 Bilal Elmoussaoui + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +---------------------------------------------------------------------------- +The following license (LICENSE-APACHE) applies to: asn1-rs 0.6.2, asn1-rs-derive 0.5.1, async-channel 2.5.0, async-executor 1.14.0, async-io 2.6.0, async-lock 3.4.2, async-process 2.5.0, async-recursion 1.1.1, async-signal 0.2.14, async-task 4.7.1, atomic-waker 1.1.2, autocfg 1.5.1, base64 0.22.1, bitflags 2.13.0, blocking 1.6.2, bumpalo 3.20.3, cast 0.3.0, cc 1.2.65, cexpr 0.6.0, cfg-if 1.0.4, cmake 0.1.58, concurrent-queue 2.5.0, core-foundation 0.10.1, core-foundation-sys 0.8.7, criterion 0.5.1, criterion-plot 0.5.0, crossbeam-utils 0.8.21, curve25519-dalek-derive 0.1.1, der-parser 9.0.0, displaydoc 0.2.6, either 1.16.0, equivalent 1.0.2, errno 0.3.14, event-listener 5.4.1, event-listener-strategy 0.5.4, fastrand 2.4.1, filetime 0.2.29, find-msvc-tools 0.1.9, fixedbitset 0.5.7, flate2 1.1.9, fnv 1.0.7, form_urlencoded 1.2.2, fs-err 3.3.0, futures-lite 2.6.1, glob 0.3.3, hashbrown 0.16.1, hashbrown 0.17.1, heck 0.5.0, hermit-abi 0.5.2, httparse 1.10.1, idna 1.1.0, idna_adapter 1.2.2, indexmap 2.14.0, itertools 0.10.5, itertools 0.13.0, jni 0.21.1, jobserver 0.1.34, js-sys 0.3.103, khronos-egl 6.0.0, lazy_static 1.5.0, linux-raw-sys 0.12.1, lock_api 0.4.14, log 0.4.33, mime 0.3.17, nasm-rs 0.3.2, num-bigint 0.4.6, num-bigint-dig 0.8.6, num-derive 0.4.2, num-integer 0.1.46, num-iter 0.1.45, num-traits 0.2.19, num_cpus 1.17.0, oid-registry 0.7.1, once_cell 1.21.4, openssl-probe 0.2.1, opus 0.3.1, ordered-stream 0.2.0, parking 2.2.1, parking_lot 0.12.5, parking_lot_core 0.9.12, percent-encoding 2.3.2, piper 0.2.5, pkg-config 0.3.33, polling 3.11.0, proptest 1.11.0, regex 1.12.4, regex-automata 0.4.14, regex-syntax 0.8.11, roxmltree 0.21.1, rsa 0.9.10, rustc_version 0.4.1, rusticata-macros 4.1.0, rustix 1.1.4, rustls 0.23.41, rustls-native-certs 0.8.4, rusty-fork 0.3.1, scopeguard 1.2.0, security-framework 3.7.0, security-framework-sys 2.17.0, signal-hook-registry 1.4.8, smallvec 1.15.2, socket2 0.6.4, stable_deref_trait 1.2.1, system-deps 7.0.8, tar 0.4.46, tempfile 3.27.0, thread_local 1.1.9, tinytemplate 1.2.1, unicode-segmentation 1.13.3, unicode-width 0.2.2, url 2.5.8, uuid 1.23.4, vcpkg 0.2.15, version_check 0.9.5, wait-timeout 0.2.1, wasi 0.11.1+wasi-snapshot-preview1, wasip2 1.0.4+wasi-0.2.12, wasm-bindgen 0.2.126, wasm-bindgen-macro 0.2.126, wasm-bindgen-macro-support 0.2.126, wasm-bindgen-shared 0.2.126, wit-bindgen 0.57.1, x509-parser 0.16.0, xattr 1.6.1 ---------------------------------------------------------------------------- Apache License Version 2.0, January 2004 @@ -2264,164 +2415,6 @@ See the License for the specific language governing permissions and limitations under the License. ----------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: arc-swap 1.9.1 ----------------------------------------------------------------------------- -Copyright (c) 2017 arc-swap developers - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------------- -The following license (LICENSE-APACHE) applies to: ash 0.38.0+1.3.281 ----------------------------------------------------------------------------- -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and -You must cause any modified files to carry prominent notices stating that You changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - -You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -Copyright 2016 Maik Klein - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - - ----------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: ash 0.38.0+1.3.281 ----------------------------------------------------------------------------- -Copyright (c) 2016 ASH - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - ----------------------------------------------------------------------------- -The following license (LICENSE) applies to: ashpd 0.13.11 ----------------------------------------------------------------------------- -MIT License - -Copyright (c) 2020 Bilal Elmoussaoui - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - ---------------------------------------------------------------------------- The following license (LICENSE-MIT) applies to: asn1-rs 0.6.2, asn1-rs-derive 0.5.1, der-parser 9.0.0, oid-registry 0.7.1, rusticata-macros 4.1.0, x509-parser 0.16.0 ---------------------------------------------------------------------------- @@ -3364,7 +3357,7 @@ DEALINGS IN THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE) applies to: axum-server 0.7.3 +The following license (LICENSE) applies to: axum-server 0.8.0 ---------------------------------------------------------------------------- Copyright 2021 Axum Server Contributors @@ -3715,7 +3708,7 @@ DEALINGS IN THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: bitflags 2.13.0, glob 0.3.3, log 0.4.32, num-bigint 0.4.6, num-bigint-dig 0.8.6, num-integer 0.1.46, num-iter 0.1.45, num-traits 0.2.19, regex 1.12.3, regex-automata 0.4.14, regex-syntax 0.8.10 +The following license (LICENSE-MIT) applies to: bitflags 2.13.0, glob 0.3.3, log 0.4.33, num-bigint 0.4.6, num-bigint-dig 0.8.6, num-derive 0.4.2, num-integer 0.1.46, num-iter 0.1.45, num-traits 0.2.19, regex 1.12.4, regex-automata 0.4.14, regex-syntax 0.8.11 ---------------------------------------------------------------------------- Copyright (c) 2014 The Rust Project Developers @@ -3901,7 +3894,7 @@ Permission is granted to anyone to use this software for any purpose, including ---------------------------------------------------------------------------- -The following license (LICENSE) applies to: bytes 1.11.1 +The following license (LICENSE) applies to: bytes 1.12.0 ---------------------------------------------------------------------------- Copyright (c) 2018 Carl Lerche @@ -4033,7 +4026,7 @@ DEALINGS IN THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE) applies to: cbindgen 0.29.3 +The following license (LICENSE) applies to: cbindgen 0.29.4 ---------------------------------------------------------------------------- Mozilla Public License Version 2.0 ================================== @@ -4411,7 +4404,7 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: cc 1.2.63, cfg-if 1.0.4, cmake 0.1.58, find-msvc-tools 0.1.9, id-arena 2.3.0, jobserver 0.1.34, js-sys 0.3.100, openssl-probe 0.2.1, pkg-config 0.3.33, socket2 0.6.4, wait-timeout 0.2.1, wasm-bindgen 0.2.123, wasm-bindgen-macro 0.2.123, wasm-bindgen-macro-support 0.2.123, wasm-bindgen-shared 0.2.123 +The following license (LICENSE-MIT) applies to: cc 1.2.65, cfg-if 1.0.4, cmake 0.1.58, filetime 0.2.29, find-msvc-tools 0.1.9, jobserver 0.1.34, js-sys 0.3.103, openssl-probe 0.2.1, pkg-config 0.3.33, socket2 0.6.4, wait-timeout 0.2.1, wasm-bindgen 0.2.126, wasm-bindgen-macro 0.2.126, wasm-bindgen-macro-support 0.2.126, wasm-bindgen-shared 0.2.126 ---------------------------------------------------------------------------- Copyright (c) 2014 Alex Crichton @@ -4973,7 +4966,7 @@ The `cfg_aliases!` macro uses a lot of the code from [`tectonic_cfg_support::tar ---------------------------------------------------------------------------- -The following license (LICENSE) applies to: ciborium 0.2.2, ciborium-io 0.2.2, ciborium-ll 0.2.2, clang-sys 1.8.1, flume 0.11.1, lru-slab 0.1.2, quinn 0.11.9, quinn-proto 0.11.14, quinn-udp 0.5.14, rpkg-config 0.1.2, rustls-platform-verifier 0.6.2, tinyvec 1.11.0, unarray 0.1.4, ureq 2.12.1, utf8_iter 1.0.4, utoipa 5.5.0, utoipa-axum 0.2.0, utoipa-gen 5.5.0, utoipa-scalar 0.3.0, zeroize 1.8.2 +The following license (LICENSE) applies to: ciborium 0.2.2, ciborium-io 0.2.2, ciborium-ll 0.2.2, clang-sys 1.8.1, flume 0.12.0, fragile 2.1.0, lru-slab 0.1.2, quinn 0.11.11, quinn-proto 0.11.15, quinn-udp 0.5.14, rpkg-config 0.1.2, rustls-platform-verifier 0.6.2, tinyvec 1.11.0, unarray 0.1.4, ureq 2.12.1, utf8_iter 1.0.4, utoipa 5.5.0, utoipa-axum 0.2.0, utoipa-gen 5.5.0, utoipa-scalar 0.3.0, zeroize 1.9.0 ---------------------------------------------------------------------------- Apache License Version 2.0, January 2004 @@ -6514,7 +6507,7 @@ SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-APACHE) applies to: field-offset 0.3.6, half 2.7.1, miniz_oxide 0.8.9, num-conv 0.2.2, pin-project-lite 0.2.17, raw-window-handle 0.6.2, sync_wrapper 1.0.2, time 0.3.47, time-core 0.1.8, time-macros 0.2.27, widestring 1.2.1 +The following license (LICENSE-APACHE) applies to: field-offset 0.3.6, half 2.7.1, miniz_oxide 0.8.9, num-conv 0.2.2, pin-project-lite 0.2.17, raw-window-handle 0.6.2, sync_wrapper 1.0.2, time 0.3.51, time-core 0.1.9, time-macros 0.2.30, widestring 1.2.1 ---------------------------------------------------------------------------- Apache License Version 2.0, January 2004 @@ -6811,7 +6804,7 @@ DEALINGS IN THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE) applies to: foldhash 0.1.5, foldhash 0.2.0 +The following license (LICENSE) applies to: foldhash 0.2.0 ---------------------------------------------------------------------------- Copyright (c) 2024 Orson Peters @@ -7155,7 +7148,7 @@ SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-APACHE) applies to: getrandom 0.2.17, getrandom 0.3.4, getrandom 0.4.2, rand_chacha 0.3.1 +The following license (LICENSE-APACHE) applies to: getrandom 0.2.17, getrandom 0.3.4, getrandom 0.4.3, rand_chacha 0.3.1 ---------------------------------------------------------------------------- Apache License Version 2.0, January 2004 @@ -7423,7 +7416,7 @@ DEALINGS IN THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: getrandom 0.4.2 +The following license (LICENSE-MIT) applies to: getrandom 0.4.3 ---------------------------------------------------------------------------- Copyright (c) 2018-2026 The rust-random Project Developers Copyright (c) 2014 The Rust Project Developers @@ -7484,7 +7477,32 @@ DEALINGS IN THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE) applies to: h2 0.4.14 +The following license (LICENSE) applies to: Granite subset (vendored, crates/pyrowave-sys) +---------------------------------------------------------------------------- +Copyright (c) 2017-2026 Hans-Kristian Arntzen + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +---------------------------------------------------------------------------- +The following license (LICENSE) applies to: h2 0.4.15 ---------------------------------------------------------------------------- Copyright (c) 2017 h2 authors @@ -7538,7 +7556,7 @@ SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: hashbrown 0.15.5, hashbrown 0.16.1, hashbrown 0.17.1 +The following license (LICENSE-MIT) applies to: hashbrown 0.16.1, hashbrown 0.17.1 ---------------------------------------------------------------------------- Copyright (c) 2016 Amanieu d'Antras @@ -7599,7 +7617,7 @@ DEALINGS IN THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: heck 0.5.0, unicode-segmentation 1.13.3, unicode-width 0.2.2, unicode-xid 0.2.6 +The following license (LICENSE-MIT) applies to: heck 0.5.0, unicode-segmentation 1.13.3, unicode-width 0.2.2 ---------------------------------------------------------------------------- Copyright (c) 2015 The Rust Project Developers @@ -8394,7 +8412,7 @@ DEALINGS IN THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-BSD) applies to: if-addrs 0.15.0 +The following license (LICENSE-BSD) applies to: if-addrs 0.13.4, if-addrs 0.15.0 ---------------------------------------------------------------------------- Copyright 2018 MaidSafe.net limited. Copyright 2020 messense @@ -8411,7 +8429,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: if-addrs 0.15.0 +The following license (LICENSE-MIT) applies to: if-addrs 0.13.4, if-addrs 0.15.0 ---------------------------------------------------------------------------- Copyright 2018 MaidSafe.net limited. Copyright 2020 messense @@ -8986,7 +9004,7 @@ at your option. ---------------------------------------------------------------------------- -The following license (LICENSE-Apache-2.0_WITH_LLVM-exception) applies to: linux-raw-sys 0.12.1, rustix 1.1.4, target-lexicon 0.13.5, wasi 0.11.1+wasi-snapshot-preview1, wasip2 1.0.3+wasi-0.2.9, wit-bindgen 0.51.0, wit-bindgen 0.57.1, wit-bindgen-core 0.51.0, wit-bindgen-rust 0.51.0, wit-bindgen-rust-macro 0.51.0 +The following license (LICENSE-Apache-2.0_WITH_LLVM-exception) applies to: linux-raw-sys 0.12.1, rustix 1.1.4, target-lexicon 0.13.5, wasi 0.11.1+wasi-snapshot-preview1, wasip2 1.0.4+wasi-0.2.12, wit-bindgen 0.57.1 ---------------------------------------------------------------------------- Apache License Version 2.0, January 2004 @@ -9274,6 +9292,224 @@ the following restrictions: 3. This notice may not be removed or altered from any source distribution. +---------------------------------------------------------------------------- +The following license (LICENSE-APACHE2.0) applies to: mac_address 1.1.8 +---------------------------------------------------------------------------- +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 Wesley Norris + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +---------------------------------------------------------------------------- +The following license (LICENSE-MIT) applies to: mac_address 1.1.8 +---------------------------------------------------------------------------- +Copyright © 2018 Wesley Norris + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ---------------------------------------------------------------------------- The following license (LICENSE) applies to: matchers 0.2.0 ---------------------------------------------------------------------------- @@ -9359,7 +9595,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------- -The following license (LICENSE-APACHE) applies to: mdns-sd 0.20.0 +The following license (LICENSE-APACHE) applies to: mdns-sd 0.20.1 ---------------------------------------------------------------------------- Apache License Version 2.0, January 2004 @@ -9565,7 +9801,7 @@ limitations under the License. ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: mdns-sd 0.20.0 +The following license (LICENSE-MIT) applies to: mdns-sd 0.20.1 ---------------------------------------------------------------------------- MIT License @@ -9591,7 +9827,7 @@ SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-APACHE) applies to: memmap2 0.9.10 +The following license (LICENSE-APACHE) applies to: memmap2 0.9.11 ---------------------------------------------------------------------------- Apache License Version 2.0, January 2004 @@ -9797,7 +10033,7 @@ limitations under the License. ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: memmap2 0.9.10 +The following license (LICENSE-MIT) applies to: memmap2 0.9.11 ---------------------------------------------------------------------------- Copyright (c) 2020 Yevhenii Reizner Copyright (c) 2015 Dan Burkert @@ -10020,7 +10256,7 @@ THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE) applies to: nix 0.30.1 +The following license (LICENSE) applies to: nix 0.29.0, nix 0.30.1 ---------------------------------------------------------------------------- The MIT License (MIT) @@ -10859,6 +11095,31 @@ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +---------------------------------------------------------------------------- +The following license (LICENSE) applies to: pyrowave (vendored, crates/pyrowave-sys) +---------------------------------------------------------------------------- +Copyright (c) 2025 Hans-Kristian Arntzen + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ---------------------------------------------------------------------------- The following license (LICENSE-MIT) applies to: quick-error 1.2.3 ---------------------------------------------------------------------------- @@ -10912,7 +11173,7 @@ THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: quinn 0.11.9, quinn-proto 0.11.14, quinn-udp 0.5.14 +The following license (LICENSE-MIT) applies to: quinn 0.11.11, quinn-proto 0.11.15, quinn-udp 0.5.14 ---------------------------------------------------------------------------- Copyright (c) 2018 The quinn Developers @@ -12160,7 +12421,7 @@ at your option. ---------------------------------------------------------------------------- -The following license (LICENSE-ISC) applies to: rustls 0.23.40, rustls-native-certs 0.8.4, rustls-pemfile 2.2.0 +The following license (LICENSE-ISC) applies to: rustls 0.23.41, rustls-native-certs 0.8.4 ---------------------------------------------------------------------------- ISC License (ISC) Copyright (c) 2016, Joseph Birr-Pixton @@ -12180,7 +12441,7 @@ THIS SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: rustls 0.23.40, rustls-native-certs 0.8.4, rustls-pemfile 2.2.0 +The following license (LICENSE-MIT) applies to: rustls 0.23.41, rustls-native-certs 0.8.4 ---------------------------------------------------------------------------- Copyright (c) 2016 Joseph Birr-Pixton @@ -12223,20 +12484,6 @@ respectively. You may use this software under the terms of any of these licenses, at your option. ----------------------------------------------------------------------------- -The following license (LICENSE) applies to: rustls-pemfile 2.2.0 ----------------------------------------------------------------------------- -rustls-pemfile is distributed under the following three licenses: - -- Apache License version 2.0. -- MIT license. -- ISC license. - -These are included as LICENSE-APACHE, LICENSE-MIT and LICENSE-ISC -respectively. You may use this software under the terms of any -of these licenses, at your option. - - ---------------------------------------------------------------------------- The following license (LICENSE-APACHE) applies to: rustls-pki-types 1.14.1 ---------------------------------------------------------------------------- @@ -13018,7 +13265,7 @@ DEALINGS IN THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: smallvec 1.15.1 +The following license (LICENSE-MIT) applies to: smallvec 1.15.2 ---------------------------------------------------------------------------- Copyright (c) 2018 The Servo Project Developers @@ -13048,7 +13295,7 @@ DEALINGS IN THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE) applies to: socket-pktinfo 0.3.2 +The following license (LICENSE) applies to: socket-pktinfo 0.4.0 ---------------------------------------------------------------------------- MIT License @@ -13256,7 +13503,37 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: tempfile 3.27.0 +The following license (LICENSE-MIT) applies to: tar 0.4.46 +---------------------------------------------------------------------------- +Copyright (c) The tar-rs Project Contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +---------------------------------------------------------------------------- +The following license (LICENSE-MIT) applies to: tempfile 3.27.0, xattr 1.6.1 ---------------------------------------------------------------------------- Copyright (c) 2015 Steven Allen @@ -13286,7 +13563,7 @@ DEALINGS IN THE SOFTWARE. ---------------------------------------------------------------------------- -The following license (LICENSE-MIT) applies to: time 0.3.47, time-core 0.1.8, time-macros 0.2.27 +The following license (LICENSE-MIT) applies to: time 0.3.51, time-core 0.1.9, time-macros 0.2.30 ---------------------------------------------------------------------------- Copyright (c) Jacob Pratt et al. @@ -14367,7 +14644,7 @@ authorization of the copyright holder. ---------------------------------------------------------------------------- -The following license (COPYRIGHT) applies to: unicode-segmentation 1.13.3, unicode-width 0.2.2, unicode-xid 0.2.6 +The following license (COPYRIGHT) applies to: unicode-segmentation 1.13.3, unicode-width 0.2.2 ---------------------------------------------------------------------------- Licensed under the Apache License, Version 2.0 String { + use punktfunk_core::reject::RejectReason as R; + match reason { + R::Denied => "The host declined this device's request.".into(), + R::ApprovalTimeout => { + "Nobody approved the request on the host in time — approve this device in the \ + host's console or web UI, then request access again." + .into() + } + R::Superseded => { + "A newer request from this device replaced this one — approve the latest request \ + on the host." + .into() + } + R::IdentityRequired => { + "The host requires pairing — pair this device (PIN or request access) first.".into() + } + R::PairingNotArmed => { + "Pairing isn't armed on the host — arm it on the host's Pairing page, then try \ + again." + .into() + } + R::PairingBoundToOtherDevice => { + "The host's pairing window is armed for a different device — arm it for this one." + .into() + } + R::PairingRateLimited => { + "Too many pairing attempts — wait a couple of seconds and try again.".into() + } + R::WireVersionMismatch => { + "Client and host versions don't match — update both to the same release.".into() + } + R::Busy => "The host is busy with another session.".into(), + } +} + +/// User-facing sentence for a failed PIN pairing ceremony ([`pair_with_host`]) — distinguishes +/// a wrong PIN (the SPAKE2 proof failed) from an unreachable host and from the host's typed +/// rejections, so a dead network path or a disarmed host is never reported as a bad PIN. +pub fn pair_error_message(err: &punktfunk_core::PunktfunkError) -> String { + use punktfunk_core::PunktfunkError as E; + match err { + E::Crypto => "Wrong PIN — check the PIN on the host's Pairing page and try again.".into(), + E::Rejected(reason) => connect_reject_message(*reason), + E::Timeout => "The host didn't answer. Is it running and reachable?".into(), + E::Io(_) => { + "Couldn't reach the host — check that this device and the host are on the same \ + network (no VPN on this device, no guest-Wi-Fi / AP isolation)." + .into() + } + other => format!("Pairing failed: {other:?}"), + } +} + /// Probe several hosts for reachability in parallel — one thread each, so the wall-clock cost is /// ~one `timeout`, not the sum. Each element of the returned vec corresponds by index to /// `targets`. Wraps the single-host [`NativeClient::probe`] (a bounded, trust-agnostic, @@ -515,6 +574,10 @@ impl Settings { "h264" | "avc" => punktfunk_core::quic::CODEC_H264, "hevc" | "h265" => punktfunk_core::quic::CODEC_HEVC, "av1" => punktfunk_core::quic::CODEC_AV1, + // The wired-LAN wavelet codec: preference-only by design (resolve_codec never + // auto-picks it), and harmless on a build/device that doesn't advertise the + // bit — the ladder falls back to HEVC. + "pyrowave" => punktfunk_core::quic::CODEC_PYROWAVE, _ => 0, } } @@ -631,6 +694,9 @@ mod tests { assert!(s.mic_enabled); assert_eq!(s.decoder, "hardware"); assert_eq!(s.preferred_codec(), punktfunk_core::quic::CODEC_AV1); + let mut pw = s.clone(); + pw.codec = "pyrowave".into(); + assert_eq!(pw.preferred_codec(), punktfunk_core::quic::CODEC_PYROWAVE); assert_eq!(s.adapter, "NVIDIA GeForce RTX 4080"); assert!(s.hdr_enabled); // The old shell's `show_hud` lands on `show_stats` (the user's preference survives). diff --git a/crates/pf-console-ui/src/screens/settings.rs b/crates/pf-console-ui/src/screens/settings.rs index fd53729d..e6511882 100644 --- a/crates/pf-console-ui/src/screens/settings.rs +++ b/crates/pf-console-ui/src/screens/settings.rs @@ -65,11 +65,14 @@ const COMPOSITORS: [(&str, &str); 5] = [ ("mutter", "Mutter"), ("gamescope", "gamescope"), ]; -const CODECS: [(&str, &str); 4] = [ +const CODECS: [(&str, &str); 5] = [ ("auto", "Automatic"), ("hevc", "HEVC"), ("h264", "H.264"), ("av1", "AV1"), + // Opt-in wired-LAN low-latency codec (100-400 Mbps class, 8-bit SDR). Only ever + // selected when the host supports it too; anything else falls back to HEVC. + ("pyrowave", "PyroWave (wired LAN)"), ]; const DECODERS: [(&str, &str); 4] = [ ("auto", "Automatic"), diff --git a/crates/punktfunk-core/src/client.rs b/crates/punktfunk-core/src/client.rs index 9f454198..a7dcb212 100644 --- a/crates/punktfunk-core/src/client.rs +++ b/crates/punktfunk-core/src/client.rs @@ -862,7 +862,16 @@ impl NativeClient { .await .map_err(|e| PunktfunkError::Io(std::io::Error::other(e.to_string())))?; let host_fp = observed.lock().unwrap().ok_or(PunktfunkError::Crypto)?; - let outcome = exchange(conn.clone(), host_fp).await; + let outcome = match exchange(conn.clone(), host_fp).await { + // A typed application close from the host (pairing not armed / armed for a + // different device / rate-limited / version mismatch) beats the generic + // transport error the aborted exchange produced — it is the actual answer. + Err(e) => Err(match reject_from_close(&conn) { + Some(r) => PunktfunkError::Rejected(r), + None => e, + }), + ok => ok, + }; // Always tell the host we're done so it never blocks at its read — code 0 on // success, 1 on a refused/aborted ceremony. let code: u32 = if outcome.is_ok() { 0 } else { 1 }; @@ -1355,6 +1364,18 @@ struct WorkerArgs { /// The worker: QUIC handshake, then the input/datagram/control tasks + the blocking /// data-plane pump. +/// The host's stated rejection, if this connection was closed with a typed application code +/// (see [`crate::reject`]) — `None` for local errors, bare/legacy closes (including our own +/// `LocallyClosed`), and transport failures, which keep their original error. +fn reject_from_close(conn: &quinn::Connection) -> Option { + match conn.close_reason()? { + quinn::ConnectionError::ApplicationClosed(ac) => u32::try_from(u64::from(ac.error_code)) + .ok() + .and_then(crate::reject::RejectReason::from_close_code), + _ => None, + } +} + async fn worker_main(args: WorkerArgs) { let WorkerArgs { host, @@ -1417,124 +1438,139 @@ async fn worker_main(args: WorkerArgs) { } })?; let fingerprint = observed.lock().unwrap().unwrap_or([0u8; 32]); - let (mut send, mut recv) = conn - .open_bi() - .await - .map_err(|e| PunktfunkError::Io(std::io::Error::other(e.to_string())))?; + // The rest of the handshake runs in an inner future so a failure can consult + // `conn.close_reason()`: a host that turned us away with a typed application close + // (pairing not armed / denied / approval timeout / version mismatch / busy) surfaces + // as `PunktfunkError::Rejected` instead of the generic transport error the failed + // read produces — the difference between "not accepted" and the actual cause. + let handshake = async { + let (mut send, mut recv) = conn + .open_bi() + .await + .map_err(|e| PunktfunkError::Io(std::io::Error::other(e.to_string())))?; - io::write_msg( - &mut send, - &Hello { - abi_version: crate::WIRE_VERSION, - mode, - compositor, - gamepad, - bitrate_kbps, - // No device name yet: the connect ABI has no name parameter (pairing does). The - // host falls back to a fingerprint-derived label in its pending-approval list. - name: None, - // Library id to launch this session, if the embedder asked for one. - launch: launch.clone(), - // The embedder's decode/present caps (e.g. the Windows client advertises - // VIDEO_CAP_10BIT | VIDEO_CAP_HDR). The host only upgrades to a 10-bit / HDR encode - // when the matching bit is set, so `0` stays an 8-bit BT.709 stream. HOST_TIMING is - // OR'd in unconditionally: every NativeClient build demuxes the 0xCF plane, and the - // bit only asks the host for observability datagrams (never changes the encode). - // PROBE_SEQ likewise: the shared reassembler keeps probe filler in its own window - // (every embedder inherits it), so the host may burst speed tests without consuming - // video frame indexes. - video_caps: video_caps - | crate::quic::VIDEO_CAP_HOST_TIMING - | crate::quic::VIDEO_CAP_PROBE_SEQ, - // Requested surround channel count; the host echoes the resolved value in Welcome. - audio_channels, - // The codecs this client can decode + its soft preference (0 = auto). The host - // resolves the emitted codec from these and reports it in `Welcome::codec`. - video_codecs, - preferred_codec, - // The client display's HDR volume → the host's virtual-display EDID (host apps - // tone-map to the client's real panel). `None` = unknown/SDR. - display_hdr, - } - .encode(), - ) - .await?; - let welcome = Welcome::decode(&io::read_msg(&mut recv).await?)?; - if welcome.compositor != CompositorPref::Auto { - tracing::info!( - compositor = welcome.compositor.as_str(), - "host resolved compositor" - ); - } - if welcome.gamepad != GamepadPref::Auto { - tracing::info!( - gamepad = welcome.gamepad.as_str(), - "host resolved gamepad backend" - ); - } - - // Reserve our data-plane port, then start the host. - let probe = std::net::UdpSocket::bind("0.0.0.0:0")?; - let udp_port = probe.local_addr()?.port(); - drop(probe); - io::write_msg( - &mut send, - &Start { - client_udp_port: udp_port, - } - .encode(), - ) - .await?; - - // Wall-clock skew handshake on the control stream (before the session's control task takes - // it): align our clock to the host's so the embedder can express receive/present instants in - // the host's capture clock (the AU `pts_ns`). 0 ⇒ an old host that didn't answer (shared-clock - // assumption, as before). This is the substrate for glass-to-glass present-time measurement. - let (clock_offset_ns, clock_rtt_ns) = - match crate::quic::clock_sync(&mut send, &mut recv).await { - Some(skew) => { - tracing::info!( - offset_ns = skew.offset_ns, - rtt_us = skew.rtt_ns / 1000, - rounds = skew.rounds, - "clock skew estimated (host-client)" - ); - (skew.offset_ns, Some(skew.rtt_ns)) + io::write_msg( + &mut send, + &Hello { + abi_version: crate::WIRE_VERSION, + mode, + compositor, + gamepad, + bitrate_kbps, + // No device name yet: the connect ABI has no name parameter (pairing does). The + // host falls back to a fingerprint-derived label in its pending-approval list. + name: None, + // Library id to launch this session, if the embedder asked for one. + launch: launch.clone(), + // The embedder's decode/present caps (e.g. the Windows client advertises + // VIDEO_CAP_10BIT | VIDEO_CAP_HDR). The host only upgrades to a 10-bit / HDR encode + // when the matching bit is set, so `0` stays an 8-bit BT.709 stream. HOST_TIMING is + // OR'd in unconditionally: every NativeClient build demuxes the 0xCF plane, and the + // bit only asks the host for observability datagrams (never changes the encode). + // PROBE_SEQ likewise: the shared reassembler keeps probe filler in its own window + // (every embedder inherits it), so the host may burst speed tests without consuming + // video frame indexes. + video_caps: video_caps + | crate::quic::VIDEO_CAP_HOST_TIMING + | crate::quic::VIDEO_CAP_PROBE_SEQ, + // Requested surround channel count; the host echoes the resolved value in Welcome. + audio_channels, + // The codecs this client can decode + its soft preference (0 = auto). The host + // resolves the emitted codec from these and reports it in `Welcome::codec`. + video_codecs, + preferred_codec, + // The client display's HDR volume → the host's virtual-display EDID (host apps + // tone-map to the client's real panel). `None` = unknown/SDR. + display_hdr, } - None => (0, None), - }; + .encode(), + ) + .await?; + let welcome = Welcome::decode(&io::read_msg(&mut recv).await?)?; + if welcome.compositor != CompositorPref::Auto { + tracing::info!( + compositor = welcome.compositor.as_str(), + "host resolved compositor" + ); + } + if welcome.gamepad != GamepadPref::Auto { + tracing::info!( + gamepad = welcome.gamepad.as_str(), + "host resolved gamepad backend" + ); + } - let host_udp = std::net::SocketAddr::new(remote.ip(), welcome.udp_port); - let transport = - UdpTransport::connect(&format!("0.0.0.0:{udp_port}"), &host_udp.to_string())?; - // Hole-punch the host's data port so video traverses a NAT / stateful inter-VLAN firewall - // (control + side planes ride the client-initiated QUIC; the raw video UDP needs the client - // to open the path first). Stops with the session via the shared shutdown flag. - if let Ok(sock) = transport.try_clone_socket() { - crate::transport::spawn_data_punch(sock, shutdown.clone()); + // Reserve our data-plane port, then start the host. + let probe = std::net::UdpSocket::bind("0.0.0.0:0")?; + let udp_port = probe.local_addr()?.port(); + drop(probe); + io::write_msg( + &mut send, + &Start { + client_udp_port: udp_port, + } + .encode(), + ) + .await?; + + // Wall-clock skew handshake on the control stream (before the session's control task takes + // it): align our clock to the host's so the embedder can express receive/present instants in + // the host's capture clock (the AU `pts_ns`). 0 ⇒ an old host that didn't answer (shared-clock + // assumption, as before). This is the substrate for glass-to-glass present-time measurement. + let (clock_offset_ns, clock_rtt_ns) = + match crate::quic::clock_sync(&mut send, &mut recv).await { + Some(skew) => { + tracing::info!( + offset_ns = skew.offset_ns, + rtt_us = skew.rtt_ns / 1000, + rounds = skew.rounds, + "clock skew estimated (host-client)" + ); + (skew.offset_ns, Some(skew.rtt_ns)) + } + None => (0, None), + }; + + let host_udp = std::net::SocketAddr::new(remote.ip(), welcome.udp_port); + let transport = + UdpTransport::connect(&format!("0.0.0.0:{udp_port}"), &host_udp.to_string())?; + // Hole-punch the host's data port so video traverses a NAT / stateful inter-VLAN firewall + // (control + side planes ride the client-initiated QUIC; the raw video UDP needs the client + // to open the path first). Stops with the session via the shared shutdown flag. + if let Ok(sock) = transport.try_clone_socket() { + crate::transport::spawn_data_punch(sock, shutdown.clone()); + } + let session = Session::new(welcome.session_config(Role::Client), Box::new(transport))?; + Ok::<_, PunktfunkError>(( + session, + send, + recv, + Negotiated { + mode: welcome.mode, + compositor: welcome.compositor, + gamepad: welcome.gamepad, + host_fingerprint: fingerprint, + bitrate_kbps: welcome.bitrate_kbps, + clock_offset_ns, + clock_rtt_ns, + bit_depth: welcome.bit_depth, + color: welcome.color, + chroma_format: welcome.chroma_format, + audio_channels: welcome.audio_channels, + codec: welcome.codec, + }, + welcome.host_caps, + )) + }; + match handshake.await { + Ok((session, send, recv, negotiated, host_caps)) => { + Ok((conn, session, send, recv, negotiated, host_caps)) + } + Err(e) => Err(match reject_from_close(&conn) { + Some(r) => PunktfunkError::Rejected(r), + None => e, + }), } - let session = Session::new(welcome.session_config(Role::Client), Box::new(transport))?; - Ok::<_, PunktfunkError>(( - conn, - session, - send, - recv, - Negotiated { - mode: welcome.mode, - compositor: welcome.compositor, - gamepad: welcome.gamepad, - host_fingerprint: fingerprint, - bitrate_kbps: welcome.bitrate_kbps, - clock_offset_ns, - clock_rtt_ns, - bit_depth: welcome.bit_depth, - color: welcome.color, - chroma_format: welcome.chroma_format, - audio_channels: welcome.audio_channels, - codec: welcome.codec, - }, - welcome.host_caps, - )) }; let (conn, mut session, mut ctrl_send, mut ctrl_recv, negotiated, host_caps) = match setup.await @@ -1548,6 +1584,7 @@ async fn worker_main(args: WorkerArgs) { // Copies the pump needs after `negotiated` is handed over to `connect`. let clock_rtt_ns = negotiated.clock_rtt_ns; let resolved_bitrate_kbps = negotiated.bitrate_kbps; + let negotiated_codec = negotiated.codec; // Seed the live offset with the connect-time estimate BEFORE the embedder can observe the // client (ready_tx): clock_offset_now_ns() never reads a pre-handshake 0 on a skewed pair. clock_offset.store(negotiated.clock_offset_ns, Ordering::Relaxed); @@ -1948,7 +1985,11 @@ async fn worker_main(args: WorkerArgs) { // echoes 0 → controller stays permanently off). Fed once per report window with the same // deltas the LossReport uses, plus the window's mean skew-corrected one-way delay and // whether a jump-to-live flush fired. - let mut abr = BitrateController::new(if bitrate_kbps == 0 { + // PyroWave sessions PIN their rate (§4.6): AIMD descent turns wavelets to mush well + // above its floor, and the climb probe's VBV reasoning doesn't apply to hard + // per-frame CBR — controller and capacity probe stay off (0 = permanently off). + let rate_pinned = negotiated_codec == crate::quic::CODEC_PYROWAVE; + let mut abr = BitrateController::new(if bitrate_kbps == 0 && !rate_pinned { resolved_bitrate_kbps } else { 0 @@ -1965,6 +2006,7 @@ async fn worker_main(args: WorkerArgs) { const CAPACITY_PROBE_DELAY: Duration = Duration::from_secs(2); const CAPACITY_PROBE_TIMEOUT: Duration = Duration::from_secs(6); let mut capacity_probe_at: Option = (bitrate_kbps == 0 + && !rate_pinned && resolved_bitrate_kbps > 0 && std::env::var("PUNKTFUNK_ABR_PROBE").map_or(true, |v| v != "0")) .then(|| Instant::now() + CAPACITY_PROBE_DELAY); diff --git a/crates/punktfunk-host/src/punktfunk1.rs b/crates/punktfunk-host/src/punktfunk1.rs index a8312b08..9d10343a 100644 --- a/crates/punktfunk-host/src/punktfunk1.rs +++ b/crates/punktfunk-host/src/punktfunk1.rs @@ -417,8 +417,18 @@ const HANDSHAKE_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(10 /// QUIC application error code the host closes with on a `mode_conflict = reject` admission refusal, /// carrying the human-readable busy reason (live mode + client label) the client surfaces. A distinct -/// code lets a client tell "host busy" apart from a transport failure. -const REJECT_BUSY_CODE: u32 = 0x42; +/// code lets a client tell "host busy" apart from a transport failure. Shared with the clients via +/// `punktfunk_core::reject` so they can decode it (`RejectReason::Busy`). +const REJECT_BUSY_CODE: u32 = punktfunk_core::reject::REJECT_BUSY_CLOSE_CODE; + +/// Make a gate rejection legible to the client BEFORE erroring out of the session task: close +/// with the typed application code (`punktfunk_core::reject`) so the client renders the real +/// reason ("pairing not armed", "denied in the console") — the task's `Err` then only logs. +/// Without this the dropped connection closes with a bare code 0, indistinguishable on the +/// client from transport trouble (the "not accepted" support-thread failure mode). +fn close_rejected(conn: &quinn::Connection, reason: punktfunk_core::reject::RejectReason) { + conn.close(reason.close_code().into(), reason.to_string().as_bytes()); +} /// QUIC application error code a client closes with on a **deliberate quit** (a user "stop", not a /// network drop). The host reads it off the connection's `ApplicationClosed` reason and tears the @@ -456,6 +466,27 @@ fn resolve_bitrate_kbps(requested: u32) -> u32 { } } +/// [`resolve_bitrate_kbps`] with the codec's floor semantics: PyroWave has no useful +/// low-rate regime (wavelet quality collapses far above the H.26x floor — plan §4.6), so +/// an Automatic client (`0`) gets the codec's ~1.6 bpp operating point for the negotiated +/// mode instead of the 20 Mbps H.26x default. The rate is then PINNED for the session: +/// the client's ABR controller stays off for this codec and the host refuses mid-stream +/// retargets. An explicit client rate is honored unchanged (the operator knows the link). +fn resolve_bitrate_kbps_for( + codec: crate::encode::Codec, + requested: u32, + mode: &punktfunk_core::config::Mode, +) -> u32 { + if requested == 0 && codec == crate::encode::Codec::PyroWave { + let bps = + mode.width as u64 * mode.height as u64 * u64::from(mode.refresh_hz.max(1)) * 16 / 10; + return u32::try_from(bps / 1000) + .unwrap_or(MAX_BITRATE_KBPS) + .clamp(MIN_BITRATE_KBPS, MAX_BITRATE_KBPS); + } + resolve_bitrate_kbps(requested) +} + /// Resolve the audio channel count the session will capture + encode from the client's request. /// Normalizes to one of 2 (stereo) / 6 (5.1) / 8 (7.1); anything else (older client, garbage) /// becomes stereo. Both backends can produce the requested count (PipeWire pads/upmixes positions, @@ -631,29 +662,46 @@ async fn serve_session( // The client fingerprint (cert possession is proven by the QUIC handshake) is needed to honor // a fingerprint-bound PIN window (#9): a window the operator armed for a SPECIFIC device must // not be consumable — or burnable — by any other fingerprint. - let client_fp = endpoint::peer_fingerprint(&conn) - .ok_or_else(|| anyhow!("pairing requires the client to present a certificate"))?; + let Some(client_fp) = endpoint::peer_fingerprint(&conn) else { + close_rejected( + &conn, + punktfunk_core::reject::RejectReason::IdentityRequired, + ); + anyhow::bail!("pairing requires the client to present a certificate"); + }; let client_fp_hex = fingerprint_hex(&client_fp); // Resolve the live arming PIN per attempt (so a lapsed window no longer pairs), honoring any // fingerprint binding. let pin = match np.pin_for_attempt(&client_fp_hex) { crate::native_pairing::PinAttempt::Pin(pin) => pin, - crate::native_pairing::PinAttempt::Disarmed => anyhow::bail!( - "pairing not armed (arm it in the console, or start with --allow-pairing)" - ), + crate::native_pairing::PinAttempt::Disarmed => { + close_rejected(&conn, punktfunk_core::reject::RejectReason::PairingNotArmed); + anyhow::bail!( + "pairing not armed (arm it in the console, or start with --allow-pairing)" + ) + } // Armed for a DIFFERENT device — reject without running the ceremony, so this attempt does // NOT consume (burn) the operator's window for the device they actually selected (#9). - crate::native_pairing::PinAttempt::BoundToOther => anyhow::bail!( - "pairing is armed for a different device — this attempt does not consume the window" - ), + crate::native_pairing::PinAttempt::BoundToOther => { + close_rejected( + &conn, + punktfunk_core::reject::RejectReason::PairingBoundToOtherDevice, + ); + anyhow::bail!( + "pairing is armed for a different device — this attempt does not consume the window" + ) + } }; { let mut last = last_pairing.lock().unwrap(); if let Some(t) = *last { - anyhow::ensure!( - t.elapsed() >= PAIRING_COOLDOWN, - "pairing rate-limited — retry shortly" - ); + if t.elapsed() < PAIRING_COOLDOWN { + close_rejected( + &conn, + punktfunk_core::reject::RejectReason::PairingRateLimited, + ); + anyhow::bail!("pairing rate-limited — retry shortly"); + } } *last = Some(std::time::Instant::now()); } @@ -670,12 +718,17 @@ async fn serve_session( // Decode just enough to gate (the Hello carries the device name for the pending label); // the `handshake` future re-decodes for the real session — a few dozen bytes, negligible. let gate_hello = Hello::decode(&first).map_err(|e| anyhow!("Hello decode: {e:?}"))?; - anyhow::ensure!( - gate_hello.abi_version == punktfunk_core::WIRE_VERSION, - "wire version mismatch: client {} host {}", - gate_hello.abi_version, - punktfunk_core::WIRE_VERSION - ); + if gate_hello.abi_version != punktfunk_core::WIRE_VERSION { + close_rejected( + &conn, + punktfunk_core::reject::RejectReason::WireVersionMismatch, + ); + anyhow::bail!( + "wire version mismatch: client {} host {}", + gate_hello.abi_version, + punktfunk_core::WIRE_VERSION + ); + } let fp = endpoint::peer_fingerprint(&conn); let known = fp .as_ref() @@ -685,6 +738,10 @@ async fn serve_session( // An anonymous client (no certificate) has no identity to approve — reject outright // (the PIN ceremony is its way in). Mirrors the prior behavior for anonymous knocks. let Some(fp) = fp else { + close_rejected( + &conn, + punktfunk_core::reject::RejectReason::IdentityRequired, + ); anyhow::bail!( "unpaired anonymous client rejected (this host requires pairing — present a \ client identity and approve it in the console, or run the PIN ceremony)" @@ -719,15 +776,24 @@ async fn serve_session( tracing::info!(name = %label, fingerprint = %fp_hex, "device approved in console — admitting session (no reconnect)"); } - PairingDecision::Denied => anyhow::bail!("pairing request denied in the console"), - PairingDecision::TimedOut => anyhow::bail!( - "pairing request not approved within {PENDING_APPROVAL_WAIT:?} \ - — the device can knock again" - ), - PairingDecision::Superseded => anyhow::bail!( - "parked knock superseded by a newer connection from the same device — \ - only the newest is admitted on approval" - ), + PairingDecision::Denied => { + close_rejected(&conn, punktfunk_core::reject::RejectReason::Denied); + anyhow::bail!("pairing request denied in the console") + } + PairingDecision::TimedOut => { + close_rejected(&conn, punktfunk_core::reject::RejectReason::ApprovalTimeout); + anyhow::bail!( + "pairing request not approved within {PENDING_APPROVAL_WAIT:?} \ + — the device can knock again" + ) + } + PairingDecision::Superseded => { + close_rejected(&conn, punktfunk_core::reject::RejectReason::Superseded); + anyhow::bail!( + "parked knock superseded by a newer connection from the same device — \ + only the newest is admitted on approval" + ) + } } // Re-acquire a session slot for the now-approved session (waits if all slots are busy, // exactly like any freshly accepted client). @@ -747,12 +813,17 @@ async fn serve_session( let data_port = opts.data_port; let handshake = async { let mut hello = Hello::decode(&first).map_err(|e| anyhow!("Hello decode: {e:?}"))?; - anyhow::ensure!( - hello.abi_version == punktfunk_core::WIRE_VERSION, - "wire version mismatch: client {} host {}", - hello.abi_version, - punktfunk_core::WIRE_VERSION - ); + if hello.abi_version != punktfunk_core::WIRE_VERSION { + close_rejected( + &conn, + punktfunk_core::reject::RejectReason::WireVersionMismatch, + ); + anyhow::bail!( + "wire version mismatch: client {} host {}", + hello.abi_version, + punktfunk_core::WIRE_VERSION + ); + } // The pairing gate (require_pairing → paired? else park for delegated approval) ran above, // before this future, so a client reaching here is paired (or the host is `--open`). @@ -891,8 +962,9 @@ async fn serve_session( // needed; the actual pads are created lazily by the input thread). let gamepad = resolve_gamepad(hello.gamepad); - // Resolve the encoder bitrate (client request clamped to a sane range, or host default). - let bitrate_kbps = resolve_bitrate_kbps(hello.bitrate_kbps); + // Resolve the encoder bitrate (client request clamped to a sane range, or a + // codec-aware host default — PyroWave pins ~1.6 bpp for the mode). + let bitrate_kbps = resolve_bitrate_kbps_for(codec, hello.bitrate_kbps, &hello.mode); tracing::info!( requested_kbps = hello.bitrate_kbps, resolved_kbps = bitrate_kbps, @@ -1145,6 +1217,8 @@ async fn serve_session( let adaptive_fec = fec_static_override().is_none(); let fec_target = Arc::new(AtomicU8::new(welcome.fec.fec_percent)); let fec_target_ctl = fec_target.clone(); + // The session's negotiated rate — the pin PyroWave retarget-refusals ack (§4.6). + let session_bitrate_kbps = welcome.bitrate_kbps; tokio::spawn(async move { let mut active = hello.mode; // Host-side switch rate limit (a backstop against a hostile/broken client spamming @@ -1248,7 +1322,20 @@ async fn serve_session( // thread, which rebuilds the encoder in place at the same mode — the fresh // encoder's first frame is an IDR with in-band parameter sets, so the // client's decoder follows without a reconnect. - let resolved = resolve_bitrate_kbps(req.bitrate_kbps); + // PyroWave: the rate is PINNED (§4.6 — quality collapses under rate + // descent; recovery pressure is answered by codec fallback, not AIMD). + // Our client controller is off for this codec; this guards older or + // foreign clients by acking the unchanged session rate. + let resolved = if codec == crate::encode::Codec::PyroWave { + tracing::info!( + requested_kbps = req.bitrate_kbps, + pinned_kbps = session_bitrate_kbps, + "PyroWave session: mid-stream bitrate retarget refused (pinned)" + ); + session_bitrate_kbps + } else { + resolve_bitrate_kbps(req.bitrate_kbps) + }; tracing::info!( requested_kbps = req.bitrate_kbps, resolved_kbps = resolved, @@ -4389,6 +4476,20 @@ fn virtual_stream(ctx: SessionContext) -> Result<()> { None => (first, last), }); } + // All-intra (§4.6): every PyroWave AU is a keyframe, so the NEXT frame already is + // the recovery a request asks for — drop the drained requests instead of running + // the forced-IDR cooldown / RFI / storm machinery (whose frame-size reasoning is + // meaningless when frames are uniform). Defense in depth: the backend's + // request_keyframe/invalidate_ref_frames are no-ops anyway. + if plan.codec == crate::encode::Codec::PyroWave && (want_kf || rfi_range.is_some()) { + tracing::debug!( + want_kf, + ?rfi_range, + "PyroWave session: recovery request ignored (all-intra — next frame is the recovery)" + ); + want_kf = false; + rfi_range = None; + } if !want_kf { if let Some((first, last)) = rfi_range { // Sanity-cap the range before consulting the encoder: RFI can only re-reference @@ -5306,6 +5407,30 @@ mod tests { assert_eq!(dec, snap); } + #[test] + fn pyrowave_bitrate_pins_to_bpp_default() { + use punktfunk_core::config::Mode; + let mode = Mode { + width: 1920, + height: 1080, + refresh_hz: 60, + }; + // Automatic (0) on PyroWave → the ~1.6 bpp operating point, not the 20 Mbps H.26x + // default (which would turn wavelets to mush — plan §4.6). + let kbps = resolve_bitrate_kbps_for(crate::encode::Codec::PyroWave, 0, &mode); + assert_eq!(kbps, 1920 * 1080 * 60 * 16 / 10 / 1000); + // An explicit client rate is honored (clamped like any other codec)... + assert_eq!( + resolve_bitrate_kbps_for(crate::encode::Codec::PyroWave, 130_000, &mode), + 130_000 + ); + // ...and the H.26x codecs keep the legacy default. + assert_eq!( + resolve_bitrate_kbps_for(crate::encode::Codec::H265, 0, &mode), + DEFAULT_BITRATE_KBPS + ); + } + #[test] fn adapt_fec_maps_loss_to_recovery_band() { // A perfectly clean window (0 loss) lands on the floor. diff --git a/docs-site/content/docs/meta.json b/docs-site/content/docs/meta.json index 09d041cb..0a8acc5f 100644 --- a/docs-site/content/docs/meta.json +++ b/docs-site/content/docs/meta.json @@ -24,6 +24,7 @@ "sway", "running-as-a-service", "virtual-displays", + "pyrowave", "host-cli", "---Connecting---", "clients", diff --git a/docs-site/content/docs/pyrowave.md b/docs-site/content/docs/pyrowave.md new file mode 100644 index 00000000..b60202aa --- /dev/null +++ b/docs-site/content/docs/pyrowave.md @@ -0,0 +1,65 @@ +--- +title: PyroWave (wired-LAN codec) +description: The opt-in ultra-low-latency wavelet codec for wired links — what it is, the bandwidth it needs, and how to turn it on. +--- + +PyroWave is an **opt-in** video codec mode for links that can afford real bandwidth: wired +Ethernet, a docked Steam Deck, a 2.5GbE LAN. It trades bitrate for latency — instead of +H.264/HEVC/AV1 on the GPU's video engine, frames are compressed with +[PyroWave](https://github.com/Themaister/pyrowave), an intra-only wavelet codec running as plain +Vulkan compute. Punktfunk vendors a pinned copy and runs it on both ends. + +**It is never selected automatically.** HEVC/AV1 remain the codecs for Wi-Fi and everything +else; PyroWave engages only when *you* pick it on the client **and** the host supports it. If +either side can't, the session silently falls back to the normal codec ladder. + +## Why you'd want it + +- **Codec latency drops by an order of magnitude.** Encode and decode each take a fraction of a + millisecond of GPU compute (measured ~0.15 ms encode / ~0.07 ms decode at 1080p on an + RTX 5070 Ti), versus one-to-several milliseconds per side for the hardware H.26x pipelines. +- **Every frame is a keyframe.** There is no GOP, no reference chain, no keyframe round-trip + after packet loss — a lost frame costs exactly that frame, and the next one is already a + complete picture. The whole IDR/recovery apparatus that produces loss-time stutter simply + doesn't exist in this mode. +- **Uniform frame sizes.** The rate control hits its per-frame byte budget exactly, so the + pacer sees a flat load instead of 20–40× keyframe spikes. + +## What it costs + +Bandwidth. At the codec's ~1.6 bits-per-pixel operating point (4:2:0, 60 fps): + +| Mode | Bitrate | +|---|---| +| 1280×800 @ 60 (Deck) | ≈ 100 Mbps | +| 1920×1080 @ 60 | ≈ 200 Mbps | +| 2560×1440 @ 60 | ≈ 355 Mbps | +| 3840×2160 @ 60 | ≈ 800 Mbps | + +120 Hz doubles these. Gigabit Ethernet tops out around 940 Mbps of payload, so 4K60 wants +2.5GbE (or a lower rate). **Do not run this over Wi-Fi** — that's what HEVC/AV1 are for. + +Also: PyroWave is **8-bit SDR only**. An HDR session stays on HEVC/AV1 regardless of this +setting. + +## Turning it on + +1. **Host** (Linux): build/install a host with the `pyrowave` feature. On an NVIDIA host the + capture path additionally needs `PUNKTFUNK_ENCODER=pyrowave` in `host.env` for the codec to + be advertised; AMD/Intel hosts advertise it automatically when the feature is present. +2. **Client** (Linux session client with the `pyrowave` feature): set **Settings → Video + codec → PyroWave (wired LAN)** in the gamepad console, or launch with + `PUNKTFUNK_PREFER_PYROWAVE=1`. +3. Leave the bitrate on Automatic: a PyroWave session pins itself to the ~1.6 bpp rate for + your mode (≈200 Mbps at 1080p60). An explicit bitrate is honored if you set one, but the + adaptive-bitrate controller stays off either way — this codec has no useful low-rate + regime, so under sustained loss the right move is switching back to HEVC, not degrading. + +The stats overlay shows `pyrowave` as the decode path when the mode is active. + +## Current limits + +- Linux host + Linux client (including docked Deck) today; the Windows host and the Apple + native port are tracked on the [roadmap](/docs/roadmap). +- 8-bit SDR, 4:2:0 only. +- Mid-stream resolution changes rebuild the stream rather than switching seamlessly. diff --git a/scripts/gen-third-party-notices.py b/scripts/gen-third-party-notices.py index d2e00f17..ca66923e 100755 --- a/scripts/gen-third-party-notices.py +++ b/scripts/gen-third-party-notices.py @@ -45,6 +45,25 @@ def find_license_files(pkg_dir): return out +# Third-party source trees VENDORED inside first-party workspace crates — the +# workspace-member skip in main() hides them from `cargo metadata`, so they are listed +# here explicitly: (label, license file relative to the repo root, source URL). +VENDORED_TREES = [ + ("pyrowave (vendored, crates/pyrowave-sys)", + "crates/pyrowave-sys/vendor/pyrowave/LICENSE", + "https://github.com/Themaister/pyrowave"), + ("Granite subset (vendored, crates/pyrowave-sys)", + "crates/pyrowave-sys/vendor/pyrowave/Granite/LICENSE", + "https://github.com/Themaister/Granite"), + ("volk (vendored, crates/pyrowave-sys)", + "crates/pyrowave-sys/vendor/pyrowave/Granite/third_party/volk/LICENSE.md", + "https://github.com/zeux/volk"), + ("Vulkan-Headers (vendored, crates/pyrowave-sys)", + "crates/pyrowave-sys/vendor/pyrowave/Granite/third_party/khronos/vulkan-headers/LICENSE.md", + "https://github.com/KhronosGroup/Vulkan-Headers"), +] + + def main(): ap = argparse.ArgumentParser() ap.add_argument("--out", default="THIRD-PARTY-NOTICES.txt") @@ -78,6 +97,23 @@ def main(): ent = texts.setdefault(h, {"text": txt, "filename": fname, "crates": set()}) ent["crates"].add(label) + repo_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + vendored = [] + for label, lic_path, url in VENDORED_TREES: + full = os.path.join(repo_root, lic_path) + try: + with open(full, encoding="utf-8", errors="replace") as f: + txt = f.read().strip() + except OSError: + print(f"WARNING: vendored license missing: {lic_path}", file=sys.stderr) + continue + vendored.append((label, url)) + h = hashlib.sha256(txt.encode("utf-8", "replace")).hexdigest() + ent = texts.setdefault( + h, {"text": txt, "filename": os.path.basename(lic_path), "crates": set()} + ) + ent["crates"].add(label) + lines = [] w = lines.append w("THIRD-PARTY SOFTWARE NOTICES") @@ -91,6 +127,13 @@ def main(): w("") w(f"Total third-party crates: {len(pkgs)}") w("") + if vendored: + w("-" * 76) + w("VENDORED THIRD-PARTY SOURCE (inside first-party crates)") + w("-" * 76) + for label, url in vendored: + w(f" {label} — {url}") + w("") w("-" * 76) w("MANIFEST (crate version — SPDX license — source)") w("-" * 76)