From 58fd0c5e0b4093644c0169495f2ebab28760277a Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Thu, 28 Nov 2024 20:28:05 +0000 Subject: [PATCH 01/20] feat: v2/linux support --- .cargo/config.toml | 2 + .gitignore | 3 +- Cargo.lock | 742 +++++++++++++++++++++++++------ Cargo.toml | 37 +- asar/index.js | 30 -- build.rs | 36 +- configs/templates/moonlight.toml | 12 + configs/templates/vencord.toml | 5 + rust-toolchain.toml | 2 + src/asar/custom_profile.js | 14 + src/asar/index.js | 10 + {asar => src/asar}/package.json | 0 src/config.rs | 221 +++++++++ src/lib.rs | 140 +++--- src/main.rs | 158 ++----- src/unix.rs | 161 +++++++ 16 files changed, 1210 insertions(+), 363 deletions(-) create mode 100644 .cargo/config.toml delete mode 100644 asar/index.js create mode 100644 configs/templates/moonlight.toml create mode 100644 configs/templates/vencord.toml create mode 100644 rust-toolchain.toml create mode 100644 src/asar/custom_profile.js create mode 100644 src/asar/index.js rename {asar => src/asar}/package.json (100%) create mode 100644 src/config.rs create mode 100644 src/unix.rs diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..7af97f1 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[target.x86_64-unknown-linux-gnu] +rustflags = ["-C", "link-arg=-fuse-ld=mold"] diff --git a/.gitignore b/.gitignore index 0b5e021..56b8fa4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /target -app.asar +/configs/* +!/configs/templates \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index f11dfc5..0a42d0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -43,23 +43,24 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" @@ -76,7 +77,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -86,20 +87,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.48.0", ] -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - [[package]] name = "asar" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7386663b76ee42bd2a0c0314948e129fa29092cf7135e0566c520e69c5b4320" +checksum = "1b9051a11bd40b01b4f8b926956b9f22ff5ef08fcbc7eb34693e2a73982ff85e" dependencies = [ "byteorder", "clap", @@ -138,37 +133,38 @@ dependencies = [ [[package]] name = "base64" -version = "0.13.1" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "block-buffer" -version = "0.10.4" +name = "bincode" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ - "generic-array", + "serde", ] [[package]] -name = "brownstone" -version = "3.0.0" +name = "bitflags" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5839ee4f953e811bfdcf223f509cb2c6a3e1447959b0bff459405575bc17f22" -dependencies = [ - "arrayvec", -] +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "bstr" -version = "0.2.17" +name = "bitflags" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "lazy_static", - "memchr", - "regex-automata 0.1.10", + "generic-array", ] [[package]] @@ -208,14 +204,14 @@ dependencies = [ "iana-time-zone", "num-traits", "serde", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] name = "clap" -version = "4.4.7" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -223,33 +219,33 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.7" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.11.1", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "color-eyre" @@ -304,6 +300,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "const_panic" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "013b6c2c3a14d678f38cd23994b02da3a1a1b6a5d1eedddfe63a5a5f11b13a81" + [[package]] name = "core-foundation-sys" version = "0.8.4" @@ -329,6 +331,16 @@ dependencies = [ "typenum", ] +[[package]] +name = "cstr" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68523903c8ae5aacfa32a0d9ae60cadeb764e1da14ee0d26b1f3089f13a54636" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "darling" version = "0.20.3" @@ -349,8 +361,8 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim", - "syn", + "strsim 0.10.0", + "syn 2.0.79", ] [[package]] @@ -361,7 +373,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.79", ] [[package]] @@ -393,12 +405,79 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "discord_modloader" +version = "2.0.0-beta1" +dependencies = [ + "asar", + "clap", + "detours-sys", + "dirs", + "dll-syringe", + "libc", + "retour", + "serde", + "toml", + "widestring", + "winapi", +] + +[[package]] +name = "dll-syringe" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdc807201d54de75e9bd7ad199d0031048625059f84acfc94506bdb13c0b4f59" +dependencies = [ + "bincode", + "cstr", + "goblin", + "iced-x86", + "konst", + "num_enum", + "path-absolutize", + "same-file", + "serde", + "shrinkwraprs", + "stopwatch2", + "sysinfo", + "thiserror", + "widestring", + "winapi", +] + [[package]] name = "either" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "eyre" version = "0.6.8" @@ -425,23 +504,51 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "gimli" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +[[package]] +name = "goblin" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6b4de4a8eb6c46a8c77e1d3be942cb9a8bf073c22374578e5ba4b08ed0ff68" +dependencies = [ + "log", + "plain", + "scroll", +] + [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hex" @@ -473,16 +580,19 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "iced-x86" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "7c447cff8c7f384a7d4f741cfcff32f75f3ad02b406432e8d6c878d56b1edf6b" +dependencies = [ + "lazy_static", +] [[package]] -name = "indent_write" -version = "2.2.0" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cfe9645a18782869361d9c8732246be7b410ad4e919d3609ebabdac00ba12c3" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indenter" @@ -497,7 +607,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.0", "serde", ] @@ -510,26 +631,35 @@ dependencies = [ "winapi", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" -version = "0.10.5" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" dependencies = [ "either", ] [[package]] -name = "itoa" -version = "1.0.9" +name = "itertools" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] [[package]] -name = "joinery" -version = "2.1.0" +name = "itoa" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72167d68f5fce3b8655487b8038691a3c9984ee769590f93f2a631f4ad64e4f5" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" @@ -540,6 +670,26 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "konst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b65f00fb3910881e52bf0850ae2a82aea411488a557e1c02820ceaa60963dce3" +dependencies = [ + "const_panic", + "konst_kernel", + "typewit", +] + +[[package]] +name = "konst_kernel" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "599c1232f55c72c7fc378335a3efe1c878c92720838c8e6a4fd87784ef7764de" +dependencies = [ + "typewit", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -548,9 +698,29 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.166" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[package]] +name = "libudis86-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139bbf9ddb1bfc90c1ac64dd2923d9c957cd433cee7315c018125d72ab08a6b0" +dependencies = [ + "cc", + "libc", +] [[package]] name = "log" @@ -558,6 +728,15 @@ version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + [[package]] name = "memchr" version = "2.6.4" @@ -580,13 +759,12 @@ dependencies = [ ] [[package]] -name = "modhook" -version = "1.0.2" +name = "mmap-fixed-fixed" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0681853891801e4763dc252e843672faf32bcfee27a0aa3b19733902af450acc" dependencies = [ - "asar", - "clap", - "detours-sys", - "widestring", + "libc", "winapi", ] @@ -601,18 +779,20 @@ dependencies = [ ] [[package]] -name = "nom-supreme" -version = "0.8.0" +name = "ntapi" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd3ae6c901f1959588759ff51c95d24b491ecb9ff91aa9c2ef4acc5b1dcab27" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" dependencies = [ - "brownstone", - "indent_write", - "joinery", - "memchr", - "nom", + "winapi", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-traits" version = "0.2.17" @@ -622,6 +802,26 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "object" version = "0.32.1" @@ -637,18 +837,48 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "owo-colors" version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" +[[package]] +name = "path-absolutize" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4af381fe79fa195b4909485d99f73a80792331df0625188e707854f0b3383f5" +dependencies = [ + "path-dedot", +] + +[[package]] +name = "path-dedot" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ba0ad7e047712414213ff67533e6dd477af0a4e1d14fb52343e53d30ea9397" +dependencies = [ + "once_cell", +] + [[package]] name = "pin-project-lite" version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "pori" version = "0.0.0" @@ -666,22 +896,33 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "regex" version = "1.10.2" @@ -690,16 +931,10 @@ checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", + "regex-automata", "regex-syntax", ] -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" - [[package]] name = "regex-automata" version = "0.4.3" @@ -717,6 +952,34 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "region" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b6ebd13bc009aef9cd476c1310d49ac354d36e240cf1bd753290f3dc7199a7" +dependencies = [ + "bitflags 1.3.2", + "libc", + "mach2", + "windows-sys 0.52.0", +] + +[[package]] +name = "retour" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9af44d40e2400b44d491bfaf8eae111b09f23ac4de6e92728e79d93e699c527" +dependencies = [ + "cfg-if", + "generic-array", + "libc", + "libudis86-sys", + "mmap-fixed-fixed", + "once_cell", + "region", + "slice-pool2", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -738,24 +1001,44 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "serde" -version = "1.0.192" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] @@ -769,17 +1052,28 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "serde_with" -version = "2.3.3" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ "base64", "chrono", "hex", - "indexmap", + "indexmap 1.9.3", + "indexmap 2.6.0", "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -787,14 +1081,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "2.3.3" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] @@ -818,10 +1112,29 @@ dependencies = [ ] [[package]] -name = "smallvec" -version = "1.11.1" +name = "shrinkwraprs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e63e6744142336dfb606fe2b068afa2e1cca1ee6a5d8377277a92945d81fa331" +dependencies = [ + "bitflags 1.3.2", + "itertools 0.8.2", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "slice-pool2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a3d689654af89bdfeba29a914ab6ac0236d382eb3b764f7454dde052f2821f8" + +[[package]] +name = "stopwatch2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "911ece10388afa48417f99e01df038460b6249a3ee0255f6446a6881b702fbb4" [[package]] name = "strsim" @@ -829,17 +1142,48 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" -version = "2.0.39" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sysinfo" +version = "0.29.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd727fc423c2060f6c92d9534cef765c65a6ed3f428a03d7def74a8c4348e666" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "winapi", +] + [[package]] name = "thiserror" version = "1.0.50" @@ -857,7 +1201,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] @@ -872,12 +1216,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.30" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -892,13 +1237,48 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap 2.6.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tracing" version = "0.1.40" @@ -946,6 +1326,21 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "typewit" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51dbd25812f740f45e2a9769f84711982e000483b13b73a8a1852e092abac8c" +dependencies = [ + "typewit_proc_macros", +] + +[[package]] +name = "typewit_proc_macros" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36a83ea2b3c704935a01b4642946aadd445cea40b10935e3f8bd8052b8193d6" + [[package]] name = "unicode-ident" version = "1.0.12" @@ -986,6 +1381,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" version = "0.2.88" @@ -1007,7 +1408,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.79", "wasm-bindgen-shared", ] @@ -1029,7 +1430,7 @@ checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1042,27 +1443,24 @@ checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "wax" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c7a3bac6110ac062b7b422a442b7ee23e07209e2784a036654cab1e71bbafc" +checksum = "8d12a78aa0bab22d2f26ed1a96df7ab58e8a93506a3e20adb47c51a93b4e1357" dependencies = [ - "bstr", "const_format", - "itertools", + "itertools 0.11.0", "nom", - "nom-supreme", "pori", "regex", - "smallvec", "thiserror", "walkdir", ] [[package]] name = "widestring" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -1101,7 +1499,7 @@ version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -1110,7 +1508,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -1119,13 +1526,29 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "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 = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -1134,38 +1557,95 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] diff --git a/Cargo.toml b/Cargo.toml index 3cb7a34..fea8e60 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,17 +1,36 @@ [package] edition = "2021" -name = "modhook" -version = "1.0.2" +name = "discord_modloader" +version = "2.0.0-beta1" [lib] -crate-type = ["cdylib"] -name = "libmodhook" +crate-type = ["cdylib", "lib"] +name = "discord_modloader" [dependencies] -clap = { version = "4.4.7", features = ["derive"] } -detours-sys = {version = "0.1.2"} -widestring = "1.0.2" -winapi = {version = "0.3.9", features = ["winbase", "handleapi", "minwindef", "consoleapi", "winnt", "memoryapi", "namedpipeapi"]} +asar = "0.3.0" +clap = { version = "4.5.20", features = ["derive"] } +dirs = "5.0.1" +serde = { version = "1.0.210", features = ["serde_derive"] } +toml = "0.8.19" + +[target.'cfg(windows)'.dependencies] +winapi = { version = "0.3.9", features = [ + "winbase", + "handleapi", + "minwindef", + "consoleapi", + "winnt", + "memoryapi", + "namedpipeapi", +] } +dll-syringe = "0.15.2" +detours-sys = { version = "0.1.2" } +widestring = "1.1.0" + +[target.'cfg(unix)'.dependencies] +libc = "0.2.166" +retour = { version = "0.3.1", features = ["static-detour"] } [build-dependencies] -asar = "0.2.0" +asar = "0.3.0" diff --git a/asar/index.js b/asar/index.js deleted file mode 100644 index 87fa2f8..0000000 --- a/asar/index.js +++ /dev/null @@ -1,30 +0,0 @@ -/// BEGIN MODHOOK INFO /// -const CUSTOM_DATA_DIR = process.env.MODHOOK_CUSTOM_DATA_DIR; -const MOD_ENTRYPOINT = process.env.MODHOOK_MOD_ENTRYPOINT; -const IS_MOONLIGHT = process.env.MODHOOK_IS_MOONLIGHT; -/// END MODHOOK INFO /// - -if (CUSTOM_DATA_DIR) { - const { app } = require("electron"); - const customAppDir = - app.getPath("appData") + "\\DiscordModHook\\AppData\\" + CUSTOM_DATA_DIR; - const _setPath = app.setPath; - - app.setPath = function (name, path) { - if (name === "userData") { - _setPath.call(app, name, customAppDir); - } else { - _setPath.call(app, name, path); - } - }; - - app.setPath("userData", customAppDir); -} - -if (IS_MOONLIGHT) { - require(MOD_ENTRYPOINT).inject( - require("path").resolve(__dirname, "..\\_app.asar") - ); -} else { - require(MOD_ENTRYPOINT); -} diff --git a/build.rs b/build.rs index 1e8ee8c..d901e1e 100644 --- a/build.rs +++ b/build.rs @@ -1,26 +1,28 @@ -use asar::AsarWriter; -use std::env; -use std::error::Error; +// use asar::AsarWriter; +// use std::env; +// use std::error::Error; -use std::fs::File; -use std::path::PathBuf; +// use std::fs::File; +// use std::path::PathBuf; -static ASAR_INDEX: &[u8] = include_bytes!("asar/index.js"); -static ASAR_PACKAGE: &[u8] = include_bytes!("asar/package.json"); +// static ASAR_INDEX: &[u8] = include_bytes!("asar/index.js"); +// static ASAR_PACKAGE: &[u8] = include_bytes!("asar/package.json"); -fn main() -> std::result::Result<(), Box> { - let mut asar = AsarWriter::new(); +// fn main() -> std::result::Result<(), Box> { +// let mut asar = AsarWriter::new(); - asar.write_file("index.js", ASAR_INDEX, true)?; - asar.write_file("package.json", ASAR_PACKAGE, true)?; +// asar.write_file("index.js", ASAR_INDEX, true)?; +// asar.write_file("package.json", ASAR_PACKAGE, true)?; - let mut out_dir = PathBuf::from("target"); +// let mut out_dir = PathBuf::from("target"); - out_dir.push(env::var("PROFILE")?); +// out_dir.push(env::var("PROFILE")?); - out_dir.push("app.asar"); +// out_dir.push("app.asar"); - asar.finalize(File::create(out_dir.to_str().unwrap())?)?; +// asar.finalize(File::create(out_dir.to_str().unwrap())?)?; - Ok(()) -} +// Ok(()) +// } + +fn main() {} \ No newline at end of file diff --git a/configs/templates/moonlight.toml b/configs/templates/moonlight.toml new file mode 100644 index 0000000..41205ee --- /dev/null +++ b/configs/templates/moonlight.toml @@ -0,0 +1,12 @@ +[mod] +name = "moonlight" +path = "/path/to/moonlight/dist" +entrypoint = "injector.js" +icon = "moonlight.png" + +[mod.loader] +require = """ +require("__MOD_ENTRYPOINT_FILE__").inject( + require("path").resolve(__dirname, "../_app.asar") +); +""" diff --git a/configs/templates/vencord.toml b/configs/templates/vencord.toml new file mode 100644 index 0000000..b196962 --- /dev/null +++ b/configs/templates/vencord.toml @@ -0,0 +1,5 @@ +[mod] +name = "Vencord" +path = "/path/to/vencord/dist" +entrypoint = "patcher.js" +icon = "vencord.png" diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..5d56faf --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "nightly" diff --git a/src/asar/custom_profile.js b/src/asar/custom_profile.js new file mode 100644 index 0000000..9d09e1e --- /dev/null +++ b/src/asar/custom_profile.js @@ -0,0 +1,14 @@ +const { app } = require("electron"); +const customAppDir = "__CUSTOM_PROFILE_DIR__"; + +const _setPath = app.setPath; + +app.setPath = function (name, path) { + if (name === "userData") { + _setPath.call(app, name, customAppDir); + } else { + _setPath.call(app, name, path); + } +}; + +app.setPath("userData", customAppDir); diff --git a/src/asar/index.js b/src/asar/index.js new file mode 100644 index 0000000..0d034f8 --- /dev/null +++ b/src/asar/index.js @@ -0,0 +1,10 @@ +// This is how the index.js is laid out. +// This file is not directly used in the code, and is just a reference. + +__PREFIX__ + +__CUSTOM_PROFILE__ + +__REQUIRE__ + +__SUFFIX__ \ No newline at end of file diff --git a/asar/package.json b/src/asar/package.json similarity index 100% rename from asar/package.json rename to src/asar/package.json diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..9f73f51 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,221 @@ +use std::collections::HashMap; + +use serde::Deserialize; + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum ConfigFile { + Instance(Instance), + Mod(Mod), +} + +#[derive(Debug)] +pub struct Config { + pub mods: HashMap, + pub instances: HashMap, +} + +impl Config { + pub fn validate(&mut self) { + for (_, mod_) in self.mods.iter_mut() { + let entrypoint_exists = std::path::Path::new(&mod_.path) + .join(&mod_.entrypoint) + .exists(); + + mod_.is_valid = entrypoint_exists; + } + + for (_, instance) in self.instances.iter_mut() { + if let Some(target_mod) = self.mods.get(&instance.r#mod) { + let asar_exists: bool = std::path::Path::new(&instance.path) + .parent() + .expect("Expected Discord executable path to have a parent.") + .join("resources") + .join("app.asar") + .exists(); + + instance.is_valid = target_mod.is_valid && asar_exists; + } else { + instance.is_valid = false; + } + } + } + + pub fn init() -> Config { + let profiles_dir = dirs::data_local_dir().unwrap().join("discord-modloader"); + + println!("Loading from profile directory: {}", profiles_dir.display()); + + if !profiles_dir.exists() { + std::fs::create_dir_all(&profiles_dir).expect("Unable to create profiles directory."); + } + + let configs_dir = dirs::config_local_dir().unwrap().join("discord-modloader"); + + let instances_dir = configs_dir.join("instances"); + let mods_dir = configs_dir.join("mods"); + + if !instances_dir.exists() { + std::fs::create_dir_all(&instances_dir).expect("Unable to create instances directory."); + } + + if !mods_dir.exists() { + std::fs::create_dir_all(&mods_dir).expect("Unable to create mods directory."); + } + + let instances = std::fs::read_dir(&instances_dir).unwrap(); + let mods = std::fs::read_dir(&mods_dir).unwrap(); + + println!("Loading instances from: {:?}", &instances_dir); + + let mut mod_configs: HashMap = HashMap::new(); + for mod_file in mods { + let mod_path = mod_file.unwrap(); + let mod_file = ConfigFile::from_file(mod_path.path().to_str().unwrap()); + let mod_name = mod_path + .path() + .with_extension("") + .file_name() + .unwrap() + .to_str() + .unwrap() + .to_string(); + + if let ConfigFile::Mod(mut mod_file) = mod_file { + mod_file.config_path = mod_path + .path() + .canonicalize() + .expect("Unable to locate config file.") + .to_str() + .unwrap() + .to_string(); + mod_configs.insert(mod_name, mod_file); + } else { + panic!("Instance file found in mods directory."); + } + } + + let mut instance_configs: HashMap = HashMap::new(); + for instance_file in instances { + let instance_path = instance_file.unwrap(); + let instance_file = ConfigFile::from_file(instance_path.path().to_str().unwrap()); + let instance_name = instance_path + .path() + .with_extension("") + .file_name() + .unwrap() + .to_str() + .unwrap() + .to_string(); + + if let ConfigFile::Instance(mut instance_file) = instance_file { + instance_file.config_path = instance_path + .path() + .canonicalize() + .expect("Unable to locate config file.") + .to_str() + .unwrap() + .to_string(); + + instance_file.profile_path = instance_file + .profile + .as_ref() + .map(|profile| profiles_dir.join(profile).to_str().unwrap().to_string()); + + instance_configs.insert(instance_name, instance_file); + } else { + panic!("Mod file found in instances directory."); + } + } + + Config { + mods: mod_configs, + instances: instance_configs, + } + } +} + +impl ConfigFile { + fn from_file(path: &str) -> Self { + let file = std::fs::read_to_string(path).unwrap(); + let config: ConfigFile = toml::from_str(&file).unwrap(); + config + } +} + +#[derive(Debug, Deserialize)] +pub struct Instance { + /// The display name of the instance. (e.g. "Vencord", "Moonlight", "My Custom Instance") + /// + /// Can be duplicate, but not recommended for clarity. + pub name: String, + + /// A path to the icon to use for the mod. + pub icon: Option, + + /// The custom profile to use. + /// This will run a unique chrome profile for the mod, + /// allowing for multiple instances of Discord to run at the same time. + pub profile: Option, + + /// The identifier of the mod to use for this instance. + pub r#mod: String, + + // pub description: String, + pub path: String, + + #[serde(skip, default)] + pub is_valid: bool, + + #[serde(skip, default)] + pub config_path: String, + + #[serde(skip, default)] + pub profile_path: Option, +} + +#[derive(Debug, Deserialize)] +pub struct Mod { + /// The display name of the mod. (e.g. "Vencord", "Moonlight", "BetterDiscord") + /// + /// Can be duplicate, but not recommended for clarity. + pub name: String, + + /// A path to the icon to use for the mod. + pub icon: Option, + + /// The path to the mod's dist folder. (e.g. "/path/to/moonlight") + pub path: String, + + /// The entrypoint of the mod. (e.g. "injector.js", "patcher.js") + pub entrypoint: String, + + /// Provide custom loader JS to be injected into the ASAR index.js. + pub loader: Option, + + #[serde(skip, default)] + pub is_valid: bool, + + #[serde(skip, default)] + pub config_path: String, +} + +/// The loader configuration for the mod. +/// You can use this to specify custom JS to be in your ASAR's index.js. +/// +/// The following variables can be used: +/// +/// - `__CUSTOM_PROFILE_DIR__`: The directory of the custom profile. +/// - `__MOD_ENTRYPOINT_FILE__`: The entrypoint file of the mod. +#[derive(Debug, Deserialize)] +pub struct ModLoader { + pub prefix: Option, + pub profile: Option, + #[serde(default = "default_require")] + pub require: Option, + pub suffix: Option, +} + +fn default_require() -> Option { + Some(r#"require("__MOD_ENTRYPOINT_FILE__")"#.to_string()) +} diff --git a/src/lib.rs b/src/lib.rs index 1d3e76a..b9430c0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,62 +1,100 @@ -use std::{ffi::c_void, ptr::null_mut}; - -use detours_sys::{ - DetourAttach, DetourGetEntryPoint, DetourIsHelperProcess, DetourRestoreAfterWith, - DetourTransactionBegin, DetourTransactionCommit, DetourUpdateThread, -}; - -use winapi::{ - shared::minwindef::{BOOL, DWORD, HINSTANCE, LPVOID}, - um::{processthreadsapi::GetCurrentThread, winnt::DLL_PROCESS_ATTACH}, -}; - -#[cfg(debug_assertions)] -use winapi::um::consoleapi::AllocConsole; -// use crate::detours::fs::create_asar_in_memory; - -mod detours; -mod env; - -static mut O_ENTRYPOINT: *mut c_void = 0 as _; - -#[no_mangle] -extern "cdecl" fn ExportedFunction() {} - -#[no_mangle] -unsafe extern "stdcall" fn DllMain( - _hinst_dll: HINSTANCE, - fwd_reason: DWORD, - _lpv_reserved: LPVOID, -) -> BOOL { - if DetourIsHelperProcess() == 1 { - return 1; +pub mod config; +mod unix; + +#[cfg(target_os = "linux")] +#[allow(unused_imports)] +pub use unix::*; + +pub fn get_or_write_cache(instance: &config::Instance, mod_: &config::Mod) -> String { + let cache_dir = dirs::cache_dir().unwrap().join("discord-modloader"); + if !cache_dir.exists() { + std::fs::create_dir_all(&cache_dir).unwrap(); } - if fwd_reason != DLL_PROCESS_ATTACH { - return 1; + let asar_dir = cache_dir.join("asar"); + if !asar_dir.exists() { + std::fs::create_dir_all(&asar_dir).unwrap(); } - DetourRestoreAfterWith(); + let cached_asar_path = asar_dir.join(format!("{}-{}.asar", instance.r#mod, mod_.name)); + // TODO: Figure out a way to cache, while also regenerating if the mod or instance config changes. + // if cached_asar_path.exists() { + // return cached_asar_path.to_str().unwrap().to_owned(); + // } + + static ASAR_CUSTOM_PROFILE_JS: &str = include_str!("./asar/custom_profile.js"); - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread() as _); + if let Some(ref profile) = instance.profile_path { + let profile_path = std::path::Path::new(profile); + if !profile_path.exists() { + std::fs::create_dir_all(&profile_path).unwrap(); + } + } - O_ENTRYPOINT = DetourGetEntryPoint(null_mut()); - DetourAttach(&mut O_ENTRYPOINT, main as _); + let mod_entrypoint = std::path::Path::new(&mod_.path).join(&mod_.entrypoint); + let mod_entrypoint = mod_entrypoint.to_str().unwrap(); - detours::win32::init_detours(); + let profile_dir = instance.profile_path.clone().unwrap_or_default(); - DetourTransactionCommit(); + let profile_loader = instance.profile.as_ref().map(|_| { + ASAR_CUSTOM_PROFILE_JS + .replace("__CUSTOM_PROFILE_DIR__", &profile_dir) + .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + }); - 1 -} + let custom_loader = if let Some(loader) = &mod_.loader { + let prefix = loader + .prefix + .as_ref() + .map(|p| { + p.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) + .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + }) + .unwrap_or_default(); -unsafe fn main() { - #[cfg(debug_assertions)] - { - AllocConsole(); - println!("[ModHook] Process Hooked"); - } - let start_discord: extern "C" fn() = std::mem::transmute(O_ENTRYPOINT); - start_discord(); + let custom_profile = loader + .profile + .as_ref() + .map(|p| { + p.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) + .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + }) + .unwrap_or(profile_loader.unwrap_or_default()); + + let require = loader + .require + .as_ref() + .map(|r| { + r.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) + .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + }) + .unwrap_or(format!(r#"require("{}")"#, mod_entrypoint)); + + let suffix = loader + .suffix + .as_ref() + .map(|s| { + s.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) + .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + }) + .unwrap_or_default(); + + format!("{}\n{}\n{}\n{}", prefix, custom_profile, require, suffix) + } else { + format!( + "{}\nrequire(\"{}\")", + profile_loader.unwrap_or_default(), + mod_entrypoint + ) + }; + + let mut asar = asar::AsarWriter::new(); + asar.write_file("index.js", custom_loader, false).unwrap(); + asar.write_file("package.json", include_bytes!("./asar/package.json"), false) + .unwrap(); + + asar.finalize(std::fs::File::create(&cached_asar_path).unwrap()) + .unwrap(); + + cached_asar_path.to_str().unwrap().to_owned() } diff --git a/src/main.rs b/src/main.rs index f4f627a..aed5f3b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,138 +1,48 @@ -use std::{ffi::CString, mem::MaybeUninit, ptr::null_mut}; - use clap::Parser; -use detours_sys::{DetourCreateProcessWithDllExA, _PROCESS_INFORMATION, _STARTUPINFOA}; -use env::Environment; -use winapi::um::{ - handleapi::CloseHandle, processthreadsapi::ResumeThread, winbase::CREATE_SUSPENDED, -}; - -mod discord; -mod env; - -static DLL_PATH: &str = "libmodhook.dll"; - -#[derive(Parser, Debug)] -#[command(name = "modhook", verbatim_doc_comment)] -/// Discord ModHook -/// For more information, visit: -pub struct Args { - /// Path to the Discord folder. - /// Example: --discord-path "c:\users\megu\appdata\roaming\discordptb" - #[arg(short, long, verbatim_doc_comment)] - pub discord_path: String, - - /// Path to the mods' JS entrypoint. - /// Example: --mod-entrypoint "c:\users\megu\vencord\patcher.js" - #[arg(short, long, verbatim_doc_comment)] - pub mod_entrypoint: String, - - /// Modded ASAR filename. - /// - /// This is the file that the mod (e.g. Vencord) loads - /// to return to the original Discord context. - /// - /// This is NOT required for Vencord or Replugged. - /// - /// ModHook will redirect calls to this file to the original app.asar (e.g. _app.asar -> app.asar) - /// - /// example: --modded-asar-filename "_app.asar" - #[arg(short = 'f', long, verbatim_doc_comment)] - pub modded_asar_filename: Option, - /// Path to check for to revert to default app.asar behaviour after the mod has loaded. - /// Example: --toggle-query "vencord\patcher.js" - #[arg(short, long, verbatim_doc_comment)] - pub toggle_query: Option, +use discord_modloader::{config, get_or_write_cache}; - /// Custom name for AppData profile. - /// Example: --custom-data-dir "MyCustomProfile" - #[arg(short, long, verbatim_doc_comment)] - pub custom_data_dir: Option, - - /// ModHook ASAR replacement. - /// Example: --asar-path "c:\users\megu\vencord\app.asar" - #[arg(short, long, verbatim_doc_comment)] - pub asar_path: Option, - - /// Whether or not the mod is the moonlight mod. - /// Example: --moonlight - /// Moonlight uses `require(entrypoint).inject(asarPath);` - /// instead of the usual `require(entrypoint);` - #[arg(value_enum, long = "moonlight", verbatim_doc_comment)] - pub is_moonlight: bool, +#[derive(clap::Parser, Debug)] +struct Args { + #[clap(short, long)] + pub instance: String, } fn main() { - let args: Args = Args::parse(); - - let target_exe = discord::get_discord_executable(&args.discord_path).unwrap(); - let target_exe = target_exe.to_str().unwrap(); - - let mut asar_path = std::env::current_dir().unwrap(); + let mut config = config::Config::init(); + config.validate(); - asar_path.push("app.asar"); - - let asar_path = asar_path.to_str().unwrap().to_string(); - - let mut dll_path = std::env::current_dir().unwrap(); - dll_path.push(DLL_PATH); - - let environment = Environment { - asar_path: Some(asar_path), - mod_entrypoint: args.mod_entrypoint, - toggle_query: args.toggle_query, - custom_data_dir: args.custom_data_dir, - modded_asar_filename: args.modded_asar_filename, - is_moonlight: args.is_moonlight, - }; + let args: Args = Args::parse(); - unsafe { - inject(dll_path.to_str().unwrap(), target_exe, &environment).unwrap(); + if let Some(instance) = config.instances.get(&args.instance) { + load_profile(&config, instance); + } else { + println!("Instance not found. Make sure it exists in the instances directory."); } } -/// # Safety -/// This function is unsafe because it calls the WinAPI. -pub unsafe fn inject( - dll_path: &str, - target_exe: &str, - environment: &Environment, -) -> std::io::Result<()> { - let cstr_target_exe = CString::new(target_exe)?; - let cstr_dll_path = CString::new(dll_path)?; - - let mut process_info: _PROCESS_INFORMATION = MaybeUninit::zeroed().assume_init(); - let mut startup_info: _STARTUPINFOA = MaybeUninit::zeroed().assume_init(); - - environment.apply(); - - let result = DetourCreateProcessWithDllExA( - null_mut(), - cstr_target_exe.as_ptr() as *mut i8, - null_mut(), - null_mut(), - 0, - CREATE_SUSPENDED, - null_mut(), - null_mut(), - &mut startup_info as *mut _, - &mut process_info as *mut _, - cstr_dll_path.as_ptr(), - None, - ); - - if result == 0 { - return Err(std::io::Error::new( - std::io::ErrorKind::Other, - "Failed to create process", - )); +#[cfg(target_os = "linux")] +fn load_profile(config: &config::Config, instance: &config::Instance) { + println!("Loading Instance: {}", instance.name); + if let Some(ref profile_path) = instance.profile_path { + println!("On profile: {}", profile_path) } - ResumeThread(process_info.hThread as _); - - CloseHandle(process_info.hProcess as _); - CloseHandle(process_info.hThread as _); - - Ok(()) + let asar_path = get_or_write_cache(instance, config.mods.get(&instance.r#mod).unwrap()); + + let mut target = std::process::Command::new(instance.path.clone()) + .current_dir(std::path::Path::new(&instance.path).parent().unwrap()) + // TODO: move libmodhook.so into global libs dir + .env( + "LD_PRELOAD", + "/home/megu/Workspace/Discord/Discord-ModLoader/target/debug/libdiscord_modloader.so", + ) + .env("MODLOADER_ASAR_PATH", asar_path) + .args(&["--trace-warnings"]) + .spawn() + .expect("Failed to launch instance."); + + target + .wait() + .expect("Failed to wait for instance to finish."); } diff --git a/src/unix.rs b/src/unix.rs new file mode 100644 index 0000000..215f36f --- /dev/null +++ b/src/unix.rs @@ -0,0 +1,161 @@ +use std::{ + ffi::{c_char, c_void}, + sync::LazyLock, +}; + +use retour::static_detour; + +static MODLOADER_ASAR_PATH: LazyLock = + LazyLock::new(|| std::env::var("MODLOADER_ASAR_PATH").unwrap()); + +#[link(name = "dl")] +extern "C" { + fn dlsym(handle: *const c_void, symbol: *const c_char) -> *const c_void; +} + +extern "C" { + #[link_name = "uv_fs_lstat"] + fn original_uv_fs_lstat( + loop_: *const c_void, + req: *const c_void, + path: *const c_char, + buf: *mut c_void, + ) -> i32; +} + +type MainFn = extern "C" fn(i32, *const *const c_void, *const *const c_void) -> i32; + +type LibcStartMainFn = fn( + MainFn, + i32, + *const *const char, + MainFn, + extern "C" fn(), + extern "C" fn(), + *mut c_void, +) -> i32; + +#[no_mangle] +unsafe extern "C" fn __libc_start_main( + main: MainFn, + argc: i32, + argv: *const *const char, + init: MainFn, + fini: extern "C" fn(), + rtld_fini: extern "C" fn(), + stack_end: *mut c_void, +) -> i32 { + UvFsLstatDetour + .initialize( + std::mem::transmute::(original_uv_fs_lstat), + uv_fs_lstat, + ) + .unwrap(); + + UvFsLstatDetour.enable().unwrap(); + + let orig_libc_start_main_addr: *const c_void = dlsym( + libc::RTLD_NEXT, + c"__libc_start_main".as_ptr() as *const c_char, + ); + + let orig_libc_start_main: LibcStartMainFn = std::mem::transmute(orig_libc_start_main_addr); + + orig_libc_start_main(main, argc, argv, init, fini, rtld_fini, stack_end) +} + +type UvFsLstat = unsafe extern "C" fn( + loop_: *const c_void, + req: *const c_void, + path: *const c_char, + cb: *mut c_void, +) -> i32; + +static_detour! { + static UvFsLstatDetour: fn(*const c_void, *const c_void, *const c_char, *mut c_void) -> i32; +} + +#[no_mangle] +#[export_name = "uv_fs_lstat"] +unsafe extern "C" fn export_uv_vs_lstat( + loop_: *const c_void, + req: *const c_void, + path: *const c_char, + buf: *mut c_void, +) -> i32 { + uv_fs_lstat(loop_, req, path, buf) +} + +fn uv_fs_lstat( + loop_: *const c_void, + req: *const c_void, + path: *const c_char, + buf: *mut c_void, +) -> i32 { + let path_str = unsafe { std::ffi::CStr::from_ptr(path).to_str().unwrap() }; + if path_str.contains("resources/_app.asar") { + let redirect_to = path_str.replace("/_app.asar", "/app.asar"); + let redirect_to_c = std::ffi::CString::new(redirect_to.as_str()).unwrap(); + return UvFsLstatDetour.call(loop_, req, redirect_to_c.as_ptr(), buf); + } + + UvFsLstatDetour.call(loop_, req, path, buf) +} + +type XStat64 = unsafe extern "C" fn(i32, *const c_char, *mut libc::stat64) -> i64; + +#[no_mangle] +unsafe extern "C" fn __xstat64(ver: i32, path: *const c_char, out: *mut libc::stat64) -> i64 { + use std::sync::LazyLock; + + static ORIGINAL_XSTAT64: LazyLock = LazyLock::new(|| unsafe { + std::mem::transmute(dlsym(libc::RTLD_NEXT, c"__xstat64".as_ptr())) + }); + + let path_str = std::ffi::CStr::from_ptr(path).to_str().unwrap(); + + // If calling _app.asar, return the original app.asar + if path_str.contains("resources/_app.asar") { + let redirect_to = path_str.replace("/_app.asar", "/app.asar"); + let redirect_to_c = std::ffi::CString::new(redirect_to.as_str()).unwrap(); + return ORIGINAL_XSTAT64(ver, redirect_to_c.as_ptr(), out); + } + + // If calling app.asar, return the custom app.asar + if path_str.contains("resources/app.asar") { + let asar_path_cstr = std::ffi::CString::new(MODLOADER_ASAR_PATH.as_str()).unwrap(); + return ORIGINAL_XSTAT64(ver, asar_path_cstr.as_ptr(), out); + } + + ORIGINAL_XSTAT64(ver, path, out) +} + +type Open64 = unsafe extern "C" fn(*const c_char, i32, i32) -> i32; + +#[no_mangle] +unsafe extern "C" fn open64(path: *const c_char, flags: i32, mode: i32) -> i32 { + use std::sync::LazyLock; + + static ORIGINAL_OPENAT64: LazyLock = LazyLock::new(|| unsafe { + std::mem::transmute(dlsym(libc::RTLD_NEXT, c"open64".as_ptr())) + }); + + let path_str = std::ffi::CStr::from_ptr(path).to_str().unwrap(); + + // If calling _app.asar, return the original app.asar + if path_str.contains("resources/_app.asar") { + let redirect_to = path_str.replace("/_app.asar", "/app.asar"); + let redirect_to_c = std::ffi::CString::new(redirect_to.as_str()).unwrap(); + + return ORIGINAL_OPENAT64(redirect_to_c.as_ptr(), flags, mode); + } + + // If calling app.asar, return the custom app.asar + if path_str.contains("resources/app.asar") { + let redirect_to = std::ffi::CString::new(MODLOADER_ASAR_PATH.as_str()).unwrap(); + + return ORIGINAL_OPENAT64(redirect_to.as_ptr(), flags, mode); + } + + ORIGINAL_OPENAT64(path, flags, mode) +} From 9aa89518e36c14e0d7f369c718fe65bb7c292f6b Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Thu, 28 Nov 2024 20:28:05 +0000 Subject: [PATCH 02/20] feat: v2/linux support --- .cargo/config.toml | 2 + .gitignore | 3 +- Cargo.lock | 989 +++++++++++++++++++++++-------- Cargo.toml | 36 +- asar/index.js | 30 - build.rs | 26 - configs/templates/moonlight.toml | 12 + configs/templates/vencord.toml | 5 + rust-toolchain.toml | 2 + src/asar/custom_profile.js | 14 + src/asar/index.js | 10 + {asar => src/asar}/package.json | 0 src/config.rs | 221 +++++++ src/lib.rs | 142 +++-- src/main.rs | 176 ++---- src/unix.rs | 161 +++++ 16 files changed, 1343 insertions(+), 486 deletions(-) create mode 100644 .cargo/config.toml delete mode 100644 asar/index.js delete mode 100644 build.rs create mode 100644 configs/templates/moonlight.toml create mode 100644 configs/templates/vencord.toml create mode 100644 rust-toolchain.toml create mode 100644 src/asar/custom_profile.js create mode 100644 src/asar/index.js rename {asar => src/asar}/package.json (100%) create mode 100644 src/config.rs create mode 100644 src/unix.rs diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..7af97f1 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[target.x86_64-unknown-linux-gnu] +rustflags = ["-C", "link-arg=-fuse-ld=mold"] diff --git a/.gitignore b/.gitignore index 0b5e021..56b8fa4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /target -app.asar +/configs/* +!/configs/templates \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index ed3ca30..f51255e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -43,63 +43,58 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.59.0", ] -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - [[package]] name = "asar" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7386663b76ee42bd2a0c0314948e129fa29092cf7135e0566c520e69c5b4320" +checksum = "1b9051a11bd40b01b4f8b926956b9f22ff5ef08fcbc7eb34693e2a73982ff85e" dependencies = [ "byteorder", "clap", @@ -117,15 +112,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -138,44 +133,45 @@ dependencies = [ [[package]] name = "base64" -version = "0.13.1" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "block-buffer" -version = "0.10.4" +name = "bincode" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ - "generic-array", + "serde", ] [[package]] -name = "brownstone" -version = "3.0.0" +name = "bitflags" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5839ee4f953e811bfdcf223f509cb2c6a3e1447959b0bff459405575bc17f22" -dependencies = [ - "arrayvec", -] +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "bstr" -version = "0.2.17" +name = "bitflags" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "lazy_static", - "memchr", - "regex-automata 0.1.10", + "generic-array", ] [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byteorder" @@ -185,11 +181,11 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cc" -version = "1.0.83" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" dependencies = [ - "libc", + "shlex", ] [[package]] @@ -200,22 +196,22 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", "serde", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] name = "clap" -version = "4.4.7" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" +checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" dependencies = [ "clap_builder", "clap_derive", @@ -223,9 +219,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.7" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" +checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" dependencies = [ "anstream", "anstyle", @@ -235,27 +231,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.89", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" [[package]] name = "color-eyre" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" +checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" dependencies = [ "backtrace", "color-spantrace", @@ -268,9 +264,9 @@ dependencies = [ [[package]] name = "color-spantrace" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" dependencies = [ "once_cell", "owo-colors", @@ -280,41 +276,47 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "const_format" -version = "0.2.32" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" dependencies = [ "const_format_proc_macros", ] [[package]] name = "const_format_proc_macros" -version = "0.2.32" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] +[[package]] +name = "const_panic" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "013b6c2c3a14d678f38cd23994b02da3a1a1b6a5d1eedddfe63a5a5f11b13a81" + [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -329,11 +331,21 @@ dependencies = [ "typenum", ] +[[package]] +name = "cstr" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68523903c8ae5aacfa32a0d9ae60cadeb764e1da14ee0d26b1f3089f13a54636" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "darling" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -341,34 +353,34 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.89", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.89", ] [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", "serde", @@ -393,17 +405,84 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "discord_modloader" +version = "2.0.0-beta1" +dependencies = [ + "asar", + "clap", + "detours-sys", + "dirs", + "dll-syringe", + "libc", + "retour", + "serde", + "toml", + "widestring", + "winapi", +] + +[[package]] +name = "dll-syringe" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdc807201d54de75e9bd7ad199d0031048625059f84acfc94506bdb13c0b4f59" +dependencies = [ + "bincode", + "cstr", + "goblin", + "iced-x86", + "konst", + "num_enum", + "path-absolutize", + "same-file", + "serde", + "shrinkwraprs", + "stopwatch2", + "sysinfo", + "thiserror", + "widestring", + "winapi", +] + [[package]] name = "either" -version = "1.9.0" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "eyre" -version = "0.6.8" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" dependencies = [ "indenter", "once_cell", @@ -425,11 +504,33 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "goblin" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "0d6b4de4a8eb6c46a8c77e1d3be942cb9a8bf073c22374578e5ba4b08ed0ff68" +dependencies = [ + "log", + "plain", + "scroll", +] [[package]] name = "hashbrown" @@ -437,11 +538,17 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hex" @@ -451,9 +558,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -473,16 +580,19 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "iced-x86" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "7c447cff8c7f384a7d4f741cfcff32f75f3ad02b406432e8d6c878d56b1edf6b" +dependencies = [ + "lazy_static", +] [[package]] -name = "indent_write" -version = "2.2.0" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cfe9645a18782869361d9c8732246be7b410ad4e919d3609ebabdac00ba12c3" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indenter" @@ -497,72 +607,141 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", "serde", ] [[package]] name = "is_executable" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa9acdc6d67b75e626ad644734e8bc6df893d9cd2a834129065d3dd6158ea9c8" +checksum = "d4a1b5bad6f9072935961dfbf1cced2f3d129963d091b6f69f007fe04e758ae2" dependencies = [ "winapi", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" -version = "0.10.5" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" dependencies = [ "either", ] [[package]] -name = "itoa" -version = "1.0.9" +name = "itertools" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] [[package]] -name = "joinery" -version = "2.1.0" +name = "itoa" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72167d68f5fce3b8655487b8038691a3c9984ee769590f93f2a631f4ad64e4f5" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] +[[package]] +name = "konst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b65f00fb3910881e52bf0850ae2a82aea411488a557e1c02820ceaa60963dce3" +dependencies = [ + "const_panic", + "konst_kernel", + "typewit", +] + +[[package]] +name = "konst_kernel" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "599c1232f55c72c7fc378335a3efe1c878c92720838c8e6a4fd87784ef7764de" +dependencies = [ + "typewit", +] + [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.166" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[package]] +name = "libudis86-sys" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "139bbf9ddb1bfc90c1ac64dd2923d9c957cd433cee7315c018125d72ab08a6b0" +dependencies = [ + "cc", + "libc", +] [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "minimal-lexical" @@ -572,21 +751,20 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] [[package]] -name = "modhook" -version = "1.0.3" +name = "mmap-fixed-fixed" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0681853891801e4763dc252e843672faf32bcfee27a0aa3b19733902af450acc" dependencies = [ - "asar", - "clap", - "detours-sys", - "widestring", + "libc", "winapi", ] @@ -601,41 +779,69 @@ dependencies = [ ] [[package]] -name = "nom-supreme" -version = "0.8.0" +name = "ntapi" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd3ae6c901f1959588759ff51c95d24b491ecb9ff91aa9c2ef4acc5b1dcab27" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" dependencies = [ - "brownstone", - "indent_write", - "joinery", - "memchr", - "nom", + "winapi", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "option-ext" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "owo-colors" @@ -643,11 +849,35 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" +[[package]] +name = "path-absolutize" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4af381fe79fa195b4909485d99f73a80792331df0625188e707854f0b3383f5" +dependencies = [ + "path-dedot", +] + +[[package]] +name = "path-dedot" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ba0ad7e047712414213ff67533e6dd477af0a4e1d14fb52343e53d30ea9397" +dependencies = [ + "once_cell", +] + [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "pori" @@ -666,45 +896,50 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "regex" -version = "1.10.2" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", + "regex-automata", "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.1.10" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" - -[[package]] -name = "regex-automata" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -713,21 +948,49 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "region" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b6ebd13bc009aef9cd476c1310d49ac354d36e240cf1bd753290f3dc7199a7" +dependencies = [ + "bitflags 1.3.2", + "libc", + "mach2", + "windows-sys 0.52.0", +] + +[[package]] +name = "retour" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "a9af44d40e2400b44d491bfaf8eae111b09f23ac4de6e92728e79d93e699c527" +dependencies = [ + "cfg-if", + "generic-array", + "libc", + "libudis86-sys", + "mmap-fixed-fixed", + "once_cell", + "region", + "slice-pool2", +] [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -738,48 +1001,80 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "serde" -version = "1.0.192" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.89", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "serde_with" -version = "2.3.3" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ "base64", "chrono", "hex", - "indexmap", + "indexmap 1.9.3", + "indexmap 2.6.0", "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -787,14 +1082,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "2.3.3" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.89", ] [[package]] @@ -818,53 +1113,103 @@ dependencies = [ ] [[package]] -name = "smallvec" -version = "1.11.1" +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "shrinkwraprs" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "e63e6744142336dfb606fe2b068afa2e1cca1ee6a5d8377277a92945d81fa331" +dependencies = [ + "bitflags 1.3.2", + "itertools 0.8.2", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "slice-pool2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a3d689654af89bdfeba29a914ab6ac0236d382eb3b764f7454dde052f2821f8" + +[[package]] +name = "stopwatch2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "911ece10388afa48417f99e01df038460b6249a3ee0255f6446a6881b702fbb4" [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] [[package]] name = "syn" -version = "2.0.39" +version = "2.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sysinfo" +version = "0.29.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd727fc423c2060f6c92d9534cef765c65a6ed3f428a03d7def74a8c4348e666" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "winapi", +] + [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.89", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -872,12 +1217,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.30" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -892,18 +1238,53 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap 2.6.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-core", @@ -911,9 +1292,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -931,9 +1312,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "sharded-slab", "thread_local", @@ -946,23 +1327,38 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "typewit" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51dbd25812f740f45e2a9769f84711982e000483b13b73a8a1852e092abac8c" +dependencies = [ + "typewit_proc_macros", +] + +[[package]] +name = "typewit_proc_macros" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36a83ea2b3c704935a01b4642946aadd445cea40b10935e3f8bd8052b8193d6" + [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "valuable" @@ -972,50 +1368,57 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", ] +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.89", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1023,46 +1426,43 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.89", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wax" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c7a3bac6110ac062b7b422a442b7ee23e07209e2784a036654cab1e71bbafc" +checksum = "8d12a78aa0bab22d2f26ed1a96df7ab58e8a93506a3e20adb47c51a93b4e1357" dependencies = [ - "bstr", "const_format", - "itertools", + "itertools 0.11.0", "nom", - "nom-supreme", "pori", "regex", - "smallvec", "thiserror", "walkdir", ] [[package]] name = "widestring" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -1082,11 +1482,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -1097,11 +1497,11 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.51.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -1110,7 +1510,25 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] @@ -1119,13 +1537,29 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "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 = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -1134,38 +1568,95 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] diff --git a/Cargo.toml b/Cargo.toml index 105e49e..7e711ae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,17 +1,33 @@ [package] edition = "2021" -name = "modhook" -version = "1.0.3" +name = "discord_modloader" +version = "2.0.0-beta1" [lib] -crate-type = ["cdylib"] -name = "libmodhook" +crate-type = ["cdylib", "lib"] +name = "discord_modloader_lib" [dependencies] -clap = { version = "4.4.7", features = ["derive"] } -detours-sys = {version = "0.1.2"} -widestring = "1.0.2" -winapi = {version = "0.3.9", features = ["winbase", "handleapi", "minwindef", "consoleapi", "winnt", "memoryapi", "namedpipeapi"]} +asar = "0.3.0" +clap = { version = "4.5.20", features = ["derive"] } +dirs = "5.0.1" +serde = { version = "1.0.210", features = ["serde_derive"] } +toml = "0.8.19" -[build-dependencies] -asar = "0.2.0" +[target.'cfg(windows)'.dependencies] +winapi = { version = "0.3.9", features = [ + "winbase", + "handleapi", + "minwindef", + "consoleapi", + "winnt", + "memoryapi", + "namedpipeapi", +] } +dll-syringe = "0.15.2" +detours-sys = { version = "0.1.2" } +widestring = "1.1.0" + +[target.'cfg(unix)'.dependencies] +libc = "0.2.166" +retour = { version = "0.3.1", features = ["static-detour"] } diff --git a/asar/index.js b/asar/index.js deleted file mode 100644 index 87fa2f8..0000000 --- a/asar/index.js +++ /dev/null @@ -1,30 +0,0 @@ -/// BEGIN MODHOOK INFO /// -const CUSTOM_DATA_DIR = process.env.MODHOOK_CUSTOM_DATA_DIR; -const MOD_ENTRYPOINT = process.env.MODHOOK_MOD_ENTRYPOINT; -const IS_MOONLIGHT = process.env.MODHOOK_IS_MOONLIGHT; -/// END MODHOOK INFO /// - -if (CUSTOM_DATA_DIR) { - const { app } = require("electron"); - const customAppDir = - app.getPath("appData") + "\\DiscordModHook\\AppData\\" + CUSTOM_DATA_DIR; - const _setPath = app.setPath; - - app.setPath = function (name, path) { - if (name === "userData") { - _setPath.call(app, name, customAppDir); - } else { - _setPath.call(app, name, path); - } - }; - - app.setPath("userData", customAppDir); -} - -if (IS_MOONLIGHT) { - require(MOD_ENTRYPOINT).inject( - require("path").resolve(__dirname, "..\\_app.asar") - ); -} else { - require(MOD_ENTRYPOINT); -} diff --git a/build.rs b/build.rs deleted file mode 100644 index 1e8ee8c..0000000 --- a/build.rs +++ /dev/null @@ -1,26 +0,0 @@ -use asar::AsarWriter; -use std::env; -use std::error::Error; - -use std::fs::File; -use std::path::PathBuf; - -static ASAR_INDEX: &[u8] = include_bytes!("asar/index.js"); -static ASAR_PACKAGE: &[u8] = include_bytes!("asar/package.json"); - -fn main() -> std::result::Result<(), Box> { - let mut asar = AsarWriter::new(); - - asar.write_file("index.js", ASAR_INDEX, true)?; - asar.write_file("package.json", ASAR_PACKAGE, true)?; - - let mut out_dir = PathBuf::from("target"); - - out_dir.push(env::var("PROFILE")?); - - out_dir.push("app.asar"); - - asar.finalize(File::create(out_dir.to_str().unwrap())?)?; - - Ok(()) -} diff --git a/configs/templates/moonlight.toml b/configs/templates/moonlight.toml new file mode 100644 index 0000000..41205ee --- /dev/null +++ b/configs/templates/moonlight.toml @@ -0,0 +1,12 @@ +[mod] +name = "moonlight" +path = "/path/to/moonlight/dist" +entrypoint = "injector.js" +icon = "moonlight.png" + +[mod.loader] +require = """ +require("__MOD_ENTRYPOINT_FILE__").inject( + require("path").resolve(__dirname, "../_app.asar") +); +""" diff --git a/configs/templates/vencord.toml b/configs/templates/vencord.toml new file mode 100644 index 0000000..b196962 --- /dev/null +++ b/configs/templates/vencord.toml @@ -0,0 +1,5 @@ +[mod] +name = "Vencord" +path = "/path/to/vencord/dist" +entrypoint = "patcher.js" +icon = "vencord.png" diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..5d56faf --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "nightly" diff --git a/src/asar/custom_profile.js b/src/asar/custom_profile.js new file mode 100644 index 0000000..9d09e1e --- /dev/null +++ b/src/asar/custom_profile.js @@ -0,0 +1,14 @@ +const { app } = require("electron"); +const customAppDir = "__CUSTOM_PROFILE_DIR__"; + +const _setPath = app.setPath; + +app.setPath = function (name, path) { + if (name === "userData") { + _setPath.call(app, name, customAppDir); + } else { + _setPath.call(app, name, path); + } +}; + +app.setPath("userData", customAppDir); diff --git a/src/asar/index.js b/src/asar/index.js new file mode 100644 index 0000000..0d034f8 --- /dev/null +++ b/src/asar/index.js @@ -0,0 +1,10 @@ +// This is how the index.js is laid out. +// This file is not directly used in the code, and is just a reference. + +__PREFIX__ + +__CUSTOM_PROFILE__ + +__REQUIRE__ + +__SUFFIX__ \ No newline at end of file diff --git a/asar/package.json b/src/asar/package.json similarity index 100% rename from asar/package.json rename to src/asar/package.json diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..9f73f51 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,221 @@ +use std::collections::HashMap; + +use serde::Deserialize; + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum ConfigFile { + Instance(Instance), + Mod(Mod), +} + +#[derive(Debug)] +pub struct Config { + pub mods: HashMap, + pub instances: HashMap, +} + +impl Config { + pub fn validate(&mut self) { + for (_, mod_) in self.mods.iter_mut() { + let entrypoint_exists = std::path::Path::new(&mod_.path) + .join(&mod_.entrypoint) + .exists(); + + mod_.is_valid = entrypoint_exists; + } + + for (_, instance) in self.instances.iter_mut() { + if let Some(target_mod) = self.mods.get(&instance.r#mod) { + let asar_exists: bool = std::path::Path::new(&instance.path) + .parent() + .expect("Expected Discord executable path to have a parent.") + .join("resources") + .join("app.asar") + .exists(); + + instance.is_valid = target_mod.is_valid && asar_exists; + } else { + instance.is_valid = false; + } + } + } + + pub fn init() -> Config { + let profiles_dir = dirs::data_local_dir().unwrap().join("discord-modloader"); + + println!("Loading from profile directory: {}", profiles_dir.display()); + + if !profiles_dir.exists() { + std::fs::create_dir_all(&profiles_dir).expect("Unable to create profiles directory."); + } + + let configs_dir = dirs::config_local_dir().unwrap().join("discord-modloader"); + + let instances_dir = configs_dir.join("instances"); + let mods_dir = configs_dir.join("mods"); + + if !instances_dir.exists() { + std::fs::create_dir_all(&instances_dir).expect("Unable to create instances directory."); + } + + if !mods_dir.exists() { + std::fs::create_dir_all(&mods_dir).expect("Unable to create mods directory."); + } + + let instances = std::fs::read_dir(&instances_dir).unwrap(); + let mods = std::fs::read_dir(&mods_dir).unwrap(); + + println!("Loading instances from: {:?}", &instances_dir); + + let mut mod_configs: HashMap = HashMap::new(); + for mod_file in mods { + let mod_path = mod_file.unwrap(); + let mod_file = ConfigFile::from_file(mod_path.path().to_str().unwrap()); + let mod_name = mod_path + .path() + .with_extension("") + .file_name() + .unwrap() + .to_str() + .unwrap() + .to_string(); + + if let ConfigFile::Mod(mut mod_file) = mod_file { + mod_file.config_path = mod_path + .path() + .canonicalize() + .expect("Unable to locate config file.") + .to_str() + .unwrap() + .to_string(); + mod_configs.insert(mod_name, mod_file); + } else { + panic!("Instance file found in mods directory."); + } + } + + let mut instance_configs: HashMap = HashMap::new(); + for instance_file in instances { + let instance_path = instance_file.unwrap(); + let instance_file = ConfigFile::from_file(instance_path.path().to_str().unwrap()); + let instance_name = instance_path + .path() + .with_extension("") + .file_name() + .unwrap() + .to_str() + .unwrap() + .to_string(); + + if let ConfigFile::Instance(mut instance_file) = instance_file { + instance_file.config_path = instance_path + .path() + .canonicalize() + .expect("Unable to locate config file.") + .to_str() + .unwrap() + .to_string(); + + instance_file.profile_path = instance_file + .profile + .as_ref() + .map(|profile| profiles_dir.join(profile).to_str().unwrap().to_string()); + + instance_configs.insert(instance_name, instance_file); + } else { + panic!("Mod file found in instances directory."); + } + } + + Config { + mods: mod_configs, + instances: instance_configs, + } + } +} + +impl ConfigFile { + fn from_file(path: &str) -> Self { + let file = std::fs::read_to_string(path).unwrap(); + let config: ConfigFile = toml::from_str(&file).unwrap(); + config + } +} + +#[derive(Debug, Deserialize)] +pub struct Instance { + /// The display name of the instance. (e.g. "Vencord", "Moonlight", "My Custom Instance") + /// + /// Can be duplicate, but not recommended for clarity. + pub name: String, + + /// A path to the icon to use for the mod. + pub icon: Option, + + /// The custom profile to use. + /// This will run a unique chrome profile for the mod, + /// allowing for multiple instances of Discord to run at the same time. + pub profile: Option, + + /// The identifier of the mod to use for this instance. + pub r#mod: String, + + // pub description: String, + pub path: String, + + #[serde(skip, default)] + pub is_valid: bool, + + #[serde(skip, default)] + pub config_path: String, + + #[serde(skip, default)] + pub profile_path: Option, +} + +#[derive(Debug, Deserialize)] +pub struct Mod { + /// The display name of the mod. (e.g. "Vencord", "Moonlight", "BetterDiscord") + /// + /// Can be duplicate, but not recommended for clarity. + pub name: String, + + /// A path to the icon to use for the mod. + pub icon: Option, + + /// The path to the mod's dist folder. (e.g. "/path/to/moonlight") + pub path: String, + + /// The entrypoint of the mod. (e.g. "injector.js", "patcher.js") + pub entrypoint: String, + + /// Provide custom loader JS to be injected into the ASAR index.js. + pub loader: Option, + + #[serde(skip, default)] + pub is_valid: bool, + + #[serde(skip, default)] + pub config_path: String, +} + +/// The loader configuration for the mod. +/// You can use this to specify custom JS to be in your ASAR's index.js. +/// +/// The following variables can be used: +/// +/// - `__CUSTOM_PROFILE_DIR__`: The directory of the custom profile. +/// - `__MOD_ENTRYPOINT_FILE__`: The entrypoint file of the mod. +#[derive(Debug, Deserialize)] +pub struct ModLoader { + pub prefix: Option, + pub profile: Option, + #[serde(default = "default_require")] + pub require: Option, + pub suffix: Option, +} + +fn default_require() -> Option { + Some(r#"require("__MOD_ENTRYPOINT_FILE__")"#.to_string()) +} diff --git a/src/lib.rs b/src/lib.rs index a92ae8f..718fa07 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,62 +1,102 @@ -use std::{ffi::c_void, ptr::null_mut}; - -use detours_sys::{ - DetourAttach, DetourGetEntryPoint, DetourIsHelperProcess, DetourRestoreAfterWith, - DetourTransactionBegin, DetourTransactionCommit, DetourUpdateThread, -}; - -use winapi::{ - shared::minwindef::{BOOL, DWORD, HINSTANCE, LPVOID}, - um::{processthreadsapi::GetCurrentThread, winnt::DLL_PROCESS_ATTACH}, -}; - -#[cfg(debug_assertions)] -use winapi::um::consoleapi::AllocConsole; -// use crate::detours::fs::create_asar_in_memory; - -mod detours; -mod env; - -static mut O_ENTRYPOINT: *mut c_void = 0 as _; - -#[no_mangle] -extern "cdecl" fn ExportedFunction() {} - -#[no_mangle] -unsafe extern "stdcall" fn DllMain( - _hinst_dll: HINSTANCE, - fwd_reason: DWORD, - _lpv_reserved: LPVOID, -) -> BOOL { - if DetourIsHelperProcess() == 1 { - return 1; +pub mod config; + +#[cfg(target_os = "linux")] +mod unix; + +#[cfg(target_os = "linux")] +#[allow(unused_imports)] +pub use unix::*; + +pub fn get_or_write_cache(instance: &config::Instance, mod_: &config::Mod) -> String { + let cache_dir = dirs::cache_dir().unwrap().join("discord-modloader"); + if !cache_dir.exists() { + std::fs::create_dir_all(&cache_dir).unwrap(); } - if fwd_reason != DLL_PROCESS_ATTACH { - return 1; + let asar_dir = cache_dir.join("asar"); + if !asar_dir.exists() { + std::fs::create_dir_all(&asar_dir).unwrap(); } - DetourRestoreAfterWith(); + let cached_asar_path = asar_dir.join(format!("{}-{}.asar", instance.r#mod, mod_.name)); + // TODO: Figure out a way to cache, while also regenerating if the mod or instance config changes. + // if cached_asar_path.exists() { + // return cached_asar_path.to_str().unwrap().to_owned(); + // } - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread() as _); + static ASAR_CUSTOM_PROFILE_JS: &str = include_str!("./asar/custom_profile.js"); - O_ENTRYPOINT = DetourGetEntryPoint(null_mut()); - DetourAttach(&raw mut O_ENTRYPOINT, main as _); + if let Some(ref profile) = instance.profile_path { + let profile_path = std::path::Path::new(profile); + if !profile_path.exists() { + std::fs::create_dir_all(profile_path).unwrap(); + } + } - detours::win32::init_detours(); + let mod_entrypoint = std::path::Path::new(&mod_.path).join(&mod_.entrypoint); + let mod_entrypoint = mod_entrypoint.to_str().unwrap(); - DetourTransactionCommit(); + let profile_dir = instance.profile_path.clone().unwrap_or_default(); - 1 -} + let profile_loader = instance.profile.as_ref().map(|_| { + ASAR_CUSTOM_PROFILE_JS + .replace("__CUSTOM_PROFILE_DIR__", &profile_dir) + .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + }); -unsafe fn main() { - #[cfg(debug_assertions)] - { - AllocConsole(); - println!("[ModHook] Process Hooked"); - } - let start_discord: extern "C" fn() = std::mem::transmute(O_ENTRYPOINT); - start_discord(); + let custom_loader = if let Some(loader) = &mod_.loader { + let prefix = loader + .prefix + .as_ref() + .map(|p| { + p.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) + .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + }) + .unwrap_or_default(); + + let custom_profile = loader + .profile + .as_ref() + .map(|p| { + p.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) + .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + }) + .unwrap_or(profile_loader.unwrap_or_default()); + + let require = loader + .require + .as_ref() + .map(|r| { + r.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) + .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + }) + .unwrap_or(format!(r#"require("{}")"#, mod_entrypoint)); + + let suffix = loader + .suffix + .as_ref() + .map(|s| { + s.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) + .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + }) + .unwrap_or_default(); + + format!("{}\n{}\n{}\n{}", prefix, custom_profile, require, suffix) + } else { + format!( + "{}\nrequire(\"{}\")", + profile_loader.unwrap_or_default(), + mod_entrypoint + ) + }; + + let mut asar = asar::AsarWriter::new(); + asar.write_file("index.js", custom_loader, false).unwrap(); + asar.write_file("package.json", include_bytes!("./asar/package.json"), false) + .unwrap(); + + asar.finalize(std::fs::File::create(&cached_asar_path).unwrap()) + .unwrap(); + + cached_asar_path.to_str().unwrap().to_owned() } diff --git a/src/main.rs b/src/main.rs index f4f627a..a1c9c97 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,138 +1,76 @@ -use std::{ffi::CString, mem::MaybeUninit, ptr::null_mut}; - use clap::Parser; -use detours_sys::{DetourCreateProcessWithDllExA, _PROCESS_INFORMATION, _STARTUPINFOA}; -use env::Environment; -use winapi::um::{ - handleapi::CloseHandle, processthreadsapi::ResumeThread, winbase::CREATE_SUSPENDED, -}; - -mod discord; -mod env; - -static DLL_PATH: &str = "libmodhook.dll"; - -#[derive(Parser, Debug)] -#[command(name = "modhook", verbatim_doc_comment)] -/// Discord ModHook -/// For more information, visit: -pub struct Args { - /// Path to the Discord folder. - /// Example: --discord-path "c:\users\megu\appdata\roaming\discordptb" - #[arg(short, long, verbatim_doc_comment)] - pub discord_path: String, - - /// Path to the mods' JS entrypoint. - /// Example: --mod-entrypoint "c:\users\megu\vencord\patcher.js" - #[arg(short, long, verbatim_doc_comment)] - pub mod_entrypoint: String, - /// Modded ASAR filename. - /// - /// This is the file that the mod (e.g. Vencord) loads - /// to return to the original Discord context. - /// - /// This is NOT required for Vencord or Replugged. - /// - /// ModHook will redirect calls to this file to the original app.asar (e.g. _app.asar -> app.asar) - /// - /// example: --modded-asar-filename "_app.asar" - #[arg(short = 'f', long, verbatim_doc_comment)] - pub modded_asar_filename: Option, +use discord_modloader_lib::{config, get_or_write_cache}; - /// Path to check for to revert to default app.asar behaviour after the mod has loaded. - /// Example: --toggle-query "vencord\patcher.js" - #[arg(short, long, verbatim_doc_comment)] - pub toggle_query: Option, - - /// Custom name for AppData profile. - /// Example: --custom-data-dir "MyCustomProfile" - #[arg(short, long, verbatim_doc_comment)] - pub custom_data_dir: Option, - - /// ModHook ASAR replacement. - /// Example: --asar-path "c:\users\megu\vencord\app.asar" - #[arg(short, long, verbatim_doc_comment)] - pub asar_path: Option, - - /// Whether or not the mod is the moonlight mod. - /// Example: --moonlight - /// Moonlight uses `require(entrypoint).inject(asarPath);` - /// instead of the usual `require(entrypoint);` - #[arg(value_enum, long = "moonlight", verbatim_doc_comment)] - pub is_moonlight: bool, +#[derive(clap::Parser, Debug)] +struct Args { + #[clap(short, long)] + pub instance: String, } +#[cfg(target_os = "macos")] fn main() { - let args: Args = Args::parse(); - - let target_exe = discord::get_discord_executable(&args.discord_path).unwrap(); - let target_exe = target_exe.to_str().unwrap(); - - let mut asar_path = std::env::current_dir().unwrap(); - - asar_path.push("app.asar"); - - let asar_path = asar_path.to_str().unwrap().to_string(); + println!("macOS is not supported yet. Feel free to submit a PR."); + println!("https://github.com/MeguminSama/Discord-Modloader"); +} - let mut dll_path = std::env::current_dir().unwrap(); - dll_path.push(DLL_PATH); +#[cfg(not(target_os = "macos"))] +fn main() { + let mut config = config::Config::init(); + config.validate(); - let environment = Environment { - asar_path: Some(asar_path), - mod_entrypoint: args.mod_entrypoint, - toggle_query: args.toggle_query, - custom_data_dir: args.custom_data_dir, - modded_asar_filename: args.modded_asar_filename, - is_moonlight: args.is_moonlight, - }; + let args: Args = Args::parse(); - unsafe { - inject(dll_path.to_str().unwrap(), target_exe, &environment).unwrap(); + if let Some(instance) = config.instances.get(&args.instance) { + dbg!(&instance); + load_profile(&config, instance); + } else { + println!("Instance not found. Make sure it exists in the instances directory."); } } -/// # Safety -/// This function is unsafe because it calls the WinAPI. -pub unsafe fn inject( - dll_path: &str, - target_exe: &str, - environment: &Environment, -) -> std::io::Result<()> { - let cstr_target_exe = CString::new(target_exe)?; - let cstr_dll_path = CString::new(dll_path)?; - - let mut process_info: _PROCESS_INFORMATION = MaybeUninit::zeroed().assume_init(); - let mut startup_info: _STARTUPINFOA = MaybeUninit::zeroed().assume_init(); - - environment.apply(); +#[cfg(target_os = "linux")] +fn load_profile(config: &config::Config, instance: &config::Instance) { + println!("Loading Instance: {}", instance.name); + if let Some(ref profile_path) = instance.profile_path { + println!("On profile: {}", profile_path) + } - let result = DetourCreateProcessWithDllExA( - null_mut(), - cstr_target_exe.as_ptr() as *mut i8, - null_mut(), - null_mut(), - 0, - CREATE_SUSPENDED, - null_mut(), - null_mut(), - &mut startup_info as *mut _, - &mut process_info as *mut _, - cstr_dll_path.as_ptr(), - None, - ); + let asar_path = get_or_write_cache(instance, config.mods.get(&instance.r#mod).unwrap()); + + let mut target = std::process::Command::new(instance.path.clone()) + .current_dir(std::path::Path::new(&instance.path).parent().unwrap()) + // TODO: move libmodhook.so into global libs dir + .env( + "LD_PRELOAD", + "/home/megu/Workspace/Discord/Discord-ModLoader/target/debug/libdiscord_modloader.so", + ) + .env("MODLOADER_ASAR_PATH", asar_path) + .args(["--trace-warnings"]) + .spawn() + .expect("Failed to launch instance."); + + target + .wait() + .expect("Failed to wait for instance to finish."); +} - if result == 0 { - return Err(std::io::Error::new( - std::io::ErrorKind::Other, - "Failed to create process", - )); +#[cfg(target_os = "windows")] +fn load_profile(config: &config::Config, instance: &config::Instance) { + println!("Loading Instance: {}", instance.name); + if let Some(ref profile_path) = instance.profile_path { + println!("On profile: {}", profile_path) } - ResumeThread(process_info.hThread as _); + // let asar_path = get_or_write_cache(instance, config.mods.get(&instance.r#mod).unwrap()); - CloseHandle(process_info.hProcess as _); - CloseHandle(process_info.hThread as _); + let mut target = std::process::Command::new(instance.path.clone()) + .current_dir(std::path::Path::new(&instance.path).parent().unwrap()) + .args(["--trace-warnings"]) + .spawn() + .expect("Failed to launch instance."); - Ok(()) + target + .wait() + .expect("Failed to wait for instance to finish."); } diff --git a/src/unix.rs b/src/unix.rs new file mode 100644 index 0000000..215f36f --- /dev/null +++ b/src/unix.rs @@ -0,0 +1,161 @@ +use std::{ + ffi::{c_char, c_void}, + sync::LazyLock, +}; + +use retour::static_detour; + +static MODLOADER_ASAR_PATH: LazyLock = + LazyLock::new(|| std::env::var("MODLOADER_ASAR_PATH").unwrap()); + +#[link(name = "dl")] +extern "C" { + fn dlsym(handle: *const c_void, symbol: *const c_char) -> *const c_void; +} + +extern "C" { + #[link_name = "uv_fs_lstat"] + fn original_uv_fs_lstat( + loop_: *const c_void, + req: *const c_void, + path: *const c_char, + buf: *mut c_void, + ) -> i32; +} + +type MainFn = extern "C" fn(i32, *const *const c_void, *const *const c_void) -> i32; + +type LibcStartMainFn = fn( + MainFn, + i32, + *const *const char, + MainFn, + extern "C" fn(), + extern "C" fn(), + *mut c_void, +) -> i32; + +#[no_mangle] +unsafe extern "C" fn __libc_start_main( + main: MainFn, + argc: i32, + argv: *const *const char, + init: MainFn, + fini: extern "C" fn(), + rtld_fini: extern "C" fn(), + stack_end: *mut c_void, +) -> i32 { + UvFsLstatDetour + .initialize( + std::mem::transmute::(original_uv_fs_lstat), + uv_fs_lstat, + ) + .unwrap(); + + UvFsLstatDetour.enable().unwrap(); + + let orig_libc_start_main_addr: *const c_void = dlsym( + libc::RTLD_NEXT, + c"__libc_start_main".as_ptr() as *const c_char, + ); + + let orig_libc_start_main: LibcStartMainFn = std::mem::transmute(orig_libc_start_main_addr); + + orig_libc_start_main(main, argc, argv, init, fini, rtld_fini, stack_end) +} + +type UvFsLstat = unsafe extern "C" fn( + loop_: *const c_void, + req: *const c_void, + path: *const c_char, + cb: *mut c_void, +) -> i32; + +static_detour! { + static UvFsLstatDetour: fn(*const c_void, *const c_void, *const c_char, *mut c_void) -> i32; +} + +#[no_mangle] +#[export_name = "uv_fs_lstat"] +unsafe extern "C" fn export_uv_vs_lstat( + loop_: *const c_void, + req: *const c_void, + path: *const c_char, + buf: *mut c_void, +) -> i32 { + uv_fs_lstat(loop_, req, path, buf) +} + +fn uv_fs_lstat( + loop_: *const c_void, + req: *const c_void, + path: *const c_char, + buf: *mut c_void, +) -> i32 { + let path_str = unsafe { std::ffi::CStr::from_ptr(path).to_str().unwrap() }; + if path_str.contains("resources/_app.asar") { + let redirect_to = path_str.replace("/_app.asar", "/app.asar"); + let redirect_to_c = std::ffi::CString::new(redirect_to.as_str()).unwrap(); + return UvFsLstatDetour.call(loop_, req, redirect_to_c.as_ptr(), buf); + } + + UvFsLstatDetour.call(loop_, req, path, buf) +} + +type XStat64 = unsafe extern "C" fn(i32, *const c_char, *mut libc::stat64) -> i64; + +#[no_mangle] +unsafe extern "C" fn __xstat64(ver: i32, path: *const c_char, out: *mut libc::stat64) -> i64 { + use std::sync::LazyLock; + + static ORIGINAL_XSTAT64: LazyLock = LazyLock::new(|| unsafe { + std::mem::transmute(dlsym(libc::RTLD_NEXT, c"__xstat64".as_ptr())) + }); + + let path_str = std::ffi::CStr::from_ptr(path).to_str().unwrap(); + + // If calling _app.asar, return the original app.asar + if path_str.contains("resources/_app.asar") { + let redirect_to = path_str.replace("/_app.asar", "/app.asar"); + let redirect_to_c = std::ffi::CString::new(redirect_to.as_str()).unwrap(); + return ORIGINAL_XSTAT64(ver, redirect_to_c.as_ptr(), out); + } + + // If calling app.asar, return the custom app.asar + if path_str.contains("resources/app.asar") { + let asar_path_cstr = std::ffi::CString::new(MODLOADER_ASAR_PATH.as_str()).unwrap(); + return ORIGINAL_XSTAT64(ver, asar_path_cstr.as_ptr(), out); + } + + ORIGINAL_XSTAT64(ver, path, out) +} + +type Open64 = unsafe extern "C" fn(*const c_char, i32, i32) -> i32; + +#[no_mangle] +unsafe extern "C" fn open64(path: *const c_char, flags: i32, mode: i32) -> i32 { + use std::sync::LazyLock; + + static ORIGINAL_OPENAT64: LazyLock = LazyLock::new(|| unsafe { + std::mem::transmute(dlsym(libc::RTLD_NEXT, c"open64".as_ptr())) + }); + + let path_str = std::ffi::CStr::from_ptr(path).to_str().unwrap(); + + // If calling _app.asar, return the original app.asar + if path_str.contains("resources/_app.asar") { + let redirect_to = path_str.replace("/_app.asar", "/app.asar"); + let redirect_to_c = std::ffi::CString::new(redirect_to.as_str()).unwrap(); + + return ORIGINAL_OPENAT64(redirect_to_c.as_ptr(), flags, mode); + } + + // If calling app.asar, return the custom app.asar + if path_str.contains("resources/app.asar") { + let redirect_to = std::ffi::CString::new(MODLOADER_ASAR_PATH.as_str()).unwrap(); + + return ORIGINAL_OPENAT64(redirect_to.as_ptr(), flags, mode); + } + + ORIGINAL_OPENAT64(path, flags, mode) +} From 6d089c81e27ec9aba1bba373d93549a58ae097b3 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 00:33:50 +0000 Subject: [PATCH 03/20] feat: v2/windows support --- Cargo.lock | 5535 ++++++++++++++++++++++++++++++++++++++---- Cargo.toml | 4 +- src/config.rs | 5 +- src/detours/mod.rs | 2 - src/detours/utils.rs | 44 - src/detours/win32.rs | 155 -- src/env.rs | 118 - src/lib.rs | 30 +- src/main.rs | 65 +- src/windows.rs | 262 ++ 10 files changed, 5443 insertions(+), 777 deletions(-) delete mode 100644 src/detours/mod.rs delete mode 100644 src/detours/utils.rs delete mode 100644 src/detours/win32.rs delete mode 100644 src/env.rs create mode 100644 src/windows.rs diff --git a/Cargo.lock b/Cargo.lock index f51255e..7d9d0c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,115 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "ab_glyph" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + +[[package]] +name = "accesskit" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74a4b14f3d99c1255dcba8f45621ab1a2e7540a0009652d33989005a4d0bfc6b" +dependencies = [ + "enumn", + "serde", +] + +[[package]] +name = "accesskit_atspi_common" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9357ba093d0c8c234840f126efa71d09b848027b2963f553940021fb07bbf076" +dependencies = [ + "accesskit", + "accesskit_consumer", + "atspi-common", + "serde", + "thiserror", + "zvariant", +] + +[[package]] +name = "accesskit_consumer" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6114c157d5b02e24b38e929afe99324f2f9cc116ce7d49fdbf3fea111369c14" +dependencies = [ + "accesskit", +] + +[[package]] +name = "accesskit_macos" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded5f12ee8af8d8dae8de4ef96bc6abdd94735973ba97bbd426da41005252553" +dependencies = [ + "accesskit", + "accesskit_consumer", + "icrate 0.1.2", + "objc2 0.5.2", + "once_cell", +] + +[[package]] +name = "accesskit_unix" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "454040abdc130ca45d9142cc6ea0b196fb53119f62600d88665ae6090d597f3e" +dependencies = [ + "accesskit", + "accesskit_atspi_common", + "async-channel", + "async-executor", + "async-task", + "atspi", + "futures-lite 1.13.0", + "futures-util", + "once_cell", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b698c3561514806519d28c63b6a2b1f5797f5ae3042a9caa4d64b7b928ff69" +dependencies = [ + "accesskit", + "accesskit_consumer", + "once_cell", + "paste", + "static_assertions", + "windows", +] + +[[package]] +name = "accesskit_winit" +version = "0.18.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d80d7aa92a9334120580e9fe2028670f48f2b1a30cdf8bfd3d038c2f430345" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_unix", + "accesskit_windows", + "raw-window-handle 0.6.2", + "winit", +] + [[package]] name = "addr2line" version = "0.21.0" @@ -17,6 +126,36 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -26,6 +165,39 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" + +[[package]] +name = "android-activity" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289" +dependencies = [ + "android-properties", + "bitflags 2.6.0", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum 0.7.3", + "thiserror", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -90,6 +262,30 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "anymap" +version = "1.0.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1f8f5a6f3d50d89e3797d7593a50f96bb2aaa20ca0cc7be1fb673232c91d72" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + [[package]] name = "asar" version = "0.3.0" @@ -111,805 +307,3693 @@ dependencies = [ ] [[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.71" +name = "async-broadcast" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", + "event-listener 2.5.3", + "futures-core", ] [[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bincode" -version = "1.3.3" +name = "async-channel" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ - "serde", + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", ] [[package]] -name = "bitflags" -version = "1.3.2" +name = "async-executor" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.2.0", + "futures-lite 2.5.0", + "slab", +] [[package]] -name = "bitflags" -version = "2.6.0" +name = "async-fs" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "blocking", + "futures-lite 1.13.0", +] [[package]] -name = "block-buffer" -version = "0.10.4" +name = "async-io" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ - "generic-array", + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.27", + "slab", + "socket2 0.4.10", + "waker-fn", ] [[package]] -name = "bumpalo" -version = "3.16.0" +name = "async-io" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock 3.4.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.5.0", + "parking", + "polling 3.7.4", + "rustix 0.38.41", + "slab", + "tracing", + "windows-sys 0.59.0", +] [[package]] -name = "byteorder" -version = "1.5.0" +name = "async-lock" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] [[package]] -name = "cc" -version = "1.2.1" +name = "async-lock" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "shlex", + "event-listener 5.3.1", + "event-listener-strategy", + "pin-project-lite", ] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "async-process" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +dependencies = [ + "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.41", + "windows-sys 0.48.0", +] [[package]] -name = "chrono" -version = "0.4.38" +name = "async-recursion" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "serde", - "windows-targets 0.52.6", + "proc-macro2", + "quote", + "syn 2.0.89", ] [[package]] -name = "clap" -version = "4.5.21" +name = "async-signal" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" dependencies = [ - "clap_builder", - "clap_derive", + "async-io 2.4.0", + "async-lock 3.4.0", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 0.38.41", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", ] [[package]] -name = "clap_builder" -version = "4.5.21" +name = "async-task" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] -name = "clap_derive" -version = "4.5.18" +name = "async-trait" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ - "heck", "proc-macro2", "quote", "syn 2.0.89", ] [[package]] -name = "clap_lex" -version = "0.7.3" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] -name = "color-eyre" -version = "0.6.3" +name = "atspi" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" +checksum = "6059f350ab6f593ea00727b334265c4dfc7fd442ee32d264794bd9bdc68e87ca" dependencies = [ - "backtrace", - "color-spantrace", - "eyre", - "indenter", - "once_cell", - "owo-colors", - "tracing-error", + "atspi-common", + "atspi-connection", + "atspi-proxies", ] [[package]] -name = "color-spantrace" -version = "0.2.1" +name = "atspi-common" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" +checksum = "92af95f966d2431f962bc632c2e68eda7777330158bf640c4af4249349b2cdf5" dependencies = [ - "once_cell", - "owo-colors", - "tracing-core", - "tracing-error", + "enumflags2", + "serde", + "static_assertions", + "zbus", + "zbus_names", + "zvariant", ] [[package]] -name = "colorchoice" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" - -[[package]] -name = "const_format" -version = "0.2.33" +name = "atspi-connection" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +checksum = "a0c65e7d70f86d4c0e3b2d585d9bf3f979f0b19d635a336725a88d279f76b939" dependencies = [ - "const_format_proc_macros", + "atspi-common", + "atspi-proxies", + "futures-lite 1.13.0", + "zbus", ] [[package]] -name = "const_format_proc_macros" -version = "0.2.33" +name = "atspi-proxies" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +checksum = "6495661273703e7a229356dcbe8c8f38223d697aacfaf0e13590a9ac9977bb52" dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", + "atspi-common", + "serde", + "zbus", ] [[package]] -name = "const_panic" -version = "0.2.10" +name = "autocfg" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "013b6c2c3a14d678f38cd23994b02da3a1a1b6a5d1eedddfe63a5a5f11b13a81" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] -name = "core-foundation-sys" -version = "0.8.7" +name = "backtrace" +version = "0.3.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.7.4", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.11.0", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.89", + "which", +] + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "block-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7" +dependencies = [ + "objc-sys", +] + +[[package]] +name = "block2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68" +dependencies = [ + "block-sys", + "objc2 0.4.1", +] + +[[package]] +name = "block2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e58aa60e59d8dbfcc36138f5f18be5f24394d33b38b24f7fd0b1caa33095f22f" +dependencies = [ + "block-sys", + "objc2 0.5.2", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite 2.5.0", + "piper", +] + +[[package]] +name = "bstr" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a68f1f47cdf0ec8ee4b941b2eee2a80cb796db73118c0dd09ac63fbe405be22" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" + +[[package]] +name = "calloop" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" +dependencies = [ + "bitflags 2.6.0", + "log", + "polling 3.7.4", + "rustix 0.38.41", + "slab", + "thiserror", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02" +dependencies = [ + "calloop", + "rustix 0.38.41", + "wayland-backend", + "wayland-client 0.31.7", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.6", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "clap_lex" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" + +[[package]] +name = "clipboard-win" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fdf5e01086b6be750428ba4a40619f847eb2e95756eee84b18e06e5f0b50342" +dependencies = [ + "lazy-bytes-cast", + "winapi", +] + +[[package]] +name = "color-eyre" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const_format" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "const_panic" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "013b6c2c3a14d678f38cd23994b02da3a1a1b6a5d1eedddfe63a5a5f11b13a81" + +[[package]] +name = "constcat" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7e35aee659887cbfb97aaf227ac12cad1a9d7c71e55ff3376839ed4e282d08" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "copypasta" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "133fc8675ee3a4ec9aa513584deda9aa0faeda3586b87f7f0f2ba082c66fb172" +dependencies = [ + "clipboard-win", + "objc", + "objc-foundation", + "objc_id", + "smithay-clipboard", + "x11-clipboard", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array 0.14.7", + "typenum", +] + +[[package]] +name = "cstr" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68523903c8ae5aacfa32a0d9ae60cadeb764e1da14ee0d26b1f3089f13a54636" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.89", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "detours-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a089d64a8b2e0fa98aa661f1323f49c7c382920504f47fcd2d157bd75cd1587" +dependencies = [ + "cc", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dioxus" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e7fe217b50d43b27528b0f24c89b411f742a3e7564d1cfbf85253f967954db" +dependencies = [ + "dioxus-config-macro", + "dioxus-core", + "dioxus-core-macro", + "dioxus-hooks", + "dioxus-hot-reload", + "dioxus-html", + "dioxus-signals", +] + +[[package]] +name = "dioxus-cli-config" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7dffc452ed91af6ef772b0d9a5899573f6785314e97c533733ec55413c01df3" +dependencies = [ + "once_cell", + "serde", + "serde_json", + "tracing", +] + +[[package]] +name = "dioxus-config-macro" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb1a1aa34cc04c1f7fcbb7a10791ba773cc02d834fe3ec1fe05647699f3b101f" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "dioxus-core" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3730d2459ab66951cedf10b09eb84141a6eda7f403c28057cbe010495be156b7" +dependencies = [ + "futures-channel", + "futures-util", + "generational-box", + "longest-increasing-subsequence", + "rustc-hash", + "serde", + "slab", + "slotmap", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "dioxus-core-macro" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d9c0dfe0e6a46626fa716c4aa1d2ccb273441337909cfeacad5bb6fcfb947d2" +dependencies = [ + "constcat", + "convert_case", + "dioxus-rsx", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "dioxus-debug-cell" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ea539174bb236e0e7dc9c12b19b88eae3cb574dedbd0252a2d43ea7e6de13e2" + +[[package]] +name = "dioxus-hooks" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa8f9c661eea82295219d25555d5c0b597e74186b029038ceb5e3700ccbd4380" +dependencies = [ + "dioxus-core", + "dioxus-debug-cell", + "dioxus-signals", + "futures-channel", + "futures-util", + "generational-box", + "slab", + "thiserror", + "tracing", +] + +[[package]] +name = "dioxus-hot-reload" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77d01246cb1b93437fb0bbd0dd11cfc66342d86b4311819e76654f2017ce1473" +dependencies = [ + "chrono", + "dioxus-core", + "dioxus-html", + "dioxus-rsx", + "execute", + "ignore", + "interprocess-docfix", + "notify", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "dioxus-html" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f01a0826f179adad6ea8d6586746e8edde0c602cc86f4eb8e5df7a3b204c4018" +dependencies = [ + "async-trait", + "dioxus-core", + "dioxus-html-internal-macro", + "dioxus-rsx", + "enumset", + "euclid", + "futures-channel", + "generational-box", + "keyboard-types", + "serde", + "serde-value", + "serde_json", + "serde_repr", + "tracing", + "web-sys", +] + +[[package]] +name = "dioxus-html-internal-macro" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b96f35a608d0ab8f4ca6f66ce1828354e4ebd41580b12454f490221a11da93c" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "dioxus-lib" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bd39b2c41dd1915dcb91d914ea72d8b646f1f8995aaeff82816b862ec586ecd" +dependencies = [ + "dioxus-core", + "dioxus-core-macro", + "dioxus-hooks", + "dioxus-html", + "dioxus-rsx", + "dioxus-signals", +] + +[[package]] +name = "dioxus-router" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c235c5dbeb528c0c2b0424763da812e7500df69b82eddac54db6f4975e065c5f" +dependencies = [ + "dioxus-cli-config", + "dioxus-lib", + "dioxus-router-macro", + "tracing", + "url", + "urlencoding", +] + +[[package]] +name = "dioxus-router-macro" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7cd1c5137ba361f2150cdea6b3bc9ddda7b1af84b22c9ee6b5499bf43e1381" +dependencies = [ + "proc-macro2", + "quote", + "slab", + "syn 2.0.89", +] + +[[package]] +name = "dioxus-rsx" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c400bc8a779107d8f3a67b14375db07dbd2bc31163bf085a8e9097f36f7179" +dependencies = [ + "dioxus-core", + "internment", + "krates", + "proc-macro2", + "quote", + "syn 2.0.89", + "tracing", +] + +[[package]] +name = "dioxus-sdk" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28df53f8e819a1417224ca1c671947ed8fc9696e3080fd59d166c2162c7287bc" +dependencies = [ + "cfg-if", + "copypasta", + "dioxus", + "js-sys", + "tracing", + "uuid", +] + +[[package]] +name = "dioxus-signals" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3e224cd3d3713f159f0199fc088c292a0f4adb94996b48120157f6a8f8342d" +dependencies = [ + "dioxus-core", + "futures-channel", + "futures-util", + "generational-box", + "once_cell", + "parking_lot", + "rustc-hash", + "tracing", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "discord_modloader" +version = "2.0.0-beta1" +dependencies = [ + "asar", + "clap", + "detours-sys", + "dioxus", + "dirs", + "dll-syringe", + "freya", + "libc", + "retour", + "serde", + "toml", + "widestring", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "dll-syringe" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdc807201d54de75e9bd7ad199d0031048625059f84acfc94506bdb13c0b4f59" +dependencies = [ + "bincode", + "cstr", + "goblin", + "iced-x86", + "konst", + "num_enum 0.6.1", + "path-absolutize", + "same-file", + "serde", + "shrinkwraprs", + "stopwatch2", + "sysinfo", + "thiserror", + "widestring", + "winapi", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "easer" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba524f8b83c9c5bde02c2bb1627de9d1f81980489a6d54168cdfd08c258f917" +dependencies = [ + "num-traits", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enumflags2" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "enumn" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "enumset" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07a4b049558765cef5f0c1a273c3fc57084d768b44d2f98127aef4cceb17293" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c3b24c345d8c314966bdc1832f6c2635bfcce8e7cf363bd115987bba2ee242" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "euclid" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +dependencies = [ + "num-traits", + "serde", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener 5.3.1", + "pin-project-lite", +] + +[[package]] +name = "execute" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a82608ee96ce76aeab659e9b8d3c2b787bffd223199af88c674923d861ada10" +dependencies = [ + "execute-command-macro", + "execute-command-tokens", + "generic-array 1.1.1", +] + +[[package]] +name = "execute-command-macro" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90dec53d547564e911dc4ff3ecb726a64cf41a6fa01a2370ebc0d95175dd08bd" +dependencies = [ + "execute-command-macro-impl", +] + +[[package]] +name = "execute-command-macro-impl" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8cd46a041ad005ab9c71263f9a0ff5b529eac0fe4cc9b4a20f4f0765d8cf4b" +dependencies = [ + "execute-command-tokens", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "execute-command-tokens" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69dc321eb6be977f44674620ca3aa21703cb20ffbe560e1ae97da08401ffbcad" + +[[package]] +name = "exr" +version = "1.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide 0.8.0", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" + +[[package]] +name = "fdeflate" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +dependencies = [ + "crc32fast", + "miniz_oxide 0.8.0", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "freya" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b481e775917e679c0e983fdcc9c78fc312bb2ddac7cdc19b93f1acd8315b55" +dependencies = [ + "dioxus", + "dioxus-core", + "dioxus-core-macro", + "dioxus-hooks", + "dioxus-hot-reload", + "dioxus-signals", + "freya-common", + "freya-components", + "freya-core", + "freya-elements", + "freya-engine", + "freya-hooks", + "freya-node-state", + "freya-renderer", + "freya-testing", + "tokio", + "torin", +] + +[[package]] +name = "freya-common" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08e7edf9ab33b44d4c9422f96952a4774b59d26414b2eebfc9e844a89f7ba357" +dependencies = [ + "accesskit", + "accesskit_winit", + "dioxus-core", + "freya-engine", + "freya-native-core", + "rustc-hash", + "torin", + "uuid", + "winit", +] + +[[package]] +name = "freya-components" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78d7ee72ceece4ee6e06b23a4ba2ff0433b3b67ed5e922f00d3dcf6fb7719d08" +dependencies = [ + "bytes", + "dioxus", + "dioxus-router", + "freya-common", + "freya-core", + "freya-elements", + "freya-engine", + "freya-hooks", + "freya-node-state", + "futures-util", + "open", + "reqwest", + "tokio", + "torin", + "tracing", + "winit", +] + +[[package]] +name = "freya-core" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f74828c6ef8b80d7cf5813ff2db67027c59356242407f4090800bdb542cc653e" +dependencies = [ + "accesskit", + "dioxus-core", + "freya-common", + "freya-elements", + "freya-engine", + "freya-native-core", + "freya-node-state", + "itertools 0.11.0", + "rustc-hash", + "smallvec", + "tokio", + "torin", + "tracing", + "uuid", + "winit", +] + +[[package]] +name = "freya-elements" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f96748f6df0168959ff69ec2b07b08a66f734a3830fa92ae1d5ef4e4747a537" +dependencies = [ + "dioxus-core", + "dioxus-rsx", + "keyboard-types", + "torin", + "winit", +] + +[[package]] +name = "freya-engine" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5711fcd826a0150a790edc45212d5e3a51e25bbf54441ab16f31a12ac5c3edf3" +dependencies = [ + "bitflags 2.6.0", + "glutin", + "skia-safe", +] + +[[package]] +name = "freya-hooks" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83c0c53eb24cd185e62476a773dcb3247644512f31f2b992653057990a7e8e6" +dependencies = [ + "bitflags 2.6.0", + "bytes", + "dioxus-core", + "dioxus-hooks", + "dioxus-sdk", + "dioxus-signals", + "easer", + "freya-common", + "freya-core", + "freya-elements", + "freya-engine", + "freya-node-state", + "paste", + "ropey", + "tokio", + "torin", + "uuid", + "winit", +] + +[[package]] +name = "freya-native-core" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2d278accf67f29cfa44eb6ee307d403ea85444bb0404ccb79ca8b63885af7ed" +dependencies = [ + "anymap", + "dashmap", + "dioxus-core", + "parking_lot", + "rustc-hash", + "shipyard", + "smallvec", +] + +[[package]] +name = "freya-native-core-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca0db6ee77d75e6234c37c7898fe1ea8cf12d851c01772ad594f31c6f253c6" +dependencies = [ + "quote", + "syn 2.0.89", +] + +[[package]] +name = "freya-node-state" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fd4821f6b6584be7e0f60c1c830c99e18805f83599eb70be3a450d94f2cf2dc" +dependencies = [ + "accesskit", + "bytes", + "dioxus-core", + "freya-common", + "freya-engine", + "freya-native-core", + "freya-native-core-macro", + "rustc-hash", + "serde_json", + "shipyard", + "tokio", + "torin", + "uuid", +] + +[[package]] +name = "freya-renderer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a0354f9b5a11a3ed575a61a688ab3d303e7c0a73f2b7f4a9eb003eebbea841" +dependencies = [ + "accesskit", + "accesskit_winit", + "dioxus-core", + "dioxus-hot-reload", + "freya-common", + "freya-core", + "freya-elements", + "freya-engine", + "freya-hooks", + "freya-native-core", + "freya-node-state", + "futures-task", + "futures-util", + "gl", + "glutin", + "glutin-winit", + "image", + "itertools 0.11.0", + "pin-utils", + "raw-window-handle 0.5.2", + "tokio", + "torin", + "tracing", + "uuid", + "winit", +] + +[[package]] +name = "freya-testing" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6150fa59a63aed1b78edc930d3fdfd0c1fd742bf7848e475d616422cc84bb68" +dependencies = [ + "dioxus", + "dioxus-core", + "dioxus-core-macro", + "freya-common", + "freya-components", + "freya-core", + "freya-elements", + "freya-engine", + "freya-hooks", + "freya-native-core", + "freya-node-state", + "tokio", + "torin", + "winit", +] + +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" +dependencies = [ + "fastrand 2.2.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generational-box" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "557cf2cbacd0504c6bf8c29f52f8071e0de1d9783346713dc6121d7fa1e5d0e0" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "generic-array" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cb8bc4c28d15ade99c7e90b219f30da4be5c88e586277e8cbe886beeb868ab2" +dependencies = [ + "typenum", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "gl" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a94edab108827d67608095e269cf862e60d920f144a5026d3dbcfd8b877fb404" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "glutin" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fcd4ae4e86d991ad1300b8f57166e5be0c95ef1f63f3f5b827f8a164548746" +dependencies = [ + "bitflags 2.6.0", + "cfg_aliases", + "cgl", + "core-foundation", + "dispatch", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "icrate 0.0.4", + "libloading", + "objc2 0.4.1", + "once_cell", + "raw-window-handle 0.5.2", + "wayland-sys 0.31.5", + "windows-sys 0.48.0", + "x11-dl", +] + +[[package]] +name = "glutin-winit" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebcdfba24f73b8412c5181e56f092b5eff16671c514ce896b258a0a64bd7735" +dependencies = [ + "cfg_aliases", + "glutin", + "raw-window-handle 0.5.2", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77cc5623f5309ef433c3dd4ca1223195347fe62c413da8e2fdd0eb76db2d9bcd" +dependencies = [ + "gl_generator", + "windows-sys 0.48.0", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a165fd686c10dcc2d45380b35796e577eacfd43d4660ee741ec8ebe2201b3b4f" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "goblin" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6b4de4a8eb6c46a8c77e1d3be942cb9a8bf073c22374578e5ba4b08ed0ff68" +dependencies = [ + "log", + "plain", + "scroll", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.6.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.11", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.8", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.52.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "iced-x86" +version = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c447cff8c7f384a7d4f741cfcff32f75f3ad02b406432e8d6c878d56b1edf6b" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "icrate" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319" +dependencies = [ + "block2 0.3.0", + "dispatch", + "objc2 0.4.1", +] + +[[package]] +name = "icrate" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb69199826926eb864697bddd27f73d9fddcffc004f5733131e15b465e30642" +dependencies = [ + "block2 0.4.0", + "objc2 0.5.2", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "ignore" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "image" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "jpeg-decoder", + "num-traits", + "png", + "qoi", + "tiff", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "inotify" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "internment" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e8e537b529b8674e97e9fb82c10ff168a290ac3867a0295f112061ffbca1ef" +dependencies = [ + "hashbrown 0.14.5", + "parking_lot", +] + +[[package]] +name = "interprocess-docfix" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b84ee245c606aeb0841649a9288e3eae8c61b853a8cd5c0e14450e96d53d28f" +dependencies = [ + "blocking", + "cfg-if", + "futures-core", + "futures-io", + "intmap", + "libc", + "once_cell", + "rustc_version", + "spinning", + "thiserror", + "to_method", + "winapi", +] + +[[package]] +name = "intmap" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae52f28f45ac2bc96edb7714de995cffc174a395fb0abf5bff453587c980d7b9" + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ipnet" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "is_executable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a1b5bad6f9072935961dfbf1cced2f3d129963d091b6f69f007fe04e758ae2" +dependencies = [ + "winapi", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +dependencies = [ + "rayon", +] + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.6.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "konst" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b65f00fb3910881e52bf0850ae2a82aea411488a557e1c02820ceaa60963dce3" +dependencies = [ + "const_panic", + "konst_kernel", + "typewit", +] + +[[package]] +name = "konst_kernel" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "599c1232f55c72c7fc378335a3efe1c878c92720838c8e6a4fd87784ef7764de" +dependencies = [ + "typewit", +] + +[[package]] +name = "kqueue" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + +[[package]] +name = "krates" +version = "0.16.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcb3baf2360eb25ad31f0ada3add63927ada6db457791979b82ac199f835cb9" +dependencies = [ + "cargo-platform", + "cargo_metadata", + "cfg-expr", + "petgraph", + "semver", +] + +[[package]] +name = "lazy-bytes-cast" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10257499f089cd156ad82d0a9cd57d9501fa2c989068992a97eb3c27836f206b" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + +[[package]] +name = "libc" +version = "0.2.166" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" + +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall 0.5.7", +] [[package]] -name = "cpufeatures" -version = "0.2.16" +name = "libudis86-sys" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "139bbf9ddb1bfc90c1ac64dd2923d9c957cd433cee7315c018125d72ab08a6b0" dependencies = [ + "cc", "libc", ] [[package]] -name = "crypto-common" -version = "0.1.6" +name = "linux-raw-sys" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ - "generic-array", - "typenum", + "autocfg", + "scopeguard", ] [[package]] -name = "cstr" -version = "0.2.12" +name = "log" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68523903c8ae5aacfa32a0d9ae60cadeb764e1da14ee0d26b1f3089f13a54636" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "longest-increasing-subsequence" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86" + +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" dependencies = [ - "proc-macro2", - "quote", + "libc", ] [[package]] -name = "darling" -version = "0.20.10" +name = "malloc_buf" +version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" dependencies = [ - "darling_core", - "darling_macro", + "libc", ] [[package]] -name = "darling_core" -version = "0.20.10" +name = "memchr" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.89", + "libc", ] [[package]] -name = "darling_macro" -version = "0.20.10" +name = "memmap2" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ - "darling_core", - "quote", - "syn 2.0.89", + "libc", ] [[package]] -name = "deranged" -version = "0.3.11" +name = "memoffset" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ - "powerfmt", - "serde", + "autocfg", ] [[package]] -name = "detours-sys" -version = "0.1.2" +name = "memoffset" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a089d64a8b2e0fa98aa661f1323f49c7c382920504f47fcd2d157bd75cd1587" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ - "cc", + "autocfg", ] [[package]] -name = "digest" -version = "0.10.7" +name = "memoffset" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ - "block-buffer", - "crypto-common", + "autocfg", ] [[package]] -name = "dirs" -version = "5.0.1" +name = "mime" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ - "dirs-sys", + "adler", ] [[package]] -name = "dirs-sys" -version = "0.4.1" +name = "miniz_oxide" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", - "option-ext", - "redox_users", + "log", + "wasi", "windows-sys 0.48.0", ] [[package]] -name = "discord_modloader" -version = "2.0.0-beta1" +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "mmap-fixed-fixed" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0681853891801e4763dc252e843672faf32bcfee27a0aa3b19733902af450acc" dependencies = [ - "asar", - "clap", - "detours-sys", - "dirs", - "dll-syringe", "libc", - "retour", - "serde", - "toml", - "widestring", "winapi", ] [[package]] -name = "dll-syringe" -version = "0.15.2" +name = "native-tls" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdc807201d54de75e9bd7ad199d0031048625059f84acfc94506bdb13c0b4f59" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "bincode", - "cstr", - "goblin", - "iced-x86", - "konst", - "num_enum", - "path-absolutize", - "same-file", - "serde", - "shrinkwraprs", - "stopwatch2", - "sysinfo", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.6.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum 0.7.3", + "raw-window-handle 0.5.2", + "raw-window-handle 0.6.2", "thiserror", - "widestring", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "notify" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "729f63e1ca555a43fe3efa4f3efdf4801c479da85b432242a7b726f353c88486" +dependencies = [ + "bitflags 1.3.2", + "crossbeam-channel", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "mio 0.8.11", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", "winapi", ] [[package]] -name = "either" -version = "1.13.0" +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive 0.7.3", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] [[package]] -name = "equivalent" -version = "1.0.1" +name = "num_enum_derive" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.89", +] [[package]] -name = "eyre" -version = "0.6.12" +name = "objc" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ - "indenter", - "once_cell", + "malloc_buf", ] [[package]] -name = "fnv" -version = "1.0.7" +name = "objc-foundation" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] [[package]] -name = "generic-array" -version = "0.14.7" +name = "objc-sys" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d" dependencies = [ - "typenum", - "version_check", + "objc-sys", + "objc2-encode 3.0.0", ] [[package]] -name = "getrandom" -version = "0.2.15" +name = "objc2" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" dependencies = [ - "cfg-if", - "libc", - "wasi", + "objc-sys", + "objc2-encode 4.0.3", ] [[package]] -name = "gimli" -version = "0.28.1" +name = "objc2-encode" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666" [[package]] -name = "goblin" -version = "0.6.1" +name = "objc2-encode" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6b4de4a8eb6c46a8c77e1d3be942cb9a8bf073c22374578e5ba4b08ed0ff68" -dependencies = [ - "log", - "plain", - "scroll", -] +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" [[package]] -name = "hashbrown" -version = "0.12.3" +name = "objc_id" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] [[package]] -name = "hashbrown" -version = "0.15.2" +name = "object" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] [[package]] -name = "heck" -version = "0.5.0" +name = "once_cell" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] -name = "hex" -version = "0.4.3" +name = "open" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "3ecd52f0b8d15c40ce4820aa251ed5de032e5d91fab27f7db2f40d42a8bdf69c" +dependencies = [ + "is-wsl", + "libc", + "pathdiff", +] [[package]] -name = "iana-time-zone" -version = "0.1.61" +name = "openssl" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", + "bitflags 2.6.0", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", ] [[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" +name = "openssl-macros" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "cc", + "proc-macro2", + "quote", + "syn 2.0.89", ] [[package]] -name = "iced-x86" -version = "1.21.0" +name = "openssl-probe" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c447cff8c7f384a7d4f741cfcff32f75f3ad02b406432e8d6c878d56b1edf6b" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ - "lazy_static", + "cc", + "libc", + "pkg-config", + "vcpkg", ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "option-ext" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] -name = "indenter" -version = "0.3.3" +name = "orbclient" +version = "0.3.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" +dependencies = [ + "libredox", +] [[package]] -name = "indexmap" -version = "1.9.3" +name = "ordered-float" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", + "num-traits", ] [[package]] -name = "indexmap" -version = "2.6.0" +name = "ordered-stream" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" dependencies = [ - "equivalent", - "hashbrown 0.15.2", - "serde", + "futures-core", + "pin-project-lite", ] [[package]] -name = "is_executable" -version = "1.0.4" +name = "overload" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a1b5bad6f9072935961dfbf1cced2f3d129963d091b6f69f007fe04e758ae2" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "owned_ttf_parser" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" dependencies = [ - "winapi", + "ttf-parser", ] [[package]] -name = "is_terminal_polyfill" -version = "1.70.1" +name = "owo-colors" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" [[package]] -name = "itertools" -version = "0.8.2" +name = "parking" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ - "either", + "lock_api", + "parking_lot_core", ] [[package]] -name = "itertools" -version = "0.11.0" +name = "parking_lot_core" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ - "either", + "cfg-if", + "libc", + "redox_syscall 0.5.7", + "smallvec", + "windows-targets 0.52.6", ] [[package]] -name = "itoa" -version = "1.0.14" +name = "paste" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] -name = "js-sys" -version = "0.3.72" +name = "path-absolutize" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "e4af381fe79fa195b4909485d99f73a80792331df0625188e707854f0b3383f5" dependencies = [ - "wasm-bindgen", + "path-dedot", ] [[package]] -name = "konst" -version = "0.3.14" +name = "path-dedot" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65f00fb3910881e52bf0850ae2a82aea411488a557e1c02820ceaa60963dce3" +checksum = "07ba0ad7e047712414213ff67533e6dd477af0a4e1d14fb52343e53d30ea9397" dependencies = [ - "const_panic", - "konst_kernel", - "typewit", + "once_cell", ] [[package]] -name = "konst_kernel" -version = "0.3.12" +name = "pathdiff" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "599c1232f55c72c7fc378335a3efe1c878c92720838c8e6a4fd87784ef7764de" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ - "typewit", + "fixedbitset", + "indexmap 2.6.0", ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "pin-project-lite" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] -name = "libc" -version = "0.2.166" +name = "pin-utils" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "libredox" -version = "0.1.3" +name = "piper" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ - "bitflags 2.6.0", - "libc", + "atomic-waker", + "fastrand 2.2.0", + "futures-io", ] [[package]] -name = "libudis86-sys" -version = "0.2.1" +name = "pkg-config" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139bbf9ddb1bfc90c1ac64dd2923d9c957cd433cee7315c018125d72ab08a6b0" -dependencies = [ - "cc", - "libc", -] +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] -name = "log" -version = "0.4.22" +name = "plain" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] -name = "mach2" -version = "0.4.2" +name = "png" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" dependencies = [ - "libc", + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.0", ] [[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" +name = "polling" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] [[package]] -name = "miniz_oxide" -version = "0.7.4" +name = "polling" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ - "adler", + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix 0.38.41", + "tracing", + "windows-sys 0.59.0", ] [[package]] -name = "mmap-fixed-fixed" -version = "0.1.3" +name = "pori" +version = "0.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0681853891801e4763dc252e843672faf32bcfee27a0aa3b19733902af450acc" +checksum = "a4a63d338dec139f56dacc692ca63ad35a6be6a797442479b55acd611d79e906" dependencies = [ - "libc", - "winapi", + "nom", ] [[package]] -name = "nom" -version = "7.1.3" +name = "powerfmt" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] -name = "ntapi" -version = "0.4.1" +name = "ppv-lite86" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "winapi", + "zerocopy", ] [[package]] -name = "num-conv" -version = "0.1.0" +name = "prettyplease" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +dependencies = [ + "proc-macro2", + "syn 2.0.89", +] [[package]] -name = "num-traits" -version = "0.2.19" +name = "proc-macro-crate" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ - "autocfg", + "once_cell", + "toml_edit 0.19.15", ] [[package]] -name = "num_enum" -version = "0.6.1" +name = "proc-macro-crate" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "num_enum_derive", + "toml_edit 0.22.22", ] [[package]] -name = "num_enum_derive" -version = "0.6.1" +name = "proc-macro2" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.89", + "unicode-ident", ] [[package]] -name = "object" -version = "0.32.2" +name = "qoi" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" dependencies = [ - "memchr", + "bytemuck", ] [[package]] -name = "once_cell" -version = "1.20.2" +name = "quick-xml" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +dependencies = [ + "memchr", +] [[package]] -name = "option-ext" -version = "0.2.0" +name = "quote" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] [[package]] -name = "owo-colors" -version = "3.5.0" +name = "rand" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] [[package]] -name = "path-absolutize" -version = "3.1.1" +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4af381fe79fa195b4909485d99f73a80792331df0625188e707854f0b3383f5" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ - "path-dedot", + "ppv-lite86", + "rand_core", ] [[package]] -name = "path-dedot" -version = "3.1.1" +name = "rand_core" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ba0ad7e047712414213ff67533e6dd477af0a4e1d14fb52343e53d30ea9397" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "once_cell", + "getrandom", ] [[package]] -name = "pin-project-lite" -version = "0.2.15" +name = "raw-window-handle" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] -name = "plain" -version = "0.2.3" +name = "raw-window-handle" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] -name = "pori" -version = "0.0.0" +name = "rayon" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a63d338dec139f56dacc692ca63ad35a6be6a797442479b55acd611d79e906" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ - "nom", + "either", + "rayon-core", ] [[package]] -name = "powerfmt" -version = "0.2.0" +name = "rayon-core" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] [[package]] -name = "proc-macro2" -version = "1.0.92" +name = "redox_syscall" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "unicode-ident", + "bitflags 1.3.2", ] [[package]] -name = "quote" -version = "1.0.37" +name = "redox_syscall" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ - "proc-macro2", + "bitflags 2.6.0", ] [[package]] @@ -964,6 +4048,46 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "retour" version = "0.3.1" @@ -971,7 +4095,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9af44d40e2400b44d491bfaf8eae111b09f23ac4de6e92728e79d93e699c527" dependencies = [ "cfg-if", - "generic-array", + "generic-array 0.14.7", "libc", "libudis86-sys", "mmap-fixed-fixed", @@ -980,12 +4104,120 @@ dependencies = [ "slice-pool2", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "ropey" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93411e420bcd1a75ddd1dc3caf18c23155eda2c090631a85af21ba19e97093b5" +dependencies = [ + "smallvec", + "str_indices", +] + [[package]] name = "rustc-demangle" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys 0.4.14", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.23.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pki-types" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "ryu" version = "1.0.18" @@ -1001,6 +4233,27 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "scroll" version = "0.11.0" @@ -1021,6 +4274,51 @@ dependencies = [ "syn 2.0.89", ] +[[package]] +name = "sctk-adwaita" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70b31447ca297092c5a9916fc3b955203157b37c19ca8edde4f52e9843e602c7" +dependencies = [ + "ab_glyph", + "log", + "memmap2 0.9.5", + "smithay-client-toolkit 0.18.1", + "tiny-skia", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + [[package]] name = "serde" version = "1.0.215" @@ -1030,6 +4328,16 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + [[package]] name = "serde_derive" version = "1.0.215" @@ -1053,6 +4361,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "serde_spanned" version = "0.6.8" @@ -1062,13 +4381,25 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "serde_with" version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ - "base64", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", @@ -1092,6 +4423,17 @@ dependencies = [ "syn 2.0.89", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1112,6 +4454,29 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shipyard" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace89f5a47029be049c7f47d166cd2c7a30d74e127f4baa2d8885e5d3b486035" +dependencies = [ + "hashbrown 0.12.3", + "lock_api", + "rayon", + "shipyard_proc", +] + +[[package]] +name = "shipyard_proc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb847f4b9582e468198b5cfb5731b65cc67fe5e535acc9cbf3c11703d15f08c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1131,24 +4496,221 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "skia-bindings" +version = "0.72.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace7c5359ccb009880e65958eaf1e2fa68ee19ada6931300c2f1942f84abf2c3" +dependencies = [ + "bindgen", + "cc", + "flate2", + "heck 0.4.1", + "lazy_static", + "regex", + "serde_json", + "tar", + "toml", +] + +[[package]] +name = "skia-safe" +version = "0.72.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0a4a3df502b317456a34df181ac67a7a6443b0f2e4b883ac220dba1dcb3ce38" +dependencies = [ + "base64 0.22.1", + "bitflags 2.6.0", + "lazy_static", + "skia-bindings", + "ureq", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + [[package]] name = "slice-pool2" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a3d689654af89bdfeba29a914ab6ac0236d382eb3b764f7454dde052f2821f8" +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "serde", + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smithay-client-toolkit" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" +dependencies = [ + "bitflags 1.3.2", + "dlib", + "lazy_static", + "log", + "memmap2 0.5.10", + "nix 0.24.3", + "pkg-config", + "wayland-client 0.29.5", + "wayland-cursor 0.29.5", + "wayland-protocols 0.29.5", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a" +dependencies = [ + "bitflags 2.6.0", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2 0.9.5", + "rustix 0.38.41", + "thiserror", + "wayland-backend", + "wayland-client 0.31.7", + "wayland-csd-frame", + "wayland-cursor 0.31.7", + "wayland-protocols 0.31.2", + "wayland-protocols-wlr", + "wayland-scanner 0.31.5", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" +dependencies = [ + "smithay-client-toolkit 0.16.1", + "wayland-client 0.29.5", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spinning" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d4f0e86297cad2658d92a707320d87bf4e6ae1050287f51d19b67ef3f153a7b" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "stopwatch2" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "911ece10388afa48417f99e01df038460b6249a3ee0255f6446a6881b702fbb4" +[[package]] +name = "str_indices" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d08889ec5408683408db66ad89e0e1f93dff55c73a4ccc71c427d5b277ee47e6" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "syn" version = "1.0.109" @@ -1171,6 +4733,23 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "sysinfo" version = "0.29.11" @@ -1185,6 +4764,51 @@ dependencies = [ "winapi", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tar" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tempfile" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +dependencies = [ + "cfg-if", + "fastrand 2.2.0", + "once_cell", + "rustix 0.38.41", + "windows-sys 0.59.0", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -1215,6 +4839,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + [[package]] name = "time" version = "0.3.36" @@ -1246,6 +4881,97 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "to_method" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c4ceeeca15c8384bbc3e011dbd8fccb7f068a440b752b7d9b32ceb0ca0e2e8" + +[[package]] +name = "tokio" +version = "1.41.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio 1.0.2", + "pin-project-lite", + "socket2 0.5.8", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml" version = "0.8.19" @@ -1255,7 +4981,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.22.22", ] [[package]] @@ -1267,6 +4993,17 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.6.0", + "toml_datetime", + "winnow 0.5.40", +] + [[package]] name = "toml_edit" version = "0.22.22" @@ -1277,9 +5014,27 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.20", +] + +[[package]] +name = "torin" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b1eb9f7fa2cfa7785610e1a5b1b75c91504cef96fdcc9e2c2d7184477fba65a" +dependencies = [ + "euclid", + "freya-native-core", + "rustc-hash", + "tracing", ] +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.41" @@ -1287,9 +5042,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "tracing-core" version = "0.1.33" @@ -1310,17 +5077,43 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + [[package]] name = "tracing-subscriber" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ + "nu-ansi-term", "sharded-slab", + "smallvec", "thread_local", "tracing-core", + "tracing-log", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5902c5d130972a0000f60860bfbf46f7ca3db5391eddfedd1b8728bd9dc96c0e" + [[package]] name = "typenum" version = "1.17.0" @@ -1342,36 +5135,126 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e36a83ea2b3c704935a01b4642946aadd445cea40b10935e3f8bd8052b8193d6" +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset 0.9.1", + "tempfile", + "winapi", +] + [[package]] name = "unicode-ident" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a" +dependencies = [ + "base64 0.22.1", + "flate2", + "log", + "once_cell", + "rustls", + "rustls-pki-types", + "url", + "webpki-roots", +] + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +dependencies = [ + "getrandom", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + [[package]] name = "walkdir" version = "2.5.0" @@ -1382,6 +5265,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1414,6 +5306,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.95" @@ -1458,6 +5362,235 @@ dependencies = [ "walkdir", ] +[[package]] +name = "wayland-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +dependencies = [ + "cc", + "downcast-rs", + "rustix 0.38.41", + "scoped-tls", + "smallvec", + "wayland-sys 0.31.5", +] + +[[package]] +name = "wayland-client" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" +dependencies = [ + "bitflags 1.3.2", + "downcast-rs", + "libc", + "nix 0.24.3", + "scoped-tls", + "wayland-commons", + "wayland-scanner 0.29.5", + "wayland-sys 0.29.5", +] + +[[package]] +name = "wayland-client" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" +dependencies = [ + "bitflags 2.6.0", + "rustix 0.38.41", + "wayland-backend", + "wayland-scanner 0.31.5", +] + +[[package]] +name = "wayland-commons" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +dependencies = [ + "nix 0.24.3", + "once_cell", + "smallvec", + "wayland-sys 0.29.5", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.6.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +dependencies = [ + "nix 0.24.3", + "wayland-client 0.29.5", + "xcursor", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b08bc3aafdb0035e7fe0fdf17ba0c09c268732707dca4ae098f60cb28c9e4c" +dependencies = [ + "rustix 0.38.41", + "wayland-client 0.31.7", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +dependencies = [ + "bitflags 1.3.2", + "wayland-client 0.29.5", + "wayland-commons", + "wayland-scanner 0.29.5", +] + +[[package]] +name = "wayland-protocols" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client 0.31.7", + "wayland-scanner 0.31.5", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client 0.31.7", + "wayland-protocols 0.31.2", + "wayland-scanner 0.31.5", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client 0.31.7", + "wayland-protocols 0.31.2", + "wayland-scanner 0.31.5", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +dependencies = [ + "dlib", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "wayland-sys" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.41", +] + [[package]] name = "widestring" version = "1.1.0" @@ -1489,6 +5622,15 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "winapi-wsapoll" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1eafc5f679c576995526e81635d0cf9695841736712b4e892f87abbe6fed3f28" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -1496,12 +5638,74 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-core" -version = "0.52.0" +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", + "windows-implement", + "windows-interface", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942ac266be9249c84ca862f0a164a39533dc2f6f33dc98ec89c8da99b82ea0bd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "windows-interface" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da33557140a288fae4e1d5f8873aaf9eb6613a9cf82c3e070223ff177f598b60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets 0.52.6", + "windows-targets 0.42.2", ] [[package]] @@ -1531,6 +5735,21 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -1562,6 +5781,12 @@ dependencies = [ "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -1574,6 +5799,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -1586,6 +5817,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -1604,6 +5841,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -1616,6 +5859,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -1628,6 +5877,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -1640,6 +5895,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -1652,6 +5913,64 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winit" +version = "0.29.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca" +dependencies = [ + "ahash 0.8.11", + "android-activity", + "atomic-waker", + "bitflags 2.6.0", + "bytemuck", + "calloop", + "cfg_aliases", + "core-foundation", + "core-graphics", + "cursor-icon", + "icrate 0.0.4", + "js-sys", + "libc", + "log", + "memmap2 0.9.5", + "ndk", + "ndk-sys", + "objc2 0.4.1", + "once_cell", + "orbclient", + "percent-encoding", + "raw-window-handle 0.5.2", + "raw-window-handle 0.6.2", + "redox_syscall 0.3.5", + "rustix 0.38.41", + "sctk-adwaita", + "smithay-client-toolkit 0.18.1", + "smol_str", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client 0.31.7", + "wayland-protocols 0.31.2", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.48.0", + "x11-dl", + "x11rb 0.13.1", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winnow" version = "0.6.20" @@ -1660,3 +5979,347 @@ checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "x11-clipboard" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "980b9aa9226c3b7de8e2adb11bf20124327c054e0e5812d2aac0b5b5a87e7464" +dependencies = [ + "x11rb 0.10.1", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" +dependencies = [ + "gethostname 0.2.3", + "nix 0.24.3", + "winapi", + "winapi-wsapoll", + "x11rb-protocol 0.10.0", +] + +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "as-raw-xcb-connection", + "gethostname 0.4.3", + "libc", + "libloading", + "once_cell", + "rustix 0.38.41", + "x11rb-protocol 0.13.1", +] + +[[package]] +name = "x11rb-protocol" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67" +dependencies = [ + "nix 0.24.3", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xattr" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +dependencies = [ + "libc", + "linux-raw-sys 0.4.14", + "rustix 0.38.41", +] + +[[package]] +name = "xcursor" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.6.0", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af310deaae937e48a26602b730250b4949e125f468f11e6990be3e5304ddd96f" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", + "synstructure", +] + +[[package]] +name = "zbus" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io 1.13.0", + "async-lock 2.8.0", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "byteorder", + "derivative", + "enumflags2", + "event-listener 2.5.3", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.26.4", + "once_cell", + "ordered-stream", + "rand", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "winapi", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zvariant" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" +dependencies = [ + "byteorder", + "enumflags2", + "libc", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] diff --git a/Cargo.toml b/Cargo.toml index 7e711ae..c1fc2f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,12 +5,14 @@ version = "2.0.0-beta1" [lib] crate-type = ["cdylib", "lib"] -name = "discord_modloader_lib" +name = "libdiscordmodloader" [dependencies] asar = "0.3.0" clap = { version = "4.5.20", features = ["derive"] } +dioxus = "0.5.6" dirs = "5.0.1" +freya = "0.2.2" serde = { version = "1.0.210", features = ["serde_derive"] } toml = "0.8.19" diff --git a/src/config.rs b/src/config.rs index 9f73f51..0832bfe 100644 --- a/src/config.rs +++ b/src/config.rs @@ -42,7 +42,10 @@ impl Config { } pub fn init() -> Config { - let profiles_dir = dirs::data_local_dir().unwrap().join("discord-modloader"); + let profiles_dir = dirs::data_dir() + .unwrap() + .join("discord-modloader") + .join("profiles"); println!("Loading from profile directory: {}", profiles_dir.display()); diff --git a/src/detours/mod.rs b/src/detours/mod.rs deleted file mode 100644 index 26363af..0000000 --- a/src/detours/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod utils; -pub mod win32; diff --git a/src/detours/utils.rs b/src/detours/utils.rs deleted file mode 100644 index 0eb80ee..0000000 --- a/src/detours/utils.rs +++ /dev/null @@ -1,44 +0,0 @@ -use std::path::PathBuf; - -static mut MOD_DONE_LOADING: bool = false; - -const KNOWN_ASAR_NAMES: &[&str] = &["_app.asar", "app.orig.asar"]; - -/// Map original filenames to our modified filenames. -pub unsafe fn file_name_handler(path: &str) -> String { - let asar_toggle_query = std::env::var("MODHOOK_TOGGLE_QUERY") - .unwrap() - .to_lowercase(); - let pathbuf = PathBuf::from(&path); - - if path.to_lowercase().contains(&asar_toggle_query) { - MOD_DONE_LOADING = true; - } - - if let Some(filename) = pathbuf.file_name() { - let filename = filename.to_str().unwrap(); - - // If we have a custom asar filename, replace it with the original. - if let Ok(asar) = std::env::var("MODHOOK_MOD_ASAR_FILENAME") { - if filename.eq(&asar.to_lowercase()) { - return path.replace(&asar, "app.asar"); - } - } - - // Otherwise, default to the known asar names and replace them with the original. - if let Some(asar) = KNOWN_ASAR_NAMES.iter().find(|&&x| filename.eq(x)) { - let new_path = path.replace(asar, "app.asar"); - return new_path; - } - } - - if MOD_DONE_LOADING { - return path.to_string(); - } - - if path.ends_with("app.asar") { - return std::env::var("MODHOOK_ASAR_PATH").unwrap(); - } - - path.to_string() -} diff --git a/src/detours/win32.rs b/src/detours/win32.rs deleted file mode 100644 index cb831c8..0000000 --- a/src/detours/win32.rs +++ /dev/null @@ -1,155 +0,0 @@ -use std::ffi::{c_void, CString}; - -use detours_sys::{DetourAttach, DetourCreateProcessWithDllW}; -use widestring::U16CString; -use winapi::{ - shared::{ - minwindef::{BOOL, DWORD, LPVOID}, - ntdef::LPCWSTR, - }, - um::{ - fileapi::{CreateFileW, GetFileAttributesW}, - minwinbase::LPSECURITY_ATTRIBUTES, - processthreadsapi::{CreateProcessW, ResumeThread, LPPROCESS_INFORMATION, LPSTARTUPINFOW}, - winnt::{HANDLE, LPWSTR}, - }, -}; - -use super::utils::file_name_handler; - -/// Path to the libmodhook DLL. -static DLL_PATH: &str = "libmodhook.dll"; - -static mut O_CREATE_FILE_W: *mut c_void = 0 as _; -static mut O_GET_FILE_ATTRIBUTES_W: *mut c_void = 0 as _; -static mut O_CREATE_PROCESS_W: *mut c_void = 0 as _; - -pub unsafe fn init_detours() { - O_CREATE_FILE_W = CreateFileW as *mut c_void; - DetourAttach(&raw mut O_CREATE_FILE_W, create_file_w as _); - - O_GET_FILE_ATTRIBUTES_W = GetFileAttributesW as *mut c_void; - DetourAttach(&raw mut O_GET_FILE_ATTRIBUTES_W, get_file_attributes_w as _); - - O_CREATE_PROCESS_W = CreateProcessW as *mut c_void; - DetourAttach(&raw mut O_CREATE_PROCESS_W, create_process_w as _); -} - -unsafe fn create_file_w( - lp_file_name: LPCWSTR, - dw_desired_access: DWORD, - dw_share_mode: DWORD, - lp_security_attributes: LPSECURITY_ATTRIBUTES, - dw_creation_disposition: DWORD, - dw_flags_and_attributes: DWORD, - h_template_file: HANDLE, -) -> HANDLE { - let file_name = U16CString::from_ptr_str(lp_file_name).to_string().unwrap(); - - let new_file_name = file_name_handler(&file_name); - let new_file_name = U16CString::from_str(new_file_name).unwrap(); - - let create_file_w: extern "C" fn( - lp_file_name: LPCWSTR, - dw_desired_access: DWORD, - dw_share_mode: DWORD, - lp_security_attributes: LPSECURITY_ATTRIBUTES, - dw_creation_disposition: DWORD, - dw_flags_and_attributes: DWORD, - h_template_file: HANDLE, - ) -> HANDLE = std::mem::transmute(O_CREATE_FILE_W); - - create_file_w( - new_file_name.as_ptr(), - dw_desired_access, - dw_share_mode, - lp_security_attributes, - dw_creation_disposition, - dw_flags_and_attributes, - h_template_file, - ) -} - -unsafe fn get_file_attributes_w(lp_file_name: LPCWSTR) -> DWORD { - let get_file_attributes_w: extern "C" fn(lp_file_name: LPCWSTR) -> DWORD = - std::mem::transmute(O_GET_FILE_ATTRIBUTES_W); - - let file_name = U16CString::from_ptr_str(lp_file_name).to_string().unwrap(); - - let new_file_name = file_name_handler(&file_name); - let new_file_name = U16CString::from_str(new_file_name).unwrap(); - - get_file_attributes_w(new_file_name.as_ptr()) -} - -#[allow(clippy::too_many_arguments)] -unsafe fn create_process_w( - lp_application_name: LPCWSTR, - lp_command_line: LPWSTR, - lp_process_attributes: LPSECURITY_ATTRIBUTES, - lp_thread_attributes: LPSECURITY_ATTRIBUTES, - b_inherit_handles: BOOL, - dw_creation_flags: DWORD, - lp_environment: LPVOID, - lp_current_directory: LPCWSTR, - lp_startup_info: LPSTARTUPINFOW, - lp_process_information: LPPROCESS_INFORMATION, -) -> BOOL { - let create_process_w: unsafe extern "C" fn( - lp_application_name: LPCWSTR, - lp_command_line: LPWSTR, - lp_process_attributes: LPSECURITY_ATTRIBUTES, - lp_thread_attributes: LPSECURITY_ATTRIBUTES, - b_inherit_handles: BOOL, - dw_creation_flags: DWORD, - lp_environment: LPVOID, - lp_current_directory: LPCWSTR, - lp_startup_info: LPSTARTUPINFOW, - lp_process_information: LPPROCESS_INFORMATION, - ) -> BOOL = std::mem::transmute(O_CREATE_PROCESS_W); - - let command_line = U16CString::from_ptr_str(lp_command_line) - .to_string() - .unwrap(); - - if !command_line.contains("--type=renderer") { - return create_process_w( - lp_application_name, - lp_command_line, - lp_process_attributes, - lp_thread_attributes, - b_inherit_handles, - dw_creation_flags, - lp_environment, - lp_current_directory, - lp_startup_info, - lp_process_information, - ); - } - - let dll_path = CString::new(DLL_PATH.to_string()).unwrap(); - - let success = DetourCreateProcessWithDllW( - lp_application_name, - lp_command_line, - lp_process_attributes as _, - lp_thread_attributes as _, - b_inherit_handles, - dw_creation_flags, - lp_environment as _, - lp_current_directory, - lp_startup_info as _, - lp_process_information as _, - dll_path.as_ptr(), - Some(std::mem::transmute(O_CREATE_PROCESS_W)), - ); - - if success != 1 { - println!("[ModHook] Failed to create process"); - return success; - } - - ResumeThread((*lp_process_information).hThread as _); - - success -} diff --git a/src/env.rs b/src/env.rs deleted file mode 100644 index 58482c4..0000000 --- a/src/env.rs +++ /dev/null @@ -1,118 +0,0 @@ -use std::path::Path; - -#[derive(Debug)] -pub struct Environment { - /// Path to the mods' JS entrypoint. - /// - /// e.g. "c:\users\megu\vencord\patcher.js" - pub mod_entrypoint: String, - - /// Path to check for to revert to default app.asar behaviour after the mod has loaded. - /// - /// e.g. "vencord\patcher.js" - pub toggle_query: Option, - - /// Custom name for AppData profile. - /// - /// e.g. "MyCustomProfile" - pub custom_data_dir: Option, - - /// ModHook ASAR replacement. - /// - /// e.g. "c:\users\megu\vencord\app.asar" - pub asar_path: Option, - - /// Modded ASAR filename. - /// - /// This is the file that the mod (e.g. Vencord) loads - /// to return to the original Discord context. - /// - /// ModHook will redirect calls to this file to the original app.asar (e.g. _app.asar -> app.asar) - /// - /// e.g. "_app.asar" - pub modded_asar_filename: Option, - - /// Whether or not the mod is the moonlight mod. - /// - /// Moonlight uses `require(entrypoint).inject(asarPath);` - /// instead of the usual `require(entrypoint);` - pub is_moonlight: bool, -} - -#[allow(dead_code)] -impl Environment { - /// Creates a new Environment struct from the current environment variables. - pub fn from_env() -> Self { - let mut env = Environment { - asar_path: None, - mod_entrypoint: std::env::var("MODHOOK_MOD_ENTRYPOINT").unwrap(), - toggle_query: None, - custom_data_dir: None, - modded_asar_filename: None, - is_moonlight: false, - }; - - if let Ok(path) = std::env::var("MODHOOK_ASAR_PATH") { - env.asar_path = Some(path); - } else { - let absolute_path = Path::new("app.asar").canonicalize().unwrap(); - env.asar_path = Some(absolute_path.to_str().unwrap().to_string()); - } - - if let Ok(path) = std::env::var("MODHOOK_TOGGLE_QUERY") { - env.toggle_query = Some(path.to_lowercase()); - } else { - env.toggle_query = Some(env.mod_entrypoint.clone()); - } - - if let Ok(path) = std::env::var("MODHOOK_CUSTOM_DATA_DIR") { - env.custom_data_dir = Some(path); - } - - if let Ok(file) = std::env::var("MODHOOK_MOD_ASAR_FILENAME") { - env.modded_asar_filename = Some(file); - } else { - env.modded_asar_filename = Some("_app.asar".to_string()); - } - - if let Ok(is_moonlight) = std::env::var("MODHOOK_IS_MOONLIGHT") { - env.is_moonlight = is_moonlight == "true"; - } - - env - } - - /// Applies the environment variables to the current process. - pub fn apply(&self) { - if let Some(path) = &self.asar_path { - std::env::set_var("MODHOOK_ASAR_PATH", path); - } - - std::env::set_var("MODHOOK_MOD_ENTRYPOINT", &self.mod_entrypoint); - - if let Some(path) = &self.custom_data_dir { - std::env::set_var("MODHOOK_CUSTOM_DATA_DIR", path); - } - - if let Some(query) = &self.toggle_query { - std::env::set_var("MODHOOK_TOGGLE_QUERY", query.to_lowercase()); - } else { - std::env::set_var("MODHOOK_TOGGLE_QUERY", &self.mod_entrypoint); - } - - if let Some(file) = &self.modded_asar_filename { - std::env::set_var("MODHOOK_MOD_ASAR_FILENAME", file); - } else { - std::env::set_var("MODHOOK_MOD_ASAR_FILENAME", "_app.asar"); - } - - // Disable auto patching of the Discord client. - // Currently supported mods: - // - Vencord - std::env::set_var("DISABLE_UPDATER_AUTO_PATCHING", "true"); - - if self.is_moonlight { - std::env::set_var("MODHOOK_IS_MOONLIGHT", "true"); - } - } -} diff --git a/src/lib.rs b/src/lib.rs index 718fa07..02ef0f2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,12 +1,20 @@ pub mod config; +pub mod discord; #[cfg(target_os = "linux")] mod unix; +#[cfg(target_os = "windows")] +mod windows; + #[cfg(target_os = "linux")] #[allow(unused_imports)] pub use unix::*; +#[cfg(target_os = "windows")] +#[allow(unused_imports)] +pub use windows::*; + pub fn get_or_write_cache(instance: &config::Instance, mod_: &config::Mod) -> String { let cache_dir = dirs::cache_dir().unwrap().join("discord-modloader"); if !cache_dir.exists() { @@ -34,14 +42,20 @@ pub fn get_or_write_cache(instance: &config::Instance, mod_: &config::Mod) -> St } let mod_entrypoint = std::path::Path::new(&mod_.path).join(&mod_.entrypoint); - let mod_entrypoint = mod_entrypoint.to_str().unwrap(); + let mod_entrypoint = mod_entrypoint.to_str().unwrap().replace("\\", "\\\\"); + + let profile_dir = instance + .profile_path + .clone() + .unwrap_or_default() + .replace("\\", "\\\\"); - let profile_dir = instance.profile_path.clone().unwrap_or_default(); + dbg!(&profile_dir); let profile_loader = instance.profile.as_ref().map(|_| { ASAR_CUSTOM_PROFILE_JS .replace("__CUSTOM_PROFILE_DIR__", &profile_dir) - .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + .replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint) }); let custom_loader = if let Some(loader) = &mod_.loader { @@ -50,7 +64,7 @@ pub fn get_or_write_cache(instance: &config::Instance, mod_: &config::Mod) -> St .as_ref() .map(|p| { p.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) - .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + .replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint) }) .unwrap_or_default(); @@ -59,7 +73,7 @@ pub fn get_or_write_cache(instance: &config::Instance, mod_: &config::Mod) -> St .as_ref() .map(|p| { p.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) - .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + .replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint) }) .unwrap_or(profile_loader.unwrap_or_default()); @@ -68,16 +82,16 @@ pub fn get_or_write_cache(instance: &config::Instance, mod_: &config::Mod) -> St .as_ref() .map(|r| { r.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) - .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + .replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint) }) - .unwrap_or(format!(r#"require("{}")"#, mod_entrypoint)); + .unwrap_or(format!(r#"require("{}")"#, &mod_entrypoint)); let suffix = loader .suffix .as_ref() .map(|s| { s.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) - .replace("__MOD_ENTRYPOINT_FILE__", mod_entrypoint) + .replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint) }) .unwrap_or_default(); diff --git a/src/main.rs b/src/main.rs index a1c9c97..fdde92f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use clap::Parser; -use discord_modloader_lib::{config, get_or_write_cache}; +use libdiscordmodloader::{config, get_or_write_cache}; #[derive(clap::Parser, Debug)] struct Args { @@ -23,7 +23,7 @@ fn main() { if let Some(instance) = config.instances.get(&args.instance) { dbg!(&instance); - load_profile(&config, instance); + unsafe { load_profile(&config, instance) }; } else { println!("Instance not found. Make sure it exists in the instances directory."); } @@ -56,21 +56,62 @@ fn load_profile(config: &config::Config, instance: &config::Instance) { } #[cfg(target_os = "windows")] -fn load_profile(config: &config::Config, instance: &config::Instance) { +unsafe fn load_profile(config: &config::Config, instance: &config::Instance) { + use detours_sys::{DetourCreateProcessWithDllExA, _PROCESS_INFORMATION, _STARTUPINFOA}; + use libdiscordmodloader::discord::get_discord_executable; + use winapi::um::{ + handleapi::CloseHandle, processthreadsapi::ResumeThread, winbase::CREATE_SUSPENDED, + }; + println!("Loading Instance: {}", instance.name); if let Some(ref profile_path) = instance.profile_path { println!("On profile: {}", profile_path) } - // let asar_path = get_or_write_cache(instance, config.mods.get(&instance.r#mod).unwrap()); + let asar_path = get_or_write_cache(instance, config.mods.get(&instance.r#mod).unwrap()); - let mut target = std::process::Command::new(instance.path.clone()) - .current_dir(std::path::Path::new(&instance.path).parent().unwrap()) - .args(["--trace-warnings"]) - .spawn() - .expect("Failed to launch instance."); + let mut process_info: _PROCESS_INFORMATION = unsafe { std::mem::zeroed() }; + let mut startup_info: _STARTUPINFOA = unsafe { std::mem::zeroed() }; - target - .wait() - .expect("Failed to wait for instance to finish."); + let discord_exe = + get_discord_executable(&instance.path).expect("Failed to get Discord executable."); + let discord_exe = std::ffi::CString::new(discord_exe.to_str().unwrap()).unwrap(); + let lp_current_directory = + std::ffi::CString::new("W:\\Discord\\ModHook\\target\\debug").unwrap(); + let dll = std::ffi::CString::new("libdiscordmodloader.dll").unwrap(); + + dbg!(&discord_exe); + dbg!(&lp_current_directory); + dbg!(&dll); + + std::env::set_var("MODLOADER_ASAR_PATH", asar_path); + std::env::set_var( + "MODLOADER_DLL_PATH", + "W:\\Discord\\ModHook\\target\\debug\\libdiscordmodloader.dll", + ); + + let result = DetourCreateProcessWithDllExA( + std::ptr::null_mut(), + discord_exe.as_ptr() as *mut i8, + std::ptr::null_mut(), + std::ptr::null_mut(), + 0, + CREATE_SUSPENDED, + std::ptr::null_mut(), + std::ptr::null_mut(), + &raw mut startup_info, + &raw mut process_info, + dll.as_ptr(), + None, + ); + + if result == 0 { + let err = std::io::Error::last_os_error(); + panic!("Failed to create process with DLL."); + } + + ResumeThread(process_info.hThread); + + CloseHandle(process_info.hProcess); + CloseHandle(process_info.hThread); } diff --git a/src/windows.rs b/src/windows.rs new file mode 100644 index 0000000..2f4310c --- /dev/null +++ b/src/windows.rs @@ -0,0 +1,262 @@ +use std::{ffi::CString, str::FromStr, sync::LazyLock}; + +use detours_sys::{ + DetourAttach, DetourCreateProcessWithDllW, DetourIsHelperProcess, DetourRestoreAfterWith, + DetourTransactionAbort, DetourTransactionBegin, DetourTransactionCommit, DetourUpdateThread, + PVOID, +}; + +use widestring::U16CString; +use winapi::{ + shared::{ + minwindef::{BOOL, DWORD, HINSTANCE, LPVOID}, + ntdef::{HANDLE, LPCWSTR, LPWSTR}, + }, + um::{ + fileapi::{CreateFileW, GetFileAttributesW}, + minwinbase::LPSECURITY_ATTRIBUTES, + processthreadsapi::{ + CreateProcessW, GetCurrentThread, ResumeThread, LPPROCESS_INFORMATION, LPSTARTUPINFOW, + }, + winnt::DLL_PROCESS_ATTACH, + winuser::MessageBoxA, + }, +}; + +use winapi::um::consoleapi::AllocConsole; + +static MODLOADER_ASAR_PATH: LazyLock = + LazyLock::new(|| std::env::var("MODLOADER_ASAR_PATH").unwrap()); + +static MODLOADER_DLL_PATH: LazyLock = + LazyLock::new(|| std::env::var("MODLOADER_DLL_PATH").unwrap()); + +static mut ORIGINAL_GET_FILE_ATTRIBUTES_W: PVOID = GetFileAttributesW as _; +static mut ORIGINAL_CREATE_FILE_W: PVOID = CreateFileW as _; +static mut ORIGINAL_CREATE_PROCESS_W: PVOID = CreateProcessW as _; + +macro_rules! error_hooking_msg { + ($msg:expr) => { + MessageBoxA( + std::ptr::null_mut(), + $msg.as_ptr() as *const i8, + "Error Hooking".as_ptr() as *const i8, + 0, + ); + }; +} + +#[no_mangle] +unsafe extern "stdcall" fn DllMain( + _hinst_dll: HINSTANCE, + fwd_reason: DWORD, + _lpv_reserved: LPVOID, +) -> i32 { + if DetourIsHelperProcess() == 1 { + return 1; + } + + if fwd_reason != DLL_PROCESS_ATTACH { + return 1; + } + + DetourRestoreAfterWith(); + + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + + let result = DetourAttach( + &raw mut ORIGINAL_GET_FILE_ATTRIBUTES_W, + get_file_attributes_w as _, + ); + + if result != 0 { + error_hooking_msg!("Failed to hook GetFileAttributesW. Please report this issue."); + DetourTransactionAbort(); + return 1; + } + + let result = DetourAttach(&raw mut ORIGINAL_CREATE_FILE_W, create_file_w as _); + + if result != 0 { + error_hooking_msg!("Failed to hook CreateFileW. Please report this issue."); + DetourTransactionAbort(); + return 1; + } + + let result = DetourAttach(&raw mut ORIGINAL_CREATE_PROCESS_W, create_process_w as _); + + if result != 0 { + error_hooking_msg!("Failed to hook CreateProcessW. Please report this issue on GitHub."); + DetourTransactionAbort(); + return 1; + } + + DetourTransactionCommit(); + + 1 +} + +unsafe extern "C" fn get_file_attributes_w(lp_file_name: LPCWSTR) -> DWORD { + let file_name = U16CString::from_ptr_str(lp_file_name).to_string().unwrap(); + + let get_file_attributes_w: extern "C" fn(LPCWSTR) -> DWORD = + std::mem::transmute(ORIGINAL_GET_FILE_ATTRIBUTES_W); + + if file_name.contains("resources\\_app.asar") { + let redirect_to = file_name.replace("\\_app.asar", "\\app.asar"); + let redirect_to_c = std::ffi::CString::new(redirect_to.as_str()).unwrap(); + let redirect_to = U16CString::from_str(redirect_to_c.to_str().unwrap()).unwrap(); + + return get_file_attributes_w(redirect_to.as_ptr()); + } + + if file_name.contains("resources\\app.asar") { + let asar_path_cstr = std::ffi::CString::new(MODLOADER_ASAR_PATH.as_str()).unwrap(); + let asar_path = U16CString::from_str(asar_path_cstr.to_str().unwrap()).unwrap(); + + return get_file_attributes_w(asar_path.as_ptr()); + } + + get_file_attributes_w(lp_file_name) +} + +unsafe extern "C" fn create_file_w( + lp_file_name: LPCWSTR, + dw_desired_access: DWORD, + dw_share_mode: DWORD, + lp_security_attributes: LPSECURITY_ATTRIBUTES, + dw_creation_disposition: DWORD, + dw_flags_and_attributes: DWORD, + h_template_file: HANDLE, +) -> HANDLE { + let file_name = U16CString::from_ptr_str(lp_file_name).to_string().unwrap(); + + let create_file_w: extern "C" fn( + lp_file_name: LPCWSTR, + dw_desired_access: DWORD, + dw_share_mode: DWORD, + lp_security_attributes: LPSECURITY_ATTRIBUTES, + dw_creation_disposition: DWORD, + dw_flags_and_attributes: DWORD, + h_template_file: HANDLE, + ) -> HANDLE = std::mem::transmute(ORIGINAL_CREATE_FILE_W); + + if file_name.contains("resources\\_app.asar") { + let redirect_to = file_name.replace("\\_app.asar", "\\app.asar"); + let redirect_to_c = std::ffi::CString::new(redirect_to.as_str()).unwrap(); + let redirect_to = U16CString::from_str(redirect_to_c.to_str().unwrap()).unwrap(); + + return create_file_w( + redirect_to.as_ptr(), + dw_desired_access, + dw_share_mode, + lp_security_attributes, + dw_creation_disposition, + dw_flags_and_attributes, + h_template_file, + ); + } + + if file_name.contains("resources\\app.asar") { + let asar_path_cstr = std::ffi::CString::new(MODLOADER_ASAR_PATH.as_str()).unwrap(); + let asar_path = U16CString::from_str(asar_path_cstr.to_str().unwrap()).unwrap(); + + return create_file_w( + asar_path.as_ptr(), + dw_desired_access, + dw_share_mode, + lp_security_attributes, + dw_creation_disposition, + dw_flags_and_attributes, + h_template_file, + ); + } + + create_file_w( + lp_file_name, + dw_desired_access, + dw_share_mode, + lp_security_attributes, + dw_creation_disposition, + dw_flags_and_attributes, + h_template_file, + ) +} + +type FnCreateProcessW = unsafe extern "C" fn( + lp_application_name: LPCWSTR, + lp_command_line: LPWSTR, + lp_process_attributes: LPSECURITY_ATTRIBUTES, + lp_thread_attributes: LPSECURITY_ATTRIBUTES, + b_inherit_handles: BOOL, + dw_creation_flags: DWORD, + lp_environment: LPVOID, + lp_current_directory: LPCWSTR, + lp_startup_info: LPSTARTUPINFOW, + lp_process_information: LPPROCESS_INFORMATION, +) -> BOOL; + +unsafe extern "C" fn create_process_w( + lp_application_name: LPCWSTR, + lp_command_line: LPWSTR, + lp_process_attributes: LPSECURITY_ATTRIBUTES, + lp_thread_attributes: LPSECURITY_ATTRIBUTES, + b_inherit_handles: BOOL, + dw_creation_flags: DWORD, + lp_environment: LPVOID, + lp_current_directory: LPCWSTR, + lp_startup_info: LPSTARTUPINFOW, + lp_process_information: LPPROCESS_INFORMATION, +) -> BOOL { + let create_process_w: FnCreateProcessW = std::mem::transmute(ORIGINAL_CREATE_PROCESS_W); + + let command_line = U16CString::from_ptr_str(lp_command_line) + .to_string() + .unwrap(); + + if !command_line.contains("--type=renderer") { + return create_process_w( + lp_application_name, + lp_command_line, + lp_process_attributes, + lp_thread_attributes, + b_inherit_handles, + dw_creation_flags, + lp_environment, + lp_current_directory, + lp_startup_info, + lp_process_information, + ); + } + + let dll_path = CString::from_str(&MODLOADER_DLL_PATH).unwrap(); + + #[allow( + clippy::missing_transmute_annotations, + reason = "Excessive boilerplate" + )] + let success = DetourCreateProcessWithDllW( + lp_application_name, + lp_command_line, + lp_process_attributes as _, + lp_thread_attributes as _, + b_inherit_handles, + dw_creation_flags, + lp_environment as _, + lp_current_directory, + lp_startup_info as _, + lp_process_information as _, + dll_path.as_ptr(), + Some(std::mem::transmute(ORIGINAL_CREATE_PROCESS_W)), + ); + + if success != 1 { + eprintln!("[ModHook] Failed to create process"); + return success; + } + + ResumeThread((*lp_process_information).hThread as _); + + success +} From 020056360343423eae529ec49dd54c4da8547d63 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 00:48:08 +0000 Subject: [PATCH 04/20] chore: cleanup --- Cargo.lock | 2171 ++++++++++++++++++++++++++++++++++++++---------- src/discord.rs | 2 +- src/main.rs | 54 +- src/windows.rs | 2 - 4 files changed, 1745 insertions(+), 484 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 51b657b..762d4a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -215,9 +215,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -230,9 +230,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" @@ -249,7 +249,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -259,9 +259,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] +[[package]] +name = "anymap" +version = "1.0.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1f8f5a6f3d50d89e3797d7593a50f96bb2aaa20ca0cc7be1fb673232c91d72" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + [[package]] name = "asar" version = "0.3.0" @@ -526,6 +550,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" @@ -541,6 +571,35 @@ dependencies = [ "serde", ] +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.89", + "which", +] + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + [[package]] name = "bitflags" version = "1.3.2" @@ -552,6 +611,15 @@ name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "block-buffer" @@ -562,6 +630,58 @@ dependencies = [ "generic-array 0.14.7", ] +[[package]] +name = "block-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7" +dependencies = [ + "objc-sys", +] + +[[package]] +name = "block2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68" +dependencies = [ + "block-sys", + "objc2 0.4.1", +] + +[[package]] +name = "block2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e58aa60e59d8dbfcc36138f5f18be5f24394d33b38b24f7fd0b1caa33095f22f" +dependencies = [ + "block-sys", + "objc2 0.5.2", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite 2.5.0", + "piper", +] + +[[package]] +name = "bstr" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a68f1f47cdf0ec8ee4b941b2eee2a80cb796db73118c0dd09ac63fbe405be22" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -710,14 +830,25 @@ dependencies = [ "iana-time-zone", "num-traits", "serde", - "windows-targets 0.48.5", + "windows-targets 0.52.6", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", ] [[package]] name = "clap" -version = "4.5.20" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" dependencies = [ "clap_builder", "clap_derive", @@ -725,14 +856,14 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim 0.11.1", + "strsim", ] [[package]] @@ -744,14 +875,24 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.89", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" + +[[package]] +name = "clipboard-win" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "9fdf5e01086b6be750428ba4a40619f847eb2e95756eee84b18e06e5f0b50342" +dependencies = [ + "lazy-bytes-cast", + "winapi", +] [[package]] name = "color-eyre" @@ -837,12 +978,6 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "013b6c2c3a14d678f38cd23994b02da3a1a1b6a5d1eedddfe63a5a5f11b13a81" -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "013b6c2c3a14d678f38cd23994b02da3a1a1b6a5d1eedddfe63a5a5f11b13a81" - [[package]] name = "constcat" version = "0.3.1" @@ -990,16 +1125,6 @@ dependencies = [ "quote", ] -[[package]] -name = "darling" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68523903c8ae5aacfa32a0d9ae60cadeb764e1da14ee0d26b1f3089f13a54636" -dependencies = [ - "proc-macro2", - "quote", -] - [[package]] name = "cursor-icon" version = "1.1.0" @@ -1026,8 +1151,8 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.79", + "strsim", + "syn 2.0.89", ] [[package]] @@ -1038,7 +1163,20 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.79", + "syn 2.0.89", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", ] [[package]] @@ -1082,69 +1220,8 @@ dependencies = [ ] [[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "discord_modloader" -version = "2.0.0-beta1" -dependencies = [ - "asar", - "clap", - "detours-sys", - "dirs", - "dll-syringe", - "libc", - "retour", - "serde", - "toml", - "widestring", - "winapi", -] - -[[package]] -name = "dll-syringe" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdc807201d54de75e9bd7ad199d0031048625059f84acfc94506bdb13c0b4f59" -dependencies = [ - "bincode", - "cstr", - "goblin", - "iced-x86", - "konst", - "num_enum", - "path-absolutize", - "same-file", - "serde", - "shrinkwraprs", - "stopwatch2", - "sysinfo", - "thiserror", - "widestring", - "winapi", -] - -[[package]] -name = "either" -version = "1.9.0" +name = "dioxus" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e7fe217b50d43b27528b0f24c89b411f742a3e7564d1cfbf85253f967954db" dependencies = [ @@ -1662,12 +1739,6 @@ dependencies = [ "zune-inflate", ] -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - [[package]] name = "eyre" version = "0.6.12" @@ -2145,19 +2216,8 @@ dependencies = [ ] [[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.0" +name = "generic-array" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2cb8bc4c28d15ade99c7e90b219f30da4be5c88e586277e8cbe886beeb868ab2" dependencies = [ @@ -2357,17 +2417,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "goblin" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6b4de4a8eb6c46a8c77e1d3be942cb9a8bf073c22374578e5ba4b08ed0ff68" -dependencies = [ - "log", - "plain", - "scroll", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -2393,17 +2442,11 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" -[[package]] -name = "hashbrown" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" - [[package]] name = "heck" -version = "0.5.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "heck" @@ -2542,36 +2585,219 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "indenter" -version = "0.3.3" +name = "icrate" +version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319" +dependencies = [ + "block2 0.3.0", + "dispatch", + "objc2 0.4.1", +] [[package]] -name = "indexmap" -version = "1.9.3" +name = "icrate" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +checksum = "3fb69199826926eb864697bddd27f73d9fddcffc004f5733131e15b465e30642" dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", + "block2 0.4.0", + "objc2 0.5.2", ] [[package]] -name = "indexmap" -version = "2.6.0" +name = "icu_collections" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ - "equivalent", - "hashbrown 0.15.0", + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "ignore" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "jpeg-decoder", + "num-traits", + "png", + "qoi", + "tiff", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", "serde", ] @@ -2720,6 +2946,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.14" @@ -2727,37 +2962,57 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] -name = "js-sys" -version = "0.3.72" +name = "jni" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ - "wasm-bindgen", + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", ] [[package]] -name = "konst" -version = "0.3.14" +name = "jni-sys" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65f00fb3910881e52bf0850ae2a82aea411488a557e1c02820ceaa60963dce3" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ - "const_panic", - "konst_kernel", - "typewit", + "libc", ] [[package]] -name = "konst_kernel" -version = "0.3.12" +name = "jpeg-decoder" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "599c1232f55c72c7fc378335a3efe1c878c92720838c8e6a4fd87784ef7764de" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" dependencies = [ - "typewit", + "rayon", ] [[package]] -name = "lazy_static" -version = "1.4.0" +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ @@ -2855,6 +3110,16 @@ version = "0.2.166" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + [[package]] name = "libredox" version = "0.1.3" @@ -2863,6 +3128,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", + "redox_syscall 0.5.7", ] [[package]] @@ -2875,6 +3141,34 @@ dependencies = [ "libc", ] +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.22" @@ -2905,15 +3199,6 @@ dependencies = [ "libc", ] -[[package]] -name = "mach2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" -dependencies = [ - "libc", -] - [[package]] name = "memchr" version = "2.7.4" @@ -2986,6 +3271,40 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "wasi", + "windows-sys 0.52.0", +] + [[package]] name = "mmap-fixed-fixed" version = "0.1.3" @@ -3079,23 +3398,26 @@ dependencies = [ ] [[package]] -name = "ntapi" -version = "0.4.1" +name = "notify" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +checksum = "729f63e1ca555a43fe3efa4f3efdf4801c479da85b432242a7b726f353c88486" dependencies = [ - "winapi", + "bitflags 1.3.2", + "crossbeam-channel", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "mio 0.8.11", + "walkdir", + "windows-sys 0.45.0", ] [[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-traits" -version = "0.2.17" +name = "ntapi" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" dependencies = [ @@ -3133,36 +3455,16 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "object" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" -dependencies = [ - "num_enum_derive 0.6.1", -] - -[[package]] -name = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive 0.7.3", + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive 0.7.3", ] [[package]] @@ -3374,12 +3676,6 @@ dependencies = [ "ttf-parser", ] -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - [[package]] name = "owo-colors" version = "3.5.0" @@ -3387,26 +3683,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" [[package]] -name = "path-absolutize" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4af381fe79fa195b4909485d99f73a80792331df0625188e707854f0b3383f5" -dependencies = [ - "path-dedot", -] - -[[package]] -name = "path-dedot" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ba0ad7e047712414213ff67533e6dd477af0a4e1d14fb52343e53d30ea9397" -dependencies = [ - "once_cell", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.13" +name = "parking" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" @@ -3558,12 +3836,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" - [[package]] name = "pori" version = "0.0.0" @@ -3579,38 +3851,83 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +dependencies = [ + "proc-macro2", + "syn 2.0.89", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit 0.22.22", +] + [[package]] name = "proc-macro2" -version = "1.0.87" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] -name = "quote" -version = "1.0.37" +name = "qoi" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" dependencies = [ - "proc-macro2", + "bytemuck", ] [[package]] -name = "redox_users" -version = "0.4.6" +name = "quick-xml" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" dependencies = [ - "getrandom", - "libredox", - "thiserror", + "memchr", ] [[package]] -name = "regex" -version = "1.10.2" +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ @@ -3713,9 +4030,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -3821,34 +4138,6 @@ dependencies = [ "str_indices", ] -[[package]] -name = "region" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b6ebd13bc009aef9cd476c1310d49ac354d36e240cf1bd753290f3dc7199a7" -dependencies = [ - "bitflags 1.3.2", - "libc", - "mach2", - "windows-sys 0.52.0", -] - -[[package]] -name = "retour" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9af44d40e2400b44d491bfaf8eae111b09f23ac4de6e92728e79d93e699c527" -dependencies = [ - "cfg-if", - "generic-array", - "libc", - "libudis86-sys", - "mmap-fixed-fixed", - "once_cell", - "region", - "slice-pool2", -] - [[package]] name = "rustc-demangle" version = "0.1.24" @@ -3953,6 +4242,27 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "scroll" version = "0.11.0" @@ -3970,27 +4280,82 @@ checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.89", +] + +[[package]] +name = "sctk-adwaita" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70b31447ca297092c5a9916fc3b955203157b37c19ca8edde4f52e9843e602c7" +dependencies = [ + "ab_glyph", + "log", + "memmap2 0.9.5", + "smithay-client-toolkit 0.18.1", + "tiny-skia", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", ] [[package]] name = "serde" -version = "1.0.210" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.89", ] [[package]] @@ -4037,15 +4402,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - [[package]] name = "serde_with" version = "3.11.0" @@ -4073,7 +4429,18 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.89", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", ] [[package]] @@ -4097,87 +4464,276 @@ dependencies = [ ] [[package]] -name = "shrinkwraprs" +name = "shipyard" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace89f5a47029be049c7f47d166cd2c7a30d74e127f4baa2d8885e5d3b486035" +dependencies = [ + "hashbrown 0.12.3", + "lock_api", + "rayon", + "shipyard_proc", +] + +[[package]] +name = "shipyard_proc" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e63e6744142336dfb606fe2b068afa2e1cca1ee6a5d8377277a92945d81fa331" +checksum = "3eb847f4b9582e468198b5cfb5731b65cc67fe5e535acc9cbf3c11703d15f08c" dependencies = [ - "bitflags 1.3.2", - "itertools 0.8.2", "proc-macro2", "quote", "syn 1.0.109", ] [[package]] -name = "slice-pool2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a3d689654af89bdfeba29a914ab6ac0236d382eb3b764f7454dde052f2821f8" - -[[package]] -name = "stopwatch2" -version = "2.0.0" +name = "shlex" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "911ece10388afa48417f99e01df038460b6249a3ee0255f6446a6881b702fbb4" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] -name = "strsim" -version = "0.11.1" +name = "shrinkwraprs" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "e63e6744142336dfb606fe2b068afa2e1cca1ee6a5d8377277a92945d81fa331" +dependencies = [ + "bitflags 1.3.2", + "itertools 0.8.2", + "proc-macro2", + "quote", + "syn 1.0.109", +] [[package]] -name = "subtle" -version = "2.6.1" +name = "signal-hook-registry" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] [[package]] -name = "strsim" -version = "0.11.1" +name = "simd-adler32" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] -name = "syn" -version = "1.0.109" +name = "skia-bindings" +version = "0.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "ace7c5359ccb009880e65958eaf1e2fa68ee19ada6931300c2f1942f84abf2c3" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "bindgen", + "cc", + "flate2", + "heck 0.4.1", + "lazy_static", + "regex", + "serde_json", + "tar", + "toml", ] [[package]] -name = "syn" -version = "2.0.79" +name = "skia-safe" +version = "0.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "f0a4a3df502b317456a34df181ac67a7a6443b0f2e4b883ac220dba1dcb3ce38" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "base64 0.22.1", + "bitflags 2.6.0", + "lazy_static", + "skia-bindings", + "ureq", ] [[package]] -name = "sysinfo" -version = "0.29.11" +name = "slab" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd727fc423c2060f6c92d9534cef765c65a6ed3f428a03d7def74a8c4348e666" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slice-pool2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a3d689654af89bdfeba29a914ab6ac0236d382eb3b764f7454dde052f2821f8" + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "serde", + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smithay-client-toolkit" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" +dependencies = [ + "bitflags 1.3.2", + "dlib", + "lazy_static", + "log", + "memmap2 0.5.10", + "nix 0.24.3", + "pkg-config", + "wayland-client 0.29.5", + "wayland-cursor 0.29.5", + "wayland-protocols 0.29.5", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a" +dependencies = [ + "bitflags 2.6.0", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2 0.9.5", + "rustix 0.38.41", + "thiserror", + "wayland-backend", + "wayland-client 0.31.7", + "wayland-csd-frame", + "wayland-cursor 0.31.7", + "wayland-protocols 0.31.2", + "wayland-protocols-wlr", + "wayland-scanner 0.31.5", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" +dependencies = [ + "smithay-client-toolkit 0.16.1", + "wayland-client 0.29.5", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ - "cfg-if", - "core-foundation-sys", "libc", - "ntapi", - "once_cell", "winapi", ] [[package]] -name = "thiserror" -version = "1.0.50" +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spinning" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d4f0e86297cad2658d92a707320d87bf4e6ae1050287f51d19b67ef3f153a7b" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stopwatch2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "911ece10388afa48417f99e01df038460b6249a3ee0255f6446a6881b702fbb4" + +[[package]] +name = "str_indices" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d08889ec5408683408db66ad89e0e1f93dff55c73a4ccc71c427d5b277ee47e6" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" dependencies = [ @@ -4279,7 +4835,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.89", ] [[package]] @@ -4292,6 +4848,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + [[package]] name = "time" version = "0.3.36" @@ -4324,42 +4891,8 @@ dependencies = [ ] [[package]] -name = "toml" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" -dependencies = [ - "indexmap 2.6.0", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tracing" -version = "0.1.40" +name = "tiny-skia" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" dependencies = [ @@ -4611,21 +5144,6 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e36a83ea2b3c704935a01b4642946aadd445cea40b10935e3f8bd8052b8193d6" -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51dbd25812f740f45e2a9769f84711982e000483b13b73a8a1852e092abac8c" -dependencies = [ - "typewit_proc_macros", -] - -[[package]] -name = "typewit_proc_macros" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36a83ea2b3c704935a01b4642946aadd445cea40b10935e3f8bd8052b8193d6" - [[package]] name = "uds_windows" version = "1.1.0" @@ -4757,14 +5275,8 @@ dependencies = [ ] [[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.88" +name = "want" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ @@ -4799,7 +5311,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.89", "wasm-bindgen-shared", ] @@ -4833,7 +5345,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.89", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4860,58 +5372,349 @@ dependencies = [ ] [[package]] -name = "widestring" -version = "1.1.0" +name = "wayland-backend" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +dependencies = [ + "cc", + "downcast-rs", + "rustix 0.38.41", + "scoped-tls", + "smallvec", + "wayland-sys 0.31.5", +] [[package]] -name = "winapi" -version = "0.3.9" +name = "wayland-client" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "bitflags 1.3.2", + "downcast-rs", + "libc", + "nix 0.24.3", + "scoped-tls", + "wayland-commons", + "wayland-scanner 0.29.5", + "wayland-sys 0.29.5", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "wayland-client" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" +dependencies = [ + "bitflags 2.6.0", + "rustix 0.38.41", + "wayland-backend", + "wayland-scanner 0.31.5", +] [[package]] -name = "winapi-util" -version = "0.1.9" +name = "wayland-commons" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" dependencies = [ - "windows-sys 0.59.0", + "nix 0.24.3", + "once_cell", + "smallvec", + "wayland-sys 0.29.5", ] [[package]] -name = "winapi-wsapoll" -version = "0.1.2" +name = "wayland-csd-frame" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eafc5f679c576995526e81635d0cf9695841736712b4e892f87abbe6fed3f28" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "winapi", + "bitflags 2.6.0", + "cursor-icon", + "wayland-backend", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wayland-cursor" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +dependencies = [ + "nix 0.24.3", + "wayland-client 0.29.5", + "xcursor", +] [[package]] -name = "windows" -version = "0.54.0" +name = "wayland-cursor" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +checksum = "32b08bc3aafdb0035e7fe0fdf17ba0c09c268732707dca4ae098f60cb28c9e4c" dependencies = [ - "windows-targets 0.48.5", + "rustix 0.38.41", + "wayland-client 0.31.7", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +dependencies = [ + "bitflags 1.3.2", + "wayland-client 0.29.5", + "wayland-commons", + "wayland-scanner 0.29.5", +] + +[[package]] +name = "wayland-protocols" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client 0.31.7", + "wayland-scanner 0.31.5", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client 0.31.7", + "wayland-protocols 0.31.2", + "wayland-scanner 0.31.5", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client 0.31.7", + "wayland-protocols 0.31.2", + "wayland-scanner 0.31.5", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +dependencies = [ + "dlib", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "wayland-sys" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.41", +] + +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-wsapoll" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1eafc5f679c576995526e81635d0cf9695841736712b4e892f87abbe6fed3f28" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", + "windows-implement", + "windows-interface", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942ac266be9249c84ca862f0a164a39533dc2f6f33dc98ec89c8da99b82ea0bd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "windows-interface" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da33557140a288fae4e1d5f8873aaf9eb6613a9cf82c3e070223ff177f598b60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", ] [[package]] @@ -4932,6 +5735,30 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -4963,22 +5790,6 @@ dependencies = [ "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -4997,6 +5808,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -5009,6 +5826,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -5027,6 +5850,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -5039,6 +5868,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -5051,6 +5886,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -5063,6 +5904,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -5075,6 +5922,64 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winit" +version = "0.29.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca" +dependencies = [ + "ahash 0.8.11", + "android-activity", + "atomic-waker", + "bitflags 2.6.0", + "bytemuck", + "calloop", + "cfg_aliases", + "core-foundation", + "core-graphics", + "cursor-icon", + "icrate 0.0.4", + "js-sys", + "libc", + "log", + "memmap2 0.9.5", + "ndk", + "ndk-sys", + "objc2 0.4.1", + "once_cell", + "orbclient", + "percent-encoding", + "raw-window-handle 0.5.2", + "raw-window-handle 0.6.2", + "redox_syscall 0.3.5", + "rustix 0.38.41", + "sctk-adwaita", + "smithay-client-toolkit 0.18.1", + "smol_str", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client 0.31.7", + "wayland-protocols 0.31.2", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.48.0", + "x11-dl", + "x11rb 0.13.1", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winnow" version = "0.6.20" @@ -5083,3 +5988,347 @@ checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "x11-clipboard" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "980b9aa9226c3b7de8e2adb11bf20124327c054e0e5812d2aac0b5b5a87e7464" +dependencies = [ + "x11rb 0.10.1", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" +dependencies = [ + "gethostname 0.2.3", + "nix 0.24.3", + "winapi", + "winapi-wsapoll", + "x11rb-protocol 0.10.0", +] + +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "as-raw-xcb-connection", + "gethostname 0.4.3", + "libc", + "libloading", + "once_cell", + "rustix 0.38.41", + "x11rb-protocol 0.13.1", +] + +[[package]] +name = "x11rb-protocol" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67" +dependencies = [ + "nix 0.24.3", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xattr" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +dependencies = [ + "libc", + "linux-raw-sys 0.4.14", + "rustix 0.38.41", +] + +[[package]] +name = "xcursor" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.6.0", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af310deaae937e48a26602b730250b4949e125f468f11e6990be3e5304ddd96f" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", + "synstructure", +] + +[[package]] +name = "zbus" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io 1.13.0", + "async-lock 2.8.0", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "byteorder", + "derivative", + "enumflags2", + "event-listener 2.5.3", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.26.4", + "once_cell", + "ordered-stream", + "rand", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "winapi", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zvariant" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" +dependencies = [ + "byteorder", + "enumflags2", + "libc", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] diff --git a/src/discord.rs b/src/discord.rs index 786f5c4..4011aaf 100644 --- a/src/discord.rs +++ b/src/discord.rs @@ -3,7 +3,7 @@ use std::{error::Error, path::PathBuf}; /// Returns the path to the Discord executable based on the Discord folder. /// /// e.g. "C:\Users\Megu\AppData\Local\discordptb" -> "C:\Users\Megu\AppData\Local\discordptb\app-1.0.9023\Discord.exe" -pub fn get_discord_executable(path: &str) -> Result> { +pub fn get_discord_exe(path: &str) -> Result> { let mut new_path = PathBuf::from(path); let new_path_executable = new_path.clone(); diff --git a/src/main.rs b/src/main.rs index 6c9fc8c..6663f53 100644 --- a/src/main.rs +++ b/src/main.rs @@ -57,9 +57,12 @@ fn load_profile(config: &config::Config, instance: &config::Instance) { #[cfg(target_os = "windows")] unsafe fn load_profile(config: &config::Config, instance: &config::Instance) { use detours_sys::{DetourCreateProcessWithDllExA, _PROCESS_INFORMATION, _STARTUPINFOA}; - use libdiscordmodloader::discord::get_discord_executable; + use libdiscordmodloader::discord::get_discord_exe; use winapi::um::{ - handleapi::CloseHandle, processthreadsapi::ResumeThread, winbase::CREATE_SUSPENDED, + handleapi::CloseHandle, + processthreadsapi::ResumeThread, + winbase::CREATE_SUSPENDED, + winuser::{MessageBoxA, MB_ICONERROR}, }; println!("Loading Instance: {}", instance.name); @@ -69,25 +72,31 @@ unsafe fn load_profile(config: &config::Config, instance: &config::Instance) { let asar_path = get_or_write_cache(instance, config.mods.get(&instance.r#mod).unwrap()); - let mut process_info: _PROCESS_INFORMATION = unsafe { std::mem::zeroed() }; - let mut startup_info: _STARTUPINFOA = unsafe { std::mem::zeroed() }; - - let discord_exe = - get_discord_executable(&instance.path).expect("Failed to get Discord executable."); - let discord_exe = std::ffi::CString::new(discord_exe.to_str().unwrap()).unwrap(); - let lp_current_directory = - std::ffi::CString::new("W:\\Discord\\ModHook\\target\\debug").unwrap(); - let dll = std::ffi::CString::new("libdiscordmodloader.dll").unwrap(); + let current_exe = std::env::current_exe().unwrap(); + let lp_current_directory = current_exe.parent().unwrap().to_str().unwrap(); + let dll = current_exe.with_file_name("libdiscordmodloader.dll"); + + if !dll.exists() { + MessageBoxA( + std::ptr::null_mut(), + c"libdiscordmodloader.dll not found.\nPlease verify your installation.".as_ptr(), + c"Error loading modloader".as_ptr(), + MB_ICONERROR, + ); + panic!("libdiscordmodloader.dll not found."); + } - dbg!(&discord_exe); - dbg!(&lp_current_directory); - dbg!(&dll); + let discord_exe = get_discord_exe(&instance.path).expect("Failed to get Discord executable."); std::env::set_var("MODLOADER_ASAR_PATH", asar_path); - std::env::set_var( - "MODLOADER_DLL_PATH", - "W:\\Discord\\ModHook\\target\\debug\\libdiscordmodloader.dll", - ); + std::env::set_var("MODLOADER_DLL_PATH", &dll); + + let dll = std::ffi::CString::new(dll.to_str().unwrap()).unwrap(); + let lp_current_directory = std::ffi::CString::new(lp_current_directory).unwrap(); + + let mut process_info: _PROCESS_INFORMATION = unsafe { std::mem::zeroed() }; + let mut startup_info: _STARTUPINFOA = unsafe { std::mem::zeroed() }; + let discord_exe = std::ffi::CString::new(discord_exe.to_str().unwrap()).unwrap(); let result = DetourCreateProcessWithDllExA( std::ptr::null_mut(), @@ -97,7 +106,7 @@ unsafe fn load_profile(config: &config::Config, instance: &config::Instance) { 0, CREATE_SUSPENDED, std::ptr::null_mut(), - std::ptr::null_mut(), + lp_current_directory.as_ptr(), &raw mut startup_info, &raw mut process_info, dll.as_ptr(), @@ -105,7 +114,12 @@ unsafe fn load_profile(config: &config::Config, instance: &config::Instance) { ); if result == 0 { - let err = std::io::Error::last_os_error(); + MessageBoxA( + std::ptr::null_mut(), + c"Failed to inject DLL into Discord".as_ptr(), + c"Error launching Discord".as_ptr(), + MB_ICONERROR, + ); panic!("Failed to create process with DLL."); } diff --git a/src/windows.rs b/src/windows.rs index 2f4310c..ca1a5d3 100644 --- a/src/windows.rs +++ b/src/windows.rs @@ -23,8 +23,6 @@ use winapi::{ }, }; -use winapi::um::consoleapi::AllocConsole; - static MODLOADER_ASAR_PATH: LazyLock = LazyLock::new(|| std::env::var("MODLOADER_ASAR_PATH").unwrap()); From a2df752ad9fc30e93142b4597b883d9e96a4ad8d Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 02:03:46 +0000 Subject: [PATCH 05/20] installer wip --- .cargo/config.toml | 3 + .github/workflows/build.yml | 28 + .gitignore | 4 +- Cargo.lock | 1865 +++++++++-------- Cargo.toml | 25 +- LICENSE | 165 ++ .../templates => templates}/moonlight.toml | 0 {configs/templates => templates}/vencord.toml | 0 8 files changed, 1228 insertions(+), 862 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 LICENSE rename {configs/templates => templates}/moonlight.toml (100%) rename {configs/templates => templates}/vencord.toml (100%) diff --git a/.cargo/config.toml b/.cargo/config.toml index 7af97f1..156ae02 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,2 +1,5 @@ [target.x86_64-unknown-linux-gnu] rustflags = ["-C", "link-arg=-fuse-ld=mold"] + +[alias] +release = "packager --release -f all" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..91b6dc1 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,28 @@ +name: Package examples + +on: + pull_request: + branches: + - main + paths: + - ".github/workflows/build.yml" + - "./**" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + package: + if: ${{ !startsWith(github.head_ref, 'renovate/') }} + strategy: + fail-fast: false + matrix: + platform: [ubuntu-latest, macos-latest, windows-latest] + + runs-on: ${{ matrix.platform }} + + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - run: cargo release diff --git a/.gitignore b/.gitignore index 56b8fa4..2d2b3f8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ /target -/configs/* -!/configs/templates \ No newline at end of file +/configs +/dist diff --git a/Cargo.lock b/Cargo.lock index 762d4a9..aaef579 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,9 +20,9 @@ checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" [[package]] name = "accesskit" -version = "0.12.3" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74a4b14f3d99c1255dcba8f45621ab1a2e7540a0009652d33989005a4d0bfc6b" +checksum = "99b76d84ee70e30a4a7e39ab9018e2b17a6a09e31084176cc7c0b2dec036ba45" dependencies = [ "enumn", "serde", @@ -30,9 +30,9 @@ dependencies = [ [[package]] name = "accesskit_atspi_common" -version = "0.2.0" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9357ba093d0c8c234840f126efa71d09b848027b2963f553940021fb07bbf076" +checksum = "f5393c75d4666f580f4cac0a968bc97c36076bb536a129f28210dac54ee127ed" dependencies = [ "accesskit", "accesskit_consumer", @@ -44,31 +44,33 @@ dependencies = [ [[package]] name = "accesskit_consumer" -version = "0.17.1" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6114c157d5b02e24b38e929afe99324f2f9cc116ce7d49fdbf3fea111369c14" +checksum = "7a12dc159d52233c43d9fe5415969433cbdd52c3d6e0df51bda7d447427b9986" dependencies = [ "accesskit", + "immutable-chunkmap", ] [[package]] name = "accesskit_macos" -version = "0.11.1" +version = "0.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded5f12ee8af8d8dae8de4ef96bc6abdd94735973ba97bbd426da41005252553" +checksum = "bfc6c1ecd82053d127961ad80a8beaa6004fb851a3a5b96506d7a6bd462403f6" dependencies = [ "accesskit", "accesskit_consumer", - "icrate 0.1.2", - "objc2 0.5.2", + "objc2", + "objc2-app-kit", + "objc2-foundation", "once_cell", ] [[package]] name = "accesskit_unix" -version = "0.7.5" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "454040abdc130ca45d9142cc6ea0b196fb53119f62600d88665ae6090d597f3e" +checksum = "be7f5cf6165be10a54b2655fa2e0e12b2509f38ed6fc43e11c31fdb7ee6230bb" dependencies = [ "accesskit", "accesskit_atspi_common", @@ -76,38 +78,37 @@ dependencies = [ "async-executor", "async-task", "atspi", - "futures-lite 1.13.0", + "futures-lite", "futures-util", - "once_cell", "serde", "zbus", ] [[package]] name = "accesskit_windows" -version = "0.16.4" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b698c3561514806519d28c63b6a2b1f5797f5ae3042a9caa4d64b7b928ff69" +checksum = "974e96c347384d9133427167fb8a58c340cb0496988dacceebdc1ed27071023b" dependencies = [ "accesskit", "accesskit_consumer", - "once_cell", "paste", "static_assertions", "windows", + "windows-core 0.58.0", ] [[package]] name = "accesskit_winit" -version = "0.18.7" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d80d7aa92a9334120580e9fe2028670f48f2b1a30cdf8bfd3d038c2f430345" +checksum = "aea3522719f1c44564d03e9469a8e2f3a98b3a8a880bd66d0789c6b9c4a669dd" dependencies = [ "accesskit", "accesskit_macos", "accesskit_unix", "accesskit_windows", - "raw-window-handle 0.6.2", + "raw-window-handle", "winit", ] @@ -165,6 +166,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "allocator-api2" version = "0.2.20" @@ -173,9 +180,9 @@ checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" [[package]] name = "android-activity" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", "bitflags 2.6.0", @@ -263,10 +270,27 @@ dependencies = [ ] [[package]] -name = "anymap" -version = "1.0.0-beta.2" +name = "anyhow" +version = "1.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" + +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1f8f5a6f3d50d89e3797d7593a50f96bb2aaa20ca0cc7be1fb673232c91d72" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] [[package]] name = "arrayref" @@ -308,12 +332,14 @@ dependencies = [ [[package]] name = "async-broadcast" -version = "0.5.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" dependencies = [ - "event-listener 2.5.3", + "event-listener", + "event-listener-strategy", "futures-core", + "pin-project-lite", ] [[package]] @@ -336,41 +362,20 @@ checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", - "fastrand 2.2.0", - "futures-lite 2.5.0", + "fastrand", + "futures-lite", "slab", ] [[package]] name = "async-fs" -version = "1.6.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ - "async-lock 2.8.0", - "autocfg", + "async-lock", "blocking", - "futures-lite 1.13.0", -] - -[[package]] -name = "async-io" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" -dependencies = [ - "async-lock 2.8.0", - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-lite 1.13.0", - "log", - "parking", - "polling 2.8.0", - "rustix 0.37.27", - "slab", - "socket2 0.4.10", - "waker-fn", + "futures-lite", ] [[package]] @@ -379,54 +384,47 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ - "async-lock 3.4.0", + "async-lock", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.5.0", + "futures-lite", "parking", - "polling 3.7.4", - "rustix 0.38.41", + "polling", + "rustix", "slab", "tracing", "windows-sys 0.59.0", ] -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener 2.5.3", -] - [[package]] name = "async-lock" version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 5.3.1", + "event-listener", "event-listener-strategy", "pin-project-lite", ] [[package]] name = "async-process" -version = "1.8.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ - "async-io 1.13.0", - "async-lock 2.8.0", + "async-channel", + "async-io", + "async-lock", "async-signal", + "async-task", "blocking", "cfg-if", - "event-listener 3.1.0", - "futures-lite 1.13.0", - "rustix 0.38.41", - "windows-sys 0.48.0", + "event-listener", + "futures-lite", + "rustix", + "tracing", ] [[package]] @@ -446,13 +444,13 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" dependencies = [ - "async-io 2.4.0", - "async-lock 3.4.0", + "async-io", + "async-lock", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.41", + "rustix", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -483,9 +481,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "atspi" -version = "0.19.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6059f350ab6f593ea00727b334265c4dfc7fd442ee32d264794bd9bdc68e87ca" +checksum = "be534b16650e35237bb1ed189ba2aab86ce65e88cc84c66f4935ba38575cecbf" dependencies = [ "atspi-common", "atspi-connection", @@ -494,39 +492,42 @@ dependencies = [ [[package]] name = "atspi-common" -version = "0.3.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92af95f966d2431f962bc632c2e68eda7777330158bf640c4af4249349b2cdf5" +checksum = "1909ed2dc01d0a17505d89311d192518507e8a056a48148e3598fef5e7bb6ba7" dependencies = [ "enumflags2", "serde", "static_assertions", "zbus", + "zbus-lockstep", + "zbus-lockstep-macros", "zbus_names", "zvariant", ] [[package]] name = "atspi-connection" -version = "0.3.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c65e7d70f86d4c0e3b2d585d9bf3f979f0b19d635a336725a88d279f76b939" +checksum = "430c5960624a4baaa511c9c0fcc2218e3b58f5dbcc47e6190cafee344b873333" dependencies = [ "atspi-common", "atspi-proxies", - "futures-lite 1.13.0", + "futures-lite", "zbus", ] [[package]] name = "atspi-proxies" -version = "0.3.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6495661273703e7a229356dcbe8c8f38223d697aacfaf0e13590a9ac9977bb52" +checksum = "a5e6c5de3e524cf967569722446bcd458d5032348554d9a17d7d72b041ab7496" dependencies = [ "atspi-common", "serde", "zbus", + "zvariant", ] [[package]] @@ -535,6 +536,29 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" +dependencies = [ + "arrayvec", +] + [[package]] name = "backtrace" version = "0.3.71" @@ -550,12 +574,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -573,25 +591,22 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.69.5" +version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ "bitflags 2.6.0", "cexpr", "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 1.1.0", "shlex", "syn 2.0.89", - "which", ] [[package]] @@ -615,6 +630,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + [[package]] name = "block" version = "0.1.6" @@ -630,33 +651,13 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "block-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7" -dependencies = [ - "objc-sys", -] - -[[package]] -name = "block2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68" -dependencies = [ - "block-sys", - "objc2 0.4.1", -] - [[package]] name = "block2" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e58aa60e59d8dbfcc36138f5f18be5f24394d33b38b24f7fd0b1caa33095f22f" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "block-sys", - "objc2 0.5.2", + "objc2", ] [[package]] @@ -668,7 +669,7 @@ dependencies = [ "async-channel", "async-task", "futures-io", - "futures-lite 2.5.0", + "futures-lite", "piper", ] @@ -682,6 +683,12 @@ dependencies = [ "serde", ] +[[package]] +name = "built" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" + [[package]] name = "bumpalo" version = "3.16.0" @@ -700,6 +707,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.9.0" @@ -708,28 +721,28 @@ checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "calloop" -version = "0.12.4" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ "bitflags 2.6.0", "log", - "polling 3.7.4", - "rustix 0.38.41", + "polling", + "rustix", "slab", "thiserror", ] [[package]] name = "calloop-wayland-source" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" dependencies = [ "calloop", - "rustix 0.38.41", + "rustix", "wayland-backend", - "wayland-client 0.31.7", + "wayland-client", ] [[package]] @@ -797,6 +810,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ "smallvec", + "target-lexicon", ] [[package]] @@ -807,9 +821,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cfg_aliases" -version = "0.1.1" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "cgl" @@ -872,7 +886,7 @@ version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "syn 2.0.89", @@ -995,9 +1009,9 @@ dependencies = [ [[package]] name = "copypasta" -version = "0.8.2" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "133fc8675ee3a4ec9aa513584deda9aa0faeda3586b87f7f0f2ba082c66fb172" +checksum = "deb85422867ca93da58b7f95fb5c0c10f6183ed6e1ef8841568968a896d3a858" dependencies = [ "clipboard-win", "objc", @@ -1166,19 +1180,6 @@ dependencies = [ "syn 2.0.89", ] -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - [[package]] name = "deranged" version = "0.3.11" @@ -1189,17 +1190,6 @@ dependencies = [ "serde", ] -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "detours-sys" version = "0.1.2" @@ -1246,6 +1236,16 @@ dependencies = [ "tracing", ] +[[package]] +name = "dioxus-clipboard" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3796f1d3dd56e6fdd6ea96221c0f639b4d688a17966d0d2f4dc883d9713813" +dependencies = [ + "copypasta", + "dioxus-lib", +] + [[package]] name = "dioxus-config-macro" version = "0.5.6" @@ -1266,7 +1266,7 @@ dependencies = [ "futures-util", "generational-box", "longest-increasing-subsequence", - "rustc-hash", + "rustc-hash 1.1.0", "serde", "slab", "slotmap", @@ -1421,20 +1421,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "dioxus-sdk" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28df53f8e819a1417224ca1c671947ed8fc9696e3080fd59d166c2162c7287bc" -dependencies = [ - "cfg-if", - "copypasta", - "dioxus", - "js-sys", - "tracing", - "uuid", -] - [[package]] name = "dioxus-signals" version = "0.5.7" @@ -1447,7 +1433,7 @@ dependencies = [ "generational-box", "once_cell", "parking_lot", - "rustc-hash", + "rustc-hash 1.1.0", "tracing", ] @@ -1473,8 +1459,8 @@ dependencies = [ ] [[package]] -name = "discord_modloader" -version = "2.0.0-beta1" +name = "discord-modloader" +version = "2.0.0" dependencies = [ "asar", "clap", @@ -1546,6 +1532,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" +[[package]] +name = "dpi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" + [[package]] name = "easer" version = "0.3.0" @@ -1570,6 +1562,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + [[package]] name = "enumflags2" version = "0.7.10" @@ -1649,23 +1647,6 @@ dependencies = [ "serde", ] -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - [[package]] name = "event-listener" version = "5.3.1" @@ -1683,7 +1664,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 5.3.1", + "event-listener", "pin-project-lite", ] @@ -1749,15 +1730,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - [[package]] name = "fastrand" version = "2.2.0" @@ -1861,8 +1833,7 @@ dependencies = [ [[package]] name = "freya" version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b481e775917e679c0e983fdcc9c78fc312bb2ddac7cdc19b93f1acd8315b55" +source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" dependencies = [ "dioxus", "dioxus-core", @@ -1878,7 +1849,6 @@ dependencies = [ "freya-hooks", "freya-node-state", "freya-renderer", - "freya-testing", "tokio", "torin", ] @@ -1886,15 +1856,14 @@ dependencies = [ [[package]] name = "freya-common" version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08e7edf9ab33b44d4c9422f96952a4774b59d26414b2eebfc9e844a89f7ba357" +source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" dependencies = [ "accesskit", - "accesskit_winit", "dioxus-core", "freya-engine", "freya-native-core", - "rustc-hash", + "itertools 0.13.0", + "rustc-hash 2.0.0", "torin", "uuid", "winit", @@ -1903,8 +1872,7 @@ dependencies = [ [[package]] name = "freya-components" version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78d7ee72ceece4ee6e06b23a4ba2ff0433b3b67ed5e922f00d3dcf6fb7719d08" +source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" dependencies = [ "bytes", "dioxus", @@ -1927,18 +1895,18 @@ dependencies = [ [[package]] name = "freya-core" version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f74828c6ef8b80d7cf5813ff2db67027c59356242407f4090800bdb542cc653e" +source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" dependencies = [ "accesskit", + "accesskit_winit", "dioxus-core", "freya-common", "freya-elements", "freya-engine", "freya-native-core", "freya-node-state", - "itertools 0.11.0", - "rustc-hash", + "itertools 0.13.0", + "rustc-hash 2.0.0", "smallvec", "tokio", "torin", @@ -1950,8 +1918,7 @@ dependencies = [ [[package]] name = "freya-elements" version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f96748f6df0168959ff69ec2b07b08a66f734a3830fa92ae1d5ef4e4747a537" +source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" dependencies = [ "dioxus-core", "dioxus-rsx", @@ -1963,8 +1930,7 @@ dependencies = [ [[package]] name = "freya-engine" version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5711fcd826a0150a790edc45212d5e3a51e25bbf54441ab16f31a12ac5c3edf3" +source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" dependencies = [ "bitflags 2.6.0", "glutin", @@ -1974,14 +1940,13 @@ dependencies = [ [[package]] name = "freya-hooks" version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83c0c53eb24cd185e62476a773dcb3247644512f31f2b992653057990a7e8e6" +source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" dependencies = [ "bitflags 2.6.0", "bytes", + "dioxus-clipboard", "dioxus-core", "dioxus-hooks", - "dioxus-sdk", "dioxus-signals", "easer", "freya-common", @@ -2000,14 +1965,11 @@ dependencies = [ [[package]] name = "freya-native-core" version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2d278accf67f29cfa44eb6ee307d403ea85444bb0404ccb79ca8b63885af7ed" +source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" dependencies = [ - "anymap", - "dashmap", "dioxus-core", "parking_lot", - "rustc-hash", + "rustc-hash 2.0.0", "shipyard", "smallvec", ] @@ -2015,8 +1977,7 @@ dependencies = [ [[package]] name = "freya-native-core-macro" version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca0db6ee77d75e6234c37c7898fe1ea8cf12d851c01772ad594f31c6f253c6" +source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" dependencies = [ "quote", "syn 2.0.89", @@ -2025,8 +1986,7 @@ dependencies = [ [[package]] name = "freya-node-state" version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd4821f6b6584be7e0f60c1c830c99e18805f83599eb70be3a450d94f2cf2dc" +source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" dependencies = [ "accesskit", "bytes", @@ -2035,19 +1995,20 @@ dependencies = [ "freya-engine", "freya-native-core", "freya-native-core-macro", - "rustc-hash", + "nom", + "rustc-hash 2.0.0", "serde_json", "shipyard", "tokio", "torin", + "tracing", "uuid", ] [[package]] name = "freya-renderer" version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a0354f9b5a11a3ed575a61a688ab3d303e7c0a73f2b7f4a9eb003eebbea841" +source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" dependencies = [ "accesskit", "accesskit_winit", @@ -2066,9 +2027,9 @@ dependencies = [ "glutin", "glutin-winit", "image", - "itertools 0.11.0", + "itertools 0.13.0", "pin-utils", - "raw-window-handle 0.5.2", + "raw-window-handle", "tokio", "torin", "tracing", @@ -2076,28 +2037,6 @@ dependencies = [ "winit", ] -[[package]] -name = "freya-testing" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6150fa59a63aed1b78edc930d3fdfd0c1fd742bf7848e475d616422cc84bb68" -dependencies = [ - "dioxus", - "dioxus-core", - "dioxus-core-macro", - "freya-common", - "freya-components", - "freya-core", - "freya-elements", - "freya-engine", - "freya-hooks", - "freya-native-core", - "freya-node-state", - "tokio", - "torin", - "winit", -] - [[package]] name = "fsevent-sys" version = "4.1.0" @@ -2128,28 +2067,13 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - [[package]] name = "futures-lite" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ - "fastrand 2.2.0", + "fastrand", "futures-core", "futures-io", "parking", @@ -2224,16 +2148,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "gethostname" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "gethostname" version = "0.4.3" @@ -2251,10 +2165,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] @@ -2314,9 +2226,9 @@ dependencies = [ [[package]] name = "glutin" -version = "0.31.3" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fcd4ae4e86d991ad1300b8f57166e5be0c95ef1f63f3f5b827f8a164548746" +checksum = "ec69412a0bf07ea7607e638b415447857a808846c2b685a43c8aa18bc6d5e499" dependencies = [ "bitflags 2.6.0", "cfg_aliases", @@ -2326,43 +2238,44 @@ dependencies = [ "glutin_egl_sys", "glutin_glx_sys", "glutin_wgl_sys", - "icrate 0.0.4", "libloading", - "objc2 0.4.1", + "objc2", + "objc2-app-kit", + "objc2-foundation", "once_cell", - "raw-window-handle 0.5.2", - "wayland-sys 0.31.5", - "windows-sys 0.48.0", + "raw-window-handle", + "wayland-sys", + "windows-sys 0.52.0", "x11-dl", ] [[package]] name = "glutin-winit" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebcdfba24f73b8412c5181e56f092b5eff16671c514ce896b258a0a64bd7735" +checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" dependencies = [ "cfg_aliases", "glutin", - "raw-window-handle 0.5.2", + "raw-window-handle", "winit", ] [[package]] name = "glutin_egl_sys" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77cc5623f5309ef433c3dd4ca1223195347fe62c413da8e2fdd0eb76db2d9bcd" +checksum = "cae99fff4d2850dbe6fb8c1fa8e4fead5525bab715beaacfccf3fb994e01c827" dependencies = [ "gl_generator", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "glutin_glx_sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a165fd686c10dcc2d45380b35796e577eacfd43d4660ee741ec8ebe2201b3b4f" +checksum = "9c2b2d3918e76e18e08796b55eb64e8fe6ec67d5a6b2e2a7e2edce224ad24c63" dependencies = [ "gl_generator", "x11-dl", @@ -2370,9 +2283,9 @@ dependencies = [ [[package]] name = "glutin_wgl_sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" +checksum = "0a4e1951bbd9434a81aa496fe59ccc2235af3820d27b85f9314e279609211e2c" dependencies = [ "gl_generator", ] @@ -2390,15 +2303,15 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http", "indexmap 2.6.0", "slab", @@ -2442,12 +2355,6 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -2473,33 +2380,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "home" -version = "0.5.9" +name = "http" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ - "windows-sys 0.52.0", + "bytes", + "fnv", + "itoa", ] [[package]] -name = "http" -version = "0.2.12" +name = "http-body" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "fnv", - "itoa", + "http", ] [[package]] -name = "http-body" -version = "0.4.6" +name = "http-body-util" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", + "futures-util", "http", + "http-body", "pin-project-lite", ] @@ -2509,47 +2419,76 @@ version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "hyper" -version = "0.14.31" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", "h2", "http", "http-body", "httparse", - "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.8", + "smallvec", "tokio", - "tower-service", - "tracing", "want", ] +[[package]] +name = "hyper-rustls" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + [[package]] name = "hyper-tls" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", + "http-body-util", "hyper", + "hyper-util", "native-tls", "tokio", "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", ] [[package]] @@ -2584,27 +2523,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "icrate" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319" -dependencies = [ - "block2 0.3.0", - "dispatch", - "objc2 0.4.1", -] - -[[package]] -name = "icrate" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb69199826926eb864697bddd27f73d9fddcffc004f5733131e15b465e30642" -dependencies = [ - "block2 0.4.0", - "objc2 0.5.2", -] - [[package]] name = "icu_collections" version = "1.5.0" @@ -2768,20 +2686,50 @@ dependencies = [ [[package]] name = "image" -version = "0.24.9" +version = "0.25.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", - "byteorder", + "byteorder-lite", "color_quant", "exr", "gif", - "jpeg-decoder", + "image-webp", "num-traits", "png", "qoi", + "ravif", + "rayon", + "rgb", "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + +[[package]] +name = "immutable-chunkmap" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f97096f508d54f8f8ab8957862eee2ccd628847b6217af1a335e1c44dee578" +dependencies = [ + "arrayvec", ] [[package]] @@ -2832,15 +2780,6 @@ dependencies = [ "libc", ] -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - [[package]] name = "internment" version = "0.7.5" @@ -2851,6 +2790,17 @@ dependencies = [ "parking_lot", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "interprocess-docfix" version = "1.2.2" @@ -2877,17 +2827,6 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae52f28f45ac2bc96edb7714de995cffc174a395fb0abf5bff453587c980d7b9" -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "ipnet" version = "2.10.1" @@ -2955,6 +2894,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.14" @@ -2997,9 +2945,6 @@ name = "jpeg-decoder" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" -dependencies = [ - "rayon", -] [[package]] name = "js-sys" @@ -3092,12 +3037,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "lebe" version = "0.5.2" @@ -3110,6 +3049,16 @@ version = "0.2.166" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" +[[package]] +name = "libfuzzer-sys" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b9569d2f74e257076d8c6bfa73fb505b46b851e51ddaecc825944aa3bed17fa" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "libloading" version = "0.8.5" @@ -3141,12 +3090,6 @@ dependencies = [ "libc", ] -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -3181,6 +3124,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "mach2" version = "0.4.2" @@ -3200,19 +3152,20 @@ dependencies = [ ] [[package]] -name = "memchr" -version = "2.7.4" +name = "maybe-rayon" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] [[package]] -name = "memmap2" -version = "0.5.10" +name = "memchr" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" -dependencies = [ - "libc", -] +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -3223,24 +3176,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.1" @@ -3334,17 +3269,16 @@ dependencies = [ [[package]] name = "ndk" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ "bitflags 2.6.0", "jni-sys", "log", "ndk-sys", "num_enum 0.7.3", - "raw-window-handle 0.5.2", - "raw-window-handle 0.6.2", + "raw-window-handle", "thiserror", ] @@ -3356,35 +3290,30 @@ checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-sys" -version = "0.5.0+25.2.9519653" +version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ "jni-sys", ] [[package]] -name = "nix" -version = "0.24.3" +name = "new_debug_unreachable" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.6.5", -] +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nix" -version = "0.26.4" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "cfg-if", + "cfg_aliases", "libc", - "memoffset 0.7.1", + "memoffset", ] [[package]] @@ -3397,6 +3326,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "notify" version = "5.2.0" @@ -3434,12 +3369,53 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -3484,7 +3460,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate", "proc-macro2", "quote", "syn 2.0.89", @@ -3518,29 +3494,89 @@ checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" [[package]] name = "objc2" -version = "0.4.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" dependencies = [ "objc-sys", - "objc2-encode 3.0.0", + "objc2-encode", ] [[package]] -name = "objc2" -version = "0.5.2" +name = "objc2-app-kit" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "objc-sys", - "objc2-encode 4.0.3", + "bitflags 2.6.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", ] [[package]] -name = "objc2-encode" -version = "3.0.0" +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2", + "objc2-contacts", + "objc2-foundation", +] [[package]] name = "objc2-encode" @@ -3548,6 +3584,111 @@ version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2", + "dispatch", + "libc", + "objc2", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.6.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 = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + [[package]] name = "objc_id" version = "0.1.1" @@ -3757,6 +3898,26 @@ dependencies = [ "indexmap 2.6.0", ] +[[package]] +name = "pin-project" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", +] + [[package]] name = "pin-project-lite" version = "0.2.15" @@ -3776,7 +3937,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.2.0", + "fastrand", "futures-io", ] @@ -3805,22 +3966,6 @@ dependencies = [ "miniz_oxide 0.8.0", ] -[[package]] -name = "polling" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] - [[package]] name = "polling" version = "3.7.4" @@ -3831,7 +3976,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.41", + "rustix", "tracing", "windows-sys 0.59.0", ] @@ -3870,23 +4015,13 @@ dependencies = [ "syn 2.0.89", ] -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - [[package]] name = "proc-macro-crate" version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.22.22", + "toml_edit", ] [[package]] @@ -3898,6 +4033,25 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn 2.0.89", +] + [[package]] name = "qoi" version = "0.4.1" @@ -3907,6 +4061,22 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "quick-xml" version = "0.36.2" @@ -3956,10 +4126,54 @@ dependencies = [ ] [[package]] -name = "raw-window-handle" -version = "0.5.2" +name = "rav1e" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] [[package]] name = "raw-window-handle" @@ -3989,9 +4203,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] @@ -4059,11 +4273,11 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ - "base64 0.21.7", + "base64", "bytes", "encoding_rs", "futures-core", @@ -4071,8 +4285,11 @@ dependencies = [ "h2", "http", "http-body", + "http-body-util", "hyper", + "hyper-rustls", "hyper-tls", + "hyper-util", "ipnet", "js-sys", "log", @@ -4094,7 +4311,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", + "windows-registry", ] [[package]] @@ -4113,6 +4330,12 @@ dependencies = [ "slice-pool2", ] +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" + [[package]] name = "ring" version = "0.17.8" @@ -4150,6 +4373,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustc_version" version = "0.4.1" @@ -4159,20 +4388,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "0.37.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - [[package]] name = "rustix" version = "0.38.41" @@ -4182,7 +4397,7 @@ dependencies = [ "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.14", + "linux-raw-sys", "windows-sys 0.52.0", ] @@ -4192,9 +4407,7 @@ version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ - "log", "once_cell", - "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -4203,11 +4416,11 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.4" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.21.7", + "rustls-pki-types", ] [[package]] @@ -4285,14 +4498,14 @@ dependencies = [ [[package]] name = "sctk-adwaita" -version = "0.8.3" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70b31447ca297092c5a9916fc3b955203157b37c19ca8edde4f52e9843e602c7" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" dependencies = [ "ab_glyph", "log", - "memmap2 0.9.5", - "smithay-client-toolkit 0.18.1", + "memmap2", + "smithay-client-toolkit", "tiny-skia", ] @@ -4408,7 +4621,7 @@ version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ - "base64 0.22.1", + "base64", "chrono", "hex", "indexmap 1.9.3", @@ -4520,16 +4733,25 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "skia-bindings" -version = "0.72.0" +version = "0.80.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace7c5359ccb009880e65958eaf1e2fa68ee19ada6931300c2f1942f84abf2c3" +checksum = "179ebe08aee2634b22ef4d2a1a9370aaa39dfe619a702fc0793d491a26c05cbb" dependencies = [ "bindgen", "cc", "flate2", - "heck 0.4.1", + "heck", "lazy_static", "regex", "serde_json", @@ -4539,15 +4761,27 @@ dependencies = [ [[package]] name = "skia-safe" -version = "0.72.0" +version = "0.80.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a4a3df502b317456a34df181ac67a7a6443b0f2e4b883ac220dba1dcb3ce38" +checksum = "41f1a96bec5198699d49e9c6a46aea27033958521c971d9186ae015a0dbecb7b" dependencies = [ - "base64 0.22.1", + "base64", "bitflags 2.6.0", "lazy_static", + "percent-encoding", "skia-bindings", - "ureq", + "skia-svg-macros", +] + +[[package]] +name = "skia-svg-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "044dd2233c9717a74f75197f3e7f0a966db2127c0ffb5e05013b480a9b75b2c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", ] [[package]] @@ -4583,27 +4817,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smithay-client-toolkit" -version = "0.16.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" -dependencies = [ - "bitflags 1.3.2", - "dlib", - "lazy_static", - "log", - "memmap2 0.5.10", - "nix 0.24.3", - "pkg-config", - "wayland-client 0.29.5", - "wayland-cursor 0.29.5", - "wayland-protocols 0.29.5", -] - -[[package]] -name = "smithay-client-toolkit" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ "bitflags 2.6.0", "calloop", @@ -4611,46 +4827,37 @@ dependencies = [ "cursor-icon", "libc", "log", - "memmap2 0.9.5", - "rustix 0.38.41", + "memmap2", + "rustix", "thiserror", "wayland-backend", - "wayland-client 0.31.7", + "wayland-client", "wayland-csd-frame", - "wayland-cursor 0.31.7", - "wayland-protocols 0.31.2", + "wayland-cursor", + "wayland-protocols", "wayland-protocols-wlr", - "wayland-scanner 0.31.5", + "wayland-scanner", "xkeysym", ] [[package]] name = "smithay-clipboard" -version = "0.6.6" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" +checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" dependencies = [ - "smithay-client-toolkit 0.16.1", - "wayland-client 0.29.5", + "libc", + "smithay-client-toolkit", + "wayland-backend", ] [[package]] name = "smol_str" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" dependencies = [ - "libc", - "winapi", + "serde", ] [[package]] @@ -4744,9 +4951,12 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] [[package]] name = "synstructure" @@ -4775,25 +4985,38 @@ dependencies = [ [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + [[package]] name = "tar" version = "0.4.43" @@ -4805,6 +5028,12 @@ dependencies = [ "xattr", ] +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "tempfile" version = "3.14.0" @@ -4812,9 +5041,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", - "fastrand 2.2.0", + "fastrand", "once_cell", - "rustix 0.38.41", + "rustix", "windows-sys 0.59.0", ] @@ -4942,7 +5171,7 @@ dependencies = [ "libc", "mio 1.0.2", "pin-project-lite", - "socket2 0.5.8", + "socket2", "tokio-macros", "windows-sys 0.52.0", ] @@ -4968,6 +5197,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.12" @@ -4990,7 +5230,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.22", + "toml_edit", ] [[package]] @@ -5002,17 +5242,6 @@ dependencies = [ "serde", ] -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.6.0", - "toml_datetime", - "winnow 0.5.40", -] - [[package]] name = "toml_edit" version = "0.22.22" @@ -5023,18 +5252,17 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.20", + "winnow", ] [[package]] name = "torin" version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1eb9f7fa2cfa7785610e1a5b1b75c91504cef96fdcc9e2c2d7184477fba65a" +source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" dependencies = [ "euclid", "freya-native-core", - "rustc-hash", + "rustc-hash 2.0.0", "tracing", ] @@ -5150,7 +5378,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" dependencies = [ - "memoffset 0.9.1", + "memoffset", "tempfile", "winapi", ] @@ -5179,22 +5407,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" -[[package]] -name = "ureq" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a" -dependencies = [ - "base64 0.22.1", - "flate2", - "log", - "once_cell", - "rustls", - "rustls-pki-types", - "url", - "webpki-roots", -] - [[package]] name = "url" version = "2.5.4" @@ -5237,6 +5449,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", +] + +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", "wasm-bindgen", ] @@ -5253,16 +5475,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] -name = "version_check" -version = "0.9.5" +name = "version-compare" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] -name = "waker-fn" -version = "1.2.0" +name = "version_check" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "walkdir" @@ -5379,26 +5601,10 @@ checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" dependencies = [ "cc", "downcast-rs", - "rustix 0.38.41", + "rustix", "scoped-tls", "smallvec", - "wayland-sys 0.31.5", -] - -[[package]] -name = "wayland-client" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" -dependencies = [ - "bitflags 1.3.2", - "downcast-rs", - "libc", - "nix 0.24.3", - "scoped-tls", - "wayland-commons", - "wayland-scanner 0.29.5", - "wayland-sys 0.29.5", + "wayland-sys", ] [[package]] @@ -5408,21 +5614,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" dependencies = [ "bitflags 2.6.0", - "rustix 0.38.41", + "rustix", "wayland-backend", - "wayland-scanner 0.31.5", -] - -[[package]] -name = "wayland-commons" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" -dependencies = [ - "nix 0.24.3", - "once_cell", - "smallvec", - "wayland-sys 0.29.5", + "wayland-scanner", ] [[package]] @@ -5436,87 +5630,53 @@ dependencies = [ "wayland-backend", ] -[[package]] -name = "wayland-cursor" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" -dependencies = [ - "nix 0.24.3", - "wayland-client 0.29.5", - "xcursor", -] - [[package]] name = "wayland-cursor" version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32b08bc3aafdb0035e7fe0fdf17ba0c09c268732707dca4ae098f60cb28c9e4c" dependencies = [ - "rustix 0.38.41", - "wayland-client 0.31.7", + "rustix", + "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" -dependencies = [ - "bitflags 1.3.2", - "wayland-client 0.29.5", - "wayland-commons", - "wayland-scanner 0.29.5", -] - -[[package]] -name = "wayland-protocols" -version = "0.31.2" +version = "0.32.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" +checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" dependencies = [ "bitflags 2.6.0", "wayland-backend", - "wayland-client 0.31.7", - "wayland-scanner 0.31.5", + "wayland-client", + "wayland-scanner", ] [[package]] name = "wayland-protocols-plasma" -version = "0.2.0" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" +checksum = "9b31cab548ee68c7eb155517f2212049dc151f7cd7910c2b66abfd31c3ee12bd" dependencies = [ "bitflags 2.6.0", "wayland-backend", - "wayland-client 0.31.7", - "wayland-protocols 0.31.2", - "wayland-scanner 0.31.5", + "wayland-client", + "wayland-protocols", + "wayland-scanner", ] [[package]] name = "wayland-protocols-wlr" -version = "0.2.0" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +checksum = "782e12f6cd923c3c316130d56205ebab53f55d6666b7faddfad36cecaeeb4022" dependencies = [ "bitflags 2.6.0", "wayland-backend", - "wayland-client 0.31.7", - "wayland-protocols 0.31.2", - "wayland-scanner 0.31.5", -] - -[[package]] -name = "wayland-scanner" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" -dependencies = [ - "proc-macro2", - "quote", - "xml-rs", + "wayland-client", + "wayland-protocols", + "wayland-scanner", ] [[package]] @@ -5526,21 +5686,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" dependencies = [ "proc-macro2", - "quick-xml", + "quick-xml 0.36.2", "quote", ] -[[package]] -name = "wayland-sys" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" -dependencies = [ - "dlib", - "lazy_static", - "pkg-config", -] - [[package]] name = "wayland-sys" version = "0.31.5" @@ -5565,41 +5714,20 @@ dependencies = [ [[package]] name = "web-time" -version = "0.2.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.26.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "weezl" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.41", -] - [[package]] name = "widestring" version = "1.1.0" @@ -5631,15 +5759,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "winapi-wsapoll" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eafc5f679c576995526e81635d0cf9695841736712b4e892f87abbe6fed3f28" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -5648,13 +5767,11 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" -version = "0.54.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core 0.54.0", - "windows-implement", - "windows-interface", + "windows-core 0.58.0", "windows-targets 0.52.6", ] @@ -5669,19 +5786,22 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.54.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ + "windows-implement", + "windows-interface", "windows-result", + "windows-strings", "windows-targets 0.52.6", ] [[package]] name = "windows-implement" -version = "0.53.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942ac266be9249c84ca862f0a164a39533dc2f6f33dc98ec89c8da99b82ea0bd" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", @@ -5690,21 +5810,42 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.53.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da33557140a288fae4e1d5f8873aaf9eb6613a9cf82c3e070223ff177f598b60" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", "syn 2.0.89", ] +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + [[package]] name = "windows-result" -version = "0.1.2" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ + "windows-result", "windows-targets 0.52.6", ] @@ -5924,62 +6065,56 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winit" -version = "0.29.15" +version = "0.30.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca" +checksum = "0be9e76a1f1077e04a411f0b989cbd3c93339e1771cb41e71ac4aee95bfd2c67" dependencies = [ "ahash 0.8.11", "android-activity", "atomic-waker", "bitflags 2.6.0", + "block2", "bytemuck", "calloop", "cfg_aliases", + "concurrent-queue", "core-foundation", "core-graphics", "cursor-icon", - "icrate 0.0.4", + "dpi", "js-sys", "libc", - "log", - "memmap2 0.9.5", + "memmap2", "ndk", - "ndk-sys", - "objc2 0.4.1", - "once_cell", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", "orbclient", "percent-encoding", - "raw-window-handle 0.5.2", - "raw-window-handle 0.6.2", - "redox_syscall 0.3.5", - "rustix 0.38.41", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix", "sctk-adwaita", - "smithay-client-toolkit 0.18.1", + "smithay-client-toolkit", "smol_str", + "tracing", "unicode-segmentation", "wasm-bindgen", "wasm-bindgen-futures", "wayland-backend", - "wayland-client 0.31.7", - "wayland-protocols 0.31.2", + "wayland-client", + "wayland-protocols", "wayland-protocols-plasma", "web-sys", "web-time", - "windows-sys 0.48.0", + "windows-sys 0.52.0", "x11-dl", - "x11rb 0.13.1", + "x11rb", "xkbcommon-dl", ] -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - [[package]] name = "winnow" version = "0.6.20" @@ -5989,16 +6124,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "write16" version = "1.0.0" @@ -6013,11 +6138,12 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "x11-clipboard" -version = "0.7.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "980b9aa9226c3b7de8e2adb11bf20124327c054e0e5812d2aac0b5b5a87e7464" +checksum = "662d74b3d77e396b8e5beb00b9cad6a9eccf40b2ef68cc858784b14c41d535a3" dependencies = [ - "x11rb 0.10.1", + "libc", + "x11rb", ] [[package]] @@ -6031,19 +6157,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "x11rb" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" -dependencies = [ - "gethostname 0.2.3", - "nix 0.24.3", - "winapi", - "winapi-wsapoll", - "x11rb-protocol 0.10.0", -] - [[package]] name = "x11rb" version = "0.13.1" @@ -6051,21 +6164,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "as-raw-xcb-connection", - "gethostname 0.4.3", + "gethostname", "libc", "libloading", "once_cell", - "rustix 0.38.41", - "x11rb-protocol 0.13.1", -] - -[[package]] -name = "x11rb-protocol" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67" -dependencies = [ - "nix 0.24.3", + "rustix", + "x11rb-protocol", ] [[package]] @@ -6081,8 +6185,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", - "linux-raw-sys 0.4.14", - "rustix 0.38.41", + "linux-raw-sys", + "rustix", ] [[package]] @@ -6152,30 +6256,27 @@ dependencies = [ [[package]] name = "zbus" -version = "3.15.2" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" dependencies = [ "async-broadcast", "async-executor", "async-fs", - "async-io 1.13.0", - "async-lock 2.8.0", + "async-io", + "async-lock", "async-process", "async-recursion", "async-task", "async-trait", "blocking", - "byteorder", - "derivative", "enumflags2", - "event-listener 2.5.3", + "event-listener", "futures-core", "futures-sink", "futures-util", "hex", - "nix 0.26.4", - "once_cell", + "nix", "ordered-stream", "rand", "serde", @@ -6184,35 +6285,71 @@ dependencies = [ "static_assertions", "tracing", "uds_windows", - "winapi", + "windows-sys 0.52.0", "xdg-home", "zbus_macros", "zbus_names", "zvariant", ] +[[package]] +name = "zbus-lockstep" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca2c5dceb099bddaade154055c926bb8ae507a18756ba1d8963fd7b51d8ed1d" +dependencies = [ + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus-lockstep-macros" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", + "zbus-lockstep", + "zbus_xml", + "zvariant", +] + [[package]] name = "zbus_macros" -version = "3.15.2" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate", "proc-macro2", "quote", - "regex", - "syn 1.0.109", + "syn 2.0.89", "zvariant_utils", ] [[package]] name = "zbus_names" -version = "2.6.1" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zbus_xml" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" +checksum = "ab3f374552b954f6abb4bd6ce979e6c9b38fb9d0cd7cc68a7d796e70c9f3a233" dependencies = [ + "quick-xml 0.30.0", "serde", "static_assertions", + "zbus_names", "zvariant", ] @@ -6286,6 +6423,12 @@ dependencies = [ "syn 2.0.89", ] +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -6295,15 +6438,23 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "zune-jpeg" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" +dependencies = [ + "zune-core", +] + [[package]] name = "zvariant" -version = "3.15.2" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" dependencies = [ - "byteorder", + "endi", "enumflags2", - "libc", "serde", "static_assertions", "zvariant_derive", @@ -6311,24 +6462,24 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.15.2" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.89", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "1.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.89", ] diff --git a/Cargo.toml b/Cargo.toml index c1fc2f1..9aab164 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,11 @@ [package] edition = "2021" -name = "discord_modloader" -version = "2.0.0-beta1" +name = "discord-modloader" +description = "An in-memory mod loader for Discord" +version = "2.0.0" +license = "LGPL-3.0" +authors = ["Megumin "] +repository = "https://github.com/MeguminSama/Discord-ModLoader/" [lib] crate-type = ["cdylib", "lib"] @@ -12,7 +16,7 @@ asar = "0.3.0" clap = { version = "4.5.20", features = ["derive"] } dioxus = "0.5.6" dirs = "5.0.1" -freya = "0.2.2" +freya = { git = "https://github.com/marc2332/freya.git", version = "0.2.2" } serde = { version = "1.0.210", features = ["serde_derive"] } toml = "0.8.19" @@ -33,3 +37,18 @@ widestring = "1.1.0" [target.'cfg(unix)'.dependencies] libc = "0.2.166" retour = { version = "0.3.1", features = ["static-detour"] } + +[package.metadata.packager] +before-packaging-command = "cargo build --release --all" +out-dir = "./dist" +product-name = "Discord ModLoader" +identifier = "dev.megu.discord.modloader" +binaries = [{ path = "discord-modloader.exe", main = true }] +resources = [ + "README.md", + "LICENSE", + "templates", + { src = "target/release/libdiscordmodloader.dll", target = "libdiscordmodloader.dll" }, +] +log-level = "trace" +# icons = ["32x32.png"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/configs/templates/moonlight.toml b/templates/moonlight.toml similarity index 100% rename from configs/templates/moonlight.toml rename to templates/moonlight.toml diff --git a/configs/templates/vencord.toml b/templates/vencord.toml similarity index 100% rename from configs/templates/vencord.toml rename to templates/vencord.toml From eed9f92b755ac7e6ee54e8cf20b955f1fd55e044 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 02:05:51 +0000 Subject: [PATCH 06/20] installer wip --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 91b6dc1..432c320 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,4 +25,5 @@ jobs: steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable + - run: cargo install cargo-packager --locked - run: cargo release From 58645515ad1ba73a25800ec1c20abfb502760cdc Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 02:08:44 +0000 Subject: [PATCH 07/20] installer wip: use nightly --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 432c320..e2bf6c2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,6 +24,6 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable - - run: cargo install cargo-packager --locked - - run: cargo release + - uses: dtolnay/rust-toolchain@nightly + - run: cargo +nightly install cargo-packager --locked + - run: cargo +nightly release From 7e43f2980f7b6d653488c7998329c75b4d7b4600 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 02:11:56 +0000 Subject: [PATCH 08/20] don't use mold linker --- .cargo/config.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index 156ae02..ae5c274 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,5 +1,2 @@ -[target.x86_64-unknown-linux-gnu] -rustflags = ["-C", "link-arg=-fuse-ld=mold"] - [alias] release = "packager --release -f all" From 24e5de8308e3ae1b2bf54192b81afef2004d43b8 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 02:15:52 +0000 Subject: [PATCH 09/20] installer wip: no macos support yet --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e2bf6c2..d2e4837 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [ubuntu-latest, macos-latest, windows-latest] + platform: [ubuntu-latest, windows-latest] # no macos-latest yet runs-on: ${{ matrix.platform }} From 66732474f83e4407da9387308135dea28a9dd557 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 02:34:13 +0000 Subject: [PATCH 10/20] workflow stuff --- .cargo/config.toml | 2 +- .github/workflows/build.yml | 21 ++-- Cargo.lock | 225 +----------------------------------- Cargo.toml | 1 - src/main.rs | 2 +- 5 files changed, 19 insertions(+), 232 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index ae5c274..f72826d 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,2 +1,2 @@ [alias] -release = "packager --release -f all" +release = "packager --release -f all -v" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d2e4837..4b9a177 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,12 +1,9 @@ -name: Package examples +name: Publish on: - pull_request: - branches: - - main - paths: - - ".github/workflows/build.yml" - - "./**" + push: + tags: + - "v*" concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -27,3 +24,13 @@ jobs: - uses: dtolnay/rust-toolchain@nightly - run: cargo +nightly install cargo-packager --locked - run: cargo +nightly release + - name: release + uses: svenstaro/upload-release-action@2.9.0 + with: + repo_token: ${{ secrets.RELEASE_TOKEN }} + file: dist/discord-modloader_* + tag: ${{ github.ref }} + overwrite: true + file_glob: true + draft: true + prerelease: ${{ contains(github.ref, 'beta') }} diff --git a/Cargo.lock b/Cargo.lock index aaef579..1590a3d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -195,7 +195,7 @@ dependencies = [ "ndk", "ndk-context", "ndk-sys", - "num_enum 0.7.3", + "num_enum", "thiserror", ] @@ -580,15 +580,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bindgen" version = "0.70.1" @@ -986,12 +977,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "const_panic" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "013b6c2c3a14d678f38cd23994b02da3a1a1b6a5d1eedddfe63a5a5f11b13a81" - [[package]] name = "constcat" version = "0.3.1" @@ -1129,16 +1114,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "cstr" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68523903c8ae5aacfa32a0d9ae60cadeb764e1da14ee0d26b1f3089f13a54636" -dependencies = [ - "proc-macro2", - "quote", -] - [[package]] name = "cursor-icon" version = "1.1.0" @@ -1467,7 +1442,6 @@ dependencies = [ "detours-sys", "dioxus", "dirs", - "dll-syringe", "freya", "libc", "retour", @@ -1503,29 +1477,6 @@ dependencies = [ "libloading", ] -[[package]] -name = "dll-syringe" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdc807201d54de75e9bd7ad199d0031048625059f84acfc94506bdb13c0b4f59" -dependencies = [ - "bincode", - "cstr", - "goblin", - "iced-x86", - "konst", - "num_enum 0.6.1", - "path-absolutize", - "same-file", - "serde", - "shrinkwraprs", - "stopwatch2", - "sysinfo", - "thiserror", - "widestring", - "winapi", -] - [[package]] name = "downcast-rs" version = "1.2.1" @@ -2290,17 +2241,6 @@ dependencies = [ "gl_generator", ] -[[package]] -name = "goblin" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6b4de4a8eb6c46a8c77e1d3be942cb9a8bf073c22374578e5ba4b08ed0ff68" -dependencies = [ - "log", - "plain", - "scroll", -] - [[package]] name = "h2" version = "0.4.7" @@ -2514,15 +2454,6 @@ dependencies = [ "cc", ] -[[package]] -name = "iced-x86" -version = "1.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c447cff8c7f384a7d4f741cfcff32f75f3ad02b406432e8d6c878d56b1edf6b" -dependencies = [ - "lazy_static", -] - [[package]] name = "icu_collections" version = "1.5.0" @@ -2867,15 +2798,6 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" -[[package]] -name = "itertools" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.11.0" @@ -2972,26 +2894,6 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" -[[package]] -name = "konst" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65f00fb3910881e52bf0850ae2a82aea411488a557e1c02820ceaa60963dce3" -dependencies = [ - "const_panic", - "konst_kernel", - "typewit", -] - -[[package]] -name = "konst_kernel" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "599c1232f55c72c7fc378335a3efe1c878c92720838c8e6a4fd87784ef7764de" -dependencies = [ - "typewit", -] - [[package]] name = "kqueue" version = "1.0.8" @@ -3277,7 +3179,7 @@ dependencies = [ "jni-sys", "log", "ndk-sys", - "num_enum 0.7.3", + "num_enum", "raw-window-handle", "thiserror", ] @@ -3350,15 +3252,6 @@ dependencies = [ "windows-sys 0.45.0", ] -[[package]] -name = "ntapi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" -dependencies = [ - "winapi", -] - [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -3425,33 +3318,13 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_enum" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" -dependencies = [ - "num_enum_derive 0.6.1", -] - [[package]] name = "num_enum" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ - "num_enum_derive 0.7.3", -] - -[[package]] -name = "num_enum_derive" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.89", + "num_enum_derive", ] [[package]] @@ -3858,24 +3731,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "path-absolutize" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4af381fe79fa195b4909485d99f73a80792331df0625188e707854f0b3383f5" -dependencies = [ - "path-dedot", -] - -[[package]] -name = "path-dedot" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ba0ad7e047712414213ff67533e6dd477af0a4e1d14fb52343e53d30ea9397" -dependencies = [ - "once_cell", -] - [[package]] name = "pathdiff" version = "0.2.3" @@ -3947,12 +3802,6 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" - [[package]] name = "png" version = "0.17.14" @@ -4476,26 +4325,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "scroll" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" -dependencies = [ - "scroll_derive", -] - -[[package]] -name = "scroll_derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.89", -] - [[package]] name = "sctk-adwaita" version = "0.10.1" @@ -4705,19 +4534,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "shrinkwraprs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e63e6744142336dfb606fe2b068afa2e1cca1ee6a5d8377277a92945d81fa331" -dependencies = [ - "bitflags 1.3.2", - "itertools 0.8.2", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -4897,12 +4713,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "stopwatch2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "911ece10388afa48417f99e01df038460b6249a3ee0255f6446a6881b702fbb4" - [[package]] name = "str_indices" version = "0.4.4" @@ -4969,20 +4779,6 @@ dependencies = [ "syn 2.0.89", ] -[[package]] -name = "sysinfo" -version = "0.29.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd727fc423c2060f6c92d9534cef765c65a6ed3f428a03d7def74a8c4348e666" -dependencies = [ - "cfg-if", - "core-foundation-sys", - "libc", - "ntapi", - "once_cell", - "winapi", -] - [[package]] name = "system-configuration" version = "0.6.1" @@ -5357,21 +5153,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "typewit" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51dbd25812f740f45e2a9769f84711982e000483b13b73a8a1852e092abac8c" -dependencies = [ - "typewit_proc_macros", -] - -[[package]] -name = "typewit_proc_macros" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36a83ea2b3c704935a01b4642946aadd445cea40b10935e3f8bd8052b8193d6" - [[package]] name = "uds_windows" version = "1.1.0" diff --git a/Cargo.toml b/Cargo.toml index 9aab164..2e8b615 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,6 @@ winapi = { version = "0.3.9", features = [ "memoryapi", "namedpipeapi", ] } -dll-syringe = "0.15.2" detours-sys = { version = "0.1.2" } widestring = "1.1.0" diff --git a/src/main.rs b/src/main.rs index 6663f53..206ffda 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,7 +29,7 @@ fn main() { } #[cfg(target_os = "linux")] -fn load_profile(config: &config::Config, instance: &config::Instance) { +unsafe fn load_profile(config: &config::Config, instance: &config::Instance) { println!("Loading Instance: {}", instance.name); if let Some(ref profile_path) = instance.profile_path { println!("On profile: {}", profile_path) From 96ee45b66ac1371e9e0c07a216c22f4ada0a2e54 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 14:56:01 +0000 Subject: [PATCH 11/20] feat: app icons, use GITHUB_TOKEN --- .github/workflows/build.yml | 2 +- Cargo.lock | 4 ++-- Cargo.toml | 25 +++++++++++++++++++------ assets/1024x1024.png | Bin 0 -> 311199 bytes assets/128x128.png | Bin 0 -> 16275 bytes assets/256x256.png | Bin 0 -> 37911 bytes assets/32x32.png | Bin 0 -> 3152 bytes assets/512x512.png | Bin 0 -> 99820 bytes assets/64x64.png | Bin 0 -> 7217 bytes assets/logo_development.ico | 0 assets/logo_development.png | Bin 0 -> 429243 bytes assets/logo_development.svg | 1 + 12 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 assets/1024x1024.png create mode 100644 assets/128x128.png create mode 100644 assets/256x256.png create mode 100644 assets/32x32.png create mode 100644 assets/512x512.png create mode 100644 assets/64x64.png create mode 100644 assets/logo_development.ico create mode 100644 assets/logo_development.png create mode 100644 assets/logo_development.svg diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4b9a177..a7928d7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,7 +27,7 @@ jobs: - name: release uses: svenstaro/upload-release-action@2.9.0 with: - repo_token: ${{ secrets.RELEASE_TOKEN }} + repo_token: ${{ secrets.GITHUB_TOKEN }} file: dist/discord-modloader_* tag: ${{ github.ref }} overwrite: true diff --git a/Cargo.lock b/Cargo.lock index 1590a3d..3f59c35 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2947,9 +2947,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.166" +version = "0.2.167" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" +checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" [[package]] name = "libfuzzer-sys" diff --git a/Cargo.toml b/Cargo.toml index 2e8b615..fd09923 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,20 +34,33 @@ detours-sys = { version = "0.1.2" } widestring = "1.1.0" [target.'cfg(unix)'.dependencies] -libc = "0.2.166" +libc = "0.2.167" retour = { version = "0.3.1", features = ["static-detour"] } [package.metadata.packager] -before-packaging-command = "cargo build --release --all" -out-dir = "./dist" -product-name = "Discord ModLoader" +product-name = "Discord Modloader" identifier = "dev.megu.discord.modloader" -binaries = [{ path = "discord-modloader.exe", main = true }] +authors = ["Megumin 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%0AT-mIWx|WvyVimX4<(TKDBa@v_ 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

;2_#vu4W~C}oBo(lJ(M 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

>RtF1mjqas&})h1XOr!r}N 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%0AF&FupvHYyoOB5?mN^BvXlMld8rT<6<8$6lm78RY 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/128x128.png b/assets/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..67834d65efb21f24b8eab36a4fc053d6fc8592f4 GIT binary patch literal 16275 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 LDNELh8wdYC^kRMq literal 0 HcmV?d00001 diff --git a/assets/256x256.png b/assets/256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..27fbc05170e834851d58534a0d53725c301ba50b GIT binary patch literal 37911 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 V5MAw@V;l@%YGh?tsqb?4{{R`d<3j)d literal 0 HcmV?d00001 diff --git a/assets/512x512.png b/assets/512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..c565240abaff244192cb43cf6be09be8eadda7e2 GIT binary patch literal 99820 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�RtN@QpitD&+7kj00Z1Ne$j_9 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 J|L>D+tU)rA|0 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 TVS~fq8c11QL#|fFGVFf<8FUb0 literal 0 HcmV?d00001 diff --git a/assets/64x64.png b/assets/64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..37f6d648c5cc330742af8045f3fa52ce9d4e8e4a GIT binary patch literal 7217 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 AQ2+n{ literal 0 HcmV?d00001 diff --git a/assets/logo_development.ico b/assets/logo_development.ico new file mode 100644 index 0000000..e69de29 diff --git a/assets/logo_development.png b/assets/logo_development.png new file mode 100644 index 0000000000000000000000000000000000000000..1e196a898742c774308ee9c5ae6bbf0de63e5f3a GIT binary patch literal 429243 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

A)T#3cbA{F!K#Z~kf6 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

%(3FSib?d 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�TEG!pZwu;0$s7Ik1N60 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 z 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

ZAMQPk&?%B8 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

Jiz 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℞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 literal 0 HcmV?d00001 diff --git a/assets/logo_development.svg b/assets/logo_development.svg new file mode 100644 index 0000000..171599c --- /dev/null +++ b/assets/logo_development.svg @@ -0,0 +1 @@ + \ No newline at end of file From 281ef06113b223f3276ba16a83589244cded27d2 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 15:13:18 +0000 Subject: [PATCH 12/20] ci: add GITHUB_TOKEN permissions --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a7928d7..b836c8c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,6 +19,9 @@ jobs: runs-on: ${{ matrix.platform }} + permissions: + contents: write + steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@nightly From 9b7d1ecfde632e5d29d33c6a78cd6bb3c774919d Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 15:30:29 +0000 Subject: [PATCH 13/20] use single release job --- .github/workflows/build.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b836c8c..6fd44d6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,7 +27,12 @@ jobs: - uses: dtolnay/rust-toolchain@nightly - run: cargo +nightly install cargo-packager --locked - run: cargo +nightly release - - name: release + + release: + needs: package + runs-on: ubuntu-latest + steps: + - name: Release uses: svenstaro/upload-release-action@2.9.0 with: repo_token: ${{ secrets.GITHUB_TOKEN }} From 3a1eee1a35c664c984f4a1e8f33592685b805db3 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 15:45:04 +0000 Subject: [PATCH 14/20] ci: move permissions to release job --- .github/workflows/build.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6fd44d6..5e4311b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,9 +19,6 @@ jobs: runs-on: ${{ matrix.platform }} - permissions: - contents: write - steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@nightly @@ -31,6 +28,8 @@ jobs: release: needs: package runs-on: ubuntu-latest + permissions: + contents: write steps: - name: Release uses: svenstaro/upload-release-action@2.9.0 From a55c4b971d62f376de9aa17ed399c99885569722 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 16:03:42 +0000 Subject: [PATCH 15/20] ci: upload and download artifacts between jobs --- .github/workflows/build.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5e4311b..e41dbf6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,6 +24,11 @@ jobs: - uses: dtolnay/rust-toolchain@nightly - run: cargo +nightly install cargo-packager --locked - run: cargo +nightly release + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: discord-modloader-${{ matrix.platform }} + path: dist/* release: needs: package @@ -31,11 +36,16 @@ jobs: permissions: contents: write steps: + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + path: dist/ + merge-multiple: true - name: Release uses: svenstaro/upload-release-action@2.9.0 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: dist/discord-modloader_* + file: dist/{PKGBUILD,discord-modloader*} tag: ${{ github.ref }} overwrite: true file_glob: true From 7096cb983e8c14582c2c7c9c73259c8e2deccd59 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 16:21:23 +0000 Subject: [PATCH 16/20] use v4 of upload-artifact and download-artifact --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e41dbf6..93313d8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,7 +25,7 @@ jobs: - run: cargo +nightly install cargo-packager --locked - run: cargo +nightly release - name: Upload artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: discord-modloader-${{ matrix.platform }} path: dist/* @@ -37,7 +37,7 @@ jobs: contents: write steps: - name: Download artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: path: dist/ merge-multiple: true From 861cf5ce835f9723fb42293d4903951cb20b4119 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Fri, 29 Nov 2024 17:07:17 +0000 Subject: [PATCH 17/20] chore: split project into crates --- Cargo.lock | 38 +++++++++++++------ Cargo.toml | 32 +++------------- crates/gui/.gitignore | 1 + crates/gui/Cargo.toml | 8 ++++ crates/gui/src/lib.rs | 14 +++++++ crates/libdiscord-modloader/Cargo.toml | 31 +++++++++++++++ .../src}/asar/custom_profile.js | 0 .../libdiscord-modloader/src}/asar/index.js | 0 .../src}/asar/package.json | 0 .../libdiscord-modloader/src}/config.rs | 0 .../libdiscord-modloader/src}/discord.rs | 0 .../libdiscord-modloader/src}/lib.rs | 0 .../libdiscord-modloader/src}/unix.rs | 0 .../libdiscord-modloader/src}/windows.rs | 0 src/main.rs | 12 +++--- 15 files changed, 91 insertions(+), 45 deletions(-) create mode 100644 crates/gui/.gitignore create mode 100644 crates/gui/Cargo.toml create mode 100644 crates/gui/src/lib.rs create mode 100644 crates/libdiscord-modloader/Cargo.toml rename {src => crates/libdiscord-modloader/src}/asar/custom_profile.js (100%) rename {src => crates/libdiscord-modloader/src}/asar/index.js (100%) rename {src => crates/libdiscord-modloader/src}/asar/package.json (100%) rename {src => crates/libdiscord-modloader/src}/config.rs (100%) rename {src => crates/libdiscord-modloader/src}/discord.rs (100%) rename {src => crates/libdiscord-modloader/src}/lib.rs (100%) rename {src => crates/libdiscord-modloader/src}/unix.rs (100%) rename {src => crates/libdiscord-modloader/src}/windows.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 3f59c35..66d5a2f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -589,7 +589,7 @@ dependencies = [ "bitflags 2.6.0", "cexpr", "clang-sys", - "itertools 0.13.0", + "itertools 0.11.0", "log", "prettyplease", "proc-macro2", @@ -1437,18 +1437,9 @@ dependencies = [ name = "discord-modloader" version = "2.0.0" dependencies = [ - "asar", "clap", - "detours-sys", - "dioxus", - "dirs", - "freya", - "libc", - "retour", - "serde", - "toml", - "widestring", - "winapi", + "gui", + "libdiscord-modloader", ] [[package]] @@ -2241,6 +2232,14 @@ dependencies = [ "gl_generator", ] +[[package]] +name = "gui" +version = "0.1.0" +dependencies = [ + "dioxus", + "freya", +] + [[package]] name = "h2" version = "0.4.7" @@ -2951,6 +2950,21 @@ version = "0.2.167" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" +[[package]] +name = "libdiscord-modloader" +version = "0.1.0" +dependencies = [ + "asar", + "detours-sys", + "dirs", + "libc", + "retour", + "serde", + "toml", + "widestring", + "winapi", +] + [[package]] name = "libfuzzer-sys" version = "0.4.8" diff --git a/Cargo.toml b/Cargo.toml index fd09923..e7e796f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,6 @@ +[workspace] +members = ["crates/*"] + [package] edition = "2021" name = "discord-modloader" @@ -7,35 +10,10 @@ license = "LGPL-3.0" authors = ["Megumin "] repository = "https://github.com/MeguminSama/Discord-ModLoader/" -[lib] -crate-type = ["cdylib", "lib"] -name = "libdiscordmodloader" - [dependencies] -asar = "0.3.0" clap = { version = "4.5.20", features = ["derive"] } -dioxus = "0.5.6" -dirs = "5.0.1" -freya = { git = "https://github.com/marc2332/freya.git", version = "0.2.2" } -serde = { version = "1.0.210", features = ["serde_derive"] } -toml = "0.8.19" - -[target.'cfg(windows)'.dependencies] -winapi = { version = "0.3.9", features = [ - "winbase", - "handleapi", - "minwindef", - "consoleapi", - "winnt", - "memoryapi", - "namedpipeapi", -] } -detours-sys = { version = "0.1.2" } -widestring = "1.1.0" - -[target.'cfg(unix)'.dependencies] -libc = "0.2.167" -retour = { version = "0.3.1", features = ["static-detour"] } +libdiscord-modloader = { path = "crates/libdiscord-modloader" } +gui = { path = "crates/gui" } [package.metadata.packager] product-name = "Discord Modloader" diff --git a/crates/gui/.gitignore b/crates/gui/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/crates/gui/.gitignore @@ -0,0 +1 @@ +/target diff --git a/crates/gui/Cargo.toml b/crates/gui/Cargo.toml new file mode 100644 index 0000000..a3dfa47 --- /dev/null +++ b/crates/gui/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "gui" +version = "0.1.0" +edition = "2021" + +[dependencies] +dioxus = "0.5.6" +freya = { git = "https://github.com/marc2332/freya.git", version = "0.2.2" } diff --git a/crates/gui/src/lib.rs b/crates/gui/src/lib.rs new file mode 100644 index 0000000..b93cf3f --- /dev/null +++ b/crates/gui/src/lib.rs @@ -0,0 +1,14 @@ +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/crates/libdiscord-modloader/Cargo.toml b/crates/libdiscord-modloader/Cargo.toml new file mode 100644 index 0000000..18d6fc1 --- /dev/null +++ b/crates/libdiscord-modloader/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "libdiscord-modloader" +version = "0.1.0" +edition = "2021" + +[lib] +name = "discord_modloader" +crate-type = ["cdylib", "lib"] + +[dependencies] +asar = "0.3.0" +dirs = "5.0.1" +serde = { version = "1.0.210", features = ["serde_derive"] } +toml = "0.8.19" + +[target.'cfg(windows)'.dependencies] +winapi = { version = "0.3.9", features = [ + "winbase", + "handleapi", + "minwindef", + "consoleapi", + "winnt", + "memoryapi", + "namedpipeapi", +] } +detours-sys = { version = "0.1.2" } +widestring = "1.1.0" + +[target.'cfg(unix)'.dependencies] +libc = "0.2.167" +retour = { version = "0.3.1", features = ["static-detour"] } diff --git a/src/asar/custom_profile.js b/crates/libdiscord-modloader/src/asar/custom_profile.js similarity index 100% rename from src/asar/custom_profile.js rename to crates/libdiscord-modloader/src/asar/custom_profile.js diff --git a/src/asar/index.js b/crates/libdiscord-modloader/src/asar/index.js similarity index 100% rename from src/asar/index.js rename to crates/libdiscord-modloader/src/asar/index.js diff --git a/src/asar/package.json b/crates/libdiscord-modloader/src/asar/package.json similarity index 100% rename from src/asar/package.json rename to crates/libdiscord-modloader/src/asar/package.json diff --git a/src/config.rs b/crates/libdiscord-modloader/src/config.rs similarity index 100% rename from src/config.rs rename to crates/libdiscord-modloader/src/config.rs diff --git a/src/discord.rs b/crates/libdiscord-modloader/src/discord.rs similarity index 100% rename from src/discord.rs rename to crates/libdiscord-modloader/src/discord.rs diff --git a/src/lib.rs b/crates/libdiscord-modloader/src/lib.rs similarity index 100% rename from src/lib.rs rename to crates/libdiscord-modloader/src/lib.rs diff --git a/src/unix.rs b/crates/libdiscord-modloader/src/unix.rs similarity index 100% rename from src/unix.rs rename to crates/libdiscord-modloader/src/unix.rs diff --git a/src/windows.rs b/crates/libdiscord-modloader/src/windows.rs similarity index 100% rename from src/windows.rs rename to crates/libdiscord-modloader/src/windows.rs diff --git a/src/main.rs b/src/main.rs index 206ffda..2d72bd0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use clap::Parser; -use libdiscordmodloader::{config, get_or_write_cache}; +use discord_modloader::{config, get_or_write_cache}; #[derive(clap::Parser, Debug)] struct Args { @@ -37,15 +37,15 @@ unsafe fn load_profile(config: &config::Config, instance: &config::Instance) { let asar_path = get_or_write_cache(instance, config.mods.get(&instance.r#mod).unwrap()); + let current_exe = std::env::current_exe().unwrap(); + let shared_object = current_exe.with_file_name("libdiscord_modloader.so"); + let mut target = std::process::Command::new(instance.path.clone()) .current_dir(std::path::Path::new(&instance.path).parent().unwrap()) // TODO: move libmodhook.so into global libs dir - .env( - "LD_PRELOAD", - "/home/megu/Workspace/Discord/Discord-ModLoader/target/debug/libdiscord_modloader.so", - ) + .env("LD_PRELOAD", shared_object.to_str().unwrap()) .env("MODLOADER_ASAR_PATH", asar_path) - .args(["--trace-warnings"]) + // .args(["--trace-warnings"]) .spawn() .expect("Failed to launch instance."); From 109626394dbd35ba94db63ac58cf254b64454248 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Tue, 3 Dec 2024 17:24:06 +0000 Subject: [PATCH 18/20] revamp config layout --- .gitignore | 6 +- Cargo.lock | 4 + Cargo.toml | 8 +- configs/icons/moonlight.png | Bin 0 -> 1242 bytes configs/icons/vencord.png | Bin 0 -> 9835 bytes .../templates}/moonlight.toml | 0 {templates => configs/templates}/vencord.toml | 0 crates/gui/Cargo.toml | 3 + crates/gui/src/lib.rs | 158 ++++++++++++- crates/gui/src/utils/hoverable.rs | 56 +++++ crates/gui/src/utils/mod.rs | 1 + crates/libdiscord-modloader/src/config.rs | 223 ++++++++---------- crates/libdiscord-modloader/src/lib.rs | 164 ++++++------- crates/libdiscord-modloader/src/paths.rs | 59 +++++ crates/libdiscord-modloader/src/windows.rs | 2 +- src/main.rs | 65 +++-- 16 files changed, 508 insertions(+), 241 deletions(-) create mode 100644 configs/icons/moonlight.png create mode 100644 configs/icons/vencord.png rename {templates => configs/templates}/moonlight.toml (100%) rename {templates => configs/templates}/vencord.toml (100%) create mode 100644 crates/gui/src/utils/hoverable.rs create mode 100644 crates/gui/src/utils/mod.rs create mode 100644 crates/libdiscord-modloader/src/paths.rs diff --git a/.gitignore b/.gitignore index 2d2b3f8..4bf7f36 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ /target -/configs /dist + +# Hide everything in /configs except for /configs/icons and /configs/templates +/configs/* +!/configs/icons +!/configs/templates diff --git a/Cargo.lock b/Cargo.lock index 66d5a2f..ad9e3ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1438,6 +1438,7 @@ name = "discord-modloader" version = "2.0.0" dependencies = [ "clap", + "dirs", "gui", "libdiscord-modloader", ] @@ -2237,7 +2238,10 @@ name = "gui" version = "0.1.0" dependencies = [ "dioxus", + "dirs", "freya", + "itertools 0.13.0", + "libdiscord-modloader", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index e7e796f..dd6087b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ repository = "https://github.com/MeguminSama/Discord-ModLoader/" clap = { version = "4.5.20", features = ["derive"] } libdiscord-modloader = { path = "crates/libdiscord-modloader" } gui = { path = "crates/gui" } +dirs = "5.0.1" [package.metadata.packager] product-name = "Discord Modloader" @@ -25,9 +26,10 @@ before-packaging-command = "cargo build --release --all" resources = [ "README.md", "LICENSE", - "templates", - { src = "target/release/libdiscordmodloader.dll", target = "libdiscordmodloader.dll" }, - { src = "target/release/libdiscordmodloader.so", target = "libdiscordmodloader.so" }, + { src = "configs/templates", target = "templates" }, + { src = "configs/icons", target = "icons" }, + { src = "target/release/libdiscord_modloader.dll", target = "libdiscord_modloader.dll" }, + { src = "target/release/libdiscord_modloader.so", target = "libdiscord_modloader.so" }, ] log-level = "trace" icons = [ diff --git a/configs/icons/moonlight.png b/configs/icons/moonlight.png new file mode 100644 index 0000000000000000000000000000000000000000..ca7ec31a5323b535153b49bd7ac4cc4f6635a629 GIT binary patch literal 1242 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G!U;i$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBK4*bPWHAE+-(e7DJf6QI1*j(9)5S5QBJS;7#k{GJGVKq)E#u7;)=Jam z;BhQxR_Q3*p(tsrJ;PL?P+2We_f3Q91A&BD4L`#^{5|^cNv&LQ|GV7#GR1X!nSkaa zgF5T$$DePzx98`F&ldAOy}bPUZ9QA+{r$Bvwg12KzrS?<|I;5VO)LzDh(y!&x7OAC zDgQF>_s`GveU~l2F?>toPdLU)v;jbSj^!_m-~TWDo80ez4=v^<^C#qA{{E-D{QL2j zbL8#!$uBQ1yDwb8++e^+G^%F!#^4sV|M~u1mDMtSRlojQ%-Q^VUV}743n$Sic7N5^ z?=Nh>KP{@Bb8aKMfpKlW{nkIW|FgQkvn;#Apx{F^%K0gGV2W+y)@9W!r@ym^0i9J} zvHi>U<0J*ry7+y6vVp;TbMx-UTiR?J_O87reB-a}|0yJTs^a7G7q;Kdo_%Bcuf#uL z7rQ~Kf5O_A^A5aw|8qHMzWQz3a24pKZ!BqV7|-lrbeO?FEV}W@wqfP%+p`~+oCAmM z%y*1FH-!@pkrW`u@(+f;=Uj7-dB&|;|AbR=2cz;B1k{K|+y2TOxbm)=X|?Znp0M|V zZ}N66f566&$V4YEG zZeV&>80eM$gmQoX`+b+CR^R{Zzmud;{Z`GedhI>s6}SJ|{>vgIFea3ie&w$EQxlrL SQlcJISa`bnxvXz5P& literal 0 HcmV?d00001 diff --git a/configs/icons/vencord.png b/configs/icons/vencord.png new file mode 100644 index 0000000000000000000000000000000000000000..cccf5b98ee5e16a0dceeb921209e5a42b7eca9cd GIT binary patch literal 9835 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 u64 { - left + right +mod utils; + +use std::{borrow::Borrow, sync::LazyLock}; + +use freya::prelude::*; + +use discord_modloader::config; +use itertools::Itertools; +use utils::hoverable::hoverable; + +pub fn start_gui() { + let cfg: LaunchConfig = LaunchConfig::new() + .with_title("Discord Modloader") + .with_size(1080., 720.) + .with_decorations(true) + .with_transparency(true) + .with_state(config::Config::init()); + + launch_cfg(app, cfg); } -#[cfg(test)] -mod tests { - use super::*; +fn get_icon(name: &str) -> Option> { + const LIB_PATH: &'static str = "/usr/lib/discord-modloader"; + + let config_path = dirs::config_local_dir().unwrap().join("discord-modloader"); + let icon_path = config_path.join("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + + let lib_path = std::path::PathBuf::from(LIB_PATH); + + let icon_path = lib_path.join("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + + let current_exe = std::env::current_exe().unwrap(); + let icon_path = current_exe.with_file_name("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); + let cwd = std::env::current_dir().unwrap(); + let icon_path = cwd.join("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); } + + let icon_path = cwd.join("configs").join("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + + None +} + +fn app() -> Element { + let ctx = use_context::(); + + rsx!(rect { + direction: "horizontal", + width: "100%", + height: "100%", + background: "rgb(46, 46, 52)", + + ProfileList {} + + // rect { + // max_width: "256", + // height: "100%", + // background: "rgb(46, 46, 52)", + // } + + rect { + width: "fill", + height: "100%", + background: "rgb(52, 52, 58)", + } + }) +} + +#[component] +fn ProfileList() -> Element { + let ctx = use_context::(); + + let selected: Signal> = use_signal(|| None); + + rsx!(rect { + width: "256", + height: "100%", + direction: "vertical", + background: "rgb(46, 46, 52)", + padding: "8", + color: "white", + corner_radius: "8", + + label { + font_size: "18", + font_weight: "bold", + "Profiles" + } + + ScrollView { + spacing: "4", + + ProfileListEntry { name: "Test Profile 1", selected: false } + + ProfileListEntry { name: "Test Profile 2", selected: true } + + ProfileListEntry { name: "Test Profile 3", selected: false } + + ProfileListEntry { name: "Test Profile 4", selected: false } + } + + }) +} + +#[component] +fn ProfileListEntry(name: String, selected: bool) -> Element { + let bg_anim = hoverable!(move |ctx| { + ctx.with( + AnimColor::new("rgb(52, 52, 58)", "rgb(88, 101, 242)") + .ease(Ease::InOut) + .time(100), + ) + }); + + let bg_color = bg_anim.animation.get(); + + let bg_color = if selected { + "rgb(88, 101, 242)" + } else { + &bg_color.read().as_string() + }; + + rsx!(rect { + width: "100%", + // height: "32", + padding: "8", + color: "white", + corner_radius: "8", + + background: bg_color, + onmouseenter: bg_anim.onmouseenter, + onmouseleave: bg_anim.onmouseleave, + + label { + font_size: "18", + font_weight: "bold", + {name} + } + }) } diff --git a/crates/gui/src/utils/hoverable.rs b/crates/gui/src/utils/hoverable.rs new file mode 100644 index 0000000..70a3d54 --- /dev/null +++ b/crates/gui/src/utils/hoverable.rs @@ -0,0 +1,56 @@ +use freya::prelude::*; + +pub struct Hoverable { + #[allow( + unused, + reason = "Consumers don't always need to know the hover state." + )] + pub hovered: Signal, + pub animation: UseAnimator, + pub onmouseenter: Box)>, + pub onmouseleave: Box)>, +} + +/// A macro to create a hoverable animation. +/// +/// # Example +/// +/// ```rust +/// let bg_anim = hoverable!(|ctx| { +/// ctx.with( +/// AnimColor::new("rgb(52, 52, 58)", "rgb(88, 101, 242)") +/// .ease(Ease::InOut) +/// .time(100), +/// ) +/// }); +macro_rules! hoverable { + ($anim:expr) => {{ + use freya::prelude::*; + + let mut hovered = use_signal(|| false); + let animation = use_animation($anim); + + let onmouseenter = move |_: Event| { + if !hovered() { + animation.run(AnimDirection::Forward); + hovered.set(true); + } + }; + + let onmouseleave = move |_: Event| { + if hovered() { + hovered.set(false); + animation.run(AnimDirection::Reverse); + } + }; + + $crate::utils::hoverable::Hoverable { + hovered, + animation, + onmouseenter: Box::new(onmouseenter), + onmouseleave: Box::new(onmouseleave), + } + }}; +} + +pub(crate) use hoverable; diff --git a/crates/gui/src/utils/mod.rs b/crates/gui/src/utils/mod.rs new file mode 100644 index 0000000..64ed538 --- /dev/null +++ b/crates/gui/src/utils/mod.rs @@ -0,0 +1 @@ +pub mod hoverable; diff --git a/crates/libdiscord-modloader/src/config.rs b/crates/libdiscord-modloader/src/config.rs index 0832bfe..32d8baa 100644 --- a/crates/libdiscord-modloader/src/config.rs +++ b/crates/libdiscord-modloader/src/config.rs @@ -1,6 +1,8 @@ use std::collections::HashMap; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; + +use crate::paths::{self, ensure_dir}; #[derive(Debug, Deserialize)] #[serde(rename_all = "lowercase")] @@ -9,131 +11,76 @@ pub enum ConfigFile { Mod(Mod), } -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Config { + // pub instances: HashMap, + pub profiles: HashMap, pub mods: HashMap, - pub instances: HashMap, } impl Config { pub fn validate(&mut self) { - for (_, mod_) in self.mods.iter_mut() { - let entrypoint_exists = std::path::Path::new(&mod_.path) - .join(&mod_.entrypoint) - .exists(); - - mod_.is_valid = entrypoint_exists; - } - - for (_, instance) in self.instances.iter_mut() { - if let Some(target_mod) = self.mods.get(&instance.r#mod) { - let asar_exists: bool = std::path::Path::new(&instance.path) - .parent() - .expect("Expected Discord executable path to have a parent.") - .join("resources") - .join("app.asar") - .exists(); - - instance.is_valid = target_mod.is_valid && asar_exists; - } else { - instance.is_valid = false; - } - } + // for (_, mod_) in self.mods.iter_mut() { + // let entrypoint_exists = std::path::Path::new(&mod_.path) + // .join(&mod_.entrypoint) + // .exists(); + + // mod_.is_valid = entrypoint_exists; + // } + + // for (_, instance) in self.instances.iter_mut() { + // if let Some(target_mod) = self.mods.get(&instance.r#mod) { + // let asar_exists: bool = std::path::Path::new(&instance.path) + // .parent() + // .expect("Expected Discord executable path to have a parent.") + // .join("resources") + // .join("app.asar") + // .exists(); + + // instance.is_valid = target_mod.is_valid && asar_exists; + // } else { + // instance.is_valid = false; + // } + // } } pub fn init() -> Config { - let profiles_dir = dirs::data_dir() - .unwrap() - .join("discord-modloader") - .join("profiles"); + let profiles_config_dir = ensure_dir(paths::config_profile_dir()); + let mods_config_dir = ensure_dir(paths::config_mods_dir()); - println!("Loading from profile directory: {}", profiles_dir.display()); + let mut profile_configs = HashMap::new(); - if !profiles_dir.exists() { - std::fs::create_dir_all(&profiles_dir).expect("Unable to create profiles directory."); - } - - let configs_dir = dirs::config_local_dir().unwrap().join("discord-modloader"); + for profile in paths::read_dir(&profiles_config_dir) { + if !profile.path().to_string_lossy().ends_with(".toml") { + continue; + } + let id = profile.file_name().to_string_lossy().replace(".toml", ""); - let instances_dir = configs_dir.join("instances"); - let mods_dir = configs_dir.join("mods"); + let profile = std::fs::read_to_string(profile.path()).unwrap(); + let profile = toml::from_str::(&profile).unwrap(); - if !instances_dir.exists() { - std::fs::create_dir_all(&instances_dir).expect("Unable to create instances directory."); + profile_configs.insert(id, profile); } - if !mods_dir.exists() { - std::fs::create_dir_all(&mods_dir).expect("Unable to create mods directory."); - } + let mut mod_configs = HashMap::new(); - let instances = std::fs::read_dir(&instances_dir).unwrap(); - let mods = std::fs::read_dir(&mods_dir).unwrap(); - - println!("Loading instances from: {:?}", &instances_dir); - - let mut mod_configs: HashMap = HashMap::new(); - for mod_file in mods { - let mod_path = mod_file.unwrap(); - let mod_file = ConfigFile::from_file(mod_path.path().to_str().unwrap()); - let mod_name = mod_path - .path() - .with_extension("") - .file_name() - .unwrap() - .to_str() - .unwrap() - .to_string(); - - if let ConfigFile::Mod(mut mod_file) = mod_file { - mod_file.config_path = mod_path - .path() - .canonicalize() - .expect("Unable to locate config file.") - .to_str() - .unwrap() - .to_string(); - mod_configs.insert(mod_name, mod_file); - } else { - panic!("Instance file found in mods directory."); + for mod_ in paths::read_dir(&mods_config_dir) { + if !mod_.path().to_string_lossy().ends_with(".toml") { + continue; } - } + let id = mod_.file_name().to_string_lossy().replace(".toml", ""); - let mut instance_configs: HashMap = HashMap::new(); - for instance_file in instances { - let instance_path = instance_file.unwrap(); - let instance_file = ConfigFile::from_file(instance_path.path().to_str().unwrap()); - let instance_name = instance_path - .path() - .with_extension("") - .file_name() - .unwrap() - .to_str() - .unwrap() - .to_string(); - - if let ConfigFile::Instance(mut instance_file) = instance_file { - instance_file.config_path = instance_path - .path() - .canonicalize() - .expect("Unable to locate config file.") - .to_str() - .unwrap() - .to_string(); - - instance_file.profile_path = instance_file - .profile - .as_ref() - .map(|profile| profiles_dir.join(profile).to_str().unwrap().to_string()); - - instance_configs.insert(instance_name, instance_file); - } else { - panic!("Mod file found in instances directory."); - } + let mod_ = std::fs::read_to_string(mod_.path()).unwrap(); + let mod_ = toml::from_str::(&mod_).unwrap(); + + mod_configs.insert(id, mod_.r#mod); } + dbg!(&profile_configs); + Config { + profiles: profile_configs, mods: mod_configs, - instances: instance_configs, } } } @@ -146,8 +93,14 @@ impl ConfigFile { } } -#[derive(Debug, Deserialize)] +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct InstanceConfig { + pub instance: Instance, +} + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] pub struct Instance { + pub id: String, /// The display name of the instance. (e.g. "Vencord", "Moonlight", "My Custom Instance") /// /// Can be duplicate, but not recommended for clarity. @@ -156,43 +109,31 @@ pub struct Instance { /// A path to the icon to use for the mod. pub icon: Option, - /// The custom profile to use. - /// This will run a unique chrome profile for the mod, - /// allowing for multiple instances of Discord to run at the same time. - pub profile: Option, - /// The identifier of the mod to use for this instance. - pub r#mod: String, - - // pub description: String, - pub path: String, - - #[serde(skip, default)] - pub is_valid: bool, - - #[serde(skip, default)] - pub config_path: String, + pub mod_id: String, +} - #[serde(skip, default)] - pub profile_path: Option, +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct ModConfig { + pub r#mod: Mod, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Serialize, Deserialize, Clone)] pub struct Mod { /// The display name of the mod. (e.g. "Vencord", "Moonlight", "BetterDiscord") /// /// Can be duplicate, but not recommended for clarity. pub name: String, - /// A path to the icon to use for the mod. - pub icon: Option, - /// The path to the mod's dist folder. (e.g. "/path/to/moonlight") pub path: String, /// The entrypoint of the mod. (e.g. "injector.js", "patcher.js") pub entrypoint: String, + /// A path to the icon to use for the mod. + pub icon: Option, + /// Provide custom loader JS to be injected into the ASAR index.js. pub loader: Option, @@ -210,10 +151,9 @@ pub struct Mod { /// /// - `__CUSTOM_PROFILE_DIR__`: The directory of the custom profile. /// - `__MOD_ENTRYPOINT_FILE__`: The entrypoint file of the mod. -#[derive(Debug, Deserialize)] +#[derive(Debug, Serialize, Deserialize, Clone)] pub struct ModLoader { pub prefix: Option, - pub profile: Option, #[serde(default = "default_require")] pub require: Option, pub suffix: Option, @@ -222,3 +162,30 @@ pub struct ModLoader { fn default_require() -> Option { Some(r#"require("__MOD_ENTRYPOINT_FILE__")"#.to_string()) } + +// [profile] +// name = "test" +// [[instance]] +// ... + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct ProfileConfig { + pub profile: Profile, + + #[serde(rename = "instance")] + pub instances: Vec, + + pub discord: Discord, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Profile { + pub name: String, + #[serde(default)] + pub use_default_profile: bool, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Discord { + pub executable: String, +} diff --git a/crates/libdiscord-modloader/src/lib.rs b/crates/libdiscord-modloader/src/lib.rs index 02ef0f2..43dca1f 100644 --- a/crates/libdiscord-modloader/src/lib.rs +++ b/crates/libdiscord-modloader/src/lib.rs @@ -1,5 +1,9 @@ pub mod config; pub mod discord; +pub mod paths; + +use libc::MOD_FREQUENCY; +use paths::ensure_dir; #[cfg(target_os = "linux")] mod unix; @@ -15,102 +19,102 @@ pub use unix::*; #[allow(unused_imports)] pub use windows::*; -pub fn get_or_write_cache(instance: &config::Instance, mod_: &config::Mod) -> String { - let cache_dir = dirs::cache_dir().unwrap().join("discord-modloader"); - if !cache_dir.exists() { - std::fs::create_dir_all(&cache_dir).unwrap(); - } +pub fn init_current_cache(cfg: &config::Config, profile_id: &str, instance_id: &str) -> String { + static ASAR_CUSTOM_PROFILE_JS: &str = include_str!("./asar/custom_profile.js"); + static ASAR_PACKAGE_JSON: &str = include_str!("./asar/package.json"); + + let asar_dir = ensure_dir(paths::data_asar_dir()); + + let profile = cfg + .profiles + .get(profile_id) + .expect(&format!("Failed to find profile '{}'.", profile_id)); + + let instance = profile + .instances + .iter() + .find(|instance| instance.id == instance_id) + .expect(&format!("Failed to find instance '{}'.", instance_id)); + + let r#mod = cfg + .mods + .get(&instance.mod_id) + .expect(&format!("Failed to find mod '{}'.", instance.mod_id)); + + let asar_cache_path = asar_dir.join(format!( + "{}-{}-{}.asar", + profile_id, instance_id, instance.mod_id + )); + + let profile_dir = if profile.profile.use_default_profile { + let profile_dir = ensure_dir(paths::data_profiles_dir().join(profile_id)); + let profile_dir = profile_dir.to_str().unwrap().replace("\\", "\\\\"); + Some(profile_dir) + } else { + None + }; - let asar_dir = cache_dir.join("asar"); - if !asar_dir.exists() { - std::fs::create_dir_all(&asar_dir).unwrap(); + let mod_entrypoint = std::path::Path::new(&r#mod.path).join(&r#mod.entrypoint); + let mod_entrypoint = mod_entrypoint.to_str().unwrap().replace("\\", "\\\\"); + + let mut custom_loader = String::from("console.log(\"Launching with Discord Modloader.\");\n"); + + // If using a custom profile directory, insert this. + if let Some(ref profile_dir) = profile_dir { + let data = ASAR_CUSTOM_PROFILE_JS + .replace("__CUSTOM_PROFILE_DIR__", &profile_dir) + .replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint); + + custom_loader.push_str(&data); } - let cached_asar_path = asar_dir.join(format!("{}-{}.asar", instance.r#mod, mod_.name)); - // TODO: Figure out a way to cache, while also regenerating if the mod or instance config changes. - // if cached_asar_path.exists() { - // return cached_asar_path.to_str().unwrap().to_owned(); - // } + if let Some(ref loader) = r#mod.loader { + // Users can provide a custom prefix in the profile TOML. + if let Some(ref prefix) = loader.prefix { + let mut prefix = prefix.replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint); - static ASAR_CUSTOM_PROFILE_JS: &str = include_str!("./asar/custom_profile.js"); + if let Some(ref profile_dir) = profile_dir { + prefix = prefix.replace("__CUSTOM_PROFILE_DIR__", &profile_dir); + } - if let Some(ref profile) = instance.profile_path { - let profile_path = std::path::Path::new(profile); - if !profile_path.exists() { - std::fs::create_dir_all(profile_path).unwrap(); + custom_loader.push_str(&prefix); } - } - let mod_entrypoint = std::path::Path::new(&mod_.path).join(&mod_.entrypoint); - let mod_entrypoint = mod_entrypoint.to_str().unwrap().replace("\\", "\\\\"); + // If the user provides a custom require, use that instead of the default. + if let Some(ref require) = loader.require { + let mut require = require.replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint); - let profile_dir = instance - .profile_path - .clone() - .unwrap_or_default() - .replace("\\", "\\\\"); + if let Some(ref profile_dir) = profile_dir { + require = require.replace("__CUSTOM_PROFILE_DIR__", &profile_dir); + } - dbg!(&profile_dir); + custom_loader.push_str(&require); + } else { + custom_loader.push_str(&format!(r#"require("{}")"#, &mod_entrypoint)); + } - let profile_loader = instance.profile.as_ref().map(|_| { - ASAR_CUSTOM_PROFILE_JS - .replace("__CUSTOM_PROFILE_DIR__", &profile_dir) - .replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint) - }); - - let custom_loader = if let Some(loader) = &mod_.loader { - let prefix = loader - .prefix - .as_ref() - .map(|p| { - p.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) - .replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint) - }) - .unwrap_or_default(); - - let custom_profile = loader - .profile - .as_ref() - .map(|p| { - p.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) - .replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint) - }) - .unwrap_or(profile_loader.unwrap_or_default()); - - let require = loader - .require - .as_ref() - .map(|r| { - r.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) - .replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint) - }) - .unwrap_or(format!(r#"require("{}")"#, &mod_entrypoint)); - - let suffix = loader - .suffix - .as_ref() - .map(|s| { - s.replace("__CUSTOM_PROFILE_DIR__", &profile_dir) - .replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint) - }) - .unwrap_or_default(); - - format!("{}\n{}\n{}\n{}", prefix, custom_profile, require, suffix) + // If the user provices a custom suffix, insert it. + if let Some(ref suffix) = loader.suffix { + let mut suffix = suffix.replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint); + + if let Some(ref profile_dir) = profile_dir { + suffix = suffix.replace("__CUSTOM_PROFILE_DIR__", &profile_dir); + } + + custom_loader.push_str(&suffix); + } } else { - format!( - "{}\nrequire(\"{}\")", - profile_loader.unwrap_or_default(), - mod_entrypoint - ) - }; + custom_loader.push_str(&format!(r#"require("{}");"#, &mod_entrypoint)); + } let mut asar = asar::AsarWriter::new(); + asar.write_file("index.js", custom_loader, false).unwrap(); - asar.write_file("package.json", include_bytes!("./asar/package.json"), false) + asar.write_file("package.json", ASAR_PACKAGE_JSON, false) .unwrap(); - asar.finalize(std::fs::File::create(&cached_asar_path).unwrap()) + asar.finalize(std::fs::File::create(&asar_cache_path).unwrap()) .unwrap(); - cached_asar_path.to_str().unwrap().to_owned() + asar_cache_path.to_str().unwrap().to_owned() } diff --git a/crates/libdiscord-modloader/src/paths.rs b/crates/libdiscord-modloader/src/paths.rs new file mode 100644 index 0000000..3626354 --- /dev/null +++ b/crates/libdiscord-modloader/src/paths.rs @@ -0,0 +1,59 @@ +static APP_NAME: &str = "discord-modloader"; + +/// Create a directory if it doesn't exist. +pub fn ensure_dir(dir: std::path::PathBuf) -> std::path::PathBuf { + if !dir.exists() { + std::fs::create_dir_all(&dir).expect(&format!( + "Failed to create path. Make sure you have permissions. {}", + dir.display() + )); + } + dir +} + +/// The config directory for this application. +pub fn configs_dir() -> std::path::PathBuf { + dirs::config_local_dir() + .expect("Failed to get config dir") + .join(APP_NAME) +} + +/// The profiles config directory. +pub fn config_profile_dir() -> std::path::PathBuf { + configs_dir().join("profiles") +} + +/// The mods config directory. +pub fn config_mods_dir() -> std::path::PathBuf { + configs_dir().join("mods") +} + +/// The data directory for this application. +pub fn data_dir() -> std::path::PathBuf { + dirs::data_dir() + .expect("Failed to get data dir") + .join(APP_NAME) +} + +/// The asar cache directory. +pub fn data_asar_dir() -> std::path::PathBuf { + data_dir().join("asar") +} + +/// The asar path for a profile, instance, and mod. +pub fn data_asar_path(profile_id: &str, instance_id: &str, mod_id: &str) -> std::path::PathBuf { + data_asar_dir().join(format!("{}-{}-{}.asar", profile_id, instance_id, mod_id)) +} + +/// The profiles data directory. +pub fn data_profiles_dir() -> std::path::PathBuf { + data_dir().join("profiles") +} + +/// Read a directory and return a vector of DirEntry. Panic if it fails. +pub fn read_dir(path: &std::path::Path) -> Vec { + std::fs::read_dir(path) + .expect(&format!("Failed to read directory: {}", path.display())) + .collect::, _>>() + .expect(&format!("Failed to read directory: {}", path.display())) +} diff --git a/crates/libdiscord-modloader/src/windows.rs b/crates/libdiscord-modloader/src/windows.rs index ca1a5d3..b29a409 100644 --- a/crates/libdiscord-modloader/src/windows.rs +++ b/crates/libdiscord-modloader/src/windows.rs @@ -250,7 +250,7 @@ unsafe extern "C" fn create_process_w( ); if success != 1 { - eprintln!("[ModHook] Failed to create process"); + eprintln!("[Discord Modloader] Failed to create process"); return success; } diff --git a/src/main.rs b/src/main.rs index 2d72bd0..1c54ace 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,14 @@ use clap::Parser; -use discord_modloader::{config, get_or_write_cache}; +use discord_modloader::{config, init_current_cache}; #[derive(clap::Parser, Debug)] struct Args { #[clap(short, long)] - pub instance: String, + pub profile: Option, + + #[clap(short, long)] + pub instance: Option, } #[cfg(target_os = "macos")] @@ -16,33 +19,57 @@ fn main() { #[cfg(not(target_os = "macos"))] fn main() { - let mut config = config::Config::init(); - config.validate(); - + // TODO: Check if args are provided. If yes, don't load GUI. let args: Args = Args::parse(); - if let Some(instance) = config.instances.get(&args.instance) { - unsafe { load_profile(&config, instance) }; + if let (Some(profile_id), Some(instance_id)) = (args.profile, args.instance) { + let mut config = config::Config::init(); + config.validate(); + + unsafe { load_profile(&config, &profile_id, &instance_id) }; } else { - println!("Instance not found. Make sure it exists in the instances directory."); + gui::start_gui(); } } #[cfg(target_os = "linux")] -unsafe fn load_profile(config: &config::Config, instance: &config::Instance) { - println!("Loading Instance: {}", instance.name); - if let Some(ref profile_path) = instance.profile_path { - println!("On profile: {}", profile_path) - } +unsafe fn load_profile(config: &config::Config, profile_id: &str, instance_id: &str) { + use discord_modloader::paths::{self, ensure_dir}; - let asar_path = get_or_write_cache(instance, config.mods.get(&instance.r#mod).unwrap()); + let profile = config + .profiles + .get(profile_id) + .expect(&format!("Failed to find profile '{}'.", profile_id)); + // Try to use the local instance of libdiscord_modloader.so first. let current_exe = std::env::current_exe().unwrap(); - let shared_object = current_exe.with_file_name("libdiscord_modloader.so"); + let mut shared_object = current_exe.with_file_name("libdiscord_modloader.so"); + + // If it doesn't exist, try to use the system-wide one. + if !shared_object.exists() { + let lib_path = std::path::PathBuf::from("/usr/lib/discord-modloader"); + shared_object = lib_path.join("libdiscord_modloader.so"); + if !shared_object.exists() { + panic!("libdiscord_modloader.so not found. Please report this on GitHub."); + } + } + + let asar_path = init_current_cache(config, profile_id, instance_id); + + let working_dir = if profile.profile.use_default_profile { + std::path::Path::new(&profile.discord.executable) + .parent() + .unwrap() + .to_str() + .unwrap() + .to_string() + } else { + let profile_dir = ensure_dir(paths::data_profiles_dir().join(profile_id)); + profile_dir.to_str().unwrap().to_string() + }; - let mut target = std::process::Command::new(instance.path.clone()) - .current_dir(std::path::Path::new(&instance.path).parent().unwrap()) - // TODO: move libmodhook.so into global libs dir + let mut target = std::process::Command::new(&profile.discord.executable) + .current_dir(working_dir) .env("LD_PRELOAD", shared_object.to_str().unwrap()) .env("MODLOADER_ASAR_PATH", asar_path) // .args(["--trace-warnings"]) @@ -70,7 +97,7 @@ unsafe fn load_profile(config: &config::Config, instance: &config::Instance) { println!("On profile: {}", profile_path) } - let asar_path = get_or_write_cache(instance, config.mods.get(&instance.r#mod).unwrap()); + let asar_path = init_current_cache(instance, config.mods.get(&instance.r#mod).unwrap()); let current_exe = std::env::current_exe().unwrap(); let lp_current_directory = current_exe.parent().unwrap().to_str().unwrap(); From 15c9d89928d23c5fb03ee4b38c96aa2a0a03cd06 Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Sat, 25 Jan 2025 18:04:41 +0000 Subject: [PATCH 19/20] wip: gui --- .cargo/config.toml | 20 + Cargo.lock | 2921 +++++++++++++---- Cargo.toml | 3 + assets/{ => favicons}/1024x1024.png | Bin assets/{ => favicons}/128x128.png | Bin assets/{ => favicons}/256x256.png | Bin assets/{ => favicons}/32x32.png | Bin assets/{ => favicons}/512x512.png | Bin assets/{ => favicons}/64x64.png | Bin assets/{ => favicons}/logo_development.ico | 0 assets/{ => favicons}/logo_development.png | Bin assets/{ => favicons}/logo_development.svg | 0 assets/fonts/Inter-Variable.ttf | Bin 0 -> 874708 bytes assets/icons/circle-question.svg | 1 + assets/icons/discord.svg | 1 + assets/icons/floppy-disk.svg | 1 + assets/icons/folder.svg | 1 + assets/icons/gear.svg | 1 + assets/icons/github.svg | 1 + assets/icons/home.svg | 1 + assets/icons/pen.svg | 1 + assets/icons/play.svg | 1 + assets/icons/plus.svg | 1 + assets/icons/stop.svg | 1 + assets/icons/trash.svg | 1 + {.github => assets}/workflows/build.yml | 0 configs/templates/moonlight.toml | 10 +- crates/gui-new/Cargo.toml | 27 + crates/gui-new/src/app.rs | 172 + crates/gui-new/src/assets.rs | 126 + crates/gui-new/src/components/button.rs | 117 + crates/gui-new/src/components/home_page.rs | 10 + crates/gui-new/src/components/mod.rs | 10 + .../src/components/mod_from_template_page.rs | 158 + crates/gui-new/src/components/mod_page.rs | 675 ++++ crates/gui-new/src/components/popup.rs | 128 + crates/gui-new/src/components/profile_page.rs | 424 +++ .../gui-new/src/components/settings_page.rs | 10 + crates/gui-new/src/components/sidebar.rs | 465 +++ crates/gui-new/src/constants.rs | 43 + crates/gui-new/src/lib.rs | 55 + crates/gui-new/src/utils/hoverable.rs | 54 + crates/gui-new/src/utils/icons.rs | 89 + crates/gui-new/src/utils/mod.rs | 2 + crates/gui/Cargo.toml | 19 +- crates/gui/src/components/custom_button.rs | 58 + crates/gui/src/components/main_content.rs | 21 + crates/gui/src/components/mod.rs | 3 + crates/gui/src/components/sidebar.rs | 166 + crates/gui/src/constants.rs | 9 + crates/gui/src/lib.rs | 178 +- crates/gui/src/pages/create_profile.rs | 280 ++ crates/gui/src/pages/home.rs | 22 + crates/gui/src/pages/mod.rs | 9 + crates/gui/src/pages/selected_profile.rs | 260 ++ crates/gui/src/pages/settings.rs | 157 + crates/gui/src/popups/already_launched.rs | 93 + crates/gui/src/popups/create_instance.rs | 91 + crates/gui/src/popups/delete_instance.rs | 73 + crates/gui/src/popups/delete_profile.rs | 62 + crates/gui/src/popups/launching.rs | 31 + crates/gui/src/popups/mod.rs | 25 + crates/gui/src/utils/hoverable.rs | 14 +- crates/gui/src/utils/images.rs | 82 + crates/gui/src/utils/launch.rs | 35 + crates/gui/src/utils/mod.rs | 102 + crates/libdiscord-modloader/Cargo.toml | 8 + .../src/asar/custom_profile.js | 2 +- .../libdiscord-modloader/src/asar/require.js | 11 + crates/libdiscord-modloader/src/config.rs | 174 +- crates/libdiscord-modloader/src/lib.rs | 79 +- crates/libdiscord-modloader/src/paths.rs | 49 +- crates/libdiscord-modloader/src/unix.rs | 10 +- crates/libdiscord-modloader/src/updater.rs | 129 + crates/libdiscord-modloader/src/utils.rs | 82 + src/main.rs | 52 +- 76 files changed, 6938 insertions(+), 979 deletions(-) rename assets/{ => favicons}/1024x1024.png (100%) rename assets/{ => favicons}/128x128.png (100%) rename assets/{ => favicons}/256x256.png (100%) rename assets/{ => favicons}/32x32.png (100%) rename assets/{ => favicons}/512x512.png (100%) rename assets/{ => favicons}/64x64.png (100%) rename assets/{ => favicons}/logo_development.ico (100%) rename assets/{ => favicons}/logo_development.png (100%) rename assets/{ => favicons}/logo_development.svg (100%) create mode 100644 assets/fonts/Inter-Variable.ttf create mode 100644 assets/icons/circle-question.svg create mode 100644 assets/icons/discord.svg create mode 100644 assets/icons/floppy-disk.svg create mode 100644 assets/icons/folder.svg create mode 100644 assets/icons/gear.svg create mode 100644 assets/icons/github.svg create mode 100644 assets/icons/home.svg create mode 100644 assets/icons/pen.svg create mode 100644 assets/icons/play.svg create mode 100644 assets/icons/plus.svg create mode 100644 assets/icons/stop.svg create mode 100644 assets/icons/trash.svg rename {.github => assets}/workflows/build.yml (100%) create mode 100644 crates/gui-new/Cargo.toml create mode 100644 crates/gui-new/src/app.rs create mode 100644 crates/gui-new/src/assets.rs create mode 100644 crates/gui-new/src/components/button.rs create mode 100644 crates/gui-new/src/components/home_page.rs create mode 100644 crates/gui-new/src/components/mod.rs create mode 100644 crates/gui-new/src/components/mod_from_template_page.rs create mode 100644 crates/gui-new/src/components/mod_page.rs create mode 100644 crates/gui-new/src/components/popup.rs create mode 100644 crates/gui-new/src/components/profile_page.rs create mode 100644 crates/gui-new/src/components/settings_page.rs create mode 100644 crates/gui-new/src/components/sidebar.rs create mode 100644 crates/gui-new/src/constants.rs create mode 100644 crates/gui-new/src/lib.rs create mode 100644 crates/gui-new/src/utils/hoverable.rs create mode 100644 crates/gui-new/src/utils/icons.rs create mode 100644 crates/gui-new/src/utils/mod.rs create mode 100644 crates/gui/src/components/custom_button.rs create mode 100644 crates/gui/src/components/main_content.rs create mode 100644 crates/gui/src/components/mod.rs create mode 100644 crates/gui/src/components/sidebar.rs create mode 100644 crates/gui/src/constants.rs create mode 100644 crates/gui/src/pages/create_profile.rs create mode 100644 crates/gui/src/pages/home.rs create mode 100644 crates/gui/src/pages/mod.rs create mode 100644 crates/gui/src/pages/selected_profile.rs create mode 100644 crates/gui/src/pages/settings.rs create mode 100644 crates/gui/src/popups/already_launched.rs create mode 100644 crates/gui/src/popups/create_instance.rs create mode 100644 crates/gui/src/popups/delete_instance.rs create mode 100644 crates/gui/src/popups/delete_profile.rs create mode 100644 crates/gui/src/popups/launching.rs create mode 100644 crates/gui/src/popups/mod.rs create mode 100644 crates/gui/src/utils/images.rs create mode 100644 crates/gui/src/utils/launch.rs create mode 100644 crates/libdiscord-modloader/src/asar/require.js create mode 100644 crates/libdiscord-modloader/src/updater.rs create mode 100644 crates/libdiscord-modloader/src/utils.rs diff --git a/.cargo/config.toml b/.cargo/config.toml index f72826d..b6e9273 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,2 +1,22 @@ [alias] release = "packager --release -f all -v" + +[target.x86_64-unknown-linux-gnu] +rustflags = ["-Zthreads=0", "-Zshare-generics=y", "-Clink-arg=-fuse-ld=mold"] + +[profile.release] +codegen-units = 1 +lto = "fat" +panic = "abort" +opt-level = "z" + +[profile.dev] +panic = "abort" + +[profile.fast-release] +inherits = "release" +codegen-backend = "cranelift" +codegen-units = 1 +lto = "fat" +panic = "abort" +opt-level = "z" diff --git a/Cargo.lock b/Cargo.lock index ad9e3ad..6e35c5a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,7 +38,7 @@ dependencies = [ "accesskit_consumer", "atspi-common", "serde", - "thiserror", + "thiserror 1.0.69", "zvariant", ] @@ -94,7 +94,7 @@ dependencies = [ "accesskit_consumer", "paste", "static_assertions", - "windows", + "windows 0.58.0", "windows-core 0.58.0", ] @@ -133,6 +133,17 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if 1.0.0", + "cipher", + "cpufeatures", +] + [[package]] name = "ahash" version = "0.7.8" @@ -150,7 +161,7 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "getrandom", "once_cell", "version_check", @@ -174,9 +185,9 @@ checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" [[package]] name = "allocator-api2" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-activity" @@ -185,7 +196,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.6.0", + "bitflags 2.8.0", "cc", "cesu8", "jni", @@ -196,7 +207,7 @@ dependencies = [ "ndk-context", "ndk-sys", "num_enum", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -261,25 +272,35 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "arbitrary" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "arg_enum_proc_macro" @@ -289,7 +310,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -325,16 +346,16 @@ dependencies = [ "serde_json", "serde_with", "sha2", - "thiserror", + "thiserror 1.0.69", "walkdir", "wax", ] [[package]] name = "async-broadcast" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ "event-listener", "event-listener-strategy", @@ -385,7 +406,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock", - "cfg-if", + "cfg-if 1.0.0", "concurrent-queue", "futures-io", "futures-lite", @@ -420,7 +441,7 @@ dependencies = [ "async-signal", "async-task", "blocking", - "cfg-if", + "cfg-if 1.0.0", "event-listener", "futures-lite", "rustix", @@ -435,7 +456,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -447,7 +468,7 @@ dependencies = [ "async-io", "async-lock", "atomic-waker", - "cfg-if", + "cfg-if 1.0.0", "futures-core", "futures-io", "rustix", @@ -464,13 +485,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -567,13 +588,19 @@ checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", - "cfg-if", + "cfg-if 1.0.0", "libc", "miniz_oxide 0.7.4", "object", "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" @@ -586,10 +613,10 @@ version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cexpr", "clang-sys", - "itertools 0.11.0", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", @@ -597,7 +624,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -614,9 +641,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" dependencies = [ "serde", ] @@ -639,7 +666,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -664,16 +691,6 @@ dependencies = [ "piper", ] -[[package]] -name = "bstr" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a68f1f47cdf0ec8ee4b941b2eee2a80cb796db73118c0dd09ac63fbe405be22" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "built" version = "0.7.5" @@ -688,9 +705,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" @@ -710,18 +727,39 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "calloop" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "log", "polling", "rustix", "slab", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -765,14 +803,14 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cc" -version = "1.2.1" +version = "1.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" dependencies = [ "jobserver", "libc", @@ -804,6 +842,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -827,17 +871,56 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", "serde", + "wasm-bindgen", "windows-targets 0.52.6", ] +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clang-sys" version = "1.8.1" @@ -851,9 +934,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.21" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" +checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" dependencies = [ "clap_builder", "clap_derive", @@ -861,9 +944,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.21" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" dependencies = [ "anstream", "anstyle", @@ -873,21 +956,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] name = "clap_lex" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "clipboard-win" @@ -896,7 +979,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fdf5e01086b6be750428ba4a40619f847eb2e95756eee84b18e06e5f0b50342" dependencies = [ "lazy-bytes-cast", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -957,26 +1040,63 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen", +] + +[[package]] +name = "const-serialize" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08259976d62c715c4826cb4a3d64a3a9e5c5f68f964ff6087319857f569f93a6" +dependencies = [ + "const-serialize-macro", + "serde", +] + +[[package]] +name = "const-serialize-macro" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04382d0d9df7434af6b1b49ea1a026ef39df1b0738b1cc373368cf175354f6eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "const_format" -version = "0.2.33" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" dependencies = [ "const_format_proc_macros", ] [[package]] name = "const_format_proc_macros" -version = "0.2.33" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "constcat" version = "0.3.1" @@ -1016,6 +1136,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1029,7 +1159,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "core-graphics-types", "foreign-types 0.5.0", "libc", @@ -1042,7 +1172,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "libc", ] @@ -1056,28 +1186,34 @@ dependencies = [ ] [[package]] -name = "crc32fast" -version = "1.4.2" +name = "crc" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" dependencies = [ - "cfg-if", + "crc-catalog", ] [[package]] -name = "crossbeam-channel" -version = "0.5.13" +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ - "crossbeam-utils", + "cfg-if 1.0.0", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1094,15 +1230,15 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-common" @@ -1110,7 +1246,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array 0.14.7", + "generic-array", "typenum", ] @@ -1141,7 +1277,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -1152,9 +1288,34 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.89", + "syn 2.0.96", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if 1.0.0", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", ] +[[package]] +name = "data-encoding" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f" + +[[package]] +name = "deflate64" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" + [[package]] name = "deranged" version = "0.3.11" @@ -1165,6 +1326,17 @@ dependencies = [ "serde", ] +[[package]] +name = "derive_arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "detours-sys" version = "0.1.2" @@ -1174,6 +1346,16 @@ dependencies = [ "cc", ] +[[package]] +name = "dialog" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736bab36d647d14c985725a57a4110a1182c6852104536cd42f1c97e96d29bf0" +dependencies = [ + "dirs 2.0.2", + "rpassword", +] + [[package]] name = "digest" version = "0.10.7" @@ -1182,6 +1364,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] @@ -1190,13 +1373,33 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e7fe217b50d43b27528b0f24c89b411f742a3e7564d1cfbf85253f967954db" dependencies = [ + "dioxus-core 0.5.6", + "dioxus-core-macro 0.5.6", + "dioxus-hooks 0.5.6", + "dioxus-signals 0.5.7", +] + +[[package]] +name = "dioxus" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7d69c4bd197db4739654af0a37c426417b45d5f495df8d10fafeb5da846dca" +dependencies = [ + "dioxus-cli-config 0.6.2", "dioxus-config-macro", - "dioxus-core", - "dioxus-core-macro", - "dioxus-hooks", - "dioxus-hot-reload", - "dioxus-html", - "dioxus-signals", + "dioxus-core 0.6.2", + "dioxus-core-macro 0.6.2", + "dioxus-devtools", + "dioxus-document", + "dioxus-fullstack", + "dioxus-history", + "dioxus-hooks 0.6.2", + "dioxus-html 0.6.2", + "dioxus-logger", + "dioxus-signals 0.6.2", + "dioxus-web", + "manganis", + "warnings", ] [[package]] @@ -1211,6 +1414,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "dioxus-cli-config" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d20764ae5fbe886e4602fdd6f2420ed03697eccba51605926f54693bd65879f3" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "dioxus-clipboard" version = "0.1.0" @@ -1218,14 +1430,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3796f1d3dd56e6fdd6ea96221c0f639b4d688a17966d0d2f4dc883d9713813" dependencies = [ "copypasta", - "dioxus-lib", + "dioxus-lib 0.5.6", +] + +[[package]] +name = "dioxus-clipboard" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe492404c00f658d2a5f2cefa60bb9f413c65528182d4027939596fbd49583b4" +dependencies = [ + "copypasta", + "dioxus-lib 0.6.2", ] [[package]] name = "dioxus-config-macro" -version = "0.5.6" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb1a1aa34cc04c1f7fcbb7a10791ba773cc02d834fe3ec1fe05647699f3b101f" +checksum = "75cbf582fbb1c32d34a1042ea675469065574109c95154468710a4d73ee98b49" dependencies = [ "proc-macro2", "quote", @@ -1239,7 +1461,7 @@ checksum = "3730d2459ab66951cedf10b09eb84141a6eda7f403c28057cbe010495be156b7" dependencies = [ "futures-channel", "futures-util", - "generational-box", + "generational-box 0.5.6", "longest-increasing-subsequence", "rustc-hash 1.1.0", "serde", @@ -1249,6 +1471,27 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "dioxus-core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f0eb105e433754659d8e2dd8ac4590aae92f4f2e13770b49700fdc08e87d2c" +dependencies = [ + "const_format", + "dioxus-core-types", + "futures-channel", + "futures-util", + "generational-box 0.6.2", + "longest-increasing-subsequence", + "rustc-hash 1.1.0", + "rustversion", + "serde", + "slab", + "slotmap", + "tracing", + "warnings", +] + [[package]] name = "dioxus-core-macro" version = "0.5.6" @@ -1257,11 +1500,33 @@ checksum = "0d9c0dfe0e6a46626fa716c4aa1d2ccb273441337909cfeacad5bb6fcfb947d2" dependencies = [ "constcat", "convert_case", - "dioxus-rsx", + "dioxus-rsx 0.5.6", "prettyplease", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", +] + +[[package]] +name = "dioxus-core-macro" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a798c5538481e6bc831514a5dd10ee53e3df12fd13a88d64e787e0268443adcd" +dependencies = [ + "convert_case", + "dioxus-rsx 0.6.2", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "dioxus-core-types" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91a82fccfa48574eb7aa183e297769540904694844598433a9eb55896ad9f93b" +dependencies = [ + "once_cell", ] [[package]] @@ -1271,88 +1536,244 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ea539174bb236e0e7dc9c12b19b88eae3cb574dedbd0252a2d43ea7e6de13e2" [[package]] -name = "dioxus-hooks" -version = "0.5.6" +name = "dioxus-devtools" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa8f9c661eea82295219d25555d5c0b597e74186b029038ceb5e3700ccbd4380" +checksum = "712a7300f1e8181218187b03502044157eef04e0a25b518117c5ef9ae1096880" dependencies = [ - "dioxus-core", - "dioxus-debug-cell", - "dioxus-signals", - "futures-channel", - "futures-util", - "generational-box", - "slab", - "thiserror", + "dioxus-core 0.6.2", + "dioxus-devtools-types", + "dioxus-signals 0.6.2", + "serde", + "serde_json", "tracing", + "tungstenite", + "warnings", ] [[package]] -name = "dioxus-hot-reload" -version = "0.5.6" +name = "dioxus-devtools-types" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77d01246cb1b93437fb0bbd0dd11cfc66342d86b4311819e76654f2017ce1473" +checksum = "f62434973c0c9c5a3bc42e9cd5e7070401c2062a437fb5528f318c3e42ebf4ff" dependencies = [ - "chrono", - "dioxus-core", - "dioxus-html", - "dioxus-rsx", - "execute", - "ignore", - "interprocess-docfix", - "notify", - "once_cell", + "dioxus-core 0.6.2", "serde", - "serde_json", ] [[package]] -name = "dioxus-html" -version = "0.5.6" +name = "dioxus-document" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f01a0826f179adad6ea8d6586746e8edde0c602cc86f4eb8e5df7a3b204c4018" +checksum = "f195e3027dea214d34fd87c8189470cf24ef3f9ff10b13675cc9d80e0db07517" dependencies = [ - "async-trait", - "dioxus-core", - "dioxus-html-internal-macro", - "dioxus-rsx", - "enumset", - "euclid", + "dioxus-core 0.6.2", + "dioxus-core-macro 0.6.2", + "dioxus-core-types", + "dioxus-html 0.6.2", "futures-channel", - "generational-box", - "keyboard-types", + "futures-util", + "generational-box 0.6.2", + "lazy-js-bundle", "serde", - "serde-value", "serde_json", - "serde_repr", "tracing", - "web-sys", ] [[package]] -name = "dioxus-html-internal-macro" -version = "0.5.6" +name = "dioxus-fullstack" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b96f35a608d0ab8f4ca6f66ce1828354e4ebd41580b12454f490221a11da93c" +checksum = "aa2da12d6b6ce390bd3143f46c8441fa1a50f1428113a059b25d8fd22a3899d2" dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "syn 2.0.89", -] - -[[package]] + "base64 0.22.1", + "bytes", + "ciborium", + "dioxus-devtools", + "dioxus-history", + "dioxus-lib 0.6.2", + "dioxus-web", + "dioxus_server_macro", + "futures-channel", + "futures-util", + "generational-box 0.6.2", + "once_cell", + "serde", + "server_fn", + "tracing", +] + +[[package]] +name = "dioxus-history" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ae4e22616c698f35b60727313134955d885de2d32e83689258e586ebc9b7909" +dependencies = [ + "dioxus-core 0.6.2", + "tracing", +] + +[[package]] +name = "dioxus-hooks" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa8f9c661eea82295219d25555d5c0b597e74186b029038ceb5e3700ccbd4380" +dependencies = [ + "dioxus-core 0.5.6", + "dioxus-debug-cell", + "dioxus-signals 0.5.7", + "futures-channel", + "futures-util", + "generational-box 0.5.6", + "slab", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "dioxus-hooks" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "948e2b3f20d9d4b2c300aaa60281b1755f3298684448920b27106da5841896d0" +dependencies = [ + "dioxus-core 0.6.2", + "dioxus-signals 0.6.2", + "futures-channel", + "futures-util", + "generational-box 0.6.2", + "rustversion", + "slab", + "tracing", + "warnings", +] + +[[package]] +name = "dioxus-html" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f01a0826f179adad6ea8d6586746e8edde0c602cc86f4eb8e5df7a3b204c4018" +dependencies = [ + "async-trait", + "dioxus-core 0.5.6", + "dioxus-html-internal-macro 0.5.6", + "enumset", + "euclid", + "futures-channel", + "generational-box 0.5.6", + "keyboard-types", + "serde", + "serde-value", + "serde_json", + "serde_repr", + "tracing", + "web-sys", +] + +[[package]] +name = "dioxus-html" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "664518f9d9b7d765755e79db271562b36c271e97709ff3bc0c71234700f5e8ae" +dependencies = [ + "async-trait", + "dioxus-core 0.6.2", + "dioxus-core-macro 0.6.2", + "dioxus-core-types", + "dioxus-hooks 0.6.2", + "dioxus-html-internal-macro 0.6.2", + "enumset", + "euclid", + "futures-channel", + "generational-box 0.6.2", + "keyboard-types", + "lazy-js-bundle", + "rustversion", + "tracing", +] + +[[package]] +name = "dioxus-html-internal-macro" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b96f35a608d0ab8f4ca6f66ce1828354e4ebd41580b12454f490221a11da93c" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "dioxus-html-internal-macro" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43ba87b53688a2c9f619ecdf4b3b955bc1f08bd0570a80a0d626c405f6d14a76" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "dioxus-interpreter-js" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330707b10ca75cb0eb05f9e5f8d80217cd0d7e62116a8277ae363c1a09b57a22" +dependencies = [ + "js-sys", + "lazy-js-bundle", + "rustc-hash 1.1.0", + "sledgehammer_bindgen", + "sledgehammer_utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] name = "dioxus-lib" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bd39b2c41dd1915dcb91d914ea72d8b646f1f8995aaeff82816b862ec586ecd" dependencies = [ - "dioxus-core", - "dioxus-core-macro", - "dioxus-hooks", - "dioxus-html", - "dioxus-rsx", - "dioxus-signals", + "dioxus-core 0.5.6", + "dioxus-core-macro 0.5.6", + "dioxus-hooks 0.5.6", + "dioxus-html 0.5.6", + "dioxus-rsx 0.5.6", + "dioxus-signals 0.5.7", +] + +[[package]] +name = "dioxus-lib" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5405b71aa9b8b0c3e0d22728f12f34217ca5277792bd315878cc6ecab7301b72" +dependencies = [ + "dioxus-config-macro", + "dioxus-core 0.6.2", + "dioxus-core-macro 0.6.2", + "dioxus-document", + "dioxus-history", + "dioxus-hooks 0.6.2", + "dioxus-html 0.6.2", + "dioxus-rsx 0.6.2", + "dioxus-signals 0.6.2", + "warnings", +] + +[[package]] +name = "dioxus-logger" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "545961e752f6c8bf59c274951b3c8b18a106db6ad2f9e2035b29e1f2a3e899b1" +dependencies = [ + "console_error_panic_hook", + "dioxus-cli-config 0.6.2", + "tracing", + "tracing-subscriber", + "tracing-wasm", ] [[package]] @@ -1361,9 +1782,25 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c235c5dbeb528c0c2b0424763da812e7500df69b82eddac54db6f4975e065c5f" dependencies = [ - "dioxus-cli-config", - "dioxus-lib", - "dioxus-router-macro", + "dioxus-cli-config 0.5.6", + "dioxus-lib 0.5.6", + "dioxus-router-macro 0.5.6", + "tracing", + "url", + "urlencoding", +] + +[[package]] +name = "dioxus-router" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc284034f3fffb198a189eaaa8be854520770160d79bdc85b8ad64a8e8170433" +dependencies = [ + "dioxus-cli-config 0.6.2", + "dioxus-history", + "dioxus-lib 0.6.2", + "dioxus-router-macro 0.6.2", + "rustversion", "tracing", "url", "urlencoding", @@ -1378,7 +1815,19 @@ dependencies = [ "proc-macro2", "quote", "slab", - "syn 2.0.89", + "syn 2.0.96", +] + +[[package]] +name = "dioxus-router-macro" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb48c4f1e8fd66716191c9bd492b532de3dd0b59a278c0a35dd0755b7a05e2fc" +dependencies = [ + "proc-macro2", + "quote", + "slab", + "syn 2.0.96", ] [[package]] @@ -1387,29 +1836,112 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15c400bc8a779107d8f3a67b14375db07dbd2bc31163bf085a8e9097f36f7179" dependencies = [ - "dioxus-core", + "dioxus-core 0.5.6", "internment", "krates", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", "tracing", ] +[[package]] +name = "dioxus-rsx" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb588e05800b5a7eb90b2f40fca5bbd7626e823fb5e1ba21e011de649b45aa1" +dependencies = [ + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.96", +] + [[package]] name = "dioxus-signals" version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e3e224cd3d3713f159f0199fc088c292a0f4adb94996b48120157f6a8f8342d" dependencies = [ - "dioxus-core", + "dioxus-core 0.5.6", + "futures-channel", + "futures-util", + "generational-box 0.5.6", + "once_cell", + "parking_lot", + "rustc-hash 1.1.0", + "tracing", +] + +[[package]] +name = "dioxus-signals" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e8f8811f32274228aff06e01c891d0828f5461d33b4fa9465dc69b995fc12c1" +dependencies = [ + "dioxus-core 0.6.2", "futures-channel", "futures-util", - "generational-box", + "generational-box 0.6.2", "once_cell", "parking_lot", "rustc-hash 1.1.0", "tracing", + "warnings", +] + +[[package]] +name = "dioxus-web" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45d8e94a78633382687f2555d7c3e0da934aff3d4937d8c63b351a632befdd0c" +dependencies = [ + "async-trait", + "ciborium", + "dioxus-cli-config 0.6.2", + "dioxus-core 0.6.2", + "dioxus-core-types", + "dioxus-devtools", + "dioxus-document", + "dioxus-history", + "dioxus-html 0.6.2", + "dioxus-interpreter-js", + "dioxus-signals 0.6.2", + "futures-channel", + "futures-util", + "generational-box 0.6.2", + "js-sys", + "lazy-js-bundle", + "rustc-hash 1.1.0", + "serde", + "serde-wasm-bindgen", + "serde_json", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "dioxus_server_macro" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "371a5b21989a06b53c5092e977b3f75d0e60a65a4c15a2aa1d07014c3b2dda97" +dependencies = [ + "proc-macro2", + "quote", + "server_fn_macro", + "syn 2.0.96", +] + +[[package]] +name = "dirs" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" +dependencies = [ + "cfg-if 0.1.10", + "dirs-sys 0.3.7", ] [[package]] @@ -1418,7 +1950,27 @@ version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" dependencies = [ - "dirs-sys", + "dirs-sys 0.4.1", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys 0.5.0", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users 0.4.6", + "winapi 0.3.9", ] [[package]] @@ -1429,18 +1981,33 @@ checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" dependencies = [ "libc", "option-ext", - "redox_users", + "redox_users 0.4.6", "windows-sys 0.48.0", ] +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users 0.5.0", + "windows-sys 0.59.0", +] + [[package]] name = "discord-modloader" version = "2.0.0" dependencies = [ "clap", - "dirs", + "dirs 5.0.1", "gui", + "gui-new", + "libc", "libdiscord-modloader", + "octocrab", ] [[package]] @@ -1457,7 +2024,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -1481,6 +2048,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "easer" version = "0.3.0" @@ -1502,7 +2075,7 @@ version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -1513,9 +2086,9 @@ checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" [[package]] name = "enumflags2" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" dependencies = [ "enumflags2_derive", "serde", @@ -1523,13 +2096,13 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -1540,7 +2113,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -1561,7 +2134,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -1592,9 +2165,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ "concurrent-queue", "parking", @@ -1603,51 +2176,14 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ "event-listener", "pin-project-lite", ] -[[package]] -name = "execute" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a82608ee96ce76aeab659e9b8d3c2b787bffd223199af88c674923d861ada10" -dependencies = [ - "execute-command-macro", - "execute-command-tokens", - "generic-array 1.1.1", -] - -[[package]] -name = "execute-command-macro" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90dec53d547564e911dc4ff3ecb726a64cf41a6fa01a2370ebc0d95175dd08bd" -dependencies = [ - "execute-command-macro-impl", -] - -[[package]] -name = "execute-command-macro-impl" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce8cd46a041ad005ab9c71263f9a0ff5b529eac0fe4cc9b4a20f4f0765d8cf4b" -dependencies = [ - "execute-command-tokens", - "quote", - "syn 2.0.89", -] - -[[package]] -name = "execute-command-tokens" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69dc321eb6be977f44674620ca3aa21703cb20ffbe560e1ae97da08401ffbcad" - [[package]] name = "exr" version = "1.73.0" @@ -1657,7 +2193,7 @@ dependencies = [ "bit_field", "half", "lebe", - "miniz_oxide 0.8.0", + "miniz_oxide 0.8.3", "rayon-core", "smallvec", "zune-inflate", @@ -1675,15 +2211,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fdeflate" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] @@ -1694,7 +2230,7 @@ version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "libredox", "windows-sys 0.59.0", @@ -1713,7 +2249,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", + "miniz_oxide 0.8.3", ] [[package]] @@ -1749,7 +2285,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -1775,84 +2311,167 @@ dependencies = [ [[package]] name = "freya" -version = "0.2.2" -source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" -dependencies = [ - "dioxus", - "dioxus-core", - "dioxus-core-macro", - "dioxus-hooks", - "dioxus-hot-reload", - "dioxus-signals", - "freya-common", - "freya-components", - "freya-core", - "freya-elements", - "freya-engine", - "freya-hooks", - "freya-node-state", - "freya-renderer", +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" +dependencies = [ + "dioxus 0.6.2", + "dioxus-core 0.6.2", + "dioxus-core-macro 0.6.2", + "dioxus-hooks 0.6.2", + "dioxus-signals 0.6.2", + "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-components 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-hooks 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-renderer 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "tokio", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", +] + +[[package]] +name = "freya" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +dependencies = [ + "dioxus 0.5.6", + "dioxus-core 0.5.6", + "dioxus-core-macro 0.5.6", + "dioxus-hooks 0.5.6", + "dioxus-signals 0.5.7", + "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-components 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-hooks 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-renderer 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", "tokio", - "torin", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", ] [[package]] name = "freya-common" -version = "0.2.1" -source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" dependencies = [ "accesskit", - "dioxus-core", - "freya-engine", - "freya-native-core", + "dioxus-core 0.6.2", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", "itertools 0.13.0", - "rustc-hash 2.0.0", - "torin", + "rustc-hash 2.1.0", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "uuid", + "winit", +] + +[[package]] +name = "freya-common" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +dependencies = [ + "accesskit", + "dioxus-core 0.5.6", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "itertools 0.13.0", + "rustc-hash 2.1.0", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", "uuid", "winit", ] [[package]] name = "freya-components" -version = "0.2.1" -source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" dependencies = [ "bytes", - "dioxus", - "dioxus-router", - "freya-common", - "freya-core", - "freya-elements", - "freya-engine", - "freya-hooks", - "freya-node-state", + "dioxus 0.6.2", + "dioxus-router 0.6.2", + "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-hooks 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", "futures-util", "open", "reqwest", "tokio", - "torin", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "tracing", + "winit", +] + +[[package]] +name = "freya-components" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +dependencies = [ + "bytes", + "dioxus 0.5.6", + "dioxus-router 0.5.6", + "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-hooks 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "futures-util", + "open", + "reqwest", + "tokio", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", "tracing", "winit", ] [[package]] name = "freya-core" -version = "0.2.1" -source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" +dependencies = [ + "accesskit", + "accesskit_winit", + "dioxus-core 0.6.2", + "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "itertools 0.13.0", + "rustc-hash 2.1.0", + "smallvec", + "tokio", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "tracing", + "uuid", + "winit", +] + +[[package]] +name = "freya-core" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" dependencies = [ "accesskit", "accesskit_winit", - "dioxus-core", - "freya-common", - "freya-elements", - "freya-engine", - "freya-native-core", - "freya-node-state", + "dioxus-core 0.5.6", + "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", "itertools 0.13.0", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "smallvec", "tokio", - "torin", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", "tracing", "uuid", "winit", @@ -1860,110 +2479,202 @@ dependencies = [ [[package]] name = "freya-elements" -version = "0.2.0" -source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" +dependencies = [ + "dioxus-core 0.6.2", + "dioxus-rsx 0.6.2", + "generational-box 0.6.2", + "keyboard-types", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "winit", +] + +[[package]] +name = "freya-elements" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" dependencies = [ - "dioxus-core", - "dioxus-rsx", + "dioxus-core 0.5.6", + "dioxus-rsx 0.5.6", "keyboard-types", - "torin", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", "winit", ] [[package]] name = "freya-engine" -version = "0.2.2" -source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", + "glutin", + "skia-safe", +] + +[[package]] +name = "freya-engine" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +dependencies = [ + "bitflags 2.8.0", "glutin", "skia-safe", ] [[package]] name = "freya-hooks" -version = "0.2.1" -source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "bytes", - "dioxus-clipboard", - "dioxus-core", - "dioxus-hooks", - "dioxus-signals", + "dioxus-clipboard 0.2.0", + "dioxus-core 0.6.2", + "dioxus-hooks 0.6.2", + "dioxus-signals 0.6.2", "easer", - "freya-common", - "freya-core", - "freya-elements", - "freya-engine", - "freya-node-state", + "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", "paste", "ropey", "tokio", - "torin", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "tracing", + "uuid", + "winit", +] + +[[package]] +name = "freya-hooks" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +dependencies = [ + "bitflags 2.8.0", + "bytes", + "dioxus-clipboard 0.1.0", + "dioxus-core 0.5.6", + "dioxus-hooks 0.5.6", + "dioxus-signals 0.5.7", + "easer", + "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "paste", + "ropey", + "tokio", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "tracing", "uuid", "winit", ] [[package]] name = "freya-native-core" -version = "0.2.1" -source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" +dependencies = [ + "dioxus-core 0.6.2", + "parking_lot", + "rustc-hash 2.1.0", + "shipyard", + "smallvec", +] + +[[package]] +name = "freya-native-core" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" dependencies = [ - "dioxus-core", + "dioxus-core 0.5.6", "parking_lot", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "shipyard", "smallvec", ] [[package]] name = "freya-native-core-macro" -version = "0.2.0" -source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" +dependencies = [ + "quote", + "syn 2.0.96", +] + +[[package]] +name = "freya-native-core-macro" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" dependencies = [ "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] name = "freya-node-state" -version = "0.2.1" -source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" +dependencies = [ + "accesskit", + "bytes", + "dioxus-core 0.6.2", + "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-native-core-macro 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "nom", + "rustc-hash 2.1.0", + "serde_json", + "shipyard", + "tokio", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "tracing", + "uuid", +] + +[[package]] +name = "freya-node-state" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" dependencies = [ "accesskit", "bytes", - "dioxus-core", - "freya-common", - "freya-engine", - "freya-native-core", - "freya-native-core-macro", + "dioxus-core 0.5.6", + "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-native-core-macro 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", "nom", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "serde_json", "shipyard", "tokio", - "torin", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", "tracing", "uuid", ] [[package]] name = "freya-renderer" -version = "0.2.1" -source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" dependencies = [ "accesskit", "accesskit_winit", - "dioxus-core", - "dioxus-hot-reload", - "freya-common", - "freya-core", - "freya-elements", - "freya-engine", - "freya-hooks", - "freya-native-core", - "freya-node-state", + "dioxus-core 0.6.2", + "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-hooks 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", "futures-task", "futures-util", "gl", @@ -1974,19 +2685,56 @@ dependencies = [ "pin-utils", "raw-window-handle", "tokio", - "torin", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", "tracing", "uuid", "winit", ] [[package]] -name = "fsevent-sys" -version = "4.1.0" +name = "freya-renderer" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +dependencies = [ + "accesskit", + "accesskit_winit", + "dioxus-core 0.5.6", + "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-hooks 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "futures-task", + "futures-util", + "gl", + "glutin", + "glutin-winit", + "image", + "itertools 0.13.0", + "pin-utils", + "raw-window-handle", + "tokio", + "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "tracing", + "uuid", + "winit", +] + +[[package]] +name = "futures" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ - "libc", + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", ] [[package]] @@ -1996,6 +2744,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -2004,6 +2753,17 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-io" version = "0.3.31" @@ -2012,9 +2772,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" dependencies = [ "fastrand", "futures-core", @@ -2031,7 +2791,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -2052,6 +2812,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -2073,22 +2834,23 @@ dependencies = [ ] [[package]] -name = "generic-array" -version = "0.14.7" +name = "generational-box" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "a673cf4fb0ea6a91aa86c08695756dfe875277a912cdbf33db9a9f62d47ed82b" dependencies = [ - "typenum", - "version_check", + "parking_lot", + "tracing", ] [[package]] name = "generic-array" -version = "1.1.1" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb8bc4c28d15ade99c7e90b219f30da4be5c88e586277e8cbe886beeb868ab2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", + "version_check", ] [[package]] @@ -2107,9 +2869,11 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -2150,33 +2914,54 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] -name = "globset" -version = "0.4.15" +name = "gloo-net" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata", - "regex-syntax", + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", ] [[package]] name = "glutin" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec69412a0bf07ea7607e638b415447857a808846c2b685a43c8aa18bc6d5e499" +checksum = "03642b8b0cce622392deb0ee3e88511f75df2daac806102597905c3ea1974848" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cfg_aliases", "cgl", - "core-foundation", + "core-foundation 0.9.4", "dispatch", "glutin_egl_sys", "glutin_glx_sys", @@ -2206,9 +2991,9 @@ dependencies = [ [[package]] name = "glutin_egl_sys" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cae99fff4d2850dbe6fb8c1fa8e4fead5525bab715beaacfccf3fb994e01c827" +checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" dependencies = [ "gl_generator", "windows-sys 0.52.0", @@ -2216,9 +3001,9 @@ dependencies = [ [[package]] name = "glutin_glx_sys" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2b2d3918e76e18e08796b55eb64e8fe6ec67d5a6b2e2a7e2edce224ad24c63" +checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" dependencies = [ "gl_generator", "x11-dl", @@ -2226,9 +3011,9 @@ dependencies = [ [[package]] name = "glutin_wgl_sys" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4e1951bbd9434a81aa496fe59ccc2235af3820d27b85f9314e279609211e2c" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" dependencies = [ "gl_generator", ] @@ -2237,11 +3022,46 @@ dependencies = [ name = "gui" version = "0.1.0" dependencies = [ - "dioxus", - "dirs", - "freya", - "itertools 0.13.0", + "dialog", + "dioxus 0.6.2", + "dirs 6.0.0", + "flate2", + "freya 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "itertools 0.14.0", + "libc", + "libdiscord-modloader", + "open", + "serde", + "serde_json", + "sysinfo", + "tar", + "toml", + "ureq", + "uuid", +] + +[[package]] +name = "gui-new" +version = "0.1.0" +dependencies = [ + "dialog", + "dioxus 0.6.2", + "dirs 6.0.0", + "flate2", + "freya 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "itertools 0.14.0", + "libc", "libdiscord-modloader", + "open", + "serde", + "serde_json", + "strum", + "sysinfo", + "tar", + "tokio", + "toml", + "ureq", + "uuid", ] [[package]] @@ -2256,7 +3076,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.6.0", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -2269,7 +3089,7 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "crunchy", ] @@ -2304,12 +3124,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hermit-abi" version = "0.4.0" @@ -2322,11 +3136,20 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -2364,9 +3187,9 @@ checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "hyper" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", @@ -2384,21 +3207,36 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http", "hyper", "hyper-util", + "log", "rustls", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", ] +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "hyper-tls" version = "0.6.0" @@ -2572,7 +3410,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -2602,22 +3440,6 @@ dependencies = [ "icu_properties", ] -[[package]] -name = "ignore" -version = "0.4.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" -dependencies = [ - "crossbeam-deque", - "globset", - "log", - "memchr", - "regex-automata", - "same-file", - "walkdir", - "winapi-util", -] - [[package]] name = "image" version = "0.25.5" @@ -2643,9 +3465,9 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" +checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" dependencies = [ "byteorder-lite", "quick-error", @@ -2685,9 +3507,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -2695,23 +3517,12 @@ dependencies = [ ] [[package]] -name = "inotify" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" -dependencies = [ - "bitflags 1.3.2", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" +name = "inout" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "libc", + "generic-array", ] [[package]] @@ -2732,40 +3543,24 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", -] - -[[package]] -name = "interprocess-docfix" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b84ee245c606aeb0841649a9288e3eae8c61b853a8cd5c0e14450e96d53d28f" -dependencies = [ - "blocking", - "cfg-if", - "futures-core", - "futures-io", - "intmap", - "libc", - "once_cell", - "rustc_version", - "spinning", - "thiserror", - "to_method", - "winapi", + "syn 2.0.96", ] [[package]] -name = "intmap" -version = "0.7.1" +name = "ipnet" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae52f28f45ac2bc96edb7714de995cffc174a395fb0abf5bff453587c980d7b9" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] -name = "ipnet" -version = "2.10.1" +name = "iri-string" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "dc0f0a572e8ffe56e2ff4f769f32ffe919282c3916799f8b68688b6030063bea" +dependencies = [ + "memchr", + "serde", +] [[package]] name = "is-docker" @@ -2792,7 +3587,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4a1b5bad6f9072935961dfbf1cced2f3d129963d091b6f69f007fe04e758ae2" dependencies = [ - "winapi", + "winapi 0.3.9", ] [[package]] @@ -2828,6 +3623,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.14" @@ -2841,11 +3645,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", - "cfg-if", + "cfg-if 1.0.0", "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.69", "walkdir", "windows-sys 0.45.0", ] @@ -2873,49 +3677,55 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] -name = "keyboard-types" -version = "0.7.0" +name = "jsonwebtoken" +version = "9.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" dependencies = [ - "bitflags 2.6.0", + "base64 0.21.7", + "js-sys", + "pem", + "ring", "serde", - "unicode-segmentation", + "serde_json", + "simple_asn1", ] [[package]] -name = "khronos_api" -version = "3.1.0" +name = "kernel32-sys" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] [[package]] -name = "kqueue" -version = "1.0.8" +name = "keyboard-types" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ - "kqueue-sys", - "libc", + "bitflags 2.8.0", + "serde", + "unicode-segmentation", ] [[package]] -name = "kqueue-sys" -version = "1.0.4" +name = "khronos_api" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" -dependencies = [ - "bitflags 1.3.2", - "libc", -] +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" [[package]] name = "krates" @@ -2936,6 +3746,12 @@ version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10257499f089cd156ad82d0a9cd57d9501fa2c989068992a97eb3c27836f206b" +[[package]] +name = "lazy-js-bundle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e49596223b9d9d4947a14a25c142a6e7d8ab3f27eb3ade269d238bb8b5c267e2" + [[package]] name = "lazy_static" version = "1.5.0" @@ -2950,9 +3766,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.167" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libdiscord-modloader" @@ -2960,13 +3776,21 @@ version = "0.1.0" dependencies = [ "asar", "detours-sys", - "dirs", + "dirs 5.0.1", + "flate2", "libc", + "octocrab", "retour", "serde", + "serde_json", + "strum", + "sysinfo", + "tar", "toml", + "ureq", "widestring", - "winapi", + "winapi 0.3.9", + "zip", ] [[package]] @@ -2981,11 +3805,11 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "windows-targets 0.52.6", ] @@ -2995,9 +3819,9 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "libc", - "redox_syscall 0.5.7", + "redox_syscall 0.5.8", ] [[package]] @@ -3012,9 +3836,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" @@ -3032,11 +3856,17 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "lockfree-object-pool" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" + [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "longest-increasing-subsequence" @@ -3053,6 +3883,16 @@ dependencies = [ "imgref", ] +[[package]] +name = "lzma-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" +dependencies = [ + "byteorder", + "crc", +] + [[package]] name = "mach2" version = "0.4.2" @@ -3071,13 +3911,49 @@ dependencies = [ "libc", ] +[[package]] +name = "manganis" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317af44b15e7605b85f04525449a3bb631753040156c9b318e6cba8a3ea4ef73" +dependencies = [ + "const-serialize", + "manganis-core", + "manganis-macro", +] + +[[package]] +name = "manganis-core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c38bee65cc725b2bba23b5dbb290f57c8be8fadbe2043fb7e2ce73022ea06519" +dependencies = [ + "const-serialize", + "dioxus-cli-config 0.6.2", + "dioxus-core-types", + "serde", +] + +[[package]] +name = "manganis-macro" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f4f71310913c40174d9f0cfcbcb127dad0329ecdb3945678a120db22d3d065" +dependencies = [ + "dunce", + "manganis-core", + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "maybe-rayon" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "rayon", ] @@ -3128,33 +4004,20 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "0.8.11" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.48.0", +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +dependencies = [ + "adler2", + "simd-adler32", ] [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi", "windows-sys 0.52.0", @@ -3167,7 +4030,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0681853891801e4763dc252e843672faf32bcfee27a0aa3b19733902af450acc" dependencies = [ "libc", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -3182,7 +4045,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -3193,13 +4056,13 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "jni-sys", "log", "ndk-sys", "num_enum", "raw-window-handle", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3229,8 +4092,8 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.6.0", - "cfg-if", + "bitflags 2.8.0", + "cfg-if 1.0.0", "cfg_aliases", "libc", "memoffset", @@ -3253,21 +4116,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" [[package]] -name = "notify" -version = "5.2.0" +name = "ntapi" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729f63e1ca555a43fe3efa4f3efdf4801c479da85b432242a7b726f353c88486" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" dependencies = [ - "bitflags 1.3.2", - "crossbeam-channel", - "filetime", - "fsevent-sys", - "inotify", - "kqueue", - "libc", - "mio 0.8.11", - "walkdir", - "windows-sys 0.45.0", + "winapi 0.3.9", ] [[package]] @@ -3277,7 +4131,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ "overload", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -3304,7 +4158,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -3354,7 +4208,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -3399,7 +4253,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "libc", "objc2", @@ -3415,7 +4269,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-core-location", @@ -3439,7 +4293,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -3481,7 +4335,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "dispatch", "libc", @@ -3506,7 +4360,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -3518,7 +4372,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -3541,7 +4395,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-cloud-kit", @@ -3573,7 +4427,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-core-location", @@ -3598,6 +4452,46 @@ dependencies = [ "memchr", ] +[[package]] +name = "octocrab" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b97f949a7cb04608441c2ddb28e15a377e8b5142c2d1835ad2686d434de8558" +dependencies = [ + "arc-swap", + "async-trait", + "base64 0.22.1", + "bytes", + "cfg-if 1.0.0", + "chrono", + "either", + "futures", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-timeout", + "hyper-util", + "jsonwebtoken", + "once_cell", + "percent-encoding", + "pin-project", + "secrecy", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "snafu", + "tokio", + "tower", + "tower-http", + "tracing", + "url", + "web-time", +] + [[package]] name = "once_cell" version = "1.20.2" @@ -3606,9 +4500,9 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "open" -version = "5.3.1" +version = "5.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ecd52f0b8d15c40ce4820aa251ed5de032e5d91fab27f7db2f40d42a8bdf69c" +checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" dependencies = [ "is-wsl", "libc", @@ -3621,8 +4515,8 @@ version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags 2.6.0", - "cfg-if", + "bitflags 2.8.0", + "cfg-if 1.0.0", "foreign-types 0.3.2", "libc", "once_cell", @@ -3638,7 +4532,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -3736,9 +4630,9 @@ version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", - "redox_syscall 0.5.7", + "redox_syscall 0.5.8", "smallvec", "windows-targets 0.52.6", ] @@ -3755,6 +4649,26 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "pem" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +dependencies = [ + "base64 0.22.1", + "serde", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -3768,34 +4682,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap 2.7.1", ] [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -3822,15 +4736,15 @@ checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "png" -version = "0.17.14" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.8.0", + "miniz_oxide 0.8.3", ] [[package]] @@ -3839,9 +4753,9 @@ version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "concurrent-queue", - "hermit-abi 0.4.0", + "hermit-abi", "pin-project-lite", "rustix", "tracing", @@ -3874,12 +4788,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.25" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -3893,13 +4807,25 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", + "version_check", +] + [[package]] name = "profiling" version = "1.0.16" @@ -3916,7 +4842,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -3955,9 +4881,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -4004,7 +4930,7 @@ dependencies = [ "av1-grain", "bitstream-io", "built", - "cfg-if", + "cfg-if 1.0.0", "interpolate_name", "itertools 0.12.1", "libc", @@ -4022,7 +4948,7 @@ dependencies = [ "rand_chacha", "simd_helpers", "system-deps", - "thiserror", + "thiserror 1.0.69", "v_frame", "wasm-bindgen", ] @@ -4079,11 +5005,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", ] [[package]] @@ -4094,7 +5020,18 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "redox_users" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +dependencies = [ + "getrandom", + "libredox", + "thiserror 2.0.11", ] [[package]] @@ -4140,11 +5077,11 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "encoding_rs", "futures-core", @@ -4173,6 +5110,7 @@ dependencies = [ "system-configuration", "tokio", "tokio-native-tls", + "tower", "tower-service", "url", "wasm-bindgen", @@ -4187,8 +5125,8 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9af44d40e2400b44d491bfaf8eae111b09f23ac4de6e92728e79d93e699c527" dependencies = [ - "cfg-if", - "generic-array 0.14.7", + "cfg-if 1.0.0", + "generic-array", "libc", "libudis86-sys", "mmap-fixed-fixed", @@ -4210,7 +5148,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", - "cfg-if", + "cfg-if 1.0.0", "getrandom", "libc", "spin", @@ -4228,6 +5166,17 @@ dependencies = [ "str_indices", ] +[[package]] +name = "rpassword" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d37473170aedbe66ffa3ad3726939ba677d83c646ad4fd99e5b4bc38712f45ec" +dependencies = [ + "kernel32-sys", + "libc", + "winapi 0.2.8", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -4242,45 +5191,50 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" - -[[package]] -name = "rustc_version" -version = "0.4.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustix" -version = "0.38.41" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.19" +version = "0.23.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" +checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" dependencies = [ + "log", "once_cell", + "ring", "rustls-pki-types", "rustls-webpki", "subtle", "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.2.0", +] + [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -4292,9 +5246,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" [[package]] name = "rustls-webpki" @@ -4307,6 +5261,12 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + [[package]] name = "ryu" version = "1.0.18" @@ -4356,14 +5316,36 @@ dependencies = [ "tiny-skia", ] +[[package]] +name = "secrecy" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" +dependencies = [ + "zeroize", +] + [[package]] name = "security-framework" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", - "core-foundation", + "bitflags 2.8.0", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.8.0", + "core-foundation 0.10.0", "core-foundation-sys", "libc", "security-framework-sys", @@ -4371,9 +5353,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -4381,18 +5363,27 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" dependencies = [ "serde", ] +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" +dependencies = [ + "futures-core", +] + [[package]] name = "serde" -version = "1.0.215" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] @@ -4407,22 +5398,33 @@ dependencies = [ "serde", ] +[[package]] +name = "serde-wasm-bindgen" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" dependencies = [ "itoa", "memchr", @@ -4430,6 +5432,27 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_qs" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0431a35568651e363364210c91983c1da5eb29404d9f0928b67d4ebcfa7d330c" +dependencies = [ + "percent-encoding", + "serde", + "thiserror 1.0.69", +] + [[package]] name = "serde_repr" version = "0.1.19" @@ -4438,7 +5461,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -4464,15 +5487,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ - "base64", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.1", "serde", "serde_derive", "serde_json", @@ -4482,14 +5505,66 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", +] + +[[package]] +name = "server_fn" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fae7a3038a32e5a34ba32c6c45eb4852f8affaf8b794ebfcd4b1099e2d62ebe" +dependencies = [ + "bytes", + "const_format", + "dashmap", + "futures", + "gloo-net", + "http", + "js-sys", + "once_cell", + "send_wrapper", + "serde", + "serde_json", + "serde_qs", + "server_fn_macro_default", + "thiserror 1.0.69", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faaaf648c6967aef78177c0610478abb5a3455811f401f3c62d10ae9bd3901a1" +dependencies = [ + "const_format", + "convert_case", + "proc-macro2", + "quote", + "syn 2.0.96", + "xxhash-rust", +] + +[[package]] +name = "server_fn_macro_default" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2aa8119b558a17992e0ac1fd07f080099564f24532858811ce04f742542440" +dependencies = [ + "server_fn_macro", + "syn 2.0.96", ] [[package]] @@ -4498,7 +5573,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest", ] @@ -4509,7 +5584,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest", ] @@ -4576,6 +5651,18 @@ dependencies = [ "quote", ] +[[package]] +name = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror 2.0.11", + "time", +] + [[package]] name = "skia-bindings" version = "0.80.0" @@ -4599,8 +5686,8 @@ version = "0.80.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f1a96bec5198699d49e9c6a46aea27033958521c971d9186ae015a0dbecb7b" dependencies = [ - "base64", - "bitflags 2.6.0", + "base64 0.22.1", + "bitflags 2.8.0", "lazy_static", "percent-encoding", "skia-bindings", @@ -4615,7 +5702,7 @@ checksum = "044dd2233c9717a74f75197f3e7f0a966db2127c0ffb5e05013b480a9b75b2c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -4627,6 +5714,35 @@ dependencies = [ "autocfg", ] +[[package]] +name = "sledgehammer_bindgen" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49e83e178d176459c92bc129cfd0958afac3ced925471b889b3a75546cfc4133" +dependencies = [ + "sledgehammer_bindgen_macro", + "wasm-bindgen", +] + +[[package]] +name = "sledgehammer_bindgen_macro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33a1b4f13e2bbf2f5b29d09dfebc9de69229ffee245aed80e3b70f9b5fd28c06" +dependencies = [ + "quote", + "syn 2.0.96", +] + +[[package]] +name = "sledgehammer_utils" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "debdd4b83524961983cea3c55383b3910fd2f24fd13a188f5b091d2d504a61ae" +dependencies = [ + "rustc-hash 1.1.0", +] + [[package]] name = "slice-pool2" version = "0.4.3" @@ -4655,7 +5771,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "calloop", "calloop-wayland-source", "cursor-icon", @@ -4663,7 +5779,7 @@ dependencies = [ "log", "memmap2", "rustix", - "thiserror", + "thiserror 1.0.69", "wayland-backend", "wayland-client", "wayland-csd-frame", @@ -4694,6 +5810,27 @@ dependencies = [ "serde", ] +[[package]] +name = "snafu" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" +dependencies = [ + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "socket2" version = "0.5.8" @@ -4710,15 +5847,6 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -[[package]] -name = "spinning" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d4f0e86297cad2658d92a707320d87bf4e6ae1050287f51d19b67ef3f153a7b" -dependencies = [ - "lock_api", -] - [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -4749,6 +5877,28 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.96", +] + [[package]] name = "subtle" version = "2.6.1" @@ -4768,9 +5918,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.89" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -4794,7 +5944,21 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", +] + +[[package]] +name = "sysinfo" +version = "0.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" +dependencies = [ + "core-foundation-sys", + "libc", + "memchr", + "ntapi", + "rayon", + "windows 0.57.0", ] [[package]] @@ -4803,8 +5967,8 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.6.0", - "core-foundation", + "bitflags 2.8.0", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -4850,12 +6014,13 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "fastrand", + "getrandom", "once_cell", "rustix", "windows-sys 0.59.0", @@ -4867,7 +6032,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +dependencies = [ + "thiserror-impl 2.0.11", ] [[package]] @@ -4878,7 +6052,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", ] [[package]] @@ -4887,7 +6072,7 @@ version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", ] @@ -4904,9 +6089,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -4925,9 +6110,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -4942,7 +6127,7 @@ dependencies = [ "arrayref", "arrayvec", "bytemuck", - "cfg-if", + "cfg-if 1.0.0", "log", "tiny-skia-path", ] @@ -4968,22 +6153,16 @@ dependencies = [ "zerovec", ] -[[package]] -name = "to_method" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c4ceeeca15c8384bbc3e011dbd8fccb7f068a440b752b7d9b32ceb0ca0e2e8" - [[package]] name = "tokio" -version = "1.41.1" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", "libc", - "mio 1.0.2", + "mio", "pin-project-lite", "socket2", "tokio-macros", @@ -4992,13 +6171,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -5013,20 +6192,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -5062,7 +6240,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.1", "serde", "serde_spanned", "toml_datetime", @@ -5071,15 +6249,68 @@ dependencies = [ [[package]] name = "torin" -version = "0.2.0" -source = "git+https://github.com/marc2332/freya.git#d7568ad4ef62b28107c5c640b9f45df91ee2880d" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" +dependencies = [ + "euclid", + "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "rustc-hash 2.1.0", + "tracing", +] + +[[package]] +name = "torin" +version = "0.3.0-rc.0" +source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" dependencies = [ "euclid", - "freya-native-core", - "rustc-hash 2.0.0", + "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "rustc-hash 2.1.0", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" +dependencies = [ + "bitflags 2.8.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", "tracing", ] +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -5092,6 +6323,7 @@ version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -5105,7 +6337,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -5120,9 +6352,9 @@ dependencies = [ [[package]] name = "tracing-error" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" dependencies = [ "tracing", "tracing-subscriber", @@ -5141,9 +6373,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "nu-ansi-term", "sharded-slab", @@ -5153,6 +6385,17 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "tracing-wasm" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" +dependencies = [ + "tracing", + "tracing-subscriber", + "wasm-bindgen", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -5161,9 +6404,27 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "ttf-parser" -version = "0.25.0" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "tungstenite" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5902c5d130972a0000f60860bfbf46f7ca3db5391eddfedd1b8728bd9dc96c0e" +checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand", + "sha1", + "thiserror 1.0.69", + "utf-8", +] [[package]] name = "typenum" @@ -5179,7 +6440,7 @@ checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" dependencies = [ "memoffset", "tempfile", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -5206,6 +6467,24 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "ureq" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" +dependencies = [ + "base64 0.22.1", + "flate2", + "log", + "once_cell", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "url", + "webpki-roots", +] + [[package]] name = "url" version = "2.5.4" @@ -5215,6 +6494,7 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -5223,6 +6503,12 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf16_iter" version = "1.0.5" @@ -5243,9 +6529,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" dependencies = [ "getrandom", ] @@ -5263,9 +6549,9 @@ dependencies = [ [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" @@ -5304,6 +6590,28 @@ dependencies = [ "try-lock", ] +[[package]] +name = "warnings" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f68998838dab65727c9b30465595c6f7c953313559371ca8bf31759b3680ad" +dependencies = [ + "pin-project", + "tracing", + "warnings-macro", +] + +[[package]] +name = "warnings-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59195a1db0e95b920366d949ba5e0d3fc0e70b67c09be15ce5abb790106b0571" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -5312,47 +6620,48 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5360,22 +6669,38 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] [[package]] name = "wax" @@ -5388,7 +6713,7 @@ dependencies = [ "nom", "pori", "regex", - "thiserror", + "thiserror 1.0.69", "walkdir", ] @@ -5412,7 +6737,7 @@ version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "rustix", "wayland-backend", "wayland-scanner", @@ -5424,7 +6749,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "cursor-icon", "wayland-backend", ] @@ -5446,7 +6771,7 @@ version = "0.32.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -5458,7 +6783,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b31cab548ee68c7eb155517f2212049dc151f7cd7910c2b66abfd31c3ee12bd" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -5471,7 +6796,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "782e12f6cd923c3c316130d56205ebab53f55d6666b7faddfad36cecaeeb4022" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -5503,9 +6828,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -5518,9 +6843,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", + "serde", "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.26.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "weezl" version = "0.1.8" @@ -5533,6 +6868,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + [[package]] name = "winapi" version = "0.3.9" @@ -5543,6 +6884,12 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -5564,6 +6911,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core 0.57.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.58.0" @@ -5583,19 +6940,42 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement 0.57.0", + "windows-interface 0.57.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "windows-implement", - "windows-interface", - "windows-result", + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", "windows-strings", "windows-targets 0.52.6", ] +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "windows-implement" version = "0.58.0" @@ -5604,7 +6984,18 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", +] + +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", ] [[package]] @@ -5615,7 +7006,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -5624,11 +7015,20 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ - "windows-result", + "windows-result 0.2.0", "windows-strings", "windows-targets 0.52.6", ] +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-result" version = "0.2.0" @@ -5644,7 +7044,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-result", + "windows-result 0.2.0", "windows-targets 0.52.6", ] @@ -5864,20 +7264,20 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winit" -version = "0.30.5" +version = "0.30.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0be9e76a1f1077e04a411f0b989cbd3c93339e1771cb41e71ac4aee95bfd2c67" +checksum = "f5d74280aabb958072864bff6cfbcf9025cf8bfacdde5e32b5e12920ef703b0f" dependencies = [ "ahash 0.8.11", "android-activity", "atomic-waker", - "bitflags 2.6.0", + "bitflags 2.8.0", "block2", "bytemuck", "calloop", "cfg_aliases", "concurrent-queue", - "core-foundation", + "core-foundation 0.9.4", "core-graphics", "cursor-icon", "dpi", @@ -5916,9 +7316,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" dependencies = [ "memchr", ] @@ -5979,9 +7379,9 @@ checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "xattr" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" dependencies = [ "libc", "linux-raw-sys", @@ -6010,7 +7410,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.8.0", "dlib", "log", "once_cell", @@ -6025,9 +7425,15 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.23" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af310deaae937e48a26602b730250b4949e125f468f11e6990be3e5304ddd96f" +checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" + +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" [[package]] name = "yoke" @@ -6049,7 +7455,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", "synstructure", ] @@ -6109,7 +7515,7 @@ checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", "zbus-lockstep", "zbus_xml", "zvariant", @@ -6124,7 +7530,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", "zvariant_utils", ] @@ -6170,7 +7576,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] [[package]] @@ -6190,7 +7596,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", "synstructure", ] @@ -6199,6 +7605,20 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] [[package]] name = "zerovec" @@ -6219,7 +7639,78 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", +] + +[[package]] +name = "zip" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae9c1ea7b3a5e1f4b922ff856a129881167511563dc219869afe3787fc0c1a45" +dependencies = [ + "aes", + "arbitrary", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "deflate64", + "displaydoc", + "flate2", + "hmac", + "indexmap 2.7.1", + "lzma-rs", + "memchr", + "pbkdf2", + "rand", + "sha1", + "thiserror 2.0.11", + "time", + "zeroize", + "zopfli", + "zstd", +] + +[[package]] +name = "zopfli" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +dependencies = [ + "bumpalo", + "crc32fast", + "lockfree-object-pool", + "log", + "once_cell", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.13+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +dependencies = [ + "cc", + "pkg-config", ] [[package]] @@ -6239,9 +7730,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" +checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" dependencies = [ "zune-core", ] @@ -6268,7 +7759,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", "zvariant_utils", ] @@ -6280,5 +7771,5 @@ checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.96", ] diff --git a/Cargo.toml b/Cargo.toml index dd6087b..917bcb4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,10 @@ repository = "https://github.com/MeguminSama/Discord-ModLoader/" clap = { version = "4.5.20", features = ["derive"] } libdiscord-modloader = { path = "crates/libdiscord-modloader" } gui = { path = "crates/gui" } +gui-new = { path = "crates/gui-new" } dirs = "5.0.1" +libc = "0.2.167" +octocrab = "0.42.1" [package.metadata.packager] product-name = "Discord Modloader" diff --git a/assets/1024x1024.png b/assets/favicons/1024x1024.png similarity index 100% rename from assets/1024x1024.png rename to assets/favicons/1024x1024.png diff --git a/assets/128x128.png b/assets/favicons/128x128.png similarity index 100% rename from assets/128x128.png rename to assets/favicons/128x128.png diff --git a/assets/256x256.png b/assets/favicons/256x256.png similarity index 100% rename from assets/256x256.png rename to assets/favicons/256x256.png diff --git a/assets/32x32.png b/assets/favicons/32x32.png similarity index 100% rename from assets/32x32.png rename to assets/favicons/32x32.png diff --git a/assets/512x512.png b/assets/favicons/512x512.png similarity index 100% rename from assets/512x512.png rename to assets/favicons/512x512.png diff --git a/assets/64x64.png b/assets/favicons/64x64.png similarity index 100% rename from assets/64x64.png rename to assets/favicons/64x64.png diff --git a/assets/logo_development.ico b/assets/favicons/logo_development.ico similarity index 100% rename from assets/logo_development.ico rename to assets/favicons/logo_development.ico diff --git a/assets/logo_development.png b/assets/favicons/logo_development.png similarity index 100% rename from assets/logo_development.png rename to assets/favicons/logo_development.png diff --git a/assets/logo_development.svg b/assets/favicons/logo_development.svg similarity index 100% rename from assets/logo_development.svg rename to assets/favicons/logo_development.svg diff --git a/assets/fonts/Inter-Variable.ttf b/assets/fonts/Inter-Variable.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e31b51e3e9388ae61767c692885e5d77ff7b5346 GIT binary patch literal 874708 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≷9WK0CApUWn4bB=meh;stxvU@ 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 z

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 z zX~Ph|ZdhLrh7HBXc)D^g1YD8;FR7SAN1k+n5s8;U#1eL1?>yV^>DGQe=CjA=^-Ex@;Ub%*zekqre2zp#^3y{e>cc7tzCcvO2- z`@X=+WuX$^#c3%a0STc2GoAH}riTg#oQe|W)(7tDt=Ul#IJH7AWL0Z^QH+0hu!d&r zR6W=>@6ngI;Dkw>UqLG7H37*qV$7Gwh`Oa38gC@!6X{6bBwS&0vS^kxEk$H*Wn~fZ z%+Q6yGel-iECWf|kf-|&fh=g{;W&8To$bf8dF%yTu zQfJ0Z@zW3Z?zdHk?)_Rb2_$S;-tM04jAD;g80TIx>FGMs4YJkC4h;5eHd zDx4=`N|4arMKxnPIZu%WC(Xl*sX~dk;f#e6d2n-u{Ci3!Iu+KY6?fZuxXW}Iey))J zV{t`Z!7dRX<$8ik(-j(5ANEU}nvWgw3&;IR*eNCDLB(OR`02@;D4Xc+O{sD7W(Ajo z3)@i6H~3{P@Pzy`7KMUBVETcf5*PhmkQ@xaQ56i!Jx+Fzjr&fH%;6A{7o`bB1Y+^@ zSTt5-4~s}*xc;<(e{8I*ZCoBkr-?MXNlby8x1GI1iaI(?oU4lS0!nIUVk(ia-;N7c zn;BwmB>O$d#bkWA8Uw!mVf>N`cq=XmeH_5!fv5iy{@$^%f_r?dtZaU>v$C+Wv#_#r zcr1MEN#N#v@bzj3sMZyH$jNA!DZ9|<>se~)ms#&{jSG;(mz3s-y6}W7sue+(Ko3Dv)RkDjSh~<__ z@%}QeLQdtE%vs@EJEad0 z5fWM^BaWqUda422tnqQ;_3Me3MY~0p6F>bFzA)e2?d)Ax-`DleKTG=S7xZ`D1r_0A zVJL-#AA#leC(e@lGINKT0v1M*=m$L#$$l4}qqyfE^8}!sB*8x$>0VycB`1aJf>V~- zh-Jwa;ZShuJ4HSG2+{petwmi;9T`Ej;M&wn)Xb3)RL#``(>fTuM?l&6FQ#=!D4?G- z7bk*3#5`%qPEqMcDsvyK1aI!6lwUCSC{58{oI>)5F_~zlYJ>7E_7l=5Z&OB!&Q355 za$s^V{znf08R(N>qGNoEV3{9pa39z5|1bd%xc6ksF>saqvnBvmXgA#T?jg2^Z@h8` z&{>VMppW+`5d9MU{DeIow9VyDnB*zJS8yx54FIj049?*An7@a_xKPi!4<3I`RN2Sx zgO4EVrk-rol$Zi;KLcd$yh&oXe{x=Qc}xD2Q$v-jZTpaZrYD+Dk7!&40|cNxIVn_#TTie&~dz-Jud2;r_cb4DpWH>AZM<=I(9Z%$wES8@=9O7%21Ec5LsxYpC9<(1q;Ayb4BC?J@9ACJTyCcpxtRJ;+B?% zhL$dkTPbpi>q(Bx&W=p(i38HK0P9m%ltHjI|9}AruFq5S;t+gEnF~9TK+wriaw9Wfo$Os^wB2;R)K!%d12kGCCk!^i!+xMK2w@*%djP-B+0*@ zSLPUer*lAM_E%|odva#HF%1Qq=*n}Q#*QFW_gqV-?{XmdQ0bt{p@iW1zrLlOJq=Ajajdmr7=)d0sCK2-o$Z;*{=P z%WiWP;`P#n6|Q1;3i%b@&5&?>%)>KK=1P%Zb4~o?^UsIm{G{t`fyR_xzxwvqYgBa! zp4|0MCW32+tC-y9NyrC6>`Neg&WyEw!OuUx{gz}?VBesgS+3$YSA6@eqkptOm#8Xo z9DU)G>t6JyP#5a`7$y5UBh=A$Vf4I^p9J(&wUM_L49{_$36B;>%bForo^WB2{J1L# zf3v_|uh{whhl27ZDD1^cBLvPu8hFSeypl=6D;Xa5yL#45x}FtXZlq@2B$MX(gNoi= ztu%u|ft!hV{s`Uaeo}qJV{`mZcF^EH*77sym6o3=4`WxV_^V%`Ad_4_b!E9%gSq8G z#CPof$Dqo^A8M$xw* zi4T5#Yt}tx)D5AJOztOOL?gJsc|W3 zsmP~B_=9Vg_%d$d`1utr%NWJ=08A*!L-E|GYn!{;J>GMpIE&{Gy0q>m-K#t|ihnib z+gu*=Y`-0}WQog-k3HkTzx)?$@xAoH|Kp>Cr$&r$RX!k8$)AoAWKa)z{slGDa%H#Uq+Uq8h;7fJ{PZ_{&_C4SCpxdU7*1 z4MSnC*ouEOXWfQ^cHZhLd)KbL@Td0Q>>?A^NoYRnXeLLHNk%)pg(e!A>~FuvkjMt~ z+a(wf^uXpJHluHMrH21Y_KSuHSL)4`%Z3e?_U!gc#}JUSw=7r=ibemZKt86x5bG*q z3cl6uN~OrUu;;Q7#a9@-L9dh&aiEH}->X-W|77yZ=k|W+dNn062|q`YQX;6X?*wCf zdZs=;1Fx^J0N}6UYZ#31S9@ssFKYYo7dDdMzYO3NHX{9N+fo2w0w2?eWa$SXB2x^6U@fzlp2VRFox>Ro=yAxx(_7ssT?FRSn6` z9#U2GMDmqZgZ!=V@sjMj?#eECyij=Nl64>=87&`?oZUWY`GLa$`&Ke7S}Dt#(j-=>?s)SGr?}CZdfI z>ztgWb_k3W;i#GhUZH-x65CaKAJZqUBqU!!_go?%fozo*3Ki(N*+2|`sIqmfl@VOk zOv_yjVi)%wG@eIEx9>KgkFA!53a{eN+F0b<)V|fiPiF+n&VwjzHOlA-!I+JOVd-QK z9{$u*!7~u2W%;2);4o76+F<{_` zcV0Fl!8GYp;n$vV1pn_p&p2Y5exQAFybZ&M%;%pn6=&DqvmS+*gzcPt@JAJFt0TGD z^B|i)|KiK_eBabku{yZ#B)aPP$|bk2YwUa59mTy%XFEykIm~*eEV%-Z#CY& zq+-r*T>aOtr(fEOXN?|}`Pjhvf4(>Bp>^Y5yRg_b19CnCITvy{V@o!d^B5TmFVMR~ z&TLbXAk9~P;u0RNQiZH(@HGKXl;0M2<-qCjL+S3J2#XSzi>oC)S9b7=6061K)zt{7 z6`z;7N;mrgY7y}Kj2Q^15|#^nWKRl+qiPAZidA2zK*(Zj$^8de&fc8i8y@)1(Bk_t zgoqbFO<(Tni3nyuvo`|U!Y(~lC}5n~8eRoxBk4R(m}%8pEUd~^#gh&a_LF5?3V24C z=$X{mpz|2fF8ygzkHDU`pQPj$pI_`6q^kJ8^P;=PEIacWp2CnuVTG)U>v(I0w@lv0 z;@)NR5vV#rDM@;4VAdn0(e}GyZ+BMSmG#KIF{WX{ij;zh27@I%aqxo%LlQU*bblmgsqy?0Oib6I7fqJ& zrDhTD(=ocd-yP!~i=;zEGd`+;-5*{<=)Rub(ehUbn-EBdkT2X#U+4XzMe-lJ+ZHzp z<14zGx(3{$Ge^?bTi&0!R8bZPG^Gf-j}Lq)W8`u8JX>Ful`dZnb-xaN>F(F0^HMz) zKHx8V**n43^&?y^?2SfWq3WUeZ#T|cuXn&pI&0&;HUT3 z44k=i$;^R;xs#u*ot*2xYB2ACJBK_n|I?RWJ@MKvZqLj$w6Z1XU~3W1E97c8*NlIX6A6i;mx)r$EAz>nqTZeknP_p17xS@u;7f=WgA7Nr7B44MkT z`wZwpPcgE`JlZmC+Bu=zg^%u?&k_De!o`PK`^hFC;pcA?AI1ci^B*u$cAEQqAwKn3GW+b9iH)%@X(+B zTz;S;Ecll6{K)w9J{3KB^vo=b&S5(;%;Ey+J_*YeAr)k8mg2+(^X7R268!_HH-LyQ znrgmiLL#CjS0SYFJ>LLkHvaWD!6PYNC?=0%K` zhwcqUuOcv)SBf}6kb#gJGzcTM+^FGOiIB6qcqjaQ{jqH+=Sa?O_$P8uj+~vhABDer zDAwWR4!^4${;Y@2@;-!>pYg^Syghfru7q5B4vRfHSBLzt2{Q`Za3;H!d9LqoM5xG9 zs5#619TD<#NEY};=B~(d<~HV?$=jY=l{*utciwE~a%bn2<=5j{pIe_-lDjBxW!?zp za#wKInA_?Qx51kR`4#DTe)knj%x^9@k-s8;FWl<4Q{l?|P5GM&0t*5`IgGpy z^Q%4u#{8{?-C9#L=QD@0fiKI6=f-luHOfK6$_6H%$DCEm@bWwplIrjek0D!s?y8ER ztru4XQ}$jd*nMEifh&di=HteHa>Fj=R%3*i&6!wXGxO->CjP~NXb1DPdqqj$MD^t$2M{lD| zY4Kq(AarU>18^P~ddAQ%`c#8i_Su3kLUcwt3^WJg|>0RDoow~uf zlN)J&9W9%?s-rQ{@A|dr9Z&UR#Vp4Qo9q3R<9+N8`IU!WZ)*4Q%Tu~*E0?*4lt)}1 z;-R>U%JuFYQ;XWdEB$(zHY!8z`f{_of4Ti)>cv;?56V+7rg*O0&E;%#bj2Uj2lwC0 z3oegPvHD_K`2gQFPvciwpH8`($~XJs@N@6-!EU@;a+ea~`i4=;hq+6qT77Zc4V6qg{IDd3kl#y`X%AdwuyB|2XbP+OFJT<;UBuzz~h0ex@zB=?!} z3LlM~-2=<3{IA=^QRUU`(*Ng)d=)cvJDUwJx8zcilzwY#c( z&ZXl+cFhl4d8@^^j+QUHIGz7h8}{!@E-k0qYccHp-JiFm=_qplxqKOmd(l|p*7B9U z^!{{@jru|^KfAtnRNs~cZ6elHcz@c+3FmE*zn)qmetmaC`!&xKw(miF}-OwRu8 zrmrpSXi44n@@*Z7>*nom`!Ug`?rcBga;p2i^4*tHFQ)kG&cz{@U!mRI$EdKKgO}-e zL-~=*Q(R2Bl0ICCesSu5@71OE)6v{6>&KePPjxiywZwDpoO*&C9Zyq!w&QVscueS} z3+0nBf7AKbr~C7%L5%yg+DdzAz$@5SQumgrc*@=ObJtJp({^=rgq8%9*Q!> zyZqX8|1ncXx%l@T9ZmC}k9TeJM*n9;KVI3dQbuRnIP=FU&-K{Ak5#t+rhMFoD(AG7 z=gM;}7RTK*)!7#JMx)A$#(p=N`;F%J@0G=kEiIc*`v3lavJH3h)O2?5{?Do}lEtB^ z?aY4sV_b~?FUZb+%y9AD{olXxJzMhVL)-I}|HQb!eSGSWb|v0>>LoKkPb~M|c4Plr zi5K?||JJOoiMjiG-)MD&-PDm+i-qy^*sF!#=rH$zsS`TRb81<~<6eJEch%HKuRry_ zKc%~N>hynCF7CZkXa2i*|F`kI(eDEP+wSjr%X4vmKXulne4rz9FQs+#+TAd99?~!J zkAJo2QU38R##5JHeC@lMy2^+C7tYsr?;X9fscSkK^S>pY`(Ks+w)YP=(%vt&k^dIy zwO@`a%>&wxeQi{KIr!c~TpNeWV}IW>WB+lh|G3`2ESGcjym#z~EIJaWJ^sG@{max| zynhD`&m1>)l<&2?C+jHB8y9ctmK(?G+Bl(o*nXuHm{ae%QrQ0--8^;Ae{Y$m?*H#C zTgOXwX}|8jHi2<*Z~cB=?)l#z=f{lUKJdeHbG1x8l=;Rd#8o*=jj`r z&-L&_InEI*4fpTQu7{5=&87XO`zv1v^zC?s(sp&_XM_H6eAqpyqLU9_-?^gemD64S zdlHnZ_m%nH_z?G*iZIky%=K}usJk?syRV1B)=aRqNZ0ziY<APT^rMiGe_ls3a=%wm($ToSckbj#;YwI>6hB#cO3c8FD^}WW!tP2FN=H0T8&G?J9_Ptr*Azuw+rtW z+sDHri%N~}+IMyz^dacXGal^Qk9Muk^Ddny`{eKbds`k?L{XQAxTjTiyPSICDDH;J zmHyn^eyc#;zw-~dcI^JL{WR`YD`-EQQ-j;W+O6%TIX}{il z(59qbn)cFm(LWrvmF0hZHSBJxECBxjSBvxiTbO%i<(M0B&+apogKq>MLMn&d7(U;} zrEVNn)ZdlRXUv#jq zzhOCE10x}geMd*oy#$|lF#D(`D0Q5ofiLRr(A~+tOOqz!2m}RxXRUmxoKU~j-lUta z!#4nx&#`j{-;hehY%C4gr|EEDB%jtB2gdnn_<%E!m80y>aWw}ueDNRi4lop&8nii90O-oJ7OBwTh;8m-8PB%;Uyl%Gc1>J9SYjlme1G-b-K8Ssl&|3nMhG*Alc>9os{xoeQ zj-lQ&+P$=L?=cjveVs^HiHQ2o$k`H z_|q!o1=5X`T6voE22TMW@FTWfIInmAIc+@X_;{oBD5QaZP2*oB3Ltg(3ejTn2YgfM zeeyYZN6-n+ko`ifuv8c(yega!CJ85nbHYaHTj@LD16h>^3Oi^f%@jj4F0Cy7L>sKN zh@sj_?NTvSyG^@8d;tG5*5F={rm(!N_|B4&>t0~3P>S9EvQ`m^CZV2A(tg~}Wj>LV zb?!sfk;>cLZ)84bi*X*HtN@R}%Ioll5n0yaT%uaIpU8bD^NCC|+<#A9M04DyQkT;g zz;%^^cXFv~2vweTr=%`aR=68emm!}9Ybf$zek1c)?Yh^e*3kXj|BU(SS>|j0$o(DM z|B(6QCW;zN9ZB=JKO6p7r2Zha45^v_8S@nl=o1u_6h3M{bprT-4t~tv!Tk@J4^4`c zwX_dSrWv#!&7y^LHEr-{8~r=|LZM1erBHcVS**OOysoTM-c}k_{12w;R8!PcHBC)d zGt^<~S=Hsy%z!-7MW`X!DF=mTnNP#HpTKvCOmx*P}}%RXJ}wO@be5q=6?qcV;DZ@h{^EtnBg-Y|8xvG zK6k4GxW7>X@eW_4yIh~sk6ifg5*7k(3?U{`PHqkT9Qp$qt1U=730gAS-K4w#9(CZM zpd{<*HXNumaG0!~$N2*CQKXmfN6F8-C)3}!3Cf;C&$yTJGO37PkNEYVzM;rGzx7C0 zk97EUEWRkelzzzLF4YL`r5e$_R2zt+Gwxi4)*Xk=9j68EDsW#4?zP~Pqfpm+qQQMU zNV9M>;Mj&dces<7oq~H3xF-=Ueck;AG-xvJXEN?*GD=hrZJ7*RnG8*ttoac4u0`4^ z`T=6>!1+%&@8)+_rMBRF!Cj@g5G#Pm88Ls2n6-%cYs9QY%v$9526Fs0V%H+}uMxYJ z1ffh-h@C^XLt4;uq{yL%arX+OpyCK{H=|yfmCnGc-Ah@0fJ+WIa^3K4yAC7DsIXH50-8r-EQ$r~ua8;S-p(BkL> z+#Tnhko;}r4{8$bAsL6K6mOsu&?a)9^b+jnHX2UjsevYWttf})!jh`!6LdO#l2+51 z^cngreV)EZm%_T%(YI+MeTS~6zo(n&Hu?eGPX9=E&_B`Lt(JF~enF4ZFX;*T6+J~y z({Jc^^c+1;Tc{f!lf^gmV43(oXGNoE6`c~GbW#G9&PsRX7Gh=pfjQcE+F~j4s=-ek(u~j>0t`Hl@Vku9`BP*o`q{-wr zQn@shG)a$1v&jb8C>zNxd7wOyd?bG%e?gjQ2n``0(_3gSd{Zs5&RFs7wXT|pOfS2By|$`Qhi*lA}7>U>MC+lU9GMrU#n}>HRP1~uDX%@ zOFf~UAm6B`)idObCO{KFzS9J1x{!04Zkk}?(!^=Zf}k0s86>EhyEH=ujpkm>eL^Qq zh2{yNvu3eosnA37y5@DEr{=es-wL;A-qE}x^wO-?tQT(8%34|It<`Be2|v|FY9oa{ z+Ei_-&{sQM`=k)2eL?%85TSiV`-%{)eN&77jny`48wI^~y>^2Tr`@RCC>XTcwL1i( zc9*tUuxL+fPYVe;StkpLf;}ntQfDtu3U;oz9%rBKTw!mv*V^msi|i}yYwa8D+w9G) zoNAmGIs5*$Yx_z2Ifv{Bbc8tiIP{JLN4oup{iL(zQmV7YQQ%zDzHcDNiar^eaU*~=N>G~z#Yvz#T)Af|isC8E7|N6Q&8% z$Y;U|;eB#I*emQME@7YW6>$sa#oqYvXJ0WxaEL?1A;J*Wk_dN;zZKUAQ^mF7R-sb- zqqtL;CGHYG66Q$3Qm!ypxZFf^KT3zCGomV;lg^1fVG26&7TG4- z#9negxu1Be{Fb~`>`en`fM}#$Xcy7MS{u=<1S>s6ixRGci#FD(hzUxZ5+^1q7R4gk z6^G&w9ZHIlB0819%3v{xwJ>6`QmT}SDauG?q?oFVRmO^G%6MhGn9f=oF+-J9SQm}dVt;j|x>6j#S|Rav z^-c9n{5!=v>O0~c>Uwp(I7t1S`aAJX^*!}Haj-_xXvDi%TO{7A>7nT<-mmGSi4sR? zESe;7oF-F~B~I4lX>J$GS-T`o*9_N;6st9lXeNu#YNl&y#5tN5G%t$tHFcT=;zG?b z&1&&g&6}Dx#RkpWns>zCYTnhnE3VaS(rgmn(!8hHBCgZCulYc1)O@b_TwJg1qwOPZ z(Au;K;=8QX5`U+CSo^TJNjq2jlK6Y=FSWlE-_tJAE)ut}R!jT?Yqi9!+TUw8i`%q+ z(EdT(u05zdB>qwRPwhX&o!VpCW8#O}o3-C+zZE~$p3|Na zcWYa;E#jZGZmnC~qr+4{{3M`XKtFLWwC*V!82^$Ck_QbOM26wZmiM8@DngI-2Qr_$ z5B*ysbjBZLd?SQF3(qqx6ov{_LXB__<`XXqqghXe`NXTx$w#4)-w6#|BX>a~^Muo^ zZxeemy%fX6`{5$QpTR{k9TlU*r^RQ*Jn=bkwpc9A5toX$vz`y(E5tS8Na*hS;v-CV z#V48WBK98fu=tF4L~If3MVFK-z9AJ#L&Wc-d!&()%KAvD3+p4LQ1p>=r9RN?Lz0te zw)8a9Y-ygcE%Hw({z+YqX4WFd z&_Eg}$1V9$EI-U_L;g8zW4t_3ouE#ZC#h4^O1T17Q7u0XOZbiajQYCzru?k>mimr7 z2R5)p{-t_UJtHrM_Uq&ZO(#v1+^C7s43hs0EgwmV<^jzcG*GifvzFe)^q3B1dQ9(S zdQ3~19@G1n9@G1w$H(YM%oID((b^Dg2%W6$sqIP2pxNPc3hR$)CDU*EDAR8`O`EID zrH^ax*4|C4pzDv&C$vv$pQJOiPidc`PibG&zC^2;-qUBaFKb_>HQM>w`Se-sLhV9Y z3rko+pVO|@uBEe?J$RU~KcNe>pK3p)uV_EhenuC< zPX11R#q5MG)qbJryGOM_UydeaWm9T_qLRW4BQ@IVyfDP;w=5X!b1?|rhPD1a8i>cxW zxI3ZAPl8$LKGo%)#_cCRAFDuad0%$Yz9z(7E(0LuxcsWr1xja#hk|)WNva%)+^ zt>xD=2-dO^e>iZnyoz?G-R0L|Ilbi7+*;m*wHV~J+*%r8ElKh_G=-+g?_!RSD{rFt zG++KbEvCitX4;<)kl&+s(Yxe7(7Wl~@>XtF@58RrMv+^FjS@}TufOc2@ zr2L5nE1xQ#(jFKu%QS>pDZLd|`ZVpWKBLx9hx&s00!>n1R9~dYu+l%!6!m>|8@*fo zQ2mhJqkg1*M29geh1E&0$#JmB59m(Ke$9Txq&ccNrkI)4DK=(xN*1i{7A0HTTN|q6 zYQwZ)N&&MyrI6X4Qp9XeDbc2DGnD??e%gM@?aU69fy@q-J79+sltFmH^SClZ`-Ju> zZ%9rv0@tNxMe-mQn%R+p0`sqh{qfW^c-DW^c+|*xTQg zmza$y3z>~6zhX9~EP{=Ft1M>Lr7UOGrMw2~Qj`_Cv%0g&DrQ~E>jC)z`O4~mI|BwQ zZ-{@f%=@9vaM*CdaMmaqI~jwGp~e^=Kf^u`YA1Y;VEl!aKwS&n_bGq#u%Q;?~r zDa;gavYRql3R973Fi&~Va>JZyfoZsDtZ9;InrWtK4&!TD(8k@g9C+Ceai#`qulAkk zxV4w5$+X3^)3lexFdbqP%jzHIOlQ35@kaqa$TeCT&BOx#dYsj1U3hKIth1c9oVJ!Q zXYS@XU%!7f4v@-bk2Cl7p=&!^hggT0qnLkv&a#6!v)OZQ-!~_N4sEnXbSRH3bB@($ z9$+479%&wLE;mm%*P83hi_9y{Yt0+Y+sw`8{pKU)ljd{gb7(IPT4YP0CB)LlqPHYi z(k%s+L6%a>7|TS;5;nDS0`}WsnuO|8F1+Q&iEw@t# zTu%O4jI@`@+_DEP3gl!t2CXZxX0^qDK8>@utQyd}@^X!XG>y1o@mS0f9+$OgBXE>i ztH8eo$6V_|+K^cBL!Ciq=w|3`h%%TB$%Y)m03SaC@t}6YXC!iG7-|^Fkh70ryt7Z6 zvmdg@Uyn1C+v5$}4ATv@hC0I{!%D+i!$!k4AE(4w%o&>PW7~0)?3cO3`iq@mf7`X; zq~RPM-vt^&jD3uHV}dc=aKvyjvHntOV!h)WbH)PCxqaWh95Gho7-TFpjxkO&K5DEs z&Nj~DDVMPj$2oh^_d8>wakFuUagXt!@tENn-YJJGadG%caR_A z61OvFI^j9T^lHyJi0Q29Y~t?3-DZ*b*W(;@i3jY%&7JJSnKK95hbJCzbi3S{L(QR% zBOYgOus4`vd{=E}=a?(G#G{Ev{lm;w&y_jVKG;6kImo`i-jYHxobA93|k25bZ zFL4li6LaQO=2aeaiND2uMQ2`T-)Y}z-o*S%++O=-F0sYq%-enF+Rm(Q&AZ!b_*#)& zF(0ria6$GU^HJveoMWZO*?Tf)KIJ*L@0(jd54+4|TE^mmsbcAA3A4mo?3PSRk!7%D zxFzT^%2>xxd!}WQquepxGR-p6F%m7)w(D@sj%#yXd%3FAPCBm1S>`b3NQN`Fx|NPa zmIapOj#~Si=+hRAFf2{>v5p+e7S_{Sc3SpY4q1*zyDVp{#HzD)vktKKwnkaa)?{lA z@KEbW>v(Iqb-K0IT4!BkU1?ow-DurrZMN=@(O8dIPg>96p>~2T&=z9rW77kr+X`%h zY^Am_wu!b!ZPm8fwt2Q?w$-*q`?SOgd!}u(ZHH}-?V#gn^mJsj)JF7La1eG%({JUtKVQBXeb*x{nS1TA_@ zuhv$YwXt9wnagwi9iw18)N^w`q^X*@Kvkd2I^z``Eo{rnkKzhWX1CMTw z-i|0}Zn7f>63gK-JLeb*n?x?4Opod1s6{-M8_RE{V{J@V^nP6(8)31{pfQ=91Ya34 z55Wjl?@Vx}I}4nHVtS#?AEW#>=a6BAp_d`TV9eQ)bBH;^+?*!(PL8t-C59nh`Ut}~ zjd7gjdG=T%7FNEI&?w5um49`#aQo@Ws_FEA}PH5ATd&hw-I=e_JXLGIAp zp{6rtV%FsjHFv|&n^8Q@Y&IvGb1s?-Mw!isa|tzfXvti2tz``SIvn1)BIbhWxbn^z zOXk9zEt$(^hivxP-nwq$U{*GQpU0&gD4bKW##&aghPmAF%*QOP2IpODmR7RM=L#2C zS6J7;-(cNp-Bq~2=WL>NpY^Quu=RxXtW9Lp+(oucw$ZtZa2{rxkXvgDwRHjx#t~|Z zu~~UYD)ZZ%EzdTPU)9eZKr@*au*dYPf&0KCG<=PONcLAp1ToO_JqvBhJ>Po!SILU7+cuD96KjWDrzoj zPMC&cCPO&SNm$@Pxkqx3B%Db&p0GTjA(13BC2V07&~|#xKzkDo`LH+ac*2?7BZ&lu zu4G|iw~~c| zXp0h8Caz7~n79q0`xB28?axb3JehdTF53h1(p%kZdr00Gd!M{9d9&?$dxAYZZ=$^b z#~}9qdG=EKGWZCCKM}{H_G-`n>Un(oZ2LT*G4^Hl&GyyyM*HTXDEp3rQ2U;OP@seM zWA@VpF?Lr$j6+itRTSmu>gWYOf@33)(~-rn$2m&!mNDlT;uyis{Y8&+)HudD${baW z8g`wxnYp4U&)G58b8hvIIXgKPIz`8dyd91;&S1xeykm~7j$Mv@dB=Rt8O)I5u;YZ| zET`?rJLVLfot(kNjm}U!dWgZ1ha(mKz@nkdIfpq%J15{=;hf=|<*aws=lAls!luF| z=aT$h&Q;EJ&P_OP_t2Ay`o}nTCuPDvz;IHL^QiNbvn5GM3Sw7DJ(I$c;u*qW$8{!- z!AZlD#=@G*Hz{xmrk_RLY zEhz&U$^15#JU+RcT_N`LuhJ!hcCl+8Zu4cn2j2Xv$>sY>mdax8s$%IOpr zuqJ&$NmZLm?Zt3vR~$g8MjR384W4jzRZ^9|Ce@jmmA@u`S87S>kkk>W<5J5~tMYf{ z?<(n)T9Z1rq*sBMdIHD7)D@{~QV*wY0Nz@FmwBnXaO?wxg`VYWi;sdH%$#qPF~dc5 zxr@@4V7+l_+j`@)8ELc9>it(BdnrrOR;8^=+f-DSwmofk+U}xlX$Oi<<}T`QO*@L? zRM9!+(pu7$^dPvN>0#;dMRn=+^vsNr=|x4&B^~;u4^AKM7jZ}lT>9AbvFz;UMwDEe z8&?9CK8g7kyYy-4Gd+~_IUdI(e{oHD>IBr~zWOPtxi(ikh`IEp^rqtK^ex4u={w=} zrXOOiXgXZE&lS%u=~cX%x%A_3XEI2JE~8uVpp4$d^NNx)q6!-_%sGcLk_)G?u}x8P zMh+Y4WDLz1kTIZW8_pv$re}=LD2HF0QJ1kOV`awLjEx!FGMY2?XB^2mnQ<;t&J2VL z$?TJ<$DbjmXBK1*$}G(slQ}W-(ah@1*_rb)m%**hY|Px8xg&E==E2NknWr;d{WSf$ z_UqLz0?yda*)OYKNxvceM)VukudH8HznXq?`z`FZqTiZ+8{oF~+tqJhzr+1b^gEj+ zW_8L6&I--S%Nm#!lV#0H#hKxOS;MkMXHCeeD4dgXD0flTjI3E%^;t`@R%NZr+LX0D zdvMn7tOHp`vrc8TWGmT0**&wvvg5Pu*_qiz*@F#1*~4*+#W5*+TK3HBIoS)cmuEL* zH)U_h-kH5O`%uoL?Bm&Ia!8IYr&~_%ocJ7jPG(L~&fuKkIb(As8G>`B;h2eIPR;`S zuWSQGX*1c#1mlV2g=iU>Lp#S>lf8u)d15@f6C=>QIF9F>$tAhElC8Pj3P$Jl#(2=2 zo1B}IJ0N#x!Gw~zxg$&FGETYUbIVJ1Q2g+--$8axn(T z-G6bfo_nNZVeZM?b9r)JU|vXGpFBPK;{^1=1qHh?@*0F=Oy0!2N70+I9(Er3ztwq- z=+$=Q?a4ccUg~t7D_@h}6@7~_KcasOe52={3i9%u{e$zf3Y+pv3Kg`%Lp<$m{)qf> zy!}MmnP0_@{F?l^g?sZCUfjCjYEAxz{HKlqU2ve_Xu+w1 zmO`a4sIX^YSYdpjy)d(|h+8OcI|~OF4lf*AIO*#3Rd^ikOc5#46?H4>jnP$9k-50B zD7h%7XaM@>kwxQSZ_|rs7u6Nj;;1WHRJ4*=Q_)(Ck~S7?;~3+klDS1kicS`tE0&7` zi$jY06zhu&u77Z-4gE-fBYJhAxE;_Cil@$BMx#miu~jm4XbcNFg_K3IH=^^V1^ z5=}|hl3pbdu-AwZV~MlBSmG?nLK`;(Z5V5f%D7Z&FfLz+QQ8_dL%|q$U&-N;6D4Oc zhUtV}IkbOFe{28L{&`q)EL35E2ML9*A)Po5thEiapf$e_qX1D}xF;Hx~oLMX6?U_mZ?hE?tdkwjpDmn}%F0}c`n@;Dy;zu__2 zU0{hX{G0ea29hY?Ad!`yl5X&IB!N?AGoNEf1z1bCltj-xcIPo=_<B+Fb>OGLl zCrFIonALt~UP5RArxd~uAToUHOM)LHKF9qR;OqFk;|z>{4u_AwOXvPi;LE&J0_QJs zi3N#apa*a)@_G*v_Hqi#s}sLR!plZTG$^f@e+NB=xIHD zg~ZWc(O(e@T}+n|D_u^P6FXf&R}cq%ovtQM>{9qGNybiv^(2+POW!3~Y_9^z#%_fV zNiOy&>?ZxOSK%``~}Me$MtLkaFx! z=uRrIpXe4+siY|-vDo>yil&ydAf#Z*gPQ=V65lNHK~%3QKisZ)MQ zRw=J2zap!ZrOGn$TV=Jfn!Jg@xca_EjaL{!&m+ z>8PhP(u1a>wtkA*$|8w0n`VQ8-6DvYhdo^uwi*nS0$PALg|rZLP=tCl@p{$rde!oJ z)uKk9#15uvS`971{u1D4QO6Rm;}FzwJqe>P)0asIok!;Z&!_WASGs^MfR?-h4d}`> z;AUvRV&Elo3Fz1jgB@nepc7iI6I!kl*ds(=Cu!Ijwi@@+KpU{HXdQhAc{R}{5`%p# z>w%emNYIaMBoI4VKEQ4u>}r8_?w~tB`4jyUC_AA&I<7qdTzgcmJrvq=h){YMI@Ad| zbcFPw|D^vUed$qp6!>#!RbOb;SGdPh^b~Tzei-2IXbXHdbz={fporMvg&i>@nC*!n zU9c=t2YP@KK%%fa20JXFh3F@+OQtj8FkS2dUF?aawYNYct(NGS%T1bS@ddK?Zt#x60XOerJ1l_^R&@Kj|g zaD`F&bZ0w$umkQkSc1SULBlOU150ocjfx#W>$ zmZ<7?>N!HOGw3`C#O|OL5`Y~-7l2)`nE-AxI@rv1(uwUEBC6(3nw^AdK77i||3t?jDq3VgHnX5enHw9eepD7Q3;TN?TiQqL_-5=V)n zNM~+uR&H+r+}`52y>;gHCVAUGwl7HHHimtiu(9sk#zOsUEQ;G$2=+7fLui|&#j_Qc zpfF1d<(3x3EiJ^)(tgU@OMzRLNN3Qepkd6$D1Dkf4a_V}q&2h#nAsbpv*~QuCu>=| zajWait*#rly58L0x^PSD!fmVzWj3bzS(L;rDwh5hEv^8&Y64GYQF`9)3f!)!pIvq0 zc6F1VU3K!at4`dmG_b2f*o*jg%Jx7qySjRGZPPj0q#m+O%k^avG?N zhrS9lk%xu=jpvB*8_Po%0F7n{2eFOd=vyTiZ#El|??Rv*w$(%uhXW0>Ed%Xy`mt?@ zZ8>O^er-zzZ%MqDHroauXNjBzN=MG1DI!8=fcC8-*?QWlkoGljiMJJbQJ5_m=qb=b zZ37sh=WM~)p^g-Cscooj0cZ<>2HWPa63C_2eYTmPeGaq-cZ?DsG}ShVN|JsD6pwEYNK#jz80!Hq zim>iRS(=blx&_X73grP>0C2SeBrT?1NI9(prSAVcIUgz79KFyiC^7-EL$x*Kzm!7Zhh3U4Y|d;Pg%BDb^&z)+GN=Zw7~t1WwSL0DX>4?veB9h zgnP5#PI2eIAp%xt?(@<%G8+4CfhUyCM2dPV#!%?@h-EHMu>>h*TUK~!wLHa4gyKM1 zx+8Rkr3UhY)GXDEM!p4_&XD*x5N|ESIY1Sh76HUt3*il*iJS{70oNh%mq7D)JmhW} z&XDvV&@fIL3N(Zv;X5D?=j|wSfd!T)VL!hm#{!GTxMHJaoF&gAE6V^&7DJF^j>U=4 zIHb+v{6+y~F+^EO(_2w;E3z}BtV5`kqn$uTjv!Bqo}X5Lx|jX-A^P22%=nxox7 zCmE8#)qI>Il+ApUBjjm@h9VRtG9P3}dIV^HE85GDh&nQZ6A z#*oqlXbVTMY4awIAOrITj?fC2QAU(`0?^u4)WDGRSI|~5B-aA1U`Sad9yKrHXf4np zhSZZl3mC$V$fM?ZPCE@Wm!lS-*$gQU0f7@z%mBZc4AFGqym^MD7I{EU<|-bq2lc%|k48kPCFrJc!2|DMnf5nbD`n z{XqkFhJ+>NJPRyYgf5%27)|(xTxw1?SW(i!VieYek4J9N;>%{cWf9OU*>1L)nRfnO znr@zEWWCTga(A=dY)0Bp(Bh5gg`^(xTjm(E5l8_|Z)Ckt08o^1I7{nlHfI`P3*tBK zQKploGc2vE*>uW?UPwaEU^-zs&C-H)(#TrY0HEVW*0O#iJzzR&Isy5?R!zrPnblti z7Sj>aamHDy@Px`g6StX;8PKw7^oVza$Aev(4lzVe0G(t=6DA%-N`@kVw)1#@7S5Xv zo6tV!%G@SE88({)Z)Fn$hgdrLO#Pts|b7C66Lk9vC0pUw0+^=R-5w&3pY(=_Oq%b5$ zB2?rk4Lz5OBiy_797kw!tY;XKzze;p522R98Eu2{D5ot2I?NGdYdpw9M+5EWG&Vxm z%n=(QY-EU!5Slo$fwqn#HbPj#5gQ?JP2eL0t_e~-Xv77&-N^e!O=E?p@Ih)b6vE?w-GC$K2SSr5de zD?xr1Pm1wCJcSHNSa=E<^0e?2GVa5|Q^@OpjxjEHibyO+TG1iS8TVy5z>pLUw2#wX zLvGa^!8c52NDe_LxC4a(ZDfc-`@ACr$i#wtKpPIUh9hXb1*HJzPk?xBv2m4UIiuk# zA;b{R(c3^V9HD*;5geUIJYFC2%b+1|aQ+gg8%NL=1LOso6{r(KQZclg>zX`(ka#X3 zu?UDuh*@>~nRv7?Y5>q#mO{J-dGOqXJkYp=giN3#JTx1~BcW2cH2y#|T3+%yS7Q9W z_=BkP`_O)$LRbzl4{BYG9-E1(s|3E&JZj9jzo_N35h~hUB{t zx{4vpwn=;#LsBqk{C)-KPdu(5jrYWtJ*Ls zPj~}J6OFN;uv(gK8X1lLkDQaH$DNC2v#*fHuWp9L_m! zj>7mKU$U4Uw=rrHP%uza6nZWJy?ords8v9(OVf>eqFDV71Z_nW8~@J(ZClhVPrh;U zqGo``xYR{KUxYcX=D5%(rY}2zdPSjs5#9g_i5dp9+SP2F6g3bfI0u?8ij9IBE_{Jc zUUXum0!(1=Dt^jsq(tGG?SBC-nl_X=8pbxaS~j7ASz2ZD9$>wGi= z*B92K>t}M>e4rT|!DjR;IeHUZxP7ozO3y6-PxZVlA?rJD8QRK^TMru_8n}*Av}XEr zU#K@ND~rc^fD8k9=q#X;R#Xr-5+!9N$l)}!2l`Bo=0dYuIGRF8>~W5I0v+Y(X@nkT zNKOZBAE(U$+QSjb9NWxMHPB9uCL#qShuqMf#%|(hI%u9dN4%cXIE`^$z)=lQJx92X zMR|}Gp|Q9ZFRJyS_%e>3LJH)AP=>}s(h{DQlGw4FRs}SgA#pQ82Xn+qI)owNW+2{f zh-VR+%0tly#5)<1z6MI*G?X&d%uyUrJV&U7*cgsb=kaK5z^?$bUJQ}buK3uH*xo>B zSz~*~hN1+ezEBaPn>a30DF?JbmO?^_Vs)HfIFP~-T0K}V3zZ0oK^cL9Kx<@3K>HQ9 zmZM27Ys^802;#)-XGo$zdt1?NhQv)s!8MWfgE5>ln+wN4HVDlI+Q^WQ2-L)B_X4eB zh|Qy8)^J)h&}trUD$q)fAcL6YJQR8rvxK9EfEF?&$;daD(?)~F>r$)&;&mxbaOK9# zj6wS%OaiTj#|wi_9^+^z&=H1Mi>^P!X?2LlbzFQKXe18}1scvnPaxhVjpC}p3344LNjvNtd7!?_;ikHVq2_e3qh-i zJ!@rcAwyQHFEqx=+QQB1{MgXAO&m>$Jqn?KruihcQyiNeZr1FH72^^-DCTTzBhdTm z_}I0vO`Ntec3rH8b8gH&JT<}ipEgHxeFx{Vn5|ayAe@GxdJuXwAUTpYM?sf?(tu8L z6bp2cBMZ=Rh9uk<`aB=v@}===ZtMUv=8ix$vFVnB4AJJ;WEM|+Qk@cOk4QOZq}D@G%9Ah zehx#LPog)*ZsTZA^x9aA3&csZ*<+8=UubhAmy7f_ATAerD-f3pwE=nLavRV=R#F-b zOR;7KQKHgQ`Kr{FG=^^mi)1ZAF|9SB-Q#Gbxs0PJF`;_s8mHBTA5T;h1ytw9$vmI*xL&(?Le5&Z;$0(~Qf#Xp)KP)mfz7#3gxFEsGj%4n&IHv^j!n zle7xRqfK3axYXoVP~_TMfjehBs@?5nO6`qt+b3r6zv^w2R4rqa9q5 zy`b$`3<-AwrE_#MlO$%w=zW0j6$%eB9W)%}XjF6zT1^%@B{~BA9*<|*Y=rDt3R9yA zIteu2v^pjVclj_l%RINqKmfSQ-@+=m9Z4SmaXXUU0`lDXyFea&2?FAGE-}RKoaZsf zxRK|PYbr26ro#IO<@YA)f%v^4UYSX6gq;gpAp4DM?!ZwKpF4mS8Da?Lv{6y3qIYmK zC29qF7#=U;oB?{pQbe3IrgAht;s_fpOQUIXIC>?Z@j$Z}!nbXj!+FnuZ`3r0S92Qb zBYZkX>wwTlBc2whq7{`f#Pg^%9Oo!EVtPEY%W}j+e~diBfzZeB(6We;tQMqcxFZ>J z3m{mA+Ck1Q9>`;5FGCu84UFH*>XgXc z(U6)XtD_=!MXlwiCUS?t=|SNqFiT^hHIW-JD`jX(WK;A^FKwNnD@VEUz2h++Mrc`l zH})KlrHI!V6ozPXJPH65q}GJj#-H+{>6l9~T5fnbn;r1b@t7SlG(UVK8!ZD(i5wE$ zlOfF~;R7NEakM8qCvpG}t%)p(hfX5isK~s?GhSL2W_XyZ)8?>XmaiNN)RiGR42ZY) z6zx@*j?;z%DIARf5*d;{q0N0=90jRmVSD38AZ-(9Tu;SX$o@!t2xMQYPKh|g<{e@! z?Ck(gu?%P*Lvm-JJq(G@B1LoD5f6%sj~nYnVR5Vs;EZ!>2JXpM%zDwe| zaWubgeT3dai-^LIl!r!y={@{LMTADMzVeIshBqFd$D-(0K}WikT?TnnH|d{J_9AFjVSfdViv}hdC^=pwiM%);P6R3_A{i8 zh^Y==1Z1J-!bkU5#%T%RBf{%F@nXjGSiosNiz$upgpPw8S+w8$7e?{VVk$1#0+Fg=Z@Ux#<=!8B)(TpAwKV-t@j#>hROuJNJ)#&wnKy(T2O3Aug&hq($!Q5;$HESK;>9csKFVo7iR@IcERU7J&;y{zm?5mk5g$P5OM*9W^mW*r zVAQnmB5akn#o{96-LRUlB?uj*1c%HCW^x_{evbw-xiH$a;9(vVHa?i?K@L)k4VwUT zk6aoW#W~-Dd`AQqF&h0iba!wGL*OzfcmPMip__t(y=Yx<7)Ozzt76!_-9x_)Gj~75 zkovRG`f#QP_oyR6XN9%!c)?*kJ)w#iTG9QShZZ`aJ7gu)D?w3Jak!A77Q z(9Q-&0L=#NSa2^!Q{U=)q&wsy)B_#r4*S5H{ov@K-K)K5K=-*ENqx6>U*M%BcSo(V zczri?XZL$A{Wv zRuFMdDQ-j&sWpgu6mY>55w}zkkswkRE-G~)iik@Qky=o+R;^Xs5fLl3RLSrCd~Q&* zwqNb{|9kyj|JQlVJ5Ofj%$b?znVILDd+uDWae015i*!l8my$Zal!sQyx3TluJX&t~ zIzt5|H=^4v8o(%rcW zly76%g52GyH{~u;>ON)l_N2?Ky<$f05|h$SE}K?SCuu_2mF*_EoT?!cIJ#OIcUbDy?f=XYLU9+ zSPeRpFDGXcQU=$^%q^yrQAp{z38aFw))n!J97!2_?W*9qXsdPmFWXZxQby^b_FR{~ z_x3t5XBN`6L3R5rIWH-$V6Up2F(xtB_0Ku2C9YS_xE85PPPZ1RT~1#~`|MSq6$kyc zzc;5-Dz*KRoHCPQpS53rk+x=UZjm-;(=V3Vep>e1Ez-H! zuS(jd?X#NOt-RB+7ZcZq@)qT^LpqGOW3%adzcTK1oRf{c_yb6-&%v6AE9iJpHaa({ zeeY~EBdKRLnnCj0cgwD)l#!rci0fv?opx`vdyly3X+t``*K*V3O7kKMzU1yq9EVI8phEiMz-o zFNr@?)o}vS&BRT%IP(rW_EzeB#EqB4eRl`l*#uUXF&5`$B8^h&jYz{x@?S=(l*D~S z%G>14p$)~0l#e_AcHNYU@7P8y_qLK+r_?`k4YkNS4V~|uWwXF(^nKf`1xO`9b@`WB z+iV12CB<3T3sOPHMAk(nkuRP#jeN7ow<&84662%z$ShkCvB~1ftg$A=HWv5ILg#*e z=Fa&lnK!vQ+>&(@sa-jDL6%w5Ye@65%$g=6HCW01Fr*u@CKLAwXIzkV3et4quE;tb zsXKAUTgkyOL3PpVS(U_{OzPw;8)cSSmemvK)L7fZy7KXq$4p%$Kg>MZa`mY<1u501 zS0JfRz4Mu~2dIbe3d;L_Bk37{$CHHeUWy}Mc@LA^XJT)acP-~??kBOgicTzNOuIM7 zJ}K|gt{pY-+lcFBwUm|sh|EWAtjy=1Na&AsJ zd72BeipZs_m8Kcp?+3i;rmhG}0a&IjQ%4nPWu-h*yqm1?3y}-S-bVun|NK4&*g_&iWkh*xC zOShJ?HoA|x{Ytl4$?QqJt8`0QHPTw|fYJ|2w_3jt_fgp}>le3Q!K-DraK_`D@p{=D zq~8&@w(JU|&BU!Q!=BxhNNdZ^K^lVeY}rJlxk#&3@+SBB(v_u8x8z%8CA;@g%B->h z)-U9HpsY7>w-9$xSy!ax#4ReTK%$kU3(AU+UZGa=N|z%&gVa!ZH_{78HQORd-Hk!F`#uU&vNuhe>NE>c73BBbk)rj}aUu8M6a9WP5{UMoFO61H1< ztVyvW$v3u?w#6nQ9a(B^yMWXY%EwqJtuiU?d{U1nrEPxqxK~<9x*z9mF_jwUX-}!1 z_V|ay4k#T^%6Q{@4jb|{|MA}ThSGyeza-Ae)A)#uLDKl(9qtYIi&htAxY7zqw0i zB%Mv%Ic-0pysMEWD=r)93`tj#?*d8O+qadrVmBeBv}M;Ft5jyBwnv&2e;rBMik-u` zseTzqTz}=eoH(r?dJdjW9KZWiXRWa-rCN=C+7>AHEaLKZpVv0k)|sRRisOv72&r>( zw@V^5ck4ION0O*p$(xcWujDmJJOe4&Bnc}lN%cF=KuXqIoIQWfU5*8%q`OOAl~kF# zpzVMb>829KuE!Iw+p5;8_uXN8HE%ebt<79_Jk=nql8%tsWR6qVeYdhjX7Vc_VsC% zZF`iorQ~b4?yQm=NkdBNN_ryAA?~7LoBM7eU%O)FG@gM}=FC?r&o**yuu^zZQJFKR zq^w1{qL^9L|BTd&bd43HZY#0gHR-)#<_DfdRF-Ti-qIqiE2h_Yc2HS7shGLXo5AWo zK_$~0#aoMQ?t7YZhZWo0_cSFBP{}+AC?1eDmorT2oi@cJ&h45usYR+tV;=Fk1=Ynx zX={-d#OsUmii=H(6&0tq%|kjhwjnw)&GcJIs@LW#lVU|}zAV{+#65EMinIcgVjHrT zrCAS|v^Xu(q@X%`o?Vwa)ERBo#di{S5;b@vzKt0k4Yql@*w#RkRH}DN0)iirH-vZ*!gi@yPEjjKpkT%EB zKGMcEuf@%B_-vugrubyy3gWM~+0cgGkhG?a^#=88(}(XcAqCZKdc+?-yT>*pcJd7>d>5o`_U$S>;SEJQV%Bn#?0bJmcsp;$k44&- zxHtJ83KDTI#cgcyyra!IvDaFpiLpma;=0u_Yq?2dd5g_@ZAfB$5w*gndp+@V5$lPh z6-5ikcWGK>qN}CaSSapTG@rPw#8nm1SN<#X_!ULg8y6s5UQ|aMqoU}HqNzxXg{&P# zW+iJmqixXyBt~+ZE=5-7)kx!tMv?C{q%lR*+3YWCZBZXmkEMR+#%Q_UA8ASqUApKp z%?YgK*1HpeElAi^)?0zKoW5!^Hh2|jG}4j5dL*8_wHXmSjg(BQEPSo-Eo&Qb;{sZ4 zrDWY5ET-gsu?>Z5f`v$|6NOI)4P2M<3ReZQiTe}MW5Eoh%Cs4Uj|3Nx%JcWa<*Ctw zBwO=VQC^PX0;Eih9xJaw5^GGMMzUE%;hccpb?-r{56sp&BVENix%L!cV&RNJ`jnbZ z%<5H0pL)!(g{g7Qr&5K}RNiAq=cc5zS%qg5GCsV=iJPRjXZ+_2Cl*d7?sQ5%Bj|~A zDbi^Hw&tCWG|`^RdFRIq3ablGLHZSO;{&rbtKW$%0=_$#^0XFt9fRu3L4{*UJszpQ zPmlX~NPT?k@r$TI-@@@GamK-_!F|N_DjY!^Yd~QS#Z4!!YvC~B{)p76up1KoN1?n9 zkCm^mo$@`5WQ&hk*sQ{ig+)kHiOW+e>q06OOPtzzWueW9ucS>a_=f{zNY9BgfB!FvT}In13rNwije5icm%?A>irP+jnr&s<{nErpIZFC`Uh z@X(Ccm3-^H%aOVxt@WmH#y|K~gGt^?NN;fNW8PY>L65iY<*h>MPrl{eIL;WY)O(S5 zDpqidhplBvQ}yZ2dSj?qzKEY<9#i zD>%&ykwzm;aCaenf>iDP%~FHvj7NB5lh1Ey<&o+&^qXyBP^9$(ZCazxanBO>|$R_PJb* zi;;?sGLDzD0%@E{mYS~~_p^{TEA>pIw@mVXL%v=nIiJM+{0**I>;aU#w>uT715$-M zDK&mG*>hc;?FMil%yrsJ?g0~Sqj;S78}VkCuJ6t#oNC1^fCWxl zlN}zDan?BTT$t^Iir-H$%I|EF{DRTDMXAc~tdTrK90s!-SM(H9DfSb)imSzSBDZi{ z-D;lDcit23(I&gKM(-qXGW7NRq=Y+Hsh=zUE~C>O#`LZEgvVsgxvdp{us9p$IRnMM zFxPQJt6`y&Cb$azkG zm~gDjY{z;g+p+#HP&oxossz(}uIg5((sI?ex!S8CSKn95b#lm)=M;<94|z(>b2{r> z>+M{9n=M~GpR0S2ycX?SYJtirZ~|oJbkVGc`CBww%5RB}At$ttN4A*fbW@%-qFH91 za|p~;D{>u;S?4{)`4p1nU1Q_!LvYj48+v+^7ZTd8#k=Qzc`Z1h%% zw<|_7h9|4=hAMusxIomb;tfO2b~;*&^S9brZ7NJf{P4UW;XRm%KmBmPKW26y&$q zbEci;YD{@`k{=cy5*Hbrly%w2%4@L-J1bW@@|^&=K=#kK8)|>65?9j$F{)eTyeT~k!l1)^;ht~#-8n|@m*PO!s$~wbnIYk+ z-(0OzZWA%BHCH6ul(nB_d7SmiSs;0<(M|QkBZ~P-F;7UY6}u?r4)K1)TwwHWlYEVM zB+PIE$EtBv9rCtIv zHD_i>%bBTJ#k*9gk=u z&^%lq%PCOL7f5$`S`G8mKM5z*S0`{*fn)kAaI81-v>#NS*6YHSx@n$q?j$u|eV(iQ z30)=8vQF)#bIm66w8G|TXQyn{A-m=3HpcTb2j)qGc}}1h(|Ddr&TGlpj+lHWP<$aw zNKQCrQ3YE23MA*L6?u+nHn(N|>8AXjh&PKi2PT}WV1~|0IL|5ORHHXa@<{P5qdP|O z46%=RohUsz*P869PrUJx4-!X<(v)|(PdH|V$3QMUTaZx_EZPY=HZ0b2y|7wW8@F;a($NE&dv^&xgtKA`&Vm;n+Hoso5am zoT5~n>!d8D{B$l#bdfzD(>W4in2^Yx!)s(t_V|e`nU7;pD(<$9ghbb8Nz`LQc4g z#k0jTjLz%gU&M{#YvNMax~1Q&J{j_AqLlCCq_lINa{gX?Kpbjxw}_vKTNN)^Uqnwh zzf_Fs;2bS^jB?Hvr77=9$pgi8VydsQO?KWCH;8`{-w^*OzA7#gRf2XqOlY@{1e+aM z3G>ATqU_nZMe^;?myN~Lw+ZKGiXRTMTkb?sGmLCc_EVtVF3?$ddj627JG(@S->VtJ zy?_#OQ={IKjkyP^mfUh zDaO{gjMQxAOjXPw;v#XSD4lvq$#cXr#Z*6ZmYlN5k0hTi{sCsB>hH?Zyona?9cy$g zHBa`R*Rn=@t@u|I-wOIIW2CLcJ0FOeb5i$E&KHUqZS>9&JyG`Koh5mIxLPzzNO)sm zrc)`oMto8{LQKtIDN7!q7_;rxsa3$Uc_wU`!DNl@cI7!5W;#P89|bdXPmz`CRZl(R zEmi7Z@pn1r>zUtsiu^7kNp75@M zv6Kyamnr9qN^MfAddV$NyxCiJ>MG8~is=VqP9XU`qodw%drDT_+$ECDwlh}2lMlL%HKcI*H}!7 z-%tDA|CJF(foReXAL(ljdSLI>*x8%kYU;cTf9YGJ%5Y*h@!z-m-=v)TZ{mMYAK|h+bMxQp zI;<`!>3iJWo*(!3d-m}!w)H=yGb=93ofa-j9~bUSUz1f8?#v5p>?GFP>_DFr8?6?p zF><8^JHnm2+eH~$cFWNYTJ>XUVP&Z0;WX0=C5ZO7CA^-JT8-ga(qm z`CHB~4eoiEZd3E2=E2kqXtucfFukDT-CCwsm!;BdbnYIXj8$@w=R0Rf6FR>|vl^HG z*%~NynU&OH?K>mtEz1g1dgTf&)_l4E*ekSvI z_npn-M~>rcXe}MF%?WHzfsvEEPvAM;RyZvlgO@mga(7bhPSpRTk==C8Y9|P?nu|tu z4GwKij@(-{J2Bda8Xf5b)~*q+2Qg~fH;5apjU(RXI<1=LjqK*-Hs3L_msi|;_Q*b7 zQ}eSU2avMbaYk(OuY~JjA2laOY={TVO(QltF{Nx$$^%MyBz_(#e~V8uIx+W6{(kAc zCH_@>+nBbidD)0v_}|YtgGX$z7LJ%>EgW%^wQ$5d`iOWZuG)69+K!lQwH+~Awe7`K z>PI}yRUn_k?A2T|Vv%zoyxZvwmpKQ+hnz#;V@@Bq+KIdKIDd(Io00yh9xw&pcMeKF) z4G}#IKhg9sd~({C785=%t`q-YbTYX1;NhFOw()UsrMOPCn)k4p58q%lAHL3NK74~} z-j~{NRye`vwD#U?t{c9<|BLvR_*e05WALH)kuk;xu#iV?5ZfAdcX+MI;T&W1tdaZN zS&lPwr`y};{a#!n{z2RzGImLQNqpJpryJQD8HT4CqeG3TkLr<|@M5Y%Zy$I>WVdJeAA-yLh3qnh1C^O*P$z{u8_Jy>RPqZ>N<3V)ph6!tLxAe+(FNBMpw5*%m%7HG8?GcW;RfDyxG7|&un0*$5RPxv}&cz2vxnzQmabC1!}Njo}8PlkeT{3?A~L_kj4I z_^|khxI%0aSrf_mgt$s%eI({-@fq=1@pG7M~HH6`vPhFj5OhEsQ6Nr-<{6PJyl4gYQNc9V%Z$ z7si?5mEtV%e(`bf9dVoZnfST5L;PCYWkeT7Ukr@s!k8hpHlhniU#w}KS2@moPFyQK z-&|jLq`OXhL0m8XL3~mCqcP}g`GbSR(Z;Z^*w0eK{^DWA=vs@9J{Gr#pNLzH)Pi+$ z@Dy7&;fCfFgEzSw#h1jF#ZBTXMq674U&PvKGHdJL%WZ8PJT)9(G2uXQnK7CvHi+}Y zJH&0`XX19FQ|P|h+;qfJ_fO($;-AIW#WzH}4f6a&#OFZ9=YaSe5DyS;7T*=$6F(NW zh@Tomd^vcyc!V)xeuT`AM=Yf-`OP(l&vkDV=ZUw8^Tpf61>zmzLa|ZAKjd8eLwJ`l zz(0Y9iG##3#wk z8L5l$FwuIUe=x>KT_ANa_B2u#<8<+QBfrvec60UNV;C>Snc|h=Eb)HvagkMmJln+2 z#LvYY;@9FXBjd&Bi-CAvbJ3uO@ckfThg8Onv9*!01DztXmqC}9y+G^*VlNPTf!GVg zULf`Yu@{KFKW7l^$Ky2QNMK{L#123=xS1F@PxmzdQ+tY*+9 zPLZvr11H$pJ8-qFy#rU%UrmE|qSfUV`pfv4__?@4{90uFA9M@- zW%R|sNFNz9#MVao2+~LS&D8@oVLQfo;%(x5@pf^6c!#)9Y!vSl7mIfpZQKu(H$89( zc4RS!iG##3Ml8tK(})Ebr;FDcRip6(#!(~VJn=ShzIeO1K)gd-C^m}RJ8>5GPVg=x zwJ;tg4id*0v1UkJj6IFi#W-EOUgYlUux(BovylP4%{m~~0kMt&z0qC6fRE6fai(~s zI7_@=d|Z4-+$Me|elC73?lPh^qb~+Vv}Vi@TZ>rPfWGLC_*A_Pn{V}k)C*Ft!{$@3 zWdC*4%ZUE~@gE@m1H^xT_zw{O0pdSE{0E5t0P!3koMc}Q*8ZpSX}jrt6p){D{i)a*ebJih^<3x9b)ScTZh;>#MU9U4zYEJtwU@b zV(SoFKWr7XGh*uyTR&`-**e75A+`>!b{S^zhplo-%nR@TnvKMMZ~Az)$auC8&lcj@ z!mpZ}`u8`V8gd=jY&4%5x}qm?Wn#E8WL!hWHN-dW|C;&6{a-WR7~&g4X1#u!%{T7< zn)$|%8KQrG^Sk@^H$S=mYfcCAllx6IKdA4Q<|p@?YTgjU8-jR45N`p&&jK#6O34QvIfym)>ux(}5N^{g%-JoNda%o6zOQA> z5L=6dB2T7>Z(~gR!Wf<=>gu7c9_s25{nz*HXn;6SREwe$B~KC6Khf_@b`GYu$_`yY zZyC{apT*vzlAjaTitmbOsL#E2&(!Au_Gh>JpNZSW&yDn-ahk|4iXmShUMOB9UMyZB zUMkj!mx-5))5RI$Oz{dM{byV*zAx(P^dIr`pD{yhEf$JJVjFRe(d?bdI z)=5Qk5Zyy`4>QFqF(GD)IbyDuC+3RNpvav(Wga9REFL2E5xEa1 zwXfJu>@OZBV(|xW@;8b*jG_8JRR4$S|4{uOs{cdve{`1RjII{%H9BJ*uetu7c=8FYlp;#og5sSqVv8`AtmWkzJJF&f3 zA$AZuihGHBi~ES3#Li+DabK~kxS!Zf>@M~Y_ZNGL2Z+7I1I6CrLE^#UAz~l#P_eJb zoi07hoi5}~7Y;Dm>VME!f1~6bMq9fNT5fAMRBzi#ebDhdWv)4BDR&w$O*Ki=b<=dM zP`V4HyHL6drMpnN3#Gg0EGs{{TD;fjoaEiv+|+xuc_O{X`S=vQSNr%B@H%m>$Q>0i zcn1*g0Ny0tEH;S05pNN>|056gfABVOzR3L_F$=^y#D!v`xJXoe{Kb;F3nc#%@wejL z;yvQM;(g*$F)1z+@!>cZuZnizRYANeh*t&ist#OXUKPZvf_PO2t}w3((gP5$3gT5k zyef!hAew=ARlUcVSJiu*c~uav3X;FK?xlLqHUARM6!9;S@h_p(ZLay3@EsBV5*hyz z;$K4iOGphNHS9gt{7Y!%&o%$D_gwQYA^s)AzwA9Xyd16$r;B#=)uCN|b$Eqnbyyu< zC0;FBeO8+f*n6D$fDkPoxWaruh@aYfu6csJ$F&+{Ii2gglIE9tHF&$kW~1+kz8Hux zF)pTwp%{s+#0;^um?>t72{BvD5p%^nakw}_93}otJW@PL94j6zjuVd;PY_QOPZF!e zpNr$gUx*XLlf_fS2aLgFu}-{9yj+|v&JbscSBO`NSBY1Pv&3t}dhyrdZ1Gxgj(D9o zSG-=lLA+7CNxWHHDkjBc;{D?9#D~O(#YeUNRHt{oYhxm8#OYtA#PVt}OSK`;km@F+Oi;BsjVzQ`MmQrOi zFC!}BlTpoQSmPsow**K%l^GRJY?8x^zpDDD?DU{hph0B z6&|v}Lsoc*hXwJiAifpEw}SXq5Z?;oTS0s)h;Ie)tsuS?94?L!M~OcZj}(s*$BIXb zs^s&;Y2x{! zdL~pqglc=Jwuir0>T||OHHlP{NOl;h%xIBP?-cJ6mx#X=?-A9{k;;$MpV3Cezhrdo zveDLcg*_M8Z@oPifDel36B&I%Gzn=dq`r_+A*DjJ2dOpW3J{IK=fxL9Ml)AwHri;0 zz8HuxF)q^gq|#zYi(xA^i{nK`Gcgmylf_d+da~;Z8_lpzWHcjRE>0I`h%?12#4E+C z#H&R{GiO~R){DOuXN%X0bHwY!x#IQW4I-nN5^fT27MF@iahZtr$-`)d4~b|W8SO(x zGsFfUHUO~!$Y_R)W{5pN>;YmAaJ7gk1pqP!?sQ8Ce!(Po4H#Z)2JmS&ofqWZ8_3>8>kmOvBHO zA-djgy*+z^=og-;_(|efqI7Meoc!mBjB;c~Ih?1n)Ni4B$;LYI>KPmB$j=#VtV7k) z#yYY}wy}ofD&NLB`8SF$8F^0e0HLqrIAb^t<=*#1{=0xIM4Dt<2h%YGsXF%v(Y)%+2p+DoaemmyyINtyytx2%y2&9xYCVyE_#)l#m*sD zyOnOO^Mreedx`U@d#ihwv(0_peaZRS-Q<4irn&$0irw~JTd&L==ymYMxkq@%ddIob zyc4|f?gidy-b}a7yVASbUEp2g)w_+}9Pc{!PH(<{xNmyzdY`**dtb1d$!Fd!zD)HGHbRWKU-^-r&PFU5exB#~1%4ZTbF##*^0NG4 z{*hike~drIJHj99AL9-7kMmFQhWgX|^Sz_}3;hedWBiN#>%C+7o%f~Q+5R&B0q<&m zqrcIs_uup1_kQi~@OQAUY#4;zoFF|&_pS>vf-G-tuy4@SyD8`vbYoxM{ezy~Z-QRI z!QQRGp~0cvf}npez`G+D6b$he1;c~k-rd2N;3)5&;8($~y!(QCf_uEB!F|E~UNU$v zSmP}Z-VHwR)&?I3pLpwoPlHdrKL(!%&EAHX7t8Vf63dI_^P4Dzu_A9fzdm2;{Vi4= zEBAK9Dq-Ztf%)6``vkOXKY|>AbY(}j7{{uik%TV!}~fmDK^R5Wxpfu zHQO)9`wsiuUFqvrf6IRN-2ZF%Vfdl{cEsyv{yR}Tiv0JYR#ArkQB)ii`&*)Y zqJ8{NqW)2Te`|Djbh!U%G&&mNZ;OtLj`O!iXGN3!&!Z{P6#t9p!l=&Q5lxS#`(H&f zqbvQdqpPD?ffHRH-57Y$%~3-Ti*AkP1!>V8(H%h)HAYK<^yr@G-XIYzkA4^AL@T1l zg1qR7=$W7}`hE0VP!_!(eHgTlwnW>5j=aabBiOgqpjLx|uKeEm&|p93J$n&s$&S*$OM^<}ZXEY_FB`m$JG7VFDmeOat8i}ic!x(A5|i-(AP#6v|{tS^i8WwE|2 z)|bWlvRHqRavm-oAr2NR#UWyqI8>B{`?6kN)*Hxr16gk%>kYkVYRfvh)>^#-!uK-L?`dIMQ+AnOfey@9MZko5+#-aytH$a;eZb;aL{ zYs8PmW@9WN=8Lk5nDid1MWI?0szsq%6skp`S`?~9q1qB^bc7lmp+-lj(GmX2N)FEz zYsH(yo5cq4H{va#tTcR7^5f!4VIk_loz4OU0zPOyq4$`h>SJA#YaJ%_xp33+1^J}IsipAw%IpAnxG*NV@Je3H&t ze-t-}8^ulHE8?r-pTrNukBn}Xm=LqY95GkS6AQ#bu}Ewq7K>zd&_Y(IO_YpgZoy9KVzG7E#Ke3zGUF;$5FZL7<5POLSiU)}Yi-(AP#6!itVn4CJ zc$hdqJWre^o-bY?$|l{5BwsAniI<6&i_=Bftt-2AWw);E)|K75vRikSa>{z$ddasK zy+Ps;;$X2-93obULq(P5sT_Xg+|E@w-mfKJE6x{h7Z->cDeR|d`886!MUpilyt^ge zBi<`&M0gqzo<@YH5#h62#J`JQivJLIivJY9GWsLMsiHK_H#{s}z3NLxzWUZz-}>rX zUw!M(R!;S>KgZ-CO$@~hv5UB`C|hMuS<5L~4SGwKWd^dqK(-eQRQ%zhY#@;KgDS-g z6NejP8b>je6H_^{K8ly7;w2`>n~iC*^E6#0O?IB9Yo+O0X(uX=`Z-PgoTh$GQ$MGv zhtswx&u5}~IE+jV(?zv6Y%Muc%n}o#W|&YjOsKgf%vXGY*hVZCRp+p+?^DbJqI!(S zH1tE{ik|3;F)=R6HX`*>q&X_mxQ@d1n@*43u z@qO_F@k23HPw6p|?pjq@e5;{G_g3>h*pGRTh}|J$caSXNr@=v&6~b+2R!O zm*P3%uf%i3T5+n#=%+O1dw9NxPLOAaGez`3%$4F*;??3c;vFKELLMvyE)wq)7mIg^ zOT^!bcZ>Ik_lnpT=Q4s}QbZ5P_lwva@`K`X@ps}w;=|%2;-lgUu}OSPd|X^9J|V6W zpA=V%Pl->9&xp^8YsKfqb>bhz4dO;|llY4Gs`w}I0})FsTxQ+}WNv`W4KPQ{74yUb zu}~}$+lb5)Npm>mYuy}~rM?6&QEA|uni-(B=#Ph^y;`!nQqHNN<4_bY(SSMa4UM@}- zWw+*ikW+SR-UqVm*1QkoS)#1hyboe-F`D-Qj}QlomEsVwN*pSxH1j^luX4=$KxSrw z*NXGS+rSerNc>pbB7P!n6+adKCVnCA5dSWIDgHy; zDgIOZ%IG_yD~=SWin0XrO30($Hm?L(eQsU}vijV-66D#UdfvPeVy+YCir0%bh&PHi zi8qT4;%`J*f`6;zdE#xNwCPKmzO?B}o4&N^OPjv5=}VjbVx4uDD9!rPtS`;_(yTAd z`qHc~&HB=;FU|V*+qvdj!BET)yNLUW8j0pxkw+uZd@JNbM2#==t%w;Y9xlql&9@@H zN*pE*H^zK%FHxnLhedoJQS~$rt8kflScS{X!-Be&d05E0qIp=zCyF15AB(ad^RP&j z<(P+s{F%7JXdV_!7u9O>u!zYNv&4j$Eov4u4~sncVu9F3EEZK~^RUQMDwc`mVmqEKyb$&X;_< zD60!)b)l@z{4(k$`w1VA{E^Z8GU$q)D4j+z$#GG3Wquhs)j#H)ArBVSQuEG;xk$WJ ztP?L2RsTpeH}8y`_2REZjjU*m}#Z+x&1LmC-E^9SNtP+PBy)^UDGDn$@ z1`ijpUu0?uv0^wx+I8m$-&k)ZPCy8f?lf|>eDdI21bHrbX=ZdxBRFS!m`mid(^F=g+j5WcTBHBQ{ zQoKsMTD(TQLtH3gHRN0*-YG5??-G}YzZLHm?-B16u{F+R4uDCKxeEDy5gSB)P+Ttl zPJBpwSbRi$R9qo8iI0hoiz~$^#8u*x;%f0J@oDiH@mX=L_`JAI{G+%*+$e4mUlCsw z|0I4OVvm`l%twRFE|A#;=7_mso>(9jibY}@kH5|Nn(xl}9@%f)tLd$B_7Aa)e@ z689GO5j%;U#V+E$VpnlLv76Xk>>=(i_7o2gdx-~%2Z;xZhlqW|L&d&gKe4}fm^eT@ zPn;&6FJ2(ZCe25q)fbC(;$`CH;&f4VYd#t|Ww+*|AcBj%lvM`OgiGvpf-^BQcxI%0a&GHBFPLXkyXx2W6cZ!T=;e&Xm z$Y{1bh;I-XWy$98aV^=fd3?x!7GD?N5dR{+CH_@>TYN{{EWRhcFMc3?C~8D_A4}dM zej;uaKNbHbej)A<|1N$h{zKd;{!{!)+y$$6CkpaTl+hOhF($^vG%*w-v6Yx1wiYwR zEYU`86>m5iZRA$*hNIC&ZWZrD8ApgC;V6HU;_>1M;)&u(Vzu~l zalH5oae{cVc#1d`j`B5v%(q3Bt(tF(EQ>YY7P(&hwK!Y6R-7Z6T~(QHm^sRPLukD* zD(E8aD{2NX-;j9C0OlJaYrNZYH{=20K=E+#2vH-;d_(dK6RqDy1(RV_P$ym{UM@}- zXNWegtAZ;;YhzVlZLA8cja9s%X|y(01=hx@z}i?9SR1PXYhzVlZLA8e6X%N8i#Lcj ziZ_Wji%Z3%xJTq)Xktm2(6l>i61y8W%lKF$1L>|ajW>LxJ~>_{9HNzCVnCAP`r(!s=&rk z74Lc(Z5&kvHjb(S8%I^a*GAs;G6rlB+M74NOg5{i;*Bq3D>x{YX(jXCm&Ig@8W+6x zMNHa9aFjg*g;wWL=AlEY?I`omq1AR2?}l0a&qb@}DD&1~x|kuh7BfY=;;1ko+I2_S z^H6Bl9cA7+ED+m>#bSxrRxB0E#B#Bn*k0@`b`kd#yNYAPqeL60qe2^}qe2^}qj;;0 zKH;r4<0<0lik~Rfh-Zjr!m4nRc$PR>oGRK_t_r7#=Zo{;pzt<0%KUeDySPBSLtH2} ziuZ{Rh_XZ8k+U*oX}lw6^6$mxL}|)={LE42<3rQ_sK^&><{TBpMYDuayi-RByi;eC zcFfZ!ez16?;?-BYYiD^bRQyHarDC0UnP}sBlzIJdmRK+TTD0*vinsNwoIAz4#3kZy z#e2jjM75N+^(_AyI4ZI>j^fQdi+M?WUojtuABw3SkY(C^L*^)Zo{Q(1a5vZ4ub47H zv3G2`JFR$ncbO1D>LCe2($I8K?(0p#oJXfwS#h@+E}39Z*jCkaE?mOQB87GPL7j7{v2IB z$B82cY8~%kB8Te3K=F=#6Dd=_JQFz`N%fSWPk1L<~I*UDYk7{%oyyw4u+BT$~S&ixM0^_NxEOeCb{GJfe#1?U^5BZ_nPIby4}f`D@x0 z`Ppjne|tm?KjtW%(X&r9!;ZwOKPLZw%9Ea%I-=R>nbGWwoqO(i+G_Hi|Fy_wPl?RM ztvlr$iA5%`PmAf*x>M_iBqa()MG2)?njPd$rN9;6NDHHHkJ-rm$+;%n&Y7vR+S>K7 z`xcGlJVbnpyvN@})R5aYx9xvw;r~93p4me$ZPrDdbXaXt()XBN`Ar*kx8*A$s_R%6p&Yc&=+-#rwUnK8ru{<|YR(^4Ylo0LU;%Z}sNBmAPMqU@%qqRX(12{wAe z*IF&Mc_*sKTHosF@HNu}+}%4ie>7xF(EnA@Pd?I*4c`mjiWRnSMrk+kbat z42Z_i>n%0O9~O1`F}-Q|x#mwiTF=!Xf+h_jj-#WC7b_@va%!is4UE7^1S z+UBI?Z*EX3yAa!FiMAJU^RtR4HMpm_7P224yAMC)j3&ou{62hi+b`1bY`0zePC9!G zb49Lw4br8}4M78?T3j9H)*|gk+y~9|oWb|rIjc^46ermyD~a?cQaf8ICV79P?pE>` zO0H#R5w7OF?TpqH{oS=-H_g$hG>f-SFxa=4{qJ0MwxiS<$LH#mwkxt~z;6sYC(+^t z$|a3lb>yleriowreVmqYw?$vPzZrR z{z>?nx&{H?#^2-oq+@yN$Wuq2I`Y(MSL9@HUvq7+y!lXe{HkXMlCquWnA@pc%CLxRdN;AtPM-4e@NUb5YhSVBTYuGvY`z5FPrr!F-3EAhk5ltu2 zIX2zg#LmWz>}%W@t|R<`{t4B~XE)dH)}!@wjQu`hRn7J4@sMwiB>f`FF`H|o?(B0$ z+iSQ&oq8qWDm7fChO2zjS6r!vE7fqN8m?61MC=*S@SR?IhrVEM)p)S$i*NLm{vUJg z*{7{+r&`6-4J^h`J?9UvF-HdZtKhVj=lVt zzG(e}wdwuCHDd3u!KziJ`sO(_@B-mmi#LsY+mqkgcvBjCgs@**6TA9;Ux)17*fInB zi$2j@6Pjy6b4_TjiF)|`6wEUjmE$9nd5)SSS+j`h*?EhRTl zaswqdP;vt$H&Ai|B{xuV10^?5aswqdP;vt$H&Ai|CEIG&K*5UHlG2lu zo}~07r6(ypN$KpBYCEOcKB=}#s_l_#JEUrL{0o2gSRq}!2zN69JGT8$Z8ucg3)TG; zD`UqR+yB&dKefG2ZRb;`@W)sk`vN7|4=5S1-{emk9c{idQh6%+&0N{r8T>EvCA)!p zJkMphJ)F`a4@@V=3@&#(QbD8R^PWD z^zg$r^j}}a{I(x`m15fRzqZspeTjc-wI%=6?C{-r`Uh9A@6Y&}HQKuA%^7Yh0&Ah$ znvltwXe+_@XW{S7c>lHSm2<@;S4?unBv(vw#iaLBXTv`;*QY$5XDhF3Ad) zWQ9wrz2)+=&SqVlL6}KkuPNK@D#rd?w%?WQcJ&=khmmW$s@k4cw&RugownPR?R8~4 zUD-ZY_y|q$rOrvV&z0?RWqVw4_3wB_wnvrI{zvsJ>$&atW&3^EZeNV%%XMu-!B!kTD1X4!sOPQ`ad|G)E+?q_848IQdSU~dB0djRY#GMIfuQfoJ#hj@G% zqBWfL%I@zI;1j|0ZVvmKv&OSe?KYr{i_h)>7 z*9qne`~~|kf8ei#w+SCLn_p0iR>q|LgIRs2Y-0?zF(!NgdA)38Ot_K1FE=OC?cSlg z%N`Z(R|NK_aM=^ZWk(bq(R15JK=61O)Z@9l$5VPQPGIi}k53{zKJ4<+39Sejgw}*i z0()3^2?D!Vct3~!|%>Uf?_223H z8|dd73D492|49eE*v&u5Uj9jUEnx$5@J7N*gqI1M2(J)cWu4(poRzqNmAHYGxPg_p zft9#{eaahHi5s|AZE)Wv;NP7@!6fkKc8>`;X=Yigo_E65H2O~ zQIYL%>t9ZoPMATMNw|VfjqW2XC%jLfOxw*ihIO(Ns}sXAV_01btFs+!V{;sCrkmek z?^VZkv1Q*?$3C#K{cCOa+Gqe_Ab~pBuC?s2>O{21_N#UJutwIh-q+%9)#7i};&0XB zZ`I;&)#7i};&0XBZ`I;&)#A<7;&0WW-zN0ignpaQV=a2DMUS=Uu@*hnqQ_eFSc@KO z(PJ%otVNHt=&=?()}qH+^jM1?YtdsZdaT9wueIkh=&^|vz7~J37Jsf5oi^dq)#A_9 z;?LEhU-Q0d(Q7Swt;N5q#lNdXuTA)Pwdl4M-PWSdCiK~aKAX^IlXEC7{mGuCzk&Oh zmk2KtutFaz^sz!8EA-zd@T9>1knj-!tMsu-{}aMi0@mrX7rM_*=>B#Bd!hS(BYZ*F zN%$w$Yfnlg zcc*AOQQAI~A^w2vL1{ZshWG@w`($`E0pGy(l;nF>>@e=~_J{2*&Ns0JyR2X?Z%w$o zGvV^agu8%n2Z47b+(rWL6S#{ByiveAd86$OyKh$1<^0cYsp;w9zpk#MH7~3r{kyBI zJ@xzUD$9Q4_~oOu+OFfTt+?z(Zab0NKIFCwx$Qx2JCFx`oWa3igh2$}pU|qzZsch^ zGYR)6^d#5{{R?L_Pg6#Jvr@A&xvkdGKJx2FN7MOxJ*)R%4;^{v$a|E)81@*$-n#_+ zB@che+fKk|@{c1-Bb-mTfN&wIjz+(1(vceDvX?4s4;YQlSj4+uQp zXq5HS0$;>qj-~M>Xq5HS0$;>qj-~M>Xq5HS0$; z>qj-~M-A&o4eLjZ%acf#Cz0+81fHe3Jdt!?B>a)EfhQgt2`>>|CTt?SLU^^gk~OE2 zHK&p_r;;_Nk~OE2HK&p_r;;_Nk~OE2HK&p_r;;_Nk~OE2HK&p_r;;_Nk~OE&-Nw`8 z&j{NIpA-H@_=2#5@OJ{gHs}6>u#;!d_N2daa}Cd?oAkuL7k>}pe}4aiwW^x6swNmr z+-Uyt3n0Oz+)MBqAgo!{tXVZ-KSF;3zkY*%QjdR9&pKAgI#$U#Rv8X%t_v#(%k(6t znl-H&f2E#vt%h~2nsu#`b*&Pgr5>N99-pP2HLiv=u7)+PhBdARpQRq3r5>N9-l;`1 zKl#}bnyEuGb!esz%_PxG63ryhOcKo`(M%G}B+)<(8mK`7HE5s)4b-548Z=OY25Qhi z4H~FH12t%%1`X7pff_VWg9d8QKn)tGVSR04eQjcWZSpq}ULpL6!1EcO`(yug!W)D) z3GWa#6PT@7f16l;n^=FFSbv*Xf16l;n^=FFSbv*Xf16l;n^=FFSbv*Xf16l;n^=FF zSbv*Xf16l;o6u?vTCGEqb!hV2=W3(*pJ!{V!A-2eP4NPrh8Gfw2yO5%Tb{Y0**Y|v zM6*dWn?$2EXtV~6*05eTh4qAA6J`@waap^YSi758yX(=gX}1pT)}!4Tv|GbE-o!fI z#5&%@I^Kka>(Fo=8m>dbb__NE=uYTC;F+AmGdbq~LNCIBgx&;vcYen*$*))@`3=jY z!>@Td`0)-s%dX~0_B2mA1F*Uucna}fT6qIj-hh=iFb5==1Cq=EN#=kgb3l?gAjuq% zWDZC&2PByTlFR`~c2ZCJ#ItjH63eN_avHE4dv3a?<=C^+`q(nOw>A7-M_AwN@EMWA zGm7rq?RMvGw>!J6C(~#*JFMIDO1snQ&gXaae12EYXGsp9B{}T7o@Cec|HIz7z}Zyo z5B#_HUi+NAXU3Su`m;$ zXQXbqa)lIEa$Q&U|GU@BF=uAZJP1Ah&V0W6{MK*1erxT0_FliW_g?clYp%b}itDdC z>}OV6k39Nja^85I^M>!0HFMTNir0*LP{KVZ(MQ?M_%i;H_5k0HFgo;)wgt$HRynd} za%9cq$ePL8gBQ`u-Qi;B0hhp~a2fQ35cGn}VXCZ>hxmRN9)W4_C`^aP0AEp_fEn;4 zz2~2cTFEM-BXTFW06GKK8(42#2;Bf13~Vs4!N3Ls8w_kPu))9v0~-u%FtEYs4Oc)P zxDxupRnQNvhW;=BlHeK`2-m_OxDE!x^)Li(fT3_B41=3sIM92>2)G4C!mTh0{sg1p zHW&jF;4V1KxqRa#^1KYMz^lNXF_{2+MzIYYm(p8K_S1}e{#aMI|W6@QNMOQHvUB$UN ziF0)l=jtTR#YvotlQt9w|epyMZk2jkCsyA1)Ql8O%8q>cMGHA5Mn` z5I(P;h1?RT*J%a(QXT4cI72!7Vja#=Uvm*0v0B|gRXVs!7oUm*qPJARo-{4$gHWhTj1*2Q0n50`8* zel{8J;>#uD%OzVTGNU<5feir&f&(rv{cqk7Ea1ta!1*ixYLl3wVE`y$M zIrN4rpbzwetAR1JH2{*}8W;%I!XUT~2E(J+HXS(E;9Dl+TPEXMCgWQs<69=baphKz!xJzAo`eOk5MGBx@CLjMT*VbvafJ_~@L|*vSPIMF zZ}2|+9hSofumV1Wm9Pp{!#A)Q81X1ZJZc9px=}yCPS^$ihQ06~*a!awMmNeI-QX#x zpBce$obbORl3Cq;DQnv=wK+Ce*M6zZalo4POIgu=sofSj@I1o>d|wFNk!e43?6=w2 z%{45JYgioDu(n*o+HwtR%Z%+rW^5-iV>^)<+llyQbL?-u_4sFV>}`B+_qqmbu4}vT z&wkYN>us6Ioybh?M6PjhT;t+cJAbJ&9Bu~o7i;D(b#8~Ta0g7{ddT$)Uq2aNKN(*? z8DBpcUq2aNKN(*?*`ZHaO@AqC=`Up^{iUpFCYMt$ob1v!K7EJjoG z1FP#Vd`rfA3^c`p1 zZcLC@Skw0k677vy^+ma@)o_OZ)4WRSNXkHukw4pUgh@z^D*-=<3ZN?oo6Jo*6(uTF>?hg{w`p} z-yGvz^KN^03K!Sw>=cse_8o=k9b5%#x$$UX|R^7}O^-91CR7l;-8o;-xk*xSTO5J6yRXj6h zZcww-Eb|LBTg^7VRL`h+=0DVYRtWxv6@oXJJ6R$4TkB+22==VHwrK~gbL?2VoOPa^ zU?*A~>`Hbe>jJx~UDfJrSGTKMUHo-|t*-t$!B#iBf!)Bm$X_AY>Tb8S+gcafo$bz6 z54)>

>Hp*`91&WTj>HKem$WwRVa%(9X0ot-xZ|kqlm8|l+oK=2ruvR%YvC3~MtNcF9s=bf0%I{9+Iac{SpjY|z zoHv~}mEo`Qt4x2DUu8KfoR5^_ukWkkoll(m0wkfRelXs*|l9;RdpTL zRn`2pepL-O-Yu_cxmDaM>SVW?TV2(0>$&w*U4Qjob*jJmFYE8J`mZ|8?dkSX_5Ia< zRYQOEU)9K8{Z}<%_20YH8SdTgJ*ow(|K6w0cJF8P-&XD;?jx#=JDoLv+xpK&s`K?4 zz#a4&z@1nF_+@p0UIVzhyVzZHG_PIs3Y6jLdtk{TS-ET*}-Uat*&gRzj+2tuqy5Mm{Q5ObIz=IuhPK@egEf{=8B z-f#uK5)hWlX(JOKU^3;tR0Id~rC!aR5Z=EIBd z61)trz^kwTUW0{z{~?Qj{}3sQf&UK43Xvh!hYYbgWQa3xh?OBjtP2?u{!gSV1^!2* z@Z2S7<1DI(az)br9 zX4(fZ(>{Qi_5sYa4`8N!05k0am}wutO#1+{6EohOp$l|{3!xia1k}M>_95P}5AlY5 zi1+J5yj>qM=fE@YEO1QmPJM_s>O;IwAJQ}T97nuKAL2dw5O2|kOpYVopbzo>e2BN_ z3(xHP&nx;f`_b>4a}4Qc7z@tq=RVIEdH+28#EpL+o#!0$X7;=I&&owUdBc14A(LZ@ zcj`mDQ6J)c`jGi0`~$v*jqp#{1mD1B*aF|eR@esH;XBv?-@^~E6ZXJQuowOV`{2K@ zAN~gi^qqw+tj-v+#sK@Dx5PudBOc-n@euEahj=?Y#Jk}kRy_)_=26I^zgh1nq=Mi; z95jN)!12fX-yz=q4)N}Hh&R9eyA}g@_dCR$ivfybjCFxR+`$;2F5sK}%&I^k-un*m z)^|u<483@AnCA^_j(yf!46znah?RgsHv5ZJfI@jsDTP=CD8w2-Ayxni1u2)+fBZWk z1A_herayx8N09yq(jP(kf;WmoyiXho(iglx9OCWakb~{4^Alo~pO8}?5`f<@?+b@` zTR6nK!Xe%i4ms7JI#56B`Gi=_C*;(Ilc5fr0u6zFVEvvDtM`PsBQt#mL*~Oc$;@(^S_SP$6K1oQ!0EaX7&n~>8)R%TYsLy>y_Ep8}vSh)i>&{TEqAX)-ej{4U`2^*m`7<xnQSr=L;g8?1hx73!rgbQszVNYF zI9?>@@uIpyngJ)Peq!%^IxQ{B-v}7QtI{7<7u+uKGEAyT|leOI_dRVVsi3rY>-pak0o7Q{k<`# zfo|jajQ)|ia^)Nqsq?mFaXrcVRLp5g8EwKr{arh!Wf5J01o;7PT}}tCO~dmwxspD1 zinO6{s@#3zeUpPoy1n#Y;m-gRv_Gsae0+rUzxnScfAbdpG6TD0 zMZcCGVX6Lk?g+CUm28p6nSXx!we2}7jq(dAqyOZO(aQcwnOgR=M=9l`^yl+SN|}%^ zAE}gb?~&&G<@uuYUze0=zo^_gDGR-?QqrYP%6h*XeXXsN@)g&C8HdWPlQR2|oG0k9 z`RggqOU0Ce^9YnzByD&+RwpHYOi(A~EuHS9lqLGROUiQpJNLS;HF~_DuRR=N__nLD z@he!H8=Jq?Y5X>n^3iQ0jW;t*UvEoEUV3z1pB+j#Aa4w#`|pr8Pe|E}?T6Z5-0y}l zR+MW#MZ}~Wh@5ZGW4qd^br`E08uR7XnDekN>oJ5sR(d@}pCiNV*XbxPKmFlIsivRW zo1f~0bLsP*KOUS2bD0yVofBB4l6q(inx8teLB4z#68%>+ zb!z=cUF7+_fWCzDo_Aep3vW?sd-f&IeP-nL*Da|{BHM8=Gc6{6d``&?Qu}*JX`8&& zIjO9A5%r_Y|gZM#Oulq4~{>~4}w$!2en@zZny}79)!aBbU${ekKmlIRR zX+38@U4O(r@#4_=eg^%S`$?S~mI{CSZ8*3!b$VgFA3kIQxwXG0X$ihw+cDFZ^3&vo zqHn|HgwyLjo1QucUutk<4v+o|hkbv~{}^`aE4dPN<@IZ>-$$77lK=5$r}Dg4t{mPL z4(oIga}MEjT3_gVu74+aZH-JBh(zd*L*5-2z~ zbR<eFi_ESmMr-E(B z9a}}(!<=oQ{_|rC&f|vXyb9*~V~2_x3;dB=9sSr&&5Ufb9_QVdx*<~M%ifZ-9))#< z!`{r?`93eg+wo?mZY-QGGF%5GM^>^gBZep(P#P)D{Ao~3Y=I+}^mg4QrF5)+MJF>e+rYW4KU|gY)Kc5`+ zQ=C0f6PHQpjZWQCri8~ZQNjMp)_za)>Pm`>o+DE0C1+KQ4F6)e%aNCWFSg^zbN@Oy zkEH*?&zKyJ#nG>0hf~7QO?xD5IJy=bUTH_tf3)$3+*&gCglqHmX6_Hmg}=R&EL2&6 z!uqm=y|1#EWr*_8=e_*;qogQNmEVRElO2`FV%u<7r5}F(g~tir($syCRfYF?I6gAY zm%URNwAD%F?H}YFX{vC%P7^U+h#EgJPrHyZ3e_JieQ~1I6gj_FN}m+S7bOtwxf4HG!MP9S#r!$hLh~L`ii@HudEO{WhTpxaaNqrs z21WWZ(aYhPfO%n|MRy@Dx@FjTB>QCfLvUBfBD*P3ux zBqDBgt~T=dyVCZz_j+32@ce_{PepyFyfP2tS=Gq;^X)8~RN^z!OEM2#Z6dE@k#gZ$ zyxn>Bug{zx8RzANy}UBLfoZ+`wukkRX$!~^*C$`^_g{hd-%FrDIwOg^Pn+zGVet?1 zU1&f3(sp_4vziwzBjOpnqLGI*-cQ+!4h0TZD8|o?ZqMNs{>MrmK6ezpCKtHhPLsW* zX-Qt&v?*S%w85qIK;iSPcUyMe86`4jb`w7ou0JxSuwjZ9PSt^x2Cj*kG#e|LeBj5A6ft9_W}1i z=H!Q>Oa46(@5Agv&t-&DmF4*Te(BD!LZ!y@TQPHOFXO#Wd|x_|NVUw?ONP*&NEFder+@k!^@fU6Ne7 zT}QZ|N~$z3?r{1qT%5lyfVU*Q74KEI&PxBE&5zc z_&HZUHvf~}JS-owwMBZpTpjhd4aZWa|9m;`godwA`7uSMlGZkeOzpS9tC!x$*X3Ue z(Z&zNc1F z5xMJDq_g5>#_rsAggMq`rVotF<3AT(c)o!&L;N(w9q&3%;rBIar{5bcw?IBUE~oys z;aJM$*Q(#Uj?m@D7L@!p96XRds-QME#9ADAVxZ`u2bOP{OHKIqNO?o)D_!;g&| z2Oaz>*Ph6IS6qp?Z743bpx#SLpIuOMq@mnCJF?u_2M;S>cwM0`=}Qjf8+u48UI?cy z@V+L=!{tTZr^rvcoVDhGj7)ySa%uPb!flA`v&hP#^`Ebsl)n5> zvT&dHib(lTf;^$5xWZ|pgrmKe6D8RRRWUtqy!x;3*smCKil_@*lZwQiP?V(yBG;@b zDZR(LnMb;xN-FpF5a)fIzSg(XTbr&ORmSD(kEPw-H|boZ!=EEtH%I4Y-JIM~%Jv+1 zN$ci>tttLHL(j{F<0F0Iu&$)<$T3Pu>B<%txo%GJIS%=VQIhlt#m|DTD7Bt@7}*4UutW8e2?^%u$RS zZ9H5|(&MEr+;_jEUhnmc_TI{j&c3f3?niH3M(gmt3V;8iI+zD2{X_i`^A~zug05V% z^WJSMDZk%_lHw!dyyRle0g;KyAm{d384~(QBG#cQxj!=sy+c;U@=qkA2XZ)Cj^vZk z^GI^#=E>;eeP3`59dA>{h{*EzEln>FUY{{2G8~pUo<@h|BmFL1m(Su+dkN(y`HGv-9b zd#f|%MTQUh&$pdjQ0K>&>G`|7eBt}?Wyup+ccknk=f0oduRU4#i;N4)rIis*7y0d9$Gxl!{^JyL$y+lPNv(``eEHC|qE?1}R>r$7V?|l6`K6^P zEk4pVU*=!j7ds~(nYOfR_TknWS$1K$@V$e=@ns1g>faI)N7~HqZB007$@5Mb>%!@d z=l8*gu|-Ms9*w>$sr=tkT-3F6F);ESHodM_8P;2l)-L}ZS5bZbddo%Q{wSKGyQa?J z&cz(-Ui9rLi%lhub&s``$ESR6QKkylRMI^;-tmbEr#qhC2buAVeAd6Xx+Bl!#ijW@ z>v`uYA#8u{n%(~Mg_$+OI^+hv%sb_E^L4*e3O~ye{w_;-hx^=PS<3wXm!{Nr>dMe1 zjMrO+la)4p3#W_x=2&VI87@iwe{rr{l6izadPzO^3*%a3cKC%Q9JlP8!+uf!9r`~$ zzmfkdR8q(N7Jd&$`hSH=YFBA--nPt#y@>x$QCj-r6<^ZWCensuyWcWrMb>rv<;-Vu z*ObeA_L$e*rfm0okGUPcMg^rk!}M#|bfV5EJy3LA+bD@jR7IXI%HmU&SlBU${4Lsa z44Qe|iaZ+Q^5bUg@4TWvx=;Um-aX#v%$44h%+zojyp@@s_~EdQ?*)EbI2=xQINycy z5?-8F=DTGr2fN-cF0J2&;^K~#zHpnu_4xf4mZNhrdfs{hNucpQYao{-yRrUq|iNTi5NEw&z6t-&+r4 zwL4;qgIV_;ao!>sv!)hN6;Wgt`wU}|q=gj6^8ZK`s_I0rOg)g*jWy&iEmP7HiH<`L zWc5A{m7J)eNDpN7E226AMR9Wtkwy7)fJgG|LSz{yCo;R%Xzw_7I2$ytZ-{CTkEO*&*9qu!?ztpDxcfW_GSp&~vYf zk5<`bd3P*YUEaW~QHAy1u&l9#b$^ubFa16JQTpNdv?FW6@u{a^E#9W}rOe3`O#lBr z^c(SW!|#fD{{QpNd*{pBR&?)#b;bQ}+3^3QD4O$^X~H)BvQmEkxxEQl)0o%O>xmsa zkTtuw7I}TLo-Z!$g#Os~fVU)TVS!rOWxZ7(Ts!Nf0^#3aphz2jO&bgM->+%QF|OO& zlC`A7DuP+dON>8)Nbl3E)kl!6Ko;-Q9R1vfRLokNACbkIL3y86VIlmT6>(=hPggPP zt8i>_-yD~li;FuR`oe2r{o3{%k2W9EI(lYpKc?mX(F^~b_h00^%n2Xyw|lTg?x)|b zmA_5PyiM7ek(PNkX6^DuXYGyDl~s;5uNX~N*7ANo>9P*|B3rv;J34=t>=uVrPIx`J zP_|hhU%0#i%Dg~Hb#%#&&(BiII#JKdf`2V0p zs0xbyJ1}K=6S;7E9?bo}a0Ls?3;AV6rVsa@A6?QrHzmaV-mVMbdnI{2@~eLxpZ+WE zU9#-PhU`I+;e7e< zpQrOa%^nevUyp8b!`b8V^;|19WlxL@`!fIkaI#d)PA;rJ((qCJ|Acu)M84x0eeJTM z@3|h0aYS*?b{tmU49K2&Sm~oAF6$VCeK{ve_5v!>9Jl}XS)k(Ib)ew?`}|!uCBk^` zpAms$AbKAbJ@@m!QddN;Dtk?I{cl^V*Saj}7v3&=-EX@EMXf75=TbC9&f`UOzn;dM zpS|JNtNldHg?r$rTsI3BdKAJ(XCBsH-#2^XQ84E>Rm740Kegl4h_bG4biC~Ob?V7c z-j1A@f_3L4NK8)UL%IezHGP?MdUn#=nA4!Fp)4zPf2n4*8h5vx2=@_l~5_ChqkU# zPOqb7CG$glqn1@ECn>7FBxR+Xk%yuy&HyVZOVDLsK3clh47|G%C5 zPt@c7^_*wJ>2gy=-_zl0rGzzf#S|v|4XpDaDsBCBBqs@B5rD3n%fmZQ|dta|-PGEhYu>M3iw+FmW*ThnM3->R+P=ynn8*dc5mB8t=m%diJFH`bI}=e=&KzmFt@yahbo7jDLhS{6@O+ zu*~qjJFMh??8L5^6GalF6jNz+j6?D7-^@|MdMQ_vC+ER(F(q$&<*m&{xOM>xF z9qZd!MaPQxbye1TfsqAroNh&B-7|5zuK2vVd}|YA3EQCVJzF1p98+i&@!u4U`$UW(Io#Y;ytqK__9@7Z{L49Dv<38r6{NE5d4`uMSR&tn}LC$}x~ zo{l|5Z`*6Ve`J=^_KR*yIeo;&<=OTiu`#+WiK39>r6yZ)uuafyNifrW+4!0*$2;3{ zx+mkcoFIQfQ$-)=O7GuzxeQIbbY~lz_shBz*%ie$UV5A*HNw;#+o$O-05t$60>oQWKp+b8C`$mMmP#OSkSj6Rm)CHEJth;_7u z@p*f>9vacHj_#!d;~!{TU0S?!(Xlq$px$4OK7L|zEi|*xCzzRR%jx}FKCeI5YyD$- zo540F?>IRhxx8*;Z0^xz`oEeOeax5Bd4sxFW3+8ST}z_wpBUYrqR&q8ayGf#yrcJV zWXbz|wL%VvVr%NYiqZWOlXoQeX8>2%Zs;C}k!EO4(!Y)b^GW0wsmC_K9K_bqeNtZA zvGELeVt%V^HUm|*p}0lxVgVj^I9}9a<10<``Xa0uyx)9b2OSb-G}kg8CmlB z+27ZuF2~e0np&Tz>k?^9Y$YwnNONS-`&8*;+s-?}{bR4Zt}9j)a)Q~At*K=ZU*??0 z*42Gw>phZSEhj=9FKZifo)I}TSK?5ir%{V z4DaZkPcT;!n_zt9Z_RpaMIXuWx`Y_<&tufdHePbCFa9~u(fv?f{PSMCuD4uXY44!n zY^1mTH6pm-)mlzqTQ2v^VEE@ZS6@|KU2lSsh9*AmI@?6Y`fZ8H>zQ2H zzYf~E1XCX~G5TB`qkkiD`g~<;+0HG~d|Q`LpKZK8t}5w0DEgX`D1N`W+Conpkw{LlVG;c+b6Wfzfy}nuGs&`w(ccc+mm3nLKCZd$&~5r=_g71oUD-< z@`-Gh_l+1MQ@%E`%`1#o%q#h8WM0KzWAkeBIlw$>8WUUjpU zs*6<*YqjdBZnf5^KdC=i+tn;J%lb~uRKQf9`d-afZ&*L7H`OM~Q=9EX)y%GF zS5--Nb-Sjz&OXgPO%1Wnu$!qH>=t$lHOy{hw^BFR=i2SmaQl3_gBodfwl7qp?2GIk zYK%S99;(LK!|Y+|PJ6gLT#dJHv2Rg-wkO&TstNWJ_7iHVJ=1<#J!n5;KcgPCpR?zw z>GphkzM5gbWWS`Iv|qCqs+sm8`wcbAe#c&_X4`+W|E8X|Kd@J*x%L`6MZI8W+L`J# z`wROYYN7qL{k3|--ehl9i|sA;Hubi>!``djv;P~g)XG305T{ZC@qzLxJ5VW5L#+?g z4>VR^2hIpISN{r}6=<)v1v&;gshAdDFviCTPoj2`$&U?;# z_I_uXv)ullv%>i(AkN25N+95*IT?X+&NgRzAi+8491J8f;EW4YaO2%dfjVw=w|by~ zTidN2Xy~5qo*roAwsczt8oTY?_JJnu1?~lbGu$q2mq1gur`s#g%)QFJD$v61@AeOz z<=*U$2()xZx+4Rv+&kTS0_V8*xl;oj+=twU0$trl+(!Zzx{ta~1iHCTx-$cpxKFvW z1DCnaxz7bc?p*ifKri=IcR}DPcd@%TaJBoE`);7WyTn}oJ6JnahG!NVr+bOnF;O^LNu@?mIpdJtatHFA{26kuJivA;e>LSn{tS7D->2gDxf=N+ex+6Tm99npOj424Bm+59 zvXHaobL21ht0J4_Uu?JXXUI1Gs_@I+E(X7CMyN)4qat!8qmq<2DjR1bw=!BuP2(J+ z19C@Wj40!FE=_UoMX;I^Md(;IOcrwMG2TMnTyc8VZJFRnQxiz$f@RE&3BRCGv6b2iMb5(s~Pj zBcHF%NA93HB6m`qkS|c3k-Mlal+#spMZQp7NZxLWU!3Z$E@s<9^*|F+AxiG0dXejL zb+edigc>21x<%b0SE-R|q_k7Fs#_&ajZ&kewttO59<3%I-=*%78`VVhB8NM--3 z!)LG!WtSO%(3 z)IX)1+N3r~jQU1>BbTYoY71$;Ro{|+tJ*4!)i$+VPFCNk@5r@7{hQd`YB#Yzs-KA6 ztA0jvP#r|$DNjsWY(q}AO`Fl7&7U~7vXz8v+YU(34%!@Pc8nb(0Xx=?m6Pl^8=t|B zx8tR;UEVHFY=WIYIVagCAt&025@%PiIVSB&c4hQc>}sU1ZdaEWyM|pudf7GYnsSzZ zeU(c7^;PQmS61Y6?KW)N+HIwc-Og?&UAfAhFBjPz><)6CeSv)e`p$M|8Dw{{yU6AC zh4zJLy4l@Gd69h)DZAU-S9QWdFtf3-T;`7V=Z} zQ_{+wZO@i-Y_4p`T-}kMv!6qL-hLi=u05AFzF@yV?JwFdvVGZpneA)#YjVB4&|XNZ z7uk#CQu_`24eEWzUP8S~?WNMw9|55Gz+Qo7jlD)%*dN;;%Nh13_NUU+UTd#K^O^k_ znss)HH1Nj<$czulZK{S75-wl|Z0i@ilU*x%aUN=JLEy%l+zy$yMXy^~h& zvj0uW-S%$k`qBOod5`@Q`n~pE0_|jI;Jmu;L5-)5*rv9xJ{}CZV!x=_JMJMameEX5Ii7f1b+_xjC?S7P|jckW=aFca+q0gT!(o&C)UBQbK;yt~PC>5gG(g|bX@Y!)(_AVzXF4sUymOY*R$Ql@(@ttR=Q-y~U8jT7 zQ7Sr}oX!&ObaA>$bw+z32|B%;%gNi@=_jUhwR5#Jar!&`kq0=}pdaWAl#`rmok4P{ zbDc97`FiJisp$-HhDgAVL8Ql#F-{1JC8b#p?TbSLTWfO9Ip7zY-cv*Kkdw=%-5XP*e-My($d$R*JE>2&E3joWEEoIZU@7m9gGtlY zZ7Vey4WBQj+rjNfUPi;{d%BDb+>jfR3*26AFEosdiDhKW_Gb5HvE30aeeREs(cI~d zC(T{%-E1ehld$t1_a17w&%IA7x|7|>=%=`hxZDTa2gp0sor;|7GVbz6(o)Nv=1wEm zbay)2$K1!r`?&jr#51;jk~A~jnUwRC`xLRW-Py>Dv)RsbU%-a>?tE-`(R~^DRrgi4 z3)}_N!pK`<7)v+XCe1tUU(qaem!bK)%bs#Sa6d#|<*q_r?XH%S-H+Ul(5!Jk zre4PAq|b0OiT%R;0{yox`@;Rs{Q;YIx{SfxUG8oyVeBr3KX#Wo{@7ir`D1r+7`u0q zO0gHkG8Sb-S%(pPJ4W#5F^&)FaeO7l@gb=#z4%j%=r2d^E&Y)PNRm{RYZ%`L8Qo7| z`v7D5mW=6Vu)52W{8f=xWdSGI*Z35+XEJ+i+@kL;^3vS&XTe_?!INssRHD!3uG;KhOk!0B^@!bI22LwI|R-djc+=KsK>C_yEvO<*83vZzw-ooXS(;J^5#=6qFk`nq_ebM;- zgQ@+880|kKX#b%S{=*&AIL;bJnmesKk;hx(7jZX3-(Ds$EU3(Yx@h-lh{LR+CB-YwuZNbiO@i$_%zfn*78?n{_ z%VTWKk4sKd2EIpS=87Cf%)al@JkR%tRk0Gx^F4g8qY++5BdMest0tuMeUJ0C?@?3x z9_{fxT1ZuO79L2YJm16jI^rU{j`Q(1IK!%rcpB$xPs3213wakw%t(d3i))yd>M8BD zkI@JpgR7(JjgL`Y`xuq9k8y+cF$QTLBSCu?hV~_DXkVg+_9bd)U!sQgC2X}oEs#4S zJPHF};w}7yd@sV#Uc@chi#SPp5wZ9WnX*V_C~sBZ=|R8L;j@wkS=yt{E%+i1L>kYke=EDxlMZ@H~I5| zjM14FWXrrDTi*jo)E-C$?SUj}52TLvKoYeFQbBtliP{6HqkWIA+V{9Z`yO4j?{S6p zJvwRM;{xq_bke@Z1-9>dbke@Z1={y$W6!haQSW?vK3nD*+4{c680~vBw0+;Bx%NF0 z@jc$dXIO#5)J&@Mg136cFAnmjV(pq~UXK4?lwe~=o`7@Mw z9h>k&nrc5JQTrk1YCoix_Cqe$en>Cvhg`1xkP6xlNz{Hw9qorCYCoic_Cpf2A5ua4 zA&J@#siXanMD2%Ezz?zTMtnb{v-U$eYCoio_Cxw=KctQJL;7kzq_g%zI%+?pt@cA2 zYCq&=Jdo4zPZ|Uo$fbdX_#tO&KV*pZLqd2UO&Q-e3pA4(1I_V3F2(m~NgChl2x+fl zr1m;SX|Lntc>>OVx@;a7t7Z7 zL;7exMa7W+{WZx&LroEAB+8e2+{gA=T+H&_J=mxnX z%G_-o82jb~DhQFy#_5?(|iUP?>trPS5_NiC;_Q$wmcHJw_F^}}9DLuu?Z!dI!H zeU*yZS1E_DaxNZ18>fw&>9oafakSskNc$}fwBJ%w`z>+WZ#h-_Ehc^oBMs+D{1!v| zE%mhDa*Fm_OzpS0+HYxs-*P>^P}pO+0nf+xSWG;YG331+k0nNXEC~@Fi={o5SnaW# zu059e+GB~;9!q8Iu~^z;aq(E5mU_-}_$>kLw*{)l_Wc><&+bbl?bVdiUQI=RcAs%Mv-_0k`!fmJpQ*0>8C&}^W`sYJ5aG|5+MkKR zpP3-#@MrGA^1JbB8f&knw)SeuX|JZHd%t@>wfJ65ZM>SP_#50Az!Kk|X~dm@N2R^? zXKHJIrkwU?;&2h!H=43mNU zCkLP_5I%Xm$SLoOoH`Atqux3m8X|9f^ru$@>^OZ2Q10optpWYifPQH}+J>!REW8W* zcxZ`mBf^acHzM4)C5#68xG{a&gg$RF3Kqi-_F*F!39rC*k*0*34gnAmhph?EguGKY1IiP0rj>f{#-|-?F`5k zX;%>_vmJfVE>+|_>N~He$oa!zzDTDLun>L_xu7Xv;|17w0XBBV#?I8)dA&%Ns?Zl6 zhjk)d;{ltxZWQT8zHXG)?In?m*caWG0JdC=T^CdD#T!I=Gza!ck1s_oLB0fgFUb_S zv;j}g>SRvAfa38{bD6h{#!2T;+!5H8;=u5qQhrlwCs}ceED(dYQ1KnXNd?j*q zOCav*`6B)61MTn6KJ34nNhWlHNw7lX9>Vt!zK8HVewecEC44X8dkNo1J@<8hi9mi#kjaE6 z6P~;r_KV!#1~BOUB|vxz;VH?mR^)*=!1f0SKY(phW1t<-H&ee9d9Xgvjt6OHGX0xO z8;Ed!FAU@lQn{u&2_|2h>2zf1Vtu0R{!T>|?>-fIK2<2~B( z-X4)9tzZni1G_|))q(9Ie`^FoME>3rsPFICx}4*0d0)WxPl%Ul7`)B!{J$xj70tuFW*@l57||r7jPV86ZTho z$)RmI*qXCOWW9pkFb$~dbL#%QGho-}%K$q!P~V0T@CvXmzo-iXVK%H6`LZHV=9kl9 zoyb38M7}2N*VMO>`ZrSk<^<>gQ(%e67LMyJ{`X#yZz=!VN$@`G7unhhMgi^Jx?N-& zeYb54EQTLMwl@Oy(RSLj{VS30sN*~8_>MMwM;ms~h8^tx9hA9)GIvns_mufPWqwbY zJJIi4A@Xn7gWY?`x91a)pXiIdv}fNek^SREehvVA@iTq#Gkx(hwjRXRgV=KLCD_2| zYBqey{2TLeHuoKZbHs>w7xsw}+XhAh&m_d|5F@TW3>71Or5NQC#7HDhBF|V<90-(C zc|4G}@*Xj&G>73ZA2x|mwKm|#RGk6oVpJo4wH`19R=@!^Ai&0&8^owpQH@Gz_sqciq)?h2EDI=UnP>ATRE zUDk`ymG*U|EnR6#S8TnI^cRx;LegLOKI|8xTX&!>7j**KaM4;Zx(9%8_X$A0i@O2s z??J!y*eJ#&HK8wH|0VR%rIlf;7(GY8JlHHos2(K2Ofh;56XWs@Fcnsd(c6UfVqDQ$ zj6Tnc(YFnZgC($AjH_Az{dd)Jz{Y+p#kjgIjD+{a=pQFW5^YQB1=E4PxF#O3^BUTI z4Sh9`z8FXw1`eZ#Q(CdwXuK#URe*{yxV_){b357_>v zOfg1N*61EE1y;a8F>b^5+bCnqGBL)|r(-7pw%s9O+=;z+V(Xm?fbz#v_xOQ;ZR4rq z&sAYCJPTinF@f-e-Y^Z;ig6cqa*a0bnh2DC*IqFu(kBz?--)ll7BTL|=DSD1Lf9_G zr21mq*AwXD`>=U(06GCSPNtocDdT?1xSular;Ph4V+v(FKwnLzzNyqVl{O?d1=2iB zcv^Qcrc>5qwEr>M{}^RGL77id-mH3JJk?5!+55zJy0sW{+KcgQoEXm~it#+(bBUXa zeRHX6E_KbLu6ao?3n=r21~6ER`PBI$X45`;3YBMd|r&VY4>0Iit+9^F_vKSQsVyBMvUb{#rWV}F;--Y@nL1?12bTQ7%S=X zm4sJ54(r8OwONdhW&!dV(yqA_9)>kyd~8BH7%#>ra{&84jTd7rWv#0tM#@-t3wDW- z+60EdeApyLT5aeDq)kf~Bb|Kd*qA;UR=`0qGFrnJSOh!7$ZQ1kO(w@j=2v25)db4m zKkym+XDcI{dUB{|J;%p-j*s>G#Q3}=jDS~QqZk{=vtc022HNyRMYt5E!fG-8fertd z0xQM%iuQfg0mj3-ut$uqTfj)brmwMSBYnPc5K!Jf`--uN@;71ACT!ZA1arjLG6d$s z7BRjh{kMd_od@*ow$3mKmILK~M>#ua$M;Re*x6HzU8}|Tw}MVUx_^`I-}KGyb}$y+ z0rLIW04Vpz`9QgQ>Wc9b>3>=w#$NL8rJlWn|3h2%#RFykm*e1nwD-VUK%GBR=g-4| zzWRBK7zgW#;dKJ;wn=rKV_YYu$|`^BunTP9UT z0r!Qg60WvG%<4^HpqMp?tFcSWT3yAg-3EpOvoUo{F;7Vsvo2-S#r{)Qi&+m{y$)iY z)=td&lVGoyr?(Wd!APL&hM$Ppm@=Cz7qcmL;4_;oVt}$+kiI3HGe^ueoy2U{90rMr zuWO!{Eav%?(QyV)XD4jx)E#J7rxkEe%nMq>XjlZ;-x>QmlczIvblxLomsT(qmcRiq zyOO>u>ASuIyT!b)C6N9?(s!>c=EbI%my8kfvbAFNWJa#n5SS@uZ~EuT5n}dx7by4Y z=0Km|N19h}60<*dV*B?KGpUJ~*YJJK48Z1r*gO!M2V(O;Y#xZs*R}!bxRyGvrK~}% z02>D_0c^akJxm1B59Xb!!5v@{ye~YyDdv!=V%|Xd8{UFlOes<4Q0yE!2R4X#V`bWw2jNd_407(!W6Z7fJI{ zU%-}EDvJ5)G*~OFFU&N?yQTQ24j%3nr#%h(5hTPf!9 z_F}H6E#`-H#az`w%+(9UToWhe$Jp~J`)}<6F+bz`v!P%rQiuo;V-Bwl1?TOG`%=LU^6Bq*Isk5OVr!E((9&J7?4lWg|K7Chz zlvoXB1NJwpBUWSjt;v^SHSI4}Gtx9~4aA>G-DgtInbgsedRtW%>)icfwV{kQLxDbQ zlPOkP_CZ^0YCA!!cJ0JE?+3BkQ%3tqut}`*vG089JbxkV5vv3FJJ9Y9gga7C$1P&v zGgzJ0i*>;?pq-t0E3k7b7!I=_Rje-bVHe8nLf!ZZRu^<#1%?6gg`~d_d+`x?nFZ+o zZZlw?SQlZ}MKfW8Slt`Iz3`=27uN>rxR^S7!~=OQA@3zUVLD`sb!kl)1aHA^u`X)? zXoX6>Add@0lppz3+;3ALZN+4+O-TO8E~S5bGi8eK=XHY1r{7_D>%v)??&( zoIZJ+zL-I}CrLAtx@L_Q>#03r&E7879QyYecozA&MPkkEFV;Njm`{JqUnbUzJH&b! z8(&Tr>y;T|y^2k*Vc+Yc#9Gt_kQY<#TeR_=20$6_RTXP#O|h1}CDz}t>HWd5T&%yN z`}=rcUoCG617SL>guP;YK>iQ<0eL>a<`3vA&V|;Boe{_Cqic!124e_u|A4}4nUheng{g98VB0IaF_$B zVlke#K5hv^VK$)qgf@Lj-n9>l^%>=SMq5(In|e^Jbn4BZ{!H>^%@iwVvRI!BOcLvh ztz!LyKL48Xzox#8l(TWPSpTG5o9e<6vA#jKnX>;?9q5C9k^f)IV7FLX8bA`ze_Pf7 z^?i$N-wuOkfikyZ&(=;rpKPW5TQ`ffjk2~;);7x8UK=LD`*1+4@2Km$X+XLit>9ju zobQ_eZTX(I{XqZyFbEclwUc)4>;vH2Pu2Ar~r3C1DC>NSOPzY;{Lq~ZW6`Qy2>GsGY9sH za!KcI5EVn7Sl+bY=|mN~2BZzh?JTIzNeNnY%iK;`{rzDH2 zN4WlSQKwU0!#Gim9v9W5j;J$8-@LD=7KB@3drR7NHuas|3ns!s_)=6W+SdvjTMYry zwxX<7J4BsR9ccGC_X4_e4v1<^y4H(Coy+&R;{kme1*B_({cX{=r9ax$g_W>b)Ok~Z z_MEq0)cM%lfpR-ybI1O$L{ul*e8B`!U8uk7`=Yv0?nQlpdM}zMs(S~ZEf>!h)nl2c zp3Q;sLfwHnF5fPy_h_Jx`qUJ4Wdi&lsxS6jHA7UtVepQqt4V+LYEhhnRsVER1Nw?`JX z)b+h#GQ11eHUyi7TnZCmF>DrfLuH`PZWsp(;44u>v3qDIpe;jb>(KS0Zj6C;Faogi zM(iGj&BI#3P?!bSJq#Of!p57h@g{7%2^(+PD{6QXKsS7bsGGNn8i6ghQ2s5i0CkRx zhxRZMD1T(C@TeTL0s7+BIe>1I2`ym=%!E(ifT%w;g(R2;D`1bP(e=X3}agPvwWFb)Iw5Bi=mH>4=+6IV!^exyUYI;i`Je~B@ zN>>AERxL(SMK8&yUvw;vatth<}3kCn)a;%6o$HW>DUYaX|bG;-4h`N%B9r0Jeyl ziS0AT1N(9&w*Q6p{be$&6dt97&M*P!lUWBuJw@L>H3rzHPwf(gU!-P_0K(kwQcqL< z(<6aCdwP$kIn9B-nzImo5cNz;z@BH8i+Wa|Cp-&Zih8ap^oHq>E{Zum^*sCJ`6;kM z)Z9e46zJQz*f%c#oq&BdkMi)d)C;YE`d*;E7Y_a(b#DS6MVb5$SI>0!%;Zi8ApsI5 z9N|7h+hARXJAs4yt z`#z`t->07$5+DP^?tb3S`^!+%J;PKzS3ULAQ&mqjiR&x?l(#OC#IHR7Xy4ap-`8m* zt`7pt1E9S1$4UIAFW>>dDnJs68}R!LX#WN)U^f8c_bupui~7L-CT;{jY@7yI0yskA zcc|}oXwP?V1MvTFgNU0Z1D*%`2tfP49|Cw3uojR-;^r{GgMg0#sM8PVgC9_*A5e!M zP=_CV0J8vV0Hq{ui2y7Dd=Jr`dov04Q@S@V7ny_y};8#BFH9HuT{({QtH? zByLBYw@(8s0sI80C2_}Cz%zg!0re#QJPz^Q~>BfhZA?(N!$|!cm;sZd#XuH7y)=35D&;E5xSkYcL886iTj=f>?H9Q^wlqS z15!!+bv>Yv!~?*^zE*@zCLY9h2UAEq)En?10JIL3lXw{4A9)P0hQy<}BqojnJOx+< zs3q|j>Us=)aqI}7oy6m4=W*2QIB1_31y}^Y|DQ-E@#GUEo|*_)Okz@hzyl9Qxqg4gktc0qqpfOIZg%z0QXL<^xdHd6bok zaZN>gQ!y?VaJ>)*KpoRiUK-k$J{IsSi5U+8J|-~}Q;a@7i=c6D1gM`N)k&(08oAj$}h<$u^eqE2fd0660063u_lPbI{daCpBoxUY+g@d zE9%sWa#~SNJKAV}oFrNaNFYhKiX=n`OES)s7_&(7cnz?VB(HrW`MeFl)&DmD#DMu9 zCn?ZEQcs+54PHc2?~^3;SpwKVQs_jI!giBnCctEp!a;k$e3AwY0pPb05hM+nM$%A} zF+7Q+QJ<28J+1_sp)|Ibq+39D0)9I&jikxIpPE6^ZL>*=dX}W=sN0NGlHh}qVAGTC zI7HH{6q4@r1H44iUHHvCfh5h@MACh8N&2mkqA_Z#9zr`FE+lEu`v8>vNMFDMfK>pL^(bgQih4b|7y!DDW|QB%=p`U~j)4R}u<0HCj)K|7xT{b#lTno0WmIKbn8cmU`;i>xHi z&I17FS@g|wXcyL9={eNpxnz=_$NxY7AW2IGlC(4kfc{*HIxI~i>BZgv;J%38zKGwx zyn&=wKPJhFHpHSXap;HTH8=&>Z9KhRvlO(;V1EB72z5+-9w3D|_3ckddUqH}?}7IFUL<`GL(+$+--n?8Ad zX%og^Qw$)Mr0*91(1y)B0Hq}TFa+={U>g9Re?%L8d(FmA9 z(y@soA!b23F&6L?U;`kZq?40LN{Rs-05p>XzmSx?lB6?Z0BF-$+@Hh!Ib2hQ0MHjH zNhF;Q0?Y)UFH!>mpn1Uyu%4te3rXqtKK(~PB}p0RgUr5wSU@gGSy2G|?qYAiDIrZq%`r{-utRblpWi;ZxX)#I72_&@v&%T&snn$v*jb!~~k|mtelM_fb z%mus;$RgSJILRh6;8T)4XOrw@C4{;I-XUUO@o-t{3ow zSCQO%D&SGTMi<%dwt!+l9!6hQK$kCXh^Sd#zr8UTIrIOsir`aXejp9HW zg0{z^KVv5X(DvAm0ibE~0-#A0}NPc%Q$?t*w`?Vy0fU;MC&W9UG{%0WILBP9!Qj%9c zPV&Fd&VS+m{*7_?7-RMEev&^yn?FJMpCps~sR)=w^5;uQ{^EH6>acbc0QFtFljJW4 z0)Y2r7Rm9cB!6|5nbEImf`!kjsgw1QSxEp%Rqi?p9qC+bsk zbJHT#Y4(#=i~5Qn%Xqi-s4Z#fXsE5PZ!WGVtD)jzgMq40uiCOURc$G#r50T9tJZ+t zMo(W)PhYR*c6~!ba4>mkzdCpR{2Bb}Tt&q>8*jabnFzVaaKJ&2D{`oz^*TY&37%Vp zX=K%%MRS%}g%RkU^SIHm@^EPd!DZK>pyw3QIEBAlK_T~Q3i6e87|SWx8HHF!1&;9w zTwv(h__=JsO&q(Lmp|HBejO)(qvqFbK?A37fK%{wQW(i8SUM>fz(ZH|q7|oEx3a$S z;pin!^er5{@lp$n7z3jj`54iDqgmrtHU#K>jRLM32`WJs2z?2kH4;LjmoS=-ff3~! zF^aGPry*hj>H+>kF~rbyqz7P@{T|<73WAe`_aSP$&FSW zYXc*9lV?rN;!pSHz)|4f(LJfzmtMLr%>BT z!8w*)C5sg&zqPT{rnD7j;~lg5SB~Dn(6w33B{!cF4hgRDB04dM1jE0CfkZxRK7iE& ztAq>^8oY#<>qw+*UiWrh_esveD|zAVoppD~1(lq_9!|mNq%e+Cxc&b&g`2Kwg%>0O zvZo+3gC1Apbk^ibgB^ot6{ZE*toj3tl@uCiv+8^~ODkl=_ahlwE0lp-3uA4CVy?I1 zoaB95aYf%cW>_yb`u6|-6#P3|(S6^Z>C(5goqY>m6`Lu%Z`IDe4Y<5-C5)GZ@nRBO z!gxs-F9m}Yr=U~g6h;EK&=?fdBd&|o2M$|(y3VxUZpD0xq$>4afcFeV65)M@f zDhX%31cPI)p+pa0vz5mKC3>Jlef4PiO0m*lo8Iq5`UZC;HeJh6v>*xh$87r6_o)PT zfi``>FBFD5KPPX18cxGrqQ|E4!XNFy5DlTQ_OVxe@u6iMt7Nm?oS%sFFD{_xZrqpIba${GFyp?^rhmAc=HM>Crk`V`1-NT+jDEKizhD&S z;a9hHq1a~AJ;x}{#`h_pQ;u3$$-|}}Wv0ovGdTIle6?PtEhBDgB>$~Wr0I6(rK@#2 znXQD8l!N)zOp)qB%&$sJ76bg5 zAXXrVwVq%UndEe?`)oe}icAnIn23U3gF_M{S(Z&7GKq^~1)}&8QPC#qkpI*Nn+&$g z_5(#fQ1ruS`GJcW#YpvTHO3*08QDm6uR~bjN9<>!iv?*QqD!zxXE?-K^63 zt!wydpirBQp0m)0T8(F;hAB32&SECO6$o%~)JP`5l}i%5`&~pM-$fK~RnZKN(2Ns( zndr14bCh!z5sKChL2E~$UZLQ+P_)+fa=FR0BZJef0}Ia;CLJqNoUW3QajpzG7}u)} zIIz!jHQQ(kn89hXiSxZ&<}t+#|HssqK#xoZ6Y2Agx+ZB(c`=>6ayY8am z2Z&mytIyH~N~O;M{}w!kMN<)(=pFj2Vo?_fb9YW3~0q=mZm9* znx)B~wzI)|1SRA0HSJ}WDw^%o=A3f!D*WjjKb_;}aQurLzfUK=Q@Tqizf(6(WV-Nn z_V!oywwJxlR(QYPi+*SMss9Fyx#)M~up%)#yEMN#Hr&Hor}OvK>-7!!IVpuXxS_hj zl$183hbW3w4JmX{v3YxVsU9YKqprElv!`rVOwG;BHC}@DaS-`g)TGV-PnzxenuGiF&V7LVq5$^}Kg5dRRdw6wM=Kd+{; zQR%UK`SPEuJV#8PJo(6xBL$|ObC)h%YU{CaWB)OCJ@n8+3ucWQcQ>vN-7)133&je# z|B6!o!d|-9cV$Jw^cbtlKDa7MeV)C9HQD%$mHMI>-#)zt^)`7Rv59wxuc$=P8us#D zbmuLUmX^oCYQBhueu{5m}H>oGmN=py! zI9Xm^e(_i-riRVCv0i9w7ELlq&7wF%HFC6-yQ=2oI`Ci9q;R?LSEnEZ9$;_s;552HVFq}uaa(pU9F_&8<*#4^P zUdjI=vq}ul6>v;wOJ8P_@Ho$G5*6)&!zSUhXIzOn>7p=?ggZ3M-)fjYo)>WN>3q8| zq00`-jOY2F%u9MsSSfWVR_d^6+U&?&A)EAbnrJb;n{3nPX3@{M)7$hXgDDYrm5%oR z865o@iL?&1o&ZPx6&&q{e$GqH&OV=(pP%nOckA|z>J=*)42Iq#_PNLD-oe4adFyxX z{Pwd|t5)saJy(56U8u&W7VUKpR=K%&%~S7kd~-V(^%Hf3VeRUpN00ve#p+0P1U~IJ znG8;UAM5Q1z!Qp2TrezFdf|l^o_tVrb9(42D=RS_b_&lv8$;jFSM(`+;nRIoO3la$ zKSX;C6auK7+L0fge;y+EBN3s$FpD;b58rajE%#0*8?6&&;fwY3mbhTrv}ubXX}vHD zYe2rDTNj@e8>2p~y`EH;(z+X*RktK3Ctobh%`GbiBj3Ob(^-;BVx^Xrmcp|Z_hy^E zwY7DtMV&py&#x|c?AWn4F!^+o+cRUOva+(u`pIriL``3iz=urJzFZbxWWqO>z4c{p znysQ;;j;L~G3KHSL;%rZ@H&&;_mDt?+beRhamuM^M`*FpI_DYh3}NKa2s&2JYy zJiYx)Mj81PtCT_Q?M5$ZXn{1R)`q&eCcy}4(pE>_a(#V$lU?@oH0jlL+kmPj&)&Uz zdp1=GLS;(QA0AqGNAIeP&F{SP&iCn6z3*7?&>xb{Rm8$hp`bu&ZizJ%pUcK-G3@tI zO#V`=_{dN?`|l|A74|a3pYQ1CFb@lk^Ol;kjvqgs(=PRkyl>u|NcCCu6)FA<`Hy`$ zing$q^vX@X_M|T()mPQ$<+%_3^^X&107_|sMaVN&YAQUsb?fTs>NDzmb&mFWPWLN~ zpN{Mto3+J@npG*Y4-%=cR9LXlPPJqit|`yB@2Y z&|F?#QBhTueKGBPR|G9(T7@e zpyzFpB`NoO3Fm-kFrF`9Jm153K7;Xm3gbD!-{0TI6TU%NzL;5q3|wxH?=5xq_NJz$ zb`n(dxN5I+bG&b!GiOe4;hA3#9^AiU$AP4zBzMQ(S3jn=R^Xrh_{bxV+&xBrgA5U+ zKE+;+DVu`s*Kky7fQenhD>3|NW0!f7-Wm z=gyqGQ`@(1cbkiD@z#kLE0I(IGeOXKyUA4(ii(O-(~I=Awf3H}P*qjsHkbLfWfj%b z)HGAd+0&;_A3oCN7TfXl7vUyY>$wHTWbX9N#X?G0$GP+Wj9c?z-sxqCIud^ki{w%haH=B|Jr+;@KAdUq%JvKtff z{!!T;PyA!jkf8wt|adGnN)ZdpqJruvQt>W~|(jH`TUb zB{%8VTGb(lw!uPcK}t$WK`SJRuDAKUcR%<#MF@<1_~D160)_KmuX^`Ab8mLei7nwR z&15vh8bU^dW6?iQ0**$C~;Hmh7+ zQd(MCR;PrjSR=i>1A6+1iwTU%S$&|cTl;xvC$HBeXnPL4l>!~+p`Z%)yKcfy& z33%xRQGlM|lb)HLlbf5HnUS8Ak&>NYm7AN}R6#N>r#>Zlc?~`mY=LKlnaaxAt1n`x zFXY6>j~mAZ)C2qHFVl5HAH=pfmeI0zV0#o&QquEe47Mi^Xs;JM_coQ4k=LN{Luizq7_q_aq-2Bq){Z`p%lmxY{ z8I=m{($K`GE6z6obA%{t6n5KEAYjgI<-M#d;$5VrC|KBNOFkq^G20XTxIJb;Ab34eKI8 z9~q7BG6l9^!|vVReeuypA4RKAt54$fvf-m6#l^)Z*S&YA`ggqI)FtYl)CaZKL+YQ| zW{jO?x2Q`l+k<16Ek*b2SGw+- zv>}iL!e})&zw6u|^>^%#E{$HFZbq-`j>z>$y3`2j6EuxLS$V zKeJ(Y4ZEHVqkjUkVT{! zjq6?2w=_XOl9t43A)JJhIzb{KV!v>hga?N?qoTSiRX8q2LT%tCQ6AS`p*>wQ7T7j$qA8dp3~6TvUC z!}Kd>ho%Ik1fI3(jRxOlMIN_5{%HKEOsjtB?(xeNVdGr3B;5(S-}GQ8R*Qt$+hEL9 ze+De2L=+xPc$V z@#k~=Xpa9g$8U54zmnreaQx3Weh0@N<_3OWjz5j#f64KEIlf0Hes`R2)lH$ZY@C*I zDCYVXPu`Nv6{oy{Rw7U}1z*ybF}6{?59`Iv4$H8o zLtZf}Gm9W)D~eU$w-TMEuth~bmhtRz$dMU3#}xvT_Q-?UinHZcgR_` zwoK9L@VQopfEKp4c;Dw-TU_>A8}Iiqyx))UelO?!9_U8DhjDx#j<0fj$Bb`v10NmF z;-G6d{u+)ymY4sB|Eu_;uc|+byk;IU}K z13-$$`90u`?&ys3WBz!vS)_0?_xSsfU^L()qV{LVcC1|rU%SYE#IPSXj~lmte|-GW zqw(>lPNA^nhNVk)?;byX`SLh}>_Bw2s(~P1))c<18T=gUn$mS$bFQX6x?4@_x7+vG z_hB_{ZmGe#_)VWlfs=f&nl6t?T&l>64}Emvqcd1Y;VSrP7M4>*4k`5&eVee58kkT|~b< ziQdF-2HW&U!VuQMV)Wqcr-yNe2)*EP^2c4EO$UFxg{-*m8l%^h8j}?I!%6gS{05Hx zePQ$o?hqF8a0)^vwD3F!H4$|*(?iO&;^>~$A{}OGv@GgW7U!UbX!Ix_!igH)o({T4HM%(tx>jAe)*q;ClNsZ4buTd680*bzQ>|fC1(QZqzoeX= z#vN!@nJLOalj*Kb9%8yH8*dA()GcOx&kmE!LJ_|QTC>d}_y|KlE&`t_ZF&!|2>VHt zZjHuq<}MuMqau+69Qyl2^zB5<_&Jch6H(Gca6q5)=Tq9L0!C710?ACz%+40YloT(o zloZ;gSY*vv=Pe*CT)g{4qlfyYN5xv(GjjJil?H!&oLpcI@ub zJ`$qwc)&Mc2UuZz;Tc*KQCr(W&NlZcDJea$?+oe>t5i{5K_0BV?WLs|8KtF^je6(_ zetuFFN!1)Xv2aq=)RdIO_372is}T?I_4A8}h!{K|SoZU~`R0g-=xCf(e@^jLLwbjX zh7K}USN9L`@$oUlN?BRHzIAmDOS4P8q~|tGFPMftfKL56zj&f1_+$iO$4>oPW1jM3 z_J(YXd2`MMMcNy2&yagC=F3O?s0g?J#LO_80T^@oRIR4vidD?VW5_V(M&DkF^v9@s z#@>T5?_cBX81vs^%ok$J{|fG!hcRc-D*Y>~VEo7~s%vdS(kNsT?O|+hDT2E*JuSDg zqQz)5iDIn2sS?#5+}>`06;E?`wl&n$)Z1m4Nn2~lTY}lNrM*>$GjDd2+-@6M(d-3_ zk#}2z&{2|n?4c+Act@}LuP%Mu8wm zqaJh){BMJ)bfd$5YFghgZ20gkTZZ-Xiu3kt$$;Op#IxssNw?pATO=$|FNhx>>F7H- z8fH?>@hQGE+P7kTq`FjHYFbfQIb+6*iG8tJDKNa*4Te~`t*)%7=-@jshH+;9_z~KvUd=?aDC7(IG zW5@R0yZ7zecQlzkR|Xr6ZFm-+=KIup`uchaP25*m*8$!#iL%`;in^wDg!D94H-X(7 zOY)0qn%mnlQ?p8HD%(wPe)@O{9Tizw6}h>Mjg6`f!d4NRn{P=wWX!Ck^4W} zD_a>&>S$;XVRUZiw$Ljze4J|3HdcPwfZyn)P@^mp*aSPu^mgDBy|pqiReiu$_GD-&we4(0+DbbQX$xXnA0?!5EP9yuoy z_U+rVWy{`U$Bx|qFZl{L_0dXw{IN$Lee|B2gd1kADD@BQ)%(-DmH`&a*kEJ-+itt< zKV~>x(L2Xtg_fEa^*Qw)j2qRZx)tvf{U>}lY1_7KKkwdk_?KUPDK1S(NJzK=zMSAI z;Bm)By=vzI+}CYBom5v>mtR!pYqxuZ2YACye*=80YpH0AH5q)F7|u>P-*O{->{6zR z*_uqv<+jWqF8S*@vJXct<;WQf`P#OX|FGqk>TcmJ_u<7S@#2}(LeDjK z*8R$!yM#ZUiSsV6xbD*P^0;2bpGCqIvc%`WfdjuDPR&hDuBw_b z15vx~&U?dihF!bTPMxn%#B{a}#r69o(e)y9A#v;0C`9q#<@x5uUw3Z(dDpJJdl5W7 z{F>9;*T>ttwnZ-)={~kB#f{1;Zti|b@|Ih4b?NDt#p$VO)kQ@)ISmbnEp*Q3-rcNA zzKC&ct48>#_#j)K9Ga5L)hSO~oocn!$xB!w|~PTeRM{%4C-cWl}1qV?ag>VLU%UB$tpuUx+VBaWVOLkroJ z96s&J#q35o-qnic{tR#_UFAH-x>n2N@n#4MTs$y|aT$ThcD*>Ce2(u2=?08V96y8O z+ugtq;P^v0{*N5LlH+G};&;EY1w&+`)OwEW!;y*S#EVbj z#W!}=-DTfT|j2Ev6TY+6q|gQpF)3x`3PEqg_!Hq+Jm=R z<>emdt#0Hc+pk~pi5<+h5?m>mNm%bA;E^JAM})l?gJ5AQFPYi0!^|QLHg{*sPD(nI zd?fkM=L+W!lhJAI&>7c-^<6o3?bwwE^v2IQyL9V?dJG#gwy87t>xtel}2E~MIZRfug! zO-)U|n0b*IeAtKFTv&QAMps#SgpLlIAW3nd)2H7)XYTE@X3auOXYHVgw=!gwu%9K=?^PPF@Z(_^=OIS+MjR>BiE7 zC{mly))p7q(o&gPPy}k&51FLaVrKGTA8Ko1>k010)+2a%AyBi_p}{!ipVM#1v||>J zxrxo55K6-Zrdcal*ymzOW)~y%$A$UKo!FP}3-Zw8_}R;xHP3O@%;c=u!B|tnW&9Nm z{uz>i0497Ja6@ z-jaVmDk*8y@Sbt~TAN{1%qYgDrns10i(ACj8raH=%;?oYt%__k`1?{@n+=So_%xdW zd-duSXll;QrNBUgtzTG}2`tE>xfu6Bj}7cMVDRt}BSuV}I%RM#oGz2w+uPcywA2Rn zQ+xspDgp*oL%^6Z)Y{T+<1@Q^>-Y}lDyn2}KJ4uXdxH;28z<($yV6FlgN@#zGA~Tb zCEpP{ao_1XI)P8zcf|ZE+;`-QJE!l6QSIvO(N6ipcVtojhF@{-5v<1!@6r9Z=`g6AnEwnp9lXpm z5O-a3IxzmZjAGXjcTj8t#T^>OL%>E(hrn{mz#Vcrl$sG4*2$4qdbfN?aCo<3I=x%$ zAY7++t1mur?-pb>yjuc0;XEH-I{jO$-T(W!BZ2DG-rsA@VdgEk(hINOzL8Hi?JWP1 z)G&B!*jaw@4pR!9w6=&dmu^O=KCyX9Dob+eS4>|(K>>U48b++aSMKr6% z&wF$)GuQ1gjdmn`K%Z*UPdmh~li2*bI!iz&^+(hPH0pgE)W;!f0P_p?*QiI*Inqv( zW1qs$zptXtw0WqJA3B0f#4Bp=cUkRURk_@l;GjQIovG1}aL_+WuWOvi^6#)L1Xg-e zn~@s*rdBp3|10`6^n*rU)#wxQ>Dxfxf=}rEDx^;}IO#h_ll8tcN}~&ZOt6WGX>5in ze1_^~vtD0=kA*gI&=@vH70gl5%a=`31(Q@;Il85K8IL%rYO_>_B>xsV1biIb5A4V0 zsdjX~w1Q1kc648(+Pyy1!1Ww<#+m zEqXguS)qq-QHRZ!uyItZq=oS&;(xU;>ha17zK&iQ$EoRb$S`YB7c0=qQn6RVWfY_~ zE{U{?UB=@a?R9pwM(+Kqqf~~FNu$`M8S%-uc+vRl?z7rBzMbQza{LC4Z|Z`NeqcFv zoRJ$^b|oC`XJ>j#glqTR3(Y$99ZjeJ8fd)(_;R zPv`iHIQ~XndbJz)NgUsw<0o+ZYK}j!6TkbJ)Peeg+wS4W!#VOkj-1AjwOQ!0?si`G zP>#Nzqw6@j*jctqd^daECH{=d`tBWG{xM#@;70jX96y5Be-Fn`=lH*M13#1F_u=@Z z9RDK6_vyrUHD@q^VXcVJ=FBc_&Pa*OTH!g~X|0ejcduUk*D{qop1r-w-ZWi)kis?i z?lHEp-=(s*QS41iSTWv#;aYF`htgH&pMg)EIzQ9YxX#ZsOs?~f#GO;;cR6NmNRV_hFsk7J;NioyK>Lq%rMuvXLuRE;(LbGxI_N7huOmP z4(|D`fzgA`>}{rK$85OPu7T|nSPU1BISbS%I(H3a8cn`yV0nB%6}yIs*QCmK4J>wz zQRTY^F9%g^*C4PQbWFczyM_ljRqPsY9zmPA-Pe`x8g6k=<+}zy2UWgnXmU_xyM|eu zDs~McyPw)UDjQmK1W?H*U&{K$I8=?H~kN?UlB7UH!-P z(drcSeZXk3*+|A_Mb}r~HyXJ^{tkFST)vc+A__e#H7got%QgX4L?UEr5waF7V#i(5 za?|R{>rRNqW@<)QuNWlWI^xzy$470Zc|kj2+Gba~ABzZ}0~U2Ov!@HcLeFA(8j>RD@kS zKtbq1Liq{i85k4k^bB;x?|NE&8^a$=tVu6G&!cFDj~~aP22B16x=1K{*J(+avn3VI zmZUpdlE7P1*Vz)6{ZZ~>N?T0B0& z2(P|ugxfo*u)g&$UzH!5vN;j(Nl#8C5|7I?Qk>C;B!mPwDdu64wCOOWU z6gz8D%iA-evnFiDb;q$_d3Cg6#lSjRGuKJuD5p`=NyBALb~8*$?fn zIH+oxl>Ivg)h!y;$quUTgX$kR)mzN;d^dIN)OnuN>bk~3Rnw&GKRBpZcFXYSEFrO{+dJo@zca_FQQ%{DW9$PU?X%`rztU1&WPmEj?y?h|Z; zYH$xd3f4cCKLdJHu$g{`yRLc^8}rLFv#w))i6YaaKGJF!3Vdi%0p&@JE~9E2^?V{K4C}Y$?O=~j!N$fPU-Bk zuDi%fxd$Omu%Tmu8t;&=aSEge-Xax;KhkAS-;iF?3oROoRcj(_X}!=(!_9)Hhk(op z$j`+7c@z|7X67>Y>cwqVgWcZNf>?38LOl$Fy{D|CONn-xV09CFJo=6O-D`{E_c z>#qpIdd7K_ASF+EVPSQ3Rfg4|(@6$N2m2xQ@DBV)2~*s5LaTgQy8E17WSi-cy>3U(C>F+(0#q`#gydGOc6iV$dw)s^pQRfL$tICONm}Fw1z2}5Qitz2uSPLZxb4&5%!^qbY zR9sw?Ur?M=US7uh_(i3qIVIHZ)c(A&?V8O%a!%xC(7?CaDQTw$BHAU6Zcf30CZ@4()i&+;==`#SS8 zuq-P>z+<<7$5@t?LEy1~)YPP;)YOwFPo6(^^w{}RCr=`1>McQ4*45+o6sM#&>zE@%tU|mWHT)#Gczsa43hJnOG?VXNAOgvXG@D-hg@a`*~5qlXEell zvxtT@3ulB@oo;LCFj$bFFXg4<=%dq0Y@~XtdaJ3YTGOch<(X%eo>GLdo^hC4{9sI+ zE>D6czr-dL7&W~wlo)0 zo7b4>B+M(!>=RC}pH<&65CvO>Aa*!EdIn0j(!e;Y@WBEbx-8DB*Kb56tdxOUsSy={ z_TrcwuIe&qKg;9tu(K|=pf2AgGeJ=`7lMM<#T9PFegO+pOREsBwc{<4gaOIIVG{12 ziv$IoxSnR5F~6b@iuYqBA$_h<^Z3JCr5|#VhM>X~HX$RK#Xsuj;@#>h%8KQ5Dd#y| zus*Y#E(>{1mz^x9i$KF2vzqCPOv17VtxHeI((T^|d9Z{fG-&M)>pDzH+1Q!jBc2od zF}u#a4`+b6e|jM(ECYpAps)~fft`OCot=F+Ir&^l%9*oCr;?ISr|;j718nT?-07s` zl$4`sNlB-ZlTK!3Wo98O6YQ3;o~32g_MlTcsMJSh>5gJi@In29~SJsdG&{@ zzx?56Wa|9>yYIe(S0Of9^-xX7r~ezh^7h+t(a5el9N&1@VuVnk7uC^0dQVuoG=@H; z(@+J&g;0h4Pk$^e=jmVC|GYsvsZ0nILYZ{32z@zW!^;6HA<6Kv!l@b?Bcus?g#}3N^p3D( zNer^@*9s2_`-C)Gw7tS!s}55CqTiC3xH%f<9md&Jdxe7URZ=IaOY}b_CT@&|v7E>n)X)Wu>JR<<&LSl~o0HJB}%`zp|?8%F@y%rdL*0*XHKt<)V_5ge z9$5C*BhcT+!=o3@kotIgdISXY2wo#R3KVK(tlNWN7 z3auc{`Pik_I%KUT!@{_OT+m$6$UvRNWQ-3=>Y{OU>rrjy_!BvP9>+Iw{Kigv=RCeL z3b$b`lSj8`QMlQQnWo{H#l%rdm{ZemO2NzH98Z9+QNxFMu@iW)b-Y+TD^{Dm66TMD z`NL#y=L(|v#57OXVzzW-v9~bgTKe+;7Gn}>H4nAAAGMl=?- z{HMpBc`+K#UeaDrOf2-Z*V}Ks^VOjrHm>{f%P(mVo1%BCw_)*qUik3CXc)6^Rm0W6 zwrC*)iKjbgC*nDy>09U(1B71M6r{KwuYdOK*Xuuz|Kx)YK6viA&z@R%-=j-jWlH($ zh-1Xdij7I^9l}$>9l{_;)C+i>6}*J|g{N$H*po27g4BL$FT6rklReLVG7hb*DXD0% zi%pn9RaGr5#g!Mca#Mf_f`-G~FECZtXF_in2iG|1eiPag_lh&N4~w$OXjgpmv}>q240xwQ2B+HSbtnZHb1 z!JEIh*X(f@9ypvCnJUG+2Z*{D4mU?m4&_ql$8Rbt#%H zB_>CO@9*+Mr$M@(` z{mwPmsl#>EL+ZX}^M3Xq0eZ-`a5nF~FR*#v5#pTpt|UgEubI~HgogQmhPm|uQyPjw zoVyEGn0a3_ok2H9fX=WvT#!f@d4Z`6_k=)Y(0Y45X68RIGvhEb=VNBh$IKjgbsmFj z&eW^p-Ca#xY%Q+Lbl~1pzB&oQjm&MMmJ?wwEG>@1@ls?*;cl$C?oD`?0rfW`2u5C= zT;ZC6;p%h?t|Z0CtJ5!BQ*vCLkinHGxr{?z?aCp0_Uz6rJag#Kq20T8@BQ_cU#}y} zZ-7Ide){h(z4G_xpMSovurTc2NB{1wu>bEk#DB$#Rp0IX8hJLJc;bnn1t;VGKV}ZS zUd&3XXl-qU1|)Q-9oJbkZh$!?sWrc*4v9Np?}K($f1PE;edgfugRSf=PxOMWD?7CH zj3`|RX{je}^ zQxAX5S}3B?*Z6>1pRG3NK_a#E}z5c`uwc@h1PvSIR5B>cW_=D;>68 zOl!fyyNjf9TD{T24c3t4>z-9-(!>cUyD{X6WN3+ePF zyN2|JE6Y*S>1gpiXz@Z&nSu2>h6M7cD#^v^^4yZD#*Ww?9gS5r?UE$5*Hl&JBM(hJ z%RSStz1`$Z_0143NZIXeYR3c4k&cKxal@pij;4BBcx8hL)+vvM%EILR`}ZdoRt8MH z>#n<|22>vV0*PlnJIaEPMWY8bwcz0=O=L14Djg5h5I2@k5Hf7XvX?k71W9MubJPPo z?Ah3$XWKo3#^JczxFCUmT$w8ge{T15cW$ZzP`e`8C}n zIuwJmPCUoV3%bKJi9MKlvn~AedGsqvY9xZj{%o1ps2Tiq9f zpB@1}h1S(I$U!}^o#uZ!)!uSF7AsW5auIe%+fcI^OeTsQb>-LPxp6f$wSr#{Q%p<@ z9yyfJRGaY6jn`$vT!rQ>rzwiz=DTnX^1YFB<|XUe&v71PbHnZF2iqA$o#sYm>GG59_H&YKi2?U za(^`E-hP|`*K!72&l&JwC-=IKNXbOS%1K3vzb{=@Z4)`8sO>vH_(U)KLt zUWM(v3h8dNU(fM}@Fr~H_=h?E=*#h$#jLBfO|z8vGW=MMeUxM8aBO#a--nmp$niZm zeksR4dwJ>IS{Va4{&0@Jh2vLp{46){wc4{>OPV)+Gsmyt_&ILi|F`wO7Jj}PC+I#{YldV9u-0r2V%D0P&zZF*C*NtUamlweyyl_2=IOlV z$9T<)-Ke?B@v}Jo29EE~@o)aWitlq({hdCy%kv@2zK|VOVOkJ;ZUu~a6&i@!9~cAk ze8?V*iFrQc5sZ;L^C7z&k*Gq==IPI#J!!@B>tom@3CH$uX=I0duD6nL{C*sNEyrKa z@ejIzU&HZ3Iet3FKgRKk-M|mz_-!1Y1wLtdq*nivo%k+!xlrR}?FpEhV>Dh~qw(@K zCogv|$5%&PlH=`c6^7j2%a&nWN3wMo*ZbK*%;k9Zd#G%-Y0~0zg4o^X><#W~ZS`O~ zqAO$P^y{=toD^fzy@5bs^)bb&MS*>xv}FmkE6mXfrnEu8T_O+ zVmYH(q@aRt5qIdICff87W^KHfPqq74&fjTgZdp7iJHPUPb|Q8hJ_(2v{ES5kB84?S zzmfnOyW{*yA2YI1^VPR|sxvjJ%(=^`&e5oja8TW@QEhNg-P;+<8D&O5+O?=Ys!@$` zQ2mWYb&P}Rw;I(F2i0#u)e+5!W6j6^W2$GgSV@*anw{YJ5>y@WoJKPpa8Si#e6wtT_N=lm>;F?)vPW7z-PiT%$^637R8 z%k1lIc(N7S^*7anrcPbA?z%gg3`Ktgj~BjyeN0e!`TY4euyF}e^br{u5jVJ98N~YG zx_gt)(Gl0(jSNDvRlny@@Vabvgeixp-9&t_D<9NJ!G^D`fbiO&{ z>8D4}ia|`=H`*)K5HsM(Cl4Nc^2td0H-h9JeN?;ZAAFE*LQR_**%Rj+&lVH^Sw=nn z8#(T@hCbPsMvhl^Ao@S^s~=C!vl{4^Afk%9Ol0` zRz;Hmz7DS*Lf^iP62UJ{Vm*TB_M^ats`|Eiqy)m3^-cA)4S3FST!^1vm3I*G{Dhk2 z+ixFr^8h@baKP9RNI4Y&jJk^2mNGmv9S;no4g~fT6%{%33s-Y=^ifS8?8%>wbpo}8 zK9$F#%m#qw_4GlN9N+ARd7Ixfr8;%8G8s zC{)~MUNmAv{+9RI-;a5lHkB7pcz8G!R(||3LaKzc7z?~5!QGEn$onL&+OcEmxY=-S z-7$1zP*DE1m5QRQ++G;T93WPlIidcMhzNQX%C^gKb5_0kv13*5ZtM`p!2Vo}pBY## z$B(Ve5262_LI2G{|J{ZD8`Sk_d@lR(sM7UWeBJZCH>};4p2@d+_iUtCiB|hxdPTuD zHw~|s)aS(a@Z87uqSfbN@5V#ulot7hg<4r zD39jAz^1-B{=wq!2r^3*EaHi$q~(eyln(n}*sh<8E-#AHYTb02kc@E}9KG0elv^ zqvfr*zLq!iv9y6=+GDd9yP@eR!kQzBV6MLbWlwi9$|sWIXM)dEFf?@NXDbmT{j&t~`x# zeH!Dc3`H)uUi!A?>O$1MsHUY&4GQ$|Xw0j|;?Z2*Sd$BdC9_O4;A5<*BqbG*RV@;> z3b9Z|q}XtsPHk(m3vgf9Rh8=NE2=sIdSK<1g$|*;9?$F$6qBGijqD_vY!lb69WrFp z;69ScKM2w!xTmjozlc#oh8XSs!-fs(sgv_JzWL^x-{d4zZ(4 zoKj4ue)#y~kJqebrJJ9Be)Z}#pX~eP5DSGpo^<-yFMHRlS-pB-@wa%&=ns|sXT-o; z_PzFs3yAJ}e)a0rh^v?%dGC`iys%&_g1uwCii%{^z{6W^t*dK^)wd$l5}PL4EIt$3 zei5k#XS0{METw(qs}|af=YmHpQcR2f{EvV9W9dsmORa6!6Qj&=`QSUtbLAmtCG;Zuj=~*4G~T6)^}<3My-;Br~%z83{dcT&F2FHoU2(N%HZQP+(t^ z2?h4-p|4;Mf^E?X^zjMlub3uI9zA;Wh+(S1ho4!S3|?bdK<@yrUCIKQo$cAuh6l3L zm9(d&;mJ@4u#m_%C8ew^Cx=R)n3#NwIvrFj_S6)~=wZUG!cKRDcG0+UbL%Ti(6~%Y z%7mpk+?1(_mQSYknAJv5~bLw#XkPE8r|F_zcl zl$M@2ckw*3h}i;~YMT+7(9(iVrnctBCfq8}C0SfzMytN5smUni_3t0j&j%gp+b<*{ zBG@v$4+Q|Trm(c3>f*(VSgD(vN-ySs0dVxFJTGeT z7RNu$@tfSh_vHBD9Df(b&*AuYx`E%D;}7Kc`#8Rl%UUxYosTmSB zeE*Cwy+@5I+=@V8CTJKK~p^zogt?53f<>u4gD6iKNeI zO+a#D!cRX<95eH=#~zzLXy~+Q*+0G>g?%huy4SblM&l7oZ>X`5>hm5%qF5=oIK!*5 z^4e4OQX8)^aakK(P22%o5x?g2H3Q$(^yT)l81(*J^#1SA`!VSK81#Ps?6kDh^9UME zNjVR%b7l_yva`~VO)lkpGBXjJr5}{o9#~QF4}1N#wsxG860l7+#6li2uo=eH?)mJi zufBQ>52I3lgH*@6c1ewRjMU9yPA&4+wid9pXrX$ikXL6>AA$;w@a`Tx2AX>sdfXHh z1v!~2gx~!%)}>gXSFczhB*bRi7%_bIlTSYR$X_h!{P1MNEKO2w z#L0>0D3!|S3q*E*L7S}>!BdI#>(QgJs;asqH5ItibY;1pMd1h-Ua>;Iehh5=vkME0 zOAyXkT3S+2P?QHzcQHG+5b5zsODdUBpqx&ja#+pq4^K>zBvFT!w?l%)LV_}|_4mWM z2>d~72K!d0uLP5kI1q!QFmotl{FdJ=@pt*@VZ z=+LaF`Ae28xqrfxIdf_c{2M_;|2|kBNgvb4(yDhKe+rMv(;qn!6LW2@ceLf2Jio#v z&xdoKzs7>aHlWw$_{HeqzoCa;Lk~ZJ9)1!%JgzGL-08GahZ9a!H8tU}2p+z5l!SAf z2M;Etrl+Q67vv=+9Y1{d@Y>H)O8X4+MRZ_c0lIChPSEGL1poW~ZQn8~$XN$;e3?4G))SAs?0=8*x9ze(;oTT;>Ez2((Nq(=3f#scm2iqG~8!~di1JHVSd zvT*NJm)zvuZMj##nC3tL8&d*=gj5nzNpG7@3d!#3S`NvkZW3UDG*TcWA@m-KacDLe z_udP*cgsz(^!~XcxqywumiNAAC6;Xb&&-`UbLPycljqL8ZGN!Q&R@>RG*dH68(Xim z_X*lFQ&QkJb8t^u5?m}hbh@^>%SatvT-w&wg)Qal*O0e$!yY2-6_dQ2lbTL%+jguD zGfI+3Dc|*aTPW;F&X3*yaYqKwVY4L8y$1o$BHw>D7#5XPk1Lmw}|beFF+9UIr?s z`8=nRv}NPqdnmq`;{T+0cZz>*2yd35hWm|@TJd}h14kYV!<(AISqgU}@as!aH`x1d ze+!b*lkdHj4n2tW-9`I$7{6~6G9Z}<{3!ekg%41;*U*!XB>_p#6A8%cGz$snEH8ER z9VQZx^CM;nh|C#@KPRJBs7%$HA#jpW$1-25X~!E#$GFD`*!08f%NS6^P~T?h(LC#< z-aY@P6?E*brip*oH1TEp=n;#k9%^HBISllD-YkcCktyKgRE1~BG*CGVJmxSyl1No& zG95#5m>AD>t>uGHdw!Z|W1`77KB4j>9F^b+KYRf*@!oKLSXfTRew_2Uowlhew@zFsj;fcs4X zmk@y)N}PjYVsD-mDXXtM_Z_(9)(Zs%wS5AOqgY#jAct*V?(4{}{X?VC{NAFR5{IMU zpEhTc)4N<|Jo56(FW)o&u}9*~)&}dhqO910eY;+GZDlYf52fN5xxbwZm3=T4TE z9E!)~o@aTYgl*f-wI*1#7pCm|{@3HlS$)2X7ola!EVqJjf_(~ZaReue9xICr_R{eg1q=X+cJ2cE6j}6_zx?d%kUk+; zV6ZB1Rz!eb@PtW`fgxal(YMckczIM*)SO%5d~Mu(r$o-W4b4!V1I=;EMt~TLC)&LMYk(;fKc>%$#thieVlAEfHCs+^dN+>FB`k z3Vg#p60;KWCbCCnfN#J3?(0pPHhqh)_21^@A-jx5BvXo^AYl3vU|B)gn5k1^=700e zV&fv?Vu+EeX{7|bKW1Fa{_#hwak1zJp-}h(J}C0?dg|wQ{RA_|57;|bIum4TTD97) z_O@nif*nZURGaFqyY6b4vu4ejfUHDc#10j^y!qyIkDHzZ-MlcRbNckotj|CHJgbvs zQ!0rAG#^W#CdnJw^H&m3M_T&Jp{D5Bo=i`|Jm#O|C0XX#1QEA9-uSTb3G!k$<|GC} zSZip&dG7BQ2(t`4R22&H6aN+A4=xznLApF3kA0}u1}WFGknkIYb#dvb}wd`}(=*~Hi4$vn;a zF>K1+te9bMQL^U{;aKRbJ8LXr4L`KG`15iI@WPJJM+O;k&xC07A4~8d5pv-#yVG$Hs zP--!6YwT=^F&IZCzJ!G61Snaul=+!;W3rH2N66^$%3>EHsC_N#MeHHme0n28<=QnM zzE%AH&L}PH8SLW|5(u*Q@rgh=5PyHhmE(;a67aq&IkC`SL5s!oX@uZ;Cu5EGV*d>I zBL|a*hl`7o6V!CmsXapiZrai{vz%kg%Q>dpB)6IO38`&QDq;-VCw0X|HNUBaQsNVE z<(ID`rPGjB7D4GAgw7kg^O;5bD&l~o04YGEJK$A}_Ag6tNlh2=~+rBPxroQ|0% z)rQO#L-*n`+^2E9PWpXMUVeUNenv)JU4A}vjE6ZTQAumHEYXkZ`=Jz;afA^(9XWO<-o5I3CsX$#$9~emA1BLL0bwI7*kdJ_4)@VfYjVO&e z57`&+61?@uEAtTeyph=`e&?RNyubY|j{I79;snUtil~BT&wlQeciwpiyg)60HW<7B zIZ|LUN4Ap3H12W#3_kh7bRH;&k#wV*X>2VlwJ<0 zS>2oJaY}$c1%^!Zb#Mq6P^lUkl*;~oY$hd9&USXj%!CLYH4)0$GL9`PLpZx>eVlQc z_^L#V3uez5d`!u(a%?Hk7WtBh88LYmSMW>?mlQBH#wJ+5C3V=`h#VUm9S7$_%)b0w zpPAPsnt2^sB0>XdKl0p;Bq-_SWZoZUJFRDGT`9>og-N;! z!7~t>{(L+`D4v1X^sSMSgya$9)3=DMa!Jad^n$XooSYrJZXD%{QI?x=y*ywK9du%1 z;@0fTy}`HKa?9bvhmT!?3l>Jp8V5L8OZqozwfdX%7EU-|WCa>=ZT|70pjhE5uiAa_ z#+PZljRdv4oqCYqL?n?2t-U!m>Yn+`=gfZo^*MV_6esky7D_b32gi!7T2WQ2TgxXM zE3uMDq>RkQRw2W-aP@RW?kP7MYkuCIZjSuf<>BoE8A;UNuOHBHGChnS7^p$d33UVd zeyVwo!F(*jd_0Qzn1cBr5`u$0SyGlya$}wq`=T83HEeG7CI}FTGJJykpLinZ(MKPx zsj2C89AmB=IOeeg1eeH2aLE|6wt%;a+)Iye1u|OXoEU!|3pi#Aiq~c5l39>|;Lr{{#GpoE=@)j^7lQ zVm&nT=FtydcYft!DVow9$wx?^KbJl~T*u6mV{T#i+VL&a(-wT`{C!06rnssVL-?^I zPHa4ASDG%efecA^g(F!|LZn>V=<%dnJa`DhHuK0@9w{p!byM`w=DI0k^?7**$$XJ} zk%g4|eio5(CzTK>_kn1$lso3rnr6G1K5Z?1S{a=!{m|2niT9?nHJjomQT!o_?;OI9 zHF6LeX3Lj<=1=%%w&Q0@J~&%r_MA_9cA`BWrajlwo|QvAkBJZ6%ky{{F&UE7+I;Dq z7G?wa$%l!&noh2vv@nWy;qm+#!MAXhw$OZS3)fIuK5fB?j^HpIK|RGQEx`9vd&&i!6~?i~oFeo{av)ouf!RC%PCQo|sR#6lh+_Ld09BQtP5+Tij$OhB`) z7$$`zB@piglY}NOD8RiVzY+ETq5~kWzuWwNGK+y!1i!uw+fe~iW_|Cy@DCkTUXw3e z*xw)Itb(@#G|JnNm)P|}L2;{8X&Ro53XMvR#iTUQJdFOt+F zBsU}qRVv4jDpZ{2`tpP~!yvb#h?#`>@@541pJnW-D)LH8N~-gUOG~PAvq{E9X@{0% zLeO@sW!-FJjc>}ES__l1k8b@X@FT=-sFC_IVIC4Nw4mzQ!GrURiwrFW{Ap_ceB2FR zM77h6%%`IJm)-M9bsSU5xu*)!u z%Q1@~6%{!MS1&9?jDJy4d45T8NpUgK-yzj-US4HMQ8E52EY3rCP=Xxc>bQvsd)wQ% zVV^ZprJJ<0)TmGbVw%bP%7G zex0@(F6o`R?w;=6zRoVKR@o*#ko7-t)mEGDF#@KIVZY*k9eEhN~+L-yXhK*}Nc52a&KXScs zRJ(5G&BLjTKZ8xxppIkWL1zlk8SiWoMbp9YZ{tYtrb=Qxv<02Hg-f)B6!JDs3#M9P z^|Xa>a|_+Hg?nzTd+2_;6z)f8ft;;H@S+&CXd)} zq^=Y^07w*9poWoSBKa-X!f&}2Y&kj$3xFq{4&>&!0DEo$_MBfuX=!Z)}9W z$=x;=jvPFGVZT14xNoPKC31%W$fw6P^Ua6eSgDu z`}S@5*ZcU)u_4Df`5TYkd)v&JOYeH*jYOd~DoVM4l_T6?EAu^)*KQKW&Y3kmIwPJ* zX7=G#AuX6Sd&vWjz4S&rw%vLp)#+5nGP!8|wr!kz&D;0I-G2ML``?D%SQQww8jT}S^od&F>nmtPE+H|!Ay&_*s{!tNLz-fD(;@tC_z zMq4;fTbN*O!H%}jG}MCG9yolTl6p|Tk)Fj2jxh3}n~7!ZN#AwQMB>eZZ^xWv_3C`q zYC#8LX8?-={x9T15b(m zahWM+?N~d(?AcgQTTXZ{zBuu{XBwIQ-gx8F#%GN87;j_#ds8z0UhDOaz>EY(&?B?m?<>BG!?F|p!iKG9q zn$XRdlyBngddv+7@899=rV}cIw(#$qP^QzNg0^s-(}D1Ind+K4L2Mu?NC0JYG-)A@ z*#V-%PbcW1AfPARb!WkJy1390T<3Hda~@5ntb(?1ol|y9d62Jr=(v}KJZNh=oZR@s z=?XcVuD^<=nu{{p`&95RUP@@Er(@I5={UMHOZGm}c0gOiQ^7N4yy<+-8p4NR1){Lm zW?`>|VXuXey#`)FzDDwsB(R^W_=#l0hOVyBc*+NyxH~qs`)a;IUDBPLuFqb?y?gie zUd>|oFzn`7d9WVlS93nfF9f@k!*} zr5LmQXhf|TzJ5HdCMQ@&BHkBb4UnPx6_U3tmL+vz5b>_FBd)fjlB6>#6XTOP;(bgy zw0JL(QC%J7E;vVG=KqR*5a)iyhuMfvh;w%&G3g}22C+7hCZ-FY5a%ADA_>`ex*R;ZQR@*y?^$kz=;c&2L~TM9EUnB zFNps6{f=*8)O$m?e?OB0?DkdnFNuF?HGEb%`F-zwx$BS5{;?L)FI!U+YkXC<_EhEN zyraLhv@B(QV35O`6)0>!5#{WD6>5d zfBZT7>|OIAeSbs3i4joj-q+XIp>URqdOEtg?Cm|B2DGfTU!=1$Bf)sObF2ErLgF>U z$rTa4(gFUt65XAgw*T_Yzkd69^ZMT2!-w6xqT?n+goP%N%EW5^{0r(qvt47Q3Q5qSu1xMOK5N)B|+=4%C zfiF8eP76}nLOE@r)!f1y+Jd_UW3ae|vCdu>n)N4##o612IUpB9UkSMwUQ9Kgy<=hL zR1lAhg#=5~96a`%g!p6}Of~yt+yiLU*z6bOi=I5tcxMT)g+Egl4KuA!? z_2^pyXJG{7u$+<=A@m47JEPOP_uRR0OKy!rV!i$Q_c!@Q$5}xClFz8`>n-WK@(u1DWnVSDy$`{y^`!EFV>YNw9x-Ey71CN;WypmtV} zic|Wdn1QX7x$fR0oRHME9C>5xCwWSE1<&LhQh@`xWlejpo6`OHA-Wf%g==Mw3LVN=EM#TcGePs^25SLL2NiCmmXOfmO?;1}>x$%@Z^*!jy>A1yHcoqzoeG1c#| z{f0#OqYFa4Tx@l9moG!uVcXgk!Rv7Y(}oM}5D{rl-TFr=jW!`RDAq z{{C9HbGEkDRWaK*SA{~*)6rauDjPL5Rh5?uGZE^TdHyK$Lhnkqz%^jc*5n?}#b7Xs z6>zW7=`SM=r3n!#&F%fHP&2DpXAQrQrj#6MyB;5$`g4;1+_ULRCsFy?b2Y{LVLY(6 zca=3&UCQakzbZVZ%<#MT`6r)z^4$pt4l02FNmEk}oGL0WMk47+v5&m^>Z_}tSso_W zffF@WisLw!B};)!N!0$N;!s_%|Z_Y&`Y3Y(Z{q$UU?~$aG z^sLORf-cwSd!E+JG8$Tu;p^>&|#m@DeRWX&<6NN+of?X zNHU^DG8S!T%RqlmPoGZ5utt2)(EV?gzlK}d)Pl*NDxB*=A{eR#EG8Fkebi`XgMO*p zJvugmk2h2B8wgbMnE~nMT1&P zzG#4^g)7fSBQ!0X*c}bgv~bP{g~G@A)PsmT#lJU_|9eQM!KWX6&b4&T^Xbf0(wUn= zXDSL{QcLl zGp?S4(feIY=kF#uf4k|rRZwil;QWn_wW8QsiZxKI4aE+OgEdfW2gUYLtZAq9kAr0? z)|+ChDb|(ts~yCerC_4}7;arLZsRTJ2U%Fqvu`2tv%3S4pM`VG^7H6VYZ|c!?X`mT z>Op($9qe^W1UV|RVN1KPE1z{9xa@(jH2U|k11@wudDOOMWbr=WRO0j+v`v=7y zq1e9v3YO?45o>_|hh@nZwvq>4s}}l^`NI1jeuZPQh$B!LArtkyDPn|q*p7^Kc=jWtd zJa_bHrAV9p+tyQ1mgeWDXPo)t^hxs1*(Y}FIC=CCzD}G$pEn&ooOCfGx468bysW$e zwXxbEcXa4vaSQ!Taz}D9vCbbpc{2Iz+0w$C>^!&w!68?3^R~q>1$k*2g!E4;L4^IlAM_{F# zv2<>*UyzrbP3Fn(At!#kX?K2)7&j?rU)@R0<>0}>Uc*Z-E$KV>%Wpe(?>%s$+$i8!rKG=?uAbC(;wYrp1$-I1 zkC@F+l>CeJxqAVi(6r$7Gs9Ue_4bry|MuH&DFc{)_ugKCmBLok-Po#aZRphctUzLu z2WCxQdRJtE(0j6bH4(_{ZF)CtO74~|ik&fe;-raT*7fPXZGu4N6o3dOUu%gy+tGwC zEhF%Vjt&j?X1b-5qU2Z-2+pp3@St~0U)87~1 z?TCwC#FFJ_R#vd{!J;G* zOT-en4Zh(^-;{qS9hR)JOYKuQ7nw|~|U zUCd88k#sgK2jPUdsY%JHh_p^VfA&;zN^bVK?c4U8I$K;pDp>T@RN(?uS#=;=0B8>S#*ClkVbOK0BzDr}IOR?)D#n26lP*2O{R_oUd%%T_G4*350{CwDJ>U90W1 z)lbiHWIN9xzDnwl2wLgzty65zclMO<+vB%@` zlyB%X&I&$=yIMoR6)VKLL|V0HAaHHJXvw6w5qG&uKkk~x%Am?TEqE$WppjQ)XX5gf zk$G7Vk34918y6ZMwcc`}d*-9~x=EX|Yi%4Xmk+ym2RhfC%5SMUvu*F6sppz)i6?sK zhRUw2B*HJUaO9p zE^q{a*WGchh{Ta~Wu1&=)Ds@`0qxp_hT6f?2sb({2GCJaQd&LYB02Gqht8#+zH~*e zk;|MNacP{e;;q%O%t4RIb8lHVZ_ac?y-c}z!GgK7=EmPVJ!0bQdGqdhjc6LzO?-9H zEI;=!tZk295U!4%9*%CvTM`g%x@yk8Z-M9O{aREOmsZT_)f9$+ufg-0f~~nLEH`9tW4X6I|vFaGB7o>_SjgLB^$@x1|=PrIA9j zMQ69}xRiPcd?796QfV2OPH72-WQRgsT{U?mGNZ1$urN89bL#BOtrqF^owZe{Op}>e z(^{2xS+5E0=(R#fnpJm8ahqqbxA(@4US7c-ofSEk#rUG9EMs+X+ej0hj7kB^b%b&J?_uaei zZrQT^$1gWW8cu<=Bn?EOa@Kb!Z%tm`3La+Wa}tH3uT$XVk|4BIw6j) zwFoAE{XFAe$V;@jj0t!?mia~#YHQPjdFWL-EO=mcKt#m!>5-8Eb63VXxcgyy26#FM z+YuqxDMm7I8<9xc#@NciF0)S8*K3??Y^H{atgQt)fy@BHY3~tOE3Gx56Fuy3z}dJ* zExy^!-rL*9$IHthXz@~KH+Q%&API_8YHx3kXz7WZO-Bb@nJ%N8jHq847N!xkx7*4) zIBTI;pzntAw!Tr|>Ug~q%7apj05b|QGhhPnhOjX5W{nQ6M{UO_Rz$HS6sx3Ir*W`{ zDAq`^`4sC+vF?M|(QnJg>Hwzt4G~-$@i7ppj*<*CLiHO;2Q)J-h*zf4;RyMS5c|+?~ zHneVYhSqJK1?y(nSVmvB|2lTw)pIarGV%rDjZ**)I#a^LU9mTp) ztbQD9EycD|Y&XT4_FLaL*anLAqSy+G^{4%I4PwXAa@6rPoFkK1XgM+^ucfrtAlhrsV6UUklqVgrl48>-wuEAf$HAshtS!aLDAq`^hHM0tb4g?fLvDOruH4gR+#pYA& zB#M<%to=CH0*X~p>|u&MO|iZIL#%0)0%*T`Xuqduzd_^l+eF9QM6owhtZ5(B3}Wvz z$vm$QmwD2)y27(?l0=G))Iwcf#-($xeV$Fr_%r#!g$t*WGjcOiQ&Tgtk+M@P5>@4P zc51u|3%lzf_@w65bird+e>tzJ?J^{u{IaUrPDnhNm1$cyZ{JRGo^Jjr{YqBK0hn|S zq%`%pA-$4oZ&T?p2r5U5Fjk~;pYZ(i8n5;1b4ZkScPC?`fW-4liNS9LB%V9m4b{6o zfpg_&sMEa{nt*Sa?aX%e{P~5vGT~e1du9)_lUb*H^Vt{i^^VKst?$48{!cY73+Kbb zoAFB)L#$9}+pVlL!q!%WU4q!fOVHV85`mr%V9LKTi$Lr1nTXej2oxmEKT!l< zW|Ezwz3^C;M5c;~iSbiNoPv>aCd64X0Fk~MG3#z*TEeH<*l4`!>rZDw4wBn4ZCZ#x zN^3!P8zdlu48jmZAZdMrjjxM~Qt9UA>($>R@d<;iDa0#a(j=1BD=NU(2Oa>ven>(f z?&wfB^z~`10|LZ-kb{uzTh2lRam)IkL5)(gbKt9&|!?;YNt+^_{+P-=KR^4q7M zl7tJ!i_H{?PD~yhD?t-0AqT5L6Qlz4{g8tri!0L7ET;?jBS?@m*Am)@tPcI+3(M() zd7i_677>YX%6X&lzd$Lm#?>&auD)S{3A;Ed&pX5=FDKLtwGpa~c(TbdEv9KsV9ozjr??RJ zp#pMODlRC*-6;F_Ur!L{@$HmHbainPlamVycrI}vzowHF355*>RV@`@C7C5v^}WKZ zz8)wudvr*Ihh)EfS;*|$n7<2^8AC&N?D%PCVOvSo@tr$&9?xpixgsZ#OJ7^{Y5bgA z0nKH@;jJ4sZd~`#hZ~@}L>?(ZATPY2iCnji=OR5_DA~!ZTeq{!;Cm<7!ctem<^AjY zBb@mTAA1y)3l>NCgR5+04lu{?;M>7l_JXS{BB_t@({E5e9R~YQi(Y|V@r_s}QSMRu zQ(|J`kC#1eB_?YyA-w(}S%TRRFL`t^{13=4HenOJ1ZC$o@>1ib$rF*awZ^)nq`Mb> z-2%J*7Q%LZVtx|6=-Zo(oS-YnOO$Y-Hx&K+BuM@2LIT^@J|9Vo-b6BAyaXS7ma2&{ zr0vgWEF)D7Nhtxe;r3X|~M>k4bd zboBMvx(J(^p<~cP17qk5ZthNyOYJUKW6Zhv!6th(k+_Iww@d~7ziP0e4=dfmIx*m8 zj)a@x{dU66@NP%=8LOQRk9D4!$CB8Zw-CFOH!rd6;UzXdHzKhar<*0Vv5?MNh+o$% z9(fm!OmQP#UG>w=UR`6Hssp8|NP+raK2=G^@&Cc83VQv&b*diAYe%Zo|K6!8Z)|Zu z&L5HsE67*hB2z_xKEr&1CQn8>t?1|=KNb8R{Q{U6N|){J8tbqy>3FB=a?l}({(2Hz zak)u56q1%rYTp!Rr{$HGW}Z2llAf8FR#Xg)P;p^e#>LYoPMo?}Se(Or!*Tut?N1fqtY4I=X*RS7uA^EF= z{lO}k#>sP_9BjCJz;n)Xe_QjHUv{3UvGRLxK3Lfi{`IZRgMNz2Q@{T7?CLeo%x2;^ zB!7eS!Wt7KEth`!c=I5xbsqU;IX}&9~J8Q1!-2+4I8w)BRw{rgdy*ic%N)Em~`#0y4P|4QX z2AvHlJk#43{Nxg0VRd4Nvlj}yDBZoBtrbcye02M1S$HN3K{tz8{my?wocgFGGW znVFnKukYd(YR{?3<9MYZLPi=f8|c zJk}%F0rHq~f}dqVB;+2LZ+rzIpl^_ueEp7({|z=V!~OB6AA0^4V`y=vd?-TP2DV%NI;ma&oPIIMl&rA678#<>A9b;e+3=KT*4T{Heq6>$fV-9t82EeYSmTpwFkJlXNpJLGFtqDw zLsb;5qg#8vA?6)E z1U8O*;tP(>G+BFY9ATE~M%afkv-vV7SsB~6p3O^5O-e#4*0WoG%ea_kUmMtM1; zfwEHQN?;c;+lT65AJP!(P}MN&(B(F29cu02twTL6MeSZlU$}9jn_IAFXIai=iI(B&tn007{AGHo0pw^+Z-5b9Aaoe}wzWeUiUvK;Vi%k=ae?ke9 zY?!!eKC{JS9r{l22*l_i>yVw|E2 zU2(~9b8{3+U>%Z5p|u!h9qJPY1ZYrc&_OZGI#ky%XdP0hXvU6fG$T1wGZITRBL!45 z@&wh4cnxVrUd8$HD$bXWL8*f`Ja!wZ z-dS!0_ui6n0Yc-2b7#*(!F4`m%Mhtu&nO-PLX#?7CaY8v;-^Jn<}Ejp3yAu}bx3_O zL}}yM%!$62R6PC*C~Z*RdnP+O$#PBxFEmTfx5(0o6E|AUu~--b2Av?T$D;!67c6-9 zhS^aZx!K#iUUGo{h1_MQqplIHRNSEy=NC$1^=yVaH zlj%IPe(cUz1no?Wh>Fmk{t9xc=weQ{YIQtR#^m*(>V}Du3+(f_@6siMPh4D_uVSFO zBroI8rmUN$1tKa*(c8uh@-YjK%()XIL+P10Y2pOJ((BKL)VW?BM2Z7@^Y-$DzRMTRKOQcQ z_Aah&9zK44em>*TzideQyZ(5FnBaAeTe>qyw7dj6gTyZoJ+n+jGLQ>!i>ZU~{$3pX z9UtW4U>DfV;de8MY>0PTA{-9tnTeiSp&F^DE;s3^L#Un_M915_fsN-i)vn`esylg2 zwJWc0F6Z^lGk8t4<29PgPSTj`^zK&%|`%;q^89`jMXh2+{yOJe;Pws1bOAF(UkSmfG#a=JO!rW|~T_$Zn0 z$E5a&n%%<08s((JB<4N5K@lH|>aO_NjUh>s*y*O9NhW~T&;qeieTwyZ2Au3!v>-lm zgyT-0jDw}*P4>qhi971kA>(l`GxNgAaGYyaYHD)w>9*cpW=KG~-gQk}Q6UuO<}N_~ zfJaF!U=oQMYAJJqL?ztu)~l~_!j&I<`e}ki=bZTU*Q=`j`qu?a1yjL(%zlhyLS;9^ zV%SG8i&>nSd2k*o9KUFMkz>})!<_q-=-~71fJMWx1bLC2B=R5BlkBgX@NC3wP zU}xeS3|4UOvy5d-4G37i+}Zh#JM8W6zkfXTVCD`;_aXG}MqIB$jZ7qBEMf-yUM9If zNX&^@BZ0jBjGEa3g%I=*a-w@kS_cYUs}{`n;Ykv|aa#czU8`oM$1?v^6S6gFCN`q2 zuh3Q!==5Kp)AeX;?!n&=oJq|^imjqc>Cl|R!4zM`$k&Ls+^nn%$;sD0bghPI77lY> zN^4S|S?*x#MsmIDJ+mTD7X7 zVej5~&|f}p{QH#kkjoF`qMVDPr=eFU5!1UO_?U&%gfqTW|4oPGPkDDjem;;uRg|zuB6$)K%g51_yb;DoAw zfdJ0368%7LM@P3lL5afmmhG##vlh$_adU8oLLnm1K`2a3_4oJiu(h>8IYJj7KQ{;e zNY!<>o7FH~j2owD>qZp^VQ*7oX+wfdSX(EG;UFQusIR4^Pop&SqF$TXllM9Y^57o4 zHtIL$JPsx`o7bdK3u6m#I&n-RJ{D+kLUBwyK0e`(Q;NF9dPU)+LjCYz_Mf}46Cc7( zybC*#&$V&lOfI%xS@yY-icEMpB_$=NrJXr-?ou`+;;eJ1rgSmobkf<=C(tbyXwcS` zW)4Pu)YdjNpyUFL4q<3?NKA-rVpx}mSn=GXoqBBz{{8S_uLmETF7CX12q}HP_%W^1 z{ie9s!$-1OP=c5Xl-o)WSY-~z$ja(=y3HKAkwQZ^lAA<{u8O`&C=@R<&a)nPbmhvG z1qH@`{cC@V`}_sWT2qCnUm1Mob zCNp&FSv~A`GD z<`)qeHPhgT)`Z1*t z7xK|6-eedu-t76Gh|F*wcrm%@5*seD0Imcto`5H>xB)77&q6Agpnt((n^WM_nKNg` z1UrH;T16b7=85(H1}?uuo${W}CfEP<9$ zgdLd_6IC>fM->{&$zsCHnN?LcKpMpQ_aD=SFO_8jDQ)~lY2zZLjkZDB7+ntbp;#A+ zEuz>iiuD@@TSc)A6nm6nCsOQ+aj;Gldn?60NU_H#Ry!&dv4D`MA*Voi=4E#`iakvJ zI)Ng?Mny^oku4M%MUls7uMQL|9|!vh#okY`ODJ{<#RiRo{ZD3U`iPnO2kp0*_A42u z-*SqbK*xNDVjC%T)p=DXQgNVt!NFs!bDg^#;q6p7@wts%7+ zj8W#=3nMIfDzhc8mJlQ) z{Od&_Zz1;D2J$V6e5)~iy3RWPCtTh#>0vm1-59sM7jg%YJRbxPxEI`(mprSAFA#C_ zV&Ul|dIv1ahBsMZRvLUxE)~{P7vY+V-dg4Sy)83Ci{&=rpMnOvqk~-Z!`|deT$hRCEb2~)N zrIS3hxx}h{-+hzg;7zj0_T71|O}|2*T>E>6Z_KK{qpG?%C%;aCCBv~T6!!P(6TF>* zgX~nQl9H@}B`BPEi?lVoXGcOp!sq+aGAq0Eny}t(J#MTLeWTvk2``J9n#Rt~#w(3| zyfb}mO^+>8ns@$EgApVUf*5~=h!G(Ww!NSLzWZXafwgjQaBz}oZN04F%WJ6Fk=%ru zabY%MC4^2d7pF!@7hG|2BE=xA5tlC)iYT>)VbdG)!6|3b2z?I15T^Dw6te6+tVfgLc+M=8^{sbe0y z`OicLjNwXMMSH)fqNw9?A#wC21F&&IRH~?_yQu+waec-_2jW&2K7Glp%kR5?)#B;6 zr7%;`rmLHEf=noAs7EM!);=0ZITcSzGHuSolTN~uPQjB}ZQZKVp}NHBUHdkGkFS>f zykqmu6NvL*NN!liWa!SAtDl)KJ|gSxCgShjZ3q#6%J`J%!?kNa|9l=%J{ey`Lr-vO z_JtR?YbGL&c@Jt9DWQjnt6^>#}St#Zj5}`ZUFzd=E%iJ#`lRrDItp`g6Xs+A<|GOfGzoL!f@&mZ_Z;|j_M zqhWS&YDY>qCz7)>`OU&W51Xp70n4j8efZFxy(bU-`s0uDP>c{Sw!1sdu-UL#O=>nM z>GtXEdj4g8`!FwX%nKSBG->5*_^efki2oG1H{XOo=AX1!A+-3-OtYF zdXL~cE+im-+5L|^`{G>>Jof^Mk<1p0LqbReV4i9eVkrt>lP$(HaST)#q^jr;cQ;n_)c_S&_`jXTCHIe=!Ix*O`NYuf8eb8|s6b#-xui-wD8=EPVN zWK9Vt;*Q7v_Qo?qgu}+hqGAqHs%D-Xe|j*?f|Eb~eDKIuU;niIFqlqDi&Dw_H0JbB z`nh@G(x{k)JomA;U$KG-8Dn~`C)F951P)jGY1kWhO9i##treNM@n&G2!W)@eVr3vT z6^Kn{Q1)ieVtt>-U$7tH!@Jyj#LR=#@N59a;YhPE&tdK-<{i?;aCuY=Di(u^K^*UJ ziGl`ZGrspSuX2ef7C^q;&Lv(u>Y?iJWz?K97hE6X)PbM#owHR*Y&|Y+4q(QnUd{HA z5w`}U10@~5Cv2F8p5GJprlM>9xrOA-fbK^=w;4^XEB!$K6@S69`0xZl6o7x?%^Lg= zzYgG;9BqMkN|`M?BdlTUX@H+4_OJ(y%dnGQ+@g&1%WUsJXKo?fB1j^ItaL;~@c9*fJez;+9E#1JJbz7cg>SiO3Wd|Gr(~@i z&@Q?-W@jHf0p0nP`jRY?ZlS(2BO^K4+g_o_&MrXsQ69;)&`^+?nyr~psVZf=yjM7(*jmQKA$94y)?a0IIV}hCx!1ERV>4(%H@3pvikcFMhx6YqHCl~)!y zcXk$6Lr7?<>vuC{ZQvA(X1X(L)~xjH&RS=RRupe8>~_6tjb?_ps_!NY712TxD*6g~Z#><&{g(emCby@x0A_A*vcQH$n+nN5pwYHbF8 z)v}?XoTGR^&&0>y6sEEl8jVIRqndR~yh*3K4pjCvsO&dT*_YUzUto961xfswbn4)- zV}GpwVjC#xMyXC}%IWbfH}`6h+%K?VyhVN@o@eqAm`rj+wS1mDX3w-B_~D; z7$n|unT6yn9DDMqR9zm%JsS6P{smUbzN*$-=$VW7P->+I>%r_bUr zPQ3`V!-cGh)*fPdsU~smm%HG!72G+X^z`(!(RUBDvKB_maU!u8R&NJ#&(FjWH;k{z5jk+J2o-c(9;G{yS+yz5KCkz7NzSqkVNk~#%yOv3exVddAkQW~Z>wFdL)^)b}f`D$*@oPTSPm7Kb8BzpaC#J%)Zq zEORs{)v_g?VdoVYA*o0^e)8n8y?c*k?#s4p&GR{1aiCrP@4x@P_n^0@ySqDlAHHV9 zmJot>qtr$&wGF)O`R5;spK|+SOXB}6%6OcU)umMQ<6>s$o{x~LcWFj>!H;EiH%>A$ zqNap6$n0!Ake_eX>o2GpwyaC!H`if}K-crzBG-xjxwC6^H zlTRg|ICk(4_6Da| z<;$15c9k6ZfobQM2Zm3}zypxGauIWVWf9H#t<;5wy4GCJ5SF1RQ((vv}M($m>mJr^by24I2#tkplN} z9d=k#OJjWl$_y~w8d-Zgsgu&**UL$?&DfnyjT-3wluCbpd(Vl}X9Ypr#NZ@0*7k0U zC&#pDWKB(^q?(nj40#y3piOLUxSqwi3)6x_&lS&#Hx7fvn>9Men+Poq-J`Cy4)D1+ z8n^PfIMOM+k;0uRd=`PzdnEDAei-ZY7S@UQW)q8bb(kg6aCKE{MaUIdYR#9As$YnfG4l%)xsddrG??zw-}V=J(dI1&V7tZ#mP9HN5X zQDg9Y>l-(J{q@&-(m5gOgp62sg=yUrKgv5OIxwZ3;4_myTSM@CJ1qP z`O{Bhq7YO5YE$l{WINg&pJkdb&$8D23IhB0D^NAi`|vAQIh?0c-PSwj+Y z_1?C8wMXo8N9=P;S3lzNeK>-BSVm$oSF;k!Np1vN5reIeNT6{^aEQa)W#TY*gTo-P2@{?{v{ZR{ zD3(%)HTxXNx$~*4 zUI&S~zu%CYY|!>3hF4Te5P}c{bLB3mr%B3^O`CRo`^`7-DgE|~tvO;}=-(fu@Gt2*w=JA2278>3a{UdwWS~VSWZt6hlqf(%jzBPJ}##MusaINqR1Y$Y$jTjir;b#!V=+ zvg+$Yfzr$6-NfMF?(S@Brx0Qx7^Oz$V-v!k;~lXwT_=w9pua+kgx zJK;9$gpm4rqfsnWkW-^y+1EcXK=LEkcJyj-hO{*`H`HVC%gc#DD4@NaxPU_5#8x?e z{N$-WPaHy}wZkVXjz(MLg(t3*O$8}G%s2iO`6Bq2;+v!b z1FnA`e~e4I+OM(_b4n)l?v==E{me7ZG9=rw%x~V^ra9id7L?*0F<0g3f($9n4*ovQ za!#n6_2^$0!A4rlbedi#nGK@1;(UF5;}|`oSI07^VehcBn~)&Fyzl;a0ZsW!zq1B? zf>(u8QKECh~{jix&k5#A2tJ(NRHeSQ%R@*w>K% z0_F;PPVImyRdnIHnn>DdtyUmPuxhF4^))S{(&Rt%0@jh(9lpdmzJPUn9_u)@`U(3Nm9wwjp1H_TRNl2vj zjnN0EFvoT4v>lqMj!I9TM?5%qco`j%dS8!b>OYcU zhqZ*5Sc$<(($^=-`W%`H7h79n)wqm_1T4JQjfwBr%2%u} zq4&Z(dN1^$_riOI?uGv|yn*)bPx~*R{R?RS(xLu`TSbRQesyjoS=FYrv+xnDe3SSH z+7z?!($jmIz4XQ$xs3MQM0@U}J@?X{?Z)r<&#ffp%)OmeF>LXhEFu&KirJG4>*LAZ zOl2MOn6HVF+e-4e-9g422SI`#^?_oN(d~+-Iis5xT!r`tiosO|t-v@c6FCeQ-`*tO zipe)m?s}QXO?7Tnq=utfP{zDS)dl=dxZ9bu21I{ODnpWy66>)-#R>%^9co41K_;1F z#6*5V6Yn$Ui9+SY1O{PfaQPv>5tD49Xz6{m*#b`V4zO0^Z6Cy1VfL<#92p=rY&a$aAtI_qG(bHR%Wgs=yoVwT*!*uV;1AeNG{!Mg=w3I| z4Y8!iu^L4C3zq@5?;sn(u#Ksp8}_CbLF2!X=hc-58^3;74O5qfzkv zqFjQote+o^9X^U&`QNf+G%9{H?bp*rO{6p91Q1pvjn2#o`cvKD%#3cAnLx1;`qz4j zy+VI-9|zk`u|@Q+ODNVv-M5c}4WQVYDfVv^yOaLZJPtOUVrBHNizv2({^U0f*0cwg z(Z9Z(Vo9xJ%-qF6tl5`&WZfwQR`KBTu6vHw=z^^nP0?)|>uyA;p%`pY9w7TSBo8^sglpTS14xG&tMhl z+_dk?(FpYn7D@TvmT1(-8jQvU>lh5*cjSzb(}--g{~({alizpcWZ$vURGcx`eWBQW z^G))+FSvjYI9~{Mtq;&X49nOehAOwLOIB5-YpJZnxJ1dx$BKGz(`#!h&C}RU+P?kg zU(dG*1f9K;CP4(^1Upk&5=0+-@WFRGHB8Dp{*t*>@p`BrC#SL`C51eLAe`+=n1{~s zV(*F8*p@e-zRbnLWo2iwa5caK3+4yQ6GXU*1cYmB?L9m^qvk}}+S)7Z?U``$uQS~f zM7Y{by~Q;0tDoD8RDgPQ@^fVeF4$>`p2HB}8bA(6#EN=fGj;UaN6~F%YV~?%+`wC_!+r&08B}@zd zYG&&3ITK14yx1@J*O%;(Sj57-aXvFr}cv#zcY*F56l4Nv*@UIXqoJuuuZkM-2o zy)TopV)*i6HKgSzZeLc>ko3MnF2)*(gkt2QkmD+fN?z7VHxtZUbSw+{yB-i=Sb-8_TUHY~Tv?gORu?4-zyJOVNu2RnmkJq=xOUyo|gIR~P#nj4p2p&!K44i~{XI^&oYK~1wNo4;uJyF@vVAy-0 zy_pEjmof@Up}-NiL`HI~uWusj9h?XW+TYQ|-Ia*awoY#D%mhwgu(jpb0od*b=pKv5 z6WxL*dIC=rizk|cCsIK}b(L-A>L+x+S}SjQVkSA6BMZ5yDrQRj!$KqRX}(GN)X<3Sz8+ z`K&PC%Mw6HV24GZ6TD5u@*{@pB>6VM#2*zPM>ERo+r*3X9lx=2K;0!2T1KEGT_?cA zy$Nv2o5#dYq<9&{8z{bp;$4UEW1aB2--u*mm%!p|&wYbPHsX`y_AH!WzCDkH4ET-Q zVJGm&H+kgmC&>-Ad4l-{8;F?-2faoP-+{Tg^(EycQ0C|6W+M0q6DKHWY2oCRl|%!a zTwa%~5mZ*T!KGE;t`x)>R~lEc6%|OvDmv~Fj)xRvJp3@owmy;l!#h#X+FB6HY#02Q zSQQ6@{!TU{BbNC;)V&8>R9E%~{@(N%%Fu?6QUnnJyJDx=YfLoVB&P0~x+$jYZsyGp zO=7wx(U{_@F-?>KHzKu#{;p*hz z=;5JKjdoEvkQFFE@F}8dq8K4vfj)Sm5y%wzZ7b~mvtotvmMLc4(z9QK5fd*AcK$75 z;yS^uvV}JXAPtMS=_k8BU4HN#gB)71 z60GT8>#6qPNI#7l2DY2R8t7mDL1D%8leiC-}lVk60wkPQ0xOI%p2?G7Kpbzb%dlQBq#5$2}vzAzIgK0o+4%)=-D6Kb z^Yr5R;Y>IAPT=N7AUG+i9Gtm)DXCV&X8#Zdm2!dN?Aago!_T+p+>Npi?HbC8i;Bzm z6q>S%ipq+HvT7y7&ZSE+F_)vyoxOB1`bvz3QFuA|dLbsu&9>`QB;rnQm@FeR3r~!&r}XUnqLTc)-0XBf4;d7oxThvUYGC=;vO}eaJd;@B3Dk7gJ`gs;ofFD1xV|%Zm&0ic3n%s}VfO zdp5B`hpMr*)z{I%mh!oiqY6}VK@g0Cjg^Ist(}82c!PIkVto&J6aMr{_BNtvn(VVu z<9Xlu0&9&#iw%Z(>`GW@zhduWV;Q#V0^0(@L5*Z8huf8p^SipySY#AirBw7d5z#~8 zZ`UQHxVeT(ty=oWbBNR;Mm`8ZL!Zndk=BFe$_UyCG~s|}kSUXbqFc}{v74#F_gCD}y|1Z356a15T7v6G#>q?GY^p8kd1PTSwwhEM10=c~b*A1ss znY>A-H`;f|iOLdBOKcPhJgovxD|G8-3P1#dR*=vJsl1VY&salmLiQ(PuO)xbhuOA$L>YZk7Y?CguOwpcNL^GoSJI64+QmCckgI*#xGC-pper^Em&`xQ2{( zBOFC)vGa5Da7Df%nVZl`!B>tmz}@&QyMzg4>Eu{j2Q5Fff?~$umbOZtot0(Xg*S-5Zf9!Bi_TtaV`31Up^$g9bZA(8?$ouFbiOLeYsdG-#8J`jSAPEpdD<@sxO2er z^W3QA%a=?aWyhCKa~sp#Y&ZA0=bl^aXFzMF<%6-2z{bT!BXSLyzwVuIQz!f4;TCTa}n$W@O2UMu>k+Fl=bJYajc591nV2{s$%poZ&-2`7cQjKcPPe(hK7oN z4M*%UB3qT&=?JB%>yZQn&%0obB?Ai@dw{5h!tB(`fBp3r-nJPK2GZSCAQT=?#~Z{$ zXU1gLHOYH!Fl|6#XO~na)<`6%$L{GQ*9f`{V(pzg90)M{bhOL7J>j^epAbWOTx@f}XK z*X<#)y}F3U?x%||j#K>-fR z=||Nr(WRy7SD~d|FE3BI939QX#>FtP*W#{SX3%Hqr~Ui(9sKL$>6DbL%+#AnnMug5 zffSe`X-_(GZbnW@PfuHEX?+J?bxl2-lnp@PjSVv$IBCOF zyn7%dI0^=>dr<@8KiI3jMo8Np<|k$!`g#Aw?1i#-in)OQFEcSrG`Ym6py565agyu) z8@UiOU0^$TNd%*&J0B4BA*Zp4k1uIQ6j96Xzh`&iwXsRV{1AyIH8|hndX@e5Fvolx zi2@V!i&xlv@lmcWx1mge!hS}KxfE7aH&v8ZS63#d_itd8e|kk8#( zA@XAcoV>fEhw1L@=+ragZEON;echZ~oK<6FJ`UD4WCOLaL9;o9g*C#T>>+Jz?Np>< z2jdB3Sz5|v2)VNl2ynB)tEH7SCq?~GnM|&*G`+L1rX2JZc^G6)kfZ$pu1lPh|H;@mA zy@Zp35#r*m#m1Q4#axb>9UOkos#W(s{K!3E1h7NTU2(~P2wMRnY)8yC7Dz3I?MCLp zf+r# zI}QlB6(HpH?)dY5qeOZY{7EWN5{cyQMweH=SVF`HFOx*rVBJ#l^2_pa@^h}ll8kw( z8fU?HmYth_R2|qPE=JdIZZFm}sms{7;tI<;x2eE?zW$>XeDjF7^&iZtf~~ zsxhA|Z*_-2f>=uFa0mf!@-oTVS|Wfo0r|>ysF^FWQi?dKAsvM%zmKWqq_**R_w%*n zs4&7$_JXQ*U42DKd38!fJ}T12Ugo1a`AA&JbISv|u!O>?9Fo5EK&S$I2o;pbpQ%&b zN{)Fo5)zw!@hSW0)Tr^bwI#(lW#uKsW!;_i zP1Uf1kRLEWWd-aAMWo+cRYiFzSOgrQ5h~ye(ui0~OA!=rRwETlL20QN&x3?Oyb}qc zAcNYJ-D0_1X3^{1YiVz-v?ekLBF9l>3;9E`@RZgNJg8GlWKc^>dk2)s`t z&772U%V1Dqd{CUsU599NIvkr&8z!6EsVqJNuwb`liW-V$!s` zj}p(qq*@kkfLdaUC%%PvqH*?mnlw&Rl=vMvfrDok5wSaHHW8l{IC%EZuvvj4N(mY^ zD{$~+pP{k>2T$f1X;vWdJP~UVshhu_kW)r0(S$N@5_?fL`Kppn-X>8M_dz=$SzVhT z8Aw*w8bJDAi$~QXBwhZ#>pSQO=lDjkgX5i=y%lVq+1nf){L7qHk%0Yc(SQAQ@$%*9 zWMX<8oG#Qr-WO0T8koh`m(?X&YlG4%%W1AA)X}$LMA^re;`$PC){xcEE|$VLJc6_? zYFY1#7w$Bh#77dk+FM{0z`54e*9UsCpv`Rp-Qy1LVnN)dkr@^-YewU{TZS|T(i zWlEsnLE$r#t2cG(wD$Hc92Y@ecV{af^Q4s;pb$AZd3$masBlQm9GtZD6iIrEsSDf7(YIxLV^4lq0ZQ>Rf@!QSw!bp4$Qe!8a!P!Lo%KUanfC!@m_}J!O z8z02ax`)?|ZHW1--QcxsA+sC#1mrq)cLISMHKem*D48G9*{-7k0_it|Ghjw+*EQDb zT3XvlMpCzVrW(pCp*6E%gvh1vwh`%}kjr4(wNzMGNWq&zkyvU$@>a}q+|a`f&VIZd z$|PA{zE!g1=T#IH6-yPQ_acs|ykB(iJ!8P}mCpe;vv>PjdQJ!mnly9P1bRrwHqT81 zPNsKce)sJe7JfFxSFWVi_Lkvru)wI$-{od8;EXv`#y8n4ic7Kz3i3}LzeW!Syn}Xd zg{SMvB%1asp;&dX9HjJ^c`?6yd%TAFa5XQ-*l&C?Cx_4{HV?`is~G& zb`W)=mTDa~eOiY}uats=OffHg`ilM*eT8T*yvEWo3~V(Wx0%8g({cSM?80GS$5Plp z3Y$V?c_KXQv20=|Epr{tPFk{`*h#CJS=dQ)-XwO?pllX)(iN^IJ1Ozw z5bvj{=L{wWeRBUkxG5eX(R9tOOf+5vZ$1F!znpxNoy+VaudZ%PBxj7Xn}NHKnwzUY zQB{1CSg;x@ zQCuP;qag~V*Fp_1T8tXA=#f?TtiAvK`;(JlWmTjnAO7~&pNI*wi_^%s540Lh)JI!6 zt@Pd3H@*G#rkCH1QevG)eYtP%d;HIuHA!J8%l00-X;UOrL*qrPvzoa~B1LGMK z`<)Su4faxIoz5dNGSa=d zuHqC544y1!(n%dW3nZFCap~$5S;*1I_s48e;Chr5e001h`^S&9cJBHD5UoJ(K6CB* z_3PKpbT8Nuj?_V1!W{+f_eVnSKFMFZ1oxvx6e=4d!I(8@#Aw-uw_zxg^r`4k4@m>O zO=x>)cwO{sy~N|uQ07yuS6?q~Ju#C=dUZl6c21c{S4`|G#idLoH(Dk`t2dDWmJb7J zCK-@@>tLmCs6pagO{3o0L83aseeBe!Q^&e{jw6ZC6UTYFkknL_D;O1} zp!Rg8TYxQyxB|WomOz53;gbXI zJ@5oQP|`J1*e(j|IRLh204(vQ5?JD!rKdUrg>3*V{195=Ya*r21a=r2C8F>J+jocO zz(ddA4*$j-NMEvN!9$Z16I1_uf6F2K{PN2$2YxviKP*#y&)LMq$6vn=b8^h7Q_+`5 z?)|WAHo3mOwywUu4hAfw)gMl{Sv@S@<#NI`0=RZ%<1;hef@aO0yL?zalzVtsD3sDh zs5;@KYZ&u|W2B9f(_L}rERH#`84bBD{kpKIPTU2jPHt+dcbFRrz1<19%uQLYau(rd%j_i4fRv`04 zbdskK(LQ`{3m9<)?B*TF%E3;(o(zrGFfukPsAL6*SrVY<;w`y3rsyUTt78SZpcZZ> z2&1_<>j~1Zore*u;Z;D;#%JY(qRaz99{<6-bPO4Q`_Cy3vM3JZ!{DHZ!j7f*J5OP& zDD0!dz}8V%1BK0|u)>kyzLvtaQdl<%Ye`{&ydfoeBZUp1u$L(;qQQt{wj2i5IA`PY zUZk-06jnJ5?0+-opZtkPhd@&@9jEs-43ENk4hJPLc7!cL*EPyGK0cH-@GCOK+% z<|mgDmZW)-rGzbMo@6v(O`0beNZ6BhP3D91z&r7Ib$kJ`}0?qX&Zhh@>s6qA=R z%sjl9mn2@a`sgSMdxXNqQCQtDu!$7box;{q*g6X9*ay24IQSY`(jU;0zJWB{0ckk@ zuC=6u8;Lh=Bqk;$rKF%)^$i6=r*0%9T)TE1a~MQ@nl`kS4#zzyPXj|Ss>S zvxuT4=;*M5kxWEtzQ~2b)^_duyH?zE%}veCO-+p`vZkyt>C8lcdgM` zT3V5UKh{=OO6YVpGCtnK)>dh$oqyM=UQmGF7;n!}Zf-WVuA{yE6#fC@gC=>3*V}ZtDAgUqMiw2?_;;@P1j8IP$M0{sQG(^%62;bqpeO3iA?sTW6 zY6lmE0-fa7RPw8m{EFo0NqX@8pn=NtMO3D5p)%dLV-L6MmQh$4g(ZD!Ajr}%Dqe=$ z{jLlKYeivQhS^IxDeP=IZWSH3jKW$C18Y2U220O;}r*fnsEsQTC zw!io`HMO=5dyuWl)r<^3G#-gHR^j1qRDJrb(>SDSO08^45 zeU%wE+MTy0I=gz6mrv+Cip2LXj&+VBp(!ljRk@^ zA05{vN&62Xs5thMPohNAV`HcPgJb@ob#paEp(4zc&X7!x{>a;NF|+i%j`edR5!K0O z%rl>gAD_E^>WrdLW~XTCQ zQhf@`8g%LDb@er{o>o`YG^D4eqLsoO95{c?~ z-KgosNHl2t4P;Uuh>6kzVrBS5{7HnU>C7R#u(M$DzDYh;(sEFd%nBo|iC>J+`gO<> z;&ERMS%UhnnVB(Zot;THVv!COlaScjn}>jkq)XALT6r-#DeWeVX-O$)tf%&kj?T(z ztAb7ymtKmV?S)ez`T% z*b2M^OoI;$Jz*>bZH;iY>Scm%fu$CeaUC6fJi2NnqsF03X`WMme{1cYFXE#fdv2{xQ7N8r|7(|jDf z67eIY`vnrM-PSfj;s+wsvUsEn;Ay<|$hqJ(Z~>{0{4==VRdB(};DQjyumKeoM#>Sp zx#_o8UKlBNgkbSkpZM{s9Xqyf{qQSzzD6z!?r79ALau>4LiOw=gB5T1UkDB}CtSHx|TA`EHyd6*J6 zMyE?FhKy!gO4Iq)YHe9r(b33FsVL5eU-)KOV{v*Jw!)=)M7AAPPlPn5Ua6JSTVXb?20Vuou>Tw<3CFDF85$Ryx&Wo z`^(2#&wqaZ{r>-avGdq9%qcx5;m@zO?cM+FxBm<_T*7`Etq*=85_0n_fBhhM3<%>8 zfYa0pDc`9RxT7bUQqj@XKO{JKZ1^MLw$>zI zrbB7B@S!zV=c!nc=K{q6^FL4*z{z2 zY=4by0&Im^f4@MCwqE!CUTGTg&`GeUo*))MCK*LUB3W})DPeO z3Gpy;nksLXdm|-s2sZS}<9oM%_0<<2yuW?-?%g9N`WZxP5%mz8oPxwDzF*`1xa@?4 z=;-)((#G+QmW_M3(WE>_Lj&6vr`#`9DtW2GIY8KypxuQ@xRf^V!X@NrIfTfL9Xr0* zyydg)+rRiva|bVF+Uj!}-TXW}cI_jA=1rk05ze1s*bSBbFsi3l4dDfIEg6a9rg zxIVcH^VBqxW z)0aQ~=#1&p=S;G;;w6=h-GYbb`ivhxeR^P^&-{l%?OeRjQOn28PDlinP7FV~2cjMg zN@aifk$%yY4AG@^u(F!!FY1?HXk$s_SBOFiRs(}gnidg+glxxPD#*~YagMXChsUT< z$OH0Svh0qwjlrA;DPz*q)E^h!FWI_?WD`N$$(y-80asN+1RUkGAV@gUEqNh0Z9F90 zcxZO2!ot+l__$ww{%zNnUvB$m=N~w+r8A#%YTIZW!bvpkh4XRO!HikCH=5u6 z`5TwM*t+$T%LNICNkG!qoJQK!)dTw_!-gSaagwz=Au@8++O>~Ac<(GPlE%0U ze`;eR#U9WjwjoFB>Vk43Mo6aoYG8z9ge?a~mIEWcx7WQfgCUv_;NHK`pxEAlG2h!u z_7sH8B|+Fyq!W zap=(5vsYp(tIE(a!qDDP9E$)x+!2w00`!s7D1<_ikJeUI-V&`1L;mhd_6-fK=qHdO zwzQO|oQNw!oqT>-NF<~c7h?z`ZR5onjpnNpH;}}4kU3}%-7medyQQPCQR3k&EJi## zzYYQd~Gjgt7z8rn+YJMkb1Mus>#YKtWF|pVN z6&vkFdpks_X3w59Y04CLsT|Gns&yT<0qBs;uY<}g9hQWlctA;fjnWJ?{XJ=yx!HuLJq1h3b6nL7Lc{QXok{_u9K;1 z#kK1Qc|-owl^Dk1Ff3G~D$Znql`WcL4_>->_%LF8If2KN4UxpUiA%#o$>cIIyk#!|Cvt zB^DzwzVhZ*0b*h=UA}NR8rdB2@dwlv4QTRC)>&I?3*!(8XY8a=c8a>THl3x1&9udl zk<5J@r%cF3m$3$2XK!Z<(ploRlRnV=>CxMWg;~IYuMrCh6sE;!Qj8~*L#pLwW}@O$ zs#+Fv}9;Tq!rYPdKB*;m1_oyLx8K0|i6Y)&n6758A)VwpUWi2??AOb9ki@rbg< zu^_`~!-i*G`R6}hdgjG9B1{RjPR900VP|I6d+uHD0^$m;zPB@lcks(VSU%&pDW#QA2Sc6p9$)W|1Y zh8GgUAqJLB-V#$LqJ~1&QpivOsiAN^eQ<-1nL{BvC}chza~g$xdKlOV6!swsdyv8w zQ&@*#U^6M~Yzmu0VVf!JbHl(^P}q4CwvfWQP*|rvSaZ=$-JcUry4Tk%$q0Cz&x~y# zo^-=9lPBF2v2$CUEh`MGW*kvw#fv;LEyV(#jGAbY#xh%%Fbi6W#UR8?NGTS&-X*z|ZGk1IaR|T4u^Jm8hSW;~fO%V{eqrr5EGj>ZkDYU)w1 z0IkjHYAQHkVRUq%7UYrYf{bTX3IC=|;%Mu7jcK$43~mlW8s6goPx z&cK(d%gUNZlExb8X-X?pnzx0pwy?rDp7>8oIgof+9s!=nnPWZhv>td0N=?6+QkZum zHu*Y=6`r`9N;<$@Kl|6=3(*IDIsfPJlkl8fJ$&TIAAkID^fI%JS#k1&DJKerB`TC`E@!1V}jeSQ^+{H5= zfBf;~3d`{`X3Pzp;bkGxssrmv$|`Fr+6AOwgp;JM2wk?T4T>@2$M}u&542zqt<|P< z^1wds=LjG5c!k2jSs65j9JoE)I=l6T!jh^cg1O4N#B>AzHP+Y4#1bi54LK{cL2eHA zDw}cReZ}af<>c*dX@@~Pe8)dY#E`olEDOq>P5w^ta6BNiR;j96DXQlGHVUqcWOJV%M%K7ZQ_dfje^Upu~>c_ie z8%&@qv8j=_0qxqkgHGTsIEk+e8xG9i5 z_&XSF)7$SbT`f&_!+G-?>!{>Yc(_Y(!s~2pVD63==kn$v8{S-GK!iGu1b4-q^AD6k z#X&}oeUHS|*TciV_2^yl>s+*lE6Iy-fh6$r_4Z;Umdd;5;5Wd*Bq#d^aPTH@@Y{rg zOG^>3(f5OrPo;Os!O)Tg>_?37uGluGq$o2b`^LrO{a;?pZ67^<_1#K4#m-N*ehJ6( z2Vdl8YlNjocckBq{F6Mka{k-}%h5aWGiEmv&-`xj<{ay+OP4eMC;TcMH+jk9FTecq z8=;Jvo$8};4p_6&`>r?^8*kZwpVGVJSfNxZ7JL*azdJVd@Ngl=mj0i>yJS;z1Q!ZE zKx3M~>vzSTbcZDxHi?^*fA2JAxMS$J4#SLFL}6ViY#N32qp;3> zuqI9V_N;~cZA7nkI>|z>Pk)E#_2aCGUhg!?q}LCA0=h^?b)chG(NQII)PTNGZ-?bO z%?Qp>SQ`ra5rviVu%XO*>ON@GiGtLC?XTRMPac?_D4fVc^Ct>nI(cwgu3; zFp@xLsYoPhDJ?6^&B;kmOSy@|M$8}DKt~sG_SIj${PN3vr(=IdNs_bK?Jn-$eRuF$ zPLmB{gzTF;WgZ?LJ=w{>?Z%v)RBlAmb@iS&ZRX5LvYNAS@f=TUZ0pr1TgwX4<748I z^iE;W0-useVh-v{`%T`Yt?$$fWmA1?8Xe6fy63_MMMhoEZTt#*K*mi`eC034$pIB{zl6g@pw~ z5xkiQ7j$x3W>yYtRe5A$1mFXzDOL39>{OOf>4$qIV~BB==JEy(`$=&Z~-`t{de zZwcq?wZCo!tFtC*OH9m`i*VW>2sJ#cjEUinbRmnAEjfSS0BFUj1wo?~8ViY?o3yF9 zr>UZ{rd{KJ=(iK)t}9or1mSY!GoHk0>cNRoj07N8*@^e8V0JRs`Ky?z!Bx)`^4B%! zY&-2YY>4oMjnRMEh7HRCy0Hz}&s-Z0-w-Z@M}CVD>sop=7Q*(TW}&T>gNUhV(1e43 za9Q3zQG`Pfj=&Cim%a}-JV7q@!+lXeNfGq*riLcCd+KXYey+5#vZSPjHG2&gTLkky*+x3tx(WIGFN-xJY%6WOCjJa4;%m?#nojeaMsl2Hr)oRTz1*z%jhfY;gv;u(bY5_hvq%i)o)oBNqUpZz1$IiCGk`)EI3YyA`OLK0- zTur@Msd094-~9y$`*Tu8br;)KR#Ic|o)bpw3R*_`=9?gGvH!EHK-vHB*D)rMDdDf1 zu&95F8bjoI-(#KCxG7WT&l*3v3WQ21>4Nv6ofI*W`>%hKS;#SU99!1{_fK+WJ%fed zI&t>=189x_VY+)!TET9f=mIQk3VVvcIP5YALsUWvk! z4Jd_QS%%_*6%}PDHCR#t9kaNsyebvJKL(Vh)^ns3s>Zfgj}kCaR2C$}*8`c17fKP> zIHC@|`)ChX1XV6hj!sT0m7T4A4HvB^`8eSB%wKazuo+p=J``&LN z44bexR~a^lzxwlLb2EZ}S8{6h`R6rON4`;iwd2cedWnU+KK-ILjD($XO!;DznkCn7 zD0clZVr{-)zLUHb7A!0;M~Lor4(-j}Fub8*7vR*yTRBLDY>AvSfVK(Ns#vzWy8_WO zMTOJQrlB$Xd#tI{LbZD$pNN^HK<$|u(b~{%Wt!mLCu~>yA<3Bfa<-Lnverm-; zm5Nz}Kd!CSSk3iODwWpO?F^K48&7(kB|g-rfT8Dsp%uW;3Sh_=1#+xy3r^iAO~0`F z&%B%pGZ=GXd0#-zQ9HXMS0SFngJDpXot%9!mJUZ-^TFvo7lJR4V23x zZDEmbM+))~^zc=w94gD4=J?xrPG7gs#Z763K6c%`L^60SuC87(72fN1W)OP$&Ye5a z!8?4z{mU1xTm8(viv!Kj&yEcYhRtlviv~kzFt8wJ%+WI#^qdEJk|=>mpyx!w@i$?o ztcNO+j%1OX<0s;}yW`_wjYHUZYbk7ZRgm>vZQWv{pkPNy>lf(f>M`B4N) z8gDe*V|Yriv#l+RtaG?8R-<5aYx-4Av1glh=dN$R5n0+j&oR$yMH6}|Dk>tFEBv*G z{r9^>VyKxf+2X!bSpHFl7X5G-#wiDM@{Y2tX&QNUV^rNp-#(^^iQ3aJE}I zz%~!PO5j>qOVC(>eXFdrw6eCLskWxNw5YzcJHEgc+lXEyFbGgU1ck1oA_Gc@2r>oH zaX8JKENbsZschTHd>8@Z_G~4)V}OBW(?^9GHp##L=9e8Ge)!=ooi2=o;ISrLGkZAP zvh?DGFvCK_Ld(>1yLRn5n=ctZW|R)@vIw^E^Du+b@R}4AA>#AvMLozt;3)ywvPHDk z3e;F&q{d!s(3~}l(l0&#%JXx@x%;hDGoFaV-atE=UuP>S!pNWY(J7VlG#ENu?oUYQ z^+3V>QSzSRoV3K_J8p(d^#MD|+Zzn%yl5~{&DB~#hz1d3Z);~~t&oZp7M6A@nO%2) z&{p4T5cKF-J!wea+uPa0vKq0T(K9HR6fl;MZhSz%grMNy06!luzp?(oll+3kkFRxw zF-!qxogK#V-Toxam$!hgLa9rkZpJ~Dj?;2i|a);v6D*9Q)W=HJJ%Vim- zf84X<*s)_5ZuYUnQH~pjeX|$pt3W8Xv6=EXB-kn!ebGVa+TR|JZ9_bigRHIw7R>g7 z^PKIu(@+~ezI5Rta&)i9rqsi?iM6_%NoG!9N%D#viVPjaXFVD*gs_3^##fgEpU0SF zpnD;^k-r{cXR>Z!mLmd$2rWcl!$~HSIS(!JJhNBw_o*W6^nJYc4S4N6cKx$U5RsqA zbTU1x6C1%_A*|HIV61@D+hGhMu}~u}`ZX$QtHxAh=Z6Bu{vqOt#%1%`42v3Ar%Npz ztnt7WjxL;y=Q=#`>LvHDTefW3nustTk%n4J@d4>=>{d}T6yhn__UMq3xcJcu{Dp%cdf zA^zS9T{JO9FO)tF;YZF^Ac8_6V#N|{tqLLT%uA*DkKDTi6^oWGi<~`Y;gXP<^A|2( zwiM2b@d}~;s>dFCZ2d#){cfDx}~BXUf|Ky zLUxDQSS?{#Ekqv*B)da(b!ll5ye6g9kZN*iZ)I^ z($db(50>u0pt1JSx-RDcUq3%y6_Uv`Ry8FhT|Hgxyz*61q2=tu!zaU`Hd-O+YB6M# zbvaF*%xgjp4jQXVxlpKd&Ag7)SV(sR;vZZB+^hy}rU5t8fEyR0`Iymum<~?XF_^}~ zt2Vs&9+~ba>3Hg?j=|I#s=$m;jS=1W=%X7$t1d1?RWYNkAX!Ez8%#xUAu5R(wM0^i zsE5H+k$y`a=^HyBPfgGT-a>lX30`l;n-6&<7#6y@ASGUAgG$t%M{HE2`U|m9k-j=I zPjb{2uoDUZ9j0HSuZCqRjCBPi!kAvhiXFosdQ990PpnOMjz58pA8i_cwP}1M9lsx5 z;dv)KKY^eE7|Ebhn{J^u-9k=pAtFxIm^3CvGyZ4Oq%)+SqI zvbC9mUQ+;nH>0A^VGy-E^cgGS@orvZ@_3trb}c|%J?0>R_F|YCGPamur&_V7t@qHP zzS?@`o_+>>`s1djcQHM^fj+%u|I?G0)gVxCzER%r=dYNU%1TmtGd>18>rcNNK7F~c zkoj})^OtJhzPdWnoG>mc>EI9V?T9azq8L>aWXvGPfH3HpYC&XVU(dIXEnj@;-Phh- z=VOC9n&_uF%t@=OD05h8gr5T$w)BPAey@>JREs_a4-6V%wDoGV&h|r zQ5T;H#~+*1%vS>!Bfq@eiEtv?+5>GM#-D=ysc2Tqtl&xj6NPz4;^ zJ#_iaGIZH_$*{_0d!x|K3<^hdvQi?c?@Idq_qToj?kk%n^^~0+7RPscoI-7hqI{ca zUKTDBR?W9_keMOE$c|GXA>)-Eb01x^DB_-FPppg>YlcW8I!^V=FcK#;P=;Lxzd}^i zgA?CVqa_w;myFNT!7cntI9^DUksNEt)a6d%i8>Tig28M2C(O_%U|#sQ!4tx(2SIB1 z643Y!U^+IjPn%+th$jS#l!wF+9sJ0G$#h&9f#d=CQHk8T6^_J3@p4Q5Cy`qMZwg#U zfiWvGX+!_GL~iuW8snO(XLJ*AHYkc6!>}oQzg#N`kypa-TjkYYkUoEs_?%@tX+ls=**@{v7e?wtOGNz$7PD;dN;`)GH6QC6+l|fO?8A-%m z34v9QQZIZpaGfqECk^S|A{fb~GIaQ{hwJ<5Hj!r&qZa%P!BfzH7!W_wRIA*Da8PCbwrY&7+hIo@FJ0ed%oY_q->H5Xy zi7BSU3`Mvb^S%ZVPr@5Nz5o6Yl=aEUfyIdam?Lrl_n{do`&3qrGyRw&xIfBcy(g>f zkjaLidm!kr+!Nj|Pa#eUpo1stsNyZ<(83V<3z@>gk}iVJLsgiLu%*;wbYqB(xq%8( zi3nm!Kck4&cj2_$sgLgNL`79{gzx1TUw)Mw%V|}H(7Nn76~)E%9yrM@STJ*pw5{yw z;r;vf?9pmuCocR3Bl@owPH>`Yzaz(6BPqO&5DHtFMkKREzDN{<$T8E(h?3kJ;?aOZ z`a-gTa3N)!(8j8x7A}mYCYgWal4Vc68^NDJNPu%Fk~cN1C$h%hN5DC`wybi!y+Inh|9t}3OKr33+fas?16kXTzgx+(^}2i*zgfD&O?5i77FW`Pp3 zup-=HZ|JtPCk3N`;np@C$~@^RD;pbSGHVq1b*L{duQ#^_mz0Jway1JenocqH_WIiWuAVfkh>ZIF{6+j@mA3 zsD`IF;f%?XXAHsa{F79dRAK%wp0JFNREkHN9Z7wCC7wj4>+aSKF3{Zn`b#W6eJmdC zLyTKfT1r9@i;7|s3sNsIXE>Q=AaR+j98Xec4&e@vIxq^<0j-N)2%mh1d&VEcHk#6q%U$Y{}`md?9BL*IUvaeV7 z;Lu|!bO41;GeKYG%`<}hVW86}v_FL=`wTyJ1%*aEqd{hVs}{=7oYIC3r_dS-ThRw= z!u9R8o32E{my>hAm&9`OHQ`K20pZM^zAod$(n?Mh#Pb}C9h+nuIHlx~dQv!5WM!r# zCh*6KE0?Z;0vemn`snDo7QW?TOI>tyedl{lohoCS?n`x@5_GB~eT%N3Y=87gmZ zvMcBIqAu3nb622HRvJWF@vPA`I8T^5-fx#YGuyTpqeK|vwLcWBMUDluMhD*jj-C57 zX)W+Ge{E-tfOr@GR7da9_XtZUNo$BORWcHmjVO6@qAy(O`mOD*l;SChWy zq!df&iNacDZEua4ArX}_zCTD0S5gFXjlcG@ zuYko)aWbL^4UK;ONtm`Kstcj|mx#C&a3-@+kS8Ik&|q|MBZ^R2PA*l1O7lyrN@3B5 z+FRFP(u3}v9s{)kV}_7XD>UYg(PR%l;BxdROt%JLh%Y zVnC(0$I#My;68VV&e*umwe`(d4DK81ENmcf#jq3?qwHYC#? zC->~L#_%U_ggt8ew>bmJd&0*Y?0UIcmi53kIh39|vhfF>`#_DtICrB)Vd$It;IJbb z*BpIy{7yH8-|1-PnHAmX$m6Qb*JmE6)u&Kw8@2kvVP-sVm$am?#$8g_2fF~gLF^X9 z!aEa^iP$Z?Z?RjL5&toytrUK!*D< z?^@V5vT3CZgifQ-{uJ8M1YJR)5#e*23?|UGYB~Ja5(*tkp*0k?>JHd}d-1@NnT~S2 z@nqI7n@qDF2s=>gFQBkSt$%6XYB9kMeB#^Au~8%|6qGWaW6OqtzDcSh1I{0TsX!_Kl`W*Eg@B^QF;7Rxlow@NO+&d`jt+cw;E*eT;jk`$Ippg9* zhk>V#*>qInsiUC}*2LMj@0QKvq{OnkG@Z@o&EniZj!7OkCh^h~E<(lwQf)kV%L7u) z15!1gUGQ&@?^4<01i zqx6G)88tN-`##vro=gvA{*pa(-|FS7mM)l|ABI4ZR5dy(ahfnhuYM|gX~BY*!VoyJ zbF-x`qpYseAgr!yWh~q|Mu+=IYyaB2_pe&%W~Ef7l-s&`Ro1r~dgYdkE&0c$n>jf* zo28rix%&?`_sfUQT}6EF*^3viXI7?R?#QKOuN@>|ZcpQSi#>P^Uul&G4~C1aEaWLS z6Vi7E2lJ1x>EUrI)wqW@Z4P77nUk{2X|v`>gf3XRI+QsiNI#7QMjinXaxV)%KYbc; zS+5wL-K@5Dx0ZD48s%a}SDB&XAE8r4Fs16;tW?O6$I{j~&f68fFERfJoi-=~IzidF zc_@k2jCo^SbYohOXe;=k@!1l$$4d!rM71*$-EWs@bvubf^XJbn^_Vx2Xf8T(hH0}k z?W3fw$djP_bD;bZP<|OGKPDmb`qk^Cg30BWnBRXtbnw8TKYlxSaQANq4j=vNaH_$PItXDt|CBv#OJ=(Fq+qwvis|;rd_oafU_g-o4?5mHM0dUpey4 z4Z~9Yo8|gM{jb^x_8B$|q3qk(r=E&Hlx;oYjh=~Oe>#CecCxjrB10yRA3wG>lzCsa zY|)bN`IEfeQo@)EOoF1+!p_4#c;WKE^bZhY}yc*l`XZ~cAa z#^>L`JM9w0hptDRqt%AVxK`oaB{`RyeLg3c=}FHJ5eFDoc2 zt*kDuBBv=->ht$1n2R`FBKLVxtt-rp*7}xb{mmfrndmlVR_O6rzaPDN^K@)!oz`Bm&BH;c zt6{sUG7=x;8G&8LPG?TCk0L4gFoMSibP=!>gB0 z4)RhdD|tRJydnN@=a*l8p)m%SiMM?9<(J#v!zb+$1S|aq$^!TA6>305okppNoE5#@t1ln?%O z3m*&)Z)1WVOW~6#d^Cl392Q<_f_I_tEQPP8@Qa3pFEGJRq3|UXUPj?3+yalo(Ez_T zL>_UAGr2$jk%kjVr*}4!?@?)S6S9z*g+*YJhJ!zSf@$;_boA47^k3=dQ*If3E=G^Q zDq4zFGzZc&4ARsiFF!voB?E2Dv$D#va!G_~URG&QQAWn~j1&?hpv*!|h3iGgN$)7S z9vxj-!AV;Su3o-;wV*Xh*o_*Pp@#LUbHD%gQ$uw_{_Oof|NPVZl=7yIKaQVD2sJ#V zM(nVfjhoC#cbzV4X(>Csi(_YHaMIV;cv)L}t$964m>v_G63XnCJ-&9$3V+{V-=YYZ zFHlpNIUvjN4fG$k;+`e{N`6)}2a6b^`zmrr!J64}Xx4Ju|7PNY(e)YqcAxVYNFmt#9RIqCH(8xIeg zs_Ri6vhF5ZPq~umvJ_V}q?a>_%9P$ND^+!!RPW6+V&H@8IjQfcg%3TnXcU0g{=f-N zpZ}DU<$6=_>G{)915SMd^~r7;sbLLFV4sA{!-Ig=12HAMl;Z9Ktr!EL#S}V|LK6!o z5A98%Yx|(Zpe?Zq5bcWSbYjq!18fur$S7fd6)w^0R?=-@JtcTodSc2=snkLodhpx5C$gI*meA&;(rw$f ze7bu#Vlh7WPeNW^!tM_^K}vbo7FmwiZ_*66mTN}kIU;oC^cmC2BAJU!0j@ac&G*dd z!J{C`z?Rf!Bt7Ln5WEyFMu5>y<`dy73l^YG=ckyTAZ-3<4dOxEbxN7Fuv@IlC~4^I z71y=2Ggj`FsJT;&wW|4p(YpFH_BK2AnQ2Cnr${xZZ*?4WeX*(rG)XPOGCjtv&xJ zSftier%lD3=~{gp6d^fFAA%wz3zyVj3BH(-nS)v)Nr{OG`}ZD;y%uw3C>mvOfzd5G z5@FHS)z*TShKjuCp{N!dw)T-H7rEKXMGfdq+t8G8>BLZU6oAKq=gvbSVBpvVILU0I z1yq>#759x|%u!fUembVod(E>E$YLNVe4h(8J+p}vC-@G<8sbMx|E-)_@Zq6y4cpPU z06~DS@MZd5L%-YiJ{&1y1Y6o!G#1wurY2WZx%t^B+`MgvVwDS=+F8_)j&ROYcsB5o zXK-cAF;8%7b!F9#7NUq1V{SY-&iFa9O2}8J54oz#*aF zkoDk@x!{mcaEK>K#T|+#c5>Pw7p~`zKZb=3Mf4mL&fTy&C3M1q9eU$3(65&62=xj1=Foz-nHNEi!8OI652izdK~ zp#8tD>d|ynE9t5x`ry}C#|Q)GPpYMTt9o#IPzi;m)+4sf1U;2PyWRn<@VvEZgo;8h zAY&6%FAPa5s5vHxrr;+C_)rq5fx?fYbMG*X?o7es?-+fc_K-)RgD7;83HlU;P8tT< zlR|q?=n4~bGKD_U2W{?zU&f#CGx-z#14b`pH-Ex!m78?h!Et_rj_gK9_B4&$N=Hub z8+mZ(CJNn2q3<(68>RS}KIp-9rkzAb%HegUugO~-`6V~$OoNYjk&b9fM{F^TD53MM z?Hkbq{lDdrk?vZi(FgL#B0Bdubna5q+=X=RH~Z$kz^H|+yG09Oe}Izzrpu?tlJhPR zn^scFxr^toWmT5ur(Qk%<2Kw`nwXY!@#xjsBX=0MBn1g)Q62WG*1f1#(ovX{@bke? zv4u>Lnv$5lD|mj0H(QmKh)GF1UwHnlSDttr!K9lWo8sd$<*`kiAjnm+C5$=4d?9@0 z*~i}rM=`7$%tcw@-0=JEU;o5o8$y}GlJpZN~G(&!}i=YL<;s0wq#u zcTYn{OFDFnPP_T55HQ}!35r?EE$%fcz0k?FzJu-RY01xWc2HT_%X+1TtdsFX!boj9 z8|yl1u2=)kYLc(-BqiX4o^C`5qU)cmBAKT#*Tl0w*Tm;2JC8xkv^(=Y_g)yhxoG30 z7Mv%VKVB32P5`Eu>szTyBn~SjH&6@W2)r8WE);iw__N?41vT_W#A|iy9mpAiMA`Cp zSWE9*1TjkfwpJlu`weaj&WFZTepFh8xW6o=p z=%`G8Jc}2eB@lao$zp9;Sop^u@$ox%o;&x!2RO6;jZ@2eGH>2QZd-LzQ!VGU4URN_aNehOpYO9+!-QBNTnK-ez8ObW0xRI!#36Ifft5il=+1MaA(;*^4 zp;)$zc^LobhgbzpSYVBEkCYb)ClFqgVg9#tuVmD0B|me*d9yJ=@>)Z>daU173=u>3EcF0ja5H3nh+AEwM128?=b_= zA{oEGjK}616H% zPtV}cesqrUMb9ZTE|cGgi9(y*@6A zBwU1y-Zu=JgztT}3oGIQBwKCYzS6MF5N=qEMD8G5^O65eN=ZCsScg3DxrV>1`?-#N zOrsIGcy#BMY6L(q!f_R!TueEG(lFaTDs74a5BB3ZoZy)`FMeY*tC;cP8e~&evsSqL zkz8HOBr$ss6YvfSfc%AOKK~DG?*SM^)wPe`nVsz=o8FU6NJ1J!AoP+#KtNG!6bmY1 z<+H$R!}ex&gIKVOpx8i)2!hgk4TKsJ0_kPbdvCkRmfv%CHVD25U-|!cU}ux;xifR` zx#ymH%5yq!t9QcX(?mxDocq^E(4bMI&iX(2R)R`@w=gIeoG*Y7^anB&khzazJK4hy zar1v%QBLZwDc*1uSvF}vzT$dMHp)EGR4L@GyqyxnGJ zmxcc|ej~;Wj~$nM&m#*xJ)d7ZZ}iCcaTCW+8Zk^48vEBYVahamP7|Q>km%JIS-0TG zXb-g1)5BsiP|ioh!?oxjs`*bu*GND49I@jceu%{DCFtxYU8%w2)4zt@DG&rCbPq^f z7T|t_laqnrhJf%s-Wd}Uvth%AAHVwQho67`aoY_uLl77O*16`dLK@^c0m9f1B*OxN zLp5*Syoq7)_dNP&g6H+a=$I~|dGjzZ0;ak0uc{c=4^*-+Wzqt}C@c&5hu9Gi%r$?Nw;PXOzKY?Vy6By$s<_x z9X&Qc`!`=4QBm62go&ZFNvN^mpuTFR8B%SJ3}i@AKkOJCa<{Q6jM1@J;TWw8c$LZ? z3RppP1(Ay}w}_VI1mYB;_)3fR@M`2-0Bj1Gzjju{5#k@cdUbSt<(ciM8uaJ+%KG|B zlP?OWc=c4)ll8p86V*a0dwaT7z)1c5_umg2``kw$h222Nfh3Ac!yWJsPFm~)gVHWe z3ikI8Run>$EK~&h!~AFP96e^t2%WMAR_yYpo?7_GC}qW=9Xoayh(9uwjMde(bx2sE zxD3_RRWus10x-AGEDWfM$x;bIp|OxlFX8YJ<~@T8k|k(qOn^VRX|-;i(YzYp1XdKj z#Q+AM{MENKS6Btf?#LA;3@1Xzu%d!o<7OD2MOW9ycao)gG8WcYW~)o0{Yky3w!xS~ z%zBY`gmyG3(>q4V9sNxG-9c!{9TLPHyeT(UT)vu9URX$W^9F<%%47ycHi|*s(MGIxR6haC zwE-B7CezJ+B|I0+g_?`Ic?NfL7w%>n?nVR4Z(D1z6?7jFo*SmbKbWkOV@sf(!PmaZ<7m9P{LO)etV-Y!G<`0;DkwsgyZn5O7%skw|O zq{}reZWCtCoH@a*<@{PC-~4ozmS4{pJ2r#oWD3%YJRWl|kxL29U3`z*T2H(lNX7z# zgPZM38h}yup22I&mPLycHX}?yMw`Mbe#VR$@m`9C?~?^AEbjXTMJ)CWJLw^MI~KKg zMBzn6;i#F~jamnKu~G$7HA$v$^yC9}EIFM5!|^P~v6RgqW0PRo{KF8A*w!o*8wD4k z&f2+?KrTLcF8fkCp!m`+WnV4^ixpo+j*lT&CNp;ul?0$5u(5WUWm>I5L~K3i#%?PS zDYb@hY6|Q$J4C;^v#A=`2GvcSEfr9aDq1>wDS9;9ORD%~TsIn0=sgu^r<-WC8W}Nn zpq+LTk-2CE{ZorE(_+m0F=kqfnU*k83FSq+Bu7sjId$|@n#4?`8tC{ESrgYPYwD6L zCx=ForG#WoA-~!S$oKYK@-ulok^Gd(-n|>_^<=8V)M4&0bu>t%M9uVj8vuhzHweQE5|mU{X@!oQoJvF zYiqCjFgu&o?Be6f&;sshj79^mtaRzD5qI1%;@&s#8Ou<4`7~QGoVjyg%X}YN<21Y4 zR?VC{H_cXKSKIG~Ciy=8GRN*^D;AZPQ{;H%nrJUmO`V^=x~1T0UIKu$*B3wfEOk}v zB}S&vE6E;gpC(QHdHrV}LA6R_E?r83Cib}aqvMw@9sh{#02YcaT^cto86Y#2`SoVX9%orB~7B_WW-yfVs|4~NmV*uvH2 z7oERcr-=dXk*50Mg`)gwS3)MJUBKs-X}P8_|!Y^UYMM``2LZxF`>bp@v*Vw0ove+Vw1+d zszWw784Uteq^!bUBk3+igWB4>{E$H*AtBDa3AIDa1}8iZPM88tm;z3S0s-bA-cbq~ zGY0Qvg~dih9~+Ac%Ze!)dO>k%X;Bd%D!=eVI5U9$7$gH)tpGs;gcvQTZHO8&I0#}W zXz-9-2h-uqNDf0!>Y= z{^px+_S6u+886^9!;jSL`Np-i)zuJGlzRz6=u&Rc>_-31Yma`dGq6J2 z4N>?JGZpVX-afv*zIYe;xKgK=#??opP(yI56@Uk8O!o=X@$$&TqD_o@{l6A0=0<5VwplN z;^iC)#n2z*-16YC@4ox)+wV8+^p6+@w?_PLzx|dY57=?4FDxu}-MUzk3F1pteb}*! z#iG8dOT0Y&3{BbmYWtb=;*qrf+Q zE&qQLpydHR9 zaunu*r?S7bGUx2clP7nt`RJpJ47q&xgAYD9QreRDD>gG*uUsJ|uwpDE)p?lW_Dpvii`he+Ba@I~vNbIRYF>qr$_Qh5MP-#^g499MTIE41B}(*_xA%~^Ko}J*R=phfos2Xv zZiu%xuh9khyUMM=lC>&a{eyIA!W>dz4yiES*R7?5-QI>3?Ky0nQw;3tY4}X5mM{kL zCQPwd0xsgGI)ljDg_Pox-5?t3Le~Z&bvZNC7?xw>>+J-AwHwcu{sj)w>IgR{MF`tjy4s}Hs?Fq9Pen825Zw+E1j+Wh*qB# zT75!CCf~Bv7agreI9pxdXcfT&cyg*V(N^=Et$u`7?-N=bs=F3@Iq>{9-s`Pe{ms#; z-Px)htxgwOjnG}Q)KU(j<3oG(KSz7CLDUt5;Gt40(k(me76`2mj3e#$ z0WA3IIAgSd>*}ZTfX6%#O>w7feup1w08l!P&IBGaft#E}rvi_ua074L(B=)iG0__fu#}W3 z@os&6`}Zf&gi(+j!w*6#=XIP!uRZpMLUY?OnTPRQEl)xmX{iFzdO`zS2u58R1$KB0v|E;l4mEvPe=$8h-8gGxHj<7j~zqjmGw_=K2~`x6f(ri=$iA z4@J{Cx5anE1Mm&dKKA1{2v6^NjM5kI1R!x3*ZGW3or-I}i9veHalFf>ab`W2ztOnr zs-D7BO$9Qf@TZsXwMA*6O(=TR(%g*n*havpba%J6w03tx_3G{I?g2P!PY+$I<>o$` zHr&?-sBq3k@nWIe631^$ede@Koh~FaG$cf)(*^57!=s|YLkC4g!9X7q6BP|xI1oJV z`dcGV_xf!&G~yUHYA+dBtp-+8QFa@7AFB{Fyfmue1>!RUVYHHJcuW|6f`-SqkPG+( z4X@UPxZ%^l`bWKYe@7jp6O=Knq@G~r2wHp*Gn`REetbq}JclR7iPk!HdNJ<7UA+u$ zdIQq!T18hQf~)dSU*c*(Q3>o*(5Op`D{=?6+{M^xmJ}D!O`N2qot9&^>!miU&DwA3 zXyG+Bhc%UA?^^o%`fUbsY??g`yfYt=+n0m&V9ce{kw)E!>+_4i-F z&+_H>U#&_<*xxJ_mQn6l8Gg!5hEp3BxnR| z>|xkf9Iiuz?fgo1qx0Xvg&93Fl>8tX9~a zAD(f~+(nPZ8zSI9tgEN2R$E<(^0L^ERaBKW3~bS9#XoFE=)O_n<|3nlRWF4&MWIlQ z8?S+Q|cf342N%ViOHDQkd zW+5YW@YL!=L{!3vR(%{M`(stM^{nr>apQd1^-xgt@})~re&qb+lBRxMh7mbh#3Uyt8(g*Y zDozw9x`V~_w%(8Botu5voik?RgH&}QH8u5wN(7eH#HNayv1604 zyjY_leNE)XeV2!GZCAmGf(T*y5*Hh(J)iX;fLVIDnA-GHnI%j0iS`$mM5kq+Sdw67 ze^M{5GE)0K4+B3y3aE*neY$%m&G$?eEac-)M5zjm`{}~ zU;e}4tn4#9JPc{l<;#~YJ+tN44F*|mE{q+PK2z^x$mWBz)&rwZ2xjworoKJ}$jlcU z$tih|)hLaV?65X|BYJh3mj!!vYIqdf5^z_u7T5XMbs7AcnjABww6wOipdd37m9k4p zfO%fu0KXboPbvZGwVr{A5oShIYmg{p20xvS8qo3T@4tBQ#EIx=Yk4_foUookofn6M z=sabhffZ325@IwG6t8yfKEg2$wC?06^kO*pKOBAIo{bznV|mBb?4rDb=g#JztH>dn z`7}g=Fjl~a;UpHPQN?tDq@zPVFX7WG(_ptqw|m$u_L=rp$TSmt>52B)py}k9++12I zl9@FtEeX)pW4MJ2yNh#XK+LRw!)_OIjJe2c0*FUAd6!`!V!j8J3(t%h!xL|w`R=8HHFkA3N5sOHL?WJkx4%El-Do^>renYHYQd$PjJExk^Rx2E7JR9f z2N)PMOvjfTD-P8N>H2VE6xtcY^OPxjKc=jq!~`c})QrBbgrpk^Umgd9#UP|zGsjl%#~2G};3 z0CUMs{zKSd((|$g{|vi*$){t>)~`prq#ht^Jc5pxgoHF^>sG3j>zRqbEj)zE zF-MrQLma;Whwa2y@4L_O)jfOCaDj#f1*3LRGji0Q=WqdrNrUMvBBH}Jur<)t91(%u z(=%EvPb548FT3!35xCoE-0cuNUj*(p0(a|Hke^>b?-*s2axRy_rc8G5qW*r4(=!$e zPpl56kSkZOMj4%r8*@>#eUAMh$?DN(H*O?rc~M^8gAeK%BuHU@!aVt8ntb~F`O~*< zednF9qsf>hr^sb)|LAw#!IGT8i=KXZ<3>I6@WVW|O3bQNX>MTuTKY6KC}Go54r4B~ zeduHsiym0wJgVMN7I5=MMN3-4*b7B#f?U1*{2(m;<6DmLn1CmofG3=ZC#1PR6YzwA zd3pJH7>V3G#Ifh)8*A(HjmEsZ;>!G7R9xM~yFzcL!UdKt;7PXBG)p9UIv*H`BrR~& zs%<+qeY<+~_EN^K)J4W|+v4LlZ6bGle-7`bdDrKl_AwfDaQvi6r!z{sMm_hOo@s66 zndhEMgT*IpyB$kupMQ;Mop zjqUlne*Re(Qg>*jBL@e}FcI20QajQD>+9?4>tUCzudb}DuQL|p)zR{-RV8%|_4UX@ zcZHfwJ-l$-T3FW2&%LitPbUb|*OwLugSW3Q?4G`!?(V)mTDcVUe|&vC)INSF%o=w~ zT1T%&qE}OSGp;VGu7}>gAypFH>QVN(-`b_CNe^TG~?T z7XLsz*S9zWOq@DJ@aJIex-w%84sboPiJhbATjoL4kVgFPK;(NDiV(CmHKIqTL`4pW zivf2eLsZN%4=A<%fanZ_Q{HRb_;GQA0)oi|hZGI57i1a4Wo1%@l)I%YFw)6iOy9id z+t2i^$|(zOz9TJ%=zx@Yms(*`*;T}yp32Bsdh#SAaiVf$6ndBlo+pE%|#tv8o?)qUT-o32dGb@iybjyY(O86G7$DpnU-dmYC% z@-q~CiZ!3cJ^tXo{`C+Y@{f3S)?o26zs}BXlf`1{uv<8`rxQg(yF0+Geel*J6HN?t zMJBcIGD(N=3UXbmBs|Np45eyrt88ooRZBDHYm&HorOx(8|A`-!%# zO>6Mfv|WKy;YyoE6Eh7^Rnuai9XFzs^&9jMZ*0_PhP|FlHqb-*`mhZf-gpC6E>~f8X3OKDcL}F?09L9j-*@DTmM9S1LvoXmKgS06rJ8oQf`9EQ|v02`Oen z^i`-UX)VdatE82Dw{`+(+TB=8HvR{4P5EKk*Fm=P2M?v|p;khY@(TI2?~3F> z+qOrpPKeX|x+#?`;mLBI{on&4${qUV;Y1YOS@+vYT3h=~@;(%%hhf$E3G?E8%#Ir_ z(bV14)7aC^kQO~kV_?PM6}lJ33>q6cc1+6T$*?c;B!p+ij>QCll!$T4;bFM@81Qlo zc-gC@l=^=lISb($MuDlaii-SvvX7?@PX_yPT0R9%9TB_StG&+y{knSf>a~Tv?*9JX z=1G&bZG+pFn=oN)xQdr6TaO<Nb<6sJHOlu)wXdTSfOg*o-Hdw8OGAOI&y{%F7==>w2+60 zAy(URub3cINP@N!5gMw~y0}>28}{)5I^2z4U3Ss-w=uub)|XGV(ZN;2LyFT1Au6rT zfysg`|8VDs4`gx3bvMNPG9~*M4PgdXFf76POuZ(d2Bz{1(?J;bNW2T&HqhfEukUdh z2$r7@J3&clG1V-fGZ~Gv$FF-*R(R6(x=e&{AxbAv)_5r+<3hvw_3`nv$J5g@3cGlD zw`)Q|LY&`sJJXko0|!lf;DHBd!4DkLg2Ik5FTecs2!{$Nf_EOhK62z8K?+`8x$Vav ze>~E_jvl$(i^hG`)nQ*zSy4q51gKEB7xemdqYrmG9eu0Z6RRJ754#xjfmrW|2q5dD z*Khdh+rwFBuaCoA8HY7#3Z8u|xQ*h$xw&F~U=BE6pk!HBR5+%+d z+y-1wkgv3pS6GA+4Y6t!VAUronyuLo2P9}rKO9i2+7xzt5 z9Xon^mJBv$^GtRbPs*J8FzTy9r(yOAo(3?T6tU-cF`UGhTY9x5XJ;yF#$K9>U+=Zt zOrwu~NW~Z|*ORSNh~A!0*4n!P{QE{KjakBfy~Nm1(OB7hk=nVXdWkkd7A_4OlFEjV z5Fyg;<}#A*^)OM+kPmU95%0p!&9G(Q*MVfTbH-3zWGwEO#<){mWGu!#AS)|BKd01K z3h=vYr!mm zN%MVth7Ju6uD~mChMs)LJp;SYVQ7Qq7>q^#(@Jy0(EmO~HFY)U@9J8FWI#!- z#Dmn9mlhFVfZVj}eNL)6F6`N}=X^U#zO7%cibSNxm|)dOlEq7J+T}`Lqjb`vk3Kq4 zVs!3A6~=?_zyJPE8Ae|S(|_(~pX$Q=LI|Lu0))FXG*pyeDJm$dsD_$z^Dg%Bjqs)> zLC>+X=_23-V_TmMwWnb0mEN>#9c$lU^vXQ+?29@P8H`?eP{+8t5m&Goot|_9=a5Pw zH{^kq6y+5b7hOG{lV4U=oSOr?9_=HnLb3tgBt(aONzka2sVNH=o;!IWJ+szspEgtm zUXc!&_R1?ppoi_gym-lyARiU?5B*5wc>a?7tekzRunHj& zgM98jKcM(@?~&>N*be=xj(qgd6HgrZb}~%B^mv!saHN+e_e>#7Hi5p&Wmem>=K#y9|lEOAID)- zDE7vE;8lvBo&a9eK@D)c{+VZ&-<)aPQ(Q(2R-E35+FS2yDj|^Ibm_}wzkqz8c_3}0>#1g52Jq7BAHStv6-OT zOEjdT57BNi2EjhveFRo`GXTJ(7S3wr45`s=?VO+Pi_gE_luO)`o_zAjBzJOk(^sE= zq4Q%~TZy?Eyj^WRdp0f(dp2I`9UTn5$=l$JZ{pTmC6Nn~p-$nDJ`#-(FXPoZz1(bq zZ5cxeBiHbP5ZA?h)LzH?G*{;dCm{q|A4o;pk zXU-H907`dlUrDje>FSv$c{h%{B!5gBS+vo z{DP0-IM!4v)`gTwlsazsC2Nd?SBxzE+}u~#yQT) zty|~c9}m$KfB*a!sQ=or*B~FrUzk6sZSUT_ZIk9t#jf=dBc%u2R;j7v1*A0|Idb>1 z|5-qL6zwpo8UHte+G%8>=)V!!9)&FomM^XLzY*Q;FfiOM#QiUcnuzhH)$*uBrCN8O z+}*vfz6ueJm34(KF3t8HJWfk{soaKIiZmX_4VEq%UrHqjKC-M#BTs|X+2H+UXlPd6 zp&x$u;ZXkNs;VLtGE!n=RfS(tWG0;sDFvxC)WQv++)qsim6gJS4*h#{RA`_&4W0-C za@W{D{+K%zG1-5@Yed`UM$}m>FGf&e-l@#0s;a!4nnqh!Qx5`ncsD52G|-f4 z$oOcpnL2vYs4f}EHZ_?$MJUP0b(!1R;#?FcO7G%5itX#Ycp0h#?*LE^r^DB;?jN~Le1vq}9`|exPo^~kCs2JtQ z$a2zVl5#XbX$K_uo7YQl3lFY*_CPNcVuE`|SWmL+M6zGuPgIar)SiY6LtqjwWoAvk;k4^V$EB*uN zCVv#S`AvWHiN~|9HuK_R#|96k5*$}2CbM2zchv}{kAB1{ySW9C8$f`4IGXhY>-3r(^qpSooau zV~6(d+xzFvUAqsRETZX7wM8cn?b*HakG=a296o;GLQak#zmb`Pbq$gI5(KKs?KiA` zsGQl|Yh|4ByUF6%0-GR*n_F9v^8zjcPK#2hRhgU0QKY`P`tq484Gm}u@|){H!*YFa ze{WBJe{UO&w_wzykApaO*FvYN$g96zet!!2y$16+9pnEg=JRsQ=Y-bQ_Ac1u5S7u{ z(bm!gf!om7+}_m=HN#j@-zwx9RWx@YAQ#I{XFI+F?xwG%*0$EBdJZLa;dV^G<3Y2v zAo9Rb4XBUCSNGFr7CEw$u+Fo@(u*c~di(lmyf3U0fV}Dj(l1_J78c(%LA)ymYDR@u%wTh0zk6taTF*h@={3U!2Hk*r$cI!q!<*jo z{c=}%f8dU=L0_=!nC?q~jc1A#@Dkeovo*oa4armR}%)+vgK?)p4F)6`03kBm1h^{_H zt|Hi^i)>-285?0{ZraeO*ulQ8fpM@>j2Pq=5)q)%bKPA?oq|}SX;N>pr^#@td(Z@` zKgieWg+tt`w!pOen^EPP^vYBu@_dSfV0!#W*0Z7>Q(8iH_N5EwE?hvUz{Sk0%U7U6 z#f_g%8YatpGatSPL*v%3+$*?Xcz{*M$M`JDw3E|=H>L9f?82DwO zVG)rS?C7Y$gLE=@jo2XGP>F(c!xB!-KLjDWP{ z-P%z)==z%xbF7}TTcI5B!EJ3FeWahm0tt0V%=ALu_rkaA0w)xtwts-r!n6c)<5SFy z-@va+FgISt+!)REw_!T8bab|Lp^lTXwA9_rP2Am9TZyS&-Ofqe0(E}K){t`j;On;H zQ{CN1tNQy%BOmF=%IoR2;5nO4|4E&B`>&YMAN?IfEykDoSQQf7#dZs?I14B=D^2hy z-)Ycn-hLdB1gH0HUb|`~^1x}_=X|j>G_?QN+NlV!y3an@aXe`Mw|Mgfn{SXuqW$08 z`#=1#t0x)ZSvV9Qtp0MneUPhQRQyVAbldN z+7lJ^orr}<0eg- zgq>HO#V}g!6@p}_LBT;Gfm(3ph!L>js{%rzhf*Cwr&ij#+Iz*ERH5z%Z!zkSfPlfU z4#9*H$#K1%M4?39mBnM+z0_lQXRH(>BnFsGKSoSq>uPWB?q@h&VQ%TcFk!IlE{4%f zop#t|IHV|eY4EF#4oD|6OI+aBba&;t&FwYDY7th+HZksCixF#F@?ok3J3_eFZ!^ z7d-k9cr?1dmsT-Us}T!Y(@kOa@G{p{6=a^zE(0iSZEYLM0W(%?e99?X4m@Lw^BKD= z*FPgVqr=e|hUkFsC|JcGfBfj0H7BeA$%~+tJvY&#?dbZSHcuL(Q_DOw7CM#09thXv z<=U8WCr^$aKaOl2*nn-RC%&_t%qE>b6dsl8;%2?L55XidE=_8;R6+{v+)2MdQ;uJX z=`Z{w86XKb#2;ogtCC+zLR{ESF6U34yjhv zAF~M@@<-orGR-rR&ra3WHg;O{aJ*87PFnQt{h8>dUw%Pw=;edEf8UHSw=H|mUdYKW z%sYGf^qI3~kL}*Ref!S6`w*@No*0<4SDlkq#a%yXF}qQI4YS)2&2;p^vE}LM?(6F! zk@j_BE$ijnT)>W@94l3O`+G|1?1qIF;m!e-2e%?k)qJIex~lqHEGiZw-wAjLz+ba^ zv5Pxv>h4Puv~Mv+`#&Q*I~gsf>`lU_E845vh}e$$$EHWFGCH_!lIVNgfi)U@W8UKzk(I)0?(|e)=#$I z<2YU-X@(?nlAJWSmXuV~Akd<=wyvqI!&cRWqNq&2RnLLVO??Jt+&F`472F5drNVC^f+n1do_bCvL|rGNr;-Vy z3#N8rhv|-Goc=$-n8(1)fcOPAxU8m<=KA4PR#90~TUA?C21_GSn<~nRVdmQ(%!ozU zWHYoOgrc%YZ^y~b^!3whcY8k}F6yE84O9B-pv{C}VZUopB1sK?^MyMn%?4J3H`3Bf zR)zn4z}1}LuIN9B^tdy2n8Aj|-Rsf}TRl`LDeNikmb^UI>2qc=%@r?R#Y^R_QuXB4Gpo;$SRr`?xP$r7); z;*)>uIB_vEy(r_vpKHE5fQiPd%}rHB+0cf%Bc~@Ml=GhDZb5y(@V#1G-P8@8^78LH z%TJsr7jQrR#e91?Elwn&-gkGdzpA*d&w3{J6M1BaytBEdcssPS-^)-;oeheRf0lc$ zr?co>5h9mRJl4+I5e4lT=Goe+XU4sqM1CfpE8u^h6(FkGjy)62H%YO-Ko03SrSig_ z+%%1QAN91Bb}7Bx?2UC{NtlkGNDqS>+d}VqF~tD|Ln9%+m%jW!R3Ad)Pf=XZ_0q7s zQhQ)HS&WPJnOV6M?FEgVGR44Z>(?U^h#uV6h0tf$jbDc3~YeP0mb0+lkELQ3q2tT3H~ z-a4BG^dUQ4yYGh+?d|O*yWJ5OaQAzU8zwt6)zf4n^MK3{CwHX`;1LiqbmnufEr~iF zJEpYSq87vZjxb!8zUnShOIgvF*ux=jzj1$r1U?vEtx(&#x?yyvOJ8j;Oyb?_M}Iv} zrLhH=7?_aJ_e`+!#7?0%maz+myE>)p&G*wS7GMoU*SDQ4sKHV?gU)yHnQ>OtYE0oN#R-peHdtzDq~S-9h~0_{Dwp*lP>*(H1Bl(H1Bp(H1Bt(H1BxIa|0n4U>Qubat5f-ka}pJ>x4gPjS~0@ahX_}<3s>*I z-PH%Umr~QKQ*wHBN>8s&8*pBI5qNJ2WY$;EAYRn5*DS6f|P*=B{Z#c@nsMiu$!qu)yU zqbE+Bh@h%+d2rI}ufIM)yXuP-9~q?hO_3;U+P{)v8^oc0@2R`)n)f0clCQk@`XkRy z#_vAF_Wf(OSV<;!OJ%a;jYK&Hg-Z5mi?<8bU+8?HhcMxS4ZST|my!YG9e z8+QJDUR@tWuL_0ZNg`30T6;LTCMI!Qpr4YM%@R*C%Y1 zZgh!^3^ARh8!tu$KHDDtv6r)*OJ-yEySm%6C-=}!%cReH}c^WWMS@d9IM$! z$Sgdo#ML(#;Sde=#{A;C$~Nq=7dwu(H7kGLb2_iK%^Gk=thcL#B!P4l_hy1`$FIpW zZr}bUx2eN7@l8PW8pc#smeWZ?(}>}BE-mfza+As2Tr3FSyL$3`om6YXr`qbOiZbkY z9nc*xgx1x--oR_RkSA1p>C(uNu|XP{t5P3|U65U5(|W5dy&YGNovy6uCQ@l%W4#jw zuD-EPY8d10fgl8}D_j%yUKT;PgTfeJUnY1kW|%H4#AojFQ|Mgt^l)>5Jq0^GFPbIb zu43p99M*sTC7F>K=+|ln=5X1MPV06?YcC}a;cN&UIEXI-g+@Do|2nk>N%h6(KOu{Ib+T1!SGqb?hgMel~Em zj`Mn*xlI-1@8;$Ie~n15k*HmUKeBl7;_0Eimo8m$ zGYpPUmP3?RSnaisJvQ>r=iYnoz0rQMj_Trnzw_d>T9|mTkW{)yCBH($1@x;#by&W zcvx~phS8A`e&8#g=sO<)a8mFn#IW8yCfZ%*GV_6Z#?OnAY2bMYjf@V7Nw{;6XXLO+ za3HwDtV`zM2^HSHUT$uP{>E*#w27u=BAjua;C z0P@n!^|?ZD2voO`7&e?%3trg4csTszjVlWJ-0R>-s#VY^idUUd@H&oMu_7ZA40-5} zpTGM2^X2bx&sX3}x$yv);M?@Jwua8X*itKk|D-K;!F7xo z=Orq0GG<%b$a}$;<3sJ4d-lBi(!60#zN}FBMNfb7<(K#DIb(^t_b;w&Ya>%|+3UGd z<6z2UNn2YzO!xy#sTGNE*|I;bW6Lp8YYW&i>(JR|_?!q03KjLs0|Udt-9=aT?aqWf zvdzZX#9m=xfdR4}tGT1A$0`aBM?TvqnM~{DVXmqW_|nZMkQyN5u-^7x&z5q(AOKg| zuVc(HV}>H)%E6eAKdz1jUrxItC=4h}PfoeR$(MuT#)d>pe&UJv_@R-};~bp%_~Yai zp7*+*GaDR?DOYK=QXVK;UGx2fyHj}_7`UCt}bKf4n^$-DPwXa9m2*Vh9-{Q2jfe^37^JA3nX zu0wL@4!WXe2M9qm0}N(jZ; zs$#HW=D9T+4nbg^&nZ8D`bwq2qpXSz)P4W+@8@cjBSwty>u-}t4j@tSosds9Y}jzP z;DAKZCJPG-B_-!~ZH@3aP4)f#3`fu=fJb*LoWoOr8rv_}xgx|Gj>6w!yim-7nBn#ll-1B!%rP4Braf=!`^+~ioEz+wK5)*RMGt{3$ z+?#?%hxC>1!d>mSQqW}8OTuOKa5U6_zyKQLo}j~4M3R`93M*yG`*0$V~dR#(=7 z8FMq+JA0^Qy}N;PQ$tz~(me{ia!75>#x85Y12t$Ou|Eb<=D3MU*fOHsP{L={wVes4(ZnfjQ4Z-4oB(VY!#ZRy`)R1X;C0;~D@$=kXu5P;WMZ9!~XTR$iI zi`lq1kEYyQy0!T%_>HN9_x3x)<9So=WCw}{*43`(-@&g<<#>#e-VTtWm0E!L( zYVBoZ-s7jmV-fI@$CZ^aQjOMCAyr#wCTt68!$>>=0|Q3gd$%A6`}?7Axq#&YecS|& ztEe)2cxkWaI6Gieg8byy@!Xg(iHMqKQ$C?h{Wu@!(`{SJ&4b zg=ic(bz1Vo30iIJjC)5X-hKc5_b+&E8U&#}3Vt#bjfrRb8~%yqG`9zbNj$^t0C3C1_qyB3~Y1%2a->EP4odVMEv2JH9xKTWQP4Ac={iJwfugd$S2zGw2y<=|KWd> zjk?>)#zgxayz97e(Sf1T@4o-`P(?*WL1Dy@asNAkIhkBRmCdchz`ng`5zVo0BKMS9;{*Ub`i z-5x>LjS+O+CPCL_uIairr~Tt*v|$2m$Zcq=1llO!x=!qQ1lCa<+w-Qh6g@#ehPFw#Dr)%AD>)JC3xw;2--h;#Ks#EXy(;vw z^J#sq(T;|!dqM}yQk{s5#?#K#F-R+hiA+K*W!GLb#0IIQoXD?~=4n<|Rc7z|efxp^ z=~pW%kvs)xf|7h-)UkR`RxEC*?h^MPmsTo8KCR8x2OLu}1c^JNbnbD(BA`2 zmcUZN697^zS1lQoz3V6VM8EiA(QcO{kB z^q#iM#M!*%3x36|+vSWIRTcMsnPR)ys(r zM|^0MeL?>56Gsm1If&qBfF4}Ad^InZY~T@Yp*V3OJNp!r)H7$#@sf*I5k;1pXYg6K zE;4fSue&!MIdUxh?Af!(+V<`$-n$O?DrA;H79317jBV;jUNZU~n1P?Z-;e~e>_%XL z%z&MD4FH+epnumRDsG#A6e~u3J@L?)GzV^DDtUtf}CM5)Bb(vjp1e+t8l78Ldp972k%|CeS7e*R=@OH43!m+tBt3v?B%D zVu7|wpw-@n_NLc$J})o|ZrN87;ku9AaNWbgb>+9AtrTeO0_{fOp3e)k<8MQIUZCX! z+A4uoD$owP4Q+)$J4>L=yP=;g*Jy9ls#}()BeI)MH$5DLHdUl zD2v>z1~rfDCVQ#`SShfmo1K|G-OB%+ae;IY+Nf1s%OQm2^0(sHnT;)tz#K5w1Q$xH=D4Jcy*h2cdG%PVY4<`)c>!8VEVPsvI>yt3Dkvm#o>a$wmR2z{ z8j;?OS5;LZO)tx>I*>}2Du5iasEZ*2*oReQwqYF(uWhHLP5k8TwWX)vy4iKAv=-r^ z6DGLU9)`c>%fnl?1O@_^VUSGLZ(?n7F}9{+xs5gT!#|Ths3daHqD7GQs7(N;mX!d6(dS5&55-Se=YKdRi~7dg4iccwa>4M~*yi5FQd)oOl%%*U*%(hT_vm z!nUzMC4{$)J|KNiq-B$EM6^3zh`6UXFEW`#Y(a_b9*bBFkBSFiOhKXGQM1g3EOG$K zAQjFPiC9)qFSLwakyS3O@$;(@)=TPhjDmJS<3tCrw_H1&&>h9qS?5o$+g604<}NZ> zOV5cDMb&7cyS>*YGq}1$!9WBzv$5BBWbaQq+sJxeBxyUemnR<~XjIC7{mmDj_7RzZ zdt3=sWICZ<-i^qjq?M`-i28=o#lA!SO@SW#?%|m`m!u$goE|F>!|S4E4X$erV(j5; zI=toR<=mF?oq)y@^=adjygXuzzf7XkNB}JDYNgI3s0(g#Prp!Ae>(}MkQZ)1qzLzi z^G_yk?*#s(!xC`wIai41!}RjR1K?DPTf%7+E{0P$TDz5YU=e5&1lnH&T9H5tgu7eP zN(I^`fwo_uH4C(|8)&H&_xflllt`wudVzA3KzT->Y`!VwUpt@6f2Y(7bm|-E{vMx| z%1VU09U)v(EL<~Rpk;1DYZquE1lnqWwpgI`xee`2uj_nP`E6)5!gcSt;kvtp>$={C zwo#y^Yz;oxF5L4;fp+q3XmbSGZh^L0ptTFMF}I;@5NHv@Nv~_Xp`TH&^OhWSNuX5- zw8a8#yKr6If6(5DRWwMTo#dcRB&n$a_3r|8(|=Ik$d5{aI#IZCkwDum(B5tiIk}@l zpq(JlI_E*#ZLWJjxUN{B^%iKS{{6ZOAmtvw9HQBd4`97{fLfjFu58(N#iTt@*Isnt z*skAx*}wJk6#F7%{rzTt$G*g6+3K~w?>l-SKey=gxii^CaId|?rv`2J?XK#ui>%%7 zAvKuQH8Ot)XpsWq$4lCI_BXmZJdI;1^ZVJf$f3jB+(>mnxmCq>mmb;l)1|D6ei^B{ zQq;tRj!k5c-H}bp@6y5yVceX#i(Y;D>Goc%Nmgz6uN%Jl-xKbG4ek30;uK^q4ePlp<}t5T$Ft<0~rSj;kow~9#Z{*j{wxoX`|Z>+mnY&Ex5Vu?=;Ql%-nWjbr{xkO`k3p_av^ewIWRwPd)BZ--`zJZry;-yx7G}3+9zhoJnafwM z)MWqi%P-Y~620LVBVrg!E*G~O+)ce#kDMy*vC7>>J@CNT(CE7!U9gDveCCBElfy`M zcJ}1SlVw$h1}r8c*REZ=Y10pzcN{u&==en=&=g4V0kpbiXI0gYKgPu=$3Oe*v#~Bi zhV+htt94k%Su-3Rh~Y_P8~Q~COKCdB=#DKzDb<@(djv5;AB|KmaNf1_uZD2fz-iqxd4a(6F#D zgBqW3^;>jWdH%9~pp5n}z!&E0c z^VX|0VB-V!m71C)SY);_y}b@(5zKTzU{IB+y**)33g$IEmXS1xi;5*c%cB)+@ZXSV ze^vSsP{5GlM_pYmAFu!A;O>tpfLL?$(WB&7biX!S+1eU0%ugy-s3i=_7q$|H2Q<2C zVHMm4P&w<$s%6UV#*0l&2%EE4R>IKdVYA5;wY5V65ZB|PZSS&?+FHQzl5RoYq)6v8 zF*~0_Z_Y$--i_W2hn82In{_@N&aP7zGTTkX=W=ti&SW4d?9}P(tAO%6mwg2gda0pR zg%_bpUdXR#rL(Onud@?*osFgC^+wEx+>-LDc8eh#TB(nJ5`zo81jI*427vU2b04e&s&GkQ!;L0Xgm6T!17Bn7hy$b@>8 zy||MBOel#< z2w)n+J>`rEecfv(K0E?dB;YHln(d}#9wSG9<&as+VL`$q?Bhf>PGvxiU9B#{KOh8= zMB#pl)^^uW#4Scgqr_)yENaMNRs`u#c`Ma5Pw9(Rw7%Xxh;ZzXsoHVRDh<=xgsIun z4-{^v4f5uCbDaa$kQJdbp{e-cv2kj`UE(KK znU2CKv8brgN$DB&F~&mhQyslFqxJ!h;-`pf^s~Ti_k*6IY|a9=%>uVYBG&HLUoYkq zq05VMF6Ne%WS=^H_EL8C#lj-YvZ8{En>PFcVM^9gsh<{PZLcZF#4hmYmepU-kXx(^ z)vYzfbyU#z0c|T1;wV7b%s2uFnPzim{?4Dnhm063Z>~K6;e4RBSzBD@fppiS;dkqxyrcU0vKb{TL3qDIwc9Dk+#`Q-Si%hBubJ^+4Mp- z2?-=26o(!0m!K z);zU3_>Pq~Ah=7Uju3bN4B-PvHb|y52ATYQy*OWWttTi1j$YM>lq7K{C!=>0M(+`f z-f$Jlg!B0o;=uj%Q^=JOJ9-c(wu48{pFg^LH%Q$MokC}GG48giODFIjaCV>x9!|nERNVO^=&;72yd9W+uABmAH{xpyaeRa z9LqAEzCm-?Bab}&^zE^pybXx=f0O5lz2oVpAANM`q|hLp+^RA8NG4Xb&-BC-Pn&Mb zgwI?Yt}mF|Ox2$fx?3EYPpeI)#EfO2ky|#MdWb{9I^{)rAjV7>F^t)!2CrcSVd})e z-eK@IY)T{lr}*KA&D)Qht3$eJLJziU;5M6jq|#mDu-WT+7{XPiV0(I4lq!X5z)N*= za1$V>PNOu36PX=w%K{95EF1JPHyi>WakaH0SxR9^h>9a9rO=3w@#7DLATp0fSk!2! z2`MRH>IyZ*B71qHiAv$H+4c3&8b5P5fEI1d-L!uo$wk!C-7RfxWo6ykU_WP{XUOJG z!YC5H#)TNgahQYSFb9prHf-r`cTW$NoyOW`N8^cO7oiKNwA$9P)2GRhRkb3^v)9FF zEs7&HqNw(-TQ^itoB4LoEIMUWYNOwUEioY3(k8(E^{ zy%u9XA+&G`8er7Kv*auH!7#oXfnxIxl-cpvlwSZ0j4080>`7# zgp8dyA!F)-dC&~N(x{7SLn2&T+pLl3Fs*igW`=r6ieCCptky=(%E6n4AJ38><>W^M zC(e#*ugR?FKU^w$@T$=ci?K)a;2F_YT$6{dMr=4K#)QN~&7`GSY{!#!X0a7`e*Wi5 z-X~shiP-Xc@rr(8ThAY~Z4uiV#I`fUwim^=^?%TI$mf4`+aaI7><`-V;&tbX*Hwzw ztroBA`h&KEV%r&F+a|GXt=Lxo2W_u;-J$Obmj3_Q&vNm)_g!^eFffn-_WOgjbzsShKeo2#XG)1yyM@ldN=IP9b69@&%E>g&5R+XV2y$FrQn}#>=eXK95G%ou6Odj^&#~ zqMcrMSA7wX$Ed1pjX}=BlG&r8g0MFP$EAc52YXmlLIP8>9eBKhuJDw(&!nSd6b|K6 z(?bdBFnO2^|{e*Qx_7HrBr;HS2zRXRn0UahxSzb^95o{Pvoaw3Go!pu`ue==9p z$@#gcXvA8Rky%oQS~pmWGQ*1`U;FbS;OI$Lc=A3?V_H8>hbB~wD|?bU)ksc+|#OPp#m{@2C8K- zFq^mXv-#=5F$bu%hxryfpI|>fcI?>aX+UZ|tZZ@o0zG%1qopMc|Mf6%n@eyhrHXaB zNL0h^WK~Me0M%+^8Jl=FbmM35PGrkAy)9hI^A*#F(wX5H!kXyoK3Ll(h9-Pvs@wC(vEv&x9qcQkXEiIyUFcYJnhS6Vw(I+^d zsTlo;s(J^c7_$lGxeJO2u^Y^0D1cQ}n6f`}T%fDwR8G#t29m4c9BjCllXI#D^*TyQ zta@!kf*9@jrAfPPYb885nM3pCasEZwI;|F7jE|rqvjdm5a>}j0kh%i@{PCBq9J}?> z0L!kGy6P{(mQEKk``1ezAL&X%p`wk4)nQ;rW+km;ca z9nVRoN6Oxa2n+B>kH^HsjEo5z8yf?wcDt3{=^&ND@txf5sa1HUR(+;@+ttGt7`0a zTX9KAaY-r4xK)&w@68H!)>Y@9%sE{MKWS@8>tN$~SS}~d*Eu=qU~65wlL}*;GE6g5 zY|@7B)+3hrt8Y9=NHLc3sgKPa@;!V4we_6<#vjhGpfS_ON9e*vX-%Vv#x7@BW0*`y zqujf8M5wG1CpcDm^l0fZ{8A}11}QoJ0k>2Z9)uB$TX@3_H;iH}3cV8eTyIw zS-GUOljc}QMXxqv2r*Bm0w^R&9mdaRXuAsSa3nQ1N)%EvwK#(+q9@anL9KS9b;9`q z!nRV3G=y>_a5h(7JhprH?!$)<|NPy@VCa7LqmR~q`57Q*AAj}z;nPQc*}wD0-7pNE z#)W-e%GK-Sl+M2XK`%@qp8Ssar~rc03l-k&@`3%|ENw1F{i`OcUabRcS%+G0q2ZAb zlAr*Uc?3!fMg$v(6sdIJD<){J&=F%t2dN_hK`k~KR~hK>qRh0}Ad#^+wSw-Ai0Gy9 zi;`8Mu(}k+uD53ZQwepfGWkr}Tzn1B3aEF7(1~8LI?LZNa?tKJpaWND(Z#|S!ru(8 z_@BO&-&*&GttW`BCyTAu54UdngVy=iYF#kgTJs03tqlpmmGb`f0Is z^}qEwd!_a7Q6r@GC8=GU#lVNUm*6v!iM-&ooe0dDEQww0JG`SIB6AJg%kR!Xgyvf3 z5aouPg9y(5J_i{zxPZ0Hou0}q-2}{)1)0Iz=~!cmhj(JmH*Nc zWI-f%KvqO@2V_YkcOb5bct=AP#i2X+A8Sjjc>S5;_0JDqzY~qc6_t3L|GgJ~Cs(9B zxjs1oxxRP?a(!}&q3dTru880AF33a%=2-^O5-KaE(T^gZFm8p+D}X=fc-+d>h);PkWCO4emt! ze13_qlh;G*zFs(9$x21oj*}LA`uR53&78XBr!}9vXSG`2`Q#sGx;W`Qfv3LzSD{t$ zY!XPvt6F_sbK#@>Cnz1^@}|B~y#DNcbLY;z{=TvEp;cd^Y}6oVt`)RG2qIT<9AlU? z4}5%|!6mA`;V+A3rQLYrjnii>e>nrx0SFs0FD*(5utwL`BGig(^2!DWVaUWc2LZXw zZbP{^?B31wM7fjl5*DT*r-oNe@T}p7oZ(od9E#NH=)geG5o)wr4XUp~3pNCj^jvJt zs2T@FC@hFd_@h$@I@`k-jVCc0t1%i6VKg4bXiP!f5NH#&y2iH7&PHM`+w6^JebeLg$OyUk83w4?XnIO|i0?>`yKJA%gq4=;E1z{?M4{u<&%?tu|3>P0MHA@#M45z4XGf&%W^N zqxk&t$-y1FaIx$L?bO#ZM8%F;Ey+OPIZiDxjEyb)YD>AFzur&61^&AJlMg@qU>g!N zk3-)o>G!!jFfHDs-em8OabA8uoqv=Z>}OSyNZ3kmT0pZ(2!m}ECHd%P0wuFmm0Y@b z?lSJZ0VzQqb0A1AyZX>&P9$-YY}}?6%EqmgqGmC)F$<#7k+f{Eva-AnnwT10!J;An z*u&MpwyEVPmMv#3Q&15F|Eu$3y(rbDBEOEB6s6L}jT5WUtxq0r$XB1TOZ zjl{Ot1aJW2GN@|c@|j15s0sUhSah^ef_nj9u?I}Gtarczg%OXwUblo5qn6i0h89AG zZjWN{D#4ScVr|GyKxne0-j2B(7Lm|4hZcsBe!TfCPYC>^)i=Wr)lwa@x?8%I$iWgEMut?#*$dPeq>CjpTHRGhfNTZSYluA@PLbc7` zP6V4u>E{o$jW{l(nm1Xk)tK8uRef2(2xH2MY_&`-T>ebShEc`T3ubCTDurZ*Imjh7 zGxewwOu5WVP>9Y*)r-}Mf}+IA;Ch_P5GBDm5&tAc91;)U-y?~%QrJB>uQVr*oLRcG zgq&N_iL*=ov0&)@bQm_3myl*T)C7=DTr7+3beW|d5RT}K68NXgBDP?7w^I$>ze>=^ zS}LeovdfGgiyBCHZR-XHBZ)<3F~)XMusDl}bd!=ORLzhTK`;ta&=0raJft>~fKech z2F$arZlnV@basM~969*_WKcz%23EGaztvWeljCyHG$+U3xw#cBE=#DvFd{Z(X6o$u zn>T;{d1T}}@BAY<`NF}2U%_iAm#Hdqk*&MTOog5kH`1^$yva`2XI9b1|uc@ry zlt{t~mJ+(HEnT1l-HZwyPo|@a!n@R$u<3UJ2{0Fbtpne|2cQt%Nxg)91Ao(f1SBB* z%9zbBJx^AWP~2@(Lw$WiJ%Za^jg37$_|Xmk37A6VJj%)V8KPnVI+dYJANkwmiZ#jr zv+#OR^W5!rksu6eV#x6WgUC=4d`H;(o!4`qYvThhvdY znPMDY#n1Ph$KGt`$CGy?4hP7Z@5eTcnoFcs@$uurll(e!CV5(^B0}PPi8>~k)!)Ae zAg=;+poa3$w^IYW55MCbNq_&$RKZhn9;Y#KsMjkz$*%_vkf$}+PwHp%SEIg5pav`& zYT#tlYX2ZA8VzVpsKiRj72{V@S=Q^d1}hjvpvlhS{0iCG-)ryyKVOxP!il!NC)iNZInn zBXjC&YJ;pWze19j@k9nZEab3Ao_Xd~g5$%%Jhd3vY;gM}-1F?SucQ;YE$Tzn%JFJ| z(y* zReXPKZD|Skk}hdz7DMPzJLHV5BG9+ zXJ<>h7d6cZKHrkefZ&?(*M+MIlg1$L@6Qh)0L}O#l26jJRB9DA0aOXsVi!=!DJ_@8 zvK>X|&h--A4hEA%g4xP=oY+)ogTWsap524}z0FSE)sHj)W@!I4VQr3pe8fXOLLna^ zQ8cBH!{tU?Y>eF2Tx}~lSGYS%)<)$N7w1r#A5&7MeNWKopO5(wb^Nfzlu#ugEFQy; zS)EF4N9tPHeYv@r7?@4)ovEnpB!P`f^R@fhEopQF9kE)2;-jU|44a#~;NC|G5W2F` zLPtlhmZN$g9yB8hGw4vsJuwSBTLc#+Xq&?;I&#~{mu#r!jb&T=C~gL?H8Emt zM5hgB#@|soDv=wq9wIRpV)0!QafS$d*DJNVOR5Vl71&56Y|tIba&oGwa&l@oM7XU| z@=Y(brXxQ*lfRxF_-?}n%(>@KYWv(d4&G=wGt-JZJ|c&k=w~XxS53f`pLAAH8juO8pz9pTLlgdA$TlcT8K@x!o|4BP&TO!zB@TSlKyG>~X*UI3_ z@8S%ZnD(|VuWvvaJ1zg{;c6;sR%WKqA*44z;hl8zYx7{md?y@Ru@PxAO zy3$wG8R#n&={NL}l{0J`H*TDn;4Z)!>_ zMU$tt4leiR=EkblUUcOdF2aO~8?5yC-1YS=JuryM*lLrBnms!PtmY<@l@18N&KL3A zP2*tVu-*`LbQG)}Qyef|=yt6MEOZF28IbuR@wt7n*1W z;lpe4Z}G`up{^fY0{M89tjT#;lP};Gs>ywm3461K^E&FnvUHggykm^YCyJH6C{n5I_W028b*cHT4hz zBLUxd62391sXCkq6F?vzZg8CRxH?)o++hF5byQI30VetV{Oj-k@WXAZ(if(tMme ze?K#EKRrEeH!9Ym(wCf&0RcPCVDp;&`zabAm3qAdej=6Wje02y-&-6<_2S=u&ebva z)}zQc<6B>;p^in^>%+S2?Ewo-Z%;Q&HK?6g3MlYB&9z_*<5)0?)%C76^!L~E`T(uY zw0ZOR@$27vXX}N_Borz`LCp8R-m=ZYzVJeGWAAECHrQB_hk7Gv)JAF}mZEfQeH*Fo z*vDqiryk?7G6aoq9X7v*qHS2FfsvB*m)5N|;7(v8A|AysgM$)=0nQq_aTfLznI z%b-*MN4-jZoFzXJx!=|e(mPjQuTZ>Rynsg#R*miC`Yq!1!mm_}Cp)zct;2A=kSGZi z9z~OteCVN&Q&RC)xxJ#a$W~b0EYERN3&<=*$44^`Z5Vaxh7YnN4@^E}O+&W%yL22t zaGUsCYByc{A|}$~^wD|N-<_qmuA$l1Qe)4eJrb)D8!j=^@IbWH5FDZl4~%1asTQgD z&1R$biItRrdmFZrA}Wz@XRDDZ`?2!Fjs}H)sZcn%u&}xso3eEs_MKVRfz z7aht&lP4c~OEo#NtDvCPt?oq?@pNi8IoOxt;#MGTO?GIq``|66xERCZ*WK-;UwP^I z=b!)UeVpvR`0jZ}kIs85q87Q3w(9+R&%mt){6T#ks(Ume#~#?t8jPpk0K6CyQg;m+ zw~Y4;075T$Dzbxs?0KLUAv~{3SDsF}9t_g2m1Tf#N3~1;|C4oy;eK z559UnwL_cwxClLVua=7Xj>_YBR00~@La$X^!2=Ue z#8N(upD7$^`2AtNO$0?8IdbGP5fstZaPZ@gKR$p!{xB$FnFxw-37`lN-2oJ#M-iaS z07WdlACIK~MQr|Lt>U^79nh&dMqGC*9ZFB5AEI9uj)(AjD0Lm4%`mdR7moc@Gd^=2 zass{}2?IF3kUVnTb!m7r6nL3sS3nUK8ImmsJ|Z296At#4AX(4P1Wzm+?9V;2pj(h; zuy*tn0I^S@BhFccug9m=1H&8O@9VKw!}npUBYOz!MdaK95y1+G2%Z%X5s0Viw7$+B z_<{JIPM=mMUprc%7N|khAQM%9l}e$~EA(m>JP#RI=>dcNk+d+uDd+(ufsnlnZq92-4sV$Omd!C&K zfBhH8Jbnj?5f0{ovB++*_`UKf5_^_Tj1CG^`Ey6nnh(rJoED7cfymGH2eB^jY5Yq52^F#%o!aCTzSUhV5hODMnu5p8aHOb z7(I21mD+2O#xBShof7sx_q77*1X((QDUy;)@5R0*@S^*H`xS5Jqe_#wq73ihWS9C) zyDg%Ql8=Q0yN}j8(YhMHP|ZZQ4WY*UTibtM%l44A&mxBfFNdgm$%_ptJ6^O@JYEO_ zBpI?a7P3UNM3T8aHj1W#N(nRp)3B6q5+mkOQB#ApdoLG=EE!0Q-G*351(q1Q9crUB zsLL%vX?C@hJ32dy&sI*KzH=uwRwgCIuaooZJP!!_!Q+$1C8exoAH;3|ZHd^aoBZy5 zFd0tNn2G5-canlg|I7mI4|Czdz&PMyE7HmHFtX0SpU2y3t1URzgP z4Y%KEqH-b^+>dy<5pnT)eZI9?4Fx+()WXT$sR<5*p+UHJ0TK^R@Pncyq)|mmWkWv8 z-}n4)+7oegqoV>4*Fn#3L(jiO{%#VLs$i(yV*km0w_?lCe==Mi%0FGPm#(7dQRQ?W zMeFWB{X4quG>ttsFaZu#q31)Q{(HsxA)6ddzM|^Fssh_CHphj7V@GWWdXFWgnm1)h z;AAvYxpSdT)KQ!HMt}w1$pX<9d74qXzNW?AdXA(y%TT*M#6QAd8cUK|!v0t7`U0rw z_?DH_`{Y~K;#&*y*9sRa-ZovyLm_^}WJt{{NKG=nbuw0<;ELLUix8Si1sE;V=5}DD z99VYtaB^(u9Vo=;G=s?pI=9p30SeI)ym{-_pL~kP*IS9bzqJW@JWX4XkHpE5l(+v} zUQw%60mVDJjKUnWFd@m;Bee6iaAYypCl495%47|q6q@7^>N!rnYSpUSQ%42R)*+9R zbjbuAWYrQ}=jiT%1a)@{=4*?M_}E(NFdO7#bsccgj8y^I;JaJl8?pokw6qpLYV%uL zh@Dz@3fv2)>H=VE$_YD>t)as$e7wKrGEk?YuXQ^5gk*v(LZ3`RpAdvvI95^jfUlzk z?%tLT&?9wq4I(qbOAQXdaUvLA*X|ppzkmJug<#3M1721DY=(~O`8()>f^@+yyMz4* zSv()5;UmkTRoqQXGQ|Ve>NySt4dZ8lZ~L90eexY<#Vo?q2+K?{D;#qxd{#Wh+B$5a z{nu_3z7J2q5+mjqTx3$I%nfXvTgIcXqve`?8II3N<+hq!aH{6k*hs_DgFpWGkQv zHq!q7ty@b<77JuhE5Pb`Gr!=mcy7F3z#n$tmC-~MlX&kB9dDgM9R_pH$OoZ|njz8~Jxeyzcqgd+tC_qp!XJ$sxhCsogCGKpZYYSUz;Gymw z1Wu0)BDJ$?&;}5$t>}y&)^{%!yOx%IC&%VctvxU-BhQ~NP|uq;PmNep0Z6tFUoIdk z{-HzT#@%=$3P6-_S-{(_%dYW9LiT|J2a3yVs~J+rel4Z`>t9X%SY!K5QmN^-p^yP` z&xRI%>53Ib7J?w~}ojIM@I+A}ow}gtVlc zs~>KDOdlW6EKF%{Z>gxC-+>;y8>`L}Sat3|58i=QC-KthoD-KSs;f&cpGOiOlpy?h z{@ev5=bt-z_|&DdIRLHaoQ1w#Onu3537Qef6KEel<)Lf3qtj4P=4O zLuuU2jaDe4;$3^b$T_Z+`R7XcmDC+g?6)2G|t-FbvjGp$SJcEW$oSG zu#^cSCrt*Hdh(=^<0nKjpkqi(oi;LQ@{}o4CMTH^5=>MOda1UQS@dAM6NN_QI*q%z z0r51NF8+MiKx6=d`(D~T=mO3jWzFMb;$uyL`iZE!JQ5*8d`W~5V^XHgm}v}8NE#Cp zHUj+9Bf_Pe1eH=alLyrvT3g!&pL&wiz8#sIX(B7>Gm~GvAD0|C}9XqyUA3A*&8{gSn zY8@PVIXM_kyPb;|PErtuSjbT5BpC`MN4LRg0Y}l6EhkQ#JXzVrk{YdDm8W)W*|KG4 zZe^`z(xgdhdu7pPj^lnTMEuag%*f51!9^e$L9n}BBo_fW;mAZ7OEMAeg3Z10ZHwTa zL8Vdcs#Q*BW*kYll*eVR8V=g2UR{+bKMG!?qw>txGEwQWMmUa3UZd`Wm3C<1!b5^_ zjZ|H!IFtefG>g=Oj?L*}>H$j<5AH(Zfn}&yV6-^_R_W|=GFo_SLV`3*U@*3(5ChZG z1)Zt8j~e7GBZ(#bo1M)Ii3dX30le2j)`8aGZy7D1n{_wdm@*{^DrC}>l(AEh?mBgB z%Jfw7n4Us1#pB`Bn71R-q(*reAT3mo2E)-4FTg1A-(RRBf@Dr2i z;$`^EE?;&yDuPM8q~a6!bJ&nzGij$q%1~+~4;ewQc5I}MY@0;p~sCIvrk+q z6#!IqjX<7&^Aq-k#pr4(DK3ZKuN)zm^ZEFtv;euyoCK>RaY~MyIa3lm=l0ugpB*e| z`*q8fAAUG)vm@vRX0bukpCax_)U6qzggfcy;zm9ZgzrhxuC8`Fypa`kja`&dNxksG z8rAaUNhS~Gu`glHy#(z~NG6_qashyJA7Fvv@XkizurN0yEm$D9E*Wf2FLRnR$ZEo} zRJiT4&pz8x!>Rp^a1LpF?e@GgXDGqDzh>moqc-3l0S&8!+s$S}p=7$VjuhmqEG+?K z2ChteS1ZFRlu}ggHAF^6>&=W(qhKw-s;n6q9-d+%RbV|*T>#2Mu2?ZWEGnE7NLGzW z1)T$w#PvZyFZkiApjMg@w4mUpRxK>EyoV)>^212!~ZTnzP^A zm~upW5?+ht>`JnH+Y{5 z9237_rpo1pvrVb=lSwt1kF1(yCVd>y{nR~^#wSm@`Kjg0pStVDn{K*k{se7MkX9Rt zEPvn<0)H5+Z7C@0$1(&(d7!MWB>UaB%{01Iu-D11zG7&NC%gLXWLLkEe|8Ppg-hp7 z96o&PTxog1$&;5a3%mO8;{I>k3nY;rGm)N3B!-r;dh+P`C^YNK1zWNeVWC1H4nqFlcgQX;Q6noBXo>I{rdc1 zWm{p+!M{HH(!;Yvw|#at_VeKcGqaq~F}(BkI`hy*&SrPYLYHTVTRhTaUcsJ!*F+A3oU~V`}?3X{=r2|X)T5AoVO%iP0ir( z@^V9TWa8w>lM|z(4JxIajgJct)K8c&bt?9Acvc4meufc*pTVFUY{N28>F@-N!1f*> zA8c!F?I!UBi5OS0V5Hx~NT0y`v0$WEW2EPl6(K-jE5Cg9Y)KjX=;zNBOVpiMvoD=L zec~7%ySMG#xP8~jBPWj^-M{ZhUTHqqUe2C5oqGz(>$&_g3i>rSlXVH)8^Uhh>4d7R z4Acy|N$nq(+bQ$&wBxtI0i+?~rM=tfCESEvU42fx=e34w{RL_VRAO=L173P-t!mnB zOQ2SdY&iD$T>kDMm;7A*kr5w#`pdx!r^^rQJ#w_kKc@Tm@#7~>96NjnDs8DdklN32 z0Xl=A6CfLLEZe>pHJg5};^L#1J@d>n%c5yd!KP0?gJb67uPG1iq~hY`K0vEr127Dw zGpenAcgK@Vs*dpK)1R3S=4z1=;v4uEKA|?r|8BzCLC=5o7HR|4MC-``jbR(gZGVN& z67T(YSZ6!%-Y3*rSvA?0#fqV5I=VhwIYDENfe4~&e@Oc_}0@HmGUGwko`%3k)`a^C@yn^2jNXCWA68V#4fEqocwI-I6gV zSip-}h4PYegnk--kZcA3bFP)JUgXTNa^E0m zr-tuA227Q(wizMu(NQclE{dT7A@P9}?WY_HZNlDD!g1y4>g;mVmoxC-VLx!W5DOFn zUQnfJMp@q0sIn0ZG{h&`TEtZpQcmq0|ap*m46Ze ztuC-vkZXd+muEG2y=sJRc ze-QI?ynv8&54uZjozNeh?e+n8D|Wl`a;Rsv3VTyKNh-A$m((<%vUyE)DRqF8x3*Td zww5(Ea5CLg5s7)? zhKb3MYSuE|4Wbjb+vk@15pG4l%$9tFuET5VIwt`gI;qBe+z9?ni;q&;;i%zQq@wLk#RP+QA0ojZ_sHkqyb5J zij)E{3xN`PUn%xqu=DayQ$JXBrNwoXHP!aUmWGC2FvkP6VMgqu%V`G7uCvFglPUb= zfR$_g+uDo@Mh{r7nUPBSeP#w-ZySnVJ%exbJiZZOVt5+g=xKbTX%{Yl>aMQva@oaG zhc9*v3;>Gi=iftJ0y6{r;3egN_&aJZT{;K16Q{b$SPnsX#i0B;giqfNBP+=Z-c&%V7i*yeWtxR2cgFeN8sO@5@oYRNhHn& z48cbDl)gGu)1(+X^Sab&aYh-Y7K{BP`IT2*d0?6;Qd)gJXV->rkJU8~N-PRE8xoV$ zC5KPKtzmk7MM?s*ABniz^Dngn5uH=uHqE~OiAOhV=3_E5u)Az02mAcum8q|%VPE@) z49e_^+0+D1PHq4N0vF6Dh*z*kY#iFs)~OaoI`eW4ZT@E4>C!GU+i_~sCJ-cvH3eSN z?yZoIpEKvi%y^xDj1m)IT3_G!^Oq}II_kTelCI0A3EX$j&*zVJB6Na!1C0(WYvq-l zoxK?1$mr&xjUWGvFi2TBiiR?*$HQ{TttU2ZI@pM=mMP?VolK&Z%NdGnhSHeS)Mzww z@l0n!4^OEg0!@ZIHaglPB%=Kc`(ov$n*Ag$1jq zo<_L!OMl(*Q-!U*8OuGdr21(eZ`ZF+Ox&|4 zFpxa4$Ye2%V-Sm=$86#hn|7$xJEC5CDGI)mq%~-_{55m#mIb=44@ke=*q==vKT`R zzzzEuj6p#fkd%v0D)yS675yW3p$~{p*or>53o^bEeUOAwRjtkTnmR{yo3qPS+uv4I zXDcqPvG=JAa2%oTv)vBpMh#-#KmSbq%E1P5c6wO3)Ew4$eA}4@tezS*1LFW3yQl%| zbh$CPec&I*ZCa85RhTv@HYP~Y)l!<9lQ!4bS+nnpueN9BOGb@17<$9NUU%ZeiE@_# zw4}fY#J#t6?UwUWIpHQ{jU#8=N*sh^B)ON*?fd3E3bc?v<-v@o;TVBSUR7IL(%xE; z-x;1T=PzmS@UCNz2Z2G705oo32=J2}62@3k3P1*2Xm$uhO;uTWS!sD`>HaKQ>gA9kJ8ni_uY8oEpryFfah_}oH1h(pI8k2@;rQ&C#g!R5Y#7!z*0j#-jbC{8!$!QetU78 zH4{U-4zmFV^YG%g-{$C=ZnHwFc>A5V-g;|yjn#;{rM0#i#OaX^Q*Ezz)PtF*;ba!= zX22~glQM45II_?`dCG{uOrTDW$R-%*`~!kuAsK^%o^BO{+F8pYIhH$@vkF2@!PYhyn=qWC=HfF zJiWO$m4CvLM*Jv}-Mjfr)SD}UvHU*8Ns>x-1D&RNa)M7T4+Mx#pQ4^|MEn>v-zK#Ieo5)_`u3jeRI#NG`@@2-GkFN0)@_9!vXZhA+fT^x@v(9<)D)$JLRYQC(w7Fc=mGW(giGGY z;2+>u^09m@y<^8h{5BpO*I~jDg5MwFACdrtl*-TM)PaFe0{1j1$KC~Ssa2-*SF)H_rsTK^DjPzcf{C&}<>nifAldYjmHx1#SJgk%y;h+sK|I1-R5 z!kAUsDv@SiUIOn^NjZvoRl~Usx*ZHC;C)yi2%3WDf_cy|QM`<-Y6=-m`P{^(H0Yu& zSXU^NE%jRbtNa4`e(etE>lqbmWWAR^8d?d0KDz8>^wFcbx{0up2SKV}#Qmz%)2k0h zM;~@R`g{hABLSwz-V#W)WfS^!a=gyG`8jBZS(S$B?Ke{{i+08&b#PpOI`}qq{QPB0 zUdY6%Fd!T!j4v!%k{PF7cJs0&Y4HF##-}a0V;MD<13*s}OgS7>q%{-vw3z&VJ!>uU zjeLGCXo|(-YibSM)C)4rexFQcrnHvPWUC~TwboXP#C%61yg7}I+Pc~rc;f47YcZ2+ zYHG2VP{%odo`cZ~=pz@|H3wZhB|+jl=_=mBkoPSVV;LO~0Qjd)rw`NxB2ORMV|aLo zG0+gGhpWZ_*FJdwUZDrb@Xwu5uo*Kjx+F?S&?v(^3Ne*XIY9E^S$@pE7pW1YQkpRa?34GWWv|yraEENY?R)1b9+Da zcTQTHon1?PZDyGE(;p5IL7NqRvJQKD&9+Svjy`qB8dD2pud1e|x(fPU86>v`{}3pv zYd~USL#@543S%P$+Z<1MEXZdkd$U=Nfg+?49y3Ygj0r^Yi&l>rq(aA5?oo za5yRj2L=G$0L172JcT&N{4ojv7==)bfr52jKT^n=fHz)hT%SsDCez5?)u{e_b?RyW!jZMj*Dvl|4evJn3e zU5IYf(4XR!hp~cwSQ&qZW=i9)_Z~^n{#qysEEEN@(vXL?wyLZexulM|QhT|*{1o^Pz-7)$;oE@SO;Mn> z?fePR$ju$^y;tv$!|GMkHwrtFQYPEFl{~3$IbRZ`+5HU zCse8@ECdfCWZ?@+3Q8Dy8jn`J66iUr#UJ z@9p>Y{M&zveM|DYNX#n@Ju?bDGYU$Ip$snj;^LZ`i+QL3S&X$4fcO0zLvo<3tVAxy zK+z0uO~aM~s%`AsfJo3%X*y5y0el$!!3UTu^uhD#e6a5fACIXshGX_7C-1e=i|$CJ zT4;@iqZe0NF$Co64|N8*gOpJUpf2)mq!^~73ocWIl80`1Hl3b9FQ9LyfBmbODof{| z;O~d&N*_>xuOF`Hrl#uZu6B~pjy0^k9Udr#q&-<#pVJ9hq`kD&5Cqc7&`^K>=n-My z?83?fBP z?uV3(|MOPd_U(52_U(V(l9T(SQeSmLL$zi6pSR`)2Mq?;gMZ$llV9K0cRl~(kG$po zX4R>PRTn8d|Npk^o3KKk<(o?HUAb988E^q;o!==^++ zLD`ExZRyGFZnqs}8;CA|l zTx*m+<>N=W+k5o#_|8~=ixvyrxuWW`W_hzMnlS94^Rv)P^XHD~6 z;HNRDnNgO;&-Pug8sKddA5BhgUw3csU}IYg3aobECc9hQFozu7*0uiKu7EIw${#j^ zdeDP#fbhSC#l`vfUvcIdND75NE(b_WAhLbNN?bb*&NtGJedD+ke?OAMgAXVHgoyox)F&e!l}Q)D5Zp4fL*E zY5WaWUSE-ZhR*rnt9g7lERj&*SkAv9*>b5o1N^X4u?+qVy92{1UVQPj=Wd9INC-BM zVnfD-$Rroe_)l5-!pfEP^;+#`pLtLRvA@@C9N}s^kd>8nfKVBDEw@kww1%EXFQ=E# zH^b+*9=m7>43ri+kd7w@l3se*#{gSc4uBofn_hcOSp4vsj*O@RK!sj=<+X*-j}L%8 zb~-&rICS`rjr4tg&7ddHadZN$$x5X^z;X;bM)r>*%^e*fVP?NR1Z6ymSVdjM52^fL zcRR| z1^Ae&sSgl{)GouK01%e zf^*?bz?=kFc@|KtZ!V;tq!&UuC_*F*DOA(9(N9_y`Y!pp`5-=$55^I}D}A+C3VzoM zT}=q1u>+kbe$?S~HiEIlUeqA+Mw4F9tGxEpZQ6+F6pOOkPZN;jm3Vu*t)z_0&_l21 zd97}svmc5n3{{z44GsSO?Hz=stDy(;onj=qpg@Jk*+3$|W%l+qC!sE7&CEbMn7I<8Y_=#6 z>8PkaC#)#S4U|Q%5Bc+IS2v}RLI-kskf;b}s#4~$Bt=FR7PbvS5W_U?KHA%qclO@D zJ-9Hq_uSX0ee|zWZ2@zZFCSk}0Pd{PCaRNT$k~x|p`e^Dv%Iy!LDSN4cc%|o&C5cl z<}K->)vWxXZ%kt1&Yfc-)mA+~5K~o7QlPU*WgIzu{`@&yFS-znvsFQ+er@g zm1O_69|S0ra&3D%&>z!Glz#Y{NGFGRD0BB968P)8nQ)KXEF8~Cer4wn9}!@lRJQWv zP}r7BmW(p8)}+$XpMTD~OxWW}&!7A?=jfrs*_*fSJ8`NMu2V;SRbKw7ef#zvJb3iz z(bIX<*Ic44D$0g(qkWW$R2%g&z!IqG0eJseE!E@2_$pZhvEfJ^@F*-v2M%;~^>=~; zL(<<=*U&ZSaaWd9HFdRnlt310RkXLQs;W&Wy~Il>hGUMVrXGbeazLWfm`zBJhqJA} zM>x5s-9=7LdHecU);Z`I+E-Q%&DUoj4J#oHBzBaHFC#oWZ7@4+HEkY>g_{?J%vG$% zL1>~&P;kUgrO`q37#^G1+Bj5+Qx8dltFNbLfL1^n+&z>=25A`Z$y6#O!+R`==gzr2 zNxf;^}OfH!V0x^&OIcP$L-sK|yqY%lK!TX^Ta_gpG$Gea0w6RHthof?Ee+gNCW zyKM}XRMCTS|7fbK%e^(5zOVpSUE0p>XCi0XHRzVtSJkrRtCChJ4Lz%nRq~GOJ z`U!yM3c?_LZM?tl(znETdro%i-H$&w6*ll2>_8u-R+*&(^{035{&X%lL{x>gTK$fE}V ztZwV*uvM28S2gk)$bpJ#ww0AvR<=3vato+de1m?RSZNM(qiB=cGbjoG<&@w|sADgc z+KZdSDEtbH{wk~m&tmjfVDtq{UQ0`0;GZ7((Iia$CkH=4p*VW<&kp?1D)9ekP@K_yM3h)D-Hv)4eS<^_4l>va=^l$j<&@ z=h4fRMW^%b!cq|0RY{hD?8>gNMR%{dJFl!qChZy&7L36zsjR0AMT|mgR^ADPZq=Qc zUww7)Vp&-gNTkk{QVgANWqG)76jgX-dDv6};_ukxF!Ru2B5BO8v`|LXg}h@YyT&Y7 zv}p6@MT_RmOV%?IO>8<+&hFx$XTL3I341!7+DZ=g>9Cgke-WtoGJbhrl-}Fj)>20< zT3FlC-iK_A4iB^gZS=LhMi-k8=bjE%| zandDI`+EmG!wy;a_$8K@S|ID{tLp3Fh6Mtvy0)dIwgLsO5t0);wKewI!$!vI;SoiX zu@VYu`rx2Xg38a}7Ke6-oDDO&Iz}pyU;=@dR4OC-JfVPrM~DRKa1~q$QLjI78c|-f zke39=%V@|;aFm4762BkC;t~>x%x1gPSX{Hu%;0KB%LUh(@E9>-)27cp8$B9fV1;eo zJX=|6YS~MuRrnG|y<`DGZpib66O0>|GA^YEDKQ_?hnGr`pKSBx@URSWGMz4}S?BUIGgT;gD)?+J;vQWTONV1Uy9k*+i`{IF(}5MazOM8l zh+A`yodQrBd-bIg$9_G1_T0JL6DN+JI9~(}yej|KL#NK>{(3sU4E}Cg)foUr;9^Dj zXa-}t?fVU1ehhN_PyY4w@iW`j|M0`NUwj62^OH|DY(h|d{kNNNw@-0gcps>p0PU5so0Ieg&251^^rcA^k4%nUfs$nlcwgF{Gn`2MY%;JUk?p9kxX9GU#> zpe1|~L8M9iXhey|^DoQReGl~Ocb55(ZsNGGnqzyuK;ZKq?|+Kk z*zcX#7PjO`=;u%W{RJ5phD}?glXg#x3jxi6R;W&%cYG@Xl?OE(Q+o7-9XaTKTzfHS z4hWKpT7su9y7#XSEt@x50;p7bE1dx>g8Y%ly2|r`D_&ZFIP2qh?w~4$j?Ma~9=`LrKwLqCpF28~Rak45R;Ctf2AmpJ_HNse=r9{39N zOF(1vBLAGEsShRjyaVlxae9ea!z#5P;2V)J7KsTH7juLG@E!V&k=*~oa*=aRfjZ4r zR?*M}o=cP&X(uw?(COjb1AXv0fH>OI(+tmmy^~h*fH@4b*CXgkeKiu~H_c>>)kd0%{KXqg`>ci|h2!0kVeSGr%{TUhQW4bTy+rNK*YU=*|yY}w;;@Orth{qO!EKtjjP73D)?7+CZN;u|%l%^daEsTky`;c>PK!?6Mt`jJ)$bG-iR; z2u(}b36t+nrM}Ig0&#Vah8BUf5(HnM_}U?#U}5gQ`_?!!J9gHr>mtk&*+3B|x$wj4 zp-)h`mhh&AItTnGHFb^6w&s?WCX`!h#(@xJ(^)XpP(GK-D?xn`AW<2KS?a?ZJ}Nvk z*kFVsL~jTQ(}jhHhlYlShv7gNGBokOwi5P~85p~z(2?)Oo-&*b6k)rB-Qj#uQ6ZR| zi*4mt%r9JmOCuNT;Ag=x#33n@#wHBn0GSymFU$?_ALE_XRD34FRZ+Z>91AS+h2so;hCWSa({EtWdWQoW zRF%VMbZi^yVza>1E6|Nf7e#nH5hGVe*gCOJAZH5Yz?zzD4n$YFJK?$j58GfLl8-qh z`L3vSjjw42_b$FP=%^vwt0Qz#Bk@2wP(%c>gpdn5A|?vJd;kMR#ZlA#M@w-(H=*yR zVBXBfyfI-vH&L`!gBb($RG21E3N#4)R+kqOPVu5*+ny{Xh&VAn@DbWfg|7=V7-`$Z z{a+xOYcLoo+r_<~u3NWuEg&FYbDY9|%6$NcKQPUoBNRgTN|au|7ICm_SyOY1WX#;# zNVNWI#8|$OAzjXuICps_9KXc+14v6!UyqMkahj&X?`36Wy??ZcQ`FYMGuY8wSG!h& zXl>2^kGl7OkE%@Dho5uiOwD9UGMV&b5>g?A&;b$|4q6-Ceuxs;|1NJ0}ys z!e3X#)wLqhMVf`)0wDwl2_d~sdheOZB$@KRo--LB%Bt+X-}n2znanwpGv_?L-uHE1 zcYQNul5c4STNV694nkcHi4AZtP{V5dU^e9w5EQ5xJ>oZa&c(>NhjmSioCBkTP45TL zW3svAO`Mp;h&+p54Glg$c=%M3@Z94lu~$%HNq8=aF#dY?G7BXFAuq-kVWdIP=_@J# z)+q*7$6QrXTwPUGf>Ecg{(v5R2FoY_z2OK4l3@`eh=BV4~;7EO=m* zU>_~6s1!|FaOXUdhG~8;K5ImGFL?ibs%tc%OxEyBR22QB3gAVf|AYw!Ijc{Eap>eR zQBi6$2EgX9(bN9mrkxh1Y4V0iUt3$>U~U4y$6VdmR8ZjE*2WoPvmS_znGSjbmU zc20*&kgpOwP_cSV0H8e@t$%=8>*tRlM(Gvz@9r1I5(R39@}4O$mJIWr5z*)Xh}4XP zGl}ZQQB!`BY!XeDf#AqUHkd?(C!kw2Lai@4U?yXQZ|)XC_wE$+`xk^oB{x)#Co3so z7-;h9x-idrv#eH)sn=3hUD!~KFQm7juy9DGfXJ@XQV1#}QF&BUxyf6hbSdOcD{C9_ z@{>4uIpk8^N*x|&u~HeZQ6P+ItP)84Nt5~tj)2xB6E3(fX5h>5dcRFUnmKdkj1Sao z+LW~5w&dhwg>4h5;n#X=0=0o07-Kr?YP&nEyziPdYYujLB}|_Vqw2Hua=*J@d+jxo zKXpyDb7y4I9gjZx=|JU3o{&o;`6HQ0KO$s+Q70d@0T@ZE49kaIp=>E$3UH+z~~Umq(ert$mEu#>rWU z9FDi7JS~(!)`|Y%OqGbFG75$PI6{5(M2)3o7agNPha2>Yz9szI1wlNyNw5 ziJ(D)0J0SUXm0ZE>0)}ihD2hu%+fjt2MY*OT3=9rEeT|38l9FJsk-%GD^TZuL7jVe zv8n!4S6pnfnawOrdEMvVUjHBbrmCNol+@6`afc3h&Nt8u$RwT;wTdPYFb{)$IPJGJ zi%|&)qenwgq4J#n%O>){jWv;JO-*Odn$5?KdCoV`Tt4_sEk#sUr`Pl1#6;mdCNc2_ zTFnQ)t--iQiFs%-^Uz|JU_MxYQDPoiOvJFHAEPRq2HN}DI(lK_EhoJl&E;T9C~qd^ zJY02(Wn|ESvBEJ(z?g5f4gq6`+r&U%T1^qfT~wg&)meOUBlehI9WQR7?91|&;xn6J zTel^h#3h+GN)w+#9(`uOMTM zAON{g+|<#>VFMwyc60-)A{y%MXsyP4Q{9S;g+m&`kpV0Et95{gr7%#?DoJlA7C0yd zrB-E%=?P{~of zoV&OBqU-}v_JJ6ohphsMBqJj)uPis0C!1kJWVL$r13vRt*I%WuHk>daN+3mk9b%AA zi8O5vX1Bdk=yk#ONFL&0=yb2^UdE(OgFRtKM{8Ht36R94iU2H)pqF}jxkDjlMd zAI}uep}?yQo`7nJ{6a&66zCHmTjRX?D`E1J7Lk~!w)RuZTwvVfRMKnEtY zP8&z{0iCtE7m7-2;T+Xm2@MO=k0}SRx&do1Dd8vC?S6BXFQ4v3(<<^-N>Lt|VTPP`^ z+9d8bP_1<;TvGU`u+Vb!cC=d@Y1~+~`CJaAH2Bj0^*bl2@<4u;=^O)Y4NW8VSq<88 zDX>lXkbEpTpIIy(Gyk=@$_ce>WgCJm)uU@!}^bf7_SBdyVS; zsk+MJ$B#oi8{BbmPa1HD!uxOB7Y7e!x0}3rD$Sj+b@SHwt3+v2is6;#RCb=ZzNEYw zmha6q*pU|&LE{3hiiWPb-0U-1<*m(q-T1AtprD5CmfFq0(@f&H*5jKto#}(ArOeUW zHvnlLMi#L`#SLIQk;KfH5wApRvpH4F0DO6ne%PwPm64^mStfFbq>ipO3Iph~!-qn@ zr41t0wgHiUuv#gSibWDxKh_j5OBig&xvdvu{d|OEpt7>Qo7Qw!Q#%zdB05&8lA(Qw z)sf@Ih00RBSf3bgi9+V(Y;U#z9!Xg&N1=UDcK0N-uTf}U5e9~6j~oG<4UB3s&}j7c z3y3;q+5}z}6%{vO!Zb2<(i*A3Fsr#)_t8fJ@=xlGPO)|^`G{x6{RmMOq-v5qKmIt5 zsPor|%geVdSz=ESiXZSacp0?Y1+=4){Do%@E(Ndx2ssIS933RB32U@%ZBCs|(bk5} z2h_a3KMCR)wVu)<1?%-{qSdW|{WL(Em^g5hCk?g)z<#cii-fRP32+3%xow>(BK&UT zjINR?BAjZt;vC%-mvTV@)$ZVA=-3)Rz4=(?g)Kcj+YjtJ-!4~BLnQ!VNF`k0YT|FY zDTZSETrxF;2SGu#TmHd&OQl6c4r)!V)2gIQTHM*6A{eOJ2arf8%#GLrvR|ml%i{%|^ykrx4!Y`sM@xk zo_=(In|(`;o|pssg>}jom)vaV0z{%O?v_Q*!IFW=**k|0hoXmGeDR4}up#{xCX!o# z`NKXH?|0Z0AS(x1?c~LaA9{7znX2sRn}Qu@Hf`F3ebVcgo99qVA+L)U+aS;K4~>lS zm!`$#UoI*uH&?=Scu6xrOYM~xDvzEhYLAF$Y46CoP+ZpwcV^Cxa$o{^->%}bXG{B~ zQYmBWZlH94-JFW|9s;7Ng2KleTYCmvX>qOnKH&krTB)t0p&HBC;`{hXaF=%hugSX(Yp!jpmtwfjQ9K8x<*ZO786hse|1; zyVCs+G=(Oom zCqODWVFLEeMp$j6{+35loFLEn?nk;`O;ta+aDu)8+!rljv*tejKN(x+ zKm@^a_dNOJBY&sJ&J7Uo{0r7y^qs~&Kz`2~g}O|=;rdSa{`gUx`Ja3!GUUG z?Epb!18`{4_;}rDr*q+)ITPFW?LA$IHil89k2eNj0>0t;e-`z>3iZDp_5bYfoH)7k z@DEuKeHWa+SOx`oA%Ij3MVE_xGXgmW0`0=HpcTy)~xy9+Y={FoW4{63Wc?6zs#(#8K6{*mYTD^Oj~R6S`g7q z*SZx0VdH-{7Yl<;@O6H!&@q1T9k2|eBp_R`1o|A(*YC(-$Veba!TSxbhv!E3fSIAw zF!R2@&%%Vq(IT zLlQsetNf()p4!r)(#qOSsB$ODWF4jT3SSK+aAJJJ!zI{06KhUR75EN-BawqhT&-3q z3u^XA#;zH2kU~7mEL*#J&m7ANDbq07+&>aJ4j)l8?)E#$(g&jV;4y!FA`}bF0+lO~TCGp4O=#*9P~izj*ktS19$@^C*t=sjXb zlZChlk`;PUn6K9&C99E=uaJ_pNXcrXWOi94g$_1b!AFL(xzgRfPaHUK@*>(f+`9`# zc~s1Yg_{@i>*mr~QeuI4wlxDnA4D6E=22hqB+mJJLEC>y|EmR3F0YMpg;e|(LMzVQO ztzH&I&V2NRq@>{9!b9tgM&tTJg}ot3rrCvgNY{m&{KCScP$XQ;D-<}x+v$LWN~wU$ z30g_{mr*fzUB;Qd;2Sm{x}c&$l+ri+Y&36Zf*^%*aVp}XhH5b9^ybiVS!^Z5GORi= zTtVy%J^_Z2fpwU`acn=v-F~Ob;S!r>yR0^J5WC3F&xX4!R+pCoD@A!r%MkU$#Yx?! zM6gwdqF)Smw7>-mHly%zj**ga!o&z=F<>KN#?H84=nahESZV|*b-@FN1gI?nwnuD@ z1@|#%EFxeK1tm2B|;+m#L z(9TdjXLVJvjkKdU;5rJPbE)IpG8khNVO%R39?gfKi|hjOj0I;lynP zRh$YcXt9_@33&r@ji12mBQ}L(SGvODK6z&^bfBn5wQ`_)NR5^(u1e3?{mxwXAny0! zvBIJz&ez*fmz|OE{U>0R`5L_8JU^a+g=;2coJZnbd+nLKArhTA9yCb~!gSYlsb(&S zCRtgfHpAqVt6&MV;^t^Yb(V>n8Bm*@M}^#<>i#klTiVlS^Dm_z{{9$RMuR5i4zNXf z{84@2{qmBDA>FxF`a66!i8-T3EB^y6JLIl-EdwW+?CpOdS zs32=wr(I^T4A_VIyE;J~)z#5$v06-%z12SO;wo3gg@9H$%sX`U?a85Ng)FBaf;&B_ zFk;iOUaF8vydVbjl3?JT$Z^nJ4>_?7I)}B&8H%uMACe5%T=pSWApir`(Vz5a5B~;gNzk%4{9Peo(0MYHdE{8z+dN{PhDVNm!tBC_Zzo1^|Wh{;B=RwrcKzalD& zwkU_ne}lM8WVgZT%5RaGMWCi4P*VvQ2O>~Yqfk?t>gwj4GWdN`1}WRB^7FweWK_Is z+EOd0^S{lq2F9k6o~jO|QU+swS6UkE|BQ;KUtG52cfZ5_qN;w45>n0c2hRXL1nyF7 zD9}rcWGQc)4-a`ayT-T@T+>|BIOq!MtZOt?RYl$P@WlN6mhbbc+uA@pXH>lKw`HOI z)RUpiYmLTcYqNC1tDD}@-qylkrwp2+z`)V)C`{KFzz`41dpxb~apYwY@^TyU64h04 zxwN(*`)omTH*m7OVC~tlqpogfC_n$$u>!1<8=Bi;x~8|=LvCBXJXwod#KGa?C&tCa zjnZOuA#aTzH##xFpyTYOsG1g0(5QFU{wuwTjfjtrx1Gt5O8@vrfB#*(-hA_|4`9vx z9W5(fE0x*pHQ!>#`9s@4)a`H#(E`0Cb|}2;aS)n0*+C9wauZ12Sx8*ICZB6o-9Ap0 z3yS$;?ClKmQFH-D7Y7)DP@G$>Q-R|V!8?Unx>rCw6yXtF;3o)T*S`m~?ntS@h$)aA?gVCV2p_Gv- zez@gDptjUUj!c?%{J2a8*>tJ-494*@(JY#OEDap}%A9%`<1t zoHJ`ms06zeumCAvTo5NM#Tu_f95oMtziU$DUAl<4+AQ0@`9IjJg}k{Z`+PwO)>ip> zm*Iu`(xv=@%egr?XJ3RlFU0dA=RoK!5Az|LHy@FUm&L6OYMi?Q_dG+_nO+-L1) zy-aa^ja?X&TB_@PCfv3#(NReGBg(4VTk8w4r!TB;?S%hfsl5~Bf>npF?~t|D%!hP# zwpAdi!U}Vr2s#!Q_QkbOSk!g(^tt52yAN8k)N9cnQM31YYIcBC(mvAF*Y5-BKkwc? z*l?QbItTj%7gc?OF3@!AmDJx7Vq=CZUGCUADWI^Tt;5QI&CrS1fHH;enVvqU)D+iQ zo`tGxo}B9MumIIB^$$Zu`;yMGJ-`p{DeDx`^?Cw}9PlDW89bhHtPSxYmoGQM$)H&4 zuf*K*(o6S8E3IcXZ{D0~)5PBYl8Kpm+XCS7+$-?iAm=!%kzcxX;W)O|4F9qh8UtqB z3mLA!*W~ruy)z6pKre0KLai!g?Io3gyz;y6j-5urj;Eii8H8~xI6{=`4j0>EAWx1R zEI+yqG)Ja5(8i$-_wO3C>7#>s@{4oM(FT>5dp;X@%be`o%lSCNy(p>_Ja-~#-GPmK z$b%0qoB)Y-xJD&|cUy}~2_o%?hzNhBLhiDd;+ie(D4t%s?ff?%e6-7q2T{ZJt{%{v z`+)tlr=uEc(Q2Ve?e_LIvBKSb{6?YsjEOXO(_Iq-pXZ_ANDtA#YNOx1Dp`OUrMkJL zs8On$OF>_ausf^})?=EobJ)U)2JMUrhFdDe-cPHxr60gos+*IJ)Xmue@#p~KbdH9z@CT4t=TIl6q@*OO9j)hn_~D0htq29n5XlJb+_p**NwsrJBT419 zH%vbE%ex^j{5H=XL#K?}qU|MEHwwCU?$Z*x;i0)yBM)~|4;g4^bob{1_W(q%EczU9 zVcata2gK zC7nh|`lynwvyUh>DpLRu!PtRt6w2&A%OD#DvYzAV^;86c^#%-AuF=scHKeNt8=;;q zqEQa(==@O!VWcAg$fVCHa7;|W-uCBWqw7TKQ+Zwl?&O0b*9~l25Bcm2AnuW_o z=ACy;upx9S>%6yZTd?587hx}U^k^piRVV|~6`dXYP}2Sm*q%&QjMS}h>+QUwqb(L6 z9~g0Ydpm^7S9N#S(H9XoX|eHXY>#lP7LIXvERC(C$A7D5BCJ}tH&i&D7mo45bF{dB z>A4``-tofmsBm-%&kg>{b9&+4(ZVrHI0gvMNq*(I2;ttz!tu0l^b($LegEwBDAe&c~__GH}rAO zuH%>cdGvArDdykM*FF1=U+nODYxAJ`hB`fvc24fM_xxy!$`@O-U+w*#y~i()03qTK zFSt1WwNb#c_4vi1z};`6QD5<>FUqqQjrxKjmQatg)W>dhJ7`nF62hF_P*u5D);

Bd zVhl(~kj})&kdO#H{;wJiLwuc_Cle#GN(*g2J}2-wYjR7UX*to-;gItyzwrKO=v z)5tV@TJaH5w;cB_$6de2z02_wMJZybCA{LIvB;tu*ZA0&xQK}8IM4N%Sb8x6GVz!g z)0k3hL+YNa@?$V3*-gTFuoeH}PtMcx;YuYr^n9gIzzB{;NdN6d!Pd>5Y-oE;(hEA8u z){wdT);s6T^Ysml3RCUe@bSm<0h%|B`TX+_VV3spu>trJj|QG}T9P&|By!*wy$HBN zo;HbIj1KwybNCvUwPV$EYi-cPFeqF90>bNe_a#jX6Sec|+KY{$2fy99)7RHomz%fv z&%zEx^zA+Od~1R+q3|lEK1Zvtk}WDJEvDj4&-GHeMJb}LiSzPIGJgyUA_(9aUItca z&;`r2{=6TygkXHK+nbv^A+q40&Z0(|rZLzzp(xw2S+Lo#VFcu(zuVT|*F`Vlx9)xl zG<0&djt;Td1kulxu={P$*TC(t^lI49hhxXffwxfz``_1fL9si@R7wjM&-4W=hRWfr z!Lor~0aHamSy=(3 zu9RNN?HIdq9R3t?<&bbnr)mse2AN5INi-V4*^<#70Go89R22N$&4Y z)m?T-K>2XgxQi}(iAV%rO3wby=4Nad96+Brp|RvR(-@sbfqEB-9M}{<-inv6PA;d~ zbrHzGb@0Q5m)cvdv)gqhK$Mt)o*ugd+)-D zr|~(4&%eLh3%`0klkwf+xm)^gMkAs&U3Wa9v)RwaZK(;jr%}SbpN&bL@e7DBVi`tNt6srpCw~WEPa~Pm{|Hes0ZEozi!L{LTv8%&j{ZQLd>?SF<W8JYz|F7q6 zy#D?l%OCYuaP8WV71|3gRKWW`tp;HPqpjN0pN6rUWVl@ly^1lhv_Ft06T+ga=AZP4 zpFMlEN5IaIrG4V+vp?w-KYR9S>xRM|JAXXe=!y3yJ>$Q5mad@bs`5&H-SJ*+<)r!F z#QMMfTA$%-bFjwhIaHO=F&BoYiC#1QGG;adQF$38_Pn< z)Qa_O#_5tGbM^64u(SgxrLYj{xa!){(sC>nYuek}8o_c}RMaz2R#nfoP*}0v?v!>_ zwu;n&1|36L!hvq^GK8?agdHrRo2ydj{;`1vmpHoEC5nq!uGoBE!W@Tf-^4l039IdDn0(yKmYm9FF#pZv-pjDU?y08ant^jzYp|88LzOy{Hp(2AlMrwJ8Z^bT4(8SQ8mh<~E zJG-#3hXb+3(-#N%=)ogf3+*<#=R{pz=|A z0eBFf2;L+YlpvJGmRfx$_y=m#L!~UlfDnt=H?oaHbMLxdJs-V4$<#&qoP( z3dp$i96O+i^mBAKn%i8|3&0Q&S&<|L8hS1K2x-1gO zrDJBNYjAjdt3@lPoVYr)@?lO~B0Zaxn|n5kd<@F=tgQ5Om~*^MJ`%%*+#gm^6d<}r zbP=v}0S#lHB@a*-C#dDtNc(!*+AMvf8n+A#tdYjW7z}Z-X);dl+jr>L>C>l=9ooNl@8133qj-rYdwJzvSTpo?p&q(=t#*?fVhW0w#!EI~ z)`o92$rnDa0OE?h%)OWFTEXN4Io&gdvd&8$nS$b-0^rn}!$2t*3|<32T1IWP6iH%DDX-S2m&Kh>(w%%y>zZTKOaE3+_L=h=+EcLR-W9) zEANxb!-4|<#|;P$^XR#RnHIUDBMoKwRTvO5!_INN1S4o-#Bh9wUpACoVxO}D}1S-diM)_z@oj!c@#7UIT$rHzbqB%x*UY*HtnORwxr%$D) zr=L2VnKhzxW+r{}r6xK1^9qqYKHd%)iYV6h6yQAU8~`e_C65ZF^XNR7xeC5)$Xi0` zh%78?5!is)PmkB8vbD!QrJ@@xEHmKi865>apP@^(!ri-!3l8S``v<{`FM@4wze#&O z@BF2U#VDoXi>IM2JWW33WnM>*dNnrMEM2LhE{mBg+&qnD-ptz2!Tf#twabb5yChieG(^6S_qPa zaie^?ODk$Snwy4vbYZw285|G{!)-$pwxm&pQ0R?Ap`sp}Gbw1OcS!3G(m}l1vyUIo zZpXe9?CE;hP@hc|l{2FCsj#;VRBC5IN)kC}KJeBYu!+1Lrjpwl%~?O}-o5+4#?LoE z=Ts*F9fqVX9s0&}(0BU|+^ec?>I)3hk9`0xo)-GTrq!CNmg+*M-!~&EX3D)Fq09g7 zy}4kg#9Q>L6KY1Wp#(N9ke%nxi z@MTJNNgkX4mD_{|sbcvX;k_Dlx}R5QD`+kSw)eyl=;Dr?I1PmL zX|kOkTk=(|eW>o(WB_0v=q70qLXE91` z$ECYzYwLiu-EeE8Vf?JUA`GFm9=+OH_Y19cySue^jBKq>APs55t@RPwS^@8Ct8cgr zgimX~Y;^L?QxnEdFvui!T(^ON8W|j$t~e%m`po^_C%RXi%t5 zX)W&b^6EIZ<*m2g+H$VLOK45z@^(MWfV~Z6hc|8Axqshx8D&K^fa$d6r{`b-X>Lc+ zwl`DimpMNkZl%O2p{z@{a6Nr?NY+l7QR9_?to`Z0wz}E*BhdqJrRp(`8E4 zN%}6slW$9BcUy68aYa*YeRES|U#c!Y{frsW_O+s|xAxhA6tvUEnxzlYa9nh3ke?UE z7Ar{f#A>v4zd*Sd^xAfHNLGJ;O?@Nu`Hl58{lij=C<6hTo!e3_(ZG@@0|Q5jlnG0i zMHp7m(E-j>OHXTSPYn;yAY3tbTJ2;a5X^8*55k$7V%fSQ?;6*rWCJaA7pb{>N&3Ys z^jgJ~1BV*m*8L_~!)dgP(?A2M173OQ&iK*OCWMS${N$5QCVTS?MkbLmI1&czyyVHJ zAOF)U0j~=V8pW?;klOc;xvod)Tl9~8bdbU#Meprw!+MIDbk}1P|FDl75D!{a)9-%f zHnN$V6W*ER2-ro7!RdjwLZ2HoedS!Nbmp#{2mSkY;hlIBawErK>WO?>|>16#Or z9w0YDWUgnpf2OBnunJOp_x1Sr#7>y8C@E>%wj_%sXxh@h{q1i{rv+I|8nr~q04mRj zQBuNN4U1ArUQB&Cwe|M4Rj-jTGD;jP8!l7NjS7iG4kA*ZiIhMj$^C+2QE8Z?gz$qx}tqp z!JhyxyAo~!E%lZA(Wxc>{P5F{-e`g@4%{>1RJ%Q4@$+-Z2Kp8~zc|5eBDW6%YImSo z($P1~!uvRRn|uDD@hVvgIfMEE|Ag|{dxFs~2e`&2jHW5*$z7ON)-Vr)25K{XOJ9F@ z7N*Qu=%1*i-0y+;UnSn2UgaDOk53+C`3IsWX3YvT1$Fl+RUI8A*{8qH&0V@Q*UPIR zbDPOz+LqbiWm0r@!X(>4S6J1&%w@y6uFK{kXvh%64}eWpqDW6axO3~LpKjfG&|Utc zG4@jLVTl+!JH+4r(lnel{1{geXfn^C7+ zx2>fc5SJ9Jv^L=LDaSm$9vGcn_k%W#xqlpX9WRl$c}^584whoaA?3O7X=A3{VPx8U z-4>KSh{GRo_#uv;`uh-XJ~AASq_0DWDcSW3Q*|{q$>j4we4_hq2jv5+8y|I7Ft$z~i zl5EM=5^6X%4x295OQ~EN+Xi}bDJTqdk-Ee?7+;Xf3ZoOvoiDQC)y(rw-86fQl z()OSE;)`!K;UN!Y} ztwIZ}wyvhRxt{s}q^}xyG{TGe2|)oC@HeJC9Sav;^yTA+HD4@MT!#fhlHlj#zO42M z45Jrg;awyy4n#fwf&SFfDk!_ll~!>sJBQ*_FIu}r``oz; z^vcCc`R8(T&k3#KMl`5nHy6l4v8@aD8#T&)elPrmZTo8Ts8R3|93CDjE7-hwBfYfu zynXZ0qnm|RaU(iZpcj-Y6jgwlUMepssS15!K7|De?@eU8yriU@{#2z{u|QbEZ1()h zJ`q}lXBoL1N1;9ZNBY&V*4}P-T)>I~fXdDuY=>aN+15rEv3)(=y;iHh>(SHM1}+dQ z+QW@$SjUD1>(p3wD5Y4$`3FIO7#bR;(+QqZ)Vg5MPtz+w{<<)Z3qyPO4|J?YFiIT9 zC{c{|a2TV+5sVVEYpwQ9tQWz_ZR@ZHV5_dPc8UvYwYuOStrCV!0&Y}`Wu-S7CTu5z z#*Q5uBZxsZWag+6W71rJ|$p9lqp3zyANqhEdX)zPxxdeGCfs)4Sq4G6gn4mKAXe3^@Ap`}`4;A31a z->86rnzCk?vUQj2T=UM69>f+k^X|LhZ`Cnm1+W0cb9fFIz5kpfkrZvi7X8$ov?Hpy z%a<>o6<~L=4M)LV`sJaj`LS}>`|lsBYix>n{PD-1V4zx65nPO<%kK zK5Vimu^!%M$h-O{UijT(e}Db;RZDJ}6OWZ%NMiE52OoL#(G<8Kr0;k9pLy_}2OfCf zzWbK{Vfll?TulNJ>Wk<`#;9d z2DHAYp|ejr5d;bM-WE`C_)rNlNl*_|)M_?&%3voN8zY5@wKC$-M<1Qp^L<6rMaUiw zU+UuYH!TUowfpXQw6^s8sb$ON`!*f<4Avoss+$LrmYHVv6=vk3N#$k0a<{hxa)}y= zW*}@3`{L78McF{G*B9j!Rh>JQo{rzlJ+>;KunU@+OD^XX!J49|IJj}B$7*RT&Ocv# zuCf4&E4aHpdlACy^aEhoo9*MnS#2^k=;1AvZb!n(KiwXN-ClJ$M6D2}vYb{S0w*5K zypSUm@E-Q0r>Dv6xCEP1(25cbHkS%+z)2K<$%++$qk~i7*gh~eL~fcLr5u18K#+3D z#eQ5R_VUHuy~X0rLkIRBGuM_EV0bat6<&gUZdOiCPDS3u6Og!^$gQgGWzb5oOb7-D zI#Ac$+SVh>%mqR4*{pLHvM*svnQ;^=_1O{$84_s>K`aWnrrH0lWm6d_D!%*b;K4Gu z?f_e0fDHR15eRsD8vC%b)!hB}DVAmcR4n}2xg)1ObnQXByTp^dO~&JNRLFGkuE6Q~upkQ11WR=l-+U zZu}`K^YQ3eujC9fl#sEL$PS(8k*NZD80*Q|fBqCL52~&7$U}JyXJi27V1SI%gxHSp z#EO46@NnVCqjrg>4m>tz5qLTRbr3QAC8NkOe1z9fyvAu6eN`SPX%!9WQj>^2$p3R}QxY^sn*=+K#{AT?U5sl-83ThR@hX z%%3-J-uzn@En0%nbjhM;Z@c^DyKj5;<>Zi< zTVg_zZz1sAG8{uvQW(5Om?2F!Ll+;G)T!1&l!b#y zrhhf3q51V^sbeJMo|XYU44(=QQUMswVamT&{Px=zJy-Kj7$q5T?g4DWRR_@KEXCt z6ZTL@K07;;u+aly?0bQPt*$!3!W0l>mFI<`$hEPDQwWQJiNzk5 z)pfxU0?=ndKK`2&ut@#SuxTFn+VC7f^=PpMw;qk6*d#E_!MMhpFfzcGAU7i6%|x$E zh5_BmvM;D)=ZoR*peJF!h+a9zwbZ$X$0IyrNM-_tQyzklXCUO8(CUU+dEucL{-^MQ z)(HpYi4*A<8`6(M({|iw^n#}X_@xrD#APSmN(@P~MM6k{7m1=#u5gu5dh}PtC9M~I zlbm32Wum_n1anMzH2&kpx8?W|l{YH}0SMy2n1=Hm;Hh8gdSLi78?KgSw`>hx%8P6_yoZ`T?Zi*lL86O4OaJR$aQZYE@_LIY{2m z)eZ^5b9Ts`>_dkZEI_J@TZvy>0!_Dxkmu%*2GYR1^pbG)es1|K$;rvLEPqL*dWohR zFj-Kv!s8K_oUf@jr>{mir7HY_{DLSL)=v{DT)0|ODx{n0plRQ6*OZvn z2~y5N*Gg*&2RPdPXY-!U)fE<^5o{v_$c~pxoCxCw%P3}1gYu&yiUl%q4n+V_&>WC-lepnX zNgwD72yhcE!}|>ylj>(N?fH1)H8F{GhP3aliH45oL_rx@)1csFXf$w3cTF_sOGHv4B^*o&VlFv=t z+BKhlhD43xfleWpP2#*fNbPpwLK@80mO)!q39^ zf_V^O6oT;^VT7S(u1SXy^`b(Fd6>aj#RY_MGon}Q!8wQ&B8&o|!1WH0-wMEzV9&!?Nix{#NVth@BUX$N z=wN6s5$-TN+6AovE=duF5@B#BE*8_$d7ft$FJ6t{m@-AO>si_=F$AxM*%_S`tG;Krr&TM?Z>1 zlDV-+#3-~703YVK5-8U(4J|Ir}XhmFaiNc=~V=V02x-QdVyOT&GX2w&ZKrM-!kBOQZ= zM|$@%4dn>ef=KYoOesndBTyO`KF6)b!<(3}kYut2A)e;J6uO$0B60Av5OMndW*K_M zCQlg(V^b9z=E5;9;qYe?cN^C32f%^ci$9aN;PfL);1>}46SB`Fu7;adxMKx-J2?5p zT1rhCJN)0(Hci)y*X}G(M<~BnhX)d;+4&|0fzgoXU=T=#Y)2SR7J9}4&ko1acLmEr z83K3_2wNRcHMHk8p!hKw8ceJPOibvxfYa=u|GQIRKyB)giYU}(7;$?{R(kM(kPA|L z;ETK$&{-4#(bU-kY#Q#Waa#U(KNFF_)`9^>S)n3dr&5rGDeI{^5OK*I!L8OM$J1@ zQ3q)ApPEu>9Z>tuRAidkccvnHMvr|b9o?v9=Fh@lf>|L9!X%T=+<`FSH-$hLra=gV zu@w#1AEM!TfYr|ICZ7a$)bf9s4h6yIkB+@9*)Tza&C`b+T zCv(MS)FXo&A#NK>fL4Ndg4iKi{J8z(f-VFaV6jsN`V3fxzYC%+he{2%Ve z=>ijv=M9(2|9*bxUWJaW8uS>t$D(7a^g!`}T^Dy@yfli;kbS46&V^6eKe?VlWBWV& zYzhM;X`2hx%n=L@QUfuJR*WX2al0Wo*^owcLx3`3k^835s%RWqv`h81aTFgYzPRh+ z)i}f)5q3v9f1Lm%O~XQuZuO`?lrxCMC@~PlXvHdQ<(3M!kwA~>V+U`87;#7q1 zUJSXGIl)TFyhxIn80tA@G(9AH#-9J?*&xIlgAyEtc!N-aK`245rluNfPN_%@5>z=i zXy+hHa}Ba4QC!^m^(nA}r|hWDi`K8lYLJa7M$3CgG~i&w@TW(;p7ivrT9pExpAC3_ zB3iWyPP@n!Ok2|Bd;CMy{;%hmyv*<;gE6eBp#c(9xn07+0-j+cP80Y)sn=-gJDNm~ z_(iAt;fg&;E z7(jxJq}b$jXGX@hufN`wk#Q%|DBF_vy1zQqf6sEH)#OzVlh=w0*ud5cNpwnR3hkW4 zIM`uEon%9>xGi`hK5G$kcnIn>_FIT zQtLGu`iJZwLwaQAr*{aY?#WT?wK<}>L6%TJkSw@!G&ID3atZlCu52a=%?+|d{Q^*y zp!FOsAV*?kDA4jf@**k7JD>Gb^A3}m<_1}U1KmMWJ zOU-46Ijg-N{y3wykJ^#VrQdvJD&g{;YhF5sTU@!~9O0@O%=HjYsRFP+0?{hqLm<_s3)%=&Ah>Disa>vHy%n@bBz z&E~8Scg+BgxX=wx;0~NCovz~b3iCGaMd>2K`#`oFCi*9Lt{?ZL! zoo|%^Fez(2|JC3?Ov=h(#(2@nl$ZgNvJv`_+QwRXsLxP3IXhvg+!Sn0MClKWhp)dc zJ@`eB{LNkZRN6qb3chH!R1Tn_K4U!%3S(HQx#X~9h#4f*LrlQ;0pCY%&6Z>@+!g02 zB@zrvkL5lyhk2nnnHWWqsf&pOBT$36F+(DDVP%Kq9mX5I#y{HgzfjI8h?7S-zm9TF zL7XXsi7+r6##>=?ip4BMcpQqGmZ$rL?*?;a1w4P1m6n4yxdfvsRAE)s_`eLgF_49q z9+rY;bZ7t+;MD009)+zvOz!P21OuCTv51gq0g?W!eW)YrM4q`rAOFMGJ1>;h42H*g zTZ(sYbpO_Q_SmK2-_DoTIz|DdU$T26nj9<5TsIeE!z$NbV^(iJ@WT(^@7u7xKnL2# zNLv$7?2XJL;q{a{fzzo}-pYaYvCj? z-m6Ey^2*9Y0J;aeYA#;9SZX<11b&;SsSECg3EJY>v*WB#l%M!v`$r#rwCSkHV6Lf! zBf0v9I)JhpF-2g?uf~MeP!F|QE#{02DVS)*;QVD%!S?S2i!=sE*yhoa1UzHNK@1un zU#&*%r`P%T`TJuIfjSLJP(QsN^lQGDRHA=12zR@SK^vHjHZU7)AO>w9hA=)_)HSVn zdK6TmB9WHPIOZyIZ8c>PMm3inHflhe0geUmAfk?uI@D`uz^DLtFhRXuGIs{V|FCIS zc1b-GnV_~5@1k`VJihx!KtXq0#w=e|e(o5PeD~e=E--*RIK+31iG;Q_mAC8R^3T!J zV=gYZ?{_Qj8k008@#e*MKKLXp`QVeK;oypRK{jL;c@q@I=_@psG9Xvuq?^sLKy%t1oQU;7-s-%z># zujK2O+XdZ~Azz*UK?&YqTLM;t#?U2JYy<6okbhQj7KJ z0i#TWduGpb0z?okq_jp~V{>2Sp2?d*khq0c6E~bd8BL&e)99l_juj(Pi1q7Pqs&1Z zjM2a@A0zZ4}ZLig-hjwon4rMG8nUSCyBUD=N$A%8bsd z@bkt)D3vBYy>sVjm7Mw&TftR+cjR3NE}r9ICV0<1!YxadqpIemOITAiQ9*T)Y%Z^Vy6 zea9oc@ks9sq&FVvjYoQY;UgYvqe^o%+&}?CW3H%xCdnufVSNNjeqQ3h;?2p5(tO87 zHs}}V8zRT$lm#>$XbLFHffmdtnK`n@*_S=@%>-MWGZ@+oGOhWr7<&k$;_Bi5>t9A&9_QON{zXyw$=Q^J|VAsmb4|)VFjkNeG)~Qg?`^ zPiRpnni8jrI#&I0{LExxVpgnxg_U^P_&=^9Px1aawOQMvMpc&FH#Kzp_|U2Ml~j(3 z+MZRLV+yRU?y54|Y}GYgfcsQmuC6(MzP9dibu~G~`&(sdms4byh`MbGg{@m8v5TB8 zwajV?^kMuZK(%V+dd5c?D%Y$0{M3Q6P$dcH{hb;{Y?WD64jGt!yJQX({t+`8=dff7 zV+>hl;K;)U5xLXA;==?75kDyq7s3LBp75e;PoXacl~F#aL#`GInQFGU?LLLG*qzlRe>ts({; z-GB}MiBu43)nRp8XD-Jsq5K4|9He}+VhQAT_8}4+BrGzA^M|K|Z#V>?MEq4Md)cMR zWht?$@7J&YUKM-KlO5(-yNV=Jt&cHP8$56M@~2;WZP}>Gt!vh--?;H`1J4+RUjzJ6 zUP53PABRI_nLrw7WPr1^y8M$3&V?%%I!pKLXzS{CHmwVI(cfBMUWGPu_Ok<_w>|dQ zG`&7JCgw%_LbD(w-klL-!JT+_MhF$1DZLb4@Ii|uxX$pCpM?>Emee0mQg{F7C57GD zh}V^pa$nUWYoR^8y**r5r0(Ngr9HYko_+QXT~Fz;Es;sl9DW%twKU&`!y7k#ux8Dg ztz^_PI8l0P`SN*SQgoMFP#|`BLWoz2O(;DYeBgjwt6#b#hCQ_55F4}N4^iQM>_Af` zExW*&7*Md^^w?v!H5~Ztv&^QZI`q+c>;F>eO-Jd`eM$;S?>>wbD-29XFjDFMbDu^u zy5Op!^75kUoNiziYr1Pkwm{(d{D97f%$Xwpd&r3Pi2aYy2x%G6;Qf$q)r|6U=PDg- zx`=u6B6JzU<*0_==){|EhL}$_?cs-6ck%h@Jat3^pf8q|oR0Hur;=ADwEhgXK$#6U z(L&Q3k5Sawbut!oxx25gx4o(rj!mobMmEbJn9cR| z!!QwSg z&ppR8DJi@tC51ePFlWC*a(R+#3aG7btgET5uZ7#anwol0>0r*M6MhD661{`91z4d1 zeEs|>0gA7$UJrDWp9T{>{gCKuZW8jg0(tur^7af7krl|>3ao8z!nW89xd%N#5K>u( zQwK!}Q`lEac^PIY{DT|HVc1h%Rstaj$^fG1LpX4&rU18brJl43mm+ z_f6t>3*LhGNri>*I0{=w1&jHE75UoXcPBDJY-fs#ira1UKbu9VEGz4CU9to;^{7+; zfRys+#T*~m1$lAjAW>_5wQ3;j@si77B^nbf7j?kgr+biL){t-CVn&DX-2L}2NYbQ= zd?O>JsodCvoA1A$SNkMB^uPo6&z~}B7GxQK6AMI*%;LW!laJ)TPrUo(DN|l~1zUhv zxZ>uxAO!3q8ECGruI{r^QR_f=cMGx)uLyFbMk|p>oomSKw{F5l-3(a=Jwf zaDns z-ioGwh-8zTbBBsI|8qUhMwJHeTvTr$>QW`-ncn3NmZZ$ZN_P!OGqNcpWj?;qcP4DC z_ZgYoBomk0?n{z*Z|ZQ;Tnp!`4GqmrXJPuwrgCsZhCb(w_O93XYUn92Anw|qgw{R* zc}qlVpNZB!0ePE%)*eQ?t@~A3QHu5~s8!$xv$U+DgaVXPQ8UOQyBa$>K*5=}`M`>b zoSfR)oE*KnrBUao_wwrMnvmoq<0ms|sp9|3+k3!ARc8I;cY4pXBs1xgLMVpNK|rJz z6&ot*u4}=9uDb53>$~;$GP&5+eODLzx{8R1ND=7-LMI`RUMIaxZ<*f9|NBgctE~Ea z-{0r|`%U0xlH7aeKIb{lc~1GBb4p5FE`{P{&Ma!8KrrzQtzh1~<;&;KU%q_y(xpfh z{*Zs)#@{^h$RGYtejfr6%s*{hOiBYC*|Y?m2rD>EO^HN9!^@oW)R0s<^adUd@buJc zc*F>{NrhjA^=6}C#6;lH6>tJ!n2DER7ZQZ}8~J3NkG&MiOz=S}9HU5AXJ#l>1V{aE zSEMMj9F$oB%B%oouKG=>$uMjNh@ArhAu|=P9>_b$1-!8KdwUUs!m+1!Oz6Ey`Uoeq zDc7nND;=`n6|UJ=Z4vYuwVK982BWEoNWreIraqDj-PhFH+jQ>Sc~s@8X-bK&y>AL| z%OI02fum8&Nv1rlFLRlb)~bfMQ?#1p%Wbx@G9nspx#f;!kR639?zru?J2q^1^s&bt zf8Y-4aUv(*6rg~OI!2j+{l`6`=;qCMc{0qRAz~$goX7>m%K!7L?Y!G7u0#&g# z&7kzHp!5px;0o~Ilxry6o8m{1wg+1bbTmTf0Yd(+F;Z`lVXnzD0?CXQ4zbPOlDcq= z)OtP2$e{mGdpn;Owl;#wb^54Sh|YghC+M{IubF7Vf?Ft5stIs3XD7^v4vfIry!l&# z7mgA9j_c8Sa>@E9pL=Td!kgDW0p04cJ8r*m_R}vufhuF5_+PT%4`(Ccgc&dx`r#F} zQ3{w6QzuOlGUzGSP+p&6W{}!|O$-_|A^Z@T4$~Ovx5%)@;usV#<9Ok~-aO?R(x<2R z8??^A9tZ7|P+m^vLp4VGAG$}1_LD&SRgi6~G~ZT3P%1!0xHlk!##BS1peV5Or9!r_ z@38}d#rvy>~e2 zMBVYac*ZSjm(MO%@cD}3*~`}&f@Kf==Ap76?t)8GSEr6-VpFr55lc0F<`$vuK@m4_ zrH8AYy;3dBIDERX8|`?#`tHWl8JXRCKl*5|Et67U-x(r`A>07if56Mb=b0d+7W*SA z4v@}$QE&}Kwhy^N3BHwqn-ySKMez@vH?|u*4T?PjZhZ#a`ZT!p8F1_DQB-sZhds_w z2O_9Y6$T9kpSQE>k|DuxAbY*HcWBUMbC}={9}L8;0c70T03OK_=ff@0{BG*gqoIr`OXwMim%tW!LXp{-vKF$&d(G4>mZ@)a~PE@FcGRlmw0JLKcC**MR5V42` z6Y(I2p3UQNf$Jg%Au^ZbIr)WUMe>q)vx}6n9Kf*fXLd{}5)(Pbn)jORKA+oWvRceGyWQpS_^$duR*_W(o>>K+A)Rej zfoBT42M9{Th_<{?BJA;Eu2Ho- z5evNi_U`VmdIcIyEmwuRcfU;+rX^4^+cKI+D=0_*`tpJ_XD!kVE;-Z6*FE~^qwC74 zTx|hRHAvb-=O_FZ3Pr+u?pdG~CA*Q*(v=XY7u-V^`s_xN$z-&l&k|l#)R#c6P?$>k z0H_-swOS~nwg3er87vNIcgcbijw=$2(}b)jscsmFv4m1FU8v5IA`e!IdCtdVBrD*n(o|Ezsa;QE>@-v=`&- z9p#qLl)S%x<;t`KmU%2~0#?BUY6H$08j4Dbmo8m8K^h-|AA9^mc!LH=A%y#|@j`?# zD84KM;s(LHdM!Kko3V@*HJ-E_Pf9XF)Zh>`V7ekEiP92T3Slf7#A<^gMohuivHMnV zpx&{W@M-VetI?3c?uWkKx0k%vBn|a@vE->T8YSX66%4La%bBtW!OTT8m3h-mgM&+# zu3ouh_04EI+uz?usmgAqo*+mvW+W1?V8lkXoZicO_Ux&qMG#|nbXZh+gA&S11qTXk zEJ2B6*yy1}LHW+O_?_RUc9e9@SnWrW*_I8Or>C$P@OY(ES{{n$5=04;+tAY5(t-!& z0yX^{r?|MJxH!5r`K#n-)Jw1O7Y@``*Y*so@=z78Qi^)yD_^Q5*~ph_@xGw}Fgivg zvgKblE6hWAfufmIWDKoH5GWc@GZ)mnio-yhoq;Wi$>I*cJ=HU~w}RqUq_CVULS7a% zYXv$}|0iml;>g@N`?Jl|OBIyj=uwqsGQeb$H7YP6dK3`oUd3PVSll5vy9|T-DyT>W zR}P0zhHNHzKekJ}f+skD72gCZyn^}sJ68PSAzjU-eoNB;X}FzwrR+&`F!eUBh%BK#$bI-au>AC83$C97nHM&7o;;9W zoESOx&O7hC^_6aE^7`a+ncEK?I<({6x8K=a+tJa{W7*d)hZQI|jVxB-e8D9Y9k`si zo@&sdWI}{(*o!MK`>ZzUB0W#a5^B_uQHR+YbzzzNBvTeV`Q($67;#TWWu|X5;_B=5 zaV0P#qi9xYt#3(lM@6}df5|8)#b;TduG8_=Hh%!wolFH*sNR!PMEaXHV6rbCx{%%rnodpB9$cPjCHV&&l&A z(+gMrY~9T(mo22Rl_;k!T=wKL)Lp?B@AvmE%oQ*{LOG|GlK;V|*s=o2e|INuP2QAT zDcH2L4FcD!Yx-gtDV30Xp7-vaGu<}t!!O-L{f&AHRcrnTD`q>jliG_p|2yZ2pD)W| z{th@d?(bF?DVRRfGIT+B9Laop8rlc_e0uSfOILLLZ8awvF^bfyp&s9K1HJv^dqcyC zlhqx~^{I}?V}Hl-^pP{CuaFCBYwHx>{&xHg(igOB)M-uTye>|n5j7MX6mA8qqk>gf zz(nzV#>^1YPw*o$>@1?#3A>t-+3&0ex@dIsP#02%>cl-}+x9q9xO^mJ!uH|(u$ zU5~Dtm|Vm)GtjHk0j}6Th=n!KMbuOv7j=E4@xb5g3L|=j)VWeKp;j&L9NHHVck=Z^5k?DN6TX|;z@Fg z&C*8Qz=*lK_S~ucpX}LtbjK@X^6@p}l^sWSZ~Ne{A6K5cZ19)|yBY_X*tppvAH2Ww zY-3{DikUe|nPz6Tr}4s9A9y_j7mjXO1EyJv2;c9}o%omF#rerQxGx{QFyNtH*Rn3v z9DEb$ChUqg-}xJW*uNG31M*Slq0%NVSg_#UWz?%+$oHAQd*%h=$$5X~pYOu2C#O-K z&KkBN|M>ay$N#qJFUQVbJb|BT>{P}L>nZhOoUwf2 z^b9IAa-j;pzhI#(7x4YWMWdE4o3?Nz{=PU1^_o#G3LCN!xE#IFWVS-VwVF*9ixC#D z(QGgqiP4Ka8_`ijagB!I6yC%{><0rBwvqG^TxKwt&35Q`7Ms;%)Q=#4d@-uQAQA&O z50tfU*#I`)zF|UdDOP;P)130Tl!Cq9vhyjLH4PzXa5!ER- zCpR|>C80CZmB?}bzw)rD^}7-4_eHGVKVtoE#QNQc1v9H3I96gl!ka|=Nh$Lkz9hI! z2$^B&W09s7ZeOan*YHq3)Gjf+eK3k(S8`!lR!qY)2FmbiTMGbq3x>^k3Qi4kSV+j08!<;e|WU*gwK)LU{FE?g+> zsHQ&EavYBH@4D|_4(29bo0)&+i7E=^QkTqa$E5h29=*fmc>M9()dp|vhlr?bwa%LM z#D6?a%SuWm(uAaZ?rqQiVewPX-F7z${f#;4US+><`@HGt6>LUY{@Q0(qNdGQP1CQa z_k>R@&haAn+R-ZqtG}id<>bs+t~`eV=|^-Oi1#ezT!80{Sj)(9 zh93famf}5Ss`OWyR6&*g&p&2NYbpl!%+sLb9Q3wga8EI~N72>Q*N2u!UEST#lHjlE zAc;v46bPiaT;%S-r-l@I;%P`J%lN)Fd1rE3auKwaTT%r-vjM1&;D2tCBTOV-d5LNb zB;FeNwN@-jjh?93cykLwP90}Fz$k<|$Y$I|Z9;e1O^n+ZZ*GEQOTM&;k%z23Ia8}J znNT;%3OmP$4y52lL#5%^icMm~1{<%Q(3fwY(YqA26@~!}VImFTYv_P|l6i7tH;e_iNe1I_uy$ zCVEA~hs@886)|HcV@Tp5*>N}G?lIy8b=S4G zHp7H(YNak~bDT~iDv$?k$u8R?y5se1=d%H|lC!MD^N0pQ6wE~Ytq%UT)u!8 zclkZP{M}2>{qDIH*sHdUeK8+`EtTVTk2-$)+m~K?>6u4%^@7QiX|I#lq2d3vz)j}? zV%+Z<@uYC~2D1$Ytd$)b?)|M|$G`C~N>b6r~Xb~*TRBJRS_a>q4no%K&18jg-*jF`_ ze$}SbfU0vq)j6Q522|C6s?vVLNLPOk#24foqB7^Th;>1ifKDc0v5?cXXBG8o(t^gX zmy+`2yGZZo{N~)brAcv8ya{{VlH~O?H4#TGj?~9!iiabOlpluox>Zyd8*mRQ!fkeWqapmONyGUQd!a6Eq_Z?uZBD z@gOZ#h$JdS2G%MTH43ZbUGw)b&LLymfOU8?*5TDLD&&-qz!Wg4Fk{IJVNs%T;mcq) zAUe>g>+C=CiZH_DqShavJ|SSj%$ZXn#9_cA|Hy0nUHQ|?pgC`$-V#4u&bOa@S6i`Z zhn`YsS;AgVZUxL+im^F$M6 z$XE!jv`5#2V1mVL8OB(+i3l1m0KbHi{bZBHmxwPy=paj-rOqW?wUjalH0 zt2hbVctD4;4qXF1gWY|d9i4q7s=-7bQ!O(>@m^zz<@?SqN&ZrNVz+c;fj#`;2X6?|dcp1$+v zF&=oB@Bqg02*$Dje7*sE&aisu$wBi#HD0a#20tTV@9G+{cA~~vRn^(*5d-;4y}pO& z%695Y?Np0JKQPn_t-A$fW?{UYJh5%x$@6$!s5YDX`bI1^+mNmaO{m-Yd-XPY8cU3@ zb0nx>!yL^H_0;b9Os3$Eb~hh}XHzPbOIRIVtn3V)zY2cMlL$qj45f@8wAx2Uoi27B z3dWUBEX-oS+Z1Lp6pH-(Jn7}jvAh}AO`bGCp0Heo{t&B}l8pFBBMu9v@cO$Rh`Jrf z0J!&OKl>ScRlabU2nwMoyJXeIjT@I!cWI{vgZ>y>4h1ZY&$6Q4p26mEQgD8-l1iV? z<+224%@TOv@HJWj{G3_zG(Ji{Ck0Y|CLT0PAWS+U(Lk8VjSC@EAcrO>BxpgJm8ph* zgvF9z0Zv8v?EpN%p$NqahT!M7A{WC7#m3{qjshhI4o=kmjYlJaP}moxry0z6_TgcN z8JHihZ`AIy2U!BjZz177=%_>8CQ@?E++yp5zerEDXs7yoL9Y#vX?PJ#egvArEJT=* zp_+*H!@nHy`HaQ@s=u>&thmo<9K%bl!Thhm{I9|MufhDU!Tc9h_3L}|dd#Z6-)1;< z`tYt@yAD;=RieSh@j4y02_2-8Mz61HX@TltHWdMn?BW6T+JKLJio;`b|t;a+c z9X$HQ$De+hle2Z}Cp#+-96yBn95`m;VpHLmE^XVktp;4Jkw`L%iWCY1;!sY^sNS5E zr%MhWHc?q#nJ(adHdR&_%ga0D5~O0p-Y*$Wdk^{F9R| zkrfseDkK7ELn7!j8bpR963j~k;eH&2(zrXoOeDN9HrSmV3nb{GuDW(a8tiuDP?;J# zO{B!6+2{H9`$&~Yg3GSjmiG~ zt=G7^-H2<9?bYW_9Y3(=>mz4sI&yMet4?DVE-)I0yHJe`o9xMbpVw5M zJ$33-ZEGLu@fn8)nIXH8E;L5OaD0m+#=*-6zRE4kP8w>qY}ry{NMse}?KyP0A1YP> z01|vg!~@E^WH;P0do~JkG_zF6s>op}OXsb<=PtK9sh)J(3opEI z+oa5x(|O13YvyA06!`s+Izla&xzC&CbqOaoW5PcAmB)Z@u-_;W55XmnF@5LUY#;E% zrNR{7_mVk~NMvC9K#J{IF(23-%?Ln!y(vJM(2^OV39V<71JIJKBLf`}LY-r5A4__A zdO=5TJWkjjx+2)#>lp>x8$B`W82#5m?yQB}xdrrJ3%Rova;M~U6QRGc?ZVjuP&JLl zFZS#?Qr*-KfoE(ubMnC6eaH4A8@|YBG!3@ZSA+3SUuKU%ni6Qcn-7aL&ERTX}Xx9@}bIxp)S( zQd%MYqUq^3yuK|&m=4L)07N*i{XgqrKXm#Div!tHvDRb4aV^wqp z?97q64p2KA6u>FY{h56xD$wZjQ*N%~aH%_>;zq*i1EdIZhn42x)38!D4--qw8{`WiUsRJTV?QBe_aTy zdzBv_!`L6g*dN8%AH&!m!`P>Hbo5!hT*}#b30vRUBgeXQ!$dxG=nn5Wwtqi@Cr2(_ zId%N_@v19*kPf|obC*LU5vg5H5GoYb=^CMKIvu*RL|VWVP*oKjwT)V>hMty-7cc61 z2Cek;p=f%J>YK`r;Rx*O;%tV14YaPDO9@!A9JTtBPd@pkvE2n#!qZM9#}SC^@`3^- zBWN8#7||&zDN#e0Ql~Sl2JoNa*M?t7DzK;Sjhu=y&j5&$x7uG z5h){=t5iIu&oX;-+oB-j~geS}YDP5h8J~*+Nfu z_uCSFSJ2_HfZYQLM!;eO|Bo2`m{f~}kUBhwUBG4-B+{q@HFwIPStVUovNH!+&B`t(KV}i#fvi?$G!zjEIZS9r5jRsV99stjEj1IoFcZ8mj+RmpeaLKX>S#E3Y}cos zehS#<@r$i`_-HeZkxihgij)PdsX1?kGK8J@JgwTgH795L_HEk^?D`UCe^FeFSj(lY z2-#&65Os&e;$X&tOs+yvJO^#MXVI#so(hLIYo z5b!YpVm8<3v+D3^eW=w55uHdVMO=Xp(K>|cWFi5FNh!4%DU>&Z;ls!R0US`77wd;s z4Gr1tW^-4s#UHewYNyTKC%&7z9zZ8@(A3AjG#OZVA&YeDS>=2zweT5Rt;^u7iC~9_Aa-9lU z(-A)!)DV{pu`&@f6o#Lgp%G|iEV*yV2BFFqi%mz&RS}~Eao{D04$Wd}2`ni|OCyOy z1mHgjL??$Yk*A{*Tk1v#p(4S@hJc;XU@@8N1=bKe8#-NQCpBj4kQ@b)i+nximE?6? zk2Ric1$&28CDEuf0e27CYLLf?qX}7U>Z+=4D=8EMrm{H6s89`hY*aESo*mY4>X3?h zO1Eu0(jODB(CaRcarvvSs-#X~enA21)DMheyv=?pI|OUvrd;GOas{E#bPcT6g6WG< z(RDHPuvU#WG9D9FAtLj+!dOgENGLG9P!Xfm1Tx|s&_$y*ARo~99Iq5e5`b6G!sWs2 zg2O#_K%gbU6jfyDbhZ;C3-b9!qXVr9&BRM+Hba51kWE2twF=P398gogpCbpEKqo?} z&hh#yC7{(5tbr+@6`Ai6&`M@Bb{#*~(Mt@2)4jSA)Lv~`PjhosRddP?Ft^m3Y4(?2 zeklJ7tW)m$MDI_(h@b`YHK?m;%a0y)I@Kz0zCtmtUqQ1Uc;G3{AD2*n=cY9K=uLnE zGhd`$)TW(ZzFehpIKlBgUrVu%MvYCu@CX-ZKPJ=T3;Gb8O+(B(kq{Ae1uD8ELd%FQ zj=pC^Dc6s5wZS=)7J$#+>T(gb4*9JidW;K5MjffSLu#-HHL2QEC^G_*>Miw5lwM_S z&8cK63>5RJ@CK$&L1BvV=L90r%prR{GX#f6$_ua__qiMQxeNEX8x*=56q*QuHEb|< zHC$SMulX7zQe)h!|yLNtc@W{SnhxY8;^(Blae0mxu40Y3*JvfShienU^P+nqgVU7;U#j1GG(1n31hPnM$|$$^8=Y3wH8 zlZPPdOR<}W!^DL2Bt)VZQR!SBc$aswMhh_Y(FMdSE zJDoowkH~nH>PKXJB>p2Z9?IYk%lJ{tkH~l{B;F6p_+{YeW#H(g;OJ%G=w;yO zg3FyIYzU^#%T;@K?%cVz>hiID`}Q3;b-800BA=){c}C-)uC2Ki%v#&rrW-Wc?Om-+ z)u2{&b8DxaE-;N*p;1%YIc$vQ+DsfcaEkHc9vGvwRHHUeCX>KZMr=^h??)m#al)KT zD~BaoE=`(F(9B{PqauqTE1t6qzgsq^I03!dC@Nm~5Dd}P)Cz4Lb~x0UC-$ct?#oDE z@nSVEHiWSGP@I>!m@Z()qnP|?j4e(>S^YFITLf<83)l$?dUpZ(*<%Ed@?&3uJAK`B~t6DJ(4bzPBYDe)7qUk3BW+XL<0M zUv7NrscXG0b``R@K<}%57C2u3TKm4YB>_Mi+Z7r2v*c1E-}ScG?TE_iuZ;Uyy6U?0LqpekTd??1P7|Cu=4XNPB@n>x{>|GmJ_Fyg`(fxG z`=;t!>%a2A30VKv+WlrTnkhhbk6ZsECKH*H@7n!ab93`DIp13U?DV|s?5)?@{RIVu zg(}#7px_)!ur3~?uWb%guw0N z)_<6Rf|vhp_m@G<IRnLB^Cp#t<7bo%lI>btjLXKX~}?@ydg>WQRPYRehVkJZq5jx!tJF9=d67!PGR1w=rHlR+e0{j*TjN%8g zotuFF)i6A+b3A}iKY&p`gi$|$Q9p!Hm$h~eIQ{mX`b#HaNq%##h4?v|&Ye2FbNkmP z&R(d)efnySAK0;D$AM~y*(nBtE7;Lbkoy41VBI%1Tp=BN_kL7)EahvjscCF!Y3}Ii z8!^yj?VilconIb2UvGgiN%<0ryu7@4-?0z=$z=x3y{A6=?6afQhdzV+{rnuYQ#(Z_ zi`hCGt8u&Gh@iN1;)Gl|yn9ZjR8u+=;qyFx0BKG={bnRL(`7Smm?m|4l#>gjP&JhW z3O>jpE6r8RdwS#I!YRw(VqZ4@*88C9u3tnwsZ|Aor{9e!CIJ|)5+!_Y7q(|2IPOP5 zSGXn(aN_z{%FLXiN%=~CEJ&A07|^xCRGKOmudFmgGQwfDBsVX&pde2vL?6)@L!6<8 z&o)Pi`jk@`3|?B1T1X584v$1}JbqNHiTXT4j?{bwgK@ZA#C$e_wq=g$%FdtPTgFNt zWfvVNhQP=UhbQ+&^-H0S$LIAU8_w$TVqa2uy*E6Gj&;zjeWOkSAhBA_(9jW+ zx?etI27#P*rz7ZhIRLwZh#%7ni5F!$=6c+VQjWP!S!O^mq$xZ=#Ktm^7Y#28L#w=U z#pwb`tf(U3@%pU&DKAQT0-@FSc5i?8olWmmwGJf`fB!p4_e}m#tAxX|?nqVD$&(Ug zmO71P9`mCxe)F5(+<()`b+!iY52IJm);YWF1t5m77W-h*A!Qv$`zuoDMWTgBk zRIEZCg`?ar2-x+YW+((dibAVQB+TA;0BxF+VXrUY52pMm8GaBW$`y+wp){2Q4Y1j4 ztj%7n(&b8vcmpA?#}x#AfDt2W{UKdn4`idfIX!~K23 zRaL`iLSPzpz<9)KaF|wQ<>X?8Vs)SI55si+;tO?dVUdDZ&oUW5j&8rbm*JGD8*(}o z3XDQVtAG;)t6+`aIXS0g|pyUod!e8=VLOF@2(P}F#$0u zn0!*n9R_rECcp#4dPc58%HbBr9iv_-kmya!K#P#3dRQ1RG0p%0P;_uKO_R<$nYZY1c?|a=H zh4V#!LTP|a)E~4G$hWmCCJTiVm#)QFX{jX67K$ViRjw+#XrhWL(MllILP2YPe@ZEi z&{93J8~aC0R~mqttM5QJT?u5FbHo%1*{x2DWo%~e!YI~b6t`g%w_y~w5zZd)At|w| z7Y1bK$wMD~^ub5(z5Brj^pfQNlDzxjk;6wTkDsWlJXzHR_I+Mki~)LGE)K`y^x~bv z!{H1%J!H-=w^x6?fB(Ky^_R``1WnEdEzONBy6(<4**=?DZ?wBTqmw_|nu`@^Ht9M$ z+S@)u$Xg9!RQ%VGwzgw`ufV%EkGHi|zKwSZ#Zm--U*`P!{`>F0?^jEK^g%e7o?vr7 zK6}>8^78AZO-zhaV`kbBhc&9_vjFGkm!cWr?nH36^S;f;M^n_T@kpwc`OZfvl764w^ zX&F*!j$E3}WOI3Z7TPEYy)c`KF)PDzrB~-_ z3Fc}E=4u({Y6<3Q3Fa!_)!OLsbT?k9Zmz#{{`BWNYOd_qUensqU0q+>>ct+DYu*)w zEvKg>5|+J32Y2Oec(%U&dqu@Z-+&)Cxx;i0DHu6Efw@4f$CdUMZ!@z|MD zwVSE;w7H543!Kg~jXo~d+*EtU>Ad~|CSw{Ojc3Z2!sZkT#M~Edz4^{N%4W@*cfIn@ zzkU9Xin((pm9D#Q<(lX4h%ak%eK(y~spedlfElYPo1;=)yw&IHvuUPJpKQS{ou8SN zr&Oe=^Cx7@nO{D=ybO_y^65pn^3sel zO44}|I={cQ&d{T4sjV66Z@*l9uCk&1fTAWeYW z)4vXdI$J*9vgOSt-S}=!XiE?`%RyU$xVaIu%@ua!i%fN=&(^uE4VM}k&Yh|{`p(}D z9l0%3`>&%3E8B5j#ldv4*=lyM{gS+^qL&tDBni zCgX_wE&8>8obGqC0UpUwSJz&=aHU(H1_^LN=kxU(g9I3jDiCkZp_PfUiJH>#iHdOI z`IRf?%$_%U<{a5FN{ePX|Hb{&9VIzz3J(xobYuC%iABl~^0PBJE(ClgX>%CiKqQLP5?E59!05U23Z945_3H)R4}>?ioqO;{t51PMaYRaM>YOEPZCO zRgX!Rd{DJWGlu5R)i8nTM|B*VZSP*4Zu|D;=J(#C06R8^VMA6`?ML36nNAghB!Dm` ziz5;(&DghZN%C>VfhxYDd-ZB(`SIh_w`KQO;yU52OQ`LPTkho+Tvq9q`OpjoWr1)t zs(1#2a*tXJ(QzV21qjEoHpAG!^1YS0n=_YTZiea`ca@f zo%LVQG`*|dh@==}{XuAEho}#=fOv9aF6f2s7*DZ(e{U>z)v8r_v7Y_39EAm;mBM=p z=jqrNdj+1igkXa4#h$|FPkCrLSU`)eny<@z5tc|HVnx;#8cv)rXx36$X#%LI!Zana zZ_?9ba3aalBqRz2tbzzm*N6{)_Mt|hmX}0LQNQ08c{!^YO_l~bnlEF3SDM>l`L;J- zhSGQi;7aIuz&4QW66Fd^CSNE9_hu~QH;v8iI7;p2@2r`;AEQ^maO@)C`5&X1-fqK+ z`7ydx_6?r^?En$`VcKyRE-%enF@aEP#ba0L#eZxCD8`?%;vuqZ@WpxX=2;8YLnytj z&GDtEry%t6tzBEl0trtTSems-hEPQ3{U{+NYT1tyQ_G6NX+h`x7)h@Tcbx)RbAF7h z9(QzH9%X_TNzJP)(DrK0D@t(s^u>#Ht*ygQ?|D$EP`-n#nAcu|^I3>q)Zb`%@WbA8 z(;Ab3Cfj8NPoa=P8c@H|^5Ax@tURMo&}fG#m8PYqM=3etYzWJ91RPWVJ$n|3Y@MC$ z$j{*sKS_cK4@t@=T13_`o}>s*@~xiJ+S*aujp&Y2)>l_w4@ADi{P{ zW+IbNE93yr1vuH8ZvyWlQLI{X``zo;g9WkD6|_`FrE?q?arywUAcGxapd-n){c(e-q!YN1p7~(>5aFv?B0#$ zYq@57Z)aQAAnFud`d3IWzfMJH|+IdQWadk$JpCFa?|S7*gpdS zo=}25-wE%i5mgvQy+XKiGi8CEKme7&MzMd!-445h#2MnG5hb|K`Fb@Ql431o|vGilOnM0%#=ioxyhPWtqnaFgns&WI4R zCr)?+q@xyJ#0>f9X-Of&jerJ^jqF+x2Qcn9MSSdRh8IbrF%DahhG;N57!+Vjk#Q)o zHVYLzff03+osN`pC5WVGBnWvPt&l}Ay?&3&i>|jANd@mnqv?-)=DXchxo4knN@W=+RxfoX(v)@o_bnfzu68&k78N zusky}jyboElF~S4#4;h=+)j(l6AU;EbYYK!o2h#LofF+j%(A)G=bJuVq4@MuEVoZF zuirFcUJ-sJ^V){AkxrWk``^Iol`9Q~g)Ga6!4>91@D)zZ0@UE~CvPl8#^;b?kwk*E z7=G}Fn49y60n`-6iUy`>3*zxn?5Qs7yfKPo0E@#Av=N3tA{H=0ZhxFE z1PCu280xp1tq_=&LD=c2`QFtf67lSS01VmSDk}&A`KQ;DEEk6r-eY|iQn^AQ#udAH z*b+(t5j^IbP-Epy)Qm-ON&e|X4LYhpf5N|%8YS#)IN#ic+_c)d_k>a;R&&H=smzQ* z-*Wln`uf;MAHDo?EEWvD@(T5;Ryw2EV7TwT=Jxg(iVPbO(^v0BLb~X3mNYL_KKmlj zc)xo>s8Q_Lp|SZ40tF?EW?omwo?BR0s<}}ZgKEJ{M1cCjXT)L#)Z6XpIduyCbvxVI z5Y&;H6QNLMW-t;lhd2~?_v${Qxw_A2fWU>WNbG4ufyw8l#v$m9afYzj)YQKxkebaH zg-m8b*&O+;J)e9+h7bt+yI5cS-I_tFTOr?{QR+R_I!oc z2_R_-QTxT0OokxuY{-ZPoTGIwSpwM8!8TsFjg541O>a~p+4A>2H6viF?&=dq_DRy; zfB(R?Prv$P%Nu|B>tFx68y%?%k@oJl+dF|@83-zoOF8exLW5z&3NANFZtn836m<4& z3$pm4-~Y#kTjwEJf6=;o9^R-FKL7mvk3I3w?^goX{SK15HjyvJQ_z$uw1qxj0&eJ1 zh)9jdi;5U^7p)4#sZ)A=AO)JFD7&0!UEhp0B=p;>gsqH zv+^)z<#Ei)!yMf0?RZxWjcqNY$TQ1CWXau0J19=f7-s0Pz`u*?! z@cc3)w7x<8MfsmEzWCz$#qbshr!2YeH@|!FR}WDyY182zjBw#%#D{S_Hk%F}>XSp- z3<6C;!I7A6$&!454_knZBgt7pm#1Ya+1S095{X!uSEy2m%GQ<5wuKTeEm?gF)MZq!frwmA<_-)Bz-WILP(eNSy-58Zg~Ec zQ*MXu%#r=OkWPK5u8*{9_x4=`sHhsHQ~`y~5c>5O55V8=vX5Y=>m9Pi#ERp`d)?@B zKAG?7Jx&W3%*n>2iiEB;w-S40Gxb{LA2)9N<*$DAt4D5LI1!s~>B4o$ioTQjwYJFT zbNKkm(uoQM9O?)@6&4p}@k73)OG~5?+&&^LSxT2A*-6X=n>X5Bd+0=WOu!T3CVWN; zsV`sw+!c(Y&Qwt><{b@j)v8EjXvjhq69W230{}`9d9_I>7~u$A(%I04$!a*&V-tP7 z`-}Z&A=av^FC+N~3SDzk1JL!2NWv+CTc7Rs4%USb{`c8HID_8kiD1z?UBu(=b2&%H zW+r9dXxOlAVBbL6qoyya?^aftOotBjp<6i5jCBQan`thG01OyRPTE|>;s2`PC{`Gj zD}W)==@N-GYo4W6X?ec0=guhc!%L74FX1^}f_!)h&oRHIzK^VEh+-s+jda!3TsVrwvKt67g8DjeuBHm{ z@>B4C4-K`{oc;Riug}yFRA3|ZrgomeFgyY@BFf3=`%DP=VfVJ1kYnI*x<}0@*$Zs_ z)$Be4N^4l{h(X{C%P2j+Zj4S z$(g6cS`@Ba1nbgg*xuYNO2?iYFsTJ%~{piQ>YAAuoT@q)9yQ z&;^|?AS^&malX*6qvy{rQ-ZvF5sybuM(JhqS3msRbI(2b?6Xfj^ZfJAKe}dq9(L%0 z`S&0f?Ed-1P-cqe--Xb`I)HlSq0S9z1~HlF{K{eT(jZtQs4>StSOzaD?3*{QKoUkU zC@j&;D=6T32eHBiy}SZ?K1z&$HN#L=z1ZRsP-9Ub3#thxfewH?CdubUsVb<#cp+gO z9|1;Q}X3S~}a2_ysU(^UUv;lmUvX2_u z`i2p2Xl-n`bne`x>S3pyV7c^d=jyJU!#;GTuA#Q-Sk;9~%`o&0UD$}GB7+g=_-;t) zW}q=@@wj>zLpFoOX6PRT)C~rcndFpWD}wPvPiq{aGSnY^u)lE_3zI7lrIBiKnViA% z7Y}`eo#@ND4l5^(7aeFmfixYm6-`Y~=R)kYL5x+|q|$V#2pKX_%rc}m4v+ZL^7GT{ z>IP%{62LujIF34c+6_~rN$NMxt)DY74Wganwb@9GU#?V@ef`g|4gF&I+*0J?3G?UO z4%u}Z_MxdB52eh?ng)#Ani3#2h*kFjv$FP4=|)W7x={N2_yr9WGe!*^mOam zdpqGM=;$C;B(P0@Z;s-pL0G1Juv&a^7GNbo??|^EG0HG12w|rJ2S+0z&s826-;Hj+ zx*OdBSyR&0--+$#%rUF(%ArHGgF{2aNJA_N(M3eD3b+K3SwSc1p9^)clPx~BG8D4ZQ%2`10>N2NmjUk zyrWARyIQ~;I?I)l?}Xy)un|3%p+~fK=pbr3I&|2JIXVhV?eMutJrPFS z?`I`E))8|cU^de7oSbwa?;jsw@oe4t51uRs8G=$i(~dGRHef~~q)vpCmb=}71oIaU zKK9sSzqtPw%!nK5HB!DPdqQz>j);jxwTtivjo|tIHpcx@o!JM%+Ahf5->m$gm?s#^o6qum`EA*Xs^MfXf~vj=BiP*ZH*oe$o57rVH3CD36gTa~6@djd8W#kQk% zX)_xi;GxEN;V15`Z_&5!WJle8+#A&z{&ARnVb&n-&Ga)Lx{JNCx0oQ$_-u}xZ3}wH zy-{eaneFy^ue~?P85e`k(65t|O5b2L{oj3N+r0JSYKkyI?E;}3xBjNDkvHq<~l7D9V628RPvyY=-MYuo8(2~9qV<^}_$jS8k zDdww;SD82VQ_E2EMnQedv?0*NVsMxaJH^o(sTe*L9qrt8Tf=eFiXNi z_rR2InS+@meMC6;9ISu*M=%oEr<=8K<>GJ`IpmQ;i+1xSk{SQQSG-S7sU(MWsD_$q3oF#`R$U#XC7k}Ui=C|_!N?xVz2JPm}c#qyN|2}{JIzQDq zrixtj@Ywkn^uM3~ule3fPEAb++QO0!n>d{R$tOyELTbLReIo7;aTGyjyP_yE0%#%2$l&aK2Ht`a=_64|D`WY?wVqjKah7NSo%rSAVB&LaU#oSjDwpI-YZ|0macU;d`1{u^@h zUy*~H9QIxFWZ%EyFgYb9u^%JvxL1GtmSg^1#{ZR^VkC#uS{c3i<4;_%gPig;IXp@Z zVsgOe{=^lSw5wO7o+^#}h}G~DSCDCk3mJ!$Y`l@Y`)O(V-?`%ZGm;YTpW)8Lxr+Pe zlEap3XYu>=#UyKCoZ;{iIb@RqNbwURNzKS9a^A1Wfk_Tu{NxoMkyC2OVHG({A%|=E z@%vBpCOM^&98%&nPTuYR$i_VH6p8;wpYg9NQfunk zryA!IE=9B;CmF(PIG~ygdCMhllYhQuBtLKs;a^mtA=hyJyVnqTa`kiA-@As?IU>Ev zNM_a5I!6>6x$~!ifBL=l)lKZ!8~;VUp?y`$TD_WDt$mffYSq%Eh#S0`dVA-cc>BKg z)iHTHj;|s0cSx?@Y>YFD!Gv80XAdmEB!drcCZ7?7`wArxwP~@KkP5-f3{!%b*PGN5 zGm)W1LxHTm2rS!h-x(OTr~15bmwEeY;F_y}Dg+#O#M%Q7NuM>G+_|&f%0q1mzO{ZQ zomDD@d7oCg7_EaAl`7z@QIsx3?$ms0tyY^Mkt$&zE2Uy;(IO2>!43_@rG<;=EH2tr z2T<-7rksS!gBgh$!?0&K2=uAo>;h6Yif%bfwpc8nNDMYW@x^qO)e0Yj&5AUq0h<-> zVt}aNI<{EQ z1x}n~@CFr82kOvib7CLXzgDvs2w1jP(RxojVu*A>8{2f9wcS6JEQf>XrR zbq)^2^UWsxWne~f5Y@N#gIBCM)_8mvXF)d%T{$K02>R1hY(3wBVk5?wMaC z#h|1`b8o%%);W{X)iWTwwOL3h2Hi5Hd}`UUVks(Y^hTt`%LHOoCcuFlnD-o^3@8bh zw+I&rg#vgP1wjFdsAOt$;PInCz9=e9puQz3!v#y9;_^^mM~sS3PLLCTY>;i#ISLQ_ zs59kHH7CLYRKHe9BIO7TA{3hd8U!vv+**s+eKf>mk9nDu;NDDdFYz)f!Es7(oB);K zN9JgN4>6LZ(cqv zP^qL+F`sXT=3K!7Wo1?A!?FMb6a+|{`x=(j?AdLceNAD>=`PnW_E)u*R8 zoC(*loXAWZMiJqUw;Z%dBo&n96=_+-A_E!Opm7rA#kJ1;pOLkzH8U!+`c{rgM4C) zn-1q=PaqE!{O78jt5#iqJ=WkR_2OJ<5J(iKGs~K>poXe1o*QzJh*Ycx73MGvh?F6< z+<|a{KS`H|qa$_AC3)P09WKjG5*;(a6KU~zGO`-4wCLU83TM*1 zNyGxgX&G#^-VvwE;E0yVl;{dYaE+8yTgGBJ;Rv)qqOnn_6K&(!Jc>*F$>M?n6%W&i zyk15eX{$`6Y0%~J5T_tJGcQ{VFBU&9LoUxCjdas;W=$x}&d)_Dc?HBeTI)cnvn5oN zxlcX!QF#IvN{?&2V*DM&Tn!kHvCVu3I-1Go6t&c?yC%a^ z3P#m=s=UJ73{H$L>M;bl;*Z`wtcxSi;%T@vJUkhI-yJ*t@sF+B5NJHq1Sg#aT{=WN*1==c_^EhpFfg0XW^nUweaO4zD&Z52^AS)7T6{~mydvO zRv=JXnw_1Vg=tpuAl}p2Y^&qBg)Ne(BeILsk4r>J>W|D%#(i3IVnlw?SCOf+b zjU=$GO`4iLb7nM(Nf+OB*G&^3OcW|Q9ci2)o6U|1KxDQb&h8Fm{%QrxfmTp3#9&{g zeKA(t1gy9Tp#69SO8M}xgu_vEcT1%r2vRni3TPQ~%e4?Rg;S=?rDjimMJ|z)4Gjr) z?fUp*4u{D^=Gh)?TG8d!*2Rmf>*|USl!Vw7==CFIWxRRwR;|*)iFwma*bmao1^M~S z%{Z8;2;|OYc`_+N>jpl*tPE`jP+AiRYep!k37|Zz1Q3yUN03S(*hi|=Gua`=pfgs8@K9Z~BNG3N+C6Zsn zzxrxy9N0YeXvJh4S4UwsZ!N+c^*U<_h1hSUf`=mfJ_noM?gB$L-Z z|JA4WdN%`28fNF`>rvroXb3ek$DW>>dUnCpXCIGpti?Qh8*>MOy6(z_3++}9@%P8t zPG73osn_p6ak#b%PEW)Q91dzwt4Jn=g)?S=kpe(ALv%UMZqrKmARwu|Bozxes2W<* zHW*-WKK|%%+bALm=AP=)l|uIJ-Cuw9>HdQUzuJy8xUZ{WixwfhFB}MTAaL965KWjc zA)P(i+B#)QW1|jHn|`wujkV~K>(oJ`ebM~sQ}V&%rPp6qJ||*ay*dl)=9b?+{|IW5 ztzAeh))q0DveFqd%4W=%QIsu*4%B-Ri@{_%bH;$Iw;WBLlFOt^1VTP4cF3fB(&-|D zBMpc6sx3~1%nYmmd+@cJCVxi4>MK3wW7F?9@>sC0B9MW3qd4i zBp9&uwjv;Nsn(E4IO2VMs*DU#%V(dTf-=zF0hbJtq+F<&6~ZPG_aRx=oxTkB3Wc71 zb`d0J-0P3TQAj?;QNI93J&4uu3(U%c;HU?|QB&P*4TGSyq2J~AIxK#4sXz+KAWC(U z;FHblhVR;oOjVNwiWoJd6~|&3Q#5gh7lM$DV!mluvJ|4VSebxjxMO}lI-XRZoSMh( zr>C|w>M5Myu5YQ{{qCC)rlY-b-`<^{e6jPh58pwj$W{Y3v%V{p+y1$$s-F5vdmZLJ zEz(jRn7CG&W*!ENek!9pEGQY zWEJ0Z)5@85Kl0Ems76$z;z1u^DzmP;VacjV)CBBAf{eTz2~iKEQ3UQl)tZ3;J2nE5 zLJdkxRf`w|gB0T^rqWZ>3UUaLUXUddDGMg#D#fzQSdzn%7ix+iAoJ5ykk8o)36~K^ zyfIgM9h>bLv9aVr5F!Z4Q05}A;miqb~V&w>mtKzDHl z7kPGJi^a)lKVN4d%4`bGnTYd6>?BnA5Ft!77-glSVg`c)j^|?gTf1h>4Okv>c9@5y zEFfhx5+a3!FS$C~t1#O)VYXLcw!f`ECq}jhESZ=zL!6QB6HAe0qUOs0;*s&8ba|Lm zh8CM9iw_`xUyH~g`IA`4#V!hvHV7vX@B%IS^ZnO8GifAIZ+YMMzTcgb>^bMmu4}Ko z_TFo)y;ehM`iD3k7L=CO-hPgx*JUlrS6^jRwqYc;m7n@bhUT<^Ixx3>@c4$Nn5!>? zk?+Ydp_olVW5!ONJb5geWy6ub`W8z_FeH~#r;dlndE9U>=jhRK11*4qC4AUuIjR97 z`Nl@Ch=Q!tt-E225rD00X~jr_U>D1`238FV?-Go7n@7#J1spwEguZEOZ-t>ztVe(& zjCN3!F^pb!PcIR_3L$SJ1NEal*MBNrdgr*@+)0E>O>a!N|! z^~3~6CfMTDHo!43A7=r8d;lOH0LTYmoWZFQGs52q+2|^VpE#@NB}w4+r5HU&jIdaC z?tBXjCaZQ-TwGe(h!kVlkt3z0At9H*^`KRI;q2J~1J0(1p;1vb4Q4FNCsq;XpKPo- z#fa0ffPuvy_-7R>&YiQdMs@Y>)@XSGHR#Z2sUxkdM&=U{0p~>Z7}gE67&!yG^A%Wf z)L=3Ou$t<~(m^9X6Wv$`LkDNivl81x*zapsbVi-V(Nxc^>}w#ks%vtPwSA?%6+81* zCuwgePC8X7Y4uo;>9vsjO|EDq5)l-FBlPH3kLHT315ktB_T6{i6Pbpc*+gJ{eKkz}RFqV}G+ZXA0@lv-1l5M>`c`G*# z(l+kdQ_`RVV(A)6_Q;dN0u(f(3ED6WZB+ciVkTd9*=3WaPMwl8fByU_F<}x{xF3Uq zqm#nSph8f-pEhmU2sY7X8?W~?8B91DYl0K)5FmYszrU}^49PK+r}Qi~c3_|$fP_b^ z*pLuEE%)T9^$(FJL!S}v>tP723Xr62EV(8ydU%jKDpUn_eh#2^xmDSsV zu?v<2SVo7cuz^&zTcNb07+}=WhI7A?7MumBKjAGxPf0>vd=71sRMnRWXTs$japVr0ESAkUZX&Jrv)ctiMnW& zb}pNM@kobaG=i$2x{8w-y}aNX0*wOM_fqkk^jU5No|C@+ZNPJ`&%)2jmK2m%HZ<44 z+Jg?qVeqLtS7i>;(703TpoayK?|ESM**eT9Bih@c$=6ObYXCKb=Sw4`^d1@}X(~=+ z3;x~^9>P#i0N$Cf=8;F8Ds1-){_4}6X=P2IwH{hgZvlpBO49O=e}h@&`)qh(@nGk3 zGvH-?{Siznw&5-4lSAMW{nP+MXIMFVY1*nXPo|&RyW@CMSP0v@H?3NU1nzk>7w(lu z`AO$1s%K0ZVw7MXH>c+K?tNK+WJP7IX~=j?ESC&|?qq3EezQ4p{P^)Pm{~@&wV9)a z3>gWY$TbV6Pag%c>~GeaETK`c5niI;w4Q$6M!%?m zVZl1Mcma^wJ^Wgl%$Qw#btb>Cfss+c-a0^rrk4@ubL?M53?Y*#G}IG44nri3ZO*n< zzaaxL9Yc`?=l5y})=dsrnMH3ZKse?Hx0$})jWH8O5Z^|Nv#GEQF9=Nyuxs1kkhD(n z7UIAZgA!VCNW2YwRF?Mr_djE|UG325J+w|oyGE;=tsyI2E!EI1sBLU%cXr?Fbh9#R z@{ho@;vcGGCP9ia>d9n+(@fiBo!K`gCdQ8@8BuI&YH4csumx6D*5Is3ITTZ2`>Cm} z4%;CdKsU(Ib>$hDSPI(T(`(Akn_(LOy{xUvh5B!9odGKY1Ev{0_NV#h*qB>wfv34a z8<;uWshC%;y6egauZ0T+)HXMuGd%|m!*n%lAed3$?aZ?2 z2M!z-1F9Tj3xt_h@coL<)>>dwrCuS8HZQT^oE+U$Pc}>K$2|Sw#|>)*n-A@RZVJW~ zRKL)=CYoo^T{^Mu#1>oNm@xyeF!a)DHJCl&;v00zpoPw1bU}3~=9a?T3kSEp`OYux z7tSNs%8D9n?Q1GZp>|e6GY#x0ofjlsvki?70MH`CLN(5Y2F$`(cVHH7aLw|5k=^wm z{2~RHK7m#P$vzewn6E@d(+C|TrV0Al`(%OU$H09M?4KQ87aOdJsg0{ZYBy50Y89o3^vd_tr zY3Zl@gFqw(2Kb*kc@lgxZ%lp|OYpF4@PZEmCdtsD4vHK+I2r^X6yFiPU>kb3H#WoW zy0fKS<7LK#ZNM2%i`i%hivebZMTQx?ED*1HX|yH}qcPAI*aEUEsq=WxR&lMQ*7IaR z8pj0dDuAd}&D5&)GJBom1MNFzFiAD%pd%FSOXtCY!*^}}3N8C)7q!Y#U)g5#fO){Q za*fg8X_0+O3NwLmg(WeAp`|rsNDQ?~Fq+^%2g;Xl%Yp5%Ap5i#yoe&VwF|_*)wfft zq~L*G?RAZk#9BbO%xJqoN0wQcA&h%`3kpN4yp2#7(|G$Cjb?9yM$*ETK3^euxv(HA z5?s+p>}@&Lg7qRvUw!-O-xHK;HElIe`_X7(GPY!CgiWs$0Bz>RV^tA9_m*d$efAc} z6xP~2nwkPe%!NwT+z|md3L_YG$p#&ayg&yP{5cPp5WzWEKR+*%9*!N%g_T(ARl*=m zW@Zj7ox+HjUf{>35UoqS$fJV=IPL`;hjtFrZrJ+W*O1h*8Tga6p%eF}LzE^p)Ydl0 zn)5z8->FGBg=^sY3X$4`osw| z`q*Iz+P%ogVHH`oq^jWv5j-Mj$@z(H>{zJs!oaI&(;fWi<1coXYi!#0->=L%aY(jl z{l_FFCEZ|4!YK({;x%U8cHNJ_aBWbuP5Y-m4J`lhN7<5_o1KNRkp}bJ85#LSXsZ_; z&I<^j4I}@Ojk|Y$_d1Su+jj3xQtqHjeBpbvaJ0>9@suf3CWPax^v^&0PhY&))iNzw zrbo;4Xc=E+p=CBmxl%}fhmDYJkV3ISd~rE-Mi)8X#i?2-)kZbdY&BINy~^u1)k%s1 z2?v!0kp`8;wSVgRO;t##4ydW%bAnRo=@sh0$FsKAc9l|;CN-6pnyQRmK^)sps&b05 zLroQ=rt+p&t$m~t8NraNSZz^L!Pz0z5YR|*apHTgUn6C^UQIJVO~aKo(6oN)_m8Er zQ(4>8vSzAf`O~Xo{gzcgQNB=9#j2^esz7tUsRAffp_*!znyQ*!L1U_)c4bkNBWfzx zZ6^qFXrRD;Qk77ulWMAoYN~pARori?|H*bKRGk8~hQVqLYw1;A_@rfoPh7PmS4|b7 zros^Eu8DW?m~>JUd$+Q9DyT*D1H&IF)wgP@7PYKsdIhDce0Q)_R;qf;A6TiPNB@Q{2To&t1nr~M13Q98kU}FK zF)1;Nx~J(q_2h1h&zdz<%cWF)u(0Pj6D58CSCT?mXRfq&&OT@m}O~wX2So;a*a6jfX*CnOL~Q`rP} zZvEEp7FYeoSreQzT31*Z>bD9xe(b8>eCRMz{T5QrDiqy0Qm+scp;?VyDNj)DM=Nio z9Csur(~x61&ru9|lqImgs!;TXo)>ce0l2jAk(Y`o;((iw*PA>qaVTN-DvF~|U{));61Q4tfOqYSj&{07NCL%IM~J&G_y~E! z)wfGwOO4=m8(ZS8pF6*9BZS#u4-oa5Liue=P-dZTt9g6bOt^=&Ca^En-t|vlZ{cYx z<$CNcjOHE~W9m6Z;O$KsJAj0hN3)o1D>eqK((gPG)mrA zTVDGo_5kIU{V2P>x0e4au*VD7Z2{$?GaW`?w~pYzTY*7v z_%>ptRfvBKz_cdN!lZDeRdagjBhVU#D&67Ru7iiqRUFH|M!s8+??=e@E#&(J@*Vi~ zH=n_I#Jit<{qxQqtgw2|tKL2_nP9VLr>2_s;G7%0GV_nxsJWo)@Dbtio zUDpg{Jl>2|E^}R@@ia+^aa~imljJ9rCsEfDn;xc`T1{CMj$}_qMV1LC#EOfnOj(ZP z7)O?=s#vS_2#a$VLn9+2LyeBOFb}xg^@wxuXGffeW>x67N8nMZurUAdx38yQrzEd< zyf$VpwPRn0 zkhMwXZQIhB-3uBkUUrtgZPmbvjGbT~ZrGJs(H;Vh&(M&ziZcY{GZhZ-^a7kfdEIk& z;`HJTcU_L9#mnpy_7gkdx^}aV@g`Zi51&h6g6U=UA^X8~eX0!)zx{S}wf?>L*6%)g zG^Z|ESC@12XzG{m*@nYP#x^K%e0TI{36#TphmISUbmLuj-F0KqxN(Dhw0GSFFHQrn zyA2yR?((}<4I4j{1d)RW4I4je9?WOYzAS0{f?4=193M%noB_-3y&bk%@4n-{WeZsf zPW!BIU8`X@aT$97@6_u>k7c)FqkqpW*I&<7HNUj!!@|M?%|1E>4xn{D=0Ng38*BDy zN{(srF~>ros;#lQrj&bZF0H9|@VHSp@|uZEOm{#Dmrz2GW% zDPMfm6<05Sj^&jLuD$^#e6P9Y78scLZ~VXDx?X{Q)mP!@_*I~}dc6YENA%`p*G0d* z$zF3`nui~L>M0CzASe`bAaOG2lA+S$1cwxrsmF7&C;XJuLypq>uNwZVs*?)Op-jLT zF6d9e;3KpNX?^sougmooYRLpNyVi20`Jw!U-7^j12A8`ba?WD zCKJCD%d9Q~bw}R=b>?pxsQnCNP3W(Vka3Z zcymM%)XRAYPdjHj*SM}9x{!k9|2!!e_&-Q1?(Rt|n4SFs-`XF$uFY`UZD;j@w=mFk zSy&z39B12H*Ks`62%hT28Z?~NB#=1aVrnz<_fVVOsFBCNi5%%%Ps~JbJz6= zTaP#U0g?l*>oD7gH^=Z!y-wii!wyHyA81?z4N{rD2-?iwM9}&nc$(ix@tyH7P>aQ*9^aGv{TCmiNr)vSzFxvp|{ zjyVJa=4+$tGGmG95Pa}Xz5I}(gq?L=MXm`;81-+QuwwXx)z6Ifzhy$Zg_Q%^<*dMU z5!}mJ5&qA+t}<54-;^@-qTkN3O84cS5hwq9X2jnn%H4Y5C-8w>rGsrjuP0)1m`i7aEGe|sbw>qA@Kag$#-M-_N6=b ziUejw?yKCnZ%%?5Md=OJ|Nerm|y_E1r=T9i%`feq}bt@s)UBa9Mb_6Ay zcb9N-4)nacl%PWi7oFw?f05)opCL$4kLQo1=ix574_Wn$08}FYRk!_T!UrH@U6UrtaS5>90$DD!|QciW(Gq$u<+OHZ)s`_Y5Kpx6Yq7uC!p z1JA+1^e;n2BeS5QJoNyx*!0!a0(79EeQvBO^$Qs`8$d+tZ4fH_di2^qNs&pmFxfZq}vnNcRKHL-nUK;o}37sf)70pwT&us|1;0? z)it$M71igetIl7@_G}kKXyB>;sB8!vVYVAXhC#qK%+L(Yv}QvH)V)G{1SmHMK2cDP zje-yDL7O-4I(!B?7iSLd+T7Q@Iu;4i7hxLNPEk!V&>+U`UtEDI+i<7peztoH#koKM zmw6wjI~)n;kR}|ss6P{w2N4H!i-&Ztnu1tlOX*%tcPt2`h*TI6Fx*zUg3dHl5=rx* z(t)-S=0w_3#AdSeB6zX{!9a$1kIAfcMYz z3<+&#{eCaJ2SloP8iO_kM~W<@E1rr_z7cT{))P8qf~Y%i`oNLzcE2lRWXu9X`F32l zSZ5(ztHddSHfmn^kC{11$^zv%WxnT};vEt6zvI(ScQE0JMTzWFc1Y`UZq{A#aY@(` z!UntN0pBsD^e;w7i%?zT#YozgiiR3vp^ZIB7`)cnS$tb{V~wG;LRVPmWio-&&3m8l z<)Yq)ER}lU848652u6D-=qkm&cr@>zDEla=>bSelg<~X@aZ9sE;zsk9WY0gHB||kH zr+}o9)3+XS-@p0!jgc}7v#~H)vKPQwF4Sr;7fKeNkU-bHT6cG@ZVOC2*Nq#$ST9RN zOl8SG>ea7hiD;*cW5w`Z%AS-ZqL#AMo_)qCOGG1OsU&uGCEkECs^hNLe82wY^UvM+ zY6iUYt~=im{)u2!eBjP^$h?K|?tEvKYUgy#HwaJwcantxSNs75e?UQ40Z%;7XslmS z_IlSGuuT?rpGs5`l|M+$173Jp*1O0*nsNIBiC7+G3X@UnCib1IcM<<)S#KIO$!o~G ztA@&Y7wNB-^*0V5vox%vxIDQ%agJ z`nYiPec{+JxReov$&-bsfkNC+p`wc8O(@cjkJR8FHu}((;gNzT)bs>slEP#s2(?E} zZca{KK_1RlE#4J~dEngC3i_!}h&coDK161}@T+^eyq$T3kL?CSduId#i6BS}Hq)YI%s#*Z`svNu> z0&6HPXw%7cI!6)=Xm^}khelmKOv_;^z`8~O_OCQTOS(e1iWuy`#8!`41+~WG zhj6?TGklOpCc`dhbg~h`n1Uj^9S2sBUcks$2_we7K5);76SwYH%&GyNsiVA8Q_TwE zDr0G}7$Ls}6_)>jm|bTXS4JOo&9alm^rRQA*mjCNu4@u2Q3rQyD?3ELU2g*%-R}uw ztq_Nz{+Ro^&y?Nk(@beQ0|Px$Kyv5aRz3j8;}j}>#;I@{6ZxFbl*u4aTBJ0uO zeqx@a=sXR;t-@v|Fyp~U4gMvZ(iibB41{$7`f#0WU@5G+(a6M~L|=k9z@C+VCO<0^ z9-+zlA9o6Uh72szS;&lxt)!~wNum!N2p2GTMa5=v;$D()R2NF%apT6Fy!FN#Pn@{q z{V%?N+;Qu+pAOLH=RG?&e~nXL8^77~eG!&1~!dnvFednavG5&!E{%gF$eCi#U#jRgIde`>tQ>Xqo zG(P^?Yj3~(=EaL}yyA*$Zd`gB4AVaF;QhDXJPYUhC(c^>yr7s%(MaQoOQ3~ai1-*qY{x1NU)WpH7iohan?ab`-oOo|?|nYsgc&(OxrahV z_Y6vX*i^b^XLpUeX*!ALVUG!Ac)?K*%BVmYr|EeUc1HMWgkGImV%PN}t?Jw}$rQWb z%>*S!Sipn>fx=!Uq`fcH0AGrQG8Om3&{mp5CPqq_6Gi+B79_z(r_<9H%tULvVO|>! ztMVYE%rCI#=ly{7LJCuonUKte?BBoda9T!A0nDcqWS>eqb^xx9cJI#3h1JlLhttwe z=jI+dbodxd>BIWot31&YyZh`@-Y4kHr^<0erkIKEBbN zKdJ4U9Ld-XOv9EiiA_U0rvcM^eK4ugXck~jlfJMQ@qyjb9Qc`l_|>k_G{YlMs?8f# zAv`q!?NU`+BRn>>fs^>vJZGvi6Qac1l;z6J%2mpAWw;V)o3BLTdpe$P#{0XK$%^Dm zbN*Ouc@VJSy zX3c`{r2}bc4pCAZttaIOw5F)I=-93wFkw;C?4(EV!>$9Ti;9Xt4U>c0+S}?bV0I_x z8gxp^>}#_4cz~kF5#AOrzqCT%@na?>499^5e1<1X8Z$1UH7m^zb5?S&^rsIXVq z7xoK#_`L$K{nLv4dV{?`hke`khX8xOKpbPFeygvl?hbq6dV~V+qk#A1%On_hZ_2V~ zWx)7+dIpL&z(x>AFXkm#axlkd3CaMFsR8UWnSNQgXV28Bn*p6xTTtoEIEcz7Ca}#bT-7!WWm)fqguGXF>#b$7H`TqovK;HU zqH?uJY5+NG6<}dktH|Eeir~;-EbIJ&EfzGz+#|;Sm+f(n+Z(#mOqFE1X(m=gKKA0` zOn96kva)mM@#128suh;Tn(G_es-*S+ji*VYv02%*^CA5h!P?mYP`lOaBlb1>i9u7y zHjhD12=`y(-D>tOD-?zb3GA8`R`wNfW>@8Lfw{xm6o@1jqv=6xyrpzb-GiTkC+k4lPRE> z!6#c`C0lghWDsa2DCWet;ZjSZq8SNNni65p$<3{3k;J?_Y88F*@&iO@8PVOBKwS#2hv*H944 z6qAeWX7S8iWLK9$uE{JGjSgpLBjG_%rN%myGe|UYFlgk6t~8R!RVh%i5ag~8LAF(*utlPpCI#>shoQ*LQgN1#J@@z6Yl%OmC;a|WG z5p5T<7}eOS@1&AMma}LafGlU`QK3YZVJ5GGN}6;Av;hY^4RAi~#i?ZX7#&oy&lV8@ zE-&hue69Jn#|n(T4bgcnfq!HSr}Z5 zKKdj2XcF)S8!{FFGxzwwMO<#?i6cio`wD(t_WX$Z!(gXCAv+9fWZdo9zUjn~eW|HM z<$L$0Zr$|B-#_1iA7q%kYiyk7{M30+iB_IaUQq5+{s8^b@yZC(;i%*_FTM8W-~PH9 z^zB)?tf+ai=kn#tAG!OFH!Z#6zaBp|d^S7C>FFD6t#J3BW`Rr9AdC~PNU_br>z^1j z^)z??;elmvZ}b5>!-|E#EeR|||EERcCf;@DLr;^_BV1N&kVpoUr2LsK-Scm}e&Eo0 zp!A=G%gU3KP^iQ%)vjCp(mQXgOj4GC4o{Qi5J9QRDQbj)FmZ4cXq$&uQ!9f-FCC0; zCc__&!>KjFjfyDdXW^`|!DC=dxVI>z*uwVh`*3?*sDIqp2uZ3eg{3loOZ1>nZy4P{ z>u^{!n6{gFd9~-7G*Wnwv%TneW>qPRTXgdbm6t$$a25LCdh`KV*rWA*#1YuzKX!2U zuI!9shYnTO!eQG_yT18iJ2*T?j=1_@_mi4TseAX97p11|J91*v_C4qq^nuqQ zoNSyqY0U7!aib>8c&{Omy~5UNmfwE;C6^~*l4=%0G=~lyLhWp`ge!z`tbuJ3{&e?j ztlHn;GuuJW;in$|uRE6B^vAm&LFcUS3VZFf*WO#d<-6jtgCD$pr#1-+j{vRi^N%(5-|)gp9SsWX#nRk?aDXad1>{!BxNZ;9V(Px2GHwL)*m|X`Wu+zc&Dt0 zfXT!1igUG1_TtJ57k>E}7DgJHJ$$9})ldrt&}~72=p7z2(8GX@c2++8b~M+SV1>Zp zSP_v5r)C>JdFS14)^FLfJ1b+?t`A>)ZT%;|=ptHMQ_-%F88dEP6vs-dGLILvJA=X{ zP1CvBygb_YyXGku%on?0P9B~kIB<__|KginKOH=Jw6^-tp<@}@yLKNuhQ0vIlLL@k zF?z#ipTLnoGI@tbg?O%%0L(*4LI`Vysr$<>x&HR$#5;e*yWzbV6Gp`i9zJH$O!Nmw z_0_9azxd|+AAj)ntLuiJnhh|{gue4V$`itWubQP?p?E;(v?)ah3*#Wwz54d%A2xja zIROkH_txI|`UeNgioe^k{yp>up*Y)%upHPfwljpM-)##<;($TX zUcN?WdvS#*hL0W^5W+Gxe6-uWmvYe>vVsV21}dJDGtk3uxc1|o!^e+*_1TdlxUalW zz$p-5E(dsqM1^~sU~>W(0EZhj-bOOfxPmphNQlX{`mcX`^R<`OBu5>dr;GrhxeNs7 zJ`kQKlxXKc=cnYijH9}96SPG=lq-Z)|2-Q&-UG_!8out;w?Fv!{Wo7k=d8e9 zfm0Cu(+}Nw*Tiv){sihGYza()3c(rnf#%U=5B%ZoSzsWpB5DK~1IW@|T&vj{?VsR%bYE#FyB38$os04A{EH1TR3ApoK`(aYUd&Os7ac3{IbBxb%f%DyhfLao!zloz9fx}Nbkbx=vcX@k6>x>tzB02oh*=ec|5I`x^2Vxf}Srddn`IT zSR;IU9?+FF(z(n}4(hfN?c|t<^7x^aA@N;z?R@=@btp`4HP?4rqjqpo;<326q=E(c zx%TtKOVOBJ>r+2?pRc|&VVEyG&sEc&!P!uK9=@7}C0ttVq6`1Q%+>$FOmzeL{}^VD z#EdlsG;JG-u>nVZ*Ccf&2)koUL^x*jL-ONY2#dr+{m5cQwoSry~ zZBR~w3ABMtl>OAbO%FCu$9_PtGU8!%VF?Kn56)7Sz_rHlBEaAA@ z{CUDeVIa%GIVmf9n|%tEk0Vg_n$I%vy&cbQWeyy>PnU`wvSFRSn^3rnDH<7E@A2J0MUu(A-#sRxv&l}CgZ zUP@AKQi8xrNCGP%NV!RP>4mwfjFs5}#2n1I`jGIa9nU2gcBY#iCvfysENQPNS z!@@m=OolvujH?Cju+) z&@95z1AX>7TWP#`tdC(}?AR%+4c0POuZD0m+%``MSB607wE%tcICia}&Qs1^nlI4T zU(9pvavp=YcRX~h9>>oM5N(KT8@PCJdHKT+KYaW3H;jsn9zL4g7_TfIGI;o?k%JYb zzML(#K{*%lXmrjsw#C9V!Ys&*53-|BJI-V0p!jXZJ|UT1gRzz^m?7+RLNliTzaB*_ zMVKW=5pl@RhrLvL=EGrJzIaiBpWuwgMVIMO<9`jkOK{AvoO%ot+vfAH?BCJ!GO=pPot z7OJ@jwqQXBA2Td^uqJ(PM6eJNvG?#=U@#G|(<1Dt0d9Nmy&7{P8FIwXGds3A6OJ+{&1^|t6CqejOM8G0idu|yaXKWOmi z#W&mmJbCzz8y1fqJSct)2IJ3sSy ziEIoTJv1s-O4}12CWMdbLzXUXfX8At%EokVRx=xQ!4qJW7Hp>cMqLoupY6FnRpsk_$awt% zlw;p~^UX0Opsp@p=#-f=XHFR!(5KAZ3W=gBc3WXjXJU+hY&uneL`W`E)>dlodSG+D3l_5zUfp2_!>!Ywjy_A-|B!i0N-u) zl;{)g*nm6Fx^QPH;Z82J=uYk1zMTe0ZeCFt#&KB@6i4#%bI3nx9wa;XY~TJ1;^pQ7 zcdW3suCh65+6YrL8c|V_{eeE@Vg&x}+hOEUWr%222<=zShsskN_5gdaAX@>>^?Dr2 zJi&7Pjuy1R@Mv4X(UT{S?s{+S+O_ZPIy#T#;i7MLoc9T8s_~DnlbM474 zr15#<=e&j(ELA$#8W2dXOc_-KtT@}I(-st9ZB>|i26p?-f4<`0bk#OknE41Z9|_j0(hs)(%aAbs(C|o=WDBqn*IEIeT~WCP-KMV z@bFNwz8Mkf=hs|RReR2oaFw^8ACSiC+f9f`h~jAFxjR~&s!eNEs@Wl3(*kE;85vin z4kU5iU{(%FJkZs|tqn^aRqpkl*#8?~BKFdk=)_)o^7q93ci@N~_}5jdPt_iVX{6yC z_gEFapz!X2FPMJ!QC~KwYwSML`l-=K0U2o<)U@Z+mmdE_TG!gX&vN6`BD&YvSAE&2 zmg|f5`eL*Np^tnq@_a#~_4YG4_=9;&Em`o_=w-eCkLA8Q%3*s_J1p(f6GLy5^%)OD zXWko)H^O)Ga1c(Iw>d$1MAqBOit&dtMcQ^rFSWJEdP@*o2>C#{=O{6ZQH2#Jo0kXJTkVadCYzgd8AMtg~e(f zzW%?GN3NYFz?GUGYk!38)s@oi!M7ui=kcb{AgHGkq$p_MZr*nT6jt@C`r}E0soMchgpp!+wB}s`=GT2%e62mfU zS%MP8mdPUEl)&1>+0S!mC9~uNXelNGDT)iL3eTX?$)dx<0hI9f4f8dk@#?c$dn%cH z#t|lVmYkP!s*E}VF&!Q#Ib&O*5(N{o)G^7z>eUIX0_Dzrn96-#?WJVl>8D|r3dI%{ zSDm5$LbY`bDAw0M%t-yFKJ)&kbD;hxmHbA~IZ$Y|GCkm4SeQ=hR-w_9Lg1e;Awkht z0l?%$Wi&gQqCr;_7bgfYR_c%BM0QjeouWstUzWpDK^?B5~>v#T=DI^j#ABJ2)PHSBu3v?M0=h zOQ~Sd#2V33i(jBVkV@vyyrl%+VUZdZ6RE-%R?7`~rkA+(x*i6GFVvo|v0EXJ#PW*y z(~At)eb2aH9655NG4iMHMnDNG**tYxkWvh962(f;v@>T`Fxd-!R!kb!2H9VmePBe1 zoNV^+^o1>M*ry8e_4M#qfpd?|&2SNN!OGR*lXY6P)MU{qDEt++#prVlYN$aUXy}9s z3lQw7HvVskgi{V+B>DC8M++=y0W|ONFL;@mKk+bJf07v+`I6F-VtY<@R(4LR)zbkV zks7T|iwd^FfVn@cYXf#xE3*n#MmHKM0Pm#ob-|BIk0V45Jgu4!a!}K%`7pD^;^|@X z@U-{`1P1s=_V~4zR%kD31=&?Ip%o^yg6#6arlAIF9q?i7rCF&~(E-(LK`RQ&Rtu|_ z@w?=wg{PAxdsZoa)xiV3#S|FH?>JN@BER8GgMSHpY7zg?j_3O?HORB)7J-uipcKKn zGCtXuc~?R;+Z&6#)^>?DVp@&V-s+Io_&8a+G;Z0lWlxTi+K)g;`}`4^N2R+izdX;Q zUb^G;ls4<2%0o*zrVm8`d9944`V$ppZ7GGH7Fn8Y%{ z&lj!{xEeQ|&rts~zPx5G2$gX7K)|lZ9;gO~464MKbbQjJ9W++ z%P3VBV5ndc_U=tou2rt(2`>VdS|=BvvN@PgCqagHL>&hZ`i%K@1&ap>qxZ-772-vG-apOq=#U0}G-sH1=ra*hy*l7-evo+E|Zs zu&V^$nC^6k)>lM#0)b6*(gSNk&=YVpwEO@-Y6|G6BxrH`N7OgMM-2SYRIXz1OMs8X zb>S8h&nvD3P~@{%BGo+%t-wh4IuvzsufU9im*w_MVh^R@L_3Z_QthBoq|_@5M5<;A zjFN)*FP0@LCP}#s1a!A(K_MyJhynXX=DB1dAD&Ay3p%}$3}@gyRUELDvQwDO6d_qp{Diqch<`Uiu!x`cYXb>_0PMXQF~c@ zi9M7ezQ7(y!QK5S;)}S`abSI5Nno;$8s+=3FK)f~+xINbb-uEqm9qE%docyU3l!k) ze)dX=TIXzg39oZ6-@MMy3Q2+c->yLv0mkBCAy=2Zegj}~k2L&I9b@wWzoo#C2Y?~- z0l)c7h#ACu_^gDpVDwEN{?+Y%5Dpa<7J#dh2gVNPpwThI?)RxyBX;7HSb+~Jqo61P z46)(MX6n3W?5~00^Kd$5UN|e>`u5vzZ!I1*>cols*r;6DBPupOmp=`{lN2>5KUaRy z`^~qu6tgg%B#aerc}w=d`=~J|PK=3-%FdTPV)L{46Vl`ZO{hE_)&_JUD>+zUbveh6 zAIqs@p3$R6kB;`NuJ-dY*VUM1kD5BOnV#S>*ISklc%!h9qoU2ME*CBWa_g8mdX(&e z_jQO>U5Ds+GMimbh&~7`MS=&142K4toy1L-djJK@9{@xFU~EPX4-O5Rsq>xwRROY507-2ynd?^oPz} zEdpE@f&L5w)aWmtn8{#a74hfd;*!d9RaivWi|tvbGqcWQk@Qy9(2x+50|liW&T|9? z5tXCGA;EW*L8I3RHc@f5Vc#p*BmrkFlO^Ih)1&XT_x<_drE{b`>)E2oExSH@CFSKW zWOr_QcWxlFhV{E!$1k|=>HDuwV4oPSfAFb$7ENP&*Y}pE@Y!FW9N_utw+E$}i`i#C zI3{0f-&2 z$3-iD+JVJ^dPIVHxOTXD9m83Cl7?W9Tx!SqU)!pP&~IUDlEA@UCQJ}7Wm}V+KP#)D zIQ=|JNpLoaXYRTyLAXr3>#j3+lA#Xy&2ei18<+qhJ$8}&yk^`3J{cL%0+uo|d>)W> z;AUjmOOdlyfE`n&vv_)$EZ9M~p4C1Kh*bCev@Z>ag#W}y0os#PHQ27VXC6yS12g_> zn`B^+FOvzP*~+!f&z;%IG3VzAY(4f=>OVUPak?-b=FS2Hy=vp0?A$NJd2V|-oa2G% ze8MI*GpGz;Rl~3riHe8-uXs%7OAhxyz-l63H3_hC+2Jwage}d2blTcTRmx32lb!js z5mf@dw`mN_1A8foK~t<~o#(D0j{e*M4S==u?5-!irA41DS_FgI)^5odtO&Upzz(r5 zgg;DA#B$K1h(#c4qY0+47(9ajrM(UA z4ts#^k~AAU1h$C~L?xRA%p-UMDO6jVhRsT1R14}EsBHjG zG0*UN(*vHU?{LfUlVVYw={4Pf2|y`Dab|H9{B9S=K)YrLxKfZ_TKalMdNAGQ%sngnFk^_hJgW=2m z2!hBF6Mp{r4);Pjcw%62$SktAPjwqUPIH!-_-oe?k2sjzG?SS{+0SdA{3e)6kbrj z#TQb)OHdvb{8MI%g6Dv^ORrwEVZ-)}2G)?_HV6brsOA#DY2Fswd+I%sq5N3vM~9^nmy zY8p)&n~GVOHitg`{+Nm}7hAk=;bS&?diwkO;gmW=YyQ~jL&WB5_VmKfW}36TJi&PS z$IDg69PK)Z@7ay-pMy5piQB5h3?%9dvVH?|wk>o*dq=YfZ$K?SlJz&U_$AJGC{{qU z4QmPMq=YqJ))xazcH*{bG08X`FmvON23Tm@>wd#2JDs14M9Fm4*nNJ^gPfLilrC$h zP8>gR>U0?f!=28KDzJxb3=63p;{EsDpU8Fy*fuzwH{aZ)IuApF`f%4uc|bx=wNfi4 zYm3S%%8CkP586t0)K1psp=0xMTzlbOA%i(o6$-eUqF>nNWE(hSw%|b9mIUPvS?^pj zlHEL#Aj4L}*GxPqC2isCZ_Mrl88=wL09Pdl?l&AVcLOr_0W$XiGWUWG-ivh7YrR-4Z$kBt%&F9mgn=oR;sNqrdJ`*QSyd>5yd)u~cS(M0{%DlZThNjB1=g*(J zpoxI5=#fLBLIgNBZV?4v-vI+6ybm2}ix@L}*w9!XX9b+WjR}XoPkt6UJQuoFWX+^V z2^=%!%(24-N(A|OJ$?H0$i^i zGlOdYN%5<%zi^?V>5@x~wK?{Z(uzhy*d<(-AD}ZB;TGHIWe6k_Ax4u@4KJ)MqORQp zhpExg(Xkj>_#rUZOu}w62OivLH@37iH-p#O)C?4?%(CZHf+bj6&)~Zk>+9Cm3(X81 z)5hkO`c`>7jarMPglw1;7FL%-Go`Nn{Mq`mO_Gr{R1^`Lv!t{jtE>V)l%K3Rot>Rs z%p%cC^>AWZWhaXnMP=mLv_)z&Fq|B6w&tO9_!}-QZEOI!&`a(0=So$H9jzk6F2t-N8)7w);q_+tU zstKkEnntX;wlS4kVdX^&eZXZXkJ$w0R+}JRy2`3nAhEMDDLURD1`yuGuGh0MNd`SRs=&JK~KQ8}4Ixrd=;e>Iowd-D5PhnYM9`?8Rl$I3cXXWIk>RO!e>B=0KSHK$=+8kgn z2Kjnf{0Z>_1AM(rp61AlBdO3C2m{_l0-F-Z>-uOq zb^EQto*0?e#ntlsto&3o+vI9?OFJBdc4@P>$vd*g&uW`P(B?5{^E9+M1Z@ssuzIEe zCP)zWP#Zk3U(CV22>gYtRGWm&j>9JDof2bfy~=jJy#`&s3tc}4U7rGlqvP@#uVu^b zm>tZ@ckyoDS-ygrTc0RQ3Tn?8$1AWkUn(AT^kwrpA0>oth=^wY`7?CFT)qKK!9 zl4Z5HqO7cGdPhg;rhc^gcif8v& zztX1c{L+F_6oR6PvUnlX6toB=nd#6b{DUP8q_v6BRf7eK0AYm z%rZGef3JB>$r|&$C9~NYWe>da>|qp(nt~QVF2f+nQrlEgkd>bW5CV|7rMx(53R(mK z4CueBO#wb8Z<9}ecc58s4&-g>9*ehWkgK0YqMrt#p9Z0yU^}R=Fsr;gtJI!T2qsP; z4s?>hNyl5nJIQC(E(nVWMF}mBE_z zx?~-EdJP8lB`EQTO}#}ev^YThFGfT7V#d%A11MRu=9hGM|Ta(P~Y{1Pk-3Fwy!KAa7^CJ}SV*D%|)Myd`8sa~o6 zq=5YfY={J_&Zg!?yL^)QleR(kT|VDs7_;r!xdfz~oksBMA@?EyjPV#d*1k^s3tP9& zcm>a|tK^&>RVF7R9T5Qq{ov24SbA<^)3abzv z5gwzHXy^=t;Ez?2ltNpHEY(bTZ09Q&2%N(H1nsQW=`F=Z>rqc-$^iAu#z=cXR#D~r@#mV zM%bcaxVERfI-?s(Htw_wyQyhq(gXez?v8EA){>ekAj zi2$anFly9F$yKLKjOs)6g6Yf`UtF0;RRBa&Y$hQ0jyZF7yocJz`fM($q`GLK#(=E! z9+*b4K0;kwZ+KmZ>I?v8g#(zqQ5}2s>D;XR%-pQ4KyR&}7noDSxO>Ap#b4g2MxO}3 zya6wGMs2$G*hGOHpTvZdm%z82E@WZ#@{omhOE0n)Ye0N7)ok=;X0(@J4^U8ERC*A! zrd4TCnAiq3VL*sqpii)0;IJ-le^dRk?e6+n4e%-;!Y(Uh9-DwHJ?b~0x_Vo5ZOwK} zJC~g7Qa{431;=TGti@p%P)K+EtnmJ-fvgct28DFjughC2+066+{EX;F56}f;BxK<_ zD3NF&VZqcbaUAerEb^h5ac-pGW8wK= z6(tetk5-yCFXZWjsT*WWD|qB)Gow53h;c(ZF{i~lgvJqmqksDH4w!P|BhNf?nHmmfc$iS)s!UZ{_^W!B(r406MvW%$g1}KeXYx?f?@67_g1pNX@7VEXHQ)`hzLN3xZk4z zod`fDg6u8A03n}*&_-&!m}25k(WsIX(FVD!p&e2%R8nbYGJ)Nx&=Ct~P}#(1o_Xfk ziDf|tQ8D?TY-QpK7&P{l<>W&lWfSn@GZV@}4x#w9NapQxK8H93Ip=+1v7w(4+Yuj6 zv3}KA#7D@g_KTe^rb9zf)`6%7Ww-a6>>r3I+Tz1b3uM)_V#+il?KXjRG?TtqA%~VWcQt6ckc0 zk%Bk`eW#c}QQ9dmP~b}erR_U~mZCT*;CB|fE9y4|kD{S?0tJy2)c2c$HdH1-$Hlc6!c$4EJg9Bpn`%h3Q7?4-SSBkWgrDj6kMR-FoM2Q@TT&DexS(F z6l8ZvLD<$EOORp(A~jGN^ET ziUAb4i~^1_$NNpeqwo|Nl%kn}{zo8rzte3`mPlR&M=C+fdc;M z*>4JtdJc+A;|@-15Geho;3V(@#Y?9kih}%pQ^Zr0p%k2^po2p6-42oBas2z4?g-I2 z#qK)=uNCj}{S=uafBz$j_xWUs%*)WzUH{{p!-{tbwO1YNcHH${D_#cg!QGT%I0Zzp zewH#azmnkBSfIj%PsF*>@R@6fcT`zf-`85jDT> z6dY~&Sk0pp{IS-RLW6Y-X{UD4Po)KPB(^I7SX|ez5x6gefoF$0L+K(rYyVp3vP0v)uDqpQ$L`5TvT(sVEQF)pw_I&xU%eNwrw1VdsyZIlT^* zS5UEb>|51!z*$#&h)r@SFj@b_aH(LfspTCTen`YAmZ`dCCt7p?XE{b=PI z+GD-%H)X#=*K^J9r*j-0-*ep`7@)44v5@Yz_LtUQRd2Xx10Z=cT)DB^E+D1nEMszyG zi#mfzzl<31%Nv0l^3U-77CYOq^*Jj`Lr=6xYN;)s<5_m5WMT5En?R$eJQQF_JOY3tS zfvkhMAYi0cV2EH!Mp*S5#t~xDI4Zbk9MRaLm8-7X{syE2E7t_&Pt@6*j?lF0raZql z{>A&JXv&vQ2I+LiS7m2t_Yh`@4 z-R-JVpZzfyu-C%mhmJ*~CooPBR`%?V?k(YK$?4SWl@#zt3f$1W7+MC3XQF`C#OlsN z({BpCjHE>fE2e-iQTm^mc^B}RnPv>NjOKpJ;MqGVGEc_afr+4>c7W_#8C6_ev~s*U z)^7^l3A~^tN`_8SGw2&uJbNCbQDnX*AsW_qiWrK=0oFoy|AO7-#n^~NA)(h%Du5Hv z`u=eQ!`#Z|P>@N%2nyUYpL@3Kj#Yf?M;!(?kq9{1F2P;j?dHoI-tI$`g0Fx2Uxo5& zoTJDWDBwlb^;-t-Kfdbu{ku&JBiB%OuVH#`IbiE*G+*^xLXQN$zFW=_FNES1QNSPj zhwguNoB#jpHh-Z$=cI_1%6(%ACz>45Gdi#&x8D?;l1!q=G?%F(>U_T`I1+OFqnSqK z#PvU-c=nvC?WYu;6wnChyB(aCOs050Q^0o~{g3l86ps&GzT2cG{K`I?m+?>UHd|0o z-|gT{<#g>;st|_(rr&;2aKK6w`CSV5V?e(te*bQhH=5UlLzfsze3tIJ9eg(DG?DlD zNJ>G(x9=4HW4q00s>_EI#8IH@w^kgSG=!L)0{%$Dh1#LPs_y0`BZQxf?;Cj|x%>&+dYr|BoUC1uwX}J3H4rc8ydETZ*dIekB=ap~ zzd+W~F0wBGOH+34oYFgNwX|RC3$A?YxE8WRZ!W58Z$qs}z9MxyxrAw zS6lu^)A7;P=k5e#`9HfwH(~0;%Zu0Nh{G4?z3(nB-jPv!l?#HUW)IreXK!G#Vtwuv z^}zj})`6^|4-8|#(cXF0##h&}X*c3J!OqA<;ckj%#OQUw zNtEEU8n5*5^4vWo`AF`-`ZB;;&x&N`i~HVE5-XEx^)tmKO?rGqswrF8HhKzTxAdE~RR!rOmQ1lnK?xdP zTK1#*HR4y&ZlP#paB+&SiR?i&5r2aAUB7AD;e`f?&a;o`YZQBqz9iU=;$H;5zS~>J zKA~tW@NJ5(scboYnc;mMU+pXuUwx--WiL^*GWI%sO=VBemsa%%DX`1?O`FGFq1d_5 z8^hOV_7r^$V_x(Xf|GikCXKoP3oM`ZF_qnb@WH>aX74P_#NI z_uy-U+D~Q>UOZ`8k}K_4jKi@Q4`YFqV=)Jf1%3qP=48X%U1nx3%$#sju6Z~~aQciK z7#C!c)s>M<4=DGZwV@I!Lojy)x?OIT0x^#VR<WR$4f$KH~~wsSl$;m;|uoMebWhA)I=&O)m&if_yFEPe(mW~u!h#CBUSo;pZsH&|0`=)0m z$xJ4_GLS$*=!hU7m_kudRK&V#!?vz%MP0jQW`bZZpRNlQiinDZj`ZGpOK+3jd!5W= z-v4*rok_t&_WSlf5Ar6HIrp7=&bjBFcJGx1@7j9+`w1V~xq0*6y}Ph*<#KlR`7>DE zf{uhVH8s@MG}P5Ki3&wsbwfjOR{FVf>3PL$*uLf&Pd{|`a9IHk#m#P0hJ={#8W~l+ zR~EBi!Gai>4ZC*QfVuK~y`uK`*Gbsw6_@W9JMwVaM`d1K_PJBGv&)mjH`ofcLi5}$ zBODILh+CdZU@NSN>>RTw=H7JEO*m8Y6BHU}OV<|miRPhOZ+(eguP3sV?40V!o3Nnd zrYC3Mbj}UZ^==B$T6ww5KjAiP-GuTVX3^iDI20Wp|JY-aj~+Q<_|Rd)hhw+hb~_57?d>fUTvD{)tLHp=4fv`t0X>vK zr3kwqEfdU(6UDp55h#EB7AgVSJDdhF?tyHidldioElh#TUkBNm4cYS8qM>{C?js30 zcyQ02{rh)q-MV$h?jzWz^U!{v^{P3f0~-T4I-RKD>H;0B8nIP?(~hlD?bfi>tIi5! z^~oKMimW}KfByNwQtv6rx5lQk%jS^WvBvzbI@uTNUokQ%Uxk;k zt9`KbT-f+))R&K5z$+`O))A7Bkl`<{3?Qa+Q*G!AAR}Z$Nurc3vVZ}Z|G9L zaO()v&W(Q{3AJj=**+7b_do^)z!6vZe31$wI1uIL}ytw?F8ZK>g)i5 z-afuqPJx%Vx1h#RItm{mmcLO?bi&u$+a$4YLQChBS2Z;?VQ@8ea5_;YGZ}QE^&~Nz zPJY-MkH5N=n10XxLlCtiySHxLzkkocgL^?KgGQs0%T(BjA}}mWfdi9)$?EjjTa%}F zmmY+S?a8WeI7sO9!r4_I6?>e{MZ$*n>IcSyJ|k|$5+R9TUT?qf!ap8+_~l2(8bPZE z{IWqH?Vtn@D0xtQem?qxJ(kBj09w(JR!;{lJDT1O3Kbvw8PwWdU43cQyK7dxzr<>2 zZK|i!soJ`_nwnZ08d|CiSZvni>cnOd)n#Q)Xb+&M)6j_sa&Ijtq%#EQX!|J~_UxsV zh}F?pT~h%HRh46rY_1by$=TV~j>QpN=id!#EeEwe0JUa-T2GmT!KN#z|!>fV;F6!B$gq44YY>=kT``zD0$kK~PIcTe7vwKb?<_<*ye* zUDb4n0peKcRIvGUs+x2?j!ox>x;jD!W>5lj+JG$5_OR$b;$kB9)L$=u1sks2$bMvd zSUxImaj`mCd1?GYLa-QFr_*04 zB`VXEQgY?*j9p`j48vl|kimoE;^It0hnq~{^ooeW$#MgU(@68Uj)BB!z(2U<%(LUA z$HO2$0h;1fvUtoGOIU4(d!m`Wj$5@E$q+NdmyPbRb@Z4$u(qw+*73|lC$*bVIst3m4;EAge$n7_Q4jmvjB>mbxv>eJpqb71(>7aswRyOwO?~e+NA#ReaV;Y?Ndr7m~Ja}ib%oAZs|DrkrINizSZ1$=p+}FkMaRqQ1KSd@fKn|EqL=5 z>i>flWV{9H6r2d&A>crr!HqiN#sS(?vO+ZAAvR9Lf5{3F&_ECqbjt)xaDE^$R)`4t zdLfqyP2R!`jz7U_OnfC1!MZINA+P`h00oA!BFSRe&mzo=1!acNN}pC?H9YrVJkO@A zeD7xi9?u?Agl7xeBIwD0#gnU?o+o=K*IRBm?dv7lkK&<(-&iztw}tz1Wvs^2>jB|~ zy%PLf4*v<(VFBL74$@7<;yv&KVeZ;Xn1?hF<{2`=TsTOWd&PS&_ei%6eeRKNLnH>9 zTe>@LV0mUqy5+0BVXPei>7c>q8Z$b zXyOVf`~xi`IXs~Q2toxnLIXEK;R*@5l8XQbEpEsoT6`BmwD7SLEwp!dXfYt>LE9wE zZ(z;ztd;!c#iK+Ta>e_OpFd#kXOrNEb1rV;0i`-71(a+QP`V1dcDn>G@-V|`?zy+| z=!uKya20rg!%yV!8#%m-!?*Ro4 z9-RYV^gBM2`n`8F`VDvQq?zig1&y&+Y`Qfa_mOBe*USsBC`slRaaXG=9(61;jy&-Jt0hrL$)t z7Koz0)D+=gf3>1wIWDGpI zrB@kw07qXYOY&3vG*Lm7FUe1ohYACZy!IcYC*Q`Tz~l}dnAGsVWG4kCdwAgSU3*gz z;CS+FLy3wz2Gf%@S@h)2P|uS+H0-PYRQ?#;Zv9s}5@80e|2A%BL3m60Pg{fG%k|&L ze1vEJ1N|4lwLmMH1KrM|Dcnl97AQj#R~yB_9KM0WpWyJ796skifcNL{)EzvSx`G>Z z12^izRcHxt&~juh(QICmp_|BOPaPZP>G6P153iJ@ZzvCK z@8Nf!qo?2fOP`h&m%2wVc7Z#}N3eYF zLqLF!VfiK?!N;(p42b-34126VFOMd)9hdqNECt&W#5YoSZ}O#ZJ2pK}p@92U^nil5 zF@y)~kMI^8JYXNu13!=)=#CRTOoxdcCnS2bY$tjcAN+HA=oFZ$-1IQf!zGO-KS2m^ zdbAJ{oE}C(q=z2;O9p+JBqNIVO@;?1m zb9f{UJaikV-*&0r(Ne!Zk@~Hb`mO5j_kfU_h+@%3qSz;yL^18Zh+?XdSEX1a$9WpZ zc?{>(?;PjmKjM6)6(RQWdjj2lk5Te_it4X?wr9+%J!9T&eVt(+K+Xj6+m4dJY56=} zMYq0^_Jzh))DQB>aLDI_Zp8g zGd+D2o}Nbd>$%NeL(b#X@aHXvyal7Dg<#%7$$!v-n}#;FiE#KYXc){}_&?JycoWeO zzOO_>e~E_0SEpeBpFxMgp#%PnpujssLlaNIog!nH({LaThVgm-GCjQ+(8R$o6>;#y z$tyYd2hYd9SkiREdCGGW`T1mXNa^r=N{91jdqdA&nR_JrogGdP$50ExAt~689;nfS zCDckMJ43esgoCcu%I}_5&U#vrd0J`btx#nDYOUZ%8jee+rB}ScTX!c?`YT` zyaFaQ0>7XWQ7xiq4SFMK;4?%~??ewpb%3X+Q(wFEk{l^yGbWxCxiXq7IWA@4%^xd>ydCzWWbAOxCHrH zNxN?YKZNufi5me%a09dabh0F@J>$a@U84M$${m@~tP}zm;z$A5S_mQ}yOqt5?mpyL z3#}7{_#XKFe3ZtO^z^~|>FHY}>o_8WWWh-;X20}OLcf!l@(odU1mcjm9VXFBk@=E^ zY++N}l%^gN&RTevy>Yg=agO6SCy2ArPYLTp3G3jiV%;ub9WG&ABw;;X!rIV{b^j7q zR1f2wOK{aV92~$Uc;{|57H>&{M;l<)bI0m#FX>aa1otm-9o!e_L{sQ~1^{q#*UR`x zzYQ#LgbKb*Xy8UD;6{(fjUN5yQNenN0^_QPZ@b5m)EFe+-fOIfZ?v-#X*D(cbFyQ| z7Eciz&>nB1ZD==aGD*+MWPhidmQi_+5DlgBKHdzBcO(0jzJD!uYckj@`psJ^Ac1#- zOsxbvpcSS0-few05?nKTnQk2{hi-ZtXy(>~z2W=Va3Y6~W)gfR!CN@Ax(E8ovE~^q z?cbBMPiiEpmAp(;)8vq}+rvFn>z~gqKC}n(;7vZS*^%+zgsar-s5xvE|F)gOcJkl6 zt^(W1Vcj9877p9aVO8C*{mVM`kR=sO+Ilb{&SgEn2#s)Amr)0}tfR6c4sYGE-h1}Y zKypAPtpC&@Q^GBWG;U4+El42gt&YQt(8})`lT6ix| zFj^2RV(%Z1>Rkm(e;iQ2+KGj~*}w z&C9KI#h*zM{4FF2ng4_&K;P~I9QJLsuu*v9riG-#Fp93UEPeOG9!(S%iqnPJERp?7 zSRiacWM{u%N5m&eX!)bo{bOuz=t+9I?OFbGcWh6LgD7%nkAIHc6{U<4r-c|pwBQl8 zq0>P>$sc951eTH_(LkDMCFozREn>^^TyPu-)V|6X*WInb;HP2pA`=|Kc3E9kcXn%yMn?jN?5!`5@y zY!0jAuwGYzrEcI6)CJrKecT9j+z9Qyob%Wo9(~yOZ{pmDbfVtj2}C{L3ZkC(3=j1N zqI=`F5~LK5J3K{#ERrCndm#JoYYoS@mE#-E@%85T8oTlBAJ)ic%rG(=Qe>6Vw~@ku zp_3w8LjmYMzdfmV)7;U_QF_G3^At1s7NKQGBq2c-`eL27@Dg$^$WhJku zRPnq@e4mQS-cdU>M*bg|YT7persN3ybkJ%fVym~5@m7v2pbQ*__;ZF|f zhV4zo-ea}se~60VJBW%|uanHg_>#;7jPuBhhk||mjv{(2ryw>V+<~_-AZ8Xlo(JG! z2n9~R079diep*xio}Dm>lBy}fHW)$kAU8rNl-}ngMEB0*3*W| z(}tS2fkHA*8$^+Q{4qglf;oT$Xu?{615riqLsU`D_E1F$XlY#q^sZ+%wXpAL_LPhu zp_dUPk`eSLveQg(DKZ_0baL~niyKhRZrFi1sFv&}QL>-(lKo_t>?h$W_S1j%)c!|( zQ-2t{IL2Mw821nB;INK9y;XA9mTuUAdh3#UJ5lOwi_}};3Tx2=d8KvWI!BT|F~`l- zFNv!{0ddt%(|aHO^p1K_9f-uA+a-*p5h)qSTRF}+V$03lfu7vBjGjDFdU9g|`+X!Ywx13lZ2)AWK5Xk!Ew%1>nvm;o%|-9k@}ld2lzfAKuIe~rGo29)O3mtriY zb8da*Uc!{ltuKQQLJ8dZ3J62qyxaQfzdan2>uE2&r@j21_NMo=m(-^{k34w1WIoTe zNP-|Mp3iKmknaJao9)>+jte&Y7QI8VQn1N#9>>yVLg&? zr8QS0WxB^oQIShhRKzEUMt<064>tyabV+gY!ID2xME-~%J4ujT-P(%gpx!!z=!Eif z>f%Ih(w)Ti!1%3}+wm^;IDR84(KGv-`+R?Kdr%>659%?=gDR0csILAzsNS}OAoX?B z8j`%sw+UmH6q9xh_4Kv3_tazeU-qWb*Yz=IMm{e@JkU-|x+xSgGj^!^%EpU6n zRgL6-AA90TDoB+cnhh8Tq-RJ+;snco(yfC>xz)7Lq{o)g& z_CR0BJueflPLqIzaj8U$bn;~d4MoVopCm%v%Ac(SAO6gW5XmNXhf)L<>E>Sl6< z-pQ?Lw-w>)hV?SR`ZDo-W_nrE!0UV96-1tPBi_VV1<`F&=ipcPj6x)s*msufJ3jxj z=l73$UwguhyW5@+yK(Oywy!R>TdT~p_%bYd!qd) z>Dfsa!C_XCz&?^-B~Q)XZ997~?mI7DVNY1e=YVLs?TNB(oXN`dNM@g`=YLx_=gwgL zpKGup3Z-~qm^2T{c2Rbms!2bln+)5_xz7;4DShfVu82tRi8b z3SXNsQUjQhKxN0IY!KuS-A&;0pY!P6;UX!B3i?% zh}wA-QEX2Y(SY#(ZRO4&UInV=^?!xD3bc^>!>xa;0_`n7l5SFOk@|lUhpWK6nE?ZZ zR(QgNAe#y+!EpPdcIzWUUc3UZkt$$QWH!l&m9_HM4BCj$BZC#UBbQ+>71C?1FC;*tAo z9=Z2tCDgg*?#MmCUYS*-#hSn3Yr;CI7kCqoPDq)=7%mq=w}s#TvyD87Ud|5C)9lhZ zRS2_-e(RJR@!pn6-xazVo~&sgi`?P~yi4Uo8a4tA5G2`pp4nQ%x?{f--U5aFDZYh! z2L-rrub~JR?pg|Q^%MK`NCDv{<%>!<3KiV48O$x4FgD5k^#1#-;Ulkw`#^Q}LJECbEM=so*dn8y+XEnz-hjRI`kf5||K+T8;h ziC1z?8VMa=&`1#WqM>K-R6z&kNs36p*IkEDAnDKMEj73AYG8K&cL!g;Yv<(*8c9D8 z50v1+|F4<4jr)`HxCeZaYyVD8$=Gh~-#^`JIkr7o!nITFyN_Xn#kUaA+f1fi{&*T$_vYqRc6Y>^JsX z0!E&!wW|r%pzKoK1{8@&<1`wr3_~j;(aKCo4_OP4_kr6D3BVnm2ViQ^PP42B-M(5UOJ{Vh@t zuvHF~X<^`gV6_k)7|t)?BRmQF^jgqh3U>bHg_ju^5n@wI&ItEqZ1w9 z3i9>pD7T&1x_OE=R-{xRl@B!&s%f80q zxAk0b1)VOD;p`rW&hKWeUtF*s&cLcVzdj{dd_uZjRD6BpNV#b7(W>f;%ZjU;z2f}X z%P*(K;*7!*r+0sjb>7SU_LDg#Yt?zD zqh#-;PG@I(d%JP`v}xmw9eA}jXPhXpyRtWCF_kJc7HcFc9O1OiR_u}mMg{w+bY60m zx)Yy=jU4XV+S*!yC6G{%F_Wsw8oHd>*=5zOST?Q=4G(uTVhq=m;e;C>UuAR2Bw}dy zY)w`>`3s)8mg^#KNf)sMu8Pd0s z+vv4v<3_xf^oT`HtBEa|hI-)Q=Z8bv0uE<%;YirEYwNHFL2>5cwRlg%R4!=R8zix{ zC>qkv96y$bQ-wYdTrRAA{|$>zXIUi0rbxtTn~Rdz7sM)3m|)UxW(5SKC|1%hW@UV& z5=>7NUl3maC#?Z$R|n|S)g{B)QJG5Jh4)Yb7P;P_Qdu+xKM>dHl*z0CI9C-XI^y_M zP`3uhu;M+m1dbgfbz`t-LPkIVm6o=)y0r#*4;qY6kN2SEp0zaM$y>;!Dr0G^({D{= z>bZT2hcJ=ToK1R13tCdU9TumiJuJP-Ko!R~K+_x?7`Tpqi|gQGBOmX-D*!|9q< zNx=#~{e(Bruh?xEe{oucxH#NB`t?uS7(DpOHoUzDXoG0gThkLBL@L6A2{;SSN{Dbu z^~R)!QvWN8x6))xGX@SV#~nLL=o;J>Ui;Km(G{-}ahwl2}hh0oo z@yg%fFA3wvCb4}G^&-tf*$-vQh75saO{ZzXti+L$m9>?%?ajJ$#rFK|`7bBp*p&CN z!(TxGR#{)d8CwNyl_<8+eZF$#=k(uKtMzr`9u3?hfqUctxJ!rw`PNQ#18^tA=|7<^ zA#Y_8;>r6c@_s=9c?a^q{rE0mkK*#*aqR2=tQ;&=mYzQWWe8pJ}egr{en}) z=?Y-Ky$5~ZUX4CvryVbl(0AkS3;enMAv@QT2cT$}60&XvnyFA>chOJyi>YSJsra$i z%rzbYAZ)ft!RDIy9^eUd(hm_*qNH@g38#h$!wj5rrK@8-~&U z>C*0qVz9%tp1hza-wAa?w+STf)=~fnT?AXkijg8MeH!{Q!6y~St?A)}eQ4<;) z7c+F?4O0_YDqAeOktLW1Pyc;<{6nLnq6QlblarH^6QbZrfG zbE&Ano-Vbubxln+f73|*;&NeozMu~m+^{lWL%L4J20pomtSIvD^!Sc9zNv?_q$H6| z=K8Buj$Lo^tx(k4Kex(f<7G{O?JE3LrnSm3hi|~2no82Ga%_R%f=1eqC_V&bBgYA5 z*<2RM;_FS19*fT^lbRNCw_9aW!_qupl}W7%O(od4#_6OsVf9&M)F7wupS6gM6s##y zi}U8qvvMoaD#HdM_>@}2$-dn!;>>Axi!@%yFYLVwuo=}e7#>aZ;}!amO+Uiiqs0S3 z^IFdc+fH9e#SfZ{@Rmj#il*FiiUChC;32)G74KbODgk#OWEGbGpN2y3eqE{5D zNJ_w85|m`@YI8k<|ED5xc_^EyNMagW^Hn4?+w+-<~hQ@F8z|zzIU`JujN06E*g%GtwE0l;5wGg5vda)U9zR;72FMX&?o(mvzd&n&D zXhSc~{BL!i2g}~kDB{0_CHzca2^o-(%;rdjb?43KlscN_hJe2AQ|e&Jh#hvb99CzC znF(fW(t^zuQL*KhAkJ4>eQ{nfEWi0?6oxAFO{-QlS$n(?ZSV}XhJ7h!u^(`+G_y)N zzE;grG&tB1o0Djm2B&wK6=Ha6Yq(YVR1kc8JfAu>8Vnh-o1%c%P~bHJc$qM&hcSVv z>~{F5ZFDT9944Cgk+VmRoXN;Ib7aqs9eb=`sr-oFzy1ZMNfX%CrqeB10`7VT6bA$Z z8w|k#ip`r9RxNVcq#Nmggc#4+pxn)X=#VE zBqE~3EeT|g^_B#9ZP5SI!I$ME2SNgggo56p1^0N1FfmYppR*VR3JeAew+%?%)%NPN zWBD0b`_(jotyr;&`CND1mMw8{Yt{@Jxnd{eOE)|-b2$CSCYd-%xyN*o)jk!BWBTNw zj#>92p{*H`KP2BzhW!O$($Ky@EiHAy5gk}+sx#Kq80kOutrV?ZMMXhDTJ7}d>UrR) zY#2tE?xM+bk^bw)jni|!ku3J^sS;S5F(#$Xa-p|SXKnNYXY}$h8V0B^^p)(DF!VJH zrDmvV^l(Zh(`994T};ohQLp#w-dX(4M@yG}L_KG^ugk{&{^i8r>$b$L$<>KxMVZ4P z%N(9LoO#_gKJe*VLfX;YM3`6>oou8`<>#lO{xTh$GNvu9Lyuc*I-GJD92FH@W2`YU zohc+VaI6qr6r`PQ(#=VjGb=7`7EPF}Mq(F@Rpi*$?)P+2LwuC_=TmdyY`ce_#7p9#ho4p- z?V93v4?l^K#6S---7@=s8UYs!nWg#g%AP8>Z9lwiw`=cA2(!t_=x$c*7nOkUjC8GqsQ`{3CW6qWKEMSU#{YyDPZ*y z{S3L-LMgv6ANwffX3%WC->_x#=1rS6uV23b*N#0q_Q3LOtZ8Lpedgv3ILf302Y$9W zeMgKh%d^d&fA(xr(%!wu@C*tGi5@$3>eTV!;Yw^cn1A8ev16C8Rbhy7%N8a5x3WRr z9Sv=rjTPD1pM7?r!midRltF{SAAKzD=bwiUPfNSw4(p(kC(}ym>+37do;4y=FlrEv zavd>YLdQw{9e3#IztvDvT~kw4UWEu^O=GUjR&vzf?c?L?>*MEVz;(Xud>ivOqL&yz zlAfTG(W#?GZ=JWdR;|{0X?=dpvxzU;As z_7k5w&8exl9i{i(daA#fmX>PRxZNNnzBGIzjdV{kh-?a)(fWtIhGz&|u+(6BX!ugJ z%X}#sj{5Bd>+#S%@thP{2;Z5t6vFj4d{J78xS5)%=Q*bsY3WAqXZOwfMDjJ~AyVE> zI#UAM&RnDhqOYWy)4n@Wch;;=Rf!lcNqk#b%G!-jLBmhj?~(YzF+hNo)>qqP6e zxD?J;D73-I!;>b`3I!_akbW~!qVi8T9LX~tE+*x6M)Qn^w91uwKm;5ZXMb36c#?)o z#}r;U*TQSyL%VC>`>s6a4&R&gG^A20p`F9rCA5fAQfG!;WpCDSL}BnX8SHD^Mshy2@S>N&RP-Xz zYlw-lA<(`trzJ7no$M8>%@t}M~v18W(FWQhWEDrzTe1n1%op7QW z#*L$RB8=JRr%g|q`v?Nejg5~y`N|@zZ(d#{ZHnlVmlqow>s@U1Z3DO=0HNCn6T(g6Bwo_WYBl%lk$kgY9HJZ?V>6BkmsnQjk(yb5nqPfSwdiAlcYf~}9G zo8qjL1ksn`lAj3EDJ~g9=~N~Upf))5JU+Q6uBqzX2JPVHi&Rb@XiGP&51vncAo<&# zy<73Xw~zrr7!6sQ9uyMUM~H1AeE3O90#He$%~0WS6FvfV@#7c?4W5WwG+G{pmdB#y z!Qd%by!wqBH%TF9iZ~zI@5x;uqKkN~96?*dV#9_FhtH*_r(?Fk#;BEtK)Mvg3EH*SYHZV*$Esc%D{{|2!McvZUQragK{&LryR-(uiA$T&HdGI}%h=OYl zvf2_8h0hizW2e!V=&~BF2)~0;iq6hXFRfXPn^s4m6+>e~6R6bK*aC{NhDH#}!Za2& z+zm}QA30$aMRsKmB2MGgdA z7A4$D7ozE56DC}`w07-8V=YdJuMe2GcH+zjo__l2naEyrnk`;0zr1?&cN-{Fh%QPv(biuRGj@A zWj@(C`L_J*qQau=tjz447Om6iP`U(xIqZxX*Zp|B4wBMv>c{!>y}Z`Vpa0{sWO0FX zEs`()k^N}4sGDqACw@Z!G?BJX)(W9li!eymjvyIkJcCdz!g+Nv|po;`cHu&T1M zs@it>^5qO$rKnS~Hix|d_Sgic)1}sX0e2@8n`D$`Y{@usB)b#aE~}l0rGVs!rl`Gr zDN$CvUjn zhLNi3v>&ir?79M{QxH=9t`8|Yefo4-om$<3dqd3hN0ZR|)$Cj4h07horrbM&S*Wf6 zmsxr5^!x9h{?rWob+>eVsl4yn@ahwXldzZV3bs^sAIk8|I=OFffR9QctGDGhSrxTs zcI@~z8C$zPLzi#rhO>3y>eOK>%pi7!uT}|l1e?L$(%hv%0<-1lnl<~X71oJOEe`ypvlf|0+#3oC zONwkIIhm)=m()7J9cNQRWo1KkGk7I-wO80mt4azm{gy+7TPtf_I*nH4Gt4Nn4Aw-B z88bvrIe3k)8ZFVo+G{Hs+MwYYOY`&XDtEkv{2sDAC??;>??L(0I&-SDrOHzBd?Z)M z*KK*we!C9>Y7wCBfn?qZ$&9Y9t{~A=Dl;-Oi)*UeW%T%t^5Tp$r!Eu}6v8&Dvs>h? zRq&DGkc8E!U6hLLblNdhs(e_p1KMBdY(^m1!62RXRtCYe#w*muNa)hIxP8l)Z!A!Z zn2#jOZ86TwweK(abeKug(%@_@##kSR(+Rh_{^Cz#~I<=nYA*nu(&(!$jV9&eLWc(g{}`|Hz^h#6SJ~WJUsza>hxpbp zR1cgYzcEgsaCO*a_~}w9)F4o2GxJe`U=D?kUXRfY!BXoOWXc*Jpi^rhOZD|ZLx)BM z`Dr>Zr8<0rjUmzTL)A*HUszO_2JF{`GKbk5>FVsTD-@I;_rkbtsdV~K{ZC7W!)_Pl za*M*pAZzbPm2}t?6Jz(8P!j@;9uIEEW5JNWG?Oab@f;Z1I9*p}^n;ea;xoUar_QEb zJasPZ{K;b{Po6$|;rv?fu8s~SSBPqO!lKKJm@;GfsQ0YjWXK{Gy!z^^3;ZiXLlfCn zwpAV!WV1>8)%$#N4mAWVOs(|t31k6g$ac|Mi^cNgzTC#hq&ai)64-ab>#v)AAImQ* zEy&7lkWnUwDXfg8Cqn11RlGD(mGM!Ml#qQyvApYs#>PZa0+=1<%_A-IDYJM#f@Dk5 zm{5It_IZ>M%Vy4eI2ox{X-{O$TggMZ4z66eGBQcZjXntb{0SeItJN787o`V(T*e7j z|F*W~#=7#V#@h0lCTyzSP*+`(>nm5N5$^7C3U-FI-!e0XBlC}sj~zNBJZk9RaMQ5i z!-mBS8DyH)?>D(UG+^y-=~{ty&y|BFn8|UtOM&tZmt5A6 zot0l&mj9R;%mT}N^XAM+ifqi?_a%6_7H$~xo;dZI07p~q@!h+3|L|@iHsgL>zI*p| z*Co=Xf2JXsxSmZf&S8%fs za8N*SBnq8OLl8Kc_Q&sV3SSQjKLrXe28FK&g|BBqBy1m~zd3m+Iz=zK$;lFxMHE0S z7Ukt;+HASmnHgCqFUrf#&dDvn%wpRaAvl~O3gj@buyn;GBJ|fKLZmzKDYUk>wzf53 z(k(a7Rpjl&F%mfY;2!g!_OiV5+t#dEv*B=lWajBDDB#QX4XLdi_16b)yY03Su$m>hqzy{53Deej$)F)a0$!j9H*`BW>@hK61{ zTtMDZe+}T?L-Ev)DyKs;_?mm)ped8C@7Oxwxvf+qaBzxS)q20WaB^sj@;Me>52cWViASfg>*hlN*9~2ZA;D*XA2?G3o*-2K>8&sCoiu6Gng$SBNOT(C%>>TD+~OAC}-gW z9QsQ^L4Iy_*7@_Wi}KSE#*w!ROtglGNL@gT9qN<7 z=EdJKv^!0t>EpU1UG|6_5r!!&rX**th~U|VVCO8)ut8hj-@u&dN>!d;++-2F zBP|JRt#Efis_^EUa0@gq-4Yw z_^q<_qSlQB`4$UbAA2^tM58Q@+NA$D^_R;%%`XrP>QrNz1_IGN==x`cn;mCTMX ze{rgKt*`-IkVb|2ljE&S*4imrg*K-p(beHv#=cCQ0H3+Mw79sCs9RZCQC3o1T2xR_ zUJf0CVNnj3k^TZEl$4b>G*na+6;)vy6uFnk1ZxP03(CutptV}zCA7CYF<5B0;9z)B zTqB0rjQV$F$_x? z{ufW+W2v`i-+R4Y*>*w6gyDzjXY&GK1w*kHHX{7W^JK{5t&qnBkjKf8$H|b# zhzwh4&d=MnZ`-tK)7Ia&ZP>7O?Qfe=g8BQ#-+pGFnFWnfiaj`-I0-P-3)PYihZDIr z!75+o8}q?U;x$m63voolFzK2KpZpDB&6*?})es=Qq5SujEn9y4I1%5u1`?HE7GlfH zYE&xkIhtMLOoj9R?(WR0P~lE*uyAUONFjg-M^kNkbVyJLN)bbYL!zQ^ z#zA-hlGu@^XhaZ%4u_e}VNohDwWNB%*j6eP4E(f4=$cwZhsIu2Qc}_$eqB?OM$=J_ zbdRmJ!vP;(=+K#Ain_X-m|;@Az*yg|mdeu7Qg`en8FZcpI{yW9P6nNmLFd6R3m{*a znOV8Hc{J8(?ka@#EyyK}keQ7DF$t5)tas7ycDR%(#46OV@GJ_s67yH8@@!fo%36|8 zSc5C%tFxM0@mer@`i!YlCq?{#!*N}a6o`R4Ir9=^m?PwFMx(wNDzy? zS`%F6XMz_GgBOp27c;?&ndE5^A8ZJn(0OAS>Df3R>Lnpuv+TRIW`ba`vcKAOL^Yq{^ZN8Wz>ZL^|T5bB$)h~_536<;oE zc>1MT(4Qz@m#!V`sP47Nlb)U(4Ezk!pQZzwzLhm(wIrb?`*Zd=21cqGW+!u545G`K zbJ>Ff ziJd=hgma6k=idgmo(H!))$?Nt3NkWar4WY-_!!E}%Fe#bKLe8V%EU)GIj2ut%tz>i zb-fSLnANadFp`>@m!kAW!+)vFEwch^DR!vqtlPA6>uJ&Mgtwe5J}O-==+|cNIbGkd zW#{h~%TaW&_bm`J$eEL++ zUkpv%f1xS&uj2hygmDtVsr9;;A@T7+UV%C??339V>3UE9{6FT7hz^U34buAA8&Tw* zj4&Hrsj6q5nKdLhjKS(Rv)S(pZKY;e={S^kr_d$b5o{JvB`37@{rKKtsbdNYD=T3V z6JrZ${zJ04ysWH-e+GG{7d|R4Ep2J9E5fQTCVwA9GOJ-Iqj$bOOHpW~;lBjOgjvV< z`GtlW@dA^PL?-r!1P290@XwG`rWbt_7#I^9Wn{yz)}S;y%>wVA2Ja~*G7BSh7L8Pl zM;lx!&inkF?5y+**wJ};7`rfw)6>&3kWaK4h0YF#2v?VdUN=CWvz}ecdk362n|={1U^&8^x!P zkJ)RsYDfLHclVyc(Dv|K|1pyjo$U|?3y%s)l~v_z4-bi-o?uNBw74F6D4AvA+J;Ej ztB8xfumB;qQ>=}30U&@?u_9a-Sv7OO&JGtwOV=o2x^ROKfCSG{L}6PK;TEh?zA-ZU z#EB1PV2*v1n>UKZKc6nFwx}!5ojB1jcJ3%^G)AhejE`H4+|si0s!G&378hew!{x84 zs;)$O)oK(~8l~Xs!qHlGj0&31T^2PR`s;$@YK_KFH3ad2i=i7B6dV?cQUZT}3~LyP zFcU*jkax9K_$a1T4>Q3@%Cn3BCu!9~a9(L?S&1z-&juSTFDC~}28g#K`YI;Y-=uPdt%`bv>tLCKE={ zyJoX8SzL!0Y?A2f`cj61RJ7BQI zNeLCm0Y!e$C@v^jOgr?0UhX$Cd0YXsAQWC-PPAXvb-2hGV}R z_#VIk_f--F6~x!ID-Z10`+Ei=Xcs@5MROi5 zoS28}0pUIH=4G?`#EFw<(rmSzR_NNI%(Ew_PoM5pv@IF-pmb@s+SJo`?ATcv8jDIe zOXwRK<}$=4OdpNc^y#tM=2o`or5j^IN_JYA|LmC$KJmZ<4?KL&%-Q1+&5SdRm^pg} zqDuwR^}&$YGe!98;?0u>=l}A{FJ+;jH{AcoBab|{aPrO3A^3Xyjn6+ngMIJ*`cJ|m z5P`*JHA0csj~hES#HtG(GkWaxGof8NMnB%3_7k(ai)8DU?1s(fdE^UwtkTjOH?oRtU?afZrc3n@fV2sf{?vak@oxD6%<#dwQh zIu$`3;~jF~Wrv{CWaa=Vx&&3MW-g^tbaWE`1Pe|@2SZ^hib@ve2Xze1tJjBy`uV{@ z$LV0+dc7a&bo~8{n1l^@>mM2#6#Zu{>d5`~G|9(u93=K`NbH@E*f@;kX(l?O9fFFk zNK%R}e~4jNAK)$yEa`hdT?vdl`&0Lcny{nDkYh$%X0$o|LLOml-XO3 zwM8&I;devmtT$q|9*b+dI8nN;7a#KaXw7a!$xog2tn`V$-gHfnFxR+!@#4k5mN>ei zZ?(>4^}-@yzA!-;DP3}Q2~){2wnFhdV&3y^V?PU_!d=3(xEA1RV+Fl*VYgwpvj-60 zOOY*FgoNlymV*iY6|?G_*5Xp-ARnu-^iuVpxVa1O8Xx}U>SIMYJ4&OU<>B;Cl`l;X zO#A#jYg~CFfS>)gy&n%8bVSu2+`jn~@Edyx&^ zyZPsjFlS+D+!X(0c8INFv)KvXH=l`*9O-=-!I4Y4k;!i)qZpsACHi?IM+_Z0bi~L} zIPiJgDE0!PR4HcVOn>%BVWCA9b=xzuFg5LGHt9OWmKmP8eGq%&%~xJ{0@KM8FTDKv zo7SMR(%S0sTB!NbGP2+*tE)=E;WH@EQbJuSVS(%9YOPi)r%a%VA>I*{P?f;e!`QQ>VHfSZ`K_<=GSrZT=pSM z-x!k%NvBzbd4ZO}#`p>6GOO$kjS*2BA7SYS$cvnAEOQJ=N=mx0;CZCF5)tHnkG-6# z#+09~4G;hOO)L$wj1#u^X0}$ka8zyZ%L|9b-SzMjw+(}_5#U-W1WvGC!r7BxWij*SAURhC!01`auGV-lTO3P^wqbwAwLO?>KFi^5#mPiX% zULqjo7FcdB7izjdTnBNGl!2{ z&Pt>DiVQT2qeY9;nw!m02M=atwN)HHe*9#5NsEA`#ii**^(8oxI3vHPyxD1uJ8L_$ zcKMn$adF>$xBUC_WfxCug^+ALQPUYZX3Uu2_L{ss_!p`ox;@lYy#7P$EEH<}j4;Y7c+@ZlgyY9&!6y73zpcQhzp>8^ zFaP~nyj~9}TZ_7i?@K~%oB;_~DP30CEH=Ze)N0!ru~u4MU$6DGD1#zo&2}x%u00ja z@^L1)R2-rBB7=>10cCO4I8FNQjAm3o*s80Wvv-|WsG?A*JxHVQi^lo(Ljx3!W(4Ap zNDd;x#7*$=u|`x@9=-?@!^@X7v?{#44c@YLoHyU-(#RY#EclHrEcJ?j!G~yaWN=f7 zE69Z9j)MY1hYdp=Pi$OhU;q?DU@-WlY-;lIZEUo94W@GDI;{jURN?JC7QA^4u0qsn^P_d@w!FM)lLz~1T1!fH ztj1C4W!~PS=FFLMO(OKdJ8X&Sg_}nB)!+bG-?vPIf#R?^^G5G9|9ZaEtVvz`-SK@} z57{OVccs&s;X9h%nt{{<|LtSV3lFi~dylU{>AH96`ClzNN8WPNFf?Mava!ckuleQh zz5|!q3{jLD%Q$%Ow{O1v=Iiw*H!fSX?iI_OXyMu+BT;|BzZl5-Ki0W|4C!f9l{`+6L*8U5( zZ!4~k@*6yQ`fax%ie(Cu2~krfM_QQ63X&J0vI>FcqC#7730y%K-~}kiLx{Dws4yS& zr%#Fwr62$nEr(Gh!#Ytq_ZcyKXP3i)W&R480-T0%pu|r$AiK%d@5^q30rF=I3=A~- z8TG2t2v;IauUmv~ni7|ShXFINZHkUz)0#T0QUTBu?C=iKHPIeB&NU|Hr z4bIKZDK4@}5nD`GxonqN1y2YjxtJ=K++1HIv*Z+4z@$VOGi!LZICAn2%YQnR-AP52 zokH{F9m~J`eo|~h`k7CXagMZf$v-~JR+&{xm##=lJ6&W6?hwKY92)T5Cu;ccTj5GP z8CMXVxqPWLY(hxdnJ1t7+ilm63qe#~6Fhp#?1!Iw@=TiF*gI!pfhI4K+r&PV-NT+Y zlRPe#-#%?xs8wlq>RJ_QMD=S=ocK8j!DC#?Wfxj?W1hhAJJx98TxnS;I4IeAbSur3_w4HCfaL)6Y1O*{w;3Is1C1CRW}fS^E} zs4j(NF>M5}p;v8%^CSU0`2u?3JLrW3NJ#2d9EDV8HmDSa= z3}-*bq0n9*mEmPOx%n&0JWeoJa{t5cPApfkuu`0_^3fx>Lt@hgb(#?clhW-1_g`xJHC&L zn)NKW{q)SJ`0>GKj_upG@1kgB2|}>$si$sCy7$SyJpINSZ@hU2dlxyYLo62s4=VSi z5F&&b!kxk_VYYCcFb=LjoDeL#|NaN&Vfo$$d^uZC3&Y%(0V_JYSUF2)n`Li4fc7nB zbCP6mELPk(W>UDf8Oqn9H^fhx6sgsyy>zWCflsh#7&wqZQ8Ur zoi&Qbi1Lx;FDXepf(9)+{ah0oPFK)7eSkQ#f5w zdP?f+eUa%83=E0F@!%BP)nkc!aBzS@KkRDoTw>-xV#q#Nh*3NT5;F((!B9vrW&pT; zP>KkB;4RF|Y*_!8F7S?CIg|xcizps}D0i7vQv6vZw;+;>$Q4A)4Cg!5udt*}*!s)i za>HD_#_0;qd`?L*ocV3gXi($Tnt62N4|r`k182Z&GWhRYhsgY?h)%y79tBU;TlVk2 z_F8EbXJ=zWfXbEXH%iwmj2Ry3)l5h<2aOrCfFeM!`qa-pTUS>fasA^nz&w6gR{SoIuSchUgdcE`(7GMxO z0;plUqgNn{{SR77q1p;1IQ2){Pg<}3Em?dE=|>IySZn6C-+h4i8+iK)czYjsdoOr9 z3SN9>4prslW#R34`1D!u=Rr)A;~<2Rmz{CpC~dOOteQSY2X`Xl0%8-iq6AAkJu(P}?z z?Jy~(Ja^BpTelUI7H`~$rAfNOM=GF@n~Kh(1S%06@fW^m!Ip+$Uv&(L8>1~cuwuoE zgPH%B2%%D||M@D$@l(%OlMsxrW=GU-&Q-(biFlqeZadi#VI;!|V(fo>7e4U#LWC1< zzhMl5IzG3~!G=34*cNsWKHhfx+|Djg1MpnVnq~Kd*)2mGI<%;a9d_;Hi_3OiNY5?q z(hf>YOpJ2jps+Bzxg1WA5H=HKIs_Io4BJ9Q28Kl;P8$ZoVxidsBc;+0_Xz zUl6(w8H8ffs^Q{d(ajw3W?XZ{WO0Ug6aLQ-Z$ZlDRm~=HtTHx#y@YZhbEPjm;=SbS z&FR%&?}TZ&^J_~IR@>kbEYR|!;g5e9eEX_@BZ6bKci}OoR^2j*>f8J$-LjCXuDF@E zM7hw%_lBG9PQoX+@^ixv$TlJwe*@EG>8 z4*o6Hf%jj_-k2FZm#xGfP;Y{3Io^LOd7$63ZxQoZgo4M&ppWPN?Ww1pda|4fPNL?1 z{Bs^q%KQ1_SuhZ<7Y9k#H1RpbvSnX@6gHQZ zoegMp$W@3Gh@u?9NPBy0n;pTDfB#mB8MMG_;Qy=80#maN?>`4gh9_|8QjRU_;u$!6XR}I*k*v+NW#<+a z<(xuc?!nW$&Ry8Qt1@rbf#XN_Y+1j3*Ou)F`k7+_hlM*FOe3=u*CD=MQ`=>`a2he4 z69*4}zGg4V$j@e!)H^Kdnkt2tjAh#_a=W7obvNyGttz-X@$qLr`e;j8yYiZQ@R}Xj zesSZvb>qi{INHjvSKIlE#p{lyT}+RTcyIB?%f5Iw2}SIw;>)s>FCi_^=95C=BiidK z@4UskZp%k#hfU6InDXL_FW!E`T?s)hj0$_JQ?6i7JaI?T>;=^qGh3m2Rq8wLd&24! z-kNqEI^&*u#!;2?GT%3nf@{{jgV(Q3gRXn{ZLAT|UCyY`4!iEw`|i7M?wCY4o~smZ z-#zz{N9I7q9A@W`8Qcqd@dy03u`IR^TEu3KQYb>=hx?D2DYT~x^N`=VS=T(;u>s9~ z@%x3e(hf^7%AuW1@!4npI?%;#yfZ`z9cc{sZS`l?snt%g8IcDBm71HY%c|{Nh@-WY zm$dt`y!7K|tHh2rN_nfC_R``OdrrB%xu&k2DV=u2O*>O_a-}F&cf9h&pv5_2F{1w+r^X%+k6*Uo0MMZ7!;A@4I7yr%q4_nWS~c z>>##>pjCkEQTlP5Z=q1{p3gkhg;e85tMK^RT7?9cnj*UdNR;{&0v0ztpoQtvvGi_4 z&)K4jFcx0NSa=UDEJ6#5@Z3plZ4DKa#Hp_Xb?VA1>zkYEY7qaaZ*6Hu7Dw5Zce)tG zF(_Td1X)nof+%N4TPsX}Ye^|0`i*X*!pMm>yGSXclmlOBN5MI*VG=H#IC1dcal0J; zTvL5Rt5dN0WZ63WqNAgueC!v#|KSkwQpTMuBdak7!OQi#&YjcFnl&rxFs0>`3l|0k z(gMB5#mBYg@3x@aYtzO9*gzvz6uVl>vB(X!dPTwR%rRke5!=?L9sCxtkX41DQ|`qS zXn*_FSIxRd+q(pxz+iuc9ffv2*G-LRJa_I~P2`j@abu?>A_n)pA~a}7(ql=qF&+EB z@Zw+Z8`*@3y)8CL5Kf#ZDVZhJ`cvp-4T@H*DuifWe45HOSD9n5K|x8A!Y>k%GX37W z6bCd4*aEJ=34eL+x#wnw>g%>ITei%H!Yr`(%(@h~xH%V(AKG~^qtZHQ!>^lmBMY>5 z`}Xa>Z`=O=*!%7Pr^@W@_uky}DVg4Tqr=cUQ&B*gh@z+{f(nWi6Bbu8SRA zQPEYFVnd1`Fhd*4z%adMdhdNElYGy)85CCCpZoj%`TqEFA;~1Sc-S-+lkDPe1+iyK?uGl=J7$ox6B3HTCS#Z~pbKe|_`A4=Bio-;U)AK`J~1 zg#iBp0pNM1jF=b|7>*1cIa@nmFWNph$yCk&C}{42&zYFqmHI*PL!>{pcJ?;RL(q+zeY_*j53HwR-bycB)_I3p`4sF;&;?p%6$W|2(gE#c&pOY_KPP>qtauj1IH8tZjhzGLrE?x%V;-PD{z(953&ql{| zGY5eZ6?gBwN+t5dY>Bo+_x<~u8jiywvGe<^7T*yOZ+-C1dCU$`C6`+ivd-p;)grfX zBf?HD^>^QW_Z<;^jfXI9_LU;VLSfQI`_)5+fBJTE^6As@Y$rD0mSoG9dq0$bRq`ik zds}|@1h49Ir-`$07fk1eG3yZF=QL#(GRw>Dh;(9vdrawwF>paUY*_+kojvF1Z^Dxc z7R30O!Y*CBgbSsfIeGHZrL3&l+M=TCXHubx=3Y%X_}NznfBJsk5ylHnEdz)v0Pjh(G#PKn(D#mbSW!>R%#_)mm9vTtont=hOGC0`LQDf<$^_K5$ ztgLCQE$>o7KZa+fzp0@cmT#}8jgqnD02%2UIqNF6-4EqZRDKlQ-X^`g8*@Hiob+(W;gB>cW z$V#hgZf>ZqswOCi&f?_c+SiAnArRgO52GKVOl9?OsOmgmLE~#zS0#g+hJ?4(G(iWe z4N8L!_L+ok#EVYj1ShV}FFeF8#2;^*umcQl=;*QztN*YFFG7;&EL~kN1Z_92WEn8} z3u-WPAbtQivJ49{zV7VktuL?d9ssbzz8V@Z*0x}*nIIt^!B~3)W6j~%$#nc6Xe+0V zf4Gy9tY~`%NZr@pg4Sc43wYquz}jp;L#{%2^(A!kQ?_Si27^IATSDVJaf8;CfBhrO zqIsgoH(oy{Mi!Tnj)53QO=YRMv^e(~rr^(?Bpo~t@spmBm4%kaI@gq>`Fn~SXpGN3 z`|P8SVr*-LEg*S=hv#MawoefM|1c3laV<3du?QTE;y!Bs68bC~`%+a56D+`*uKC{&u8V7(Q;?=rN(bS_}YZZ@1``>(;G{^|D?(bL#B1 zg0l7`xvnK0QHMAP9&Fsk1+mb=c4_apBZB> zckDnWn?po&^rX0`0BzDJ2oLlHRD#wjUWYb`@*HSIAhOTdcl@;R6Q@j`?x%zFPy|Jd z1OR80r-)KXBJb$yFGdPFL8eVy`+HCznT24iMPRJCW30gv zbVTs}riTMSRp#Py`}5CCFfkzs7%bVPt26y$ArpUncPCq95*FbkJPf84G8gB6T#L0m zaMQcz9KIu8HUEuZ!NwebEHjrC*`Je{#l$R04vrokI#);gbEy3@`<=>hr@!@gNUjbL zV2W%uJ%QX$1pU6<-;szT?!<2+)O;eYn}~T7T3iHgEF?!+334{_%t);%E-FOqgS;KZ zgwBFPS_gp)|0t4`$e$yF2g{^Hf6)VOPn%Jz`}}GU+I`7LzJEVK5m!6)AwkuWd+d8W z_J6%!N5A_4I4OYXRzmuum$)u@87^Ywi!Z)7sk>XHF{p>$xx`gF_MwL#t`=FfQ9C`} zEeE)_pG*AW@2AAFFPv1oDr9o}eQVaNS$qGS`026iBs(dKh=5C41u0Yd^=F;MKA=T0w?c^N~?%Hd|m5><>KXLYq18CPY9cH#l|L>Xxs@J8z( z{%jVDO>#kFpa6lO1W1M+oQMR9P**n{p)}KJ(|#n;koS>eQ+4zWeS6|M={yy?gh5`*Ui!l`wk$>iQPS_#ObJweuu2knL7?1nIcw{Txys2cG4!Q9=1E2kp%-0?*Qs@i>wqWJ@5A zZe*8)7L}F#B7lmE5qHg_JXF{Y5K%zal$AjqsW{R~5&N?x>ELT6N!~v|vlgoyXVQIs z`SO9U_mk*3mTRG45@m+2R{zv58%aVcFfEo~w@7k^GzyA}+Q0umk&>M}RflClfxz2Y zq%drM`y`8=F@!}$nRM}H^W^yDYaw@*Cr%&b%Bx~2%&vYUKB$x=R9O&caX@&B1cPTq zO?f%?d+wQswEexv0CAl(3I2DbILp>EL1ZU`RW*PV69O-0;NngoEB~C~<==wQbTJdY~H0f?%GoysD!*jg`DMk$v6NY-r%nk7c<;UU z{`S`HW)8thzVZC|uLlrsAv9%vq*ij2z_%u`sQ);4XF`}AnAr+j8M82 zR)9Q$ol~k0jH!a+vPzg+c_cRJ>vDvj90dp`yA3X2YA3m3@PPOaxx-i!^<{foU$@wq7_+szbG1Yke=k?0Ufni`Xo{4S>o|=CAihNii z081+nKhTnd)cSaMM2x7ono*Eh$&exk`UKf$SE`+j8h}Cs+>kbU0Wj@I0FuLo^BVnl zJTpq$8{AVD65ze;v;VERXZUa*id#|T8Rxxzqy6eLk7DuOo7vpljj{_uV@-YLmucEz zE-}$;9rf;3*#aNc72^;H2TIGrLQzflc1rreI#yX$TmU1en$}JFx(F^QM+-!p-2r8R z@J@1t)EKZ>;owKxQa}-_zi|jc3Y4RTWdvS7KvNKC#>(a4>ZFCq;|1$S`r462{kikm zrQILN$;ykIfI7baK>ZG`ZzUH63E2R$5U%)3JWJys1mhqK<6tDlK>)@<0PfY9;7RG{ zva^eeinCJF*|+cwit6O#%*>{yWR_WO56?U!h97Nj7Fo zak0ovIAw~JOoj^=5;zBL8W^D7WnTfw6~|6+-*60eKn-@@yLZ6?kvo)cawgbMb5C6z zV)&gX{GN_49UR&~@8$1ka`yEFxGOZy*VWI}FDi(I;7dX1>JmAJ0lV(G7QbORegoNX z%kdkQ<2QI-{^(#?P3FIjWcKKe)wC8|KJ~-i&yVi=TLQ-6UADbI)<5T*^!}&&kDR=m zn_Y13;)V1A7-}zzVHG*0t?ZyrXGNP$Hh@|fHFdp?RVqIx-YV0;OY5m@Pu)x0E|B`R zjokiJ(+F?xefvg5ySlQ;$nb!#_V_yf9#ufEv1#k{YzzLsrgTxjKcb3^jfFb#lx*iu zKVh~#XM4;vqE6kFnbXPI2DCD5b9rvH#nP+NcsYQo!EeaKFc%%*+C80(@`2vwa?}hP zs&tU`p=Q8OzR^tbGXzN0ig4SZ8JguJkPS0MCX$u$5a_u#Zh`EFBRryTx69k9; zh|#m=#znch)pvDTTu#2T=Tb&S9TxNMuGTTbJRO~ZuN>N<>d0ZPKjyWzb@aL@p_?i+ zvY0TPySGa-fwua)26}ZPBO;<5d+pNy(hicGsk@O z+V$%>xf$7cxoKA~UAl55?Rs|h*Ln{riw}t*Hh3u@@$73PW3rf|M`Pj;fV%@ks`^jQ zAb9dEafmDhCuw72Rn=Sx(CK6Iu>}Bq9V>13+BOKLcmDMqM%oji2;l!$AHwywx1=}d zE-(TrUwP>zQMF3x=mBvU`S9n`3-h4&Uq_ zcGQ=b7hbs5-c3OqM<1hSt+}>#A$oT01-2;h3+hE7E&N>77Wg0L@4rgq>Y4 zVxB&_5TNUPy#su`yhB4GBErH#1ATp`{?Y!D?4e9+J^JS@^v__XwZETamq=(CfnucS zDS9UDkrVuiOAs-KI{@A$G9OEd2`*DuoDOH;w_wTZw*mkFNVL+@hYU9|w)*-+AgCA< zE@yYkWbts;JdD8TX6?6G&3$kObXb}$@25l?`ut&-pPl*FFT8deTqd+F0eEIV5z)yG zA3kyfJPL55XhqqUq}Sh$1z!Dl(Ej8qOqy=1OCw@EJntQ|{MeD_p+|3ebZDbX%fT&% zSj^JPF!Pu&b@KSAs08>=t^yLD%KoOAKPixW2f-5)fR|2Y1@x6XDr(I1sSnSG2k*$> zW?%{23T_2Fc;8D2{|<FcoFZaO_-q(0rn{S5Uxa zAPZfg5W%9v{9IiSAcwmIetNP(S%8A*qi;Qa=;S0~yP) zDFvi$pdSH%#0`5py98e&d^Kf001$i5q@%bHIjnkT0(c=h4n>fn z{1&SL+7Ip=naB!QaL`fkFgW20tCbS^5aWini=>EGvFU9KZGqSV0FHWDc1!zlV!s zKh_bXehi3{_)VME&-XHa3S3QIRYOA?IhZ@@Eq)Ux`tzH3-hbjmKTCZFQiTWF8XBsy zvD>F+ulegY8Rtp^rIpiiPS~6|IZADP&pzhYu3bBucw?|#LAJzu%p`kZ-IGr~hf#I9kaaLs_Zu;X}n zSK^>qA-^wj*s!~Y8IIy9c)@z~BI7A|bO9mOxpm5?Na| zsDXm$18ENtz!2Glj)iy-92c14Hd{ZN;z61eCDH=(qa!7X=p_iwM^HWwcMsx}z}NU5 zxm~`<2C(OCxFh3M?<`q&M1TW~CoaSrV0sK*3hoZ+S~i0dzL2h`kRkR5l%!pEBKwAX zUiV`(->`4ODKLRdT)R;Tt1BNa71E>&q(>3KO<~};!TlqdmXa2Yt5dp%2{O)R!ha)! zS^1c4z2m3p70pq|0$Vn$x#$dKD7p4Ix^x$xIdqgBmnsHaGyrb}3jp{k3JNj3YTKkRy$iGFi`NqoHFy;ty#nOrgIs!gtS#CWjdg{? z8r{=l;QD$+5ZD`dg+?i=s!x3M+O}=GPSl9X&}ADoy!2?I?^Z_W(aH0G&_BT%xHxX( z;1-8jjXH4r6C?S%pc&G35)=O#eF*gBF$fIW(%4~qa{}L7XQ$Xc?ujR2i9-Y;;4ip? z$)gP1sL3LC;ktn@IDSdwTikE>82Gz9T1Cz&b#NH)2kM=-`oOE++}hfV6pk`;O#xc)d&*_Hok!wTpM%qvj@66 z8w#%#7hS(zUT9{^fSTHZLle=EC>bYh?+Sl;!3)!Y^%@<_HHhulLCNL|Okt2A@{3$E zoi}*o?I>g2kY7HwkJnlFb>HIG9l)=fgb{R1DNNLtQDMX zE-1*)FUSUN2tk9)tjz1z;LAfy>GBmoc``E(s^G1qwXx4;klEnWG?J$Ws0kzA2QO}{ zb+2_Vf9%-D^R4~Z`k?AW+B~h*)>Lb{wZvM1h3!7uX8yyEKVD&7hE)GnS+`hU zwQjU-us&~n*1F#MB)+3>>G@vkcIz4IIqPL>uJxKV%UWp7!HGZSs3EUoXXlB% zdOdQ^HbGC>#C5hA_=dC-u{2+}bwf>x4V!@CSql^V2lfN^PB!?AEL)OHCewTG7+EY~ z%=q=|XWYR`v6-O~*P$|)D>UF}Y#xX>?Up^2IAg{N-k)2`J%Mc(_Y-%GtKcfR7Oss~ zARwaQ{pnkJ=KZ)j?lO0j+k@?WZYO8t{>p8}k!$ra{2WoQ*s+5-J10J#h#)F$27sZr zb3q;k-hF(c=vdy4so2+JG68P%W4Xu$xfoPR)ypsA2P_OS2G^M@k*QW$S6e}W7t|L3 zprNgew9fVx#Ge|{RnYQj*jML)#5E6JA9sq;`1|<>28RH$ zh(}m(aG<|`^nX0uKCTvETv3MUMkZtPFs>Ft--yqj1fK?yB*RcDwH!Cp)z&9Nn6|wFc}mIGd%F=Y@9wws!Itamy>4V}gUP}C z&Ru_xhiH2i9=OMZ55B+H)+V`Y6kT07;s?WAgiIfT?!6K{y%gHiLzsBjAo}is;CW{o zRENO7{e9f zOI4Lb@FL0)mJWM-^Bl;$bJz~ULf!$$*csYj4S$SF4Y{At5VV1fTIoQXrRp(Ex>vBO zy?M#N^|mG;!i&*K8^7(%i^d2w9sqNB1W$=}>f_bwu(1AqeB|V!^FuF9pEVr11q&5L z$FPV{2aQ_G_jh)?x;Y!2ipe8a3 z{rocI$0o>+QRwGU_MB1-Pg?G_f< z1L;5z25=B_h&+IhiaU375j5Vhwn@ki9u3BWMR*qiwK)LFvp=-r`)&8y*7G0y_+tY8 z^n{{(zipEYV1~B{Klm5hZNko-7ca6HYb9Jm!^K!~$*EI{I@(&BI=Sv1gHDk5HP)WQ zEIQFWZ1rQ0EkY0oyO>xEk_8@mejy1#)((hq59@$C$&Cx-BBafgHDZDLTDIxoWy=yc z73a*V@b_*WVT^d#P^Vc5>k*!R{=WNgrdLI-xlz=<^G;(Gz|#ew2JbZra%VrUSaP3W zQ_plMfGhV3d*>aKXN?(|0LVl{+G#0RU!cm=K&q!gIb{73<_vZQW+@^CwtmsmTL<;h z%hwl4r!Js$fy&|yVL$Zu_qNZ>Y3Q-}n3;<(Gbf?PCShj!R@Gch`Q*#@cEU2>`QDeG zfBwM-yT5|c@YU{5&<%i-)iot20~poZ(bdsw&?F~gcJ^8=m?K8n#Zh;jnFAws6&OGk z{<7U;Tg8=>#G!lcwXG6%!;sodA=HO4>(+=|_i0fHWY@9F*RvZ;DkzZOxOkR6rh5%Su79TjM_(c&vlCFA%~*|IdyTld zp0#bk{NF6-|Ni&C@3;*293B}6o*x2=H{MCryo#ST3KCD zUS4F!b)5KQ>%of>t|KQG*}@>uY8GV#B{K>q%aB+)m;vds=U-o3K&M_le1=dC**|^( z)a}#I{?`a48DD>4h?ivMO51uaX-5J)a#S&Mh3yIGlU-e(+AuC&g-oj}79+p;{4G3= zRx3tLoHB8Q9o6CF?Ge3NLUpk8i)YTK6;^eLAdF;B7=;8IdSHztCC|Zo_zx}?p8M0% zmX38bAG)GFIV*)VabC#Nd6V1Ay#v=p0jq~QY617UwB5%|;a*QG&aBHR$1g}wkJ@AJoH#5&J)DM5ni4a4Y>*l_h8O6+(J#^; zvJ$YM;9(D}dFGjCHa&6QB4Cvsd2YkY>(<3XG9-bgT-0uOan-6-YhL-whF4z&de|hq z{CI!=E5Nhs*=qEP--sbYVn%~?TpJYR=i?s`5EeRQ3?NqV4{uyNapcI6qfv%3JaWje z$S@aCHfiR}NyhQ9lOUP#)wDz(;7o>09O)l`myr{v&KMRsEq3(WxT#20m=!;3@`MQ! z65>b57W);Kyj^x1(R4kK?52JuK=pS2J5L3DvZ;qD@9#6LUo zh$1k%AhRi7Y%l^76$ue78~n{HMGtWRlY zW6H5BSVYeq=mx>fI$NByZ45l!I0?>&I5zfyM<0E3PIPoYEwq6ux%J>z7XY|FaXaP+ z`OxlyD}}bjwwHO-z8016saz|l>gJ3SxbB+5YgeXBnX0Qf30br4WR>Hzl$3^`5p(~t zmUZ>Gjfk6t#vc_EH^Qm0zUQHJ@goB2Q&Nn~Ju!CPop;@J*V6g1iIYcz^Jesv*u+=k z7%@lXhQ68@>x8U!=gC8=f#A*a@E9`>`z~KJdH%%V*mvThb?XwKEl4}FPx%$|A+AiK za?F@9lg5V!I~%pmA(7)JjfNnpihL~I?#p1?G>?T>o|`vsc34*`U{@RTI)#%1>mrH#maymumjk(~z`6^^G>e2+jlz6nFSvVqJ4rk>AgaNqL|%hb6>!FR zxP|`N^VwIN%@}WKkcj6X5jR63ZiYmhMNSDj_yDi;773#OtdtOm82oU^rbNChLVq_s z@MF;qb~3pl2k$?6B5L2|di z;@`i2|97Xa_k={j9pXD&xP1JZ{fieb8lx4w)4%@uvZqx(at*(oghTI(6lj^rWFkWtHIj?``4T4_YPS8tLkE)-D@iQPv zwbm0{0xMF_CoRXS>KXC)>_N@`AUkiHYFjLaW%5C0i&3fSAxAhrKb{qF3Dy%ft)n3W zC+X?$QDuIBon~W%Pi5yJIQ6t~kB>0kN%$;mJAlgl2vtx13g_BR{6&B7z`%N2`s_6Y z+OBu_od9Nj&QKAaeXMwCLA0%OU?7$_Gu%)*4D=PQfj%z2zV4oWURqb*fOvL6+P+f1 zbZ@k#sfi!G6zrb+*?DNRUqApMJ6hoy9`2HxR$-t7I8_yq(C*%O-@S46+v6XK9Gir1 z42p`hT$k{0SL|jLxyXkGzgOLR-_B2Q$iJ$Lvj`7k2XNq(-Xf_MXf25{4b-q@@X8V) z>`em#G6=E=!<-27${os)&JJ8I;59XH`n-k_ZnbT3B3FE$wO^ot0cYBF83Ysenj>Tp z{ucTr2d>RHi#$DcWC&jAEs}9jhE1YcgI~`Tg-D1jmfX)b9?n3MAjMCj(sOeF-rUK_ z8A*O#-Ynw3yt;j!h?pnWF;6aHo`{$yKxVO7=rl}-n||~yv*4yl@COsh@#YzYiGqCZ z-=7qNGsyAQ8Dx|N1$l0dg*N?);(s#{{>)6nTtTsKQLSPB<>1#mKH|TbV}dltjF5qW zaR>%r(Er≠1AU|K%)`OS25Z{|o%e%0D+5{>04U9*Q*1!q^8U;HJTG%Y?XTKK#Ml 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 literal 0 HcmV?d00001 diff --git a/assets/icons/circle-question.svg b/assets/icons/circle-question.svg new file mode 100644 index 0000000..a9f3453 --- /dev/null +++ b/assets/icons/circle-question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/discord.svg b/assets/icons/discord.svg new file mode 100644 index 0000000..12ed677 --- /dev/null +++ b/assets/icons/discord.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/floppy-disk.svg b/assets/icons/floppy-disk.svg new file mode 100644 index 0000000..07b331f --- /dev/null +++ b/assets/icons/floppy-disk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/folder.svg b/assets/icons/folder.svg new file mode 100644 index 0000000..4253902 --- /dev/null +++ b/assets/icons/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/gear.svg b/assets/icons/gear.svg new file mode 100644 index 0000000..409d65e --- /dev/null +++ b/assets/icons/gear.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/github.svg b/assets/icons/github.svg new file mode 100644 index 0000000..52cbe4f --- /dev/null +++ b/assets/icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/home.svg b/assets/icons/home.svg new file mode 100644 index 0000000..230751a --- /dev/null +++ b/assets/icons/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/pen.svg b/assets/icons/pen.svg new file mode 100644 index 0000000..760c655 --- /dev/null +++ b/assets/icons/pen.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/play.svg b/assets/icons/play.svg new file mode 100644 index 0000000..1ac3283 --- /dev/null +++ b/assets/icons/play.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/plus.svg b/assets/icons/plus.svg new file mode 100644 index 0000000..9f774b4 --- /dev/null +++ b/assets/icons/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/stop.svg b/assets/icons/stop.svg new file mode 100644 index 0000000..e712216 --- /dev/null +++ b/assets/icons/stop.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/trash.svg b/assets/icons/trash.svg new file mode 100644 index 0000000..388acff --- /dev/null +++ b/assets/icons/trash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.github/workflows/build.yml b/assets/workflows/build.yml similarity index 100% rename from .github/workflows/build.yml rename to assets/workflows/build.yml diff --git a/configs/templates/moonlight.toml b/configs/templates/moonlight.toml index 41205ee..dd6554e 100644 --- a/configs/templates/moonlight.toml +++ b/configs/templates/moonlight.toml @@ -1,12 +1,18 @@ [mod] name = "moonlight" -path = "/path/to/moonlight/dist" entrypoint = "injector.js" icon = "moonlight.png" [mod.loader] require = """ -require("__MOD_ENTRYPOINT_FILE__").inject( +require("$ENTRYPOINT").inject( require("path").resolve(__dirname, "../_app.asar") ); """ + +[mod.updater] +github_org = "moonlight-mod" +github_repo = "moonlight" +dist_file_name = "dist.tar.gz" +dist_file_type = "TarGz" +icon_url = "https://raw.githubusercontent.com/moonlight-mod/moonlight-mod.github.io/main/src/img/logo.png" diff --git a/crates/gui-new/Cargo.toml b/crates/gui-new/Cargo.toml new file mode 100644 index 0000000..d47391f --- /dev/null +++ b/crates/gui-new/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "gui-new" +version = "0.1.0" +edition = "2024" + +[dependencies] +dialog = "0.3.0" +dioxus = { version = "0.6.2", features = [ + "macro", + "hooks", +], default-features = false } +dirs = "6.0.0" +flate2 = "1.0.35" +freya = { git = "https://github.com/marc2332/freya.git", rev = "9f3439c97c6845dfe12417e59f827c31b80e2724" } +itertools = "0.14.0" +libc = "0.2.167" +libdiscord-modloader = { path = "../libdiscord-modloader", default-features = false } +open = "5.3.1" +serde = "1.0.217" +serde_json = "1.0.135" +strum = "0.26.3" +sysinfo = "0.33.0" +tar = "0.4.43" +tokio = { version = "1.43.0", features = ["rt-multi-thread"] } +toml = "0.8.19" +ureq = { version = "2.12.1", features = ["json"] } +uuid = { version = "1.11.0", features = ["v4"] } diff --git a/crates/gui-new/src/app.rs b/crates/gui-new/src/app.rs new file mode 100644 index 0000000..fd77ef7 --- /dev/null +++ b/crates/gui-new/src/app.rs @@ -0,0 +1,172 @@ +use discord_modloader::utils::{find_running_instances, kill_pids, launch_detached_instance}; +use discord_modloader::{config, paths}; +use freya::prelude::*; + +use crate::{AppPage, CONFIG, CURRENT_PAGE, POPUP_STATE, REFRESH_PIDS, THEME}; +use crate::{PopupState, components}; + +#[component] +pub fn app() -> Element { + use components::sidebar::Sidebar; + + rsx!( + rect { + height: "100%", + width: "100%", + background: "{THEME.read().bg_secondary}", + color: "{THEME.read().text_primary}", + direction: "horizontal", + + if let PopupState::ConfirmDeleteMod(mod_id) = POPUP_STATE() { + DeleteModPopup { mod_id } + } else if let PopupState::ConfirmDeleteProfile(profile_id) = POPUP_STATE() { + DeleteProfilePopup { profile_id } + } else if let PopupState::InstanceAlreadyRunning(profile_id, new_instance_id, args) = POPUP_STATE() { + InstanceAlreadyRunning { profile_id, new_instance_id, args } + } else if let PopupState::ConfirmKillProfile(profile_id) = POPUP_STATE() { + KillInstancesPopup { profile_id } + }, + + Sidebar {}, + + Router {} + } + ) +} + +#[component] +pub fn Router() -> Element { + use components::home_page::HomePage; + use components::mod_from_template_page::ModFromTemplatePage; + use components::mod_page::ModPage; + use components::profile_page::ProfilePage; + use components::settings_page::SettingsPage; + + match CURRENT_PAGE.read().clone() { + AppPage::Home => rsx!(HomePage {}), + AppPage::Mod(mod_id) => rsx!(ModPage { mod_id }), + AppPage::ModFromTemplate => rsx!(ModFromTemplatePage {}), + AppPage::Profile(profile_id) => rsx!(ProfilePage { profile_id }), + AppPage::Settings => rsx!(SettingsPage {}), + } +} + +#[component] +fn DeleteModPopup(mod_id: String) -> Element { + let dependents = CONFIG + .read() + .profiles + .iter() + .filter(|(_k, v)| v.instances.iter().any(|(_k, v)| v.mod_id == mod_id)) + .map(|(_k, v)| v.profile.name.clone()) + .collect::>(); + + let dependent_str = if dependents.is_empty() { + "No profiles depend on this mod.".to_string() + } else { + format!( + "Some profiles depend on this mod and will need updating:\n - {}", + dependents.join("\n - ") + ) + }; + + rsx!(components::popup::ConfirmationPopup { + title: "Delete Mod", + body: format!("Are you sure you want to delete this mod?\n{dependent_str}"), + on_confirm: move |_| { + *POPUP_STATE.write() = PopupState::None; + + // Delete mod + let mod_path = paths::config_mods_dir().join(format!("{mod_id}.toml")); + let _ = std::fs::remove_file(mod_path); + + *CONFIG.write() = config::Config::init(); + + *CURRENT_PAGE.write() = AppPage::Home; + }, + on_cancel: move |_| { + *POPUP_STATE.write() = PopupState::None; + } + }) +} + +#[component] +fn DeleteProfilePopup(profile_id: String) -> Element { + rsx!(components::popup::ConfirmationPopup { + title: "Delete Mod", + body: format!( + "Are you sure you want to delete this profile?\nAny active instances of this profile will be stopped." + ), + on_confirm: move |_| { + *POPUP_STATE.write() = PopupState::None; + + let pids = find_running_instances( + &profile_id, + &CONFIG.read().profiles.get(&profile_id).unwrap().clone(), + ); + + kill_pids(pids); + + // Delete mod + let profile_path = paths::config_profile_dir().join(format!("{profile_id}.toml")); + let _ = std::fs::remove_file(profile_path); + + *CONFIG.write() = config::Config::init(); + + *REFRESH_PIDS.write() = (); + + *CURRENT_PAGE.write() = AppPage::Home; + }, + on_cancel: move |_| { + *POPUP_STATE.write() = PopupState::None; + } + }) +} + +#[component] +fn KillInstancesPopup(profile_id: String) -> Element { + rsx!(components::popup::ConfirmationPopup { + title: "Stop Running Instances", + body: "Are you sure you want to stop all running instances of this profile?", + on_confirm: move |_| { + *POPUP_STATE.write() = PopupState::None; + + let pids = find_running_instances( + &profile_id, + &CONFIG.read().profiles.get(&profile_id).unwrap().clone(), + ); + + kill_pids(pids); + + *REFRESH_PIDS.write() = (); + }, + on_cancel: move |_| { + *POPUP_STATE.write() = PopupState::None; + } + }) +} + +#[component] +fn InstanceAlreadyRunning(profile_id: String, new_instance_id: String, args: String) -> Element { + rsx!(components::popup::ConfirmationPopup { + title: "Instance already running", + body: "An instance of this profile is already running.\nDo you want to stop the running instance and start a new one?", + on_confirm: move |_| { + *POPUP_STATE.write() = PopupState::None; + + let pids = find_running_instances( + &profile_id, + &CONFIG.read().profiles.get(&profile_id).unwrap().clone(), + ); + + kill_pids(pids); + + launch_detached_instance(&profile_id, &new_instance_id, &args, false).unwrap(); + + *REFRESH_PIDS.write() = (); + }, + on_cancel: move |_| { + *POPUP_STATE.write() = PopupState::None; + } + }) +} diff --git a/crates/gui-new/src/assets.rs b/crates/gui-new/src/assets.rs new file mode 100644 index 0000000..1b34520 --- /dev/null +++ b/crates/gui-new/src/assets.rs @@ -0,0 +1,126 @@ +use discord_modloader::config; + +pub const CIRCLE_QUESTION_ICON: &[u8] = include_bytes!("../../../assets/icons/circle-question.svg"); +pub const DISCORD_ICON: &[u8] = include_bytes!("../../../assets/icons/discord.svg"); +pub const FLOPPY_DISK_ICON: &[u8] = include_bytes!("../../../assets/icons/floppy-disk.svg"); +pub const FOLDER_ICON: &[u8] = include_bytes!("../../../assets/icons/folder.svg"); +pub const GEAR_ICON: &[u8] = include_bytes!("../../../assets/icons/gear.svg"); +pub const GITHUB_ICON: &[u8] = include_bytes!("../../../assets/icons/github.svg"); +pub const HOME_ICON: &[u8] = include_bytes!("../../../assets/icons/home.svg"); +pub const PLAY_ICON: &[u8] = include_bytes!("../../../assets/icons/play.svg"); +pub const PLUS_ICON: &[u8] = include_bytes!("../../../assets/icons/plus.svg"); +pub const PEN_ICON: &[u8] = include_bytes!("../../../assets/icons/pen.svg"); +pub const STOP_ICON: &[u8] = include_bytes!("../../../assets/icons/stop.svg"); +pub const TRASH_ICON: &[u8] = include_bytes!("../../../assets/icons/trash.svg"); + +pub const FONT_INTER: &[u8] = include_bytes!("../../../assets/fonts/Inter-Variable.ttf"); + +pub const DISCORD_INVITE_LINK: &str = "https://discord.gg/r5bmSXBEPC"; +pub const GITHUB_REPO_LINK: &str = "https://github.com/meguminsama/discord-modloader"; + +pub const MOONLIGHT_LOGO: &[u8] = include_bytes!("../../../configs/icons/moonlight.png"); +pub const VENCORD_LOGO: &[u8] = include_bytes!("../../../configs/icons/vencord.png"); + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ModTemplateIcon { + Svg(&'static [u8]), + Image(&'static [u8]), +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ModTemplate { + pub config: config::Mod, + pub icon: Option, + pub support_link: Option, +} + +pub struct ModTemplates; + +impl ModTemplates { + pub fn get_all() -> Vec { + vec![Self::blank(), Self::moonlight(), Self::vencord()] + } + + pub fn blank() -> ModTemplate { + let config = config::Mod { + name: "New Blank Template".to_string(), + entrypoint: "injector.js".to_string(), + + updater: None, + + icon: None, + loader: None, + path: None, + }; + + ModTemplate { + config, + icon: Some(ModTemplateIcon::Svg(PLUS_ICON)), + support_link: None, + } + } + + pub fn moonlight() -> ModTemplate { + let config = config::Mod { + name: "New Moonlight Template".to_string(), + entrypoint: "injector.js".to_string(), + + updater: Some(config::ModUpdater { + github_org: "moonlight-mod".to_string(), + github_repo: "moonlight".to_string(), + dist_file_names: vec!["dist.tar.gz".to_string()], + dist_file_type: config::DistFileType::TarGz, + icon_url: Some( + "https://raw.githubusercontent.com/moonlight-mod/moonlight-mod.github.io/main/src/img/logo.png".to_string(), + ), + ask_before_update: true, + auto_update: true, + }), + + icon: None, + loader: None, + path: None, + }; + + ModTemplate { + config, + icon: Some(ModTemplateIcon::Image(MOONLIGHT_LOGO)), + support_link: Some("https://moonlight-mod.github.io".to_string()), + } + } + + pub fn vencord() -> ModTemplate { + let config = config::Mod { + name: "New Vencord Template".to_string(), + entrypoint: "patcher.js".to_string(), + + updater: Some(config::ModUpdater { + github_org: "vendicated".to_string(), + github_repo: "vencord".to_string(), + // TODO: Force vencord to have a single dist file because RAAAAAAAAAA + dist_file_names: vec!["patcher.js", "preload.js", "renderer.js", "renderer.css"] + .into_iter() + .map(|s| s.to_string()) + .collect(), + dist_file_type: config::DistFileType::Raw, + icon_url: Some( + "https://raw.githubusercontent.com/Vencord/Vesktop/main/static/icon.png" + .to_string(), + ), + ask_before_update: true, + // TODO: Check this works properly, otherwise, let vencord use it's own updater. + auto_update: true, + }), + + icon: None, + loader: None, + path: None, + }; + + ModTemplate { + config, + icon: Some(ModTemplateIcon::Image(VENCORD_LOGO)), + support_link: Some("https://vencord.dev".to_string()), + } + } +} diff --git a/crates/gui-new/src/components/button.rs b/crates/gui-new/src/components/button.rs new file mode 100644 index 0000000..b1fd1a9 --- /dev/null +++ b/crates/gui-new/src/components/button.rs @@ -0,0 +1,117 @@ +use freya::prelude::*; + +use crate::{THEME, utils::hoverable::hoverable}; + +#[component] +pub fn Button( + children: Element, + onpress: Option>, + selected: Option, + base_color: Option, + target_color: Option, + selected_color: Option, + width: Option, + height: Option, + corner_radius: Option, + padding: Option, + main_align: Option, + cross_align: Option, + onmouseenter: Option>, + onmouseleave: Option>, + shadow: Option, + stretch: Option, + margin: Option, + direction: Option, + spacing: Option, +) -> Element { + let mut animation = hoverable!(move |_conf| { + let base_color = base_color.as_deref().unwrap_or(THEME.read().bg_tertiary); + let target_color = target_color.as_deref().unwrap_or(THEME.read().blurple); + AnimColor::new(base_color, target_color) + .ease(Ease::InOut) + .time(100) + }); + + let background = match selected { + Some(true) => selected_color + .as_deref() + .unwrap_or(THEME.read().blurple) + .to_string(), + _ => animation.animation.get().read().read(), + }; + + let corner_radius = match corner_radius { + Some(corner_radius) => corner_radius, + None => "8".to_string(), + }; + + let width = match width { + Some(width) => width, + None => "auto".to_string(), + }; + + let height = match height { + Some(height) => height, + None => "40".to_string(), + }; + + let padding = match padding { + Some(padding) => padding, + None => "8 16".to_string(), + }; + + let shadow = match shadow { + Some(shadow) => shadow, + None => freya::hooks::DARK_THEME.button.shadow.into(), + }; + + let stretch = stretch.unwrap_or(true); + let button_width = if stretch { "100%" } else { "auto" }; + let button_height = if stretch { "auto" } else { "100%" }; + + rsx!(rect { + width: width, + height: height, + margin: margin, + onmouseenter: move |e| { + (animation.onmouseenter)(e.clone()); + if let Some(onmouseenter) = onmouseenter { + onmouseenter(e); + } + }, + onmouseleave: move |e| { + (animation.onmouseleave)(e.clone()); + if let Some(onmouseleave) = onmouseleave { + onmouseleave(e); + } + }, + freya::prelude::Button { + onpress: onpress, + theme: theme_with!(ButtonTheme { + background: background.clone().into(), + hover_background: background.clone().into(), + border_fill: background.clone().into(), + focus_border_fill: THEME.read().blurple.into(), + padding: padding.clone().into(), + shadow: shadow.into(), + width: button_width.into(), + height: button_height.into(), + corner_radius: corner_radius.clone().into(), + }), + rect { + // content: "fit", + corner_radius: corner_radius.clone(), + direction: direction.as_deref().unwrap_or("horizontal"), + cross_align: cross_align.as_deref().unwrap_or("center"), + main_align: main_align.as_deref().unwrap_or("start"), + spacing: spacing.as_deref().unwrap_or("8"), + width: if stretch { "calc(100% - 4)" } else { "auto" }, + height: if stretch { "calc(100% - 4)" } else { "auto" }, + color: THEME.read().text_primary, + background: background, + + {children} + } + } + }) +} diff --git a/crates/gui-new/src/components/home_page.rs b/crates/gui-new/src/components/home_page.rs new file mode 100644 index 0000000..cb7c52d --- /dev/null +++ b/crates/gui-new/src/components/home_page.rs @@ -0,0 +1,10 @@ +use freya::prelude::*; + +#[component] +pub fn HomePage() -> Element { + rsx!( + label { + "HomePage Not Implemented" + } + ) +} diff --git a/crates/gui-new/src/components/mod.rs b/crates/gui-new/src/components/mod.rs new file mode 100644 index 0000000..458485b --- /dev/null +++ b/crates/gui-new/src/components/mod.rs @@ -0,0 +1,10 @@ +pub mod home_page; +pub mod mod_from_template_page; +pub mod mod_page; +pub mod profile_page; +pub mod settings_page; + +pub mod sidebar; + +pub mod button; +pub mod popup; diff --git a/crates/gui-new/src/components/mod_from_template_page.rs b/crates/gui-new/src/components/mod_from_template_page.rs new file mode 100644 index 0000000..71f10a8 --- /dev/null +++ b/crates/gui-new/src/components/mod_from_template_page.rs @@ -0,0 +1,158 @@ +use discord_modloader::{config, paths, updater}; +use freya::prelude::*; + +use crate::components::button::Button; +use crate::{AppPage, CONFIG, CURRENT_PAGE, THEME, assets}; + +#[component] +pub fn ModFromTemplatePage() -> Element { + let templates = assets::ModTemplates::get_all(); + + rsx!(rect { + direction: "vertical", + padding: "8", + + Header { } + + ScrollView { + direction: "vertical", + + for template in templates { + rect { + direction: "horizontal", + spacing: "8", + content: "fit", + + if let Some(ref link) = template.support_link { + SupportButton { link } + } + + ModTemplateCard { template: template.clone() } + } + } + } + }) +} + +#[component] +fn SupportButton(link: String) -> Element { + let support_icon = static_bytes(assets::CIRCLE_QUESTION_ICON); + + rsx!( + Button { + width: "64", + height: "64", + padding: "8", + margin: "8 0", + corner_radius: "8", + base_color: THEME.read().bg_primary, + + onpress: move |_| { let _ = open::that(&link); }, + + svg { + width: "48", + height: "48", + + fill: THEME.read().text_primary, + + svg_data: support_icon, + } + } + ) +} + +#[component] +fn ModTemplateCard(template: assets::ModTemplate) -> Element { + let config_template = template.config.clone(); + + let onpress = move || { + let uuid = uuid::Uuid::new_v4().to_string(); + let mod_path = paths::config_mods_dir().join(format!("{}.toml", uuid)); + + let mod_toml = toml::to_string(&config::ModConfig { + r#mod: config_template.clone(), + }) + .unwrap(); + + let _ = std::fs::write(mod_path, mod_toml); + + *CONFIG.write() = config::Config::init(); + + *CURRENT_PAGE.write() = AppPage::Mod(uuid); + + if let Some(updater) = &config_template.updater { + let _ = updater::update(updater, true); + } + }; + + // BUG: The button stretches off the screen for some reason. + // Possibly an issue with layout calculation since the button is rendered in a for loop? + // It's not harmful, but just a bit weird. + rsx!(Button { + height: "64", + padding: "8", + margin: "8 0", + corner_radius: "8", + base_color: THEME.read().bg_primary, + + onpress: move |_| { onpress(); }, + + cross_align: "center", + + spacing: "12", + + if let Some(icon) = template.icon { + match icon { + assets::ModTemplateIcon::Svg(svg) => { + let image = static_bytes(svg); + rsx!(svg { + width: "48", + height: "48", + + fill: THEME.read().text_primary, + + svg_data: image, + }) + } + assets::ModTemplateIcon::Image(image) => { + let image = static_bytes(image); + rsx!(image { + width: "48", + height: "48", + + image_data: image, + }) + } + } + } + + label { + font_size: "18", + + "{template.config.name}" + } + }) +} + +#[component] +fn Header() -> Element { + rsx!(rect { + width: "100%", + padding: "12", + corner_radius: "8", + border: "0 0 2 0 outer {THEME.read().bg_secondary}", + + background: THEME.read().bg_primary, + + direction: "horizontal", + cross_align: "center", + + spacing: "12", + + label { + font_size: "18", + + "Create a new mod from a template" + } + }) +} diff --git a/crates/gui-new/src/components/mod_page.rs b/crates/gui-new/src/components/mod_page.rs new file mode 100644 index 0000000..9df2883 --- /dev/null +++ b/crates/gui-new/src/components/mod_page.rs @@ -0,0 +1,675 @@ +use freya::prelude::*; +use strum::IntoEnumIterator as _; + +use crate::components::button::Button; +use crate::utils::icons::GetIcon; +use crate::{CONFIG, POPUP_STATE, PopupState, THEME, utils::hoverable::hoverable}; +use discord_modloader::{config, paths}; + +type ModContext = Signal<(String, config::Mod)>; + +fn get_mod_by_id(mod_id: &str) -> (String, config::Mod) { + CONFIG + .read() + .mods + .get(mod_id) + .map(|mod_| (mod_id.to_string(), mod_.clone())) + .unwrap_or_else(|| { + let mod_ = config::Mod { + name: "New Mod".into(), + ..Default::default() + }; + (mod_id.to_string(), mod_) + }) +} + +#[component] +pub fn ModPage(mod_id: String) -> Element { + let mut mod_: ModContext = use_signal(|| get_mod_by_id(&mod_id)); + + use_context_provider(|| mod_); + + use_effect(use_reactive(&mod_id, move |mod_id| { + *mod_.write() = get_mod_by_id(&mod_id); + })); + + rsx!(rect { + direction: "vertical", + + padding: "8", + + Header { + on_delete_pressed: move |_| { + *POPUP_STATE.write() = PopupState::ConfirmDeleteMod(mod_id.clone()); + } + } + + Form { } + }) +} + +#[component] +fn Header(on_delete_pressed: EventHandler<()>) -> Element { + let ctx = use_context::(); + let (_mod_id, mod_) = &*ctx.read(); + + let mod_icon = mod_.get_icon().map(dynamic_bytes); + + rsx!(rect { + width: "100%", + padding: "12 8 12 12", + corner_radius: "8", + border: "0 0 2 0 outer {THEME.read().bg_secondary}", + + background: THEME.read().bg_primary, + + direction: "horizontal", + cross_align: "center", + + spacing: "12", + + if mod_icon.is_some() { + image { + width: "48", + height: "48", + image_data: mod_icon, + } + } + + label { + font_size: "18", + + "{mod_.name}" + } + + rect { + width: "fill", + direction: "horizontal", + main_align: "end", + spacing: "8", + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + onpress: move |_| { + let mod_path = discord_modloader::paths::config_mods_dir(); + let _ = open::that(mod_path); + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::FOLDER_ICON), + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + target_color: THEME.read().bg_danger, + + onpress: move |_| on_delete_pressed.call(()), + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::TRASH_ICON), + fill: THEME.read().text_primary, + } + } + } + }) +} + +#[component] +fn Form() -> Element { + let ctx = use_context::(); + + let mut mod_id = use_signal(|| ctx.read().0.clone()); + let mut mod_form = use_signal(|| ctx.read().1.clone()); + let mut dist_files_form = use_signal(|| { + ctx.read() + .1 + .updater + .clone() + .map(|u| u.dist_file_names.join(", ")) + .unwrap_or_default() + }); + + use_effect(move || { + *mod_form.write() = ctx.read().1.clone(); + *mod_id.write() = ctx.read().0.clone(); + *dist_files_form.write() = ctx + .read() + .1 + .updater + .clone() + .map(|u| u.dist_file_names.join(", ")) + .unwrap_or_default(); + }); + + let update = move || { + let mod_id = ctx.read().0.clone(); + let mod_ = mod_form.read().clone(); + + let mod_toml = toml::to_string::(&config::ModConfig { r#mod: mod_ }); + + if let Ok(mod_toml) = mod_toml { + let mod_path = paths::config_mods_dir().join(format!("{}.toml", mod_id)); + let _ = std::fs::write(mod_path, mod_toml); + } + + *CONFIG.write() = config::Config::init(); + }; + + rsx!(rect { + margin: "8 8 0 0", + + Button { + corner_radius: "8", + stretch: false, + + selected_color: THEME.read().bg_success, + selected: *mod_id.read() == ctx.read().0 && *mod_form.read() != ctx.read().1, + + onpress: move |_| { update(); }, + + svg { + width: "20", + height: "20", + svg_data: static_bytes(crate::assets::FLOPPY_DISK_ICON), + fill: THEME.read().text_primary, + } + + label { + "Save" + } + } + + ScrollView { + scrollbar_theme: theme_with!(ScrollBarTheme { + background: THEME.read().bg_tertiary.into(), + }), + + label { + margin: "8", + font_size: "18", + "Basic Mod Configuration" + } + + // Basic Mod Configuration + rect { + background: THEME.read().bg_primary, + corner_radius: "8", + padding: "8", + + spacing: "8", + + // Mod Name + rect { + width: "100%", + label { + margin: "4", + "Mod Name" + } + + Input { + value: "{mod_form().name}", + onvalidate: |v: InputValidator| v.set_valid(v.text().len() <= 32), + onchange: move |e| mod_form.write().name = e, + placeholder: "Mod Name", + theme: theme_with!(InputTheme { + width: "100%".into(), + corner_radius: "8".into(), + border_fill: THEME.read().bg_secondary.into(), + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background: THEME.read().bg_tertiary.into(), + hover_background: THEME.read().bg_tertiary.into(), + }) + } + } + + // Mod Entrypoint + rect { + width: "100%", + label { + margin: "4", + "Entrypoint File" + } + + label { + margin: "4", + color: THEME.read().text_secondary, + "This is the file that initialises your mod. Usually called something like injector.js or patcher.js" + } + + Input { + value: "{mod_form().entrypoint}", + onchange: move |e: String| { + if e.len() > 64 { + return; + } + mod_form.write().entrypoint = e; + }, + placeholder: "injector.js", + theme: theme_with!(InputTheme { + width: "100%".into(), + corner_radius: "8".into(), + border_fill: THEME.read().bg_secondary.into(), + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background: THEME.read().bg_tertiary.into(), + hover_background: THEME.read().bg_tertiary.into(), + }) + } + } + + // Mod Path + rect { + width: "100%", + label { + margin: "4", + "Path to the mod's build folder (leave empty to use the auto-updater)" + } + + Input { + value: "{mod_form().path.unwrap_or_default()}", + onchange: move |e: String| { + if e.is_empty() { + mod_form.write().path = None; + } else { + mod_form.write().path = Some(e); + } + }, + placeholder: "/path/to/moonlight", + theme: theme_with!(InputTheme { + width: "100%".into(), + corner_radius: "8".into(), + border_fill: THEME.read().bg_secondary.into(), + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background: THEME.read().bg_tertiary.into(), + hover_background: THEME.read().bg_tertiary.into(), + }) + } + } + + // Icon Name + rect { + width: "100%", + label { + margin: "4", + "Icon Filename (leave empty to use the auto-updater's icon)" + } + + label { + margin: "4", + color: THEME.read().text_secondary, + "Place your icon in the root of the icons folder and enter it's name here." + } + + Input { + value: "{mod_form().icon.unwrap_or_default()}", + onchange: move |e: String| { + if e.is_empty() { + mod_form.write().icon = None; + } else { + mod_form.write().icon = Some(e); + } + }, + placeholder: "moonlight.png", + theme: theme_with!(InputTheme { + width: "100%".into(), + corner_radius: "8".into(), + border_fill: THEME.read().bg_secondary.into(), + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background: THEME.read().bg_tertiary.into(), + hover_background: THEME.read().bg_tertiary.into(), + }) + } + + Button { + stretch: false, + padding: "8 16", + margin: "8 0 0 0", + corner_radius: "8", + main_align: "center", + height: "42", + + onpress: move |_| { + let _ = open::that(discord_modloader::paths::config_icons_dir()); + }, + + label { + font_size: "16", + + "Open Icons Folder" + } + } + } + } + + label { + margin: "8", + font_size: "18", + "Auto Updater (optional)" + } + + // Auto Updater Configuration + rect { + background: THEME.read().bg_primary, + corner_radius: "8", + padding: "8", + spacing: "8", + + // Auto Update + rect { + width: "100%", + label { + margin: "4", + "Enable automatic updater?" + } + + label { + margin: "4", + color: THEME.read().text_secondary, + "If disabled, you will need to use your mod's auto-updater instead." + } + + Tile { + onselect: move |_| { + let mut new_updater = mod_form().updater.unwrap_or_default(); + new_updater.auto_update = !new_updater.auto_update; + mod_form.write().updater = Some(new_updater); + }, + leading: rsx!(Checkbox { + selected: mod_form().updater.map(|u| u.auto_update).unwrap_or_default() + }), + label { + "Enable auto-updater" + } + } + } + + if mod_form().updater.unwrap_or_default().auto_update { + // Always Update + rect { + width: "100%", + label { + margin: "4", + "Ask before applying updates?" + } + + Tile { + onselect: move |_| { + let mut new_updater = mod_form().updater.unwrap_or_default(); + new_updater.ask_before_update = !new_updater.ask_before_update; + mod_form.write().updater = Some(new_updater); + }, + leading: rsx!(Checkbox { + selected: mod_form().updater.map(|u| u.ask_before_update).unwrap_or_default() + }), + label { + "Always ask before updating" + } + } + } + } + + // GitHub Organisation + rect { + width: "100%", + label { + margin: "4", + "GitHub Organisation" + } + + Input { + value: "{mod_form().updater.map(|u| u.github_org).unwrap_or_default()}", + onchange: move |e: String| { + let mut new_updater = mod_form().updater.unwrap_or_default(); + new_updater.github_org = e.clone(); + + mod_form.write().updater = Some(new_updater); + + }, + placeholder: "moonlight-mod", + theme: theme_with!(InputTheme { + width: "100%".into(), + corner_radius: "8".into(), + border_fill: THEME.read().bg_secondary.into(), + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background: THEME.read().bg_tertiary.into(), + hover_background: THEME.read().bg_tertiary.into(), + }) + } + } + + // GitHub Repository + rect { + width: "100%", + label { + margin: "4", + "GitHub Repository" + } + + Input { + value: "{mod_form().updater.map(|u| u.github_repo).unwrap_or_default()}", + onchange: move |e: String| { + let mut new_updater = mod_form().updater.unwrap_or_default(); + new_updater.github_repo = e.clone(); + + mod_form.write().updater = Some(new_updater); + + }, + placeholder: "moonlight", + theme: theme_with!(InputTheme { + width: "100%".into(), + corner_radius: "8".into(), + border_fill: THEME.read().bg_secondary.into(), + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background: THEME.read().bg_tertiary.into(), + hover_background: THEME.read().bg_tertiary.into(), + }) + } + } + + // Release File Type + rect { + width: "100%", + label { + margin: "4", + "Release File Type" + } + + Dropdown { + value: "{mod_form().updater.map(|u| u.dist_file_type).unwrap_or_default()}", + + theme: theme_with!(DropdownTheme { + border_fill: THEME.read().bg_secondary.into(), + focus_border_fill: THEME.read().blurple.into(), + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background_button: THEME.read().bg_tertiary.into(), + hover_background: THEME.read().bg_tertiary.into(), + dropdown_background: THEME.read().bg_tertiary.into(), + }), + + for i in discord_modloader::config::DistFileType::iter() { + DropdownItem { + value: i.to_string(), + + theme: theme_with!(DropdownItemTheme { + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background: THEME.read().bg_tertiary.into(), + select_background: THEME.read().bg_primary.into(), + hover_background: THEME.read().bg_primary.into(), + }), + + onpress: { + to_owned![i]; + move |_| { + let mut new_updater = mod_form().updater.unwrap_or_default(); + new_updater.dist_file_type = i.clone(); + + mod_form.write().updater = Some(new_updater); + } + }, + + label { + "{i}" + } + } + } + } + } + + // Release File Name + rect { + width: "100%", + label { + margin: "4", + "Release File Names (The file(s) to download from GitHub Releases) Separate with commas if downloading multiple." + } + + Input { + value: "{dist_files_form()}", + onchange: move |e: String| { + *dist_files_form.write() = e.clone(); + + let split = e.split(", ").map(|s| s.trim().to_string()); + + let mut new_updater = mod_form().updater.unwrap_or_default(); + new_updater.dist_file_names = split.collect(); + + mod_form.write().updater = Some(new_updater); + + }, + placeholder: "dist.tar.gz", + theme: theme_with!(InputTheme { + width: "100%".into(), + corner_radius: "8".into(), + border_fill: THEME.read().bg_secondary.into(), + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background: THEME.read().bg_tertiary.into(), + hover_background: THEME.read().bg_tertiary.into(), + }) + } + } + + // Icon URL + rect { + width: "100%", + label { + margin: "4", + "Icon URL (Optional, automatically download the latest icon from a URL)" + } + + Input { + value: "{mod_form().updater.map(|u| u.icon_url.unwrap_or_default()).unwrap_or_default()}", + onchange: move |e: String| { + let mut new_updater = mod_form().updater.unwrap_or_default(); + if e.is_empty() { + new_updater.icon_url = None; + } else { + new_updater.icon_url = Some(e.clone()); + } + mod_form.write().updater = Some(new_updater); + + }, + placeholder: "https://raw.githubusercontent.com/moonlight-mod/moonlight-mod.github.io/main/src/img/logo.png", + theme: theme_with!(InputTheme { + width: "100%".into(), + corner_radius: "8".into(), + border_fill: THEME.read().bg_secondary.into(), + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background: THEME.read().bg_tertiary.into(), + hover_background: THEME.read().bg_tertiary.into(), + }) + } + } + } + } + }) +} + +#[component] +fn SaveButton(pending: bool, onclick: EventHandler>) -> Element { + let floppy_disk_icon = static_bytes(crate::assets::FLOPPY_DISK_ICON); + + let animation = hoverable!(move |_conf| { + AnimColor::new(THEME.read().bg_primary, THEME.read().blurple) + .ease(Ease::InOut) + .time(100) + }); + + let bg_color = if pending { + THEME.read().bg_success + } else { + &animation.animation.get().read().read() + }; + + rsx!(rect { + height: "48", + corner_radius: "8", + padding: "8", + spacing: "8", + + direction: "horizontal", + cross_align: "center", + + background: bg_color, + onmouseenter: animation.onmouseenter, + onmouseleave: animation.onmouseleave, + + onclick: move |e| onclick.call(e), + + main_align: "center", + cross_align: "center", + + svg { + width: "20", + height: "20", + svg_data: floppy_disk_icon, + fill: "#ffffff", + } + + label { + if pending { + "Click to save changes" + } else { + "No changes to save" + } + } + }) +} diff --git a/crates/gui-new/src/components/popup.rs b/crates/gui-new/src/components/popup.rs new file mode 100644 index 0000000..5c4f1d1 --- /dev/null +++ b/crates/gui-new/src/components/popup.rs @@ -0,0 +1,128 @@ +use freya::prelude::*; + +use crate::components::button::Button; +use crate::{THEME, utils::hoverable::hoverable}; + +#[component] +pub fn ConfirmationPopup( + title: String, + body: String, + on_confirm: EventHandler<()>, + on_cancel: EventHandler<()>, +) -> Element { + use_focus().focus(); + + rsx!(Popup { + theme: theme_with!(PopupTheme { + background: THEME.read().bg_primary.into(), + color: THEME.read().text_primary.into(), + height: "auto".into(), + }), + close_on_escape_key: true, + + oncloserequest: move |_| { + on_cancel.call(()); + }, + PopupTitle { + label { + "{title}" + }, + }, + PopupContent { + label { + "{body}" + }, + + rect { + margin: "8", + spacing: "8", + direction: "horizontal", + width: "fill", + height: "auto", + cross_align: "end", + main_align: "end", + + Button { + stretch: false, + onpress: move |_| { + on_cancel.call(()); + }, + label { + "Cancel" + }, + }, + + Button { + stretch: false, + base_color: THEME.read().bg_danger, + onpress: move |_| { + on_confirm.call(()); + }, + + label { + "Confirm" + } + } + }, + }, + }) +} + +#[component] +fn PopupButton( + name: String, + onclick: EventHandler, + icon: Option<&'static [u8]>, + color: Option, +) -> Element { + let animation = hoverable!(move |_conf| { + AnimColor::new( + if let Some(ref color) = color { + color + } else { + THEME.read().bg_secondary + }, + THEME.read().blurple, + ) + .ease(Ease::InOut) + .time(100) + }); + + let bg_color = animation.animation.get().read().read(); + + let icon = icon.map(static_bytes); + + rsx!(rect { + // width: "100%", + padding: "8 16", + corner_radius: "8", + direction: "horizontal", + cross_align: "center", + spacing: "8", + height: "42", + color: THEME.read().text_primary, + background: bg_color, + onmouseenter: animation.onmouseenter, + onmouseleave: animation.onmouseleave, + + onclick: { + #[allow(clippy::redundant_closure)] + move |e| onclick(e) + }, + + if icon.is_some() { + svg { + width: "24", + height: "24", + svg_data: icon, + fill: "#ffffff", + } + } + + label { + font_size: "16", + + "{name}" + } + }) +} diff --git a/crates/gui-new/src/components/profile_page.rs b/crates/gui-new/src/components/profile_page.rs new file mode 100644 index 0000000..e41ddd3 --- /dev/null +++ b/crates/gui-new/src/components/profile_page.rs @@ -0,0 +1,424 @@ +use discord_modloader::config; +use discord_modloader::utils::{find_running_instances, launch_detached_instance}; +use freya::prelude::*; + +use crate::components::button::Button; +use crate::utils::icons::GetIcon; +use crate::{CONFIG, POPUP_STATE, PopupState, REFRESH_PIDS, THEME}; + +type ProfileContext = Signal<(String, config::ProfileConfig)>; + +fn get_profile_by_id(profile_id: &str) -> (String, config::ProfileConfig) { + CONFIG + .read() + .profiles + .get(profile_id) + .map(|profile| (profile_id.to_string(), profile.clone())) + .unwrap_or_else(|| { + let profile = config::Profile { + name: "New Profile".to_string(), + ..Default::default() + }; + (profile_id.to_string(), config::ProfileConfig { + profile, + ..Default::default() + }) + }) +} + +#[component] +pub fn ProfilePage(profile_id: String) -> Element { + let mut profile: ProfileContext = use_signal(|| get_profile_by_id(&profile_id)); + let mut active_pids = use_signal(Vec::new); + + use_context_provider(|| profile); + + use_effect(use_reactive(&profile_id, move |profile_id| { + let (profile_id, new_profile) = get_profile_by_id(&profile_id); + *active_pids.write() = find_running_instances(&profile_id, &new_profile); + *profile.write() = (profile_id, new_profile); + })); + + use_effect(move || { + REFRESH_PIDS.read(); + // Run pid refresh a second later, since Discord doesn't launch instantly. + spawn(async move { + let (profile_id_, profile_) = profile.read().clone(); + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + // If the page changes, we don't want to update the old pids anymore. + if profile.read().0 == profile_id_ { + *active_pids.write() = find_running_instances(&profile_id_, &profile_); + } + }); + }); + + rsx!(rect { + direction: "vertical", + padding: "8", + spacing: "8", + Header { + on_delete_pressed: move |_| { + *POPUP_STATE.write() = PopupState::ConfirmDeleteProfile(profile_id.clone()); + } + } + + ActiveInstance { + active_pids: active_pids, + } + + ScrollView { + direction: "vertical", + spacing: "8", + + for (instance_id, instance) in profile.read().1.instances.iter() { + InstanceCard { + instance_id: instance_id.clone(), + instance: instance.clone() + } + } + } + }) +} + +#[component] +fn ActiveInstance(active_pids: Signal>) -> Element { + let ctx: ProfileContext = use_context(); + let profile_id = ctx.read().0.to_string(); + + rsx!(rect { + height: "64", + width: "fill", + padding: "8", + corner_radius: "8", + + background: THEME.read().bg_primary, + + direction: "horizontal", + spacing: "8", + main_align: "start", + cross_align: "center", + + label { + if active_pids.len() > 0 { + "There are active instances using this profile." + } else { + "No instances are currently running using this profile." + } + } + + if active_pids.len() > 0 { + rect { + width: "fill", + direction: "horizontal", + spacing: "8", + main_align: "end", + + Button { + height: "48", + stretch: false, + corner_radius: "8", + direction: "horizontal", + main_align: "center", + cross_align: "center", + + target_color: THEME.read().bg_danger, + + onpress: move |_| { + *POPUP_STATE.write() = PopupState::ConfirmKillProfile(profile_id.clone()); + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::STOP_ICON), + fill: THEME.read().text_primary, + } + + label { + font_size: "16", + "Kill Active Instance" + } + } + } + } + }) +} + +#[component] +fn InstanceCard(instance_id: String, instance: config::Instance) -> Element { + let ctx: ProfileContext = use_context(); + let profile_id = ctx.read().0.to_string(); + let profile = ctx.read().1.clone(); + let icon = instance.get_icon().map(dynamic_bytes); + let mut edit_mode = use_signal(|| false); + + rsx!(rect { + direction: "vertical", + spacing: "8", + corner_radius: "8", + + background: THEME.read().bg_primary, + padding: "8", + + rect { + height: "64", + width: "fill", + + direction: "horizontal", + spacing: "8", + main_align: "start", + cross_align: "center", + + if let Some(icon) = icon { + image { + width: "48", + height: "48", + image_data: icon, + } + } + + label { + "{instance.name}" + } + + rect { + width: "fill", + direction: "horizontal", + spacing: "8", + main_align: "end", + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + target_color: THEME.read().bg_success, + + onpress: { + to_owned![profile_id, instance_id]; + move |_| { + let profile_id = profile_id.clone(); + let instance_id = instance_id.clone(); + let args = profile.discord.args.clone(); + + if !find_running_instances(&profile_id, &profile).is_empty() { + *POPUP_STATE.write() = PopupState::InstanceAlreadyRunning(profile_id, instance_id, args); + } else { + let _ = launch_detached_instance(&profile_id, &instance_id, &args, false); + *REFRESH_PIDS.write() = (); + } + } + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::PLAY_ICON), + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + target_color: THEME.read().blurple, + + onpress: move |_| { + let current = *edit_mode.read(); + println!("Edit mode is {current}"); + *edit_mode.write() = !current; + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::PEN_ICON), + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + target_color: THEME.read().bg_danger, + + onpress: move |_| {}, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::TRASH_ICON), + fill: THEME.read().text_primary, + } + } + } + } + + if edit_mode() { + InstanceEdit { + instance_id: instance_id.clone(), + instance: instance.clone() + } + } + }) +} + +#[component] +fn InstanceEdit(instance_id: String, instance: config::Instance) -> Element { + let mods = use_signal(|| CONFIG.read().mods.clone()); + + // Dropdown doesn't let you use a custom string - only showing the value (key). + // So we made a struct that implements Display to render the name rather than the key. + #[derive(Clone, PartialEq)] + struct SelectedId(String, String); + + impl std::fmt::Display for SelectedId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.1) + } + } + + let mut selected_mod = use_signal(|| { + mods.read() + .get(&instance.mod_id) + .map(|m| SelectedId(instance.mod_id, m.name.to_string())) + .unwrap_or(SelectedId( + "Unknown Mod".to_string(), + "Unknown Mod".to_string(), + )) + }); + + rsx!(rect { + direction: "vertical", + spacing: "8", + label { + font_size: "16", + + "Test" + } + + Dropdown { + value: selected_mod(), + for (key, value) in mods() {{ + let id = SelectedId(key.clone(), value.name.clone()); + rsx!(DropdownItem { + value: id.clone(), + onpress: { + move |_| { + *selected_mod.write() = id.clone(); + } + }, + + label { + "{value.name}" + } + }) + }} + } + }) +} + +#[component] +fn Header(on_delete_pressed: EventHandler<()>) -> Element { + let ctx = use_context::(); + let (profile_id, profile) = ctx.read().clone(); + + rsx!(rect { + width: "100%", + padding: "12 8 12 12", + corner_radius: "8", + border: "0 0 2 0 outer {THEME.read().bg_secondary}", + + background: THEME.read().bg_primary, + + direction: "horizontal", + cross_align: "center", + + spacing: "12", + + label { + font_size: "18", + + "{profile.profile.name}" + } + + rect { + width: "fill", + direction: "horizontal", + main_align: "end", + spacing: "8", + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + onpress: move |_| { + let profile_path = discord_modloader::paths::config_profile_dir().join(format!("{}.toml", &profile_id)); + if profile_path.exists() { + if let Err(e) = open::that(profile_path) { + eprintln!("Failed to open directory: {}", e); + } + } else if let Some(parent) = profile_path.parent() { + if !parent.exists() { + if let Err(e) = std::fs::create_dir_all(parent) { + eprintln!("Failed to create directory: {}", e); + } + } + if let Err(e) = open::that(parent) { + eprintln!("Failed to open directory: {}", e); + } + } + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::FOLDER_ICON), + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + target_color: THEME.read().bg_danger, + + onpress: move |_| on_delete_pressed.call(()), + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::TRASH_ICON), + fill: THEME.read().text_primary, + } + } + } + }) +} diff --git a/crates/gui-new/src/components/settings_page.rs b/crates/gui-new/src/components/settings_page.rs new file mode 100644 index 0000000..3b4fce3 --- /dev/null +++ b/crates/gui-new/src/components/settings_page.rs @@ -0,0 +1,10 @@ +use freya::prelude::*; + +#[component] +pub fn SettingsPage() -> Element { + rsx!( + label { + "SettingsPage Not Implemented" + } + ) +} diff --git a/crates/gui-new/src/components/sidebar.rs b/crates/gui-new/src/components/sidebar.rs new file mode 100644 index 0000000..2e5530f --- /dev/null +++ b/crates/gui-new/src/components/sidebar.rs @@ -0,0 +1,465 @@ +use freya::prelude::*; + +use crate::components::button::Button; +use crate::{AppPage, CONFIG, CURRENT_PAGE, THEME, utils::hoverable::hoverable}; + +const SIDEBAR_WIDTH: &str = "256"; + +#[component] +pub fn Sidebar() -> Element { + let mut display_mode = use_signal(|| SidebarDisplayMode::Profiles); + + rsx!(rect { + width: SIDEBAR_WIDTH, + height: "100%", + direction: "vertical", + margin: "8 0 8 8", + color: THEME.read().text_primary, + + spacing: "8", + + rect { + width: "100%", + height: "{48+12+12}", + padding: "12", + direction: "horizontal", + spacing: "8", + corner_radius: "8", + background: THEME.read().bg_primary, + + + cross_align: "center", + main_align: "space-between", + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + cross_align: "center", + main_align: "center", + + onpress: move |_| { + *CURRENT_PAGE.write() = AppPage::Home; + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::HOME_ICON), + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + cross_align: "center", + main_align: "center", + + onpress: move |_| { + *CURRENT_PAGE.write() = AppPage::Settings; + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::GEAR_ICON), + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + cross_align: "center", + main_align: "center", + + onpress: move |_| { + let _ = open::that(crate::assets::DISCORD_INVITE_LINK); + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::DISCORD_ICON), + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + cross_align: "center", + main_align: "center", + + onpress: move |_| { + let _ = open::that(crate::assets::GITHUB_REPO_LINK); + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::GITHUB_ICON), + fill: THEME.read().text_primary, + } + } + } + + rect { + background: THEME.read().bg_primary, + padding: "8", + corner_radius: "8", + ScrollView { + spacing: "8", + + TabBar { + selected: display_mode(), + onclick: move |mode| { + *display_mode.write() = mode; + }, + } + + match display_mode() { + SidebarDisplayMode::Profiles => { + rsx!( + {CONFIG.read().profiles.clone().into_iter().map(|(profile_id, profile)| { + rsx!(Button { + width: "100%", + selected: *CURRENT_PAGE.read() == AppPage::Profile(profile_id.clone()), + + onpress: move |_| { + *CURRENT_PAGE.write() = AppPage::Profile(profile_id.clone()); + }, + + label { + font_size: "16", + "{profile.profile.name}" + } + }) + })} + + Button { + width: "100%", + onpress: |_| { + // *CURRENT_PAGE .write() = AppPage::ProfileFromTemplate; + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::PLUS_ICON), + fill: "#ffffff", + } + + label { + font_size: "16", + "Add New Profile" + } + } + ) + } + SidebarDisplayMode::Mods => { + rsx!( + {CONFIG.read().mods.clone().into_iter().map(|(mod_id, mod_)| { + rsx!(Button { + width: "100%", + selected: *CURRENT_PAGE.read() == AppPage::Mod(mod_id.clone()), + + onpress: move |_| { + *CURRENT_PAGE.write() = AppPage::Mod(mod_id.clone()); + }, + + label { + font_size: "16", + "{mod_.name}" + } + + }) + })} + + Button { + width: "100%", + onpress: |_| { + *CURRENT_PAGE .write() = AppPage::ModFromTemplate; + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::PLUS_ICON), + fill: "#ffffff", + } + + label { + font_size: "16", + "Add New Mod" + } + } + ) + } + } + } + } + }) +} + +#[derive(Clone, Copy, PartialEq, Eq)] +enum SidebarDisplayMode { + Profiles, + Mods, +} + +#[component] +fn TabBar(selected: SidebarDisplayMode, onclick: EventHandler) -> Element { + let anim_underscore_offset = + use_animation(move |_conf| AnimNum::new(0.0, 50.0).ease(Ease::InOut).time(100)); + + let anim_underscore_width = + use_animation(move |_conf| AnimNum::new(50.0, 100.0).ease(Ease::InOut).time(100)); + + rsx!(rect { + direction: "vertical", + padding: "0 0 1 0", + + // The two tab buttons + rect { + direction: "horizontal", + + Button { + width: "50%", + padding: "8", + main_align: "center", + cross_align: "center", + base_color: THEME.read().bg_primary, + target_color: THEME.read().bg_primary, + shadow: "0", + + onmouseenter: move |_e| { + if selected == SidebarDisplayMode::Mods { + anim_underscore_width.run(AnimDirection::Forward); + anim_underscore_offset.run(AnimDirection::Reverse); + } + }, + onmouseleave: move |_e| { + if selected == SidebarDisplayMode::Mods { + anim_underscore_width.run(AnimDirection::Reverse); + anim_underscore_offset.run(AnimDirection::Forward); + } + }, + onpress: move |_e| { + if anim_underscore_width.get().read().read() == 100.0 { + anim_underscore_width.run(AnimDirection::Reverse); + } else if selected == SidebarDisplayMode::Mods { + anim_underscore_width.run(AnimDirection::Reverse); + anim_underscore_offset.run(AnimDirection::Reverse); + } + onclick(SidebarDisplayMode::Profiles); + }, + label { + font_size: "18", + + "Profiles" + } + } + Button { + width: "50%", + padding: "8", + main_align: "center", + cross_align: "center", + base_color: THEME.read().bg_primary, + target_color: THEME.read().bg_primary, + shadow: "0", + + onmouseenter: move |_e| { + if selected == SidebarDisplayMode::Profiles { + anim_underscore_width.run(AnimDirection::Forward); + } + }, + onmouseleave: move |_e| { + if selected == SidebarDisplayMode::Profiles { + anim_underscore_width.run(AnimDirection::Reverse); + } + }, + onpress: move |_| { + if selected == SidebarDisplayMode::Profiles || anim_underscore_width.get().read().read() != 50.0 { + anim_underscore_offset.run(AnimDirection::Forward); + anim_underscore_width.run(AnimDirection::Reverse); + } + onclick(SidebarDisplayMode::Mods); + }, + label { + font_size: "18", + + "Mods" + } + } + } + + rect { + direction: "horizontal", + // This moves the underline left/right + rect { + width: "{anim_underscore_offset.get().read().read()}%", + height: "2", + } + + // The underline + rect { + width: "{anim_underscore_width.get().read().read()}%", + height: "2", + background: THEME.read().blurple, + } + } + }) +} + +#[component] +fn HomeIconButton() -> Element { + let home_icon = static_bytes(crate::assets::HOME_ICON); + + let animation = hoverable!(move |_conf| { + AnimColor::new(THEME.read().bg_tertiary, THEME.read().blurple) + .ease(Ease::InOut) + .time(100) + }); + + let bg_color = animation.animation.get().read().read(); + + rsx!(rect { + width: "48", + height: "48", + corner_radius: "{48/2}", + + background: bg_color, + onmouseenter: animation.onmouseenter, + onmouseleave: animation.onmouseleave, + + main_align: "center", + cross_align: "center", + + svg { + width: "24", + height: "24", + svg_data: home_icon, + fill: "#ffffff", + } + }) +} + +#[component] +fn SettingsButton() -> Element { + let gear_icon = static_bytes(crate::assets::GEAR_ICON); + + let animation = hoverable!(move |_conf| { + AnimColor::new(THEME.read().bg_tertiary, THEME.read().blurple) + .ease(Ease::InOut) + .time(100) + }); + + let bg_color = animation.animation.get().read().read(); + + rsx!(rect { + width: "48", + height: "48", + corner_radius: "{48/2}", + + background: bg_color, + onmouseenter: animation.onmouseenter, + onmouseleave: animation.onmouseleave, + + main_align: "center", + cross_align: "center", + + svg { + width: "24", + height: "24", + svg_data: gear_icon, + fill: "#ffffff", + } + }) +} + +#[component] +fn GithubButton() -> Element { + let github_icon = static_bytes(crate::assets::GITHUB_ICON); + + let animation = hoverable!(move |_conf| { + AnimColor::new(THEME.read().bg_tertiary, THEME.read().blurple) + .ease(Ease::InOut) + .time(100) + }); + + let bg_color = animation.animation.get().read().read(); + + rsx!(rect { + width: "48", + height: "48", + corner_radius: "{48/2}", + + background: bg_color, + onmouseenter: animation.onmouseenter, + onmouseleave: animation.onmouseleave, + + main_align: "center", + cross_align: "center", + + onclick: move |_| { + let _ = open::that(crate::assets::GITHUB_REPO_LINK); + }, + + svg { + width: "24", + height: "24", + svg_data: github_icon, + fill: "#ffffff", + } + }) +} + +#[component] +fn DiscordButton() -> Element { + let discord_icon = static_bytes(crate::assets::DISCORD_ICON); + + let animation = hoverable!(move |_conf| { + AnimColor::new(THEME.read().bg_tertiary, THEME.read().blurple) + .ease(Ease::InOut) + .time(100) + }); + + let bg_color = animation.animation.get().read().read(); + + rsx!(rect { + width: "48", + height: "48", + corner_radius: "{48/2}", + + background: bg_color, + onmouseenter: animation.onmouseenter, + onmouseleave: animation.onmouseleave, + + main_align: "center", + cross_align: "center", + + onclick: move |_| { + let _ = open::that(crate::assets::DISCORD_INVITE_LINK); + }, + + svg { + width: "26", + height: "26", + svg_data: discord_icon, + fill: "#ffffff", + } + }) +} diff --git a/crates/gui-new/src/constants.rs b/crates/gui-new/src/constants.rs new file mode 100644 index 0000000..4322b26 --- /dev/null +++ b/crates/gui-new/src/constants.rs @@ -0,0 +1,43 @@ +// TODO: Implement theme switching. +// #[derive(Clone)] +// pub enum Theme { +// Dark, +// // Light, +// } + +// impl Theme { +// pub fn get(&self) -> &'static ThemeDef { +// match self { +// Theme::Dark => &DARK_THEME, +// // Theme::Light => &LIGHT_THEME, +// } +// } +// } + +pub const DARK_THEME: ThemeDef = ThemeDef { + bg_primary: "rgb(46, 46, 52)", + bg_secondary: "rgb(52, 52, 58)", + bg_tertiary: "rgb(56, 56, 62)", + + text_primary: "white", + text_secondary: "rgb(219, 219, 219)", + + bg_success: "rgb(68, 162, 91)", + bg_danger: "rgb(210, 45, 57)", + + blurple: "rgb(88, 101, 242)", +}; + +pub struct ThemeDef { + pub bg_primary: &'static str, + pub bg_secondary: &'static str, + pub bg_tertiary: &'static str, + + pub text_primary: &'static str, + pub text_secondary: &'static str, + + pub bg_success: &'static str, + pub bg_danger: &'static str, + + pub blurple: &'static str, +} diff --git a/crates/gui-new/src/lib.rs b/crates/gui-new/src/lib.rs new file mode 100644 index 0000000..3ad7f28 --- /dev/null +++ b/crates/gui-new/src/lib.rs @@ -0,0 +1,55 @@ +pub(crate) mod app; +pub(crate) mod assets; +pub(crate) mod components; +pub(crate) mod constants; +pub(crate) mod utils; + +use constants::ThemeDef; + +use freya::prelude::*; + +pub static CURRENT_PAGE: GlobalSignal = Signal::global(|| AppPage::Home); +pub static THEME: GlobalSignal = Signal::global(|| constants::DARK_THEME); +pub static CONFIG: GlobalSignal = + Signal::global(discord_modloader::config::Config::init); +pub static POPUP_STATE: GlobalSignal = Signal::global(|| PopupState::None); +pub static REFRESH_PIDS: GlobalSignal<()> = Signal::global(|| ()); + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum AppPage { + Home, + Mod(String), + ModFromTemplate, + Profile(String), + Settings, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum PopupState { + None, + ConfirmDeleteMod(String), + ConfirmDeleteProfile(String), + ConfirmKillProfile(String), + InstanceAlreadyRunning(String, String, String), +} + +pub enum AppTheme { + Dark, + Light, +} + +pub fn start_gui() { + let cfg: LaunchConfig<()> = LaunchConfig::new() + .with_title("Discord Mod Launcher") + .with_size(1080., 720.) + .with_font("Inter", assets::FONT_INTER) + .with_default_font("Inter") + .with_decorations(true) + .with_transparency(true); + + launch_cfg(app, cfg); +} + +fn app() -> Element { + app::app() +} diff --git a/crates/gui-new/src/utils/hoverable.rs b/crates/gui-new/src/utils/hoverable.rs new file mode 100644 index 0000000..ae7bfb3 --- /dev/null +++ b/crates/gui-new/src/utils/hoverable.rs @@ -0,0 +1,54 @@ +use freya::prelude::*; + +pub struct Hoverable { + #[allow( + unused, + reason = "Consumers don't always need to know the hover state." + )] + pub hovered: Signal, + pub animation: UseAnimation, + pub onmouseenter: Box)>, + pub onmouseleave: Box)>, +} + +/// A macro to create a hoverable animation. +/// +/// # Example +/// +/// ```rust +/// let bg_anim = hoverable!(|_conf| { +/// AnimColor::new("rgb(52, 52, 58)", "rgb(88, 101, 242)") +/// .ease(Ease::InOut) +/// .time(100) +/// }); +macro_rules! hoverable { + ($anim:expr) => {{ + use freya::prelude::*; + + let mut hovered = use_signal(|| false); + let animation = use_animation($anim); + + let onmouseenter = move |_: Event| { + if !hovered() { + animation.run(AnimDirection::Forward); + hovered.set(true); + } + }; + + let onmouseleave = move |_: Event| { + if hovered() { + hovered.set(false); + animation.run(AnimDirection::Reverse); + } + }; + + $crate::utils::hoverable::Hoverable { + hovered, + animation, + onmouseenter: Box::new(onmouseenter), + onmouseleave: Box::new(onmouseleave), + } + }}; +} + +pub(crate) use hoverable; diff --git a/crates/gui-new/src/utils/icons.rs b/crates/gui-new/src/utils/icons.rs new file mode 100644 index 0000000..a523ede --- /dev/null +++ b/crates/gui-new/src/utils/icons.rs @@ -0,0 +1,89 @@ +use discord_modloader::{config, paths}; +use freya::prelude::Readable as _; + +use crate::CONFIG; + +#[cfg(target_os = "linux")] +const LIB_PATH: &str = "/usr/lib/discord-modloader"; + +pub trait GetIcon { + fn get_icon(&self) -> Option>; +} + +// TODO: Should profiles have icons? + +impl GetIcon for config::Instance { + fn get_icon(&self) -> Option> { + let name = { + if let Some(ref name) = self.icon { + Some(name.clone()) + } else if let Some(mod_) = CONFIG.peek().mods.get(&self.mod_id) { + return mod_.get_icon(); + } else { + None + } + }?; + + scan_icon_by_name(&name) + } +} + +impl GetIcon for config::Mod { + fn get_icon(&self) -> Option> { + let name = { + if let Some(ref name) = self.icon { + Some(name.clone()) + } else { + self.updater.as_ref().map(|updater| { + format!("{}/{}/icon.png", updater.github_org, updater.github_repo) + }) + } + }?; + + scan_icon_by_name(&name) + } +} + +fn scan_icon_by_name(name: &str) -> Option> { + let config_path = dirs::config_local_dir().unwrap().join("discord-modloader"); + let icon_path = config_path.join("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + + // TODO: Get windows/macos libpath + #[cfg(target_os = "linux")] + { + let lib_path = std::path::PathBuf::from(LIB_PATH); + + let icon_path = lib_path.join("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + } + + let metadata_dir = paths::cache_mod_metadata_dir(); + let icon_path = metadata_dir.join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + + let current_exe = std::env::current_exe().unwrap(); + let icon_path = current_exe.with_file_name("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + + let cwd = std::env::current_dir().unwrap(); + let icon_path = cwd.join("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + + let icon_path = cwd.join("configs").join("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + + None +} diff --git a/crates/gui-new/src/utils/mod.rs b/crates/gui-new/src/utils/mod.rs new file mode 100644 index 0000000..b6bb843 --- /dev/null +++ b/crates/gui-new/src/utils/mod.rs @@ -0,0 +1,2 @@ +pub mod hoverable; +pub mod icons; diff --git a/crates/gui/Cargo.toml b/crates/gui/Cargo.toml index ac432f1..ef02e65 100644 --- a/crates/gui/Cargo.toml +++ b/crates/gui/Cargo.toml @@ -4,8 +4,19 @@ version = "0.1.0" edition = "2021" [dependencies] -dioxus = "0.5.6" -dirs = "5.0.1" -freya = { git = "https://github.com/marc2332/freya.git", version = "0.2.2" } -itertools = "0.13.0" +dialog = "0.3.0" +dioxus = "0.6.1" +dirs = "6.0.0" +flate2 = "1.0.35" +freya = { git = "https://github.com/marc2332/freya.git", version = "0.3.0-rc.0" } +itertools = "0.14.0" +libc = "0.2.167" libdiscord-modloader = { path = "../libdiscord-modloader", default-features = false } +open = "5.3.1" +serde = "1.0.217" +serde_json = "1.0.135" +sysinfo = "0.33.0" +tar = "0.4.43" +toml = "0.8.19" +ureq = { version = "2.12.1", features = ["json"] } +uuid = { version = "1.11.0", features = ["v4"] } diff --git a/crates/gui/src/components/custom_button.rs b/crates/gui/src/components/custom_button.rs new file mode 100644 index 0000000..53c2bd0 --- /dev/null +++ b/crates/gui/src/components/custom_button.rs @@ -0,0 +1,58 @@ +use freya::prelude::*; + +use crate::utils::hoverable::hoverable; + +#[component] +pub fn CustomButton( + bg_anim: (String, String), + onclick: EventHandler, + children: Element, + height: Option, + padding: Option, +) -> Element { + let mut bg_anim = hoverable!(move |_conf| { + AnimColor::new(&bg_anim.0, &bg_anim.1) + .ease(Ease::InOut) + .time(100) + }); + + let bg_color = bg_anim.animation.get(); + + let onmouseenter = move |ctx| { + (bg_anim.onmouseenter)(ctx); + }; + + let onmouseleave = move |ctx| { + (bg_anim.onmouseleave)(ctx); + }; + + let height = height.unwrap_or("64".to_string()); + let padding = padding.unwrap_or("0 0 0 8".to_string()); + + let background = bg_color.read().read(); + + rsx!(rect { + padding: "{padding}", + + onclick: move |data| { + #[allow(clippy::redundant_closure)] + onclick(data) + }, + rect { + height: "{height}", + min_width: "64", + + main_align: "center", + cross_align: "center", + + padding: "0 14", + corner_radius: "8", + + background: "{background}", + onmouseenter: onmouseenter, + onmouseleave: onmouseleave, + + {children} + } + }) +} diff --git a/crates/gui/src/components/main_content.rs b/crates/gui/src/components/main_content.rs new file mode 100644 index 0000000..aeccd8e --- /dev/null +++ b/crates/gui/src/components/main_content.rs @@ -0,0 +1,21 @@ +use crate::pages::{CreateNewProfile, Home, SelectedProfile, Settings}; + +use freya::prelude::*; + +#[derive(Clone, PartialEq)] +pub enum CurrentPage { + Home, + SelectedProfile(String), + CreateNewProfile(Option), + Settings, +} + +#[component] +pub fn MainContent(page: CurrentPage) -> Element { + match page { + CurrentPage::Home => rsx!(Home {}), + CurrentPage::SelectedProfile(id) => rsx!(SelectedProfile { id }), + CurrentPage::CreateNewProfile(profile_id) => rsx!(CreateNewProfile { profile_id }), + CurrentPage::Settings => rsx!(Settings {}), + } +} diff --git a/crates/gui/src/components/mod.rs b/crates/gui/src/components/mod.rs new file mode 100644 index 0000000..683b480 --- /dev/null +++ b/crates/gui/src/components/mod.rs @@ -0,0 +1,3 @@ +pub mod custom_button; +pub mod main_content; +pub mod sidebar; diff --git a/crates/gui/src/components/sidebar.rs b/crates/gui/src/components/sidebar.rs new file mode 100644 index 0000000..5f06fb0 --- /dev/null +++ b/crates/gui/src/components/sidebar.rs @@ -0,0 +1,166 @@ +use crate::{constants, utils::hoverable::hoverable}; +use discord_modloader::config; + +use freya::prelude::*; +use itertools::Itertools as _; + +use super::main_content::CurrentPage; + +pub const SIDEBAR_WIDTH: f32 = 256.; + +#[component] +pub fn ProfileList(onpagechange: EventHandler) -> Element { + let ctx = use_context::>(); + + let profiles = use_memo(move || { + let profiles = ctx().config.profiles.clone(); + profiles + .into_iter() + .sorted_by_key(|(id, _)| id.clone()) + .collect::>() + }); + + let create_profile = hoverable!(move |_conf| { + AnimColor::new(constants::BG_SECONDARY, constants::BLURPLE) + .ease(Ease::InOut) + .time(100) + }); + + let create_profile_anim = create_profile.animation.get(); + + let bg_create_profile = if let CurrentPage::CreateNewProfile(_) = ctx().current_page { + constants::BLURPLE + } else { + &create_profile_anim.read().read() + }; + + let settings = hoverable!(move |_conf| { + AnimColor::new(constants::BG_SECONDARY, constants::BLURPLE) + .ease(Ease::InOut) + .time(100) + }); + + let settings_anim = settings.animation.get(); + + let bg_settings = if ctx().current_page == CurrentPage::Settings { + constants::BLURPLE + } else { + &settings_anim.read().read() + }; + + rsx!(rect { + width: "{SIDEBAR_WIDTH}", + height: "100%", + direction: "vertical", + background: constants::BG_PRIMARY, + padding: "8", + color: "white", + corner_radius: "4", + + label { + font_size: "18", + font_weight: "bold", + "Profiles" + } + + ScrollView { + spacing: "4", + + { + profiles().into_iter().map(|(id, profile)| { + rsx!(ProfileListEntry { + profile: profile.clone(), + selected: ctx().current_page == CurrentPage::SelectedProfile(id.clone()), + onclick: move |_| { + onpagechange.call(CurrentPage::SelectedProfile(id.clone())); + } + }) + }) + } + + rect { + width: "100%", + padding: "8", + color: "white", + corner_radius: "4", + + background: bg_create_profile, + onmouseenter: create_profile.onmouseenter, + onmouseleave: create_profile.onmouseleave, + + onclick: move |_| { + onpagechange.call(CurrentPage::CreateNewProfile(None)); + }, + + label { + font_size: "18", + font_weight: "bold", + "Create New Profile" + } + } + + rect { + width: "100%", + padding: "8", + color: "white", + corner_radius: "4", + + background: bg_settings, + onmouseenter: settings.onmouseenter, + onmouseleave: settings.onmouseleave, + + onclick: move |_| { + onpagechange.call(CurrentPage::Settings); + }, + + label { + font_size: "18", + font_weight: "bold", + "Settings" + } + } + } + + }) +} + +#[component] +fn ProfileListEntry( + profile: config::ProfileConfig, + selected: bool, + onclick: EventHandler, +) -> Element { + let bg_anim = hoverable!(move |_conf| { + AnimColor::new(constants::BG_SECONDARY, constants::BLURPLE) + .ease(Ease::InOut) + .time(100) + }); + + let bg_color = bg_anim.animation.get(); + + let bg_color = if selected { + constants::BLURPLE + } else { + &bg_color.read().read() + }; + + rsx!(rect { + width: "100%", + // height: "32", + padding: "8", + color: "white", + corner_radius: "4", + + background: bg_color, + onmouseenter: bg_anim.onmouseenter, + onmouseleave: bg_anim.onmouseleave, + + onclick: move |evt| onclick.call(evt), + + label { + font_size: "18", + font_weight: "bold", + {profile.profile.name} + } + }) +} diff --git a/crates/gui/src/constants.rs b/crates/gui/src/constants.rs new file mode 100644 index 0000000..5917a32 --- /dev/null +++ b/crates/gui/src/constants.rs @@ -0,0 +1,9 @@ +pub static BG_PRIMARY: &str = "rgb(46, 46, 52)"; +pub static BG_SECONDARY: &str = "rgb(52, 52, 58)"; +pub static BG_TERTIARY: &str = "rgb(56, 56, 62)"; + +pub static TEXT_PRIMARY: &str = "white"; + +pub static GREEN: &str = "rgb(68, 162, 91)"; +pub static BLURPLE: &str = "rgb(88, 101, 242)"; +pub static RED: &str = "rgb(210, 45, 57)"; diff --git a/crates/gui/src/lib.rs b/crates/gui/src/lib.rs index 80e24d2..387945f 100644 --- a/crates/gui/src/lib.rs +++ b/crates/gui/src/lib.rs @@ -1,154 +1,82 @@ +mod components; +mod constants; +mod pages; +mod popups; mod utils; -use std::{borrow::Borrow, sync::LazyLock}; +use components::main_content::CurrentPage; +use discord_modloader::config; +use popups::PopupState; use freya::prelude::*; -use discord_modloader::config; -use itertools::Itertools; -use utils::hoverable::hoverable; +#[derive(Clone)] +pub struct AppState { + config: config::Config, + popup_state: PopupState, + current_page: CurrentPage, +} pub fn start_gui() { - let cfg: LaunchConfig = LaunchConfig::new() + let cfg: LaunchConfig<()> = LaunchConfig::new() .with_title("Discord Modloader") .with_size(1080., 720.) .with_decorations(true) - .with_transparency(true) - .with_state(config::Config::init()); + .with_transparency(true); launch_cfg(app, cfg); } -fn get_icon(name: &str) -> Option> { - const LIB_PATH: &'static str = "/usr/lib/discord-modloader"; - - let config_path = dirs::config_local_dir().unwrap().join("discord-modloader"); - let icon_path = config_path.join("icons").join(name); - if icon_path.exists() { - return std::fs::read(icon_path).ok(); - } - - let lib_path = std::path::PathBuf::from(LIB_PATH); - - let icon_path = lib_path.join("icons").join(name); - if icon_path.exists() { - return std::fs::read(icon_path).ok(); - } - - let current_exe = std::env::current_exe().unwrap(); - let icon_path = current_exe.with_file_name("icons").join(name); - if icon_path.exists() { - return std::fs::read(icon_path).ok(); - } - - let cwd = std::env::current_dir().unwrap(); - let icon_path = cwd.join("icons").join(name); - if icon_path.exists() { - return std::fs::read(icon_path).ok(); - } - - let icon_path = cwd.join("configs").join("icons").join(name); - if icon_path.exists() { - return std::fs::read(icon_path).ok(); - } - - None -} - fn app() -> Element { - let ctx = use_context::(); + use components::main_content::MainContent; + use components::sidebar::ProfileList; + + let mut ctx = use_signal(|| AppState { + config: config::Config::init(), + popup_state: PopupState::Hidden, + current_page: CurrentPage::Home, + }); + // Share state signal with global state context + use_context_provider(|| ctx); rsx!(rect { direction: "horizontal", width: "100%", height: "100%", - background: "rgb(46, 46, 52)", - - ProfileList {} + background: constants::BG_PRIMARY, + + match ctx().popup_state { + PopupState::Hidden => None, + PopupState::Launching(instance) => { + Some(rsx!(popups::LaunchingPopup { instance })); + None + } + PopupState::AlreadyLaunched(profile_id, instance_id) => { + Some(rsx!(popups::AlreadyLaunchedPopup { profile_id, instance_id })) + } + PopupState::CreateNewInstance(profile_id) => { + Some(rsx!(popups::CreateNewInstance { profile_id })) + } + PopupState::DeleteProfile(profile_id) => { + Some(rsx!(popups::DeleteProfile { profile_id })) + } + PopupState::DeleteInstance(profile_id, instance_id) => { + Some(rsx!(popups::DeleteInstance { profile_id, instance_id })) + } + } - // rect { - // max_width: "256", - // height: "100%", - // background: "rgb(46, 46, 52)", - // } + ProfileList { + onpagechange: move |page| ctx.write().current_page = page, + } rect { width: "fill", height: "100%", - background: "rgb(52, 52, 58)", - } - }) -} - -#[component] -fn ProfileList() -> Element { - let ctx = use_context::(); - - let selected: Signal> = use_signal(|| None); - - rsx!(rect { - width: "256", - height: "100%", - direction: "vertical", - background: "rgb(46, 46, 52)", - padding: "8", - color: "white", - corner_radius: "8", - - label { - font_size: "18", - font_weight: "bold", - "Profiles" - } - - ScrollView { - spacing: "4", - - ProfileListEntry { name: "Test Profile 1", selected: false } - - ProfileListEntry { name: "Test Profile 2", selected: true } - - ProfileListEntry { name: "Test Profile 3", selected: false } - - ProfileListEntry { name: "Test Profile 4", selected: false } - } - - }) -} - -#[component] -fn ProfileListEntry(name: String, selected: bool) -> Element { - let bg_anim = hoverable!(move |ctx| { - ctx.with( - AnimColor::new("rgb(52, 52, 58)", "rgb(88, 101, 242)") - .ease(Ease::InOut) - .time(100), - ) - }); - - let bg_color = bg_anim.animation.get(); - - let bg_color = if selected { - "rgb(88, 101, 242)" - } else { - &bg_color.read().as_string() - }; - - rsx!(rect { - width: "100%", - // height: "32", - padding: "8", - color: "white", - corner_radius: "8", - - background: bg_color, - onmouseenter: bg_anim.onmouseenter, - onmouseleave: bg_anim.onmouseleave, + background: constants::BG_SECONDARY, - label { - font_size: "18", - font_weight: "bold", - {name} + MainContent { + page: ctx().current_page, + } } }) } diff --git a/crates/gui/src/pages/create_profile.rs b/crates/gui/src/pages/create_profile.rs new file mode 100644 index 0000000..bc00206 --- /dev/null +++ b/crates/gui/src/pages/create_profile.rs @@ -0,0 +1,280 @@ +use std::collections::BTreeMap; + +use dialog::DialogBox as _; +use discord_modloader::{config, paths}; +use freya::prelude::*; + +use crate::{components::custom_button::CustomButton, constants}; + +#[component] +pub fn CreateNewProfile(profile_id: Option) -> Element { + let mut ctx: Signal = use_context(); + + let is_new_profile = use_signal(|| profile_id.is_none()); + + let uuid = use_signal(|| profile_id.unwrap_or(uuid::Uuid::new_v4().to_string())); + + let mut profile = use_signal(|| match ctx().config.profiles.get(&uuid()) { + Some(profile) => profile.clone(), + _ => config::ProfileConfig { + profile: config::Profile { + name: "My Cool Profile".to_string(), + use_default_profile: false, + }, + discord: config::Discord { + executable: "".to_string(), + args: "".to_string(), + }, + instances: BTreeMap::new(), + }, + }); + + let mut selected_executable = use_signal(|| match profile().discord.executable.as_str() { + "" => InstallKind::NoneSelected, + install => InstallKind::Custom(install.to_string()), + }); + + use_memo(move || match selected_executable() { + InstallKind::Selected(install) => profile.write().discord.executable = install, + InstallKind::Custom(path) => profile.write().discord.executable = path, + _ => {} + }); + + rsx!(rect { + width: "100%", + height: "100%", + direction: "vertical", + padding: "8", + spacing: "8", + background: constants::BG_SECONDARY, + color: "white", + + rect { + direction: "horizontal", + cross_align: "center", + height: "48", + + label { + font_size: "18", + font_weight: "bold", + if is_new_profile() { "Create new Profile" } else { "Edit Profile" } + }, + }, + + rect { + width: "fill", + padding: "8 0 0 0", + width: "100%", + + label { + "Profile Name" + } + + Input { + theme: theme_with!(InputTheme { + width: "100%".into(), + background: constants::BG_SECONDARY.into(), + hover_background: constants::BG_SECONDARY.into(), + font_theme: theme_with!(FontTheme { + color: constants::TEXT_PRIMARY.into(), + }) + }), + placeholder: "Profile Name", + value: profile().profile.name, + onchange: move |value| { + profile.write().profile.name = value; + } + } + }, + + rect { + width: "fill", + padding: "8 0 0 0", + width: "100%", + + label { + "Discord Executable" + } + + InstallDropdown { selected_executable } + + if let InstallKind::Custom(_) = selected_executable() { + rect { + direction: "horizontal", + cross_align: "center", + + CustomButton { + bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), + height: "48", + padding: "8 0 0 0", + onclick: move |_| { + let file = dialog::FileSelection::new("Select Discord executable") + .title("Select Discord executable") + .show() + .expect("Failed to open file selection dialog"); + + if let Some(file) = file { + selected_executable.set(InstallKind::Custom(file)); + } + }, + + label { + "Browse" + } + } + + + Input { + theme: theme_with!(InputTheme { + width: "fill".into(), + background: constants::BG_SECONDARY.into(), + hover_background: constants::BG_SECONDARY.into(), + font_theme: theme_with!(FontTheme { + color: constants::TEXT_PRIMARY.into(), + }) + }), + placeholder: "Discord Executable", + value: profile().discord.executable, + onchange: move |value| { + selected_executable.set(InstallKind::Custom(value)); + } + } + } + } + }, + + rect { + width: "fill", + padding: "8 0 0 0", + width: "100%", + + label { + "Launch Arguments" + } + + Input { + theme: theme_with!(InputTheme { + width: "100%".into(), + background: constants::BG_SECONDARY.into(), + hover_background: constants::BG_SECONDARY.into(), + font_theme: theme_with!(FontTheme { + color: constants::TEXT_PRIMARY.into(), + }) + }), + placeholder: "--some=thing --hello=world", + value: profile().discord.args, + onchange: move |value| { + profile.write().discord.args = value; + } + } + }, + + rect { + CustomButton { + bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), + height: "48", + padding: "8 0 0 0", + onclick: move |_| { + if let Ok(id) = create_profile(uuid(), profile()) { + ctx.write().config = config::Config::init(); + ctx.write().current_page = crate::CurrentPage::SelectedProfile(id); + }; + }, + + label { + "Save Profile" + } + } + } + }) +} + +fn create_profile( + id: String, + profile: config::ProfileConfig, +) -> Result> { + let profile_file = paths::config_profile_dir().join(format!("{id}.toml")); + + let profile: String = toml::to_string(&profile)?; + + std::fs::write(profile_file, profile)?; + + Ok(id.to_string()) +} + +#[derive(Debug, Clone, PartialEq)] +enum InstallKind { + NoneSelected, + Selected(String), + Custom(String), +} + +#[component] +fn InstallDropdown(selected_executable: Signal) -> Element { + let found_installs: Signal> = use_signal(|| { + let mut installs = crate::utils::find_discord_installations(); + // Sort by length. Shorter first, longer last. + installs.sort_by(|a, b| match b.len() > a.len() { + true => std::cmp::Ordering::Less, + false => std::cmp::Ordering::Greater, + }); + installs + }); + + let value = match selected_executable() { + InstallKind::NoneSelected => "Select a Discord instance".to_string(), + InstallKind::Selected(install) => install, + InstallKind::Custom(_) => "Custom Instance".to_string(), + }; + + rsx!(Dropdown { + theme: theme_with!(DropdownTheme { + width: "100%".into(), + background_button: constants::BG_SECONDARY.into(), + dropdown_background: constants::BG_SECONDARY.into(), + hover_background: constants::BG_PRIMARY.into(), + font_theme: theme_with!(FontTheme { + color: constants::TEXT_PRIMARY.into(), + }) + }), + value: value, + for install in found_installs() { + DropdownItem { + theme: theme_with!(DropdownItemTheme { + background: constants::BG_SECONDARY.into(), + hover_background: constants::BG_PRIMARY.into(), + select_background: constants::BG_PRIMARY.into(), + font_theme: theme_with!(FontTheme { + color: constants::TEXT_PRIMARY.into(), + }) + }), + value: install.clone(), + onpress: { + to_owned![install]; + move |_| { + selected_executable.set(InstallKind::Selected(install.clone())); + } + }, + + label { "{install}" }, + } + } + + DropdownItem { + theme: theme_with!(DropdownItemTheme { + background: constants::BG_SECONDARY.into(), + hover_background: constants::BG_PRIMARY.into(), + select_background: constants::BG_PRIMARY.into(), + font_theme: theme_with!(FontTheme { + color: constants::TEXT_PRIMARY.into(), + }) + }), + value: "Custom Path".to_string(), + onpress: move |_| { + selected_executable.set(InstallKind::Custom("".to_string())); + }, + + label { "Custom Path" }, + } + }) +} diff --git a/crates/gui/src/pages/home.rs b/crates/gui/src/pages/home.rs new file mode 100644 index 0000000..646dfcb --- /dev/null +++ b/crates/gui/src/pages/home.rs @@ -0,0 +1,22 @@ +use crate::constants; + +use freya::prelude::*; + +#[component] +pub fn Home() -> Element { + rsx!(rect { + width: "100%", + height: "100%", + direction: "vertical", + padding: "8", + spacing: "8", + background: constants::BG_SECONDARY, + color: "white", + + label { + font_size: "18", + font_weight: "bold", + "Home" + } + }) +} diff --git a/crates/gui/src/pages/mod.rs b/crates/gui/src/pages/mod.rs new file mode 100644 index 0000000..3085787 --- /dev/null +++ b/crates/gui/src/pages/mod.rs @@ -0,0 +1,9 @@ +mod create_profile; +mod home; +mod selected_profile; +mod settings; + +pub use create_profile::*; +pub use home::*; +pub use selected_profile::*; +pub use settings::*; diff --git a/crates/gui/src/pages/selected_profile.rs b/crates/gui/src/pages/selected_profile.rs new file mode 100644 index 0000000..ab09901 --- /dev/null +++ b/crates/gui/src/pages/selected_profile.rs @@ -0,0 +1,260 @@ +use discord_modloader::{config, paths}; +use freya::prelude::*; + +use crate::{ + components::custom_button::CustomButton, + constants, + utils::{self, images}, +}; + +#[component] +pub fn SelectedProfile(id: String) -> Element { + let mut ctx = use_context::>(); + + let profile_id = id.clone(); + let profile = use_memo(move || ctx().config.profiles.get(&profile_id).cloned()); + + match profile() { + None => { + rsx!(rect { + width: "100%", + height: "100%", + direction: "vertical", + padding: "8", + spacing: "8", + background: constants::BG_SECONDARY, + color: "white", + + label { + "Profile not found" + } + }) + } + Some(profile) => { + rsx!(rect { + width: "100%", + height: "100%", + direction: "vertical", + padding: "8", + spacing: "8", + background: constants::BG_SECONDARY, + color: "white", + + rect { + direction: "horizontal", + cross_align: "center", + height: "48", + + label { + font_size: "18", + font_weight: "bold", + { profile.profile.name } + }, + + rect { + width: "fill", + direction: "horizontal", + main_align: "end", + CustomButton { + height: "48", + bg_anim: (constants::BG_PRIMARY.into(), constants::RED.into()), + onclick: { + to_owned![id]; + move |_| { + ctx.write().popup_state = crate::PopupState::DeleteProfile(id.clone()); + } + }, + + label { + "Delete Profile" + } + }, + CustomButton { + height: "48", + bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), + onclick: { + to_owned![id]; + move |_| { + ctx.write().current_page = crate::CurrentPage::CreateNewProfile(Some(id.clone())); + } + }, + + label { + "Edit Profile" + } + } + } + }, + + rect { + direction: "horizontal", + cross_align: "center", + + label { + "Instances:" + }, + + rect { + width: "fill", + direction: "horizontal", + main_align: "end", + CustomButton { + bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), + height: "48", + label { + "Add New Instance" + }, + onclick: { + to_owned![id]; + move |_| { + ctx.write().popup_state = crate::PopupState::CreateNewInstance(id.clone()); + } + } + } + }, + }, + + ScrollView { + spacing: "4", + + {profile.instances.iter().map(|(instance_id, instance)| { + to_owned![id]; + rsx!(InstanceEntry { profile_id: id, instance_id: instance_id, instance: instance.clone() }) + })} + } + }) + } + } +} + +#[component] +pub fn InstanceEntry( + instance_id: String, + instance: config::Instance, + profile_id: String, +) -> Element { + let mut ctx = use_context::>(); + + let image = match instance.icon { + Some(ref icon) => { + let image = images::get_icon(icon); + image.map(dynamic_bytes) + } + None => None, + }; + + rsx!(rect { + width: "100%", + height: "{ 64 + 8 + 8 }", + padding: "8", + color: "white", + corner_radius: "4", + background: constants::BG_TERTIARY, + direction: "horizontal", + + image { + width: "64", + height: "64", + image_data: image, + } + + rect { + height: "100%", + main_align: "center", + padding: "0 0 0 8", + + label { + font_size: "18", + font_weight: "bold", + { instance.name.clone() } + } + + label { + { instance.mod_id.clone() } + } + } + + rect { + height: "64", + width: "fill", + direction: "horizontal", + main_align: "end", + + CustomButton { + bg_anim: (constants::BG_PRIMARY.into(), constants::GREEN.into()), + onclick: { + to_owned![profile_id, instance_id, instance]; + move |_| { + let system = sysinfo::System::new_with_specifics( + sysinfo::RefreshKind::nothing() + .with_processes(sysinfo::ProcessRefreshKind::everything()), + ); + + let profile = ctx().config.profiles.get(&profile_id).unwrap().clone(); + + if system.processes().iter().any(|(_, proc)| { + let cmd = proc.cmd().join(std::ffi::OsStr::new(" ")); + let cmd = cmd.to_str().unwrap().to_string(); + + match !profile.profile.use_default_profile { + true => { + let profile_path = paths::data_profiles_dir().join(profile_id.clone()); + let profile_path = profile_path.to_str().unwrap(); + cmd.contains(&format!("--user-data-dir={}", profile_path)) + } + false => { + // If using the default discord profile (doesn't use our discord-modloader profiles dir) + // and the command contains the discord executable path, it's a duplicate profile. + !cmd.contains(paths::data_profiles_dir().to_str().unwrap()) && cmd.contains(&profile.discord.executable) + } + } + }) { + ctx.write().popup_state = crate::PopupState::AlreadyLaunched(profile_id.clone(), instance_id.clone()); + return; + } + + ctx.write().popup_state = crate::PopupState::Launching(instance.clone()); + + if let Some(profile) = ctx().config.profiles.get(&profile_id) { + let result = utils::launch::launch_instance(&profile_id, &instance_id, &profile.discord.args); + + if result.is_ok() { + ctx.write().popup_state = crate::PopupState::Hidden; + + if ctx().config.settings.hide_window_on_launch { + use_platform().set_minimize_window(true); + } + } + }; + } + }, + + label { + "Launch" + } + } + + CustomButton { + bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), + onclick: move |_| { + // TODO: Implement edit instance + }, + + label { + "Edit" + } + } + + CustomButton { + bg_anim: (constants::BG_PRIMARY.into(), constants::RED.into()), + onclick: move |_| { + ctx.write().popup_state = crate::PopupState::DeleteInstance(profile_id.clone(), instance_id.clone()); + }, + + label { + "Delete" + } + } + } + }) +} diff --git a/crates/gui/src/pages/settings.rs b/crates/gui/src/pages/settings.rs new file mode 100644 index 0000000..e115212 --- /dev/null +++ b/crates/gui/src/pages/settings.rs @@ -0,0 +1,157 @@ +use discord_modloader::{config, paths}; +use freya::prelude::*; + +use crate::{components::custom_button::CustomButton, constants, utils}; + +#[component] +pub fn Settings() -> Element { + let mut icons = use_signal(utils::images::get_all_icons); + + let mut ctx = use_context::>(); + + use_memo(move || { + // write settings to file + let settings = toml::to_string(&ctx().config.settings); + if let Ok(settings) = settings { + let settings_file = paths::configs_dir().join("settings.toml"); + let _ = std::fs::write(settings_file, settings); + }; + }); + + rsx!(rect { + width: "100%", + height: "100%", + direction: "vertical", + padding: "8", + spacing: "8", + background: constants::BG_SECONDARY, + color: "white", + + ScrollView { + rect { + direction: "horizontal", + cross_align: "center", + height: "48", + + label { + font_size: "18", + font_weight: "bold", + { "Settings" } + }, + + rect { + width: "fill", + direction: "horizontal", + main_align: "end", + spacing: "4", + + CustomButton { + height: "48", + bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), + onclick: move |_| { + ctx.write().config = config::Config::init(); + icons.set(utils::images::get_all_icons()); + }, + + label { + "Refresh settings" + } + } + + CustomButton { + height: "48", + bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), + onclick: move |_| { + let _ = open::that(paths::configs_dir()); + }, + + label { + "Open settings folder" + } + } + } + }, + + rect { + width: "fill", + padding: "8 0 0 0", + width: "100%", + direction: "horizontal", + cross_align: "center", + spacing: "8", + + label { + "Hide window when launching Discord" + } + + Switch { + enabled: ctx().config.settings.hide_window_on_launch, + ontoggled: move |_| { + ctx.write().config.settings.hide_window_on_launch ^= true; + } + } + }, + + rect { + width: "fill", + padding: "8 0 0 0", + width: "100%", + + label { + "Icons" + } + + rect { + max_height: "256", + ScrollView { + for (name, icon) in icons() { + IconEntry { + name: name, + icon: icon, + } + } + } + } + } + } + }) +} + +#[component] +fn IconEntry(name: String, icon: Vec) -> Element { + let hoverable = crate::utils::hoverable::hoverable!(move |_conf| { + AnimColor::new(constants::BG_PRIMARY, constants::BG_TERTIARY) + .ease(Ease::InOut) + .time(10) + }); + + let hoverable_anim = hoverable.animation.get(); + + let background = hoverable_anim.read().read(); + + rsx!(rect { + background: "{background}", + onmouseenter: hoverable.onmouseenter, + onmouseleave: hoverable.onmouseleave, + + corner_radius: "4", + padding: "4", + spacing: "4", + height: "64", + width: "100%", + direction: "horizontal", + cross_align: "center", + + image { + width: "40", + height: "40", + image_data: dynamic_bytes(icon), + } + + label { + font_size: "12", + font_weight: "bold", + "{name}" + } + }) +} diff --git a/crates/gui/src/popups/already_launched.rs b/crates/gui/src/popups/already_launched.rs new file mode 100644 index 0000000..22772a8 --- /dev/null +++ b/crates/gui/src/popups/already_launched.rs @@ -0,0 +1,93 @@ +use discord_modloader::paths; +use freya::prelude::*; + +use crate::{components::custom_button::CustomButton, constants, utils}; + +#[component] +pub fn AlreadyLaunchedPopup(profile_id: String, instance_id: String) -> Element { + let mut ctx = use_context::>(); + + let mut relaunch_instance = move || { + ctx.write().popup_state = super::PopupState::Hidden; + + let system = sysinfo::System::new_with_specifics( + sysinfo::RefreshKind::nothing() + .with_processes(sysinfo::ProcessRefreshKind::everything()), + ); + + let profile = ctx().config.profiles.get(&profile_id).unwrap().clone(); + + system.processes().iter().for_each(|(_pid, proc)| { + let cmd = proc.cmd().join(std::ffi::OsStr::new(" ")); + let cmd = cmd.to_str().unwrap().to_string(); + + let should_kill = match !profile.profile.use_default_profile { + true => { + let profile_path = paths::data_profiles_dir().join(profile_id.clone()); + let profile_path = profile_path.to_str().unwrap(); + cmd.contains(&format!("--user-data-dir={}", profile_path)) + } + false => { + // If using the default discord profile (doesn't use our discord-modloader profiles dir) + // and the command contains the discord executable path, it's a duplicate profile. + !cmd.contains(paths::data_profiles_dir().to_str().unwrap()) + && cmd.contains(&profile.discord.executable) + } + }; + + if should_kill { + proc.kill_with(sysinfo::Signal::Kill); + } + }); + + if let Some(profile) = ctx().config.profiles.get(&profile_id) { + let _ = + utils::launch::launch_instance(&profile_id, &instance_id, &profile.discord.args); + }; + }; + + rsx!(Popup { + theme: theme_with!(PopupTheme { + background: constants::BG_PRIMARY.into(), + color: constants::TEXT_PRIMARY.into(), + }), + close_on_escape_key: true, + + oncloserequest: move |_| { + ctx.write().popup_state = super::PopupState::Hidden; + }, + PopupTitle { + label { + "Instance already running" + } + }, + PopupContent { + label { + "An instance of this profile is already running." + } + + label { + "Would you like to kill the existing process, and launch a new one?" + } + + rect { + height: "fill", + width: "100%", + main_align: "end", + cross_align: "end", + CustomButton { + bg_anim: (constants::RED.into(), constants::BLURPLE.into()), + height: "32", + padding: "0 0 8 0", + label { + "Kill & Relaunch" + } + onclick: move |_| { + relaunch_instance(); + } + } + } + + } + }) +} diff --git a/crates/gui/src/popups/create_instance.rs b/crates/gui/src/popups/create_instance.rs new file mode 100644 index 0000000..4205ad0 --- /dev/null +++ b/crates/gui/src/popups/create_instance.rs @@ -0,0 +1,91 @@ +use discord_modloader::{config, paths}; +use freya::prelude::*; + +use crate::{components::custom_button::CustomButton, constants}; + +fn delete_instance( + mut ctx: Signal, + profile_id: String, + instance_id: String, +) -> Result<(), Box> { + match ctx.write().config.profiles.get_mut(&profile_id) { + Some(profile) => { + profile.instances.remove(&instance_id); + let profile_path = paths::config_profile_dir().join(format!("{profile_id}.toml")); + std::fs::write(profile_path, toml::to_string_pretty(&profile)?)?; + } + _ => { + return Err("Profile not found".into()); + } + } + + Ok(()) +} + +#[component] +pub fn CreateNewInstance(profile_id: String) -> Element { + let mut ctx = use_context::>(); + + let instance_id = use_signal(|| uuid::Uuid::new_v4().to_string()); + + let mut instance = use_signal(|| config::Instance { + name: "".to_string(), + mod_id: "".to_string(), + icon: None, + }); + + rsx!(Popup { + theme: theme_with!(PopupTheme { + background: constants::BG_PRIMARY.into(), + color: constants::TEXT_PRIMARY.into(), + }), + close_on_escape_key: true, + + oncloserequest: move |_| { + ctx.write().popup_state = super::PopupState::Hidden; + }, + + PopupTitle { + label { + "Create new instance" + } + }, + PopupContent { + rect { + width: "100%", + height: "100%", + direction: "vertical", + padding: "8", + spacing: "8", + background: constants::BG_SECONDARY, + color: "white", + + rect { + width: "fill", + padding: "8 0 0 0", + width: "100%", + + label { + "Instance Name" + } + + Input { + theme: theme_with!(InputTheme { + width: "100%".into(), + background: constants::BG_SECONDARY.into(), + hover_background: constants::BG_SECONDARY.into(), + font_theme: theme_with!(FontTheme { + color: constants::TEXT_PRIMARY.into(), + }) + }), + placeholder: "Instance Name", + value: instance().name, + onchange: move |value| { + instance.write().name = value; + } + } + } + } + } + }) +} diff --git a/crates/gui/src/popups/delete_instance.rs b/crates/gui/src/popups/delete_instance.rs new file mode 100644 index 0000000..f3d156e --- /dev/null +++ b/crates/gui/src/popups/delete_instance.rs @@ -0,0 +1,73 @@ +use discord_modloader::{config, paths}; +use freya::prelude::*; + +use crate::{components::custom_button::CustomButton, constants}; + +fn delete_instance( + mut ctx: Signal, + profile_id: String, + instance_id: String, +) -> Result<(), Box> { + match ctx.write().config.profiles.get_mut(&profile_id) { + Some(profile) => { + profile.instances.remove(&instance_id); + let profile_path = paths::config_profile_dir().join(format!("{profile_id}.toml")); + std::fs::write(profile_path, toml::to_string_pretty(&profile)?)?; + } + _ => { + return Err("Profile not found".into()); + } + } + + Ok(()) +} + +#[component] +pub fn DeleteInstance(profile_id: String, instance_id: String) -> Element { + let mut ctx = use_context::>(); + + rsx!(Popup { + theme: theme_with!(PopupTheme { + background: constants::BG_PRIMARY.into(), + color: constants::TEXT_PRIMARY.into(), + }), + close_on_escape_key: true, + + oncloserequest: move |_| { + ctx.write().popup_state = super::PopupState::Hidden; + }, + + PopupTitle { + label { + "Delete instance" + } + }, + PopupContent { + label { + "Are you sure you want to delete the instance?" + } + + rect { + height: "fill", + width: "100%", + main_align: "end", + cross_align: "end", + CustomButton { + bg_anim: (constants::RED.into(), constants::BLURPLE.into()), + height: "32", + padding: "0 0 8 0", + label { + "Delete" + } + onclick: move |_| { + let result = delete_instance(ctx, profile_id.clone(), instance_id.clone()); + if result.is_ok() { + ctx.write().config = config::Config::init(); + ctx.write().popup_state = super::PopupState::Hidden; + } + } + } + } + } + }) +} diff --git a/crates/gui/src/popups/delete_profile.rs b/crates/gui/src/popups/delete_profile.rs new file mode 100644 index 0000000..1d19b82 --- /dev/null +++ b/crates/gui/src/popups/delete_profile.rs @@ -0,0 +1,62 @@ +use discord_modloader::{config, paths}; +use freya::prelude::*; + +use crate::{components::custom_button::CustomButton, constants}; + +fn delete_profile(id: String) -> Result<(), Box> { + let profile_file = paths::config_profile_dir().join(format!("{id}.toml")); + + std::fs::remove_file(profile_file)?; + + Ok(()) +} + +#[component] +pub fn DeleteProfile(profile_id: String) -> Element { + let mut ctx = use_context::>(); + + rsx!(Popup { + theme: theme_with!(PopupTheme { + background: constants::BG_PRIMARY.into(), + color: constants::TEXT_PRIMARY.into(), + }), + close_on_escape_key: true, + + oncloserequest: move |_| { + ctx.write().popup_state = super::PopupState::Hidden; + }, + + PopupTitle { + label { + "Delete profile" + } + }, + PopupContent { + label { + "Are you sure you want to delete this profile?" + } + + rect { + height: "fill", + width: "100%", + main_align: "end", + cross_align: "end", + CustomButton { + bg_anim: (constants::RED.into(), constants::BLURPLE.into()), + height: "32", + padding: "0 0 8 0", + label { + "Delete" + } + onclick: move |_| { + let result = delete_profile(profile_id.clone()); + if result.is_ok() { + ctx.write().config = config::Config::init(); + ctx.write().popup_state = super::PopupState::Hidden; + } + } + } + } + } + }) +} diff --git a/crates/gui/src/popups/launching.rs b/crates/gui/src/popups/launching.rs new file mode 100644 index 0000000..4e19de4 --- /dev/null +++ b/crates/gui/src/popups/launching.rs @@ -0,0 +1,31 @@ +use discord_modloader::config; +use freya::prelude::*; + +use crate::constants; + +#[component] +pub fn LaunchingPopup(instance: config::Instance) -> Element { + let mut ctx = use_context::>(); + + rsx!(Popup { + theme: theme_with!(PopupTheme { + background: constants::BG_PRIMARY.into(), + color: constants::TEXT_PRIMARY.into(), + }), + close_on_escape_key: true, + + oncloserequest: move |_| { + ctx.write().popup_state = super::PopupState::Hidden; + }, + PopupTitle { + label { + "Launching Discord" + } + }, + PopupContent { + label { + "Launching instance {instance.name}..." + } + } + }) +} diff --git a/crates/gui/src/popups/mod.rs b/crates/gui/src/popups/mod.rs new file mode 100644 index 0000000..fd5b139 --- /dev/null +++ b/crates/gui/src/popups/mod.rs @@ -0,0 +1,25 @@ +pub mod already_launched; +pub mod create_instance; +pub mod delete_instance; +pub mod delete_profile; +pub mod launching; + +use discord_modloader::config; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum PopupState { + Hidden, + Launching(config::Instance), + // Launched, + AlreadyLaunched(String, String), + DeleteProfile(String), + DeleteInstance(String, String), + CreateNewInstance(String), + // Error, +} + +pub use already_launched::*; +pub use create_instance::*; +pub use delete_instance::*; +pub use delete_profile::*; +pub use launching::*; diff --git a/crates/gui/src/utils/hoverable.rs b/crates/gui/src/utils/hoverable.rs index 70a3d54..ae7bfb3 100644 --- a/crates/gui/src/utils/hoverable.rs +++ b/crates/gui/src/utils/hoverable.rs @@ -1,12 +1,12 @@ use freya::prelude::*; -pub struct Hoverable { +pub struct Hoverable { #[allow( unused, reason = "Consumers don't always need to know the hover state." )] pub hovered: Signal, - pub animation: UseAnimator, + pub animation: UseAnimation, pub onmouseenter: Box)>, pub onmouseleave: Box)>, } @@ -16,12 +16,10 @@ pub struct Hoverable { /// # Example /// /// ```rust -/// let bg_anim = hoverable!(|ctx| { -/// ctx.with( -/// AnimColor::new("rgb(52, 52, 58)", "rgb(88, 101, 242)") -/// .ease(Ease::InOut) -/// .time(100), -/// ) +/// let bg_anim = hoverable!(|_conf| { +/// AnimColor::new("rgb(52, 52, 58)", "rgb(88, 101, 242)") +/// .ease(Ease::InOut) +/// .time(100) /// }); macro_rules! hoverable { ($anim:expr) => {{ diff --git a/crates/gui/src/utils/images.rs b/crates/gui/src/utils/images.rs new file mode 100644 index 0000000..d4b020e --- /dev/null +++ b/crates/gui/src/utils/images.rs @@ -0,0 +1,82 @@ +const LIB_PATH: &str = "/usr/lib/discord-modloader"; + +fn get_icons_from_dir(path: std::path::PathBuf) -> Vec<(String, Vec)> { + let mut icons = Vec::new(); + + if path.exists() && path.is_dir() { + if let Ok(files) = std::fs::read_dir(path) { + for entry in files { + let entry = entry.unwrap(); + let name = entry.file_name().into_string().unwrap(); + let icon = std::fs::read(entry.path()).unwrap(); + icons.push((name, icon)); + } + } + } + + icons +} + +pub fn get_all_icons() -> Vec<(String, Vec)> { + let mut icons = Vec::new(); + + let config_path = dirs::config_local_dir().unwrap().join("discord-modloader"); + let icon_path = config_path.join("icons"); + icons.extend(get_icons_from_dir(icon_path)); + + let lib_path = std::path::PathBuf::from(LIB_PATH); + let icon_path = lib_path.join("icons"); + icons.extend(get_icons_from_dir(icon_path)); + + let current_exe = std::env::current_exe().unwrap(); + let icon_path = current_exe.with_file_name("icons"); + icons.extend(get_icons_from_dir(icon_path)); + + let cwd = std::env::current_dir().unwrap(); + let icon_path = cwd.join("icons"); + icons.extend(get_icons_from_dir(icon_path)); + + let icon_path = cwd.join("configs").join("icons"); + icons.extend(get_icons_from_dir(icon_path)); + + // deduplicate + + let mut seen = std::collections::HashSet::new(); + icons.retain(|(name, _)| seen.insert(name.clone())); + + icons +} + +pub fn get_icon(name: &str) -> Option> { + let config_path = dirs::config_local_dir().unwrap().join("discord-modloader"); + let icon_path = config_path.join("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + + let lib_path = std::path::PathBuf::from(LIB_PATH); + + let icon_path = lib_path.join("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + + let current_exe = std::env::current_exe().unwrap(); + let icon_path = current_exe.with_file_name("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + + let cwd = std::env::current_dir().unwrap(); + let icon_path = cwd.join("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + + let icon_path = cwd.join("configs").join("icons").join(name); + if icon_path.exists() { + return std::fs::read(icon_path).ok(); + } + + None +} diff --git a/crates/gui/src/utils/launch.rs b/crates/gui/src/utils/launch.rs new file mode 100644 index 0000000..97bb14e --- /dev/null +++ b/crates/gui/src/utils/launch.rs @@ -0,0 +1,35 @@ +use std::process::Stdio; + +#[cfg(target_os = "linux")] +pub fn launch_instance( + profile_id: &str, + instance_id: &str, + args: &str, +) -> Result> { + #[allow(clippy::zombie_processes, reason = "Process detaches from parent.")] + let target = std::process::Command::new(std::env::current_exe().unwrap()) + .arg("--profile") + .arg(profile_id) + .arg("--instance") + .arg(instance_id) + .arg("--") + .arg(args) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .stdin(Stdio::null()) + .spawn() + .expect("Failed to launch instance."); + + let pid = target.id(); + + Ok(pid) +} + +#[cfg(target_os = "windows")] +pub fn launch_instance( + profile_id: &str, + instance_id: &str, + args: &str, +) -> Result> { + todo!(); +} diff --git a/crates/gui/src/utils/mod.rs b/crates/gui/src/utils/mod.rs index 64ed538..8d18ce8 100644 --- a/crates/gui/src/utils/mod.rs +++ b/crates/gui/src/utils/mod.rs @@ -1 +1,103 @@ +use std::path::PathBuf; + pub mod hoverable; +pub mod images; +pub mod launch; + +macro_rules! p2s { + ($path:expr) => { + $path.to_str().unwrap().to_string() + }; +} + +// from: https://github.com/Vencord/Installer +const DISCORD_NAMES: &[&str] = &[ + "Discord", + "DiscordPTB", + "DiscordCanary", + "DiscordDevelopment", + "discord", + "discordptb", + "discordcanary", + "discorddevelopment", + "discord-ptb", + "discord-canary", + "discord-development", + // Flatpak. Untested. May not work. + "com.discordapp.Discord", + "com.discordapp.DiscordPTB", + "com.discordapp.DiscordCanary", + "com.discordapp.DiscordDevelopment", +]; + +#[cfg(target_os = "linux")] +fn paths_to_check() -> Vec { + let home = dirs::home_dir().unwrap(); + let local_share = home.join(".local").join("share"); + let dvm = home.join(".dvm").join("branches"); + + vec![ + "/usr/share".to_string(), + "/usr/lib64".to_string(), + "/opt".to_string(), + p2s!(local_share), + p2s!(home.join(".local").join("share")), + p2s!(dvm.join("canary")), + p2s!(dvm.join("ptb")), + p2s!(dvm.join("stable")), + p2s!(dvm.join("development")), + // Flatpak. Untested. May not work. + "/var/lib/flatpak/app".to_string(), + p2s!(local_share.join("flatpak").join("app")), + ] +} + +#[cfg(target_os = "linux")] +pub fn find_discord_installations() -> Vec { + let mut instances = Vec::new(); + + for dir in paths_to_check() { + let children = match std::fs::read_dir(&dir) { + Ok(children) => children, + Err(_) => continue, + }; + + for child in children.flatten() { + let metadata = match child.metadata() { + Ok(metadata) => metadata, + Err(_) => continue, + }; + + if !metadata.is_dir() { + continue; + } + + let name = match child.file_name().to_str() { + Some(name) => name, + None => continue, + } + .to_string(); + + // check if name contains any of the discord names + if DISCORD_NAMES.iter().any(|&x| name.ends_with(x)) { + let path = parse_discord_instance(child.path()); + if let Some(path) = path { + instances.push(path); + } + } + } + } + + instances +} + +#[cfg(target_os = "linux")] +fn parse_discord_instance(path: PathBuf) -> Option { + DISCORD_NAMES.iter().find_map(|n| { + let path = path.join(n); + match path.exists() { + true => Some(p2s!(path)), + false => None, + } + }) +} diff --git a/crates/libdiscord-modloader/Cargo.toml b/crates/libdiscord-modloader/Cargo.toml index 18d6fc1..29350c7 100644 --- a/crates/libdiscord-modloader/Cargo.toml +++ b/crates/libdiscord-modloader/Cargo.toml @@ -10,8 +10,16 @@ crate-type = ["cdylib", "lib"] [dependencies] asar = "0.3.0" dirs = "5.0.1" +flate2 = "1.0.35" +octocrab = { version = "0.42.1", default-features = false } serde = { version = "1.0.210", features = ["serde_derive"] } +serde_json = "1.0.135" +strum = { version = "0.26.3", features = ["derive"] } +sysinfo = "0.33.0" +tar = "0.4.43" toml = "0.8.19" +ureq = { version = "2.12.1", features = ["json"] } +zip = "2.2.2" [target.'cfg(windows)'.dependencies] winapi = { version = "0.3.9", features = [ diff --git a/crates/libdiscord-modloader/src/asar/custom_profile.js b/crates/libdiscord-modloader/src/asar/custom_profile.js index 9d09e1e..31f3390 100644 --- a/crates/libdiscord-modloader/src/asar/custom_profile.js +++ b/crates/libdiscord-modloader/src/asar/custom_profile.js @@ -1,5 +1,5 @@ const { app } = require("electron"); -const customAppDir = "__CUSTOM_PROFILE_DIR__"; +const customAppDir = "$PROFILE"; const _setPath = app.setPath; diff --git a/crates/libdiscord-modloader/src/asar/require.js b/crates/libdiscord-modloader/src/asar/require.js new file mode 100644 index 0000000..6105496 --- /dev/null +++ b/crates/libdiscord-modloader/src/asar/require.js @@ -0,0 +1,11 @@ +const mod_entrypoint = require("$ENTRYPOINT"); + +// Hard-code support for Moonlight, since it doesn't auto-inject. +if ( + mod_entrypoint && + mod_entrypoint["inject"] && + typeof mod_entrypoint["inject"] === "function" +) { + let asar = require("path").resolve(__dirname, "../_app.asar"); + mod_entrypoint.inject(asar); +} diff --git a/crates/libdiscord-modloader/src/config.rs b/crates/libdiscord-modloader/src/config.rs index 32d8baa..3a2f599 100644 --- a/crates/libdiscord-modloader/src/config.rs +++ b/crates/libdiscord-modloader/src/config.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::collections::BTreeMap; use serde::{Deserialize, Serialize}; @@ -11,44 +11,35 @@ pub enum ConfigFile { Mod(Mod), } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct Config { - // pub instances: HashMap, - pub profiles: HashMap, - pub mods: HashMap, + pub profiles: BTreeMap, + pub mods: BTreeMap, + pub settings: Settings, } impl Config { - pub fn validate(&mut self) { - // for (_, mod_) in self.mods.iter_mut() { - // let entrypoint_exists = std::path::Path::new(&mod_.path) - // .join(&mod_.entrypoint) - // .exists(); - - // mod_.is_valid = entrypoint_exists; - // } - - // for (_, instance) in self.instances.iter_mut() { - // if let Some(target_mod) = self.mods.get(&instance.r#mod) { - // let asar_exists: bool = std::path::Path::new(&instance.path) - // .parent() - // .expect("Expected Discord executable path to have a parent.") - // .join("resources") - // .join("app.asar") - // .exists(); - - // instance.is_valid = target_mod.is_valid && asar_exists; - // } else { - // instance.is_valid = false; - // } - // } - } - pub fn init() -> Config { + let config_dir = ensure_dir(paths::configs_dir()); let profiles_config_dir = ensure_dir(paths::config_profile_dir()); let mods_config_dir = ensure_dir(paths::config_mods_dir()); - let mut profile_configs = HashMap::new(); + let settings_file = config_dir.join("settings.toml"); + let settings = if settings_file.exists() { + if let Ok(settings) = std::fs::read_to_string(&settings_file) { + toml::from_str::(&settings).unwrap_or_default() + } else { + eprintln!("Failed to read settings file: {:?}", settings_file); + Settings::default() + } + } else { + let settings = Settings::default(); + let settings_str = toml::to_string(&settings).unwrap(); + std::fs::write(settings_file, settings_str).unwrap(); + settings + }; + + let mut profile_configs = BTreeMap::new(); for profile in paths::read_dir(&profiles_config_dir) { if !profile.path().to_string_lossy().ends_with(".toml") { @@ -56,13 +47,19 @@ impl Config { } let id = profile.file_name().to_string_lossy().replace(".toml", ""); - let profile = std::fs::read_to_string(profile.path()).unwrap(); - let profile = toml::from_str::(&profile).unwrap(); + let Ok(profile) = std::fs::read_to_string(profile.path()) else { + eprintln!("Failed to read profile config: {:?}", profile); + continue; + }; + let Ok(profile) = toml::from_str::(&profile) else { + eprintln!("Failed to parse profile config: {:?}", profile); + continue; + }; profile_configs.insert(id, profile); } - let mut mod_configs = HashMap::new(); + let mut mod_configs = BTreeMap::new(); for mod_ in paths::read_dir(&mods_config_dir) { if !mod_.path().to_string_lossy().ends_with(".toml") { @@ -70,37 +67,29 @@ impl Config { } let id = mod_.file_name().to_string_lossy().replace(".toml", ""); - let mod_ = std::fs::read_to_string(mod_.path()).unwrap(); - let mod_ = toml::from_str::(&mod_).unwrap(); + let Ok(mod_) = std::fs::read_to_string(mod_.path()) else { + eprintln!("Failed to read mod config: {:?}", mod_); + continue; + }; + let Ok(mod_) = toml::from_str::(&mod_) else { + eprintln!("Failed to read parse config: {:?}", mod_); + continue; + }; mod_configs.insert(id, mod_.r#mod); } - dbg!(&profile_configs); - Config { profiles: profile_configs, mods: mod_configs, + settings, } } } -impl ConfigFile { - fn from_file(path: &str) -> Self { - let file = std::fs::read_to_string(path).unwrap(); - let config: ConfigFile = toml::from_str(&file).unwrap(); - config - } -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct InstanceConfig { - pub instance: Instance, -} - #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] pub struct Instance { - pub id: String, + // pub id: String, /// The display name of the instance. (e.g. "Vencord", "Moonlight", "My Custom Instance") /// /// Can be duplicate, but not recommended for clarity. @@ -110,15 +99,17 @@ pub struct Instance { pub icon: Option, /// The identifier of the mod to use for this instance. + /// + /// Internal mods (ones with build-in updaters) will be prefixed with "Internal::" pub mod_id: String, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Default, Serialize, Deserialize, Clone)] pub struct ModConfig { pub r#mod: Mod, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] pub struct Mod { /// The display name of the mod. (e.g. "Vencord", "Moonlight", "BetterDiscord") /// @@ -126,7 +117,8 @@ pub struct Mod { pub name: String, /// The path to the mod's dist folder. (e.g. "/path/to/moonlight") - pub path: String, + /// If none, there should be an updater. + pub path: Option, /// The entrypoint of the mod. (e.g. "injector.js", "patcher.js") pub entrypoint: String, @@ -137,11 +129,39 @@ pub struct Mod { /// Provide custom loader JS to be injected into the ASAR index.js. pub loader: Option, - #[serde(skip, default)] - pub is_valid: bool, + /// The updater configuration for the mod. + pub updater: Option, +} + +#[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] +pub struct ModUpdater { + pub github_org: String, + pub github_repo: String, + pub dist_file_names: Vec, + pub dist_file_type: DistFileType, + pub icon_url: Option, + #[serde(default = "default_bool_true")] + pub ask_before_update: bool, + #[serde(default = "default_bool_true")] + pub auto_update: bool, +} - #[serde(skip, default)] - pub config_path: String, +#[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq, strum::EnumIter, Hash)] +pub enum DistFileType { + #[default] + Raw, + TarGz, + Zip, +} + +impl std::fmt::Display for DistFileType { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + DistFileType::Raw => write!(f, "plain file"), + DistFileType::TarGz => write!(f, "tar.gz"), + DistFileType::Zip => write!(f, "zip"), + } + } } /// The loader configuration for the mod. @@ -149,18 +169,20 @@ pub struct Mod { /// /// The following variables can be used: /// -/// - `__CUSTOM_PROFILE_DIR__`: The directory of the custom profile. -/// - `__MOD_ENTRYPOINT_FILE__`: The entrypoint file of the mod. -#[derive(Debug, Serialize, Deserialize, Clone)] +/// - `$PROFILE`: The directory of the custom profile. +/// - `$ENTRYPOINT`: The entrypoint file of the mod. +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] pub struct ModLoader { pub prefix: Option, - #[serde(default = "default_require")] + #[serde(default = "ModLoader::default_require")] pub require: Option, pub suffix: Option, } -fn default_require() -> Option { - Some(r#"require("__MOD_ENTRYPOINT_FILE__")"#.to_string()) +impl ModLoader { + pub fn default_require() -> Option { + Some(include_str!("./asar/require.js").to_string()) + } } // [profile] @@ -168,24 +190,36 @@ fn default_require() -> Option { // [[instance]] // ... -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq)] pub struct ProfileConfig { pub profile: Profile, - #[serde(rename = "instance")] - pub instances: Vec, + #[serde(rename = "instance", default)] + pub instances: BTreeMap, pub discord: Discord, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq)] pub struct Profile { pub name: String, #[serde(default)] pub use_default_profile: bool, } -#[derive(Debug, Serialize, Deserialize, Clone)] +#[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq)] pub struct Discord { pub executable: String, + #[serde(default)] + pub args: String, +} + +#[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq)] +pub struct Settings { + #[serde(default = "default_bool_true")] + pub hide_window_on_launch: bool, +} + +fn default_bool_true() -> bool { + true } diff --git a/crates/libdiscord-modloader/src/lib.rs b/crates/libdiscord-modloader/src/lib.rs index 43dca1f..32a5573 100644 --- a/crates/libdiscord-modloader/src/lib.rs +++ b/crates/libdiscord-modloader/src/lib.rs @@ -1,14 +1,16 @@ pub mod config; pub mod discord; pub mod paths; +pub mod updater; +pub mod utils; -use libc::MOD_FREQUENCY; -use paths::ensure_dir; +use paths::{cache_asar_path, ensure_dir}; #[cfg(target_os = "linux")] mod unix; #[cfg(target_os = "windows")] +#[allow(unused_imports)] mod windows; #[cfg(target_os = "linux")] @@ -19,34 +21,41 @@ pub use unix::*; #[allow(unused_imports)] pub use windows::*; -pub fn init_current_cache(cfg: &config::Config, profile_id: &str, instance_id: &str) -> String { +pub fn init_current_cache( + cfg: &config::Config, + profile_id: &str, + instance_id: &str, + force_update: bool, +) -> String { static ASAR_CUSTOM_PROFILE_JS: &str = include_str!("./asar/custom_profile.js"); static ASAR_PACKAGE_JSON: &str = include_str!("./asar/package.json"); - let asar_dir = ensure_dir(paths::data_asar_dir()); - let profile = cfg .profiles .get(profile_id) - .expect(&format!("Failed to find profile '{}'.", profile_id)); + .unwrap_or_else(|| panic!("Failed to find profile '{}'.", profile_id)); let instance = profile .instances - .iter() - .find(|instance| instance.id == instance_id) - .expect(&format!("Failed to find instance '{}'.", instance_id)); + .get(instance_id) + .unwrap_or_else(|| panic!("Failed to find instance '{}'.", instance_id)); let r#mod = cfg .mods .get(&instance.mod_id) - .expect(&format!("Failed to find mod '{}'.", instance.mod_id)); + .unwrap_or_else(|| panic!("Failed to find mod '{}'.", instance.mod_id)) + .to_owned(); + + // TODO: Make this more robust + if let Some(ref updater) = r#mod.updater { + let _ = updater::update(updater, force_update); + } + + let asar_cache_path = cache_asar_path(profile_id, instance_id, &instance.mod_id); - let asar_cache_path = asar_dir.join(format!( - "{}-{}-{}.asar", - profile_id, instance_id, instance.mod_id - )); + ensure_dir(asar_cache_path.parent().unwrap().to_path_buf()); - let profile_dir = if profile.profile.use_default_profile { + let profile_dir = if !profile.profile.use_default_profile { let profile_dir = ensure_dir(paths::data_profiles_dir().join(profile_id)); let profile_dir = profile_dir.to_str().unwrap().replace("\\", "\\\\"); Some(profile_dir) @@ -54,7 +63,20 @@ pub fn init_current_cache(cfg: &config::Config, profile_id: &str, instance_id: & None }; - let mod_entrypoint = std::path::Path::new(&r#mod.path).join(&r#mod.entrypoint); + // If path is not provided, try to use the updater instead. + let mod_path = if let Some(path) = r#mod.path { + path + } else if let Some(updater) = r#mod.updater { + paths::cache_mod_files_dir() + .join(&updater.github_org) + .join(&updater.github_repo) + .to_string_lossy() + .to_string() + } else { + panic!("Mod '{}' does not have a path or updater.", r#mod.name); + }; + + let mod_entrypoint = std::path::Path::new(&mod_path).join(&r#mod.entrypoint); let mod_entrypoint = mod_entrypoint.to_str().unwrap().replace("\\", "\\\\"); let mut custom_loader = String::from("console.log(\"Launching with Discord Modloader.\");\n"); @@ -62,8 +84,8 @@ pub fn init_current_cache(cfg: &config::Config, profile_id: &str, instance_id: & // If using a custom profile directory, insert this. if let Some(ref profile_dir) = profile_dir { let data = ASAR_CUSTOM_PROFILE_JS - .replace("__CUSTOM_PROFILE_DIR__", &profile_dir) - .replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint); + .replace("$PROFILE", profile_dir) + .replace("$ENTRYPOINT", &mod_entrypoint); custom_loader.push_str(&data); } @@ -71,10 +93,10 @@ pub fn init_current_cache(cfg: &config::Config, profile_id: &str, instance_id: & if let Some(ref loader) = r#mod.loader { // Users can provide a custom prefix in the profile TOML. if let Some(ref prefix) = loader.prefix { - let mut prefix = prefix.replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint); + let mut prefix = prefix.replace("$ENTRYPOINT", &mod_entrypoint); if let Some(ref profile_dir) = profile_dir { - prefix = prefix.replace("__CUSTOM_PROFILE_DIR__", &profile_dir); + prefix = prefix.replace("$PROFILE", profile_dir); } custom_loader.push_str(&prefix); @@ -82,10 +104,10 @@ pub fn init_current_cache(cfg: &config::Config, profile_id: &str, instance_id: & // If the user provides a custom require, use that instead of the default. if let Some(ref require) = loader.require { - let mut require = require.replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint); + let mut require = require.replace("$ENTRYPOINT", &mod_entrypoint); if let Some(ref profile_dir) = profile_dir { - require = require.replace("__CUSTOM_PROFILE_DIR__", &profile_dir); + require = require.replace("$PROFILE", profile_dir); } custom_loader.push_str(&require); @@ -95,16 +117,21 @@ pub fn init_current_cache(cfg: &config::Config, profile_id: &str, instance_id: & // If the user provices a custom suffix, insert it. if let Some(ref suffix) = loader.suffix { - let mut suffix = suffix.replace("__MOD_ENTRYPOINT_FILE__", &mod_entrypoint); + let mut suffix = suffix.replace("$ENTRYPOINT", &mod_entrypoint); if let Some(ref profile_dir) = profile_dir { - suffix = suffix.replace("__CUSTOM_PROFILE_DIR__", &profile_dir); + suffix = suffix.replace("$PROFILE", profile_dir); } custom_loader.push_str(&suffix); } } else { - custom_loader.push_str(&format!(r#"require("{}");"#, &mod_entrypoint)); + custom_loader.push_str( + config::ModLoader::default_require() + .unwrap() + .replace("$ENTRYPOINT", &mod_entrypoint) + .as_str(), + ); } let mut asar = asar::AsarWriter::new(); @@ -113,6 +140,8 @@ pub fn init_current_cache(cfg: &config::Config, profile_id: &str, instance_id: & asar.write_file("package.json", ASAR_PACKAGE_JSON, false) .unwrap(); + dbg!(&asar_cache_path); + asar.finalize(std::fs::File::create(&asar_cache_path).unwrap()) .unwrap(); diff --git a/crates/libdiscord-modloader/src/paths.rs b/crates/libdiscord-modloader/src/paths.rs index 3626354..050d310 100644 --- a/crates/libdiscord-modloader/src/paths.rs +++ b/crates/libdiscord-modloader/src/paths.rs @@ -3,10 +3,12 @@ static APP_NAME: &str = "discord-modloader"; /// Create a directory if it doesn't exist. pub fn ensure_dir(dir: std::path::PathBuf) -> std::path::PathBuf { if !dir.exists() { - std::fs::create_dir_all(&dir).expect(&format!( - "Failed to create path. Make sure you have permissions. {}", - dir.display() - )); + std::fs::create_dir_all(&dir).unwrap_or_else(|_| { + panic!( + r#"Failed to create path. Make sure you have permissions. {}"#, + dir.display() + ) + }); } dir } @@ -28,6 +30,11 @@ pub fn config_mods_dir() -> std::path::PathBuf { configs_dir().join("mods") } +/// The mods config directory. +pub fn config_icons_dir() -> std::path::PathBuf { + configs_dir().join("icons") +} + /// The data directory for this application. pub fn data_dir() -> std::path::PathBuf { dirs::data_dir() @@ -35,25 +42,39 @@ pub fn data_dir() -> std::path::PathBuf { .join(APP_NAME) } +/// The profiles data directory. +pub fn data_profiles_dir() -> std::path::PathBuf { + data_dir().join("profiles") +} + +pub fn cache_dir() -> std::path::PathBuf { + dirs::cache_dir() + .expect("Failed to get cache dir") + .join(APP_NAME) +} + /// The asar cache directory. -pub fn data_asar_dir() -> std::path::PathBuf { - data_dir().join("asar") +pub fn cache_asar_dir() -> std::path::PathBuf { + cache_dir().join("asar") } -/// The asar path for a profile, instance, and mod. -pub fn data_asar_path(profile_id: &str, instance_id: &str, mod_id: &str) -> std::path::PathBuf { - data_asar_dir().join(format!("{}-{}-{}.asar", profile_id, instance_id, mod_id)) +pub fn cache_mod_files_dir() -> std::path::PathBuf { + cache_dir().join("mod_files") } -/// The profiles data directory. -pub fn data_profiles_dir() -> std::path::PathBuf { - data_dir().join("profiles") +pub fn cache_mod_metadata_dir() -> std::path::PathBuf { + cache_dir().join("mod_metadata") +} + +/// The asar path for a profile, instance, and mod. +pub fn cache_asar_path(profile_id: &str, instance_id: &str, mod_id: &str) -> std::path::PathBuf { + cache_asar_dir().join(format!("{}-{}-{}.asar", profile_id, instance_id, mod_id)) } /// Read a directory and return a vector of DirEntry. Panic if it fails. pub fn read_dir(path: &std::path::Path) -> Vec { std::fs::read_dir(path) - .expect(&format!("Failed to read directory: {}", path.display())) + .unwrap_or_else(|_| panic!("Failed to read directory: {}", path.display())) .collect::, _>>() - .expect(&format!("Failed to read directory: {}", path.display())) + .unwrap_or_else(|_| panic!("Failed to read directory: {}", path.display())) } diff --git a/crates/libdiscord-modloader/src/unix.rs b/crates/libdiscord-modloader/src/unix.rs index 215f36f..bf47a29 100644 --- a/crates/libdiscord-modloader/src/unix.rs +++ b/crates/libdiscord-modloader/src/unix.rs @@ -9,13 +9,13 @@ static MODLOADER_ASAR_PATH: LazyLock = LazyLock::new(|| std::env::var("MODLOADER_ASAR_PATH").unwrap()); #[link(name = "dl")] -extern "C" { - fn dlsym(handle: *const c_void, symbol: *const c_char) -> *const c_void; +unsafe extern "C" { + unsafe fn dlsym(handle: *const c_void, symbol: *const c_char) -> *const c_void; } -extern "C" { +unsafe extern "C" { #[link_name = "uv_fs_lstat"] - fn original_uv_fs_lstat( + unsafe fn original_uv_fs_lstat( loop_: *const c_void, req: *const c_void, path: *const c_char, @@ -45,6 +45,7 @@ unsafe extern "C" fn __libc_start_main( rtld_fini: extern "C" fn(), stack_end: *mut c_void, ) -> i32 { + #[allow(clippy::missing_transmute_annotations)] UvFsLstatDetour .initialize( std::mem::transmute::(original_uv_fs_lstat), @@ -75,7 +76,6 @@ static_detour! { static UvFsLstatDetour: fn(*const c_void, *const c_void, *const c_char, *mut c_void) -> i32; } -#[no_mangle] #[export_name = "uv_fs_lstat"] unsafe extern "C" fn export_uv_vs_lstat( loop_: *const c_void, diff --git a/crates/libdiscord-modloader/src/updater.rs b/crates/libdiscord-modloader/src/updater.rs new file mode 100644 index 0000000..7439736 --- /dev/null +++ b/crates/libdiscord-modloader/src/updater.rs @@ -0,0 +1,129 @@ +pub fn update(config: &crate::config::ModUpdater, force: bool) -> Result<(), String> { + use octocrab::models::repos::Release; + + println!("Checking for mod updates..."); + + let metadata_dir = crate::paths::cache_mod_metadata_dir() + .join(&config.github_org) + .join(&config.github_repo); + + if !metadata_dir.exists() { + std::fs::create_dir_all(&metadata_dir) + .map_err(|e| format!("Failed to create metadata directory: {}", e))?; + } + + let output_dir = crate::paths::cache_mod_files_dir() + .join(&config.github_org) + .join(&config.github_repo); + + if !output_dir.exists() { + std::fs::create_dir_all(&output_dir) + .map_err(|e| format!("Failed to create mod cache directory: {}", e))?; + } + + let release_url = format!( + "https://api.github.com/repos/{}/{}/releases/latest", + &config.github_org, &config.github_repo + ); + + let release_info: Release = ureq::get(&release_url) + .call() + .map_err(|e| format!("Failed to get release: {}", e))? + .into_json() + .map_err(|e| format!("Failed to parse release: {}", e))?; + + // If the version IDs are the same, and force is not enabled, then return early. + let release_version_file = metadata_dir.join("release.json"); + if !force && release_version_file.exists() { + if let Ok(file) = std::fs::File::open(&release_version_file) { + if let Ok(release) = serde_json::from_reader::<_, Release>(file) { + // Vencord only changes the name, and doesn't create new releases... + if release.tag_name == release_info.tag_name && release.name == release_info.name { + println!( + "Mod is already the latest version... ({})", + release.tag_name + ); + return Ok(()); + } + } + } + } + + for dist_file in &config.dist_file_names { + // TODO: Should the download URL be pulled from the release assets? + // Will be a bit annoying if there are multiple assets though. + let download_url = format!( + "https://github.com/{}/{}/releases/download/{}/{}", + config.github_org, config.github_repo, release_info.tag_name, &dist_file + ); + + let mut reader = ureq::get(&download_url) + .call() + .map_err(|e| format!("Failed to download release tarball: {}", e))? + .into_reader(); + + match config.dist_file_type { + crate::config::DistFileType::TarGz => { + use flate2::read::GzDecoder; + use tar::Archive; + + let tar = GzDecoder::new(reader); + let mut archive = Archive::new(tar); + + // TODO: If files are already present, should they be deleted? + + archive + .unpack(&output_dir) + .map_err(|e| format!("Failed to unpack tarball: {}", e))?; + } + crate::config::DistFileType::Zip => { + use std::io::Cursor; + use zip::read::ZipArchive; + + let mut bytes = Vec::new(); + reader + .read_to_end(&mut bytes) + .map_err(|e| format!("Failed to read zip file: {}", e))?; + + let reader = Cursor::new(bytes.as_slice()); + + let mut zip = ZipArchive::new(reader) + .map_err(|e| format!("Failed to read zip file: {}", e))?; + + zip.extract(&output_dir) + .map_err(|e| format!("Failed to extract zip file: {}", e))?; + } + crate::config::DistFileType::Raw => { + let mut file = std::fs::File::create(output_dir.join(dist_file)) + .map_err(|e| format!("Failed to create raw file: {}", e))?; + + std::io::copy(&mut reader, &mut file) + .map_err(|e| format!("Failed to write raw file: {}", e))?; + } + } + } + + let version_content = serde_json::to_string(&release_info) + .map_err(|e| format!("Failed to serialize mod release version: {}", e))?; + + std::fs::write(&release_version_file, version_content) + .map_err(|e| format!("Failed to write version to file: {}", e))?; + + if let Some(ref icon_url) = config.icon_url { + let mut icon_file_bytes = Vec::new(); + ureq::get(icon_url) + .call() + .map_err(|e| format!("Failed to download mod icon: {}", e))? + .into_reader() + .read_to_end(&mut icon_file_bytes) + .map_err(|e| format!("Failed to read mod icon: {}", e))?; + + let icon_file_path = metadata_dir.join("icon.png"); + + std::fs::write(&icon_file_path, &mut icon_file_bytes) + .map_err(|e| format!("Failed to write mod icon: {}", e))?; + } + + println!("Finished updating mod!"); + Ok(()) +} diff --git a/crates/libdiscord-modloader/src/utils.rs b/crates/libdiscord-modloader/src/utils.rs new file mode 100644 index 0000000..20c4214 --- /dev/null +++ b/crates/libdiscord-modloader/src/utils.rs @@ -0,0 +1,82 @@ +use crate::{config, paths}; + +use sysinfo::{Pid, ProcessRefreshKind, RefreshKind, System}; + +pub fn kill_pids(pids: Vec) { + let system = System::new_all(); + for pid in pids { + if let Some(proc) = system.process(pid) { + let _ = proc.kill(); + } + } +} + +pub fn find_running_instances(profile_id: &str, profile: &config::ProfileConfig) -> Vec { + let system = System::new_with_specifics( + RefreshKind::nothing().with_processes(ProcessRefreshKind::everything()), + ); + + println!("Finding instances for {profile_id}"); + + system + .processes() + .iter() + .filter_map(|(_pid, proc)| { + let cmd = proc.cmd().join(std::ffi::OsStr::new(" ")); + let cmd = cmd.to_str().unwrap().to_string(); + + let should_kill = match !profile.profile.use_default_profile { + false => { + // If using the default discord profile (doesn't use our discord-modloader profiles dir) + // and the command contains the discord executable path, it's a duplicate profile. + !cmd.contains(paths::data_profiles_dir().to_str().unwrap()) + && cmd.contains(&profile.discord.executable) + } + true => { + let profile_path = paths::data_profiles_dir().join(profile_id); + let profile_path = profile_path.to_str().unwrap(); + cmd.contains(&format!("--user-data-dir={}", profile_path)) + } + }; + + if should_kill { + Some(proc.pid()) + } else { + None + } + }) + .collect() +} + +pub fn launch_detached_instance( + profile_id: &str, + instance_id: &str, + args: &str, + force_update: bool, +) -> Result> { + let mut target = std::process::Command::new(std::env::current_exe().unwrap()); + + target + .arg("--profile") + .arg(profile_id) + .arg("--instance") + .arg(instance_id); + + if force_update { + target.arg("--force-update"); + } + + target + .arg("--") + .arg(args) + .stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::null()) + .stdin(std::process::Stdio::null()); + + #[allow(clippy::zombie_processes, reason = "Process detaches from parent.")] + let target = target.spawn().expect("Failed to launch instance."); + + let pid = target.id(); + + Ok(pid) +} diff --git a/src/main.rs b/src/main.rs index 1c54ace..a775889 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,6 +9,12 @@ struct Args { #[clap(short, long)] pub instance: Option, + + #[clap(allow_hyphen_values = true, last = true)] + pub launch_args: Vec, + + #[clap(short, long, default_value = "false")] + pub force_update: bool, } #[cfg(target_os = "macos")] @@ -23,23 +29,43 @@ fn main() { let args: Args = Args::parse(); if let (Some(profile_id), Some(instance_id)) = (args.profile, args.instance) { - let mut config = config::Config::init(); - config.validate(); - - unsafe { load_profile(&config, &profile_id, &instance_id) }; + // When spawned from the GUI, the process is a child of the GUI process. + // We need to detach it from the GUI process to prevent it from being killed when the GUI is closed. + #[cfg(target_os = "linux")] + unsafe { + libc::setsid() + }; + + let config = config::Config::init(); + + unsafe { + load_profile( + &config, + &profile_id, + &instance_id, + args.launch_args, + args.force_update, + ) + }; } else { - gui::start_gui(); + gui_new::start_gui(); } } #[cfg(target_os = "linux")] -unsafe fn load_profile(config: &config::Config, profile_id: &str, instance_id: &str) { +unsafe fn load_profile( + config: &config::Config, + profile_id: &str, + instance_id: &str, + args: Vec, + force_update: bool, +) { use discord_modloader::paths::{self, ensure_dir}; let profile = config .profiles .get(profile_id) - .expect(&format!("Failed to find profile '{}'.", profile_id)); + .unwrap_or_else(|| panic!("Failed to find profile '{}'.", profile_id)); // Try to use the local instance of libdiscord_modloader.so first. let current_exe = std::env::current_exe().unwrap(); @@ -54,7 +80,7 @@ unsafe fn load_profile(config: &config::Config, profile_id: &str, instance_id: & } } - let asar_path = init_current_cache(config, profile_id, instance_id); + let asar_path = init_current_cache(config, profile_id, instance_id, force_update); let working_dir = if profile.profile.use_default_profile { std::path::Path::new(&profile.discord.executable) @@ -72,7 +98,7 @@ unsafe fn load_profile(config: &config::Config, profile_id: &str, instance_id: & .current_dir(working_dir) .env("LD_PRELOAD", shared_object.to_str().unwrap()) .env("MODLOADER_ASAR_PATH", asar_path) - // .args(["--trace-warnings"]) + .args(args) .spawn() .expect("Failed to launch instance."); @@ -82,7 +108,13 @@ unsafe fn load_profile(config: &config::Config, profile_id: &str, instance_id: & } #[cfg(target_os = "windows")] -unsafe fn load_profile(config: &config::Config, instance: &config::Instance) { +unsafe fn load_profile( + config: &config::Config, + instance: &config::Instance, + args: Vec, + force_update: bool, +) { + // TODO: Implement args on windows use detours_sys::{DetourCreateProcessWithDllExA, _PROCESS_INFORMATION, _STARTUPINFOA}; use libdiscordmodloader::discord::get_discord_exe; use winapi::um::{ From 2f378b367aadbc7301a565476ad766723fdccf4a Mon Sep 17 00:00:00 2001 From: Rie Takahashi Date: Sat, 25 Jan 2025 18:09:34 +0000 Subject: [PATCH 20/20] more gui stuff, use external electron-hook crate --- .cargo/config.toml | 9 +- Cargo.lock | 1501 +++-------------- Cargo.toml | 18 +- assets/icons/chevron-down.svg | 1 + assets/icons/chevron-up.svg | 1 + assets/icons/circle-help.svg | 1 + assets/icons/circle-question.svg | 1 - assets/icons/floppy-disk.svg | 2 +- assets/icons/folder.svg | 2 +- assets/icons/gear.svg | 2 +- assets/icons/home.svg | 2 +- assets/icons/pen-to-square.svg | 1 + assets/icons/plus.svg | 2 +- assets/icons/refresh-arrows.svg | 1 + assets/icons/star-filled.svg | 1 + assets/icons/star-hollow.svg | 1 + assets/icons/trash.svg | 2 +- build.rs | 3 + crates/gui-new/Cargo.toml | 27 - crates/gui-new/src/components/home_page.rs | 10 - crates/gui-new/src/components/mod.rs | 10 - crates/gui-new/src/components/profile_page.rs | 424 ----- crates/gui-new/src/components/sidebar.rs | 465 ----- crates/gui-new/src/constants.rs | 43 - crates/gui-new/src/lib.rs | 55 - crates/gui-new/src/utils/hoverable.rs | 54 - crates/gui-new/src/utils/mod.rs | 2 - crates/gui/.gitignore | 1 - crates/gui/Cargo.toml | 20 +- crates/{gui-new => gui}/src/app.rs | 85 +- crates/{gui-new => gui}/src/assets.rs | 12 +- .../{gui-new => gui}/src/components/button.rs | 0 crates/gui/src/components/custom_button.rs | 58 - crates/gui/src/components/home_page.rs | 140 ++ crates/gui/src/components/main_content.rs | 21 - crates/gui/src/components/mod.rs | 11 +- .../src/components/mod_from_template_page.rs | 7 +- .../src/components/mod_page.rs | 131 +- .../{gui-new => gui}/src/components/popup.rs | 0 crates/gui/src/components/profile_page.rs | 735 ++++++++ .../src/components/settings_page.rs | 0 crates/gui/src/components/sidebar.rs | 552 ++++-- crates/gui/src/constants.rs | 65 +- crates/gui/src/lib.rs | 110 +- crates/gui/src/pages/create_profile.rs | 280 --- crates/gui/src/pages/home.rs | 22 - crates/gui/src/pages/mod.rs | 9 - crates/gui/src/pages/selected_profile.rs | 260 --- crates/gui/src/pages/settings.rs | 157 -- crates/gui/src/popups/already_launched.rs | 93 - crates/gui/src/popups/create_instance.rs | 91 - crates/gui/src/popups/delete_instance.rs | 73 - crates/gui/src/popups/delete_profile.rs | 62 - crates/gui/src/popups/launching.rs | 31 - crates/gui/src/popups/mod.rs | 25 - crates/{gui-new => gui}/src/utils/icons.rs | 4 +- crates/gui/src/utils/images.rs | 82 - crates/gui/src/utils/launch.rs | 35 - crates/gui/src/utils/mod.rs | 103 +- crates/libdiscord-modloader/Cargo.toml | 39 - crates/libdiscord-modloader/src/discord.rs | 59 - crates/libdiscord-modloader/src/lib.rs | 149 -- crates/libdiscord-modloader/src/unix.rs | 161 -- crates/libdiscord-modloader/src/windows.rs | 260 --- crates/modloader-core/Cargo.toml | 19 + .../src/asar/custom_profile.js | 0 .../src/asar/index.js | 0 .../src/asar/package.json | 0 .../src/asar/require.js | 0 crates/modloader-core/src/cache.rs | 93 + .../src/config.rs | 187 +- crates/modloader-core/src/discord.rs | 57 + crates/modloader-core/src/lib.rs | 6 + .../src/paths.rs | 0 .../src/updater.rs | 51 +- .../src/utils.rs | 0 src/lib.rs | 207 +++ src/main.rs | 191 +-- 78 files changed, 2408 insertions(+), 4987 deletions(-) create mode 100644 assets/icons/chevron-down.svg create mode 100644 assets/icons/chevron-up.svg create mode 100644 assets/icons/circle-help.svg delete mode 100644 assets/icons/circle-question.svg create mode 100644 assets/icons/pen-to-square.svg create mode 100644 assets/icons/refresh-arrows.svg create mode 100644 assets/icons/star-filled.svg create mode 100644 assets/icons/star-hollow.svg create mode 100644 build.rs delete mode 100644 crates/gui-new/Cargo.toml delete mode 100644 crates/gui-new/src/components/home_page.rs delete mode 100644 crates/gui-new/src/components/mod.rs delete mode 100644 crates/gui-new/src/components/profile_page.rs delete mode 100644 crates/gui-new/src/components/sidebar.rs delete mode 100644 crates/gui-new/src/constants.rs delete mode 100644 crates/gui-new/src/lib.rs delete mode 100644 crates/gui-new/src/utils/hoverable.rs delete mode 100644 crates/gui-new/src/utils/mod.rs delete mode 100644 crates/gui/.gitignore rename crates/{gui-new => gui}/src/app.rs (63%) rename crates/{gui-new => gui}/src/assets.rs (85%) rename crates/{gui-new => gui}/src/components/button.rs (100%) delete mode 100644 crates/gui/src/components/custom_button.rs create mode 100644 crates/gui/src/components/home_page.rs delete mode 100644 crates/gui/src/components/main_content.rs rename crates/{gui-new => gui}/src/components/mod_from_template_page.rs (93%) rename crates/{gui-new => gui}/src/components/mod_page.rs (89%) rename crates/{gui-new => gui}/src/components/popup.rs (100%) create mode 100644 crates/gui/src/components/profile_page.rs rename crates/{gui-new => gui}/src/components/settings_page.rs (100%) delete mode 100644 crates/gui/src/pages/create_profile.rs delete mode 100644 crates/gui/src/pages/home.rs delete mode 100644 crates/gui/src/pages/mod.rs delete mode 100644 crates/gui/src/pages/selected_profile.rs delete mode 100644 crates/gui/src/pages/settings.rs delete mode 100644 crates/gui/src/popups/already_launched.rs delete mode 100644 crates/gui/src/popups/create_instance.rs delete mode 100644 crates/gui/src/popups/delete_instance.rs delete mode 100644 crates/gui/src/popups/delete_profile.rs delete mode 100644 crates/gui/src/popups/launching.rs delete mode 100644 crates/gui/src/popups/mod.rs rename crates/{gui-new => gui}/src/utils/icons.rs (96%) delete mode 100644 crates/gui/src/utils/images.rs delete mode 100644 crates/gui/src/utils/launch.rs delete mode 100644 crates/libdiscord-modloader/Cargo.toml delete mode 100644 crates/libdiscord-modloader/src/discord.rs delete mode 100644 crates/libdiscord-modloader/src/lib.rs delete mode 100644 crates/libdiscord-modloader/src/unix.rs delete mode 100644 crates/libdiscord-modloader/src/windows.rs create mode 100644 crates/modloader-core/Cargo.toml rename crates/{libdiscord-modloader => modloader-core}/src/asar/custom_profile.js (100%) rename crates/{libdiscord-modloader => modloader-core}/src/asar/index.js (100%) rename crates/{libdiscord-modloader => modloader-core}/src/asar/package.json (100%) rename crates/{libdiscord-modloader => modloader-core}/src/asar/require.js (100%) create mode 100644 crates/modloader-core/src/cache.rs rename crates/{libdiscord-modloader => modloader-core}/src/config.rs (52%) create mode 100644 crates/modloader-core/src/discord.rs create mode 100644 crates/modloader-core/src/lib.rs rename crates/{libdiscord-modloader => modloader-core}/src/paths.rs (100%) rename crates/{libdiscord-modloader => modloader-core}/src/updater.rs (78%) rename crates/{libdiscord-modloader => modloader-core}/src/utils.rs (100%) create mode 100644 src/lib.rs diff --git a/.cargo/config.toml b/.cargo/config.toml index b6e9273..36a2bb1 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,8 +1,15 @@ + [alias] release = "packager --release -f all -v" +build-win = "build --bin discord-modloader" +build-unix = "build --lib" [target.x86_64-unknown-linux-gnu] -rustflags = ["-Zthreads=0", "-Zshare-generics=y", "-Clink-arg=-fuse-ld=mold"] +rustflags = [ + "-Zthreads=0", + "-Zshare-generics=y", + "-Ctarget-feature=-crt-static", +] [profile.release] codegen-units = 1 diff --git a/Cargo.lock b/Cargo.lock index 6e35c5a..ded1ed2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -183,12 +183,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - [[package]] name = "android-activity" version = "0.6.0" @@ -774,38 +768,6 @@ dependencies = [ "wayland-client", ] -[[package]] -name = "camino" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror 1.0.69", -] - [[package]] name = "cc" version = "1.2.10" @@ -884,33 +846,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half", -] - [[package]] name = "cipher" version = "0.4.4" @@ -1040,37 +975,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen", -] - -[[package]] -name = "const-serialize" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08259976d62c715c4826cb4a3d64a3a9e5c5f68f964ff6087319857f569f93a6" -dependencies = [ - "const-serialize-macro", - "serde", -] - -[[package]] -name = "const-serialize-macro" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04382d0d9df7434af6b1b49ea1a026ef39df1b0738b1cc373368cf175354f6eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - [[package]] name = "const_format" version = "0.2.34" @@ -1097,12 +1001,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" -[[package]] -name = "constcat" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7e35aee659887cbfb97aaf227ac12cad1a9d7c71e55ff3376839ed4e282d08" - [[package]] name = "convert_case" version = "0.6.0" @@ -1112,6 +1010,35 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cookie_store" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9" +dependencies = [ + "cookie", + "document-features", + "idna", + "indexmap 2.7.1", + "log", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + [[package]] name = "copypasta" version = "0.10.1" @@ -1178,9 +1105,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -1291,25 +1218,6 @@ dependencies = [ "syn 2.0.96", ] -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if 1.0.0", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f" - [[package]] name = "deflate64" version = "0.1.9" @@ -1367,51 +1275,16 @@ dependencies = [ "subtle", ] -[[package]] -name = "dioxus" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e7fe217b50d43b27528b0f24c89b411f742a3e7564d1cfbf85253f967954db" -dependencies = [ - "dioxus-core 0.5.6", - "dioxus-core-macro 0.5.6", - "dioxus-hooks 0.5.6", - "dioxus-signals 0.5.7", -] - [[package]] name = "dioxus" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7d69c4bd197db4739654af0a37c426417b45d5f495df8d10fafeb5da846dca" dependencies = [ - "dioxus-cli-config 0.6.2", - "dioxus-config-macro", - "dioxus-core 0.6.2", - "dioxus-core-macro 0.6.2", - "dioxus-devtools", - "dioxus-document", - "dioxus-fullstack", - "dioxus-history", - "dioxus-hooks 0.6.2", - "dioxus-html 0.6.2", - "dioxus-logger", - "dioxus-signals 0.6.2", - "dioxus-web", - "manganis", - "warnings", -] - -[[package]] -name = "dioxus-cli-config" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7dffc452ed91af6ef772b0d9a5899573f6785314e97c533733ec55413c01df3" -dependencies = [ - "once_cell", - "serde", - "serde_json", - "tracing", + "dioxus-core", + "dioxus-core-macro", + "dioxus-hooks", + "dioxus-signals", ] [[package]] @@ -1419,19 +1292,6 @@ name = "dioxus-cli-config" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d20764ae5fbe886e4602fdd6f2420ed03697eccba51605926f54693bd65879f3" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "dioxus-clipboard" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3796f1d3dd56e6fdd6ea96221c0f639b4d688a17966d0d2f4dc883d9713813" -dependencies = [ - "copypasta", - "dioxus-lib 0.5.6", -] [[package]] name = "dioxus-clipboard" @@ -1440,7 +1300,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe492404c00f658d2a5f2cefa60bb9f413c65528182d4027939596fbd49583b4" dependencies = [ "copypasta", - "dioxus-lib 0.6.2", + "dioxus-lib", ] [[package]] @@ -1453,24 +1313,6 @@ dependencies = [ "quote", ] -[[package]] -name = "dioxus-core" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3730d2459ab66951cedf10b09eb84141a6eda7f403c28057cbe010495be156b7" -dependencies = [ - "futures-channel", - "futures-util", - "generational-box 0.5.6", - "longest-increasing-subsequence", - "rustc-hash 1.1.0", - "serde", - "slab", - "slotmap", - "tracing", - "tracing-subscriber", -] - [[package]] name = "dioxus-core" version = "0.6.2" @@ -1481,32 +1323,16 @@ dependencies = [ "dioxus-core-types", "futures-channel", "futures-util", - "generational-box 0.6.2", + "generational-box", "longest-increasing-subsequence", "rustc-hash 1.1.0", "rustversion", - "serde", "slab", "slotmap", "tracing", "warnings", ] -[[package]] -name = "dioxus-core-macro" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d9c0dfe0e6a46626fa716c4aa1d2ccb273441337909cfeacad5bb6fcfb947d2" -dependencies = [ - "constcat", - "convert_case", - "dioxus-rsx 0.5.6", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.96", -] - [[package]] name = "dioxus-core-macro" version = "0.6.2" @@ -1514,7 +1340,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a798c5538481e6bc831514a5dd10ee53e3df12fd13a88d64e787e0268443adcd" dependencies = [ "convert_case", - "dioxus-rsx 0.6.2", + "dioxus-rsx", "proc-macro2", "quote", "syn 2.0.96", @@ -1529,104 +1355,32 @@ dependencies = [ "once_cell", ] -[[package]] -name = "dioxus-debug-cell" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ea539174bb236e0e7dc9c12b19b88eae3cb574dedbd0252a2d43ea7e6de13e2" - -[[package]] -name = "dioxus-devtools" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a7300f1e8181218187b03502044157eef04e0a25b518117c5ef9ae1096880" -dependencies = [ - "dioxus-core 0.6.2", - "dioxus-devtools-types", - "dioxus-signals 0.6.2", - "serde", - "serde_json", - "tracing", - "tungstenite", - "warnings", -] - -[[package]] -name = "dioxus-devtools-types" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f62434973c0c9c5a3bc42e9cd5e7070401c2062a437fb5528f318c3e42ebf4ff" -dependencies = [ - "dioxus-core 0.6.2", - "serde", -] - [[package]] name = "dioxus-document" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f195e3027dea214d34fd87c8189470cf24ef3f9ff10b13675cc9d80e0db07517" dependencies = [ - "dioxus-core 0.6.2", - "dioxus-core-macro 0.6.2", + "dioxus-core", + "dioxus-core-macro", "dioxus-core-types", - "dioxus-html 0.6.2", + "dioxus-html", "futures-channel", "futures-util", - "generational-box 0.6.2", + "generational-box", "lazy-js-bundle", "serde", "serde_json", "tracing", ] -[[package]] -name = "dioxus-fullstack" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2da12d6b6ce390bd3143f46c8441fa1a50f1428113a059b25d8fd22a3899d2" -dependencies = [ - "base64 0.22.1", - "bytes", - "ciborium", - "dioxus-devtools", - "dioxus-history", - "dioxus-lib 0.6.2", - "dioxus-web", - "dioxus_server_macro", - "futures-channel", - "futures-util", - "generational-box 0.6.2", - "once_cell", - "serde", - "server_fn", - "tracing", -] - [[package]] name = "dioxus-history" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ae4e22616c698f35b60727313134955d885de2d32e83689258e586ebc9b7909" dependencies = [ - "dioxus-core 0.6.2", - "tracing", -] - -[[package]] -name = "dioxus-hooks" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa8f9c661eea82295219d25555d5c0b597e74186b029038ceb5e3700ccbd4380" -dependencies = [ - "dioxus-core 0.5.6", - "dioxus-debug-cell", - "dioxus-signals 0.5.7", - "futures-channel", - "futures-util", - "generational-box 0.5.6", - "slab", - "thiserror 1.0.69", + "dioxus-core", "tracing", ] @@ -1636,39 +1390,17 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "948e2b3f20d9d4b2c300aaa60281b1755f3298684448920b27106da5841896d0" dependencies = [ - "dioxus-core 0.6.2", - "dioxus-signals 0.6.2", + "dioxus-core", + "dioxus-signals", "futures-channel", "futures-util", - "generational-box 0.6.2", + "generational-box", "rustversion", "slab", "tracing", "warnings", ] -[[package]] -name = "dioxus-html" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f01a0826f179adad6ea8d6586746e8edde0c602cc86f4eb8e5df7a3b204c4018" -dependencies = [ - "async-trait", - "dioxus-core 0.5.6", - "dioxus-html-internal-macro 0.5.6", - "enumset", - "euclid", - "futures-channel", - "generational-box 0.5.6", - "keyboard-types", - "serde", - "serde-value", - "serde_json", - "serde_repr", - "tracing", - "web-sys", -] - [[package]] name = "dioxus-html" version = "0.6.2" @@ -1676,33 +1408,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "664518f9d9b7d765755e79db271562b36c271e97709ff3bc0c71234700f5e8ae" dependencies = [ "async-trait", - "dioxus-core 0.6.2", - "dioxus-core-macro 0.6.2", + "dioxus-core", + "dioxus-core-macro", "dioxus-core-types", - "dioxus-hooks 0.6.2", - "dioxus-html-internal-macro 0.6.2", + "dioxus-hooks", + "dioxus-html-internal-macro", "enumset", "euclid", "futures-channel", - "generational-box 0.6.2", + "generational-box", "keyboard-types", "lazy-js-bundle", "rustversion", "tracing", ] -[[package]] -name = "dioxus-html-internal-macro" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b96f35a608d0ab8f4ca6f66ce1828354e4ebd41580b12454f490221a11da93c" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "syn 2.0.96", -] - [[package]] name = "dioxus-html-internal-macro" version = "0.6.2" @@ -1715,36 +1435,6 @@ dependencies = [ "syn 2.0.96", ] -[[package]] -name = "dioxus-interpreter-js" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330707b10ca75cb0eb05f9e5f8d80217cd0d7e62116a8277ae363c1a09b57a22" -dependencies = [ - "js-sys", - "lazy-js-bundle", - "rustc-hash 1.1.0", - "sledgehammer_bindgen", - "sledgehammer_utils", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "dioxus-lib" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd39b2c41dd1915dcb91d914ea72d8b646f1f8995aaeff82816b862ec586ecd" -dependencies = [ - "dioxus-core 0.5.6", - "dioxus-core-macro 0.5.6", - "dioxus-hooks 0.5.6", - "dioxus-html 0.5.6", - "dioxus-rsx 0.5.6", - "dioxus-signals 0.5.7", -] - [[package]] name = "dioxus-lib" version = "0.6.2" @@ -1752,72 +1442,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5405b71aa9b8b0c3e0d22728f12f34217ca5277792bd315878cc6ecab7301b72" dependencies = [ "dioxus-config-macro", - "dioxus-core 0.6.2", - "dioxus-core-macro 0.6.2", + "dioxus-core", + "dioxus-core-macro", "dioxus-document", "dioxus-history", - "dioxus-hooks 0.6.2", - "dioxus-html 0.6.2", - "dioxus-rsx 0.6.2", - "dioxus-signals 0.6.2", + "dioxus-hooks", + "dioxus-html", + "dioxus-rsx", + "dioxus-signals", "warnings", ] [[package]] -name = "dioxus-logger" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545961e752f6c8bf59c274951b3c8b18a106db6ad2f9e2035b29e1f2a3e899b1" -dependencies = [ - "console_error_panic_hook", - "dioxus-cli-config 0.6.2", - "tracing", - "tracing-subscriber", - "tracing-wasm", -] - -[[package]] -name = "dioxus-router" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c235c5dbeb528c0c2b0424763da812e7500df69b82eddac54db6f4975e065c5f" -dependencies = [ - "dioxus-cli-config 0.5.6", - "dioxus-lib 0.5.6", - "dioxus-router-macro 0.5.6", - "tracing", - "url", - "urlencoding", -] - -[[package]] -name = "dioxus-router" +name = "dioxus-router" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc284034f3fffb198a189eaaa8be854520770160d79bdc85b8ad64a8e8170433" dependencies = [ - "dioxus-cli-config 0.6.2", + "dioxus-cli-config", "dioxus-history", - "dioxus-lib 0.6.2", - "dioxus-router-macro 0.6.2", + "dioxus-lib", + "dioxus-router-macro", "rustversion", "tracing", "url", "urlencoding", ] -[[package]] -name = "dioxus-router-macro" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7cd1c5137ba361f2150cdea6b3bc9ddda7b1af84b22c9ee6b5499bf43e1381" -dependencies = [ - "proc-macro2", - "quote", - "slab", - "syn 2.0.96", -] - [[package]] name = "dioxus-router-macro" version = "0.6.2" @@ -1830,21 +1481,6 @@ dependencies = [ "syn 2.0.96", ] -[[package]] -name = "dioxus-rsx" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c400bc8a779107d8f3a67b14375db07dbd2bc31163bf085a8e9097f36f7179" -dependencies = [ - "dioxus-core 0.5.6", - "internment", - "krates", - "proc-macro2", - "quote", - "syn 2.0.96", - "tracing", -] - [[package]] name = "dioxus-rsx" version = "0.6.2" @@ -1857,32 +1493,16 @@ dependencies = [ "syn 2.0.96", ] -[[package]] -name = "dioxus-signals" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3e224cd3d3713f159f0199fc088c292a0f4adb94996b48120157f6a8f8342d" -dependencies = [ - "dioxus-core 0.5.6", - "futures-channel", - "futures-util", - "generational-box 0.5.6", - "once_cell", - "parking_lot", - "rustc-hash 1.1.0", - "tracing", -] - [[package]] name = "dioxus-signals" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e8f8811f32274228aff06e01c891d0828f5461d33b4fa9465dc69b995fc12c1" dependencies = [ - "dioxus-core 0.6.2", + "dioxus-core", "futures-channel", "futures-util", - "generational-box 0.6.2", + "generational-box", "once_cell", "parking_lot", "rustc-hash 1.1.0", @@ -1890,50 +1510,6 @@ dependencies = [ "warnings", ] -[[package]] -name = "dioxus-web" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45d8e94a78633382687f2555d7c3e0da934aff3d4937d8c63b351a632befdd0c" -dependencies = [ - "async-trait", - "ciborium", - "dioxus-cli-config 0.6.2", - "dioxus-core 0.6.2", - "dioxus-core-types", - "dioxus-devtools", - "dioxus-document", - "dioxus-history", - "dioxus-html 0.6.2", - "dioxus-interpreter-js", - "dioxus-signals 0.6.2", - "futures-channel", - "futures-util", - "generational-box 0.6.2", - "js-sys", - "lazy-js-bundle", - "rustc-hash 1.1.0", - "serde", - "serde-wasm-bindgen", - "serde_json", - "tracing", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "dioxus_server_macro" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "371a5b21989a06b53c5092e977b3f75d0e60a65a4c15a2aa1d07014c3b2dda97" -dependencies = [ - "proc-macro2", - "quote", - "server_fn_macro", - "syn 2.0.96", -] - [[package]] name = "dirs" version = "2.0.2" @@ -1999,15 +1575,14 @@ dependencies = [ [[package]] name = "discord-modloader" -version = "2.0.0" +version = "0.2.0-beta.1" dependencies = [ "clap", - "dirs 5.0.1", + "electron-hook", + "electron-hook-build-scripts", "gui", - "gui-new", "libc", - "libdiscord-modloader", - "octocrab", + "modloader-core", ] [[package]] @@ -2036,6 +1611,15 @@ dependencies = [ "libloading", ] +[[package]] +name = "document-features" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" +dependencies = [ + "litrs", +] + [[package]] name = "downcast-rs" version = "1.2.1" @@ -2048,12 +1632,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - [[package]] name = "easer" version = "0.3.0" @@ -2069,6 +1647,26 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "electron-hook" +version = "0.2.0-beta.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003a7f4d22a5129b75a7d28cc46f696255cb89c29b8bf8ff99f6cef491f08c8a" +dependencies = [ + "asar", + "detours-sys", + "dirs 5.0.1", + "libc", + "retour", + "uuid", + "widestring", + "winapi 0.3.9", +] + +[[package]] +name = "electron-hook-build-scripts" +version = "0.2.0-beta.2" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -2160,7 +1758,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" dependencies = [ "num-traits", - "serde", ] [[package]] @@ -2236,12 +1833,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - [[package]] name = "flate2" version = "1.0.35" @@ -2312,75 +1903,37 @@ dependencies = [ [[package]] name = "freya" version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" -dependencies = [ - "dioxus 0.6.2", - "dioxus-core 0.6.2", - "dioxus-core-macro 0.6.2", - "dioxus-hooks 0.6.2", - "dioxus-signals 0.6.2", - "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-components 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-hooks 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-renderer 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", +source = "git+https://github.com/marc2332/freya.git?rev=72022bdb3275cdd4b1c007196b8e6de28dbaae31#72022bdb3275cdd4b1c007196b8e6de28dbaae31" +dependencies = [ + "dioxus", + "dioxus-core", + "dioxus-core-macro", + "dioxus-hooks", + "dioxus-signals", + "freya-common", + "freya-components", + "freya-core", + "freya-elements", + "freya-engine", + "freya-hooks", + "freya-node-state", + "freya-renderer", "tokio", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", -] - -[[package]] -name = "freya" -version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" -dependencies = [ - "dioxus 0.5.6", - "dioxus-core 0.5.6", - "dioxus-core-macro 0.5.6", - "dioxus-hooks 0.5.6", - "dioxus-signals 0.5.7", - "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-components 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-hooks 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-renderer 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "tokio", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", -] - -[[package]] -name = "freya-common" -version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" -dependencies = [ - "accesskit", - "dioxus-core 0.6.2", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "itertools 0.13.0", - "rustc-hash 2.1.0", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "uuid", - "winit", + "torin", ] [[package]] name = "freya-common" version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +source = "git+https://github.com/marc2332/freya.git?rev=72022bdb3275cdd4b1c007196b8e6de28dbaae31#72022bdb3275cdd4b1c007196b8e6de28dbaae31" dependencies = [ "accesskit", - "dioxus-core 0.5.6", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "dioxus-core", + "freya-engine", + "freya-native-core", "itertools 0.13.0", "rustc-hash 2.1.0", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "torin", "uuid", "winit", ] @@ -2388,90 +1941,44 @@ dependencies = [ [[package]] name = "freya-components" version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" -dependencies = [ - "bytes", - "dioxus 0.6.2", - "dioxus-router 0.6.2", - "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-hooks 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "futures-util", - "open", - "reqwest", - "tokio", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "tracing", - "winit", -] - -[[package]] -name = "freya-components" -version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +source = "git+https://github.com/marc2332/freya.git?rev=72022bdb3275cdd4b1c007196b8e6de28dbaae31#72022bdb3275cdd4b1c007196b8e6de28dbaae31" dependencies = [ "bytes", - "dioxus 0.5.6", - "dioxus-router 0.5.6", - "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-hooks 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "dioxus", + "dioxus-router", + "freya-common", + "freya-core", + "freya-elements", + "freya-engine", + "freya-hooks", + "freya-node-state", "futures-util", "open", "reqwest", "tokio", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "tracing", - "winit", -] - -[[package]] -name = "freya-core" -version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" -dependencies = [ - "accesskit", - "accesskit_winit", - "dioxus-core 0.6.2", - "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "itertools 0.13.0", - "rustc-hash 2.1.0", - "smallvec", - "tokio", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "torin", "tracing", - "uuid", "winit", ] [[package]] name = "freya-core" version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +source = "git+https://github.com/marc2332/freya.git?rev=72022bdb3275cdd4b1c007196b8e6de28dbaae31#72022bdb3275cdd4b1c007196b8e6de28dbaae31" dependencies = [ "accesskit", "accesskit_winit", - "dioxus-core 0.5.6", - "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "dioxus-core", + "freya-common", + "freya-elements", + "freya-engine", + "freya-native-core", + "freya-node-state", "itertools 0.13.0", "rustc-hash 2.1.0", "smallvec", "tokio", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "torin", "tracing", "uuid", "winit", @@ -2480,42 +1987,20 @@ dependencies = [ [[package]] name = "freya-elements" version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" +source = "git+https://github.com/marc2332/freya.git?rev=72022bdb3275cdd4b1c007196b8e6de28dbaae31#72022bdb3275cdd4b1c007196b8e6de28dbaae31" dependencies = [ - "dioxus-core 0.6.2", - "dioxus-rsx 0.6.2", - "generational-box 0.6.2", + "dioxus-core", + "dioxus-rsx", + "generational-box", "keyboard-types", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "torin", "winit", ] -[[package]] -name = "freya-elements" -version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" -dependencies = [ - "dioxus-core 0.5.6", - "dioxus-rsx 0.5.6", - "keyboard-types", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "winit", -] - -[[package]] -name = "freya-engine" -version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" -dependencies = [ - "bitflags 2.8.0", - "glutin", - "skia-safe", -] - [[package]] name = "freya-engine" version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +source = "git+https://github.com/marc2332/freya.git?rev=72022bdb3275cdd4b1c007196b8e6de28dbaae31#72022bdb3275cdd4b1c007196b8e6de28dbaae31" dependencies = [ "bitflags 2.8.0", "glutin", @@ -2525,50 +2010,24 @@ dependencies = [ [[package]] name = "freya-hooks" version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" -dependencies = [ - "bitflags 2.8.0", - "bytes", - "dioxus-clipboard 0.2.0", - "dioxus-core 0.6.2", - "dioxus-hooks 0.6.2", - "dioxus-signals 0.6.2", - "easer", - "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "paste", - "ropey", - "tokio", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "tracing", - "uuid", - "winit", -] - -[[package]] -name = "freya-hooks" -version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +source = "git+https://github.com/marc2332/freya.git?rev=72022bdb3275cdd4b1c007196b8e6de28dbaae31#72022bdb3275cdd4b1c007196b8e6de28dbaae31" dependencies = [ "bitflags 2.8.0", "bytes", - "dioxus-clipboard 0.1.0", - "dioxus-core 0.5.6", - "dioxus-hooks 0.5.6", - "dioxus-signals 0.5.7", + "dioxus-clipboard", + "dioxus-core", + "dioxus-hooks", + "dioxus-signals", "easer", - "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-common", + "freya-core", + "freya-elements", + "freya-engine", + "freya-node-state", "paste", "ropey", "tokio", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "torin", "tracing", "uuid", "winit", @@ -2577,21 +2036,9 @@ dependencies = [ [[package]] name = "freya-native-core" version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" -dependencies = [ - "dioxus-core 0.6.2", - "parking_lot", - "rustc-hash 2.1.0", - "shipyard", - "smallvec", -] - -[[package]] -name = "freya-native-core" -version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +source = "git+https://github.com/marc2332/freya.git?rev=72022bdb3275cdd4b1c007196b8e6de28dbaae31#72022bdb3275cdd4b1c007196b8e6de28dbaae31" dependencies = [ - "dioxus-core 0.5.6", + "dioxus-core", "parking_lot", "rustc-hash 2.1.0", "shipyard", @@ -2601,16 +2048,7 @@ dependencies = [ [[package]] name = "freya-native-core-macro" version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" -dependencies = [ - "quote", - "syn 2.0.96", -] - -[[package]] -name = "freya-native-core-macro" -version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +source = "git+https://github.com/marc2332/freya.git?rev=72022bdb3275cdd4b1c007196b8e6de28dbaae31#72022bdb3275cdd4b1c007196b8e6de28dbaae31" dependencies = [ "quote", "syn 2.0.96", @@ -2619,93 +2057,40 @@ dependencies = [ [[package]] name = "freya-node-state" version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" +source = "git+https://github.com/marc2332/freya.git?rev=72022bdb3275cdd4b1c007196b8e6de28dbaae31#72022bdb3275cdd4b1c007196b8e6de28dbaae31" dependencies = [ "accesskit", "bytes", - "dioxus-core 0.6.2", - "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-native-core-macro 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "dioxus-core", + "freya-common", + "freya-engine", + "freya-native-core", + "freya-native-core-macro", "nom", "rustc-hash 2.1.0", "serde_json", "shipyard", "tokio", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "tracing", - "uuid", -] - -[[package]] -name = "freya-node-state" -version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" -dependencies = [ - "accesskit", - "bytes", - "dioxus-core 0.5.6", - "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-native-core-macro 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "nom", - "rustc-hash 2.1.0", - "serde_json", - "shipyard", - "tokio", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "tracing", - "uuid", -] - -[[package]] -name = "freya-renderer" -version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" -dependencies = [ - "accesskit", - "accesskit_winit", - "dioxus-core 0.6.2", - "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-hooks 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "futures-task", - "futures-util", - "gl", - "glutin", - "glutin-winit", - "image", - "itertools 0.13.0", - "pin-utils", - "raw-window-handle", - "tokio", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", + "torin", "tracing", "uuid", - "winit", ] [[package]] name = "freya-renderer" version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +source = "git+https://github.com/marc2332/freya.git?rev=72022bdb3275cdd4b1c007196b8e6de28dbaae31#72022bdb3275cdd4b1c007196b8e6de28dbaae31" dependencies = [ "accesskit", "accesskit_winit", - "dioxus-core 0.5.6", - "freya-common 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-elements 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-engine 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-hooks 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "freya-node-state 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "dioxus-core", + "freya-common", + "freya-core", + "freya-elements", + "freya-engine", + "freya-hooks", + "freya-native-core", + "freya-node-state", "futures-task", "futures-util", "gl", @@ -2716,7 +2101,7 @@ dependencies = [ "pin-utils", "raw-window-handle", "tokio", - "torin 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "torin", "tracing", "uuid", "winit", @@ -2824,15 +2209,6 @@ dependencies = [ "slab", ] -[[package]] -name = "generational-box" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "557cf2cbacd0504c6bf8c29f52f8071e0de1d9783346713dc6121d7fa1e5d0e0" -dependencies = [ - "parking_lot", -] - [[package]] name = "generational-box" version = "0.6.2" @@ -2918,40 +2294,6 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" -[[package]] -name = "gloo-net" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" -dependencies = [ - "futures-channel", - "futures-core", - "futures-sink", - "gloo-utils", - "http", - "js-sys", - "pin-project", - "serde", - "serde_json", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "gloo-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" -dependencies = [ - "js-sys", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "glutin" version = "0.32.2" @@ -3020,47 +2362,16 @@ dependencies = [ [[package]] name = "gui" -version = "0.1.0" -dependencies = [ - "dialog", - "dioxus 0.6.2", - "dirs 6.0.0", - "flate2", - "freya 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", - "itertools 0.14.0", - "libc", - "libdiscord-modloader", - "open", - "serde", - "serde_json", - "sysinfo", - "tar", - "toml", - "ureq", - "uuid", -] - -[[package]] -name = "gui-new" -version = "0.1.0" +version = "0.2.0-beta.1" dependencies = [ - "dialog", - "dioxus 0.6.2", "dirs 6.0.0", - "flate2", - "freya 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "itertools 0.14.0", - "libc", - "libdiscord-modloader", + "freya", + "modloader-core", "open", - "serde", - "serde_json", "strum", "sysinfo", - "tar", "tokio", "toml", - "ureq", "uuid", ] @@ -3102,16 +2413,6 @@ dependencies = [ "ahash 0.7.8", ] -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash 0.8.11", - "allocator-api2", -] - [[package]] name = "hashbrown" version = "0.15.2" @@ -3525,16 +2826,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "internment" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e8e537b529b8674e97e9fb82c10ff168a290ac3867a0295f112061ffbca1ef" -dependencies = [ - "hashbrown 0.14.5", - "parking_lot", -] - [[package]] name = "interpolate_name" version = "0.2.4" @@ -3623,15 +2914,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.14" @@ -3727,19 +3009,6 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" -[[package]] -name = "krates" -version = "0.16.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcb3baf2360eb25ad31f0ada3add63927ada6db457791979b82ac199f835cb9" -dependencies = [ - "cargo-platform", - "cargo_metadata", - "cfg-expr", - "petgraph", - "semver", -] - [[package]] name = "lazy-bytes-cast" version = "5.0.1" @@ -3748,50 +3017,27 @@ checksum = "10257499f089cd156ad82d0a9cd57d9501fa2c989068992a97eb3c27836f206b" [[package]] name = "lazy-js-bundle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e49596223b9d9d4947a14a25c142a6e7d8ab3f27eb3ade269d238bb8b5c267e2" - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "lebe" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" - -[[package]] -name = "libc" -version = "0.2.169" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" - -[[package]] -name = "libdiscord-modloader" -version = "0.1.0" -dependencies = [ - "asar", - "detours-sys", - "dirs 5.0.1", - "flate2", - "libc", - "octocrab", - "retour", - "serde", - "serde_json", - "strum", - "sysinfo", - "tar", - "toml", - "ureq", - "widestring", - "winapi 0.3.9", - "zip", -] +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e49596223b9d9d4947a14a25c142a6e7d8ab3f27eb3ade269d238bb8b5c267e2" + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + +[[package]] +name = "libc" +version = "0.2.169" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libfuzzer-sys" @@ -3846,6 +3092,12 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" + [[package]] name = "lock_api" version = "0.4.12" @@ -3911,42 +3163,6 @@ dependencies = [ "libc", ] -[[package]] -name = "manganis" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317af44b15e7605b85f04525449a3bb631753040156c9b318e6cba8a3ea4ef73" -dependencies = [ - "const-serialize", - "manganis-core", - "manganis-macro", -] - -[[package]] -name = "manganis-core" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c38bee65cc725b2bba23b5dbb290f57c8be8fadbe2043fb7e2ce73022ea06519" -dependencies = [ - "const-serialize", - "dioxus-cli-config 0.6.2", - "dioxus-core-types", - "serde", -] - -[[package]] -name = "manganis-macro" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f4f71310913c40174d9f0cfcbcb127dad0329ecdb3945678a120db22d3d065" -dependencies = [ - "dunce", - "manganis-core", - "proc-macro2", - "quote", - "syn 2.0.96", -] - [[package]] name = "maybe-rayon" version = "0.1.1" @@ -4033,11 +3249,30 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "modloader-core" +version = "0.2.0-beta.1" +dependencies = [ + "dialog", + "dirs 6.0.0", + "electron-hook", + "flate2", + "octocrab", + "serde", + "serde_json", + "strum", + "sysinfo", + "tar", + "toml", + "ureq", + "zip", +] + [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" dependencies = [ "libc", "log", @@ -4124,16 +3359,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi 0.3.9", -] - [[package]] name = "num-bigint" version = "0.4.6" @@ -4325,9 +3550,9 @@ dependencies = [ [[package]] name = "objc2-encode" -version = "4.0.3" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" [[package]] name = "objc2-foundation" @@ -4454,9 +3679,9 @@ dependencies = [ [[package]] name = "octocrab" -version = "0.42.1" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b97f949a7cb04608441c2ddb28e15a377e8b5142c2d1835ad2686d434de8558" +checksum = "27527d68322f4c603319f7958973db8f9fa4be62c0e3fafe084f5562cf6353df" dependencies = [ "arc-swap", "async-trait", @@ -4511,9 +3736,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "f5e534d133a060a3c19daec1eb3e98ec6f4685978834f2dbadfe2ec215bab64e" dependencies = [ "bitflags 2.8.0", "cfg-if 1.0.0", @@ -4537,9 +3762,9 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" @@ -4568,15 +3793,6 @@ dependencies = [ "libredox", ] -[[package]] -name = "ordered-float" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" -dependencies = [ - "num-traits", -] - [[package]] name = "ordered-stream" version = "0.2.0" @@ -4587,12 +3803,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "owned_ttf_parser" version = "0.25.0" @@ -4675,16 +3885,6 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap 2.7.1", -] - [[package]] name = "pin-project" version = "1.1.8" @@ -5246,9 +4446,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-webpki" @@ -5361,24 +4561,6 @@ dependencies = [ "libc", ] -[[package]] -name = "semver" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" -dependencies = [ - "serde", -] - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" -dependencies = [ - "futures-core", -] - [[package]] name = "serde" version = "1.0.217" @@ -5388,27 +4570,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-value" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" -dependencies = [ - "ordered-float", - "serde", -] - -[[package]] -name = "serde-wasm-bindgen" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e" -dependencies = [ - "js-sys", - "serde", - "wasm-bindgen", -] - [[package]] name = "serde_derive" version = "1.0.217" @@ -5442,17 +4603,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_qs" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0431a35568651e363364210c91983c1da5eb29404d9f0928b67d4ebcfa7d330c" -dependencies = [ - "percent-encoding", - "serde", - "thiserror 1.0.69", -] - [[package]] name = "serde_repr" version = "0.1.19" @@ -5515,58 +4665,6 @@ dependencies = [ "syn 2.0.96", ] -[[package]] -name = "server_fn" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fae7a3038a32e5a34ba32c6c45eb4852f8affaf8b794ebfcd4b1099e2d62ebe" -dependencies = [ - "bytes", - "const_format", - "dashmap", - "futures", - "gloo-net", - "http", - "js-sys", - "once_cell", - "send_wrapper", - "serde", - "serde_json", - "serde_qs", - "server_fn_macro_default", - "thiserror 1.0.69", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "xxhash-rust", -] - -[[package]] -name = "server_fn_macro" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaaf648c6967aef78177c0610478abb5a3455811f401f3c62d10ae9bd3901a1" -dependencies = [ - "const_format", - "convert_case", - "proc-macro2", - "quote", - "syn 2.0.96", - "xxhash-rust", -] - -[[package]] -name = "server_fn_macro_default" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2aa8119b558a17992e0ac1fd07f080099564f24532858811ce04f742542440" -dependencies = [ - "server_fn_macro", - "syn 2.0.96", -] - [[package]] name = "sha1" version = "0.10.6" @@ -5714,35 +4812,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "sledgehammer_bindgen" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49e83e178d176459c92bc129cfd0958afac3ced925471b889b3a75546cfc4133" -dependencies = [ - "sledgehammer_bindgen_macro", - "wasm-bindgen", -] - -[[package]] -name = "sledgehammer_bindgen_macro" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33a1b4f13e2bbf2f5b29d09dfebc9de69229ffee245aed80e3b70f9b5fd28c06" -dependencies = [ - "quote", - "syn 2.0.96", -] - -[[package]] -name = "sledgehammer_utils" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "debdd4b83524961983cea3c55383b3910fd2f24fd13a188f5b091d2d504a61ae" -dependencies = [ - "rustc-hash 1.1.0", -] - [[package]] name = "slice-pool2" version = "0.4.3" @@ -6250,21 +5319,10 @@ dependencies = [ [[package]] name = "torin" version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724#9f3439c97c6845dfe12417e59f827c31b80e2724" -dependencies = [ - "euclid", - "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git?rev=9f3439c97c6845dfe12417e59f827c31b80e2724)", - "rustc-hash 2.1.0", - "tracing", -] - -[[package]] -name = "torin" -version = "0.3.0-rc.0" -source = "git+https://github.com/marc2332/freya.git#ce87cefe02f224343e574cb2b885e65e73192406" +source = "git+https://github.com/marc2332/freya.git?rev=72022bdb3275cdd4b1c007196b8e6de28dbaae31#72022bdb3275cdd4b1c007196b8e6de28dbaae31" dependencies = [ "euclid", - "freya-native-core 0.3.0-rc.0 (git+https://github.com/marc2332/freya.git)", + "freya-native-core", "rustc-hash 2.1.0", "tracing", ] @@ -6360,40 +5418,15 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - [[package]] name = "tracing-subscriber" version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ - "nu-ansi-term", "sharded-slab", - "smallvec", "thread_local", "tracing-core", - "tracing-log", -] - -[[package]] -name = "tracing-wasm" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" -dependencies = [ - "tracing", - "tracing-subscriber", - "wasm-bindgen", ] [[package]] @@ -6408,24 +5441,6 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" -[[package]] -name = "tungstenite" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "sha1", - "thiserror 1.0.69", - "utf-8", -] - [[package]] name = "typenum" version = "1.17.0" @@ -6445,9 +5460,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" [[package]] name = "unicode-segmentation" @@ -6469,22 +5484,39 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.12.1" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" +checksum = "7b35e5241ee2cad3940e69c78b28b3600bec9c57146bce26b3eb888869b987d4" dependencies = [ "base64 0.22.1", + "cc", + "cookie_store", "flate2", "log", "once_cell", + "percent-encoding", "rustls", + "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", - "url", + "ureq-proto", + "utf-8", "webpki-roots", ] +[[package]] +name = "ureq-proto" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42506c1d9fc65bcf2508cb8f9b5e7d21f88e71567fbb7595ca5e5bd5218ca7db" +dependencies = [ + "base64 0.22.1", + "http", + "httparse", + "log", +] + [[package]] name = "url" version = "2.5.4" @@ -6689,19 +5721,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - [[package]] name = "wax" version = "0.6.0" @@ -7429,12 +6448,6 @@ version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" -[[package]] -name = "xxhash-rust" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" - [[package]] name = "yoke" version = "0.7.5" diff --git a/Cargo.toml b/Cargo.toml index 917bcb4..0869868 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,19 +5,23 @@ members = ["crates/*"] edition = "2021" name = "discord-modloader" description = "An in-memory mod loader for Discord" -version = "2.0.0" +version = "0.2.0-beta.1" license = "LGPL-3.0" authors = ["Megumin "] repository = "https://github.com/MeguminSama/Discord-ModLoader/" +[lib] +crate-type = ["cdylib", "rlib"] + [dependencies] clap = { version = "4.5.20", features = ["derive"] } -libdiscord-modloader = { path = "crates/libdiscord-modloader" } gui = { path = "crates/gui" } -gui-new = { path = "crates/gui-new" } -dirs = "5.0.1" +electron-hook = {version = "0.2.0-beta.4", features = ["self-executable"] } +modloader-core = { path = "./crates/modloader-core" } libc = "0.2.167" -octocrab = "0.42.1" + +[build-dependencies] +electron-hook-build-scripts = { path = "../electron-hook/crates/electron-hook-build-scripts" } [package.metadata.packager] product-name = "Discord Modloader" @@ -31,8 +35,8 @@ resources = [ "LICENSE", { src = "configs/templates", target = "templates" }, { src = "configs/icons", target = "icons" }, - { src = "target/release/libdiscord_modloader.dll", target = "libdiscord_modloader.dll" }, - { src = "target/release/libdiscord_modloader.so", target = "libdiscord_modloader.so" }, + { src = "target/release/electron_hook.dll", target = "electron_hook.dll" }, + { src = "target/release/electron_hook.so", target = "electron_hook.so" }, ] log-level = "trace" icons = [ diff --git a/assets/icons/chevron-down.svg b/assets/icons/chevron-down.svg new file mode 100644 index 0000000..d32fbd6 --- /dev/null +++ b/assets/icons/chevron-down.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/chevron-up.svg b/assets/icons/chevron-up.svg new file mode 100644 index 0000000..b372875 --- /dev/null +++ b/assets/icons/chevron-up.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/circle-help.svg b/assets/icons/circle-help.svg new file mode 100644 index 0000000..404fd48 --- /dev/null +++ b/assets/icons/circle-help.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/circle-question.svg b/assets/icons/circle-question.svg deleted file mode 100644 index a9f3453..0000000 --- a/assets/icons/circle-question.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/icons/floppy-disk.svg b/assets/icons/floppy-disk.svg index 07b331f..bd841f9 100644 --- a/assets/icons/floppy-disk.svg +++ b/assets/icons/floppy-disk.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/assets/icons/folder.svg b/assets/icons/folder.svg index 4253902..6638d58 100644 --- a/assets/icons/folder.svg +++ b/assets/icons/folder.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/assets/icons/gear.svg b/assets/icons/gear.svg index 409d65e..cfae911 100644 --- a/assets/icons/gear.svg +++ b/assets/icons/gear.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/assets/icons/home.svg b/assets/icons/home.svg index 230751a..8bba66c 100644 --- a/assets/icons/home.svg +++ b/assets/icons/home.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/assets/icons/pen-to-square.svg b/assets/icons/pen-to-square.svg new file mode 100644 index 0000000..9ef4237 --- /dev/null +++ b/assets/icons/pen-to-square.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/plus.svg b/assets/icons/plus.svg index 9f774b4..1ca2e58 100644 --- a/assets/icons/plus.svg +++ b/assets/icons/plus.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/assets/icons/refresh-arrows.svg b/assets/icons/refresh-arrows.svg new file mode 100644 index 0000000..57662aa --- /dev/null +++ b/assets/icons/refresh-arrows.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/star-filled.svg b/assets/icons/star-filled.svg new file mode 100644 index 0000000..7a44769 --- /dev/null +++ b/assets/icons/star-filled.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/star-hollow.svg b/assets/icons/star-hollow.svg new file mode 100644 index 0000000..f8619cc --- /dev/null +++ b/assets/icons/star-hollow.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/trash.svg b/assets/icons/trash.svg index 388acff..38d1df4 100644 --- a/assets/icons/trash.svg +++ b/assets/icons/trash.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..ae2ed92 --- /dev/null +++ b/build.rs @@ -0,0 +1,3 @@ +fn main() { + electron_hook_build_scripts::build(); +} diff --git a/crates/gui-new/Cargo.toml b/crates/gui-new/Cargo.toml deleted file mode 100644 index d47391f..0000000 --- a/crates/gui-new/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "gui-new" -version = "0.1.0" -edition = "2024" - -[dependencies] -dialog = "0.3.0" -dioxus = { version = "0.6.2", features = [ - "macro", - "hooks", -], default-features = false } -dirs = "6.0.0" -flate2 = "1.0.35" -freya = { git = "https://github.com/marc2332/freya.git", rev = "9f3439c97c6845dfe12417e59f827c31b80e2724" } -itertools = "0.14.0" -libc = "0.2.167" -libdiscord-modloader = { path = "../libdiscord-modloader", default-features = false } -open = "5.3.1" -serde = "1.0.217" -serde_json = "1.0.135" -strum = "0.26.3" -sysinfo = "0.33.0" -tar = "0.4.43" -tokio = { version = "1.43.0", features = ["rt-multi-thread"] } -toml = "0.8.19" -ureq = { version = "2.12.1", features = ["json"] } -uuid = { version = "1.11.0", features = ["v4"] } diff --git a/crates/gui-new/src/components/home_page.rs b/crates/gui-new/src/components/home_page.rs deleted file mode 100644 index cb7c52d..0000000 --- a/crates/gui-new/src/components/home_page.rs +++ /dev/null @@ -1,10 +0,0 @@ -use freya::prelude::*; - -#[component] -pub fn HomePage() -> Element { - rsx!( - label { - "HomePage Not Implemented" - } - ) -} diff --git a/crates/gui-new/src/components/mod.rs b/crates/gui-new/src/components/mod.rs deleted file mode 100644 index 458485b..0000000 --- a/crates/gui-new/src/components/mod.rs +++ /dev/null @@ -1,10 +0,0 @@ -pub mod home_page; -pub mod mod_from_template_page; -pub mod mod_page; -pub mod profile_page; -pub mod settings_page; - -pub mod sidebar; - -pub mod button; -pub mod popup; diff --git a/crates/gui-new/src/components/profile_page.rs b/crates/gui-new/src/components/profile_page.rs deleted file mode 100644 index e41ddd3..0000000 --- a/crates/gui-new/src/components/profile_page.rs +++ /dev/null @@ -1,424 +0,0 @@ -use discord_modloader::config; -use discord_modloader::utils::{find_running_instances, launch_detached_instance}; -use freya::prelude::*; - -use crate::components::button::Button; -use crate::utils::icons::GetIcon; -use crate::{CONFIG, POPUP_STATE, PopupState, REFRESH_PIDS, THEME}; - -type ProfileContext = Signal<(String, config::ProfileConfig)>; - -fn get_profile_by_id(profile_id: &str) -> (String, config::ProfileConfig) { - CONFIG - .read() - .profiles - .get(profile_id) - .map(|profile| (profile_id.to_string(), profile.clone())) - .unwrap_or_else(|| { - let profile = config::Profile { - name: "New Profile".to_string(), - ..Default::default() - }; - (profile_id.to_string(), config::ProfileConfig { - profile, - ..Default::default() - }) - }) -} - -#[component] -pub fn ProfilePage(profile_id: String) -> Element { - let mut profile: ProfileContext = use_signal(|| get_profile_by_id(&profile_id)); - let mut active_pids = use_signal(Vec::new); - - use_context_provider(|| profile); - - use_effect(use_reactive(&profile_id, move |profile_id| { - let (profile_id, new_profile) = get_profile_by_id(&profile_id); - *active_pids.write() = find_running_instances(&profile_id, &new_profile); - *profile.write() = (profile_id, new_profile); - })); - - use_effect(move || { - REFRESH_PIDS.read(); - // Run pid refresh a second later, since Discord doesn't launch instantly. - spawn(async move { - let (profile_id_, profile_) = profile.read().clone(); - tokio::time::sleep(std::time::Duration::from_secs(1)).await; - // If the page changes, we don't want to update the old pids anymore. - if profile.read().0 == profile_id_ { - *active_pids.write() = find_running_instances(&profile_id_, &profile_); - } - }); - }); - - rsx!(rect { - direction: "vertical", - padding: "8", - spacing: "8", - Header { - on_delete_pressed: move |_| { - *POPUP_STATE.write() = PopupState::ConfirmDeleteProfile(profile_id.clone()); - } - } - - ActiveInstance { - active_pids: active_pids, - } - - ScrollView { - direction: "vertical", - spacing: "8", - - for (instance_id, instance) in profile.read().1.instances.iter() { - InstanceCard { - instance_id: instance_id.clone(), - instance: instance.clone() - } - } - } - }) -} - -#[component] -fn ActiveInstance(active_pids: Signal>) -> Element { - let ctx: ProfileContext = use_context(); - let profile_id = ctx.read().0.to_string(); - - rsx!(rect { - height: "64", - width: "fill", - padding: "8", - corner_radius: "8", - - background: THEME.read().bg_primary, - - direction: "horizontal", - spacing: "8", - main_align: "start", - cross_align: "center", - - label { - if active_pids.len() > 0 { - "There are active instances using this profile." - } else { - "No instances are currently running using this profile." - } - } - - if active_pids.len() > 0 { - rect { - width: "fill", - direction: "horizontal", - spacing: "8", - main_align: "end", - - Button { - height: "48", - stretch: false, - corner_radius: "8", - direction: "horizontal", - main_align: "center", - cross_align: "center", - - target_color: THEME.read().bg_danger, - - onpress: move |_| { - *POPUP_STATE.write() = PopupState::ConfirmKillProfile(profile_id.clone()); - }, - - svg { - width: "24", - height: "24", - svg_data: static_bytes(crate::assets::STOP_ICON), - fill: THEME.read().text_primary, - } - - label { - font_size: "16", - "Kill Active Instance" - } - } - } - } - }) -} - -#[component] -fn InstanceCard(instance_id: String, instance: config::Instance) -> Element { - let ctx: ProfileContext = use_context(); - let profile_id = ctx.read().0.to_string(); - let profile = ctx.read().1.clone(); - let icon = instance.get_icon().map(dynamic_bytes); - let mut edit_mode = use_signal(|| false); - - rsx!(rect { - direction: "vertical", - spacing: "8", - corner_radius: "8", - - background: THEME.read().bg_primary, - padding: "8", - - rect { - height: "64", - width: "fill", - - direction: "horizontal", - spacing: "8", - main_align: "start", - cross_align: "center", - - if let Some(icon) = icon { - image { - width: "48", - height: "48", - image_data: icon, - } - } - - label { - "{instance.name}" - } - - rect { - width: "fill", - direction: "horizontal", - spacing: "8", - main_align: "end", - - Button { - width: "48", - height: "48", - stretch: false, - padding: "{48/4}", - corner_radius: "{48/2}", - main_align: "center", - cross_align: "center", - - target_color: THEME.read().bg_success, - - onpress: { - to_owned![profile_id, instance_id]; - move |_| { - let profile_id = profile_id.clone(); - let instance_id = instance_id.clone(); - let args = profile.discord.args.clone(); - - if !find_running_instances(&profile_id, &profile).is_empty() { - *POPUP_STATE.write() = PopupState::InstanceAlreadyRunning(profile_id, instance_id, args); - } else { - let _ = launch_detached_instance(&profile_id, &instance_id, &args, false); - *REFRESH_PIDS.write() = (); - } - } - }, - - svg { - width: "24", - height: "24", - svg_data: static_bytes(crate::assets::PLAY_ICON), - fill: THEME.read().text_primary, - } - } - - Button { - width: "48", - height: "48", - stretch: false, - padding: "{48/4}", - corner_radius: "{48/2}", - main_align: "center", - cross_align: "center", - - target_color: THEME.read().blurple, - - onpress: move |_| { - let current = *edit_mode.read(); - println!("Edit mode is {current}"); - *edit_mode.write() = !current; - }, - - svg { - width: "24", - height: "24", - svg_data: static_bytes(crate::assets::PEN_ICON), - fill: THEME.read().text_primary, - } - } - - Button { - width: "48", - height: "48", - stretch: false, - padding: "{48/4}", - corner_radius: "{48/2}", - main_align: "center", - cross_align: "center", - - target_color: THEME.read().bg_danger, - - onpress: move |_| {}, - - svg { - width: "24", - height: "24", - svg_data: static_bytes(crate::assets::TRASH_ICON), - fill: THEME.read().text_primary, - } - } - } - } - - if edit_mode() { - InstanceEdit { - instance_id: instance_id.clone(), - instance: instance.clone() - } - } - }) -} - -#[component] -fn InstanceEdit(instance_id: String, instance: config::Instance) -> Element { - let mods = use_signal(|| CONFIG.read().mods.clone()); - - // Dropdown doesn't let you use a custom string - only showing the value (key). - // So we made a struct that implements Display to render the name rather than the key. - #[derive(Clone, PartialEq)] - struct SelectedId(String, String); - - impl std::fmt::Display for SelectedId { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.1) - } - } - - let mut selected_mod = use_signal(|| { - mods.read() - .get(&instance.mod_id) - .map(|m| SelectedId(instance.mod_id, m.name.to_string())) - .unwrap_or(SelectedId( - "Unknown Mod".to_string(), - "Unknown Mod".to_string(), - )) - }); - - rsx!(rect { - direction: "vertical", - spacing: "8", - label { - font_size: "16", - - "Test" - } - - Dropdown { - value: selected_mod(), - for (key, value) in mods() {{ - let id = SelectedId(key.clone(), value.name.clone()); - rsx!(DropdownItem { - value: id.clone(), - onpress: { - move |_| { - *selected_mod.write() = id.clone(); - } - }, - - label { - "{value.name}" - } - }) - }} - } - }) -} - -#[component] -fn Header(on_delete_pressed: EventHandler<()>) -> Element { - let ctx = use_context::(); - let (profile_id, profile) = ctx.read().clone(); - - rsx!(rect { - width: "100%", - padding: "12 8 12 12", - corner_radius: "8", - border: "0 0 2 0 outer {THEME.read().bg_secondary}", - - background: THEME.read().bg_primary, - - direction: "horizontal", - cross_align: "center", - - spacing: "12", - - label { - font_size: "18", - - "{profile.profile.name}" - } - - rect { - width: "fill", - direction: "horizontal", - main_align: "end", - spacing: "8", - - Button { - width: "48", - height: "48", - stretch: false, - padding: "{48/4}", - corner_radius: "{48/2}", - main_align: "center", - cross_align: "center", - - onpress: move |_| { - let profile_path = discord_modloader::paths::config_profile_dir().join(format!("{}.toml", &profile_id)); - if profile_path.exists() { - if let Err(e) = open::that(profile_path) { - eprintln!("Failed to open directory: {}", e); - } - } else if let Some(parent) = profile_path.parent() { - if !parent.exists() { - if let Err(e) = std::fs::create_dir_all(parent) { - eprintln!("Failed to create directory: {}", e); - } - } - if let Err(e) = open::that(parent) { - eprintln!("Failed to open directory: {}", e); - } - } - }, - - svg { - width: "24", - height: "24", - svg_data: static_bytes(crate::assets::FOLDER_ICON), - fill: THEME.read().text_primary, - } - } - - Button { - width: "48", - height: "48", - stretch: false, - padding: "{48/4}", - corner_radius: "{48/2}", - main_align: "center", - cross_align: "center", - - target_color: THEME.read().bg_danger, - - onpress: move |_| on_delete_pressed.call(()), - - svg { - width: "24", - height: "24", - svg_data: static_bytes(crate::assets::TRASH_ICON), - fill: THEME.read().text_primary, - } - } - } - }) -} diff --git a/crates/gui-new/src/components/sidebar.rs b/crates/gui-new/src/components/sidebar.rs deleted file mode 100644 index 2e5530f..0000000 --- a/crates/gui-new/src/components/sidebar.rs +++ /dev/null @@ -1,465 +0,0 @@ -use freya::prelude::*; - -use crate::components::button::Button; -use crate::{AppPage, CONFIG, CURRENT_PAGE, THEME, utils::hoverable::hoverable}; - -const SIDEBAR_WIDTH: &str = "256"; - -#[component] -pub fn Sidebar() -> Element { - let mut display_mode = use_signal(|| SidebarDisplayMode::Profiles); - - rsx!(rect { - width: SIDEBAR_WIDTH, - height: "100%", - direction: "vertical", - margin: "8 0 8 8", - color: THEME.read().text_primary, - - spacing: "8", - - rect { - width: "100%", - height: "{48+12+12}", - padding: "12", - direction: "horizontal", - spacing: "8", - corner_radius: "8", - background: THEME.read().bg_primary, - - - cross_align: "center", - main_align: "space-between", - - Button { - width: "48", - height: "48", - stretch: false, - padding: "{48/4}", - corner_radius: "{48/2}", - cross_align: "center", - main_align: "center", - - onpress: move |_| { - *CURRENT_PAGE.write() = AppPage::Home; - }, - - svg { - width: "24", - height: "24", - svg_data: static_bytes(crate::assets::HOME_ICON), - fill: THEME.read().text_primary, - } - } - - Button { - width: "48", - height: "48", - stretch: false, - padding: "{48/4}", - corner_radius: "{48/2}", - cross_align: "center", - main_align: "center", - - onpress: move |_| { - *CURRENT_PAGE.write() = AppPage::Settings; - }, - - svg { - width: "24", - height: "24", - svg_data: static_bytes(crate::assets::GEAR_ICON), - fill: THEME.read().text_primary, - } - } - - Button { - width: "48", - height: "48", - stretch: false, - padding: "{48/4}", - corner_radius: "{48/2}", - cross_align: "center", - main_align: "center", - - onpress: move |_| { - let _ = open::that(crate::assets::DISCORD_INVITE_LINK); - }, - - svg { - width: "24", - height: "24", - svg_data: static_bytes(crate::assets::DISCORD_ICON), - fill: THEME.read().text_primary, - } - } - - Button { - width: "48", - height: "48", - stretch: false, - padding: "{48/4}", - corner_radius: "{48/2}", - cross_align: "center", - main_align: "center", - - onpress: move |_| { - let _ = open::that(crate::assets::GITHUB_REPO_LINK); - }, - - svg { - width: "24", - height: "24", - svg_data: static_bytes(crate::assets::GITHUB_ICON), - fill: THEME.read().text_primary, - } - } - } - - rect { - background: THEME.read().bg_primary, - padding: "8", - corner_radius: "8", - ScrollView { - spacing: "8", - - TabBar { - selected: display_mode(), - onclick: move |mode| { - *display_mode.write() = mode; - }, - } - - match display_mode() { - SidebarDisplayMode::Profiles => { - rsx!( - {CONFIG.read().profiles.clone().into_iter().map(|(profile_id, profile)| { - rsx!(Button { - width: "100%", - selected: *CURRENT_PAGE.read() == AppPage::Profile(profile_id.clone()), - - onpress: move |_| { - *CURRENT_PAGE.write() = AppPage::Profile(profile_id.clone()); - }, - - label { - font_size: "16", - "{profile.profile.name}" - } - }) - })} - - Button { - width: "100%", - onpress: |_| { - // *CURRENT_PAGE .write() = AppPage::ProfileFromTemplate; - }, - - svg { - width: "24", - height: "24", - svg_data: static_bytes(crate::assets::PLUS_ICON), - fill: "#ffffff", - } - - label { - font_size: "16", - "Add New Profile" - } - } - ) - } - SidebarDisplayMode::Mods => { - rsx!( - {CONFIG.read().mods.clone().into_iter().map(|(mod_id, mod_)| { - rsx!(Button { - width: "100%", - selected: *CURRENT_PAGE.read() == AppPage::Mod(mod_id.clone()), - - onpress: move |_| { - *CURRENT_PAGE.write() = AppPage::Mod(mod_id.clone()); - }, - - label { - font_size: "16", - "{mod_.name}" - } - - }) - })} - - Button { - width: "100%", - onpress: |_| { - *CURRENT_PAGE .write() = AppPage::ModFromTemplate; - }, - - svg { - width: "24", - height: "24", - svg_data: static_bytes(crate::assets::PLUS_ICON), - fill: "#ffffff", - } - - label { - font_size: "16", - "Add New Mod" - } - } - ) - } - } - } - } - }) -} - -#[derive(Clone, Copy, PartialEq, Eq)] -enum SidebarDisplayMode { - Profiles, - Mods, -} - -#[component] -fn TabBar(selected: SidebarDisplayMode, onclick: EventHandler) -> Element { - let anim_underscore_offset = - use_animation(move |_conf| AnimNum::new(0.0, 50.0).ease(Ease::InOut).time(100)); - - let anim_underscore_width = - use_animation(move |_conf| AnimNum::new(50.0, 100.0).ease(Ease::InOut).time(100)); - - rsx!(rect { - direction: "vertical", - padding: "0 0 1 0", - - // The two tab buttons - rect { - direction: "horizontal", - - Button { - width: "50%", - padding: "8", - main_align: "center", - cross_align: "center", - base_color: THEME.read().bg_primary, - target_color: THEME.read().bg_primary, - shadow: "0", - - onmouseenter: move |_e| { - if selected == SidebarDisplayMode::Mods { - anim_underscore_width.run(AnimDirection::Forward); - anim_underscore_offset.run(AnimDirection::Reverse); - } - }, - onmouseleave: move |_e| { - if selected == SidebarDisplayMode::Mods { - anim_underscore_width.run(AnimDirection::Reverse); - anim_underscore_offset.run(AnimDirection::Forward); - } - }, - onpress: move |_e| { - if anim_underscore_width.get().read().read() == 100.0 { - anim_underscore_width.run(AnimDirection::Reverse); - } else if selected == SidebarDisplayMode::Mods { - anim_underscore_width.run(AnimDirection::Reverse); - anim_underscore_offset.run(AnimDirection::Reverse); - } - onclick(SidebarDisplayMode::Profiles); - }, - label { - font_size: "18", - - "Profiles" - } - } - Button { - width: "50%", - padding: "8", - main_align: "center", - cross_align: "center", - base_color: THEME.read().bg_primary, - target_color: THEME.read().bg_primary, - shadow: "0", - - onmouseenter: move |_e| { - if selected == SidebarDisplayMode::Profiles { - anim_underscore_width.run(AnimDirection::Forward); - } - }, - onmouseleave: move |_e| { - if selected == SidebarDisplayMode::Profiles { - anim_underscore_width.run(AnimDirection::Reverse); - } - }, - onpress: move |_| { - if selected == SidebarDisplayMode::Profiles || anim_underscore_width.get().read().read() != 50.0 { - anim_underscore_offset.run(AnimDirection::Forward); - anim_underscore_width.run(AnimDirection::Reverse); - } - onclick(SidebarDisplayMode::Mods); - }, - label { - font_size: "18", - - "Mods" - } - } - } - - rect { - direction: "horizontal", - // This moves the underline left/right - rect { - width: "{anim_underscore_offset.get().read().read()}%", - height: "2", - } - - // The underline - rect { - width: "{anim_underscore_width.get().read().read()}%", - height: "2", - background: THEME.read().blurple, - } - } - }) -} - -#[component] -fn HomeIconButton() -> Element { - let home_icon = static_bytes(crate::assets::HOME_ICON); - - let animation = hoverable!(move |_conf| { - AnimColor::new(THEME.read().bg_tertiary, THEME.read().blurple) - .ease(Ease::InOut) - .time(100) - }); - - let bg_color = animation.animation.get().read().read(); - - rsx!(rect { - width: "48", - height: "48", - corner_radius: "{48/2}", - - background: bg_color, - onmouseenter: animation.onmouseenter, - onmouseleave: animation.onmouseleave, - - main_align: "center", - cross_align: "center", - - svg { - width: "24", - height: "24", - svg_data: home_icon, - fill: "#ffffff", - } - }) -} - -#[component] -fn SettingsButton() -> Element { - let gear_icon = static_bytes(crate::assets::GEAR_ICON); - - let animation = hoverable!(move |_conf| { - AnimColor::new(THEME.read().bg_tertiary, THEME.read().blurple) - .ease(Ease::InOut) - .time(100) - }); - - let bg_color = animation.animation.get().read().read(); - - rsx!(rect { - width: "48", - height: "48", - corner_radius: "{48/2}", - - background: bg_color, - onmouseenter: animation.onmouseenter, - onmouseleave: animation.onmouseleave, - - main_align: "center", - cross_align: "center", - - svg { - width: "24", - height: "24", - svg_data: gear_icon, - fill: "#ffffff", - } - }) -} - -#[component] -fn GithubButton() -> Element { - let github_icon = static_bytes(crate::assets::GITHUB_ICON); - - let animation = hoverable!(move |_conf| { - AnimColor::new(THEME.read().bg_tertiary, THEME.read().blurple) - .ease(Ease::InOut) - .time(100) - }); - - let bg_color = animation.animation.get().read().read(); - - rsx!(rect { - width: "48", - height: "48", - corner_radius: "{48/2}", - - background: bg_color, - onmouseenter: animation.onmouseenter, - onmouseleave: animation.onmouseleave, - - main_align: "center", - cross_align: "center", - - onclick: move |_| { - let _ = open::that(crate::assets::GITHUB_REPO_LINK); - }, - - svg { - width: "24", - height: "24", - svg_data: github_icon, - fill: "#ffffff", - } - }) -} - -#[component] -fn DiscordButton() -> Element { - let discord_icon = static_bytes(crate::assets::DISCORD_ICON); - - let animation = hoverable!(move |_conf| { - AnimColor::new(THEME.read().bg_tertiary, THEME.read().blurple) - .ease(Ease::InOut) - .time(100) - }); - - let bg_color = animation.animation.get().read().read(); - - rsx!(rect { - width: "48", - height: "48", - corner_radius: "{48/2}", - - background: bg_color, - onmouseenter: animation.onmouseenter, - onmouseleave: animation.onmouseleave, - - main_align: "center", - cross_align: "center", - - onclick: move |_| { - let _ = open::that(crate::assets::DISCORD_INVITE_LINK); - }, - - svg { - width: "26", - height: "26", - svg_data: discord_icon, - fill: "#ffffff", - } - }) -} diff --git a/crates/gui-new/src/constants.rs b/crates/gui-new/src/constants.rs deleted file mode 100644 index 4322b26..0000000 --- a/crates/gui-new/src/constants.rs +++ /dev/null @@ -1,43 +0,0 @@ -// TODO: Implement theme switching. -// #[derive(Clone)] -// pub enum Theme { -// Dark, -// // Light, -// } - -// impl Theme { -// pub fn get(&self) -> &'static ThemeDef { -// match self { -// Theme::Dark => &DARK_THEME, -// // Theme::Light => &LIGHT_THEME, -// } -// } -// } - -pub const DARK_THEME: ThemeDef = ThemeDef { - bg_primary: "rgb(46, 46, 52)", - bg_secondary: "rgb(52, 52, 58)", - bg_tertiary: "rgb(56, 56, 62)", - - text_primary: "white", - text_secondary: "rgb(219, 219, 219)", - - bg_success: "rgb(68, 162, 91)", - bg_danger: "rgb(210, 45, 57)", - - blurple: "rgb(88, 101, 242)", -}; - -pub struct ThemeDef { - pub bg_primary: &'static str, - pub bg_secondary: &'static str, - pub bg_tertiary: &'static str, - - pub text_primary: &'static str, - pub text_secondary: &'static str, - - pub bg_success: &'static str, - pub bg_danger: &'static str, - - pub blurple: &'static str, -} diff --git a/crates/gui-new/src/lib.rs b/crates/gui-new/src/lib.rs deleted file mode 100644 index 3ad7f28..0000000 --- a/crates/gui-new/src/lib.rs +++ /dev/null @@ -1,55 +0,0 @@ -pub(crate) mod app; -pub(crate) mod assets; -pub(crate) mod components; -pub(crate) mod constants; -pub(crate) mod utils; - -use constants::ThemeDef; - -use freya::prelude::*; - -pub static CURRENT_PAGE: GlobalSignal = Signal::global(|| AppPage::Home); -pub static THEME: GlobalSignal = Signal::global(|| constants::DARK_THEME); -pub static CONFIG: GlobalSignal = - Signal::global(discord_modloader::config::Config::init); -pub static POPUP_STATE: GlobalSignal = Signal::global(|| PopupState::None); -pub static REFRESH_PIDS: GlobalSignal<()> = Signal::global(|| ()); - -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum AppPage { - Home, - Mod(String), - ModFromTemplate, - Profile(String), - Settings, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum PopupState { - None, - ConfirmDeleteMod(String), - ConfirmDeleteProfile(String), - ConfirmKillProfile(String), - InstanceAlreadyRunning(String, String, String), -} - -pub enum AppTheme { - Dark, - Light, -} - -pub fn start_gui() { - let cfg: LaunchConfig<()> = LaunchConfig::new() - .with_title("Discord Mod Launcher") - .with_size(1080., 720.) - .with_font("Inter", assets::FONT_INTER) - .with_default_font("Inter") - .with_decorations(true) - .with_transparency(true); - - launch_cfg(app, cfg); -} - -fn app() -> Element { - app::app() -} diff --git a/crates/gui-new/src/utils/hoverable.rs b/crates/gui-new/src/utils/hoverable.rs deleted file mode 100644 index ae7bfb3..0000000 --- a/crates/gui-new/src/utils/hoverable.rs +++ /dev/null @@ -1,54 +0,0 @@ -use freya::prelude::*; - -pub struct Hoverable { - #[allow( - unused, - reason = "Consumers don't always need to know the hover state." - )] - pub hovered: Signal, - pub animation: UseAnimation, - pub onmouseenter: Box)>, - pub onmouseleave: Box)>, -} - -/// A macro to create a hoverable animation. -/// -/// # Example -/// -/// ```rust -/// let bg_anim = hoverable!(|_conf| { -/// AnimColor::new("rgb(52, 52, 58)", "rgb(88, 101, 242)") -/// .ease(Ease::InOut) -/// .time(100) -/// }); -macro_rules! hoverable { - ($anim:expr) => {{ - use freya::prelude::*; - - let mut hovered = use_signal(|| false); - let animation = use_animation($anim); - - let onmouseenter = move |_: Event| { - if !hovered() { - animation.run(AnimDirection::Forward); - hovered.set(true); - } - }; - - let onmouseleave = move |_: Event| { - if hovered() { - hovered.set(false); - animation.run(AnimDirection::Reverse); - } - }; - - $crate::utils::hoverable::Hoverable { - hovered, - animation, - onmouseenter: Box::new(onmouseenter), - onmouseleave: Box::new(onmouseleave), - } - }}; -} - -pub(crate) use hoverable; diff --git a/crates/gui-new/src/utils/mod.rs b/crates/gui-new/src/utils/mod.rs deleted file mode 100644 index b6bb843..0000000 --- a/crates/gui-new/src/utils/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod hoverable; -pub mod icons; diff --git a/crates/gui/.gitignore b/crates/gui/.gitignore deleted file mode 100644 index ea8c4bf..0000000 --- a/crates/gui/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/crates/gui/Cargo.toml b/crates/gui/Cargo.toml index ef02e65..93a43f7 100644 --- a/crates/gui/Cargo.toml +++ b/crates/gui/Cargo.toml @@ -1,22 +1,18 @@ [package] name = "gui" -version = "0.1.0" +version = "0.2.0-beta.1" edition = "2021" +[lib] +crate-type = ["rlib"] + [dependencies] -dialog = "0.3.0" -dioxus = "0.6.1" dirs = "6.0.0" -flate2 = "1.0.35" -freya = { git = "https://github.com/marc2332/freya.git", version = "0.3.0-rc.0" } -itertools = "0.14.0" -libc = "0.2.167" -libdiscord-modloader = { path = "../libdiscord-modloader", default-features = false } +freya = { git = "https://github.com/marc2332/freya.git", rev = "72022bdb3275cdd4b1c007196b8e6de28dbaae31" } +modloader-core = { path = "../modloader-core" } open = "5.3.1" -serde = "1.0.217" -serde_json = "1.0.135" +strum = "0.26.3" sysinfo = "0.33.0" -tar = "0.4.43" +tokio = { version = "1.43.0", features = ["rt-multi-thread"] } toml = "0.8.19" -ureq = { version = "2.12.1", features = ["json"] } uuid = { version = "1.11.0", features = ["v4"] } diff --git a/crates/gui-new/src/app.rs b/crates/gui/src/app.rs similarity index 63% rename from crates/gui-new/src/app.rs rename to crates/gui/src/app.rs index fd77ef7..b79290b 100644 --- a/crates/gui-new/src/app.rs +++ b/crates/gui/src/app.rs @@ -1,8 +1,8 @@ -use discord_modloader::utils::{find_running_instances, kill_pids, launch_detached_instance}; -use discord_modloader::{config, paths}; use freya::prelude::*; +use modloader_core::utils::{find_running_instances, kill_pids, launch_detached_instance}; +use modloader_core::{config, paths}; -use crate::{AppPage, CONFIG, CURRENT_PAGE, POPUP_STATE, REFRESH_PIDS, THEME}; +use crate::{AppPage, CONFIG, CURRENT_PAGE, POPUP_STATE, THEME}; use crate::{PopupState, components}; #[component] @@ -13,19 +13,18 @@ pub fn app() -> Element { rect { height: "100%", width: "100%", - background: "{THEME.read().bg_secondary}", - color: "{THEME.read().text_primary}", + background: THEME.read().bg_secondary, + color: THEME.read().text_primary, direction: "horizontal", - if let PopupState::ConfirmDeleteMod(mod_id) = POPUP_STATE() { - DeleteModPopup { mod_id } - } else if let PopupState::ConfirmDeleteProfile(profile_id) = POPUP_STATE() { - DeleteProfilePopup { profile_id } - } else if let PopupState::InstanceAlreadyRunning(profile_id, new_instance_id, args) = POPUP_STATE() { - InstanceAlreadyRunning { profile_id, new_instance_id, args } - } else if let PopupState::ConfirmKillProfile(profile_id) = POPUP_STATE() { - KillInstancesPopup { profile_id } - }, + match POPUP_STATE() { + PopupState::ConfirmDeleteMod(mod_id) => rsx!(DeleteModPopup { mod_id }), + PopupState::ConfirmDeleteProfile(profile_id) => rsx!(DeleteProfilePopup { profile_id }), + PopupState::InstanceAlreadyRunning(profile_id, new_instance_id, args) => rsx!(InstanceAlreadyRunning { profile_id, new_instance_id, args }), + PopupState::ConfirmDeleteInstance(profile_id, instance_id) => rsx!(DeleteInstancePopup { profile_id, instance_id }), + PopupState::ConfirmKillProfile(profile_id) => rsx!(KillInstancesPopup { profile_id }), + _ => rsx!(), + } Sidebar {}, @@ -53,13 +52,18 @@ pub fn Router() -> Element { #[component] fn DeleteModPopup(mod_id: String) -> Element { - let dependents = CONFIG + let dependents: Vec = CONFIG .read() .profiles - .iter() - .filter(|(_k, v)| v.instances.iter().any(|(_k, v)| v.mod_id == mod_id)) - .map(|(_k, v)| v.profile.name.clone()) - .collect::>(); + .values() + .filter(|profile| { + profile + .instances + .values() + .any(|instance| instance.mod_id == mod_id) + }) + .map(|profile| profile.profile.name.clone()) + .collect(); let dependent_str = if dependents.is_empty() { "No profiles depend on this mod.".to_string() @@ -113,8 +117,6 @@ fn DeleteProfilePopup(profile_id: String) -> Element { *CONFIG.write() = config::Config::init(); - *REFRESH_PIDS.write() = (); - *CURRENT_PAGE.write() = AppPage::Home; }, on_cancel: move |_| { @@ -123,6 +125,43 @@ fn DeleteProfilePopup(profile_id: String) -> Element { }) } +#[component] +fn DeleteInstancePopup(profile_id: String, instance_id: String) -> Element { + rsx!(components::popup::ConfirmationPopup { + title: "Delete Instance", + body: format!( + "Are you sure you want to delete this instance?\nAny active instances of the current profile will be stopped." + ), + on_confirm: move |_| { + *POPUP_STATE.write() = PopupState::None; + + let pids = find_running_instances( + &profile_id, + &CONFIG.read().profiles.get(&profile_id).unwrap().clone(), + ); + + kill_pids(pids); + + // Delete instance + + if let Some(profile) = CONFIG.write().profiles.get_mut(&profile_id) { + profile.instances.remove(&instance_id); + let Ok(profile_toml) = toml::to_string::(profile) else { + return; + }; + + let profile_path = paths::config_profile_dir().join(format!("{profile_id}.toml")); + let _ = std::fs::write(profile_path, profile_toml); + } + + *CONFIG.write() = config::Config::init(); + }, + on_cancel: move |_| { + *POPUP_STATE.write() = PopupState::None; + } + }) +} + #[component] fn KillInstancesPopup(profile_id: String) -> Element { rsx!(components::popup::ConfirmationPopup { @@ -137,8 +176,6 @@ fn KillInstancesPopup(profile_id: String) -> Element { ); kill_pids(pids); - - *REFRESH_PIDS.write() = (); }, on_cancel: move |_| { *POPUP_STATE.write() = PopupState::None; @@ -162,8 +199,6 @@ fn InstanceAlreadyRunning(profile_id: String, new_instance_id: String, args: Str kill_pids(pids); launch_detached_instance(&profile_id, &new_instance_id, &args, false).unwrap(); - - *REFRESH_PIDS.write() = (); }, on_cancel: move |_| { *POPUP_STATE.write() = PopupState::None; diff --git a/crates/gui-new/src/assets.rs b/crates/gui/src/assets.rs similarity index 85% rename from crates/gui-new/src/assets.rs rename to crates/gui/src/assets.rs index 1b34520..d942a1b 100644 --- a/crates/gui-new/src/assets.rs +++ b/crates/gui/src/assets.rs @@ -1,15 +1,21 @@ -use discord_modloader::config; +use modloader_core::config; -pub const CIRCLE_QUESTION_ICON: &[u8] = include_bytes!("../../../assets/icons/circle-question.svg"); +pub const CHEVRON_DOWN_ICON: &[u8] = include_bytes!("../../../assets/icons/chevron-down.svg"); +pub const CHEVRON_UP_ICON: &[u8] = include_bytes!("../../../assets/icons/chevron-up.svg"); +pub const CIRCLE_HELP_ICON: &[u8] = include_bytes!("../../../assets/icons/circle-help.svg"); pub const DISCORD_ICON: &[u8] = include_bytes!("../../../assets/icons/discord.svg"); pub const FLOPPY_DISK_ICON: &[u8] = include_bytes!("../../../assets/icons/floppy-disk.svg"); pub const FOLDER_ICON: &[u8] = include_bytes!("../../../assets/icons/folder.svg"); pub const GEAR_ICON: &[u8] = include_bytes!("../../../assets/icons/gear.svg"); pub const GITHUB_ICON: &[u8] = include_bytes!("../../../assets/icons/github.svg"); pub const HOME_ICON: &[u8] = include_bytes!("../../../assets/icons/home.svg"); +pub const PENCIL_ICON: &[u8] = include_bytes!("../../../assets/icons/pen.svg"); +pub const PEN_TO_SQUARE_ICON: &[u8] = include_bytes!("../../../assets/icons/pen-to-square.svg"); pub const PLAY_ICON: &[u8] = include_bytes!("../../../assets/icons/play.svg"); pub const PLUS_ICON: &[u8] = include_bytes!("../../../assets/icons/plus.svg"); -pub const PEN_ICON: &[u8] = include_bytes!("../../../assets/icons/pen.svg"); +pub const REFRESH_ARROWS_ICON: &[u8] = include_bytes!("../../../assets/icons/refresh-arrows.svg"); +pub const STAR_FILLED_ICON: &[u8] = include_bytes!("../../../assets/icons/star-filled.svg"); +pub const STAR_HOLLOW_ICON: &[u8] = include_bytes!("../../../assets/icons/star-hollow.svg"); pub const STOP_ICON: &[u8] = include_bytes!("../../../assets/icons/stop.svg"); pub const TRASH_ICON: &[u8] = include_bytes!("../../../assets/icons/trash.svg"); diff --git a/crates/gui-new/src/components/button.rs b/crates/gui/src/components/button.rs similarity index 100% rename from crates/gui-new/src/components/button.rs rename to crates/gui/src/components/button.rs diff --git a/crates/gui/src/components/custom_button.rs b/crates/gui/src/components/custom_button.rs deleted file mode 100644 index 53c2bd0..0000000 --- a/crates/gui/src/components/custom_button.rs +++ /dev/null @@ -1,58 +0,0 @@ -use freya::prelude::*; - -use crate::utils::hoverable::hoverable; - -#[component] -pub fn CustomButton( - bg_anim: (String, String), - onclick: EventHandler, - children: Element, - height: Option, - padding: Option, -) -> Element { - let mut bg_anim = hoverable!(move |_conf| { - AnimColor::new(&bg_anim.0, &bg_anim.1) - .ease(Ease::InOut) - .time(100) - }); - - let bg_color = bg_anim.animation.get(); - - let onmouseenter = move |ctx| { - (bg_anim.onmouseenter)(ctx); - }; - - let onmouseleave = move |ctx| { - (bg_anim.onmouseleave)(ctx); - }; - - let height = height.unwrap_or("64".to_string()); - let padding = padding.unwrap_or("0 0 0 8".to_string()); - - let background = bg_color.read().read(); - - rsx!(rect { - padding: "{padding}", - - onclick: move |data| { - #[allow(clippy::redundant_closure)] - onclick(data) - }, - rect { - height: "{height}", - min_width: "64", - - main_align: "center", - cross_align: "center", - - padding: "0 14", - corner_radius: "8", - - background: "{background}", - onmouseenter: onmouseenter, - onmouseleave: onmouseleave, - - {children} - } - }) -} diff --git a/crates/gui/src/components/home_page.rs b/crates/gui/src/components/home_page.rs new file mode 100644 index 0000000..52b372b --- /dev/null +++ b/crates/gui/src/components/home_page.rs @@ -0,0 +1,140 @@ +use freya::prelude::*; +use modloader_core::config; + +use crate::{CONFIG, THEME, utils::icons::GetIcon}; + +fn get_starred_profiles() -> Vec<(String, config::Profile, Vec<(String, config::Instance)>)> { + CONFIG + .read() + .profiles + .clone() + .into_iter() + .filter_map(|(profile_id, profile)| { + let instances = profile + .instances + .into_iter() + .filter(|(_, instance)| instance.starred) + .collect::>(); + + if instances.is_empty() { + None + } else { + Some((profile_id, profile.profile, instances)) + } + }) + .collect::>() +} + +#[component] +pub fn HomePage() -> Element { + let starred = use_signal(get_starred_profiles); + + dbg!(&starred); + + rsx!( + rect { + direction: "vertical", + padding: "8", + spacing: "8", + + Header { }, + + ScrollView { + direction: "vertical", + spacing: "8", + + for (profile_id, profile, instances) in starred() { + ProfileBlock { profile_id, profile, instances } + } + } + } + ) +} + +#[component] +fn Header() -> Element { + rsx!(rect { + width: "100%", + padding: "12 8 12 12", + height: "{48 + 12 + 12}", + corner_radius: "8", + border: "0 0 2 0 outer {THEME.read().bg_secondary}", + + background: THEME.read().bg_primary, + + direction: "horizontal", + cross_align: "center", + + spacing: "12", + + label { + font_size: "18", + + "Home" + } + }) +} + +#[component] +fn ProfileBlock( + profile_id: String, + profile: config::Profile, + instances: Vec<(String, config::Instance)>, +) -> Element { + rsx!( + rect { + padding: "8", + background: THEME.read().bg_primary, + corner_radius: "8", + + label { + "{profile.name}" + } + + ScrollView { + direction: "horizontal", + spacing: "8", + padding: "8", + width: "auto", + height: "auto", + + for (instance_id, instance) in instances { + InstanceBlock { instance_id, instance } + } + } + } + ) +} + +#[component] +fn InstanceBlock(instance_id: String, instance: config::Instance) -> Element { + let icon = instance.get_icon().map(dynamic_bytes); + + rsx!( + rect { + padding: "8", + corner_radius: "8", + width: "128", + background: THEME.read().bg_secondary, + direction: "vertical", + cross_align: "center", + main_align: "center", + overflow: "clip", + + + if icon.is_some() { + image { + width: "48", + height: "48", + image_data: icon, + } + } + + label { + max_lines: "1", + text_overflow: "ellipsis", + "{instance.name}" + } + } + ) +} diff --git a/crates/gui/src/components/main_content.rs b/crates/gui/src/components/main_content.rs deleted file mode 100644 index aeccd8e..0000000 --- a/crates/gui/src/components/main_content.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::pages::{CreateNewProfile, Home, SelectedProfile, Settings}; - -use freya::prelude::*; - -#[derive(Clone, PartialEq)] -pub enum CurrentPage { - Home, - SelectedProfile(String), - CreateNewProfile(Option), - Settings, -} - -#[component] -pub fn MainContent(page: CurrentPage) -> Element { - match page { - CurrentPage::Home => rsx!(Home {}), - CurrentPage::SelectedProfile(id) => rsx!(SelectedProfile { id }), - CurrentPage::CreateNewProfile(profile_id) => rsx!(CreateNewProfile { profile_id }), - CurrentPage::Settings => rsx!(Settings {}), - } -} diff --git a/crates/gui/src/components/mod.rs b/crates/gui/src/components/mod.rs index 683b480..458485b 100644 --- a/crates/gui/src/components/mod.rs +++ b/crates/gui/src/components/mod.rs @@ -1,3 +1,10 @@ -pub mod custom_button; -pub mod main_content; +pub mod home_page; +pub mod mod_from_template_page; +pub mod mod_page; +pub mod profile_page; +pub mod settings_page; + pub mod sidebar; + +pub mod button; +pub mod popup; diff --git a/crates/gui-new/src/components/mod_from_template_page.rs b/crates/gui/src/components/mod_from_template_page.rs similarity index 93% rename from crates/gui-new/src/components/mod_from_template_page.rs rename to crates/gui/src/components/mod_from_template_page.rs index 71f10a8..f6f9c94 100644 --- a/crates/gui-new/src/components/mod_from_template_page.rs +++ b/crates/gui/src/components/mod_from_template_page.rs @@ -1,5 +1,5 @@ -use discord_modloader::{config, paths, updater}; use freya::prelude::*; +use modloader_core::{config, paths, updater}; use crate::components::button::Button; use crate::{AppPage, CONFIG, CURRENT_PAGE, THEME, assets}; @@ -16,6 +16,9 @@ pub fn ModFromTemplatePage() -> Element { ScrollView { direction: "vertical", + scrollbar_theme: theme_with!(ScrollBarTheme { + background: THEME.read().bg_tertiary.into(), + }), for template in templates { rect { @@ -36,7 +39,7 @@ pub fn ModFromTemplatePage() -> Element { #[component] fn SupportButton(link: String) -> Element { - let support_icon = static_bytes(assets::CIRCLE_QUESTION_ICON); + let support_icon = static_bytes(assets::CIRCLE_HELP_ICON); rsx!( Button { diff --git a/crates/gui-new/src/components/mod_page.rs b/crates/gui/src/components/mod_page.rs similarity index 89% rename from crates/gui-new/src/components/mod_page.rs rename to crates/gui/src/components/mod_page.rs index 9df2883..ed0f74a 100644 --- a/crates/gui-new/src/components/mod_page.rs +++ b/crates/gui/src/components/mod_page.rs @@ -3,8 +3,8 @@ use strum::IntoEnumIterator as _; use crate::components::button::Button; use crate::utils::icons::GetIcon; -use crate::{CONFIG, POPUP_STATE, PopupState, THEME, utils::hoverable::hoverable}; -use discord_modloader::{config, paths}; +use crate::{CONFIG, POPUP_STATE, PopupState, THEME}; +use modloader_core::{config, paths}; type ModContext = Signal<(String, config::Mod)>; @@ -98,14 +98,49 @@ fn Header(on_delete_pressed: EventHandler<()>) -> Element { cross_align: "center", onpress: move |_| { - let mod_path = discord_modloader::paths::config_mods_dir(); - let _ = open::that(mod_path); + *CONFIG.write() = config::Config::init(); }, svg { width: "24", height: "24", - svg_data: static_bytes(crate::assets::FOLDER_ICON), + svg_data: static_bytes(crate::assets::REFRESH_ARROWS_ICON), + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + onpress: move |_| { + let mod_path = paths::config_mods_dir().join(format!("{}.toml", &ctx.read().0)); + + if mod_path.exists() { + if let Err(e) = open::that(mod_path) { + eprintln!("Failed to open directory: {}", e); + } + } else if let Some(parent) = mod_path.parent() { + if !parent.exists() { + if let Err(e) = std::fs::create_dir_all(parent) { + eprintln!("Failed to create directory: {}", e); + } + } + if let Err(e) = open::that(parent) { + eprintln!("Failed to open directory: {}", e); + } + } + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::PEN_TO_SQUARE_ICON), fill: THEME.read().text_primary, } } @@ -347,22 +382,29 @@ fn Form() -> Element { }) } - Button { - stretch: false, - padding: "8 16", - margin: "8 0 0 0", - corner_radius: "8", - main_align: "center", - height: "42", - onpress: move |_| { - let _ = open::that(discord_modloader::paths::config_icons_dir()); - }, + rect { + width: "fill", + direction: "horizontal", + main_align: "end", + + Button { + stretch: false, + padding: "8 16", + margin: "8 0 0 0", + corner_radius: "8", + main_align: "center", + height: "42", + + onpress: move |_| { + let _ = open::that(paths::config_icons_dir()); + }, - label { - font_size: "16", + label { + font_size: "16", - "Open Icons Folder" + "Open Icons Folder" + } } } } @@ -519,7 +561,7 @@ fn Form() -> Element { dropdown_background: THEME.read().bg_tertiary.into(), }), - for i in discord_modloader::config::DistFileType::iter() { + for i in config::DistFileType::iter() { DropdownItem { value: i.to_string(), @@ -622,54 +664,3 @@ fn Form() -> Element { } }) } - -#[component] -fn SaveButton(pending: bool, onclick: EventHandler>) -> Element { - let floppy_disk_icon = static_bytes(crate::assets::FLOPPY_DISK_ICON); - - let animation = hoverable!(move |_conf| { - AnimColor::new(THEME.read().bg_primary, THEME.read().blurple) - .ease(Ease::InOut) - .time(100) - }); - - let bg_color = if pending { - THEME.read().bg_success - } else { - &animation.animation.get().read().read() - }; - - rsx!(rect { - height: "48", - corner_radius: "8", - padding: "8", - spacing: "8", - - direction: "horizontal", - cross_align: "center", - - background: bg_color, - onmouseenter: animation.onmouseenter, - onmouseleave: animation.onmouseleave, - - onclick: move |e| onclick.call(e), - - main_align: "center", - cross_align: "center", - - svg { - width: "20", - height: "20", - svg_data: floppy_disk_icon, - fill: "#ffffff", - } - - label { - if pending { - "Click to save changes" - } else { - "No changes to save" - } - } - }) -} diff --git a/crates/gui-new/src/components/popup.rs b/crates/gui/src/components/popup.rs similarity index 100% rename from crates/gui-new/src/components/popup.rs rename to crates/gui/src/components/popup.rs diff --git a/crates/gui/src/components/profile_page.rs b/crates/gui/src/components/profile_page.rs new file mode 100644 index 0000000..cae1f99 --- /dev/null +++ b/crates/gui/src/components/profile_page.rs @@ -0,0 +1,735 @@ +use freya::prelude::*; +use modloader_core::utils::{find_running_instances, launch_detached_instance}; +use modloader_core::{config, paths}; + +use crate::components::button::Button; +use crate::utils::icons::GetIcon; +use crate::{CONFIG, POPUP_STATE, PopupState, REFRESH_PIDS, THEME}; + +type ProfileContext = Memo<(String, config::ProfileConfig)>; + +fn get_profile_by_id(profile_id: &str) -> (String, config::ProfileConfig) { + CONFIG + .read() + .profiles + .get(profile_id) + .map(|profile| (profile_id.to_string(), profile.clone())) + .unwrap_or_else(|| { + let profile = config::Profile { + name: "New Profile".to_string(), + ..Default::default() + }; + (profile_id.to_string(), config::ProfileConfig { + profile, + ..Default::default() + }) + }) +} + +#[component] +pub fn ProfilePage(profile_id: String) -> Element { + let profile_id = use_memo(use_reactive!(|(profile_id,)| profile_id)); + let profile: ProfileContext = use_memo(move || get_profile_by_id(&profile_id())); + use_context_provider(|| profile); + + let mut active_pids = use_signal(Vec::new); + + // When the PIDs refresh, update the active PIDs list in the current component. + use_effect(move || { + REFRESH_PIDS.read(); + let (profile_id_, profile_) = profile(); + spawn(async move { + if profile().0 == profile_id_ { + *active_pids.write() = find_running_instances(&profile_id_, &profile_); + } + }); + }); + + rsx!(rect { + direction: "vertical", + padding: "8", + spacing: "8", + Header { + on_delete_pressed: move |_| { + *POPUP_STATE.write() = PopupState::ConfirmDeleteProfile(profile_id()); + } + } + + if active_pids.len() > 0 { + ActiveInstance { + active_pids: active_pids, + } + } + + ScrollView { + direction: "vertical", + spacing: "8", + scrollbar_theme: theme_with!(ScrollBarTheme { + background: THEME.read().bg_tertiary.into(), + }), + + for (instance_id, instance) in profile().1.instances.iter() { + InstanceCard { + instance_id: instance_id.clone(), + instance: instance.clone() + } + } + + rect { + width: "fill", + direction: "horizontal", + main_align: "end", + + Button { + stretch: false, + + onpress: move |_| { + if let Some(profile) = CONFIG.write().profiles.get_mut(&profile_id()) { + profile.instances.insert(uuid::Uuid::new_v4().to_string(), config::Instance { + mod_id: "Unknown Mod".to_string(), + name: "New Instance".to_string(), + icon: None, + starred: false, + }); + } + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::PLUS_ICON), + fill: THEME.read().text_primary, + } + + label { + font_size: "16", + "Add New Instance" + } + } + } + } + }) +} + +#[component] +fn ActiveInstance(active_pids: Signal>) -> Element { + let ctx: ProfileContext = use_context(); + let profile_id = ctx().0.to_string(); + + rsx!(rect { + height: "64", + width: "fill", + padding: "8", + corner_radius: "8", + + background: THEME.read().bg_primary, + + direction: "horizontal", + spacing: "8", + main_align: "start", + cross_align: "center", + + label { + "There are active instances using this profile." + } + + rect { + width: "fill", + direction: "horizontal", + spacing: "8", + main_align: "end", + + Button { + height: "48", + stretch: false, + corner_radius: "8", + direction: "horizontal", + main_align: "center", + cross_align: "center", + + target_color: THEME.read().bg_danger, + + onpress: move |_| { + *POPUP_STATE.write() = PopupState::ConfirmKillProfile(profile_id.clone()); + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::STOP_ICON), + fill: THEME.read().text_primary, + } + + label { + font_size: "16", + "Kill Active Instance" + } + } + } + }) +} + +#[component] +fn InstanceCard(instance_id: String, instance: config::Instance) -> Element { + let instance_id = use_memo(use_reactive(&instance_id, |i| i)); + let instance = use_memo(use_reactive(&instance, |i| i)); + + let ctx: ProfileContext = use_context(); + let profile_id = use_memo(move || ctx().0); + let profile = use_memo(move || ctx().1); + let icon = use_memo(move || instance().get_icon().map(dynamic_bytes)); + + let mut edit_mode = use_signal(|| false); + let mut starred = use_signal(|| instance().starred); + + use_effect(move || { + instance_id.read(); + edit_mode.set(false); + }); + + // use_effect(use_reactive(&instance_id, move |instance_id| { + // let profile = ctx.read().1.clone(); + // let instance = profile.instances.get(&instance_id).cloned(); + // *edit_mode.write() = false; + // if let Some(instance) = instance { + // *starred.write() = instance.starred; + // } + // })); + + rsx!(rect { + direction: "vertical", + spacing: "8", + corner_radius: "8", + + background: THEME.read().bg_primary, + padding: "8", + + rect { + height: "64", + width: "fill", + + direction: "horizontal", + spacing: "8", + main_align: "start", + cross_align: "center", + + if let Some(icon) = icon() { + image { + width: "48", + height: "48", + image_data: icon, + } + } + + label { + "{instance().name}" + } + + rect { + width: "fill", + direction: "horizontal", + spacing: "8", + main_align: "end", + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + target_color: THEME.read().bg_success, + + onpress: { + move |_| { + let args = profile().discord.args; + + if !find_running_instances(&profile_id(), &profile()).is_empty() { + *POPUP_STATE.write() = PopupState::InstanceAlreadyRunning(profile_id(), instance_id(), args); + } else { + let _ = launch_detached_instance(&profile_id(), &instance_id(), &args, false); + } + } + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::PLAY_ICON), + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + target_color: THEME.read().blurple, + + onpress: move |_| { + let current = *edit_mode.read(); + *edit_mode.write() = !current; + }, + + svg { + width: "24", + height: "24", + svg_data: if *edit_mode.read() { + static_bytes(crate::assets::CHEVRON_UP_ICON) + } else { + static_bytes(crate::assets::PENCIL_ICON) + }, + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + target_color: THEME.read().bg_danger, + + // TODO: Really need to standardise writing/updating/loading configs. This is messy. + onpress: move |_| { + starred.set(!starred()); + + let Some(mut profile) = CONFIG.read().profiles.get(&profile_id()).cloned() else { + return; + }; + + if let Some(instance) = profile.instances.get_mut(&instance_id()) { instance.starred = starred(); } + + let config_toml = toml::to_string::(&profile); + + if let Ok(config_toml) = config_toml { + let instance_path = paths::config_profile_dir().join(format!("{}.toml", &profile_id)); + let _ = std::fs::write(instance_path, config_toml); + } + + *CONFIG.write() = config::Config::init(); + }, + + svg { + width: "28", + height: "28", + svg_data: if starred() { + static_bytes(crate::assets::STAR_FILLED_ICON) + } else { + static_bytes(crate::assets::STAR_HOLLOW_ICON) + }, + fill: if starred() { + THEME.read().star_yellow + } else { + THEME.read().text_primary + }, + } + } + } + } + + if edit_mode() { + InstanceEdit { + instance_id: instance_id(), + instance: instance() + } + } + }) +} + +// Dropdown doesn't let you use a custom string - only showing the value (key). +// So we made a struct that implements Display to render the name rather than the key. +#[derive(Clone, PartialEq)] +struct SelectedId(String, String); + +impl std::fmt::Display for SelectedId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.1) + } +} + +#[component] +fn InstanceEdit(instance_id: String, instance: config::Instance) -> Element { + let profile: ProfileContext = use_context(); + let profile_id = use_signal(|| profile().0); + + // make instance_id and instance reactive + let instance_id = use_memo(use_reactive(&instance_id, |instance_id| instance_id)); + let instance = use_memo(use_reactive(&instance, |instance| instance)); + + let mods = use_signal(|| CONFIG.read().mods.clone()); + + let mut name = use_signal(|| instance().name); + let mut icon = use_signal(|| instance().icon); + let mut selected_mod = use_signal(|| { + mods.read() + .get(&instance().mod_id) + .map(|m| SelectedId(instance().mod_id, m.name.to_string())) + .unwrap_or(SelectedId( + "Unknown Mod".to_string(), + "Unknown Mod".to_string(), + )) + }); + + let update = { + to_owned![instance_id]; + move || { + let mut profile = profile.read().1.clone(); + let mod_id = selected_mod.read().0.clone(); + let icon = icon().clone(); + let name = name().clone(); + + profile + .instances + .entry(instance_id()) + .and_modify(|instance| { + instance.name = name.clone(); + instance.mod_id = mod_id.clone(); + instance.icon = icon.clone(); + }) + .or_insert(config::Instance { + name, + mod_id, + icon, + starred: false, + }); + + profile.save(&profile_id()); + + CONFIG.write().sync(); + } + }; + + rsx!(rect { + width: "fill", + direction: "vertical", + spacing: "8", + + label { + font_size: "16", + "Name of this instance" + } + + Input { + value: name(), + onchange: move |e| { name.set(e) }, + placeholder: "New Instance", + theme: theme_with!(InputTheme { + width: "100%".into(), + corner_radius: "8".into(), + border_fill: THEME.read().bg_secondary.into(), + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background: THEME.read().bg_tertiary.into(), + hover_background: THEME.read().bg_tertiary.into(), + }) + } + + label { + font_size: "16", + "Mod to use for this instance" + } + + Dropdown { + value: selected_mod(), + + theme: theme_with!(DropdownTheme { + border_fill: THEME.read().bg_secondary.into(), + focus_border_fill: THEME.read().blurple.into(), + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background_button: THEME.read().bg_tertiary.into(), + hover_background: THEME.read().bg_tertiary.into(), + dropdown_background: THEME.read().bg_tertiary.into(), + }), + + for (key, value) in mods() {{ + let id = SelectedId(key.clone(), value.name.clone()); + + rsx!(DropdownItem { + value: id.clone(), + + theme: theme_with!(DropdownItemTheme { + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background: THEME.read().bg_tertiary.into(), + select_background: THEME.read().bg_primary.into(), + hover_background: THEME.read().bg_primary.into(), + }), + + onpress: move |_| { selected_mod.set(id.clone()) }, + + label { + "{value.name}" + } + }) + }} + } + + // Icon Name + rect { + width: "100%", + label { + margin: "4", + "Icon Filename (leave empty to use the mod's icon)" + } + + label { + margin: "4", + color: THEME.read().text_secondary, + "Place your icon in the root of the icons folder and enter it's name here." + } + + Input { + value: icon().unwrap_or_default(), + onchange: move |e: String| { + icon.set(if e.is_empty() { None } else { Some(e) }); + }, + placeholder: "moonlight.png", + theme: theme_with!(InputTheme { + width: "100%".into(), + corner_radius: "8".into(), + border_fill: THEME.read().bg_secondary.into(), + font_theme: theme_with!(FontTheme { + color: THEME.read().text_primary.into(), + }), + background: THEME.read().bg_tertiary.into(), + hover_background: THEME.read().bg_tertiary.into(), + }) + } + + Button { + stretch: false, + padding: "8 16", + margin: "8 0 0 0", + corner_radius: "8", + main_align: "center", + height: "42", + + onpress: move |_| { + let _ = open::that(paths::config_icons_dir()); + }, + + label { + font_size: "16", + + "Open Icons Folder" + } + } + } + + rect { + width: "fill", + direction: "horizontal", + main_align: "end", + spacing: "8", + + Button { + stretch: false, + height: "48", + corner_radius: "8", + target_color: THEME.read().bg_success, + + selected_color: THEME.read().bg_success, + selected: { + let icon_match = icon().as_deref() != instance().icon.as_deref(); + let mod_match = selected_mod().0.ne(&instance().mod_id); + icon_match || mod_match + }, + + onpress: move |_| { update(); }, + + svg { + width: "20", + height: "20", + svg_data: static_bytes(crate::assets::FLOPPY_DISK_ICON), + fill: THEME.read().text_primary, + } + + label { + font_size: "16", + "Save Changes" + } + } + + Button { + stretch: false, + height: "48", + corner_radius: "8", + target_color: THEME.read().bg_danger, + + onpress: { + move |_| { + *POPUP_STATE.write() = PopupState::ConfirmDeleteInstance(profile_id(), instance_id()); + } + }, + + svg { + width: "20", + height: "20", + svg_data: static_bytes(crate::assets::TRASH_ICON), + fill: THEME.read().text_primary, + } + + label { + font_size: "16", + "Delete Instance" + } + } + } + }) +} + +#[component] +fn Header(on_delete_pressed: EventHandler<()>) -> Element { + let ctx = use_context::(); + let (profile_id, profile) = ctx.read().clone(); + + let mut edit_mode = use_signal(|| false); + use_effect(use_reactive(&profile_id, move |_profile_id| { + *edit_mode.write() = false; + })); + + rsx!(rect { + width: "100%", + padding: "12 8 12 12", + corner_radius: "8", + border: "0 0 2 0 outer {THEME.read().bg_secondary}", + + background: THEME.read().bg_primary, + + direction: "horizontal", + cross_align: "center", + + spacing: "12", + + label { + font_size: "18", + + "{profile.profile.name}" + } + + rect { + width: "fill", + direction: "horizontal", + main_align: "end", + spacing: "8", + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + onpress: move |_| { + *CONFIG.write() = config::Config::init(); + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::REFRESH_ARROWS_ICON), + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + onpress: move |_| { + *edit_mode.write() = !edit_mode(); + }, + + svg { + width: "24", + height: "24", + svg_data: if edit_mode() { + static_bytes(crate::assets::CHEVRON_UP_ICON) + } else { + static_bytes(crate::assets::PENCIL_ICON) + }, + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + onpress: move |_| { + let profile_path = paths::config_profile_dir().join(format!("{}.toml", &profile_id)); + if profile_path.exists() { + if let Err(e) = open::that(profile_path) { + eprintln!("Failed to open directory: {}", e); + } + } else if let Some(parent) = profile_path.parent() { + if !parent.exists() { + if let Err(e) = std::fs::create_dir_all(parent) { + eprintln!("Failed to create directory: {}", e); + } + } + if let Err(e) = open::that(parent) { + eprintln!("Failed to open directory: {}", e); + } + } + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::PEN_TO_SQUARE_ICON), + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + main_align: "center", + cross_align: "center", + + target_color: THEME.read().bg_danger, + + onpress: move |_| on_delete_pressed.call(()), + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::TRASH_ICON), + fill: THEME.read().text_primary, + } + } + } + }) +} diff --git a/crates/gui-new/src/components/settings_page.rs b/crates/gui/src/components/settings_page.rs similarity index 100% rename from crates/gui-new/src/components/settings_page.rs rename to crates/gui/src/components/settings_page.rs diff --git a/crates/gui/src/components/sidebar.rs b/crates/gui/src/components/sidebar.rs index 5f06fb0..6c1573e 100644 --- a/crates/gui/src/components/sidebar.rs +++ b/crates/gui/src/components/sidebar.rs @@ -1,166 +1,486 @@ -use crate::{constants, utils::hoverable::hoverable}; -use discord_modloader::config; - use freya::prelude::*; -use itertools::Itertools as _; +use modloader_core::{config, paths}; -use super::main_content::CurrentPage; +use crate::components::button::Button; +use crate::{AppPage, CONFIG, CURRENT_PAGE, THEME, utils::hoverable::hoverable}; -pub const SIDEBAR_WIDTH: f32 = 256.; +const SIDEBAR_WIDTH: &str = "256"; #[component] -pub fn ProfileList(onpagechange: EventHandler) -> Element { - let ctx = use_context::>(); - - let profiles = use_memo(move || { - let profiles = ctx().config.profiles.clone(); - profiles - .into_iter() - .sorted_by_key(|(id, _)| id.clone()) - .collect::>() - }); +pub fn Sidebar() -> Element { + let mut display_mode = use_signal(|| SidebarDisplayMode::Profiles); - let create_profile = hoverable!(move |_conf| { - AnimColor::new(constants::BG_SECONDARY, constants::BLURPLE) - .ease(Ease::InOut) - .time(100) - }); + rsx!(rect { + width: SIDEBAR_WIDTH, + height: "100%", + direction: "vertical", + margin: "8 0 8 8", + color: THEME.read().text_primary, - let create_profile_anim = create_profile.animation.get(); + spacing: "8", - let bg_create_profile = if let CurrentPage::CreateNewProfile(_) = ctx().current_page { - constants::BLURPLE - } else { - &create_profile_anim.read().read() - }; + rect { + width: "100%", + height: "{48+12+12}", + padding: "12", + direction: "horizontal", + spacing: "8", + corner_radius: "8", + background: THEME.read().bg_primary, - let settings = hoverable!(move |_conf| { - AnimColor::new(constants::BG_SECONDARY, constants::BLURPLE) - .ease(Ease::InOut) - .time(100) - }); - let settings_anim = settings.animation.get(); + cross_align: "center", + main_align: "space-between", - let bg_settings = if ctx().current_page == CurrentPage::Settings { - constants::BLURPLE - } else { - &settings_anim.read().read() - }; + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + cross_align: "center", + main_align: "center", - rsx!(rect { - width: "{SIDEBAR_WIDTH}", - height: "100%", - direction: "vertical", - background: constants::BG_PRIMARY, - padding: "8", - color: "white", - corner_radius: "4", - - label { - font_size: "18", - font_weight: "bold", - "Profiles" - } + onpress: move |_| { + *CURRENT_PAGE.write() = AppPage::Home; + }, - ScrollView { - spacing: "4", - - { - profiles().into_iter().map(|(id, profile)| { - rsx!(ProfileListEntry { - profile: profile.clone(), - selected: ctx().current_page == CurrentPage::SelectedProfile(id.clone()), - onclick: move |_| { - onpagechange.call(CurrentPage::SelectedProfile(id.clone())); - } - }) - }) + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::HOME_ICON), + fill: THEME.read().text_primary, + } } - rect { - width: "100%", - padding: "8", - color: "white", - corner_radius: "4", + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + cross_align: "center", + main_align: "center", - background: bg_create_profile, - onmouseenter: create_profile.onmouseenter, - onmouseleave: create_profile.onmouseleave, + onpress: move |_| { + *CURRENT_PAGE.write() = AppPage::Settings; + }, - onclick: move |_| { - onpagechange.call(CurrentPage::CreateNewProfile(None)); + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::GEAR_ICON), + fill: THEME.read().text_primary, + } + } + + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + cross_align: "center", + main_align: "center", + + onpress: move |_| { + let _ = open::that(crate::assets::DISCORD_INVITE_LINK); }, - label { - font_size: "18", - font_weight: "bold", - "Create New Profile" + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::DISCORD_ICON), + fill: THEME.read().text_primary, } } - rect { - width: "100%", - padding: "8", - color: "white", - corner_radius: "4", + Button { + width: "48", + height: "48", + stretch: false, + padding: "{48/4}", + corner_radius: "{48/2}", + cross_align: "center", + main_align: "center", + + onpress: move |_| { + let _ = open::that(crate::assets::GITHUB_REPO_LINK); + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::GITHUB_ICON), + fill: THEME.read().text_primary, + } + } + } - background: bg_settings, - onmouseenter: settings.onmouseenter, - onmouseleave: settings.onmouseleave, + rect { + background: THEME.read().bg_primary, + padding: "8", + corner_radius: "8", + ScrollView { + spacing: "8", + scrollbar_theme: theme_with!(ScrollBarTheme { + background: THEME.read().bg_tertiary.into(), + }), - onclick: move |_| { - onpagechange.call(CurrentPage::Settings); + TabBar { + selected: display_mode(), + onclick: move |mode| { + *display_mode.write() = mode; + }, + } + + match display_mode() { + SidebarDisplayMode::Profiles => { + rsx!( + {CONFIG.read().profiles.clone().into_iter().map(|(profile_id, profile)| { + rsx!(Button { + width: "100%", + selected: *CURRENT_PAGE.read() == AppPage::Profile(profile_id.clone()), + + onpress: move |_| { + *CURRENT_PAGE.write() = AppPage::Profile(profile_id.clone()); + }, + + label { + font_size: "16", + "{profile.profile.name}" + } + }) + })} + + Button { + width: "100%", + onpress: |_| { + let uuid = uuid::Uuid::new_v4().to_string(); + let new_profile = config::ProfileConfig { + profile: config::Profile { + name: "New Profile".to_string(), + use_default_profile: false, + }, + discord: Default::default(), + instances: Default::default(), + }; + + let toml_path = paths::config_profile_dir().join(format!("{uuid}.toml")); + if let Ok(toml) = toml::to_string(&new_profile) { + let _ = std::fs::write(&toml_path, toml); + } + + *CONFIG.write() = config::Config::init(); + + *CURRENT_PAGE.write() = AppPage::Profile(uuid); + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::PLUS_ICON), + fill: "#ffffff", + } + + label { + font_size: "16", + "Add New Profile" + } + } + ) + } + SidebarDisplayMode::Mods => { + rsx!( + {CONFIG.read().mods.clone().into_iter().map(|(mod_id, mod_)| { + rsx!(Button { + width: "100%", + selected: *CURRENT_PAGE.read() == AppPage::Mod(mod_id.clone()), + + onpress: move |_| { + *CURRENT_PAGE.write() = AppPage::Mod(mod_id.clone()); + }, + + label { + font_size: "16", + "{mod_.name}" + } + + }) + })} + + Button { + width: "100%", + onpress: |_| { + *CURRENT_PAGE .write() = AppPage::ModFromTemplate; + }, + + svg { + width: "24", + height: "24", + svg_data: static_bytes(crate::assets::PLUS_ICON), + fill: "#ffffff", + } + + label { + font_size: "16", + "Add New Mod" + } + } + ) + } + } + } + } + }) +} + +#[derive(Clone, Copy, PartialEq, Eq)] +enum SidebarDisplayMode { + Profiles, + Mods, +} + +#[component] +fn TabBar(selected: SidebarDisplayMode, onclick: EventHandler) -> Element { + let anim_underscore_offset = + use_animation(move |_conf| AnimNum::new(0.0, 50.0).ease(Ease::InOut).time(100)); + + let anim_underscore_width = + use_animation(move |_conf| AnimNum::new(50.0, 100.0).ease(Ease::InOut).time(100)); + + rsx!(rect { + direction: "vertical", + padding: "0 0 1 0", + + // The two tab buttons + rect { + direction: "horizontal", + + Button { + width: "50%", + padding: "8", + main_align: "center", + cross_align: "center", + base_color: THEME.read().bg_primary, + target_color: THEME.read().bg_primary, + shadow: "0", + + onmouseenter: move |_e| { + if selected == SidebarDisplayMode::Mods { + anim_underscore_width.run(AnimDirection::Forward); + anim_underscore_offset.run(AnimDirection::Reverse); + } + }, + onmouseleave: move |_e| { + if selected == SidebarDisplayMode::Mods { + anim_underscore_width.run(AnimDirection::Reverse); + anim_underscore_offset.run(AnimDirection::Forward); + } }, + onpress: move |_e| { + if anim_underscore_width.get().read().read() == 100.0 { + anim_underscore_width.run(AnimDirection::Reverse); + } else if selected == SidebarDisplayMode::Mods { + anim_underscore_width.run(AnimDirection::Reverse); + anim_underscore_offset.run(AnimDirection::Reverse); + } + onclick(SidebarDisplayMode::Profiles); + }, + label { + font_size: "18", + "Profiles" + } + } + Button { + width: "50%", + padding: "8", + main_align: "center", + cross_align: "center", + base_color: THEME.read().bg_primary, + target_color: THEME.read().bg_primary, + shadow: "0", + + onmouseenter: move |_e| { + if selected == SidebarDisplayMode::Profiles { + anim_underscore_width.run(AnimDirection::Forward); + } + }, + onmouseleave: move |_e| { + if selected == SidebarDisplayMode::Profiles { + anim_underscore_width.run(AnimDirection::Reverse); + } + }, + onpress: move |_| { + if selected == SidebarDisplayMode::Profiles || anim_underscore_width.get().read().read() != 50.0 { + anim_underscore_offset.run(AnimDirection::Forward); + anim_underscore_width.run(AnimDirection::Reverse); + } + onclick(SidebarDisplayMode::Mods); + }, label { font_size: "18", - font_weight: "bold", - "Settings" + + "Mods" } } } + rect { + direction: "horizontal", + // This moves the underline left/right + rect { + width: "{anim_underscore_offset.get().read().read()}%", + height: "2", + } + + // The underline + rect { + width: "{anim_underscore_width.get().read().read()}%", + height: "2", + background: THEME.read().blurple, + } + } }) } #[component] -fn ProfileListEntry( - profile: config::ProfileConfig, - selected: bool, - onclick: EventHandler, -) -> Element { - let bg_anim = hoverable!(move |_conf| { - AnimColor::new(constants::BG_SECONDARY, constants::BLURPLE) +fn HomeIconButton() -> Element { + let home_icon = static_bytes(crate::assets::HOME_ICON); + + let animation = hoverable!(move |_conf| { + AnimColor::new(THEME.read().bg_tertiary, THEME.read().blurple) .ease(Ease::InOut) .time(100) }); - let bg_color = bg_anim.animation.get(); + let bg_color = animation.animation.get().read().read(); + + rsx!(rect { + width: "48", + height: "48", + corner_radius: "{48/2}", + + background: bg_color, + onmouseenter: animation.onmouseenter, + onmouseleave: animation.onmouseleave, - let bg_color = if selected { - constants::BLURPLE - } else { - &bg_color.read().read() - }; + main_align: "center", + cross_align: "center", + + svg { + width: "24", + height: "24", + svg_data: home_icon, + fill: "#ffffff", + } + }) +} + +#[component] +fn SettingsButton() -> Element { + let gear_icon = static_bytes(crate::assets::GEAR_ICON); + + let animation = hoverable!(move |_conf| { + AnimColor::new(THEME.read().bg_tertiary, THEME.read().blurple) + .ease(Ease::InOut) + .time(100) + }); + + let bg_color = animation.animation.get().read().read(); rsx!(rect { - width: "100%", - // height: "32", - padding: "8", - color: "white", - corner_radius: "4", + width: "48", + height: "48", + corner_radius: "{48/2}", background: bg_color, - onmouseenter: bg_anim.onmouseenter, - onmouseleave: bg_anim.onmouseleave, + onmouseenter: animation.onmouseenter, + onmouseleave: animation.onmouseleave, + + main_align: "center", + cross_align: "center", + + svg { + width: "24", + height: "24", + svg_data: gear_icon, + fill: "#ffffff", + } + }) +} + +#[component] +fn GithubButton() -> Element { + let github_icon = static_bytes(crate::assets::GITHUB_ICON); + + let animation = hoverable!(move |_conf| { + AnimColor::new(THEME.read().bg_tertiary, THEME.read().blurple) + .ease(Ease::InOut) + .time(100) + }); + + let bg_color = animation.animation.get().read().read(); + + rsx!(rect { + width: "48", + height: "48", + corner_radius: "{48/2}", + + background: bg_color, + onmouseenter: animation.onmouseenter, + onmouseleave: animation.onmouseleave, + + main_align: "center", + cross_align: "center", + + onclick: move |_| { + let _ = open::that(crate::assets::GITHUB_REPO_LINK); + }, + + svg { + width: "24", + height: "24", + svg_data: github_icon, + fill: "#ffffff", + } + }) +} + +#[component] +fn DiscordButton() -> Element { + let discord_icon = static_bytes(crate::assets::DISCORD_ICON); + + let animation = hoverable!(move |_conf| { + AnimColor::new(THEME.read().bg_tertiary, THEME.read().blurple) + .ease(Ease::InOut) + .time(100) + }); + + let bg_color = animation.animation.get().read().read(); + + rsx!(rect { + width: "48", + height: "48", + corner_radius: "{48/2}", + + background: bg_color, + onmouseenter: animation.onmouseenter, + onmouseleave: animation.onmouseleave, + + main_align: "center", + cross_align: "center", - onclick: move |evt| onclick.call(evt), + onclick: move |_| { + let _ = open::that(crate::assets::DISCORD_INVITE_LINK); + }, - label { - font_size: "18", - font_weight: "bold", - {profile.profile.name} + svg { + width: "26", + height: "26", + svg_data: discord_icon, + fill: "#ffffff", } }) } diff --git a/crates/gui/src/constants.rs b/crates/gui/src/constants.rs index 5917a32..67d4360 100644 --- a/crates/gui/src/constants.rs +++ b/crates/gui/src/constants.rs @@ -1,9 +1,60 @@ -pub static BG_PRIMARY: &str = "rgb(46, 46, 52)"; -pub static BG_SECONDARY: &str = "rgb(52, 52, 58)"; -pub static BG_TERTIARY: &str = "rgb(56, 56, 62)"; +// TODO: Implement theme switching. +// #[derive(Clone)] +// pub enum Theme { +// Dark, +// // Light, +// } -pub static TEXT_PRIMARY: &str = "white"; +// impl Theme { +// pub fn get(&self) -> &'static ThemeDef { +// match self { +// Theme::Dark => &DARK_THEME, +// // Theme::Light => &LIGHT_THEME, +// } +// } +// } -pub static GREEN: &str = "rgb(68, 162, 91)"; -pub static BLURPLE: &str = "rgb(88, 101, 242)"; -pub static RED: &str = "rgb(210, 45, 57)"; +// TODO: Use proper freya themeing. + +// use freya::hooks::cow_borrowed; + +// pub const DISCORD_DARK: freya::hooks::Theme = freya::hooks::Theme { +// name: "discord-dark", +// colors: freya::hooks::ColorsSheet { +// primary: cow_borrowed!("rgb(46, 46, 52)"), +// secondary: cow_borrowed!("rgb(52, 52, 58)"), +// tertiary: cow_borrowed!("rgb(56, 56, 62)"), +// ..freya::hooks::DARK_THEME.colors +// }, +// ..freya::hooks::DARK_THEME +// }; + +pub const DARK_THEME: ThemeDef = ThemeDef { + bg_primary: "rgb(46, 46, 52)", + bg_secondary: "rgb(52, 52, 58)", + bg_tertiary: "rgb(56, 56, 62)", + + text_primary: "white", + text_secondary: "rgb(219, 219, 219)", + + bg_success: "rgb(68, 162, 91)", + bg_danger: "rgb(210, 45, 57)", + + blurple: "rgb(88, 101, 242)", + star_yellow: "rgb(255, 172, 51)", +}; + +pub struct ThemeDef { + pub bg_primary: &'static str, + pub bg_secondary: &'static str, + pub bg_tertiary: &'static str, + + pub text_primary: &'static str, + pub text_secondary: &'static str, + + pub bg_success: &'static str, + pub bg_danger: &'static str, + + pub blurple: &'static str, + pub star_yellow: &'static str, +} diff --git a/crates/gui/src/lib.rs b/crates/gui/src/lib.rs index 387945f..994ca5f 100644 --- a/crates/gui/src/lib.rs +++ b/crates/gui/src/lib.rs @@ -1,26 +1,50 @@ -mod components; -mod constants; -mod pages; -mod popups; -mod utils; +pub(crate) mod app; +pub(crate) mod assets; +pub(crate) mod components; +pub(crate) mod constants; +pub(crate) mod utils; -use components::main_content::CurrentPage; -use discord_modloader::config; -use popups::PopupState; +use constants::ThemeDef; use freya::prelude::*; -#[derive(Clone)] -pub struct AppState { - config: config::Config, - popup_state: PopupState, - current_page: CurrentPage, +pub static CURRENT_PAGE: GlobalSignal = Signal::global(|| AppPage::Home); +pub static THEME: GlobalSignal = Signal::global(|| constants::DARK_THEME); +pub static CONFIG: GlobalSignal = + Signal::global(modloader_core::config::Config::init); +pub static POPUP_STATE: GlobalSignal = Signal::global(|| PopupState::None); +pub static REFRESH_PIDS: GlobalSignal<()> = Signal::global(|| ()); + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum AppPage { + Home, + Mod(String), + ModFromTemplate, + Profile(String), + Settings, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum PopupState { + None, + ConfirmDeleteMod(String), + ConfirmDeleteProfile(String), + ConfirmDeleteInstance(String, String), + ConfirmKillProfile(String), + InstanceAlreadyRunning(String, String, String), +} + +pub enum AppTheme { + Dark, + Light, } pub fn start_gui() { let cfg: LaunchConfig<()> = LaunchConfig::new() - .with_title("Discord Modloader") + .with_title("Discord Mod Launcher") .with_size(1080., 720.) + .with_font("Inter", assets::FONT_INTER) + .with_default_font("Inter") .with_decorations(true) .with_transparency(true); @@ -28,55 +52,15 @@ pub fn start_gui() { } fn app() -> Element { - use components::main_content::MainContent; - use components::sidebar::ProfileList; - - let mut ctx = use_signal(|| AppState { - config: config::Config::init(), - popup_state: PopupState::Hidden, - current_page: CurrentPage::Home, - }); - // Share state signal with global state context - use_context_provider(|| ctx); - - rsx!(rect { - direction: "horizontal", - width: "100%", - height: "100%", - background: constants::BG_PRIMARY, - - match ctx().popup_state { - PopupState::Hidden => None, - PopupState::Launching(instance) => { - Some(rsx!(popups::LaunchingPopup { instance })); - None + // A task that runs every 1s that re-scans processes to update the PID list + use_hook(|| { + spawn(async move { + loop { + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + *REFRESH_PIDS.write() = (); } - PopupState::AlreadyLaunched(profile_id, instance_id) => { - Some(rsx!(popups::AlreadyLaunchedPopup { profile_id, instance_id })) - } - PopupState::CreateNewInstance(profile_id) => { - Some(rsx!(popups::CreateNewInstance { profile_id })) - } - PopupState::DeleteProfile(profile_id) => { - Some(rsx!(popups::DeleteProfile { profile_id })) - } - PopupState::DeleteInstance(profile_id, instance_id) => { - Some(rsx!(popups::DeleteInstance { profile_id, instance_id })) - } - } - - ProfileList { - onpagechange: move |page| ctx.write().current_page = page, - } - - rect { - width: "fill", - height: "100%", - background: constants::BG_SECONDARY, + }) + }); - MainContent { - page: ctx().current_page, - } - } - }) + app::app() } diff --git a/crates/gui/src/pages/create_profile.rs b/crates/gui/src/pages/create_profile.rs deleted file mode 100644 index bc00206..0000000 --- a/crates/gui/src/pages/create_profile.rs +++ /dev/null @@ -1,280 +0,0 @@ -use std::collections::BTreeMap; - -use dialog::DialogBox as _; -use discord_modloader::{config, paths}; -use freya::prelude::*; - -use crate::{components::custom_button::CustomButton, constants}; - -#[component] -pub fn CreateNewProfile(profile_id: Option) -> Element { - let mut ctx: Signal = use_context(); - - let is_new_profile = use_signal(|| profile_id.is_none()); - - let uuid = use_signal(|| profile_id.unwrap_or(uuid::Uuid::new_v4().to_string())); - - let mut profile = use_signal(|| match ctx().config.profiles.get(&uuid()) { - Some(profile) => profile.clone(), - _ => config::ProfileConfig { - profile: config::Profile { - name: "My Cool Profile".to_string(), - use_default_profile: false, - }, - discord: config::Discord { - executable: "".to_string(), - args: "".to_string(), - }, - instances: BTreeMap::new(), - }, - }); - - let mut selected_executable = use_signal(|| match profile().discord.executable.as_str() { - "" => InstallKind::NoneSelected, - install => InstallKind::Custom(install.to_string()), - }); - - use_memo(move || match selected_executable() { - InstallKind::Selected(install) => profile.write().discord.executable = install, - InstallKind::Custom(path) => profile.write().discord.executable = path, - _ => {} - }); - - rsx!(rect { - width: "100%", - height: "100%", - direction: "vertical", - padding: "8", - spacing: "8", - background: constants::BG_SECONDARY, - color: "white", - - rect { - direction: "horizontal", - cross_align: "center", - height: "48", - - label { - font_size: "18", - font_weight: "bold", - if is_new_profile() { "Create new Profile" } else { "Edit Profile" } - }, - }, - - rect { - width: "fill", - padding: "8 0 0 0", - width: "100%", - - label { - "Profile Name" - } - - Input { - theme: theme_with!(InputTheme { - width: "100%".into(), - background: constants::BG_SECONDARY.into(), - hover_background: constants::BG_SECONDARY.into(), - font_theme: theme_with!(FontTheme { - color: constants::TEXT_PRIMARY.into(), - }) - }), - placeholder: "Profile Name", - value: profile().profile.name, - onchange: move |value| { - profile.write().profile.name = value; - } - } - }, - - rect { - width: "fill", - padding: "8 0 0 0", - width: "100%", - - label { - "Discord Executable" - } - - InstallDropdown { selected_executable } - - if let InstallKind::Custom(_) = selected_executable() { - rect { - direction: "horizontal", - cross_align: "center", - - CustomButton { - bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), - height: "48", - padding: "8 0 0 0", - onclick: move |_| { - let file = dialog::FileSelection::new("Select Discord executable") - .title("Select Discord executable") - .show() - .expect("Failed to open file selection dialog"); - - if let Some(file) = file { - selected_executable.set(InstallKind::Custom(file)); - } - }, - - label { - "Browse" - } - } - - - Input { - theme: theme_with!(InputTheme { - width: "fill".into(), - background: constants::BG_SECONDARY.into(), - hover_background: constants::BG_SECONDARY.into(), - font_theme: theme_with!(FontTheme { - color: constants::TEXT_PRIMARY.into(), - }) - }), - placeholder: "Discord Executable", - value: profile().discord.executable, - onchange: move |value| { - selected_executable.set(InstallKind::Custom(value)); - } - } - } - } - }, - - rect { - width: "fill", - padding: "8 0 0 0", - width: "100%", - - label { - "Launch Arguments" - } - - Input { - theme: theme_with!(InputTheme { - width: "100%".into(), - background: constants::BG_SECONDARY.into(), - hover_background: constants::BG_SECONDARY.into(), - font_theme: theme_with!(FontTheme { - color: constants::TEXT_PRIMARY.into(), - }) - }), - placeholder: "--some=thing --hello=world", - value: profile().discord.args, - onchange: move |value| { - profile.write().discord.args = value; - } - } - }, - - rect { - CustomButton { - bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), - height: "48", - padding: "8 0 0 0", - onclick: move |_| { - if let Ok(id) = create_profile(uuid(), profile()) { - ctx.write().config = config::Config::init(); - ctx.write().current_page = crate::CurrentPage::SelectedProfile(id); - }; - }, - - label { - "Save Profile" - } - } - } - }) -} - -fn create_profile( - id: String, - profile: config::ProfileConfig, -) -> Result> { - let profile_file = paths::config_profile_dir().join(format!("{id}.toml")); - - let profile: String = toml::to_string(&profile)?; - - std::fs::write(profile_file, profile)?; - - Ok(id.to_string()) -} - -#[derive(Debug, Clone, PartialEq)] -enum InstallKind { - NoneSelected, - Selected(String), - Custom(String), -} - -#[component] -fn InstallDropdown(selected_executable: Signal) -> Element { - let found_installs: Signal> = use_signal(|| { - let mut installs = crate::utils::find_discord_installations(); - // Sort by length. Shorter first, longer last. - installs.sort_by(|a, b| match b.len() > a.len() { - true => std::cmp::Ordering::Less, - false => std::cmp::Ordering::Greater, - }); - installs - }); - - let value = match selected_executable() { - InstallKind::NoneSelected => "Select a Discord instance".to_string(), - InstallKind::Selected(install) => install, - InstallKind::Custom(_) => "Custom Instance".to_string(), - }; - - rsx!(Dropdown { - theme: theme_with!(DropdownTheme { - width: "100%".into(), - background_button: constants::BG_SECONDARY.into(), - dropdown_background: constants::BG_SECONDARY.into(), - hover_background: constants::BG_PRIMARY.into(), - font_theme: theme_with!(FontTheme { - color: constants::TEXT_PRIMARY.into(), - }) - }), - value: value, - for install in found_installs() { - DropdownItem { - theme: theme_with!(DropdownItemTheme { - background: constants::BG_SECONDARY.into(), - hover_background: constants::BG_PRIMARY.into(), - select_background: constants::BG_PRIMARY.into(), - font_theme: theme_with!(FontTheme { - color: constants::TEXT_PRIMARY.into(), - }) - }), - value: install.clone(), - onpress: { - to_owned![install]; - move |_| { - selected_executable.set(InstallKind::Selected(install.clone())); - } - }, - - label { "{install}" }, - } - } - - DropdownItem { - theme: theme_with!(DropdownItemTheme { - background: constants::BG_SECONDARY.into(), - hover_background: constants::BG_PRIMARY.into(), - select_background: constants::BG_PRIMARY.into(), - font_theme: theme_with!(FontTheme { - color: constants::TEXT_PRIMARY.into(), - }) - }), - value: "Custom Path".to_string(), - onpress: move |_| { - selected_executable.set(InstallKind::Custom("".to_string())); - }, - - label { "Custom Path" }, - } - }) -} diff --git a/crates/gui/src/pages/home.rs b/crates/gui/src/pages/home.rs deleted file mode 100644 index 646dfcb..0000000 --- a/crates/gui/src/pages/home.rs +++ /dev/null @@ -1,22 +0,0 @@ -use crate::constants; - -use freya::prelude::*; - -#[component] -pub fn Home() -> Element { - rsx!(rect { - width: "100%", - height: "100%", - direction: "vertical", - padding: "8", - spacing: "8", - background: constants::BG_SECONDARY, - color: "white", - - label { - font_size: "18", - font_weight: "bold", - "Home" - } - }) -} diff --git a/crates/gui/src/pages/mod.rs b/crates/gui/src/pages/mod.rs deleted file mode 100644 index 3085787..0000000 --- a/crates/gui/src/pages/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -mod create_profile; -mod home; -mod selected_profile; -mod settings; - -pub use create_profile::*; -pub use home::*; -pub use selected_profile::*; -pub use settings::*; diff --git a/crates/gui/src/pages/selected_profile.rs b/crates/gui/src/pages/selected_profile.rs deleted file mode 100644 index ab09901..0000000 --- a/crates/gui/src/pages/selected_profile.rs +++ /dev/null @@ -1,260 +0,0 @@ -use discord_modloader::{config, paths}; -use freya::prelude::*; - -use crate::{ - components::custom_button::CustomButton, - constants, - utils::{self, images}, -}; - -#[component] -pub fn SelectedProfile(id: String) -> Element { - let mut ctx = use_context::>(); - - let profile_id = id.clone(); - let profile = use_memo(move || ctx().config.profiles.get(&profile_id).cloned()); - - match profile() { - None => { - rsx!(rect { - width: "100%", - height: "100%", - direction: "vertical", - padding: "8", - spacing: "8", - background: constants::BG_SECONDARY, - color: "white", - - label { - "Profile not found" - } - }) - } - Some(profile) => { - rsx!(rect { - width: "100%", - height: "100%", - direction: "vertical", - padding: "8", - spacing: "8", - background: constants::BG_SECONDARY, - color: "white", - - rect { - direction: "horizontal", - cross_align: "center", - height: "48", - - label { - font_size: "18", - font_weight: "bold", - { profile.profile.name } - }, - - rect { - width: "fill", - direction: "horizontal", - main_align: "end", - CustomButton { - height: "48", - bg_anim: (constants::BG_PRIMARY.into(), constants::RED.into()), - onclick: { - to_owned![id]; - move |_| { - ctx.write().popup_state = crate::PopupState::DeleteProfile(id.clone()); - } - }, - - label { - "Delete Profile" - } - }, - CustomButton { - height: "48", - bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), - onclick: { - to_owned![id]; - move |_| { - ctx.write().current_page = crate::CurrentPage::CreateNewProfile(Some(id.clone())); - } - }, - - label { - "Edit Profile" - } - } - } - }, - - rect { - direction: "horizontal", - cross_align: "center", - - label { - "Instances:" - }, - - rect { - width: "fill", - direction: "horizontal", - main_align: "end", - CustomButton { - bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), - height: "48", - label { - "Add New Instance" - }, - onclick: { - to_owned![id]; - move |_| { - ctx.write().popup_state = crate::PopupState::CreateNewInstance(id.clone()); - } - } - } - }, - }, - - ScrollView { - spacing: "4", - - {profile.instances.iter().map(|(instance_id, instance)| { - to_owned![id]; - rsx!(InstanceEntry { profile_id: id, instance_id: instance_id, instance: instance.clone() }) - })} - } - }) - } - } -} - -#[component] -pub fn InstanceEntry( - instance_id: String, - instance: config::Instance, - profile_id: String, -) -> Element { - let mut ctx = use_context::>(); - - let image = match instance.icon { - Some(ref icon) => { - let image = images::get_icon(icon); - image.map(dynamic_bytes) - } - None => None, - }; - - rsx!(rect { - width: "100%", - height: "{ 64 + 8 + 8 }", - padding: "8", - color: "white", - corner_radius: "4", - background: constants::BG_TERTIARY, - direction: "horizontal", - - image { - width: "64", - height: "64", - image_data: image, - } - - rect { - height: "100%", - main_align: "center", - padding: "0 0 0 8", - - label { - font_size: "18", - font_weight: "bold", - { instance.name.clone() } - } - - label { - { instance.mod_id.clone() } - } - } - - rect { - height: "64", - width: "fill", - direction: "horizontal", - main_align: "end", - - CustomButton { - bg_anim: (constants::BG_PRIMARY.into(), constants::GREEN.into()), - onclick: { - to_owned![profile_id, instance_id, instance]; - move |_| { - let system = sysinfo::System::new_with_specifics( - sysinfo::RefreshKind::nothing() - .with_processes(sysinfo::ProcessRefreshKind::everything()), - ); - - let profile = ctx().config.profiles.get(&profile_id).unwrap().clone(); - - if system.processes().iter().any(|(_, proc)| { - let cmd = proc.cmd().join(std::ffi::OsStr::new(" ")); - let cmd = cmd.to_str().unwrap().to_string(); - - match !profile.profile.use_default_profile { - true => { - let profile_path = paths::data_profiles_dir().join(profile_id.clone()); - let profile_path = profile_path.to_str().unwrap(); - cmd.contains(&format!("--user-data-dir={}", profile_path)) - } - false => { - // If using the default discord profile (doesn't use our discord-modloader profiles dir) - // and the command contains the discord executable path, it's a duplicate profile. - !cmd.contains(paths::data_profiles_dir().to_str().unwrap()) && cmd.contains(&profile.discord.executable) - } - } - }) { - ctx.write().popup_state = crate::PopupState::AlreadyLaunched(profile_id.clone(), instance_id.clone()); - return; - } - - ctx.write().popup_state = crate::PopupState::Launching(instance.clone()); - - if let Some(profile) = ctx().config.profiles.get(&profile_id) { - let result = utils::launch::launch_instance(&profile_id, &instance_id, &profile.discord.args); - - if result.is_ok() { - ctx.write().popup_state = crate::PopupState::Hidden; - - if ctx().config.settings.hide_window_on_launch { - use_platform().set_minimize_window(true); - } - } - }; - } - }, - - label { - "Launch" - } - } - - CustomButton { - bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), - onclick: move |_| { - // TODO: Implement edit instance - }, - - label { - "Edit" - } - } - - CustomButton { - bg_anim: (constants::BG_PRIMARY.into(), constants::RED.into()), - onclick: move |_| { - ctx.write().popup_state = crate::PopupState::DeleteInstance(profile_id.clone(), instance_id.clone()); - }, - - label { - "Delete" - } - } - } - }) -} diff --git a/crates/gui/src/pages/settings.rs b/crates/gui/src/pages/settings.rs deleted file mode 100644 index e115212..0000000 --- a/crates/gui/src/pages/settings.rs +++ /dev/null @@ -1,157 +0,0 @@ -use discord_modloader::{config, paths}; -use freya::prelude::*; - -use crate::{components::custom_button::CustomButton, constants, utils}; - -#[component] -pub fn Settings() -> Element { - let mut icons = use_signal(utils::images::get_all_icons); - - let mut ctx = use_context::>(); - - use_memo(move || { - // write settings to file - let settings = toml::to_string(&ctx().config.settings); - if let Ok(settings) = settings { - let settings_file = paths::configs_dir().join("settings.toml"); - let _ = std::fs::write(settings_file, settings); - }; - }); - - rsx!(rect { - width: "100%", - height: "100%", - direction: "vertical", - padding: "8", - spacing: "8", - background: constants::BG_SECONDARY, - color: "white", - - ScrollView { - rect { - direction: "horizontal", - cross_align: "center", - height: "48", - - label { - font_size: "18", - font_weight: "bold", - { "Settings" } - }, - - rect { - width: "fill", - direction: "horizontal", - main_align: "end", - spacing: "4", - - CustomButton { - height: "48", - bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), - onclick: move |_| { - ctx.write().config = config::Config::init(); - icons.set(utils::images::get_all_icons()); - }, - - label { - "Refresh settings" - } - } - - CustomButton { - height: "48", - bg_anim: (constants::BG_PRIMARY.into(), constants::BLURPLE.into()), - onclick: move |_| { - let _ = open::that(paths::configs_dir()); - }, - - label { - "Open settings folder" - } - } - } - }, - - rect { - width: "fill", - padding: "8 0 0 0", - width: "100%", - direction: "horizontal", - cross_align: "center", - spacing: "8", - - label { - "Hide window when launching Discord" - } - - Switch { - enabled: ctx().config.settings.hide_window_on_launch, - ontoggled: move |_| { - ctx.write().config.settings.hide_window_on_launch ^= true; - } - } - }, - - rect { - width: "fill", - padding: "8 0 0 0", - width: "100%", - - label { - "Icons" - } - - rect { - max_height: "256", - ScrollView { - for (name, icon) in icons() { - IconEntry { - name: name, - icon: icon, - } - } - } - } - } - } - }) -} - -#[component] -fn IconEntry(name: String, icon: Vec) -> Element { - let hoverable = crate::utils::hoverable::hoverable!(move |_conf| { - AnimColor::new(constants::BG_PRIMARY, constants::BG_TERTIARY) - .ease(Ease::InOut) - .time(10) - }); - - let hoverable_anim = hoverable.animation.get(); - - let background = hoverable_anim.read().read(); - - rsx!(rect { - background: "{background}", - onmouseenter: hoverable.onmouseenter, - onmouseleave: hoverable.onmouseleave, - - corner_radius: "4", - padding: "4", - spacing: "4", - height: "64", - width: "100%", - direction: "horizontal", - cross_align: "center", - - image { - width: "40", - height: "40", - image_data: dynamic_bytes(icon), - } - - label { - font_size: "12", - font_weight: "bold", - "{name}" - } - }) -} diff --git a/crates/gui/src/popups/already_launched.rs b/crates/gui/src/popups/already_launched.rs deleted file mode 100644 index 22772a8..0000000 --- a/crates/gui/src/popups/already_launched.rs +++ /dev/null @@ -1,93 +0,0 @@ -use discord_modloader::paths; -use freya::prelude::*; - -use crate::{components::custom_button::CustomButton, constants, utils}; - -#[component] -pub fn AlreadyLaunchedPopup(profile_id: String, instance_id: String) -> Element { - let mut ctx = use_context::>(); - - let mut relaunch_instance = move || { - ctx.write().popup_state = super::PopupState::Hidden; - - let system = sysinfo::System::new_with_specifics( - sysinfo::RefreshKind::nothing() - .with_processes(sysinfo::ProcessRefreshKind::everything()), - ); - - let profile = ctx().config.profiles.get(&profile_id).unwrap().clone(); - - system.processes().iter().for_each(|(_pid, proc)| { - let cmd = proc.cmd().join(std::ffi::OsStr::new(" ")); - let cmd = cmd.to_str().unwrap().to_string(); - - let should_kill = match !profile.profile.use_default_profile { - true => { - let profile_path = paths::data_profiles_dir().join(profile_id.clone()); - let profile_path = profile_path.to_str().unwrap(); - cmd.contains(&format!("--user-data-dir={}", profile_path)) - } - false => { - // If using the default discord profile (doesn't use our discord-modloader profiles dir) - // and the command contains the discord executable path, it's a duplicate profile. - !cmd.contains(paths::data_profiles_dir().to_str().unwrap()) - && cmd.contains(&profile.discord.executable) - } - }; - - if should_kill { - proc.kill_with(sysinfo::Signal::Kill); - } - }); - - if let Some(profile) = ctx().config.profiles.get(&profile_id) { - let _ = - utils::launch::launch_instance(&profile_id, &instance_id, &profile.discord.args); - }; - }; - - rsx!(Popup { - theme: theme_with!(PopupTheme { - background: constants::BG_PRIMARY.into(), - color: constants::TEXT_PRIMARY.into(), - }), - close_on_escape_key: true, - - oncloserequest: move |_| { - ctx.write().popup_state = super::PopupState::Hidden; - }, - PopupTitle { - label { - "Instance already running" - } - }, - PopupContent { - label { - "An instance of this profile is already running." - } - - label { - "Would you like to kill the existing process, and launch a new one?" - } - - rect { - height: "fill", - width: "100%", - main_align: "end", - cross_align: "end", - CustomButton { - bg_anim: (constants::RED.into(), constants::BLURPLE.into()), - height: "32", - padding: "0 0 8 0", - label { - "Kill & Relaunch" - } - onclick: move |_| { - relaunch_instance(); - } - } - } - - } - }) -} diff --git a/crates/gui/src/popups/create_instance.rs b/crates/gui/src/popups/create_instance.rs deleted file mode 100644 index 4205ad0..0000000 --- a/crates/gui/src/popups/create_instance.rs +++ /dev/null @@ -1,91 +0,0 @@ -use discord_modloader::{config, paths}; -use freya::prelude::*; - -use crate::{components::custom_button::CustomButton, constants}; - -fn delete_instance( - mut ctx: Signal, - profile_id: String, - instance_id: String, -) -> Result<(), Box> { - match ctx.write().config.profiles.get_mut(&profile_id) { - Some(profile) => { - profile.instances.remove(&instance_id); - let profile_path = paths::config_profile_dir().join(format!("{profile_id}.toml")); - std::fs::write(profile_path, toml::to_string_pretty(&profile)?)?; - } - _ => { - return Err("Profile not found".into()); - } - } - - Ok(()) -} - -#[component] -pub fn CreateNewInstance(profile_id: String) -> Element { - let mut ctx = use_context::>(); - - let instance_id = use_signal(|| uuid::Uuid::new_v4().to_string()); - - let mut instance = use_signal(|| config::Instance { - name: "".to_string(), - mod_id: "".to_string(), - icon: None, - }); - - rsx!(Popup { - theme: theme_with!(PopupTheme { - background: constants::BG_PRIMARY.into(), - color: constants::TEXT_PRIMARY.into(), - }), - close_on_escape_key: true, - - oncloserequest: move |_| { - ctx.write().popup_state = super::PopupState::Hidden; - }, - - PopupTitle { - label { - "Create new instance" - } - }, - PopupContent { - rect { - width: "100%", - height: "100%", - direction: "vertical", - padding: "8", - spacing: "8", - background: constants::BG_SECONDARY, - color: "white", - - rect { - width: "fill", - padding: "8 0 0 0", - width: "100%", - - label { - "Instance Name" - } - - Input { - theme: theme_with!(InputTheme { - width: "100%".into(), - background: constants::BG_SECONDARY.into(), - hover_background: constants::BG_SECONDARY.into(), - font_theme: theme_with!(FontTheme { - color: constants::TEXT_PRIMARY.into(), - }) - }), - placeholder: "Instance Name", - value: instance().name, - onchange: move |value| { - instance.write().name = value; - } - } - } - } - } - }) -} diff --git a/crates/gui/src/popups/delete_instance.rs b/crates/gui/src/popups/delete_instance.rs deleted file mode 100644 index f3d156e..0000000 --- a/crates/gui/src/popups/delete_instance.rs +++ /dev/null @@ -1,73 +0,0 @@ -use discord_modloader::{config, paths}; -use freya::prelude::*; - -use crate::{components::custom_button::CustomButton, constants}; - -fn delete_instance( - mut ctx: Signal, - profile_id: String, - instance_id: String, -) -> Result<(), Box> { - match ctx.write().config.profiles.get_mut(&profile_id) { - Some(profile) => { - profile.instances.remove(&instance_id); - let profile_path = paths::config_profile_dir().join(format!("{profile_id}.toml")); - std::fs::write(profile_path, toml::to_string_pretty(&profile)?)?; - } - _ => { - return Err("Profile not found".into()); - } - } - - Ok(()) -} - -#[component] -pub fn DeleteInstance(profile_id: String, instance_id: String) -> Element { - let mut ctx = use_context::>(); - - rsx!(Popup { - theme: theme_with!(PopupTheme { - background: constants::BG_PRIMARY.into(), - color: constants::TEXT_PRIMARY.into(), - }), - close_on_escape_key: true, - - oncloserequest: move |_| { - ctx.write().popup_state = super::PopupState::Hidden; - }, - - PopupTitle { - label { - "Delete instance" - } - }, - PopupContent { - label { - "Are you sure you want to delete the instance?" - } - - rect { - height: "fill", - width: "100%", - main_align: "end", - cross_align: "end", - CustomButton { - bg_anim: (constants::RED.into(), constants::BLURPLE.into()), - height: "32", - padding: "0 0 8 0", - label { - "Delete" - } - onclick: move |_| { - let result = delete_instance(ctx, profile_id.clone(), instance_id.clone()); - if result.is_ok() { - ctx.write().config = config::Config::init(); - ctx.write().popup_state = super::PopupState::Hidden; - } - } - } - } - } - }) -} diff --git a/crates/gui/src/popups/delete_profile.rs b/crates/gui/src/popups/delete_profile.rs deleted file mode 100644 index 1d19b82..0000000 --- a/crates/gui/src/popups/delete_profile.rs +++ /dev/null @@ -1,62 +0,0 @@ -use discord_modloader::{config, paths}; -use freya::prelude::*; - -use crate::{components::custom_button::CustomButton, constants}; - -fn delete_profile(id: String) -> Result<(), Box> { - let profile_file = paths::config_profile_dir().join(format!("{id}.toml")); - - std::fs::remove_file(profile_file)?; - - Ok(()) -} - -#[component] -pub fn DeleteProfile(profile_id: String) -> Element { - let mut ctx = use_context::>(); - - rsx!(Popup { - theme: theme_with!(PopupTheme { - background: constants::BG_PRIMARY.into(), - color: constants::TEXT_PRIMARY.into(), - }), - close_on_escape_key: true, - - oncloserequest: move |_| { - ctx.write().popup_state = super::PopupState::Hidden; - }, - - PopupTitle { - label { - "Delete profile" - } - }, - PopupContent { - label { - "Are you sure you want to delete this profile?" - } - - rect { - height: "fill", - width: "100%", - main_align: "end", - cross_align: "end", - CustomButton { - bg_anim: (constants::RED.into(), constants::BLURPLE.into()), - height: "32", - padding: "0 0 8 0", - label { - "Delete" - } - onclick: move |_| { - let result = delete_profile(profile_id.clone()); - if result.is_ok() { - ctx.write().config = config::Config::init(); - ctx.write().popup_state = super::PopupState::Hidden; - } - } - } - } - } - }) -} diff --git a/crates/gui/src/popups/launching.rs b/crates/gui/src/popups/launching.rs deleted file mode 100644 index 4e19de4..0000000 --- a/crates/gui/src/popups/launching.rs +++ /dev/null @@ -1,31 +0,0 @@ -use discord_modloader::config; -use freya::prelude::*; - -use crate::constants; - -#[component] -pub fn LaunchingPopup(instance: config::Instance) -> Element { - let mut ctx = use_context::>(); - - rsx!(Popup { - theme: theme_with!(PopupTheme { - background: constants::BG_PRIMARY.into(), - color: constants::TEXT_PRIMARY.into(), - }), - close_on_escape_key: true, - - oncloserequest: move |_| { - ctx.write().popup_state = super::PopupState::Hidden; - }, - PopupTitle { - label { - "Launching Discord" - } - }, - PopupContent { - label { - "Launching instance {instance.name}..." - } - } - }) -} diff --git a/crates/gui/src/popups/mod.rs b/crates/gui/src/popups/mod.rs deleted file mode 100644 index fd5b139..0000000 --- a/crates/gui/src/popups/mod.rs +++ /dev/null @@ -1,25 +0,0 @@ -pub mod already_launched; -pub mod create_instance; -pub mod delete_instance; -pub mod delete_profile; -pub mod launching; - -use discord_modloader::config; - -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum PopupState { - Hidden, - Launching(config::Instance), - // Launched, - AlreadyLaunched(String, String), - DeleteProfile(String), - DeleteInstance(String, String), - CreateNewInstance(String), - // Error, -} - -pub use already_launched::*; -pub use create_instance::*; -pub use delete_instance::*; -pub use delete_profile::*; -pub use launching::*; diff --git a/crates/gui-new/src/utils/icons.rs b/crates/gui/src/utils/icons.rs similarity index 96% rename from crates/gui-new/src/utils/icons.rs rename to crates/gui/src/utils/icons.rs index a523ede..ad64c30 100644 --- a/crates/gui-new/src/utils/icons.rs +++ b/crates/gui/src/utils/icons.rs @@ -1,5 +1,5 @@ -use discord_modloader::{config, paths}; use freya::prelude::Readable as _; +use modloader_core::{config, paths}; use crate::CONFIG; @@ -32,7 +32,7 @@ impl GetIcon for config::Mod { fn get_icon(&self) -> Option> { let name = { if let Some(ref name) = self.icon { - Some(name.clone()) + Some(name.to_string()) } else { self.updater.as_ref().map(|updater| { format!("{}/{}/icon.png", updater.github_org, updater.github_repo) diff --git a/crates/gui/src/utils/images.rs b/crates/gui/src/utils/images.rs deleted file mode 100644 index d4b020e..0000000 --- a/crates/gui/src/utils/images.rs +++ /dev/null @@ -1,82 +0,0 @@ -const LIB_PATH: &str = "/usr/lib/discord-modloader"; - -fn get_icons_from_dir(path: std::path::PathBuf) -> Vec<(String, Vec)> { - let mut icons = Vec::new(); - - if path.exists() && path.is_dir() { - if let Ok(files) = std::fs::read_dir(path) { - for entry in files { - let entry = entry.unwrap(); - let name = entry.file_name().into_string().unwrap(); - let icon = std::fs::read(entry.path()).unwrap(); - icons.push((name, icon)); - } - } - } - - icons -} - -pub fn get_all_icons() -> Vec<(String, Vec)> { - let mut icons = Vec::new(); - - let config_path = dirs::config_local_dir().unwrap().join("discord-modloader"); - let icon_path = config_path.join("icons"); - icons.extend(get_icons_from_dir(icon_path)); - - let lib_path = std::path::PathBuf::from(LIB_PATH); - let icon_path = lib_path.join("icons"); - icons.extend(get_icons_from_dir(icon_path)); - - let current_exe = std::env::current_exe().unwrap(); - let icon_path = current_exe.with_file_name("icons"); - icons.extend(get_icons_from_dir(icon_path)); - - let cwd = std::env::current_dir().unwrap(); - let icon_path = cwd.join("icons"); - icons.extend(get_icons_from_dir(icon_path)); - - let icon_path = cwd.join("configs").join("icons"); - icons.extend(get_icons_from_dir(icon_path)); - - // deduplicate - - let mut seen = std::collections::HashSet::new(); - icons.retain(|(name, _)| seen.insert(name.clone())); - - icons -} - -pub fn get_icon(name: &str) -> Option> { - let config_path = dirs::config_local_dir().unwrap().join("discord-modloader"); - let icon_path = config_path.join("icons").join(name); - if icon_path.exists() { - return std::fs::read(icon_path).ok(); - } - - let lib_path = std::path::PathBuf::from(LIB_PATH); - - let icon_path = lib_path.join("icons").join(name); - if icon_path.exists() { - return std::fs::read(icon_path).ok(); - } - - let current_exe = std::env::current_exe().unwrap(); - let icon_path = current_exe.with_file_name("icons").join(name); - if icon_path.exists() { - return std::fs::read(icon_path).ok(); - } - - let cwd = std::env::current_dir().unwrap(); - let icon_path = cwd.join("icons").join(name); - if icon_path.exists() { - return std::fs::read(icon_path).ok(); - } - - let icon_path = cwd.join("configs").join("icons").join(name); - if icon_path.exists() { - return std::fs::read(icon_path).ok(); - } - - None -} diff --git a/crates/gui/src/utils/launch.rs b/crates/gui/src/utils/launch.rs deleted file mode 100644 index 97bb14e..0000000 --- a/crates/gui/src/utils/launch.rs +++ /dev/null @@ -1,35 +0,0 @@ -use std::process::Stdio; - -#[cfg(target_os = "linux")] -pub fn launch_instance( - profile_id: &str, - instance_id: &str, - args: &str, -) -> Result> { - #[allow(clippy::zombie_processes, reason = "Process detaches from parent.")] - let target = std::process::Command::new(std::env::current_exe().unwrap()) - .arg("--profile") - .arg(profile_id) - .arg("--instance") - .arg(instance_id) - .arg("--") - .arg(args) - .stdout(Stdio::null()) - .stderr(Stdio::null()) - .stdin(Stdio::null()) - .spawn() - .expect("Failed to launch instance."); - - let pid = target.id(); - - Ok(pid) -} - -#[cfg(target_os = "windows")] -pub fn launch_instance( - profile_id: &str, - instance_id: &str, - args: &str, -) -> Result> { - todo!(); -} diff --git a/crates/gui/src/utils/mod.rs b/crates/gui/src/utils/mod.rs index 8d18ce8..b6bb843 100644 --- a/crates/gui/src/utils/mod.rs +++ b/crates/gui/src/utils/mod.rs @@ -1,103 +1,2 @@ -use std::path::PathBuf; - pub mod hoverable; -pub mod images; -pub mod launch; - -macro_rules! p2s { - ($path:expr) => { - $path.to_str().unwrap().to_string() - }; -} - -// from: https://github.com/Vencord/Installer -const DISCORD_NAMES: &[&str] = &[ - "Discord", - "DiscordPTB", - "DiscordCanary", - "DiscordDevelopment", - "discord", - "discordptb", - "discordcanary", - "discorddevelopment", - "discord-ptb", - "discord-canary", - "discord-development", - // Flatpak. Untested. May not work. - "com.discordapp.Discord", - "com.discordapp.DiscordPTB", - "com.discordapp.DiscordCanary", - "com.discordapp.DiscordDevelopment", -]; - -#[cfg(target_os = "linux")] -fn paths_to_check() -> Vec { - let home = dirs::home_dir().unwrap(); - let local_share = home.join(".local").join("share"); - let dvm = home.join(".dvm").join("branches"); - - vec![ - "/usr/share".to_string(), - "/usr/lib64".to_string(), - "/opt".to_string(), - p2s!(local_share), - p2s!(home.join(".local").join("share")), - p2s!(dvm.join("canary")), - p2s!(dvm.join("ptb")), - p2s!(dvm.join("stable")), - p2s!(dvm.join("development")), - // Flatpak. Untested. May not work. - "/var/lib/flatpak/app".to_string(), - p2s!(local_share.join("flatpak").join("app")), - ] -} - -#[cfg(target_os = "linux")] -pub fn find_discord_installations() -> Vec { - let mut instances = Vec::new(); - - for dir in paths_to_check() { - let children = match std::fs::read_dir(&dir) { - Ok(children) => children, - Err(_) => continue, - }; - - for child in children.flatten() { - let metadata = match child.metadata() { - Ok(metadata) => metadata, - Err(_) => continue, - }; - - if !metadata.is_dir() { - continue; - } - - let name = match child.file_name().to_str() { - Some(name) => name, - None => continue, - } - .to_string(); - - // check if name contains any of the discord names - if DISCORD_NAMES.iter().any(|&x| name.ends_with(x)) { - let path = parse_discord_instance(child.path()); - if let Some(path) = path { - instances.push(path); - } - } - } - } - - instances -} - -#[cfg(target_os = "linux")] -fn parse_discord_instance(path: PathBuf) -> Option { - DISCORD_NAMES.iter().find_map(|n| { - let path = path.join(n); - match path.exists() { - true => Some(p2s!(path)), - false => None, - } - }) -} +pub mod icons; diff --git a/crates/libdiscord-modloader/Cargo.toml b/crates/libdiscord-modloader/Cargo.toml deleted file mode 100644 index 29350c7..0000000 --- a/crates/libdiscord-modloader/Cargo.toml +++ /dev/null @@ -1,39 +0,0 @@ -[package] -name = "libdiscord-modloader" -version = "0.1.0" -edition = "2021" - -[lib] -name = "discord_modloader" -crate-type = ["cdylib", "lib"] - -[dependencies] -asar = "0.3.0" -dirs = "5.0.1" -flate2 = "1.0.35" -octocrab = { version = "0.42.1", default-features = false } -serde = { version = "1.0.210", features = ["serde_derive"] } -serde_json = "1.0.135" -strum = { version = "0.26.3", features = ["derive"] } -sysinfo = "0.33.0" -tar = "0.4.43" -toml = "0.8.19" -ureq = { version = "2.12.1", features = ["json"] } -zip = "2.2.2" - -[target.'cfg(windows)'.dependencies] -winapi = { version = "0.3.9", features = [ - "winbase", - "handleapi", - "minwindef", - "consoleapi", - "winnt", - "memoryapi", - "namedpipeapi", -] } -detours-sys = { version = "0.1.2" } -widestring = "1.1.0" - -[target.'cfg(unix)'.dependencies] -libc = "0.2.167" -retour = { version = "0.3.1", features = ["static-detour"] } diff --git a/crates/libdiscord-modloader/src/discord.rs b/crates/libdiscord-modloader/src/discord.rs deleted file mode 100644 index 4011aaf..0000000 --- a/crates/libdiscord-modloader/src/discord.rs +++ /dev/null @@ -1,59 +0,0 @@ -use std::{error::Error, path::PathBuf}; - -/// Returns the path to the Discord executable based on the Discord folder. -/// -/// e.g. "C:\Users\Megu\AppData\Local\discordptb" -> "C:\Users\Megu\AppData\Local\discordptb\app-1.0.9023\Discord.exe" -pub fn get_discord_exe(path: &str) -> Result> { - let mut new_path = PathBuf::from(path); - - let new_path_executable = new_path.clone(); - let executable_name = new_path_executable.file_name().unwrap().to_str().unwrap(); - - let versions: Vec<_> = new_path - .read_dir()? - .filter_map(|p| { - let path = p.unwrap(); - let file_name = path.file_name(); - let file_name_str = file_name.to_str().unwrap(); - if file_name_str.starts_with("app-") { - Some(file_name_str.to_string()) - } else { - None - } - }) - .collect(); - - if versions.is_empty() { - return Err("No discord versions found".into()); - } - - // app-1.0.9023 - - let mut sorted: Vec<(&String, u32)> = versions - .iter() - .filter_map(|v| { - let mut split = v.split('-'); - let version = split.nth(1).unwrap(); - let version = version.replace('.', ""); - let version = version.parse::(); - if let Ok(version) = version { - Some((v, version)) - } else { - None - } - }) - .collect(); - - sorted.sort_by(|(_, a), (_, b)| a.cmp(b)); - - let latest_version = sorted.last().unwrap().0; - - new_path.push(latest_version); - new_path.push(format!("{}.exe", executable_name)); - - if !new_path.exists() { - return Err("Discord.exe not found".into()); - } - - Ok(new_path) -} diff --git a/crates/libdiscord-modloader/src/lib.rs b/crates/libdiscord-modloader/src/lib.rs deleted file mode 100644 index 32a5573..0000000 --- a/crates/libdiscord-modloader/src/lib.rs +++ /dev/null @@ -1,149 +0,0 @@ -pub mod config; -pub mod discord; -pub mod paths; -pub mod updater; -pub mod utils; - -use paths::{cache_asar_path, ensure_dir}; - -#[cfg(target_os = "linux")] -mod unix; - -#[cfg(target_os = "windows")] -#[allow(unused_imports)] -mod windows; - -#[cfg(target_os = "linux")] -#[allow(unused_imports)] -pub use unix::*; - -#[cfg(target_os = "windows")] -#[allow(unused_imports)] -pub use windows::*; - -pub fn init_current_cache( - cfg: &config::Config, - profile_id: &str, - instance_id: &str, - force_update: bool, -) -> String { - static ASAR_CUSTOM_PROFILE_JS: &str = include_str!("./asar/custom_profile.js"); - static ASAR_PACKAGE_JSON: &str = include_str!("./asar/package.json"); - - let profile = cfg - .profiles - .get(profile_id) - .unwrap_or_else(|| panic!("Failed to find profile '{}'.", profile_id)); - - let instance = profile - .instances - .get(instance_id) - .unwrap_or_else(|| panic!("Failed to find instance '{}'.", instance_id)); - - let r#mod = cfg - .mods - .get(&instance.mod_id) - .unwrap_or_else(|| panic!("Failed to find mod '{}'.", instance.mod_id)) - .to_owned(); - - // TODO: Make this more robust - if let Some(ref updater) = r#mod.updater { - let _ = updater::update(updater, force_update); - } - - let asar_cache_path = cache_asar_path(profile_id, instance_id, &instance.mod_id); - - ensure_dir(asar_cache_path.parent().unwrap().to_path_buf()); - - let profile_dir = if !profile.profile.use_default_profile { - let profile_dir = ensure_dir(paths::data_profiles_dir().join(profile_id)); - let profile_dir = profile_dir.to_str().unwrap().replace("\\", "\\\\"); - Some(profile_dir) - } else { - None - }; - - // If path is not provided, try to use the updater instead. - let mod_path = if let Some(path) = r#mod.path { - path - } else if let Some(updater) = r#mod.updater { - paths::cache_mod_files_dir() - .join(&updater.github_org) - .join(&updater.github_repo) - .to_string_lossy() - .to_string() - } else { - panic!("Mod '{}' does not have a path or updater.", r#mod.name); - }; - - let mod_entrypoint = std::path::Path::new(&mod_path).join(&r#mod.entrypoint); - let mod_entrypoint = mod_entrypoint.to_str().unwrap().replace("\\", "\\\\"); - - let mut custom_loader = String::from("console.log(\"Launching with Discord Modloader.\");\n"); - - // If using a custom profile directory, insert this. - if let Some(ref profile_dir) = profile_dir { - let data = ASAR_CUSTOM_PROFILE_JS - .replace("$PROFILE", profile_dir) - .replace("$ENTRYPOINT", &mod_entrypoint); - - custom_loader.push_str(&data); - } - - if let Some(ref loader) = r#mod.loader { - // Users can provide a custom prefix in the profile TOML. - if let Some(ref prefix) = loader.prefix { - let mut prefix = prefix.replace("$ENTRYPOINT", &mod_entrypoint); - - if let Some(ref profile_dir) = profile_dir { - prefix = prefix.replace("$PROFILE", profile_dir); - } - - custom_loader.push_str(&prefix); - } - - // If the user provides a custom require, use that instead of the default. - if let Some(ref require) = loader.require { - let mut require = require.replace("$ENTRYPOINT", &mod_entrypoint); - - if let Some(ref profile_dir) = profile_dir { - require = require.replace("$PROFILE", profile_dir); - } - - custom_loader.push_str(&require); - } else { - custom_loader.push_str(&format!(r#"require("{}")"#, &mod_entrypoint)); - } - - // If the user provices a custom suffix, insert it. - if let Some(ref suffix) = loader.suffix { - let mut suffix = suffix.replace("$ENTRYPOINT", &mod_entrypoint); - - if let Some(ref profile_dir) = profile_dir { - suffix = suffix.replace("$PROFILE", profile_dir); - } - - custom_loader.push_str(&suffix); - } - } else { - custom_loader.push_str( - config::ModLoader::default_require() - .unwrap() - .replace("$ENTRYPOINT", &mod_entrypoint) - .as_str(), - ); - } - - let mut asar = asar::AsarWriter::new(); - - asar.write_file("index.js", custom_loader, false).unwrap(); - asar.write_file("package.json", ASAR_PACKAGE_JSON, false) - .unwrap(); - - dbg!(&asar_cache_path); - - asar.finalize(std::fs::File::create(&asar_cache_path).unwrap()) - .unwrap(); - - asar_cache_path.to_str().unwrap().to_owned() -} diff --git a/crates/libdiscord-modloader/src/unix.rs b/crates/libdiscord-modloader/src/unix.rs deleted file mode 100644 index bf47a29..0000000 --- a/crates/libdiscord-modloader/src/unix.rs +++ /dev/null @@ -1,161 +0,0 @@ -use std::{ - ffi::{c_char, c_void}, - sync::LazyLock, -}; - -use retour::static_detour; - -static MODLOADER_ASAR_PATH: LazyLock = - LazyLock::new(|| std::env::var("MODLOADER_ASAR_PATH").unwrap()); - -#[link(name = "dl")] -unsafe extern "C" { - unsafe fn dlsym(handle: *const c_void, symbol: *const c_char) -> *const c_void; -} - -unsafe extern "C" { - #[link_name = "uv_fs_lstat"] - unsafe fn original_uv_fs_lstat( - loop_: *const c_void, - req: *const c_void, - path: *const c_char, - buf: *mut c_void, - ) -> i32; -} - -type MainFn = extern "C" fn(i32, *const *const c_void, *const *const c_void) -> i32; - -type LibcStartMainFn = fn( - MainFn, - i32, - *const *const char, - MainFn, - extern "C" fn(), - extern "C" fn(), - *mut c_void, -) -> i32; - -#[no_mangle] -unsafe extern "C" fn __libc_start_main( - main: MainFn, - argc: i32, - argv: *const *const char, - init: MainFn, - fini: extern "C" fn(), - rtld_fini: extern "C" fn(), - stack_end: *mut c_void, -) -> i32 { - #[allow(clippy::missing_transmute_annotations)] - UvFsLstatDetour - .initialize( - std::mem::transmute::(original_uv_fs_lstat), - uv_fs_lstat, - ) - .unwrap(); - - UvFsLstatDetour.enable().unwrap(); - - let orig_libc_start_main_addr: *const c_void = dlsym( - libc::RTLD_NEXT, - c"__libc_start_main".as_ptr() as *const c_char, - ); - - let orig_libc_start_main: LibcStartMainFn = std::mem::transmute(orig_libc_start_main_addr); - - orig_libc_start_main(main, argc, argv, init, fini, rtld_fini, stack_end) -} - -type UvFsLstat = unsafe extern "C" fn( - loop_: *const c_void, - req: *const c_void, - path: *const c_char, - cb: *mut c_void, -) -> i32; - -static_detour! { - static UvFsLstatDetour: fn(*const c_void, *const c_void, *const c_char, *mut c_void) -> i32; -} - -#[export_name = "uv_fs_lstat"] -unsafe extern "C" fn export_uv_vs_lstat( - loop_: *const c_void, - req: *const c_void, - path: *const c_char, - buf: *mut c_void, -) -> i32 { - uv_fs_lstat(loop_, req, path, buf) -} - -fn uv_fs_lstat( - loop_: *const c_void, - req: *const c_void, - path: *const c_char, - buf: *mut c_void, -) -> i32 { - let path_str = unsafe { std::ffi::CStr::from_ptr(path).to_str().unwrap() }; - if path_str.contains("resources/_app.asar") { - let redirect_to = path_str.replace("/_app.asar", "/app.asar"); - let redirect_to_c = std::ffi::CString::new(redirect_to.as_str()).unwrap(); - return UvFsLstatDetour.call(loop_, req, redirect_to_c.as_ptr(), buf); - } - - UvFsLstatDetour.call(loop_, req, path, buf) -} - -type XStat64 = unsafe extern "C" fn(i32, *const c_char, *mut libc::stat64) -> i64; - -#[no_mangle] -unsafe extern "C" fn __xstat64(ver: i32, path: *const c_char, out: *mut libc::stat64) -> i64 { - use std::sync::LazyLock; - - static ORIGINAL_XSTAT64: LazyLock = LazyLock::new(|| unsafe { - std::mem::transmute(dlsym(libc::RTLD_NEXT, c"__xstat64".as_ptr())) - }); - - let path_str = std::ffi::CStr::from_ptr(path).to_str().unwrap(); - - // If calling _app.asar, return the original app.asar - if path_str.contains("resources/_app.asar") { - let redirect_to = path_str.replace("/_app.asar", "/app.asar"); - let redirect_to_c = std::ffi::CString::new(redirect_to.as_str()).unwrap(); - return ORIGINAL_XSTAT64(ver, redirect_to_c.as_ptr(), out); - } - - // If calling app.asar, return the custom app.asar - if path_str.contains("resources/app.asar") { - let asar_path_cstr = std::ffi::CString::new(MODLOADER_ASAR_PATH.as_str()).unwrap(); - return ORIGINAL_XSTAT64(ver, asar_path_cstr.as_ptr(), out); - } - - ORIGINAL_XSTAT64(ver, path, out) -} - -type Open64 = unsafe extern "C" fn(*const c_char, i32, i32) -> i32; - -#[no_mangle] -unsafe extern "C" fn open64(path: *const c_char, flags: i32, mode: i32) -> i32 { - use std::sync::LazyLock; - - static ORIGINAL_OPENAT64: LazyLock = LazyLock::new(|| unsafe { - std::mem::transmute(dlsym(libc::RTLD_NEXT, c"open64".as_ptr())) - }); - - let path_str = std::ffi::CStr::from_ptr(path).to_str().unwrap(); - - // If calling _app.asar, return the original app.asar - if path_str.contains("resources/_app.asar") { - let redirect_to = path_str.replace("/_app.asar", "/app.asar"); - let redirect_to_c = std::ffi::CString::new(redirect_to.as_str()).unwrap(); - - return ORIGINAL_OPENAT64(redirect_to_c.as_ptr(), flags, mode); - } - - // If calling app.asar, return the custom app.asar - if path_str.contains("resources/app.asar") { - let redirect_to = std::ffi::CString::new(MODLOADER_ASAR_PATH.as_str()).unwrap(); - - return ORIGINAL_OPENAT64(redirect_to.as_ptr(), flags, mode); - } - - ORIGINAL_OPENAT64(path, flags, mode) -} diff --git a/crates/libdiscord-modloader/src/windows.rs b/crates/libdiscord-modloader/src/windows.rs deleted file mode 100644 index b29a409..0000000 --- a/crates/libdiscord-modloader/src/windows.rs +++ /dev/null @@ -1,260 +0,0 @@ -use std::{ffi::CString, str::FromStr, sync::LazyLock}; - -use detours_sys::{ - DetourAttach, DetourCreateProcessWithDllW, DetourIsHelperProcess, DetourRestoreAfterWith, - DetourTransactionAbort, DetourTransactionBegin, DetourTransactionCommit, DetourUpdateThread, - PVOID, -}; - -use widestring::U16CString; -use winapi::{ - shared::{ - minwindef::{BOOL, DWORD, HINSTANCE, LPVOID}, - ntdef::{HANDLE, LPCWSTR, LPWSTR}, - }, - um::{ - fileapi::{CreateFileW, GetFileAttributesW}, - minwinbase::LPSECURITY_ATTRIBUTES, - processthreadsapi::{ - CreateProcessW, GetCurrentThread, ResumeThread, LPPROCESS_INFORMATION, LPSTARTUPINFOW, - }, - winnt::DLL_PROCESS_ATTACH, - winuser::MessageBoxA, - }, -}; - -static MODLOADER_ASAR_PATH: LazyLock = - LazyLock::new(|| std::env::var("MODLOADER_ASAR_PATH").unwrap()); - -static MODLOADER_DLL_PATH: LazyLock = - LazyLock::new(|| std::env::var("MODLOADER_DLL_PATH").unwrap()); - -static mut ORIGINAL_GET_FILE_ATTRIBUTES_W: PVOID = GetFileAttributesW as _; -static mut ORIGINAL_CREATE_FILE_W: PVOID = CreateFileW as _; -static mut ORIGINAL_CREATE_PROCESS_W: PVOID = CreateProcessW as _; - -macro_rules! error_hooking_msg { - ($msg:expr) => { - MessageBoxA( - std::ptr::null_mut(), - $msg.as_ptr() as *const i8, - "Error Hooking".as_ptr() as *const i8, - 0, - ); - }; -} - -#[no_mangle] -unsafe extern "stdcall" fn DllMain( - _hinst_dll: HINSTANCE, - fwd_reason: DWORD, - _lpv_reserved: LPVOID, -) -> i32 { - if DetourIsHelperProcess() == 1 { - return 1; - } - - if fwd_reason != DLL_PROCESS_ATTACH { - return 1; - } - - DetourRestoreAfterWith(); - - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - - let result = DetourAttach( - &raw mut ORIGINAL_GET_FILE_ATTRIBUTES_W, - get_file_attributes_w as _, - ); - - if result != 0 { - error_hooking_msg!("Failed to hook GetFileAttributesW. Please report this issue."); - DetourTransactionAbort(); - return 1; - } - - let result = DetourAttach(&raw mut ORIGINAL_CREATE_FILE_W, create_file_w as _); - - if result != 0 { - error_hooking_msg!("Failed to hook CreateFileW. Please report this issue."); - DetourTransactionAbort(); - return 1; - } - - let result = DetourAttach(&raw mut ORIGINAL_CREATE_PROCESS_W, create_process_w as _); - - if result != 0 { - error_hooking_msg!("Failed to hook CreateProcessW. Please report this issue on GitHub."); - DetourTransactionAbort(); - return 1; - } - - DetourTransactionCommit(); - - 1 -} - -unsafe extern "C" fn get_file_attributes_w(lp_file_name: LPCWSTR) -> DWORD { - let file_name = U16CString::from_ptr_str(lp_file_name).to_string().unwrap(); - - let get_file_attributes_w: extern "C" fn(LPCWSTR) -> DWORD = - std::mem::transmute(ORIGINAL_GET_FILE_ATTRIBUTES_W); - - if file_name.contains("resources\\_app.asar") { - let redirect_to = file_name.replace("\\_app.asar", "\\app.asar"); - let redirect_to_c = std::ffi::CString::new(redirect_to.as_str()).unwrap(); - let redirect_to = U16CString::from_str(redirect_to_c.to_str().unwrap()).unwrap(); - - return get_file_attributes_w(redirect_to.as_ptr()); - } - - if file_name.contains("resources\\app.asar") { - let asar_path_cstr = std::ffi::CString::new(MODLOADER_ASAR_PATH.as_str()).unwrap(); - let asar_path = U16CString::from_str(asar_path_cstr.to_str().unwrap()).unwrap(); - - return get_file_attributes_w(asar_path.as_ptr()); - } - - get_file_attributes_w(lp_file_name) -} - -unsafe extern "C" fn create_file_w( - lp_file_name: LPCWSTR, - dw_desired_access: DWORD, - dw_share_mode: DWORD, - lp_security_attributes: LPSECURITY_ATTRIBUTES, - dw_creation_disposition: DWORD, - dw_flags_and_attributes: DWORD, - h_template_file: HANDLE, -) -> HANDLE { - let file_name = U16CString::from_ptr_str(lp_file_name).to_string().unwrap(); - - let create_file_w: extern "C" fn( - lp_file_name: LPCWSTR, - dw_desired_access: DWORD, - dw_share_mode: DWORD, - lp_security_attributes: LPSECURITY_ATTRIBUTES, - dw_creation_disposition: DWORD, - dw_flags_and_attributes: DWORD, - h_template_file: HANDLE, - ) -> HANDLE = std::mem::transmute(ORIGINAL_CREATE_FILE_W); - - if file_name.contains("resources\\_app.asar") { - let redirect_to = file_name.replace("\\_app.asar", "\\app.asar"); - let redirect_to_c = std::ffi::CString::new(redirect_to.as_str()).unwrap(); - let redirect_to = U16CString::from_str(redirect_to_c.to_str().unwrap()).unwrap(); - - return create_file_w( - redirect_to.as_ptr(), - dw_desired_access, - dw_share_mode, - lp_security_attributes, - dw_creation_disposition, - dw_flags_and_attributes, - h_template_file, - ); - } - - if file_name.contains("resources\\app.asar") { - let asar_path_cstr = std::ffi::CString::new(MODLOADER_ASAR_PATH.as_str()).unwrap(); - let asar_path = U16CString::from_str(asar_path_cstr.to_str().unwrap()).unwrap(); - - return create_file_w( - asar_path.as_ptr(), - dw_desired_access, - dw_share_mode, - lp_security_attributes, - dw_creation_disposition, - dw_flags_and_attributes, - h_template_file, - ); - } - - create_file_w( - lp_file_name, - dw_desired_access, - dw_share_mode, - lp_security_attributes, - dw_creation_disposition, - dw_flags_and_attributes, - h_template_file, - ) -} - -type FnCreateProcessW = unsafe extern "C" fn( - lp_application_name: LPCWSTR, - lp_command_line: LPWSTR, - lp_process_attributes: LPSECURITY_ATTRIBUTES, - lp_thread_attributes: LPSECURITY_ATTRIBUTES, - b_inherit_handles: BOOL, - dw_creation_flags: DWORD, - lp_environment: LPVOID, - lp_current_directory: LPCWSTR, - lp_startup_info: LPSTARTUPINFOW, - lp_process_information: LPPROCESS_INFORMATION, -) -> BOOL; - -unsafe extern "C" fn create_process_w( - lp_application_name: LPCWSTR, - lp_command_line: LPWSTR, - lp_process_attributes: LPSECURITY_ATTRIBUTES, - lp_thread_attributes: LPSECURITY_ATTRIBUTES, - b_inherit_handles: BOOL, - dw_creation_flags: DWORD, - lp_environment: LPVOID, - lp_current_directory: LPCWSTR, - lp_startup_info: LPSTARTUPINFOW, - lp_process_information: LPPROCESS_INFORMATION, -) -> BOOL { - let create_process_w: FnCreateProcessW = std::mem::transmute(ORIGINAL_CREATE_PROCESS_W); - - let command_line = U16CString::from_ptr_str(lp_command_line) - .to_string() - .unwrap(); - - if !command_line.contains("--type=renderer") { - return create_process_w( - lp_application_name, - lp_command_line, - lp_process_attributes, - lp_thread_attributes, - b_inherit_handles, - dw_creation_flags, - lp_environment, - lp_current_directory, - lp_startup_info, - lp_process_information, - ); - } - - let dll_path = CString::from_str(&MODLOADER_DLL_PATH).unwrap(); - - #[allow( - clippy::missing_transmute_annotations, - reason = "Excessive boilerplate" - )] - let success = DetourCreateProcessWithDllW( - lp_application_name, - lp_command_line, - lp_process_attributes as _, - lp_thread_attributes as _, - b_inherit_handles, - dw_creation_flags, - lp_environment as _, - lp_current_directory, - lp_startup_info as _, - lp_process_information as _, - dll_path.as_ptr(), - Some(std::mem::transmute(ORIGINAL_CREATE_PROCESS_W)), - ); - - if success != 1 { - eprintln!("[Discord Modloader] Failed to create process"); - return success; - } - - ResumeThread((*lp_process_information).hThread as _); - - success -} diff --git a/crates/modloader-core/Cargo.toml b/crates/modloader-core/Cargo.toml new file mode 100644 index 0000000..0e24798 --- /dev/null +++ b/crates/modloader-core/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "modloader-core" +version = "0.2.0-beta.1" +edition = "2021" + +[dependencies] +dialog = "0.3.0" +dirs = "6.0.0" +flate2 = "1.0.35" +octocrab = "0.43.0" +serde = { version = "1.0.217", features = ["derive"] } +electron-hook = {version = "0.2.0-beta.4", features = ["self-executable"] } +serde_json = "1.0.137" +strum = { version = "0.26.3", features = ["derive"] } +sysinfo = { version = "0.33.1", default-features = false, features = ["system", "user"] } +tar = "0.4.43" +toml = "0.8.19" +ureq = { version = "3.0.1", features = ["json"] } +zip = "2.2.2" diff --git a/crates/libdiscord-modloader/src/asar/custom_profile.js b/crates/modloader-core/src/asar/custom_profile.js similarity index 100% rename from crates/libdiscord-modloader/src/asar/custom_profile.js rename to crates/modloader-core/src/asar/custom_profile.js diff --git a/crates/libdiscord-modloader/src/asar/index.js b/crates/modloader-core/src/asar/index.js similarity index 100% rename from crates/libdiscord-modloader/src/asar/index.js rename to crates/modloader-core/src/asar/index.js diff --git a/crates/libdiscord-modloader/src/asar/package.json b/crates/modloader-core/src/asar/package.json similarity index 100% rename from crates/libdiscord-modloader/src/asar/package.json rename to crates/modloader-core/src/asar/package.json diff --git a/crates/libdiscord-modloader/src/asar/require.js b/crates/modloader-core/src/asar/require.js similarity index 100% rename from crates/libdiscord-modloader/src/asar/require.js rename to crates/modloader-core/src/asar/require.js diff --git a/crates/modloader-core/src/cache.rs b/crates/modloader-core/src/cache.rs new file mode 100644 index 0000000..3c17135 --- /dev/null +++ b/crates/modloader-core/src/cache.rs @@ -0,0 +1,93 @@ +use crate::{config, paths, updater}; + +pub fn create_instance_cache( + cfg: &crate::config::Config, + profile_id: &str, + instance_id: &str, + force_update: bool, +) -> Result { + static ASAR_CUSTOM_PROFILE_JS: &str = include_str!("./asar/custom_profile.js"); + + let profile = cfg + .profiles + .get(profile_id) + .unwrap_or_else(|| panic!("Failed to find profile '{}'.", profile_id)); + + let instance = profile + .instances + .get(instance_id) + .unwrap_or_else(|| panic!("Failed to find instance '{}'.", instance_id)); + + let r#mod = cfg + .mods + .get(&instance.mod_id) + .unwrap_or_else(|| panic!("Failed to find mod '{}'.", instance.mod_id)) + .to_owned(); + + // TODO: Make this more robust + if let Some(ref updater) = r#mod.updater { + let _ = updater::update(updater, force_update); + } + + let asar_cache_path = paths::cache_asar_path(profile_id, instance_id, &instance.mod_id); + + paths::ensure_dir(asar_cache_path.parent().unwrap().to_path_buf()); + + let profile_dir = if !profile.profile.use_default_profile { + let profile_dir = paths::ensure_dir(paths::data_profiles_dir().join(profile_id)); + let profile_dir = profile_dir.to_str().unwrap().replace("\\", "\\\\"); + Some(profile_dir) + } else { + None + }; + + // If path is not provided, try to use the updater instead. + let mod_path = if let Some(path) = r#mod.path { + path + } else if let Some(updater) = r#mod.updater { + paths::cache_mod_files_dir() + .join(&updater.github_org) + .join(&updater.github_repo) + .to_string_lossy() + .to_string() + } else { + panic!("Mod '{}' does not have a path or updater.", r#mod.name); + }; + + let mod_entrypoint = std::path::Path::new(&mod_path).join(&r#mod.entrypoint); + let mod_entrypoint = mod_entrypoint.to_str().unwrap().replace("\\", "\\\\"); + + let mut custom_loader = String::from("console.log(\"Launching with Discord Modloader.\");\n"); + + // If using a custom profile directory, insert this. + if profile_dir.is_some() { + custom_loader.push_str(ASAR_CUSTOM_PROFILE_JS); + } + + let loader = if let Some(ref loader) = r#mod.loader { + [ + loader.prefix.clone().unwrap_or_default(), + loader + .require + .clone() + .unwrap_or(config::ModLoader::default_require().unwrap()), + loader.suffix.clone().unwrap_or_default(), + ] + .join("\n") + } else { + config::ModLoader::default_require().unwrap() + }; + + custom_loader.push_str(&loader); + + let mut asar = electron_hook::asar::Asar::new() + .with_id(&instance.mod_id) + .with_template(&custom_loader) + .with_mod_entrypoint(&mod_entrypoint); + + if let Some(profile_dir) = profile_dir { + asar = asar.with_profile_dir(&profile_dir); + } + + asar.create() +} diff --git a/crates/libdiscord-modloader/src/config.rs b/crates/modloader-core/src/config.rs similarity index 52% rename from crates/libdiscord-modloader/src/config.rs rename to crates/modloader-core/src/config.rs index 3a2f599..1889f09 100644 --- a/crates/libdiscord-modloader/src/config.rs +++ b/crates/modloader-core/src/config.rs @@ -11,7 +11,7 @@ pub enum ConfigFile { Mod(Mod), } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, Serialize, Deserialize)] pub struct Config { pub profiles: BTreeMap, pub mods: BTreeMap, @@ -19,71 +19,115 @@ pub struct Config { } impl Config { - pub fn init() -> Config { - let config_dir = ensure_dir(paths::configs_dir()); + pub fn add_profile( + &mut self, + profile_id: &str, + profile: ProfileConfig, + ) -> Option { + self.profiles.insert(profile_id.to_string(), profile) + } + + pub fn remove_profile(&mut self, profile_id: &str) -> Option { + self.profiles.remove(profile_id) + } + + pub fn add_mod(&mut self, mod_id: &str, r#mod: Mod) -> Option { + self.mods.insert(mod_id.to_string(), r#mod) + } + + pub fn remove_mod(&mut self, mod_id: &str) -> Option { + self.mods.remove(mod_id) + } + + pub fn sync(&mut self) { + self.sync_profiles(); + self.sync_mods(); + self.sync_settings(); + } + + pub fn sync_profiles(&mut self) { let profiles_config_dir = ensure_dir(paths::config_profile_dir()); - let mods_config_dir = ensure_dir(paths::config_mods_dir()); - let settings_file = config_dir.join("settings.toml"); - let settings = if settings_file.exists() { - if let Ok(settings) = std::fs::read_to_string(&settings_file) { - toml::from_str::(&settings).unwrap_or_default() - } else { - eprintln!("Failed to read settings file: {:?}", settings_file); - Settings::default() + let profile_files = paths::read_dir(&profiles_config_dir); + for profile in profile_files + .iter() + .filter(|p| p.path().to_string_lossy().ends_with(".toml")) + { + let id = profile.file_name().to_string_lossy().replace(".toml", ""); + + match std::fs::read_to_string(profile.path()) { + Ok(profile_content) => match toml::from_str::(&profile_content) { + Ok(profile) => { + self.profiles.insert(id, profile); + } + Err(_) => eprintln!("Failed to parse profile config: {:?}", profile), + }, + Err(_) => eprintln!("Failed to read profile config: {:?}", profile), } - } else { - let settings = Settings::default(); - let settings_str = toml::to_string(&settings).unwrap(); - std::fs::write(settings_file, settings_str).unwrap(); - settings - }; + } - let mut profile_configs = BTreeMap::new(); + self.profiles.retain(|prof_id, _| { + profile_files.iter().any(|file_name| { + file_name.file_name().to_string_lossy().replace(".toml", "") == *prof_id + }) + }); + } - for profile in paths::read_dir(&profiles_config_dir) { - if !profile.path().to_string_lossy().ends_with(".toml") { - continue; - } - let id = profile.file_name().to_string_lossy().replace(".toml", ""); + pub fn sync_mods(&mut self) { + let mods_config_dir = ensure_dir(paths::config_mods_dir()); - let Ok(profile) = std::fs::read_to_string(profile.path()) else { - eprintln!("Failed to read profile config: {:?}", profile); - continue; - }; - let Ok(profile) = toml::from_str::(&profile) else { - eprintln!("Failed to parse profile config: {:?}", profile); - continue; - }; + let mod_files = paths::read_dir(&mods_config_dir); + for mod_ in mod_files + .iter() + .filter(|m| m.path().to_string_lossy().ends_with(".toml")) + { + let id = mod_.file_name().to_string_lossy().replace(".toml", ""); - profile_configs.insert(id, profile); + match std::fs::read_to_string(mod_.path()) { + Ok(mod_content) => match toml::from_str::(&mod_content) { + Ok(mod_) => { + self.mods.insert(id, mod_.r#mod); + } + Err(_) => eprintln!("Failed to parse mod config: {:?}", mod_), + }, + Err(_) => eprintln!("Failed to read mod config: {:?}", mod_), + } } - let mut mod_configs = BTreeMap::new(); + self.mods.retain(|mod_id, _| { + mod_files.iter().any(|mod_file| { + mod_file.file_name().to_string_lossy().replace(".toml", "") == *mod_id + }) + }); + } - for mod_ in paths::read_dir(&mods_config_dir) { - if !mod_.path().to_string_lossy().ends_with(".toml") { - continue; - } - let id = mod_.file_name().to_string_lossy().replace(".toml", ""); + pub fn sync_settings(&mut self) { + let config_dir = ensure_dir(paths::configs_dir()); + let settings_file = config_dir.join("settings.toml"); - let Ok(mod_) = std::fs::read_to_string(mod_.path()) else { - eprintln!("Failed to read mod config: {:?}", mod_); - continue; - }; - let Ok(mod_) = toml::from_str::(&mod_) else { - eprintln!("Failed to read parse config: {:?}", mod_); - continue; - }; + self.settings = if let Ok(settings) = std::fs::read_to_string(&settings_file) { + toml::from_str::(&settings).unwrap_or_default() + } else { + Settings::default() + }; + } - mod_configs.insert(id, mod_.r#mod); - } + pub fn init() -> Config { + let mut config = Config::default(); - Config { - profiles: profile_configs, - mods: mod_configs, - settings, - } + let config_dir = ensure_dir(paths::configs_dir()); + let settings_file = config_dir.join("settings.toml"); + + config.settings = if let Ok(settings) = std::fs::read_to_string(&settings_file) { + toml::from_str::(&settings).unwrap_or_default() + } else { + Settings::default() + }; + + config.sync_mods(); + config.sync_profiles(); + + config } } @@ -102,6 +146,12 @@ pub struct Instance { /// /// Internal mods (ones with build-in updaters) will be prefixed with "Internal::" pub mod_id: String, + + /// Whether the profile has been starred/favourited. + /// + /// Starred profiles will be shown on the homepage of the GUI. + #[serde(default)] + pub starred: bool, } #[derive(Debug, Default, Serialize, Deserialize, Clone)] @@ -109,6 +159,19 @@ pub struct ModConfig { pub r#mod: Mod, } +impl ModConfig { + pub fn save(&self, mod_id: &str) { + let mods_config_dir = ensure_dir(paths::config_mods_dir()); + let mod_file = mods_config_dir.join(format!("{mod_id}.toml")); + + if let Ok(mod_content) = toml::to_string_pretty(self) { + if let Err(e) = std::fs::write(mod_file, mod_content) { + eprintln!("Failed to write mod config: {:?}", e); + } + } + } +} + #[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] pub struct Mod { /// The display name of the mod. (e.g. "Vencord", "Moonlight", "BetterDiscord") @@ -185,11 +248,6 @@ impl ModLoader { } } -// [profile] -// name = "test" -// [[instance]] -// ... - #[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq)] pub struct ProfileConfig { pub profile: Profile, @@ -200,6 +258,19 @@ pub struct ProfileConfig { pub discord: Discord, } +impl ProfileConfig { + pub fn save(&self, profile_id: &str) { + let profiles_config_dir = ensure_dir(paths::config_profile_dir()); + let profile_file = profiles_config_dir.join(format!("{profile_id}.toml")); + + if let Ok(profile_content) = toml::to_string_pretty(self) { + if let Err(e) = std::fs::write(profile_file, profile_content) { + eprintln!("Failed to write profile config: {:?}", e); + } + } + } +} + #[derive(Debug, Default, Serialize, Deserialize, Clone, PartialEq, Eq)] pub struct Profile { pub name: String, diff --git a/crates/modloader-core/src/discord.rs b/crates/modloader-core/src/discord.rs new file mode 100644 index 0000000..d1315ca --- /dev/null +++ b/crates/modloader-core/src/discord.rs @@ -0,0 +1,57 @@ +/// Returns the path to the Discord executable based on the Discord folder. +/// +/// e.g. "C:\Users\User\AppData\Local\discordptb" -> "C:\Users\User\AppData\Local\discordptb\app-1.0.9023\Discord.exe" +#[cfg(target_os = "windows")] +pub fn get_discord_exe(path: &str) -> Result> { + let mut new_path = std::path::PathBuf::from(path); + + let new_path_executable = new_path.clone(); + let executable_name = new_path_executable + .file_name() + .and_then(|name| name.to_str()) + .ok_or("Failed to read executable name")?; + + let versions: Vec<_> = new_path + .read_dir()? + .filter_map(|p| { + let file_name = p.ok()?.file_name(); + let file_name_str = file_name.to_str()?; + if file_name_str.starts_with("app-") { + Some(file_name_str.to_string()) + } else { + None + } + }) + .collect(); + + if versions.is_empty() { + return Err("No discord versions found".into()); + } + + // In the format of: app-1.0.9023 + let mut sorted: Vec<(String, u32)> = versions + .into_iter() + .filter_map(|v| { + let mut split = v.split('-'); + let version = split.nth(1)?; + let version = version.replace('.', ""); + let version = version.parse::().ok()?; + Some((v, version)) + }) + .collect(); + + sorted.sort_by(|(_, a), (_, b)| a.cmp(b)); + + let Some(latest_version) = sorted.last().cloned() else { + return Err("Failed to get latest version".into()); + }; + + new_path.push(latest_version.0); + new_path.push(format!("{}.exe", executable_name)); + + if !new_path.exists() { + return Err("Discord.exe not found".into()); + } + + Ok(new_path) +} diff --git a/crates/modloader-core/src/lib.rs b/crates/modloader-core/src/lib.rs new file mode 100644 index 0000000..50b50b2 --- /dev/null +++ b/crates/modloader-core/src/lib.rs @@ -0,0 +1,6 @@ +pub mod cache; +pub mod config; +pub mod discord; +pub mod paths; +pub mod updater; +pub mod utils; diff --git a/crates/libdiscord-modloader/src/paths.rs b/crates/modloader-core/src/paths.rs similarity index 100% rename from crates/libdiscord-modloader/src/paths.rs rename to crates/modloader-core/src/paths.rs diff --git a/crates/libdiscord-modloader/src/updater.rs b/crates/modloader-core/src/updater.rs similarity index 78% rename from crates/libdiscord-modloader/src/updater.rs rename to crates/modloader-core/src/updater.rs index 7439736..7a90d00 100644 --- a/crates/libdiscord-modloader/src/updater.rs +++ b/crates/modloader-core/src/updater.rs @@ -1,3 +1,5 @@ +use dialog::{Choice, DialogBox}; + pub fn update(config: &crate::config::ModUpdater, force: bool) -> Result<(), String> { use octocrab::models::repos::Release; @@ -29,7 +31,8 @@ pub fn update(config: &crate::config::ModUpdater, force: bool) -> Result<(), Str let release_info: Release = ureq::get(&release_url) .call() .map_err(|e| format!("Failed to get release: {}", e))? - .into_json() + .body_mut() + .read_json() .map_err(|e| format!("Failed to parse release: {}", e))?; // If the version IDs are the same, and force is not enabled, then return early. @@ -49,6 +52,23 @@ pub fn update(config: &crate::config::ModUpdater, force: bool) -> Result<(), Str } } + if !force && config.ask_before_update { + if let Ok(resp) = dialog::Question::new(format!( + "An update is available for the mod {}/{}. Would you like to update?", + config.github_org, config.github_repo + )) + .title("Update Available!") + .show() + { + if let Choice::Yes = resp { + // Continue + } else { + println!("Update cancelled."); + return Ok(()); + } + } + } + for dist_file in &config.dist_file_names { // TODO: Should the download URL be pulled from the release assets? // Will be a bit annoying if there are multiple assets though. @@ -57,17 +77,19 @@ pub fn update(config: &crate::config::ModUpdater, force: bool) -> Result<(), Str config.github_org, config.github_repo, release_info.tag_name, &dist_file ); - let mut reader = ureq::get(&download_url) + let file_data: Vec = ureq::get(&download_url) .call() .map_err(|e| format!("Failed to download release tarball: {}", e))? - .into_reader(); + .body_mut() + .read_to_vec() + .map_err(|e| format!("Failed to download release tarball: {}", e))?; match config.dist_file_type { crate::config::DistFileType::TarGz => { use flate2::read::GzDecoder; use tar::Archive; - let tar = GzDecoder::new(reader); + let tar = GzDecoder::new(file_data.as_slice()); let mut archive = Archive::new(tar); // TODO: If files are already present, should they be deleted? @@ -80,12 +102,7 @@ pub fn update(config: &crate::config::ModUpdater, force: bool) -> Result<(), Str use std::io::Cursor; use zip::read::ZipArchive; - let mut bytes = Vec::new(); - reader - .read_to_end(&mut bytes) - .map_err(|e| format!("Failed to read zip file: {}", e))?; - - let reader = Cursor::new(bytes.as_slice()); + let reader = Cursor::new(file_data.as_slice()); let mut zip = ZipArchive::new(reader) .map_err(|e| format!("Failed to read zip file: {}", e))?; @@ -94,10 +111,7 @@ pub fn update(config: &crate::config::ModUpdater, force: bool) -> Result<(), Str .map_err(|e| format!("Failed to extract zip file: {}", e))?; } crate::config::DistFileType::Raw => { - let mut file = std::fs::File::create(output_dir.join(dist_file)) - .map_err(|e| format!("Failed to create raw file: {}", e))?; - - std::io::copy(&mut reader, &mut file) + std::fs::write(output_dir.join(dist_file), file_data.as_slice()) .map_err(|e| format!("Failed to write raw file: {}", e))?; } } @@ -110,17 +124,16 @@ pub fn update(config: &crate::config::ModUpdater, force: bool) -> Result<(), Str .map_err(|e| format!("Failed to write version to file: {}", e))?; if let Some(ref icon_url) = config.icon_url { - let mut icon_file_bytes = Vec::new(); - ureq::get(icon_url) + let icon_file_bytes = ureq::get(icon_url) .call() .map_err(|e| format!("Failed to download mod icon: {}", e))? - .into_reader() - .read_to_end(&mut icon_file_bytes) + .body_mut() + .read_to_vec() .map_err(|e| format!("Failed to read mod icon: {}", e))?; let icon_file_path = metadata_dir.join("icon.png"); - std::fs::write(&icon_file_path, &mut icon_file_bytes) + std::fs::write(&icon_file_path, icon_file_bytes.as_slice()) .map_err(|e| format!("Failed to write mod icon: {}", e))?; } diff --git a/crates/libdiscord-modloader/src/utils.rs b/crates/modloader-core/src/utils.rs similarity index 100% rename from crates/libdiscord-modloader/src/utils.rs rename to crates/modloader-core/src/utils.rs diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..fc073c4 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,207 @@ +// Since we're making a shared object, to make it executable, +// we need to create the .interp section. +electron_hook::make_shared_executable!(); + +use clap::Parser; + +use modloader_core::config; + +// Include the electron_hook shared library into this executable's exports. +pub use electron_hook::*; + +#[derive(clap::Parser, Debug)] +struct Args { + #[clap(short, long)] + pub profile: Option, + + #[clap(short, long)] + pub instance: Option, + + #[clap(allow_hyphen_values = true, last = true)] + pub launch_args: Vec, + + #[clap(short, long, default_value = "false")] + pub force_update: bool, +} + +#[cfg(target_os = "macos")] +pub fn main() { + println!("macOS is not supported yet. Feel free to submit a PR."); + println!("https://github.com/MeguminSama/Discord-Modloader"); +} + +#[cfg(not(target_os = "macos"))] +#[no_mangle] +fn main() { + println!("test"); + // TODO: Check if args are provided. If yes, don't load GUI. + let args: Args = Args::parse(); + + if let (Some(profile_id), Some(instance_id)) = (args.profile, args.instance) { + // When spawned from the GUI, the process is a child of the GUI process. + // We need to detach it from the GUI process to prevent it from being killed when the GUI is closed. + #[cfg(target_os = "linux")] + unsafe { + libc::setsid() + }; + + let config = config::Config::init(); + + unsafe { + load_profile( + &config, + &profile_id, + &instance_id, + args.launch_args, + args.force_update, + ) + }; + } else { + gui::start_gui(); + } +} + +#[cfg(target_os = "linux")] +unsafe fn load_profile( + config: &config::Config, + profile_id: &str, + instance_id: &str, + args: Vec, + force_update: bool, +) { + use modloader_core::{cache::create_instance_cache, paths}; + + let profile = config + .profiles + .get(profile_id) + .unwrap_or_else(|| panic!("Failed to find profile '{}'.", profile_id)); + + let asar_path = create_instance_cache(config, profile_id, instance_id, force_update).unwrap(); + let asar_path = asar_path.to_str().unwrap(); + + let profile_directory = profile.profile.use_default_profile.then(|| { + paths::data_profiles_dir() + .join(profile_id) + .to_str() + .unwrap() + .to_string() + }); + + let exit_code = electron_hook::launch_with_self( + &profile.discord.executable, + asar_path, + args, + profile_directory, + true, + ); + + dbg!(&exit_code); + + // let working_dir = if profile.profile.use_default_profile { + // std::path::Path::new(&profile.discord.executable) + // .parent() + // .unwrap() + // .to_str() + // .unwrap() + // .to_string() + // } else { + // let profile_dir = paths::ensure_dir(paths::data_profiles_dir().join(profile_id)); + // profile_dir.to_str().unwrap().to_string() + // }; + + // // Thanks to linker magic (I went through hell to get this working), the executable can act as a shared-object in LD_PRELOAD + // let shared_object = std::env::current_exe().unwrap(); + + // let mut target = std::process::Command::new(&profile.discord.executable) + // .current_dir(working_dir) + // .env("LD_PRELOAD", shared_object) + // .env("MODLOADER_ASAR_PATH", asar_path) + // .args(args) + // .spawn() + // .expect("Failed to launch instance."); + + // target + // .wait() + // .expect("Failed to wait for instance to finish."); +} + +#[cfg(target_os = "windows")] +unsafe fn load_profile( + config: &config::Config, + instance: &config::Instance, + args: Vec, + force_update: bool, +) { + // TODO: Implement args on windows + use detours_sys::{DetourCreateProcessWithDllExA, _PROCESS_INFORMATION, _STARTUPINFOA}; + use libdiscordmodloader::discord::get_discord_exe; + use winapi::um::{ + handleapi::CloseHandle, + processthreadsapi::ResumeThread, + winbase::CREATE_SUSPENDED, + winuser::{MessageBoxA, MB_ICONERROR}, + }; + + println!("Loading Instance: {}", instance.name); + if let Some(ref profile_path) = instance.profile_path { + println!("On profile: {}", profile_path) + } + + let asar_path = init_current_cache(instance, config.mods.get(&instance.r#mod).unwrap()); + + let current_exe = std::env::current_exe().unwrap(); + let lp_current_directory = current_exe.parent().unwrap().to_str().unwrap(); + let dll = current_exe.with_file_name("libdiscordmodloader.dll"); + + if !dll.exists() { + MessageBoxA( + std::ptr::null_mut(), + c"libdiscordmodloader.dll not found.\nPlease verify your installation.".as_ptr(), + c"Error loading modloader".as_ptr(), + MB_ICONERROR, + ); + panic!("libdiscordmodloader.dll not found."); + } + + let discord_exe = get_discord_exe(&instance.path).expect("Failed to get Discord executable."); + + std::env::set_var("MODLOADER_ASAR_PATH", asar_path); + std::env::set_var("MODLOADER_DLL_PATH", &dll); + + let dll = std::ffi::CString::new(dll.to_str().unwrap()).unwrap(); + let lp_current_directory = std::ffi::CString::new(lp_current_directory).unwrap(); + + let mut process_info: _PROCESS_INFORMATION = unsafe { std::mem::zeroed() }; + let mut startup_info: _STARTUPINFOA = unsafe { std::mem::zeroed() }; + let discord_exe = std::ffi::CString::new(discord_exe.to_str().unwrap()).unwrap(); + + let result = DetourCreateProcessWithDllExA( + std::ptr::null_mut(), + discord_exe.as_ptr() as *mut i8, + std::ptr::null_mut(), + std::ptr::null_mut(), + 0, + CREATE_SUSPENDED, + std::ptr::null_mut(), + lp_current_directory.as_ptr(), + &raw mut startup_info, + &raw mut process_info, + dll.as_ptr(), + None, + ); + + if result == 0 { + MessageBoxA( + std::ptr::null_mut(), + c"Failed to inject DLL into Discord".as_ptr(), + c"Error launching Discord".as_ptr(), + MB_ICONERROR, + ); + panic!("Failed to create process with DLL."); + } + + ResumeThread(process_info.hThread); + + CloseHandle(process_info.hProcess); + CloseHandle(process_info.hThread); +} diff --git a/src/main.rs b/src/main.rs index a775889..1992cb4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,189 +1,2 @@ -use clap::Parser; - -use discord_modloader::{config, init_current_cache}; - -#[derive(clap::Parser, Debug)] -struct Args { - #[clap(short, long)] - pub profile: Option, - - #[clap(short, long)] - pub instance: Option, - - #[clap(allow_hyphen_values = true, last = true)] - pub launch_args: Vec, - - #[clap(short, long, default_value = "false")] - pub force_update: bool, -} - -#[cfg(target_os = "macos")] -fn main() { - println!("macOS is not supported yet. Feel free to submit a PR."); - println!("https://github.com/MeguminSama/Discord-Modloader"); -} - -#[cfg(not(target_os = "macos"))] -fn main() { - // TODO: Check if args are provided. If yes, don't load GUI. - let args: Args = Args::parse(); - - if let (Some(profile_id), Some(instance_id)) = (args.profile, args.instance) { - // When spawned from the GUI, the process is a child of the GUI process. - // We need to detach it from the GUI process to prevent it from being killed when the GUI is closed. - #[cfg(target_os = "linux")] - unsafe { - libc::setsid() - }; - - let config = config::Config::init(); - - unsafe { - load_profile( - &config, - &profile_id, - &instance_id, - args.launch_args, - args.force_update, - ) - }; - } else { - gui_new::start_gui(); - } -} - -#[cfg(target_os = "linux")] -unsafe fn load_profile( - config: &config::Config, - profile_id: &str, - instance_id: &str, - args: Vec, - force_update: bool, -) { - use discord_modloader::paths::{self, ensure_dir}; - - let profile = config - .profiles - .get(profile_id) - .unwrap_or_else(|| panic!("Failed to find profile '{}'.", profile_id)); - - // Try to use the local instance of libdiscord_modloader.so first. - let current_exe = std::env::current_exe().unwrap(); - let mut shared_object = current_exe.with_file_name("libdiscord_modloader.so"); - - // If it doesn't exist, try to use the system-wide one. - if !shared_object.exists() { - let lib_path = std::path::PathBuf::from("/usr/lib/discord-modloader"); - shared_object = lib_path.join("libdiscord_modloader.so"); - if !shared_object.exists() { - panic!("libdiscord_modloader.so not found. Please report this on GitHub."); - } - } - - let asar_path = init_current_cache(config, profile_id, instance_id, force_update); - - let working_dir = if profile.profile.use_default_profile { - std::path::Path::new(&profile.discord.executable) - .parent() - .unwrap() - .to_str() - .unwrap() - .to_string() - } else { - let profile_dir = ensure_dir(paths::data_profiles_dir().join(profile_id)); - profile_dir.to_str().unwrap().to_string() - }; - - let mut target = std::process::Command::new(&profile.discord.executable) - .current_dir(working_dir) - .env("LD_PRELOAD", shared_object.to_str().unwrap()) - .env("MODLOADER_ASAR_PATH", asar_path) - .args(args) - .spawn() - .expect("Failed to launch instance."); - - target - .wait() - .expect("Failed to wait for instance to finish."); -} - -#[cfg(target_os = "windows")] -unsafe fn load_profile( - config: &config::Config, - instance: &config::Instance, - args: Vec, - force_update: bool, -) { - // TODO: Implement args on windows - use detours_sys::{DetourCreateProcessWithDllExA, _PROCESS_INFORMATION, _STARTUPINFOA}; - use libdiscordmodloader::discord::get_discord_exe; - use winapi::um::{ - handleapi::CloseHandle, - processthreadsapi::ResumeThread, - winbase::CREATE_SUSPENDED, - winuser::{MessageBoxA, MB_ICONERROR}, - }; - - println!("Loading Instance: {}", instance.name); - if let Some(ref profile_path) = instance.profile_path { - println!("On profile: {}", profile_path) - } - - let asar_path = init_current_cache(instance, config.mods.get(&instance.r#mod).unwrap()); - - let current_exe = std::env::current_exe().unwrap(); - let lp_current_directory = current_exe.parent().unwrap().to_str().unwrap(); - let dll = current_exe.with_file_name("libdiscordmodloader.dll"); - - if !dll.exists() { - MessageBoxA( - std::ptr::null_mut(), - c"libdiscordmodloader.dll not found.\nPlease verify your installation.".as_ptr(), - c"Error loading modloader".as_ptr(), - MB_ICONERROR, - ); - panic!("libdiscordmodloader.dll not found."); - } - - let discord_exe = get_discord_exe(&instance.path).expect("Failed to get Discord executable."); - - std::env::set_var("MODLOADER_ASAR_PATH", asar_path); - std::env::set_var("MODLOADER_DLL_PATH", &dll); - - let dll = std::ffi::CString::new(dll.to_str().unwrap()).unwrap(); - let lp_current_directory = std::ffi::CString::new(lp_current_directory).unwrap(); - - let mut process_info: _PROCESS_INFORMATION = unsafe { std::mem::zeroed() }; - let mut startup_info: _STARTUPINFOA = unsafe { std::mem::zeroed() }; - let discord_exe = std::ffi::CString::new(discord_exe.to_str().unwrap()).unwrap(); - - let result = DetourCreateProcessWithDllExA( - std::ptr::null_mut(), - discord_exe.as_ptr() as *mut i8, - std::ptr::null_mut(), - std::ptr::null_mut(), - 0, - CREATE_SUSPENDED, - std::ptr::null_mut(), - lp_current_directory.as_ptr(), - &raw mut startup_info, - &raw mut process_info, - dll.as_ptr(), - None, - ); - - if result == 0 { - MessageBoxA( - std::ptr::null_mut(), - c"Failed to inject DLL into Discord".as_ptr(), - c"Error launching Discord".as_ptr(), - MB_ICONERROR, - ); - panic!("Failed to create process with DLL."); - } - - ResumeThread(process_info.hThread); - - CloseHandle(process_info.hProcess); - CloseHandle(process_info.hThread); -} +#![no_main] +pub use discord_modloader::*;

EqV_uYLDNY4^?@ssGwl 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