From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from atuin.qyliss.net (localhost [IPv6:::1]) by atuin.qyliss.net (Postfix) with ESMTP id D7F95163C; Fri, 23 Jan 2026 15:22:43 +0000 (UTC) Received: by atuin.qyliss.net (Postfix, from userid 993) id 8BA1A9132; Sun, 04 Jan 2026 21:13:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on atuin.qyliss.net X-Spam-Level: X-Spam-Status: No, score=-0.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DMARC_PASS,FREEMAIL_FROM,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 Received: from mail-yx1-xb12d.google.com (mail-yx1-xb12d.google.com [IPv6:2607:f8b0:4864:20::b12d]) by atuin.qyliss.net (Postfix) with ESMTPS id 95664920B for ; Sun, 04 Jan 2026 21:13:44 +0000 (UTC) Received: by mail-yx1-xb12d.google.com with SMTP id 956f58d0204a3-64472121ad5so7912022d50.0 for ; Sun, 04 Jan 2026 13:13:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767561218; x=1768166018; darn=spectrum-os.org; h=in-reply-to:autocrypt:from:content-language:references:to:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=sOuCanVEXUo3/cugaihQCbE1FTieaJ/2bLJc82CgWOE=; b=MOevaA8laIKLAKVutsa01TrVbF60PacFsRzKTjg9SvO9xmDD76M3We6P1O0DS+vvXk IofgSck2oBJb+jsSmPMamWv8mh9xQGN3qufdKjlnXw/7xKNmgfsRKbMLGo8ZqsewseCW 13ruL8l1sbA3pTuEjxXbTkXrM+9HtU0ruVTLCrMStCqCjhqMpdhZ7LeDiCGbVFJCrbyJ OQMnBSj6+RxDDqz4g+kZNR/PuyD++KWidvP3goJPxw6P3WMIwZkPl2kbSYowxpmur/mJ 5FxSwRr+hG3aGvoPxR1vXz29fdE934hUruCjmCFTXXWexRRlfPUbtpQd3T0fzoWA0zqN B99Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767561218; x=1768166018; h=in-reply-to:autocrypt:from:content-language:references:to:subject :user-agent:mime-version:date:message-id:x-gm-gg:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=sOuCanVEXUo3/cugaihQCbE1FTieaJ/2bLJc82CgWOE=; b=j1HTodkXinyAhJNn809zrPvBLK1gk7wN/IbX47SN6hToD4ENLN5TOg45Jc3h1Bi+7y 9ZHph/+vJoRz3xccvvD6Batw40E90rsfFAnH/4YrkCtlejiXx1krfQf3dtCkuOZ23zvn pbL+84kOtZbIGHs+fFHy7l/4wrI9pU54QLITTsf3HH7I5eD0epAWoSUlg9ZSpVvKElAS F62mDND3aUt/6r/3b94pC9uYsLH6ZCE2znbBAYD6MvQ8Wt+/XdoWKQkhLdSbIDLkEjTb h7mfiwu6rtW9PgQnrsDV/f/X250fa1sIWOkoZG+yvqIMhnU/jRDSMFwjfTD/DKNdyvne 4Y3g== X-Forwarded-Encrypted: i=1; AJvYcCUek0grXBWt+vocD9m6+cO8it7fR3/ujUAMuItyzgfNMjicw1GFfyP+mMRrLtzcENSjTdX6Ng==@spectrum-os.org X-Gm-Message-State: AOJu0YxcjxbWWfo1qZXfiHvrXy/OrFp/2jia38Jew2auCllmtUv01+JH kqAoyJZnyV9zuNoNgANLoU2OHwUmvy0OLzwuOcLaYOEF23nrKjG3UODp X-Gm-Gg: AY/fxX7ihc+AEwrfv5w9g5ccX9/GP3ps8U0nzykQ/+OOhNSiBPt+hT358VCnVrv+ryM +SaBhBSUrODdrvtzazqgM86+lTDy2EkOPgbxme6L+50zMYwc7a1Uosc2LYzQIDCf8gvaQE3fZJg Shxzyd/l5R00V2hF4xwNgGvCM+vibbiFhTXNps+CVJVXnJ1vM1v3MbG/ysVCRtEe84ID1k9cCpA 7m8UllIE3xmxPjxt26r5iMnL48/v4usRD8K0GB6D3yjQUhsj0RB8zyuY17nRHZD1btDdfLw4+0J Jg+7AzuoRXFTGE9IzA+GuXXPlOFhriV3Sr47ca7faeLe8aXFV7T/swsQQN5FqNT8ppqr4lzNJ9K ZpRehK4F1i6fxh8jumqrx8IjYkh77A8HrfPUUFkF6oLEuPsRKiFfPxuzxYcYw8VfX+wiwgNS1H1 rCCGgdK9kPDuq/v/5spCsA5YnT14ood0AH9SJdluJXsCw/KhCXpX/6iPeC02svHo1y+Suv8g+XZ ZSl/3n6zf8VotVqZZ3RVW94Tmychw== X-Google-Smtp-Source: AGHT+IGN9zopL0RNRM8iwtL5tCdrs3zedUcKxH0cToiVgAAbxqLE9mT3rgAwUT5Qbrce156r3VwkDQ== X-Received: by 2002:a05:690e:1485:b0:644:774a:96b8 with SMTP id 956f58d0204a3-6467300a0f5mr34461983d50.82.1767561217507; Sun, 04 Jan 2026 13:13:37 -0800 (PST) Received: from [10.138.34.110] (h69-131-146-178.cncrtn.broadband.dynamic.tds.net. [69.131.146.178]) by smtp.gmail.com with ESMTPSA id 00721157ae682-78ffebd2690sm125416637b3.15.2026.01.04.13.13.35 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 04 Jan 2026 13:13:35 -0800 (PST) Message-ID: Date: Sun, 4 Jan 2026 16:13:19 -0500 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 1/4] tools: add spectrum-installer To: =?UTF-8?Q?Johannes_S=C3=BCllner?= , devel@spectrum-os.org References: <20260104140102.106960-5-johannes.suellner@mailbox.org> Content-Language: en-US From: Demi Marie Obenour Autocrypt: addr=demiobenour@gmail.com; keydata= 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 +MYSfkEjBz0E8CLOcAw7JIwAaeBT In-Reply-To: <20260104140102.106960-5-johannes.suellner@mailbox.org> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="------------XbcaJUo88i0kis2Rk2MWhYlP" X-MailFrom: demiobenour@gmail.com X-Mailman-Rule-Hits: max-size X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-devel.spectrum-os.org-0; header-match-devel.spectrum-os.org-1; header-match-devel.spectrum-os.org-2; header-match-devel.spectrum-os.org-3; header-match-devel.spectrum-os.org-4; nonmember-moderation; administrivia; implicit-dest; max-recipients; news-moderation; no-subject; digests; suspicious-header Message-ID-Hash: AZZOMSDBAHZUPMD2TAFKFPMGYV23A4SW X-Message-ID-Hash: AZZOMSDBAHZUPMD2TAFKFPMGYV23A4SW X-Mailman-Approved-At: Fri, 23 Jan 2026 15:22:37 +0000 X-Mailman-Version: 3.3.9 Precedence: list List-Id: Patches and low-level development discussion Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --------------XbcaJUo88i0kis2Rk2MWhYlP Content-Type: multipart/mixed; boundary="------------hVmA945qnDUy110iEMbNE5gW"; protected-headers="v1" Message-ID: Date: Sun, 4 Jan 2026 16:13:19 -0500 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 1/4] tools: add spectrum-installer To: =?UTF-8?Q?Johannes_S=C3=BCllner?= , devel@spectrum-os.org References: <20260104140102.106960-5-johannes.suellner@mailbox.org> Content-Language: en-US From: Demi Marie Obenour Autocrypt: addr=demiobenour@gmail.com; keydata= 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 +MYSfkEjBz0E8CLOcAw7JIwAaeBT In-Reply-To: <20260104140102.106960-5-johannes.suellner@mailbox.org> --------------hVmA945qnDUy110iEMbNE5gW Content-Type: multipart/mixed; boundary="------------8oULBJPHbxiQwrMYf5AP4Vdz" --------------8oULBJPHbxiQwrMYf5AP4Vdz Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On 1/4/26 09:00, Johannes S=C3=BCllner wrote: > Written in Rust using the Iced GUI library. Uses `lsblk-rs` to offer a > list of disks where the user can choose one to install Spectrum on. > Uses `systemd-repart` for the installation, which is running in an > embedded terminal window using `iced-term`. >=20 > Signed-off-by: Johannes S=C3=BCllner > --- > pkgs/default.nix | 1 + > tools/spectrum-installer/Cargo.lock | 5106 +++++++++++++++++= > tools/spectrum-installer/Cargo.lock.license | 2 + > tools/spectrum-installer/Cargo.toml | 14 + > tools/spectrum-installer/default.nix | 41 + > .../res/installer_logo_mesh.svg | 85 + > .../res/repart.d/10-esp.conf | 8 + > .../res/repart.d/20-verity-A.conf | 9 + > .../res/repart.d/21-rootfs-A.conf | 9 + > .../res/repart.d/30-verity-B.conf | 8 + > .../res/repart.d/31-rootfs-B.conf | 8 + > .../res/repart.d/40-home.conf | 7 + > tools/spectrum-installer/shell.nix | 30 + > tools/spectrum-installer/src/main.rs | 52 + > .../src/pages/completion.rs | 112 + > .../src/pages/confirmation.rs | 108 + > .../src/pages/disk_selection.rs | 134 + > .../src/pages/installation.rs | 182 + > tools/spectrum-installer/src/pages/layout.rs | 122 + > tools/spectrum-installer/src/pages/mod.rs | 43 + > tools/spectrum-installer/src/pages/welcome.rs | 62 + > 21 files changed, 6143 insertions(+) > create mode 100644 tools/spectrum-installer/Cargo.lock > create mode 100644 tools/spectrum-installer/Cargo.lock.license > create mode 100644 tools/spectrum-installer/Cargo.toml > create mode 100644 tools/spectrum-installer/default.nix > create mode 100644 tools/spectrum-installer/res/installer_logo_mesh.sv= g > create mode 100644 tools/spectrum-installer/res/repart.d/10-esp.conf > create mode 100644 tools/spectrum-installer/res/repart.d/20-verity-A.c= onf > create mode 100644 tools/spectrum-installer/res/repart.d/21-rootfs-A.c= onf > create mode 100644 tools/spectrum-installer/res/repart.d/30-verity-B.c= onf > create mode 100644 tools/spectrum-installer/res/repart.d/31-rootfs-B.c= onf > create mode 100644 tools/spectrum-installer/res/repart.d/40-home.conf > create mode 100644 tools/spectrum-installer/shell.nix > create mode 100644 tools/spectrum-installer/src/main.rs > create mode 100644 tools/spectrum-installer/src/pages/completion.rs > create mode 100644 tools/spectrum-installer/src/pages/confirmation.rs > create mode 100644 tools/spectrum-installer/src/pages/disk_selection.r= s > create mode 100644 tools/spectrum-installer/src/pages/installation.rs > create mode 100644 tools/spectrum-installer/src/pages/layout.rs > create mode 100644 tools/spectrum-installer/src/pages/mod.rs > create mode 100644 tools/spectrum-installer/src/pages/welcome.rs >=20 > diff --git a/pkgs/default.nix b/pkgs/default.nix > index 4dbdfee..a80c5b3 100644 > --- a/pkgs/default.nix > +++ b/pkgs/default.nix > @@ -74,6 +74,7 @@ let > ../release/live/build > ../tools/mount-flatpak/target > ../tools/router/target > + ../tools/spectrum-installer/target > ../tools/xdg-desktop-portal-spectrum-host/target > ../vm/sys/net/build > ])); > diff --git a/tools/spectrum-installer/Cargo.lock b/tools/spectrum-insta= ller/Cargo.lock > new file mode 100644 > index 0000000..4be50ef > --- /dev/null > +++ b/tools/spectrum-installer/Cargo.lock > @@ -0,0 +1,5106 @@ > +# This file is automatically @generated by Cargo. > +# It is not intended for manual editing. > +version =3D 4 > + > +[[package]] > +name =3D "ab_glyph" > +version =3D "0.2.32" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9= 913f6cc2" > +dependencies =3D [ > + "ab_glyph_rasterizer", > + "owned_ttf_parser", > +] > + > +[[package]] > +name =3D "ab_glyph_rasterizer" > +version =3D "0.1.10" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279= e432b618" > + > +[[package]] > +name =3D "adler2" > +version =3D "2.0.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898= 340abefa" > + > +[[package]] > +name =3D "ahash" > +version =3D "0.7.8" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af= 310920f9" > +dependencies =3D [ > + "getrandom 0.2.16", > + "once_cell", > + "version_check", > +] > + > +[[package]] > +name =3D "ahash" > +version =3D "0.8.12" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a= 73ba7a75" > +dependencies =3D [ > + "cfg-if", > + "getrandom 0.3.4", > + "once_cell", > + "version_check", > + "zerocopy", > +] > + > +[[package]] > +name =3D "aho-corasick" > +version =3D "1.1.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f10028= 16174301" > +dependencies =3D [ > + "memchr", > +] > + > +[[package]] > +name =3D "alacritty_terminal" > +version =3D "0.25.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "46319972e74179d707445f64aaa2893bbf6a111de3a9af29b7eb382f= 8b39e282" > +dependencies =3D [ > + "base64", > + "bitflags 2.10.0", > + "home", > + "libc", > + "log", > + "miow", > + "parking_lot 0.12.5", > + "piper", > + "polling 3.11.0", > + "regex-automata", > + "rustix 1.1.2", > + "rustix-openpty", > + "serde", > + "signal-hook", > + "unicode-width 0.2.2", > + "vte", > + "windows-sys 0.59.0", > +] > + > +[[package]] > +name =3D "aliasable" > +version =3D "0.1.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d9= 3e2205fd" > + > +[[package]] > +name =3D "allocator-api2" > +version =3D "0.2.21" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c967721= 80fef923" > + > +[[package]] > +name =3D "android-activity" > +version =3D "0.6.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e= 3a42d046" > +dependencies =3D [ > + "android-properties", > + "bitflags 2.10.0", > + "cc", > + "cesu8", > + "jni", > + "jni-sys", > + "libc", > + "log", > + "ndk", > + "ndk-context", > + "ndk-sys 0.6.0+11769913", > + "num_enum", > + "thiserror 1.0.69", > +] > + > +[[package]] > +name =3D "android-properties" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523= dea6da04" > + > +[[package]] > +name =3D "android_system_properties" > +version =3D "0.1.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea91672011= 7ee66311" > +dependencies =3D [ > + "libc", > +] > + > +[[package]] > +name =3D "anyhow" > +version =3D "1.0.100" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c08= 09af6e61" > + > +[[package]] > +name =3D "approx" > +version =3D "0.5.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6= dad897c6" > +dependencies =3D [ > + "num-traits", > +] > + > +[[package]] > +name =3D "arrayref" > +version =3D "0.3.9" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb= 2db8fecb" > + > +[[package]] > +name =3D "arrayvec" > +version =3D "0.7.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc7= 18f92e50" > + > +[[package]] > +name =3D "as-raw-xcb-connection" > +version =3D "1.0.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beecea= c5bf0f6b" > + > +[[package]] > +name =3D "ash" > +version =3D "0.37.3+1.3.251" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356= a25ecd4a" > +dependencies =3D [ > + "libloading 0.7.4", > +] > + > +[[package]] > +name =3D "async-broadcast" > +version =3D "0.7.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec= 39c37532" > +dependencies =3D [ > + "event-listener 5.4.1", > + "event-listener-strategy", > + "futures-core", > + "pin-project-lite", > +] > + > +[[package]] > +name =3D "async-channel" > +version =3D "1.9.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "81953c529336010edd6d8e358f886d9581267795c61b19475b71314b= ffa46d35" > +dependencies =3D [ > + "concurrent-queue", > + "event-listener 2.5.3", > + "futures-core", > +] > + > +[[package]] > +name =3D "async-channel" > +version =3D "2.5.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4= 221158d2" > +dependencies =3D [ > + "concurrent-queue", > + "event-listener-strategy", > + "futures-core", > + "pin-project-lite", > +] > + > +[[package]] > +name =3D "async-executor" > +version =3D "1.13.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e= 76527fb8" > +dependencies =3D [ > + "async-task", > + "concurrent-queue", > + "fastrand 2.3.0", > + "futures-lite 2.6.1", > + "pin-project-lite", > + "slab", > +] > + > +[[package]] > +name =3D "async-fs" > +version =3D "1.6.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a= 0e142e06" > +dependencies =3D [ > + "async-lock 2.8.0", > + "autocfg", > + "blocking", > + "futures-lite 1.13.0", > +] > + > +[[package]] > +name =3D "async-fs" > +version =3D "2.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b3045670= 52e294c5" > +dependencies =3D [ > + "async-lock 3.4.1", > + "blocking", > + "futures-lite 2.6.1", > +] > + > +[[package]] > +name =3D "async-io" > +version =3D "1.13.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac0= 2f3dd2af" > +dependencies =3D [ > + "async-lock 2.8.0", > + "autocfg", > + "cfg-if", > + "concurrent-queue", > + "futures-lite 1.13.0", > + "log", > + "parking", > + "polling 2.8.0", > + "rustix 0.37.28", > + "slab", > + "socket2 0.4.10", > + "waker-fn", > +] > + > +[[package]] > +name =3D "async-io" > +version =3D "2.6.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba= 50d026fc" > +dependencies =3D [ > + "autocfg", > + "cfg-if", > + "concurrent-queue", > + "futures-io", > + "futures-lite 2.6.1", > + "parking", > + "polling 3.11.0", > + "rustix 1.1.2", > + "slab", > + "windows-sys 0.61.2", > +] > + > +[[package]] > +name =3D "async-lock" > +version =3D "2.8.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf7= 5b2f582b" > +dependencies =3D [ > + "event-listener 2.5.3", > +] > + > +[[package]] > +name =3D "async-lock" > +version =3D "3.4.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33a= b80ed1dc" > +dependencies =3D [ > + "event-listener 5.4.1", > + "event-listener-strategy", > + "pin-project-lite", > +] > + > +[[package]] > +name =3D "async-net" > +version =3D "1.8.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0434b1ed18ce1cf5769b8ac540e33f01fa9471058b5e89da9e06f3c8= 82a8c12f" > +dependencies =3D [ > + "async-io 1.13.0", > + "blocking", > + "futures-lite 1.13.0", > +] > + > +[[package]] > +name =3D "async-process" > +version =3D "1.8.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d= 9149da88" > +dependencies =3D [ > + "async-io 1.13.0", > + "async-lock 2.8.0", > + "async-signal", > + "blocking", > + "cfg-if", > + "event-listener 3.1.0", > + "futures-lite 1.13.0", > + "rustix 0.38.44", > + "windows-sys 0.48.0", > +] > + > +[[package]] > +name =3D "async-process" > +version =3D "2.5.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c039967= 6be7da75" > +dependencies =3D [ > + "async-channel 2.5.0", > + "async-io 2.6.0", > + "async-lock 3.4.1", > + "async-signal", > + "async-task", > + "blocking", > + "cfg-if", > + "event-listener 5.4.1", > + "futures-lite 2.6.1", > + "rustix 1.1.2", > +] > + > +[[package]] > +name =3D "async-recursion" > +version =3D "1.1.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8c= e0274c11" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "async-signal" > +version =3D "0.2.13" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3e= d6adc64c" > +dependencies =3D [ > + "async-io 2.6.0", > + "async-lock 3.4.1", > + "atomic-waker", > + "cfg-if", > + "futures-core", > + "futures-io", > + "rustix 1.1.2", > + "signal-hook-registry", > + "slab", > + "windows-sys 0.61.2", > +] > + > +[[package]] > +name =3D "async-task" > +version =3D "4.7.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44c= f256e3de" > + > +[[package]] > +name =3D "async-trait" > +version =3D "0.1.89" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c= 7eed5dbb" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "atomic-waker" > +version =3D "1.1.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac2= 69d8aac0" > + > +[[package]] > +name =3D "autocfg" > +version =3D "1.5.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a616= 5172e7e8" > + > +[[package]] > +name =3D "base64" > +version =3D "0.22.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575= e0fbb8c6" > + > +[[package]] > +name =3D "bit-set" > +version =3D "0.5.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210= fb4e95f1" > +dependencies =3D [ > + "bit-vec", > +] > + > +[[package]] > +name =3D "bit-vec" > +version =3D "0.6.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160= b69598fb" > + > +[[package]] > +name =3D "bit_field" > +version =3D "0.10.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45= e05d70c6" > + > +[[package]] > +name =3D "bitflags" > +version =3D "1.3.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb= 1037718a" > + > +[[package]] > +name =3D "bitflags" > +version =3D "2.10.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c1661= 06e31dd3" > +dependencies =3D [ > + "serde_core", > +] > + > +[[package]] > +name =3D "block" > +version =3D "0.1.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641= e993699a" > + > +[[package]] > +name =3D "block-buffer" > +version =3D "0.10.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77a= bd503a71" > +dependencies =3D [ > + "generic-array", > +] > + > +[[package]] > +name =3D "block2" > +version =3D "0.5.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe808= 8b82d15f" > +dependencies =3D [ > + "objc2", > +] > + > +[[package]] > +name =3D "blocking" > +version =3D "1.6.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7= 921b7f21" > +dependencies =3D [ > + "async-channel 2.5.0", > + "async-task", > + "futures-io", > + "futures-lite 2.6.1", > + "piper", > +] > + > +[[package]] > +name =3D "bumpalo" > +version =3D "3.19.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb= 76b34d43" > + > +[[package]] > +name =3D "by_address" > +version =3D "1.2.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a= 9eaa2d06" > + > +[[package]] > +name =3D "bytemuck" > +version =3D "1.24.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e= 13e3c5f4" > +dependencies =3D [ > + "bytemuck_derive", > +] > + > +[[package]] > +name =3D "bytemuck_derive" > +version =3D "1.10.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d= 789575ff" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "byteorder" > +version =3D "1.5.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e2= 7c67f64b" > + > +[[package]] > +name =3D "bytes" > +version =3D "1.11.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd= 960f9cb3" > + > +[[package]] > +name =3D "calloop" > +version =3D "0.13.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b68= 5b7cbfec" > +dependencies =3D [ > + "bitflags 2.10.0", > + "log", > + "polling 3.11.0", > + "rustix 0.38.44", > + "slab", > + "thiserror 1.0.69", > +] > + > +[[package]] > +name =3D "calloop" > +version =3D "0.14.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "cb9f6e1368bd4621d2c86baa7e37de77a938adf5221e5dd3d6133340= 101b309e" > +dependencies =3D [ > + "bitflags 2.10.0", > + "polling 3.11.0", > + "rustix 1.1.2", > + "slab", > + "tracing", > +] > + > +[[package]] > +name =3D "calloop-wayland-source" > +version =3D "0.3.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13= 702ddd20" > +dependencies =3D [ > + "calloop 0.13.0", > + "rustix 0.38.44", > + "wayland-backend", > + "wayland-client", > +] > + > +[[package]] > +name =3D "calloop-wayland-source" > +version =3D "0.4.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265= 876021fa" > +dependencies =3D [ > + "calloop 0.14.3", > + "rustix 1.1.2", > + "wayland-backend", > + "wayland-client", > +] > + > +[[package]] > +name =3D "cc" > +version =3D "1.2.47" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd356883= 9827cf07" > +dependencies =3D [ > + "find-msvc-tools", > + "jobserver", > + "libc", > + "shlex", > +] > + > +[[package]] > +name =3D "cesu8" > +version =3D "1.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3= 382ad83c" > + > +[[package]] > +name =3D "cfg-if" > +version =3D "1.0.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef9861426= 15121801" > + > +[[package]] > +name =3D "cfg_aliases" > +version =3D "0.1.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac3= 6c10e89e" > + > +[[package]] > +name =3D "cfg_aliases" > +version =3D "0.2.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad16= 58eb5724" > + > +[[package]] > +name =3D "chrono" > +version =3D "0.4.42" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262d= d38fe8d2" > +dependencies =3D [ > + "iana-time-zone", > + "js-sys", > + "num-traits", > + "wasm-bindgen", > + "windows-link", > +] > + > +[[package]] > +name =3D "clipboard-win" > +version =3D "5.4.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e710= 3c7e84d4" > +dependencies =3D [ > + "error-code", > +] > + > +[[package]] > +name =3D "clipboard_macos" > +version =3D "0.1.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9b7f4aaa047ba3c3630b080bb9860894732ff23e2aee290a418909aa= 6d5df38f" > +dependencies =3D [ > + "objc2", > + "objc2-app-kit", > + "objc2-foundation", > +] > + > +[[package]] > +name =3D "clipboard_wayland" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "003f886bc4e2987729d10c1db3424e7f80809f3fc22dbc16c6857388= 87cb37b8" > +dependencies =3D [ > + "smithay-clipboard", > +] > + > +[[package]] > +name =3D "clipboard_x11" > +version =3D "0.4.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "4274ea815e013e0f9f04a2633423e14194e408a0576c943ce3d14ca5= 6c50031c" > +dependencies =3D [ > + "thiserror 1.0.69", > + "x11rb", > +] > + > +[[package]] > +name =3D "codespan-reporting" > +version =3D "0.11.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac= 80576e6e" > +dependencies =3D [ > + "termcolor", > + "unicode-width 0.1.14", > +] > + > +[[package]] > +name =3D "color_quant" > +version =3D "1.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b0978= 04b1018b" > + > +[[package]] > +name =3D "com" > +version =3D "0.6.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a= 48f3d9f6" > +dependencies =3D [ > + "com_macros", > +] > + > +[[package]] > +name =3D "com_macros" > +version =3D "0.6.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4= b04b13a5" > +dependencies =3D [ > + "com_macros_support", > + "proc-macro2", > + "syn 1.0.109", > +] > + > +[[package]] > +name =3D "com_macros_support" > +version =3D "0.6.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169= a6e8710c" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 1.0.109", > +] > + > +[[package]] > +name =3D "combine" > +version =3D "4.6.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572= 398219fd" > +dependencies =3D [ > + "bytes", > + "memchr", > +] > + > +[[package]] > +name =3D "concurrent-queue" > +version =3D "2.5.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d4681= 7f1d3973" > +dependencies =3D [ > + "crossbeam-utils", > +] > + > +[[package]] > +name =3D "core-foundation" > +version =3D "0.9.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03= e45afb8f" > +dependencies =3D [ > + "core-foundation-sys", > + "libc", > +] > + > +[[package]] > +name =3D "core-foundation" > +version =3D "0.10.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c87= 9bd156f6" > +dependencies =3D [ > + "core-foundation-sys", > + "libc", > +] > + > +[[package]] > +name =3D "core-foundation-sys" > +version =3D "0.8.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45= c791888b" > + > +[[package]] > +name =3D "core-graphics" > +version =3D "0.23.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32= dfd8b081" > +dependencies =3D [ > + "bitflags 1.3.2", > + "core-foundation 0.9.4", > + "core-graphics-types 0.1.3", > + "foreign-types", > + "libc", > +] > + > +[[package]] > +name =3D "core-graphics" > +version =3D "0.24.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38a= f14316f1" > +dependencies =3D [ > + "bitflags 2.10.0", > + "core-foundation 0.10.1", > + "core-graphics-types 0.2.0", > + "foreign-types", > + "libc", > +] > + > +[[package]] > +name =3D "core-graphics-types" > +version =3D "0.1.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4= ba45afaf" > +dependencies =3D [ > + "bitflags 1.3.2", > + "core-foundation 0.9.4", > + "libc", > +] > + > +[[package]] > +name =3D "core-graphics-types" > +version =3D "0.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4= 735013eb" > +dependencies =3D [ > + "bitflags 2.10.0", > + "core-foundation 0.10.1", > + "libc", > +] > + > +[[package]] > +name =3D "cosmic-text" > +version =3D "0.12.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4a= fe0e80c2" > +dependencies =3D [ > + "bitflags 2.10.0", > + "fontdb", > + "log", > + "rangemap", > + "rayon", > + "rustc-hash 1.1.0", > + "rustybuzz", > + "self_cell", > + "swash", > + "sys-locale", > + "ttf-parser 0.21.1", > + "unicode-bidi", > + "unicode-linebreak", > + "unicode-script", > + "unicode-segmentation", > +] > + > +[[package]] > +name =3D "cpufeatures" > +version =3D "0.2.17" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e65= 6d1b0280" > +dependencies =3D [ > + "libc", > +] > + > +[[package]] > +name =3D "crc32fast" > +version =3D "1.5.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4= 230da511" > +dependencies =3D [ > + "cfg-if", > +] > + > +[[package]] > +name =3D "crossbeam-deque" > +version =3D "0.8.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b= 950e2e51" > +dependencies =3D [ > + "crossbeam-epoch", > + "crossbeam-utils", > +] > + > +[[package]] > +name =3D "crossbeam-epoch" > +version =3D "0.9.18" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714a= d1b5420e" > +dependencies =3D [ > + "crossbeam-utils", > +] > + > +[[package]] > +name =3D "crossbeam-utils" > +version =3D "0.8.21" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b032356= 97506a28" > + > +[[package]] > +name =3D "crunchy" > +version =3D "0.2.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8= 952d77d5" > + > +[[package]] > +name =3D "crypto-common" > +version =3D "0.1.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef= 6016d60a" > +dependencies =3D [ > + "generic-array", > + "typenum", > +] > + > +[[package]] > +name =3D "ctor-lite" > +version =3D "0.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1f791803201ab277ace03903de1594460708d2d54df6053f2d9e82f5= 92b19e3b" > + > +[[package]] > +name =3D "cursor-icon" > +version =3D "1.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730= d5e1732f" > + > +[[package]] > +name =3D "d3d12" > +version =3D "0.19.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb2= 9510a307" > +dependencies =3D [ > + "bitflags 2.10.0", > + "libloading 0.8.9", > + "winapi", > +] > + > +[[package]] > +name =3D "dark-light" > +version =3D "1.1.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "2a76fa97167fa740dcdbfe18e8895601e1bc36525f09b044e00916e7= 17c03a3c" > +dependencies =3D [ > + "dconf_rs", > + "detect-desktop-environment", > + "dirs", > + "objc", > + "rust-ini", > + "web-sys", > + "winreg", > + "zbus", > +] > + > +[[package]] > +name =3D "dconf_rs" > +version =3D "0.3.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7046468a81e6a002061c01e6a7c83139daf91b11c30e66795b13217c= 2d885c8b" > + > +[[package]] > +name =3D "detect-desktop-environment" > +version =3D "0.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "21d8ad60dd5b13a4ee6bd8fa2d5d88965c597c67bce32b5fc49c94f5= 5cb50810" > + > +[[package]] > +name =3D "digest" > +version =3D "0.10.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701= a3b1e292" > +dependencies =3D [ > + "block-buffer", > + "crypto-common", > +] > + > +[[package]] > +name =3D "dirs" > +version =3D "4.0.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e3842= 3f100059" > +dependencies =3D [ > + "dirs-sys", > +] > + > +[[package]] > +name =3D "dirs-sys" > +version =3D "0.3.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e35= 2d0bada6" > +dependencies =3D [ > + "libc", > + "redox_users", > + "winapi", > +] > + > +[[package]] > +name =3D "dispatch" > +version =3D "0.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a072= 56ca923b" > + > +[[package]] > +name =3D "dlib" > +version =3D "0.5.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0be= fcffa412" > +dependencies =3D [ > + "libloading 0.8.9", > +] > + > +[[package]] > +name =3D "dlv-list" > +version =3D "0.3.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a36= 5b2e1257" > + > +[[package]] > +name =3D "downcast-rs" > +version =3D "1.2.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736= d0c0b9d2" > + > +[[package]] > +name =3D "dpi" > +version =3D "0.1.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52d= dfdf1a76" > + > +[[package]] > +name =3D "drm" > +version =3D "0.12.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "98888c4bbd601524c11a7ed63f814b8825f420514f78e96f752c437a= e9cbb5d1" > +dependencies =3D [ > + "bitflags 2.10.0", > + "bytemuck", > + "drm-ffi", > + "drm-fourcc", > + "rustix 0.38.44", > +] > + > +[[package]] > +name =3D "drm-ffi" > +version =3D "0.8.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "97c98727e48b7ccb4f4aea8cfe881e5b07f702d17b7875991881b41a= f7278d53" > +dependencies =3D [ > + "drm-sys", > + "rustix 0.38.44", > +] > + > +[[package]] > +name =3D "drm-fourcc" > +version =3D "2.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b= 54dae6f4" > + > +[[package]] > +name =3D "drm-sys" > +version =3D "0.7.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "fd39dde40b6e196c2e8763f23d119ddb1a8714534bf7d77fa97a65b0= feda3986" > +dependencies =3D [ > + "libc", > + "linux-raw-sys 0.6.5", > +] > + > +[[package]] > +name =3D "either" > +version =3D "1.15.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576d= a70b3719" > + > +[[package]] > +name =3D "endi" > +version =3D "1.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1= 101ab7bf" > + > +[[package]] > +name =3D "enumflags2" > +version =3D "0.7.12" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146= ded4ecef" > +dependencies =3D [ > + "enumflags2_derive", > + "serde", > +] > + > +[[package]] > +name =3D "enumflags2_derive" > +version =3D "0.7.12" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac5= 94733827" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "equivalent" > +version =3D "1.0.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c= 3ffe5c0f" > + > +[[package]] > +name =3D "errno" > +version =3D "0.3.14" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d04= 2b63efeb" > +dependencies =3D [ > + "libc", > + "windows-sys 0.61.2", > +] > + > +[[package]] > +name =3D "error-code" > +version =3D "3.3.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc= 53ed4c59" > + > +[[package]] > +name =3D "etagere" > +version =3D "0.2.15" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510b= c08c5342" > +dependencies =3D [ > + "euclid", > + "svg_fmt", > +] > + > +[[package]] > +name =3D "euclid" > +version =3D "0.22.11" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d4= 03589e48" > +dependencies =3D [ > + "num-traits", > +] > + > +[[package]] > +name =3D "event-listener" > +version =3D "2.5.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6= ec1d9ce0" > + > +[[package]] > +name =3D "event-listener" > +version =3D "3.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18= cd9b30c2" > +dependencies =3D [ > + "concurrent-queue", > + "parking", > + "pin-project-lite", > +] > + > +[[package]] > +name =3D "event-listener" > +version =3D "5.4.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5= d4b856ab" > +dependencies =3D [ > + "concurrent-queue", > + "parking", > + "pin-project-lite", > +] > + > +[[package]] > +name =3D "event-listener-strategy" > +version =3D "0.5.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4= 150a3b93" > +dependencies =3D [ > + "event-listener 5.4.1", > + "pin-project-lite", > +] > + > +[[package]] > +name =3D "exr" > +version =3D "1.74.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89= 056363be" > +dependencies =3D [ > + "bit_field", > + "half", > + "lebe", > + "miniz_oxide", > + "rayon-core", > + "smallvec", > + "zune-inflate", > +] > + > +[[package]] > +name =3D "fast-srgb8" > +version =3D "1.0.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e02= 39efe6a1" > + > +[[package]] > +name =3D "fastrand" > +version =3D "1.9.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b11861= 4a1501be" > +dependencies =3D [ > + "instant", > +] > + > +[[package]] > +name =3D "fastrand" > +version =3D "2.3.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0= 355411be" > + > +[[package]] > +name =3D "fdeflate" > +version =3D "0.3.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf= 51500f8c" > +dependencies =3D [ > + "simd-adler32", > +] > + > +[[package]] > +name =3D "find-msvc-tools" > +version =3D "0.1.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de1= 05a03844" > + > +[[package]] > +name =3D "flate2" > +version =3D "1.1.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7= fbeb3bfb" > +dependencies =3D [ > + "crc32fast", > + "miniz_oxide", > +] > + > +[[package]] > +name =3D "float_next_after" > +version =3D "1.0.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d95= 8c9df1e8" > + > +[[package]] > +name =3D "font-types" > +version =3D "0.7.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b3971f9a5ca983419cdc386941ba3b9e1feba01a0ab888adf78739fe= b2798492" > +dependencies =3D [ > + "bytemuck", > +] > + > +[[package]] > +name =3D "fontconfig-parser" > +version =3D "0.5.8" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30= de5f5646" > +dependencies =3D [ > + "roxmltree", > +] > + > +[[package]] > +name =3D "fontdb" > +version =3D "0.16.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068= e5d81dc3" > +dependencies =3D [ > + "fontconfig-parser", > + "log", > + "memmap2", > + "slotmap", > + "tinyvec", > + "ttf-parser 0.20.0", > +] > + > +[[package]] > +name =3D "foreign-types" > +version =3D "0.5.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975db= dd17d965" > +dependencies =3D [ > + "foreign-types-macros", > + "foreign-types-shared", > +] > + > +[[package]] > +name =3D "foreign-types-macros" > +version =3D "0.2.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f= 518c5742" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "foreign-types-shared" > +version =3D "0.3.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840= f66ed35b" > + > +[[package]] > +name =3D "futures" > +version =3D "0.3.31" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a= 576b0876" > +dependencies =3D [ > + "futures-channel", > + "futures-core", > + "futures-executor", > + "futures-io", > + "futures-sink", > + "futures-task", > + "futures-util", > +] > + > +[[package]] > +name =3D "futures-channel" > +version =3D "0.3.31" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a= 2fbe1b10" > +dependencies =3D [ > + "futures-core", > + "futures-sink", > +] > + > +[[package]] > +name =3D "futures-core" > +version =3D "0.3.31" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f8= 7af6663e" > + > +[[package]] > +name =3D "futures-executor" > +version =3D "0.3.31" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb56= 4d646c9f" > +dependencies =3D [ > + "futures-core", > + "futures-task", > + "futures-util", > + "num_cpus", > +] > + > +[[package]] > +name =3D "futures-io" > +version =3D "0.3.31" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe5= 7ce075c6" > + > +[[package]] > +name =3D "futures-lite" > +version =3D "1.13.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd169915= 15c46bce" > +dependencies =3D [ > + "fastrand 1.9.0", > + "futures-core", > + "futures-io", > + "memchr", > + "parking", > + "pin-project-lite", > + "waker-fn", > +] > + > +[[package]] > +name =3D "futures-lite" > +version =3D "2.6.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306d= c46b44ad" > +dependencies =3D [ > + "fastrand 2.3.0", > + "futures-core", > + "futures-io", > + "parking", > + "pin-project-lite", > +] > + > +[[package]] > +name =3D "futures-macro" > +version =3D "0.3.31" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fe= f13c3650" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "futures-sink" > +version =3D "0.3.31" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819ac= acf1d4f7" > + > +[[package]] > +name =3D "futures-task" > +version =3D "0.3.31" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd3890= 2cd99988" > + > +[[package]] > +name =3D "futures-util" > +version =3D "0.3.31" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85= b20a4a81" > +dependencies =3D [ > + "futures-channel", > + "futures-core", > + "futures-io", > + "futures-macro", > + "futures-sink", > + "futures-task", > + "memchr", > + "pin-project-lite", > + "pin-utils", > + "slab", > +] > + > +[[package]] > +name =3D "generic-array" > +version =3D "0.14.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a= 7ff69e9a" > +dependencies =3D [ > + "typenum", > + "version_check", > +] > + > +[[package]] > +name =3D "gethostname" > +version =3D "1.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f8002= 5f92cbd8" > +dependencies =3D [ > + "rustix 1.1.2", > + "windows-link", > +] > + > +[[package]] > +name =3D "getrandom" > +version =3D "0.2.16" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1= a2528592" > +dependencies =3D [ > + "cfg-if", > + "libc", > + "wasi", > +] > + > +[[package]] > +name =3D "getrandom" > +version =3D "0.3.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cc= e2dd77fd" > +dependencies =3D [ > + "cfg-if", > + "libc", > + "r-efi", > + "wasip2", > +] > + > +[[package]] > +name =3D "gif" > +version =3D "0.13.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022= 287de61b" > +dependencies =3D [ > + "color_quant", > + "weezl", > +] > + > +[[package]] > +name =3D "gl_generator" > +version =3D "0.14.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb= 2a0c124d" > +dependencies =3D [ > + "khronos_api", > + "log", > + "xml-rs", > +] > + > +[[package]] > +name =3D "glam" > +version =3D "0.25.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c= 7e0528b3" > + > +[[package]] > +name =3D "glow" > +version =3D "0.13.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc46= 4ab121b1" > +dependencies =3D [ > + "js-sys", > + "slotmap", > + "wasm-bindgen", > + "web-sys", > +] > + > +[[package]] > +name =3D "glutin_wgl_sys" > +version =3D "0.5.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc4= 24362ead" > +dependencies =3D [ > + "gl_generator", > +] > + > +[[package]] > +name =3D "gpu-alloc" > +version =3D "0.6.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d= 0fe6a171" > +dependencies =3D [ > + "bitflags 2.10.0", > + "gpu-alloc-types", > +] > + > +[[package]] > +name =3D "gpu-alloc-types" > +version =3D "0.3.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219c= aeee1ca4" > +dependencies =3D [ > + "bitflags 2.10.0", > +] > + > +[[package]] > +name =3D "gpu-allocator" > +version =3D "0.25.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60= e1228884" > +dependencies =3D [ > + "log", > + "presser", > + "thiserror 1.0.69", > + "winapi", > + "windows", > +] > + > +[[package]] > +name =3D "gpu-descriptor" > +version =3D "0.2.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a60= 48bc682c" > +dependencies =3D [ > + "bitflags 2.10.0", > + "gpu-descriptor-types", > + "hashbrown 0.14.5", > +] > + > +[[package]] > +name =3D "gpu-descriptor-types" > +version =3D "0.1.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff35= 56b8b78c" > +dependencies =3D [ > + "bitflags 2.10.0", > +] > + > +[[package]] > +name =3D "guillotiere" > +version =3D "0.6.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd59= 2e74a782" > +dependencies =3D [ > + "euclid", > + "svg_fmt", > +] > + > +[[package]] > +name =3D "half" > +version =3D "2.7.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5= ba20d84b" > +dependencies =3D [ > + "cfg-if", > + "crunchy", > + "zerocopy", > +] > + > +[[package]] > +name =3D "hashbrown" > +version =3D "0.12.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272= 889ac888" > +dependencies =3D [ > + "ahash 0.7.8", > +] > + > +[[package]] > +name =3D "hashbrown" > +version =3D "0.14.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd= 83df41f1" > +dependencies =3D [ > + "ahash 0.8.12", > + "allocator-api2", > +] > + > +[[package]] > +name =3D "hashbrown" > +version =3D "0.16.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1= a51d9100" > + > +[[package]] > +name =3D "hassle-rs" > +version =3D "0.11.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8= b741e890" > +dependencies =3D [ > + "bitflags 2.10.0", > + "com", > + "libc", > + "libloading 0.8.9", > + "thiserror 1.0.69", > + "widestring", > + "winapi", > +] > + > +[[package]] > +name =3D "heck" > +version =3D "0.4.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6= adc6f5a8" > + > +[[package]] > +name =3D "hermit-abi" > +version =3D "0.3.9" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b= 97ec5024" > + > +[[package]] > +name =3D "hermit-abi" > +version =3D "0.5.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36= b1da849c" > + > +[[package]] > +name =3D "hex" > +version =3D "0.4.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba= 55232a70" > + > +[[package]] > +name =3D "hexf-parse" > +version =3D "0.2.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933= f55023df" > + > +[[package]] > +name =3D "home" > +version =3D "0.5.11" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "589533453244b0995c858700322199b2becb13b627df2851f64a2775= d024abcf" > +dependencies =3D [ > + "windows-sys 0.59.0", > +] > + > +[[package]] > +name =3D "iana-time-zone" > +version =3D "0.1.64" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b58= 1d40e9fb" > +dependencies =3D [ > + "android_system_properties", > + "core-foundation-sys", > + "iana-time-zone-haiku", > + "js-sys", > + "log", > + "wasm-bindgen", > + "windows-core 0.62.2", > +] > + > +[[package]] > +name =3D "iana-time-zone-haiku" > +version =3D "0.1.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b230= 6495269f" > +dependencies =3D [ > + "cc", > +] > + > +[[package]] > +name =3D "iced" > +version =3D "0.13.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "88acfabc84ec077eaf9ede3457ffa3a104626d79022a9bf7f296093b= 1d60c73f" > +dependencies =3D [ > + "iced_core", > + "iced_futures", > + "iced_renderer", > + "iced_widget", > + "iced_winit", > + "image", > + "thiserror 1.0.69", > +] > + > +[[package]] > +name =3D "iced_aw" > +version =3D "0.12.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "582c517a94ce3205da98e9c10b26bb71aa36b7d7d084441d826dc912= 711d1bac" > +dependencies =3D [ > + "cfg-if", > + "chrono", > + "getrandom 0.3.4", > + "iced", > + "iced_fonts 0.1.1", > + "itertools", > + "num-format", > + "num-traits", > + "web-time", > +] > + > +[[package]] > +name =3D "iced_core" > +version =3D "0.13.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0013a238275494641bf8f1732a23a808196540dc67b22ff97099c044= ae4c8a1c" > +dependencies =3D [ > + "bitflags 2.10.0", > + "bytes", > + "dark-light", > + "glam", > + "log", > + "num-traits", > + "once_cell", > + "palette", > + "rustc-hash 2.1.1", > + "smol_str", > + "thiserror 1.0.69", > + "web-time", > +] > + > +[[package]] > +name =3D "iced_fonts" > +version =3D "0.1.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "df7deb0800a850ee25c8a42559f72c0f249e577feb3aad37b9b65dc1= e517e52a" > +dependencies =3D [ > + "iced_core", > +] > + > +[[package]] > +name =3D "iced_fonts" > +version =3D "0.2.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7db9d45e87bc3ac22ff82e2d9dea9139f1c055137f1e0f39df3d6811= 0fcee7a9" > +dependencies =3D [ > + "iced_core", > + "iced_widget", > +] > + > +[[package]] > +name =3D "iced_futures" > +version =3D "0.13.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0c04a6745ba2e80f32cf01e034fd00d853aa4f4cd8b91888099cb7aa= ee0d5d7c" > +dependencies =3D [ > + "futures", > + "iced_core", > + "log", > + "rustc-hash 2.1.1", > + "smol", > + "tokio", > + "wasm-bindgen-futures", > + "wasm-timer", > +] > + > +[[package]] > +name =3D "iced_glyphon" > +version =3D "0.6.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "41c3bb56f1820ca252bc1d0994ece33d233a55657c0c263ea7cb1689= 5adbde82" > +dependencies =3D [ > + "cosmic-text", > + "etagere", > + "lru", > + "rustc-hash 2.1.1", > + "wgpu", > +] > + > +[[package]] > +name =3D "iced_graphics" > +version =3D "0.13.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ba25a18cfa6d5cc160aca7e1b34f73ccdff21680fa8702168c097397= 67b6c66f" > +dependencies =3D [ > + "bitflags 2.10.0", > + "bytemuck", > + "cosmic-text", > + "half", > + "iced_core", > + "iced_futures", > + "image", > + "kamadak-exif", > + "log", > + "lyon_path", > + "once_cell", > + "raw-window-handle", > + "rustc-hash 2.1.1", > + "thiserror 1.0.69", > + "unicode-segmentation", > +] > + > +[[package]] > +name =3D "iced_renderer" > +version =3D "0.13.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "73558208059f9e622df2bf434e044ee2f838ce75201a023cf0ca3e12= 44f46c2a" > +dependencies =3D [ > + "iced_graphics", > + "iced_tiny_skia", > + "iced_wgpu", > + "log", > + "thiserror 1.0.69", > +] > + > +[[package]] > +name =3D "iced_runtime" > +version =3D "0.13.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "348b5b2c61c934d88ca3b0ed1ed913291e923d086a66fa288ce9669d= a9ef62b5" > +dependencies =3D [ > + "bytes", > + "iced_core", > + "iced_futures", > + "raw-window-handle", > + "thiserror 1.0.69", > +] > + > +[[package]] > +name =3D "iced_term" > +version =3D "0.6.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a75dd9ece683674e3d83f422516b08978eead151acec63aa3360bc38= b75338b7" > +dependencies =3D [ > + "alacritty_terminal", > + "anyhow", > + "iced", > + "iced_core", > + "iced_graphics", > + "open", > + "tokio", > +] > + > +[[package]] > +name =3D "iced_tiny_skia" > +version =3D "0.13.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c625d368284fcc43b0b36b176f76eff1abebe7959dd58bd8ce6897d6= 41962a50" > +dependencies =3D [ > + "bytemuck", > + "cosmic-text", > + "iced_graphics", > + "kurbo", > + "log", > + "rustc-hash 2.1.1", > + "softbuffer", > + "tiny-skia", > +] > + > +[[package]] > +name =3D "iced_wgpu" > +version =3D "0.13.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "15708887133671d2bcc6c1d01d1f176f43a64d6cdc3b2bf893396c3e= e498295f" > +dependencies =3D [ > + "bitflags 2.10.0", > + "bytemuck", > + "futures", > + "glam", > + "guillotiere", > + "iced_glyphon", > + "iced_graphics", > + "log", > + "lyon", > + "once_cell", > + "rustc-hash 2.1.1", > + "thiserror 1.0.69", > + "wgpu", > +] > + > +[[package]] > +name =3D "iced_widget" > +version =3D "0.13.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "81429e1b950b0e4bca65be4c4278fea6678ea782030a411778f26fa9= f8983e1d" > +dependencies =3D [ > + "iced_renderer", > + "iced_runtime", > + "num-traits", > + "once_cell", > + "ouroboros", > + "rustc-hash 2.1.1", > + "thiserror 1.0.69", > + "unicode-segmentation", > +] > + > +[[package]] > +name =3D "iced_winit" > +version =3D "0.13.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f44cd4e1c594b6334f409282937bf972ba14d31fedf03c23aa595d98= 2a2fda28" > +dependencies =3D [ > + "iced_futures", > + "iced_graphics", > + "iced_runtime", > + "log", > + "rustc-hash 2.1.1", > + "thiserror 1.0.69", > + "tracing", > + "wasm-bindgen-futures", > + "web-sys", > + "winapi", > + "window_clipboard", > + "winit", > +] > + > +[[package]] > +name =3D "image" > +version =3D "0.24.9" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feb= a2c9f69d" > +dependencies =3D [ > + "bytemuck", > + "byteorder", > + "color_quant", > + "exr", > + "gif", > + "jpeg-decoder", > + "num-traits", > + "png", > + "qoi", > + "tiff", > +] > + > +[[package]] > +name =3D "indexmap" > +version =3D "2.12.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3= ce74acf2" > +dependencies =3D [ > + "equivalent", > + "hashbrown 0.16.1", > +] > + > +[[package]] > +name =3D "instant" > +version =3D "0.1.13" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5= ff3c0222" > +dependencies =3D [ > + "cfg-if", > +] > + > +[[package]] > +name =3D "io-lifetimes" > +version =3D "1.0.11" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e= 3e2df0c2" > +dependencies =3D [ > + "hermit-abi 0.3.9", > + "libc", > + "windows-sys 0.48.0", > +] > + > +[[package]] > +name =3D "is-docker" > +version =3D "0.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464= 765ed1b3" > +dependencies =3D [ > + "once_cell", > +] > + > +[[package]] > +name =3D "is-wsl" > +version =3D "0.4.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521= f02d7aa5" > +dependencies =3D [ > + "is-docker", > + "once_cell", > +] > + > +[[package]] > +name =3D "itertools" > +version =3D "0.14.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd= 03351285" > +dependencies =3D [ > + "either", > +] > + > +[[package]] > +name =3D "itoa" > +version =3D "1.0.15" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f2= 67928e2c" > + > +[[package]] > +name =3D "jni" > +version =3D "0.21.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491= a7fb8c97" > +dependencies =3D [ > + "cesu8", > + "cfg-if", > + "combine", > + "jni-sys", > + "log", > + "thiserror 1.0.69", > + "walkdir", > + "windows-sys 0.45.0", > +] > + > +[[package]] > +name =3D "jni-sys" > +version =3D "0.3.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7= d3fa0130" > + > +[[package]] > +name =3D "jobserver" > +version =3D "0.1.34" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4c= a9039d33" > +dependencies =3D [ > + "getrandom 0.3.4", > + "libc", > +] > + > +[[package]] > +name =3D "jpeg-decoder" > +version =3D "0.3.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b61793265= 33011a07" > +dependencies =3D [ > + "rayon", > +] > + > +[[package]] > +name =3D "js-sys" > +version =3D "0.3.82" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391= cf9f8e65" > +dependencies =3D [ > + "once_cell", > + "wasm-bindgen", > +] > + > +[[package]] > +name =3D "kamadak-exif" > +version =3D "0.5.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ef4fc70d0ab7e5b6bafa30216a6b48705ea964cdfc29c050f2412295= eba58077" > +dependencies =3D [ > + "mutate_once", > +] > + > +[[package]] > +name =3D "khronos-egl" > +version =3D "6.0.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60= 416fdf76" > +dependencies =3D [ > + "libc", > + "libloading 0.8.9", > + "pkg-config", > +] > + > +[[package]] > +name =3D "khronos_api" > +version =3D "3.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a945= 6b911ddc" > + > +[[package]] > +name =3D "kurbo" > +version =3D "0.10.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1618d4ebd923e97d67e7cd363d80aef35fe961005cbbbb3d2dad8bdd= 1bc63440" > +dependencies =3D [ > + "arrayvec", > + "smallvec", > +] > + > +[[package]] > +name =3D "lebe" > +version =3D "0.5.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66= 294b85b8" > + > +[[package]] > +name =3D "libc" > +version =3D "0.2.177" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf= 92b15976" > + > +[[package]] > +name =3D "libloading" > +version =3D "0.7.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d= 2d638b9f" > +dependencies =3D [ > + "cfg-if", > + "winapi", > +] > + > +[[package]] > +name =3D "libloading" > +version =3D "0.8.9" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c8= 25efdc55" > +dependencies =3D [ > + "cfg-if", > + "windows-link", > +] > + > +[[package]] > +name =3D "libm" > +version =3D "0.2.15" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b0974= 81fb97de" > + > +[[package]] > +name =3D "libredox" > +version =3D "0.1.10" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8= 088d5ccb" > +dependencies =3D [ > + "bitflags 2.10.0", > + "libc", > + "redox_syscall 0.5.18", > +] > + > +[[package]] > +name =3D "linux-raw-sys" > +version =3D "0.3.8" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb1= 5e5c1519" > + > +[[package]] > +name =3D "linux-raw-sys" > +version =3D "0.4.15" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a073= 9ec807ab" > + > +[[package]] > +name =3D "linux-raw-sys" > +version =3D "0.6.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f2= 7f6063d7" > + > +[[package]] > +name =3D "linux-raw-sys" > +version =3D "0.11.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b64= 2de8f039" > + > +[[package]] > +name =3D "lock_api" > +version =3D "0.4.14" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d= 3aace965" > +dependencies =3D [ > + "scopeguard", > +] > + > +[[package]] > +name =3D "log" > +version =3D "0.4.28" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97e= f3bf7432" > + > +[[package]] > +name =3D "lru" > +version =3D "0.12.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e= 1f3b2a38" > + > +[[package]] > +name =3D "lsblk" > +version =3D "0.6.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "05f50cb1109b79638b78a02ac752040c3e6b649f06e00e4587660fd4= 408d6a26" > +dependencies =3D [ > + "paste", > + "thiserror 2.0.17", > +] > + > +[[package]] > +name =3D "lyon" > +version =3D "1.0.16" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "dbcb7d54d54c8937364c9d41902d066656817dce1e03a44e5533afeb= d1ef4352" > +dependencies =3D [ > + "lyon_algorithms", > + "lyon_tessellation", > +] > + > +[[package]] > +name =3D "lyon_algorithms" > +version =3D "1.0.16" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f4c0829e28c4f336396f250d850c3987e16ce6db057ffe047ce0dd54= aab6b647" > +dependencies =3D [ > + "lyon_path", > + "num-traits", > +] > + > +[[package]] > +name =3D "lyon_geom" > +version =3D "1.0.18" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e260b6de923e6e47adfedf6243013a7a874684165a6a277594ee3906= 021b2343" > +dependencies =3D [ > + "arrayvec", > + "euclid", > + "num-traits", > +] > + > +[[package]] > +name =3D "lyon_path" > +version =3D "1.0.16" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1aeca86bcfd632a15984ba029b539ffb811e0a70bf55e814ef8b0f54= f506fdeb" > +dependencies =3D [ > + "lyon_geom", > + "num-traits", > +] > + > +[[package]] > +name =3D "lyon_tessellation" > +version =3D "1.0.16" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f3f586142e1280335b1bc89539f7c97dd80f08fc43e9ab1b74ef0a42= b04aa353" > +dependencies =3D [ > + "float_next_after", > + "lyon_path", > + "num-traits", > +] > + > +[[package]] > +name =3D "malloc_buf" > +version =3D "0.0.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84= e43919cb" > +dependencies =3D [ > + "libc", > +] > + > +[[package]] > +name =3D "memchr" > +version =3D "2.7.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6b= dc4cc273" > + > +[[package]] > +name =3D "memmap2" > +version =3D "0.9.9" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b= 4177d490" > +dependencies =3D [ > + "libc", > +] > + > +[[package]] > +name =3D "memoffset" > +version =3D "0.9.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695= 203f218a" > +dependencies =3D [ > + "autocfg", > +] > + > +[[package]] > +name =3D "metal" > +version =3D "0.27.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf= 83217f25" > +dependencies =3D [ > + "bitflags 2.10.0", > + "block", > + "core-graphics-types 0.1.3", > + "foreign-types", > + "log", > + "objc", > + "paste", > +] > + > +[[package]] > +name =3D "miniz_oxide" > +version =3D "0.8.9" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca85= 5ebb6316" > +dependencies =3D [ > + "adler2", > + "simd-adler32", > +] > + > +[[package]] > +name =3D "mio" > +version =3D "1.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639= b0092873" > +dependencies =3D [ > + "libc", > + "wasi", > + "windows-sys 0.61.2", > +] > + > +[[package]] > +name =3D "miow" > +version =3D "0.6.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "536bfad37a309d62069485248eeaba1e8d9853aaf951caaeaed0585a= 95346f08" > +dependencies =3D [ > + "windows-sys 0.61.2", > +] > + > +[[package]] > +name =3D "mutate_once" > +version =3D "0.1.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268= be27d2af" > + > +[[package]] > +name =3D "naga" > +version =3D "0.19.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c= 9e130843" > +dependencies =3D [ > + "bit-set", > + "bitflags 2.10.0", > + "codespan-reporting", > + "hexf-parse", > + "indexmap", > + "log", > + "num-traits", > + "rustc-hash 1.1.0", > + "spirv", > + "termcolor", > + "thiserror 1.0.69", > + "unicode-xid", > +] > + > +[[package]] > +name =3D "ndk" > +version =3D "0.9.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012= ebfd62d4" > +dependencies =3D [ > + "bitflags 2.10.0", > + "jni-sys", > + "log", > + "ndk-sys 0.6.0+11769913", > + "num_enum", > + "raw-window-handle", > + "thiserror 1.0.69", > +] > + > +[[package]] > +name =3D "ndk-context" > +version =3D "0.1.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8d= db884a8b" > + > +[[package]] > +name =3D "ndk-sys" > +version =3D "0.5.0+25.2.9519653" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd0407= 38ef7691" > +dependencies =3D [ > + "jni-sys", > +] > + > +[[package]] > +name =3D "ndk-sys" > +version =3D "0.6.0+11769913" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828= afc9a873" > +dependencies =3D [ > + "jni-sys", > +] > + > +[[package]] > +name =3D "nix" > +version =3D "0.29.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9c= f4b17b46" > +dependencies =3D [ > + "bitflags 2.10.0", > + "cfg-if", > + "cfg_aliases 0.2.1", > + "libc", > + "memoffset", > +] > + > +[[package]] > +name =3D "num-format" > +version =3D "0.4.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e10= 56ac72c3" > +dependencies =3D [ > + "arrayvec", > + "itoa", > +] > + > +[[package]] > +name =3D "num-traits" > +version =3D "0.2.19" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd9= 60262841" > +dependencies =3D [ > + "autocfg", > + "libm", > +] > + > +[[package]] > +name =3D "num_cpus" > +version =3D "1.17.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367= e957b23b" > +dependencies =3D [ > + "hermit-abi 0.5.2", > + "libc", > +] > + > +[[package]] > +name =3D "num_enum" > +version =3D "0.7.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e1= 9e82454c" > +dependencies =3D [ > + "num_enum_derive", > + "rustversion", > +] > + > +[[package]] > +name =3D "num_enum_derive" > +version =3D "0.7.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4= fe6ba4d7" > +dependencies =3D [ > + "proc-macro-crate", > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "objc" > +version =3D "0.2.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4= a77177b1" > +dependencies =3D [ > + "malloc_buf", > + "objc_exception", > +] > + > +[[package]] > +name =3D "objc-sys" > +version =3D "0.3.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d= 7c7e4310" > + > +[[package]] > +name =3D "objc2" > +version =3D "0.5.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d= 9a50b804" > +dependencies =3D [ > + "objc-sys", > + "objc2-encode", > +] > + > +[[package]] > +name =3D "objc2-app-kit" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d415= 68891eff" > +dependencies =3D [ > + "bitflags 2.10.0", > + "block2", > + "libc", > + "objc2", > + "objc2-core-data", > + "objc2-core-image", > + "objc2-foundation", > + "objc2-quartz-core", > +] > + > +[[package]] > +name =3D "objc2-cloud-kit" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221cc= ea96b009" > +dependencies =3D [ > + "bitflags 2.10.0", > + "block2", > + "objc2", > + "objc2-core-location", > + "objc2-foundation", > +] > + > +[[package]] > +name =3D "objc2-contacts" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e= 44aa4889" > +dependencies =3D [ > + "block2", > + "objc2", > + "objc2-foundation", > +] > + > +[[package]] > +name =3D "objc2-core-data" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aea= e54773ef" > +dependencies =3D [ > + "bitflags 2.10.0", > + "block2", > + "objc2", > + "objc2-foundation", > +] > + > +[[package]] > +name =3D "objc2-core-image" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e81= 96d34c80" > +dependencies =3D [ > + "block2", > + "objc2", > + "objc2-foundation", > + "objc2-metal", > +] > + > +[[package]] > +name =3D "objc2-core-location" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317= b37e5781" > +dependencies =3D [ > + "block2", > + "objc2", > + "objc2-contacts", > + "objc2-foundation", > +] > + > +[[package]] > +name =3D "objc2-encode" > +version =3D "4.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cb= c89d0c33" > + > +[[package]] > +name =3D "objc2-foundation" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452d= cf89d5a8" > +dependencies =3D [ > + "bitflags 2.10.0", > + "block2", > + "dispatch", > + "libc", > + "objc2", > +] > + > +[[package]] > +name =3D "objc2-link-presentation" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b00= 20261398" > +dependencies =3D [ > + "block2", > + "objc2", > + "objc2-app-kit", > + "objc2-foundation", > +] > + > +[[package]] > +name =3D "objc2-metal" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c= 8c7aadd6" > +dependencies =3D [ > + "bitflags 2.10.0", > + "block2", > + "objc2", > + "objc2-foundation", > +] > + > +[[package]] > +name =3D "objc2-quartz-core" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c96= 0242dc7a" > +dependencies =3D [ > + "bitflags 2.10.0", > + "block2", > + "objc2", > + "objc2-foundation", > + "objc2-metal", > +] > + > +[[package]] > +name =3D "objc2-symbols" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5= a78404dc" > +dependencies =3D [ > + "objc2", > + "objc2-foundation", > +] > + > +[[package]] > +name =3D "objc2-ui-kit" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3= 512e2b6f" > +dependencies =3D [ > + "bitflags 2.10.0", > + "block2", > + "objc2", > + "objc2-cloud-kit", > + "objc2-core-data", > + "objc2-core-image", > + "objc2-core-location", > + "objc2-foundation", > + "objc2-link-presentation", > + "objc2-quartz-core", > + "objc2-symbols", > + "objc2-uniform-type-identifiers", > + "objc2-user-notifications", > +] > + > +[[package]] > +name =3D "objc2-uniform-type-identifiers" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be= 26273bfe" > +dependencies =3D [ > + "block2", > + "objc2", > + "objc2-foundation", > +] > + > +[[package]] > +name =3D "objc2-user-notifications" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73d= b8d84cb3" > +dependencies =3D [ > + "bitflags 2.10.0", > + "block2", > + "objc2", > + "objc2-core-location", > + "objc2-foundation", > +] > + > +[[package]] > +name =3D "objc_exception" > +version =3D "0.1.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f= 6bab2ca4" > +dependencies =3D [ > + "cc", > +] > + > +[[package]] > +name =3D "once_cell" > +version =3D "1.21.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4= e8393d2d" > + > +[[package]] > +name =3D "open" > +version =3D "5.3.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513= d40024bc" > +dependencies =3D [ > + "is-wsl", > + "libc", > + "pathdiff", > +] > + > +[[package]] > +name =3D "orbclient" > +version =3D "0.3.49" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "247ad146e19b9437f8604c21f8652423595cf710ad108af40e77d3ae= 6e96b827" > +dependencies =3D [ > + "libredox", > +] > + > +[[package]] > +name =3D "ordered-multimap" > +version =3D "0.4.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd53= 44d8924a" > +dependencies =3D [ > + "dlv-list", > + "hashbrown 0.12.3", > +] > + > +[[package]] > +name =3D "ordered-stream" > +version =3D "0.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093= cced1d50" > +dependencies =3D [ > + "futures-core", > + "pin-project-lite", > +] > + > +[[package]] > +name =3D "ouroboros" > +version =3D "0.18.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa1171= 3744be59" > +dependencies =3D [ > + "aliasable", > + "ouroboros_macro", > + "static_assertions", > +] > + > +[[package]] > +name =3D "ouroboros_macro" > +version =3D "0.18.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268= b41e64d0" > +dependencies =3D [ > + "heck", > + "proc-macro2", > + "proc-macro2-diagnostics", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "owned_ttf_parser" > +version =3D "0.25.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc2= 16fb583b" > +dependencies =3D [ > + "ttf-parser 0.25.1", > +] > + > +[[package]] > +name =3D "palette" > +version =3D "0.7.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3= ab00b6e6" > +dependencies =3D [ > + "approx", > + "fast-srgb8", > + "palette_derive", > + "phf", > +] > + > +[[package]] > +name =3D "palette_derive" > +version =3D "0.7.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631b= e6851d30" > +dependencies =3D [ > + "by_address", > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "parking" > +version =3D "2.2.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e37= 7f7dceba" > + > +[[package]] > +name =3D "parking_lot" > +version =3D "0.11.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be= 0271ff99" > +dependencies =3D [ > + "instant", > + "lock_api", > + "parking_lot_core 0.8.6", > +] > + > +[[package]] > +name =3D "parking_lot" > +version =3D "0.12.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac= 12c45a1a" > +dependencies =3D [ > + "lock_api", > + "parking_lot_core 0.9.12", > +] > + > +[[package]] > +name =3D "parking_lot_core" > +version =3D "0.8.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90= 177356dc" > +dependencies =3D [ > + "cfg-if", > + "instant", > + "libc", > + "redox_syscall 0.2.16", > + "smallvec", > + "winapi", > +] > + > +[[package]] > +name =3D "parking_lot_core" > +version =3D "0.9.12" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3= dfcb64c1" > +dependencies =3D [ > + "cfg-if", > + "libc", > + "redox_syscall 0.5.18", > + "smallvec", > + "windows-link", > +] > + > +[[package]] > +name =3D "paste" > +version =3D "1.0.15" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddc= ae73fd0a" > + > +[[package]] > +name =3D "pathdiff" > +version =3D "0.2.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae1570= 23b938d3" > + > +[[package]] > +name =3D "percent-encoding" > +version =3D "2.3.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c14= 55d87220" > + > +[[package]] > +name =3D "phf" > +version =3D "0.11.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2= c2edd078" > +dependencies =3D [ > + "phf_macros", > + "phf_shared", > +] > + > +[[package]] > +name =3D "phf_generator" > +version =3D "0.11.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4= cfb5843d" > +dependencies =3D [ > + "phf_shared", > + "rand", > +] > + > +[[package]] > +name =3D "phf_macros" > +version =3D "0.11.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2= fc727216" > +dependencies =3D [ > + "phf_generator", > + "phf_shared", > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "phf_shared" > +version =3D "0.11.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201= b7a754e5" > +dependencies =3D [ > + "siphasher", > +] > + > +[[package]] > +name =3D "pin-project" > +version =3D "1.1.10" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485ea= ec6a6a8a" > +dependencies =3D [ > + "pin-project-internal", > +] > + > +[[package]] > +name =3D "pin-project-internal" > +version =3D "1.1.10" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207= a8fbf861" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "pin-project-lite" > +version =3D "0.2.16" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76= fe619f9b" > + > +[[package]] > +name =3D "pin-utils" > +version =3D "0.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaa= f7c9f184" > + > +[[package]] > +name =3D "piper" > +version =3D "0.2.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350= a5acc066" > +dependencies =3D [ > + "atomic-waker", > + "fastrand 2.3.0", > + "futures-io", > +] > + > +[[package]] > +name =3D "pkg-config" > +version =3D "0.3.32" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fd= ed1b904c" > + > +[[package]] > +name =3D "png" > +version =3D "0.17.16" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697= 749d7526" > +dependencies =3D [ > + "bitflags 1.3.2", > + "crc32fast", > + "fdeflate", > + "flate2", > + "miniz_oxide", > +] > + > +[[package]] > +name =3D "polling" > +version =3D "2.8.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815= b0eb3dce" > +dependencies =3D [ > + "autocfg", > + "bitflags 1.3.2", > + "cfg-if", > + "concurrent-queue", > + "libc", > + "log", > + "pin-project-lite", > + "windows-sys 0.48.0", > +] > + > +[[package]] > +name =3D "polling" > +version =3D "3.11.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd8= 97c34218" > +dependencies =3D [ > + "cfg-if", > + "concurrent-queue", > + "hermit-abi 0.5.2", > + "pin-project-lite", > + "rustix 1.1.2", > + "windows-sys 0.61.2", > +] > + > +[[package]] > +name =3D "ppv-lite86" > +version =3D "0.2.21" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2= b1e97da9" > +dependencies =3D [ > + "zerocopy", > +] > + > +[[package]] > +name =3D "presser" > +version =3D "0.3.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea60= 50c77bfa" > + > +[[package]] > +name =3D "proc-macro-crate" > +version =3D "3.4.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b= 4ac46983" > +dependencies =3D [ > + "toml_edit", > +] > + > +[[package]] > +name =3D "proc-macro2" > +version =3D "1.0.103" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00e= c45f49e8" > +dependencies =3D [ > + "unicode-ident", > +] > + > +[[package]] > +name =3D "proc-macro2-diagnostics" > +version =3D "0.10.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80= d88d88c8" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > + "version_check", > + "yansi", > +] > + > +[[package]] > +name =3D "profiling" > +version =3D "1.0.17" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba= 42341773" > + > +[[package]] > +name =3D "qoi" > +version =3D "0.4.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910= d6e48001" > +dependencies =3D [ > + "bytemuck", > +] > + > +[[package]] > +name =3D "quick-xml" > +version =3D "0.37.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1= f269b7fb" > +dependencies =3D [ > + "memchr", > +] > + > +[[package]] > +name =3D "quote" > +version =3D "1.0.42" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd8= 0ef3067f" > +dependencies =3D [ > + "proc-macro2", > +] > + > +[[package]] > +name =3D "r-efi" > +version =3D "5.3.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f3= 46754b0f" > + > +[[package]] > +name =3D "rand" > +version =3D "0.8.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b= 46327404" > +dependencies =3D [ > + "libc", > + "rand_chacha", > + "rand_core", > +] > + > +[[package]] > +name =3D "rand_chacha" > +version =3D "0.3.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b= 9b127d88" > +dependencies =3D [ > + "ppv-lite86", > + "rand_core", > +] > + > +[[package]] > +name =3D "rand_core" > +version =3D "0.6.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5= c816922c" > +dependencies =3D [ > + "getrandom 0.2.16", > +] > + > +[[package]] > +name =3D "range-alloc" > +version =3D "0.1.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5= ccca9bde" > + > +[[package]] > +name =3D "rangemap" > +version =3D "1.7.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "acbbbbea733ec66275512d0b9694f34102e7d5406fdbe2ad8d21b28d= ce92887c" > + > +[[package]] > +name =3D "raw-window-handle" > +version =3D "0.6.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c5988= 8861c539" > + > +[[package]] > +name =3D "rayon" > +version =3D "1.11.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c= 5677a58f" > +dependencies =3D [ > + "either", > + "rayon-core", > +] > + > +[[package]] > +name =3D "rayon-core" > +version =3D "1.13.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d84= 35c8ab91" > +dependencies =3D [ > + "crossbeam-deque", > + "crossbeam-utils", > +] > + > +[[package]] > +name =3D "read-fonts" > +version =3D "0.22.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "69aacb76b5c29acfb7f90155d39759a29496aebb49395830e928a970= 3d2eec2f" > +dependencies =3D [ > + "bytemuck", > + "font-types", > +] > + > +[[package]] > +name =3D "redox_syscall" > +version =3D "0.2.16" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb69= 5265519a" > +dependencies =3D [ > + "bitflags 1.3.2", > +] > + > +[[package]] > +name =3D "redox_syscall" > +version =3D "0.4.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56= be7731aa" > +dependencies =3D [ > + "bitflags 1.3.2", > +] > + > +[[package]] > +name =3D "redox_syscall" > +version =3D "0.5.18" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae= 3f1a362d" > +dependencies =3D [ > + "bitflags 2.10.0", > +] > + > +[[package]] > +name =3D "redox_users" > +version =3D "0.4.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d3= 3b13ca43" > +dependencies =3D [ > + "getrandom 0.2.16", > + "libredox", > + "thiserror 1.0.69", > +] > + > +[[package]] > +name =3D "regex-automata" > +version =3D "0.4.13" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b= 84041f1c" > +dependencies =3D [ > + "aho-corasick", > + "memchr", > + "regex-syntax", > +] > + > +[[package]] > +name =3D "regex-syntax" > +version =3D "0.8.8" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430= af7def58" > + > +[[package]] > +name =3D "renderdoc-sys" > +version =3D "1.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179= b4fc4832" > + > +[[package]] > +name =3D "roxmltree" > +version =3D "0.20.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a4= 6f487c97" > + > +[[package]] > +name =3D "rust-ini" > +version =3D "0.18.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d71671354= 0715a2df" > +dependencies =3D [ > + "cfg-if", > + "ordered-multimap", > +] > + > +[[package]] > +name =3D "rustc-hash" > +version =3D "1.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9a= e12c6ce2" > + > +[[package]] > +name =3D "rustc-hash" > +version =3D "2.1.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4= 362dff0d" > + > +[[package]] > +name =3D "rustix" > +version =3D "0.37.28" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "519165d378b97752ca44bbe15047d5d3409e875f39327546b42ac81d= 7e18c1b6" > +dependencies =3D [ > + "bitflags 1.3.2", > + "errno", > + "io-lifetimes", > + "libc", > + "linux-raw-sys 0.3.8", > + "windows-sys 0.48.0", > +] > + > +[[package]] > +name =3D "rustix" > +version =3D "0.38.44" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d112= 20d8c154" > +dependencies =3D [ > + "bitflags 2.10.0", > + "errno", > + "libc", > + "linux-raw-sys 0.4.15", > + "windows-sys 0.59.0", > +] > + > +[[package]] > +name =3D "rustix" > +version =3D "1.1.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd7= 0719ff3e" > +dependencies =3D [ > + "bitflags 2.10.0", > + "errno", > + "libc", > + "linux-raw-sys 0.11.0", > + "windows-sys 0.61.2", > +] > + > +[[package]] > +name =3D "rustix-openpty" > +version =3D "0.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1de16c7c59892b870a6336f185dc10943517f1327447096bbb7bb32c= d85e2393" > +dependencies =3D [ > + "errno", > + "libc", > + "rustix 1.1.2", > +] > + > +[[package]] > +name =3D "rustversion" > +version =3D "1.0.22" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d= 2538d46d" > + > +[[package]] > +name =3D "rustybuzz" > +version =3D "0.14.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431= adc8b55c" > +dependencies =3D [ > + "bitflags 2.10.0", > + "bytemuck", > + "libm", > + "smallvec", > + "ttf-parser 0.21.1", > + "unicode-bidi-mirroring", > + "unicode-ccc", > + "unicode-properties", > + "unicode-script", > +] > + > +[[package]] > +name =3D "same-file" > +version =3D "1.0.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b683= 78900502" > +dependencies =3D [ > + "winapi-util", > +] > + > +[[package]] > +name =3D "scoped-tls" > +version =3D "1.0.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a= 0024a294" > + > +[[package]] > +name =3D "scopeguard" > +version =3D "1.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe43= 9a4e9f49" > + > +[[package]] > +name =3D "sctk-adwaita" > +version =3D "0.10.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d79= 2ede24ec" > +dependencies =3D [ > + "ab_glyph", > + "log", > + "memmap2", > + "smithay-client-toolkit 0.19.2", > + "tiny-skia", > +] > + > +[[package]] > +name =3D "self_cell" > +version =3D "1.2.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "16c2f82143577edb4921b71ede051dac62ca3c16084e918bf7b40c96= ae10eb33" > + > +[[package]] > +name =3D "serde" > +version =3D "1.0.228" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e= 2124ae9e" > +dependencies =3D [ > + "serde_core", > + "serde_derive", > +] > + > +[[package]] > +name =3D "serde_core" > +version =3D "1.0.228" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de= 458b67ad" > +dependencies =3D [ > + "serde_derive", > +] > + > +[[package]] > +name =3D "serde_derive" > +version =3D "1.0.228" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d540f220d3187173da220f885ab66608367b6574e925011a9353e4ba= dda91d79" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "serde_repr" > +version =3D "0.1.20" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37= b47ea59c" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "sha1" > +version =3D "0.10.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f0= 1cedd6ba" > +dependencies =3D [ > + "cfg-if", > + "cpufeatures", > + "digest", > +] > + > +[[package]] > +name =3D "shlex" > +version =3D "1.3.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023= f6323e64" > + > +[[package]] > +name =3D "signal-hook" > +version =3D "0.3.18" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1= 085ed6e2" > +dependencies =3D [ > + "libc", > + "signal-hook-registry", > +] > + > +[[package]] > +name =3D "signal-hook-registry" > +version =3D "1.4.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca2= 6bd8c28b" > +dependencies =3D [ > + "libc", > +] > + > +[[package]] > +name =3D "simd-adler32" > +version =3D "0.3.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38= 182078fe" > + > +[[package]] > +name =3D "siphasher" > +version =3D "1.0.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82a= d029c39d" > + > +[[package]] > +name =3D "skrifa" > +version =3D "0.22.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8e1c44ad1f6c5bdd4eefed8326711b7dbda9ea45dfd36068c427d332= aa382cbe" > +dependencies =3D [ > + "bytemuck", > + "read-fonts", > +] > + > +[[package]] > +name =3D "slab" > +version =3D "0.4.11" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c= 90267589" > + > +[[package]] > +name =3D "slotmap" > +version =3D "1.0.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed164= 9d58b82a" > +dependencies =3D [ > + "version_check", > +] > + > +[[package]] > +name =3D "smallvec" > +version =3D "1.15.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb77= 7b6fbd03" > + > +[[package]] > +name =3D "smithay-client-toolkit" > +version =3D "0.19.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd846= 1e2c0016" > +dependencies =3D [ > + "bitflags 2.10.0", > + "calloop 0.13.0", > + "calloop-wayland-source 0.3.0", > + "cursor-icon", > + "libc", > + "log", > + "memmap2", > + "rustix 0.38.44", > + "thiserror 1.0.69", > + "wayland-backend", > + "wayland-client", > + "wayland-csd-frame", > + "wayland-cursor", > + "wayland-protocols", > + "wayland-protocols-wlr", > + "wayland-scanner", > + "xkeysym", > +] > + > +[[package]] > +name =3D "smithay-client-toolkit" > +version =3D "0.20.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a8= 2b534cc0" > +dependencies =3D [ > + "bitflags 2.10.0", > + "calloop 0.14.3", > + "calloop-wayland-source 0.4.1", > + "cursor-icon", > + "libc", > + "log", > + "memmap2", > + "rustix 1.1.2", > + "thiserror 2.0.17", > + "wayland-backend", > + "wayland-client", > + "wayland-csd-frame", > + "wayland-cursor", > + "wayland-protocols", > + "wayland-protocols-experimental", > + "wayland-protocols-misc", > + "wayland-protocols-wlr", > + "wayland-scanner", > + "xkeysym", > +] > + > +[[package]] > +name =3D "smithay-clipboard" > +version =3D "0.7.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9= dba81226" > +dependencies =3D [ > + "libc", > + "smithay-client-toolkit 0.20.0", > + "wayland-backend", > +] > + > +[[package]] > +name =3D "smol" > +version =3D "1.3.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "13f2b548cd8447f8de0fdf1c592929f70f4fc7039a05e47404b0d096= ec6987a1" > +dependencies =3D [ > + "async-channel 1.9.0", > + "async-executor", > + "async-fs 1.6.0", > + "async-io 1.13.0", > + "async-lock 2.8.0", > + "async-net", > + "async-process 1.8.1", > + "blocking", > + "futures-lite 1.13.0", > +] > + > +[[package]] > +name =3D "smol_str" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d= 1ca6dead" > +dependencies =3D [ > + "serde", > +] > + > +[[package]] > +name =3D "socket2" > +version =3D "0.4.10" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de= 48994c0d" > +dependencies =3D [ > + "libc", > + "winapi", > +] > + > +[[package]] > +name =3D "socket2" > +version =3D "0.6.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "17129e116933cf371d018bb80ae557e889637989d8638274fb256228= 27b03881" > +dependencies =3D [ > + "libc", > + "windows-sys 0.60.2", > +] > + > +[[package]] > +name =3D "softbuffer" > +version =3D "0.4.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a7= 7931bb08" > +dependencies =3D [ > + "as-raw-xcb-connection", > + "bytemuck", > + "cfg_aliases 0.2.1", > + "core-graphics 0.24.0", > + "drm", > + "fastrand 2.3.0", > + "foreign-types", > + "js-sys", > + "log", > + "memmap2", > + "objc2", > + "objc2-foundation", > + "objc2-quartz-core", > + "raw-window-handle", > + "redox_syscall 0.5.18", > + "rustix 0.38.44", > + "tiny-xlib", > + "wasm-bindgen", > + "wayland-backend", > + "wayland-client", > + "wayland-sys", > + "web-sys", > + "windows-sys 0.59.0", > + "x11rb", > +] > + > +[[package]] > +name =3D "spectrum-installer" > +version =3D "0.1.0" > +dependencies =3D [ > + "iced", > + "iced_aw", > + "iced_fonts 0.2.1", > + "iced_term", > + "lsblk", > +] > + > +[[package]] > +name =3D "spirv" > +version =3D "0.3.0+sdk-1.3.268.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbd= fd917844" > +dependencies =3D [ > + "bitflags 2.10.0", > +] > + > +[[package]] > +name =3D "static_assertions" > +version =3D "1.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c0= 6b37543f" > + > +[[package]] > +name =3D "strict-num" > +version =3D "0.1.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a305= 77a06731" > + > +[[package]] > +name =3D "svg_fmt" > +version =3D "0.4.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3a= cf9e02fb" > + > +[[package]] > +name =3D "swash" > +version =3D "0.1.19" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "cbd59f3f359ddd2c95af4758c18270eddd9c730dde98598023cdabff= 472c2ca2" > +dependencies =3D [ > + "skrifa", > + "yazi", > + "zeno", > +] > + > +[[package]] > +name =3D "syn" > +version =3D "1.0.109" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160= 888b4237" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "unicode-ident", > +] > + > +[[package]] > +name =3D "syn" > +version =3D "2.0.110" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e601= 5b280aea" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "unicode-ident", > +] > + > +[[package]] > +name =3D "sys-locale" > +version =3D "0.3.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259= 138626c4" > +dependencies =3D [ > + "libc", > +] > + > +[[package]] > +name =3D "tempfile" > +version =3D "3.23.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a= 9fa02f16" > +dependencies =3D [ > + "fastrand 2.3.0", > + "getrandom 0.3.4", > + "once_cell", > + "rustix 1.1.2", > + "windows-sys 0.61.2", > +] > + > +[[package]] > +name =3D "termcolor" > +version =3D "1.4.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837= a0bc5755" > +dependencies =3D [ > + "winapi-util", > +] > + > +[[package]] > +name =3D "thiserror" > +version =3D "1.0.69" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904= bc923f52" > +dependencies =3D [ > + "thiserror-impl 1.0.69", > +] > + > +[[package]] > +name =3D "thiserror" > +version =3D "2.0.17" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051= 618f4fc8" > +dependencies =3D [ > + "thiserror-impl 2.0.17", > +] > + > +[[package]] > +name =3D "thiserror-impl" > +version =3D "1.0.69" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b= 6c7504c1" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "thiserror-impl" > +version =3D "2.0.17" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7= a517c913" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "tiff" > +version =3D "0.9.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf1953= 3eed1e3e" > +dependencies =3D [ > + "flate2", > + "jpeg-decoder", > + "weezl", > +] > + > +[[package]] > +name =3D "tiny-skia" > +version =3D "0.11.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088= 497b09ab" > +dependencies =3D [ > + "arrayref", > + "arrayvec", > + "bytemuck", > + "cfg-if", > + "log", > + "png", > + "tiny-skia-path", > +] > + > +[[package]] > +name =3D "tiny-skia-path" > +version =3D "0.11.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda9= 5c5bdc93" > +dependencies =3D [ > + "arrayref", > + "bytemuck", > + "strict-num", > +] > + > +[[package]] > +name =3D "tiny-xlib" > +version =3D "0.2.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c85= 8887d89e" > +dependencies =3D [ > + "as-raw-xcb-connection", > + "ctor-lite", > + "libloading 0.8.9", > + "pkg-config", > + "tracing", > +] > + > +[[package]] > +name =3D "tinyvec" > +version =3D "1.10.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f= 1b0613fa" > +dependencies =3D [ > + "tinyvec_macros", > +] > + > +[[package]] > +name =3D "tinyvec_macros" > +version =3D "0.1.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161= d0532f20" > + > +[[package]] > +name =3D "tokio" > +version =3D "1.48.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5b= d4c68408" > +dependencies =3D [ > + "bytes", > + "libc", > + "mio", > + "parking_lot 0.12.5", > + "pin-project-lite", > + "signal-hook-registry", > + "socket2 0.6.1", > + "tokio-macros", > + "windows-sys 0.61.2", > +] > + > +[[package]] > +name =3D "tokio-macros" > +version =3D "2.6.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617= e9db9fa5" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "toml_datetime" > +version =3D "0.7.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c= 3c724533" > +dependencies =3D [ > + "serde_core", > +] > + > +[[package]] > +name =3D "toml_edit" > +version =3D "0.23.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b= 3cb98f8d" > +dependencies =3D [ > + "indexmap", > + "toml_datetime", > + "toml_parser", > + "winnow", > +] > + > +[[package]] > +name =3D "toml_parser" > +version =3D "1.0.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d0= 4039800e" > +dependencies =3D [ > + "winnow", > +] > + > +[[package]] > +name =3D "tracing" > +version =3D "0.1.41" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927= fdcfbdd0" > +dependencies =3D [ > + "log", > + "pin-project-lite", > + "tracing-attributes", > + "tracing-core", > +] > + > +[[package]] > +name =3D "tracing-attributes" > +version =3D "0.1.30" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf7= 1c5c6903" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "tracing-core" > +version =3D "0.1.34" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b= 2b617678" > +dependencies =3D [ > + "once_cell", > +] > + > +[[package]] > +name =3D "ttf-parser" > +version =3D "0.20.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6= d21d96b4" > + > +[[package]] > +name =3D "ttf-parser" > +version =3D "0.21.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f98= 9fd31cf8" > + > +[[package]] > +name =3D "ttf-parser" > +version =3D "0.25.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72ce= e8c36f31" > + > +[[package]] > +name =3D "typenum" > +version =3D "1.19.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61= d7ad82bb" > + > +[[package]] > +name =3D "uds_windows" > +version =3D "1.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e= 8bf164b9" > +dependencies =3D [ > + "memoffset", > + "tempfile", > + "winapi", > +] > + > +[[package]] > +name =3D "unicode-bidi" > +version =3D "0.3.18" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885= f5e29df5" > + > +[[package]] > +name =3D "unicode-bidi-mirroring" > +version =3D "0.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6= c5f5af86" > + > +[[package]] > +name =3D "unicode-ccc" > +version =3D "0.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6c= b4157656" > + > +[[package]] > +name =3D "unicode-ident" > +version =3D "1.0.22" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27d= c2cf1df5" > + > +[[package]] > +name =3D "unicode-linebreak" > +version =3D "0.1.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501= a190571f" > + > +[[package]] > +name =3D "unicode-properties" > +version =3D "0.1.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8c= f5a8d71d" > + > +[[package]] > +name =3D "unicode-script" > +version =3D "0.5.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d6= 62ca7c1f" > + > +[[package]] > +name =3D "unicode-segmentation" > +version =3D "1.12.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9cee= a4501493" > + > +[[package]] > +name =3D "unicode-width" > +version =3D "0.1.14" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07= f617f6af" > + > +[[package]] > +name =3D "unicode-width" > +version =3D "0.2.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6= e897f254" > + > +[[package]] > +name =3D "unicode-xid" > +version =3D "0.2.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84= fc54f853" > + > +[[package]] > +name =3D "version_check" > +version =3D "0.9.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e= 2289105a" > + > +[[package]] > +name =3D "vte" > +version =3D "0.15.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a5924018406ce0063cd67f8e008104968b74b563ee1b85dde3ed1f7c= b87d3dbd" > +dependencies =3D [ > + "arrayvec", > + "bitflags 2.10.0", > + "cursor-icon", > + "log", > + "memchr", > + "serde", > +] > + > +[[package]] > +name =3D "waker-fn" > +version =3D "1.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4= 350673b7" > + > +[[package]] > +name =3D "walkdir" > +version =3D "2.5.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d686310= 8e3a5e4b" > +dependencies =3D [ > + "same-file", > + "winapi-util", > +] > + > +[[package]] > +name =3D "wasi" > +version =3D "0.11.1+wasi-snapshot-preview1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd65= 4f4ea44b" > + > +[[package]] > +name =3D "wasip2" > +version =3D "1.0.1+wasi-0.2.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787e= f5ad58e7" > +dependencies =3D [ > + "wit-bindgen", > +] > + > +[[package]] > +name =3D "wasm-bindgen" > +version =3D "0.2.105" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625ca= a5c5ea60" > +dependencies =3D [ > + "cfg-if", > + "once_cell", > + "rustversion", > + "wasm-bindgen-macro", > + "wasm-bindgen-shared", > +] > + > +[[package]] > +name =3D "wasm-bindgen-futures" > +version =3D "0.4.55" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfb= a115d4a0" > +dependencies =3D [ > + "cfg-if", > + "js-sys", > + "once_cell", > + "wasm-bindgen", > + "web-sys", > +] > + > +[[package]] > +name =3D "wasm-bindgen-macro" > +version =3D "0.2.105" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269= adab59c2" > +dependencies =3D [ > + "quote", > + "wasm-bindgen-macro-support", > +] > + > +[[package]] > +name =3D "wasm-bindgen-macro-support" > +version =3D "0.2.105" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859= ee6c7ebc" > +dependencies =3D [ > + "bumpalo", > + "proc-macro2", > + "quote", > + "syn 2.0.110", > + "wasm-bindgen-shared", > +] > + > +[[package]] > +name =3D "wasm-bindgen-shared" > +version =3D "0.2.105" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45a= dcb6af76" > +dependencies =3D [ > + "unicode-ident", > +] > + > +[[package]] > +name =3D "wasm-timer" > +version =3D "0.2.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3e= b68c5e7f" > +dependencies =3D [ > + "futures", > + "js-sys", > + "parking_lot 0.11.2", > + "pin-utils", > + "wasm-bindgen", > + "wasm-bindgen-futures", > + "web-sys", > +] > + > +[[package]] > +name =3D "wayland-backend" > +version =3D "0.3.11" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2= e1e49b35" > +dependencies =3D [ > + "cc", > + "downcast-rs", > + "rustix 1.1.2", > + "scoped-tls", > + "smallvec", > + "wayland-sys", > +] > + > +[[package]] > +name =3D "wayland-client" > +version =3D "0.31.11" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e= 0bdd449d" > +dependencies =3D [ > + "bitflags 2.10.0", > + "rustix 1.1.2", > + "wayland-backend", > + "wayland-scanner", > +] > + > +[[package]] > +name =3D "wayland-csd-frame" > +version =3D "0.3.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c= 31ab4c7e" > +dependencies =3D [ > + "bitflags 2.10.0", > + "cursor-icon", > + "wayland-backend", > +] > + > +[[package]] > +name =3D "wayland-cursor" > +version =3D "0.31.11" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc4= 7c3eeb29" > +dependencies =3D [ > + "rustix 1.1.2", > + "wayland-client", > + "xcursor", > +] > + > +[[package]] > +name =3D "wayland-protocols" > +version =3D "0.32.9" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4a= e88d9901" > +dependencies =3D [ > + "bitflags 2.10.0", > + "wayland-backend", > + "wayland-client", > + "wayland-scanner", > +] > + > +[[package]] > +name =3D "wayland-protocols-experimental" > +version =3D "20250721.0.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c= 5a8dcbb1" > +dependencies =3D [ > + "bitflags 2.10.0", > + "wayland-backend", > + "wayland-client", > + "wayland-protocols", > + "wayland-scanner", > +] > + > +[[package]] > +name =3D "wayland-protocols-misc" > +version =3D "0.3.9" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "2dfe33d551eb8bffd03ff067a8b44bb963919157841a99957151299a= 6307d19c" > +dependencies =3D [ > + "bitflags 2.10.0", > + "wayland-backend", > + "wayland-client", > + "wayland-protocols", > + "wayland-scanner", > +] > + > +[[package]] > +name =3D "wayland-protocols-plasma" > +version =3D "0.3.9" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94= f2c2c032" > +dependencies =3D [ > + "bitflags 2.10.0", > + "wayland-backend", > + "wayland-client", > + "wayland-protocols", > + "wayland-scanner", > +] > + > +[[package]] > +name =3D "wayland-protocols-wlr" > +version =3D "0.3.9" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98d= c25b78ec" > +dependencies =3D [ > + "bitflags 2.10.0", > + "wayland-backend", > + "wayland-client", > + "wayland-protocols", > + "wayland-scanner", > +] > + > +[[package]] > +name =3D "wayland-scanner" > +version =3D "0.31.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50= caa50ae3" > +dependencies =3D [ > + "proc-macro2", > + "quick-xml", > + "quote", > +] > + > +[[package]] > +name =3D "wayland-sys" > +version =3D "0.31.7" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6dae= fc296142" > +dependencies =3D [ > + "dlib", > + "log", > + "once_cell", > + "pkg-config", > +] > + > +[[package]] > +name =3D "web-sys" > +version =3D "0.3.82" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea3391= 5c99a9a1" > +dependencies =3D [ > + "js-sys", > + "wasm-bindgen", > +] > + > +[[package]] > +name =3D "web-time" > +version =3D "1.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4= b12fa0bb" > +dependencies =3D [ > + "js-sys", > + "wasm-bindgen", > +] > + > +[[package]] > +name =3D "weezl" > +version =3D "0.1.12" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905= 610b4a88" > + > +[[package]] > +name =3D "wgpu" > +version =3D "0.19.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "cbd7311dbd2abcfebaabf1841a2824ed7c8be443a0f29166e5d3c6a5= 3a762c01" > +dependencies =3D [ > + "arrayvec", > + "cfg-if", > + "cfg_aliases 0.1.1", > + "js-sys", > + "log", > + "naga", > + "parking_lot 0.12.5", > + "profiling", > + "raw-window-handle", > + "smallvec", > + "static_assertions", > + "wasm-bindgen", > + "wasm-bindgen-futures", > + "web-sys", > + "wgpu-core", > + "wgpu-hal", > + "wgpu-types", > +] > + > +[[package]] > +name =3D "wgpu-core" > +version =3D "0.19.4" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a827= 7369bf3a" > +dependencies =3D [ > + "arrayvec", > + "bit-vec", > + "bitflags 2.10.0", > + "cfg_aliases 0.1.1", > + "codespan-reporting", > + "indexmap", > + "log", > + "naga", > + "once_cell", > + "parking_lot 0.12.5", > + "profiling", > + "raw-window-handle", > + "rustc-hash 1.1.0", > + "smallvec", > + "thiserror 1.0.69", > + "web-sys", > + "wgpu-hal", > + "wgpu-types", > +] > + > +[[package]] > +name =3D "wgpu-hal" > +version =3D "0.19.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "bfabcfc55fd86611a855816326b2d54c3b2fd7972c27ce4142915626= 50552703" > +dependencies =3D [ > + "android_system_properties", > + "arrayvec", > + "ash", > + "bit-set", > + "bitflags 2.10.0", > + "block", > + "cfg_aliases 0.1.1", > + "core-graphics-types 0.1.3", > + "d3d12", > + "glow", > + "glutin_wgl_sys", > + "gpu-alloc", > + "gpu-allocator", > + "gpu-descriptor", > + "hassle-rs", > + "js-sys", > + "khronos-egl", > + "libc", > + "libloading 0.8.9", > + "log", > + "metal", > + "naga", > + "ndk-sys 0.5.0+25.2.9519653", > + "objc", > + "once_cell", > + "parking_lot 0.12.5", > + "profiling", > + "range-alloc", > + "raw-window-handle", > + "renderdoc-sys", > + "rustc-hash 1.1.0", > + "smallvec", > + "thiserror 1.0.69", > + "wasm-bindgen", > + "web-sys", > + "wgpu-types", > + "winapi", > +] > + > +[[package]] > +name =3D "wgpu-types" > +version =3D "0.19.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d= 53969805" > +dependencies =3D [ > + "bitflags 2.10.0", > + "js-sys", > + "web-sys", > +] > + > +[[package]] > +name =3D "widestring" > +version =3D "1.2.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a3= 57c3e471" > + > +[[package]] > +name =3D "winapi" > +version =3D "0.3.9" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d2= 8b00f419" > +dependencies =3D [ > + "winapi-i686-pc-windows-gnu", > + "winapi-x86_64-pc-windows-gnu", > +] > + > +[[package]] > +name =3D "winapi-i686-pc-windows-gnu" > +version =3D "0.4.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6= ab51b7b6" > + > +[[package]] > +name =3D "winapi-util" > +version =3D "0.1.11" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503a= eba10d22" > +dependencies =3D [ > + "windows-sys 0.61.2", > +] > + > +[[package]] > +name =3D "winapi-x86_64-pc-windows-gnu" > +version =3D "0.4.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc= 1931183f" > + > +[[package]] > +name =3D "window_clipboard" > +version =3D "0.4.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f6d692d46038c433f9daee7ad8757e002a4248c20b0a3fbc991d9952= 1d3bcb6d" > +dependencies =3D [ > + "clipboard-win", > + "clipboard_macos", > + "clipboard_wayland", > + "clipboard_x11", > + "raw-window-handle", > + "thiserror 1.0.69", > +] > + > +[[package]] > +name =3D "windows" > +version =3D "0.52.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf95289= 4110d0be" > +dependencies =3D [ > + "windows-core 0.52.0", > + "windows-targets 0.52.6", > +] > + > +[[package]] > +name =3D "windows-core" > +version =3D "0.52.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08af= cfc683d9" > +dependencies =3D [ > + "windows-targets 0.52.6", > +] > + > +[[package]] > +name =3D "windows-core" > +version =3D "0.62.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4= c2be9deb" > +dependencies =3D [ > + "windows-implement", > + "windows-interface", > + "windows-link", > + "windows-result", > + "windows-strings", > +] > + > +[[package]] > +name =3D "windows-implement" > +version =3D "0.60.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f= 67855ddf" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "windows-interface" > +version =3D "0.59.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc1568870862= 3367e358" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "windows-link" > +version =3D "0.2.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e7= 0d0a4fe5" > + > +[[package]] > +name =3D "windows-result" > +version =3D "0.4.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a= 73853eb5" > +dependencies =3D [ > + "windows-link", > +] > + > +[[package]] > +name =3D "windows-strings" > +version =3D "0.5.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2c= d3b37091" > +dependencies =3D [ > + "windows-link", > +] > + > +[[package]] > +name =3D "windows-sys" > +version =3D "0.45.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52= 315b66d0" > +dependencies =3D [ > + "windows-targets 0.42.2", > +] > + > +[[package]] > +name =3D "windows-sys" > +version =3D "0.48.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857= f61056a9" > +dependencies =3D [ > + "windows-targets 0.48.5", > +] > + > +[[package]] > +name =3D "windows-sys" > +version =3D "0.52.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de07892014= 25d9a33d" > +dependencies =3D [ > + "windows-targets 0.52.6", > +] > + > +[[package]] > +name =3D "windows-sys" > +version =3D "0.59.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8= c531853b" > +dependencies =3D [ > + "windows-targets 0.52.6", > +] > + > +[[package]] > +name =3D "windows-sys" > +version =3D "0.60.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c358= 82612bcb" > +dependencies =3D [ > + "windows-targets 0.53.5", > +] > + > +[[package]] > +name =3D "windows-sys" > +version =3D "0.61.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3= 921ff3fc" > +dependencies =3D [ > + "windows-link", > +] > + > +[[package]] > +name =3D "windows-targets" > +version =3D "0.42.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d4727= 56b4d071" > +dependencies =3D [ > + "windows_aarch64_gnullvm 0.42.2", > + "windows_aarch64_msvc 0.42.2", > + "windows_i686_gnu 0.42.2", > + "windows_i686_msvc 0.42.2", > + "windows_x86_64_gnu 0.42.2", > + "windows_x86_64_gnullvm 0.42.2", > + "windows_x86_64_msvc 0.42.2", > +] > + > +[[package]] > +name =3D "windows-targets" > +version =3D "0.48.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a8= 7197940c" > +dependencies =3D [ > + "windows_aarch64_gnullvm 0.48.5", > + "windows_aarch64_msvc 0.48.5", > + "windows_i686_gnu 0.48.5", > + "windows_i686_msvc 0.48.5", > + "windows_x86_64_gnu 0.48.5", > + "windows_x86_64_gnullvm 0.48.5", > + "windows_x86_64_msvc 0.48.5", > +] > + > +[[package]] > +name =3D "windows-targets" > +version =3D "0.52.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b= 84e99973" > +dependencies =3D [ > + "windows_aarch64_gnullvm 0.52.6", > + "windows_aarch64_msvc 0.52.6", > + "windows_i686_gnu 0.52.6", > + "windows_i686_gnullvm 0.52.6", > + "windows_i686_msvc 0.52.6", > + "windows_x86_64_gnu 0.52.6", > + "windows_x86_64_gnullvm 0.52.6", > + "windows_x86_64_msvc 0.52.6", > +] > + > +[[package]] > +name =3D "windows-targets" > +version =3D "0.53.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b1= 9f9069f3" > +dependencies =3D [ > + "windows-link", > + "windows_aarch64_gnullvm 0.53.1", > + "windows_aarch64_msvc 0.53.1", > + "windows_i686_gnu 0.53.1", > + "windows_i686_gnullvm 0.53.1", > + "windows_i686_msvc 0.53.1", > + "windows_x86_64_gnu 0.53.1", > + "windows_x86_64_gnullvm 0.53.1", > + "windows_x86_64_msvc 0.53.1", > +] > + > +[[package]] > +name =3D "windows_aarch64_gnullvm" > +version =3D "0.42.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba= 2b0698f8" > + > +[[package]] > +name =3D "windows_aarch64_gnullvm" > +version =3D "0.48.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cba= f0d905d8" > + > +[[package]] > +name =3D "windows_aarch64_gnullvm" > +version =3D "0.52.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989cc= d0c02cd3" > + > +[[package]] > +name =3D "windows_aarch64_gnullvm" > +version =3D "0.53.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a5610= 4a6d1b53" > + > +[[package]] > +name =3D "windows_aarch64_msvc" > +version =3D "0.42.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942= e58c4d43" > + > +[[package]] > +name =3D "windows_aarch64_msvc" > +version =3D "0.48.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be72293= 7c26b4bc" > + > +[[package]] > +name =3D "windows_aarch64_msvc" > +version =3D "0.52.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cab= bd05d469" > + > +[[package]] > +name =3D "windows_aarch64_msvc" > +version =3D "0.53.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e= 9b125006" > + > +[[package]] > +name =3D "windows_i686_gnu" > +version =3D "0.42.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec= 9a31a84f" > + > +[[package]] > +name =3D "windows_i686_gnu" > +version =3D "0.48.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6= e9b3743e" > + > +[[package]] > +name =3D "windows_i686_gnu" > +version =3D "0.52.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebf= e8bbfa0b" > + > +[[package]] > +name =3D "windows_i686_gnu" > +version =3D "0.53.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a= 506593a3" > + > +[[package]] > +name =3D "windows_i686_gnullvm" > +version =3D "0.52.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d733= 4ae8ed66" > + > +[[package]] > +name =3D "windows_i686_gnullvm" > +version =3D "0.53.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c2= 7057180c" > + > +[[package]] > +name =3D "windows_i686_msvc" > +version =3D "0.42.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac= 444d1060" > + > +[[package]] > +name =3D "windows_i686_msvc" > +version =3D "0.48.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d41= 66cca406" > + > +[[package]] > +name =3D "windows_i686_msvc" > +version =3D "0.52.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f= 6ec56c66" > + > +[[package]] > +name =3D "windows_i686_msvc" > +version =3D "0.53.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a= 38d326c2" > + > +[[package]] > +name =3D "windows_x86_64_gnu" > +version =3D "0.42.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6b= bb70cb36" > + > +[[package]] > +name =3D "windows_x86_64_gnu" > +version =3D "0.48.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf= 19c6718e" > + > +[[package]] > +name =3D "windows_x86_64_gnu" > +version =3D "0.52.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5= b08b1a78" > + > +[[package]] > +name =3D "windows_x86_64_gnu" > +version =3D "0.53.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa= 7df4a499" > + > +[[package]] > +name =3D "windows_x86_64_gnullvm" > +version =3D "0.42.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85= 514e94a3" > + > +[[package]] > +name =3D "windows_x86_64_gnullvm" > +version =3D "0.48.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7= 414044cc" > + > +[[package]] > +name =3D "windows_x86_64_gnullvm" > +version =3D "0.52.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872e= ff51ed0d" > + > +[[package]] > +name =3D "windows_x86_64_gnullvm" > +version =3D "0.53.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47= f6bb7ae1" > + > +[[package]] > +name =3D "windows_x86_64_msvc" > +version =3D "0.42.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef= 0106b9f0" > + > +[[package]] > +name =3D "windows_x86_64_msvc" > +version =3D "0.48.5" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92= d06d9538" > + > +[[package]] > +name =3D "windows_x86_64_msvc" > +version =3D "0.52.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb15= 5959f9ec" > + > +[[package]] > +name =3D "windows_x86_64_msvc" > +version =3D "0.53.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d= 0ebed650" > + > +[[package]] > +name =3D "winit" > +version =3D "0.30.12" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812= e9e6c732" > +dependencies =3D [ > + "ahash 0.8.12", > + "android-activity", > + "atomic-waker", > + "bitflags 2.10.0", > + "block2", > + "bytemuck", > + "calloop 0.13.0", > + "cfg_aliases 0.2.1", > + "concurrent-queue", > + "core-foundation 0.9.4", > + "core-graphics 0.23.2", > + "cursor-icon", > + "dpi", > + "js-sys", > + "libc", > + "memmap2", > + "ndk", > + "objc2", > + "objc2-app-kit", > + "objc2-foundation", > + "objc2-ui-kit", > + "orbclient", > + "percent-encoding", > + "pin-project", > + "raw-window-handle", > + "redox_syscall 0.4.1", > + "rustix 0.38.44", > + "sctk-adwaita", > + "smithay-client-toolkit 0.19.2", > + "smol_str", > + "tracing", > + "unicode-segmentation", > + "wasm-bindgen", > + "wasm-bindgen-futures", > + "wayland-backend", > + "wayland-client", > + "wayland-protocols", > + "wayland-protocols-plasma", > + "web-sys", > + "web-time", > + "windows-sys 0.52.0", > + "x11-dl", > + "x11rb", > + "xkbcommon-dl", > +] > + > +[[package]] > +name =3D "winnow" > +version =3D "0.7.13" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9= 039339cf" > +dependencies =3D [ > + "memchr", > +] > + > +[[package]] > +name =3D "winreg" > +version =3D "0.10.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f4= 0580869d" > +dependencies =3D [ > + "winapi", > +] > + > +[[package]] > +name =3D "wit-bindgen" > +version =3D "0.46.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc07= 0ad7fe59" > + > +[[package]] > +name =3D "x11-dl" > +version =3D "2.21.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db= 85c1516f" > +dependencies =3D [ > + "libc", > + "once_cell", > + "pkg-config", > +] > + > +[[package]] > +name =3D "x11rb" > +version =3D "0.13.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c4= 95dd7414" > +dependencies =3D [ > + "as-raw-xcb-connection", > + "gethostname", > + "libc", > + "libloading 0.8.9", > + "once_cell", > + "rustix 1.1.2", > + "x11rb-protocol", > +] > + > +[[package]] > +name =3D "x11rb-protocol" > +version =3D "0.13.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bf= ec6701bd" > + > +[[package]] > +name =3D "xcursor" > +version =3D "0.3.10" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae= 50f28f2b" > + > +[[package]] > +name =3D "xdg-home" > +version =3D "1.3.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0= bf10a1f6" > +dependencies =3D [ > + "libc", > + "windows-sys 0.59.0", > +] > + > +[[package]] > +name =3D "xkbcommon-dl" > +version =3D "0.4.2" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2= 460651c5" > +dependencies =3D [ > + "bitflags 2.10.0", > + "dlib", > + "log", > + "once_cell", > + "xkeysym", > +] > + > +[[package]] > +name =3D "xkeysym" > +version =3D "0.2.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b06= 8ee97a56" > + > +[[package]] > +name =3D "xml-rs" > +version =3D "0.8.28" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5= fb912d3f" > + > +[[package]] > +name =3D "yansi" > +version =3D "1.0.1" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed= 6529b049" > + > +[[package]] > +name =3D "yazi" > +version =3D "0.1.6" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84= c9d98be1" > + > +[[package]] > +name =3D "zbus" > +version =3D "4.4.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b= 4d48c725" > +dependencies =3D [ > + "async-broadcast", > + "async-executor", > + "async-fs 2.2.0", > + "async-io 2.6.0", > + "async-lock 3.4.1", > + "async-process 2.5.0", > + "async-recursion", > + "async-task", > + "async-trait", > + "blocking", > + "enumflags2", > + "event-listener 5.4.1", > + "futures-core", > + "futures-sink", > + "futures-util", > + "hex", > + "nix", > + "ordered-stream", > + "rand", > + "serde", > + "serde_repr", > + "sha1", > + "static_assertions", > + "tracing", > + "uds_windows", > + "windows-sys 0.52.0", > + "xdg-home", > + "zbus_macros", > + "zbus_names", > + "zvariant", > +] > + > +[[package]] > +name =3D "zbus_macros" > +version =3D "4.4.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd7= 9ab1983e" > +dependencies =3D [ > + "proc-macro-crate", > + "proc-macro2", > + "quote", > + "syn 2.0.110", > + "zvariant_utils", > +] > + > +[[package]] > +name =3D "zbus_names" > +version =3D "3.0.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5= a5022e6c" > +dependencies =3D [ > + "serde", > + "static_assertions", > + "zvariant", > +] > + > +[[package]] > +name =3D "zeno" > +version =3D "0.2.3" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd= 11a1e697" > + > +[[package]] > +name =3D "zerocopy" > +version =3D "0.8.28" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "43fa6694ed34d6e57407afbccdeecfa268c470a7d2a5b0cf49ce9fcc= 345afb90" > +dependencies =3D [ > + "zerocopy-derive", > +] > + > +[[package]] > +name =3D "zerocopy-derive" > +version =3D "0.8.28" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c640b22cd9817fae95be82f0d2f90b11f7605f6c319d16705c459b27= ac2cbc26" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > + > +[[package]] > +name =3D "zune-inflate" > +version =3D "0.2.54" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff01= 25116f02" > +dependencies =3D [ > + "simd-adler32", > +] > + > +[[package]] > +name =3D "zvariant" > +version =3D "4.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57f= d48c81fe" > +dependencies =3D [ > + "endi", > + "enumflags2", > + "serde", > + "static_assertions", > + "zvariant_derive", > +] > + > +[[package]] > +name =3D "zvariant_derive" > +version =3D "4.2.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d= 2002c449" > +dependencies =3D [ > + "proc-macro-crate", > + "proc-macro2", > + "quote", > + "syn 2.0.110", > + "zvariant_utils", > +] > + > +[[package]] > +name =3D "zvariant_utils" > +version =3D "2.1.0" > +source =3D "registry+https://github.com/rust-lang/crates.io-index" > +checksum =3D "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523ce= e4808340" > +dependencies =3D [ > + "proc-macro2", > + "quote", > + "syn 2.0.110", > +] > diff --git a/tools/spectrum-installer/Cargo.lock.license b/tools/spectr= um-installer/Cargo.lock.license > new file mode 100644 > index 0000000..bfe02ea > --- /dev/null > +++ b/tools/spectrum-installer/Cargo.lock.license > @@ -0,0 +1,2 @@ > +SPDX-License-Identifier: CC0-1.0 > +SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > diff --git a/tools/spectrum-installer/Cargo.toml b/tools/spectrum-insta= ller/Cargo.toml > new file mode 100644 > index 0000000..4be4dcd > --- /dev/null > +++ b/tools/spectrum-installer/Cargo.toml > @@ -0,0 +1,14 @@ > +# SPDX-License-Identifier: CC0-1.0 > +# SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +[package] > +name =3D "spectrum-installer" > +version =3D "0.1.0" > +edition =3D "2024" > + > +[dependencies] > +iced =3D { version =3D "0.13", features =3D ["image"] } > +iced_aw =3D { version =3D "0.12", features =3D ["spinner"] } > +iced_fonts =3D { version =3D "0.2", features =3D ["bootstrap"] } > +iced_term =3D { version =3D "0.6" } > +lsblk =3D { version =3D "0.6" } > diff --git a/tools/spectrum-installer/default.nix b/tools/spectrum-inst= aller/default.nix > new file mode 100644 > index 0000000..3ab028b > --- /dev/null > +++ b/tools/spectrum-installer/default.nix > @@ -0,0 +1,41 @@ > +# SPDX-FileCopyrightText: 2024 Alyssa Ross > +# SPDX-FileCopyrightText: 2025-2026 Johannes S=C3=BCllner > +# SPDX-License-Identifier: MIT > + > +import ../../lib/call-package.nix ( > +args@{ callPackage, config, src, lib, rustPlatform, libcosmicAppHook }= : > + > +rustPlatform.buildRustPackage rec { > + name =3D "spectrum-installer"; > + > + src =3D lib.fileset.toSource { > + root =3D ../..; > + fileset =3D lib.fileset.intersection args.src ./.; > + }; > + sourceRoot =3D "source/tools/spectrum-installer"; > + > + cargoLock.lockFile =3D ./Cargo.lock; > + > + nativeBuildInputs =3D [ libcosmicAppHook ]; > + > + icons =3D callPackage ( > + { runCommand, inkscape }: > + runCommand "spectrum_installer_icons" { > + nativeBuildInputs =3D [ inkscape ]; > + logoSvg =3D ./res/installer_logo_mesh.svg; > + } '' > + mkdir $out > + inkscape -w 22 -h 22 -o $out/22x22.png "$logoSvg" > + inkscape -w 400 -h 400 -o $out/400x400.png "$logoSvg" > + '' > + ) {}; > + > + postInstall =3D '' > + mkdir -p "$out/share/spectrum-installer/repart.d" > + for f in $(ls "./res/repart.d"); do > + substitute "./res/repart.d/$f" "$out/share/spectrum-installer/re= part.d/$f" --subst-var-by "version" "${config.version}" > + done > + install -D "${icons}/22x22.png" "$out/share/icons/hicolor/22x22/ap= ps/${name}.png" > + install -D "${icons}/400x400.png" "$out/share/icons/hicolor/400x40= 0/apps/${name}.png" > + ''; > +}) (_: {}) > diff --git a/tools/spectrum-installer/res/installer_logo_mesh.svg b/too= ls/spectrum-installer/res/installer_logo_mesh.svg > new file mode 100644 > index 0000000..1e25829 > --- /dev/null > +++ b/tools/spectrum-installer/res/installer_logo_mesh.svg > @@ -0,0 +1,85 @@ > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + > + + style=3D"overflow:visible" > + id=3D"ArrowWideRounded" > + refX=3D"0" > + refY=3D"0" > + orient=3D"auto-start-reverse" > + markerWidth=3D"1" > + markerHeight=3D"1" > + viewBox=3D"0 0 1 1" > + preserveAspectRatio=3D"xMidYMid" > + markerUnits=3D"strokeWidth"> > + + style=3D"fill:none;stroke:context-stroke;stroke-width:1;strok= e-linecap:round" > + d=3D"M 3,-3 0,0 3,3" > + transform=3D"rotate(180,0.125,0)" /> > + > + > + > + > + > + > + > + + style=3D"fill:none;stroke:#000000;stroke-width:4.5;stroke-linecap= :round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marke= r-end:url(#ArrowWideRounded)" > + d=3D"M 50,29.5 V 54" /> > + + style=3D"fill:none;stroke:#000000;stroke-width:4.5;stroke-linecap= :round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" > + d=3D"M 65.419353,63.617021 H 34.580646" /> > + > diff --git a/tools/spectrum-installer/res/repart.d/10-esp.conf b/tools/= spectrum-installer/res/repart.d/10-esp.conf > new file mode 100644 > index 0000000..1f3c5fc > --- /dev/null > +++ b/tools/spectrum-installer/res/repart.d/10-esp.conf > @@ -0,0 +1,8 @@ > +# SPDX-License-Identifier: CC0-1.0 > +# SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +[Partition] > +Type=3Desp > +SizeMinBytes=3D500M > +SizeMaxBytes=3D500M > +CopyBlocks=3D/dev/disk/by-designator/esp > diff --git a/tools/spectrum-installer/res/repart.d/20-verity-A.conf b/t= ools/spectrum-installer/res/repart.d/20-verity-A.conf > new file mode 100644 > index 0000000..6e688e3 > --- /dev/null > +++ b/tools/spectrum-installer/res/repart.d/20-verity-A.conf > @@ -0,0 +1,9 @@ > +# SPDX-License-Identifier: CC0-1.0 > +# SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +[Partition] > +Type=3Droot-verity > +Label=3DSpectrum_@version@.verity > +SizeMinBytes=3D162M > +SizeMaxBytes=3D162M > +CopyBlocks=3Dauto > diff --git a/tools/spectrum-installer/res/repart.d/21-rootfs-A.conf b/t= ools/spectrum-installer/res/repart.d/21-rootfs-A.conf > new file mode 100644 > index 0000000..9d5ea6b > --- /dev/null > +++ b/tools/spectrum-installer/res/repart.d/21-rootfs-A.conf > @@ -0,0 +1,9 @@ > +# SPDX-License-Identifier: CC0-1.0 > +# SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +[Partition] > +Type=3Droot > +Label=3DSpectrum_@version@ > +SizeMinBytes=3D20G > +SizeMaxBytes=3D20G > +CopyBlocks=3Dauto > diff --git a/tools/spectrum-installer/res/repart.d/30-verity-B.conf b/t= ools/spectrum-installer/res/repart.d/30-verity-B.conf > new file mode 100644 > index 0000000..3721ff0 > --- /dev/null > +++ b/tools/spectrum-installer/res/repart.d/30-verity-B.conf > @@ -0,0 +1,8 @@ > +# SPDX-License-Identifier: CC0-1.0 > +# SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +[Partition] > +Type=3Droot-verity > +Label=3D_empty > +SizeMinBytes=3D162M > +SizeMaxBytes=3D162M > diff --git a/tools/spectrum-installer/res/repart.d/31-rootfs-B.conf b/t= ools/spectrum-installer/res/repart.d/31-rootfs-B.conf > new file mode 100644 > index 0000000..84e9f57 > --- /dev/null > +++ b/tools/spectrum-installer/res/repart.d/31-rootfs-B.conf > @@ -0,0 +1,8 @@ > +# SPDX-License-Identifier: CC0-1.0 > +# SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +[Partition] > +Type=3Droot > +Label=3D_empty > +SizeMinBytes=3D20G > +SizeMaxBytes=3D20G > diff --git a/tools/spectrum-installer/res/repart.d/40-home.conf b/tools= /spectrum-installer/res/repart.d/40-home.conf > new file mode 100644 > index 0000000..c487d34 > --- /dev/null > +++ b/tools/spectrum-installer/res/repart.d/40-home.conf > @@ -0,0 +1,7 @@ > +# SPDX-License-Identifier: CC0-1.0 > +# SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +[Partition] > +Type=3Dhome > +SizeMinBytes=3D500M > +Format=3Dbtrfs > diff --git a/tools/spectrum-installer/shell.nix b/tools/spectrum-instal= ler/shell.nix > new file mode 100644 > index 0000000..060009b > --- /dev/null > +++ b/tools/spectrum-installer/shell.nix > @@ -0,0 +1,30 @@ > +# SPDX-License-Identifier: MIT > +# SPDX-FileCopyrightText: 2025 iced contributors > + > +# from https://github.com/iced-rs/iced/blob/master/DEPENDENCIES.md > +# last updated 2025-11-11 > + > +{ pkgs ? import {} }: > + > +pkgs.mkShell rec { > + buildInputs =3D with pkgs; [ > + cargo > + lldb > + expat > + fontconfig > + freetype > + freetype.dev > + libGL > + pkg-config > + rustfmt > + xorg.libX11 > + xorg.libXcursor > + xorg.libXi > + xorg.libXrandr > + wayland > + libxkbcommon > + ]; Is it possible to drop the X11 libraries? The installer should be Wayland-only. If upstream Iced can't be built without X11 support, feel free to ignore this. > + LD_LIBRARY_PATH =3D > + builtins.foldl' (a: b: "${a}:${b}/lib") "${pkgs.vulkan-loader}/lib= " buildInputs; > +} > diff --git a/tools/spectrum-installer/src/main.rs b/tools/spectrum-inst= aller/src/main.rs > new file mode 100644 > index 0000000..2ca9dfa > --- /dev/null > +++ b/tools/spectrum-installer/src/main.rs > @@ -0,0 +1,52 @@ > +// SPDX-License-Identifier: EUPL-1.2+ > +// SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +mod pages; > + > +use iced::Element; > +use iced::Size; > +use iced::Subscription; > +use iced::Task; > +use pages::Event; > + > +fn main() -> iced::Result { > + iced::application( > + "Spectrum installer", > + SpectrumInstaller::update, > + SpectrumInstaller::view, > + ) > + .window_size(Size::new(pages::WINDOW_WIDTH, pages::WINDOW_HEIGHT))= > + .font(iced_fonts::BOOTSTRAP_FONT_BYTES) > + .resizable(false) > + .subscription(SpectrumInstaller::subscription) > + .run() > +} Have you tested with HiDPI displays? I think it would be better for the installer to be fullscreen, or at least have a size proportional to the display it is on. I suspect that hard-coded sizes are an antipattern, though I don't know what the best alternative would be. Ideally there would be an option to zoom in and out, so that those who need larger buttons and text can get that. Is there a way to ask Iced to size things automatically? > +struct SpectrumInstaller { > + current_page: Box, > +} > +impl Default for SpectrumInstaller { > + fn default() -> Self { > + Self { > + current_page: Box::new(pages::INITAL_PAGE), > + } > + } > +} > + > +impl SpectrumInstaller { > + fn update(&mut self, event: pages::Event) -> Task { > + let (maybe_new_page, task) =3D self.current_page.update(event)= ; > + if let Some(new_page) =3D maybe_new_page { > + self.current_page =3D new_page; > + } > + task > + } > + > + fn view(&self) -> Element<'_, pages::Event> { > + self.current_page.view() > + } > + > + fn subscription(&self) -> Subscription { > + self.current_page.subscription() > + } > +} > diff --git a/tools/spectrum-installer/src/pages/completion.rs b/tools/s= pectrum-installer/src/pages/completion.rs > new file mode 100644 > index 0000000..2ea9734 > --- /dev/null > +++ b/tools/spectrum-installer/src/pages/completion.rs > @@ -0,0 +1,112 @@ > +// SPDX-License-Identifier: EUPL-1.2+ > +// SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +use super::{ > + BUTTON_TEXT_SIZE, Event, MARGIN_LR, MARGIN_VERTICAL, Page, TITLE_T= EXT_SIZE, UpdateResult, > + WINDOW_WIDTH, > +}; > +use crate::{center_horizontal_in_container, center_in_container}; > +use iced::{ > + Element, Task, > + widget::{ > + Scrollable, Space, column, > + scrollable::{Direction, Scrollbar}, > + text, > + }, > + window, > +}; > +use std::process::Command; > + > +const S6_HPR_PATH: &str =3D "/bin/s6-linux-init-hpr"; > + > +pub struct PageCompletion { > + install_result: super::InstallResult, > +} > + > +impl PageCompletion { > + pub fn new(install_result: super::InstallResult) -> Self { > + Self { install_result } > + } > +} > + > +#[derive(Clone, Debug)] > +pub enum PageCompletionEvent { > + Quit, > + Poweroff, > + Reboot, > +} > + > +impl PageCompletion { > + fn close(id: window::Id) -> Task { > + window::close(id) > + } > + > + fn spawn_s6_hpr(parameter: &str) { > + let _ =3D Command::new(S6_HPR_PATH).arg(parameter).spawn(); > + } > +} > + > +impl Page for PageCompletion { > + fn update(&mut self, event: Event) -> UpdateResult { > + if let Event::PageCompletion(page_completion_event) =3D event = { > + match page_completion_event { > + PageCompletionEvent::Quit =3D> { > + return (None, window::get_latest().and_then(Self::= close)); > + } > + PageCompletionEvent::Poweroff =3D> { > + Self::spawn_s6_hpr("-p"); > + } > + PageCompletionEvent::Reboot =3D> { > + Self::spawn_s6_hpr("-r"); > + } > + } > + }; > + > + (None, Task::none()) > + } > + > + fn view(&self) -> Element<'_, Event> { > + let main_element =3D match &self.install_result { > + Ok(_) =3D> { > + center_in_container!(text("Spectrum installation succe= eded!").size(TITLE_TEXT_SIZE)).into() > + } > + Err((code, log)) =3D> { > + column![ > + Space::with_height(MARGIN_VERTICAL), > + center_horizontal_in_container!(text("Spectrum ins= tallation failed :( ").size(TITLE_TEXT_SIZE)), > + Space::with_height(MARGIN_VERTICAL), > + center_horizontal_in_container!(Scrollable::new(te= xt(format!("You can reach out to the team via Chat or the \"discuss\" mai= ling list.\n\ > + See https://spectrum-os.org/doc/contributing/c= ommunication.html for details.\n\ > + The following information may be relevant:\n\n= \ > + Error code: {}\n\nError log:\n{}", code, log))= ) > + .width(WINDOW_WIDTH - 2.0 * MARGIN_LR) > + .height(500) > + .direction(Direction::Vertical(Scrollbar::new(= )))), > + ] > + .into() > + } > + }; I see no harm in including the full email address of the discuss mailing list (discuss@spectrum-os.org). Also, it would be useful to display a QR code that someone can scan using their mobile device. This avoids having to do clumsy and error-prone manual transcription, and may allow for including more lines of output. > + super::layout::bottom_buttons_layout( > + [ > + vec![ > + ( > + text("Reboot").size(BUTTON_TEXT_SIZE).into(), > + Some(Event::PageCompletion(PageCompletionEvent= ::Reboot)), > + ), > + ( > + text("Poweroff").size(BUTTON_TEXT_SIZE).into()= , > + Some(Event::PageCompletion(PageCompletionEvent= ::Poweroff)), > + ), > + ], > + vec![( > + text("Quit installer, stay in live environment") > + .size(BUTTON_TEXT_SIZE) > + .into(), > + Some(Event::PageCompletion(PageCompletionEvent::Qu= it)), > + )], > + ], > + main_element, > + ) > + } > +} > diff --git a/tools/spectrum-installer/src/pages/confirmation.rs b/tools= /spectrum-installer/src/pages/confirmation.rs > new file mode 100644 > index 0000000..25084b6 > --- /dev/null > +++ b/tools/spectrum-installer/src/pages/confirmation.rs > @@ -0,0 +1,108 @@ > +// SPDX-License-Identifier: EUPL-1.2+ > +// SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +use super::{ > + BUTTON_TEXT_SIZE, Event, MARGIN_LR, MARGIN_VERTICAL, Page, TITLE_T= EXT_SIZE, UpdateResult, > + WINDOW_WIDTH, > +}; > +use crate::center_horizontal_in_container; > +use iced::{ > + Length, Task, > + widget::{Space, checkbox, column, container, text}, > +}; > +use lsblk::BlockDevice; > + > +pub struct PageConfirmation { > + device: BlockDevice, > + install_confirmed: bool, > +} > + > +impl PageConfirmation { > + pub fn new(device: BlockDevice) -> Self { > + Self { > + device, > + install_confirmed: false, > + } > + } > +} > + > +#[derive(Clone, Debug)] > +pub enum PageConfirmationEvent { > + Back, > + ConfirmCheckboxToggled(bool), > + StartInstallation, > +} > + > +impl Page for PageConfirmation { > + fn update(&mut self, event: Event) -> UpdateResult { > + if let Event::PageConfirmation(page_event) =3D event { > + match page_event { > + PageConfirmationEvent::Back =3D> { > + return ( > + Some(Box::new(super::disk_selection::PageDiskS= election::new())), > + Task::none(), > + ); > + } > + PageConfirmationEvent::ConfirmCheckboxToggled(bool) =3D= > { > + self.install_confirmed =3D bool; > + } > + PageConfirmationEvent::StartInstallation =3D> { > + return ( > + Some(Box::new(super::installation::PageInstall= ation::new( > + self.device.clone(), > + ))), > + Task::none(), > + ); > + } > + } > + } > + (None, Task::none()) > + } > + > + fn view(&self) -> iced::Element<'_, Event> { > + let main_content =3D column![ > + Space::with_height(Length::Fill), > + center_horizontal_in_container!(text("Confirm Installation= ").size(TITLE_TEXT_SIZE)), > + Space::with_height(MARGIN_VERTICAL), > + center_horizontal_in_container!(text( > + "Erease all data on the following device and install S= pectrum?" > + )), Typo: Erease =E2=87=92 Erase > + Space::with_height(MARGIN_VERTICAL), > + center_horizontal_in_container!( > + container(super::layout::disk_element(&self.device)) > + .width(WINDOW_WIDTH - 2.0 * MARGIN_LR) > + ), > + Space::with_height(MARGIN_VERTICAL), > + center_horizontal_in_container!( > + checkbox( > + format!("I understand all data on {} will be lost"= , self.device.name), > + self.install_confirmed > + ) > + .on_toggle(|bool| Event::PageConfirmation( > + PageConfirmationEvent::ConfirmCheckboxToggled(bool= ) > + )) > + ), > + Space::with_height(Length::Fill), > + ]; > + > + super::layout::bottom_buttons_layout( > + [[ > + ( > + text("Back").size(BUTTON_TEXT_SIZE).into(), > + Some(Event::PageConfirmation(PageConfirmationEvent= ::Back)), > + ), > + ( > + text("Start installation").size(BUTTON_TEXT_SIZE).= into(), > + if self.install_confirmed { > + Some(Event::PageConfirmation( > + PageConfirmationEvent::StartInstallation, > + )) > + } else { > + None > + }, > + ), > + ]], > + main_content.into(), > + ) > + } > +} > diff --git a/tools/spectrum-installer/src/pages/disk_selection.rs b/too= ls/spectrum-installer/src/pages/disk_selection.rs > new file mode 100644 > index 0000000..0d28022 > --- /dev/null > +++ b/tools/spectrum-installer/src/pages/disk_selection.rs > @@ -0,0 +1,134 @@ > +// SPDX-License-Identifier: EUPL-1.2+ > +// SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +use super::{ > + BUTTON_TEXT_SIZE, Event, MARGIN_LR, MARGIN_VERTICAL, Page, TITLE_T= EXT_SIZE, UpdateResult, > + WINDOW_WIDTH, > +}; > +use crate::center_horizontal_in_container; > +use iced::{ > + Length, Task, > + widget::{ > + Scrollable, Space, button, column, > + scrollable::{Direction, Scrollbar}, > + text, > + }, > +}; > +use lsblk::BlockDevice; > + > +pub struct PageDiskSelection { > + destination_device: Option, > +} > + > +impl PageDiskSelection { > + pub fn new() -> Self { > + Self { > + destination_device: None, > + } > + } > +} > + > +#[derive(Clone, Debug)] > +pub enum PageDiskSelectionEvent { > + Back, > + SelectDevice(BlockDevice), > + ContinueWithDevice(BlockDevice), > +} > + > +impl Page for PageDiskSelection { > + fn update(&mut self, event: Event) -> UpdateResult { > + if let Event::PageDiskSelection(page_disk_selection_event) =3D= event { > + match page_disk_selection_event { > + PageDiskSelectionEvent::Back =3D> { > + return ( > + Some(Box::new(super::welcome::PageWelcome::new= ())), > + Task::none(), > + ); > + } > + PageDiskSelectionEvent::SelectDevice(device) =3D> { > + self.destination_device =3D Some(device); > + } > + PageDiskSelectionEvent::ContinueWithDevice(device) =3D= > { > + return ( > + Some(Box::new(super::confirmation::PageConfirm= ation::new(device))), > + Task::none(), > + ); > + } > + } > + } > + (None, Task::none()) > + } > + > + fn view(&self) -> iced::Element<'_, Event> { > + let mut block_devices =3D BlockDevice::list().expect("Failed t= o get block devices"); > + block_devices.sort_by_key(|device| device.name.clone()); > + > + let mut possible_block_devices =3D block_devices > + .iter() > + .filter(|device| { > + BlockDevice::is_disk(device) > + && !&device.name.starts_with("loop") > + && !&device.name.starts_with("sr") > + }) > + .peekable(); > + > + let destinations: iced::Element =3D if possible_block_d= evices.peek().is_none() { > + text("No applicable devices to install Spectrum to found."= ).into() > + } else { > + column(possible_block_devices.map(|device| { > + button(super::layout::disk_element(&device)) > + .on_press(Event::PageDiskSelection( > + PageDiskSelectionEvent::SelectDevice(device.cl= one()), > + )) > + .width(WINDOW_WIDTH - 2.0 * MARGIN_LR) > + .style({ > + if self > + .destination_device > + .as_ref() > + .is_some_and(|d| d.fullname =3D=3D device.= fullname) > + { > + button::success > + } else { > + button::primary > + } > + }) > + .into() > + })) > + .spacing(8) > + .into() > + }; > + > + let main_content =3D column![ > + Space::with_height(MARGIN_VERTICAL), > + center_horizontal_in_container!( > + text("Select the device to install Spectrum to").size(= TITLE_TEXT_SIZE) > + ), > + Space::with_height(MARGIN_VERTICAL), > + center_horizontal_in_container!( > + Scrollable::new(destinations) > + .height(Length::Fill) > + .direction(Direction::Vertical(Scrollbar::new())) > + ), > + Space::with_height(MARGIN_VERTICAL), > + ]; > + > + super::layout::bottom_buttons_layout( > + [[ > + ( > + text("Back").size(BUTTON_TEXT_SIZE).into(), > + Some(Event::PageDiskSelection(PageDiskSelectionEve= nt::Back)), > + ), > + ( > + text("Next").size(BUTTON_TEXT_SIZE).into(), > + match &self.destination_device { > + None =3D> None, > + Some(device) =3D> Some(Event::PageDiskSelectio= n( > + PageDiskSelectionEvent::ContinueWithDevice= (device.clone()), > + )), > + }, > + ), > + ]], > + main_content.into(), > + ) > + } > +} > diff --git a/tools/spectrum-installer/src/pages/installation.rs b/tools= /spectrum-installer/src/pages/installation.rs > new file mode 100644 > index 0000000..16da197 > --- /dev/null > +++ b/tools/spectrum-installer/src/pages/installation.rs > @@ -0,0 +1,182 @@ > +// SPDX-License-Identifier: EUPL-1.2+ > +// SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +use super::{ > + BUTTON_TEXT_SIZE, Event, InstallResult, MARGIN_VERTICAL, Page, TIT= LE_TEXT_SIZE, UpdateResult, > +}; > +use crate::center_horizontal_in_container; > +use iced::{ > + Length, Subscription, Task, > + widget::{Space, column, container, row, text}, > +}; > +use iced_aw::Spinner; > +use iced_term::Terminal; > +use lsblk::BlockDevice; > +use std::fs; > + > +const RESULT_CODE_FILE: &str =3D "/tmp/spectrum-installer_result-code"= ; > +const LOG_FILE: &str =3D "/tmp/spectrum-installer_log"; > + > +pub struct PageInstallation { > + terminal: Option, > + installation_completed: bool, > + installation_result: Option, > +} > + > +impl PageInstallation { > + pub fn new(device: BlockDevice) -> Self { > + let term =3D Terminal::new( > + 0, > + iced_term::settings::Settings { > + backend: iced_term::settings::BackendSettings { > + program: String::from("/usr/bin/sh"), > + args: Vec::from([ > + String::from("-c"), > + // Install enforcing a new partition table. > + // HACK: Logging to /tmp as iced_term does not= offer any other way of obtaining the commands result. Nits: - Comment line too long I think. - Missing apostrophe: either "commands' results" or "command's result". > + String::from( > + [ > + "( /usr/bin/systemd-repart \ > + --definitions=3D/usr/share/spectrum-i= nstaller/repart.d \ > + --empty=3Dforce \ > + --dry-run=3Dno ", > + &device.fullname.display().to_string()= , Missing shell argument escaping and '-o pipefail'. The latter might require bash instead of sh. > + "; echo $? > ", > + RESULT_CODE_FILE, > + ") 2>&1 | tee ", > + LOG_FILE, > + ] > + .concat(), > + ), > + ]), > + }, > + ..Default::default() > + }, > + ); > + > + match term { > + Ok(term) =3D> Self { > + terminal: Some(term), > + installation_completed: false, > + installation_result: None, > + }, > + Err(e) =3D> Self { > + terminal: None, > + installation_completed: true, > + installation_result: Some(Err((0, e.to_string()))), > + }, > + } > + } > +} > + > +#[derive(Clone, Debug)] > +pub enum PageInstallationEvent { > + Terminal(iced_term::Event), > + Finish, > +} > + > +impl Page for PageInstallation { > + fn update(&mut self, event: Event) -> UpdateResult { > + if let Event::PageInstallation(page_event) =3D event { > + match page_event { > + PageInstallationEvent::Finish =3D> { > + if let Some(installation_result) =3D self.installa= tion_result.clone() { > + return ( > + Some(Box::new(super::completion::PageCompl= etion::new( > + installation_result, > + ))), > + Task::none(), > + ); > + } > + } > + PageInstallationEvent::Terminal(iced_term::Event::Back= endCall(_, cmd)) =3D> { > + if let Some(term) =3D &mut self.terminal { > + match term.handle(iced_term::Command::ProxyToB= ackend(cmd)) { > + iced_term::actions::Action::Shutdown =3D> = { > + let code =3D fs::read_to_string(RESULT= _CODE_FILE); > + let log =3D fs::read_to_string(LOG_FIL= E); > + self.installation_result =3D > + if let (Ok(code_as_str), Ok(log)) = =3D (code, log) { > + if let Ok(code) =3D code_as_st= r.trim().parse::() { > + self.installation_complete= d =3D true; > + if code =3D=3D 0 { > + Some(Ok(log)) > + } else { > + Some(Err((code, log)))= > + } > + } else { > + None > + } > + } else { > + None > + }; > + } > + _ =3D> {} > + } > + } > + } > + } > + } > + (None, Task::none()) > + } > + > + fn subscription(&self) -> Subscription { > + if let Some(term) =3D &self.terminal { > + return Subscription::run_with_id(term.id, term.subscriptio= n()) > + .map::<_, _>(|t| Event::PageInstallation(PageInstallat= ionEvent::Terminal(t))); > + } > + > + Subscription::none() > + } > + > + fn view(&self) -> iced::Element<'_, Event> { > + let title_row: iced::Element =3D if !self.installation_= completed { > + row![ > + Spinner::new().height(25), > + Space::with_width(MARGIN_VERTICAL), > + text("Installing ...").size(TITLE_TEXT_SIZE) > + ] > + .into() > + } else { > + text( > + if self.installation_result.as_ref().is_some_and(|r| r= =2Eis_ok()) { > + "Installation completed." > + } else { > + "Installation failed." > + }, > + ) > + .size(TITLE_TEXT_SIZE) > + .into() > + }; > + > + let installation_status: iced::Element =3D if let Some(= term) =3D &self.terminal { > + iced_term::TerminalView::show(term) > + .map::<_>(|t| Event::PageInstallation(PageInstallation= Event::Terminal(t))) > + .into() > + } else { > + text("Could not start installation.").into() > + }; > + > + let main_content =3D column![ > + Space::with_height(MARGIN_VERTICAL), > + center_horizontal_in_container!(title_row), > + Space::with_height(MARGIN_VERTICAL), > + container(installation_status) > + .width(Length::Fill) > + .center_x(Length::Fill) > + .height(Length::Fill), > + ]; > + > + super::layout::bottom_buttons_layout( > + [[( > + text("Finish").size(BUTTON_TEXT_SIZE).into(), > + if self.installation_completed { > + Some(Event::PageInstallation(PageInstallationEvent= ::Finish)) > + } else { > + None > + }, > + )]], > + main_content.into(), > + ) > + } > +} > diff --git a/tools/spectrum-installer/src/pages/layout.rs b/tools/spect= rum-installer/src/pages/layout.rs > new file mode 100644 > index 0000000..e7095bd > --- /dev/null > +++ b/tools/spectrum-installer/src/pages/layout.rs > @@ -0,0 +1,122 @@ > +// SPDX-License-Identifier: EUPL-1.2+ > +// SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +use iced::{ > + Element, Length, > + widget::{Button, Column, Row, button, column, container, row, text= }, > +}; > +use iced_fonts::{BOOTSTRAP_FONT as ICON_FONT, Bootstrap as Icon}; > +use lsblk::BlockDevice; > + > +use super::Event; > + > +#[macro_export] > +macro_rules! center_horizontal_in_container { > + ($e:expr) =3D> { > + iced::widget::container($e) > + .width(iced::Length::Fill) > + .center_x(iced::Length::Fill) > + }; > +} > +#[macro_export] > +macro_rules! center_in_container { > + ($e:expr) =3D> { > + iced::widget::container($e) > + .height(iced::Length::Fill) > + .width(iced::Length::Fill) > + .center_x(iced::Length::Fill) > + .center_y(iced::Length::Fill) > + }; > +} > + > +const BOTTOM_BUTTON_SPACE: f32 =3D 2.0; > +const BOTTOM_BUTTON_ROW_HEIGHT: f32 =3D 50.0; > +const DISK_ICON_SIZE: u16 =3D 50; > + > +fn bottom_button<'a>( > + button_content: Element<'a, Event>, > + button_on_press: Option, > +) -> Button<'a, Event> { > + button( > + center_in_container!(button_content) > + .height(Length::Fill) > + .center_y(Length::Fill), > + ) > + .on_press_maybe(button_on_press) > + .width(Length::Fill) > + .height(Length::Fill) > +} > + > +pub fn bottom_buttons_layout<'a>( > + button_matrix: impl IntoIterator< > + Item =3D impl IntoIterator, Optio= n)>, > + >, > + main_element: Element<'a, Event>, > +) -> Element<'a, Event> { > + let mut bottom_height =3D 0.0; > + let mut bottom_element =3D Column::new().spacing(BOTTOM_BUTTON_SPA= CE); > + for input_row in button_matrix.into_iter() { > + let mut output_row =3D Row::new().spacing(BOTTOM_BUTTON_SPACE)= ; > + for (button_content, button_on_press) in input_row.into_iter()= { > + output_row =3D output_row.push(bottom_button(button_conten= t, button_on_press)); > + } > + bottom_element =3D bottom_element.push(output_row); > + bottom_height +=3D BOTTOM_BUTTON_ROW_HEIGHT; > + } > + > + column![ > + center_horizontal_in_container!(main_element).height(Length::F= ill), > + container(bottom_element).height(bottom_height) > + ] > + .into() > +} > + > +pub fn disk_element(device: &BlockDevice) -> Element<'static, Event> {= > + let icon: Element =3D text(Icon::Hdd.to_string()) > + .font(ICON_FONT) > + .size(DISK_ICON_SIZE) > + .into(); > + > + let disk_size =3D if let Ok(Some(capacity)) =3D device.capacity() = { > + let mut size_factor: f32 =3D (capacity * 512) as f32; Why f32 and not f64? > + let mut exponent =3D 0; // base =3D 1024 > + while size_factor >=3D 1000.0 { > + exponent +=3D 1; > + size_factor =3D size_factor / 1000.0; > + } > + let unit =3D match exponent { > + 0 =3D> "", > + 1 =3D> "K", > + 2 =3D> "M", > + 3 =3D> "G", > + 4 =3D> "T", > + 5 =3D> "P", > + 6 =3D> "E", > + 7 =3D> "Z", > + 8 =3D> "Y", > + 9 =3D> "R", > + _ =3D> "???", > + }; > + Ok(format!("{:.2} {}B", size_factor, unit)) > + } else { > + Err("Failed to get disk size") > + }; > + > + let disk_id =3D if let Some(id) =3D &device.id { id } else { "" };= > + > + row![ > + icon, > + text(format!( > + "{}\n{}\n{}", > + device.fullname.display(), > + disk_id, > + if let Ok(size) =3D disk_size { > + size > + } else { > + String::from("(unknown size)") > + } > + )) > + ] > + .spacing(8) > + .into() > +} > diff --git a/tools/spectrum-installer/src/pages/mod.rs b/tools/spectrum= -installer/src/pages/mod.rs > new file mode 100644 > index 0000000..cd020f1 > --- /dev/null > +++ b/tools/spectrum-installer/src/pages/mod.rs > @@ -0,0 +1,43 @@ > +// SPDX-License-Identifier: EUPL-1.2+ > +// SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +use iced::{Subscription, Task}; > + > +mod completion; > +mod confirmation; > +mod disk_selection; > +mod installation; > +mod layout; > +mod welcome; > + > +pub const WINDOW_WIDTH: f32 =3D 750.0; > +pub const WINDOW_HEIGHT: f32 =3D 650.0; > + > +pub const MARGIN_VERTICAL: f32 =3D 25.0; > +pub const MARGIN_LR: f32 =3D 15.0; Why f32 and not f64? > +pub const BUTTON_TEXT_SIZE: u16 =3D 20; > +pub const TITLE_TEXT_SIZE: u16 =3D 24; > + > +type UpdateResult =3D (Option>, Task); > + > +type InstallResult =3D Result; > + > +pub trait Page { > + fn update(&mut self, event: Event) -> UpdateResult; > + fn view(&self) -> iced::Element<'_, Event>; > + fn subscription(&self) -> Subscription { > + Subscription::none() > + } > +} > + > +#[derive(Clone, Debug)] > +pub enum Event { > + /* Pages are ordered as they appear during the installation. */ > + PageWelcome(welcome::PageWelcomeEvent), > + PageDiskSelection(disk_selection::PageDiskSelectionEvent), > + PageConfirmation(confirmation::PageConfirmationEvent), > + PageInstallation(installation::PageInstallationEvent), > + PageCompletion(completion::PageCompletionEvent), > +} > + > +pub const INITAL_PAGE: welcome::PageWelcome =3D welcome::PageWelcome {= }; > diff --git a/tools/spectrum-installer/src/pages/welcome.rs b/tools/spec= trum-installer/src/pages/welcome.rs > new file mode 100644 > index 0000000..fb91fd1 > --- /dev/null > +++ b/tools/spectrum-installer/src/pages/welcome.rs > @@ -0,0 +1,62 @@ > +// SPDX-License-Identifier: EUPL-1.2+ > +// SPDX-FileCopyrightText: 2025 Johannes S=C3=BCllner > + > +use super::{BUTTON_TEXT_SIZE, Event, MARGIN_VERTICAL, Page, TITLE_TEXT= _SIZE, UpdateResult}; > +use crate::{center_horizontal_in_container, center_in_container}; > +use iced::{ > + Element, Length, Task, > + widget::{Space, column, image, text}, > +}; > + > +const LOGO_PATH_GLOBAL: &str =3D "/usr/share/icons/hicolor/400x400/app= s/spectrum-installer.png"; > +const LOGO_WIDTH: f32 =3D 400.0; > + > +pub struct PageWelcome {} > + > +impl PageWelcome { > + pub fn new() -> Self { > + Self {} > + } > +} > + > +#[derive(Clone, Debug)] > +pub enum PageWelcomeEvent { > + Continue, > +} > + > +impl Page for PageWelcome { > + fn update(&mut self, event: Event) -> UpdateResult { > + if let Event::PageWelcome(page_welcome_event) =3D event { > + match page_welcome_event { > + PageWelcomeEvent::Continue =3D> { > + return ( > + Some(Box::new(super::disk_selection::PageDiskS= election::new())), > + Task::none(), > + ); > + } > + } > + } > + (None, Task::none()) > + } > + > + fn view(&self) -> Element<'_, Event> { > + let button_content =3D text("Next").size(BUTTON_TEXT_SIZE); > + > + let main_content =3D column![ > + Space::with_height(MARGIN_VERTICAL), > + center_horizontal_in_container!( > + text("Welcome to the installation of Spectrum!").size(= TITLE_TEXT_SIZE) > + ), > + Space::with_height(MARGIN_VERTICAL), > + center_in_container!(image(LOGO_PATH_GLOBAL).width(Length:= :Fixed(LOGO_WIDTH))) > + ]; > + > + super::layout::bottom_buttons_layout( > + [[( > + button_content.into(), > + Some(Event::PageWelcome(PageWelcomeEvent::Continue)), > + )]], > + main_content.into(), > + ) > + } > +} Very good idea! --=20 Sincerely, Demi Marie Obenour (she/her/hers) --------------8oULBJPHbxiQwrMYf5AP4Vdz Content-Type: application/pgp-keys; name="OpenPGP_0xB288B55FFF9C22C1.asc" Content-Disposition: attachment; filename="OpenPGP_0xB288B55FFF9C22C1.asc" Content-Description: OpenPGP public key Content-Transfer-Encoding: quoted-printable -----BEGIN PGP PUBLIC KEY BLOCK----- xsFNBFp+A0oBEADffj6anl9/BHhUSxGTICeVl2tob7hPDdhHNgPR4C8xlYt5q49y B+l2nipdaq+4Gk6FZfqC825TKl7eRpUjMriwle4r3R0ydSIGcy4M6eb0IcxmuPYf bWpr/si88QKgyGSVZ7GeNW1UnzTdhYHuFlk8dBSmB1fzhEYEk0RcJqg4AKoq6/3/ UorR+FaSuVwT7rqzGrTlscnTDlPWgRzrQ3jssesI7sZLm82E3pJSgaUoCdCOlL7M MPCJwI8JpPlBedRpe9tfVyfu3euTPLPxwcV3L/cfWPGSL4PofBtB8NUU6QwYiQ9H zx4xOyn67zW73/G0Q2vPPRst8LBDqlxLjbtx/WLR6h3nBc3eyuZ+q62HS1pJ5EvU T1vjyJ1ySrqtUXWQ4XlZyoEFUfpJxJoN0A9HCxmHGVckzTRl5FMWo8TCniHynNXs BtDQbabt7aNEOaAJdE7to0AH3T/Bvwzcp0ZJtBk0EM6YeMLtotUut7h2Bkg1b//r 6bTBswMBXVJ5H44Qf0+eKeUg7whSC9qpYOzzrm7+0r9F5u3qF8ZTx55TJc2g656C 9a1P1MYVysLvkLvS4H+crmxA/i08Tc1h+x9RRvqba4lSzZ6/Tmt60DPM5Sc4R0nS m9BBff0Nm0bSNRS8InXdO1Aq3362QKX2NOwcL5YaStwODNyZUqF7izjK4QARAQAB zTxEZW1pIE9iZW5vdXIgKElUTCBFbWFpbCBLZXkpIDxhdGhlbmFAaW52aXNpYmxl dGhpbmdzbGFiLmNvbT7CwY4EEwEIADgWIQR2h02fEza6IlkHHHGyiLVf/5wiwQUC X6YJvQIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRCyiLVf/5wiwWRhD/0Y R+YYC5Kduv/2LBgQJIygMsFiRHbR4+tWXuTFqgrxxFSlMktZ6gQrQCWe38WnOXkB oY6n/5lSJdfnuGd2UagZ/9dkaGMUkqt+5WshLFly4BnP7pSsWReKgMP7etRTwn3S zk1OwFx2lzY1EnnconPLfPBc6rWG2moA6l0WX+3WNR1B1ndqpl2hPSjT2jUCBWDV rGOUSX7r5f1WgtBeNYnEXPBCUUM51pFGESmfHIXQrqFDA7nBNiIVFDJTmQzuEqIy Jl67pKNgooij5mKzRhFKHfjLRAH4mmWZlB9UjDStAfFBAoDFHwd1HL5VQCNQdqEc /9lZDApqWuCPadZN+pGouqLysesIYsNxUhJ7dtWOWHl0vs7/3qkWmWun/2uOJMQh ra2u8nA9g91FbOobWqjrDd6x3ZJoGQf4zLqjmn/P514gb697788e573WN/MpQ5XI Fl7aM2d6/GJiq6LC9T2gSUW4rbPBiqOCeiUx7Kd/sVm41p9TOA7fEG4bYddCfDsN xaQJH6VRK3NOuBUGeL+iQEVF5Xs6Yp+U+jwvv2M5Lel3EqAYo5xXTx4ls0xaxDCu fudcAh8CMMqx3fguSb7Mi31WlnZpk0fDuWQVNKyDP7lYpwc4nCCGNKCj622ZSocH AcQmX28L8pJdLYacv9pU3jPy4fHcQYvmTavTqowGnM08RGVtaSBNYXJpZSBPYmVu b3VyIChsb3ZlciBvZiBjb2RpbmcpIDxkZW1pb2Jlbm91ckBnbWFpbC5jb20+wsF4 BBMBAgAiBQJafgNKAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCyiLVf /5wiwYa/EACv8a2+MMou9cSCNoZBQaU+fTmyzft9hUE+0d5W2UY1RY3OsjFIzm9R /4SVccfsqOYLEo+S0vQMIIIqFEq3FCpXXwPzyimotps05VA8U3Bd7yseojFygOgK sAMOAee2RCaDDOnoJue01dfZMzzHPO/TVdp3OvnpWipfv5G1Xg96rwbhMLE3tg6N xwAHa31Bv4/Xq8CJOoIWvx6fcmZQpz01/lSvsYn0KrfEbTKkuUf0vM9JrCTCP2oz VNN5BYzqaq2M4r+jmSyeXLim922VOWqGkUEQ85BSEemqrRS06IU6NtEMsF8EWt/b hWjk/9GDKTcnpdJHTrMxTspExBiNrvpI2t+YPU5B/dJJAUxvmhFrbSIbdB8umBZs I3AMYrEmpAbh5x7jEjoskUC7uN3o9vpg1oCLS2ePDLtAtyBtbHnkA4xGD7ar8mem xpH9lY/i+sC6CyyIUWcUDnnagKyJP0m9ks0GLsTeOCA0bft2XA6rD6aaCnMUsndT ctrab42CV5XypjmC4U1rPJ8JQJUh1/3P48/8sMH+3krxpJ06KNWNFaUbaMTGiltZ 7x9DngklSYrX0T+2G4kVXNmjaljwkoLahwLla2gUWwBSyofXdqyhQdwZsp01KXNQ UCyT/Pg+aDcm/E7OMV3d4lf7g/CSxiX2GSEe6BlhSz+Lmd7ZJ3g32M1ARGVtaSBN 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 EtJuZYM5blWncBOJCoWMnBEcTEo/viU3GgcVRw=3D=3D =3Dx94R -----END PGP PUBLIC KEY BLOCK----- --------------8oULBJPHbxiQwrMYf5AP4Vdz-- --------------hVmA945qnDUy110iEMbNE5gW-- --------------XbcaJUo88i0kis2Rk2MWhYlP Content-Type: application/pgp-signature; name="OpenPGP_signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="OpenPGP_signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEopQtqVJW1aeuo9/sszaHOrMp8lMFAmla1/sACgkQszaHOrMp 8lMjsg/9GE+tPCpSfOccjfdo0oIJgkAieM00CXrB8nmbXYFu7IrlAcja1J8MCB63 1n1FL5BV6U9+ruWsjRSIxRlE5xn1mLpTKkhEciPumXt4K2hY9opEg9i+5ud28tWe e6nrwoo3vUrihlJxOo1067zDXsPZaQXsqGfuxZZ1HohjuZf0ANHaUFj2fBEifz6+ Y1lKYqz7r2dwPai53ACi6krYw2g8HYGwdg8iEVDlPMwPkeiklNSAhLLRTSlnpHNh cfdw8pdwHxnXWv0RtIFFQChsBtT3sIyDvXCTOXT6ruOzfukBBkWcq0GLQAhZH2T2 VTJZEQTXfJAXWRLmBfr3SQOL9ZHUbsG9kGNemVQ9CCARPWF1EZTEeQhYIj0iNgTK rXCOPX2+6RvDUBIh3/zQg2jox3ch9eHr7x5wQFDp5RrTu22i9AUwWxE1jvyj3qaw MDFbVFPHEuVX/O27yYLkE8c5GSgKR8ZSpxnwCb7VZOeJXz1m0G38gQWJBrLuhkFb c5zc65doci7B9Ok5LkjoJ7TjEGUFCJ2NT04Ofcn89QzlgZLu+nwkb2ss+9Dt399N xCj4qgnGcBgtr5KJCPwEvskb5EYoVVZDx/hz4r2T548rLCeiCXUh3VD8tVRUAd7/ P4N4ueADEV08TRvSXbCXz4YrNOSVGTY4/3HdFL2rXjPYWPs/utU= =2o3s -----END PGP SIGNATURE----- --------------XbcaJUo88i0kis2Rk2MWhYlP--