├── .github
└── workflows
│ └── build.yml
├── .gitignore
├── Cargo.lock
├── Cargo.toml
├── LICENSE
├── README.md
├── build.rs
└── src
└── main.rs
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: Build Test
2 |
3 | on:
4 | workflow_dispatch:
5 | inputs:
6 | name:
7 | description: 'Log level'
8 | required: true
9 | default: 'warning'
10 |
11 | jobs:
12 | test:
13 | name: build project
14 | runs-on: ${{ matrix.os }}
15 | strategy:
16 | matrix:
17 | include:
18 | - os: windows-latest
19 | steps:
20 | - name: Checkout
21 | uses: actions/checkout@master
22 |
23 |
24 | - name: build_windows
25 | run: |
26 | $ENV:RUSTFLAGS='-C target-feature=+crt-static'
27 | rustup target add i686-pc-windows-msvc
28 | cargo build --release --target i686-pc-windows-msvc
29 | shell: pwsh
30 |
31 |
32 | - name: before_windows_upload
33 | run: |
34 | mkdir Release
35 | cp target/i686-pc-windows-msvc/release/llob_install.exe Release/llob_install.exe
36 | shell: pwsh
37 |
38 | - name: Strip and run UPX on executables
39 | uses: crazy-max/ghaction-upx@v3
40 | with:
41 | version: latest
42 | files: |
43 | Release/llob_install.exe
44 |
45 |
46 | - name: upload file1
47 | uses: actions/upload-artifact@v3
48 | with:
49 | name: llob_install.exe
50 | path:
51 | Release/llob_install.exe
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /target
2 |
--------------------------------------------------------------------------------
/Cargo.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Cargo.
2 | # It is not intended for manual editing.
3 | version = 3
4 |
5 | [[package]]
6 | name = "addr2line"
7 | version = "0.22.0"
8 | source = "registry+https://github.com/rust-lang/crates.io-index"
9 | checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
10 | dependencies = [
11 | "gimli",
12 | ]
13 |
14 | [[package]]
15 | name = "adler"
16 | version = "1.0.2"
17 | source = "registry+https://github.com/rust-lang/crates.io-index"
18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
19 |
20 | [[package]]
21 | name = "aes"
22 | version = "0.8.4"
23 | source = "registry+https://github.com/rust-lang/crates.io-index"
24 | checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0"
25 | dependencies = [
26 | "cfg-if",
27 | "cipher",
28 | "cpufeatures",
29 | ]
30 |
31 | [[package]]
32 | name = "aho-corasick"
33 | version = "1.1.3"
34 | source = "registry+https://github.com/rust-lang/crates.io-index"
35 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
36 | dependencies = [
37 | "memchr",
38 | ]
39 |
40 | [[package]]
41 | name = "atomic-waker"
42 | version = "1.1.2"
43 | source = "registry+https://github.com/rust-lang/crates.io-index"
44 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
45 |
46 | [[package]]
47 | name = "autocfg"
48 | version = "1.3.0"
49 | source = "registry+https://github.com/rust-lang/crates.io-index"
50 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
51 |
52 | [[package]]
53 | name = "backtrace"
54 | version = "0.3.73"
55 | source = "registry+https://github.com/rust-lang/crates.io-index"
56 | checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a"
57 | dependencies = [
58 | "addr2line",
59 | "cc",
60 | "cfg-if",
61 | "libc",
62 | "miniz_oxide",
63 | "object",
64 | "rustc-demangle",
65 | ]
66 |
67 | [[package]]
68 | name = "base64"
69 | version = "0.22.1"
70 | source = "registry+https://github.com/rust-lang/crates.io-index"
71 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
72 |
73 | [[package]]
74 | name = "base64ct"
75 | version = "1.6.0"
76 | source = "registry+https://github.com/rust-lang/crates.io-index"
77 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
78 |
79 | [[package]]
80 | name = "bitflags"
81 | version = "1.3.2"
82 | source = "registry+https://github.com/rust-lang/crates.io-index"
83 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
84 |
85 | [[package]]
86 | name = "bitflags"
87 | version = "2.6.0"
88 | source = "registry+https://github.com/rust-lang/crates.io-index"
89 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
90 |
91 | [[package]]
92 | name = "block-buffer"
93 | version = "0.10.4"
94 | source = "registry+https://github.com/rust-lang/crates.io-index"
95 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
96 | dependencies = [
97 | "generic-array",
98 | ]
99 |
100 | [[package]]
101 | name = "bumpalo"
102 | version = "3.16.0"
103 | source = "registry+https://github.com/rust-lang/crates.io-index"
104 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
105 |
106 | [[package]]
107 | name = "byteorder"
108 | version = "1.5.0"
109 | source = "registry+https://github.com/rust-lang/crates.io-index"
110 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
111 |
112 | [[package]]
113 | name = "bytes"
114 | version = "1.6.1"
115 | source = "registry+https://github.com/rust-lang/crates.io-index"
116 | checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952"
117 |
118 | [[package]]
119 | name = "bzip2"
120 | version = "0.4.4"
121 | source = "registry+https://github.com/rust-lang/crates.io-index"
122 | checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8"
123 | dependencies = [
124 | "bzip2-sys",
125 | "libc",
126 | ]
127 |
128 | [[package]]
129 | name = "bzip2-sys"
130 | version = "0.1.11+1.0.8"
131 | source = "registry+https://github.com/rust-lang/crates.io-index"
132 | checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc"
133 | dependencies = [
134 | "cc",
135 | "libc",
136 | "pkg-config",
137 | ]
138 |
139 | [[package]]
140 | name = "cc"
141 | version = "1.1.6"
142 | source = "registry+https://github.com/rust-lang/crates.io-index"
143 | checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f"
144 | dependencies = [
145 | "jobserver",
146 | "libc",
147 | ]
148 |
149 | [[package]]
150 | name = "cfg-if"
151 | version = "1.0.0"
152 | source = "registry+https://github.com/rust-lang/crates.io-index"
153 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
154 |
155 | [[package]]
156 | name = "cipher"
157 | version = "0.4.4"
158 | source = "registry+https://github.com/rust-lang/crates.io-index"
159 | checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
160 | dependencies = [
161 | "crypto-common",
162 | "inout",
163 | ]
164 |
165 | [[package]]
166 | name = "constant_time_eq"
167 | version = "0.1.5"
168 | source = "registry+https://github.com/rust-lang/crates.io-index"
169 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
170 |
171 | [[package]]
172 | name = "core-foundation"
173 | version = "0.9.4"
174 | source = "registry+https://github.com/rust-lang/crates.io-index"
175 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
176 | dependencies = [
177 | "core-foundation-sys",
178 | "libc",
179 | ]
180 |
181 | [[package]]
182 | name = "core-foundation-sys"
183 | version = "0.8.6"
184 | source = "registry+https://github.com/rust-lang/crates.io-index"
185 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
186 |
187 | [[package]]
188 | name = "cpufeatures"
189 | version = "0.2.12"
190 | source = "registry+https://github.com/rust-lang/crates.io-index"
191 | checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
192 | dependencies = [
193 | "libc",
194 | ]
195 |
196 | [[package]]
197 | name = "crc32fast"
198 | version = "1.4.2"
199 | source = "registry+https://github.com/rust-lang/crates.io-index"
200 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
201 | dependencies = [
202 | "cfg-if",
203 | ]
204 |
205 | [[package]]
206 | name = "crossbeam-deque"
207 | version = "0.8.5"
208 | source = "registry+https://github.com/rust-lang/crates.io-index"
209 | checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
210 | dependencies = [
211 | "crossbeam-epoch",
212 | "crossbeam-utils",
213 | ]
214 |
215 | [[package]]
216 | name = "crossbeam-epoch"
217 | version = "0.9.18"
218 | source = "registry+https://github.com/rust-lang/crates.io-index"
219 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
220 | dependencies = [
221 | "crossbeam-utils",
222 | ]
223 |
224 | [[package]]
225 | name = "crossbeam-utils"
226 | version = "0.8.20"
227 | source = "registry+https://github.com/rust-lang/crates.io-index"
228 | checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
229 |
230 | [[package]]
231 | name = "crypto-common"
232 | version = "0.1.6"
233 | source = "registry+https://github.com/rust-lang/crates.io-index"
234 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
235 | dependencies = [
236 | "generic-array",
237 | "typenum",
238 | ]
239 |
240 | [[package]]
241 | name = "deranged"
242 | version = "0.3.11"
243 | source = "registry+https://github.com/rust-lang/crates.io-index"
244 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
245 | dependencies = [
246 | "powerfmt",
247 | ]
248 |
249 | [[package]]
250 | name = "digest"
251 | version = "0.10.7"
252 | source = "registry+https://github.com/rust-lang/crates.io-index"
253 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
254 | dependencies = [
255 | "block-buffer",
256 | "crypto-common",
257 | "subtle",
258 | ]
259 |
260 | [[package]]
261 | name = "either"
262 | version = "1.13.0"
263 | source = "registry+https://github.com/rust-lang/crates.io-index"
264 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
265 |
266 | [[package]]
267 | name = "encoding_rs"
268 | version = "0.8.34"
269 | source = "registry+https://github.com/rust-lang/crates.io-index"
270 | checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59"
271 | dependencies = [
272 | "cfg-if",
273 | ]
274 |
275 | [[package]]
276 | name = "equivalent"
277 | version = "1.0.1"
278 | source = "registry+https://github.com/rust-lang/crates.io-index"
279 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
280 |
281 | [[package]]
282 | name = "errno"
283 | version = "0.3.9"
284 | source = "registry+https://github.com/rust-lang/crates.io-index"
285 | checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
286 | dependencies = [
287 | "libc",
288 | "windows-sys 0.52.0",
289 | ]
290 |
291 | [[package]]
292 | name = "fastrand"
293 | version = "2.1.0"
294 | source = "registry+https://github.com/rust-lang/crates.io-index"
295 | checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
296 |
297 | [[package]]
298 | name = "flate2"
299 | version = "1.0.30"
300 | source = "registry+https://github.com/rust-lang/crates.io-index"
301 | checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae"
302 | dependencies = [
303 | "crc32fast",
304 | "miniz_oxide",
305 | ]
306 |
307 | [[package]]
308 | name = "fnv"
309 | version = "1.0.7"
310 | source = "registry+https://github.com/rust-lang/crates.io-index"
311 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
312 |
313 | [[package]]
314 | name = "foreign-types"
315 | version = "0.3.2"
316 | source = "registry+https://github.com/rust-lang/crates.io-index"
317 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
318 | dependencies = [
319 | "foreign-types-shared",
320 | ]
321 |
322 | [[package]]
323 | name = "foreign-types-shared"
324 | version = "0.1.1"
325 | source = "registry+https://github.com/rust-lang/crates.io-index"
326 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
327 |
328 | [[package]]
329 | name = "form_urlencoded"
330 | version = "1.2.1"
331 | source = "registry+https://github.com/rust-lang/crates.io-index"
332 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
333 | dependencies = [
334 | "percent-encoding",
335 | ]
336 |
337 | [[package]]
338 | name = "futures-channel"
339 | version = "0.3.30"
340 | source = "registry+https://github.com/rust-lang/crates.io-index"
341 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
342 | dependencies = [
343 | "futures-core",
344 | ]
345 |
346 | [[package]]
347 | name = "futures-core"
348 | version = "0.3.30"
349 | source = "registry+https://github.com/rust-lang/crates.io-index"
350 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
351 |
352 | [[package]]
353 | name = "futures-sink"
354 | version = "0.3.30"
355 | source = "registry+https://github.com/rust-lang/crates.io-index"
356 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
357 |
358 | [[package]]
359 | name = "futures-task"
360 | version = "0.3.30"
361 | source = "registry+https://github.com/rust-lang/crates.io-index"
362 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
363 |
364 | [[package]]
365 | name = "futures-util"
366 | version = "0.3.30"
367 | source = "registry+https://github.com/rust-lang/crates.io-index"
368 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
369 | dependencies = [
370 | "futures-core",
371 | "futures-task",
372 | "pin-project-lite",
373 | "pin-utils",
374 | ]
375 |
376 | [[package]]
377 | name = "generic-array"
378 | version = "0.14.7"
379 | source = "registry+https://github.com/rust-lang/crates.io-index"
380 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
381 | dependencies = [
382 | "typenum",
383 | "version_check",
384 | ]
385 |
386 | [[package]]
387 | name = "getrandom"
388 | version = "0.2.15"
389 | source = "registry+https://github.com/rust-lang/crates.io-index"
390 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
391 | dependencies = [
392 | "cfg-if",
393 | "libc",
394 | "wasi",
395 | ]
396 |
397 | [[package]]
398 | name = "gimli"
399 | version = "0.29.0"
400 | source = "registry+https://github.com/rust-lang/crates.io-index"
401 | checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
402 |
403 | [[package]]
404 | name = "goblin"
405 | version = "0.8.2"
406 | source = "registry+https://github.com/rust-lang/crates.io-index"
407 | checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47"
408 | dependencies = [
409 | "log",
410 | "plain",
411 | "scroll",
412 | ]
413 |
414 | [[package]]
415 | name = "h2"
416 | version = "0.4.5"
417 | source = "registry+https://github.com/rust-lang/crates.io-index"
418 | checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab"
419 | dependencies = [
420 | "atomic-waker",
421 | "bytes",
422 | "fnv",
423 | "futures-core",
424 | "futures-sink",
425 | "http",
426 | "indexmap",
427 | "slab",
428 | "tokio",
429 | "tokio-util",
430 | "tracing",
431 | ]
432 |
433 | [[package]]
434 | name = "hashbrown"
435 | version = "0.14.5"
436 | source = "registry+https://github.com/rust-lang/crates.io-index"
437 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
438 |
439 | [[package]]
440 | name = "hermit-abi"
441 | version = "0.3.9"
442 | source = "registry+https://github.com/rust-lang/crates.io-index"
443 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
444 |
445 | [[package]]
446 | name = "hmac"
447 | version = "0.12.1"
448 | source = "registry+https://github.com/rust-lang/crates.io-index"
449 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
450 | dependencies = [
451 | "digest",
452 | ]
453 |
454 | [[package]]
455 | name = "http"
456 | version = "1.1.0"
457 | source = "registry+https://github.com/rust-lang/crates.io-index"
458 | checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258"
459 | dependencies = [
460 | "bytes",
461 | "fnv",
462 | "itoa",
463 | ]
464 |
465 | [[package]]
466 | name = "http-body"
467 | version = "1.0.1"
468 | source = "registry+https://github.com/rust-lang/crates.io-index"
469 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
470 | dependencies = [
471 | "bytes",
472 | "http",
473 | ]
474 |
475 | [[package]]
476 | name = "http-body-util"
477 | version = "0.1.2"
478 | source = "registry+https://github.com/rust-lang/crates.io-index"
479 | checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
480 | dependencies = [
481 | "bytes",
482 | "futures-util",
483 | "http",
484 | "http-body",
485 | "pin-project-lite",
486 | ]
487 |
488 | [[package]]
489 | name = "httparse"
490 | version = "1.9.4"
491 | source = "registry+https://github.com/rust-lang/crates.io-index"
492 | checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9"
493 |
494 | [[package]]
495 | name = "hyper"
496 | version = "1.4.1"
497 | source = "registry+https://github.com/rust-lang/crates.io-index"
498 | checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05"
499 | dependencies = [
500 | "bytes",
501 | "futures-channel",
502 | "futures-util",
503 | "h2",
504 | "http",
505 | "http-body",
506 | "httparse",
507 | "itoa",
508 | "pin-project-lite",
509 | "smallvec",
510 | "tokio",
511 | "want",
512 | ]
513 |
514 | [[package]]
515 | name = "hyper-rustls"
516 | version = "0.27.2"
517 | source = "registry+https://github.com/rust-lang/crates.io-index"
518 | checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155"
519 | dependencies = [
520 | "futures-util",
521 | "http",
522 | "hyper",
523 | "hyper-util",
524 | "rustls",
525 | "rustls-pki-types",
526 | "tokio",
527 | "tokio-rustls",
528 | "tower-service",
529 | ]
530 |
531 | [[package]]
532 | name = "hyper-tls"
533 | version = "0.6.0"
534 | source = "registry+https://github.com/rust-lang/crates.io-index"
535 | checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0"
536 | dependencies = [
537 | "bytes",
538 | "http-body-util",
539 | "hyper",
540 | "hyper-util",
541 | "native-tls",
542 | "tokio",
543 | "tokio-native-tls",
544 | "tower-service",
545 | ]
546 |
547 | [[package]]
548 | name = "hyper-util"
549 | version = "0.1.6"
550 | source = "registry+https://github.com/rust-lang/crates.io-index"
551 | checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956"
552 | dependencies = [
553 | "bytes",
554 | "futures-channel",
555 | "futures-util",
556 | "http",
557 | "http-body",
558 | "hyper",
559 | "pin-project-lite",
560 | "socket2",
561 | "tokio",
562 | "tower",
563 | "tower-service",
564 | "tracing",
565 | ]
566 |
567 | [[package]]
568 | name = "idna"
569 | version = "0.5.0"
570 | source = "registry+https://github.com/rust-lang/crates.io-index"
571 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
572 | dependencies = [
573 | "unicode-bidi",
574 | "unicode-normalization",
575 | ]
576 |
577 | [[package]]
578 | name = "indexmap"
579 | version = "2.2.6"
580 | source = "registry+https://github.com/rust-lang/crates.io-index"
581 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
582 | dependencies = [
583 | "equivalent",
584 | "hashbrown",
585 | ]
586 |
587 | [[package]]
588 | name = "inout"
589 | version = "0.1.3"
590 | source = "registry+https://github.com/rust-lang/crates.io-index"
591 | checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
592 | dependencies = [
593 | "generic-array",
594 | ]
595 |
596 | [[package]]
597 | name = "ipnet"
598 | version = "2.9.0"
599 | source = "registry+https://github.com/rust-lang/crates.io-index"
600 | checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
601 |
602 | [[package]]
603 | name = "itoa"
604 | version = "1.0.11"
605 | source = "registry+https://github.com/rust-lang/crates.io-index"
606 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
607 |
608 | [[package]]
609 | name = "jobserver"
610 | version = "0.1.32"
611 | source = "registry+https://github.com/rust-lang/crates.io-index"
612 | checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
613 | dependencies = [
614 | "libc",
615 | ]
616 |
617 | [[package]]
618 | name = "js-sys"
619 | version = "0.3.69"
620 | source = "registry+https://github.com/rust-lang/crates.io-index"
621 | checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
622 | dependencies = [
623 | "wasm-bindgen",
624 | ]
625 |
626 | [[package]]
627 | name = "lazy_static"
628 | version = "1.5.0"
629 | source = "registry+https://github.com/rust-lang/crates.io-index"
630 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
631 |
632 | [[package]]
633 | name = "libc"
634 | version = "0.2.155"
635 | source = "registry+https://github.com/rust-lang/crates.io-index"
636 | checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
637 |
638 | [[package]]
639 | name = "linux-raw-sys"
640 | version = "0.4.14"
641 | source = "registry+https://github.com/rust-lang/crates.io-index"
642 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
643 |
644 | [[package]]
645 | name = "llob_install"
646 | version = "0.1.0"
647 | dependencies = [
648 | "goblin",
649 | "log",
650 | "path-clean",
651 | "regex",
652 | "reqwest",
653 | "serde_json",
654 | "sysinfo",
655 | "time",
656 | "tokio",
657 | "tracing",
658 | "tracing-subscriber",
659 | "winapi",
660 | "winreg 0.50.0",
661 | "winres",
662 | "zip",
663 | ]
664 |
665 | [[package]]
666 | name = "lock_api"
667 | version = "0.4.12"
668 | source = "registry+https://github.com/rust-lang/crates.io-index"
669 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
670 | dependencies = [
671 | "autocfg",
672 | "scopeguard",
673 | ]
674 |
675 | [[package]]
676 | name = "log"
677 | version = "0.4.22"
678 | source = "registry+https://github.com/rust-lang/crates.io-index"
679 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
680 |
681 | [[package]]
682 | name = "matchers"
683 | version = "0.1.0"
684 | source = "registry+https://github.com/rust-lang/crates.io-index"
685 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
686 | dependencies = [
687 | "regex-automata 0.1.10",
688 | ]
689 |
690 | [[package]]
691 | name = "memchr"
692 | version = "2.7.4"
693 | source = "registry+https://github.com/rust-lang/crates.io-index"
694 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
695 |
696 | [[package]]
697 | name = "mime"
698 | version = "0.3.17"
699 | source = "registry+https://github.com/rust-lang/crates.io-index"
700 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
701 |
702 | [[package]]
703 | name = "miniz_oxide"
704 | version = "0.7.4"
705 | source = "registry+https://github.com/rust-lang/crates.io-index"
706 | checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
707 | dependencies = [
708 | "adler",
709 | ]
710 |
711 | [[package]]
712 | name = "mio"
713 | version = "1.0.1"
714 | source = "registry+https://github.com/rust-lang/crates.io-index"
715 | checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4"
716 | dependencies = [
717 | "hermit-abi",
718 | "libc",
719 | "wasi",
720 | "windows-sys 0.52.0",
721 | ]
722 |
723 | [[package]]
724 | name = "native-tls"
725 | version = "0.2.12"
726 | source = "registry+https://github.com/rust-lang/crates.io-index"
727 | checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466"
728 | dependencies = [
729 | "libc",
730 | "log",
731 | "openssl",
732 | "openssl-probe",
733 | "openssl-sys",
734 | "schannel",
735 | "security-framework",
736 | "security-framework-sys",
737 | "tempfile",
738 | ]
739 |
740 | [[package]]
741 | name = "ntapi"
742 | version = "0.4.1"
743 | source = "registry+https://github.com/rust-lang/crates.io-index"
744 | checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4"
745 | dependencies = [
746 | "winapi",
747 | ]
748 |
749 | [[package]]
750 | name = "nu-ansi-term"
751 | version = "0.46.0"
752 | source = "registry+https://github.com/rust-lang/crates.io-index"
753 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
754 | dependencies = [
755 | "overload",
756 | "winapi",
757 | ]
758 |
759 | [[package]]
760 | name = "num-conv"
761 | version = "0.1.0"
762 | source = "registry+https://github.com/rust-lang/crates.io-index"
763 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
764 |
765 | [[package]]
766 | name = "num_threads"
767 | version = "0.1.7"
768 | source = "registry+https://github.com/rust-lang/crates.io-index"
769 | checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9"
770 | dependencies = [
771 | "libc",
772 | ]
773 |
774 | [[package]]
775 | name = "object"
776 | version = "0.36.2"
777 | source = "registry+https://github.com/rust-lang/crates.io-index"
778 | checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e"
779 | dependencies = [
780 | "memchr",
781 | ]
782 |
783 | [[package]]
784 | name = "once_cell"
785 | version = "1.19.0"
786 | source = "registry+https://github.com/rust-lang/crates.io-index"
787 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
788 |
789 | [[package]]
790 | name = "openssl"
791 | version = "0.10.66"
792 | source = "registry+https://github.com/rust-lang/crates.io-index"
793 | checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1"
794 | dependencies = [
795 | "bitflags 2.6.0",
796 | "cfg-if",
797 | "foreign-types",
798 | "libc",
799 | "once_cell",
800 | "openssl-macros",
801 | "openssl-sys",
802 | ]
803 |
804 | [[package]]
805 | name = "openssl-macros"
806 | version = "0.1.1"
807 | source = "registry+https://github.com/rust-lang/crates.io-index"
808 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
809 | dependencies = [
810 | "proc-macro2",
811 | "quote",
812 | "syn",
813 | ]
814 |
815 | [[package]]
816 | name = "openssl-probe"
817 | version = "0.1.5"
818 | source = "registry+https://github.com/rust-lang/crates.io-index"
819 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
820 |
821 | [[package]]
822 | name = "openssl-sys"
823 | version = "0.9.103"
824 | source = "registry+https://github.com/rust-lang/crates.io-index"
825 | checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6"
826 | dependencies = [
827 | "cc",
828 | "libc",
829 | "pkg-config",
830 | "vcpkg",
831 | ]
832 |
833 | [[package]]
834 | name = "overload"
835 | version = "0.1.1"
836 | source = "registry+https://github.com/rust-lang/crates.io-index"
837 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
838 |
839 | [[package]]
840 | name = "parking_lot"
841 | version = "0.12.3"
842 | source = "registry+https://github.com/rust-lang/crates.io-index"
843 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
844 | dependencies = [
845 | "lock_api",
846 | "parking_lot_core",
847 | ]
848 |
849 | [[package]]
850 | name = "parking_lot_core"
851 | version = "0.9.10"
852 | source = "registry+https://github.com/rust-lang/crates.io-index"
853 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
854 | dependencies = [
855 | "cfg-if",
856 | "libc",
857 | "redox_syscall",
858 | "smallvec",
859 | "windows-targets 0.52.6",
860 | ]
861 |
862 | [[package]]
863 | name = "password-hash"
864 | version = "0.4.2"
865 | source = "registry+https://github.com/rust-lang/crates.io-index"
866 | checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700"
867 | dependencies = [
868 | "base64ct",
869 | "rand_core",
870 | "subtle",
871 | ]
872 |
873 | [[package]]
874 | name = "path-clean"
875 | version = "1.0.1"
876 | source = "registry+https://github.com/rust-lang/crates.io-index"
877 | checksum = "17359afc20d7ab31fdb42bb844c8b3bb1dabd7dcf7e68428492da7f16966fcef"
878 |
879 | [[package]]
880 | name = "pbkdf2"
881 | version = "0.11.0"
882 | source = "registry+https://github.com/rust-lang/crates.io-index"
883 | checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917"
884 | dependencies = [
885 | "digest",
886 | "hmac",
887 | "password-hash",
888 | "sha2",
889 | ]
890 |
891 | [[package]]
892 | name = "percent-encoding"
893 | version = "2.3.1"
894 | source = "registry+https://github.com/rust-lang/crates.io-index"
895 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
896 |
897 | [[package]]
898 | name = "pin-project"
899 | version = "1.1.5"
900 | source = "registry+https://github.com/rust-lang/crates.io-index"
901 | checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3"
902 | dependencies = [
903 | "pin-project-internal",
904 | ]
905 |
906 | [[package]]
907 | name = "pin-project-internal"
908 | version = "1.1.5"
909 | source = "registry+https://github.com/rust-lang/crates.io-index"
910 | checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
911 | dependencies = [
912 | "proc-macro2",
913 | "quote",
914 | "syn",
915 | ]
916 |
917 | [[package]]
918 | name = "pin-project-lite"
919 | version = "0.2.14"
920 | source = "registry+https://github.com/rust-lang/crates.io-index"
921 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
922 |
923 | [[package]]
924 | name = "pin-utils"
925 | version = "0.1.0"
926 | source = "registry+https://github.com/rust-lang/crates.io-index"
927 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
928 |
929 | [[package]]
930 | name = "pkg-config"
931 | version = "0.3.30"
932 | source = "registry+https://github.com/rust-lang/crates.io-index"
933 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
934 |
935 | [[package]]
936 | name = "plain"
937 | version = "0.2.3"
938 | source = "registry+https://github.com/rust-lang/crates.io-index"
939 | checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
940 |
941 | [[package]]
942 | name = "powerfmt"
943 | version = "0.2.0"
944 | source = "registry+https://github.com/rust-lang/crates.io-index"
945 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
946 |
947 | [[package]]
948 | name = "proc-macro2"
949 | version = "1.0.86"
950 | source = "registry+https://github.com/rust-lang/crates.io-index"
951 | checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
952 | dependencies = [
953 | "unicode-ident",
954 | ]
955 |
956 | [[package]]
957 | name = "quote"
958 | version = "1.0.36"
959 | source = "registry+https://github.com/rust-lang/crates.io-index"
960 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
961 | dependencies = [
962 | "proc-macro2",
963 | ]
964 |
965 | [[package]]
966 | name = "rand_core"
967 | version = "0.6.4"
968 | source = "registry+https://github.com/rust-lang/crates.io-index"
969 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
970 |
971 | [[package]]
972 | name = "rayon"
973 | version = "1.10.0"
974 | source = "registry+https://github.com/rust-lang/crates.io-index"
975 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
976 | dependencies = [
977 | "either",
978 | "rayon-core",
979 | ]
980 |
981 | [[package]]
982 | name = "rayon-core"
983 | version = "1.12.1"
984 | source = "registry+https://github.com/rust-lang/crates.io-index"
985 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
986 | dependencies = [
987 | "crossbeam-deque",
988 | "crossbeam-utils",
989 | ]
990 |
991 | [[package]]
992 | name = "redox_syscall"
993 | version = "0.5.3"
994 | source = "registry+https://github.com/rust-lang/crates.io-index"
995 | checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4"
996 | dependencies = [
997 | "bitflags 2.6.0",
998 | ]
999 |
1000 | [[package]]
1001 | name = "regex"
1002 | version = "1.10.5"
1003 | source = "registry+https://github.com/rust-lang/crates.io-index"
1004 | checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f"
1005 | dependencies = [
1006 | "aho-corasick",
1007 | "memchr",
1008 | "regex-automata 0.4.7",
1009 | "regex-syntax 0.8.4",
1010 | ]
1011 |
1012 | [[package]]
1013 | name = "regex-automata"
1014 | version = "0.1.10"
1015 | source = "registry+https://github.com/rust-lang/crates.io-index"
1016 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
1017 | dependencies = [
1018 | "regex-syntax 0.6.29",
1019 | ]
1020 |
1021 | [[package]]
1022 | name = "regex-automata"
1023 | version = "0.4.7"
1024 | source = "registry+https://github.com/rust-lang/crates.io-index"
1025 | checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
1026 | dependencies = [
1027 | "aho-corasick",
1028 | "memchr",
1029 | "regex-syntax 0.8.4",
1030 | ]
1031 |
1032 | [[package]]
1033 | name = "regex-syntax"
1034 | version = "0.6.29"
1035 | source = "registry+https://github.com/rust-lang/crates.io-index"
1036 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
1037 |
1038 | [[package]]
1039 | name = "regex-syntax"
1040 | version = "0.8.4"
1041 | source = "registry+https://github.com/rust-lang/crates.io-index"
1042 | checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
1043 |
1044 | [[package]]
1045 | name = "reqwest"
1046 | version = "0.12.5"
1047 | source = "registry+https://github.com/rust-lang/crates.io-index"
1048 | checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37"
1049 | dependencies = [
1050 | "base64",
1051 | "bytes",
1052 | "encoding_rs",
1053 | "futures-core",
1054 | "futures-util",
1055 | "h2",
1056 | "http",
1057 | "http-body",
1058 | "http-body-util",
1059 | "hyper",
1060 | "hyper-rustls",
1061 | "hyper-tls",
1062 | "hyper-util",
1063 | "ipnet",
1064 | "js-sys",
1065 | "log",
1066 | "mime",
1067 | "native-tls",
1068 | "once_cell",
1069 | "percent-encoding",
1070 | "pin-project-lite",
1071 | "rustls-pemfile",
1072 | "serde",
1073 | "serde_json",
1074 | "serde_urlencoded",
1075 | "sync_wrapper",
1076 | "system-configuration",
1077 | "tokio",
1078 | "tokio-native-tls",
1079 | "tower-service",
1080 | "url",
1081 | "wasm-bindgen",
1082 | "wasm-bindgen-futures",
1083 | "web-sys",
1084 | "winreg 0.52.0",
1085 | ]
1086 |
1087 | [[package]]
1088 | name = "ring"
1089 | version = "0.17.8"
1090 | source = "registry+https://github.com/rust-lang/crates.io-index"
1091 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
1092 | dependencies = [
1093 | "cc",
1094 | "cfg-if",
1095 | "getrandom",
1096 | "libc",
1097 | "spin",
1098 | "untrusted",
1099 | "windows-sys 0.52.0",
1100 | ]
1101 |
1102 | [[package]]
1103 | name = "rustc-demangle"
1104 | version = "0.1.24"
1105 | source = "registry+https://github.com/rust-lang/crates.io-index"
1106 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
1107 |
1108 | [[package]]
1109 | name = "rustix"
1110 | version = "0.38.34"
1111 | source = "registry+https://github.com/rust-lang/crates.io-index"
1112 | checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
1113 | dependencies = [
1114 | "bitflags 2.6.0",
1115 | "errno",
1116 | "libc",
1117 | "linux-raw-sys",
1118 | "windows-sys 0.52.0",
1119 | ]
1120 |
1121 | [[package]]
1122 | name = "rustls"
1123 | version = "0.23.12"
1124 | source = "registry+https://github.com/rust-lang/crates.io-index"
1125 | checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044"
1126 | dependencies = [
1127 | "once_cell",
1128 | "rustls-pki-types",
1129 | "rustls-webpki",
1130 | "subtle",
1131 | "zeroize",
1132 | ]
1133 |
1134 | [[package]]
1135 | name = "rustls-pemfile"
1136 | version = "2.1.2"
1137 | source = "registry+https://github.com/rust-lang/crates.io-index"
1138 | checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d"
1139 | dependencies = [
1140 | "base64",
1141 | "rustls-pki-types",
1142 | ]
1143 |
1144 | [[package]]
1145 | name = "rustls-pki-types"
1146 | version = "1.7.0"
1147 | source = "registry+https://github.com/rust-lang/crates.io-index"
1148 | checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d"
1149 |
1150 | [[package]]
1151 | name = "rustls-webpki"
1152 | version = "0.102.6"
1153 | source = "registry+https://github.com/rust-lang/crates.io-index"
1154 | checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e"
1155 | dependencies = [
1156 | "ring",
1157 | "rustls-pki-types",
1158 | "untrusted",
1159 | ]
1160 |
1161 | [[package]]
1162 | name = "ryu"
1163 | version = "1.0.18"
1164 | source = "registry+https://github.com/rust-lang/crates.io-index"
1165 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
1166 |
1167 | [[package]]
1168 | name = "schannel"
1169 | version = "0.1.23"
1170 | source = "registry+https://github.com/rust-lang/crates.io-index"
1171 | checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
1172 | dependencies = [
1173 | "windows-sys 0.52.0",
1174 | ]
1175 |
1176 | [[package]]
1177 | name = "scopeguard"
1178 | version = "1.2.0"
1179 | source = "registry+https://github.com/rust-lang/crates.io-index"
1180 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1181 |
1182 | [[package]]
1183 | name = "scroll"
1184 | version = "0.12.0"
1185 | source = "registry+https://github.com/rust-lang/crates.io-index"
1186 | checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6"
1187 | dependencies = [
1188 | "scroll_derive",
1189 | ]
1190 |
1191 | [[package]]
1192 | name = "scroll_derive"
1193 | version = "0.12.0"
1194 | source = "registry+https://github.com/rust-lang/crates.io-index"
1195 | checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932"
1196 | dependencies = [
1197 | "proc-macro2",
1198 | "quote",
1199 | "syn",
1200 | ]
1201 |
1202 | [[package]]
1203 | name = "security-framework"
1204 | version = "2.11.1"
1205 | source = "registry+https://github.com/rust-lang/crates.io-index"
1206 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
1207 | dependencies = [
1208 | "bitflags 2.6.0",
1209 | "core-foundation",
1210 | "core-foundation-sys",
1211 | "libc",
1212 | "security-framework-sys",
1213 | ]
1214 |
1215 | [[package]]
1216 | name = "security-framework-sys"
1217 | version = "2.11.1"
1218 | source = "registry+https://github.com/rust-lang/crates.io-index"
1219 | checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf"
1220 | dependencies = [
1221 | "core-foundation-sys",
1222 | "libc",
1223 | ]
1224 |
1225 | [[package]]
1226 | name = "serde"
1227 | version = "1.0.204"
1228 | source = "registry+https://github.com/rust-lang/crates.io-index"
1229 | checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12"
1230 | dependencies = [
1231 | "serde_derive",
1232 | ]
1233 |
1234 | [[package]]
1235 | name = "serde_derive"
1236 | version = "1.0.204"
1237 | source = "registry+https://github.com/rust-lang/crates.io-index"
1238 | checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222"
1239 | dependencies = [
1240 | "proc-macro2",
1241 | "quote",
1242 | "syn",
1243 | ]
1244 |
1245 | [[package]]
1246 | name = "serde_json"
1247 | version = "1.0.120"
1248 | source = "registry+https://github.com/rust-lang/crates.io-index"
1249 | checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5"
1250 | dependencies = [
1251 | "itoa",
1252 | "ryu",
1253 | "serde",
1254 | ]
1255 |
1256 | [[package]]
1257 | name = "serde_urlencoded"
1258 | version = "0.7.1"
1259 | source = "registry+https://github.com/rust-lang/crates.io-index"
1260 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
1261 | dependencies = [
1262 | "form_urlencoded",
1263 | "itoa",
1264 | "ryu",
1265 | "serde",
1266 | ]
1267 |
1268 | [[package]]
1269 | name = "sha1"
1270 | version = "0.10.6"
1271 | source = "registry+https://github.com/rust-lang/crates.io-index"
1272 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
1273 | dependencies = [
1274 | "cfg-if",
1275 | "cpufeatures",
1276 | "digest",
1277 | ]
1278 |
1279 | [[package]]
1280 | name = "sha2"
1281 | version = "0.10.8"
1282 | source = "registry+https://github.com/rust-lang/crates.io-index"
1283 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
1284 | dependencies = [
1285 | "cfg-if",
1286 | "cpufeatures",
1287 | "digest",
1288 | ]
1289 |
1290 | [[package]]
1291 | name = "sharded-slab"
1292 | version = "0.1.7"
1293 | source = "registry+https://github.com/rust-lang/crates.io-index"
1294 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
1295 | dependencies = [
1296 | "lazy_static",
1297 | ]
1298 |
1299 | [[package]]
1300 | name = "signal-hook-registry"
1301 | version = "1.4.2"
1302 | source = "registry+https://github.com/rust-lang/crates.io-index"
1303 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
1304 | dependencies = [
1305 | "libc",
1306 | ]
1307 |
1308 | [[package]]
1309 | name = "slab"
1310 | version = "0.4.9"
1311 | source = "registry+https://github.com/rust-lang/crates.io-index"
1312 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
1313 | dependencies = [
1314 | "autocfg",
1315 | ]
1316 |
1317 | [[package]]
1318 | name = "smallvec"
1319 | version = "1.13.2"
1320 | source = "registry+https://github.com/rust-lang/crates.io-index"
1321 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
1322 |
1323 | [[package]]
1324 | name = "socket2"
1325 | version = "0.5.7"
1326 | source = "registry+https://github.com/rust-lang/crates.io-index"
1327 | checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
1328 | dependencies = [
1329 | "libc",
1330 | "windows-sys 0.52.0",
1331 | ]
1332 |
1333 | [[package]]
1334 | name = "spin"
1335 | version = "0.9.8"
1336 | source = "registry+https://github.com/rust-lang/crates.io-index"
1337 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
1338 |
1339 | [[package]]
1340 | name = "subtle"
1341 | version = "2.6.1"
1342 | source = "registry+https://github.com/rust-lang/crates.io-index"
1343 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
1344 |
1345 | [[package]]
1346 | name = "syn"
1347 | version = "2.0.72"
1348 | source = "registry+https://github.com/rust-lang/crates.io-index"
1349 | checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af"
1350 | dependencies = [
1351 | "proc-macro2",
1352 | "quote",
1353 | "unicode-ident",
1354 | ]
1355 |
1356 | [[package]]
1357 | name = "sync_wrapper"
1358 | version = "1.0.1"
1359 | source = "registry+https://github.com/rust-lang/crates.io-index"
1360 | checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
1361 |
1362 | [[package]]
1363 | name = "sysinfo"
1364 | version = "0.30.13"
1365 | source = "registry+https://github.com/rust-lang/crates.io-index"
1366 | checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3"
1367 | dependencies = [
1368 | "cfg-if",
1369 | "core-foundation-sys",
1370 | "libc",
1371 | "ntapi",
1372 | "once_cell",
1373 | "rayon",
1374 | "windows",
1375 | ]
1376 |
1377 | [[package]]
1378 | name = "system-configuration"
1379 | version = "0.5.1"
1380 | source = "registry+https://github.com/rust-lang/crates.io-index"
1381 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
1382 | dependencies = [
1383 | "bitflags 1.3.2",
1384 | "core-foundation",
1385 | "system-configuration-sys",
1386 | ]
1387 |
1388 | [[package]]
1389 | name = "system-configuration-sys"
1390 | version = "0.5.0"
1391 | source = "registry+https://github.com/rust-lang/crates.io-index"
1392 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
1393 | dependencies = [
1394 | "core-foundation-sys",
1395 | "libc",
1396 | ]
1397 |
1398 | [[package]]
1399 | name = "tempfile"
1400 | version = "3.10.1"
1401 | source = "registry+https://github.com/rust-lang/crates.io-index"
1402 | checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
1403 | dependencies = [
1404 | "cfg-if",
1405 | "fastrand",
1406 | "rustix",
1407 | "windows-sys 0.52.0",
1408 | ]
1409 |
1410 | [[package]]
1411 | name = "thread_local"
1412 | version = "1.1.8"
1413 | source = "registry+https://github.com/rust-lang/crates.io-index"
1414 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
1415 | dependencies = [
1416 | "cfg-if",
1417 | "once_cell",
1418 | ]
1419 |
1420 | [[package]]
1421 | name = "time"
1422 | version = "0.3.36"
1423 | source = "registry+https://github.com/rust-lang/crates.io-index"
1424 | checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
1425 | dependencies = [
1426 | "deranged",
1427 | "itoa",
1428 | "libc",
1429 | "num-conv",
1430 | "num_threads",
1431 | "powerfmt",
1432 | "serde",
1433 | "time-core",
1434 | "time-macros",
1435 | ]
1436 |
1437 | [[package]]
1438 | name = "time-core"
1439 | version = "0.1.2"
1440 | source = "registry+https://github.com/rust-lang/crates.io-index"
1441 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
1442 |
1443 | [[package]]
1444 | name = "time-macros"
1445 | version = "0.2.18"
1446 | source = "registry+https://github.com/rust-lang/crates.io-index"
1447 | checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf"
1448 | dependencies = [
1449 | "num-conv",
1450 | "time-core",
1451 | ]
1452 |
1453 | [[package]]
1454 | name = "tinyvec"
1455 | version = "1.8.0"
1456 | source = "registry+https://github.com/rust-lang/crates.io-index"
1457 | checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
1458 | dependencies = [
1459 | "tinyvec_macros",
1460 | ]
1461 |
1462 | [[package]]
1463 | name = "tinyvec_macros"
1464 | version = "0.1.1"
1465 | source = "registry+https://github.com/rust-lang/crates.io-index"
1466 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
1467 |
1468 | [[package]]
1469 | name = "tokio"
1470 | version = "1.39.2"
1471 | source = "registry+https://github.com/rust-lang/crates.io-index"
1472 | checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1"
1473 | dependencies = [
1474 | "backtrace",
1475 | "bytes",
1476 | "libc",
1477 | "mio",
1478 | "parking_lot",
1479 | "pin-project-lite",
1480 | "signal-hook-registry",
1481 | "socket2",
1482 | "tokio-macros",
1483 | "windows-sys 0.52.0",
1484 | ]
1485 |
1486 | [[package]]
1487 | name = "tokio-macros"
1488 | version = "2.4.0"
1489 | source = "registry+https://github.com/rust-lang/crates.io-index"
1490 | checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
1491 | dependencies = [
1492 | "proc-macro2",
1493 | "quote",
1494 | "syn",
1495 | ]
1496 |
1497 | [[package]]
1498 | name = "tokio-native-tls"
1499 | version = "0.3.1"
1500 | source = "registry+https://github.com/rust-lang/crates.io-index"
1501 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
1502 | dependencies = [
1503 | "native-tls",
1504 | "tokio",
1505 | ]
1506 |
1507 | [[package]]
1508 | name = "tokio-rustls"
1509 | version = "0.26.0"
1510 | source = "registry+https://github.com/rust-lang/crates.io-index"
1511 | checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4"
1512 | dependencies = [
1513 | "rustls",
1514 | "rustls-pki-types",
1515 | "tokio",
1516 | ]
1517 |
1518 | [[package]]
1519 | name = "tokio-util"
1520 | version = "0.7.11"
1521 | source = "registry+https://github.com/rust-lang/crates.io-index"
1522 | checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1"
1523 | dependencies = [
1524 | "bytes",
1525 | "futures-core",
1526 | "futures-sink",
1527 | "pin-project-lite",
1528 | "tokio",
1529 | ]
1530 |
1531 | [[package]]
1532 | name = "toml"
1533 | version = "0.5.11"
1534 | source = "registry+https://github.com/rust-lang/crates.io-index"
1535 | checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
1536 | dependencies = [
1537 | "serde",
1538 | ]
1539 |
1540 | [[package]]
1541 | name = "tower"
1542 | version = "0.4.13"
1543 | source = "registry+https://github.com/rust-lang/crates.io-index"
1544 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
1545 | dependencies = [
1546 | "futures-core",
1547 | "futures-util",
1548 | "pin-project",
1549 | "pin-project-lite",
1550 | "tokio",
1551 | "tower-layer",
1552 | "tower-service",
1553 | ]
1554 |
1555 | [[package]]
1556 | name = "tower-layer"
1557 | version = "0.3.2"
1558 | source = "registry+https://github.com/rust-lang/crates.io-index"
1559 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
1560 |
1561 | [[package]]
1562 | name = "tower-service"
1563 | version = "0.3.2"
1564 | source = "registry+https://github.com/rust-lang/crates.io-index"
1565 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
1566 |
1567 | [[package]]
1568 | name = "tracing"
1569 | version = "0.1.40"
1570 | source = "registry+https://github.com/rust-lang/crates.io-index"
1571 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
1572 | dependencies = [
1573 | "pin-project-lite",
1574 | "tracing-attributes",
1575 | "tracing-core",
1576 | ]
1577 |
1578 | [[package]]
1579 | name = "tracing-attributes"
1580 | version = "0.1.27"
1581 | source = "registry+https://github.com/rust-lang/crates.io-index"
1582 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
1583 | dependencies = [
1584 | "proc-macro2",
1585 | "quote",
1586 | "syn",
1587 | ]
1588 |
1589 | [[package]]
1590 | name = "tracing-core"
1591 | version = "0.1.32"
1592 | source = "registry+https://github.com/rust-lang/crates.io-index"
1593 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
1594 | dependencies = [
1595 | "once_cell",
1596 | "valuable",
1597 | ]
1598 |
1599 | [[package]]
1600 | name = "tracing-log"
1601 | version = "0.2.0"
1602 | source = "registry+https://github.com/rust-lang/crates.io-index"
1603 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
1604 | dependencies = [
1605 | "log",
1606 | "once_cell",
1607 | "tracing-core",
1608 | ]
1609 |
1610 | [[package]]
1611 | name = "tracing-subscriber"
1612 | version = "0.3.18"
1613 | source = "registry+https://github.com/rust-lang/crates.io-index"
1614 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
1615 | dependencies = [
1616 | "matchers",
1617 | "nu-ansi-term",
1618 | "once_cell",
1619 | "regex",
1620 | "sharded-slab",
1621 | "smallvec",
1622 | "thread_local",
1623 | "time",
1624 | "tracing",
1625 | "tracing-core",
1626 | "tracing-log",
1627 | ]
1628 |
1629 | [[package]]
1630 | name = "try-lock"
1631 | version = "0.2.5"
1632 | source = "registry+https://github.com/rust-lang/crates.io-index"
1633 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
1634 |
1635 | [[package]]
1636 | name = "typenum"
1637 | version = "1.17.0"
1638 | source = "registry+https://github.com/rust-lang/crates.io-index"
1639 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
1640 |
1641 | [[package]]
1642 | name = "unicode-bidi"
1643 | version = "0.3.15"
1644 | source = "registry+https://github.com/rust-lang/crates.io-index"
1645 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
1646 |
1647 | [[package]]
1648 | name = "unicode-ident"
1649 | version = "1.0.12"
1650 | source = "registry+https://github.com/rust-lang/crates.io-index"
1651 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
1652 |
1653 | [[package]]
1654 | name = "unicode-normalization"
1655 | version = "0.1.23"
1656 | source = "registry+https://github.com/rust-lang/crates.io-index"
1657 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
1658 | dependencies = [
1659 | "tinyvec",
1660 | ]
1661 |
1662 | [[package]]
1663 | name = "untrusted"
1664 | version = "0.9.0"
1665 | source = "registry+https://github.com/rust-lang/crates.io-index"
1666 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
1667 |
1668 | [[package]]
1669 | name = "url"
1670 | version = "2.5.2"
1671 | source = "registry+https://github.com/rust-lang/crates.io-index"
1672 | checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
1673 | dependencies = [
1674 | "form_urlencoded",
1675 | "idna",
1676 | "percent-encoding",
1677 | ]
1678 |
1679 | [[package]]
1680 | name = "valuable"
1681 | version = "0.1.0"
1682 | source = "registry+https://github.com/rust-lang/crates.io-index"
1683 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
1684 |
1685 | [[package]]
1686 | name = "vcpkg"
1687 | version = "0.2.15"
1688 | source = "registry+https://github.com/rust-lang/crates.io-index"
1689 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
1690 |
1691 | [[package]]
1692 | name = "version_check"
1693 | version = "0.9.5"
1694 | source = "registry+https://github.com/rust-lang/crates.io-index"
1695 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
1696 |
1697 | [[package]]
1698 | name = "want"
1699 | version = "0.3.1"
1700 | source = "registry+https://github.com/rust-lang/crates.io-index"
1701 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
1702 | dependencies = [
1703 | "try-lock",
1704 | ]
1705 |
1706 | [[package]]
1707 | name = "wasi"
1708 | version = "0.11.0+wasi-snapshot-preview1"
1709 | source = "registry+https://github.com/rust-lang/crates.io-index"
1710 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
1711 |
1712 | [[package]]
1713 | name = "wasm-bindgen"
1714 | version = "0.2.92"
1715 | source = "registry+https://github.com/rust-lang/crates.io-index"
1716 | checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
1717 | dependencies = [
1718 | "cfg-if",
1719 | "wasm-bindgen-macro",
1720 | ]
1721 |
1722 | [[package]]
1723 | name = "wasm-bindgen-backend"
1724 | version = "0.2.92"
1725 | source = "registry+https://github.com/rust-lang/crates.io-index"
1726 | checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
1727 | dependencies = [
1728 | "bumpalo",
1729 | "log",
1730 | "once_cell",
1731 | "proc-macro2",
1732 | "quote",
1733 | "syn",
1734 | "wasm-bindgen-shared",
1735 | ]
1736 |
1737 | [[package]]
1738 | name = "wasm-bindgen-futures"
1739 | version = "0.4.42"
1740 | source = "registry+https://github.com/rust-lang/crates.io-index"
1741 | checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0"
1742 | dependencies = [
1743 | "cfg-if",
1744 | "js-sys",
1745 | "wasm-bindgen",
1746 | "web-sys",
1747 | ]
1748 |
1749 | [[package]]
1750 | name = "wasm-bindgen-macro"
1751 | version = "0.2.92"
1752 | source = "registry+https://github.com/rust-lang/crates.io-index"
1753 | checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
1754 | dependencies = [
1755 | "quote",
1756 | "wasm-bindgen-macro-support",
1757 | ]
1758 |
1759 | [[package]]
1760 | name = "wasm-bindgen-macro-support"
1761 | version = "0.2.92"
1762 | source = "registry+https://github.com/rust-lang/crates.io-index"
1763 | checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
1764 | dependencies = [
1765 | "proc-macro2",
1766 | "quote",
1767 | "syn",
1768 | "wasm-bindgen-backend",
1769 | "wasm-bindgen-shared",
1770 | ]
1771 |
1772 | [[package]]
1773 | name = "wasm-bindgen-shared"
1774 | version = "0.2.92"
1775 | source = "registry+https://github.com/rust-lang/crates.io-index"
1776 | checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
1777 |
1778 | [[package]]
1779 | name = "web-sys"
1780 | version = "0.3.69"
1781 | source = "registry+https://github.com/rust-lang/crates.io-index"
1782 | checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef"
1783 | dependencies = [
1784 | "js-sys",
1785 | "wasm-bindgen",
1786 | ]
1787 |
1788 | [[package]]
1789 | name = "winapi"
1790 | version = "0.3.9"
1791 | source = "registry+https://github.com/rust-lang/crates.io-index"
1792 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
1793 | dependencies = [
1794 | "winapi-i686-pc-windows-gnu",
1795 | "winapi-x86_64-pc-windows-gnu",
1796 | ]
1797 |
1798 | [[package]]
1799 | name = "winapi-i686-pc-windows-gnu"
1800 | version = "0.4.0"
1801 | source = "registry+https://github.com/rust-lang/crates.io-index"
1802 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1803 |
1804 | [[package]]
1805 | name = "winapi-x86_64-pc-windows-gnu"
1806 | version = "0.4.0"
1807 | source = "registry+https://github.com/rust-lang/crates.io-index"
1808 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1809 |
1810 | [[package]]
1811 | name = "windows"
1812 | version = "0.52.0"
1813 | source = "registry+https://github.com/rust-lang/crates.io-index"
1814 | checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
1815 | dependencies = [
1816 | "windows-core",
1817 | "windows-targets 0.52.6",
1818 | ]
1819 |
1820 | [[package]]
1821 | name = "windows-core"
1822 | version = "0.52.0"
1823 | source = "registry+https://github.com/rust-lang/crates.io-index"
1824 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
1825 | dependencies = [
1826 | "windows-targets 0.52.6",
1827 | ]
1828 |
1829 | [[package]]
1830 | name = "windows-sys"
1831 | version = "0.48.0"
1832 | source = "registry+https://github.com/rust-lang/crates.io-index"
1833 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
1834 | dependencies = [
1835 | "windows-targets 0.48.5",
1836 | ]
1837 |
1838 | [[package]]
1839 | name = "windows-sys"
1840 | version = "0.52.0"
1841 | source = "registry+https://github.com/rust-lang/crates.io-index"
1842 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
1843 | dependencies = [
1844 | "windows-targets 0.52.6",
1845 | ]
1846 |
1847 | [[package]]
1848 | name = "windows-targets"
1849 | version = "0.48.5"
1850 | source = "registry+https://github.com/rust-lang/crates.io-index"
1851 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
1852 | dependencies = [
1853 | "windows_aarch64_gnullvm 0.48.5",
1854 | "windows_aarch64_msvc 0.48.5",
1855 | "windows_i686_gnu 0.48.5",
1856 | "windows_i686_msvc 0.48.5",
1857 | "windows_x86_64_gnu 0.48.5",
1858 | "windows_x86_64_gnullvm 0.48.5",
1859 | "windows_x86_64_msvc 0.48.5",
1860 | ]
1861 |
1862 | [[package]]
1863 | name = "windows-targets"
1864 | version = "0.52.6"
1865 | source = "registry+https://github.com/rust-lang/crates.io-index"
1866 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
1867 | dependencies = [
1868 | "windows_aarch64_gnullvm 0.52.6",
1869 | "windows_aarch64_msvc 0.52.6",
1870 | "windows_i686_gnu 0.52.6",
1871 | "windows_i686_gnullvm",
1872 | "windows_i686_msvc 0.52.6",
1873 | "windows_x86_64_gnu 0.52.6",
1874 | "windows_x86_64_gnullvm 0.52.6",
1875 | "windows_x86_64_msvc 0.52.6",
1876 | ]
1877 |
1878 | [[package]]
1879 | name = "windows_aarch64_gnullvm"
1880 | version = "0.48.5"
1881 | source = "registry+https://github.com/rust-lang/crates.io-index"
1882 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
1883 |
1884 | [[package]]
1885 | name = "windows_aarch64_gnullvm"
1886 | version = "0.52.6"
1887 | source = "registry+https://github.com/rust-lang/crates.io-index"
1888 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
1889 |
1890 | [[package]]
1891 | name = "windows_aarch64_msvc"
1892 | version = "0.48.5"
1893 | source = "registry+https://github.com/rust-lang/crates.io-index"
1894 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
1895 |
1896 | [[package]]
1897 | name = "windows_aarch64_msvc"
1898 | version = "0.52.6"
1899 | source = "registry+https://github.com/rust-lang/crates.io-index"
1900 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
1901 |
1902 | [[package]]
1903 | name = "windows_i686_gnu"
1904 | version = "0.48.5"
1905 | source = "registry+https://github.com/rust-lang/crates.io-index"
1906 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
1907 |
1908 | [[package]]
1909 | name = "windows_i686_gnu"
1910 | version = "0.52.6"
1911 | source = "registry+https://github.com/rust-lang/crates.io-index"
1912 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
1913 |
1914 | [[package]]
1915 | name = "windows_i686_gnullvm"
1916 | version = "0.52.6"
1917 | source = "registry+https://github.com/rust-lang/crates.io-index"
1918 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
1919 |
1920 | [[package]]
1921 | name = "windows_i686_msvc"
1922 | version = "0.48.5"
1923 | source = "registry+https://github.com/rust-lang/crates.io-index"
1924 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
1925 |
1926 | [[package]]
1927 | name = "windows_i686_msvc"
1928 | version = "0.52.6"
1929 | source = "registry+https://github.com/rust-lang/crates.io-index"
1930 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
1931 |
1932 | [[package]]
1933 | name = "windows_x86_64_gnu"
1934 | version = "0.48.5"
1935 | source = "registry+https://github.com/rust-lang/crates.io-index"
1936 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
1937 |
1938 | [[package]]
1939 | name = "windows_x86_64_gnu"
1940 | version = "0.52.6"
1941 | source = "registry+https://github.com/rust-lang/crates.io-index"
1942 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
1943 |
1944 | [[package]]
1945 | name = "windows_x86_64_gnullvm"
1946 | version = "0.48.5"
1947 | source = "registry+https://github.com/rust-lang/crates.io-index"
1948 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
1949 |
1950 | [[package]]
1951 | name = "windows_x86_64_gnullvm"
1952 | version = "0.52.6"
1953 | source = "registry+https://github.com/rust-lang/crates.io-index"
1954 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
1955 |
1956 | [[package]]
1957 | name = "windows_x86_64_msvc"
1958 | version = "0.48.5"
1959 | source = "registry+https://github.com/rust-lang/crates.io-index"
1960 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
1961 |
1962 | [[package]]
1963 | name = "windows_x86_64_msvc"
1964 | version = "0.52.6"
1965 | source = "registry+https://github.com/rust-lang/crates.io-index"
1966 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
1967 |
1968 | [[package]]
1969 | name = "winreg"
1970 | version = "0.50.0"
1971 | source = "registry+https://github.com/rust-lang/crates.io-index"
1972 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
1973 | dependencies = [
1974 | "cfg-if",
1975 | "windows-sys 0.48.0",
1976 | ]
1977 |
1978 | [[package]]
1979 | name = "winreg"
1980 | version = "0.52.0"
1981 | source = "registry+https://github.com/rust-lang/crates.io-index"
1982 | checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5"
1983 | dependencies = [
1984 | "cfg-if",
1985 | "windows-sys 0.48.0",
1986 | ]
1987 |
1988 | [[package]]
1989 | name = "winres"
1990 | version = "0.1.12"
1991 | source = "registry+https://github.com/rust-lang/crates.io-index"
1992 | checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c"
1993 | dependencies = [
1994 | "toml",
1995 | ]
1996 |
1997 | [[package]]
1998 | name = "zeroize"
1999 | version = "1.8.1"
2000 | source = "registry+https://github.com/rust-lang/crates.io-index"
2001 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
2002 |
2003 | [[package]]
2004 | name = "zip"
2005 | version = "0.6.6"
2006 | source = "registry+https://github.com/rust-lang/crates.io-index"
2007 | checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261"
2008 | dependencies = [
2009 | "aes",
2010 | "byteorder",
2011 | "bzip2",
2012 | "constant_time_eq",
2013 | "crc32fast",
2014 | "crossbeam-utils",
2015 | "flate2",
2016 | "hmac",
2017 | "pbkdf2",
2018 | "sha1",
2019 | "time",
2020 | "zstd",
2021 | ]
2022 |
2023 | [[package]]
2024 | name = "zstd"
2025 | version = "0.11.2+zstd.1.5.2"
2026 | source = "registry+https://github.com/rust-lang/crates.io-index"
2027 | checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4"
2028 | dependencies = [
2029 | "zstd-safe",
2030 | ]
2031 |
2032 | [[package]]
2033 | name = "zstd-safe"
2034 | version = "5.0.2+zstd.1.5.2"
2035 | source = "registry+https://github.com/rust-lang/crates.io-index"
2036 | checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db"
2037 | dependencies = [
2038 | "libc",
2039 | "zstd-sys",
2040 | ]
2041 |
2042 | [[package]]
2043 | name = "zstd-sys"
2044 | version = "2.0.12+zstd.1.5.6"
2045 | source = "registry+https://github.com/rust-lang/crates.io-index"
2046 | checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13"
2047 | dependencies = [
2048 | "cc",
2049 | "pkg-config",
2050 | ]
2051 |
--------------------------------------------------------------------------------
/Cargo.toml:
--------------------------------------------------------------------------------
1 | [package]
2 | name = "llob_install"
3 | version = "0.1.0"
4 | edition = "2021"
5 |
6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7 |
8 | [dependencies]
9 | goblin = "0.8.0"
10 | log = "0.4.21"
11 | path-clean = "1.0.1"
12 | regex = "1.10.4"
13 | reqwest = "0.12.2"
14 | serde_json = "1.0.115"
15 | sysinfo = "0.30.7"
16 | time = { version = "0.3.36", features = ["formatting", "macros", "local-offset"] }
17 | tokio = { version = "1", features = ["full"] }
18 | tracing = "0.1.40"
19 | tracing-subscriber = { version = "0.3.18", features = ["env-filter", "time", "local-time"] }
20 | winapi = { version = "0.3.9", features = ["processthreadsapi", "securitybaseapi"] }
21 | zip = "0.6.6"
22 |
23 |
24 | [build-dependencies]
25 | winres = "0.1.12"
26 |
27 |
28 | [target.'cfg(windows)'.dependencies]
29 | winreg = "0.50.0"
30 |
31 | [profile.release]
32 | panic = "abort" # Strip expensive panic clean-up logic
33 | codegen-units = 1 # Compile crates one after another so the compiler can optimize better
34 | lto = true # Enables link to optimizations
35 | opt-level = "s" # Optimize for binary size
36 | strip = true # Remove debug symbols
37 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 super1207
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## 因近期账号冻结严重,请暂时停用此安装器
2 | ## 使用llonebot提供的[一键包](https://github.com/LLOneBot/LLOneBot/releases)
3 |
4 | ## Introduction
5 |
6 | 在windows上全自动安装 [LiteLoaderQQNT](https://github.com/LiteLoaderQQNT/LiteLoaderQQNT) 和 [LLOnebOT](https://github.com/LLOneBot/LLOneBot)。
7 |
8 | Fully automatic installation of LLOneboT and LiteLoaderQQNT on Windows.
9 |
10 | 推荐操作时间:3分钟。
11 |
12 | Recommended operation time: 3 minutes.
13 |
14 | ## Usage
15 |
16 | 双击exe是你需要的全部,如果遇到网络问题,就多尝试几次。
17 |
18 | Double clicking the exe is all you need, just try a few more times if you have network problems.
19 |
20 | ## Installation Location
21 |
22 | 你可以通过编写配置文件`llob_install.json`来指定`QQ.exe`的目录,如:
23 | ```json
24 | {
25 | "qq_exe_path":"D:\\NTQQ\\QQ.exe"
26 | }
27 | ```
28 |
29 | 你也可以将`llob_install.exe`拖入`QQ.exe`所在目录再运行。
30 |
31 | **否则,将自动从Windows注册表中读取`QQ.exe`的安装路径。**
32 |
33 | 优先级:配置文件 > llob_install.exe 目录 > 注册表
34 |
35 | You can specify the directory of `QQ.exe` by writing a configuration file `llob_install.json`, like this:
36 | ```json
37 | {
38 | "qq_exe_path":"D:\\NTQQ\\QQ.exe"
39 | }
40 | ```
41 |
42 | Alternatively, you can drag `llob_install.exe` into the directory where `QQ.exe` is located and then run it.
43 |
44 | **Otherwise, the installation path of `QQ.exe` will be automatically read from the Windows registry.**
45 |
46 | Priority: Configuration file > llob_install.exe directory > Registry
47 |
48 | ## Thanks
49 |
50 | [LiteLoaderQQNT](https://github.com/LiteLoaderQQNT/LiteLoaderQQNT)
51 |
52 | [LLOnebOT](https://github.com/LLOneBot/LLOneBot)
53 |
54 | [QQNTFileVerifyPatch](https://github.com/LiteLoaderQQNT/QQNTFileVerifyPatch)
55 |
56 | [LiteLoaderQQNT_Install](https://github.com/Mzdyl/LiteLoaderQQNT_Install)
57 |
58 | ## License
59 |
60 | MIT
61 |
62 | ## 其它注意事项
63 | 1. 确保您已经安装最新版本的NTQQ,您应该在[QQ官网](https://im.qq.com/pcqq/index.shtml)下载的最新版本的NTQQ,并且通过双击QQ安装包来安装QQ。
64 | 2. 确保使用install_llob.exe之前,QQ处于关闭状态。
65 | 3. 如果QQ自动更新了,您可以重新运行install_llob.exe来安装llonebot,您的配置信息不会丢失。
66 | 4. 如果您仍然对安装过程有所疑惑,可以看看安装视频:[视频链接](https://files.catbox.moe/psdz7v.mp4)
67 |
68 | ## 如何卸载
69 |
70 | 如果需要完全去除此安装程序带来的影响,你可以按如下步骤操作。
71 |
72 | 1:打开windows控制面板->程序和功能,右键卸载QQ
73 |
74 | 2:手动删除QQ的安装文件夹,默认是:`C:\Program Files\Tencent\QQNT`
75 |
76 | 3(可选):重新安装QQ
77 |
78 | 4(可选):删除[用户文件夹](https://www.baidu.com/s?wd=windows%20%E7%94%A8%E6%88%B7%E6%96%87%E4%BB%B6%E5%A4%B9%E6%98%AF%E4%BB%80%E4%B9%88)下的`LiteLoaderQQNT-main`文件夹
79 |
80 |
--------------------------------------------------------------------------------
/build.rs:
--------------------------------------------------------------------------------
1 | fn main() {
2 | let mut res = winres::WindowsResource::new();
3 | res.set_manifest(
4 | r#"
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | "#,
15 | );
16 | if let Err(error) = res.compile() {
17 | eprint!("{error}");
18 | std::process::exit(1);
19 | }
20 | }
--------------------------------------------------------------------------------
/src/main.rs:
--------------------------------------------------------------------------------
1 | use std::{
2 | fs::{self},
3 | path::PathBuf,
4 | str::FromStr,
5 | sync::Arc,
6 | };
7 |
8 | use ::time::format_description;
9 | use path_clean::PathClean;
10 | use reqwest::header::{HeaderName, HeaderValue};
11 | use time::UtcOffset;
12 |
13 | use std::mem::{size_of, zeroed};
14 | use std::ptr::null_mut;
15 | use winapi::um::handleapi::CloseHandle;
16 | use winapi::um::processthreadsapi::{GetCurrentProcess, OpenProcessToken};
17 | use winapi::um::securitybaseapi::GetTokenInformation;
18 | use winapi::um::winnt::{TokenElevation, TOKEN_ELEVATION, TOKEN_QUERY};
19 |
20 | fn get_apath(path: &PathBuf) -> PathBuf {
21 | let apath;
22 | if path.is_absolute() {
23 | apath = path.clean();
24 | } else {
25 | apath = std::env::current_dir().unwrap().join(path).clean();
26 | }
27 | apath
28 | }
29 |
30 | fn get_qq_path_by_reg() -> Result> {
31 | let hkcu = winreg::RegKey::predef(winreg::enums::HKEY_LOCAL_MACHINE);
32 | let qq_setting;
33 | if let Ok(val) = hkcu.open_subkey(r#"Software\Microsoft\Windows\CurrentVersion\Uninstall\QQ"#) {
34 | qq_setting = val;
35 | } else {
36 | qq_setting = hkcu.open_subkey(r#"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\QQ"#)?;
37 | }
38 | let qq_path: String = qq_setting.get_value("UninstallString")?;
39 | let q = PathBuf::from_str(&qq_path)?
40 | .parent()
41 | .ok_or("can't find qq path")?
42 | .to_owned();
43 | Ok(q)
44 | }
45 |
46 | fn get_qq_path_by_current_exe_path() -> Result> {
47 | let current_exe_path = std::env::current_exe()?;
48 | let current_path = current_exe_path.parent().ok_or("can't find current path")?;
49 | let qq_path = current_path.join("QQ.exe");
50 | if qq_path.is_file() {
51 | return Ok(current_path.to_path_buf());
52 | }
53 | Err("can't find qq.exe on current path".into())
54 | }
55 |
56 | fn get_qq_path_by_cfg() -> Result> {
57 | let current_exe_path = std::env::current_exe()?;
58 | let current_path = current_exe_path.parent().ok_or("can't find current path")?;
59 | let cfg_file = current_path.join("llob_install.json");
60 | let json_str = fs::read_to_string(cfg_file)?;
61 | let json: serde_json::Value = serde_json::from_str(&json_str)?;
62 | let qq_path_str = json["qq_exe_path"]
63 | .as_str()
64 | .ok_or("failed to get qq_exe_path")?;
65 | let qq_exe_path = PathBuf::from(qq_path_str);
66 | let qq_exe_path_t = get_apath(&qq_exe_path);
67 | if qq_exe_path_t.is_file() {
68 | return Ok(qq_exe_path_t
69 | .parent()
70 | .ok_or("can't find qq path")?
71 | .to_path_buf());
72 | }
73 | Err("can't find qq.exe llob_install.json".into())
74 | }
75 |
76 | fn get_qq_path() -> Result> {
77 | // 先看配置文件
78 | if let Ok(qq_path) = get_qq_path_by_cfg() {
79 | log::info!("从配置文件获取到QQ.exe");
80 | return Ok(qq_path);
81 | }
82 | // 再看当前目录
83 | if let Ok(qq_path) = get_qq_path_by_current_exe_path() {
84 | log::info!("从当前位置获取到QQ.exe");
85 | return Ok(qq_path);
86 | }
87 | // 再看注册表
88 | if let Ok(qq_path) = get_qq_path_by_reg() {
89 | log::info!("从注册表获取到QQ.exe");
90 | return Ok(qq_path);
91 | }
92 | Err("can't find qq path".into())
93 | }
94 |
95 | fn is_qq_run(qq_path:&PathBuf) -> Result> {
96 | let system = sysinfo::System::new_all();
97 | let process_name = "QQ.exe";
98 | if let Some(process) = system.processes_by_name(process_name).next() {
99 | let process_exe_path = process.exe().ok_or("can't get process exe path")?;
100 | if let Some(process_path) = process_exe_path.parent() {
101 | if process_path == qq_path {
102 | return Ok(true)
103 | }
104 | }
105 | }
106 | Ok(false)
107 | }
108 |
109 | fn http_post(rt_ptr: Arc, url: &str, user_agent: Option<&str>) -> Result, Box> {
110 | let bin = rt_ptr.block_on(async {
111 | let client = reqwest::Client::builder()
112 | .danger_accept_invalid_certs(true)
113 | .no_proxy()
114 | .build()
115 | .unwrap();
116 | let mut req = client
117 | .get(url)
118 | .body(reqwest::Body::from(vec![]))
119 | .build()
120 | .unwrap();
121 | if let Some(ua) = user_agent {
122 | req.headers_mut().append(
123 | HeaderName::from_str("User-Agent").unwrap(),
124 | HeaderValue::from_str(ua).unwrap(),
125 | );
126 | }
127 | let ret = client.execute(req).await;
128 | if ret.is_err() {
129 | log::error!("Failed to download file{:?}", ret.err().unwrap());
130 | return Err("Failed to download file".into());
131 | }
132 | let ret = ret.unwrap();
133 | let bin = ret.bytes().await;
134 | if bin.is_err() {
135 | log::error!("Failed to download file{:?}", bin.err().unwrap());
136 | return Err("Failed to download file".into());
137 | }
138 | let bin = bin.unwrap();
139 | Ok(bin.to_vec())
140 | });
141 | bin
142 | }
143 |
144 | fn is_admin() -> Result> {
145 | let mut token: winapi::um::winnt::HANDLE = null_mut();
146 | let process = unsafe { GetCurrentProcess() };
147 |
148 | if unsafe { OpenProcessToken(process, TOKEN_QUERY, &mut token) } != 0 {
149 | let mut elevation: TOKEN_ELEVATION = unsafe { zeroed() };
150 | let mut ret_length = 0;
151 |
152 | let success = unsafe {
153 | GetTokenInformation(
154 | token,
155 | TokenElevation,
156 | &mut elevation as *mut _ as winapi::shared::minwindef::LPVOID,
157 | size_of::() as u32,
158 | &mut ret_length,
159 | )
160 | };
161 |
162 | unsafe { CloseHandle(token) };
163 |
164 | if success != 0 && elevation.TokenIsElevated != 0 {
165 | Ok(true)
166 | } else {
167 | Ok(false)
168 | }
169 | } else {
170 | Ok(false)
171 | }
172 | }
173 |
174 | fn init_log() {
175 | // 初始化日志
176 | let format = "[year]-[month]-[day] [hour]:[minute]:[second]";
177 |
178 | // 获得utc偏移
179 | let utc_offset;
180 | if let Ok(v) = UtcOffset::current_local_offset() {
181 | utc_offset = v;
182 | } else {
183 | // 中国是东八区,所以这里写8 hour
184 | utc_offset = UtcOffset::from_hms(8, 0, 0).unwrap();
185 | }
186 |
187 | tracing_subscriber::fmt()
188 | .with_timer(tracing_subscriber::fmt::time::OffsetTime::new(
189 | utc_offset,
190 | format_description::parse(format).unwrap(),
191 | ))
192 | .with_ansi(false)
193 | .with_max_level(tracing::Level::INFO)
194 | .init();
195 | }
196 |
197 | fn app_exit() -> ! {
198 | loop {
199 | let time_struct = core::time::Duration::from_millis(500);
200 | std::thread::sleep(time_struct);
201 | }
202 | }
203 |
204 | fn is_x86_64(exe_data: &[u8]) -> Result> {
205 | use goblin::Object;
206 | match Object::parse(exe_data)? {
207 | Object::PE(pe) => Ok(pe.is_64),
208 | _ => Err("File is not a Windows PE file.".into()),
209 | }
210 | }
211 |
212 | fn iswin32(qq_exe_path: &PathBuf) -> Result> {
213 | let content = std::fs::read(qq_exe_path)?;
214 | if is_x86_64(&content)? {
215 | return Ok(false);
216 | }
217 | Ok(true)
218 | }
219 |
220 | pub async fn github_proxy() -> Option {
221 | let urls_to_test = [
222 | "https://kkgithub.com",
223 | "https://dgithub.xyz",
224 | "https://gh-proxy.com/https://github.com",
225 | "https://github.com",
226 | ];
227 | let (tx, mut rx) = tokio::sync::mpsc::channel(urls_to_test.len() + 1);
228 | for url in urls_to_test {
229 | let tx = tx.clone();
230 | tokio::spawn(async move {
231 | let client = reqwest::Client::builder()
232 | .danger_accept_invalid_certs(true)
233 | .no_proxy()
234 | .build()
235 | .unwrap();
236 | let uri = reqwest::Url::from_str(&(url.to_owned() + "/LiteLoaderQQNT/QQNTFileVerifyPatch/releases/download/DllHijack_1.0.8/dbghelp_x64.dll")).unwrap();
237 | let req = client.get(uri).build().unwrap();
238 | if let Ok(ret) = client.execute(req).await {
239 | if ret.status() == reqwest::StatusCode::OK {
240 | if let Ok(bin) = ret.bytes().await {
241 | if bin.starts_with(&[b'M', b'Z']) {
242 | let _err = tx.send(url).await;
243 | }
244 | }
245 | }
246 | };
247 | });
248 | }
249 | tokio::spawn(async move {
250 | tokio::time::sleep(std::time::Duration::from_secs(10)).await;
251 | let _err = tx.send("timeout").await;
252 | });
253 | let ret = rx.recv().await;
254 | if let Some(r) = ret {
255 | if r != "timeout" {
256 | return Some(r.to_owned());
257 | }
258 | }
259 | None
260 | }
261 |
262 | fn fix_index_js(index_js_path:&PathBuf,userdir:&PathBuf) -> Result<(), Box> {
263 | let mut to_write = r#"const fs = require("fs");
264 | const path = require("path");
265 | const package_path = path.join(process.resourcesPath, "app/package.json");
266 | const package = require(package_path);
267 | package.main = "./application/app_launcher/index.js";
268 | fs.writeFileSync(package_path, JSON.stringify(package, null, 4), "utf-8");
269 | "#.to_owned();
270 | to_write.push_str(&("require(String.raw`".to_owned()
271 | + &userdir
272 | .join("LiteLoaderQQNT-main")
273 | .to_string_lossy()
274 | .to_string()
275 | + "`);\r\n"));
276 | to_write.push_str("require('../major.node').load('internal_index', module);\r\n");
277 |
278 | to_write.push_str("setTimeout(() => {\n");
279 | to_write.push_str(" package.main = \"./app_launcher/index.js\";\n");
280 | to_write.push_str(" fs.writeFileSync(package_path, JSON.stringify(package, null, 4), \"utf-8\");\n");
281 | to_write.push_str("}, 0);\n");
282 |
283 | fs::write(
284 | index_js_path,
285 | to_write,
286 | )?;
287 | Ok(())
288 | }
289 |
290 | fn extrat(from: &PathBuf, to: &PathBuf, flag: bool) -> Result<(), Box> {
291 | let file = std::fs::File::open(from)?;
292 |
293 | let mut archive = zip::ZipArchive::new(file)?;
294 | for i in 0..archive.len() {
295 | let mut file = archive.by_index(i)?;
296 | let outpath = match file.enclosed_name() {
297 | Some(path) => {
298 | // write by chatgpt4
299 | let deal_path = path;
300 | let components: Vec<_> = deal_path.components().collect();
301 | if flag {
302 | // println!("components:{components:?}");
303 | if components.len() > 1 {
304 | // 从第二个组件开始收集,直到倒数第二个(不包括最后一个组件)
305 | let new_path = components[1..components.len()]
306 | .iter()
307 | .map(|c| c.as_os_str())
308 | .collect::();
309 | to.join(new_path)
310 | } else {
311 | continue;
312 | //return Err("Path is too short to remove the last component".into());
313 | }
314 | } else {
315 | let new_path = components[0..components.len()]
316 | .iter()
317 | .map(|c| c.as_os_str())
318 | .collect::();
319 | to.join(new_path)
320 | }
321 | }
322 | None => continue,
323 | };
324 |
325 | {
326 | let comment = file.comment();
327 | if !comment.is_empty() {
328 | log::error!("File {i} comment: {comment}");
329 | }
330 | }
331 |
332 | if (*file.name()).ends_with('/') {
333 | // log::info!("File {} extracted to \"{}\"", i, outpath.display());
334 | std::fs::create_dir_all(&outpath)?;
335 | } else {
336 | // log::info!(
337 | // "File {} extracted to \"{}\" ({} bytes)",
338 | // i,
339 | // outpath.display(),
340 | // file.size()
341 | // );
342 | if let Some(p) = outpath.parent() {
343 | if !p.exists() {
344 | std::fs::create_dir_all(p)?;
345 | }
346 | }
347 | let mut outfile = std::fs::File::create(&outpath)?;
348 | std::io::copy(&mut file, &mut outfile)?;
349 | }
350 |
351 | // Get and Set permissions
352 | #[cfg(unix)]
353 | {
354 | use std::os::unix::fs::PermissionsExt;
355 |
356 | if let Some(mode) = file.unix_mode() {
357 | std::fs::set_permissions(&outpath, std::fs::Permissions::from_mode(mode))?;
358 | }
359 | }
360 | }
361 | Ok(())
362 | }
363 |
364 | fn get_qq_version(qqpath:&PathBuf) -> Result> {
365 | let config_json_path = qqpath.join("versions").join("config.json");
366 | let config_str = fs::read_to_string(config_json_path)?;
367 | let config_json:serde_json::Value = serde_json::from_str(&config_str)?;
368 | let cur_version = config_json["curVersion"].as_str().ok_or("解析config.json失败")?;
369 | return Ok(cur_version.to_owned());
370 | }
371 |
372 | fn main() {
373 | if let Err(e) = mymain() {
374 | log::error!("{e:?}");
375 | app_exit();
376 | }
377 | app_exit();
378 | }
379 |
380 | fn fix_package_json(package_json_path:&PathBuf) -> Result<(), Box> {
381 | let json_str = fs::read_to_string(package_json_path)?;
382 | let mut json:serde_json::Value = serde_json::from_str(&json_str)?;
383 | let json_main = json.get_mut("main").ok_or("没有在package.json中找到main字段")?;
384 | *json_main = serde_json::json!("./app_launcher/index.js");
385 | fs::write(
386 | package_json_path,
387 | serde_json::to_string_pretty(&json)?,
388 | )?;
389 | Ok(())
390 | }
391 |
392 | fn mymain() -> Result<(), Box> {
393 | let rt_ptr: Arc = Arc::new(tokio::runtime::Runtime::new().unwrap());
394 |
395 | init_log();
396 |
397 | log::info!("欢迎使用LLOB安装器0.0.10 by super1207");
398 |
399 | if let Ok(_) = std::env::var("LITELOADERQQNT_PROFILE") {
400 | log::error!("检测到您的环境变量中存在LITELOADERQQNT_PROFILE,你可能已经手动安装过LiteLoaderQQNT,程序终止!");
401 | app_exit();
402 | }
403 |
404 | let has_admin = is_admin().unwrap();
405 | if has_admin {
406 | log::info!("拥有管理员权限");
407 | } else {
408 | log::error!("没有管理员权限");
409 | app_exit();
410 | }
411 |
412 | log::info!("正在查询QQ安装位置...");
413 | let qq_path;
414 | if let Ok(qq_path_t) = get_qq_path() {
415 | qq_path = qq_path_t;
416 | log::info!("QQ安装位置: {:?}", qq_path);
417 | } else {
418 | log::error!("未找到QQ安装位置,请去安装QQ!:https://im.qq.com/pcqq/index.shtml");
419 | app_exit();
420 | }
421 |
422 | let qq_version = match get_qq_version(&qq_path) {
423 | Ok(ver) => ver,
424 | Err(err) => {
425 | log::error!("获取QQ版本号失败,注意当前安装器支持的最低NTQQ版本是9.9.15-28060:{err:?}\r\n如果您使用之前的NTQQ版本,请使用旧版安装器!");
426 | app_exit();
427 | },
428 | };
429 |
430 | let qq_inner_path = qq_path.join("versions").join(qq_version).join("resources").join("app");
431 | let package_json_path = qq_inner_path.join("package.json");
432 | let index_js_path = qq_inner_path.join("app_launcher").join("index.js");
433 |
434 |
435 | match is_qq_run(&qq_path) {
436 | Ok(is_run) => {
437 | if !is_run {
438 | // log::info!("QQ未运行");
439 | } else {
440 | log::error!("QQ正在运行,安装LLONEBOT需要确保QQ处于未运行状态,请先结束QQ");
441 | app_exit();
442 | }
443 | }
444 | Err(err) => {
445 | log::error!("无法检查QQ是否正在运行:{err:?}");
446 | app_exit();
447 | }
448 | }
449 | let is_win32 = iswin32(&qq_path.join("QQ.exe"))?;
450 |
451 | log::info!("正在获取github下载代理...");
452 | let git_proxy = rt_ptr.block_on(async {
453 | if let Some(proxy_t) = github_proxy().await {
454 | if proxy_t == "https://github.com" {
455 | log::info!("无需使用代理即可连接github");
456 | } else {
457 | log::info!("使用代理: {:?}", proxy_t);
458 | }
459 | return proxy_t;
460 | } else {
461 | log::error!("无法获取github代理");
462 | app_exit();
463 | }
464 | });
465 |
466 | log::info!("正在获取最新QQNTFileVerifyPatch版本号...");
467 | let url = "https://api.github.com/repos/LiteLoaderQQNT/QQNTFileVerifyPatch/releases/latest";
468 | let bin = match http_post(rt_ptr.clone(), url, Some("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36")) {
469 | Ok(bin) => bin,
470 | Err(_) => {
471 | log::warn!("无法访问GitHub,尝试使用备用URL");
472 | let backup_url = "https://api.hydroroll.team/api/version?repo=LiteLoaderQQNT/QQNTFileVerifyPatch&type=github-releases-latest";
473 | match http_post(rt_ptr.clone(), backup_url, Some("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36")) {
474 | Ok(bin) => bin,
475 | Err(_) => {
476 | log::error!("无法获取最新QQNTFileVerifyPatch版本号");
477 | app_exit();
478 | }
479 | }
480 | }
481 | };
482 | let version_json: serde_json::Value = serde_json::from_slice(&bin)?;
483 | let tag_name = version_json["tag_name"]
484 | .as_str()
485 | .ok_or("Failed to get tag_name")?;
486 | log::info!("最新QQNTFileVerifyPatch版本号:{tag_name}");
487 |
488 | log::info!("正在下载修补文件...");
489 | let patch_url;
490 | if is_win32 {
491 | patch_url = format!("{git_proxy}/LiteLoaderQQNT/QQNTFileVerifyPatch/releases/download/{tag_name}/dbghelp_x86.dll");
492 | } else {
493 | patch_url = format!("{git_proxy}/LiteLoaderQQNT/QQNTFileVerifyPatch/releases/download/{tag_name}/dbghelp_x64.dll");
494 | }
495 | let bin = match http_post(rt_ptr.clone(), &patch_url, None) {
496 | Ok(bin) => bin,
497 | Err(_) => {
498 | log::error!("修补文件下载失败");
499 | app_exit();
500 | }
501 | };
502 | log::info!("修补文件下载完成");
503 |
504 | log::info!("正在修补...");
505 | fs::write(qq_path.join("dbghelp.dll"), bin)?;
506 | log::info!("修补完成");
507 |
508 | log::info!("正在下载LiteLoader项目...");
509 | let patch_url = format!("{git_proxy}/LiteLoaderQQNT/LiteLoaderQQNT/archive/master.zip");
510 | let bin = match http_post(rt_ptr.clone(), &patch_url, None) {
511 | Ok(bin) => bin,
512 | Err(_) => {
513 | log::error!("LiteLoader项目下载失败");
514 | app_exit();
515 | }
516 | };
517 | log::info!("下载完成");
518 |
519 | log::info!("正在解压...");
520 | let userdir = PathBuf::from_str(&std::env::var("USERPROFILE")?)?;
521 | let zip_path = userdir.join("LiteLoaderQQNT-main.zip");
522 | fs::write(&zip_path, bin)?;
523 | extrat(
524 | &zip_path,
525 | &zip_path
526 | .parent()
527 | .ok_or("can't get parent")?
528 | .join("LiteLoaderQQNT-main"),
529 | true,
530 | )?;
531 | log::info!("解压完成");
532 | fix_index_js(&index_js_path,&userdir)?;
533 | fix_package_json(&package_json_path)?;
534 | log::info!("LiteLoaderQQNT安装完成");
535 |
536 | log::info!("正在获取最新LLOB版本号...");
537 | let url = "https://api.github.com/repos/LLOneBot/LLOneBot/releases/latest";
538 | let bin = match http_post(rt_ptr.clone(), url, Some("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36")) {
539 | Ok(bin) => bin,
540 | Err(_) => {
541 | log::warn!("无法访问GitHub,尝试使用备用URL");
542 | let backup_url = "https://api.hydroroll.team/api/version?repo=LLOneBot/LLOneBot&type=github-releases-latest";
543 | match http_post(rt_ptr.clone(), backup_url, Some("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36")) {
544 | Ok(bin) => bin,
545 | Err(_) => {
546 | log::error!("无法获取最新LLOB版本号");
547 | app_exit();
548 | }
549 | }
550 | }
551 | };
552 | let version_json: serde_json::Value = serde_json::from_slice(&bin)?;
553 | let tag_name = version_json["tag_name"]
554 | .as_str()
555 | .ok_or("Failed to get tag_name")?;
556 | log::info!("最新LLOB版本号:{tag_name}");
557 |
558 | log::info!("正在下载LLOB项目...");
559 | let patch_url = format!("{git_proxy}/LLOneBot/LLOneBot/releases/download/{tag_name}/LLOneBot.zip");
560 | let bin = match http_post(rt_ptr.clone(), &patch_url, None) {
561 | Ok(bin) => bin,
562 | Err(_) => {
563 | log::error!("LLOB项目下载失败");
564 | app_exit();
565 | }
566 | };
567 | log::info!("下载完成");
568 |
569 | log::info!("正在安装LLOnebOT...");
570 | let zip_path = userdir
571 | .join("LiteLoaderQQNT-main")
572 | .join("plugins")
573 | .join(format!("LLOneBot{tag_name}.zip"));
574 | std::fs::create_dir_all(zip_path.parent().ok_or("can't get parent")?)?;
575 | // 有时候没这个目录会报错
576 | std::fs::create_dir_all(userdir.join("LiteLoaderQQNT-main").join("data"))?;
577 | fs::write(&zip_path, bin)?;
578 | extrat(
579 | &zip_path,
580 | &zip_path
581 | .parent()
582 | .ok_or("can't get parent")?
583 | .join("LLOneBot"),
584 | false,
585 | )?;
586 | log::info!("安装完成");
587 |
588 | log::info!("安装成功!!!!!!!!!享受快乐时光吧");
589 |
590 | Ok(())
591 | }
592 |
--------------------------------------------------------------------------------