[MIRROR ONLY] A correct and efficient ATProto blob proxy for secure content delivery. codeberg.org/Blooym/porxie
36
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: initial commit

Lyna 9d173283

+5342
+2
.gitignore
··· 1 + /target 2 + test_server.py
+4291
Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "abnf" 7 + version = "0.13.0" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "087113bd50d9adce24850eed5d0476c7d199d532fce8fab5173650331e09033a" 10 + dependencies = [ 11 + "abnf-core", 12 + "nom", 13 + ] 14 + 15 + [[package]] 16 + name = "abnf-core" 17 + version = "0.5.0" 18 + source = "registry+https://github.com/rust-lang/crates.io-index" 19 + checksum = "c44e09c43ae1c368fb91a03a566472d0087c26cf7e1b9e8e289c14ede681dd7d" 20 + dependencies = [ 21 + "nom", 22 + ] 23 + 24 + [[package]] 25 + name = "adler2" 26 + version = "2.0.1" 27 + source = "registry+https://github.com/rust-lang/crates.io-index" 28 + checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 29 + 30 + [[package]] 31 + name = "aho-corasick" 32 + version = "1.1.4" 33 + source = "registry+https://github.com/rust-lang/crates.io-index" 34 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 35 + dependencies = [ 36 + "memchr", 37 + ] 38 + 39 + [[package]] 40 + name = "aliasable" 41 + version = "0.1.3" 42 + source = "registry+https://github.com/rust-lang/crates.io-index" 43 + checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" 44 + 45 + [[package]] 46 + name = "android_system_properties" 47 + version = "0.1.5" 48 + source = "registry+https://github.com/rust-lang/crates.io-index" 49 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 50 + dependencies = [ 51 + "libc", 52 + ] 53 + 54 + [[package]] 55 + name = "anstream" 56 + version = "0.6.21" 57 + source = "registry+https://github.com/rust-lang/crates.io-index" 58 + checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" 59 + dependencies = [ 60 + "anstyle", 61 + "anstyle-parse", 62 + "anstyle-query", 63 + "anstyle-wincon", 64 + "colorchoice", 65 + "is_terminal_polyfill", 66 + "utf8parse", 67 + ] 68 + 69 + [[package]] 70 + name = "anstyle" 71 + version = "1.0.13" 72 + source = "registry+https://github.com/rust-lang/crates.io-index" 73 + checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" 74 + 75 + [[package]] 76 + name = "anstyle-parse" 77 + version = "0.2.7" 78 + source = "registry+https://github.com/rust-lang/crates.io-index" 79 + checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 80 + dependencies = [ 81 + "utf8parse", 82 + ] 83 + 84 + [[package]] 85 + name = "anstyle-query" 86 + version = "1.1.5" 87 + source = "registry+https://github.com/rust-lang/crates.io-index" 88 + checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" 89 + dependencies = [ 90 + "windows-sys 0.61.2", 91 + ] 92 + 93 + [[package]] 94 + name = "anstyle-wincon" 95 + version = "3.0.11" 96 + source = "registry+https://github.com/rust-lang/crates.io-index" 97 + checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" 98 + dependencies = [ 99 + "anstyle", 100 + "once_cell_polyfill", 101 + "windows-sys 0.61.2", 102 + ] 103 + 104 + [[package]] 105 + name = "anyhow" 106 + version = "1.0.102" 107 + source = "registry+https://github.com/rust-lang/crates.io-index" 108 + checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" 109 + 110 + [[package]] 111 + name = "arrayref" 112 + version = "0.3.9" 113 + source = "registry+https://github.com/rust-lang/crates.io-index" 114 + checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" 115 + 116 + [[package]] 117 + name = "arrayvec" 118 + version = "0.7.6" 119 + source = "registry+https://github.com/rust-lang/crates.io-index" 120 + checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 121 + 122 + [[package]] 123 + name = "async-compression" 124 + version = "0.4.40" 125 + source = "registry+https://github.com/rust-lang/crates.io-index" 126 + checksum = "7d67d43201f4d20c78bcda740c142ca52482d81da80681533d33bf3f0596c8e2" 127 + dependencies = [ 128 + "compression-codecs", 129 + "compression-core", 130 + "pin-project-lite", 131 + "tokio", 132 + ] 133 + 134 + [[package]] 135 + name = "async-lock" 136 + version = "3.4.1" 137 + source = "registry+https://github.com/rust-lang/crates.io-index" 138 + checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" 139 + dependencies = [ 140 + "event-listener", 141 + "event-listener-strategy", 142 + "pin-project-lite", 143 + ] 144 + 145 + [[package]] 146 + name = "atomic-polyfill" 147 + version = "1.0.3" 148 + source = "registry+https://github.com/rust-lang/crates.io-index" 149 + checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" 150 + dependencies = [ 151 + "critical-section", 152 + ] 153 + 154 + [[package]] 155 + name = "atomic-waker" 156 + version = "1.1.2" 157 + source = "registry+https://github.com/rust-lang/crates.io-index" 158 + checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 159 + 160 + [[package]] 161 + name = "autocfg" 162 + version = "1.5.0" 163 + source = "registry+https://github.com/rust-lang/crates.io-index" 164 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 165 + 166 + [[package]] 167 + name = "axum" 168 + version = "0.8.8" 169 + source = "registry+https://github.com/rust-lang/crates.io-index" 170 + checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" 171 + dependencies = [ 172 + "axum-core", 173 + "bytes", 174 + "form_urlencoded", 175 + "futures-util", 176 + "http", 177 + "http-body", 178 + "http-body-util", 179 + "hyper", 180 + "hyper-util", 181 + "itoa", 182 + "matchit", 183 + "memchr", 184 + "mime", 185 + "percent-encoding", 186 + "pin-project-lite", 187 + "serde_core", 188 + "serde_json", 189 + "serde_path_to_error", 190 + "serde_urlencoded", 191 + "sync_wrapper", 192 + "tokio", 193 + "tower", 194 + "tower-layer", 195 + "tower-service", 196 + "tracing", 197 + ] 198 + 199 + [[package]] 200 + name = "axum-core" 201 + version = "0.5.6" 202 + source = "registry+https://github.com/rust-lang/crates.io-index" 203 + checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" 204 + dependencies = [ 205 + "bytes", 206 + "futures-core", 207 + "http", 208 + "http-body", 209 + "http-body-util", 210 + "mime", 211 + "pin-project-lite", 212 + "sync_wrapper", 213 + "tower-layer", 214 + "tower-service", 215 + "tracing", 216 + ] 217 + 218 + [[package]] 219 + name = "axum-extra" 220 + version = "0.12.5" 221 + source = "registry+https://github.com/rust-lang/crates.io-index" 222 + checksum = "fef252edff26ddba56bbcdf2ee3307b8129acb86f5749b68990c168a6fcc9c76" 223 + dependencies = [ 224 + "axum", 225 + "axum-core", 226 + "bytes", 227 + "futures-core", 228 + "futures-util", 229 + "headers", 230 + "http", 231 + "http-body", 232 + "http-body-util", 233 + "mime", 234 + "pin-project-lite", 235 + "tower-layer", 236 + "tower-service", 237 + "tracing", 238 + ] 239 + 240 + [[package]] 241 + name = "base-x" 242 + version = "0.2.11" 243 + source = "registry+https://github.com/rust-lang/crates.io-index" 244 + checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" 245 + 246 + [[package]] 247 + name = "base16ct" 248 + version = "0.2.0" 249 + source = "registry+https://github.com/rust-lang/crates.io-index" 250 + checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" 251 + 252 + [[package]] 253 + name = "base256emoji" 254 + version = "1.0.2" 255 + source = "registry+https://github.com/rust-lang/crates.io-index" 256 + checksum = "b5e9430d9a245a77c92176e649af6e275f20839a48389859d1661e9a128d077c" 257 + dependencies = [ 258 + "const-str", 259 + "match-lookup", 260 + ] 261 + 262 + [[package]] 263 + name = "base64" 264 + version = "0.22.1" 265 + source = "registry+https://github.com/rust-lang/crates.io-index" 266 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 267 + 268 + [[package]] 269 + name = "base64ct" 270 + version = "1.8.3" 271 + source = "registry+https://github.com/rust-lang/crates.io-index" 272 + checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" 273 + 274 + [[package]] 275 + name = "bitflags" 276 + version = "1.3.2" 277 + source = "registry+https://github.com/rust-lang/crates.io-index" 278 + checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 279 + 280 + [[package]] 281 + name = "bitflags" 282 + version = "2.11.0" 283 + source = "registry+https://github.com/rust-lang/crates.io-index" 284 + checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" 285 + 286 + [[package]] 287 + name = "blake2b_simd" 288 + version = "1.0.4" 289 + source = "registry+https://github.com/rust-lang/crates.io-index" 290 + checksum = "b79834656f71332577234b50bfc009996f7449e0c056884e6a02492ded0ca2f3" 291 + dependencies = [ 292 + "arrayref", 293 + "arrayvec", 294 + "constant_time_eq", 295 + ] 296 + 297 + [[package]] 298 + name = "blake2s_simd" 299 + version = "1.0.4" 300 + source = "registry+https://github.com/rust-lang/crates.io-index" 301 + checksum = "ee29928bad1e3f94c9d1528da29e07a1d3d04817ae8332de1e8b846c8439f4b3" 302 + dependencies = [ 303 + "arrayref", 304 + "arrayvec", 305 + "constant_time_eq", 306 + ] 307 + 308 + [[package]] 309 + name = "blake3" 310 + version = "1.8.3" 311 + source = "registry+https://github.com/rust-lang/crates.io-index" 312 + checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" 313 + dependencies = [ 314 + "arrayref", 315 + "arrayvec", 316 + "cc", 317 + "cfg-if", 318 + "constant_time_eq", 319 + "cpufeatures", 320 + ] 321 + 322 + [[package]] 323 + name = "block-buffer" 324 + version = "0.10.4" 325 + source = "registry+https://github.com/rust-lang/crates.io-index" 326 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 327 + dependencies = [ 328 + "generic-array", 329 + ] 330 + 331 + [[package]] 332 + name = "bon" 333 + version = "3.9.0" 334 + source = "registry+https://github.com/rust-lang/crates.io-index" 335 + checksum = "2d13a61f2963b88eef9c1be03df65d42f6996dfeac1054870d950fcf66686f83" 336 + dependencies = [ 337 + "bon-macros", 338 + "rustversion", 339 + ] 340 + 341 + [[package]] 342 + name = "bon-macros" 343 + version = "3.9.0" 344 + source = "registry+https://github.com/rust-lang/crates.io-index" 345 + checksum = "d314cc62af2b6b0c65780555abb4d02a03dd3b799cd42419044f0c38d99738c0" 346 + dependencies = [ 347 + "darling 0.23.0", 348 + "ident_case", 349 + "prettyplease", 350 + "proc-macro2", 351 + "quote", 352 + "rustversion", 353 + "syn 2.0.117", 354 + ] 355 + 356 + [[package]] 357 + name = "borsh" 358 + version = "1.6.0" 359 + source = "registry+https://github.com/rust-lang/crates.io-index" 360 + checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" 361 + dependencies = [ 362 + "cfg_aliases", 363 + ] 364 + 365 + [[package]] 366 + name = "btree-range-map" 367 + version = "0.7.2" 368 + source = "registry+https://github.com/rust-lang/crates.io-index" 369 + checksum = "1be5c9672446d3800bcbcaabaeba121fe22f1fb25700c4562b22faf76d377c33" 370 + dependencies = [ 371 + "btree-slab", 372 + "cc-traits", 373 + "range-traits", 374 + "serde", 375 + "slab", 376 + ] 377 + 378 + [[package]] 379 + name = "btree-slab" 380 + version = "0.6.1" 381 + source = "registry+https://github.com/rust-lang/crates.io-index" 382 + checksum = "7a2b56d3029f075c4fa892428a098425b86cef5c89ae54073137ece416aef13c" 383 + dependencies = [ 384 + "cc-traits", 385 + "slab", 386 + "smallvec", 387 + ] 388 + 389 + [[package]] 390 + name = "bumpalo" 391 + version = "3.20.2" 392 + source = "registry+https://github.com/rust-lang/crates.io-index" 393 + checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" 394 + 395 + [[package]] 396 + name = "byteorder" 397 + version = "1.5.0" 398 + source = "registry+https://github.com/rust-lang/crates.io-index" 399 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 400 + 401 + [[package]] 402 + name = "bytes" 403 + version = "1.11.1" 404 + source = "registry+https://github.com/rust-lang/crates.io-index" 405 + checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" 406 + dependencies = [ 407 + "serde", 408 + ] 409 + 410 + [[package]] 411 + name = "bytesize" 412 + version = "2.3.1" 413 + source = "registry+https://github.com/rust-lang/crates.io-index" 414 + checksum = "6bd91ee7b2422bcb158d90ef4d14f75ef67f340943fc4149891dcce8f8b972a3" 415 + dependencies = [ 416 + "serde_core", 417 + ] 418 + 419 + [[package]] 420 + name = "cbor4ii" 421 + version = "0.2.14" 422 + source = "registry+https://github.com/rust-lang/crates.io-index" 423 + checksum = "b544cf8c89359205f4f990d0e6f3828db42df85b5dac95d09157a250eb0749c4" 424 + dependencies = [ 425 + "serde", 426 + ] 427 + 428 + [[package]] 429 + name = "cc" 430 + version = "1.2.56" 431 + source = "registry+https://github.com/rust-lang/crates.io-index" 432 + checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" 433 + dependencies = [ 434 + "find-msvc-tools", 435 + "shlex", 436 + ] 437 + 438 + [[package]] 439 + name = "cc-traits" 440 + version = "2.0.0" 441 + source = "registry+https://github.com/rust-lang/crates.io-index" 442 + checksum = "060303ef31ef4a522737e1b1ab68c67916f2a787bb2f4f54f383279adba962b5" 443 + dependencies = [ 444 + "slab", 445 + ] 446 + 447 + [[package]] 448 + name = "cfb" 449 + version = "0.7.3" 450 + source = "registry+https://github.com/rust-lang/crates.io-index" 451 + checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" 452 + dependencies = [ 453 + "byteorder", 454 + "fnv", 455 + "uuid", 456 + ] 457 + 458 + [[package]] 459 + name = "cfg-if" 460 + version = "1.0.4" 461 + source = "registry+https://github.com/rust-lang/crates.io-index" 462 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 463 + 464 + [[package]] 465 + name = "cfg_aliases" 466 + version = "0.2.1" 467 + source = "registry+https://github.com/rust-lang/crates.io-index" 468 + checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 469 + 470 + [[package]] 471 + name = "chrono" 472 + version = "0.4.43" 473 + source = "registry+https://github.com/rust-lang/crates.io-index" 474 + checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" 475 + dependencies = [ 476 + "iana-time-zone", 477 + "js-sys", 478 + "num-traits", 479 + "serde", 480 + "wasm-bindgen", 481 + "windows-link", 482 + ] 483 + 484 + [[package]] 485 + name = "ciborium" 486 + version = "0.2.2" 487 + source = "registry+https://github.com/rust-lang/crates.io-index" 488 + checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" 489 + dependencies = [ 490 + "ciborium-io", 491 + "ciborium-ll", 492 + "serde", 493 + ] 494 + 495 + [[package]] 496 + name = "ciborium-io" 497 + version = "0.2.2" 498 + source = "registry+https://github.com/rust-lang/crates.io-index" 499 + checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" 500 + 501 + [[package]] 502 + name = "ciborium-ll" 503 + version = "0.2.2" 504 + source = "registry+https://github.com/rust-lang/crates.io-index" 505 + checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" 506 + dependencies = [ 507 + "ciborium-io", 508 + "half", 509 + ] 510 + 511 + [[package]] 512 + name = "cid" 513 + version = "0.11.1" 514 + source = "registry+https://github.com/rust-lang/crates.io-index" 515 + checksum = "3147d8272e8fa0ccd29ce51194dd98f79ddfb8191ba9e3409884e751798acf3a" 516 + dependencies = [ 517 + "core2", 518 + "multibase", 519 + "multihash", 520 + "serde", 521 + "serde_bytes", 522 + "unsigned-varint", 523 + ] 524 + 525 + [[package]] 526 + name = "clap" 527 + version = "4.5.60" 528 + source = "registry+https://github.com/rust-lang/crates.io-index" 529 + checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" 530 + dependencies = [ 531 + "clap_builder", 532 + "clap_derive", 533 + ] 534 + 535 + [[package]] 536 + name = "clap_builder" 537 + version = "4.5.60" 538 + source = "registry+https://github.com/rust-lang/crates.io-index" 539 + checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" 540 + dependencies = [ 541 + "anstream", 542 + "anstyle", 543 + "clap_lex", 544 + "strsim", 545 + ] 546 + 547 + [[package]] 548 + name = "clap_derive" 549 + version = "4.5.55" 550 + source = "registry+https://github.com/rust-lang/crates.io-index" 551 + checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" 552 + dependencies = [ 553 + "heck 0.5.0", 554 + "proc-macro2", 555 + "quote", 556 + "syn 2.0.117", 557 + ] 558 + 559 + [[package]] 560 + name = "clap_lex" 561 + version = "1.0.0" 562 + source = "registry+https://github.com/rust-lang/crates.io-index" 563 + checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" 564 + 565 + [[package]] 566 + name = "cobs" 567 + version = "0.3.0" 568 + source = "registry+https://github.com/rust-lang/crates.io-index" 569 + checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" 570 + dependencies = [ 571 + "thiserror 2.0.18", 572 + ] 573 + 574 + [[package]] 575 + name = "colorchoice" 576 + version = "1.0.4" 577 + source = "registry+https://github.com/rust-lang/crates.io-index" 578 + checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 579 + 580 + [[package]] 581 + name = "compression-codecs" 582 + version = "0.4.37" 583 + source = "registry+https://github.com/rust-lang/crates.io-index" 584 + checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" 585 + dependencies = [ 586 + "compression-core", 587 + "flate2", 588 + "memchr", 589 + ] 590 + 591 + [[package]] 592 + name = "compression-core" 593 + version = "0.4.31" 594 + source = "registry+https://github.com/rust-lang/crates.io-index" 595 + checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" 596 + 597 + [[package]] 598 + name = "concurrent-queue" 599 + version = "2.5.0" 600 + source = "registry+https://github.com/rust-lang/crates.io-index" 601 + checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 602 + dependencies = [ 603 + "crossbeam-utils", 604 + ] 605 + 606 + [[package]] 607 + name = "const-oid" 608 + version = "0.9.6" 609 + source = "registry+https://github.com/rust-lang/crates.io-index" 610 + checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 611 + 612 + [[package]] 613 + name = "const-str" 614 + version = "0.4.3" 615 + source = "registry+https://github.com/rust-lang/crates.io-index" 616 + checksum = "2f421161cb492475f1661ddc9815a745a1c894592070661180fdec3d4872e9c3" 617 + 618 + [[package]] 619 + name = "constant_time_eq" 620 + version = "0.4.2" 621 + source = "registry+https://github.com/rust-lang/crates.io-index" 622 + checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" 623 + 624 + [[package]] 625 + name = "cordyceps" 626 + version = "0.3.4" 627 + source = "registry+https://github.com/rust-lang/crates.io-index" 628 + checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" 629 + dependencies = [ 630 + "loom", 631 + "tracing", 632 + ] 633 + 634 + [[package]] 635 + name = "core-foundation" 636 + version = "0.9.4" 637 + source = "registry+https://github.com/rust-lang/crates.io-index" 638 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 639 + dependencies = [ 640 + "core-foundation-sys", 641 + "libc", 642 + ] 643 + 644 + [[package]] 645 + name = "core-foundation-sys" 646 + version = "0.8.7" 647 + source = "registry+https://github.com/rust-lang/crates.io-index" 648 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 649 + 650 + [[package]] 651 + name = "core2" 652 + version = "0.4.0" 653 + source = "registry+https://github.com/rust-lang/crates.io-index" 654 + checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" 655 + dependencies = [ 656 + "memchr", 657 + ] 658 + 659 + [[package]] 660 + name = "cpufeatures" 661 + version = "0.2.17" 662 + source = "registry+https://github.com/rust-lang/crates.io-index" 663 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 664 + dependencies = [ 665 + "libc", 666 + ] 667 + 668 + [[package]] 669 + name = "crc32fast" 670 + version = "1.5.0" 671 + source = "registry+https://github.com/rust-lang/crates.io-index" 672 + checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" 673 + dependencies = [ 674 + "cfg-if", 675 + ] 676 + 677 + [[package]] 678 + name = "critical-section" 679 + version = "1.2.0" 680 + source = "registry+https://github.com/rust-lang/crates.io-index" 681 + checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" 682 + 683 + [[package]] 684 + name = "crossbeam-channel" 685 + version = "0.5.15" 686 + source = "registry+https://github.com/rust-lang/crates.io-index" 687 + checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" 688 + dependencies = [ 689 + "crossbeam-utils", 690 + ] 691 + 692 + [[package]] 693 + name = "crossbeam-epoch" 694 + version = "0.9.18" 695 + source = "registry+https://github.com/rust-lang/crates.io-index" 696 + checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 697 + dependencies = [ 698 + "crossbeam-utils", 699 + ] 700 + 701 + [[package]] 702 + name = "crossbeam-utils" 703 + version = "0.8.21" 704 + source = "registry+https://github.com/rust-lang/crates.io-index" 705 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 706 + 707 + [[package]] 708 + name = "crunchy" 709 + version = "0.2.4" 710 + source = "registry+https://github.com/rust-lang/crates.io-index" 711 + checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" 712 + 713 + [[package]] 714 + name = "crypto-bigint" 715 + version = "0.5.5" 716 + source = "registry+https://github.com/rust-lang/crates.io-index" 717 + checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" 718 + dependencies = [ 719 + "generic-array", 720 + "rand_core 0.6.4", 721 + "subtle", 722 + "zeroize", 723 + ] 724 + 725 + [[package]] 726 + name = "crypto-common" 727 + version = "0.1.7" 728 + source = "registry+https://github.com/rust-lang/crates.io-index" 729 + checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" 730 + dependencies = [ 731 + "generic-array", 732 + "typenum", 733 + ] 734 + 735 + [[package]] 736 + name = "darling" 737 + version = "0.21.3" 738 + source = "registry+https://github.com/rust-lang/crates.io-index" 739 + checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" 740 + dependencies = [ 741 + "darling_core 0.21.3", 742 + "darling_macro 0.21.3", 743 + ] 744 + 745 + [[package]] 746 + name = "darling" 747 + version = "0.23.0" 748 + source = "registry+https://github.com/rust-lang/crates.io-index" 749 + checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" 750 + dependencies = [ 751 + "darling_core 0.23.0", 752 + "darling_macro 0.23.0", 753 + ] 754 + 755 + [[package]] 756 + name = "darling_core" 757 + version = "0.21.3" 758 + source = "registry+https://github.com/rust-lang/crates.io-index" 759 + checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" 760 + dependencies = [ 761 + "fnv", 762 + "ident_case", 763 + "proc-macro2", 764 + "quote", 765 + "strsim", 766 + "syn 2.0.117", 767 + ] 768 + 769 + [[package]] 770 + name = "darling_core" 771 + version = "0.23.0" 772 + source = "registry+https://github.com/rust-lang/crates.io-index" 773 + checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" 774 + dependencies = [ 775 + "ident_case", 776 + "proc-macro2", 777 + "quote", 778 + "strsim", 779 + "syn 2.0.117", 780 + ] 781 + 782 + [[package]] 783 + name = "darling_macro" 784 + version = "0.21.3" 785 + source = "registry+https://github.com/rust-lang/crates.io-index" 786 + checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" 787 + dependencies = [ 788 + "darling_core 0.21.3", 789 + "quote", 790 + "syn 2.0.117", 791 + ] 792 + 793 + [[package]] 794 + name = "darling_macro" 795 + version = "0.23.0" 796 + source = "registry+https://github.com/rust-lang/crates.io-index" 797 + checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" 798 + dependencies = [ 799 + "darling_core 0.23.0", 800 + "quote", 801 + "syn 2.0.117", 802 + ] 803 + 804 + [[package]] 805 + name = "dashmap" 806 + version = "6.1.0" 807 + source = "registry+https://github.com/rust-lang/crates.io-index" 808 + checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" 809 + dependencies = [ 810 + "cfg-if", 811 + "crossbeam-utils", 812 + "hashbrown 0.14.5", 813 + "lock_api", 814 + "once_cell", 815 + "parking_lot_core", 816 + ] 817 + 818 + [[package]] 819 + name = "data-encoding" 820 + version = "2.10.0" 821 + source = "registry+https://github.com/rust-lang/crates.io-index" 822 + checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" 823 + 824 + [[package]] 825 + name = "data-encoding-macro" 826 + version = "0.1.19" 827 + source = "registry+https://github.com/rust-lang/crates.io-index" 828 + checksum = "8142a83c17aa9461d637e649271eae18bf2edd00e91f2e105df36c3c16355bdb" 829 + dependencies = [ 830 + "data-encoding", 831 + "data-encoding-macro-internal", 832 + ] 833 + 834 + [[package]] 835 + name = "data-encoding-macro-internal" 836 + version = "0.1.17" 837 + source = "registry+https://github.com/rust-lang/crates.io-index" 838 + checksum = "7ab67060fc6b8ef687992d439ca0fa36e7ed17e9a0b16b25b601e8757df720de" 839 + dependencies = [ 840 + "data-encoding", 841 + "syn 2.0.117", 842 + ] 843 + 844 + [[package]] 845 + name = "der" 846 + version = "0.7.10" 847 + source = "registry+https://github.com/rust-lang/crates.io-index" 848 + checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" 849 + dependencies = [ 850 + "const-oid", 851 + "pem-rfc7468", 852 + "zeroize", 853 + ] 854 + 855 + [[package]] 856 + name = "deranged" 857 + version = "0.5.6" 858 + source = "registry+https://github.com/rust-lang/crates.io-index" 859 + checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" 860 + dependencies = [ 861 + "powerfmt", 862 + "serde_core", 863 + ] 864 + 865 + [[package]] 866 + name = "derive_more" 867 + version = "1.0.0" 868 + source = "registry+https://github.com/rust-lang/crates.io-index" 869 + checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" 870 + dependencies = [ 871 + "derive_more-impl", 872 + ] 873 + 874 + [[package]] 875 + name = "derive_more-impl" 876 + version = "1.0.0" 877 + source = "registry+https://github.com/rust-lang/crates.io-index" 878 + checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" 879 + dependencies = [ 880 + "proc-macro2", 881 + "quote", 882 + "syn 2.0.117", 883 + "unicode-xid", 884 + ] 885 + 886 + [[package]] 887 + name = "diatomic-waker" 888 + version = "0.2.3" 889 + source = "registry+https://github.com/rust-lang/crates.io-index" 890 + checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" 891 + 892 + [[package]] 893 + name = "digest" 894 + version = "0.10.7" 895 + source = "registry+https://github.com/rust-lang/crates.io-index" 896 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 897 + dependencies = [ 898 + "block-buffer", 899 + "const-oid", 900 + "crypto-common", 901 + "subtle", 902 + ] 903 + 904 + [[package]] 905 + name = "displaydoc" 906 + version = "0.2.5" 907 + source = "registry+https://github.com/rust-lang/crates.io-index" 908 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 909 + dependencies = [ 910 + "proc-macro2", 911 + "quote", 912 + "syn 2.0.117", 913 + ] 914 + 915 + [[package]] 916 + name = "dotenvy" 917 + version = "0.15.7" 918 + source = "registry+https://github.com/rust-lang/crates.io-index" 919 + checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 920 + 921 + [[package]] 922 + name = "dyn-clone" 923 + version = "1.0.20" 924 + source = "registry+https://github.com/rust-lang/crates.io-index" 925 + checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" 926 + 927 + [[package]] 928 + name = "ecdsa" 929 + version = "0.16.9" 930 + source = "registry+https://github.com/rust-lang/crates.io-index" 931 + checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" 932 + dependencies = [ 933 + "der", 934 + "digest", 935 + "elliptic-curve", 936 + "rfc6979", 937 + "signature", 938 + "spki", 939 + ] 940 + 941 + [[package]] 942 + name = "elliptic-curve" 943 + version = "0.13.8" 944 + source = "registry+https://github.com/rust-lang/crates.io-index" 945 + checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" 946 + dependencies = [ 947 + "base16ct", 948 + "crypto-bigint", 949 + "digest", 950 + "ff", 951 + "generic-array", 952 + "group", 953 + "pem-rfc7468", 954 + "pkcs8", 955 + "rand_core 0.6.4", 956 + "sec1", 957 + "subtle", 958 + "zeroize", 959 + ] 960 + 961 + [[package]] 962 + name = "embedded-io" 963 + version = "0.4.0" 964 + source = "registry+https://github.com/rust-lang/crates.io-index" 965 + checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" 966 + 967 + [[package]] 968 + name = "embedded-io" 969 + version = "0.6.1" 970 + source = "registry+https://github.com/rust-lang/crates.io-index" 971 + checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" 972 + 973 + [[package]] 974 + name = "encoding_rs" 975 + version = "0.8.35" 976 + source = "registry+https://github.com/rust-lang/crates.io-index" 977 + checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 978 + dependencies = [ 979 + "cfg-if", 980 + ] 981 + 982 + [[package]] 983 + name = "equivalent" 984 + version = "1.0.2" 985 + source = "registry+https://github.com/rust-lang/crates.io-index" 986 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 987 + 988 + [[package]] 989 + name = "errno" 990 + version = "0.3.14" 991 + source = "registry+https://github.com/rust-lang/crates.io-index" 992 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 993 + dependencies = [ 994 + "libc", 995 + "windows-sys 0.61.2", 996 + ] 997 + 998 + [[package]] 999 + name = "event-listener" 1000 + version = "5.4.1" 1001 + source = "registry+https://github.com/rust-lang/crates.io-index" 1002 + checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" 1003 + dependencies = [ 1004 + "concurrent-queue", 1005 + "parking", 1006 + "pin-project-lite", 1007 + ] 1008 + 1009 + [[package]] 1010 + name = "event-listener-strategy" 1011 + version = "0.5.4" 1012 + source = "registry+https://github.com/rust-lang/crates.io-index" 1013 + checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" 1014 + dependencies = [ 1015 + "event-listener", 1016 + "pin-project-lite", 1017 + ] 1018 + 1019 + [[package]] 1020 + name = "fastrand" 1021 + version = "2.3.0" 1022 + source = "registry+https://github.com/rust-lang/crates.io-index" 1023 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1024 + 1025 + [[package]] 1026 + name = "ff" 1027 + version = "0.13.1" 1028 + source = "registry+https://github.com/rust-lang/crates.io-index" 1029 + checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" 1030 + dependencies = [ 1031 + "rand_core 0.6.4", 1032 + "subtle", 1033 + ] 1034 + 1035 + [[package]] 1036 + name = "find-msvc-tools" 1037 + version = "0.1.9" 1038 + source = "registry+https://github.com/rust-lang/crates.io-index" 1039 + checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" 1040 + 1041 + [[package]] 1042 + name = "flate2" 1043 + version = "1.1.9" 1044 + source = "registry+https://github.com/rust-lang/crates.io-index" 1045 + checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" 1046 + dependencies = [ 1047 + "crc32fast", 1048 + "miniz_oxide", 1049 + ] 1050 + 1051 + [[package]] 1052 + name = "fnv" 1053 + version = "1.0.7" 1054 + source = "registry+https://github.com/rust-lang/crates.io-index" 1055 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1056 + 1057 + [[package]] 1058 + name = "foldhash" 1059 + version = "0.1.5" 1060 + source = "registry+https://github.com/rust-lang/crates.io-index" 1061 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 1062 + 1063 + [[package]] 1064 + name = "form_urlencoded" 1065 + version = "1.2.2" 1066 + source = "registry+https://github.com/rust-lang/crates.io-index" 1067 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 1068 + dependencies = [ 1069 + "percent-encoding", 1070 + ] 1071 + 1072 + [[package]] 1073 + name = "futures" 1074 + version = "0.3.32" 1075 + source = "registry+https://github.com/rust-lang/crates.io-index" 1076 + checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" 1077 + dependencies = [ 1078 + "futures-channel", 1079 + "futures-core", 1080 + "futures-executor", 1081 + "futures-io", 1082 + "futures-sink", 1083 + "futures-task", 1084 + "futures-util", 1085 + ] 1086 + 1087 + [[package]] 1088 + name = "futures-buffered" 1089 + version = "0.2.13" 1090 + source = "registry+https://github.com/rust-lang/crates.io-index" 1091 + checksum = "4421cb78ee172b6b06080093479d3c50f058e7c81b7d577bbb8d118d551d4cd5" 1092 + dependencies = [ 1093 + "cordyceps", 1094 + "diatomic-waker", 1095 + "futures-core", 1096 + "pin-project-lite", 1097 + "spin 0.10.0", 1098 + ] 1099 + 1100 + [[package]] 1101 + name = "futures-channel" 1102 + version = "0.3.32" 1103 + source = "registry+https://github.com/rust-lang/crates.io-index" 1104 + checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" 1105 + dependencies = [ 1106 + "futures-core", 1107 + "futures-sink", 1108 + ] 1109 + 1110 + [[package]] 1111 + name = "futures-core" 1112 + version = "0.3.32" 1113 + source = "registry+https://github.com/rust-lang/crates.io-index" 1114 + checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" 1115 + 1116 + [[package]] 1117 + name = "futures-executor" 1118 + version = "0.3.32" 1119 + source = "registry+https://github.com/rust-lang/crates.io-index" 1120 + checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" 1121 + dependencies = [ 1122 + "futures-core", 1123 + "futures-task", 1124 + "futures-util", 1125 + ] 1126 + 1127 + [[package]] 1128 + name = "futures-io" 1129 + version = "0.3.32" 1130 + source = "registry+https://github.com/rust-lang/crates.io-index" 1131 + checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" 1132 + 1133 + [[package]] 1134 + name = "futures-lite" 1135 + version = "2.6.1" 1136 + source = "registry+https://github.com/rust-lang/crates.io-index" 1137 + checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" 1138 + dependencies = [ 1139 + "fastrand", 1140 + "futures-core", 1141 + "futures-io", 1142 + "parking", 1143 + "pin-project-lite", 1144 + ] 1145 + 1146 + [[package]] 1147 + name = "futures-macro" 1148 + version = "0.3.32" 1149 + source = "registry+https://github.com/rust-lang/crates.io-index" 1150 + checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" 1151 + dependencies = [ 1152 + "proc-macro2", 1153 + "quote", 1154 + "syn 2.0.117", 1155 + ] 1156 + 1157 + [[package]] 1158 + name = "futures-sink" 1159 + version = "0.3.32" 1160 + source = "registry+https://github.com/rust-lang/crates.io-index" 1161 + checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" 1162 + 1163 + [[package]] 1164 + name = "futures-task" 1165 + version = "0.3.32" 1166 + source = "registry+https://github.com/rust-lang/crates.io-index" 1167 + checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" 1168 + 1169 + [[package]] 1170 + name = "futures-util" 1171 + version = "0.3.32" 1172 + source = "registry+https://github.com/rust-lang/crates.io-index" 1173 + checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" 1174 + dependencies = [ 1175 + "futures-channel", 1176 + "futures-core", 1177 + "futures-io", 1178 + "futures-macro", 1179 + "futures-sink", 1180 + "futures-task", 1181 + "memchr", 1182 + "pin-project-lite", 1183 + "slab", 1184 + ] 1185 + 1186 + [[package]] 1187 + name = "generator" 1188 + version = "0.8.8" 1189 + source = "registry+https://github.com/rust-lang/crates.io-index" 1190 + checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" 1191 + dependencies = [ 1192 + "cc", 1193 + "cfg-if", 1194 + "libc", 1195 + "log", 1196 + "rustversion", 1197 + "windows-link", 1198 + "windows-result", 1199 + ] 1200 + 1201 + [[package]] 1202 + name = "generic-array" 1203 + version = "0.14.7" 1204 + source = "registry+https://github.com/rust-lang/crates.io-index" 1205 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1206 + dependencies = [ 1207 + "typenum", 1208 + "version_check", 1209 + "zeroize", 1210 + ] 1211 + 1212 + [[package]] 1213 + name = "getrandom" 1214 + version = "0.2.17" 1215 + source = "registry+https://github.com/rust-lang/crates.io-index" 1216 + checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" 1217 + dependencies = [ 1218 + "cfg-if", 1219 + "js-sys", 1220 + "libc", 1221 + "wasi", 1222 + "wasm-bindgen", 1223 + ] 1224 + 1225 + [[package]] 1226 + name = "getrandom" 1227 + version = "0.3.4" 1228 + source = "registry+https://github.com/rust-lang/crates.io-index" 1229 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 1230 + dependencies = [ 1231 + "cfg-if", 1232 + "js-sys", 1233 + "libc", 1234 + "r-efi", 1235 + "wasip2", 1236 + "wasm-bindgen", 1237 + ] 1238 + 1239 + [[package]] 1240 + name = "getrandom" 1241 + version = "0.4.1" 1242 + source = "registry+https://github.com/rust-lang/crates.io-index" 1243 + checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" 1244 + dependencies = [ 1245 + "cfg-if", 1246 + "libc", 1247 + "r-efi", 1248 + "wasip2", 1249 + "wasip3", 1250 + ] 1251 + 1252 + [[package]] 1253 + name = "group" 1254 + version = "0.13.0" 1255 + source = "registry+https://github.com/rust-lang/crates.io-index" 1256 + checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" 1257 + dependencies = [ 1258 + "ff", 1259 + "rand_core 0.6.4", 1260 + "subtle", 1261 + ] 1262 + 1263 + [[package]] 1264 + name = "h2" 1265 + version = "0.4.13" 1266 + source = "registry+https://github.com/rust-lang/crates.io-index" 1267 + checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" 1268 + dependencies = [ 1269 + "atomic-waker", 1270 + "bytes", 1271 + "fnv", 1272 + "futures-core", 1273 + "futures-sink", 1274 + "http", 1275 + "indexmap 2.13.0", 1276 + "slab", 1277 + "tokio", 1278 + "tokio-util", 1279 + "tracing", 1280 + ] 1281 + 1282 + [[package]] 1283 + name = "half" 1284 + version = "2.7.1" 1285 + source = "registry+https://github.com/rust-lang/crates.io-index" 1286 + checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" 1287 + dependencies = [ 1288 + "cfg-if", 1289 + "crunchy", 1290 + "zerocopy", 1291 + ] 1292 + 1293 + [[package]] 1294 + name = "hash32" 1295 + version = "0.2.1" 1296 + source = "registry+https://github.com/rust-lang/crates.io-index" 1297 + checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" 1298 + dependencies = [ 1299 + "byteorder", 1300 + ] 1301 + 1302 + [[package]] 1303 + name = "hashbrown" 1304 + version = "0.12.3" 1305 + source = "registry+https://github.com/rust-lang/crates.io-index" 1306 + checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1307 + 1308 + [[package]] 1309 + name = "hashbrown" 1310 + version = "0.14.5" 1311 + source = "registry+https://github.com/rust-lang/crates.io-index" 1312 + checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1313 + 1314 + [[package]] 1315 + name = "hashbrown" 1316 + version = "0.15.5" 1317 + source = "registry+https://github.com/rust-lang/crates.io-index" 1318 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 1319 + dependencies = [ 1320 + "foldhash", 1321 + ] 1322 + 1323 + [[package]] 1324 + name = "hashbrown" 1325 + version = "0.16.1" 1326 + source = "registry+https://github.com/rust-lang/crates.io-index" 1327 + checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" 1328 + 1329 + [[package]] 1330 + name = "headers" 1331 + version = "0.4.1" 1332 + source = "registry+https://github.com/rust-lang/crates.io-index" 1333 + checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" 1334 + dependencies = [ 1335 + "base64", 1336 + "bytes", 1337 + "headers-core", 1338 + "http", 1339 + "httpdate", 1340 + "mime", 1341 + "sha1", 1342 + ] 1343 + 1344 + [[package]] 1345 + name = "headers-core" 1346 + version = "0.3.0" 1347 + source = "registry+https://github.com/rust-lang/crates.io-index" 1348 + checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" 1349 + dependencies = [ 1350 + "http", 1351 + ] 1352 + 1353 + [[package]] 1354 + name = "heapless" 1355 + version = "0.7.17" 1356 + source = "registry+https://github.com/rust-lang/crates.io-index" 1357 + checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" 1358 + dependencies = [ 1359 + "atomic-polyfill", 1360 + "hash32", 1361 + "rustc_version", 1362 + "serde", 1363 + "spin 0.9.8", 1364 + "stable_deref_trait", 1365 + ] 1366 + 1367 + [[package]] 1368 + name = "heck" 1369 + version = "0.4.1" 1370 + source = "registry+https://github.com/rust-lang/crates.io-index" 1371 + checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 1372 + 1373 + [[package]] 1374 + name = "heck" 1375 + version = "0.5.0" 1376 + source = "registry+https://github.com/rust-lang/crates.io-index" 1377 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1378 + 1379 + [[package]] 1380 + name = "hex" 1381 + version = "0.4.3" 1382 + source = "registry+https://github.com/rust-lang/crates.io-index" 1383 + checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1384 + 1385 + [[package]] 1386 + name = "hex_fmt" 1387 + version = "0.3.0" 1388 + source = "registry+https://github.com/rust-lang/crates.io-index" 1389 + checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" 1390 + 1391 + [[package]] 1392 + name = "hmac" 1393 + version = "0.12.1" 1394 + source = "registry+https://github.com/rust-lang/crates.io-index" 1395 + checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1396 + dependencies = [ 1397 + "digest", 1398 + ] 1399 + 1400 + [[package]] 1401 + name = "http" 1402 + version = "1.4.0" 1403 + source = "registry+https://github.com/rust-lang/crates.io-index" 1404 + checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" 1405 + dependencies = [ 1406 + "bytes", 1407 + "itoa", 1408 + ] 1409 + 1410 + [[package]] 1411 + name = "http-body" 1412 + version = "1.0.1" 1413 + source = "registry+https://github.com/rust-lang/crates.io-index" 1414 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 1415 + dependencies = [ 1416 + "bytes", 1417 + "http", 1418 + ] 1419 + 1420 + [[package]] 1421 + name = "http-body-util" 1422 + version = "0.1.3" 1423 + source = "registry+https://github.com/rust-lang/crates.io-index" 1424 + checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 1425 + dependencies = [ 1426 + "bytes", 1427 + "futures-core", 1428 + "http", 1429 + "http-body", 1430 + "pin-project-lite", 1431 + ] 1432 + 1433 + [[package]] 1434 + name = "httparse" 1435 + version = "1.10.1" 1436 + source = "registry+https://github.com/rust-lang/crates.io-index" 1437 + checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 1438 + 1439 + [[package]] 1440 + name = "httpdate" 1441 + version = "1.0.3" 1442 + source = "registry+https://github.com/rust-lang/crates.io-index" 1443 + checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1444 + 1445 + [[package]] 1446 + name = "humantime" 1447 + version = "2.3.0" 1448 + source = "registry+https://github.com/rust-lang/crates.io-index" 1449 + checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" 1450 + 1451 + [[package]] 1452 + name = "hyper" 1453 + version = "1.8.1" 1454 + source = "registry+https://github.com/rust-lang/crates.io-index" 1455 + checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" 1456 + dependencies = [ 1457 + "atomic-waker", 1458 + "bytes", 1459 + "futures-channel", 1460 + "futures-core", 1461 + "h2", 1462 + "http", 1463 + "http-body", 1464 + "httparse", 1465 + "httpdate", 1466 + "itoa", 1467 + "pin-project-lite", 1468 + "pin-utils", 1469 + "smallvec", 1470 + "tokio", 1471 + "want", 1472 + ] 1473 + 1474 + [[package]] 1475 + name = "hyper-rustls" 1476 + version = "0.27.7" 1477 + source = "registry+https://github.com/rust-lang/crates.io-index" 1478 + checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" 1479 + dependencies = [ 1480 + "http", 1481 + "hyper", 1482 + "hyper-util", 1483 + "rustls", 1484 + "rustls-pki-types", 1485 + "tokio", 1486 + "tokio-rustls", 1487 + "tower-service", 1488 + "webpki-roots", 1489 + ] 1490 + 1491 + [[package]] 1492 + name = "hyper-util" 1493 + version = "0.1.20" 1494 + source = "registry+https://github.com/rust-lang/crates.io-index" 1495 + checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" 1496 + dependencies = [ 1497 + "base64", 1498 + "bytes", 1499 + "futures-channel", 1500 + "futures-util", 1501 + "http", 1502 + "http-body", 1503 + "hyper", 1504 + "ipnet", 1505 + "libc", 1506 + "percent-encoding", 1507 + "pin-project-lite", 1508 + "socket2", 1509 + "system-configuration", 1510 + "tokio", 1511 + "tower-service", 1512 + "tracing", 1513 + "windows-registry", 1514 + ] 1515 + 1516 + [[package]] 1517 + name = "iana-time-zone" 1518 + version = "0.1.65" 1519 + source = "registry+https://github.com/rust-lang/crates.io-index" 1520 + checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" 1521 + dependencies = [ 1522 + "android_system_properties", 1523 + "core-foundation-sys", 1524 + "iana-time-zone-haiku", 1525 + "js-sys", 1526 + "log", 1527 + "wasm-bindgen", 1528 + "windows-core", 1529 + ] 1530 + 1531 + [[package]] 1532 + name = "iana-time-zone-haiku" 1533 + version = "0.1.2" 1534 + source = "registry+https://github.com/rust-lang/crates.io-index" 1535 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1536 + dependencies = [ 1537 + "cc", 1538 + ] 1539 + 1540 + [[package]] 1541 + name = "icu_collections" 1542 + version = "2.1.1" 1543 + source = "registry+https://github.com/rust-lang/crates.io-index" 1544 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 1545 + dependencies = [ 1546 + "displaydoc", 1547 + "potential_utf", 1548 + "yoke", 1549 + "zerofrom", 1550 + "zerovec", 1551 + ] 1552 + 1553 + [[package]] 1554 + name = "icu_locale_core" 1555 + version = "2.1.1" 1556 + source = "registry+https://github.com/rust-lang/crates.io-index" 1557 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 1558 + dependencies = [ 1559 + "displaydoc", 1560 + "litemap", 1561 + "tinystr", 1562 + "writeable", 1563 + "zerovec", 1564 + ] 1565 + 1566 + [[package]] 1567 + name = "icu_normalizer" 1568 + version = "2.1.1" 1569 + source = "registry+https://github.com/rust-lang/crates.io-index" 1570 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 1571 + dependencies = [ 1572 + "icu_collections", 1573 + "icu_normalizer_data", 1574 + "icu_properties", 1575 + "icu_provider", 1576 + "smallvec", 1577 + "zerovec", 1578 + ] 1579 + 1580 + [[package]] 1581 + name = "icu_normalizer_data" 1582 + version = "2.1.1" 1583 + source = "registry+https://github.com/rust-lang/crates.io-index" 1584 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 1585 + 1586 + [[package]] 1587 + name = "icu_properties" 1588 + version = "2.1.2" 1589 + source = "registry+https://github.com/rust-lang/crates.io-index" 1590 + checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" 1591 + dependencies = [ 1592 + "icu_collections", 1593 + "icu_locale_core", 1594 + "icu_properties_data", 1595 + "icu_provider", 1596 + "zerotrie", 1597 + "zerovec", 1598 + ] 1599 + 1600 + [[package]] 1601 + name = "icu_properties_data" 1602 + version = "2.1.2" 1603 + source = "registry+https://github.com/rust-lang/crates.io-index" 1604 + checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" 1605 + 1606 + [[package]] 1607 + name = "icu_provider" 1608 + version = "2.1.1" 1609 + source = "registry+https://github.com/rust-lang/crates.io-index" 1610 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 1611 + dependencies = [ 1612 + "displaydoc", 1613 + "icu_locale_core", 1614 + "writeable", 1615 + "yoke", 1616 + "zerofrom", 1617 + "zerotrie", 1618 + "zerovec", 1619 + ] 1620 + 1621 + [[package]] 1622 + name = "id-arena" 1623 + version = "2.3.0" 1624 + source = "registry+https://github.com/rust-lang/crates.io-index" 1625 + checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" 1626 + 1627 + [[package]] 1628 + name = "ident_case" 1629 + version = "1.0.1" 1630 + source = "registry+https://github.com/rust-lang/crates.io-index" 1631 + checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1632 + 1633 + [[package]] 1634 + name = "idna" 1635 + version = "1.1.0" 1636 + source = "registry+https://github.com/rust-lang/crates.io-index" 1637 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 1638 + dependencies = [ 1639 + "idna_adapter", 1640 + "smallvec", 1641 + "utf8_iter", 1642 + ] 1643 + 1644 + [[package]] 1645 + name = "idna_adapter" 1646 + version = "1.2.1" 1647 + source = "registry+https://github.com/rust-lang/crates.io-index" 1648 + checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 1649 + dependencies = [ 1650 + "icu_normalizer", 1651 + "icu_properties", 1652 + ] 1653 + 1654 + [[package]] 1655 + name = "indexmap" 1656 + version = "1.9.3" 1657 + source = "registry+https://github.com/rust-lang/crates.io-index" 1658 + checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 1659 + dependencies = [ 1660 + "autocfg", 1661 + "hashbrown 0.12.3", 1662 + "serde", 1663 + ] 1664 + 1665 + [[package]] 1666 + name = "indexmap" 1667 + version = "2.13.0" 1668 + source = "registry+https://github.com/rust-lang/crates.io-index" 1669 + checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" 1670 + dependencies = [ 1671 + "equivalent", 1672 + "hashbrown 0.16.1", 1673 + "serde", 1674 + "serde_core", 1675 + ] 1676 + 1677 + [[package]] 1678 + name = "indoc" 1679 + version = "2.0.7" 1680 + source = "registry+https://github.com/rust-lang/crates.io-index" 1681 + checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" 1682 + dependencies = [ 1683 + "rustversion", 1684 + ] 1685 + 1686 + [[package]] 1687 + name = "infer" 1688 + version = "0.19.0" 1689 + source = "registry+https://github.com/rust-lang/crates.io-index" 1690 + checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" 1691 + dependencies = [ 1692 + "cfb", 1693 + ] 1694 + 1695 + [[package]] 1696 + name = "inventory" 1697 + version = "0.3.22" 1698 + source = "registry+https://github.com/rust-lang/crates.io-index" 1699 + checksum = "009ae045c87e7082cb72dab0ccd01ae075dd00141ddc108f43a0ea150a9e7227" 1700 + dependencies = [ 1701 + "rustversion", 1702 + ] 1703 + 1704 + [[package]] 1705 + name = "ipld-core" 1706 + version = "0.4.3" 1707 + source = "registry+https://github.com/rust-lang/crates.io-index" 1708 + checksum = "090f624976d72f0b0bb71b86d58dc16c15e069193067cb3a3a09d655246cbbda" 1709 + dependencies = [ 1710 + "cid", 1711 + "serde", 1712 + "serde_bytes", 1713 + ] 1714 + 1715 + [[package]] 1716 + name = "ipnet" 1717 + version = "2.11.0" 1718 + source = "registry+https://github.com/rust-lang/crates.io-index" 1719 + checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 1720 + 1721 + [[package]] 1722 + name = "iri-string" 1723 + version = "0.7.10" 1724 + source = "registry+https://github.com/rust-lang/crates.io-index" 1725 + checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" 1726 + dependencies = [ 1727 + "memchr", 1728 + "serde", 1729 + ] 1730 + 1731 + [[package]] 1732 + name = "is_terminal_polyfill" 1733 + version = "1.70.2" 1734 + source = "registry+https://github.com/rust-lang/crates.io-index" 1735 + checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" 1736 + 1737 + [[package]] 1738 + name = "itoa" 1739 + version = "1.0.17" 1740 + source = "registry+https://github.com/rust-lang/crates.io-index" 1741 + checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" 1742 + 1743 + [[package]] 1744 + name = "jacquard-api" 1745 + version = "0.9.5" 1746 + source = "registry+https://github.com/rust-lang/crates.io-index" 1747 + checksum = "4979fb1848c1dd7ac8fd12745bc71f56f6da61374407d5f9b06005467a954e5a" 1748 + dependencies = [ 1749 + "bon", 1750 + "bytes", 1751 + "jacquard-common", 1752 + "jacquard-derive", 1753 + "jacquard-lexicon", 1754 + "miette", 1755 + "rustversion", 1756 + "serde", 1757 + "serde_bytes", 1758 + "serde_ipld_dagcbor", 1759 + "thiserror 2.0.18", 1760 + "unicode-segmentation", 1761 + ] 1762 + 1763 + [[package]] 1764 + name = "jacquard-common" 1765 + version = "0.9.5" 1766 + source = "registry+https://github.com/rust-lang/crates.io-index" 1767 + checksum = "1751921e0bdae5e0077afade6161545e9ef7698306c868f800916e99ecbcaae9" 1768 + dependencies = [ 1769 + "base64", 1770 + "bon", 1771 + "bytes", 1772 + "chrono", 1773 + "cid", 1774 + "getrandom 0.2.17", 1775 + "getrandom 0.3.4", 1776 + "http", 1777 + "ipld-core", 1778 + "k256", 1779 + "langtag", 1780 + "miette", 1781 + "multibase", 1782 + "multihash", 1783 + "ouroboros", 1784 + "p256", 1785 + "postcard", 1786 + "rand", 1787 + "regex", 1788 + "regex-lite", 1789 + "reqwest", 1790 + "serde", 1791 + "serde_bytes", 1792 + "serde_html_form", 1793 + "serde_ipld_dagcbor", 1794 + "serde_json", 1795 + "signature", 1796 + "smol_str", 1797 + "thiserror 2.0.18", 1798 + "tokio", 1799 + "tokio-util", 1800 + "trait-variant", 1801 + "url", 1802 + ] 1803 + 1804 + [[package]] 1805 + name = "jacquard-derive" 1806 + version = "0.9.5" 1807 + source = "registry+https://github.com/rust-lang/crates.io-index" 1808 + checksum = "9c8d73dfee07943fdab93569ed1c28b06c6921ed891c08b415c4a323ff67e593" 1809 + dependencies = [ 1810 + "heck 0.5.0", 1811 + "jacquard-lexicon", 1812 + "proc-macro2", 1813 + "quote", 1814 + "syn 2.0.117", 1815 + ] 1816 + 1817 + [[package]] 1818 + name = "jacquard-identity" 1819 + version = "0.9.5" 1820 + source = "registry+https://github.com/rust-lang/crates.io-index" 1821 + checksum = "e7aaefa819fa4213cf59f180dba932f018a7cd0599582fd38474ee2a38c16cf2" 1822 + dependencies = [ 1823 + "bon", 1824 + "bytes", 1825 + "http", 1826 + "jacquard-api", 1827 + "jacquard-common", 1828 + "jacquard-lexicon", 1829 + "miette", 1830 + "n0-future", 1831 + "percent-encoding", 1832 + "reqwest", 1833 + "serde", 1834 + "serde_html_form", 1835 + "serde_json", 1836 + "thiserror 2.0.18", 1837 + "tokio", 1838 + "trait-variant", 1839 + "url", 1840 + "urlencoding", 1841 + ] 1842 + 1843 + [[package]] 1844 + name = "jacquard-lexicon" 1845 + version = "0.9.5" 1846 + source = "registry+https://github.com/rust-lang/crates.io-index" 1847 + checksum = "8411aff546569b0a1e0ef669bed2380cec1c00d48f02f3fcd57a71545321b3d8" 1848 + dependencies = [ 1849 + "cid", 1850 + "dashmap", 1851 + "heck 0.5.0", 1852 + "inventory", 1853 + "jacquard-common", 1854 + "miette", 1855 + "multihash", 1856 + "prettyplease", 1857 + "proc-macro2", 1858 + "quote", 1859 + "serde", 1860 + "serde_ipld_dagcbor", 1861 + "serde_json", 1862 + "serde_repr", 1863 + "serde_with", 1864 + "sha2", 1865 + "syn 2.0.117", 1866 + "thiserror 2.0.18", 1867 + "unicode-segmentation", 1868 + ] 1869 + 1870 + [[package]] 1871 + name = "js-sys" 1872 + version = "0.3.85" 1873 + source = "registry+https://github.com/rust-lang/crates.io-index" 1874 + checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" 1875 + dependencies = [ 1876 + "once_cell", 1877 + "wasm-bindgen", 1878 + ] 1879 + 1880 + [[package]] 1881 + name = "k256" 1882 + version = "0.13.4" 1883 + source = "registry+https://github.com/rust-lang/crates.io-index" 1884 + checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" 1885 + dependencies = [ 1886 + "cfg-if", 1887 + "ecdsa", 1888 + "elliptic-curve", 1889 + "sha2", 1890 + ] 1891 + 1892 + [[package]] 1893 + name = "keccak" 1894 + version = "0.1.6" 1895 + source = "registry+https://github.com/rust-lang/crates.io-index" 1896 + checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" 1897 + dependencies = [ 1898 + "cpufeatures", 1899 + ] 1900 + 1901 + [[package]] 1902 + name = "langtag" 1903 + version = "0.4.0" 1904 + source = "registry+https://github.com/rust-lang/crates.io-index" 1905 + checksum = "9ecb4c689a30e48ebeaa14237f34037e300dd072e6ad21a9ec72e810ff3c6600" 1906 + dependencies = [ 1907 + "serde", 1908 + "static-regular-grammar", 1909 + "thiserror 1.0.69", 1910 + ] 1911 + 1912 + [[package]] 1913 + name = "lazy_static" 1914 + version = "1.5.0" 1915 + source = "registry+https://github.com/rust-lang/crates.io-index" 1916 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1917 + 1918 + [[package]] 1919 + name = "leb128fmt" 1920 + version = "0.1.0" 1921 + source = "registry+https://github.com/rust-lang/crates.io-index" 1922 + checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" 1923 + 1924 + [[package]] 1925 + name = "libc" 1926 + version = "0.2.182" 1927 + source = "registry+https://github.com/rust-lang/crates.io-index" 1928 + checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" 1929 + 1930 + [[package]] 1931 + name = "litemap" 1932 + version = "0.8.1" 1933 + source = "registry+https://github.com/rust-lang/crates.io-index" 1934 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 1935 + 1936 + [[package]] 1937 + name = "lock_api" 1938 + version = "0.4.14" 1939 + source = "registry+https://github.com/rust-lang/crates.io-index" 1940 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 1941 + dependencies = [ 1942 + "scopeguard", 1943 + ] 1944 + 1945 + [[package]] 1946 + name = "log" 1947 + version = "0.4.29" 1948 + source = "registry+https://github.com/rust-lang/crates.io-index" 1949 + checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" 1950 + 1951 + [[package]] 1952 + name = "loom" 1953 + version = "0.7.2" 1954 + source = "registry+https://github.com/rust-lang/crates.io-index" 1955 + checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" 1956 + dependencies = [ 1957 + "cfg-if", 1958 + "generator", 1959 + "scoped-tls", 1960 + "tracing", 1961 + "tracing-subscriber", 1962 + ] 1963 + 1964 + [[package]] 1965 + name = "lru-slab" 1966 + version = "0.1.2" 1967 + source = "registry+https://github.com/rust-lang/crates.io-index" 1968 + checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 1969 + 1970 + [[package]] 1971 + name = "match-lookup" 1972 + version = "0.1.2" 1973 + source = "registry+https://github.com/rust-lang/crates.io-index" 1974 + checksum = "757aee279b8bdbb9f9e676796fd459e4207a1f986e87886700abf589f5abf771" 1975 + dependencies = [ 1976 + "proc-macro2", 1977 + "quote", 1978 + "syn 2.0.117", 1979 + ] 1980 + 1981 + [[package]] 1982 + name = "matchers" 1983 + version = "0.2.0" 1984 + source = "registry+https://github.com/rust-lang/crates.io-index" 1985 + checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" 1986 + dependencies = [ 1987 + "regex-automata", 1988 + ] 1989 + 1990 + [[package]] 1991 + name = "matchit" 1992 + version = "0.8.4" 1993 + source = "registry+https://github.com/rust-lang/crates.io-index" 1994 + checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" 1995 + 1996 + [[package]] 1997 + name = "memchr" 1998 + version = "2.8.0" 1999 + source = "registry+https://github.com/rust-lang/crates.io-index" 2000 + checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" 2001 + 2002 + [[package]] 2003 + name = "miette" 2004 + version = "7.6.0" 2005 + source = "registry+https://github.com/rust-lang/crates.io-index" 2006 + checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" 2007 + dependencies = [ 2008 + "cfg-if", 2009 + "miette-derive", 2010 + "unicode-width", 2011 + ] 2012 + 2013 + [[package]] 2014 + name = "miette-derive" 2015 + version = "7.6.0" 2016 + source = "registry+https://github.com/rust-lang/crates.io-index" 2017 + checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" 2018 + dependencies = [ 2019 + "proc-macro2", 2020 + "quote", 2021 + "syn 2.0.117", 2022 + ] 2023 + 2024 + [[package]] 2025 + name = "mime" 2026 + version = "0.3.17" 2027 + source = "registry+https://github.com/rust-lang/crates.io-index" 2028 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2029 + 2030 + [[package]] 2031 + name = "minimal-lexical" 2032 + version = "0.2.1" 2033 + source = "registry+https://github.com/rust-lang/crates.io-index" 2034 + checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 2035 + 2036 + [[package]] 2037 + name = "miniz_oxide" 2038 + version = "0.8.9" 2039 + source = "registry+https://github.com/rust-lang/crates.io-index" 2040 + checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 2041 + dependencies = [ 2042 + "adler2", 2043 + "simd-adler32", 2044 + ] 2045 + 2046 + [[package]] 2047 + name = "mio" 2048 + version = "1.1.1" 2049 + source = "registry+https://github.com/rust-lang/crates.io-index" 2050 + checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" 2051 + dependencies = [ 2052 + "libc", 2053 + "wasi", 2054 + "windows-sys 0.61.2", 2055 + ] 2056 + 2057 + [[package]] 2058 + name = "moka" 2059 + version = "0.12.13" 2060 + source = "registry+https://github.com/rust-lang/crates.io-index" 2061 + checksum = "b4ac832c50ced444ef6be0767a008b02c106a909ba79d1d830501e94b96f6b7e" 2062 + dependencies = [ 2063 + "async-lock", 2064 + "crossbeam-channel", 2065 + "crossbeam-epoch", 2066 + "crossbeam-utils", 2067 + "equivalent", 2068 + "event-listener", 2069 + "futures-util", 2070 + "log", 2071 + "parking_lot", 2072 + "portable-atomic", 2073 + "smallvec", 2074 + "tagptr", 2075 + "uuid", 2076 + ] 2077 + 2078 + [[package]] 2079 + name = "multibase" 2080 + version = "0.9.2" 2081 + source = "registry+https://github.com/rust-lang/crates.io-index" 2082 + checksum = "8694bb4835f452b0e3bb06dbebb1d6fc5385b6ca1caf2e55fd165c042390ec77" 2083 + dependencies = [ 2084 + "base-x", 2085 + "base256emoji", 2086 + "data-encoding", 2087 + "data-encoding-macro", 2088 + ] 2089 + 2090 + [[package]] 2091 + name = "multihash" 2092 + version = "0.19.3" 2093 + source = "registry+https://github.com/rust-lang/crates.io-index" 2094 + checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" 2095 + dependencies = [ 2096 + "core2", 2097 + "serde", 2098 + "unsigned-varint", 2099 + ] 2100 + 2101 + [[package]] 2102 + name = "multihash-codetable" 2103 + version = "0.1.4" 2104 + source = "registry+https://github.com/rust-lang/crates.io-index" 2105 + checksum = "67996849749d25f1da9f238e8ace2ece8f9d6bdf3f9750aaf2ae7de3a5cad8ea" 2106 + dependencies = [ 2107 + "blake2b_simd", 2108 + "blake2s_simd", 2109 + "blake3", 2110 + "core2", 2111 + "digest", 2112 + "multihash-derive", 2113 + "ripemd", 2114 + "sha1", 2115 + "sha2", 2116 + "sha3", 2117 + "strobe-rs", 2118 + ] 2119 + 2120 + [[package]] 2121 + name = "multihash-derive" 2122 + version = "0.9.1" 2123 + source = "registry+https://github.com/rust-lang/crates.io-index" 2124 + checksum = "1f1b7edab35d920890b88643a765fc9bd295cf0201f4154dda231bef9b8404eb" 2125 + dependencies = [ 2126 + "core2", 2127 + "multihash", 2128 + "multihash-derive-impl", 2129 + ] 2130 + 2131 + [[package]] 2132 + name = "multihash-derive-impl" 2133 + version = "0.1.2" 2134 + source = "registry+https://github.com/rust-lang/crates.io-index" 2135 + checksum = "e3dc7141bd06405929948754f0628d247f5ca1865be745099205e5086da957cb" 2136 + dependencies = [ 2137 + "proc-macro-crate", 2138 + "proc-macro2", 2139 + "quote", 2140 + "syn 2.0.117", 2141 + "synstructure", 2142 + ] 2143 + 2144 + [[package]] 2145 + name = "n0-future" 2146 + version = "0.1.3" 2147 + source = "registry+https://github.com/rust-lang/crates.io-index" 2148 + checksum = "7bb0e5d99e681ab3c938842b96fcb41bf8a7bb4bfdb11ccbd653a7e83e06c794" 2149 + dependencies = [ 2150 + "cfg_aliases", 2151 + "derive_more", 2152 + "futures-buffered", 2153 + "futures-lite", 2154 + "futures-util", 2155 + "js-sys", 2156 + "pin-project", 2157 + "send_wrapper", 2158 + "tokio", 2159 + "tokio-util", 2160 + "wasm-bindgen", 2161 + "wasm-bindgen-futures", 2162 + "web-time", 2163 + ] 2164 + 2165 + [[package]] 2166 + name = "nom" 2167 + version = "7.1.3" 2168 + source = "registry+https://github.com/rust-lang/crates.io-index" 2169 + checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 2170 + dependencies = [ 2171 + "memchr", 2172 + "minimal-lexical", 2173 + ] 2174 + 2175 + [[package]] 2176 + name = "nu-ansi-term" 2177 + version = "0.50.3" 2178 + source = "registry+https://github.com/rust-lang/crates.io-index" 2179 + checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" 2180 + dependencies = [ 2181 + "windows-sys 0.61.2", 2182 + ] 2183 + 2184 + [[package]] 2185 + name = "num-conv" 2186 + version = "0.2.0" 2187 + source = "registry+https://github.com/rust-lang/crates.io-index" 2188 + checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" 2189 + 2190 + [[package]] 2191 + name = "num-traits" 2192 + version = "0.2.19" 2193 + source = "registry+https://github.com/rust-lang/crates.io-index" 2194 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 2195 + dependencies = [ 2196 + "autocfg", 2197 + ] 2198 + 2199 + [[package]] 2200 + name = "once_cell" 2201 + version = "1.21.3" 2202 + source = "registry+https://github.com/rust-lang/crates.io-index" 2203 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 2204 + 2205 + [[package]] 2206 + name = "once_cell_polyfill" 2207 + version = "1.70.2" 2208 + source = "registry+https://github.com/rust-lang/crates.io-index" 2209 + checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" 2210 + 2211 + [[package]] 2212 + name = "ouroboros" 2213 + version = "0.18.5" 2214 + source = "registry+https://github.com/rust-lang/crates.io-index" 2215 + checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" 2216 + dependencies = [ 2217 + "aliasable", 2218 + "ouroboros_macro", 2219 + "static_assertions", 2220 + ] 2221 + 2222 + [[package]] 2223 + name = "ouroboros_macro" 2224 + version = "0.18.5" 2225 + source = "registry+https://github.com/rust-lang/crates.io-index" 2226 + checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" 2227 + dependencies = [ 2228 + "heck 0.4.1", 2229 + "proc-macro2", 2230 + "proc-macro2-diagnostics", 2231 + "quote", 2232 + "syn 2.0.117", 2233 + ] 2234 + 2235 + [[package]] 2236 + name = "p256" 2237 + version = "0.13.2" 2238 + source = "registry+https://github.com/rust-lang/crates.io-index" 2239 + checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" 2240 + dependencies = [ 2241 + "ecdsa", 2242 + "elliptic-curve", 2243 + "primeorder", 2244 + "sha2", 2245 + ] 2246 + 2247 + [[package]] 2248 + name = "parking" 2249 + version = "2.2.1" 2250 + source = "registry+https://github.com/rust-lang/crates.io-index" 2251 + checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 2252 + 2253 + [[package]] 2254 + name = "parking_lot" 2255 + version = "0.12.5" 2256 + source = "registry+https://github.com/rust-lang/crates.io-index" 2257 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 2258 + dependencies = [ 2259 + "lock_api", 2260 + "parking_lot_core", 2261 + ] 2262 + 2263 + [[package]] 2264 + name = "parking_lot_core" 2265 + version = "0.9.12" 2266 + source = "registry+https://github.com/rust-lang/crates.io-index" 2267 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 2268 + dependencies = [ 2269 + "cfg-if", 2270 + "libc", 2271 + "redox_syscall", 2272 + "smallvec", 2273 + "windows-link", 2274 + ] 2275 + 2276 + [[package]] 2277 + name = "pem-rfc7468" 2278 + version = "0.7.0" 2279 + source = "registry+https://github.com/rust-lang/crates.io-index" 2280 + checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 2281 + dependencies = [ 2282 + "base64ct", 2283 + ] 2284 + 2285 + [[package]] 2286 + name = "percent-encoding" 2287 + version = "2.3.2" 2288 + source = "registry+https://github.com/rust-lang/crates.io-index" 2289 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 2290 + 2291 + [[package]] 2292 + name = "pin-project" 2293 + version = "1.1.10" 2294 + source = "registry+https://github.com/rust-lang/crates.io-index" 2295 + checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" 2296 + dependencies = [ 2297 + "pin-project-internal", 2298 + ] 2299 + 2300 + [[package]] 2301 + name = "pin-project-internal" 2302 + version = "1.1.10" 2303 + source = "registry+https://github.com/rust-lang/crates.io-index" 2304 + checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" 2305 + dependencies = [ 2306 + "proc-macro2", 2307 + "quote", 2308 + "syn 2.0.117", 2309 + ] 2310 + 2311 + [[package]] 2312 + name = "pin-project-lite" 2313 + version = "0.2.16" 2314 + source = "registry+https://github.com/rust-lang/crates.io-index" 2315 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 2316 + 2317 + [[package]] 2318 + name = "pin-utils" 2319 + version = "0.1.0" 2320 + source = "registry+https://github.com/rust-lang/crates.io-index" 2321 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2322 + 2323 + [[package]] 2324 + name = "pkcs8" 2325 + version = "0.10.2" 2326 + source = "registry+https://github.com/rust-lang/crates.io-index" 2327 + checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 2328 + dependencies = [ 2329 + "der", 2330 + "spki", 2331 + ] 2332 + 2333 + [[package]] 2334 + name = "portable-atomic" 2335 + version = "1.13.1" 2336 + source = "registry+https://github.com/rust-lang/crates.io-index" 2337 + checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" 2338 + 2339 + [[package]] 2340 + name = "porxie" 2341 + version = "0.1.0" 2342 + dependencies = [ 2343 + "anyhow", 2344 + "axum", 2345 + "axum-extra", 2346 + "bytesize", 2347 + "cid", 2348 + "clap", 2349 + "dotenvy", 2350 + "futures", 2351 + "humantime", 2352 + "infer", 2353 + "jacquard-common", 2354 + "jacquard-identity", 2355 + "mime", 2356 + "moka", 2357 + "multihash-codetable", 2358 + "reqwest", 2359 + "serde", 2360 + "tokio", 2361 + "tower-http", 2362 + "tracing", 2363 + "tracing-subscriber", 2364 + ] 2365 + 2366 + [[package]] 2367 + name = "postcard" 2368 + version = "1.1.3" 2369 + source = "registry+https://github.com/rust-lang/crates.io-index" 2370 + checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" 2371 + dependencies = [ 2372 + "cobs", 2373 + "embedded-io 0.4.0", 2374 + "embedded-io 0.6.1", 2375 + "heapless", 2376 + "serde", 2377 + ] 2378 + 2379 + [[package]] 2380 + name = "potential_utf" 2381 + version = "0.1.4" 2382 + source = "registry+https://github.com/rust-lang/crates.io-index" 2383 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 2384 + dependencies = [ 2385 + "zerovec", 2386 + ] 2387 + 2388 + [[package]] 2389 + name = "powerfmt" 2390 + version = "0.2.0" 2391 + source = "registry+https://github.com/rust-lang/crates.io-index" 2392 + checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 2393 + 2394 + [[package]] 2395 + name = "ppv-lite86" 2396 + version = "0.2.21" 2397 + source = "registry+https://github.com/rust-lang/crates.io-index" 2398 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 2399 + dependencies = [ 2400 + "zerocopy", 2401 + ] 2402 + 2403 + [[package]] 2404 + name = "prettyplease" 2405 + version = "0.2.37" 2406 + source = "registry+https://github.com/rust-lang/crates.io-index" 2407 + checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 2408 + dependencies = [ 2409 + "proc-macro2", 2410 + "syn 2.0.117", 2411 + ] 2412 + 2413 + [[package]] 2414 + name = "primeorder" 2415 + version = "0.13.6" 2416 + source = "registry+https://github.com/rust-lang/crates.io-index" 2417 + checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" 2418 + dependencies = [ 2419 + "elliptic-curve", 2420 + ] 2421 + 2422 + [[package]] 2423 + name = "proc-macro-crate" 2424 + version = "3.4.0" 2425 + source = "registry+https://github.com/rust-lang/crates.io-index" 2426 + checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 2427 + dependencies = [ 2428 + "toml_edit", 2429 + ] 2430 + 2431 + [[package]] 2432 + name = "proc-macro-error" 2433 + version = "1.0.4" 2434 + source = "registry+https://github.com/rust-lang/crates.io-index" 2435 + checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 2436 + dependencies = [ 2437 + "proc-macro-error-attr", 2438 + "proc-macro2", 2439 + "quote", 2440 + "syn 1.0.109", 2441 + "version_check", 2442 + ] 2443 + 2444 + [[package]] 2445 + name = "proc-macro-error-attr" 2446 + version = "1.0.4" 2447 + source = "registry+https://github.com/rust-lang/crates.io-index" 2448 + checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 2449 + dependencies = [ 2450 + "proc-macro2", 2451 + "quote", 2452 + "version_check", 2453 + ] 2454 + 2455 + [[package]] 2456 + name = "proc-macro2" 2457 + version = "1.0.106" 2458 + source = "registry+https://github.com/rust-lang/crates.io-index" 2459 + checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" 2460 + dependencies = [ 2461 + "unicode-ident", 2462 + ] 2463 + 2464 + [[package]] 2465 + name = "proc-macro2-diagnostics" 2466 + version = "0.10.1" 2467 + source = "registry+https://github.com/rust-lang/crates.io-index" 2468 + checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" 2469 + dependencies = [ 2470 + "proc-macro2", 2471 + "quote", 2472 + "syn 2.0.117", 2473 + "version_check", 2474 + "yansi", 2475 + ] 2476 + 2477 + [[package]] 2478 + name = "quinn" 2479 + version = "0.11.9" 2480 + source = "registry+https://github.com/rust-lang/crates.io-index" 2481 + checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 2482 + dependencies = [ 2483 + "bytes", 2484 + "cfg_aliases", 2485 + "pin-project-lite", 2486 + "quinn-proto", 2487 + "quinn-udp", 2488 + "rustc-hash", 2489 + "rustls", 2490 + "socket2", 2491 + "thiserror 2.0.18", 2492 + "tokio", 2493 + "tracing", 2494 + "web-time", 2495 + ] 2496 + 2497 + [[package]] 2498 + name = "quinn-proto" 2499 + version = "0.11.13" 2500 + source = "registry+https://github.com/rust-lang/crates.io-index" 2501 + checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 2502 + dependencies = [ 2503 + "bytes", 2504 + "getrandom 0.3.4", 2505 + "lru-slab", 2506 + "rand", 2507 + "ring", 2508 + "rustc-hash", 2509 + "rustls", 2510 + "rustls-pki-types", 2511 + "slab", 2512 + "thiserror 2.0.18", 2513 + "tinyvec", 2514 + "tracing", 2515 + "web-time", 2516 + ] 2517 + 2518 + [[package]] 2519 + name = "quinn-udp" 2520 + version = "0.5.14" 2521 + source = "registry+https://github.com/rust-lang/crates.io-index" 2522 + checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 2523 + dependencies = [ 2524 + "cfg_aliases", 2525 + "libc", 2526 + "once_cell", 2527 + "socket2", 2528 + "tracing", 2529 + "windows-sys 0.60.2", 2530 + ] 2531 + 2532 + [[package]] 2533 + name = "quote" 2534 + version = "1.0.44" 2535 + source = "registry+https://github.com/rust-lang/crates.io-index" 2536 + checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" 2537 + dependencies = [ 2538 + "proc-macro2", 2539 + ] 2540 + 2541 + [[package]] 2542 + name = "r-efi" 2543 + version = "5.3.0" 2544 + source = "registry+https://github.com/rust-lang/crates.io-index" 2545 + checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 2546 + 2547 + [[package]] 2548 + name = "rand" 2549 + version = "0.9.2" 2550 + source = "registry+https://github.com/rust-lang/crates.io-index" 2551 + checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 2552 + dependencies = [ 2553 + "rand_chacha", 2554 + "rand_core 0.9.5", 2555 + ] 2556 + 2557 + [[package]] 2558 + name = "rand_chacha" 2559 + version = "0.9.0" 2560 + source = "registry+https://github.com/rust-lang/crates.io-index" 2561 + checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 2562 + dependencies = [ 2563 + "ppv-lite86", 2564 + "rand_core 0.9.5", 2565 + ] 2566 + 2567 + [[package]] 2568 + name = "rand_core" 2569 + version = "0.6.4" 2570 + source = "registry+https://github.com/rust-lang/crates.io-index" 2571 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2572 + dependencies = [ 2573 + "getrandom 0.2.17", 2574 + ] 2575 + 2576 + [[package]] 2577 + name = "rand_core" 2578 + version = "0.9.5" 2579 + source = "registry+https://github.com/rust-lang/crates.io-index" 2580 + checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" 2581 + dependencies = [ 2582 + "getrandom 0.3.4", 2583 + ] 2584 + 2585 + [[package]] 2586 + name = "range-traits" 2587 + version = "0.3.2" 2588 + source = "registry+https://github.com/rust-lang/crates.io-index" 2589 + checksum = "d20581732dd76fa913c7dff1a2412b714afe3573e94d41c34719de73337cc8ab" 2590 + 2591 + [[package]] 2592 + name = "redox_syscall" 2593 + version = "0.5.18" 2594 + source = "registry+https://github.com/rust-lang/crates.io-index" 2595 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 2596 + dependencies = [ 2597 + "bitflags 2.11.0", 2598 + ] 2599 + 2600 + [[package]] 2601 + name = "ref-cast" 2602 + version = "1.0.25" 2603 + source = "registry+https://github.com/rust-lang/crates.io-index" 2604 + checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" 2605 + dependencies = [ 2606 + "ref-cast-impl", 2607 + ] 2608 + 2609 + [[package]] 2610 + name = "ref-cast-impl" 2611 + version = "1.0.25" 2612 + source = "registry+https://github.com/rust-lang/crates.io-index" 2613 + checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" 2614 + dependencies = [ 2615 + "proc-macro2", 2616 + "quote", 2617 + "syn 2.0.117", 2618 + ] 2619 + 2620 + [[package]] 2621 + name = "regex" 2622 + version = "1.12.3" 2623 + source = "registry+https://github.com/rust-lang/crates.io-index" 2624 + checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" 2625 + dependencies = [ 2626 + "aho-corasick", 2627 + "memchr", 2628 + "regex-automata", 2629 + "regex-syntax", 2630 + ] 2631 + 2632 + [[package]] 2633 + name = "regex-automata" 2634 + version = "0.4.14" 2635 + source = "registry+https://github.com/rust-lang/crates.io-index" 2636 + checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" 2637 + dependencies = [ 2638 + "aho-corasick", 2639 + "memchr", 2640 + "regex-syntax", 2641 + ] 2642 + 2643 + [[package]] 2644 + name = "regex-lite" 2645 + version = "0.1.9" 2646 + source = "registry+https://github.com/rust-lang/crates.io-index" 2647 + checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" 2648 + 2649 + [[package]] 2650 + name = "regex-syntax" 2651 + version = "0.8.9" 2652 + source = "registry+https://github.com/rust-lang/crates.io-index" 2653 + checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" 2654 + 2655 + [[package]] 2656 + name = "reqwest" 2657 + version = "0.12.28" 2658 + source = "registry+https://github.com/rust-lang/crates.io-index" 2659 + checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" 2660 + dependencies = [ 2661 + "base64", 2662 + "bytes", 2663 + "encoding_rs", 2664 + "futures-core", 2665 + "futures-util", 2666 + "h2", 2667 + "http", 2668 + "http-body", 2669 + "http-body-util", 2670 + "hyper", 2671 + "hyper-rustls", 2672 + "hyper-util", 2673 + "js-sys", 2674 + "log", 2675 + "mime", 2676 + "percent-encoding", 2677 + "pin-project-lite", 2678 + "quinn", 2679 + "rustls", 2680 + "rustls-pki-types", 2681 + "serde", 2682 + "serde_json", 2683 + "serde_urlencoded", 2684 + "sync_wrapper", 2685 + "tokio", 2686 + "tokio-rustls", 2687 + "tokio-util", 2688 + "tower", 2689 + "tower-http", 2690 + "tower-service", 2691 + "url", 2692 + "wasm-bindgen", 2693 + "wasm-bindgen-futures", 2694 + "wasm-streams", 2695 + "web-sys", 2696 + "webpki-roots", 2697 + ] 2698 + 2699 + [[package]] 2700 + name = "rfc6979" 2701 + version = "0.4.0" 2702 + source = "registry+https://github.com/rust-lang/crates.io-index" 2703 + checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" 2704 + dependencies = [ 2705 + "hmac", 2706 + "subtle", 2707 + ] 2708 + 2709 + [[package]] 2710 + name = "ring" 2711 + version = "0.17.14" 2712 + source = "registry+https://github.com/rust-lang/crates.io-index" 2713 + checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 2714 + dependencies = [ 2715 + "cc", 2716 + "cfg-if", 2717 + "getrandom 0.2.17", 2718 + "libc", 2719 + "untrusted", 2720 + "windows-sys 0.52.0", 2721 + ] 2722 + 2723 + [[package]] 2724 + name = "ripemd" 2725 + version = "0.1.3" 2726 + source = "registry+https://github.com/rust-lang/crates.io-index" 2727 + checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" 2728 + dependencies = [ 2729 + "digest", 2730 + ] 2731 + 2732 + [[package]] 2733 + name = "rustc-hash" 2734 + version = "2.1.1" 2735 + source = "registry+https://github.com/rust-lang/crates.io-index" 2736 + checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 2737 + 2738 + [[package]] 2739 + name = "rustc_version" 2740 + version = "0.4.1" 2741 + source = "registry+https://github.com/rust-lang/crates.io-index" 2742 + checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 2743 + dependencies = [ 2744 + "semver", 2745 + ] 2746 + 2747 + [[package]] 2748 + name = "rustls" 2749 + version = "0.23.36" 2750 + source = "registry+https://github.com/rust-lang/crates.io-index" 2751 + checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" 2752 + dependencies = [ 2753 + "once_cell", 2754 + "ring", 2755 + "rustls-pki-types", 2756 + "rustls-webpki", 2757 + "subtle", 2758 + "zeroize", 2759 + ] 2760 + 2761 + [[package]] 2762 + name = "rustls-pki-types" 2763 + version = "1.14.0" 2764 + source = "registry+https://github.com/rust-lang/crates.io-index" 2765 + checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" 2766 + dependencies = [ 2767 + "web-time", 2768 + "zeroize", 2769 + ] 2770 + 2771 + [[package]] 2772 + name = "rustls-webpki" 2773 + version = "0.103.9" 2774 + source = "registry+https://github.com/rust-lang/crates.io-index" 2775 + checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" 2776 + dependencies = [ 2777 + "ring", 2778 + "rustls-pki-types", 2779 + "untrusted", 2780 + ] 2781 + 2782 + [[package]] 2783 + name = "rustversion" 2784 + version = "1.0.22" 2785 + source = "registry+https://github.com/rust-lang/crates.io-index" 2786 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 2787 + 2788 + [[package]] 2789 + name = "ryu" 2790 + version = "1.0.23" 2791 + source = "registry+https://github.com/rust-lang/crates.io-index" 2792 + checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" 2793 + 2794 + [[package]] 2795 + name = "schemars" 2796 + version = "0.9.0" 2797 + source = "registry+https://github.com/rust-lang/crates.io-index" 2798 + checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" 2799 + dependencies = [ 2800 + "dyn-clone", 2801 + "ref-cast", 2802 + "serde", 2803 + "serde_json", 2804 + ] 2805 + 2806 + [[package]] 2807 + name = "schemars" 2808 + version = "1.2.1" 2809 + source = "registry+https://github.com/rust-lang/crates.io-index" 2810 + checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" 2811 + dependencies = [ 2812 + "dyn-clone", 2813 + "ref-cast", 2814 + "serde", 2815 + "serde_json", 2816 + ] 2817 + 2818 + [[package]] 2819 + name = "scoped-tls" 2820 + version = "1.0.1" 2821 + source = "registry+https://github.com/rust-lang/crates.io-index" 2822 + checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 2823 + 2824 + [[package]] 2825 + name = "scopeguard" 2826 + version = "1.2.0" 2827 + source = "registry+https://github.com/rust-lang/crates.io-index" 2828 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2829 + 2830 + [[package]] 2831 + name = "sec1" 2832 + version = "0.7.3" 2833 + source = "registry+https://github.com/rust-lang/crates.io-index" 2834 + checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" 2835 + dependencies = [ 2836 + "base16ct", 2837 + "der", 2838 + "generic-array", 2839 + "pkcs8", 2840 + "subtle", 2841 + "zeroize", 2842 + ] 2843 + 2844 + [[package]] 2845 + name = "semver" 2846 + version = "1.0.27" 2847 + source = "registry+https://github.com/rust-lang/crates.io-index" 2848 + checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 2849 + 2850 + [[package]] 2851 + name = "send_wrapper" 2852 + version = "0.6.0" 2853 + source = "registry+https://github.com/rust-lang/crates.io-index" 2854 + checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" 2855 + 2856 + [[package]] 2857 + name = "serde" 2858 + version = "1.0.228" 2859 + source = "registry+https://github.com/rust-lang/crates.io-index" 2860 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 2861 + dependencies = [ 2862 + "serde_core", 2863 + "serde_derive", 2864 + ] 2865 + 2866 + [[package]] 2867 + name = "serde_bytes" 2868 + version = "0.11.19" 2869 + source = "registry+https://github.com/rust-lang/crates.io-index" 2870 + checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" 2871 + dependencies = [ 2872 + "serde", 2873 + "serde_core", 2874 + ] 2875 + 2876 + [[package]] 2877 + name = "serde_core" 2878 + version = "1.0.228" 2879 + source = "registry+https://github.com/rust-lang/crates.io-index" 2880 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 2881 + dependencies = [ 2882 + "serde_derive", 2883 + ] 2884 + 2885 + [[package]] 2886 + name = "serde_derive" 2887 + version = "1.0.228" 2888 + source = "registry+https://github.com/rust-lang/crates.io-index" 2889 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 2890 + dependencies = [ 2891 + "proc-macro2", 2892 + "quote", 2893 + "syn 2.0.117", 2894 + ] 2895 + 2896 + [[package]] 2897 + name = "serde_html_form" 2898 + version = "0.2.8" 2899 + source = "registry+https://github.com/rust-lang/crates.io-index" 2900 + checksum = "b2f2d7ff8a2140333718bb329f5c40fc5f0865b84c426183ce14c97d2ab8154f" 2901 + dependencies = [ 2902 + "form_urlencoded", 2903 + "indexmap 2.13.0", 2904 + "itoa", 2905 + "ryu", 2906 + "serde_core", 2907 + ] 2908 + 2909 + [[package]] 2910 + name = "serde_ipld_dagcbor" 2911 + version = "0.6.4" 2912 + source = "registry+https://github.com/rust-lang/crates.io-index" 2913 + checksum = "46182f4f08349a02b45c998ba3215d3f9de826246ba02bb9dddfe9a2a2100778" 2914 + dependencies = [ 2915 + "cbor4ii", 2916 + "ipld-core", 2917 + "scopeguard", 2918 + "serde", 2919 + ] 2920 + 2921 + [[package]] 2922 + name = "serde_json" 2923 + version = "1.0.149" 2924 + source = "registry+https://github.com/rust-lang/crates.io-index" 2925 + checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" 2926 + dependencies = [ 2927 + "itoa", 2928 + "memchr", 2929 + "serde", 2930 + "serde_core", 2931 + "zmij", 2932 + ] 2933 + 2934 + [[package]] 2935 + name = "serde_path_to_error" 2936 + version = "0.1.20" 2937 + source = "registry+https://github.com/rust-lang/crates.io-index" 2938 + checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" 2939 + dependencies = [ 2940 + "itoa", 2941 + "serde", 2942 + "serde_core", 2943 + ] 2944 + 2945 + [[package]] 2946 + name = "serde_repr" 2947 + version = "0.1.20" 2948 + source = "registry+https://github.com/rust-lang/crates.io-index" 2949 + checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" 2950 + dependencies = [ 2951 + "proc-macro2", 2952 + "quote", 2953 + "syn 2.0.117", 2954 + ] 2955 + 2956 + [[package]] 2957 + name = "serde_urlencoded" 2958 + version = "0.7.1" 2959 + source = "registry+https://github.com/rust-lang/crates.io-index" 2960 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2961 + dependencies = [ 2962 + "form_urlencoded", 2963 + "itoa", 2964 + "ryu", 2965 + "serde", 2966 + ] 2967 + 2968 + [[package]] 2969 + name = "serde_with" 2970 + version = "3.16.1" 2971 + source = "registry+https://github.com/rust-lang/crates.io-index" 2972 + checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" 2973 + dependencies = [ 2974 + "base64", 2975 + "chrono", 2976 + "hex", 2977 + "indexmap 1.9.3", 2978 + "indexmap 2.13.0", 2979 + "schemars 0.9.0", 2980 + "schemars 1.2.1", 2981 + "serde_core", 2982 + "serde_json", 2983 + "serde_with_macros", 2984 + "time", 2985 + ] 2986 + 2987 + [[package]] 2988 + name = "serde_with_macros" 2989 + version = "3.16.1" 2990 + source = "registry+https://github.com/rust-lang/crates.io-index" 2991 + checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" 2992 + dependencies = [ 2993 + "darling 0.21.3", 2994 + "proc-macro2", 2995 + "quote", 2996 + "syn 2.0.117", 2997 + ] 2998 + 2999 + [[package]] 3000 + name = "sha1" 3001 + version = "0.10.6" 3002 + source = "registry+https://github.com/rust-lang/crates.io-index" 3003 + checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 3004 + dependencies = [ 3005 + "cfg-if", 3006 + "cpufeatures", 3007 + "digest", 3008 + ] 3009 + 3010 + [[package]] 3011 + name = "sha2" 3012 + version = "0.10.9" 3013 + source = "registry+https://github.com/rust-lang/crates.io-index" 3014 + checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 3015 + dependencies = [ 3016 + "cfg-if", 3017 + "cpufeatures", 3018 + "digest", 3019 + ] 3020 + 3021 + [[package]] 3022 + name = "sha3" 3023 + version = "0.10.8" 3024 + source = "registry+https://github.com/rust-lang/crates.io-index" 3025 + checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" 3026 + dependencies = [ 3027 + "digest", 3028 + "keccak", 3029 + ] 3030 + 3031 + [[package]] 3032 + name = "sharded-slab" 3033 + version = "0.1.7" 3034 + source = "registry+https://github.com/rust-lang/crates.io-index" 3035 + checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 3036 + dependencies = [ 3037 + "lazy_static", 3038 + ] 3039 + 3040 + [[package]] 3041 + name = "shlex" 3042 + version = "1.3.0" 3043 + source = "registry+https://github.com/rust-lang/crates.io-index" 3044 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 3045 + 3046 + [[package]] 3047 + name = "signal-hook-registry" 3048 + version = "1.4.8" 3049 + source = "registry+https://github.com/rust-lang/crates.io-index" 3050 + checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" 3051 + dependencies = [ 3052 + "errno", 3053 + "libc", 3054 + ] 3055 + 3056 + [[package]] 3057 + name = "signature" 3058 + version = "2.2.0" 3059 + source = "registry+https://github.com/rust-lang/crates.io-index" 3060 + checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 3061 + dependencies = [ 3062 + "digest", 3063 + "rand_core 0.6.4", 3064 + ] 3065 + 3066 + [[package]] 3067 + name = "simd-adler32" 3068 + version = "0.3.8" 3069 + source = "registry+https://github.com/rust-lang/crates.io-index" 3070 + checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" 3071 + 3072 + [[package]] 3073 + name = "slab" 3074 + version = "0.4.12" 3075 + source = "registry+https://github.com/rust-lang/crates.io-index" 3076 + checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" 3077 + 3078 + [[package]] 3079 + name = "smallvec" 3080 + version = "1.15.1" 3081 + source = "registry+https://github.com/rust-lang/crates.io-index" 3082 + checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 3083 + 3084 + [[package]] 3085 + name = "smol_str" 3086 + version = "0.3.5" 3087 + source = "registry+https://github.com/rust-lang/crates.io-index" 3088 + checksum = "0f7a918bd2a9951d18ee6e48f076843e8e73a9a5d22cf05bcd4b7a81bdd04e17" 3089 + dependencies = [ 3090 + "borsh", 3091 + "serde_core", 3092 + ] 3093 + 3094 + [[package]] 3095 + name = "socket2" 3096 + version = "0.6.2" 3097 + source = "registry+https://github.com/rust-lang/crates.io-index" 3098 + checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" 3099 + dependencies = [ 3100 + "libc", 3101 + "windows-sys 0.60.2", 3102 + ] 3103 + 3104 + [[package]] 3105 + name = "spin" 3106 + version = "0.9.8" 3107 + source = "registry+https://github.com/rust-lang/crates.io-index" 3108 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 3109 + dependencies = [ 3110 + "lock_api", 3111 + ] 3112 + 3113 + [[package]] 3114 + name = "spin" 3115 + version = "0.10.0" 3116 + source = "registry+https://github.com/rust-lang/crates.io-index" 3117 + checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" 3118 + 3119 + [[package]] 3120 + name = "spki" 3121 + version = "0.7.3" 3122 + source = "registry+https://github.com/rust-lang/crates.io-index" 3123 + checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 3124 + dependencies = [ 3125 + "base64ct", 3126 + "der", 3127 + ] 3128 + 3129 + [[package]] 3130 + name = "stable_deref_trait" 3131 + version = "1.2.1" 3132 + source = "registry+https://github.com/rust-lang/crates.io-index" 3133 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 3134 + 3135 + [[package]] 3136 + name = "static-regular-grammar" 3137 + version = "2.0.2" 3138 + source = "registry+https://github.com/rust-lang/crates.io-index" 3139 + checksum = "4f4a6c40247579acfbb138c3cd7de3dab113ab4ac6227f1b7de7d626ee667957" 3140 + dependencies = [ 3141 + "abnf", 3142 + "btree-range-map", 3143 + "ciborium", 3144 + "hex_fmt", 3145 + "indoc", 3146 + "proc-macro-error", 3147 + "proc-macro2", 3148 + "quote", 3149 + "serde", 3150 + "sha2", 3151 + "syn 2.0.117", 3152 + "thiserror 1.0.69", 3153 + ] 3154 + 3155 + [[package]] 3156 + name = "static_assertions" 3157 + version = "1.1.0" 3158 + source = "registry+https://github.com/rust-lang/crates.io-index" 3159 + checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 3160 + 3161 + [[package]] 3162 + name = "strobe-rs" 3163 + version = "0.10.0" 3164 + source = "registry+https://github.com/rust-lang/crates.io-index" 3165 + checksum = "98fe17535ea31344936cc58d29fec9b500b0452ddc4cc24c429c8a921a0e84e5" 3166 + dependencies = [ 3167 + "bitflags 1.3.2", 3168 + "byteorder", 3169 + "keccak", 3170 + "subtle", 3171 + "zeroize", 3172 + ] 3173 + 3174 + [[package]] 3175 + name = "strsim" 3176 + version = "0.11.1" 3177 + source = "registry+https://github.com/rust-lang/crates.io-index" 3178 + checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 3179 + 3180 + [[package]] 3181 + name = "subtle" 3182 + version = "2.6.1" 3183 + source = "registry+https://github.com/rust-lang/crates.io-index" 3184 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 3185 + 3186 + [[package]] 3187 + name = "syn" 3188 + version = "1.0.109" 3189 + source = "registry+https://github.com/rust-lang/crates.io-index" 3190 + checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 3191 + dependencies = [ 3192 + "proc-macro2", 3193 + "unicode-ident", 3194 + ] 3195 + 3196 + [[package]] 3197 + name = "syn" 3198 + version = "2.0.117" 3199 + source = "registry+https://github.com/rust-lang/crates.io-index" 3200 + checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" 3201 + dependencies = [ 3202 + "proc-macro2", 3203 + "quote", 3204 + "unicode-ident", 3205 + ] 3206 + 3207 + [[package]] 3208 + name = "sync_wrapper" 3209 + version = "1.0.2" 3210 + source = "registry+https://github.com/rust-lang/crates.io-index" 3211 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 3212 + dependencies = [ 3213 + "futures-core", 3214 + ] 3215 + 3216 + [[package]] 3217 + name = "synstructure" 3218 + version = "0.13.2" 3219 + source = "registry+https://github.com/rust-lang/crates.io-index" 3220 + checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 3221 + dependencies = [ 3222 + "proc-macro2", 3223 + "quote", 3224 + "syn 2.0.117", 3225 + ] 3226 + 3227 + [[package]] 3228 + name = "system-configuration" 3229 + version = "0.7.0" 3230 + source = "registry+https://github.com/rust-lang/crates.io-index" 3231 + checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" 3232 + dependencies = [ 3233 + "bitflags 2.11.0", 3234 + "core-foundation", 3235 + "system-configuration-sys", 3236 + ] 3237 + 3238 + [[package]] 3239 + name = "system-configuration-sys" 3240 + version = "0.6.0" 3241 + source = "registry+https://github.com/rust-lang/crates.io-index" 3242 + checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 3243 + dependencies = [ 3244 + "core-foundation-sys", 3245 + "libc", 3246 + ] 3247 + 3248 + [[package]] 3249 + name = "tagptr" 3250 + version = "0.2.0" 3251 + source = "registry+https://github.com/rust-lang/crates.io-index" 3252 + checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" 3253 + 3254 + [[package]] 3255 + name = "thiserror" 3256 + version = "1.0.69" 3257 + source = "registry+https://github.com/rust-lang/crates.io-index" 3258 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 3259 + dependencies = [ 3260 + "thiserror-impl 1.0.69", 3261 + ] 3262 + 3263 + [[package]] 3264 + name = "thiserror" 3265 + version = "2.0.18" 3266 + source = "registry+https://github.com/rust-lang/crates.io-index" 3267 + checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" 3268 + dependencies = [ 3269 + "thiserror-impl 2.0.18", 3270 + ] 3271 + 3272 + [[package]] 3273 + name = "thiserror-impl" 3274 + version = "1.0.69" 3275 + source = "registry+https://github.com/rust-lang/crates.io-index" 3276 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 3277 + dependencies = [ 3278 + "proc-macro2", 3279 + "quote", 3280 + "syn 2.0.117", 3281 + ] 3282 + 3283 + [[package]] 3284 + name = "thiserror-impl" 3285 + version = "2.0.18" 3286 + source = "registry+https://github.com/rust-lang/crates.io-index" 3287 + checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" 3288 + dependencies = [ 3289 + "proc-macro2", 3290 + "quote", 3291 + "syn 2.0.117", 3292 + ] 3293 + 3294 + [[package]] 3295 + name = "thread_local" 3296 + version = "1.1.9" 3297 + source = "registry+https://github.com/rust-lang/crates.io-index" 3298 + checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" 3299 + dependencies = [ 3300 + "cfg-if", 3301 + ] 3302 + 3303 + [[package]] 3304 + name = "time" 3305 + version = "0.3.47" 3306 + source = "registry+https://github.com/rust-lang/crates.io-index" 3307 + checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" 3308 + dependencies = [ 3309 + "deranged", 3310 + "itoa", 3311 + "num-conv", 3312 + "powerfmt", 3313 + "serde_core", 3314 + "time-core", 3315 + "time-macros", 3316 + ] 3317 + 3318 + [[package]] 3319 + name = "time-core" 3320 + version = "0.1.8" 3321 + source = "registry+https://github.com/rust-lang/crates.io-index" 3322 + checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" 3323 + 3324 + [[package]] 3325 + name = "time-macros" 3326 + version = "0.2.27" 3327 + source = "registry+https://github.com/rust-lang/crates.io-index" 3328 + checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" 3329 + dependencies = [ 3330 + "num-conv", 3331 + "time-core", 3332 + ] 3333 + 3334 + [[package]] 3335 + name = "tinystr" 3336 + version = "0.8.2" 3337 + source = "registry+https://github.com/rust-lang/crates.io-index" 3338 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 3339 + dependencies = [ 3340 + "displaydoc", 3341 + "zerovec", 3342 + ] 3343 + 3344 + [[package]] 3345 + name = "tinyvec" 3346 + version = "1.10.0" 3347 + source = "registry+https://github.com/rust-lang/crates.io-index" 3348 + checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 3349 + dependencies = [ 3350 + "tinyvec_macros", 3351 + ] 3352 + 3353 + [[package]] 3354 + name = "tinyvec_macros" 3355 + version = "0.1.1" 3356 + source = "registry+https://github.com/rust-lang/crates.io-index" 3357 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 3358 + 3359 + [[package]] 3360 + name = "tokio" 3361 + version = "1.49.0" 3362 + source = "registry+https://github.com/rust-lang/crates.io-index" 3363 + checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" 3364 + dependencies = [ 3365 + "bytes", 3366 + "libc", 3367 + "mio", 3368 + "pin-project-lite", 3369 + "signal-hook-registry", 3370 + "socket2", 3371 + "tokio-macros", 3372 + "windows-sys 0.61.2", 3373 + ] 3374 + 3375 + [[package]] 3376 + name = "tokio-macros" 3377 + version = "2.6.0" 3378 + source = "registry+https://github.com/rust-lang/crates.io-index" 3379 + checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 3380 + dependencies = [ 3381 + "proc-macro2", 3382 + "quote", 3383 + "syn 2.0.117", 3384 + ] 3385 + 3386 + [[package]] 3387 + name = "tokio-rustls" 3388 + version = "0.26.4" 3389 + source = "registry+https://github.com/rust-lang/crates.io-index" 3390 + checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" 3391 + dependencies = [ 3392 + "rustls", 3393 + "tokio", 3394 + ] 3395 + 3396 + [[package]] 3397 + name = "tokio-util" 3398 + version = "0.7.18" 3399 + source = "registry+https://github.com/rust-lang/crates.io-index" 3400 + checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" 3401 + dependencies = [ 3402 + "bytes", 3403 + "futures-core", 3404 + "futures-sink", 3405 + "futures-util", 3406 + "pin-project-lite", 3407 + "tokio", 3408 + ] 3409 + 3410 + [[package]] 3411 + name = "toml_datetime" 3412 + version = "0.7.5+spec-1.1.0" 3413 + source = "registry+https://github.com/rust-lang/crates.io-index" 3414 + checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" 3415 + dependencies = [ 3416 + "serde_core", 3417 + ] 3418 + 3419 + [[package]] 3420 + name = "toml_edit" 3421 + version = "0.23.10+spec-1.0.0" 3422 + source = "registry+https://github.com/rust-lang/crates.io-index" 3423 + checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" 3424 + dependencies = [ 3425 + "indexmap 2.13.0", 3426 + "toml_datetime", 3427 + "toml_parser", 3428 + "winnow", 3429 + ] 3430 + 3431 + [[package]] 3432 + name = "toml_parser" 3433 + version = "1.0.9+spec-1.1.0" 3434 + source = "registry+https://github.com/rust-lang/crates.io-index" 3435 + checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" 3436 + dependencies = [ 3437 + "winnow", 3438 + ] 3439 + 3440 + [[package]] 3441 + name = "tower" 3442 + version = "0.5.3" 3443 + source = "registry+https://github.com/rust-lang/crates.io-index" 3444 + checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" 3445 + dependencies = [ 3446 + "futures-core", 3447 + "futures-util", 3448 + "pin-project-lite", 3449 + "sync_wrapper", 3450 + "tokio", 3451 + "tower-layer", 3452 + "tower-service", 3453 + "tracing", 3454 + ] 3455 + 3456 + [[package]] 3457 + name = "tower-http" 3458 + version = "0.6.8" 3459 + source = "registry+https://github.com/rust-lang/crates.io-index" 3460 + checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" 3461 + dependencies = [ 3462 + "async-compression", 3463 + "bitflags 2.11.0", 3464 + "bytes", 3465 + "futures-core", 3466 + "futures-util", 3467 + "http", 3468 + "http-body", 3469 + "http-body-util", 3470 + "iri-string", 3471 + "pin-project-lite", 3472 + "tokio", 3473 + "tokio-util", 3474 + "tower", 3475 + "tower-layer", 3476 + "tower-service", 3477 + "tracing", 3478 + ] 3479 + 3480 + [[package]] 3481 + name = "tower-layer" 3482 + version = "0.3.3" 3483 + source = "registry+https://github.com/rust-lang/crates.io-index" 3484 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 3485 + 3486 + [[package]] 3487 + name = "tower-service" 3488 + version = "0.3.3" 3489 + source = "registry+https://github.com/rust-lang/crates.io-index" 3490 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 3491 + 3492 + [[package]] 3493 + name = "tracing" 3494 + version = "0.1.44" 3495 + source = "registry+https://github.com/rust-lang/crates.io-index" 3496 + checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" 3497 + dependencies = [ 3498 + "log", 3499 + "pin-project-lite", 3500 + "tracing-attributes", 3501 + "tracing-core", 3502 + ] 3503 + 3504 + [[package]] 3505 + name = "tracing-attributes" 3506 + version = "0.1.31" 3507 + source = "registry+https://github.com/rust-lang/crates.io-index" 3508 + checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" 3509 + dependencies = [ 3510 + "proc-macro2", 3511 + "quote", 3512 + "syn 2.0.117", 3513 + ] 3514 + 3515 + [[package]] 3516 + name = "tracing-core" 3517 + version = "0.1.36" 3518 + source = "registry+https://github.com/rust-lang/crates.io-index" 3519 + checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" 3520 + dependencies = [ 3521 + "once_cell", 3522 + "valuable", 3523 + ] 3524 + 3525 + [[package]] 3526 + name = "tracing-log" 3527 + version = "0.2.0" 3528 + source = "registry+https://github.com/rust-lang/crates.io-index" 3529 + checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 3530 + dependencies = [ 3531 + "log", 3532 + "once_cell", 3533 + "tracing-core", 3534 + ] 3535 + 3536 + [[package]] 3537 + name = "tracing-subscriber" 3538 + version = "0.3.22" 3539 + source = "registry+https://github.com/rust-lang/crates.io-index" 3540 + checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" 3541 + dependencies = [ 3542 + "matchers", 3543 + "nu-ansi-term", 3544 + "once_cell", 3545 + "regex-automata", 3546 + "sharded-slab", 3547 + "smallvec", 3548 + "thread_local", 3549 + "tracing", 3550 + "tracing-core", 3551 + "tracing-log", 3552 + ] 3553 + 3554 + [[package]] 3555 + name = "trait-variant" 3556 + version = "0.1.2" 3557 + source = "registry+https://github.com/rust-lang/crates.io-index" 3558 + checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" 3559 + dependencies = [ 3560 + "proc-macro2", 3561 + "quote", 3562 + "syn 2.0.117", 3563 + ] 3564 + 3565 + [[package]] 3566 + name = "try-lock" 3567 + version = "0.2.5" 3568 + source = "registry+https://github.com/rust-lang/crates.io-index" 3569 + checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 3570 + 3571 + [[package]] 3572 + name = "typenum" 3573 + version = "1.19.0" 3574 + source = "registry+https://github.com/rust-lang/crates.io-index" 3575 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 3576 + 3577 + [[package]] 3578 + name = "unicode-ident" 3579 + version = "1.0.24" 3580 + source = "registry+https://github.com/rust-lang/crates.io-index" 3581 + checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" 3582 + 3583 + [[package]] 3584 + name = "unicode-segmentation" 3585 + version = "1.12.0" 3586 + source = "registry+https://github.com/rust-lang/crates.io-index" 3587 + checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 3588 + 3589 + [[package]] 3590 + name = "unicode-width" 3591 + version = "0.1.14" 3592 + source = "registry+https://github.com/rust-lang/crates.io-index" 3593 + checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 3594 + 3595 + [[package]] 3596 + name = "unicode-xid" 3597 + version = "0.2.6" 3598 + source = "registry+https://github.com/rust-lang/crates.io-index" 3599 + checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 3600 + 3601 + [[package]] 3602 + name = "unsigned-varint" 3603 + version = "0.8.0" 3604 + source = "registry+https://github.com/rust-lang/crates.io-index" 3605 + checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" 3606 + 3607 + [[package]] 3608 + name = "untrusted" 3609 + version = "0.9.0" 3610 + source = "registry+https://github.com/rust-lang/crates.io-index" 3611 + checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 3612 + 3613 + [[package]] 3614 + name = "url" 3615 + version = "2.5.8" 3616 + source = "registry+https://github.com/rust-lang/crates.io-index" 3617 + checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" 3618 + dependencies = [ 3619 + "form_urlencoded", 3620 + "idna", 3621 + "percent-encoding", 3622 + "serde", 3623 + "serde_derive", 3624 + ] 3625 + 3626 + [[package]] 3627 + name = "urlencoding" 3628 + version = "2.1.3" 3629 + source = "registry+https://github.com/rust-lang/crates.io-index" 3630 + checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 3631 + 3632 + [[package]] 3633 + name = "utf8_iter" 3634 + version = "1.0.4" 3635 + source = "registry+https://github.com/rust-lang/crates.io-index" 3636 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 3637 + 3638 + [[package]] 3639 + name = "utf8parse" 3640 + version = "0.2.2" 3641 + source = "registry+https://github.com/rust-lang/crates.io-index" 3642 + checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 3643 + 3644 + [[package]] 3645 + name = "uuid" 3646 + version = "1.21.0" 3647 + source = "registry+https://github.com/rust-lang/crates.io-index" 3648 + checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" 3649 + dependencies = [ 3650 + "getrandom 0.4.1", 3651 + "js-sys", 3652 + "wasm-bindgen", 3653 + ] 3654 + 3655 + [[package]] 3656 + name = "valuable" 3657 + version = "0.1.1" 3658 + source = "registry+https://github.com/rust-lang/crates.io-index" 3659 + checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 3660 + 3661 + [[package]] 3662 + name = "version_check" 3663 + version = "0.9.5" 3664 + source = "registry+https://github.com/rust-lang/crates.io-index" 3665 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 3666 + 3667 + [[package]] 3668 + name = "want" 3669 + version = "0.3.1" 3670 + source = "registry+https://github.com/rust-lang/crates.io-index" 3671 + checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 3672 + dependencies = [ 3673 + "try-lock", 3674 + ] 3675 + 3676 + [[package]] 3677 + name = "wasi" 3678 + version = "0.11.1+wasi-snapshot-preview1" 3679 + source = "registry+https://github.com/rust-lang/crates.io-index" 3680 + checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 3681 + 3682 + [[package]] 3683 + name = "wasip2" 3684 + version = "1.0.2+wasi-0.2.9" 3685 + source = "registry+https://github.com/rust-lang/crates.io-index" 3686 + checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" 3687 + dependencies = [ 3688 + "wit-bindgen", 3689 + ] 3690 + 3691 + [[package]] 3692 + name = "wasip3" 3693 + version = "0.4.0+wasi-0.3.0-rc-2026-01-06" 3694 + source = "registry+https://github.com/rust-lang/crates.io-index" 3695 + checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" 3696 + dependencies = [ 3697 + "wit-bindgen", 3698 + ] 3699 + 3700 + [[package]] 3701 + name = "wasm-bindgen" 3702 + version = "0.2.108" 3703 + source = "registry+https://github.com/rust-lang/crates.io-index" 3704 + checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" 3705 + dependencies = [ 3706 + "cfg-if", 3707 + "once_cell", 3708 + "rustversion", 3709 + "wasm-bindgen-macro", 3710 + "wasm-bindgen-shared", 3711 + ] 3712 + 3713 + [[package]] 3714 + name = "wasm-bindgen-futures" 3715 + version = "0.4.58" 3716 + source = "registry+https://github.com/rust-lang/crates.io-index" 3717 + checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" 3718 + dependencies = [ 3719 + "cfg-if", 3720 + "futures-util", 3721 + "js-sys", 3722 + "once_cell", 3723 + "wasm-bindgen", 3724 + "web-sys", 3725 + ] 3726 + 3727 + [[package]] 3728 + name = "wasm-bindgen-macro" 3729 + version = "0.2.108" 3730 + source = "registry+https://github.com/rust-lang/crates.io-index" 3731 + checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" 3732 + dependencies = [ 3733 + "quote", 3734 + "wasm-bindgen-macro-support", 3735 + ] 3736 + 3737 + [[package]] 3738 + name = "wasm-bindgen-macro-support" 3739 + version = "0.2.108" 3740 + source = "registry+https://github.com/rust-lang/crates.io-index" 3741 + checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" 3742 + dependencies = [ 3743 + "bumpalo", 3744 + "proc-macro2", 3745 + "quote", 3746 + "syn 2.0.117", 3747 + "wasm-bindgen-shared", 3748 + ] 3749 + 3750 + [[package]] 3751 + name = "wasm-bindgen-shared" 3752 + version = "0.2.108" 3753 + source = "registry+https://github.com/rust-lang/crates.io-index" 3754 + checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" 3755 + dependencies = [ 3756 + "unicode-ident", 3757 + ] 3758 + 3759 + [[package]] 3760 + name = "wasm-encoder" 3761 + version = "0.244.0" 3762 + source = "registry+https://github.com/rust-lang/crates.io-index" 3763 + checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" 3764 + dependencies = [ 3765 + "leb128fmt", 3766 + "wasmparser", 3767 + ] 3768 + 3769 + [[package]] 3770 + name = "wasm-metadata" 3771 + version = "0.244.0" 3772 + source = "registry+https://github.com/rust-lang/crates.io-index" 3773 + checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" 3774 + dependencies = [ 3775 + "anyhow", 3776 + "indexmap 2.13.0", 3777 + "wasm-encoder", 3778 + "wasmparser", 3779 + ] 3780 + 3781 + [[package]] 3782 + name = "wasm-streams" 3783 + version = "0.4.2" 3784 + source = "registry+https://github.com/rust-lang/crates.io-index" 3785 + checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" 3786 + dependencies = [ 3787 + "futures-util", 3788 + "js-sys", 3789 + "wasm-bindgen", 3790 + "wasm-bindgen-futures", 3791 + "web-sys", 3792 + ] 3793 + 3794 + [[package]] 3795 + name = "wasmparser" 3796 + version = "0.244.0" 3797 + source = "registry+https://github.com/rust-lang/crates.io-index" 3798 + checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" 3799 + dependencies = [ 3800 + "bitflags 2.11.0", 3801 + "hashbrown 0.15.5", 3802 + "indexmap 2.13.0", 3803 + "semver", 3804 + ] 3805 + 3806 + [[package]] 3807 + name = "web-sys" 3808 + version = "0.3.85" 3809 + source = "registry+https://github.com/rust-lang/crates.io-index" 3810 + checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" 3811 + dependencies = [ 3812 + "js-sys", 3813 + "wasm-bindgen", 3814 + ] 3815 + 3816 + [[package]] 3817 + name = "web-time" 3818 + version = "1.1.0" 3819 + source = "registry+https://github.com/rust-lang/crates.io-index" 3820 + checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 3821 + dependencies = [ 3822 + "js-sys", 3823 + "wasm-bindgen", 3824 + ] 3825 + 3826 + [[package]] 3827 + name = "webpki-roots" 3828 + version = "1.0.6" 3829 + source = "registry+https://github.com/rust-lang/crates.io-index" 3830 + checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" 3831 + dependencies = [ 3832 + "rustls-pki-types", 3833 + ] 3834 + 3835 + [[package]] 3836 + name = "windows-core" 3837 + version = "0.62.2" 3838 + source = "registry+https://github.com/rust-lang/crates.io-index" 3839 + checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" 3840 + dependencies = [ 3841 + "windows-implement", 3842 + "windows-interface", 3843 + "windows-link", 3844 + "windows-result", 3845 + "windows-strings", 3846 + ] 3847 + 3848 + [[package]] 3849 + name = "windows-implement" 3850 + version = "0.60.2" 3851 + source = "registry+https://github.com/rust-lang/crates.io-index" 3852 + checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 3853 + dependencies = [ 3854 + "proc-macro2", 3855 + "quote", 3856 + "syn 2.0.117", 3857 + ] 3858 + 3859 + [[package]] 3860 + name = "windows-interface" 3861 + version = "0.59.3" 3862 + source = "registry+https://github.com/rust-lang/crates.io-index" 3863 + checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 3864 + dependencies = [ 3865 + "proc-macro2", 3866 + "quote", 3867 + "syn 2.0.117", 3868 + ] 3869 + 3870 + [[package]] 3871 + name = "windows-link" 3872 + version = "0.2.1" 3873 + source = "registry+https://github.com/rust-lang/crates.io-index" 3874 + checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 3875 + 3876 + [[package]] 3877 + name = "windows-registry" 3878 + version = "0.6.1" 3879 + source = "registry+https://github.com/rust-lang/crates.io-index" 3880 + checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" 3881 + dependencies = [ 3882 + "windows-link", 3883 + "windows-result", 3884 + "windows-strings", 3885 + ] 3886 + 3887 + [[package]] 3888 + name = "windows-result" 3889 + version = "0.4.1" 3890 + source = "registry+https://github.com/rust-lang/crates.io-index" 3891 + checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" 3892 + dependencies = [ 3893 + "windows-link", 3894 + ] 3895 + 3896 + [[package]] 3897 + name = "windows-strings" 3898 + version = "0.5.1" 3899 + source = "registry+https://github.com/rust-lang/crates.io-index" 3900 + checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 3901 + dependencies = [ 3902 + "windows-link", 3903 + ] 3904 + 3905 + [[package]] 3906 + name = "windows-sys" 3907 + version = "0.52.0" 3908 + source = "registry+https://github.com/rust-lang/crates.io-index" 3909 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3910 + dependencies = [ 3911 + "windows-targets 0.52.6", 3912 + ] 3913 + 3914 + [[package]] 3915 + name = "windows-sys" 3916 + version = "0.60.2" 3917 + source = "registry+https://github.com/rust-lang/crates.io-index" 3918 + checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 3919 + dependencies = [ 3920 + "windows-targets 0.53.5", 3921 + ] 3922 + 3923 + [[package]] 3924 + name = "windows-sys" 3925 + version = "0.61.2" 3926 + source = "registry+https://github.com/rust-lang/crates.io-index" 3927 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 3928 + dependencies = [ 3929 + "windows-link", 3930 + ] 3931 + 3932 + [[package]] 3933 + name = "windows-targets" 3934 + version = "0.52.6" 3935 + source = "registry+https://github.com/rust-lang/crates.io-index" 3936 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 3937 + dependencies = [ 3938 + "windows_aarch64_gnullvm 0.52.6", 3939 + "windows_aarch64_msvc 0.52.6", 3940 + "windows_i686_gnu 0.52.6", 3941 + "windows_i686_gnullvm 0.52.6", 3942 + "windows_i686_msvc 0.52.6", 3943 + "windows_x86_64_gnu 0.52.6", 3944 + "windows_x86_64_gnullvm 0.52.6", 3945 + "windows_x86_64_msvc 0.52.6", 3946 + ] 3947 + 3948 + [[package]] 3949 + name = "windows-targets" 3950 + version = "0.53.5" 3951 + source = "registry+https://github.com/rust-lang/crates.io-index" 3952 + checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 3953 + dependencies = [ 3954 + "windows-link", 3955 + "windows_aarch64_gnullvm 0.53.1", 3956 + "windows_aarch64_msvc 0.53.1", 3957 + "windows_i686_gnu 0.53.1", 3958 + "windows_i686_gnullvm 0.53.1", 3959 + "windows_i686_msvc 0.53.1", 3960 + "windows_x86_64_gnu 0.53.1", 3961 + "windows_x86_64_gnullvm 0.53.1", 3962 + "windows_x86_64_msvc 0.53.1", 3963 + ] 3964 + 3965 + [[package]] 3966 + name = "windows_aarch64_gnullvm" 3967 + version = "0.52.6" 3968 + source = "registry+https://github.com/rust-lang/crates.io-index" 3969 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 3970 + 3971 + [[package]] 3972 + name = "windows_aarch64_gnullvm" 3973 + version = "0.53.1" 3974 + source = "registry+https://github.com/rust-lang/crates.io-index" 3975 + checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 3976 + 3977 + [[package]] 3978 + name = "windows_aarch64_msvc" 3979 + version = "0.52.6" 3980 + source = "registry+https://github.com/rust-lang/crates.io-index" 3981 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 3982 + 3983 + [[package]] 3984 + name = "windows_aarch64_msvc" 3985 + version = "0.53.1" 3986 + source = "registry+https://github.com/rust-lang/crates.io-index" 3987 + checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 3988 + 3989 + [[package]] 3990 + name = "windows_i686_gnu" 3991 + version = "0.52.6" 3992 + source = "registry+https://github.com/rust-lang/crates.io-index" 3993 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 3994 + 3995 + [[package]] 3996 + name = "windows_i686_gnu" 3997 + version = "0.53.1" 3998 + source = "registry+https://github.com/rust-lang/crates.io-index" 3999 + checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 4000 + 4001 + [[package]] 4002 + name = "windows_i686_gnullvm" 4003 + version = "0.52.6" 4004 + source = "registry+https://github.com/rust-lang/crates.io-index" 4005 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 4006 + 4007 + [[package]] 4008 + name = "windows_i686_gnullvm" 4009 + version = "0.53.1" 4010 + source = "registry+https://github.com/rust-lang/crates.io-index" 4011 + checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 4012 + 4013 + [[package]] 4014 + name = "windows_i686_msvc" 4015 + version = "0.52.6" 4016 + source = "registry+https://github.com/rust-lang/crates.io-index" 4017 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 4018 + 4019 + [[package]] 4020 + name = "windows_i686_msvc" 4021 + version = "0.53.1" 4022 + source = "registry+https://github.com/rust-lang/crates.io-index" 4023 + checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 4024 + 4025 + [[package]] 4026 + name = "windows_x86_64_gnu" 4027 + version = "0.52.6" 4028 + source = "registry+https://github.com/rust-lang/crates.io-index" 4029 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 4030 + 4031 + [[package]] 4032 + name = "windows_x86_64_gnu" 4033 + version = "0.53.1" 4034 + source = "registry+https://github.com/rust-lang/crates.io-index" 4035 + checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 4036 + 4037 + [[package]] 4038 + name = "windows_x86_64_gnullvm" 4039 + version = "0.52.6" 4040 + source = "registry+https://github.com/rust-lang/crates.io-index" 4041 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 4042 + 4043 + [[package]] 4044 + name = "windows_x86_64_gnullvm" 4045 + version = "0.53.1" 4046 + source = "registry+https://github.com/rust-lang/crates.io-index" 4047 + checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 4048 + 4049 + [[package]] 4050 + name = "windows_x86_64_msvc" 4051 + version = "0.52.6" 4052 + source = "registry+https://github.com/rust-lang/crates.io-index" 4053 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 4054 + 4055 + [[package]] 4056 + name = "windows_x86_64_msvc" 4057 + version = "0.53.1" 4058 + source = "registry+https://github.com/rust-lang/crates.io-index" 4059 + checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 4060 + 4061 + [[package]] 4062 + name = "winnow" 4063 + version = "0.7.14" 4064 + source = "registry+https://github.com/rust-lang/crates.io-index" 4065 + checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" 4066 + dependencies = [ 4067 + "memchr", 4068 + ] 4069 + 4070 + [[package]] 4071 + name = "wit-bindgen" 4072 + version = "0.51.0" 4073 + source = "registry+https://github.com/rust-lang/crates.io-index" 4074 + checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" 4075 + dependencies = [ 4076 + "wit-bindgen-rust-macro", 4077 + ] 4078 + 4079 + [[package]] 4080 + name = "wit-bindgen-core" 4081 + version = "0.51.0" 4082 + source = "registry+https://github.com/rust-lang/crates.io-index" 4083 + checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" 4084 + dependencies = [ 4085 + "anyhow", 4086 + "heck 0.5.0", 4087 + "wit-parser", 4088 + ] 4089 + 4090 + [[package]] 4091 + name = "wit-bindgen-rust" 4092 + version = "0.51.0" 4093 + source = "registry+https://github.com/rust-lang/crates.io-index" 4094 + checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" 4095 + dependencies = [ 4096 + "anyhow", 4097 + "heck 0.5.0", 4098 + "indexmap 2.13.0", 4099 + "prettyplease", 4100 + "syn 2.0.117", 4101 + "wasm-metadata", 4102 + "wit-bindgen-core", 4103 + "wit-component", 4104 + ] 4105 + 4106 + [[package]] 4107 + name = "wit-bindgen-rust-macro" 4108 + version = "0.51.0" 4109 + source = "registry+https://github.com/rust-lang/crates.io-index" 4110 + checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" 4111 + dependencies = [ 4112 + "anyhow", 4113 + "prettyplease", 4114 + "proc-macro2", 4115 + "quote", 4116 + "syn 2.0.117", 4117 + "wit-bindgen-core", 4118 + "wit-bindgen-rust", 4119 + ] 4120 + 4121 + [[package]] 4122 + name = "wit-component" 4123 + version = "0.244.0" 4124 + source = "registry+https://github.com/rust-lang/crates.io-index" 4125 + checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" 4126 + dependencies = [ 4127 + "anyhow", 4128 + "bitflags 2.11.0", 4129 + "indexmap 2.13.0", 4130 + "log", 4131 + "serde", 4132 + "serde_derive", 4133 + "serde_json", 4134 + "wasm-encoder", 4135 + "wasm-metadata", 4136 + "wasmparser", 4137 + "wit-parser", 4138 + ] 4139 + 4140 + [[package]] 4141 + name = "wit-parser" 4142 + version = "0.244.0" 4143 + source = "registry+https://github.com/rust-lang/crates.io-index" 4144 + checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" 4145 + dependencies = [ 4146 + "anyhow", 4147 + "id-arena", 4148 + "indexmap 2.13.0", 4149 + "log", 4150 + "semver", 4151 + "serde", 4152 + "serde_derive", 4153 + "serde_json", 4154 + "unicode-xid", 4155 + "wasmparser", 4156 + ] 4157 + 4158 + [[package]] 4159 + name = "writeable" 4160 + version = "0.6.2" 4161 + source = "registry+https://github.com/rust-lang/crates.io-index" 4162 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 4163 + 4164 + [[package]] 4165 + name = "yansi" 4166 + version = "1.0.1" 4167 + source = "registry+https://github.com/rust-lang/crates.io-index" 4168 + checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" 4169 + 4170 + [[package]] 4171 + name = "yoke" 4172 + version = "0.8.1" 4173 + source = "registry+https://github.com/rust-lang/crates.io-index" 4174 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 4175 + dependencies = [ 4176 + "stable_deref_trait", 4177 + "yoke-derive", 4178 + "zerofrom", 4179 + ] 4180 + 4181 + [[package]] 4182 + name = "yoke-derive" 4183 + version = "0.8.1" 4184 + source = "registry+https://github.com/rust-lang/crates.io-index" 4185 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 4186 + dependencies = [ 4187 + "proc-macro2", 4188 + "quote", 4189 + "syn 2.0.117", 4190 + "synstructure", 4191 + ] 4192 + 4193 + [[package]] 4194 + name = "zerocopy" 4195 + version = "0.8.39" 4196 + source = "registry+https://github.com/rust-lang/crates.io-index" 4197 + checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" 4198 + dependencies = [ 4199 + "zerocopy-derive", 4200 + ] 4201 + 4202 + [[package]] 4203 + name = "zerocopy-derive" 4204 + version = "0.8.39" 4205 + source = "registry+https://github.com/rust-lang/crates.io-index" 4206 + checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" 4207 + dependencies = [ 4208 + "proc-macro2", 4209 + "quote", 4210 + "syn 2.0.117", 4211 + ] 4212 + 4213 + [[package]] 4214 + name = "zerofrom" 4215 + version = "0.1.6" 4216 + source = "registry+https://github.com/rust-lang/crates.io-index" 4217 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 4218 + dependencies = [ 4219 + "zerofrom-derive", 4220 + ] 4221 + 4222 + [[package]] 4223 + name = "zerofrom-derive" 4224 + version = "0.1.6" 4225 + source = "registry+https://github.com/rust-lang/crates.io-index" 4226 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 4227 + dependencies = [ 4228 + "proc-macro2", 4229 + "quote", 4230 + "syn 2.0.117", 4231 + "synstructure", 4232 + ] 4233 + 4234 + [[package]] 4235 + name = "zeroize" 4236 + version = "1.8.2" 4237 + source = "registry+https://github.com/rust-lang/crates.io-index" 4238 + checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 4239 + dependencies = [ 4240 + "zeroize_derive", 4241 + ] 4242 + 4243 + [[package]] 4244 + name = "zeroize_derive" 4245 + version = "1.4.3" 4246 + source = "registry+https://github.com/rust-lang/crates.io-index" 4247 + checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" 4248 + dependencies = [ 4249 + "proc-macro2", 4250 + "quote", 4251 + "syn 2.0.117", 4252 + ] 4253 + 4254 + [[package]] 4255 + name = "zerotrie" 4256 + version = "0.2.3" 4257 + source = "registry+https://github.com/rust-lang/crates.io-index" 4258 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 4259 + dependencies = [ 4260 + "displaydoc", 4261 + "yoke", 4262 + "zerofrom", 4263 + ] 4264 + 4265 + [[package]] 4266 + name = "zerovec" 4267 + version = "0.11.5" 4268 + source = "registry+https://github.com/rust-lang/crates.io-index" 4269 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 4270 + dependencies = [ 4271 + "yoke", 4272 + "zerofrom", 4273 + "zerovec-derive", 4274 + ] 4275 + 4276 + [[package]] 4277 + name = "zerovec-derive" 4278 + version = "0.11.2" 4279 + source = "registry+https://github.com/rust-lang/crates.io-index" 4280 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 4281 + dependencies = [ 4282 + "proc-macro2", 4283 + "quote", 4284 + "syn 2.0.117", 4285 + ] 4286 + 4287 + [[package]] 4288 + name = "zmij" 4289 + version = "1.0.21" 4290 + source = "registry+https://github.com/rust-lang/crates.io-index" 4291 + checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
+45
Cargo.toml
··· 1 + [package] 2 + name = "porxie" 3 + description = "A correct and efficient ATProto Blob proxy service with caching and moderation takedowns." 4 + authors = ["Blooym"] 5 + version = "0.1.0" 6 + edition = "2024" 7 + 8 + [dependencies] 9 + axum = { version = "0.8.8", features = ["http2"] } 10 + anyhow = "1.0.102" 11 + clap = { version = "4.5.60", features = ["derive", "env"] } 12 + dotenvy = "0.15.7" 13 + serde = { version = "1.0.228", features = ["derive"] } 14 + tokio = { version = "1.49.0", features = [ 15 + "macros", 16 + "rt-multi-thread", 17 + "signal", 18 + "net", 19 + ] } 20 + tower-http = { version = "0.6.8", features = [ 21 + "catch-panic", 22 + "normalize-path", 23 + "trace", 24 + "timeout", 25 + ] } 26 + tracing = "0.1.44" 27 + tracing-subscriber = { version = "0.3.22", features = ["env-filter"] } 28 + reqwest = { version = "0.12.27", default-features = false, features = [ 29 + "http2", 30 + "charset", 31 + "system-proxy", 32 + "stream", 33 + "rustls-tls", 34 + ] } 35 + futures = "0.3.32" 36 + infer = "0.19.0" 37 + cid = "0.11.1" 38 + multihash-codetable = { version = "0.1.4", features = ["sha2", "blake3"] } 39 + jacquard-common = "0.9.5" 40 + jacquard-identity = "0.9.5" 41 + bytesize = { version = "2.3.1", features = ["serde"] } 42 + mime = "0.3.17" 43 + humantime = "2.3.0" 44 + moka = { version = "0.12.13", features = ["future", "logging"] } 45 + axum-extra = { version = "0.12.5", features = ["typed-header"] }
+153
README.md
··· 1 + # Porxie 2 + 3 + A correct and efficient ATProto Blob proxy service with caching and moderation takedowns. 4 + 5 + ## Features 6 + 7 + - **Secure by default** - verifies blob CIDs are legitimate and serves them with strict headers. 8 + - **Primitive mimetype filter** - auto-detects blob MIME type from content and optionally restricts which mimetypes can be served. (Note: this validation is basic and falls back to `application/octet-stream` if enabled). 9 + - **In-memory cache** - TinyLFU-based caching for fast repeat access to frequently requested content and moderation actions. 10 + - **Moderation service** - optional integration with an external custom moderation service to provide content takedowns. Bring your own policies. 11 + - **Manual cache purging** - Cached content and moderation status can be purged via a simple authenticated HTTP DELETE. 12 + 13 + ## Routes 14 + 15 + - **GET** `/did/cid` - Resolve and fetch a blob from its origin. 16 + - **DELETE** `/did/cid` - Invalidate blob and moderation cache for a specific blob. Requires configured bearer auth token. 17 + 18 + ## Setup 19 + 20 + ### Configuration 21 + 22 + All options can be set via flags, environment variables, or a `.env` file. For up-to-date and complete help, please use the `--help` flag (which is what the help below is generated by). 23 + 24 + ``` 25 + Usage: porxie [OPTIONS] 26 + 27 + Options: 28 + --address <ADDRESS> 29 + Socket address to bind the server to 30 + 31 + [env: PORXIE_ADDRESS=] 32 + [default: 127.0.0.1:6314] 33 + 34 + --timeout <TIMEOUT> 35 + Maximum duration before incoming requests are timed out 36 + 37 + [env: PORXIE_TIMEOUT=] 38 + [default: 60s] 39 + 40 + --auth-token <AUTH_TOKEN> 41 + Bearer token required to authenticate admin requests. 42 + 43 + When unset, all authenticated endpoints are unusable. 44 + 45 + [env: PORXIE_AUTH_TOKEN=] 46 + 47 + --allowed-mimetypes <ALLOWED_MIMETYPES> 48 + List of mimetypes that can be served through this CDN. 49 + 50 + Validation is done loosely via content inference and is not foolproof. It is recommended to apply a sandboxed layer that will process the blob further to validate its type. 51 + 52 + [env: PORXIE_ALLOWED_MIMETYPES=] 53 + [default: */*] 54 + 55 + --cache-header-value <CACHE_CONTROL_HEADER_VALUE> 56 + The cache-control header value to send alongside responses. 57 + 58 + This header does not modify the internal cache lifetime of content, only what how it wants other clients to cache responses. 59 + 60 + [env: PORXIE_CACHE_HEADER_VALUE=] 61 + [default: "public, max-age=604800, must-revalidate"] 62 + 63 + --cache-size <CACHE_SIZE> 64 + Maximum size of cached responses in memory. 65 + 66 + Content is evicted using a TinyLFU policy that automatically prioritises the most frequently requested keys. 67 + 68 + It is recommended you deploy a dedicated caching service in front of this service for best cache performance. The built-in cache is optimised for handling frequent requests and bursts requesting the same content. 69 + 70 + The default value is conservatively low, you may wish to raise it to fit your needs. 71 + 72 + [env: PORXIE_CACHE_SIZE=] 73 + [default: 512mb] 74 + 75 + --max-blob-size <MAX_BLOB_SIZE> 76 + Maximum blob size that can be served through this CDN. 77 + 78 + Content that exceeds this limit will return an HTTP 413 error. 79 + 80 + [env: PORXIE_MAX_BLOB_SIZE=] 81 + [default: 50mb] 82 + 83 + --moderation-cache-size <MODERATION_CACHE_SIZE> 84 + Maximum size of cached moderation responses in memory. 85 + 86 + Each entry is lightweight, so small allocations can hold a large number of entries. 87 + 88 + [env: PORXIE_MODERATION_CACHE_SIZE=] 89 + [default: 128mb] 90 + 91 + --moderation-cache-ttl <MODERATION_CACHE_TTL> 92 + How long moderation responses are cached before being re-checked 93 + 94 + [env: PORXIE_MODERATION_CACHE_TTL=] 95 + [default: 1h] 96 + 97 + --moderation-service-auth-token <MODERATION_SERVICE_AUTH_TOKEN> 98 + Bearer auth token sent with all requests to the moderation service 99 + 100 + [env: PORXIE_MODERATION_SERVICE_AUTH_TOKEN=] 101 + 102 + --moderation-service-fail-open <MODERATION_SERVICE_FAIL_OPEN> 103 + Whether to allow requests to proceed if the moderation service is unavailable or returns an unexpected status code 104 + 105 + [env: PORXIE_MODERATION_SERVICE_FAIL_OPEN=] 106 + [default: false] 107 + [possible values: true, false] 108 + 109 + --moderation-service-url <MODERATION_SERVICE_URL> 110 + URL of an upstream moderation service that DID+CID pairs will be checked against. 111 + 112 + Requests are sent as HTTP GET <url>/<did>/<cid>. 113 + 114 + The service is expected to return HTTP 200 if permitted or HTTP 410 if taken down. 115 + 116 + [env: PORXIE_MODERATION_SERVICE_URL=] 117 + 118 + --plc-directory-url <PLC_DIRECTORY_URL> 119 + URL of the PLC directory instance used for `did:plc` lookups. 120 + 121 + Can typically be left as default unless using a custom or test directory. 122 + 123 + [env: PORXIE_PLC_DIRECTORY_URL=] 124 + [default: https://plc.directory] 125 + 126 + --upstream-https-only <UPSTREAM_HTTPS_ONLY> 127 + Only allow HTTPS when connecting to upstreams. 128 + 129 + Disabling this is strongly discouraged outside of local development. 130 + 131 + [env: PORXIE_UPSTREAM_HTTPS_ONLY=] 132 + [default: true] 133 + [possible values: true, false] 134 + 135 + --upstream-proxy <UPSTREAM_PROXY> 136 + HTTP(S) proxy for upstream requests. Supports embedded credentials (https://user:pass@host). 137 + 138 + When unset, the system proxy configuration is used automatically. 139 + 140 + [env: PORXIE_UPSTREAM_PROXY=] 141 + 142 + --upstream-timeout <UPSTREAM_TIMEOUT> 143 + Maximum duration before upstream PDS requests are timed out 144 + 145 + [env: PORXIE_UPSTREAM_TIMEOUT=] 146 + [default: 30s] 147 + 148 + -h, --help 149 + Print help (see a summary with '-h') 150 + 151 + -V, --version 152 + Print version 153 + ```
+43
src/cache.rs
··· 1 + use axum::{body::Bytes, http::HeaderMap}; 2 + use cid::Cid; 3 + use moka::{future::Cache as MokaCache, policy::EvictionPolicy}; 4 + use std::{sync::Arc, time::Duration}; 5 + 6 + pub type ResponseCache = MokaCache<Cid, CachedResponse>; 7 + pub type ModerationCache = MokaCache<(String, Cid), CachedModerationResponse>; 8 + 9 + #[derive(Debug, Clone)] 10 + pub struct CachedResponse { 11 + pub body: Bytes, 12 + pub headers: Arc<HeaderMap>, 13 + } 14 + 15 + #[derive(Debug, Copy, Clone)] 16 + pub struct CachedModerationResponse { 17 + pub takendown: bool, 18 + } 19 + 20 + pub fn build_response_cache(max_capacity: u64) -> ResponseCache { 21 + ResponseCache::builder() 22 + .weigher(|_key, value: &CachedResponse| -> u32 { 23 + (value.body.len() as u64 + value.headers.len() as u64 * 64) 24 + .try_into() 25 + .unwrap_or(u32::MAX) 26 + }) 27 + .eviction_policy(EvictionPolicy::tiny_lfu()) 28 + .max_capacity(max_capacity) 29 + .build() 30 + } 31 + 32 + pub fn build_moderation_cache(max_capacity: u64, ttl: Duration) -> ModerationCache { 33 + ModerationCache::builder() 34 + .weigher(|key, _value| -> u32 { 35 + (key.0.len() + key.1.encoded_len()) 36 + .try_into() 37 + .unwrap_or(u32::MAX) 38 + }) 39 + .time_to_live(ttl) 40 + .eviction_policy(EvictionPolicy::tiny_lfu()) 41 + .max_capacity(max_capacity) 42 + .build() 43 + }
+30
src/http.rs
··· 1 + use reqwest::{Proxy, Url, redirect::Policy}; 2 + use std::time::Duration; 3 + 4 + const USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION")); 5 + const MAX_REDIRECTS: usize = 5; 6 + 7 + pub fn build_internal_http_client() -> Result<reqwest::Client, reqwest::Error> { 8 + reqwest::Client::builder() 9 + .user_agent(USER_AGENT) 10 + .redirect(Policy::limited(MAX_REDIRECTS)) 11 + .build() 12 + } 13 + 14 + pub fn build_external_http_client( 15 + https_only: bool, 16 + upstream_timeout: Duration, 17 + proxy_url: Option<Url>, 18 + ) -> Result<reqwest::Client, reqwest::Error> { 19 + let mut builder = reqwest::Client::builder() 20 + .user_agent(USER_AGENT) 21 + .https_only(https_only) 22 + .redirect(Policy::limited(MAX_REDIRECTS)) 23 + .timeout(upstream_timeout); 24 + 25 + if let Some(proxy) = proxy_url { 26 + builder = builder.proxy(Proxy::all(proxy)?); 27 + }; 28 + 29 + builder.build() 30 + }
+322
src/main.rs
··· 1 + mod cache; 2 + mod http; 3 + mod mime; 4 + mod routes; 5 + 6 + use crate::{ 7 + cache::{ModerationCache, ResponseCache, build_moderation_cache, build_response_cache}, 8 + http::{build_external_http_client, build_internal_http_client}, 9 + routes::{delete_blob_handler, get_blob_handler, get_index_handler}, 10 + }; 11 + use ::mime::{Mime, STAR_STAR}; 12 + use anyhow::Result; 13 + use axum::{ 14 + Router, 15 + extract::Request, 16 + http::{HeaderValue, StatusCode, header}, 17 + middleware::{self as axum_middleware, Next}, 18 + routing::{delete, get}, 19 + }; 20 + use bytesize::ByteSize; 21 + use clap::Parser; 22 + use dotenvy::dotenv; 23 + use jacquard_identity::{ 24 + JacquardResolver, 25 + resolver::{PlcSource, ResolverOptions}, 26 + }; 27 + use reqwest::Url; 28 + use std::{net::SocketAddr, sync::Arc}; 29 + use tokio::{net::TcpListener, signal}; 30 + use tower_http::{ 31 + catch_panic::CatchPanicLayer, 32 + normalize_path::NormalizePathLayer, 33 + timeout::TimeoutLayer, 34 + trace::{self, DefaultOnFailure, DefaultOnRequest, DefaultOnResponse, TraceLayer}, 35 + }; 36 + use tracing::{Level, info}; 37 + use tracing_subscriber::EnvFilter; 38 + 39 + #[derive(Debug, Clone, Parser)] 40 + #[clap(author, about, long_about, version)] 41 + struct Arguments { 42 + /// Socket address to bind the server to. 43 + #[arg( 44 + long = "address", 45 + env = "PORXIE_ADDRESS", 46 + default_value = "127.0.0.1:6314" 47 + )] 48 + address: SocketAddr, 49 + 50 + /// Maximum duration before incoming requests are timed out. 51 + #[arg(long = "timeout", env = "PORXIE_TIMEOUT", default_value = "60s")] 52 + timeout: humantime::Duration, 53 + 54 + /// Bearer token required to authenticate admin requests. 55 + /// 56 + /// When unset, all authenticated endpoints are unusable. 57 + #[arg(long = "auth-token", env = "PORXIE_AUTH_TOKEN")] 58 + auth_token: Option<String>, 59 + 60 + /// List of mimetypes that can be served through this CDN. 61 + /// 62 + /// Validation is done loosely via content inference and is not foolproof. 63 + /// It is recommended to apply a sandboxed layer that will process the blob 64 + /// further to validate its type. 65 + #[arg( 66 + long = "allowed-mimetypes", 67 + env = "PORXIE_ALLOWED_MIMETYPES", 68 + default_values_t = [STAR_STAR], 69 + value_delimiter = ',' 70 + )] 71 + allowed_mimetypes: Vec<Mime>, 72 + 73 + /// The cache-control header value to send alongside responses. 74 + /// 75 + /// This header does not modify the internal cache lifetime of content, only what 76 + /// how it wants other clients to cache responses. 77 + #[arg( 78 + long = "cache-header-value", 79 + env = "PORXIE_CACHE_HEADER_VALUE", 80 + default_value = "public, max-age=604800, must-revalidate" 81 + )] 82 + cache_control_header_value: HeaderValue, 83 + 84 + /// Maximum size of cached responses in memory. 85 + /// 86 + /// Content is evicted using a TinyLFU policy that automatically prioritises the most 87 + /// frequently requested keys. 88 + /// 89 + /// It is recommended you deploy a dedicated caching service in front of this service for best 90 + /// cache performance. The built-in cache is optimised for handling frequent requests and bursts 91 + /// requesting the same content. 92 + /// 93 + /// The default value is conservatively low, you may wish to raise it to fit your needs. 94 + #[arg( 95 + long = "cache-size", 96 + env = "PORXIE_CACHE_SIZE", 97 + default_value = "512mb" 98 + )] 99 + cache_size: ByteSize, 100 + 101 + /// Maximum blob size that can be served through this CDN. 102 + /// 103 + /// Content that exceeds this limit will return an HTTP 413 error. 104 + #[arg( 105 + long = "max-blob-size", 106 + env = "PORXIE_MAX_BLOB_SIZE", 107 + default_value = "50mb" 108 + )] 109 + max_blob_size: ByteSize, 110 + 111 + /// Maximum size of cached moderation responses in memory. 112 + /// 113 + /// Each entry is lightweight, so small allocations can hold a large number of entries. 114 + #[arg( 115 + long = "moderation-cache-size", 116 + env = "PORXIE_MODERATION_CACHE_SIZE", 117 + default_value = "128mb" 118 + )] 119 + moderation_cache_size: ByteSize, 120 + 121 + /// How long moderation responses are cached before being re-checked. 122 + #[arg( 123 + long = "moderation-cache-ttl", 124 + env = "PORXIE_MODERATION_CACHE_TTL", 125 + default_value = "1h" 126 + )] 127 + moderation_cache_ttl: humantime::Duration, 128 + 129 + /// Bearer auth token sent with all requests to the moderation service. 130 + #[arg( 131 + long = "moderation-service-auth-token", 132 + env = "PORXIE_MODERATION_SERVICE_AUTH_TOKEN" 133 + )] 134 + moderation_service_auth_token: Option<String>, 135 + 136 + /// Whether to allow requests to proceed if the moderation service is unavailable or returns an 137 + /// unexpected status code. 138 + #[arg( 139 + long = "moderation-service-fail-open", 140 + env = "PORXIE_MODERATION_SERVICE_FAIL_OPEN", 141 + default_value_t = false 142 + )] 143 + moderation_service_fail_open: core::primitive::bool, 144 + 145 + /// URL of an upstream moderation service that DID+CID pairs will be checked against. 146 + /// 147 + /// Requests are sent as HTTP GET <url>/<did>/<cid>. 148 + /// 149 + /// The service is expected to return HTTP 200 if permitted or HTTP 410 if taken down. 150 + #[arg(long = "moderation-service-url", env = "PORXIE_MODERATION_SERVICE_URL")] 151 + moderation_service_url: Option<Url>, 152 + 153 + /// URL of the PLC directory instance used for `did:plc` lookups. 154 + /// 155 + /// Can typically be left as default unless using a custom or test directory. 156 + #[arg( 157 + long = "plc-directory-url", 158 + env = "PORXIE_PLC_DIRECTORY_URL", 159 + default_value = "https://plc.directory" 160 + )] 161 + plc_directory_url: Url, 162 + 163 + /// Only allow HTTPS when connecting to upstreams. 164 + /// 165 + /// Disabling this is strongly discouraged outside of local development. 166 + #[arg( 167 + long = "upstream-https-only", 168 + env = "PORXIE_UPSTREAM_HTTPS_ONLY", 169 + default_value_t = true 170 + )] 171 + upstream_https_only: core::primitive::bool, 172 + 173 + /// HTTP(S) proxy for upstream requests. Supports embedded credentials (https://user:pass@host). 174 + /// 175 + /// When unset, the system proxy configuration is used automatically. 176 + #[arg(long = "upstream-proxy", env = "PORXIE_UPSTREAM_PROXY")] 177 + upstream_proxy: Option<Url>, 178 + 179 + /// Maximum duration before upstream PDS requests are timed out. 180 + #[arg( 181 + long = "upstream-timeout", 182 + env = "PORXIE_UPSTREAM_TIMEOUT", 183 + default_value = "30s" 184 + )] 185 + upstream_timeout: humantime::Duration, 186 + } 187 + 188 + struct AppState { 189 + // Internals.. 190 + resolver: JacquardResolver, 191 + internal_http_client: reqwest::Client, 192 + external_http_client: reqwest::Client, 193 + // Auth. 194 + auth_token: Option<String>, 195 + // Content. 196 + allowed_mimetypes: Vec<Mime>, 197 + max_blob_size: u64, 198 + cache_control_header: HeaderValue, 199 + response_cache: ResponseCache, 200 + // Moderation. 201 + moderation_service_url: Option<Url>, 202 + moderation_service_auth_header: Option<HeaderValue>, 203 + moderation_service_fail_open: bool, 204 + moderation_cache: ModerationCache, 205 + } 206 + 207 + #[tokio::main] 208 + async fn main() -> Result<()> { 209 + dotenv().ok(); 210 + tracing_subscriber::fmt() 211 + .with_env_filter(EnvFilter::try_from_default_env().unwrap_or(EnvFilter::new("info"))) 212 + .init(); 213 + let args = Arguments::parse(); 214 + 215 + // Setup state. 216 + let external_http_client = build_external_http_client( 217 + args.upstream_https_only, 218 + args.upstream_timeout.into(), 219 + args.upstream_proxy, 220 + )?; 221 + let app_state = Arc::new(AppState { 222 + resolver: JacquardResolver::new( 223 + external_http_client.clone(), 224 + ResolverOptions { 225 + plc_source: PlcSource::PlcDirectory { 226 + base: args.plc_directory_url, 227 + }, 228 + public_fallback_for_handle: true, 229 + validate_doc_id: true, 230 + ..Default::default() 231 + }, 232 + ), 233 + external_http_client, 234 + internal_http_client: build_internal_http_client()?, 235 + auth_token: args.auth_token, 236 + allowed_mimetypes: args.allowed_mimetypes, 237 + max_blob_size: args.max_blob_size.as_u64(), 238 + cache_control_header: args.cache_control_header_value, 239 + response_cache: build_response_cache(args.cache_size.as_u64()), 240 + moderation_service_url: args.moderation_service_url, 241 + moderation_service_auth_header: args.moderation_service_auth_token.map(|token| { 242 + let mut header = HeaderValue::from_str(&format!("Bearer {token}")) 243 + .expect("moderation service token should be a valid header value"); 244 + header.set_sensitive(true); 245 + header 246 + }), 247 + moderation_service_fail_open: args.moderation_service_fail_open, 248 + moderation_cache: build_moderation_cache( 249 + args.moderation_cache_size.as_u64(), 250 + args.moderation_cache_ttl.into(), 251 + ), 252 + }); 253 + 254 + // Setup router. 255 + let router = Router::new() 256 + .route("/", get(get_index_handler)) 257 + .route("/{did}/{cid}", get(get_blob_handler)) 258 + .route("/{did}/{cid}", delete(delete_blob_handler)) 259 + .layer( 260 + TraceLayer::new_for_http() 261 + .make_span_with(trace::DefaultMakeSpan::new().level(Level::INFO)) 262 + .on_request(DefaultOnRequest::default().level(Level::INFO)) 263 + .on_response(DefaultOnResponse::default().level(Level::INFO)) 264 + .on_failure(DefaultOnFailure::default()), 265 + ) 266 + .layer(NormalizePathLayer::trim_trailing_slash()) 267 + .layer(CatchPanicLayer::new()) 268 + .layer(TimeoutLayer::with_status_code( 269 + StatusCode::REQUEST_TIMEOUT, 270 + args.timeout.into(), 271 + )) 272 + .layer(axum_middleware::from_fn( 273 + async |req: Request, next: Next| { 274 + let mut res = next.run(req).await; 275 + let res_headers = res.headers_mut(); 276 + res_headers.insert( 277 + header::SERVER, 278 + HeaderValue::from_static(env!("CARGO_PKG_NAME")), 279 + ); 280 + res_headers.insert("X-Robots-Tag", HeaderValue::from_static("none")); 281 + res 282 + }, 283 + )) 284 + .with_state(app_state); 285 + 286 + // Start server. 287 + let tcp_listener = TcpListener::bind(args.address).await?; 288 + info!( 289 + "Internal server started - listening on: http://{}", 290 + args.address, 291 + ); 292 + axum::serve(tcp_listener, router) 293 + .with_graceful_shutdown(shutdown_signal()) 294 + .await?; 295 + 296 + Ok(()) 297 + } 298 + 299 + // https://github.com/tokio-rs/axum/blob/15917c6dbcb4a48707a20e9cfd021992a279a662/examples/graceful-shutdown/src/main.rs#L55 300 + async fn shutdown_signal() { 301 + let ctrl_c = async { 302 + signal::ctrl_c() 303 + .await 304 + .expect("failed to install Ctrl+C handler"); 305 + }; 306 + 307 + #[cfg(unix)] 308 + let terminate = async { 309 + signal::unix::signal(signal::unix::SignalKind::terminate()) 310 + .expect("failed to install signal handler") 311 + .recv() 312 + .await; 313 + }; 314 + 315 + #[cfg(not(unix))] 316 + let terminate = std::future::pending::<()>(); 317 + 318 + tokio::select! { 319 + _ = ctrl_c => {}, 320 + _ = terminate => {}, 321 + } 322 + }
+97
src/mime.rs
··· 1 + use mime::Mime; 2 + 3 + pub fn is_mime_allowed(mime: &Mime, allowed: &[Mime]) -> bool { 4 + const WILDCARD: &str = "*"; 5 + 6 + if allowed.is_empty() { 7 + return false; 8 + } 9 + 10 + for allowed_mime in allowed { 11 + // MIME is '*/*', allow everything. 12 + if allowed_mime.type_() == WILDCARD && allowed_mime.subtype() == WILDCARD { 13 + return true; 14 + } 15 + 16 + // MIME subtype is *, allow if the type matches. 17 + if allowed_mime.subtype() == WILDCARD && allowed_mime.type_() == mime.type_() { 18 + return true; 19 + } 20 + 21 + // Check if the mimes are exactly equal. 22 + if mime == allowed_mime { 23 + return true; 24 + } 25 + } 26 + 27 + false 28 + } 29 + 30 + #[cfg(test)] 31 + mod tests { 32 + use mime::Mime; 33 + use std::str::FromStr; 34 + 35 + #[test] 36 + fn test_is_mime_allowed() { 37 + // Test PNG when nothing is allowed. 38 + assert_eq!( 39 + super::is_mime_allowed(&Mime::from_str("image/png").unwrap(), &vec![]), 40 + false 41 + ); 42 + 43 + // Test PNG when PNG is allowed. 44 + assert_eq!( 45 + super::is_mime_allowed( 46 + &Mime::from_str("image/png").unwrap(), 47 + &vec![mime::IMAGE_PNG], 48 + ), 49 + true 50 + ); 51 + 52 + // Test PNG when only JPG is allowed. 53 + assert_eq!( 54 + super::is_mime_allowed( 55 + &Mime::from_str("image/png").unwrap(), 56 + &vec![mime::IMAGE_JPEG], 57 + ), 58 + false 59 + ); 60 + 61 + // Test PNG when any image subtype is allowed. 62 + assert_eq!( 63 + super::is_mime_allowed( 64 + &Mime::from_str("image/png").unwrap(), 65 + &vec![mime::IMAGE_STAR], 66 + ), 67 + true 68 + ); 69 + 70 + // Test PNG when anything is allowed. 71 + assert_eq!( 72 + super::is_mime_allowed( 73 + &Mime::from_str("image/png").unwrap(), 74 + &vec![mime::STAR_STAR], 75 + ), 76 + true 77 + ); 78 + 79 + // Test HTML when any image subtype is enabled. 80 + assert_eq!( 81 + super::is_mime_allowed( 82 + &Mime::from_str("text/html").unwrap(), 83 + &vec![mime::IMAGE_STAR], 84 + ), 85 + false 86 + ); 87 + 88 + // Test PNG when images and text are enabled. 89 + assert_eq!( 90 + super::is_mime_allowed( 91 + &Mime::from_str("image/png").unwrap(), 92 + &vec![mime::TEXT_STAR, mime::IMAGE_STAR], 93 + ), 94 + true 95 + ); 96 + } 97 + }
+359
src/routes.rs
··· 1 + use crate::{ 2 + AppState, 3 + cache::{CachedModerationResponse, CachedResponse}, 4 + mime::is_mime_allowed, 5 + }; 6 + use axum::{ 7 + body::{Body, Bytes}, 8 + extract::{Path, State}, 9 + http::{HeaderMap, HeaderValue, Response, StatusCode, header}, 10 + }; 11 + use axum_extra::{ 12 + TypedHeader, 13 + headers::{Authorization, authorization::Bearer}, 14 + }; 15 + 16 + use cid::Cid; 17 + use futures::StreamExt; 18 + use jacquard_common::types::did::Did; 19 + use jacquard_identity::resolver::IdentityResolver; 20 + use mime::Mime; 21 + use multihash_codetable::{Code, MultihashDigest}; 22 + use std::sync::Arc; 23 + use tracing::{debug, error, info, warn}; 24 + 25 + pub async fn get_index_handler() -> &'static str { 26 + r#" 27 + _____ _ 28 + | __ \ (_) 29 + | |__) |__ _ ____ ___ ___ 30 + | ___/ _ \| '__\ \/ / |/ _ \ 31 + | | | (_) | | > <| | __/ 32 + |_| \___/|_| /_/\_\_|\___| 33 + 34 + 35 + A correct and efficient ATProto blob proxy service. 36 + 37 + Links: 38 + - Repo: https://codeberg.org/Blooym/porxie 39 + - ATProto: https://atproto.com 40 + 41 + Routes: 42 + - HTTP GET /did/cid - Resolve and fetch a blob from its origin. 43 + - HTTP DELETE /did/cid - Invalidate blob and moderation cache for a specific blob. Requires configured bearer auth token. 44 + "# 45 + } 46 + 47 + pub async fn get_blob_handler( 48 + Path((did, cid)): Path<(String, String)>, 49 + State(state): State<Arc<AppState>>, 50 + ) -> Result<axum::response::Response, (StatusCode, &'static str)> { 51 + let (did, cid) = ( 52 + match Did::new(&did) { 53 + Ok(did) => did, 54 + Err(err) => { 55 + debug!("invalid DID '{did}': {err:?}"); 56 + return Err(( 57 + StatusCode::UNPROCESSABLE_ENTITY, 58 + "Invalid or unprocessable DID", 59 + )); 60 + } 61 + }, 62 + match Cid::try_from(cid.as_str()) { 63 + Ok(cid) => cid, 64 + Err(err) => { 65 + debug!("invalid CID '{cid}': {err:?}"); 66 + return Err(( 67 + StatusCode::UNPROCESSABLE_ENTITY, 68 + "Invalid or unprocessable CID", 69 + )); 70 + } 71 + }, 72 + ); 73 + 74 + // Query moderation service (if set) to see if the blob can be served. 75 + // 76 + // Moderation queries will be made if needed, even when blob itself is cached. 77 + // All moderation queries will be cached for a duration to prevent flooding the upstream. 78 + if let Some(ref moderation_service_url) = state.moderation_service_url { 79 + let mod_cache_key = (did.to_string(), cid); 80 + 81 + let is_taken_down = match state.moderation_cache.get(&mod_cache_key).await { 82 + Some(cached) => cached.takendown, 83 + None => { 84 + let mut moderation_service_url = moderation_service_url.clone(); 85 + moderation_service_url 86 + .path_segments_mut() 87 + .expect("moderation service URL cannot be a base") 88 + .push(did.as_str()) 89 + .push(&cid.to_string()); 90 + 91 + let mut request = state.internal_http_client.get(moderation_service_url); 92 + if let Some(ref auth) = state.moderation_service_auth_header { 93 + request = request.header(reqwest::header::AUTHORIZATION, auth); 94 + } 95 + 96 + match request.send().await { 97 + Ok(response) => match response.status() { 98 + StatusCode::OK => { 99 + state 100 + .moderation_cache 101 + .insert( 102 + mod_cache_key, 103 + CachedModerationResponse { takendown: false }, 104 + ) 105 + .await; 106 + false 107 + } 108 + StatusCode::GONE => { 109 + info!("moderation service rejected blob {cid} for {did}"); 110 + state 111 + .moderation_cache 112 + .insert(mod_cache_key, CachedModerationResponse { takendown: true }) 113 + .await; 114 + true 115 + } 116 + status => { 117 + error!("moderation service returned unexpected status: {status}"); 118 + if !state.moderation_service_fail_open { 119 + return Err(( 120 + StatusCode::INTERNAL_SERVER_ERROR, 121 + "Internal Server Error", 122 + )); 123 + } 124 + false 125 + } 126 + }, 127 + Err(err) => { 128 + error!("failed to reach moderation service: {err:?}"); 129 + if !state.moderation_service_fail_open { 130 + return Err(( 131 + StatusCode::INTERNAL_SERVER_ERROR, 132 + "Internal Server Error", 133 + )); 134 + } 135 + false 136 + } 137 + } 138 + } 139 + }; 140 + if is_taken_down { 141 + return Err(( 142 + StatusCode::GONE, 143 + "Content has been removed from the service", 144 + )); 145 + } 146 + } 147 + 148 + // Return cached content from memory if available. 149 + if let Some(cached) = state.response_cache.get(&cid).await { 150 + debug!("cache hit for {cid}"); 151 + let mut response = Response::builder() 152 + .status(StatusCode::OK) 153 + .body(Body::from(cached.body)) 154 + .expect("should build valid response"); 155 + response 156 + .headers_mut() 157 + .extend(cached.headers.as_ref().clone()); 158 + response 159 + .headers_mut() 160 + .insert("Porxie-Cache", HeaderValue::from_static("hit")); 161 + return Ok(response); 162 + } 163 + 164 + // Lookup PDS for the DID and return the PDS & Blob URL. 165 + let (pds_url, blob_url) = { 166 + let pds_url = match state.resolver.pds_for_did(&did).await { 167 + Ok(url) => url, 168 + Err(err) => { 169 + warn!("failed to resolve PDS url for '{did}': {err:?}"); 170 + return Err((StatusCode::BAD_GATEWAY, "Failed to resolve PDS for DID")); 171 + } 172 + }; 173 + let mut blob_url = match pds_url.join("/xrpc/com.atproto.sync.getBlob") { 174 + Ok(url) => url, 175 + Err(err) => { 176 + error!("failed to build XRPC URL: {err:?}"); 177 + return Err((StatusCode::INTERNAL_SERVER_ERROR, "Internal Server Error")); 178 + } 179 + }; 180 + blob_url.set_query(Some(&format!("did={did}&cid={cid}"))); 181 + (pds_url, blob_url) 182 + }; 183 + 184 + // Fetch and validate the requested blob. 185 + let blob_bytes = { 186 + // Fetch the blob from the PDS. 187 + let response = match state.external_http_client.get(blob_url).send().await { 188 + Ok(response) => response, 189 + Err(err) => { 190 + error!("failed to fetch blob from PDS: {err:?}"); 191 + return Err((StatusCode::BAD_GATEWAY, "Failed to fetch blob from PDS")); 192 + } 193 + }; 194 + if matches!( 195 + response.status(), 196 + StatusCode::NOT_FOUND | StatusCode::BAD_REQUEST 197 + ) { 198 + debug!("PDS returned 404 for blob {cid} on {did}"); 199 + return Err((StatusCode::NOT_FOUND, "Not found")); 200 + } 201 + if !response.status().is_success() { 202 + warn!("PDS returned error status: {}", response.status()); 203 + return Err((StatusCode::BAD_GATEWAY, "Failed to fetch blob from PDS")); 204 + } 205 + // Validate the size of the body making a guess based the inferred size. 206 + // This is strictly validated later when downloading the actual content. 207 + if let Some(content_length) = response.content_length() 208 + && content_length > state.max_blob_size 209 + { 210 + debug!("blob exceeds max size of {} bytes", state.max_blob_size); 211 + return Err(( 212 + StatusCode::UNPROCESSABLE_ENTITY, 213 + "Blob exceeds maximum allowed size", 214 + )); 215 + }; 216 + 217 + // Incrementally download blob content and abort if it grows too large. 218 + let mut buffer = Vec::with_capacity( 219 + response 220 + .content_length() 221 + .unwrap_or(64 * 1024) 222 + .min(state.max_blob_size) as usize, 223 + ); 224 + let mut stream = response.bytes_stream(); 225 + while let Some(chunk) = stream.next().await { 226 + let chunk = match chunk { 227 + Ok(chunk) => chunk, 228 + Err(err) => { 229 + warn!("error reading blob stream: {err:?}"); 230 + return Err((StatusCode::BAD_GATEWAY, "Failed to fetch blob from PDS")); 231 + } 232 + }; 233 + if (buffer.len() + chunk.len()) as u64 > state.max_blob_size { 234 + debug!("blob exceeds max size of {} bytes", state.max_blob_size); 235 + return Err(( 236 + StatusCode::UNPROCESSABLE_ENTITY, 237 + "Blob exceeds maximum allowed size", 238 + )); 239 + } 240 + buffer.extend_from_slice(&chunk); 241 + } 242 + 243 + // Strictly validate the blob, computing and comparing its CID hash and best-guessing its mime-type. 244 + let computed_cid = match cid.hash().code() { 245 + 0x12 => Cid::new_v1(0x55, Code::Sha2_256.digest(&buffer)), 246 + 0x1e => Cid::new_v1(0x55, Code::Blake3_256.digest(&buffer)), 247 + hash => { 248 + warn!("unsupported multihash: 0x{hash:x}"); 249 + return Err(( 250 + StatusCode::UNPROCESSABLE_ENTITY, 251 + "Unsupported CID multihash", 252 + )); 253 + } 254 + }; 255 + if computed_cid != cid { 256 + warn!("CID mismatch: expected {cid}, computed {computed_cid}"); 257 + return Err((StatusCode::BAD_GATEWAY, "Blob content does not match CID")); 258 + } 259 + 260 + buffer 261 + }; 262 + 263 + // Loosely determine and validate mimetype. Not the strictest check, but it works. 264 + let mime_type: Mime = match infer::get(&blob_bytes) { 265 + Some(m) => m 266 + .mime_type() 267 + .parse() 268 + .expect("infer mimetype should always be valid"), 269 + None => mime::APPLICATION_OCTET_STREAM, 270 + }; 271 + if !is_mime_allowed(&mime_type, &state.allowed_mimetypes) { 272 + debug!("blob was inferred to be a disallowed mime type: {mime_type}"); 273 + return Err(( 274 + StatusCode::UNPROCESSABLE_ENTITY, 275 + "Content type is not allowed", 276 + )); 277 + } 278 + 279 + // Build headers and cache the blob in memory for faster access. 280 + let body = Bytes::from(blob_bytes); 281 + let mut headers = HeaderMap::new(); 282 + headers.insert( 283 + header::CONTENT_TYPE, 284 + mime_type 285 + .essence_str() 286 + .parse() 287 + .expect("should parse mime type as header value"), 288 + ); 289 + headers.insert( 290 + header::CONTENT_SECURITY_POLICY, 291 + HeaderValue::from_static("default-src 'none'; sandbox"), 292 + ); 293 + headers.insert( 294 + header::X_CONTENT_TYPE_OPTIONS, 295 + HeaderValue::from_static("nosniff"), 296 + ); 297 + headers.insert(header::CACHE_CONTROL, state.cache_control_header.clone()); 298 + headers.insert( 299 + "Upstream-PDS", 300 + pds_url 301 + .host_str() 302 + .unwrap_or("unknown") 303 + .parse() 304 + .expect("should parse hostname as header value"), 305 + ); 306 + let headers = Arc::new(headers); 307 + state 308 + .response_cache 309 + .insert( 310 + cid, 311 + CachedResponse { 312 + body: body.clone(), 313 + headers: Arc::clone(&headers), 314 + }, 315 + ) 316 + .await; 317 + 318 + // Return response. 319 + let mut response = Response::builder() 320 + .status(StatusCode::OK) 321 + .body(Body::from(body)) 322 + .expect("should build valid response"); 323 + response.headers_mut().extend(headers.as_ref().clone()); 324 + response 325 + .headers_mut() 326 + .insert("Porxie-Cache", HeaderValue::from_static("miss")); 327 + Ok(response) 328 + } 329 + 330 + pub async fn delete_blob_handler( 331 + Path((did, cid)): Path<(String, String)>, 332 + State(state): State<Arc<AppState>>, 333 + TypedHeader(Authorization(bearer)): TypedHeader<Authorization<Bearer>>, 334 + ) -> Result<StatusCode, (StatusCode, &'static str)> { 335 + if state.auth_token.as_deref() != Some(bearer.token()) { 336 + return Err((StatusCode::UNAUTHORIZED, "Unauthorized")); 337 + } 338 + 339 + let (did, cid) = ( 340 + Did::new(&did).map_err(|_| { 341 + ( 342 + StatusCode::UNPROCESSABLE_ENTITY, 343 + "Invalid or unprocessable DID", 344 + ) 345 + })?, 346 + Cid::try_from(cid.as_str()).map_err(|_| { 347 + ( 348 + StatusCode::UNPROCESSABLE_ENTITY, 349 + "Invalid or unprocessable CID", 350 + ) 351 + })?, 352 + ); 353 + 354 + state.response_cache.remove(&cid).await; 355 + state.moderation_cache.remove(&(did.to_string(), cid)).await; 356 + info!("invalidated caches for {cid} on {did}"); 357 + 358 + Ok(StatusCode::OK) 359 + }